Agent Reliability
Server Details
Testing, benchmarking and auditing autonomous AI agents — methods, harnesses, evidence
- Status
- Healthy
- Last Tested
- Transport
- Streamable HTTP
- URL
- Repository
- citarium/agentreliability-mcp
- GitHub Stars
- 0
- Server Listing
- Agent Reliability MCP server
TDQS
Scored across 9 tools
Each tool has a clearly distinct retrieval purpose: answer for direct QA, search for raw candidate retrieval, get_entity for single-object lookup, compare for multi-object comparison, get_related for graph traversal, get_topic for tag browsing, get_latest for freshness, get_overview for corpus stats, and get_sources for source registry lookup. Even the potentially overlapping search and answer are explicitly differentiated by whether the agent wants a synthesized answer or raw candidates.
The get_* prefix is used consistently for resource-oriented retrieval tools (get_entity, get_related, get_sources, get_topic, get_overview, get_latest), while answer, compare, and search are bare action verbs for query-style operations. This is a coherent convention, though get_latest and get_overview are slightly less noun-like than the other get_* tools.
Nine tools form a well-scoped read-only knowledge-graph API: every major access pattern has a dedicated tool and there is no bloat or redundancy. The count is appropriate for the server's purpose.
The tool set covers the full read-only lifecycle: corpus orientation (get_overview), discovery (search, get_latest, get_topic), object inspection (get_entity), comparison (compare), graph traversal (get_related), and source verification (get_sources). Write/admin operations appear out of scope for an agent-reliability retrieval server, so there are no meaningful gaps.
Available Tools
9 toolsanswerAnswer a question about Agent ReliabilityARead-onlyIdempotentInspect
Answer a question from the corpus, or refuse. Returns only the claims that bear on the question, each with the sources it cites and its editorial confidence. When the corpus cannot answer, answered is false and abstention_reason plus missing_topics say what was not covered — a refusal is a real result here, not an error. Use this when the user asked a question in words; use search when you want to see the candidates yourself.
| Name | Required | Description | Default |
|---|---|---|---|
| question | Yes | The question to answer, in the words the user asked it. |
Output Schema
| Name | Required | Description |
|---|---|---|
| claims | No | |
| entity | No | |
| margin | No | Relative gap between the best candidate and the runner-up. A small margin means the corpus cannot tell them apart. |
| answered | Yes | |
| coverage | No | Share of the question's information the winning object accounts for, weighted by term rarity. |
| candidates | Yes | Near misses, so a refusal is still a lead. Present whether or not the question was answered. |
| match_score | No | |
| matched_fields | No | |
| missing_topics | Yes | Meaningful words in the question that appear nowhere in the winning object — the gap, named. |
| match_threshold | Yes | The coverage this corpus requires before it will answer at all. |
| match_confidence | No | How well the answer fits the QUESTION — retrieval confidence, not editorial. Never confuse it with a claim's own confidence, which is how much the corpus stands behind the statement. |
| matched_question | No | The stored question this was matched to, when the answer came from one. |
| abstention_reason | No | Why the corpus declined: empty_query, no_candidates, below_coverage, ambiguous_candidates or no_intent_match. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description goes beyond the readOnly/idempotent annotations by explaining refusal semantics in detail: 'answered is false and abstention_reason plus missing_topics say what was not covered — a refusal is a real result here, not an error.' It also discloses that the tool returns only claims bearing on the question with sources and editorial confidence, which is useful behavioral context.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three sentences, all high-value: the core action, the return format, and routing to search. There is no redundant filler, and the most important scoping information is front-loaded.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a single-parameter tool with an output schema, the description is complete. It covers the key edge case (corpus cannot answer), names the output fields for that case, and provides sibling differentiation. Nothing essential is missing for correct invocation.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% and the parameter description already states 'The question to answer, in the words the user asked it.' The tool description reinforces the verbatim natural-language requirement ('when the user asked a question in words') but does not add material new semantics beyond the schema, so baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with a specific verb and resource: 'Answer a question from the corpus, or refuse.' It clearly distinguishes itself from the sibling search tool by stating 'Use this when the user asked a question in words; use search when you want to see the candidates yourself.' This differentiates it without ambiguity.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
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 and names the alternative: 'Use this when the user asked a question in words; use search when you want to see the candidates yourself.' It also clarifies that a refusal is a legitimate outcome, preventing the agent from misinterpreting abstention as an error.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
compareCompare Agent Reliability objects side by sideARead-onlyIdempotentInspect
Two to six knowledge objects side by side: their cards, every indexed attribute as a matrix (the same fields api/index.json publishes, null where an object does not say), the tags they share, the relations that run between them, the neighbours they have in common, and each one's claims with sources and confidence. Use this when the question is 'X vs Y', 'is X the same as Y' or 'how does X differ from Y' — search or get_topic first if you only have names, then pass the ids. An unknown id lands in missing with a near-miss suggestion and the rest are still compared.
| Name | Required | Description | Default |
|---|---|---|---|
| ids | Yes | Two to six knowledge object ids, as returned by search, get_topic or get_related, in the order you want the columns. |
Output Schema
| Name | Required | Description |
|---|---|---|
| found | Yes | True only when every id resolved. |
| claims | Yes | Every compared object's claims, keyed by object id. |
| facets | Yes | |
| missing | Yes | The ids that resolved to nothing, in the order asked. |
| objects | Yes | |
| recovery | No | |
| shared_tags | Yes | |
| relations_between | Yes | |
| shared_neighbours | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already cover read-only, idempotent, and non-destructive behavior. The description adds valuable behavioral detail beyond annotations: unknown ids land in a 'missing' field with a near-miss suggestion, the rest are still compared, and missing attributes render as null.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three dense sentences with no filler. The purpose is front-loaded, the usage trigger is in the second sentence, and the error behavior is in the third. Every sentence earns its place.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the simple parameter schema, rich annotations, and presence of an output schema, the description is complete. It covers what the tool returns, when to use it, how to prepare inputs, and how unknown ids are handled.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% and the single parameter is already well documented. The description reinforces the workflow by saying to resolve names first via search or get_topic and then pass the ids, adding practical context beyond the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description names a specific verb ('compare') and resource ('knowledge objects side by side'), then enumerates what the output contains. It also distinguishes the tool from siblings by giving explicit question shapes ('X vs Y', 'is X the same as Y').
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It gives explicit when-to-use triggers and a clear prerequisite: search or get_topic first if only names are available, then pass ids. It does not explicitly name when-not alternatives such as get_related, but the context is clear enough for an agent to route correctly.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_entityGet one Agent Reliability knowledge objectARead-onlyIdempotentInspect
Fetch one knowledge object by id, with its claims and the sources each claim cites. Use this once search, answer or get_topic has given you an id. An unknown id is not a dead end: the answer names near-miss ids you can retry with.
| Name | Required | Description | Default |
|---|---|---|---|
| id | Yes | The knowledge object's id, as returned by search, answer, get_topic or get_related — the last segment of its canonical URL. |
Output Schema
| Name | Required | Description |
|---|---|---|
| found | Yes | |
| entity | No | |
| recovery | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, idempotentHint=true, and destructiveHint=false, covering the safety profile. The description adds useful behavioral context beyond that: an unknown id is not a dead end, and the answer names near-miss ids to retry. This is meaningful supplementary information.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three short sentences, each earning its place: the operation and result, the precondition for calling, and the failure-mode behavior. 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.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a single-parameter tool with an output schema and strong annotations, the description is nearly complete. It covers what is returned, when to call it, and what happens with an unknown id. The only minor gap is the omitted get_related source in the usage sentence, but the schema compensates for that.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
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 that id comes from search, answer, get_topic, or get_related and is the last segment of the canonical URL. The tool description reinforces the source of the id but does not add meaningful parameter semantics beyond the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description uses a specific verb ('Fetch'), names a precise resource ('one knowledge object by id'), and states the included content ('its claims and the sources each claim cites'). This clearly distinguishes it from sibling tools like get_latest, get_overview, and get_sources.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description gives explicit invocation timing: use it once search, answer, or get_topic has produced an id. It does not explicitly contrast against sibling tools, and it omits get_related which the schema mentions as an id source, but the core usage context is clear.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_latestLatest verified Agent Reliability objectsARead-onlyIdempotentInspect
Most recently verified knowledge objects (freshness signal). Use this to judge how current the corpus is, or to see what changed since you last read it. It ranks by verification date and ignores your topic entirely — use search or get_topic when you want objects that are relevant rather than recent.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | How many recently verified objects to return, newest verification first. |
Output Schema
| Name | Required | Description |
|---|---|---|
| total | Yes | |
| results | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already cover read-only, idempotent, non-destructive behavior; the description adds useful behavioral context beyond them by stating that ranking is by verification date and that topic is deliberately ignored. It does not clutter with unnecessary return details because an output schema exists.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three sentences, each earning its place: the core definition is front-loaded, the practical use cases follow, and the distinction from search/get_topic closes it. There is no filler or repetition.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a single-optional-parameter read-only tool with an output schema, the description fully equips an agent: what is returned, what ordering is used, when to use it, and which sibling tools to prefer instead. Nothing critical is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The only parameter (limit) is fully documented in the schema with default, range, and ordering semantics ('newest verification first'), so the description carries no additional parameter burden. Per the high schema-coverage baseline, a 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description names a concrete resource ('knowledge objects'), specifies the ordering ('most recently verified'), and immediately distinguishes itself from relevance-based siblings by noting 'it ignores your topic entirely'. This lets an agent know exactly what get_latest returns and how it differs from search/get_topic.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It gives explicit use cases ('judge how current the corpus is' or 'see what changed since you last read it') and an explicit exclusion/alternative: use search or get_topic when topical relevance, not recency, is desired. No ambiguity remains about when to choose this tool.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_overviewOverview of Agent ReliabilityARead-onlyIdempotentInspect
Corpus overview: what this instance knows, counts by type, published tags, freshness. Use this first when you land here and do not yet know whether this corpus can answer your question.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
Output Schema
| Name | Required | Description |
|---|---|---|
| tags | Yes | |
| by_type | Yes | |
| instance | Yes | |
| description | Yes | |
| total_media | Yes | |
| total_objects | Yes | |
| newest_verification | Yes | |
| oldest_verification | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already establish read-only, idempotent, non-destructive behavior. The description adds useful context about the tool's role as a preliminary orientation step and discloses the nature of its outputs (counts, tags, freshness), which goes beyond the annotations without contradicting them.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two sentences, no fluff. The first sentence front-loads the tool's content and scope, and the second immediately gives actionable usage guidance. Every word earns its place.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a parameterless overview tool with a rich output schema and safety-oriented annotations, the description fully covers purpose, usage, and context. Nothing essential is missing for an agent to decide when to invoke it.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The input schema has zero parameters, so parameter semantics are not applicable. Per the rubric, a 0-parameter tool receives a baseline of 4; the description appropriately focuses on the tool's output rather than parameters.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the resource ('Corpus overview') and the specific content returned: counts by type, published tags, freshness. It distinguishes itself from siblings by positioning this as the first-stop tool for assessing corpus knowledge, which separates it from query tools like answer or search.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It gives explicit when-to-use guidance: 'Use this first when you land here and do not yet know whether this corpus can answer your question.' It implies when not to use it (when you already know the corpus can answer), but it does not explicitly name alternatives or exclusion conditions, so it falls just 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_sourcesSources behind Agent ReliabilityARead-onlyIdempotentInspect
The instance's source registry — each entry with its evidence tier, reliability and access date. PAGED: 25 entries by default, 200 at most, and a response budget of about 64 KB per call — a page over budget comes back shorter WITH a next_cursor, never truncated. Read next_cursor and call again to continue; its absence means you have the last page. Filter by object_id, tier, host or accessed_since to avoid paging through a registry you do not need. Use this when you need the registry entry behind a citation, or a sample of the whole registry to judge the corpus before trusting it; get_entity already tells you which sources a claim cites.
| Name | Required | Description | Default |
|---|---|---|---|
| host | No | Only sources whose URL is served by this host, compared without a leading www. A source with no URL never matches. | |
| tier | No | Only sources of this evidence tier, spelled exactly as get_sources reports it. | |
| limit | No | How many entries to return. Defaults to 25. | |
| cursor | No | Continue from a previous call: pass the next_cursor it returned. Opaque; do not construct one. | |
| object_id | No | Restrict the answer to the sources cited by this knowledge object. Omit it to page the whole registry. | |
| accessed_since | No | Only sources accessed on or after this ISO date (YYYY-MM-DD). |
Output Schema
| Name | Required | Description |
|---|---|---|
| found | Yes | |
| total | Yes | How many sources matched the filters, before paging. |
| sources | Yes | |
| recovery | No | |
| returned | Yes | |
| next_cursor | No | Pass to the next call to continue. ABSENT means this was the last page. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description adds substantial behavioral detail beyond the annotations: default page size of 25, maximum of 200, response budget around 64 KB, page over budget returned shorter with next_cursor, and cursor absence meaning last page. This goes well beyond the annotations' readOnly and idempotent hints.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is dense but every clause contributes: purpose, pagination behavior, filtering rationale, and usage context with sibling differentiation. It is well structured, front-loading the core purpose before explaining paging and filters.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The description covers what the tool returns, how paging works, when to use it, and how it relates to get_entity. With annotations declaring readOnly and non-destructive behavior, plus an output schema present, no critical context is missing for an agent to decide when and how to call this tool.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% and the schema descriptions are already rich, including details like 'Opaque; do not construct one' for cursor. The description mentions filter names but does not add significant parameter-level meaning beyond the schema, 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.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states the tool exposes 'The instance's source registry' and that each entry includes evidence tier, reliability, and access date. It clearly distinguishes from siblings by noting that get_entity already tells which sources a claim cites, so get_sources is the way to retrieve registry entries or sample the registry.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description gives explicit usage guidance: 'Use this when you need the registry entry behind a citation, or a sample of the whole registry to judge the corpus before trusting it'. It also points to get_entity as the alternative for knowing which sources a claim cites, and suggests filters to avoid unnecessary paging.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_topicBrowse Agent Reliability by topicARead-onlyIdempotentInspect
List the knowledge objects carrying a tag (topics are content-backed tags). PAGED: 25 objects by default, 200 at most, and a response budget of about 64 KB per call — a page over budget comes back shorter WITH a next_cursor, never truncated. Read next_cursor and call again to continue, and its absence means you have the last page. Use this to browse a known topic; use search when you have a question rather than a tag, and get_overview to see which tags exist. An unknown tag comes back with the topics that do exist, so a miss still moves you forward.
| Name | Required | Description | Default |
|---|---|---|---|
| tag | Yes | The topic to list, spelled exactly as get_overview publishes it. Every published topic has objects under it, so an empty answer means the topic does not exist. | |
| limit | No | How many objects to return. Defaults to 25. | |
| cursor | No | Continue from a previous call: pass the next_cursor it returned. Opaque; do not construct one. |
Output Schema
| Name | Required | Description |
|---|---|---|
| tag | Yes | |
| total | Yes | How many objects carry this tag, before paging. |
| results | Yes | |
| recovery | No | |
| returned | Yes | |
| next_cursor | No | Pass to the next call to continue. ABSENT means this was the last page. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Beyond the annotations (read-only, idempotent, non-destructive), the description discloses pagination behavior: 25 default, 200 max, ~64 KB budget, short pages still include next_cursor, and absence of next_cursor signals the last page. It also reveals the unknown-tag fallback behavior, which is valuable runtime context.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is dense but every sentence earns its place: purpose, pagination details, usage routing, and edge-case behavior. It is front-loaded with the core action and scoping definition.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the pagination complexity, output schema, sibling tools, and annotations, the description covers everything needed to call the tool correctly: default/max limits, cursor semantics, unknown-tag behavior, and alternatives.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the baseline is 3, but the description adds meaningful semantics: cursor behavior, response budget implications, and the unknown-tag behavior. This enriches the tag and cursor parameters beyond their schema definitions.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb and resource: 'List the knowledge objects carrying a tag,' and clarifies that topics are content-backed tags. It also explicitly distinguishes this tool from search and get_overview, making its purpose unmistakable.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description gives explicit when-to-use guidance: 'Use this to browse a known topic; use search when you have a question rather than a tag, and get_overview to see which tags exist.' This directly routes the agent among sibling tools.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
searchSearch Agent ReliabilityARead-onlyIdempotentInspect
Full-text search over the knowledge graph. Matching ignores accents and apostrophes, so query in the user's own words; every hit carries the fields it matched and a score. BM25 relevance: each query term is weighted by how RARE it is in this corpus and by where it hits (name 3, tags 2, questions 2, body 1). A hit must also cover a minimum share of the question's information, measured in the same rarity weights — matching only common words does not qualify. Centrality (how many objects point at this one) breaks TIES ONLY and is never part of the score, so it cannot make an irrelevant object rank. Two hits with the same matched_fields can still differ: the score is rarity-weighted, so matching a rare term is worth more than matching a common one. Use this whenever you have a question rather than an id, then follow up with get_entity.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | How many ranked hits to return, best first. | |
| query | Yes | What to look for, in the user's own words. Matched against titles, questions, claim text and tags; accents and apostrophes are ignored, so 'jose' finds 'José'. |
Output Schema
| Name | Required | Description |
|---|---|---|
| total | Yes | |
| results | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description goes well beyond the readOnly/idempotent annotations by explaining BM25 rarity weighting, field-specific weights, the minimum information-share requirement, and centrality's tie-break-only role. This clarifies behaviors that an agent could not infer from annotations or schema.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is long but every sentence carries distinct, decision-relevant information about matching and ranking. It is front-loaded with the core purpose and then deepens with mechanisms that affect result interpretation.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a search tool with nuanced relevance behavior, the description is complete: it explains what is searched, how matching handles accents, how scoring works, what breaks ties, and the expected workflow with get_entity. The output schema can handle return-value details.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the schema already documents query and limit. The description adds meaningful guidance about query formulation: use the user's own words, common-only terms won't qualify, and rarer terms weigh more. This improves parameter understanding beyond the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a clear verb and resource: full-text search over the knowledge graph. It also distinguishes the tool from get_entity by framing it as the right choice when you have a question rather than an id.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It explicitly says to use this whenever a question is available rather than an id, and to follow up with get_entity. This gives an agent a concrete decision rule and names the relevant sibling alternative.
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 tool update
- Changed
get_related5 fields changed- added
Input schema / properties / cursorAdded value: +{ + "description": "Continue from a previous call: pass the next_cursor it returned. Opaque; do not construct one.", + "maxLength": 200, + "minLength": 1, + "type": "string" +} - added
Input schema / properties / limitAdded value: +{ + "description": "How many relations to return, across both directions. Defaults to 25.", + "maximum": 200, + "minimum": 1, + "type": "integer" +} - added
Output schema / properties / next_cursorAdded value: +{ + "description": "Pass to the next call to continue. ABSENT means this was the last page.", + "type": "string" +} - added
Output schema / properties / returnedAdded value: +{ + "maximum": 9007199254740991, + "minimum": -9007199254740991, + "type": "integer" +} - added
Output schema / properties / totalAdded value: +{ + "description": "How many relations this object has in both directions, before paging.", + "maximum": 9007199254740991, + "minimum": -9007199254740991, + "type": "integer" +}
8 tool updates
- Changed
answer14 fields changed- added
Output schema / properties / abstention_reasonAdded value: +{ + "description": "Why the corpus declined: empty_query, no_candidates, below_coverage, ambiguous_candidates or no_intent_match.", + "type": "string" +} - added
Output schema / properties / candidatesAdded value: +{ + "description": "Near misses, so a refusal is still a lead. Present whether or not the question was answered.", + "items": { + "additionalProperties": false, + "properties": { + "coverage": { + "type": "number" + }, + "id": { + "type": "string" + }, + "score": { + "type": "number" + } + }, + "required": [ + "id", + "score", + "coverage" + ], + "type": "object" + }, + "type": "array" +} - added
Output schema / properties / claims / items / properties / relevanceAdded value: +{ + "type": "number" +} - changed
Output schema / properties / claims / items / requiredPrevious value: -[ - "text", - "confidence", - "sources" -]New value: +[ + "text", + "confidence", + "sources", + "relevance" +] - added
Output schema / properties / coverageAdded value: +{ + "description": "Share of the question's information the winning object accounts for, weighted by term rarity.", + "type": "number" +} - added
Output schema / properties / entity / properties / xAdded value: +{ + "additionalProperties": { + "additionalProperties": {}, + "propertyNames": { + "type": "string" + }, + "type": "object" + }, + "description": "Indexed instance-specific attributes, grouped by namespace — the same fields api/index.json publishes. Absent when the instance declares none.", + "propertyNames": { + "type": "string" + }, + "type": "object" +} - added
Output schema / properties / marginAdded value: +{ + "description": "Relative gap between the best candidate and the runner-up. A small margin means the corpus cannot tell them apart.", + "type": "number" +} - added
Output schema / properties / match_confidenceAdded value: +{ + "description": "How well the answer fits the QUESTION — retrieval confidence, not editorial. Never confuse it with a claim's own confidence, which is how much the corpus stands behind the statement.", + "type": "number" +} - added
Output schema / properties / match_scoreAdded value: +{ + "type": "number" +} - added
Output schema / properties / match_thresholdAdded value: +{ + "description": "The coverage this corpus requires before it will answer at all.", + "type": "number" +} - added
Output schema / properties / matched_fieldsAdded value: +{ + "items": { + "type": "string" + }, + "type": "array" +} - added
Output schema / properties / matched_question / descriptionAdded value: +"The stored question this was matched to, when the answer came from one." - added
Output schema / properties / missing_topicsAdded value: +{ + "description": "Meaningful words in the question that appear nowhere in the winning object — the gap, named.", + "items": { + "type": "string" + }, + "type": "array" +} - changed
Output schema / requiredPrevious value: -[ - "answered" -]New value: +[ + "answered", + "match_threshold", + "missing_topics", + "candidates" +]
- Added
compare - Changed
get_entity1 field changed- added
Output schema / properties / entity / properties / xAdded value: +{ + "additionalProperties": { + "additionalProperties": {}, + "propertyNames": { + "type": "string" + }, + "type": "object" + }, + "description": "Indexed instance-specific attributes, grouped by namespace — the same fields api/index.json publishes. Absent when the instance declares none.", + "propertyNames": { + "type": "string" + }, + "type": "object" +}
- Changed
get_latest1 field changed- added
Output schema / properties / results / items / properties / xAdded value: +{ + "additionalProperties": { + "additionalProperties": {}, + "propertyNames": { + "type": "string" + }, + "type": "object" + }, + "description": "Indexed instance-specific attributes, grouped by namespace — the same fields api/index.json publishes. Absent when the instance declares none.", + "propertyNames": { + "type": "string" + }, + "type": "object" +}
- Changed
get_related2 fields changed- added
Output schema / properties / incoming / items / properties / entity / properties / xAdded value: +{ + "additionalProperties": { + "additionalProperties": {}, + "propertyNames": { + "type": "string" + }, + "type": "object" + }, + "description": "Indexed instance-specific attributes, grouped by namespace — the same fields api/index.json publishes. Absent when the instance declares none.", + "propertyNames": { + "type": "string" + }, + "type": "object" +} - added
Output schema / properties / outgoing / items / properties / entity / properties / xAdded value: +{ + "additionalProperties": { + "additionalProperties": {}, + "propertyNames": { + "type": "string" + }, + "type": "object" + }, + "description": "Indexed instance-specific attributes, grouped by namespace — the same fields api/index.json publishes. Absent when the instance declares none.", + "propertyNames": { + "type": "string" + }, + "type": "object" +}
- Changed
get_sources10 fields changed- added
Input schema / properties / accessed_sinceAdded value: +{ + "description": "Only sources accessed on or after this ISO date (YYYY-MM-DD).", + "maxLength": 10, + "minLength": 4, + "type": "string" +} - added
Input schema / properties / cursorAdded value: +{ + "description": "Continue from a previous call: pass the next_cursor it returned. Opaque; do not construct one.", + "maxLength": 200, + "minLength": 1, + "type": "string" +} - added
Input schema / properties / hostAdded value: +{ + "description": "Only sources whose URL is served by this host, compared without a leading www. A source with no URL never matches.", + "maxLength": 120, + "minLength": 1, + "type": "string" +} - added
Input schema / properties / limitAdded value: +{ + "description": "How many entries to return. Defaults to 25.", + "maximum": 200, + "minimum": 1, + "type": "integer" +} - changed
Input schema / properties / object_id / descriptionPrevious value: -"Restrict the answer to the sources cited by this knowledge object. Omit it to get the instance's whole source registry."New value: +"Restrict the answer to the sources cited by this knowledge object. Omit it to page the whole registry." - added
Input schema / properties / tierAdded value: +{ + "description": "Only sources of this evidence tier, spelled exactly as get_sources reports it.", + "maxLength": 60, + "minLength": 1, + "type": "string" +} - added
Output schema / properties / next_cursorAdded value: +{ + "description": "Pass to the next call to continue. ABSENT means this was the last page.", + "type": "string" +} - added
Output schema / properties / returnedAdded value: +{ + "maximum": 9007199254740991, + "minimum": -9007199254740991, + "type": "integer" +} - added
Output schema / properties / totalAdded value: +{ + "description": "How many sources matched the filters, before paging.", + "maximum": 9007199254740991, + "minimum": -9007199254740991, + "type": "integer" +} - changed
Output schema / requiredPrevious value: -[ - "found", - "sources" -]New value: +[ + "found", + "sources", + "total", + "returned" +]
- Changed
get_topic7 fields changed- added
Input schema / properties / cursorAdded value: +{ + "description": "Continue from a previous call: pass the next_cursor it returned. Opaque; do not construct one.", + "maxLength": 200, + "minLength": 1, + "type": "string" +} - added
Input schema / properties / limitAdded value: +{ + "description": "How many objects to return. Defaults to 25.", + "maximum": 200, + "minimum": 1, + "type": "integer" +} - added
Output schema / properties / next_cursorAdded value: +{ + "description": "Pass to the next call to continue. ABSENT means this was the last page.", + "type": "string" +} - added
Output schema / properties / results / items / properties / xAdded value: +{ + "additionalProperties": { + "additionalProperties": {}, + "propertyNames": { + "type": "string" + }, + "type": "object" + }, + "description": "Indexed instance-specific attributes, grouped by namespace — the same fields api/index.json publishes. Absent when the instance declares none.", + "propertyNames": { + "type": "string" + }, + "type": "object" +} - added
Output schema / properties / returnedAdded value: +{ + "maximum": 9007199254740991, + "minimum": -9007199254740991, + "type": "integer" +} - added
Output schema / properties / total / descriptionAdded value: +"How many objects carry this tag, before paging." - changed
Output schema / requiredPrevious value: -[ - "tag", - "results", - "total" -]New value: +[ + "tag", + "results", + "total", + "returned" +]
- Changed
search5 fields changed- added
Output schema / properties / results / items / properties / coverageAdded value: +{ + "description": "Share of the question's information this object accounts for, weighted by term rarity. 1 means every meaningful word in the query is present; a low value with a high score means the object matched common words only.", + "type": "number" +} - changed
Output schema / properties / results / items / properties / matched_fields / descriptionPrevious value: -"Which fields the query hit: name, tags, content. Does NOT determine the score on its own."New value: +"Which fields the query hit: name, tags, questions, summary, claims. Does NOT determine the score on its own." - changed
Output schema / properties / results / items / properties / score / descriptionPrevious value: -"Text match, weighted by where the token hits (name 3, tags 2, content 1 per query token), plus a centrality bonus of up to 0.9 for objects that other objects point at. That bonus is why two hits can share matched_fields and still score differently: the decimal is inbound edges, not text relevance."New value: +"BM25 relevance: each query term is weighted by how RARE it is in this corpus and by where it hits (name 3, tags 2, questions 2, body 1). A hit must also cover a minimum share of the question's information, measured in the same rarity weights — matching only common words does not qualify. Centrality (how many objects point at this one) breaks TIES ONLY and is never part of the score, so it cannot make an irrelevant object rank. Two hits with the same matched_fields can still differ: the score is rarity-weighted, so matching a rare term is worth more than matching a common one." - added
Output schema / properties / results / items / properties / xAdded value: +{ + "additionalProperties": { + "additionalProperties": {}, + "propertyNames": { + "type": "string" + }, + "type": "object" + }, + "description": "Indexed instance-specific attributes, grouped by namespace — the same fields api/index.json publishes. Absent when the instance declares none.", + "propertyNames": { + "type": "string" + }, + "type": "object" +} - changed
Output schema / properties / results / items / requiredPrevious value: -[ - "id", - "type", - "name", - "summary", - "tags", - "evidence_tier", - "confidence", - "last_verified", - "canonical_url", - "api_url", - "score", - "matched_fields" -]New value: +[ + "id", + "type", + "name", + "summary", + "tags", + "evidence_tier", + "confidence", + "last_verified", + "canonical_url", + "api_url", + "score", + "matched_fields", + "coverage" +]
8 tool updates
- Changed
answer1 field changed- added
Input schema / properties / question / descriptionAdded value: +"The question to answer, in the words the user asked it."
- Changed
get_entity3 fields changed- added
Input schema / properties / id / descriptionAdded value: +"The knowledge object's id, as returned by search, answer, get_topic or get_related — the last segment of its canonical URL." - added
Output schema / properties / entity / properties / mediaAdded value: +{ + "items": { + "additionalProperties": false, + "properties": { + "alt": { + "type": "string" + }, + "caption": { + "type": "string" + }, + "credit": { + "type": "string" + }, + "height": { + "maximum": 9007199254740991, + "minimum": -9007199254740991, + "type": "integer" + }, + "id": { + "type": "string" + }, + "license_spdx": { + "type": "string" + }, + "permissions": { + "additionalProperties": { + "type": "boolean" + }, + "propertyNames": { + "type": "string" + }, + "type": "object" + }, + "supports": { + "type": "string" + }, + "url": { + "type": "string" + }, + "width": { + "maximum": 9007199254740991, + "minimum": -9007199254740991, + "type": "integer" + } + }, + "required": [ + "id", + "url", + "alt", + "credit", + "license_spdx", + "permissions" + ], + "type": "object" + }, + "type": "array" +} - changed
Output schema / properties / entity / requiredPrevious value: -[ - "id", - "type", - "name", - "summary", - "tags", - "evidence_tier", - "confidence", - "last_verified", - "canonical_url", - "api_url", - "questions", - "claims" -]New value: +[ + "id", + "type", + "name", + "summary", + "tags", + "evidence_tier", + "confidence", + "last_verified", + "canonical_url", + "api_url", + "questions", + "claims", + "media" +]
- Changed
get_latest1 field changed- added
Input schema / properties / limit / descriptionAdded value: +"How many recently verified objects to return, newest verification first."
- Changed
get_overview2 fields changed- added
Output schema / properties / total_mediaAdded value: +{ + "maximum": 9007199254740991, + "minimum": -9007199254740991, + "type": "integer" +} - changed
Output schema / requiredPrevious value: -[ - "instance", - "description", - "total_objects", - "by_type", - "tags", - "newest_verification", - "oldest_verification" -]New value: +[ + "instance", + "description", + "total_objects", + "by_type", + "tags", + "newest_verification", + "oldest_verification", + "total_media" +]
- Changed
get_related1 field changed- added
Input schema / properties / id / descriptionAdded value: +"The knowledge object to walk out from, by id."
- Changed
get_sources1 field changed- added
Input schema / properties / object_id / descriptionAdded value: +"Restrict the answer to the sources cited by this knowledge object. Omit it to get the instance's whole source registry."
- Changed
get_topic1 field changed- added
Input schema / properties / tag / descriptionAdded value: +"The topic to list, spelled exactly as get_overview publishes it. Every published topic has objects under it, so an empty answer means the topic does not exist."
- Changed
search4 fields changed- added
Input schema / properties / limit / descriptionAdded value: +"How many ranked hits to return, best first." - added
Input schema / properties / query / descriptionAdded value: +"What to look for, in the user's own words. Matched against titles, questions, claim text and tags; accents and apostrophes are ignored, so 'jose' finds 'José'." - added
Output schema / properties / results / items / properties / matched_fields / descriptionAdded value: +"Which fields the query hit: name, tags, content. Does NOT determine the score on its own." - added
Output schema / properties / results / items / properties / score / descriptionAdded value: +"Text match, weighted by where the token hits (name 3, tags 2, content 1 per query token), plus a centrality bonus of up to 0.9 for objects that other objects point at. That bonus is why two hits can share matched_fields and still score differently: the decimal is inbound edges, not text relevance."
4 tool updates
- Changed
get_entity1 field changed- added
Output schema / properties / recoveryAdded value: +{ + "additionalProperties": false, + "properties": { + "available": { + "items": { + "type": "string" + }, + "type": "array" + }, + "available_count": { + "maximum": 9007199254740991, + "minimum": -9007199254740991, + "type": "integer" + }, + "available_truncated": { + "type": "boolean" + }, + "did_you_mean": { + "items": { + "type": "string" + }, + "type": "array" + }, + "hint": { + "type": "string" + }, + "next_tool": { + "type": "string" + } + }, + "required": [ + "available_count", + "available", + "next_tool", + "hint" + ], + "type": "object" +}
- Changed
get_related1 field changed- added
Output schema / properties / recoveryAdded value: +{ + "additionalProperties": false, + "properties": { + "available": { + "items": { + "type": "string" + }, + "type": "array" + }, + "available_count": { + "maximum": 9007199254740991, + "minimum": -9007199254740991, + "type": "integer" + }, + "available_truncated": { + "type": "boolean" + }, + "did_you_mean": { + "items": { + "type": "string" + }, + "type": "array" + }, + "hint": { + "type": "string" + }, + "next_tool": { + "type": "string" + } + }, + "required": [ + "available_count", + "available", + "next_tool", + "hint" + ], + "type": "object" +}
- Changed
get_sources1 field changed- added
Output schema / properties / recoveryAdded value: +{ + "additionalProperties": false, + "properties": { + "available": { + "items": { + "type": "string" + }, + "type": "array" + }, + "available_count": { + "maximum": 9007199254740991, + "minimum": -9007199254740991, + "type": "integer" + }, + "available_truncated": { + "type": "boolean" + }, + "did_you_mean": { + "items": { + "type": "string" + }, + "type": "array" + }, + "hint": { + "type": "string" + }, + "next_tool": { + "type": "string" + } + }, + "required": [ + "available_count", + "available", + "next_tool", + "hint" + ], + "type": "object" +}
- Changed
get_topic1 field changed- added
Output schema / properties / recoveryAdded value: +{ + "additionalProperties": false, + "properties": { + "available": { + "items": { + "type": "string" + }, + "type": "array" + }, + "available_count": { + "maximum": 9007199254740991, + "minimum": -9007199254740991, + "type": "integer" + }, + "available_truncated": { + "type": "boolean" + }, + "did_you_mean": { + "items": { + "type": "string" + }, + "type": "array" + }, + "hint": { + "type": "string" + }, + "next_tool": { + "type": "string" + } + }, + "required": [ + "available_count", + "available", + "next_tool", + "hint" + ], + "type": "object" +}
8 tool updates
- First observed
answer - First observed
get_entity - First observed
get_latest - First observed
get_overview - First observed
get_related - First observed
get_sources - First observed
get_topic - First observed
search
Related MCP Connectors
Decision-assurance for AI agents: an auditable action boundary + receipt before it acts.
MERCATOR Verify: evidence-backed verification and decision support for autonomous agents.
Six-gate governance for AI agents: PROCEED/PAUSE/HALT decisions with hash-chained audit trails.
Reproducible benchmarks and reliability evidence for agent tools.
Related MCP Servers
- AlicenseNot gradedqualityBmaintenanceAn observable autonomy harness for AI coding agents that enables long task execution without drift or cheating, while recording all actions for cost and quality steering.MIT
- AlicenseNot gradedqualityAmaintenanceLocal security layer for AI coding agents: MCP policy proxy, kernel sandbox, tamper-evident audit logMIT
- AlicenseNot gradedqualityDmaintenanceVerifiable action receipts for AI agents — agents sign claims locally, an independent witness countersigns and timestamps, anyone can verify offline.20MIT
- AlicenseNot gradedqualityDmaintenanceEnables AI agents to conduct evidence-grounded forensic triage of compromised hosts, with architectural safeguards against evidence spoliation and hallucinated findings, supporting self-correction and chain of custody.MIT
Glama MCP Gateway
Add one secure layer between your agents and this server.