MCP server for Elections Canada data providing access to Canadian federal election data from 2021 with tools to query and analyze election results by riding, province, and party
Elections Canada server has 7 well-named, read-only tools with clear descriptions (avg 156 chars, within baseline 194). All tools have input schemas with type definitions. However, parameter descriptions are sparse or missing for optional params (e.g., party_code in get_party_votes lacks detail on format/valid values). Output schemas are not documented, LLMs cannot predict response structure for chaining. Error handling is minimal (basic 'not found' messages without recovery guidance). No tool annotations (readOnlyHint present implicitly via Risk field, but not in schema). Composition is sound, each tool has one responsibility, but no pagination support for potentially large result sets (search_ridings, find_closest_ridings).
Get the best and worst results for a specific party across all ridings.
Find the closest ridings in the 2021 Canadian federal election based on vote margin (difference between first and second place).
Get vote distribution for a specific party in a riding, or all parties if no party code is provided.
Get the party that won a specific riding.
Search for ridings by name. This search is accent-insensitive and ignores spaces and hyphens, so searches like 'montreal' will match 'Montréal' and 'st laurent' will match 'Saint-Laurent'.
Summarize national election results for the 2021 Canadian federal election, showing seats won, votes received, and vote percentages for each party across Canada. Returns: JSON with summary statistics including seat counts, vote counts, and vote percentages for each party at the national level.
Output schemas not documented. LLMs cannot predict response structure (fields, types, nesting) for downstream tool chaining or data extraction. E.g., search_ridings returns array of objects with ridingCode/ridingName/province/provinceName, but this is not declared in tool definition.
Optional parameters lack format/constraint descriptions. party_code in get_party_votes accepts 'LPC', 'Liberal', or party name, but description does not specify valid formats or examples. LLMs may pass invalid values.
Error handling lacks recovery guidance. Errors return bare 'not found' messages without suggesting next steps (e.g., 'Riding code 99999 not found. Try search_ridings() to find valid codes.').
Inferred effective spec: <=2025-11-25.
| Scored | Grade | Overall | Spec posture | Rubric |
|---|---|---|---|---|
| 2026-09-23 | D | 59 | <=2025-11-25 | v2 |
Summarize election results for a province, showing seats won, votes received, and vote percentages for each party. Args: province_name_or_code: Province name or code (e.g., 'Ontario', 'ON', 'Quebec', 'QC') Handles variations in spelling and language. Returns: JSON with summary statistics including seat counts, vote counts, and vote percentages for each party in the specified province.
No pagination support. search_ridings and find_closest_ridings may return large result sets (338 ridings in Canada). Without limit/offset or cursor, results could exceed context window. Baseline pattern requires pagination for list-returning tools.
Tool annotations missing from schema. Risk field in metadata indicates read-only tools, but readOnlyHint is not present in input schema. LLMs cannot infer safety/idempotency from tool definition alone.