Angers Loire Métropole Open Data (data.angers.fr) — OpenDataSoft MCP. Open data for Angers, France via the OpenDataSoft Explore v2.1 API: mobility, urban services & environment. Keyless.
Three tools with complete schemas and descriptions, but significant gaps in parameter documentation and output schema clarity. All tools have action verbs (search_, dataset_, query) and non-empty descriptions (avg 156 chars). However, parameter descriptions lack detail on constraints, formats, and dependencies. Output schemas are undocumented, LLMs cannot plan downstream calls or extract structured data. Error handling is minimal. No tool annotations (readOnlyHint, idempotentHint). Composition is sound: search→info→query workflow is logical and tool outputs chain correctly (dataset_id flows through). Security is adequate for read-only operations but lacks explicit permission declarations.
Get metadata for one Angers Loire Métropole Open Data dataset (fields/schema, themes, record count) — call before query to learn the column names.
Query records from a Angers Loire Métropole Open Data dataset with ODSQL. Filter (where), aggregate (group_by/select), sort (order_by), paginate (limit/offset).
Search Angers Loire Métropole Open Data for datasets by keyword (mobility, urban services & environment). Returns dataset_ids (pass to query/dataset_info), titles, themes and record counts.
Output schemas undocumented. LLMs cannot infer what fields to expect from search_datasets, dataset_info, or query responses. This blocks downstream planning and forces agents to guess at field names.
Parameter descriptions lack format/constraint details. 'limit' and 'offset' state ranges (1-100, default 20) but 'query', 'where', 'select', 'group_by', 'order_by' lack examples or ODSQL syntax guidance. LLMs will hallucinate invalid SQL.
No tool annotations. All three tools are read-only and idempotent, but lack readOnlyHint and idempotentHint annotations. Agents cannot distinguish safe tools from destructive ones without explicit hints.
Error handling is minimal. callTool() throws generic Error objects with no recovery guidance. If dataset_id is invalid or API fails, LLM receives no hint on what to try next (e.g., 'call search_datasets first').
| Scored | Grade | Overall | Spec posture | Rubric |
|---|---|---|---|---|
| 2026-09-23 | D | 55 | 2026-07-28+ | v2 |
Parameter 'query' in search_datasets and query tool is ambiguous. In search_datasets it searches titles/descriptions; in query it searches all fields. Descriptions should clarify scope and precedence (query vs where clause).