Switzerland's federal open-data portal (CKAN catalogue) MCP server
Strong foundation with clear, well-structured tool definitions. All 5 tools have explicit schemas with typed properties and descriptions. Tool names follow verb_noun convention (search_, list_, dataset_). Descriptions are detailed (100-200 chars) and explain WHAT, WHEN, and dependencies. Multilingual handling is well-documented. However, output schemas are not formally documented, responses are inferred from code. Parameter descriptions could be more prescriptive about constraints (e.g., exact range for 'rows' and 'limit'). No error handling guidance or recovery patterns visible. Missing tool annotations (readOnlyHint, idempotentHint). No pagination metadata (total_count, next_cursor) documented in output.
Full metadata for one dataset (CKAN package_show) including its resources/distributions with download URLs. Use a dataset `name` (slug) or id from search_datasets. There is no datastore, so fetch `resources[].download_url`/`url` for the underlying data.
List thematic categories (CKAN groups / themes, e.g. health, education, energy). Multilingual titles flattened to `title_en`. Use a returned `name` as `groups:<name>` in search_datasets `fq`.
List publishing organizations (federal offices, cantons, etc.). Multilingual titles flattened to `title_en`. Use a returned `name` as `organization:<name>` in search_datasets `fq`.
List or search keyword tags used across the catalogue (CKAN tag_list). Useful for discovering facet values.
Search the opendata.swiss catalogue (CKAN package_search). Returns matching Swiss federal/cantonal datasets. Titles/descriptions are multilingual {de,fr,it,en}; each result is annotated with English-preferred `title_en`/`notes_en`.
Output schemas not formally documented. Responses are inferred from code (annotateDataset, annotateFacet functions). LLMs cannot plan downstream tool calls without knowing return field names and types.
No error handling guidance. ckanGet() throws generic errors ('opendata.swiss: 404 ...') without recovery hints. LLMs cannot self-correct or know whether to retry, ask user, or abandon.
Parameter constraints stated informally in descriptions ('1-1000', 'default 25') rather than as JSON Schema minima/maxima. LLMs cannot parse these constraints programmatically and may pass invalid values.
| Scored | Grade | Overall | Spec posture | Rubric |
|---|---|---|---|---|
| 2026-09-23 | D | 59 | 2026-07-28+ | v2 |
No tool annotations (readOnlyHint, idempotentHint). All tools are read-only and idempotent, but this is not declared. Agents cannot optimize caching or retry strategies.
Pagination metadata not documented. search_datasets returns 'count' and 'results', but no 'total' or 'next_cursor' guidance. Large result sets may exceed context window without clear pagination strategy.