MCP server for accessing Toronto Open Data CKAN API and providing tools for dataset discovery, analysis, and insights
The Toronto MCP server demonstrates solid quality with well-named tools following verb_noun convention, comprehensive descriptions, and detailed JSON Schema definitions. All 14 tools have explicit input schemas with type definitions and parameter descriptions. However, output schemas are not documented in the tool registration (only visible in type definitions), and error handling lacks actionable recovery guidance. The server has no tool annotations (readOnlyHint, destructiveHint, idempotentHint) despite all tools being READ_ONLY, missing an opportunity for agent optimization. Descriptions are generally 50-200 characters, good length, but some compound operations (analyze_dataset_structure, get_dataset_insights) show potential composition issues.
Analyze the structure of a dataset including fields, data types, and resource information
Analyze update frequency patterns for datasets matching a query
Find datasets most relevant to a search query with relevance scoring
Discover available data categories including organizations and groups
Get comprehensive insights about datasets matching a query including relevance, update frequency, and structure
Get the first available datastore resource from a package and retrieve sample records
Fetch a CKAN package (dataset) by ID with optional summary view
Output schemas not documented in tool registration. While TypeScript types exist (CkanPackage, CkanSearchResult, etc.), the MCP tool definitions lack explicit return schema documentation visible to the LLM. This prevents agents from understanding what fields to expect or planning downstream operations.
Missing tool annotations for read-only operations. All 14 tools are marked Risk: READ_ONLY in documentation but lack readOnlyHint in MCP tool definition. This prevents agents from optimizing caching and parallelization strategies.
| Scored | Grade | Overall | Spec posture | Rubric |
|---|---|---|---|---|
| 2026-09-22 | C | 68 | 2026-07-28+ | v2 |
| 2026-03-09 | F | 0 | - | v1 |
Fetch a specific resource from the datastore with pagination support
Get detailed information about a specific resource
List all CKAN groups with full details
List all CKAN organizations with full details
List all available CKAN packages
Search CKAN packages by query with optional pagination
Advanced package search with faceting support
Error handling provides no recovery guidance. The ckanApiCall function throws generic errors like 'Failed to fetch from CKAN API: <message>' without telling agents what to do next (retry, adjust parameters, call alternative tool). Per pattern, errors should categorize as retryable, user-fixable, or fatal.
Compound operations suggest composition issues. 'analyze_dataset_structure' calls package_show + datastore_search internally; 'get_dataset_insights' combines search + relevance scoring + update frequency analysis + structure analysis. These should be separate tools so agents can compose them: agents may want insights without structure, or structure without relevance scoring.
Output result limits not enforced consistently. search_packages defaults to 100 results; find_relevant_datasets defaults to 10; list_packages returns all with no limit parameter. Inconsistent limits risk context window exhaustion.
Parameter dependencies undocumented. In analyze_dataset_structure and get_dataset_insights, the includeDataPreview/previewLimit parameters only apply when previewLimit is set, but this interdependency is not stated. Agents may pass contradictory combinations.
No idempotency guarantees. Agents retry on network timeouts or ambiguous failures. If a tool is not idempotent and the network fails mid-call, retry could cause duplicates. The codebase provides no idempotency tokens or upsert semantics, all tools are read-only so this is low-impact, but should be documented.