MCP server for Swiss direct democracy: Swissvotes (1848+), BFS opendata.swiss, SRGSSR Polis (1900+)
Drift inferred · capture-to-capture
tool count over time
tools
-
democracy_bfs_get_vote_results
Real-time or archived results at national, cantonal, or municipality level
-
democracy_bfs_list_vote_dates
List all BFS voting dates (archive + current)
-
democracy_get_cantonal_results
Results for all 26 cantons: yes%, turnout, accepted flag
-
democracy_get_party_positions
Party recommendations (FDP, SP, SVP, Die Mitte, GPS, GLP, …) with campaign finance data
-
democracy_get_vote_detail
Full details for a specific vote: official title, parliamentary positions, national result, signatures
-
democracy_list_vote_dates
List all voting dates with number of proposals per date
-
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
-
democracy_polis_list_votations
Historical votations since 1900 with municipality-level data
-
democracy_search_votes
Search all federal popular votes since 1848 by keyword, date range, legal form, outcome, policy domain
analyzed commit 4da7514 · analyzer v33 · 1w ago
skills & prompt files 1
- agent-rules malkreide-swiss-democracy-mcp-4da7514/CLAUDE.md
danger signals1
- suspicious endpoint 169.254.169.254 (cloud metadata) malkreide-swiss-democracy-mcp-4da7514/tests/test_server.py :443
result_url="http://169.254.169.254/latest/meta-data/", level="national"
code files: 15
filesystem 9
- fs malkreide-swiss-democracy-mcp-4da7514/audits/2026-06-02T031038-Z-swiss-democracy-mcp/_gen_findings.py :8
from pathlib import Path - fs malkreide-swiss-democracy-mcp-4da7514/audits/2026-06-02T035936-Z-swiss-democracy-mcp/_gen_findings.py :8
from pathlib import Path - fs (weak) malkreide-swiss-democracy-mcp-4da7514/scripts/check_ruff_pin.py :35
import shutil - fs (weak) malkreide-swiss-democracy-mcp-4da7514/scripts/check_version_sync.py :35
from pathlib import Path - fs (weak) malkreide-swiss-democracy-mcp-4da7514/scripts/classify_live_run.py :55
from pathlib import Path - fs (weak) malkreide-swiss-democracy-mcp-4da7514/scripts/record_fixtures.py :34
from pathlib import Path - fs (weak) malkreide-swiss-democracy-mcp-4da7514/tests/fixture_data.py :16
from pathlib import Path - fs (weak) malkreide-swiss-democracy-mcp-4da7514/tests/test_classify_live_run.py :21
from pathlib import Path - fs (weak) malkreide-swiss-democracy-mcp-4da7514/tests/test_live_abdeckung.py :25
import pathlib
shell / exec 1
- shell (weak) malkreide-swiss-democracy-mcp-4da7514/scripts/check_ruff_pin.py :36
import subprocess
network 6
- net malkreide-swiss-democracy-mcp-4da7514/audits/2026-06-02T031038-Z-swiss-democracy-mcp/_gen_findings.py :41
"Kein Lifespan/Dependency-Injection; `httpx.AsyncClient` wird pro Call erzeugt (siehe SDK-001)"], - net malkreide-swiss-democracy-mcp-4da7514/audits/2026-06-02T035936-Z-swiss-democracy-mcp/_gen_findings.py :76
["Geteilter, gepoolter `httpx.AsyncClient` via @asynccontextmanager-Lifespan; Cleanup im finally"],[], "","","",""), - net (weak) malkreide-swiss-democracy-mcp-4da7514/scripts/record_fixtures.py :36
import httpx - net malkreide-swiss-democracy-mcp-4da7514/src/swiss_democracy_mcp/server.py :32
import socket - net (weak) malkreide-swiss-democracy-mcp-4da7514/tests/test_response_shape.py :21
import httpx - net (weak) malkreide-swiss-democracy-mcp-4da7514/tests/test_server.py :11
import httpx
declared dependencies 10
- mcp@>=2.0.0,<3
- httpx@>=0.27.0
- pydantic@>=2.0.0
- pydantic-settings@>=2.0.0
- structlog@>=24.1.0,<27
- pytest@>=8.0.0
- pytest-asyncio@>=0.23.0
- respx@>=0.21.0
- .@*
- ruff@==0.16.1