Parliament OData, Swissvotes, referendums, voting results
Copy the AI prompt to install this server into Claude Code, Cursor, or another agent β or use 1-click editor setup below.
We haven't yet run this listing's install command through our automated sandbox check. This isn't a red flag β we're steadily working through the catalog.
π‘ Paste the JSON block into your client's configuration file under mcpServers, then restart the application.
π¨π Part of the Swiss Public Data MCP Portfolio β connecting AI models to Swiss institutional data sources.
π English | π©πͺ Deutsche Version
An MCP server providing access to Swiss direct democracy data, covering all federal popular votes since 1848 and elections since 1900.
β democracy_search_votes(keyword="AHV 21", year_from=2022)
β democracy_get_cantonal_results(vote_number="551")
β democracy_get_party_positions(vote_number="551")
β More use cases by audience β
| Source | Coverage | Auth |
|---|---|---|
| Swissvotes (Uni Bern) | All federal votes since 1848 Β· 874 columns Β· party positions Β· cantonal results | None β |
| BFS / opendata.swiss | Real-time & archive (since 1981) Β· municipality level | None β |
| SRGSSR Polis | Votes & elections since 1900 Β· municipality detail | OAuth2 key |
| Tool | Description |
|---|---|
democracy_search_votes | Search all federal popular votes since 1848 by keyword, date range, legal form, outcome, policy domain |
democracy_get_vote_detail | Full details for a specific vote: official title, parliamentary positions, national result, signatures |
democracy_get_party_positions | Party recommendations (FDP, SP, SVP, Die Mitte, GPS, GLP, β¦) with campaign finance data |
democracy_get_cantonal_results | Results for all 26 cantons: yes%, turnout, accepted flag |
democracy_list_vote_dates | List all voting dates with number of proposals per date |
| Tool | Description |
|---|---|
democracy_bfs_list_vote_dates | List all BFS voting dates (archive + current) |
democracy_bfs_get_vote_results | Real-time or archived results at national, cantonal, or municipality level |
| Tool | Description |
|---|---|
democracy_polis_list_votations | Historical votations since 1900 with municipality-level data |
democracy_polis_get_votation_detail | Full Polis detail, optionally with all municipality results |
democracy_polis_list_elections | National Council, Council of States, and cantonal elections since 1900 |
Add to claude_desktop_config.json:
The
SRGSSR_*variables are optional. Without them, all Swissvotes and BFS tools remain fully functional. Only the Polis tools require credentials.
MCP_HOST defaults to 127.0.0.1 (loopback). Set MCP_HOST=0.0.0.0 only
inside a sandboxed container/cloud deployment β never on a local machine, where
it would expose the server to your whole network.
Transport: stdio for Claude Desktop Β· Streamable HTTP for cloud/Render.com
Auth pattern: No-Auth-First β Swissvotes & BFS work without any credentials
Cache: Swissvotes CSV is loaded once at startup and cached for 24 hours
All configuration is via environment variables (see .env.example):
| Variable | Default | Purpose |
|---|---|---|
MCP_TRANSPORT | stdio | stdio (local) or streamable_http (cloud) |
MCP_HOST | 127.0.0.1 | HTTP bind address β set 0.0.0.0 only in a container |
MCP_PORT | 8000 | HTTP port |
LOG_LEVEL | INFO | structured JSON logs go to stderr |
MCP_CORS_ORIGINS | β | comma-separated CORS allow-origins for the HTTP transport. Empty means no browser client is permitted; * allows any origin and is logged as a warning. stdio clients are unaffected |
MCP_ALLOWED_HOSTS | β | comma-separated inbound Host allow-list. Only needed for a non-loopback bind |
SRGSSR_CONSUMER_KEY / SRGSSR_CONSUMER_SECRET | β | optional, only for democracy_polis_* tools |
Secrets are held as SecretStr and never logged. See
docs/secret-management.md and
docs/security.md.
This server intentionally exposes Tools only (no Resources or Prompts). It is
a Phase-1 read-only data wrapper (see docs/roadmap.md); the
tool surface is small (10 use-case-oriented tools) and every response is
self-contained with source provenance. Resources (e.g. vote://{anr}) are a
candidate for a later phase once the URI scheme stabilises.
This server speaks two protocol eras over the same endpoint. The client's first request on a connection decides which one applies; a later claim from the other era is refused.
| Era | Revision | Who reaches it |
|---|---|---|
initialize handshake | 2024-11-05 β¦ 2025-11-25 | What today's clients speak. The server answers with the revision asked for, or with the 2025-11-25 ceiling when the request asks for something newer. |
| Per-request envelope | 2026-07-28 | A request carrying the 2026-07-28 _meta envelope opens a modern connection. |
Both revisions are pinned in
tests/test_protocol_version.py and asserted
against the installed SDK, so a Dependabot bump of mcp cannot move either one
silently. This server builds no ASGI app to send an initialize through, so
the gate asserts the SDK constants rather than a measured response β the
weaker form, named rather than left unsaid.
Note that the SDK's LATEST_PROTOCOL_VERSION is an alias for the modern
era, not for the handshake era β pinning against it alone would leave the era
that current clients actually negotiate free to drift.
Update policy. When the gate fails, do not edit the constant blindly: read
the spec changelog between the two revisions, verify the server still behaves,
then move the constant, this section, README.de.md and
CHANGELOG.md together.
Combine with other servers in the Swiss Public Data MCP portfolio:
Example multi-server query:
Β«Vergleiche die Abstimmungsresultate zur AHV-Reform mit der Altersstruktur der KantoneΒ»
β swiss-democracy-mcp + swiss-statistics-mcp
No reviews yet β be the first to share how this listing worked for you.
Showcase your server listing on GitHub or your project documentation. Embed this dynamic SVG badge to highlight official listing status and live engagement.
[](https://allmcps.com/mcp/swiss-democracy-mcp)<a href="https://allmcps.com/mcp/swiss-democracy-mcp"><img src="https://allmcps.com/api/badge/swiss-democracy-mcp?style=directory" alt="Swiss Democracy MCP on AllMCPs" /></a>