MCP server for Swiss direct democracy data: Swissvotes (1848+), BFS opendata.swiss, SRGSSR Polis (1900+)
Swiss Democracy MCP demonstrates solid tool design with consistent naming patterns (all verb_noun: search_*, get_*, list_), complete input schemas with enums and descriptions, and clear documentation of data sources. All 10 tools have descriptions (avg 120 chars) and typed parameters. However, output schemas are not explicitly documented in the source code, only inferred from descriptions. Error handling is basic (ToolError raised but recovery guidance missing). No tool annotations visible (readOnlyHint, destructiveHint, idempotentHint). Parameter descriptions are adequate but lack format constraints (e.g., vote_number format '1995-01' stated in description but not in schema). Missing dependency hints for multi-step workflows (e.g., search before get_detail).
Retrieve real-time or archived vote results from BFS datasets by providing a result URL. Returns structured voting data with turnout and outcome percentages.
Retrieve cantonal (state-level) voting results for a specific federal popular vote, showing how each of the 26 cantons voted.
Retrieve official party positions (yes/no/neutral) for a specific federal popular vote across all major Swiss political parties.
Retrieve municipality-level voting results for a specific SRGSSR Polis votation. Requires SRGSSR credentials.
Retrieve detailed information for a specific SRGSSR Polis votation, including results and municipality-level breakdowns. Requires SRGSSR credentials.
Retrieve complete details for a specific federal popular vote by vote number (Abstimmungsnummer), including title, date, result, turnout, and party positions.
Output schemas not documented in source code. Tool descriptions mention 'structured envelope' and 'returns' but no explicit JSON Schema for response fields. LLMs cannot plan downstream calls or extract fields reliably.
No tool annotations (readOnlyHint, destructiveHint, idempotentHint) visible in source. All tools are read-only but this is not declared in the tool definition, LLMs cannot infer safety properties.
Inferred effective spec: <=2025-11-25.
| Scored | Grade | Overall | Spec posture | Rubric |
|---|---|---|---|---|
| 2026-09-23 | D | 52 | <=2025-11-25 | v2 |
List available BFS (Bundesamt für Statistik) real-time and archived vote result datasets from opendata.swiss, including national and cantonal voting data.
Search SRGSSR Polis historical elections (1900+) by keyword or year range. Requires SRGSSR_CONSUMER_KEY and SRGSSR_CONSUMER_SECRET environment variables.
Search SRGSSR Polis historical votations (1900+) by keyword or year range. Requires SRGSSR_CONSUMER_KEY and SRGSSR_CONSUMER_SECRET environment variables.
Search for federal popular votes by keyword, year range, or policy domain. Returns structured envelope with total count, matches, and pagination hints.
Parameter descriptions lack format constraints. vote_number described as 'e.g. 1995-01' but no regex or pattern in schema. result_url validated against allow-list server-side but constraint not documented in parameter description.
Error handling lacks recovery guidance. ToolError raised for invalid inputs but no actionable messages (e.g., 'vote_number not found; try democracy_search_votes() first'). Agents cannot self-correct.
Missing dependency hints in descriptions. Tools like democracy_get_vote_detail require a vote_number but do not hint that democracy_search_votes() should be called first if the number is unknown.