Skip to main content
Glama
malkreide

i14y-mcp

by malkreide

Part of the Swiss Public Data MCP Portfolio β€” a collection of open-source MCP servers connecting AI agents to Swiss public and open data. This is a private project. It is not affiliated with, endorsed by, or operated on behalf of any employer or public authority.

i14y-mcp

License: MIT Python 3.10+ MCP Data: I14Y

MCP server for the I14Y interoperability platform β€” Switzerland's national metadata catalogue.

πŸ‡©πŸ‡ͺ Deutsche Version


Why this server exists

The other servers in this portfolio answer Β«what does the data say?Β». This one answers the question that comes first: Β«who publishes data on this topic, through which interface, under which licence?Β»

I14Y is the national data catalogue maintained by the Federal Statistical Office. It describes datasets, registered APIs, public services and harmonised concepts from the Confederation, cantons and communes, using the DCAT-AP-CH profile (eCH-0200).

Mnemonic: Β«Catalogue before shelf.Β» Without a catalogue, an agent has to already know a data source exists. With one, it can find it.


Related MCP server: swiss-food-safety-mcp

🎯 Anchor Demo Query

Β«Which authority publishes data on special needs education, through which interface is it available, and under which licence?Β»

search_catalog(query="SonderpΓ€dagogik")
  β†’ Β«Statistik der SonderpΓ€dagogikΒ» β€” Federal Statistical Office (BFS), theme: Bildung

get_dataset(dataset_id=...)
  β†’ 2 distributions, licence: Β«Opendata BY ASK β€” attribution required,
    commercial use only with permission from the data supplierΒ»
  β†’ contact: auskunftsdienst@bfs.admin.ch

Two tool calls turn a vague topic into a named authority, a download URL and a licence you can act on β€” get_dataset aggregates the distributions, licences and contact point into one record.

Demo

Demo: Claude using search_catalog and get_dataset


Architecture

                 β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
                 β”‚      MCP Host (Claude)       β”‚
                 β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜
                                 β”‚ stdio | streamable-http
                 β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β–Όβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
                 β”‚          i14y-mcp            β”‚
                 β”‚  β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”  β”‚
                 β”‚  β”‚ server.py  (13 tools)  β”‚  β”‚
                 β”‚  β”œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€  β”‚
                 β”‚  β”‚ mappers.py             β”‚  β”‚  DCAT β†’ flat, one language
                 β”‚  β”œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€  β”‚
                 β”‚  β”‚ models.py  (Pydantic)  β”‚  β”‚  source + provenance envelope
                 β”‚  β”œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€  β”‚
                 β”‚  β”‚ client.py              β”‚  β”‚  retry 2s/4s/8s, no-retry 4xx
                 β”‚  β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜  β”‚
                 β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜
                                 β”‚ HTTPS, no auth
                 β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β–Όβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
                 β”‚  api.i14y.admin.ch/api       β”‚
                 β”‚  datasets Β· dataservices Β·   β”‚
                 β”‚  concepts Β· publicservices Β· β”‚
                 β”‚  catalogs Β· agents Β· search  β”‚
                 β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜

Architecture decision

This server uses Architecture A (live API only).

Rationale (verified live on 2026-07-21):

  • All read endpoints respond without authentication and paginate correctly.

  • No bulk download of catalogue metadata is offered, and none is needed.

  • Error responses follow RFC 7807, so failure modes are distinguishable.

Consequences:

  • Every HTTP call retries transient failures with 2 s / 4 s / 8 s backoff.

  • search_catalog caps results client-side because the upstream ignores paging.

  • api_status always returns an evaluable state instead of empty records.

Full probe report: docs/probe-i14y.md.

Project phase

This server is in Phase 1 (read-only) of the portfolio's Β«Read-only FirstΒ» phase architecture: all tools are read-only, there is no authentication and no personal data. See docs/roadmap.md for the phase model and the prerequisites for any future write capability.


Tools

Tool

Purpose

search_catalog

Free-text search across the catalogue. Entry point.

list_datasets

Paginated dataset register (complete, unlike search).

get_dataset

Full metadata record for one dataset.

get_dataset_distributions

Download URLs, formats and licences.

list_data_services

Register of official Swiss APIs with endpoint URLs.

get_data_service

Full record for one registered interface.

list_public_services

Administrative services for citizens.

list_concepts

Harmonised concepts and code lists.

get_concept

One concept definition.

search_codelist_entries

Individual codes of a code list.

list_publishers

Publishing bodies, with Swiss UID.

list_catalogs

Contributing catalogues.

api_status

Reachability check with graceful degradation.

All tools are annotated readOnlyHint: true. Write operations exist in the upstream API but are deliberately not exposed.

MCP primitives

This server exposes Tools only β€” no Resources, no Prompts. That is a deliberate choice, not an omission: I14Y is queried by free-text search and by opaque UUIDs, so there is no small, stable set of addressable URIs that would map cleanly onto MCP Resources, and the server ships no opinionated prompt templates. Every tool is read-only and idempotent; if a future stable entry point emerges (e.g. a fixed theme list) it is a candidate for a Resource.

MCP protocol version

Built against the MCP Python SDK (mcp >= 1.28.1), which negotiates the protocol version with the client at initialize time. The tested SDK floor is pinned in pyproject.toml; Dependabot opens monthly SDK-update PRs, and any change that bumps the negotiated spec version is called out in CHANGELOG.md.


MCP Protocol Version

This server speaks two protocol eras over the same endpoint. The client's first request on a connection decides which one applies; a later claim from the other era is refused.

Era

Revision

Who reaches it

initialize handshake

2024-11-05 … 2025-11-25

What today's clients speak. The server answers with the revision asked for, or with the 2025-11-25 ceiling when the request asks for something newer.

Per-request envelope

2026-07-28

A request carrying the 2026-07-28 _meta envelope opens a modern connection.

Both revisions are pinned in tests/test_protocol_version.py and asserted against the installed SDK, so a Dependabot bump of mcp cannot move either one silently. The handshake ceiling is measured against a live initialize through the assembled ASGI stack, not read off a constant name.

Note that the SDK's LATEST_PROTOCOL_VERSION is an alias for the modern era, not for the handshake era β€” pinning against it alone would leave the era that current clients actually negotiate free to drift.

Update policy. When the gate fails, do not edit the constant blindly: read the spec changelog between the two revisions, verify the server still behaves, then move the constant, this section, README.de.md and CHANGELOG.md together.


Installation

uvx i14y-mcp

Or from source:

git clone https://github.com/malkreide/i14y-mcp
cd i14y-mcp
pip install -e ".[dev]"

Claude Desktop

{
  "mcpServers": {
    "i14y": {
      "command": "uvx",
      "args": ["i14y-mcp"]
    }
  }
}

Remote deployment (Render, Railway)

I14Y_MCP_TRANSPORT=sse HOST=0.0.0.0 PORT=8000 i14y-mcp

I14Y_MCP_TRANSPORT accepts stdio (default), sse or streamable-http. The HTTP transports bind to HOST, which defaults to 127.0.0.1 (loopback); set HOST=0.0.0.0 to expose the port on a PaaS (the Docker image already does). CORS exposes the Mcp-Session-Id header so browser MCP clients keep their session. Which browser origins may call the server comes from I14Y_MCP_CORS_ORIGINS, a comma-separated list β€” unset means no browser client is permitted at all, which is the default. * is still accepted and logs a warning. stdio and other non-browser clients are unaffected either way.

Docker

docker compose up --build      # SSE transport on http://localhost:8000

The image is a hardened multi-stage build: it runs as a non-root user, ships no build tools, and needs no secrets (the API is unauthenticated). See Dockerfile and compose.yaml.


Join keys

I14Y is a connector layer. Two identifiers make it composable with the rest of the portfolio:

Key

Field

Joins to

Swiss UID

Publisher.uid

register-mcp (Zefix)

Endpoint URL

DataServiceSummary.endpoint_urls

any portfolio server wrapping that API


Known limitations

Verified live on 2026-07-21.

  1. The search index covers roughly half the register. search_catalog returns at most 1013 records; list_datasets reaches about 2003. Use list_datasets when completeness matters.

  2. Search returns Datasets only. Filtering by types=["Concept"] or types=["DataService"] yields zero results even though those entities exist. Use list_concepts and list_data_services instead.

  3. The upstream ignores paging on search. The full result set is always returned; this server caps it at 200 records and sets truncated: true.

  4. Licences vary per distribution, not per dataset. Most carry Β«Opendata BY ASKΒ», which requires attribution and restricts commercial use. Always read the licence field before reuse.

  5. Some metadata fields are simply empty. Frequency, temporal coverage and distribution format are optional and frequently unset by publishers. This is a data-quality property of the catalogue, not a bug in this server.

  6. Not every entry with an endpoint has a URL. Entries labelled only Β«OpenAPI SpezifikationΒ» without a URI are surfaced as (no URI) <label> rather than dropped.


Testing

PYTHONPATH=src pytest tests/ -m "not live"   # offline, used in CI
PYTHONPATH=src pytest tests/ -m "live"       # hits the real API
PYTHONPATH=src pytest tests/                 # everything
python -m ruff check src tests

The live tests are not decoration: fundstΓΌck 4 in the probe report β€” keywords nesting their language object under label β€” was caught by a live test after the unit tests were already green.


Contributing

See CONTRIBUTING.md for the ground rules (read-only, one egress host, no secrets) and the local dev loop. Maintainers: PUBLISHING.md covers the PyPI / MCP Registry release process.


Security

See SECURITY.md for the security posture and how to report a vulnerability.


License

MIT License β€” see LICENSE. The catalogue data remains subject to the terms declared by each publisher.


Author

Hayal Oezkan Β· github.com/malkreide


Licence: MIT. The catalogue data remains subject to the terms declared by each publisher.


MCP Registry

Ownership marker used by the MCP Registry to link this PyPI package to the GitHub namespace:

mcp-name: io.github.malkreide/i14y-mcp

Available Tools

13 tools
api_statusA
Read-onlyIdempotent

Check whether the I14Y API is reachable and which endpoints respond.

Always returns an evaluable status rather than an empty result, so an agent can distinguish Β«no data matchedΒ» from Β«the source is downΒ».

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

Output Schema

ParametersJSON Schema
NameRequiredDescription
noteYes
sourceNoAttribution string.
base_urlYes
reachableYes
provenanceNoWhere this payload came from.
retrieved_atYesUTC timestamp of retrieval.
checked_endpointsYes
last_successful_callNo

TDQS

A4.7/5.0
Behavior5/5

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

Beyond the annotations (readOnlyHint, openWorldHint, idempotentHint, destructiveHint), the description adds that it 'always returns an evaluable status rather than an empty result'. This is important behavioral context not captured by annotations, helping the agent interpret results correctly.

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

Conciseness5/5

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

The description is two sentences, front-loaded with the core purpose and then a clarifying note about return behavior. Every word earns its place, with no redundancy or irrelevant detail.

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

Completeness5/5

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

Given the tool's simplicity (no parameters), the presence of an output schema, and the annotations, the description fully covers the behavioral nuance that matters: the returned status is evaluable even when empty results occur. Nothing else is needed.

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

Parameters4/5

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

The tool has zero parameters, and the input schema is empty (100% schema description coverage). The baseline for no parameters is 4, and the description appropriately adds no parameter details. It doesn't need to compensate for schema gaps because there are none.

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

Purpose5/5

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

The description clearly states the tool's function: 'Check whether the I14Y API is reachable and which endpoints respond.' This uses a specific verb ('check') and resource ('I14Y API'), and it distinguishes itself from sibling data retrieval tools by focusing on API status rather than content.

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

Usage Guidelines4/5

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

The description explains when this tool is useful: to distinguish 'no data matched' from 'the source is down'. This implies using it when an empty result may indicate connectivity issues. It doesn't explicitly name alternatives, but the context is clear for an agent choosing between this and data search tools.

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

get_conceptA
Read-onlyIdempotent

Retrieve one concept definition, including its value type and version.

Args: concept_id: UUID from list_concepts. language: Language for titles and descriptions.

ParametersJSON Schema
NameRequiredDescriptionDefault
languageNode
concept_idYes

Output Schema

ParametersJSON Schema
NameRequiredDescription
sourceNoAttribution string.
conceptYes
provenanceNoWhere this payload came from.
retrieved_atYesUTC timestamp of retrieval.

TDQS

A4.2/5.0
Behavior4/5

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

Annotations already declare readOnlyHint, openWorldHint, idempotentHint, destructiveHint. The description adds actionable detail: returns 'value type and version', which is beyond annotations. No contradictions.

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

Conciseness5/5

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

Extremely concise: two lines plus argument list. Every sentence adds value with no redundancy. Front-loaded with the core purpose.

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

Completeness4/5

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

Given the presence of an output schema (context: has output schema=true) and rich annotations, the description covers essential usage and parameter semantics. Could mention edge cases but is adequate.

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

Parameters4/5

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

Schema has 0% description coverage, so description compensates by explaining concept_id source (from list_concepts) and language purpose (titles/descriptions), adding meaning beyond schema's regex and enum.

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

Purpose5/5

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

The description clearly states 'Retrieve one concept definition' with specific return details (value type, version). It distinguishes from sibling 'list_concepts' by implying this is for a single entity.

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

Usage Guidelines3/5

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

The description mentions the concept_id comes from list_concepts, implying usage context, but does not explicitly state when to use this tool vs. alternatives like search_catalog or list_concepts.

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

get_data_serviceA
Read-onlyIdempotent

Retrieve the full record for one registered API, including endpoints.

Args: data_service_id: UUID from list_data_services. language: Language for titles and descriptions.

ParametersJSON Schema
NameRequiredDescriptionDefault
languageNode
data_service_idYes

Output Schema

ParametersJSON Schema
NameRequiredDescription
sourceNoAttribution string.
provenanceNoWhere this payload came from.
data_serviceYes
retrieved_atYesUTC timestamp of retrieval.

TDQS

A4.4/5.0
Behavior4/5

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

Annotations already declare readOnlyHint=true and destructiveHint=false, so the safety profile is clear. The description adds meaningful context by specifying the response includes 'full record... including endpoints' and that the language parameter affects 'titles and descriptions', which goes beyond the annotations. No contradiction with the annotations.

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

Conciseness5/5

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

The description is extremely concise, with one action-focused sentence and a compact Args block. Every word earns its place, and the structure is easy to scan, making it ideal for agent consumption.

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

Completeness4/5

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

For a simple read-only tool with two parameters and an output schema, this description is nearly complete. It covers the purpose, parameter semantics, and the prerequisite for the ID. The only minor gap is the absence of explicit alternative/contrast with siblings, but the output schema handles return format details, so the description is sufficient.

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

Parameters4/5

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

The schema has no per-property descriptions (0% coverage), so the description must compensate. The Args section does this well: it explains that data_service_id is a UUID from list_data_services and that language controls titles and descriptions, adding practical meaning beyond the raw schema (pattern and enum). Slight imprecision: the schema pattern allows more than UUIDs, but the hint is still helpful.

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

Purpose5/5

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

Description uses the specific verb 'Retrieve' and clearly identifies the resource: 'full record for one registered API, including endpoints'. This distinguishes it from sibling tools like list_data_services (which lists services) and get_dataset (which targets datasets), leaving no ambiguity about what the tool does.

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

Usage Guidelines4/5

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

The description provides an explicit prerequisite by stating that data_service_id is a 'UUID from list_data_services', indicating the tool should be used after listing services. However, it does not explicitly name alternative tools or state when not to use this tool, so it falls short of a perfect score.

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

get_datasetA
Read-onlyIdempotent

Retrieve the full, aggregated metadata record for one dataset.

This is the aggregated detail tool: a single call returns the contact point, temporal and spatial coverage, documentation links and every distribution with its licence β€” so search_catalog β†’ get_dataset answers Β«who publishes it, through which interface, under which licenceΒ» in two calls, without a separate distributions or contact lookup.

Args: dataset_id: UUID from search_catalog or list_datasets. language: Language for titles and descriptions.

ParametersJSON Schema
NameRequiredDescriptionDefault
languageNode
dataset_idYes

Output Schema

ParametersJSON Schema
NameRequiredDescription
sourceNoAttribution string.
datasetYes
provenanceNoWhere this payload came from.
retrieved_atYesUTC timestamp of retrieval.

TDQS

A4.6/5.0
Behavior4/5

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

Annotations already declare read-only, open-world, idempotent, and non-destructive behavior. The description adds valuable context about the aggregated nature of the response, including what data fields are returned and how the language parameter affects titles/descriptions. It does not mention error handling or null results, but the annotation coverage lowers the bar.

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

Conciseness4/5

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

The description is front-loaded with the primary action, followed by a useful but slightly verbose workflow explanation. All sentences contribute value, but the second paragraph about the two-call workflow could be tightened. Overall, it is well-structured and appropriately sized.

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

Completeness5/5

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

The description is comprehensive for the tool's complexity: it explains the aggregated nature, parameter provenance, and relationship to sibling tools. Since an output schema exists, return value details are not required in the description. With strong annotations and clear usage guidelines, this is a complete package.

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

Parameters4/5

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

Schema description coverage is 0%, so the description must compensate. It explains `dataset_id` as a UUID from sibling tools and `language` as the language for titles/descriptions, which adds meaningful semantics beyond the schema's enumerated values and pattern. Minor gap: no detail on fallback behavior if language is not supported.

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

Purpose5/5

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

The description clearly identifies the tool as retrieving the full aggregated metadata record for one dataset, with specific details (contact point, coverage, documentation, distributions with licences). It distinguishes itself from sibling tools by explaining this is the aggregated detail tool that avoids separate lookups.

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

Usage Guidelines5/5

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

The description explicitly recommends a workflow: `search_catalog` β†’ `get_dataset` answers key questions in two calls, and states that no separate distributions or contact lookup is needed. It also instructs that `dataset_id` should come from `search_catalog` or `list_datasets`, providing clear when-to-use guidance.

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

get_dataset_distributionsA
Read-onlyIdempotent

Get the downloadable files and access URLs for a dataset.

This is the Β«where do I actually get the dataΒ» tool. Each distribution carries its own format, licence and download URL β€” licences differ between distributions of the same dataset, so always read the licence field before reusing the data. (get_dataset returns these same distributions alongside the rest of the record.)

Args: dataset_id: UUID from search_catalog or list_datasets. language: Language for titles and descriptions.

ParametersJSON Schema
NameRequiredDescriptionDefault
languageNode
dataset_idYes

Output Schema

ParametersJSON Schema
NameRequiredDescription
sourceNoAttribution string.
returnedYes
dataset_idYes
provenanceNoWhere this payload came from.
retrieved_atYesUTC timestamp of retrieval.
dataset_titleNo
distributionsYes

TDQS

A4.5/5.0
Behavior4/5

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

Annotations indicate read-only, idempotent, non-destructive behavior. The description adds valuable context beyond annotations: it warns that licences differ between distributions of the same dataset and instructs to always read the licence field. This is a meaningful behavioral note that helps the agent avoid misuse.

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

Conciseness5/5

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

The description is compact and well-structured: a one-line summary, a clarifying paragraph, and an args section. Every sentence serves a purpose without redundancy.

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

Completeness5/5

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

Given the presence of an output schema (not shown but declared), the description does not need to detail return values. It covers purpose, usage context, parameter sourcing, and a critical behavioral note about licences. For a get-by-ID tool with well-annotated safety, this is complete.

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

Parameters4/5

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

Schema coverage is 0%, so description fully carries parameter semantics. It explains that dataset_id is a UUID from search_catalog or list_datasets, and that language controls titles/descriptions. Both parameters are addressed clearly, adding meaning beyond the schema's enums and pattern.

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

Purpose5/5

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

The description clearly states 'Get the downloadable files and access URLs for a dataset,' which is a specific verb and resource. It distinguishes from sibling tools like search_catalog and list_datasets by focusing on distributions, and mentions that get_dataset returns distributions alongside other data, clarifying the scope.

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

Usage Guidelines4/5

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

The description explicitly frames the tool as 'the Β«where do I actually get the dataΒ» tool' and advises reading the licence field before reuse. It also specifies that dataset_id comes from search_catalog or list_datasets. However, it does not explicitly state when not to use this tool versus alternatives like get_dataset, though it implies the distinction.

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

list_catalogsA
Read-onlyIdempotent

List the catalogues that feed into I14Y.

Each catalogue represents one contributing organisation's data collection.

Args: language: Language for titles. page: 1-based page number. page_size: Records per page (1-100).

ParametersJSON Schema
NameRequiredDescriptionDefault
pageNo
languageNode
page_sizeNo

Output Schema

ParametersJSON Schema
NameRequiredDescription
pageYes
sourceNoAttribution string.
catalogsYes
returnedYes
page_sizeYes
provenanceNoWhere this payload came from.
retrieved_atYesUTC timestamp of retrieval.

TDQS

A3.5/5.0
Behavior3/5

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

Annotations already indicate read-only, open-world, idempotent, non-destructive behavior. The description adds context about the data source (I14Y) and the meaning of catalogues, but does not disclose any behavioral traits beyond what annotations provide. With annotations covering most aspects, a score of 3 is appropriate.

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

Conciseness5/5

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

The description is exceptionally concise: two lines for purpose/context, then a bullet-like args list. Every sentence adds value, no waste. Front-loaded with the main action.

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

Completeness4/5

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

The description covers the tool's purpose and all parameters. An output schema exists, so return format details are not needed. Given the tool's simplicity (list with pagination), the description is adequately complete.

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

Parameters4/5

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

The input schema has 3 parameters with defaults and constraints, but no descriptions. The description compensates by documenting each parameter: 'Language for titles', '1-based page number', 'Records per page (1-100)'. This adds meaning beyond the schema, meriting a 4 given the low schema coverage.

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

Purpose4/5

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

The description clearly states that the tool lists catalogues feeding into I14Y, and explains that each catalogue represents an organization's data collection. While the purpose is specific, it does not explicitly differentiate from sibling tools like search_catalog or list_datasets, which could help an agent choose correctly.

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

Usage Guidelines2/5

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

No guidance is provided on when to use this tool versus alternatives (e.g., search_catalog for filtering, list_datasets for sub-resources). The description only explains what catalogues are, not the appropriate context for invocation.

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

list_conceptsA
Read-onlyIdempotent

List harmonised concepts and code lists of the Swiss administration.

Concepts are the semantic backbone of interoperability: shared definitions and code lists that different bodies agree to use. Note that these are not reachable through search_catalog.

Args: publisher_identifier: Publisher identifier from list_publishers. language: Language for titles and descriptions. page: 1-based page number. page_size: Records per page (1-100).

ParametersJSON Schema
NameRequiredDescriptionDefault
pageNo
languageNode
page_sizeNo
publisher_identifierNo

Output Schema

ParametersJSON Schema
NameRequiredDescription
pageYes
sourceNoAttribution string.
conceptsYes
returnedYes
page_sizeYes
provenanceNoWhere this payload came from.
retrieved_atYesUTC timestamp of retrieval.

TDQS

A4.4/5.0
Behavior4/5

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

Annotations already declare readOnlyHint=true, openWorldHint=true, idempotentHint=true, destructiveHint=false. The description adds valuable behavioral context beyond annotations, explaining that concepts are shared definitions and not searchable via catalog, and detailing parameter origins. No contradictions with annotations.

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

Conciseness4/5

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

The description is well-structured into a purpose statement, context paragraph, and parameter list. It is concise with no redundant sentences, though the parameter list could be slightly more compact. Still, it earns its place.

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

Completeness4/5

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

Given the presence of an output schema (not needed to explain return values), the description adequately covers what the tool does, what concepts are, filtering by publisher and language, and pagination. It is sufficient for an agent to use without ambiguity.

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

Parameters5/5

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

With 0% schema description coverage, the description fully compensates by explaining each parameter's meaning: `publisher_identifier` from `list_publishers`, `language` for titles/descriptions, `page` as 1-based, `page_size` range 1-100. This adds critical context beyond the schema's type and constraints.

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

Purpose5/5

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

The description clearly states 'List harmonised concepts and code lists of the Swiss administration' with a specific verb and resource. It also distinguishes itself from the sibling `search_catalog` by noting that these are not reachable through that tool, making purpose and differentiation explicit.

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

Usage Guidelines4/5

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

The description provides context on when to use this tool (to access shared semantic definitions) and explicitly excludes `search_catalog`. However, it does not compare against other siblings like `list_datasets` or `get_concept`, so usage guidance is good but not exhaustive.

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

list_data_servicesA
Read-onlyIdempotent

List machine interfaces (APIs) registered by Swiss public bodies.

The strategic payload of this server: the national register of official APIs, with endpoint URLs and OpenAPI specification links where the publisher supplied them. Use this to discover whether an interface already exists before building a scraper.

Args: publisher_identifier: Publisher identifier from list_publishers. language: Language for titles and descriptions. page: 1-based page number. page_size: Records per page (1-100).

ParametersJSON Schema
NameRequiredDescriptionDefault
pageNo
languageNode
page_sizeNo
publisher_identifierNo

Output Schema

ParametersJSON Schema
NameRequiredDescription
pageYes
sourceNoAttribution string.
returnedYes
page_sizeYes
provenanceNoWhere this payload came from.
retrieved_atYesUTC timestamp of retrieval.
data_servicesYes

TDQS

A4.6/5.0
Behavior4/5

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

Annotations already declare readOnlyHint, openWorldHint, idempotentHint, and non-destructive behavior. The description adds valuable context about what the tool returns (endpoint URLs and OpenAPI specs) and pagination details, going beyond the annotations.

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

Conciseness5/5

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

The description is concise and well-structured: purpose first, then strategic payload, then usage guidance, then parameter list. Every sentence adds value with no wasted words.

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

Completeness5/5

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

Given the tool's complexity (4 optional parameters, annotations, output schema present), the description covers all essential aspects: what is returned, when to use it, and parameter details. The presence of an output schema reduces the need to explain return values.

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

Parameters5/5

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

With 0% schema description coverage, the description fully compensates by explaining each parameter in the Args section: publisher_identifier, language, page (1-based), and page_size (1-100). This adds meaning beyond the schema.

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

Purpose5/5

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

The description clearly states 'List machine interfaces (APIs) registered by Swiss public bodies,' using a specific verb and resource. It distinguishes itself from sibling tools by mentioning 'the national register of official APIs' with endpoint URLs and OpenAPI links.

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

Usage Guidelines4/5

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

The description provides explicit usage guidance: 'Use this to discover whether an interface already exists before building a scraper.' It also references the sibling tool `list_publishers` for obtaining the publisher_identifier, though it does not explicitly state when not to use this tool.

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

list_datasetsA
Read-onlyIdempotent

List registered datasets, optionally filtered by publisher.

Unlike search_catalog, this endpoint paginates correctly and covers the complete register (roughly 2000 datasets as of July 2026), including records the search index misses.

Args: publisher_identifier: Publisher identifier from list_publishers. access_rights: e.g. "PUBLIC", "NON_PUBLIC", "RESTRICTED". language: Language for titles and descriptions. page: 1-based page number. page_size: Records per page (1-100).

ParametersJSON Schema
NameRequiredDescriptionDefault
pageNo
languageNode
page_sizeNo
access_rightsNo
publisher_identifierNo

Output Schema

ParametersJSON Schema
NameRequiredDescription
pageYes
sourceNoAttribution string.
datasetsYes
returnedYes
page_sizeYes
provenanceNoWhere this payload came from.
retrieved_atYesUTC timestamp of retrieval.

TDQS

A4.6/5.0
Behavior4/5

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

Annotations already declare readOnly, idempotent, and non-destructive hints. The description adds valuable behavioral context: it paginates correctly, covers the complete register (~2000 datasets), and includes records missed by the search index. This enriches transparency beyond annotations, though it could mention potential latency or consistency.

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

Conciseness5/5

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

The description is concise and well-structured, starting with the primary purpose, then differentiation from a sibling, followed by a clear parameter list. Every sentence adds value without redundancy.

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

Completeness4/5

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

Given the tool's moderate complexity, the description covers the essentials: purpose, differentiation, parameter meanings, and key behavioral traits (pagination, coverage). However, it omits details like sorting order or timeout behavior. An output schema exists, so return values need not be documented.

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

Parameters4/5

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

With 0% schema description coverage, the description carries full burden for parameter semantics. It provides meaningful descriptions for all parameters: `publisher_identifier` from `list_publishers`, `access_rights` examples, `language` values, and pagination details. This compensates well, but lacks specifics on default values (already in schema) or format constraints.

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

Purpose5/5

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

The description clearly states the tool lists registered datasets with optional filtering by publisher. It explicitly distinguishes from the sibling `search_catalog` by highlighting its correct pagination and complete register coverage, providing a specific verb+resource differentiation.

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

Usage Guidelines5/5

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

The description provides explicit guidance on when to use this tool (for complete register and correct pagination) and contrasts with `search_catalog` as an alternative. It also documents parameter examples like `publisher_identifier` from `list_publishers` and `access_rights` values, offering clear context for usage.

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

list_public_servicesA
Read-onlyIdempotent

List registered public services (administrative offerings for citizens).

Args: publisher_identifier: Publisher identifier from list_publishers. language: Language for titles and descriptions. page: 1-based page number. page_size: Records per page (1-100).

ParametersJSON Schema
NameRequiredDescriptionDefault
pageNo
languageNode
page_sizeNo
publisher_identifierNo

Output Schema

ParametersJSON Schema
NameRequiredDescription
pageYes
sourceNoAttribution string.
returnedYes
page_sizeYes
provenanceNoWhere this payload came from.
retrieved_atYesUTC timestamp of retrieval.
public_servicesYes

TDQS

A4/5.0
Behavior3/5

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

Annotations already indicate readOnlyHint, idempotentHint, and destructiveHint=false. The description adds that it lists public services, which is consistent but does not disclose additional behavioral aspects like pagination behavior or rate limits beyond parameter docs.

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

Conciseness5/5

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

The description is concise: one sentence for purpose followed by a clear docstring with each parameter explained. No fluff, front-loaded with purpose.

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

Completeness4/5

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

Given the tool's simplicity (list with pagination and optional filter) and the presence of an output schema, the description adequately covers what the tool does and parameter semantics. Missing are potential error conditions or additional output context, but it's sufficient.

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

Parameters4/5

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

With 0% schema description coverage, the description compensates by explaining all 4 parameters: publisher_identifier source, language purpose, page base, and page_size range. This adds context beyond the schema constraints.

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

Purpose5/5

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

The description clearly states the tool lists 'registered public services' with the parenthetical 'administrative offerings for citizens', which distinguishes it from sibling tools like list_datasets or list_data_services that list other entity types.

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

Usage Guidelines3/5

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

The description provides no explicit guidance on when to use this tool vs alternatives, but hints at a dependency by noting that publisher_identifier comes from list_publishers. No when-not-to-use or alternatives are mentioned.

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

list_publishersA
Read-onlyIdempotent

List the public bodies that publish into I14Y.

Returns publisher identifiers needed by the other tools, plus the Swiss UID where available β€” the UID is the join key to register-mcp (Zefix).

Args: identifier: Filter by exact publisher identifier. uid: Filter by Swiss UID, e.g. "CHE-123.456.789". language: Language for names. page: 1-based page number. page_size: Records per page (1-100).

ParametersJSON Schema
NameRequiredDescriptionDefault
uidNo
pageNo
languageNode
page_sizeNo
identifierNo

Output Schema

ParametersJSON Schema
NameRequiredDescription
pageYes
sourceNoAttribution string.
returnedYes
page_sizeYes
provenanceNoWhere this payload came from.
publishersYes
retrieved_atYesUTC timestamp of retrieval.

TDQS

A4.3/5.0
Behavior3/5

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

Annotations already provide readOnlyHint=true, openWorldHint=true, idempotentHint=true, and destructiveHint=false. The description adds that it returns identifiers and the Swiss UID, which is useful but does not significantly extend the safety profile already conveyed by annotations.

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

Conciseness5/5

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

The description is two sentences plus a bullet list of parameters. No word is wasted; every sentence adds unique value: purpose, output context, and parameter details. Structure is clear and front-loaded.

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

Completeness4/5

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

Given the tool has an output schema, the description appropriately mentions the key output fields (identifiers, Swiss UID). It covers all necessary aspects for a listing tool with filters, though could briefly mention pagination behavior (already in schema).

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

Parameters5/5

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

Despite 0% schema description coverage, the description fully explains each parameter: identifier, uid (with example), language, page (1-based), and page_size (1-100). This compensates entirely for the lack of schema descriptions.

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

Purpose5/5

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

The description clearly states 'List the public bodies that publish into I14Y', providing a specific verb-resource combination. It distinguishes from sibling tools like list_datasets and list_catalogs by focusing on publishers, and hints at its role supplying identifiers needed by other tools.

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

Usage Guidelines4/5

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

The description mentions that the output contains 'publisher identifiers needed by the other tools' and notes the UID as a join key to register-mcp. This gives context for when to use it, but does not explicitly state when not to use it or contrast with alternatives.

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

search_catalogA
Read-onlyIdempotent

Search Switzerland's national metadata catalogue for data resources.

The primary entry point: use this to find out who publishes data on a topic before looking for a specific dataset. Returns titles, publishers, themes and portal permalinks.

Known limitation (verified live 2026-07-21): the upstream search index covers Datasets only. Filtering by types=["Concept"] or types=["DataService"] returns zero results even though those entities exist β€” use list_concepts and list_data_services for those.

Args: query: Free-text search term, e.g. "Sonderpaedagogik" or "Bildung". An empty string returns the full index (over 1000 records) and is not recommended. language: Language for titles and descriptions. types: Restrict to resource types. Effectively only "Dataset" works. themes: Filter by theme identifiers. publishers: Filter by publisher identifiers. limit: Maximum records to return (1-200). Upstream ignores paging, so capping happens in this server.

ParametersJSON Schema
NameRequiredDescriptionDefault
limitNo
queryYes
typesNo
themesNo
languageNode
publishersNo

Output Schema

ParametersJSON Schema
NameRequiredDescription
hintNoActionable next step when match_type is 'none' (e.g. which tool to try).
hitsYes
queryNo
sourceNoAttribution string.
languageYes
returnedYesRecords in this payload after capping.
truncatedYesTrue when the upstream result set exceeded the cap.
match_typeNo'none' when nothing matched, so the agent never sees a bare empty result.
provenanceNoWhere this payload came from.
retrieved_atYesUTC timestamp of retrieval.
total_matchedYesMatches reported by the upstream index.

TDQS

A4.7/5.0
Behavior4/5

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

Annotations already provide readOnlyHint, openWorldHint, idempotentHint, and destructiveHint=false. The description adds the server-side capping of limit due to upstream ignoring paging, and the limitation that some type filters yield zero results despite existence. This adds valuable behavioral context beyond annotations, though could mention rate limits or error handling.

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

Conciseness4/5

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

The description is well-structured with a main paragraph, a limitation note, and parameter list. It is informative but slightly verbose; some sentences could be tightened without loss of clarity.

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

Completeness5/5

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

Given the tool's complexity (6 parameters, sibling tools) and presence of output schema, the description covers all essential aspects: purpose, when to use, parameter semantics, known limitations, and alternatives. No gaps in guidance for effective invocation.

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

Parameters5/5

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

Despite 0% schema description coverage, the description provides detailed explanations for all 6 parameters in the Args section, including query free-text, language options, types (with known limitation), themes, publishers, and limit behavior. This fully compensates for the schema's lack of descriptions.

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

Purpose5/5

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

The description clearly states it 'searches Switzerland's national metadata catalogue for data resources' and describes it as the primary entry point to find who publishes data on a topic. It lists returned fields (titles, publishers, themes, permalinks) and distinguishes from sibling tools like list_concepts and list_data_services.

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

Usage Guidelines5/5

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

Explicitly says 'use this to find out *who* publishes data on a topic before looking for a specific dataset.' Provides a known limitation that types other than 'Dataset' may return zero results and directs to alternative tools (list_concepts, list_data_services). Also warns against empty query returning full index.

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

search_codelist_entriesA
Read-onlyIdempotent

List the individual codes of a code-list concept.

Use this to resolve official code values β€” for example the canonical list of a classification used across several federal datasets. Only concepts with concept_type == "CodeList" return entries.

Args: concept_id: UUID of a code-list concept from list_concepts. language: Language for entry names. Required by the upstream API. page: 1-based page number. page_size: Records per page (1-200).

ParametersJSON Schema
NameRequiredDescriptionDefault
pageNo
languageNode
page_sizeNo
concept_idYes

Output Schema

ParametersJSON Schema
NameRequiredDescription
pageYes
sourceNoAttribution string.
entriesYes
languageYes
returnedYes
page_sizeYes
concept_idYes
provenanceNoWhere this payload came from.
retrieved_atYesUTC timestamp of retrieval.

TDQS

A4.8/5.0
Behavior5/5

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

Annotations already declare readOnlyHint, openWorldHint, idempotentHint, destructiveHint. Description adds behavioral context beyond annotations: the constraint on concept_type, that language is required by upstream API, and pagination semantics. No contradictions.

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

Conciseness5/5

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

Concise yet thorough: a clear introductory sentence, a context paragraph, and structured Args section. Every sentence adds value; no redundancy.

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

Completeness5/5

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

Given the tool's complexity (4 parameters, output schema exists, annotations present), the description is complete. It explains purpose, usage context, parameter details, and a key behavioral condition. Output schema covers return values.

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

Parameters5/5

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

Schema description coverage is 0%, but the description fully compensates by explaining each parameter: concept_id as UUID from list_concepts, language as required by upstream API, page as 1-based, page_size range (1-200). This adds significant meaning beyond the schema types.

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

Purpose5/5

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

The description clearly states the action ('List the individual codes') and the resource ('a code-list concept'), with a specific use case example. It differentiates from sibling tools (e.g., list_concepts) by focusing on entries within a codelist.

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

Usage Guidelines4/5

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

Provides explicit context: 'Use this to resolve official code values' and a condition ('Only concepts with concept_type == "CodeList" return entries'). It does not explicitly state when not to use or list alternatives, but the usage is well implied.

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. Dates show when Glama detected each change.

  1. 3 tool updatesv0.3.2
    • Addedapi_status
    • Addedget_data_service
    • Addedget_dataset
  2. 10 tool updatesv0.2.1
    • First observedget_concept
    • First observedget_dataset_distributions
    • First observedlist_catalogs
    • First observedlist_concepts
    • First observedlist_data_services
    • First observedlist_datasets
    • First observedlist_public_services
    • First observedlist_publishers
    • First observedsearch_catalog
    • First observedsearch_codelist_entries

TDQS

A4.3/5.0
Disambiguation5/5

Each tool targets a distinct resource or operation: search vs. paginated listing, datasets, distributions, data services, public services, concepts, codelist entries, publishers, catalogs. Descriptions clearly differentiate purposes.

Naming Consistency5/5

All tools follow a consistent 'verb_noun' pattern in snake_case (e.g., search_catalog, list_datasets, get_dataset_distributions). No mixing of conventions.

Tool Count5/5

10 tools is well-scoped for a metadata catalogue server covering search, listing, details, publishers, catalogs, concepts, and code lists. Not too few or too many.

Completeness5/5

The tool set covers the full discovery lifecycle: search, browse, get details, and retrieve distributions for datasets, plus access to related entities like services, concepts, and publishers. No obvious gaps for a read-only catalog interface.

Maintenance

ActivityActive
ResponsivenessNo issues

Resources

Unclaimed servers have limited discoverability.

Looking for Admin?

If you are the server author, to access and configure the admin panel.

Related MCP Connectors

Related MCP Servers

  • A
    license
    B
    quality
    A
    maintenance
    An MCP server providing AI-powered access to Open Data from the City of Zurich, enabling queries to 900+ datasets, real-time environmental and mobility data, geodata, parliamentary proceedings, and more.
    26
    8
    MIT
  • A
    license
    A
    quality
    A
    maintenance
    MCP server for TERMDAT, the terminology database of the Swiss Federal Administration, giving AI agents officially validated designations of Swiss authorities, departments, and legal acts across DE/FR/IT/EN with source references and validation status.
    7
    1
    MIT

Latest Blog Posts

MCP directory API

We provide all the information about MCP servers via our MCP API.

curl -X GET 'https://glama.ai/api/mcp/v1/servers/malkreide/i14y-mcp'

If you have feedback or need assistance with the MCP directory API, please join our Discord server