Football Atlas
Server Details
The Laws of the Game and world football's major competitions, every claim cited to primary sources
- Status
- Healthy
- Last Tested
- Transport
- Streamable HTTP
- URL
- Repository
- citarium/futbolatlas-mcp
- GitHub Stars
- 0
- Server Listing
- Football Atlas
TDQS
Scored across 9 tools
Each tool occupies a distinct query mode — question answering (answer), keyword search (search), id lookup (get_entity), tag browsing (get_topic), graph traversal (get_related), comparison (compare), and corpus metadata (overview/latest/sources). Every description includes explicit 'use this when...' guidance and cross-references to the alternative tool, so even the close pairs like answer/search and get_topic/search are fully disambiguated.
Six of nine tools follow a consistent get_<object> convention (get_entity, get_topic, get_related, get_sources, get_overview, get_latest), and the three bare-verb tools (answer, compare, search) all compute a result rather than fetch a stored object, giving the deviation an internal logic. All names are short, lowercase, verb-initial, and predictable, but the get_/bare-verb split keeps this from a perfect 5.
Nine tools is squarely in the well-scoped range for a knowledge-graph corpus server. Each tool earns its place: search and answer handle question entry, get_entity and get_topic retrieve, get_related traverses the graph, compare handles multi-object queries, and get_overview, get_latest, and get_sources handle orientation, freshness, and source verification. There is no redundancy and no bloat.
For a read-only knowledge-graph corpus, the surface is comprehensively covered: get_overview orients the agent, search/answer handle question entry, get_entity gets details, get_topic/get_related expand outward, compare handles multi-object queries, and get_sources/get_latest provide verification and freshness. Dead ends are designed out — unknown ids return near-miss suggestions, unknown tags return existing topics, and refusals explain missing coverage.
Available Tools
9 toolsanswerAnswer a question about Football AtlasARead-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 well beyond the annotations by explaining the refusal behavior, the abstention fields (answered false, abstention_reason, missing_topics), and that a refusal is a valid result rather than an error. This clarifies important non-obvious behavior without contradicting any annotations.
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 concise, front-loaded with the core behavior, and every sentence adds value: the primary function, the return semantics, the refusal outcome, and the routing guidance versus search. No filler or redundancy.
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 clear annotations, the description is fully complete. It covers what to return, how refusal is signaled, and when to choose this tool over a sibling, leaving no critical gap for the agent.
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%, with the single parameter already described as 'The question to answer, in the words the user asked it.' The description reinforces the 'in words' phrasing but does not add substantial new parameter meaning 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 opens with a specific verb and resource: 'Answer a question from the corpus, or refuse.' It also differentiates from the search sibling by stating when this tool is appropriate versus search, making the purpose easy to distinguish.
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?
Explicit usage guidance is provided: 'Use this when the user asked a question in words; use search when you want to see the candidates yourself.' This names the alternative and gives a clear selection condition.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
compareCompare Football Atlas 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 declare readOnlyHint=true, idempotentHint=true, destructiveHint=false, so safety is covered. The description adds valuable behavioral context beyond those flags: unknown ids land in a `missing` field, a near-miss suggestion is provided, and the remaining objects are still compared. It also explains that missing attributes appear as null in the matrix. This is meaningful behavior an agent could not infer from annotations or schema alone.
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 dense and well-organized. The core function is front-loaded, followed by when-to-use guidance, and then the edge-case behavior for missing ids. Every sentence contributes substantive information; the length is justified by the complexity of the comparison output. It could be slightly more concise, but it is not padded.
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 comparison tool taking 2–6 ids, the description covers the input contract, the full output shape, the intended question types, the prerequisite lookup workflow, and the failure mode for unknown ids. An output schema exists to handle formal return-value details, so the description need not list every field. The combination of annotations, schema, and description leaves no critical gap for an agent deciding 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 description coverage is 100%: the `ids` parameter is described as 'Two to six knowledge object ids, as returned by search, get_topic or get_related, in the order you want the columns.' The tool description only says 'pass the ids' and repeats the two-to-six range, adding no new meaning. Baseline 3 is appropriate because the schema carries the parameter semantics.
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 ('Football Atlas knowledge objects') and gives a detailed inventory of what is produced: cards, attribute matrices, shared tags, inter-object relations, common neighbours, and claims with sources and confidence. It is clearly distinct from get_entity (single entity) and search (find by name), so an agent can tell it apart from siblings 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.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description explicitly states when to use it: for questions like 'X vs Y', 'is X the same as Y', or 'how does X differ from Y'. It also gives a concrete prerequisite workflow: use search or get_topic first if you only have names, then pass the ids. It stops short of enumerating when-not-to-use alternatives such as get_entity or get_related, but the guidance is clear enough to route an agent 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 Football Atlas 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 convey read-only, idempotent, non-destructive behavior; the description adds value by disclosing the return structure (claims and cited sources) and the near-miss retry behavior for unknown ids. There is no mention of rate limits or auth, but these are less relevant given 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.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is two sentences with no filler: the first sentence states the function and the second gives actionable retry guidance. It is front-loaded and every clause adds information.
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?
With one fully-documented parameter, a rich output schema, and annotations covering the safety profile, the description covers the essential usage flow and even handles the error case. Nothing an agent needs to call it correctly 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?
Schema coverage is 100%, and the schema's description of the id parameter explicitly states its provenance and the canonical URL segment. The description adds no further parameter-level detail, so the baseline of 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: 'Fetch one knowledge object by id', and specifies what is included (claims and the sources each claim cites). This clearly distinguishes it from sibling tools like get_topic and get_related, which center on different or broader scopes.
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 provides explicit sequencing guidance: 'Use this once search, answer or get_topic has given you an id.' This establishes the correct workflow context, though it does not name alternative tools to use for other situations or explicitly state when not to use it.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_latestLatest verified Football Atlas 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 declare readOnlyHint=true and idempotentHint=true, so the safety profile is covered. The description adds useful behavioral context: results are ranked by verification date and are topic-independent. It does not contradict annotations and adds meaningful ordering/scope semantics.
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 with no filler: the core behavior, use cases, and exclusions are all front-loaded and clearly separated. 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?
The tool is simple, has one fully documented optional parameter, robust annotations, and an output schema. The description also names relevant sibling alternatives, so an agent has everything needed to select and invoke it correctly.
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 limit parameter is already fully documented with range, default, and ordering ('newest verification first'). The description reinforces the ordering behavior but does not add substantial meaning 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?
States a specific verb and resource ('Most recently verified knowledge objects') and identifies it as a 'freshness signal'. It clearly distinguishes itself from topic-relevant siblings by saying it 'ignores your topic entirely.'
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?
Explicitly gives intended use cases: judging corpus currency and seeing what changed. It also names alternatives ('use search or get_topic when you want objects that are relevant rather than recent'), giving the agent clear routing guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_overviewOverview of Football AtlasARead-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 declare readOnly, non-destructive, idempotent behavior. The description adds useful context about what the overview exposes (counts by type, published tags, freshness) and frames it as a triage tool. It does not repeat annotation information, and 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.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two concise sentences that front-load the core purpose and then give practical usage guidance. Every word earns its place; no filler or redundancy.
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 metadata inspection tool with output schema and safety annotations, the description fully covers purpose, contents, and when to use it. Nothing essential 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 tool has zero parameters, so the baseline is 4. The description does not need to explain parameter meaning, and the output schema covers the return structure.
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?
Description states it provides a corpus overview with counts by type, published tags, and freshness. It clearly identifies the resource (the corpus) and what it reveals, though it uses a noun phrase rather than an explicit verb+resource structure. It is sufficiently distinct from siblings like search and get_entity by being the high-level entry point.
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?
Explicitly instructs to use this tool first when arriving and before knowing whether the corpus can answer the question. This provides strong placement guidance among siblings, though it does not explicitly name alternatives or state when not to use it.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_sourcesSources behind Football AtlasARead-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?
Annotations already declare readOnlyHint, idempotentHint, and destructiveHint, so the safety profile is covered. The description adds rich behavior beyond that: paging defaults (25/200), the 64 KB response budget, the non-truncation guarantee, and the cursor semantics ('its absence means you have the last page'). This is exactly the kind of behavioral context an agent needs.
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?
Every sentence earns its place: registry purpose, paging behavior, cursor continuation, filter advice, and use-case routing. The core purpose and scoping constraint are front-loaded before the usage guidance, and there is no filler or repetition of schema content.
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 tool's moderate complexity, the description is complete: paging, budget, cursor, filters, and use cases are all covered, annotations carry the safety profile, and an output schema exists so return values need no explanation. Nothing an agent needs to invoke this correctly 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?
Schema description coverage is 100% and every parameter is well-documented, so the baseline of 3 applies. The description's paging narrative adds mild context to cursor/limit (e.g., 'Read next_cursor and call again to continue'), but it doesn't substantially extend individual parameter semantics beyond what the schema already provides.
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 identifies the exact resource ('The instance's source registry') and states what each entry contains (evidence tier, reliability, access date). It differentiates from the closest sibling by noting 'get_entity already tells you which sources a claim cites,' so an agent can tell the two apart without inspecting schemas.
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?
Provides explicit when-to-use 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 names the alternative (get_entity) and clarifies the boundary, implicitly telling the agent when NOT to use this tool. Filter advice ('Filter by object_id, tier, host or accessed_since') reinforces appropriate call patterns.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_topicBrowse Football Atlas 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 read-only, idempotent annotations, the description discloses pagination behavior, the next_cursor contract, the 64 KB response budget, the fact that pages are never truncated, and the fallback behavior for unknown tags. This gives an agent strong expectations about how the tool behaves at runtime.
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 compact and front-loaded: the core definition comes first, followed by pagination, usage routing, and miss behavior. Every sentence contributes distinct value with 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?
Given the rich annotations, full parameter schema, and existing output schema, the description covers the remaining operational context: pagination mechanics, alternative tool selection, budget limits, and unknown-tag handling. Nothing important 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?
Schema coverage is 100%, so the baseline is 3, but the description adds real parameter-relevant meaning: it explains what the absence of next_cursor means, that pages over budget return shorter with a cursor, and that an unknown tag returns existing topics. This goes beyond the schema's field descriptions.
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: 'List the knowledge objects carrying a tag', and clarifies that topics are content-backed tags. It clearly distinguishes itself from siblings by explaining when to use search and get_overview instead.
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 says '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 is direct, actionable guidance that tells an agent exactly when to select this tool over alternatives.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
searchSearch Football AtlasARead-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 far beyond the readOnlyHint and destructiveHint annotations by explaining the scoring algorithm: accent/apostrophe insensitivity, BM25 rarity weighting, field-specific weights, minimum information coverage, and centrality as a tie-breaker only. It also clarifies that matched_fields alone does not determine ranking, helping the agent interpret results correctly. Annotations already cover safety, but this adds deep 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?
The description is dense but every sentence earns its place: the first line states the core purpose, then matching rules, scoring weights, tie-breaking, and a usage pointer. It is front-loaded with the most important information and avoids filler. Though moderately long, it covers all necessary behavior in an efficient, organized way.
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 complexity of the search behavior, the description thoroughly explains scoring, matched fields, tie-breaking, and follow-up workflow. The presence of an output schema means return format is already defined, so the description correctly focuses on interpretation and selection. Nothing critical for an agent to invoke or use this tool correctly 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?
Schema description coverage is 100%, so parameters are already well documented. The description adds meaning beyond the schema by telling the agent to 'query in the user's own words' and warning that matching only common words does not qualify, which informs how to craft the query parameter. This extra nuance justifies slightly above the baseline of 3.
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 'Full-text search over the knowledge graph,' a specific verb and resource that immediately clarifies the tool's purpose. It also distinguishes itself from siblings by stating 'Use this whenever you have a question rather than an id,' which differentiates it from id-based tools like get_entity. No ambiguity remains 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.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description explicitly says when to use the tool ('whenever you have a question rather than an id') and even gives the follow-up step ('then follow up with get_entity'). This provides a clear selection rule against sibling tools. It also implies that id lookups should go to get_entity, giving an exclusion condition.
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
Spain's contributions to world science, exploration and culture, rigorously sourced
Football-Data.org MCP — soccer competitions, matches, standings
Tables, results, fixtures, goal timing, season projections: 93 football leagues incl. lower tiers
Historical football results, teams, competitions and draw/streak statistics via 10 read-only tools.
Related MCP Servers
- AlicenseAqualityBmaintenanceEvery FIFA World Cup since 1930 wrapped as 15 MCP tools — squads, brackets, stadiums, matches, awards, trivia. Powered by the Zafronix WC API.15122MIT
- AlicenseAqualityCmaintenanceRead-only MCP server exposing game rules, FAQs, and official links for the Women's World Cup 2027 simulator Pitch Queens, enabling AI clients to retrieve verified context without API keys.2MIT
- AlicenseNot gradedqualityCmaintenanceMCP server for retrieving World Cup match briefs, fixtures, and event explanations with sourced, plain-language context.MIT
- AlicenseAqualityBmaintenanceEnables AI assistants to query live football data, including fixtures, live scores, standings, statistics, betting odds, and full odds movement history for corner and card lines.11506MIT
Glama MCP Gateway
Add one secure layer between your agents and this server.