Finland Open Data (www.avoindata.fi/data/en) CKAN MCP. Finnish government open data via the CKAN Action API. Keyless access to search datasets, retrieve full metadata, and query tabular resources.
Three tools with clear verb-noun naming (search_datasets, dataset, query_resource) and reasonable descriptions (120-180 chars). All have input schemas with type definitions and required fields properly marked. However, parameter descriptions lack actionable constraints (no enums, ranges, or format specs), output schemas are undocumented, and error handling is minimal. No tool annotations (readOnlyHint, etc.). Descriptions are adequate but generic, they state WHAT but not WHEN or WHY to use each tool relative to others.
Show full metadata for one Finland Open Data dataset by id or name (from search_datasets), including all resources and their resource_ids.
Pull rows from a tabular Finland Open Data resource (CKAN DataStore) by resource_id (from a dataset's resources). Optional full-text q, limit, offset. Note: only resources with the DataStore enabled are queryable.
Search Finland Open Data (Finland) for datasets by keyword. Returns each dataset's id/name, title, organization, and its resources (each with a resource_id for query_resource).
Output schemas not documented. LLMs cannot plan downstream calls or extract required fields (e.g., resource_id from search_datasets for query_resource). Responses from CKAN API are returned raw without field documentation.
Parameter descriptions lack actionable constraints. 'limit' accepts 1-100 but description does not specify range. 'query' accepts blank or '*' but this is buried in description text, not formalized as enum or pattern. LLMs may pass invalid values.
No tool annotations (readOnlyHint, destructiveHint, idempotentHint). All three tools are read-only and idempotent, but this is not declared in the schema. Agents cannot infer safety properties.
| Scored | Grade | Overall | Spec posture | Rubric |
|---|---|---|---|---|
| 2026-09-23 | D | 56 | 2026-07-28+ | v2 |
Error handling is minimal. callTool() throws generic Error objects with no recovery guidance. If a dataset ID is invalid or a resource has no DataStore, the LLM receives a raw error with no suggestion for next steps (e.g., 'Try search_datasets() first').
Descriptions do not explain when to use each tool relative to others. 'search_datasets' vs 'dataset' distinction is unclear, when should an agent call one vs the other? No dependency hints (e.g., 'Call search_datasets first to find a dataset ID').