Skip to main content
Glama

Server Details

Nephia is a brand monitoring service, and this is its remote MCP server. Claude, Cursor, ChatGPT or any MCP client can read the mentions your brand gets on 14 sources: X, Reddit (posts and comments), YouTube, TikTok, Bluesky, Hacker News, Mastodon, Lemmy, GitHub, Product Hunt, Stack Overflow, any RSS feed, Vinted, and AI answers from ChatGPT, Gemini and Perplexity.

Every mention arrives already read, with its sentiment and intent, so an agent can answer plain questions: which complaints came in since Friday, what Reddit said about us this week. The source is an argument, not a tool, so one call reads every source you watch.

Sign-in is OAuth in the browser: no API key to copy. The consent screen has three permissions: read your mentions and Queries, change what is running (pause, resume, retire), and spend credits (semantic search and AI passes), which arrives unticked. Every tool description states its cost, so a model can budget before it spends.

The server is on every plan, Free included, and reading your own mentions through it costs nothing.

Ownership verified
Status
Healthy
Uptime
83.1% over 22 days
OAuth
Works in Glama
Last Tested
Transport
Streamable HTTP · MCP 2025-11-25
URL

TDQS

A4/5.0

Scored across 23 tools

Disambiguation3/5

Several tools operate on the same core objects: list_mentions, get_keyword_results, and get_keyword_events are three mention-reading paths, and analyses_estimate, explore_estimate, and keyword_estimate are three pricing tools. The descriptions explain the differences well, but an agent would need to read carefully to avoid picking the wrong one.

Naming Consistency3/5

Read tools use verb-first names like get_keyword and list_mentions, while mutation and estimate tools mostly use noun-first names like keyword_create, keyword_update, and analyses_run. Everything is snake_case and readable, but the two conventions are mixed rather than uniform, with account_credits and explore deviating further.

Tool Count3/5

23 tools is in the heavy range for a single server, though most are distinct and the estimate/write pairs are logical. The count is borderline and a substantial share are keyword-related or credit-related helpers, which can make the surface feel overwhelming.

Completeness4/5

The keyword lifecycle, source management, mention reading, stats, similarity, explore, and Vinted history/stats cover the apparent domain well. Minor gaps exist, such as no way to update a bucket or fully remove a source, but agents can work around them.

Available Tools

23 tools
account_creditsGet credit balanceA
Read-only
Inspect

Get the remaining credit balance for the Nephia account. Free — does not charge credits. Use this before a charged call, or after an insufficient-credits error.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

TDQS

A4.7/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint=true and openWorldHint=true. The description adds valuable behavioral context beyond that by stating the operation is free and does not consume credits, which is critical for an agent deciding whether to call it. It could further mention output format or authentication, but with annotations covering the read-only safety profile, this is sufficient.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is two sentences with no filler. The primary purpose is front-loaded in the first sentence, and the second sentence packs cost information and usage triggers efficiently. Every word earns its place.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a zero-parameter, no-output-schema utility, the description covers all necessary aspects: what the tool returns, that it is free, and when to invoke it. There is no missing operational detail an agent would need to use it correctly.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The tool accepts zero parameters, so the input schema fully documents the absence of arguments. Per the rubric, 0 params yields a baseline of 4. The description adds nothing about parameters because none exist, which is appropriate.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description states a specific verb and resource: 'Get the remaining credit balance for the Nephia account.' It clearly differentiates from siblings by addressing account-level balance rather than operation estimates or data queries, and the 'Free — does not charge credits' note further distinguishes it from charged tools.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description explicitly states when to use the tool: 'Use this before a charged call, or after an insufficient-credits error.' This provides clear context and a decision rule, and since no sibling provides the same balance-checking function, there are no alternatives to exclude.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

analyses_estimatePrice an AI passA
Read-only
Inspect

Costs 0 credits. Returns how many credits analyses_run would charge for that many items, per kind, computed by the same functions that charge it.

ParametersJSON Schema
NameRequiredDescriptionDefault
itemCountYesHow many items you would send.

TDQS

A4.3/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

The description adds useful behavior beyond the readOnlyHint annotation by stating that the call costs 0 credits and that the returned estimate is computed by the same functions that actually charge analyses_run. This reassures the agent that the estimate is accurate and side-effect-free. No annotation contradiction exists.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Two sentences, no filler. The most important trait (costs 0 credits) is front-loaded, followed immediately by what the tool returns and how the estimate is computed. Every sentence earns its place.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a tool with one simple parameter, no output schema, and read-only/open-world annotations, the description covers what the agent needs: cost, return value, relationship to analyses_run, and accuracy guarantee. No critical information is missing.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100%: itemCount is documented as 'How many items you would send' with min and max values. The description's phrase 'that many items' reinforces the parameter's meaning but does not add substantial new semantics beyond the schema, so the baseline of 3 is appropriate.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description states a precise verb (returns) and resource (how many credits analyses_run would charge), and clarifies scope ('for that many items, per kind'). It clearly differentiates this from analyses_run by framing it as a zero-credit estimation tool, leaving no doubt about what the tool does.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description implicitly tells the agent when to use this tool: instead of running analyses_run, call this to learn the credit cost in advance. It names analyses_run as the relevant alternative. It does not explicitly mention excluding query_estimate or explore_estimate, but the reference to analyses_run is sufficient for the primary use case.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

analyses_runRun an AI pass over itemsAInspect

Read a set of items with one AI pass. Charges credits: 1 credit per 50 items for group, classify and summarise, and 1 credit per 25 for agent — the agent answers your own fields per item, which is heavier than a single verdict. The response's meta.credits_used is what was actually charged; a batch the provider could not answer is not billed. Estimate first with analyses_estimate if the cost matters.

ParametersJSON Schema
NameRequiredDescriptionDefault
kindYesgroup: cluster the items by an instruction. classify: sort them into buckets you define. agent: apply your instruction and schema to each item. summarise: answer one question about the set.
itemsNoThe items to read. Use exactly one of items or keywordId.
limitNo
sinceNoWith keywordId: ISO instant, defaults to 24h ago.
schemaNoRequired for kind=agent: 1-12 flat fields to answer per item. No nesting, no arrays. Every field may answer null — that is a real answer.
bucketsNoRequired for kind=classify.
questionNoRequired for kind=summarise.
keywordIdNoRead a keyword's own recent mentions instead of passing items. The id comes from list_keywords.
instructionNoRequired for kind=group and kind=agent.

TDQS

A4.1/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Beyond the annotations (readOnlyHint=false, idempotentHint=false), the description discloses billing behavior: credits per item counts, actual charge reflected in meta.credits_used, and that unanswered batches are not billed. This is valuable operational context the annotations do not cover. No contradiction with annotations.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Four sentences with no filler. The main purpose is front-loaded, cost and alternative are woven in, and the text is compact. It could be slightly tighter but is well-structured for quick consumption.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given 9 parameters and nested objects, the description covers cost, estimation, and the billing outcome. It mentions the response's meta.credits_used, giving a hint of the return shape, but does not fully describe the output structure. Since no output schema exists, a bit more detail on the response format would improve completeness, but it is sufficient for correct invocation.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 89%, so the schema already documents most parameters. The description adds cost semantics per 'kind' (1 credit per 50 vs 25), which enriches that parameter's meaning. It does not add detail to items, limit, since, or schema parameters, but the schema covers them adequately. The added cost context justifies a slight upgrade from the baseline 3.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description opens with a clear verb and resource: 'Read a set of items with one AI pass.' It names the four kinds (group, classify, agent, summarise) and their distinct behaviors, making the tool's purpose unambiguous. It also references the estimation sibling, which helps differentiate when to use this versus analyses_estimate.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description explicitly says to use analyses_estimate first if cost matters, providing a clear alternative. It explains the credit costs per kind, which informs when this tool is appropriate. However, it does not explicitly state when not to use this tool versus other exploration tools like explore, so it stops short of full exclusion guidance.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

exploreExplore the Sources onceAInspect

Ask the Sources once, now, without creating a keyword, and read the mentions they return. It is the way to test a discovery angle before creating a keyword: competitors' names, problem phrases ("alternative to", "anyone know a tool"), a launch week. Read the outcomes: fetched without rows means the platform answered and the criteria kept nothing, and a failed search says why. The run is kept: read it again with list_mentions kind="runs" run=<run.id> rather than running it twice. Charges each search once, when it runs, at its Source's rate: 40 credits on TikTok; 5 credits on Youtube; 4 credits each on Reddit, Vinted; 1 credit each on Bluesky, Hacker News, Mastodon, Lemmy, GitHub, Product Hunt, Stack Overflow, RSS; on X, 5 credits plus 3 per result returned, so at most 65 credits for a page of 20. A search that fails is not charged, and the run is refused before any search when the balance cannot cover it. Call explore_estimate first, show the person the total, and send its estimateToken only after they agree. A leg the estimate marks variable was quoted at a full page: the run charges what came back, so quote the estimate as "up to".

ParametersJSON Schema
NameRequiredDescriptionDefault
sourcesYesThe Sources to ask, at most 6.
estimateTokenYesThe estimateToken explore_estimate returned for exactly these arguments. Valid 15 minutes. A token for other arguments is refused: estimate again.
globalCriteriaYesThe criteria every search inherits: market, and query or terms.

TDQS

A4.8/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations only say readOnlyHint=false, openWorldHint=true, idempotentHint=false, and destructiveHint=false; the description goes far beyond that by disclosing exact credit costs per source, that failed searches are not charged, that runs are refused if the balance cannot cover them, and how to interpret 'fetched without rows' versus 'failed search.' This is precisely the behavioral context an agent needs beyond the annotation booleans.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is long but every sentence contributes operational knowledge: pricing, failure modes, estimate flow, and rerun guidance. It is front-loaded with purpose, then moves through usage and cost. While it could be formatted as bullets, the density is appropriate for the tool's complexity.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given three nested parameters and no output schema, the description covers prerequisites, cost contingencies, failure semantics, and re-use via list_mentions. It explains what outcomes mean and when to use the estimate companion tool. No critical operational gap remains for an agent to call it correctly.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100% and the schema already documents every parameter with descriptions. The description adds extra meaning around estimateToken (its 15-minute validity, that mismatched arguments are refused, and that it must come from explore_estimate after user approval) and clarifies that variable legs are billed on actual results, so quotes should be 'up to'. Because the schema carries the structural detail, the description's extra parameter context elevates it above baseline.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description opens with 'Ask the Sources once, now, without creating a keyword, and read the mentions they return,' which states a specific verb, resource, and scope. It further differentiates from siblings by framing it as the way to test a discovery angle before creating a keyword, and by pointing to explore_estimate and list_mentions as counterparts. This leaves no ambiguity about what the tool does.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

It explicitly names the precondition 'Call explore_estimate first, show the person the total, and send its estimateToken only after they agree,' and gives an alternative for re-reading a run ('read it again with list_mentions kind="runs" run=<run.id> rather than running it twice'). It also frames the use case as testing before creating a keyword, which is a clear when-to-use. This is exemplary usage guidance.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

explore_estimateEstimate an Explore runA
Read-only
Inspect

Price an Explore run without calling any Source: the arguments of explore, minus the token. valid=false carries the refusal the run would give: the status, the code and the sentence naming the fix (a Source that cannot be explored, two identical searches, too many terms for the plan, a balance that cannot pay). valid=true carries total, perLeg (one entry per search) and balance. Show the person the total, then pass estimateToken to explore with the same arguments. Costs 0 credits and calls no Source. Returns what explore would charge per search and in total, computed by the functions that charge it, the balance, and the estimateToken explore requires.

ParametersJSON Schema
NameRequiredDescriptionDefault
sourcesYesThe Sources to ask, at most 6.
globalCriteriaYesThe criteria every search inherits: market, and query or terms.

TDQS

A4.4/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Beyond readOnlyHint and openWorldHint, the description discloses zero cost, no Source calls, the valid=false refusal payload (status, code, fix sentence), the valid=true payload (total, perLeg, balance), and the estimateToken required by explore. No behavioral surprises are left hidden.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The core purpose is front-loaded and the workflow is clear. However, the final sentence largely repeats return fields already listed in the valid=true sentence, and 'without calling any Source' appears twice. Still, relative to the schema complexity, it is reasonably tight.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

With no output schema, the description carries the full burden of explaining return values and failure modes. It covers both valid branches, the zero-cost/no-Source behavior, and the next step of passing estimateToken to explore. Nothing essential is missing for an agent to call it correctly.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, so the schema already documents the two parameters and all nested fields. The description adds the useful relationship 'arguments of explore, minus the token,' but no per-parameter semantics beyond the schema. Baseline 3 is appropriate.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The opening phrase 'Price an Explore run without calling any Source' names a specific verb, resource, and scope. It also distinguishes itself from the sibling explore tool by saying it takes 'the arguments of explore, minus the token' and later passes estimateToken to explore.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description clearly frames when to use it: before running an explore, to show the person the cost, then pass estimateToken to explore. It also notes it costs 0 credits and calls no Source. It does not explicitly enumerate when not to use it or contrast with other estimate siblings like query_estimate, so it stops short of a 5.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_keywordGet a keywordA
Read-only
Inspect

Get one keyword in full: what each of its searches actually polls (global criteria and per-source overrides already merged), its interval, whether AI reading and sentiment are on, its mute rules, its rules and the channels attached to it, and each Source's health (lastCheckedAt, lastOutcome, consecutiveFailures, stale). Use it to answer "why did/didn't this get caught?" before assuming a Source is broken, and report a stale Source before answering from its mentions. Free — does not charge credits.

ParametersJSON Schema
NameRequiredDescriptionDefault
idYesKeyword id, from list_keywords. Another account's id is a 404, never a 403.

TDQS

A4.5/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations declare readOnlyHint=true and openWorldHint=true, and the description adds valuable behavioral context beyond them: it states the operation is free ('does not charge credits'), that returned criteria are 'already merged', and that stale Sources should be reported before using their mentions. This is meaningful for correct agent behavior and does not contradict annotations.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is longer than minimal, but every sentence earns its place: the first sentence is a dense specification of the return payload, the next two give diagnostic use cases, and the last adds cost information. It is front-loaded with the core purpose and contains no filler.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a simple read-only tool with one parameter, no output schema, and an explicit enumeration of returned fields, the description is complete. It explains what the tool returns, when to use it, and the cost behavior, so an agent can invoke it correctly without additional context.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100% and the single `id` parameter is fully documented in the schema, including the 404 vs 403 behavior. The description adds no parameter-level detail, so it earns the baseline for high schema coverage.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description uses a specific verb ('Get') and resource ('keyword'), and enumerates the exact response contents, distinguishing it from siblings like get_keyword_results and get_keyword_events. It frames the tool as the diagnostic view for 'why did/didn't this get caught?', which clearly identifies its unique purpose.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description explicitly tells the agent when to use the tool: to answer 'why did/didn't this get caught?' and to report a stale Source before answering from mentions. It does not explicitly name alternatives or state when-not-to-use, but the use cases are clear and actionable.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_keyword_eventsReplay a keyword's raw events or activityA
Read-only
Inspect

Read a keyword without a webhook receiver, across all its searches, newest first. kind=events replays the raw events since an ISO instant, each in the exact shape the webhook delivers: id, type, keywordId, source, the entity itself (listing, tweet, post and so on), previousPrice, analysis and occurredAt. That includes the types a mention does not carry, such as listing.price_changed and listing.delisted on vinted. For reading what people said, prefer get_keyword_results: a mention is the same catch, projected to a title and a body. kind=activity answers "is it polling, and did my webhook answer?". kind=runs lists the stored AI answer runs. Free — does not charge credits.

ParametersJSON Schema
NameRequiredDescriptionDefault
idYesKeyword id, from list_keywords. Another account's id is a 404, never a 403.
kindNo"events" (the default) replays what the keyword caught, each entry in the exact shape its webhook delivers; "activity" is the log of checks and webhook deliveries (poll.completed, poll.failed, webhook.delivered, webhook.failed) with eventsEmitted, creditsCharged, statusCode and message; "runs" is for a keyword that polls ai_answers and returns every stored answer run with its citations and brand mentions, including the runs that changed nothing, which is most of them and exactly what a trend is made of.
limitNoMax entries to return.
sinceNoOnly entries after this ISO 8601 instant.
engineNokind "runs" only: the runs of this engine.
sourceNoOnly this Source. Absent means every Source the keyword polls. Not with kind "runs".

TDQS

A4.4/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

The readOnlyHint and openWorldHint already establish its non-mutating nature. The description adds useful behavioral context: events are replayed in webhook shape, activity logs checks and deliveries, runs includes no-op answer runs, and the operation is free and does not charge credits. There is no contradiction.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is longer than minimal, but every sentence adds value: it covers the primary use case, distinguishes the sibling tool, explains three modes, and notes the credit behavior. It is structured around kind values and remains efficient despite the complexity.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

With no output schema, the description must communicate return shapes, and it does: events lists the exact fields, activity lists the log entry fields, and runs are described as stored AI answer runs with citations and brand mentions. Ordering, mode behavior, and an alternative are also covered, making this complete for a six-parameter tool.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, so the schema already fully documents id, kind, limit, since, engine, and source. The description adds high-level meaning for the three kind values but does not meaningfully expand on parameter syntax or constraints beyond what the schema provides.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly identifies a specific verb/resource pair: reading/replaying a keyword's events or activity. It explicitly distinguishes itself from get_keyword_results by explaining what an event includes beyond a mention amount, and the title reinforces the three kinds of data returned.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

It states when to use this tool ('without a webhook receiver'), defines each kind's purpose, and explicitly points users to get_keyword_results when they want human-readable mentions. This is direct, actionable routing guidance.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_keyword_resultsList a keyword's mentionsAInspect

The same mentions as list_mentions, scoped to one keyword and carrying the bucket each was sorted into. Use it for "what has my monitor caught?" and, with bucket=, for "show me the pricing complaints". Free in the default text mode — these are your own rows. mode="semantic" asks the embedding index and charges 1 credit per question, then answers the same question free for 10 minutes, paging included. Do not set it to filter by keyword: that is what q= in text mode already does, for nothing. Cursor-paged: pass nextCursor back unchanged.

ParametersJSON Schema
NameRequiredDescriptionDefault
qNoSearch text, matched per mode= (default: free substring search)
idYesKeyword id, from list_keywords. Another account's id is a 404, never a 403.
modeNoHow q= is matched. "text" (the default) scans the window for the substring and is free. "semantic" asks the embedding index — it finds "this thing keeps crashing" for q="reliability complaints" — and charges. Never set it to do a keyword filter.
limitNoHow many mentions to return, 1-100. Defaults to 25 here, a page a model can actually read. Never page to count: mentions_stats counts the whole window in one free call.
sinceNoISO 8601 instant. Only mentions after it; defaults to the last 24 hours.
untilNoISO 8601 instant, inclusive. Only mentions before it. Use with since= to ask about a closed interval — a single day, or the week of a launch — instead of everything since a date. Absent means up to now.
bucketNoA bucket id from list_keyword_buckets, or the literal "uncategorised", which is a real destination (nothing matched), not a missing value.
cursorNoThe previous response's nextCursor, passed back unchanged, for the next page. Its absence from a response means that was the last page.
intentNoOnly mentions read as one of these intents. Several are OR'd, so ["purchase_intent", "comparison"] is the leads view for this keyword. "unread" is what nothing has classified yet.
sourceNoOnly these Sources. Several are OR'd, so ["reddit", "hackernews"] is both in one call. Absent means every Source this keyword polls.
sentimentNoOnly mentions read as one of these sentiments. Several are OR'd, so ["negative", "question"] is "what needs an answer" for this keyword. "unread" is what nothing has classified yet.
engagementNoA per-Source rule, repeatable: "<source|*>:<metric><operator><number>" — ["x:likes>=100", "reddit:score>50"] is "what landed, judged by what landing means where it was posted". Metrics are likes, replies, reposts, comments, score, views, plus total for the same interaction sum engagement_min reads. Operators are >=, >, =, <, <=; the number is whole and may be negative (Reddit and Lemmy net downvotes out). A Source no rule names PASSES — ["x:likes>=100"] narrows X and leaves Hacker News alone — a named rule overrides * for its own Source, and several rules on one Source are ANDed; use source to ask for one Source. A metric that was never counted satisfies NOTHING, < included: YouTube reports no likes, RSS and AI answers report no audience, and mentions recorded before 2026-09-04 predate the field, so ["youtube:likes<10"] returns none of them rather than all of them. Send this or engagement_min, never both.
opportunityNotrue keeps only opportunities: mentions of a topic or competitor keyword that are highly relevant to it and whose author is someone to answer (the keyword's agent step says problem_fit true, or, without that field, the intent is purchase_intent, comparison or question). Use it for "who should I answer today?". An own keyword has none. Free.
engagement_minNoOnly mentions with at least this many interactions — likes, replies, reposts, comments or score, depending on the Source. Never counts views. Mentions with no counters at all (RSS, AI answers, anything recorded before 2026-09-04) are left out rather than treated as zero. Counters are captured when the item is collected and never refreshed, so a threshold reads against recent mentions. For a threshold on one metric on one Source, use engagement instead.

TDQS

A4.5/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Beyond the sparse annotations, the description discloses important behavioral traits: the default text mode is free, semantic mode charges 1 credit per question with a 10-minute free repeat, results are cursor-paged with nextCursor, and q= already handles keyword filtering in text mode. It does not mention auth or rate limits, but the pricing, paging, and misuse warning add considerable value beyond the annotations.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is five sentences, front-loading the core relationship to list_mentions and the purpose. Each sentence contributes distinct information: scope, use cases, cost model, a warning, and paging. It is slightly longer than minimal but every sentence earns its place; no filler.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the 14-parameter schema with full coverage and no output schema, the description provides essential context: scope, cost, paging, and a key pitfall. It anchors to list_mentions to convey the response shape and mentions the bucket enrichment. It could explicitly describe the response structure, but the combination of schema coverage and the list_mentions reference makes it sufficiently complete.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

With 100% schema description coverage, the baseline is 3, but the description adds semantic insight beyond the schema: it clarifies that bucket= is used for sorting categories (e.g., pricing complaints), that q= in text mode is the keyword filter (so bucket should not be used for that), and that cursor must be passed back unchanged. These clarifications help avoid common mistakes.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description states exactly what the tool does: returns the same mentions as list_mentions but scoped to one keyword, additionally carrying the bucket each mention was sorted into. It gives concrete use cases ("what has my <brand> monitor caught?", "show me the pricing complaints") and explicitly differentiates it from the sibling list_mentions, making the purpose unambiguous.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description provides explicit when-to-use guidance with concrete examples, and warns against a common misuse ("Do not set it to filter by keyword: that is what q= in text mode already does"). It also names the alternative list_mentions as the baseline and explains cost implications of mode selection, helping the agent choose the right tool and parameters.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

keyword_brand_setSee or set a keyword's brandA
Idempotent
Inspect

Read or choose the brand a keyword's reply drafts speak for, when the account has several (a product line, a second company). Call it without brandProfileId to see the brands and the current choice, then with a brand id, or null for the default. Changes nothing that is polled and starts no search over. Free — does not charge credits.

ParametersJSON Schema
NameRequiredDescriptionDefault
idYesKeyword id, from list_keywords. Another account's id is a 404, never a 403.
brandProfileIdNoAbsent: nothing is written, and the answer lists the account's brands beside the keyword's current one. A brand id from that list: the keyword's drafts speak for it. null: back to the account's default brand.

TDQS

A4.5/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already cover idempotency and non-destructiveness, and the description adds meaningful behavioral context beyond them: it clarifies that the read mode writes nothing, that setting a brand only affects reply drafts, that nothing polled is changed, no search is started, and no credits are charged. No contradiction with annotations.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Three sentences, front-loaded with the core purpose and the condition for use, followed by a compact call sequence and side-effect notes. Every sentence earns its place; no filler or repetition.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a two-parameter tool with rich schema descriptions and no output schema, the description covers the full operation modes, side effects, and prerequisite id source. An agent can correctly choose and invoke the tool without unresolved gaps.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, and the schema already explains the absent/id/null behaviors precisely. The description reinforces the same semantics in prose but does not add new parameter-level meaning beyond the schema, so baseline 3 is appropriate.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description names a specific operation pair ('Read or choose') and a specific resource ('the brand a keyword's reply drafts speak for'), with a clear condition ('when the account has several'). This distinguishes it from broader keyword-update or management siblings without needing to open the schema.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description gives explicit calling guidance: call without brandProfileId to inspect brands and the current choice, then call with a brand id or null. It also states the appropriate context ('when the account has several'). It does not explicitly name sibling alternatives or exclusions, so it stops short of a full when-not map.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

keyword_bucket_manageCreate or delete a bucketA
Destructive
Inspect

Create a bucket on a listening keyword (a name, and one sentence saying what belongs in it), or delete one. Deleting a bucket deletes no mention: its mentions become uncategorised, and unclassified says how many. Ask before deleting. Free — does not charge credits. Sorting is charged when it runs, not here.

ParametersJSON Schema
NameRequiredDescriptionDefault
idYesKeyword id, from list_keywords. Another account's id is a 404, never a 403.
ruleNocreate only: one plain sentence saying what belongs in the bucket. The model reads the sentence, not keywords.
colorNo
labelNocreate only: the bucket name.
actionYes
bucketIdNodelete only: from list_keyword_buckets.

TDQS

A4.4/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

The annotations only say destructiveHint=true, but the description goes further by explaining that deleting a bucket does not delete mentions, mentions become uncategorised, and the count appears as unclassified. It also discloses the free nature and the separation of sorting charges, adding meaningful behavioral context beyond the structured annotations.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is compact and front-loaded with the primary purpose. Each sentence adds useful information: the operation, the deletion side effects, the ask-before-deleting policy, and the cost behavior. There is no redundant or filler content.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a dual-action tool with no output schema, the description covers the important behavioral and cost context well. It still relies on the schema for parameter specifics like bucketId, and does not describe the response shape, but the combination of schema and description is sufficient for correct invocation.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 67%, and the description does not significantly add parameter meaning beyond what the schema already provides. The parenthetical about a name and one sentence maps to label and rule, but those are already described in the schema. The color, action, id, and bucketId parameters still rely on the schema or enum values.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the specific operation: create or delete a bucket on a listening keyword, and defines what a bucket is. This distinguishes it from sibling tools like keyword_create or keyword_manage, which operate on keywords rather than buckets.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

It gives clear context for when to use the tool: create or delete a bucket on a listening keyword. It also provides explicit guidance to ask before deleting and clarifies that sorting is charged separately, which helps choose this tool over paid alternatives, though it does not name specific sibling tools.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

keyword_createCreate a keywordAInspect

Create a keyword, the one object you monitor with. A keyword carries its terms (globalCriteria, and the searches of each Source), the Sources it polls and its settings: interval, webhook, mute rules and the other exclusions, sorting and sentiment. The smallest keyword is one Source, one interval and an optional webhook: sources with a single entry, refreshIntervalSeconds, webhookUrl. A Source whose search needs more than the shared text (a subreddit, a feed URL, a prompt, Vinted filters) takes it in searches[].overrides, whose description says what each Source needs. For the shape of rules or channels, read get_keyword on an existing keyword. A topic keyword (subjectRole topic) sent without globalCriteria.match is created with match word, the phrase as written; send match contains to widen it, or platform for the platform's own matching. For a topic, also send sentimentEnabled true and an aiStep with a boolean problem_fit field (true only when the author has the problem themselves): the opportunity filter of list_mentions reads it. Call keyword_estimate with the same arguments first: it runs the same validation, writes nothing, and returns the price and the estimateToken this tool requires. Starts or changes polling that is charged per check at each Source's credit rate (AI answers per engine asked) until the keyword or the Source is paused. Call keyword_estimate first, show the person the monthlyCredits it returns, and send its estimateToken only after they agree.

ParametersJSON Schema
NameRequiredDescriptionDefault
nameYes
colorNoThe keyword colour in the dashboard. Left out on create, an unused one is picked.
rulesNoReplaces the list. Copy the shape from get_keyword on an existing keyword.
aiStepNoYour own question asked of every mention, with the fields to fill: {"instruction": one or two sentences, 800 characters at most, "schema": 1 to 12 flat fields, each {"type": "string" | "number" | "boolean" | "enum", "description", "values" for an enum, "maxLength" for a string}}, no nesting and no arrays. The answer arrives on each event as analysis. Costs 1 credit per 25 items, on top of the check rate. Delivery waits up to 120s for it; on timeout the event is still delivered, with the answer null and a status saying why. null removes it.
sourcesYesThe Sources this keyword polls, one entry each; a single entry is a keyword that polls one Source. Each enabled search is one check at its rate. What each Source needs is in the description of searches[].overrides.
aiPresetNo
aiPromptNo
backfillNotrue runs a first scan right away, so the keyword is not empty on day one. What it finds fires no webhook, since a first scan is context and not news, and comes back marked seeded. A first scan is one search per enabled Source at that Source's check rate, except where a Source is billed per result: on X it is 5 credits plus 3 per result returned, at most 65 credits for its page of 20. So a first scan that includes such a Source is quoted at its ceiling: say "up to". Needs the nephia:spend permission. AI answers never backfills.
channelsNoReplaces the delivery channels attached to the keyword.
scheduleNoAn activation window with ISO instants. null keeps the keyword always on.
aiEnabledNoSort mentions into buckets.
muteRulesNoReplaces the list. A plain string mutes that word.
spikeAlertNoThe alert a new keyword starts with. null starts with none. Free.
vipAuthorsNoReplaces the list. A plain string is a handle.
webhookUrlNoA publicly reachable HTTPS endpoint the person controls: new mentions are POSTed there. Never invent this URL, ask the person for it. Left out, the keyword records what it catches without pushing it, and you read it with list_mentions, get_keyword_results or get_keyword_events. null removes the webhook.
subjectRoleNoWhat the keyword is about: your own brand, a competitor's, or a topic. A new topic without globalCriteria.match is created with match word.
webhookModeNoall delivers every new mention; rules delivers only what a rule routes.
estimateTokenYesThe estimateToken keyword_estimate returned for exactly these arguments. Valid 15 minutes. A token for other arguments is refused: estimate again.
globalCriteriaYesThe criteria every search inherits: market (required, e.g. "us") and query or terms. AI answers reads no search text, so a keyword of prompts only still names a market.
coBrandsEnabledNoAI answers only: also read each answer for the other brands it names, charged per answer on top of the run.
relevanceContextNoOne sentence the AI reading uses to judge relevance, such as "Acme is a cloud storage company, not the cartoon." null clears it.
sentimentEnabledNoRead every mention for sentiment and intent.
refreshIntervalSecondsYesDefault seconds between checks, for every Source without its own interval. The plan and each Source set a floor; the estimate names the band when a value is outside it.

TDQS

A4.6/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Even though annotations already mark this as a write operation, the description reveals substantial behavior beyond them: charging ('polling that is charged per check at each Source's credit rate'), the estimateToken's 15-minute validity and argument-binding constraint ('A token for other arguments is refused'), the backfill side effects and its nephia:spend permission requirement, and the webhook rule ('Never invent this URL, ask the person for it'). No contradiction with the annotations; openWorldHint=true is consistent with the many additionalProperties objects in the schema.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is long but front-loaded — definition first, then the minimal shape, then the estimate workflow — and every sentence carries information an agent needs rather than repeating schema text. For a 23-parameter tool with 14 source types and billing semantics, the length is proportionate; a small amount of material (topic-keyword handling) also appears in the schema's subjectRole description, so it is slightly redundant but not wasteful.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the tool's complexity — 23 parameters, nested source overrides, per-source interval floors, billing, and a required estimate artifact — the description covers everything an agent needs to call it correctly: prerequisites, approval workflow, special cases, permissions, and cost disclosure. No output schema exists, so return-value documentation is not required, and the success path is adequately hinted by the pointer to read results via list_mentions, get_keyword_results, or get_keyword_events.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 87%, so the baseline is 3, and the description wisely avoids restating the schema's per-source override details. Instead it adds cross-parameter meaning the schema cannot: the minimal viable keyword ('one Source, one interval and an optional webhook'), the estimateToken-to-arguments binding, the topic-keyword default ('created with match word'), and the inheritance model where an absent searches array inherits globalCriteria. This is meaningful added semantics above the high-coverage baseline.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The opening sentence states a specific verb and resource — 'Create a keyword, the one object you monitor with' — and then defines the object's anatomy (terms, Sources, settings). It names the confusable sibling keyword_estimate and clarifies the relationship ('it runs the same validation, writes nothing, and returns the price and the estimateToken this tool requires'), so an agent can distinguish create from estimate and update without opening schemas.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description gives an explicit, two-part workflow: 'Call keyword_estimate with the same arguments first' and 'send its estimateToken only after they agree,' which is strong when-to-use guidance with a named alternative. It also routes the agent to get_keyword for the shape of rules and channels. However, it never states when NOT to use this tool — e.g., that modifying an existing keyword belongs to keyword_update — so the exclusion half of the guidance is implicit.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

keyword_estimateEstimate a keyword or a changeA
Read-only
Inspect

Price a new keyword (no id, the arguments of keyword_create) or a change to one (an id, the arguments of keyword_update) without writing anything. valid=false carries the refusal the write would give: the status, the code and the sentence naming the fix. valid=true carries monthlyCredits in total, per Source and per search, firstScanCredits when backfill is true (the most the first scan can cost, see backfill), the plan allowance and the credits left, and for a change the monthly difference and resetSearches, the searches it would start over. A new keyword also carries volume when it names a free Source (Reddit, Bluesky, Hacker News, GitHub, Stack Overflow, Mastodon, Lemmy, RSS): the estimated mentions a month on the Sources in measuredOn, and a bucket from none to over_10k, free and never charged. Show the person monthlyCredits before any write, then pass estimateToken to that write with the same arguments. What each Source needs in a search is in the description of searches[].overrides. A topic keyword (subjectRole topic) sent without globalCriteria.match is created with match word, the phrase as written; send match contains to widen it, or platform for the platform's own matching. For a topic, also send sentimentEnabled true and an aiStep with a boolean problem_fit field (true only when the author has the problem themselves): the opportunity filter of list_mentions reads it. Costs 0 credits and writes nothing. Returns what the write would cost a month, computed by the functions that charge it, and the estimateToken the write requires.

ParametersJSON Schema
NameRequiredDescriptionDefault
idNoAbsent: price a new keyword, with the arguments of keyword_create. A keyword id: price a change, with the arguments of keyword_update.
nameNo
colorNoThe keyword colour in the dashboard. Left out on create, an unused one is picked.
rulesNoReplaces the list. Copy the shape from get_keyword on an existing keyword.
aiStepNoYour own question asked of every mention, with the fields to fill: {"instruction": one or two sentences, 800 characters at most, "schema": 1 to 12 flat fields, each {"type": "string" | "number" | "boolean" | "enum", "description", "values" for an enum, "maxLength" for a string}}, no nesting and no arrays. The answer arrives on each event as analysis. Costs 1 credit per 25 items, on top of the check rate. Delivery waits up to 120s for it; on timeout the event is still delivered, with the answer null and a status saying why. null removes it.
sourcesNoThe Sources this keyword polls, one entry each; a single entry is a keyword that polls one Source. Each enabled search is one check at its rate. What each Source needs is in the description of searches[].overrides.
aiPresetNo
aiPromptNo
backfillNotrue runs a first scan right away, so the keyword is not empty on day one. What it finds fires no webhook, since a first scan is context and not news, and comes back marked seeded. A first scan is one search per enabled Source at that Source's check rate, except where a Source is billed per result: on X it is 5 credits plus 3 per result returned, at most 65 credits for its page of 20. So a first scan that includes such a Source is quoted at its ceiling: say "up to". Needs the nephia:spend permission. AI answers never backfills.
channelsNoReplaces the delivery channels attached to the keyword.
scheduleNoAn activation window with ISO instants. null keeps the keyword always on.
aiEnabledNoSort mentions into buckets.
muteRulesNoReplaces the list. A plain string mutes that word.
spikeAlertNoThe alert a new keyword starts with. null starts with none. Free.
vipAuthorsNoReplaces the list. A plain string is a handle.
webhookUrlNoA publicly reachable HTTPS endpoint the person controls: new mentions are POSTed there. Never invent this URL, ask the person for it. Left out, the keyword records what it catches without pushing it, and you read it with list_mentions, get_keyword_results or get_keyword_events. null removes the webhook.
subjectRoleNoWhat the keyword is about: your own brand, a competitor's, or a topic. A new topic without globalCriteria.match is created with match word.
webhookModeNoall delivers every new mention; rules delivers only what a rule routes.
globalCriteriaNoThe criteria every search inherits: market (required, e.g. "us") and query or terms. AI answers reads no search text, so a keyword of prompts only still names a market.
coBrandsEnabledNoAI answers only: also read each answer for the other brands it names, charged per answer on top of the run.
relevanceContextNoOne sentence the AI reading uses to judge relevance, such as "Acme is a cloud storage company, not the cartoon." null clears it.
sentimentEnabledNoRead every mention for sentiment and intent.
refreshIntervalSecondsNoDefault seconds between checks, for every Source without its own interval. The plan and each Source set a floor; the estimate names the band when a value is outside it.

TDQS

A4.9/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations include readOnlyHint=true and openWorldHint=true, and the description reinforces this by stating 'Costs 0 credits and writes nothing.' It goes beyond the annotations by detailing the output structure: valid=true carries monthlyCredits, per-Source and per-search breakdowns, firstScanCredits, plan allowance, credits left, and for changes monthly difference and resetSearches. It also explains valid=false carries the refusal details. No contradictions.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is dense but well-organized, front-loading the core purpose and then layering specifics. Every sentence adds information—costs, output fields, free sources, topic handling, and the token requirement. Despite its length, it is efficient and well-structured for the complexity involved.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the 23 parameters, nested objects, and no output schema, the description provides comprehensive context: it details the output fields, the conditions for free sources, the meaning of valid flags, and the backfill cost ceiling. It also references searches[].overrides for source-specific requirements, which is necessary for correct invocation. No critical information appears missing.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 87%, so the schema already documents most parameters. The description adds meaningful context: the id parameter's absence/presence determines new vs change, the topic keyword behavior (match, sentimentEnabled, aiStep with problem_fit), and the backfill cost implications. This adds value beyond the schema without redundantly repeating it.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the tool's purpose: to price a new keyword (using keyword_create arguments) or a change (using keyword_update arguments) without writing. It distinguishes the two modes via the presence of an id and explicitly mentions that it writes nothing, which differentiates it from the write tools.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description provides a clear workflow: show the person monthlyCredits before any write, then pass estimateToken to that write with the same arguments. It also notes that valid=false carries the refusal the write would give, so the tool can be used to check validity without committing. It does not explicitly name alternative tools, but the usage context is unambiguous.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

keyword_managePause, resume, or retire a keywordA
DestructiveIdempotent
Inspect

Manage a keyword's lifecycle across every Source at once: pause stops all its polling and all its spending, resume restarts it, delete retires it and frees the plan slot. Free — does not charge credits. Pausing is also how you stop the polling that does. On resume, a Source an operator stopped stays stopped and comes back named in blockedSources rather than failing the call: read that field before reporting success. delete takes an optional purge: without it the mentions the keyword caught stay readable, with purge=true they are deleted too and cannot be recovered. Ask before pausing or deleting, and ask again before purging: this is the customer's monitoring and the mentions are the record of what it found.

ParametersJSON Schema
NameRequiredDescriptionDefault
idYesKeyword id, from list_keywords. Another account's id is a 404, never a 403.
purgeNoOnly with action=delete. true also deletes every mention the keyword collected, with its readings, marks and replay entries. The keyword itself stays readable by id. Omitted or false is the default retire: the mentions stay readable until retention ages them out. This erases the customer's collected data and is not reversible, so ask before sending it. Credits are not refunded either way.
actionYespause stops every Source: nothing polls, charges or delivers, and the mentions already caught stay readable. resume restarts every Source that can follow. delete retires the keyword and frees the plan slot; it is not a hard delete, so the keyword and its mentions stay readable.

TDQS

A4.6/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already signal destructive/non-read-only behavior, and the description adds substantial context: the operation is free, paused sources stopped by an operator remain stopped on resume and surface in blockedSources, purge is irreversible, and customer consent is required. No contradiction with annotations.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is dense and mostly front-loaded, with the scope and actions in the first sentence. A few clauses are slightly awkward, but every sentence contributes operational value.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a 3-parameter mutation with no output schema, this is thorough: it covers credit effects, return behavior via blockedSources, retention vs purge, irreversibility, and consultation requirements. Nothing an agent needs to invoke it correctly is missing.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100% and both action and purge are already well documented. The description adds extra meaning by explaining the blockedSources return field and reinforcing the irreversible data-loss implications of purge=true, which goes beyond the schema.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb ('manage'), a resource ('keyword'), and the scope ('across every Source at once'), then enumerates the three distinct lifecycle actions: pause, resume, delete. This differentiates it clearly from per-source tools like keyword_source_manage.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Defines when each action applies and gives explicit operational guidance: pause stops polling/spending, resume restarts, delete retires and frees a slot. It also instructs the agent to ask before pausing, deleting, or purging. It does not explicitly name sibling alternatives, but the 'across every Source at once' framing makes the intended scope clear.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

keyword_source_managePause or resume one of a keyword's sourcesA
DestructiveIdempotent
Inspect

Stop one Source of a keyword for a while, or start it again, without touching its searches or the other Sources. Refused on a Source the keyword does not poll, on a paused keyword, and on the last Source still polling: pause the whole keyword with keyword_manage instead. On resume, a Source an operator stopped comes back in blockedSources. Free — does not charge credits. Pausing is also how you stop the polling that does.

ParametersJSON Schema
NameRequiredDescriptionDefault
idYesKeyword id, from list_keywords. Another account's id is a 404, never a 403.
actionYespause stops this Source's checks and leaves the other Sources polling; its searches and mentions stay. resume starts it again.
sourceYes

TDQS

A4.8/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Beyond the annotations, the description discloses concrete side effects: other Sources and searches are untouched, certain inputs are refused, manually stopped Sources return in blockedSources on resume, and the operation does not consume credits. These are meaningful behavioral details not inferable from annotations alone.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is dense and front-loaded, with no filler. The only slight weakness is the final sentence, 'Pausing is also how you stop the polling that does,' which is grammatically awkward and less clear than the rest.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a 3-parameter mutating tool with no output schema, this description provides inputs, restrictions, side effects, fallback behavior, and cost impact. An agent has enough context to decide when to call it and what to expect, including the blockedSources nuance on resume.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The schema already documents id and action and enumerates source values; the description adds value by tying action to real-world state changes and by surfacing validation rules about un-polled Sources and the last polling Source. It does not describe each enum value, but those names are self-explanatory and the schema covers the rest.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description states a specific verb pair ('pause/resume') and an exact resource ('one Source of a keyword'), then immediately clarifies scope: 'without touching its searches or the other Sources.' This clearly distinguishes it from related tools like keyword_manage and keyword_source_set.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

It gives an explicit when-not case: refusal on the last still-polling Source, and directs the agent to use keyword_manage instead. It also adds cost guidance ('Free — does not charge credits') and frames pausing as the way to stop polling, helping the agent choose the right operation.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

keyword_source_setAdd or replace one of a keyword's sourcesA
DestructiveIdempotent
Inspect

Add a Source to a keyword, or replace one Source's searches, interval or enabled state, leaving every other Source untouched. Two calls. The first, with mode "estimate" and no estimateToken, writes nothing and returns the estimate of the change: monthlyCredits before and after, and resetSearches, the searches whose criteria change and whose next check starts from a fresh baseline without emitting what it finds. Show both to the person. The second, with mode "write", the same arguments and that estimateToken, writes it, and fails if the save started over a search the estimate did not announce. applied says which of the two happened: only applied=true is a save. Example, AI answers: source "ai_answers", refreshIntervalSeconds 604800, one search per prompt with overridesEnabled true and overrides {"filters": {"prompt": "...", "brands": ["YourBrand"], "engines": ["chatgpt", "gemini", "perplexity"]}}; switch coBrandsEnabled with keyword_update. Starts or changes polling that is charged per check at each Source's credit rate (AI answers per engine asked) until the keyword or the Source is paused. Call keyword_estimate first, show the person the monthlyCredits it returns, and send its estimateToken only after they agree.

ParametersJSON Schema
NameRequiredDescriptionDefault
idYesKeyword id, from list_keywords. Another account's id is a 404, never a 403.
modeYesestimate writes nothing and returns the price of this change with its estimateToken; it takes no estimateToken. write saves the change and requires the estimateToken of an estimate made with the same arguments.
sourceYes
enabledYesfalse switches the Source off and removes its checks; its searches stay stored. To stop it for a while, use keyword_source_manage instead.
searchesNoReplaces this Source's searches. Keep the id of each search you keep. Absent keeps the stored searches.
estimateTokenNomode "write" only, and required there: the estimateToken the mode "estimate" call returned for these same arguments. Valid 15 minutes.
refreshIntervalSecondsNoThis Source's own seconds between checks. null goes back to the keyword's refreshIntervalSeconds. Each Source has its own band: AI answers runs between 6 hours (21600) and 7 days (604800).

TDQS

A4.9/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare destructiveHint=true and readOnlyHint=false, and the description goes well beyond them: it explains the two-phase commit (estimate writes nothing, write fails 'if the save started over a search the estimate did not announce'), cost implications ('charged per check at each Source's credit rate'), and the destructive semantics of enabled=false ('removes its checks; its searches stay stored'). No contradiction with annotations.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is very long, but it is front-loaded with the core purpose and the critical estimate/write workflow before the per-source detail block. Each sentence carries real information for a complex tool; the density is justified, though the wall-of-text per-source section could be better broken up. Minor structural critique only.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

No output schema exists, yet the description explains return semantics explicitly: 'monthlyCredits before and after, and resetSearches' and 'applied says which of the two happened: only applied=true is a save.' It also covers the failure condition, cost, and per-source behavior. For a 7-parameter two-phase mutation tool, nothing an agent needs is missing.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters5/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Despite 86% schema coverage, the description adds substantial value: it clarifies the mode enum semantics (estimate takes no token, write requires it), explains the searches replacement behavior ('Keep the id of each search you keep'), documents refreshIntervalSeconds bands, and provides an exhaustive per-source guide to overrides with a concrete ai_answers example. This far exceeds the baseline for high-coverage schemas.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a precise verb pair (add/replace) with a specific resource (one of a keyword's sources) and an explicit scope constraint: 'leaving every other Source untouched.' The title and first sentence align, and the description clearly differentiates from siblings like keyword_source_manage and keyword_estimate by naming them and their distinct roles.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Provides an explicit when-to-use protocol: 'Call keyword_estimate first, show the person the monthlyCredits it returns, and send its estimateToken only after they agree.' It also names exclusions and alternatives: 'To stop it for a while, use keyword_source_manage instead' and 'switch coBrandsEnabled with keyword_update.' The estimate-then-write sequence is unambiguous.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

keyword_updateChange keyword settingsA
DestructiveIdempotent
Inspect

Change a keyword's settings: name, default interval, sorting, sentiment, co-brands, agent step, subject role, mute rules, VIP authors, rules, webhook, schedule and channels. A key you leave out is left alone; null clears it. Never its Sources or searches: that is keyword_source_set, so this tool starts no search over. Call keyword_estimate with the same arguments first: it runs the same validation, writes nothing, and returns the price and the estimateToken this tool requires. Starts or changes polling that is charged per check at each Source's credit rate (AI answers per engine asked) until the keyword or the Source is paused. Call keyword_estimate first, show the person the monthlyCredits it returns, and send its estimateToken only after they agree.

ParametersJSON Schema
NameRequiredDescriptionDefault
idYesKeyword id, from list_keywords. Another account's id is a 404, never a 403.
nameNo
colorNoThe keyword colour in the dashboard. Left out on create, an unused one is picked.
rulesNoReplaces the list. Copy the shape from get_keyword on an existing keyword.
aiStepNoYour own question asked of every mention, with the fields to fill: {"instruction": one or two sentences, 800 characters at most, "schema": 1 to 12 flat fields, each {"type": "string" | "number" | "boolean" | "enum", "description", "values" for an enum, "maxLength" for a string}}, no nesting and no arrays. The answer arrives on each event as analysis. Costs 1 credit per 25 items, on top of the check rate. Delivery waits up to 120s for it; on timeout the event is still delivered, with the answer null and a status saying why. null removes it.
aiPresetNo
aiPromptNo
channelsNoReplaces the delivery channels attached to the keyword.
scheduleNoAn activation window with ISO instants. null keeps the keyword always on.
aiEnabledNoSort mentions into buckets.
muteRulesNoReplaces the list. A plain string mutes that word.
vipAuthorsNoReplaces the list. A plain string is a handle.
webhookUrlNoA publicly reachable HTTPS endpoint the person controls: new mentions are POSTed there. Never invent this URL, ask the person for it. Left out, the keyword records what it catches without pushing it, and you read it with list_mentions, get_keyword_results or get_keyword_events. null removes the webhook.
subjectRoleNoWhat the keyword is about: your own brand, a competitor's, or a topic. A new topic without globalCriteria.match is created with match word.
webhookModeNoall delivers every new mention; rules delivers only what a rule routes.
estimateTokenYesThe estimateToken keyword_estimate returned for exactly these arguments. Valid 15 minutes. A token for other arguments is refused: estimate again.
coBrandsEnabledNoAI answers only: also read each answer for the other brands it names, charged per answer on top of the run.
relevanceContextNoOne sentence the AI reading uses to judge relevance, such as "Acme is a cloud storage company, not the cartoon." null clears it.
sentimentEnabledNoRead every mention for sentiment and intent.
refreshIntervalSecondsNoDefault seconds between checks, for every Source without its own interval. The plan and each Source set a floor; the estimate names the band when a value is outside it.

TDQS

A4.7/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations declare destructiveHint=true, readOnlyHint=false, idempotentHint=true, and openWorldHint=true. The description adds substantial context beyond these: it reveals that the tool starts or changes polling with per-check credit charges, that estimateToken must exactly match the arguments and expires in 15 minutes, and that null clears fields while omitted keys are untouched. It also confirms it never starts a search. These details align with the annotations and significantly enhance the agent's understanding of side effects and constraints.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is long but every sentence carries weight. It is structured logically: purpose, exclusions, workflow, charging model, and a final reminder. It front-loads the primary action and then builds context. No redundant or filler sentences; the density is justified by the tool's complexity.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given 20 parameters and no output schema, the description covers the critical operational aspects: the mandatory estimateToken prerequisite, the distinction between omit and null, the charging model, and the scope limitation. It does not explicitly describe the return value, but for an update tool this is often a confirmation; the absence is acceptable given the rich workflow guidance. Overall, an agent has enough to invoke it correctly.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 85%, so most parameters already have descriptive entries. The description adds cross-cutting semantics that apply to all optional fields: 'A key you leave out is left alone; null clears it.' It also clarifies the estimateToken requirement — that it must be for exactly these arguments and is valid 15 minutes. This goes beyond the schema's per-field descriptions and aids correct usage.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description opens with a clear verb-resource pair — 'Change a keyword's settings' — and enumerates the exact fields (name, interval, sorting, etc.). It explicitly differentiates from keyword_source_set by stating 'Never its Sources or searches: that is keyword_source_set', and distinguishes keyword_estimate as a validation-only call. The purpose is unambiguous and distinct from all sibling tools.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description gives explicit when-to-use guidance: it instructs to call keyword_estimate first with the same arguments, show the monthlyCredits to the user, and only then send the estimateToken after agreement. It also clearly states what this tool does NOT do (sources/searches belong to keyword_source_set) and explains the omit-vs-null semantics. This leaves no ambiguity about the correct workflow or alternatives.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

list_keyword_bucketsList a keyword's bucketsA
Read-only
Inspect

The buckets this keyword sorts its mentions into (id, label, the plain-language rule behind it, and a count each), plus how many are unsorted and how many are still pending. The ids are what get_keyword_results takes as bucket=, and the labels are what the ids in its output mean. Free — does not charge credits. Listing buckets never triggers a sorting pass, so it cannot bill.

ParametersJSON Schema
NameRequiredDescriptionDefault
idYesKeyword id, from list_keywords. Another account's id is a 404, never a 403.

TDQS

A4.4/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

The description goes beyond the annotations (readOnlyHint and openWorldHint) by stating it is free and does not charge credits, and that listing never triggers a sorting pass so it cannot bill. It also adds that another account's id returns a 404, not 403 (though this is in the schema, the description reinforces the behavioral expectations). No contradiction with annotations.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is two sentences, tightly packed with essential information: what is returned, how it relates to another tool, and the cost/side-effect behavior. No fluff, front-loads the core purpose, and every clause adds value.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the single parameter and no output schema, the description adequately outlines the return content (buckets with id, label, rule, count; plus unsorted and pending counts). It also explains the linkage to get_keyword_results. It could specify the exact return structure (array vs object) but that is not essential for an agent to call it correctly.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The single parameter 'id' is fully described in the schema: 'Keyword id, from list_keywords. Another account's id is a 404, never a 403.' The main description does not add additional parameter semantics, so it relies on the schema, which is complete (100% coverage). Baseline of 3 is appropriate.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the tool lists the buckets a keyword sorts its mentions into, enumerating the fields (id, label, plain-language rule, count) and adding unsorted/pending counts. It also differentiates its purpose from get_keyword_results by explaining the relationship of the ids and labels, which helps an agent understand what this tool is for.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description explains how the output is used: the ids are passed as bucket= to get_keyword_results, and the labels explain the meaning of ids in that output. It also notes that the tool is free and never triggers a sorting pass, so it can be called without cost concerns. It doesn't explicitly contrast with sibling tools like keyword_bucket_manage, but the read-only listing intent is clear.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

list_keywordsList keywordsA
Read-only
Inspect

List every keyword on the account with what each caught in the last 24 hours (eventCount), how much of it nothing has sorted yet (unclassifiedCount), and how many of its Sources are late (staleSources; each Source carries its health: lastCheckedAt, lastOutcome, consecutiveFailures, stale). Report a stale Source before answering from its mentions: a quiet page from a Source nobody checked means nothing. Each keyword is summarised with its enabled Sources and their health; get_keyword has the full configuration. Start here: a keyword id is what get_keyword_results, get_keyword_events, list_keyword_buckets and keyword_manage take. Free — does not charge credits.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

TDQS

A4.5/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint=true and openWorldHint=true, so the bar for added behavioral disclosure is lower. The description adds real value: it explains the data semantics around stale sources, clarifies what does and does not count as signal, and notes that the tool is free and does not charge credits. No contradiction with annotations.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is dense but every sentence earns its place: core listing behavior, returned fields, the critical stale-source caveat, sibling routing, and cost behavior. It is front-loaded with the main action and keeps the most important caveat early.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

With no output schema, the description carries the burden of explaining return values, and it does: eventCount, unclassifiedCount, staleSources, and Source health fields. It also explains the account scope and how the returned keyword IDs feed other tools, making the tool fully callable and interpretable.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The tool has zero parameters and the schema is empty, so the baseline is 4. The description correctly focuses on the resource shape instead, defining the returned metrics and the nested Source health fields, which is more useful than parameter documentation would be here.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description names a specific verb and resource ('List every keyword on the account') and immediately distinguishes itself from get_keyword, which provides full configuration. The scope is unambiguous and clearly differentiated from siblings.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

It explicitly positions itself as the starting point: 'Start here: a keyword id is what get_keyword_results, get_keyword_events, list_keyword_buckets and keyword_manage take.' It also routes to get_keyword for full configuration and warns to report stale sources before drawing conclusions from mentions. It does not exhaustively contrast with all listing siblings, but the key routing is present.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

list_mentionsList mentionsAInspect

Read everything your keywords caught, newest first, across every Source and every keyword on the account, with the sentiment, intent, relevance, bucket and agent readings you have switched on. relevance says whether a mention is really about its keyword (high, medium, low) with one sentence why. This is the tool for questions like "what did Reddit say about us this week?", "any complaints since Friday?" or "show me negative mentions I have not answered". To count (how many, per day, per Source, per sentiment, per author or term), call mentions_stats instead: one free call, where paging here would read the window a hundred rows at a time. Each mention carries matchedTerms, the keyword terms that caught it, when they were recorded: say why a mention is there rather than guessing it. Free in the default text mode — these are your own rows. mode="semantic" asks the embedding index and charges 1 credit per question, then answers the same question free for 10 minutes, paging included. Do not set it to filter by keyword: that is what q= in text mode already does, for nothing. Scoped to one keyword instead? Use get_keyword_results, which also carries each mention's bucket. Cursor-paged: pass nextCursor back unchanged.

ParametersJSON Schema
NameRequiredDescriptionDefault
qNoSearch text, matched per mode= (default: free substring search)
runNoOne kept Explore run: the run.id explore returned. Reads that run's mentions only, free, instead of running it again. since still bounds it, so widen since for an older run.
kindNoWhich producer. "polling" is what your keywords catch on their own; "runs" is a kept one-off Explore run. Absent means both.
modeNoHow q= is matched. "text" (the default) scans the window for the substring and is free. "semantic" asks the embedding index — it finds "this thing keeps crashing" for q="reliability complaints" — and charges. Never set it to do a keyword filter.
typeNoOnly this kind of event — usually narrower than you need; prefer source.
limitNoHow many mentions to return, 1-100. Defaults to 25 here, a page a model can actually read. Never page to count: mentions_stats counts the whole window in one free call.
sinceNoISO 8601 instant. Only mentions after it; defaults to the last 24 hours.
untilNoISO 8601 instant, inclusive. Only mentions before it. Use with since= to ask about a closed interval — a single day, or the week of a launch — instead of everything since a date. Absent means up to now.
authorNoOnly mentions from these accounts — several are OR'd, so ["alice", "bob"] is both in one call. Matched exactly, as the Source writes the handle and without a leading "@": this is a filter, not a search (use q to search text). A handle the account has never seen returns an empty page, and a mention with no author never matches.
cursorNoThe previous response's nextCursor, passed back unchanged, for the next page. Its absence from a response means that was the last page.
intentNoOnly mentions read as one of these intents — several are OR'd, so ["purchase_intent", "comparison"] is the leads view in one call. "unread" is what nothing has classified yet.
sourceNoOnly these Sources — several are OR'd, so ["reddit", "hackernews"] is both in one call. Absent means every Source the account polls.
keywordNoOnly this keyword's mentions, by id from list_keywords, including what its searches caught before they last changed. An id that is not one of the account's keywords is an error.
relevanceNoOnly mentions read as this relevant to their keyword — several are OR'd, so ["high", "medium"] leaves out what matched by accident (another meaning, a handle, spam). "unread" is what nothing has read yet.
sentimentNoOnly mentions read as one of these sentiments — several are OR'd, so ["negative", "question"] is "what needs an answer" in one call. "unread" is what nothing has classified yet.
engagementNoA per-Source rule, repeatable: "<source|*>:<metric><operator><number>" — ["x:likes>=100", "reddit:score>50"] is "what landed, judged by what landing means where it was posted". Metrics are likes, replies, reposts, comments, score, views, plus total for the same interaction sum engagement_min reads. Operators are >=, >, =, <, <=; the number is whole and may be negative (Reddit and Lemmy net downvotes out). A Source no rule names PASSES — ["x:likes>=100"] narrows X and leaves Hacker News alone — a named rule overrides * for its own Source, and several rules on one Source are ANDed; use source to ask for one Source. A metric that was never counted satisfies NOTHING, < included: YouTube reports no likes, RSS and AI answers report no audience, and mentions recorded before 2026-09-04 predate the field, so ["youtube:likes<10"] returns none of them rather than all of them. Send this or engagement_min, never both.
opportunityNotrue keeps only opportunities: mentions of a topic or competitor keyword that are highly relevant to it and whose author is someone to answer (the keyword's agent step says problem_fit true, or, without that field, the intent is purchase_intent, comparison or question). Use it for "who should I answer today?". An own keyword has none. Free.
engagement_minNoOnly mentions with at least this many interactions — likes, replies, reposts, comments or score, depending on the Source. Never counts views. Mentions with no counters at all (RSS, AI answers, anything recorded before 2026-09-04) are left out rather than treated as zero. Counters are captured when the item is collected and never refreshed, so a threshold reads against recent mentions. For a threshold on one metric on one Source, use engagement instead.

TDQS

A5/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations are minimal (readOnlyHint false, openWorldHint true, idempotentHint false, destructiveHint false), so the description carries the full burden of behavioral disclosure. It goes beyond annotations by explaining the cost model (free text mode, 1 credit per semantic question with a 10-minute free window), the paging behavior (hundred rows at a time, cursor-based), the inclusion of matchedTerms and relevance explanations, and the exact-match semantics of author filtering. It also discloses that semantic mode charges and that paging is not the right way to count. This is comprehensive and consistent with annotations.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is long but every sentence serves a purpose. It is front-loaded with the core purpose and key differentiators, then logically proceeds to usage examples, cost, paging, and specific parameter guidance. Given the tool has 18 parameters and complex semantics, the length is appropriate. There is no redundancy or fluff; each clause adds information an agent needs to call the tool correctly.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

With 18 parameters, no output schema, and minimal annotations, the description must fully equip an agent to invoke the tool correctly. It explains what the response contains (sentiment, intent, relevance, bucket, agent readings, matchedTerms), how paging works, the cost model, and when to use alternatives. It also covers edge cases like 'unread' values, the meaning of absent filters, and the behavior of engagement thresholds for sources that lack counters. Nothing an agent needs to know is missing.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters5/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Even though the schema covers 100% of parameters with descriptions, the tool description adds significant contextual meaning beyond the schema. It explains the interplay between parameters (e.g., 'Do not set it to filter by keyword: that is what q= in text mode already does'), warns against using both engagement and engagement_min ('Send this or engagement_min, never both'), and clarifies nuanced behaviors like the author filter being exact match and the engagement rules being per-Source. It also clarifies that 'source' is preferred over 'type' for narrowing. This adds real value beyond the schema's field-level descriptions.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description opens with a specific verb-resource-scope statement: 'Read everything your keywords caught, newest first, across every Source and every keyword on the account...' It names the exact resource (mentions), the scope (all keywords and sources), and the ordering. It also distinguishes itself from siblings by naming mentions_stats and get_keyword_results as alternatives for different jobs. An agent can immediately tell what this tool does and how it differs from the others.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description is explicit about when to use this tool versus alternatives: it gives example queries, says to use mentions_stats for counting, get_keyword_results for a single keyword, and warns against using mode=semantic for keyword filtering. It also explains when to use run and kind, and that cursor paging works by passing nextCursor unchanged. No ambiguity remains about when to select this tool.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

mentions_similarFind similar mentionsAInspect

Find the mentions that say something close to one you already have: the thread you already found, and the nine others like it, most similar first, across every keyword and kept Explore run. Use it to show that a complaint or a request is not a one-off, or to gather more quotes like a good one. Copies of the same post are collapsed and the mention you asked about never comes back. Charges 1 credit per mention asked about, then answers the same mention free for 10 minutes. A different mention charges again, even while another one is cached. meta.credits_used is what the call charged: 0 means it came from the cache.

ParametersJSON Schema
NameRequiredDescriptionDefault
idYesThe id of a mention from list_mentions or get_keyword_results, collected in the last 30 days.

TDQS

A4.3/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Given the annotations (readOnlyHint=false, openWorldHint=true), the description adds significant behavioral context: it explains the credit charging logic (1 credit per asked mention, free for 10 minutes, different mention charges again), the deduplication of copies, the exclusion of the input mention from results, and that meta.credits_used indicates cache usage. This is rich and non-obvious behavior that the annotations don't cover.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is long, but every sentence provides essential behavioral or use-case detail, and the most important purpose is front-loaded. The credit logic and cache behavior are crucial for correct usage and are clearly organized. No wasted words.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a single-parameter tool with no output schema, the description covers everything an agent needs: what the input should be, what happens to the output (similar mentions, sorted by similarity), edge cases (collapsing copies, excluding input), and billing/caching semantics. The use of meta.credits_used is also explained.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The schema already covers the id parameter perfectly (100% coverage with format and source description). The tool description doesn't repeat parameter details but adds a critical constraint (collected in the last 30 days) that is already in the schema, so it adds minimal extra value. Baseline 3 is appropriate.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states that this tool finds mentions similar to a given one, listing the exact use case (showing a complaint is not a one-off) and scope (across all keywords and Explore runs). It distinguishes it from list_mentions and get_keyword_results by defining the similarity behavior, though it doesn't explicitly name a sibling alternative.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description explains when to use it (to find similar mentions, gather more quotes) and mentions the 30-day input freshness constraint, which implies the input must come from recent results. It doesn't explicitly say when not to use it or compare to siblings, but the use case is fairly clear.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

mentions_statsCount mentionsA
Read-only
Inspect

Count mentions instead of reading them: how many, when, where, by whom and on which terms, over up to 90 days, in one call. Call it before list_mentions for any question that starts with "how many", and for questions like "how did this week compare with last week?" (one call per window, group_by ["day"]), "which Source carries the complaints?" (group_by ["source", "sentiment"]) or "which terms catch the most?" (group_by ["term"]). rows holds one count per combination and leaves out the empty ones, so a quiet day is a missing row. total counts the whole window whatever top kept, truncated says an open axis was cut, and unread says how many mentions nothing has read when sentiment, intent or relevance is an axis. A mention caught by two terms counts under each term. Dates are publication dates, and the counts are the ones the dashboard Insights shows: they include mentions a mute rule or a hide keeps out of list_mentions, which can therefore return fewer. Page list_mentions afterwards only to quote. Free — does not charge credits.

ParametersJSON Schema
NameRequiredDescriptionDefault
topNoHow many authors, terms or keywords to keep, busiest first. Defaults to 10.
sinceNoISO 8601 instant. Counts mentions published after it (collection date where the Source gives none). Defaults to 7 days before until.
untilNoISO 8601 instant, inclusive. Defaults to now. The window covers 90 days at most; for a longer period, count it in parts.
authorNoOnly mentions from these accounts — several are OR'd, so ["alice", "bob"] is both in one call. Matched exactly, as the Source writes the handle and without a leading "@": this is a filter, not a search (use q to search text). A handle the account has never seen returns an empty page, and a mention with no author never matches.
intentNoOnly mentions read as one of these intents — several are OR'd, so ["purchase_intent", "comparison"] is the leads view in one call. "unread" is what nothing has classified yet.
sourceNoOnly these Sources — several are OR'd, so ["reddit", "hackernews"] is both in one call. Absent means every Source the account polls.
keywordNoOnly this keyword's mentions, by id from list_keywords, including what its searches caught before they last changed. An id that is not one of the account's keywords is an error.
group_byYesOne or two axes to count along: ["source", "sentiment"] is one count per Source and sentiment. day and hour cannot be combined. author, term and keyword are open lists, cut at top.
relevanceNoOnly mentions read as this relevant to their keyword — several are OR'd, so ["high", "medium"] leaves out what matched by accident (another meaning, a handle, spam). "unread" is what nothing has read yet.
sentimentNoOnly mentions read as one of these sentiments — several are OR'd, so ["negative", "question"] is "what needs an answer" in one call. "unread" is what nothing has classified yet.
engagementNoA per-Source rule, repeatable: "<source|*>:<metric><operator><number>" — ["x:likes>=100", "reddit:score>50"] is "what landed, judged by what landing means where it was posted". Metrics are likes, replies, reposts, comments, score, views, plus total for the same interaction sum engagement_min reads. Operators are >=, >, =, <, <=; the number is whole and may be negative (Reddit and Lemmy net downvotes out). A Source no rule names PASSES — ["x:likes>=100"] narrows X and leaves Hacker News alone — a named rule overrides * for its own Source, and several rules on one Source are ANDed; use source to ask for one Source. A metric that was never counted satisfies NOTHING, < included: YouTube reports no likes, RSS and AI answers report no audience, and mentions recorded before 2026-09-04 predate the field, so ["youtube:likes<10"] returns none of them rather than all of them. Send this or engagement_min, never both.
engagement_minNoOnly mentions with at least this many interactions — likes, replies, reposts, comments or score, depending on the Source. Never counts views. Mentions with no counters at all (RSS, AI answers, anything recorded before 2026-09-04) are left out rather than treated as zero. Counters are captured when the item is collected and never refreshed, so a threshold reads against recent mentions. For a threshold on one metric on one Source, use engagement instead.

TDQS

A4.8/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations only declare readOnlyHint and openWorldHint, but the description adds substantial behavior: rows omit zero-count combinations, total/truncated/unread fields have distinct meanings, terms double-count mentions, and counts include muted/hidden mentions that list_mentions excludes. No contradiction with the annotations.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is long but front-loaded and dense: purpose and usage examples come first, followed by output behavior and caveats. A few phrases, like 'how many, when, where, by whom and on which terms,' are somewhat redundant with the examples, but every sentence contributes meaningful selection or invocation guidance.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

With no output schema, the description covers the key response fields (rows, total, truncated, unread), the 90-day window limit, counting quirks like double-counted terms, and the relationship to list_mentions. An agent has enough context to select, invoke, and interpret results correctly.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, so the baseline is 3; the description adds use-case-driven guidance for group_by ('day' for week comparisons, ['source','sentiment'] for source complaints, 'term' for top terms) and explains open-axis truncation and 'unread' semantics. It does not re-document every parameter, but the schema already handles that.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

Opens with 'Count mentions instead of reading them,' which is a specific verb, resource, and direct contrast to the sibling list_mentions. The 'how many' framing and the question examples make it unmistakably a counting tool, not a retrieval tool.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Explicitly directs agents to call it before list_mentions for any question that starts with 'how many,' and gives concrete question-to-group_by mappings. It also closes with 'Page list_mentions afterwards only to quote,' providing a clear when-not and alternative.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

vinted_market_statsGet Vinted market price statisticsA
Read-only
Inspect

Get p25 / median / p75 and a listing count per day for a Vinted market, newest first, filterable by brand, catalog, size, condition and currency. Costs 5 credits per request. Defaults to the last 30 days; a range may not exceed 365 days. soldRate is always null — sold detection is not yet available. Coverage grows with usage: a series exists only for items that appeared in a search Nephia observed. This is not a complete index of Vinted.

ParametersJSON Schema
NameRequiredDescriptionDefault
toNoISO-8601 end of the range (default: now)
fromNoISO-8601 start of the range (default: 30 days ago)
marketNoVinted market country code, e.g. "fr" (default), "de", "es", "it"
sizeIdNoVinted size id — the numeric id as it appears on Vinted
statusNoVinted condition label as observed, e.g. "Très bon état"
brandIdNoVinted brand id — the numeric id as it appears on Vinted
currencyNoCurrency code, e.g. "EUR"
catalogIdNoVinted catalog id — the numeric id as it appears on Vinted

TDQS

A4.1/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Even with readOnlyHint and openWorldHint annotations, the description goes well beyond them by disclosing credit cost, soldRate being always null due to missing sold detection, coverage being tied to observed searches, and explicitly stating this is not a complete index. This is high-value behavioral transparency that materially prevents misinterpretation.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Four sentences, each earning its place: output summary, cost, date constraints, soldRate caveat, and coverage caveat. The core result type is front-loaded, and there is no filler or repetition of schema details.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a read-only stats tool with no output schema, the description covers the essential invocation semantics: optional filters, defaults, range limits, cost, ordering, and a critical null field caveat. It is slightly incomplete only in that it doesn't describe the full response shape beyond the listed aggregates, but nothing needed to decide whether to call it is missing.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100%, so the baseline is 3. The description adds meaningful constraints not present in the schema: the default 30-day range, the 365-day maximum range, and 'newest first' ordering. It also names the filterable dimensions in plain language, reinforcing the schema without fully duplicating it.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states a specific resource (Vinted market), specific outputs (p25/median/p75 and per-day listing count), and a precise verb ('Get'). It also conveys scope and filtering. However, it does not explicitly differentiate this tool from related siblings like vinted_price_history, so it stops short of full sibling differentiation.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description provides strong usage constraints: 5 credits per request, default 30-day window, 365-day maximum, soldRate always null, and coverage limitations. It does not explicitly say when to choose this tool over alternatives, nor does it name sibling tools, so the usage context is implied rather than directly guided.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

vinted_price_historyGet a Vinted item price historyA
Read-only
Inspect

Get every price and status Nephia observed for one Vinted listing, oldest first. Costs 3 credits per request. Points are movements, not poll ticks: one is recorded when the price or status changed, or once every 24 hours while neither did. Coverage grows with usage: a series exists only for items that appeared in a search Nephia observed. This is not a complete index of Vinted.

ParametersJSON Schema
NameRequiredDescriptionDefault
idYesVinted listing id
toNoISO-8601 upper bound on observedAt
fromNoISO-8601 lower bound on observedAt
limitNoMaximum points to return (default 200, max 500)
marketNoVinted market country code, e.g. "fr" (default), "de", "es", "it"

TDQS

A4.4/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint=true and openWorldHint=true, and the description is consistent with both. It adds valuable behavioral context beyond the annotations: the 3-credit cost per request, the sampling semantics ('Points are movements, not poll ticks... recorded when the price or status changed, or once every 24 hours'), and the coverage model. No contradiction with annotations.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Five sentences, each earning its place: core purpose and ordering, cost, sampling semantics, coverage limitation, and the explicit scope caveat. The most important info is front-loaded in the first sentence, and no sentence is redundant with the schema or annotations.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Comprehensive for a read-only lookup tool with 100% schema coverage. It explains the return concept (points), cost, coverage limitations, and ordering. The only minor gap is that with no output schema, it does not detail the exact response shape, but the 'points' explanation substantially compensates for that.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100%, so baseline is 3. The description adds real meaning by defining what a 'point' is (a movement or a 24-hour tick), which enriches understanding of the limit, from, and to parameters — clarifying that limit counts movements and that from/to bound observedAt events. This goes beyond the schema's bare parameter definitions.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb and resource: 'Get every price and status Nephia observed for one Vinted listing.' It clearly scopes to a single listing and is readily distinguishable from sibling vinted_market_stats (market-level data) and the query/analysis tools. The 'oldest first' ordering and per-listing scope leave no ambiguity about what this tool does.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Provides clear context: it is a per-listing history tool with explicit limitations ('Coverage grows with usage... only for items that appeared in a search Nephia observed' and 'This is not a complete index of Vinted'). This implies when it is appropriate, though it stops short of naming specific alternative tools or explicit when-not-to-use exclusions.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

Tool Schema Changelog

Recent tool additions, removals, and schema changes observed during successful MCP inspections.

  1. 5 tool updates
    • Changedget_keyword_results1 field changed
      • addedInput schema / properties / opportunity
        Added value: +{
        +  "description": "true keeps only opportunities: mentions of a topic or competitor keyword that are highly relevant to it and whose author is someone to answer (the keyword's agent step says problem_fit true, or, without that field, the intent is purchase_intent, comparison or question). Use it for \"who should I answer today?\". An own keyword has none. Free.",
        +  "type": "boolean"
        +}
    • Changedkeyword_create1 field changed
      • changedInput schema / properties / subjectRole / description
        Previous value: -"What the keyword is about: your own brand, a competitor's, or a topic."New value: +"What the keyword is about: your own brand, a competitor's, or a topic. A new topic without globalCriteria.match is created with match word."
    • Changedkeyword_estimate1 field changed
      • changedInput schema / properties / subjectRole / description
        Previous value: -"What the keyword is about: your own brand, a competitor's, or a topic."New value: +"What the keyword is about: your own brand, a competitor's, or a topic. A new topic without globalCriteria.match is created with match word."
    • Changedkeyword_update1 field changed
      • changedInput schema / properties / subjectRole / description
        Previous value: -"What the keyword is about: your own brand, a competitor's, or a topic."New value: +"What the keyword is about: your own brand, a competitor's, or a topic. A new topic without globalCriteria.match is created with match word."
    • Changedlist_mentions1 field changed
      • addedInput schema / properties / opportunity
        Added value: +{
        +  "description": "true keeps only opportunities: mentions of a topic or competitor keyword that are highly relevant to it and whose author is someone to answer (the keyword's agent step says problem_fit true, or, without that field, the intent is purchase_intent, comparison or question). Use it for \"who should I answer today?\". An own keyword has none. Free.",
        +  "type": "boolean"
        +}
  2. 5 tool updates
    • Changedkeyword_create2 fields changed
      • addedInput schema / properties / color
        Added value: +{
        +  "description": "The keyword colour in the dashboard. Left out on create, an unused one is picked.",
        +  "enum": [
        +    "keyword-1",
        +    "keyword-2",
        +    "keyword-3",
        +    "keyword-4",
        +    "keyword-5",
        +    "keyword-6",
        +    "keyword-7",
        +    "keyword-8"
        +  ],
        +  "type": "string"
        +}
      • addedInput schema / properties / relevanceContext
        Added value: +{
        +  "anyOf": [
        +    {
        +      "maxLength": 400,
        +      "type": "string"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "description": "One sentence the AI reading uses to judge relevance, such as \"Acme is a cloud storage company, not the cartoon.\" null clears it."
        +}
    • Changedkeyword_estimate2 fields changed
      • addedInput schema / properties / color
        Added value: +{
        +  "description": "The keyword colour in the dashboard. Left out on create, an unused one is picked.",
        +  "enum": [
        +    "keyword-1",
        +    "keyword-2",
        +    "keyword-3",
        +    "keyword-4",
        +    "keyword-5",
        +    "keyword-6",
        +    "keyword-7",
        +    "keyword-8"
        +  ],
        +  "type": "string"
        +}
      • addedInput schema / properties / relevanceContext
        Added value: +{
        +  "anyOf": [
        +    {
        +      "maxLength": 400,
        +      "type": "string"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "description": "One sentence the AI reading uses to judge relevance, such as \"Acme is a cloud storage company, not the cartoon.\" null clears it."
        +}
    • Changedkeyword_update2 fields changed
      • addedInput schema / properties / color
        Added value: +{
        +  "description": "The keyword colour in the dashboard. Left out on create, an unused one is picked.",
        +  "enum": [
        +    "keyword-1",
        +    "keyword-2",
        +    "keyword-3",
        +    "keyword-4",
        +    "keyword-5",
        +    "keyword-6",
        +    "keyword-7",
        +    "keyword-8"
        +  ],
        +  "type": "string"
        +}
      • addedInput schema / properties / relevanceContext
        Added value: +{
        +  "anyOf": [
        +    {
        +      "maxLength": 400,
        +      "type": "string"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "description": "One sentence the AI reading uses to judge relevance, such as \"Acme is a cloud storage company, not the cartoon.\" null clears it."
        +}
    • Changedlist_mentions1 field changed
      • addedInput schema / properties / relevance
        Added value: +{
        +  "description": "Only mentions read as this relevant to their keyword — several are OR'd, so [\"high\", \"medium\"] leaves out what matched by accident (another meaning, a handle, spam). \"unread\" is what nothing has read yet.",
        +  "items": {
        +    "enum": [
        +      "high",
        +      "medium",
        +      "low",
        +      "unread"
        +    ],
        +    "type": "string"
        +  },
        +  "minItems": 1,
        +  "type": "array"
        +}
    • Changedmentions_stats2 fields changed
      • changedInput schema / properties / group_by / items / enum
        Previous value: -[
        -  "day",
        -  "hour",
        -  "source",
        -  "sentiment",
        -  "intent",
        -  "author",
        -  "term",
        -  "keyword"
        -]New value: +[
        +  "day",
        +  "hour",
        +  "source",
        +  "sentiment",
        +  "intent",
        +  "relevance",
        +  "author",
        +  "term",
        +  "keyword"
        +]
      • addedInput schema / properties / relevance
        Added value: +{
        +  "description": "Only mentions read as this relevant to their keyword — several are OR'd, so [\"high\", \"medium\"] leaves out what matched by accident (another meaning, a handle, spam). \"unread\" is what nothing has read yet.",
        +  "items": {
        +    "enum": [
        +      "high",
        +      "medium",
        +      "low",
        +      "unread"
        +    ],
        +    "type": "string"
        +  },
        +  "minItems": 1,
        +  "type": "array"
        +}
  3. 33 tool updates
    • Changedanalyses_run4 fields changed
      • changedInput schema / properties / items / description
        Previous value: -"The items to read. Use this or watchId, never both."New value: +"The items to read. Use exactly one of items or keywordId."
      • addedInput schema / properties / keywordId
        Added value: +{
        +  "description": "Read a keyword's own recent mentions instead of passing items. The id comes from list_keywords.",
        +  "format": "uuid",
        +  "type": "string"
        +}
      • changedInput schema / properties / since / description
        Previous value: -"With watchId: ISO instant, defaults to 24h ago."New value: +"With keywordId: ISO instant, defaults to 24h ago."
      • removedInput schema / properties / watchId
        Removed value: -{
        -  "description": "Read a watch's own recent events instead of passing items.",
        -  "format": "uuid",
        -  "type": "string"
        -}
    • Addedget_keyword
    • Addedget_keyword_events
    • Addedget_keyword_results
    • Removedget_query
    • Removedget_query_results
    • Addedkeyword_brand_set
    • Addedkeyword_bucket_manage
    • Addedkeyword_create
    • Addedkeyword_estimate
    • Addedkeyword_manage
    • Addedkeyword_source_manage
    • Addedkeyword_source_set
    • Addedkeyword_update
    • Addedlist_keyword_buckets
    • Addedlist_keywords
    • Changedlist_mentions3 fields changed
      • addedInput schema / properties / keyword
        Added value: +{
        +  "description": "Only this keyword's mentions, by id from list_keywords, including what its searches caught before they last changed. An id that is not one of the account's keywords is an error.",
        +  "format": "uuid",
        +  "type": "string"
        +}
      • changedInput schema / properties / kind / description
        Previous value: -"Which producer. \"polling\" is what your Queries catch on their own; \"runs\" is a kept one-off Explore run. Absent means both."New value: +"Which producer. \"polling\" is what your keywords catch on their own; \"runs\" is a kept one-off Explore run. Absent means both."
      • removedInput schema / properties / query
        Removed value: -{
        -  "description": "Only this Query's mentions, by id from list_queries, including what its searches caught before they last changed. An id that is not one of the account's Queries is an error.",
        -  "format": "uuid",
        -  "type": "string"
        -}
    • Removedlist_queries
    • Removedlist_query_buckets
    • Changedmentions_similar1 field changed
      • changedInput schema / properties / id / description
        Previous value: -"The id of a mention from list_mentions or get_query_results, collected in the last 30 days."New value: +"The id of a mention from list_mentions or get_keyword_results, collected in the last 30 days."
    • Changedmentions_stats5 fields changed
      • changedInput schema / properties / group_by / description
        Previous value: -"One or two axes to count along: [\"source\", \"sentiment\"] is one count per Source and sentiment. day and hour cannot be combined. author, term and query are open lists, cut at top."New value: +"One or two axes to count along: [\"source\", \"sentiment\"] is one count per Source and sentiment. day and hour cannot be combined. author, term and keyword are open lists, cut at top."
      • changedInput schema / properties / group_by / items / enum
        Previous value: -[
        -  "day",
        -  "hour",
        -  "source",
        -  "sentiment",
        -  "intent",
        -  "author",
        -  "term",
        -  "query"
        -]New value: +[
        +  "day",
        +  "hour",
        +  "source",
        +  "sentiment",
        +  "intent",
        +  "author",
        +  "term",
        +  "keyword"
        +]
      • addedInput schema / properties / keyword
        Added value: +{
        +  "description": "Only this keyword's mentions, by id from list_keywords, including what its searches caught before they last changed. An id that is not one of the account's keywords is an error.",
        +  "format": "uuid",
        +  "type": "string"
        +}
      • removedInput schema / properties / query
        Removed value: -{
        -  "description": "Only this Query's mentions, by id from list_queries, including what its searches caught before they last changed. An id that is not one of the account's Queries is an error.",
        -  "format": "uuid",
        -  "type": "string"
        -}
      • changedInput schema / properties / top / description
        Previous value: -"How many authors, terms or Queries to keep, busiest first. Defaults to 10."New value: +"How many authors, terms or keywords to keep, busiest first. Defaults to 10."
    • Removedquery_brand_set
    • Removedquery_bucket_manage
    • Removedquery_create
    • Removedquery_estimate
    • Removedquery_manage
    • Removedquery_source_manage
    • Removedquery_source_set
    • Removedquery_update
    • Removedwatch_create
    • Removedwatch_feed
    • Removedwatch_list
    • Removedwatch_manage
  4. 3 tool updates
    • Changedquery_create1 field changed
      • changedInput schema / properties / sources / items / properties / searches / items / properties / overrides / description
        Previous value: -"This search's own criteria: query (one text), terms (two or more texts OR'd, on the Sources that support it), market, filters. On ai_answers a search is a prompt: {\"filters\": {\"prompt\": \"What is the best brand monitoring tool?\", \"brands\": [\"YourBrand\"], \"engines\": [\"chatgpt\", \"gemini\", \"perplexity\"]}}."New value: +"This search's own criteria: query (one text), terms (two or more texts OR'd, on the Sources that support it), match, market, filters. On ai_answers a search is a prompt: {\"filters\": {\"prompt\": \"What is the best brand monitoring tool?\", \"brands\": [\"YourBrand\"], \"engines\": [\"chatgpt\", \"gemini\", \"perplexity\"]}}."
    • Changedquery_estimate1 field changed
      • changedInput schema / properties / sources / items / properties / searches / items / properties / overrides / description
        Previous value: -"This search's own criteria: query (one text), terms (two or more texts OR'd, on the Sources that support it), market, filters. On ai_answers a search is a prompt: {\"filters\": {\"prompt\": \"What is the best brand monitoring tool?\", \"brands\": [\"YourBrand\"], \"engines\": [\"chatgpt\", \"gemini\", \"perplexity\"]}}."New value: +"This search's own criteria: query (one text), terms (two or more texts OR'd, on the Sources that support it), match, market, filters. On ai_answers a search is a prompt: {\"filters\": {\"prompt\": \"What is the best brand monitoring tool?\", \"brands\": [\"YourBrand\"], \"engines\": [\"chatgpt\", \"gemini\", \"perplexity\"]}}."
    • Changedquery_source_set4 fields changed
      • changedInput schema / properties / estimateToken / description
        Previous value: -"Absent: nothing is written, and the estimate of this change comes back with its token. Present: the change is written, if the arguments are the ones that were estimated."New value: +"mode \"write\" only, and required there: the estimateToken the mode \"estimate\" call returned for these same arguments. Valid 15 minutes."
      • addedInput schema / properties / mode
        Added value: +{
        +  "description": "estimate writes nothing and returns the price of this change with its estimateToken; it takes no estimateToken. write saves the change and requires the estimateToken of an estimate made with the same arguments.",
        +  "enum": [
        +    "estimate",
        +    "write"
        +  ],
        +  "type": "string"
        +}
      • changedInput schema / properties / searches / items / properties / overrides / description
        Previous value: -"This search's own criteria: query (one text), terms (two or more texts OR'd, on the Sources that support it), market, filters. On ai_answers a search is a prompt: {\"filters\": {\"prompt\": \"What is the best brand monitoring tool?\", \"brands\": [\"YourBrand\"], \"engines\": [\"chatgpt\", \"gemini\", \"perplexity\"]}}."New value: +"This search's own criteria: query (one text), terms (two or more texts OR'd, on the Sources that support it), match, market, filters. On ai_answers a search is a prompt: {\"filters\": {\"prompt\": \"What is the best brand monitoring tool?\", \"brands\": [\"YourBrand\"], \"engines\": [\"chatgpt\", \"gemini\", \"perplexity\"]}}."
      • changedInput schema / required
        Previous value: -[
        -  "id",
        -  "source",
        -  "enabled"
        -]New value: +[
        +  "id",
        +  "source",
        +  "mode",
        +  "enabled"
        +]
  5. 26 tool updates
    • First observedaccount_credits
    • First observedanalyses_estimate
    • First observedanalyses_run
    • First observedexplore
    • First observedexplore_estimate
    • First observedget_query
    • First observedget_query_results
    • First observedlist_mentions
    • First observedlist_queries
    • First observedlist_query_buckets
    • First observedmentions_similar
    • First observedmentions_stats
    • First observedquery_brand_set
    • First observedquery_bucket_manage
    • First observedquery_create
    • First observedquery_estimate
    • First observedquery_manage
    • First observedquery_source_manage
    • First observedquery_source_set
    • First observedquery_update
    • First observedvinted_market_stats
    • First observedvinted_price_history
    • First observedwatch_create
    • First observedwatch_feed
    • First observedwatch_list
    • First observedwatch_manage

Publisher details

Operator
https://nephia.cc
Operator website
https://nephia.cc
Vendor relationship
Unknown
Trust center
Unknown
Restrictions
Unknown

Related MCP Connectors

  • Your agent needs to know where a brand or a phrase is being talked about across the web — with the trend line, the sentiment and the ratings attached. **What you can ask for** • "Where is our brand cited across the web this quarter, and is that rising?" • "What is the sentiment around this phrase?" • "How do ratings for this product distribute?" • "Which categories is this topic trending in?" • "Summarise everything published about this term." **How to use it** Point any MCP client at https://mcp.aisa.one/seo-content/mcp and sign in with OAuth — there is no key to create or paste. 10 tools: content search, summary, phrase and category trends, sentiment analysis, rating distribution, plus the filters, categories, languages and locations behind them. **It is also a door to the rest** The same login reaches 26 sources and 580+ operations. Find where you are mentioned here, then ask the same agent who links to those pages — without adding a second server. **What it costs** Finding and inspecting an operation is free. Running one is billed per call at API prices, with no seat and no monthly minimum, and every call takes max_price_usd so an agent cannot overspend by accident. **Where else it reaches** https://mcp.aisa.one/seo/mcp for all of it at once — rankings, keywords, backlinks, site health and AI-answer visibility across DataForSEO, Semrush and Ahrefs.

  • SocialFaktory (https://www.socialfaktory.com) is a social media MCP server that lets your AI agent run a brand's social content with you. It reads the brands, channels and media you already have, writes posts in the brand's own voice, prices and generates short video, takes a file you upload, composes one post per channel, schedules or sends it on TikTok, Instagram, YouTube, X, LinkedIn, Facebook and Pinterest, and reads the metrics back. It is a hosted remote server at https://www.socialfaktory.com/mcp (Streamable HTTP) with OAuth 2.1 sign-in and 20 tools. Install steps cover Claude Code, Claude Desktop, Cursor, VS Code, Codex CLI, Gemini CLI and Windsurf. You stay in control. Generating spends the credits in your wallet, and the agent is told to quote the price and ask you first. Posts are drafts until you send them, and nothing reaches a channel without the publish permission you grant on the consent screen, where you also pin the connection to one brand, cap monthly spend and choose when it expires. Generating and publishing need an active SocialFaktory plan. Not available through an agent yet: cloning a video from a link, and generating still images or carousels. Connecting a social channel is a browser sign-in and stays in the app. Docs: https://www.socialfaktory.com/docs/mcp

  • Your agent needs live data — a competitor's traffic, who to contact there, what people are saying, what Google and ChatGPT answer about you, a company's filings. Normally that is six vendor accounts, six sets of keys and six SDKs. This is one URL. **What you can ask for** • "How much traffic does stripe.com get, where does it come from, and who competes for the same keywords?" • "Find 20 Series-B fintech companies in Germany and the heads of marketing there, with emails." • "Does ChatGPT mention our brand when someone asks for the best CRM — and what does it cite?" • "What is X saying about $NVDA today, and what did the stock actually do?" • "Search the web for this, then scrape the three best pages into markdown." **How to use it** Point any MCP client at https://mcp.aisa.one/mcp and sign in with OAuth — there is no key to create or paste. Then just ask: the agent calls search to find the right operation and use to run it. **Why this rather than the source** 26 sources behind one account and one bill — DataForSEO, Semrush, Ahrefs, Similarweb, Apollo, X/Twitter, Instagram, Reddit, Pinterest, YouTube, Tavily, Exa, Perplexity, Firecrawl, CoinGecko, Kalshi, Polymarket, AgentMail and more, 580+ operations. tools/list returns five tools, not 580, so the introduction does not eat your context window. **What it costs** Finding and inspecting an operation is free. Running one is billed per call at API prices, with no seat and no monthly minimum, and every call takes max_price_usd so an agent cannot overspend by accident. **Where else it reaches** One slice at a time: https://mcp.aisa.one/seo/mcp · /finance/mcp · /social/mcp · /search/mcp · /sales/mcp · /mail/mcp · /gtm/mcp, or a single provider like /twitter-api/mcp. Same account, fewer tools listed, and search still reaches everything. Full list at https://mcp.aisa.one/servers

  • Your agent needs what people are posting — across X, Instagram, Reddit, Pinterest and YouTube at once, not five accounts and five rate limits. **What you can ask for** • "What is being said about our brand this week on X and Reddit?" • "Find the creators posting about this category on Instagram and YouTube." • "Pull the replies and quotes on this tweet and the comments on that reel." • "What is trending in this country right now?" • "Which subreddits and hashtags keep coming up for this topic?" **How to use it** Point any MCP client at https://mcp.aisa.one/social/mcp and sign in with OAuth — there is no key to create or paste. 56 read tools across five platforms: X/Twitter (users, tweets, communities, lists, Spaces, trends), Instagram (profiles, posts, reels, highlights, transcripts), Reddit (search, subreddits, comment trees), Pinterest (pins, boards, search) and YouTube search. **Why this rather than the source** One login instead of five developer programmes, and no app review on any of them. **It is also a door to the rest** The same login reaches 26 sources and 580+ operations. Measure the conversation here, then ask the same agent for the site traffic behind it or the people to contact — without adding a second server. **What it costs** Finding and inspecting an operation is free. Running one is billed per call at API prices, with no seat and no monthly minimum, and every call takes max_price_usd so an agent cannot overspend by accident. **Where else it reaches** https://mcp.aisa.one/twitter-api/mcp · /instagram/mcp · /reddit/mcp · /pinterest/mcp · /youtube-search/mcp for one platform at a time; https://mcp.aisa.one/gtm/mcp adds Similarweb and Apollo.

Related MCP Servers

  • A
    license
    A
    quality
    A
    maintenance
    Monitor keyword mentions across Reddit, Hacker News, X, and Bluesky, and triage AI-scored leads from your agent. Connects to the hosted RedReplier MCP server.
    21
    1
    MIT
  • F
    license
    Not graded
    quality
    B
    maintenance
    A remote MCP server that exposes tools from many services (X, LinkedIn, GitHub, Gmail, Notion, etc.) through a single endpoint on Cloudflare Workers, enabling unified access to third-party APIs via natural language.
    -
  • A
    license
    A
    quality
    D
    maintenance
    An MCP server that gives any agent real-time news plus the contextual intelligence to use it well — tone distribution, emerging stories, narrative shifts, spike alerts, and tone-over-time charts — powered by Overtone's publisher network. Works with any MCP-compatible client: Claude Desktop, Claude Code, Cursor, Windsurf, Codex, Kimi K2, and more.
    7
    1
    MIT
Try in Browser

Glama MCP Gateway

Add one secure layer between your agents and this server.

Resources