Server definition
- Hash
- sha256:78e4b2d21c7c5e58d3031a1ff7b20b511a499771965b951ef245321796d38de6
- What it is
- What a remote MCP server returned when asked what it offers: 21 tools
The blob, as servednamed by its sha256
{
"instructions": null,
"tools": [
{
"description": "Activate every PENDING keyword across the account in two steps: promote as many as the current plan covers for free, then charge an immediate prorated upgrade to cover the remainder (keywords disabled this cycle still hold slots and count). Keywords covered by the upgrade stay PENDING in the response and flip ACTIVE once the payment settles; re-check with list_websites. Always call preview_activate_pending first, show the user immediateCharge and targetPlanName, and get explicit consent; never call this in a loop. Use enable_keyword for a single DISABLED keyword. Fails with 400 when there is no active subscription or the charge fails, leaving keywords PENDING. Returns the updated websites.",
"inputSchema": {
"$schema": "http://json-schema.org/draft-07/schema#",
"properties": {},
"type": "object"
},
"name": "activate_pending_keywords",
"outputSchema": {
"$schema": "http://json-schema.org/draft-07/schema#",
"additionalProperties": false,
"properties": {
"result": {
"description": "All websites with their keyword statuses; keywords waiting on an upgrade payment still show PENDING."
}
},
"type": "object"
}
},
{
"description": "Add keywords to a monitored website. Values are trimmed, lowercased, and de-duplicated; ones already ACTIVE on that site are skipped, and re-adding a DISABLED one resets it to PENDING (prefer enable_keyword). Each new keyword starts PENDING, then as many as fit the plan's free headroom flip to ACTIVE at once, with no charge. The rest stay PENDING and match nothing until activate_pending_keywords, which may charge an upgrade; run preview_activate_pending first. Adding is unlimited. Use edit_keyword to reword an existing keyword. Returns the whole website with its updated keyword list, not only the new keywords.",
"inputSchema": {
"$schema": "http://json-schema.org/draft-07/schema#",
"additionalProperties": false,
"properties": {
"keywords": {
"description": "Keywords to add (e.g. [\"my product\", \"competitor name\"]); trimmed, lowercased, and de-duplicated, max 255 characters each",
"items": {
"maxLength": 255,
"type": "string"
},
"minItems": 1,
"type": "array"
},
"websiteId": {
"description": "Monitored website ID (UUID)",
"type": "string"
}
},
"required": [
"websiteId",
"keywords"
],
"type": "object"
},
"name": "add_keywords",
"outputSchema": {
"$schema": "http://json-schema.org/draft-07/schema#",
"additionalProperties": false,
"properties": {
"result": {
"description": "The whole website with its full keyword list (id, value, status), including the new keywords as ACTIVE or PENDING."
}
},
"type": "object"
}
},
{
"description": "Scrape a URL and return an AI-written business description as { description }, without creating or changing any website. Use it to draft or preview the text before create_website or update_website, then pass the result as their description. Consumes one AI generation from the monthly quota unless a precomputed description already exists for that domain, and refunds it if generation fails. Returns 400 when the quota is exhausted or url is not a valid URL, and an error when the page has too little readable text.",
"inputSchema": {
"$schema": "http://json-schema.org/draft-07/schema#",
"additionalProperties": false,
"properties": {
"url": {
"description": "Full website URL to scrape (e.g. \"https://example.com\")",
"type": "string"
}
},
"required": [
"url"
],
"type": "object"
},
"name": "analyze_website",
"outputSchema": {
"$schema": "http://json-schema.org/draft-07/schema#",
"additionalProperties": false,
"properties": {
"result": {
"description": "{ description }: the AI-written business description, ready to pass to create_website or update_website."
}
},
"type": "object"
}
},
{
"description": "Count mentions matching the same filters as list_mentions, returning { total } and no rows. The same defaults apply: REJECTED excluded unless statuses includes it, and scores below the website's minimum (30 by default) hidden unless includeLowRelevance is true. Use it for dashboards, to size a triage batch, or to decide whether paging list_mentions is worthwhile; list_mentions already returns total with its rows, so skip this when you fetch rows anyway. Takes no sort, limit, or offset.",
"inputSchema": {
"$schema": "http://json-schema.org/draft-07/schema#",
"additionalProperties": false,
"properties": {
"from": {
"description": "Only mentions ingested at/after this ISO 8601 datetime",
"type": "string"
},
"includeLowRelevance": {
"description": "Include mentions below the website minimum score (30 by default), hidden otherwise",
"type": "boolean"
},
"keywords": {
"description": "Count only mentions matched by these keyword values (case-insensitive exact match)",
"items": {
"type": "string"
},
"type": "array"
},
"scoreBuckets": {
"description": "Relevance buckets, OR-combined: VERY_LOW (<10), LOW (10-29), MEDIUM (30-49), HIGH (50-74), VERY_HIGH (75+). LOW and VERY_LOW only count when includeLowRelevance is also true",
"items": {
"enum": [
"VERY_LOW",
"LOW",
"MEDIUM",
"HIGH",
"VERY_HIGH"
],
"type": "string"
},
"type": "array"
},
"sources": {
"description": "Filter by source: REDDIT_POST, REDDIT_COMMENT, TWITTER (X), BLUESKY, HACKERNEWS",
"items": {
"enum": [
"REDDIT_POST",
"REDDIT_COMMENT",
"TWITTER",
"BLUESKY",
"HACKERNEWS"
],
"type": "string"
},
"type": "array"
},
"statuses": {
"description": "Filter by status (NEW, APPROVED, REJECTED); omit to count everything except REJECTED",
"items": {
"enum": [
"NEW",
"APPROVED",
"REJECTED"
],
"type": "string"
},
"type": "array"
},
"to": {
"description": "Only mentions ingested at/before this ISO 8601 datetime",
"type": "string"
},
"websiteId": {
"description": "Filter to one website (UUID)",
"type": "string"
}
},
"type": "object"
},
"name": "count_mentions",
"outputSchema": {
"$schema": "http://json-schema.org/draft-07/schema#",
"additionalProperties": false,
"properties": {
"result": {
"description": "{ total }: the number of mentions matching the filters after the default exclusions."
}
},
"type": "object"
}
},
{
"description": "Add a website to monitor across Reddit, Hacker News, X, and Bluesky. The domain must be new to this account: a duplicate returns 400, and re-adding a domain removed with delete_website revives that record. description is the context every mention is scored against. Omit it and the server scrapes the URL to write one, spending one AI generation from the plan quota; if that scrape fails or the quota is exhausted the site is created with description null and its mentions go unscored (reason \"Scoring skipped: website description missing\"), so check the response and set one with update_website or analyze_website. Pass your own description to skip the scrape. Initial keywords are stored PENDING: list_websites or add_keywords promotes those that fit the plan for free, and activate_pending_keywords covers the rest, possibly for a charge. AI-suggested keywords are added in the background and show up on the website later. Returns 400 when the plan has no website slots left.",
"inputSchema": {
"$schema": "http://json-schema.org/draft-07/schema#",
"additionalProperties": false,
"properties": {
"description": {
"description": "Product summary the AI scores every mention against; without it new mentions are not scored. Draft one with analyze_website",
"maxLength": 5000,
"type": "string"
},
"keywords": {
"description": "Initial keywords, stored as PENDING; list_websites promotes those that fit the plan for free",
"items": {
"maxLength": 255,
"type": "string"
},
"type": "array"
},
"name": {
"description": "Display name for the website",
"type": "string"
},
"url": {
"description": "Full website URL (e.g. \"https://example.com\")",
"type": "string"
}
},
"required": [
"url"
],
"type": "object"
},
"name": "create_website",
"outputSchema": {
"$schema": "http://json-schema.org/draft-07/schema#",
"additionalProperties": false,
"properties": {
"result": {
"description": "The created website with its id, domain, description, and keywords (initial ones PENDING)."
}
},
"type": "object"
}
},
{
"description": "Permanently delete one keyword. Only PENDING keywords qualify (never billed, never live), so there is no billing effect and no undo. Any other status returns 400 \"Only pending keywords can be removed\": use disable_keyword for an ACTIVE keyword, edit_keyword to fix a SUSPENDED one, and delete_website to drop a whole site. Prefer this over leaving unwanted PENDING keywords in place, because activate_pending_keywords would otherwise try to pay for them. Returns { deleted: true }.",
"inputSchema": {
"$schema": "http://json-schema.org/draft-07/schema#",
"additionalProperties": false,
"properties": {
"keywordId": {
"description": "Keyword ID (UUID)",
"type": "string"
}
},
"required": [
"keywordId"
],
"type": "object"
},
"name": "delete_keyword",
"outputSchema": {
"$schema": "http://json-schema.org/draft-07/schema#",
"additionalProperties": false,
"properties": {
"result": {
"description": "{ deleted: true } once the PENDING keyword is removed."
}
},
"type": "object"
}
},
{
"description": "Stop monitoring a website (soft delete). The site and its keywords leave list_websites immediately and stop matching new mentions; there is no restore tool, but create_website with the same URL revives the record. Use this only when the whole site should go: use disable_keyword to pause one keyword and keep the site, and delete_keyword for a PENDING keyword you never want. Confirm with the user first and name the domain, not just the ID. Returns { deleted: true }; 404 if the ID is unknown to this account.",
"inputSchema": {
"$schema": "http://json-schema.org/draft-07/schema#",
"additionalProperties": false,
"properties": {
"websiteId": {
"description": "Monitored website ID (UUID)",
"type": "string"
}
},
"required": [
"websiteId"
],
"type": "object"
},
"name": "delete_website",
"outputSchema": {
"$schema": "http://json-schema.org/draft-07/schema#",
"additionalProperties": false,
"properties": {
"result": {
"description": "{ deleted: true } once the website is soft-deleted."
}
},
"type": "object"
}
},
{
"description": "Stop monitoring one keyword: sets it DISABLED and it stops matching new mentions immediately. Unlimited and reversible with enable_keyword. Billing does not drop right away: the keyword keeps its paid slot until the end of the current billing cycle, so re-enabling it in the same cycle is free but a new keyword cannot reuse that slot for free; any price reduction is scheduled for the cycle boundary. Use delete_keyword instead for a PENDING keyword you never want. Calling it on an already DISABLED keyword returns it unchanged.",
"inputSchema": {
"$schema": "http://json-schema.org/draft-07/schema#",
"additionalProperties": false,
"properties": {
"keywordId": {
"description": "Keyword ID (UUID)",
"type": "string"
}
},
"required": [
"keywordId"
],
"type": "object"
},
"name": "disable_keyword",
"outputSchema": {
"$schema": "http://json-schema.org/draft-07/schema#",
"additionalProperties": false,
"properties": {
"result": {
"description": "The keyword with status DISABLED; its paid slot is held until the billing cycle ends."
}
},
"type": "object"
}
},
{
"description": "Change a keyword's text in place, keeping its ID and any paid slot. Edits are unlimited on every plan (keyword_change_usage reports limit -1). The new value is re-graded for noise; an ACTIVE keyword stays ACTIVE, while a PENDING, DISABLED, or SUSPENDED one goes ACTIVE if the plan has a free slot and PENDING otherwise. Use this to fix a SUSPENDED keyword the grader rejected, or to reword instead of adding a variant with add_keywords. A case-only change is a no-op; a value already on the website returns 400.",
"inputSchema": {
"$schema": "http://json-schema.org/draft-07/schema#",
"additionalProperties": false,
"properties": {
"keywordId": {
"description": "Keyword ID (UUID)",
"type": "string"
},
"value": {
"description": "New keyword text; trimmed and lowercased, must not duplicate another keyword on the same website",
"maxLength": 255,
"type": "string"
}
},
"required": [
"keywordId",
"value"
],
"type": "object"
},
"name": "edit_keyword",
"outputSchema": {
"$schema": "http://json-schema.org/draft-07/schema#",
"additionalProperties": false,
"properties": {
"result": {
"description": "The updated keyword with its new value and resulting status (ACTIVE or PENDING)."
}
},
"type": "object"
}
},
{
"description": "Re-activate one DISABLED keyword. It goes ACTIVE at once when it fits the plan or was disabled earlier in this billing cycle (it still holds its slot). Otherwise it is set PENDING and the required plan upgrade is charged immediately; it flips ACTIVE once the payment settles, so re-check with get_website. Use activate_pending_keywords instead to bring every PENDING keyword live in one call, and add_keywords for a keyword that does not exist yet. Preview cost with preview_keyword_billing first. Returns 400 without an active subscription; an ACTIVE keyword is returned unchanged.",
"inputSchema": {
"$schema": "http://json-schema.org/draft-07/schema#",
"additionalProperties": false,
"properties": {
"keywordId": {
"description": "Keyword ID (UUID)",
"type": "string"
}
},
"required": [
"keywordId"
],
"type": "object"
},
"name": "enable_keyword",
"outputSchema": {
"$schema": "http://json-schema.org/draft-07/schema#",
"additionalProperties": false,
"properties": {
"result": {
"description": "The keyword with status ACTIVE, or PENDING when an upgrade was charged and its payment has not settled yet."
}
},
"type": "object"
}
},
{
"description": "Get the AI relevance reasoning (relevanceReason), tags, and a drafted reply (aiReplySuggestion) for one mention, generating whatever is missing on first call and storing it, so later calls are instant reads. The website must have a description; without one the mention comes back unchanged. Use it when a score looks wrong or before update_mention_status on a borderline lead, not across every row of list_mentions, since generation is slow. Returns the full mention object, or null (not a 404) when the ID is unknown to this account.",
"inputSchema": {
"$schema": "http://json-schema.org/draft-07/schema#",
"additionalProperties": false,
"properties": {
"mentionId": {
"description": "Mention ID (UUID) from list_mentions",
"type": "string"
}
},
"required": [
"mentionId"
],
"type": "object"
},
"name": "explain_mention",
"outputSchema": {
"$schema": "http://json-schema.org/draft-07/schema#",
"additionalProperties": false,
"properties": {
"result": {
"description": "The full mention with relevanceReason, tags, and aiReplySuggestion filled in; null when the mention is not found."
}
},
"type": "object"
}
},
{
"description": "Get the account's email-alert settings: enabled, cadenceMinutes (the digest interval in effect), minIntervalMinutes (the fastest cadence the plan allows), and availableCadences (the subset of 15, 30, 60, 120, 180, 240, 720, 1440 at or above that floor). cadenceMinutes is never reported below the floor, even if a faster value was saved before a plan downgrade. Call it before update_alert_settings to pick a value from availableCadences, and after it to confirm what applied. Read-only; the digests themselves are sent by the platform on that cadence.",
"inputSchema": {
"$schema": "http://json-schema.org/draft-07/schema#",
"properties": {},
"type": "object"
},
"name": "get_alert_settings",
"outputSchema": {
"$schema": "http://json-schema.org/draft-07/schema#",
"additionalProperties": false,
"properties": {
"result": {
"description": "{ enabled, cadenceMinutes, minIntervalMinutes, availableCadences }: the cadence in effect, the plan floor, and the cadences you may pick."
}
},
"type": "object"
}
},
{
"description": "Get one monitored website by ID with its full keyword list and statuses (PENDING, ACTIVE, DISABLED, SUSPENDED). Use it to re-check keyword statuses after add_keywords, enable_keyword, or activate_pending_keywords; use list_websites instead when you do not have the ID yet or want every site. websiteId comes from list_websites or create_website. Returns 404 when the website does not exist or belongs to another account, and 400 when websiteId is not a UUID.",
"inputSchema": {
"$schema": "http://json-schema.org/draft-07/schema#",
"additionalProperties": false,
"properties": {
"websiteId": {
"description": "Monitored website ID (UUID) from list_websites",
"type": "string"
}
},
"required": [
"websiteId"
],
"type": "object"
},
"name": "get_website",
"outputSchema": {
"$schema": "http://json-schema.org/draft-07/schema#",
"additionalProperties": false,
"properties": {
"result": {
"description": "The monitored website with its keyword list, each keyword carrying id, value, and status."
}
},
"type": "object"
}
},
{
"description": "Get the monthly keyword-edit allowance for the account as { limit, used, remaining, unlimited }, where limit -1 means unlimited. Only edit_keyword ever counted toward it; add_keywords, disable_keyword, and enable_keyword never did. Every current plan reports unlimited, so there is no need to check it before edit_keyword; it remains for clients that budget edits. Not a capacity or billing preview: use preview_keyword_billing or preview_activate_pending for plan pricing, and list_websites to count ACTIVE keywords.",
"inputSchema": {
"$schema": "http://json-schema.org/draft-07/schema#",
"properties": {},
"type": "object"
},
"name": "keyword_change_usage",
"outputSchema": {
"$schema": "http://json-schema.org/draft-07/schema#",
"additionalProperties": false,
"properties": {
"result": {
"description": "{ limit, used, remaining, unlimited }; limit -1 and unlimited true mean edits are not metered."
}
},
"type": "object"
}
},
{
"description": "List mentions matched for this account across Reddit, Hacker News, X, and Bluesky, each AI-scored 0-100 with its source, matched keyword, status, content, and any generated relevanceReason and aiReplySuggestion. Two defaults hide rows: REJECTED mentions are excluded unless statuses names them, and mentions below the website's minimum score (30 by default) are hidden unless includeLowRelevance is true, even when scoreBuckets asks for LOW or VERY_LOW. Returns { mentions, total, limit, offset }; page with offset while offset < total. Sort RELEVANCE for the best leads, RECENT for what is new; from/to filter on ingestion time, not publish time. Use count_mentions for the number alone, explain_mention for one mention's reasoning, and update_mention_status to triage.",
"inputSchema": {
"$schema": "http://json-schema.org/draft-07/schema#",
"additionalProperties": false,
"properties": {
"from": {
"description": "Only mentions ingested at/after this ISO 8601 datetime",
"type": "string"
},
"includeLowRelevance": {
"description": "Include mentions below the website minimum score (30 by default), hidden otherwise",
"type": "boolean"
},
"keywords": {
"description": "Filter to mentions matched by these keyword values (case-insensitive exact match, as shown in list_websites)",
"items": {
"type": "string"
},
"type": "array"
},
"limit": {
"default": 50,
"description": "Max results (1-500)",
"maximum": 500,
"minimum": 1,
"type": "integer"
},
"offset": {
"default": 0,
"description": "Pagination offset",
"minimum": 0,
"type": "integer"
},
"scoreBuckets": {
"description": "Relevance buckets, OR-combined: VERY_LOW (<10), LOW (10-29), MEDIUM (30-49), HIGH (50-74), VERY_HIGH (75+). LOW and VERY_LOW only show when includeLowRelevance is also true",
"items": {
"enum": [
"VERY_LOW",
"LOW",
"MEDIUM",
"HIGH",
"VERY_HIGH"
],
"type": "string"
},
"type": "array"
},
"sort": {
"description": "RELEVANCE (default, highest score first) or RECENT (newest first)",
"enum": [
"RELEVANCE",
"RECENT"
],
"type": "string"
},
"sources": {
"description": "Filter by source: REDDIT_POST, REDDIT_COMMENT, TWITTER (X), BLUESKY, HACKERNEWS",
"items": {
"enum": [
"REDDIT_POST",
"REDDIT_COMMENT",
"TWITTER",
"BLUESKY",
"HACKERNEWS"
],
"type": "string"
},
"type": "array"
},
"statuses": {
"description": "Filter by status (NEW, APPROVED, REJECTED); omit to get everything except REJECTED",
"items": {
"enum": [
"NEW",
"APPROVED",
"REJECTED"
],
"type": "string"
},
"type": "array"
},
"to": {
"description": "Only mentions ingested at/before this ISO 8601 datetime",
"type": "string"
},
"websiteId": {
"description": "Filter to one website (UUID)",
"type": "string"
}
},
"type": "object"
},
"name": "list_mentions",
"outputSchema": {
"$schema": "http://json-schema.org/draft-07/schema#",
"additionalProperties": false,
"properties": {
"result": {
"description": "{ mentions, total, limit, offset }: each mention has id, source, keyword, title, contentText, url, author, subreddit (Reddit only), status, relevanceScore, relevanceReason, aiReplySuggestion, tags, publishedAt, ingestedAt, reviewedAt."
}
},
"type": "object"
}
},
{
"description": "List every website this account monitors, each with its keywords (id, value, status: PENDING, ACTIVE, DISABLED, SUSPENDED). Call this first: most other tools need a websiteId or keywordId from it. Reading also promotes any PENDING keyword that fits the plan's free headroom to ACTIVE, without ever charging. Use get_website instead when you already hold a websiteId and want one record. Only ACTIVE keywords match new mentions, so a long PENDING list explains a quiet inbox. Scope is the account behind the API token.",
"inputSchema": {
"$schema": "http://json-schema.org/draft-07/schema#",
"properties": {},
"type": "object"
},
"name": "list_websites",
"outputSchema": {
"$schema": "http://json-schema.org/draft-07/schema#",
"additionalProperties": false,
"properties": {
"result": {
"description": "Array of monitored websites, each with its ID, URL, name, description, and keywords with their statuses."
}
},
"type": "object"
}
},
{
"description": "Preview the billing impact of activate_pending_keywords without changing anything. Takes no input: it prices the plan needed for the keywords committed this cycle (ACTIVE plus disabled this cycle) plus every PENDING keyword. Returns currentPlanName, currentMonthlyPrice, targetPlanName, targetMonthlyPrice, targetKeywords, immediateCharge (prorated amount charged now), isUpgrade, isDowngrade, requiresImmediatePayment; immediateCharge 0 with isUpgrade false means activation is free. Use this right before activate_pending_keywords. Use preview_keyword_billing instead to price an arbitrary keyword count, for example before add_keywords or enable_keyword.",
"inputSchema": {
"$schema": "http://json-schema.org/draft-07/schema#",
"properties": {},
"type": "object"
},
"name": "preview_activate_pending",
"outputSchema": {
"$schema": "http://json-schema.org/draft-07/schema#",
"additionalProperties": false,
"properties": {
"result": {
"description": "Billing preview: currentPlanName, currentMonthlyPrice, targetPlanName, targetMonthlyPrice, targetKeywords, immediateCharge, isUpgrade, isDowngrade, requiresImmediatePayment."
}
},
"type": "object"
}
},
{
"description": "Preview the plan and price needed for a chosen total of active keywords, without changing anything. desiredKeywordCount is the absolute number of keywords you want live across the account, not the number being added: count the ACTIVE keywords from list_websites and add the new ones. Returns the same shape as preview_activate_pending (currentPlanName, targetPlanName, targetMonthlyPrice, immediateCharge, isUpgrade, isDowngrade, requiresImmediatePayment). Use this for what-if pricing before add_keywords or enable_keyword; use preview_activate_pending instead for the exact cost of activating the keywords already PENDING, which it counts for you.",
"inputSchema": {
"$schema": "http://json-schema.org/draft-07/schema#",
"additionalProperties": false,
"properties": {
"desiredKeywordCount": {
"description": "Total ACTIVE keywords wanted across the account after the change (absolute count, not an increment)",
"minimum": 0,
"type": "integer"
}
},
"required": [
"desiredKeywordCount"
],
"type": "object"
},
"name": "preview_keyword_billing",
"outputSchema": {
"$schema": "http://json-schema.org/draft-07/schema#",
"additionalProperties": false,
"properties": {
"result": {
"description": "Billing preview for that keyword count, same shape as preview_activate_pending: target plan, monthly price, prorated immediateCharge, isUpgrade, isDowngrade."
}
},
"type": "object"
}
},
{
"description": "Turn mention email alerts on or off and set how often the digest is sent. enabled is required on every call. cadenceMinutes must be one of 15, 30, 60, 120, 180, 240, 720, 1440, otherwise 400 \"Invalid alert frequency for your plan\"; a value faster than the plan floor is silently raised to the floor. Both settings are replaced on every call: omitting cadenceMinutes resets it to the fastest cadence the plan allows, so pass the current value when only toggling enabled. Use get_alert_settings for availableCadences before, and to confirm the applied cadence after. Returns the resolved settings.",
"inputSchema": {
"$schema": "http://json-schema.org/draft-07/schema#",
"additionalProperties": false,
"properties": {
"cadenceMinutes": {
"description": "Digest interval in minutes: 15, 30, 60, 120, 180, 240, 720, or 1440; raised to the plan floor when faster than allowed, reset to the fastest allowed when omitted",
"type": "integer"
},
"enabled": {
"description": "Turn email alerts on or off",
"type": "boolean"
}
},
"required": [
"enabled"
],
"type": "object"
},
"name": "update_alert_settings",
"outputSchema": {
"$schema": "http://json-schema.org/draft-07/schema#",
"additionalProperties": false,
"properties": {
"result": {
"description": "The resolved settings after clamping: { enabled, cadenceMinutes, minIntervalMinutes, availableCadences }."
}
},
"type": "object"
}
},
{
"description": "Set one mention's triage status. APPROVED marks it a real lead; REJECTED marks it noise and drops it from default list_mentions and count_mentions results (pass statuses to see it again); NEW returns it to the inbox. Fully reversible: any status can move to any other; reviewedAt is stamped when leaving NEW and cleared on NEW. Judge on the content and relevanceScore, calling explain_mention first when the score looks off; never approve a mention you have not read. mentionId comes from list_mentions. Returns the updated mention.",
"inputSchema": {
"$schema": "http://json-schema.org/draft-07/schema#",
"additionalProperties": false,
"properties": {
"mentionId": {
"description": "Mention ID (UUID)",
"type": "string"
},
"status": {
"description": "New status: APPROVED (real lead), REJECTED (noise, hidden from default lists), or NEW (back to inbox)",
"enum": [
"NEW",
"APPROVED",
"REJECTED"
],
"type": "string"
}
},
"required": [
"mentionId",
"status"
],
"type": "object"
},
"name": "update_mention_status",
"outputSchema": {
"$schema": "http://json-schema.org/draft-07/schema#",
"additionalProperties": false,
"properties": {
"result": {
"description": "The updated mention with its new status and reviewedAt (null when NEW)."
}
},
"type": "object"
}
},
{
"description": "Update a monitored website's display name and/or description. Only the fields you pass change: omitted fields keep their value, and an empty description clears it. The description is the context the AI scores every new mention against, so keep it an accurate summary of the product; mentions already scored are not rescored. Use analyze_website to draft a description from the live site before saving it here. URL and keywords cannot change through this tool: use add_keywords, edit_keyword, or disable_keyword for keywords. Returns the updated website with its keyword list.",
"inputSchema": {
"$schema": "http://json-schema.org/draft-07/schema#",
"additionalProperties": false,
"properties": {
"description": {
"description": "New scoring context; an empty string clears it, omit to keep the current one",
"maxLength": 5000,
"type": "string"
},
"name": {
"description": "New display name",
"type": "string"
},
"websiteId": {
"description": "Monitored website ID (UUID)",
"type": "string"
}
},
"required": [
"websiteId"
],
"type": "object"
},
"name": "update_website",
"outputSchema": {
"$schema": "http://json-schema.org/draft-07/schema#",
"additionalProperties": false,
"properties": {
"result": {
"description": "The updated website with its name, description, and keyword list."
}
},
"type": "object"
}
}
]
}Verify it yourself
curl -s https://api.teppi.xyz/v1/evidence/sha256:78e4b2d21c7c5e58d3031a1ff7b20b511a499771965b951ef245321796d38de6 | sha256sum