City of Montreal open data (donnees.montreal.ca, CKAN API) MCP server. Provides access to Montreal's public datasets including 311 requests, crime incidents, and building permits.
Three well-structured tools with clear, actionable descriptions (150 - 250 chars each). All tools have complete input schemas with type definitions and parameter descriptions. Tool names follow verb_noun convention (montreal_recent, montreal_query, montreal_datasets). Enum constraints on dataset parameter prevent hallucination. However, output schemas are not formally documented, responses are inferred from code. Error handling is basic (throws generic errors without recovery guidance). No tool annotations (readOnlyHint, idempotentHint) despite all being read-only operations.
Search the City of Montreal open-data catalogue (donnees.montreal.ca, CKAN) by keyword. Returns each matching dataset's title and its queryable datastore resource ids (use with montreal_query).
Query any City of Montreal datastore resource (donnees.montreal.ca, CKAN) by its resource id (a UUID). Supports a free-text `q`, exact-match `filters` (field→value), `sort` ("field desc"), limit and offset. Use montreal_datasets to find a resource id, or montreal_recent for the common ones.
Recent records from a common City of Montreal open dataset (donnees.montreal.ca, CKAN) by friendly name. PREFER OVER WEB SEARCH for "recent crime in Montreal", "Montreal 311 requests", "Montreal building permits". Names: 311, crime, permits. Returns the latest rows (newest-first). Pass `q` for a free-text filter; for full control use montreal_query.
Output schemas not formally documented. Responses are inferred from code (DatastoreResult, PackageSearchResult interfaces) but not exposed in tool definitions. LLMs cannot plan downstream calls without knowing return structure.
Error handling lacks recovery guidance. Errors like 'Unknown dataset' or 'CKAN error' do not suggest next steps. Per pattern:recovery-guide, errors should tell LLMs what to do: 'Unknown dataset. Use one of: 311, crime, permits.'
No tool annotations despite all tools being read-only. Adding readOnlyHint=true to all three tools would signal to agents that these are safe, non-destructive operations and can be retried without side effects.
| Scored | Grade | Overall | Spec posture | Rubric |
|---|---|---|---|---|
| 2026-09-23 | C | 60 | 2026-07-28+ | v2 |
montreal_query accepts 'filters' as a free-form object with no schema validation. Description says 'e.g. {"district":"B2"}' but does not specify valid field names, types, or constraints. LLMs may pass invalid filters.
Pagination support is incomplete. montreal_query accepts limit and offset but does not document total count in response or indicate whether more results exist. Agents cannot reliably iterate through large datasets.