MCP server for Swiss Federal Statistical Office (BFS) data via STAT-TAB PxWeb API
Project description
swiss-statistics-mcp
🇬🇧 English version → README_EN.md
Ein MCP-Server für den direkten Zugriff auf Schweizer Statistikdaten des Bundesamts für Statistik (BFS) via STAT-TAB PxWeb API — 682 Datensätze aus 21 Themengebieten, keine Authentifizierung erforderlich.
Was ist das?
Stellen Sie sich vor, Sie könnten einem KI-Assistenten eine Frage stellen wie: «Wie viele Schülerinnen und Schüler besuchen 2024 die Sekundarstufe I im Kanton Zürich?» — und das Modell antwortet nicht mit einer Schätzung, sondern mit echten, aktuellen Zahlen direkt aus der offiziellen BFS-Statistik.
Das ist die Kernidee dieses Servers. Er funktioniert wie ein Dolmetscher zwischen KI-Modell und der STAT-TAB-Datenbank des BFS: Das Modell fragt auf natürliche Weise, der Server übersetzt die Anfrage in API-Aufrufe und liefert strukturierte Daten zurück.
Anwendungsbeispiel aus dem Schulkontext: «Wie hat sich die Anzahl Lehrkräfte an Zürcher Volksschulen zwischen 2015 und 2023 entwickelt?» →
bfs_education_stats(topic="teachers", canton="Zürich")→ reale BFS-Zahlen, keine Halluzination.
Werkzeuge (Tools)
| Tool | Beschreibung |
|---|---|
bfs_featured_datasets |
Kuratierte Liste hochrelevanter Datensätze (Schwerpunkt Bildung und Demografie) |
bfs_list_themes |
Alle 21 BFS-Themen mit Anzahl verfügbarer Datensätze |
bfs_list_tables_by_theme |
Alle Tabellen eines Themas (z.B. "15" = Bildung und Wissenschaft) |
bfs_search_tables |
Freitextsuche über den gesamten Datenkatalog (682 Datensätze) |
bfs_get_table_metadata |
Variablen, Ausprägungen und Metadaten einer spezifischen Tabelle |
bfs_get_data |
Datenabruf mit optionalen Filtern nach Dimensionen und Werten |
bfs_education_stats |
Convenience-Tool: Lehrkräfte, Schüler/-innen, Szenarien, Stipendien |
bfs_population |
Wohnbevölkerung nach Kanton, Jahr, Altersstruktur oder Geschlecht |
bfs_compare_cantons |
Kantonsvergleich für eine beliebige Tabelle und ein beliebiges Merkmal |
Anwendungsbeispiele
# Bildung
Wie viele Lehrkräfte unterrichteten 2023 im Kanton Zürich?
→ bfs_education_stats(topic="teachers", canton="Zürich")
Wie entwickeln sich die Schülerzahlen der Sekundarstufe II bis 2031?
→ bfs_education_stats(topic="scenarios")
Welche Bildungsdaten gibt es zum Thema Stipendien?
→ bfs_education_stats(topic="grants")
# Bevölkerung
Wie gross ist die Bevölkerung im Kanton Zürich, aufgeteilt nach Alter (0–18)?
→ bfs_population(region="Zürich", breakdown="age")
Wie hat sich die Bevölkerung der Schweiz nach Geschlecht entwickelt?
→ bfs_population(breakdown="sex")
# Themensuche und Exploration
Welche Tabellen gibt es zum Thema Sozialhilfe?
→ bfs_list_tables_by_theme(theme_code="13")
Gibt es Daten zu Schulliegenschaften?
→ bfs_search_tables(query="Schulliegenschaften")
Welche Themengebiete bietet das BFS an?
→ bfs_list_themes()
# Kantonsvergleich
Vergleiche die Sozialhilfequote aller Kantone für 2022.
→ bfs_compare_cantons(table_id="13.2.2.3", variable="Kanton", year="2022")
Datenbasis
| Eigenschaft | Details |
|---|---|
| API | STAT-TAB PxWeb API v1 |
| Endpoint | https://www.pxweb.bfs.admin.ch/api/v1/ |
| Anbieter | Bundesamt für Statistik (BFS), Schweiz |
| Datensätze | 682 Tabellen in 21 Themengebieten |
| Sprachen | Deutsch (de), Französisch (fr), Italienisch (it), Englisch (en) |
| Lizenz | Open Government Data (OGD) — BFS-Nutzungsbedingungen |
| Authentifizierung | Keine — vollständig öffentlich zugänglich |
Themengebiete
| Code | Thema | Code | Thema |
|---|---|---|---|
| 01 | Bevölkerung | 12 | Geld, Banken, Versicherungen |
| 02 | Raum und Umwelt | 13 | Soziale Sicherheit |
| 03 | Arbeit und Erwerb | 14 | Gesundheit |
| 04 | Volkswirtschaft | 15 | Bildung und Wissenschaft |
| 05 | Preise | 16 | Kultur, Medien, Informationsgesellschaft |
| 06 | Industrie und Dienstleistungen | 17 | Politik |
| 07 | Land- und Forstwirtschaft | 18 | Öffentliche Verwaltung |
| 08 | Energie | 19 | Kriminalität und Strafrecht |
| 09 | Bau- und Wohnungswesen | 20 | Wirtschaftliche und soziale Situation |
| 10 | Tourismus | 21 | Nachhaltige Entwicklung |
| 11 | Mobilität und Verkehr |
Installation
Voraussetzungen
- Python ≥ 3.11
uvx(empfohlen) oderpip
Claude Desktop
Konfigurationsdatei öffnen:
- macOS:
~/Library/Application Support/Claude/claude_desktop_config.json - Windows:
%APPDATA%\Claude\claude_desktop_config.json
{
"mcpServers": {
"swiss-statistics": {
"command": "uvx",
"args": [
"--from",
"git+https://github.com/malkreide/swiss-statistics-mcp",
"swiss-statistics-mcp"
]
}
}
}
Claude Desktop neu starten — der Server ist danach direkt verfügbar.
Cursor / Windsurf / VS Code + Continue
Die Konfigurationssyntax ist identisch zu Claude Desktop. Die JSON-Datei heisst je nach Client:
- Cursor:
.cursor/mcp.jsonim Projektordner oder~/.cursor/mcp.jsonglobal - Windsurf:
~/.codeium/windsurf/mcp_config.json - VS Code + Continue:
.continue/config.json
{
"mcpServers": {
"swiss-statistics": {
"command": "uvx",
"args": [
"--from",
"git+https://github.com/malkreide/swiss-statistics-mcp",
"swiss-statistics-mcp"
]
}
}
}
LibreChat / Cline (SSE-Transport)
Für webbasierte oder remote betriebene Clients wird der SSE-Transport verwendet:
MCP_TRANSPORT=sse python -m swiss_statistics_mcp.server
# Startet auf Port 8052 (oder $PORT falls gesetzt)
In der Client-Konfiguration:
{
"mcpServers": {
"swiss-statistics": {
"url": "http://localhost:8052/sse"
}
}
}
Lokale Entwicklung
git clone https://github.com/malkreide/swiss-statistics-mcp
cd swiss-statistics-mcp
pip install -e .
Claude Desktop config für lokale Installation:
{
"mcpServers": {
"swiss-statistics": {
"command": "python",
"args": ["-m", "swiss_statistics_mcp.server"],
"env": {
"PYTHONPATH": "/absoluter/pfad/zu/swiss-statistics-mcp/src"
}
}
}
}
Deployment auf Render.com (SSE)
# Umgebungsvariable setzen
MCP_TRANSPORT=sse
# Startbefehl
python -m swiss_statistics_mcp.server
Der Server startet auf $PORT (Render.com setzt diese Variable automatisch).
Kompatibilität
Dieser Server implementiert das offene Model Context Protocol (MCP) und ist modellunabhängig — er funktioniert mit jedem MCP-kompatiblen Client.
| Client | Transport | Status |
|---|---|---|
| Claude Desktop | stdio | ✅ Unterstützt |
| Cursor | stdio | ✅ Unterstützt |
| Windsurf | stdio | ✅ Unterstützt |
| VS Code + Continue | stdio | ✅ Unterstützt |
| LibreChat | SSE | ✅ Unterstützt |
| Cline | stdio | ✅ Unterstützt |
| Self-hosted via mcp-proxy | SSE | ✅ Unterstützt |
Entwicklung und Tests
# Tests ohne Netzwerkzugriff (empfohlen für CI)
PYTHONPATH=src python -m pytest tests/ -m "not live"
# Live-Tests gegen die echte BFS-API
PYTHONPATH=src python -m pytest tests/ -m live -v
# Einzelnen Smoke-Test
PYTHONPATH=src python -c "
import asyncio
from swiss_statistics_mcp.server import bfs_list_themes
print(asyncio.run(bfs_list_themes()))
"
CI/CD
Der Server verwendet GitHub Actions mit einer Matrix über Python 3.11, 3.12 und 3.13. Jeder Push und Pull Request wird automatisch getestet (Ruff-Linting + pytest).
Verwandte Projekte
Weitere Open-Data MCP-Server von @malkreide:
| Server | Beschreibung |
|---|---|
| zurich-opendata-mcp | CKAN, Wetter, Luftqualität, Parkplätze, Gemeinderat Zürich |
| fedlex-mcp | Schweizer Bundesrecht via Fedlex SPARQL |
| swiss-transport-mcp | OJP Reiseplanung, SIRI-SX Störungen, Tarife |
| swiss-road-mobility-mcp | Shared Mobility, E-Ladestationen, Verkehrsdaten |
| global-education-mcp | UNESCO UIS und OECD Education at a Glance |
| eth-library-mcp | ETH-Bibliothek Katalogsuche |
| patent-mcp | EPO Open Patent Services + IGE/Swissreg |
Lizenz
MIT — siehe LICENSE
Daten: Open Government Data (OGD) des Bundesamts für Statistik (BFS). Nutzung gemäss BFS-Nutzungsbedingungen.
Entwickelt von @malkreide · Nicht offiziell affiliiert mit dem BFS · Beiträge willkommen
Project details
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file swiss_statistics_mcp-0.1.0.tar.gz.
File metadata
- Download URL: swiss_statistics_mcp-0.1.0.tar.gz
- Upload date:
- Size: 23.6 kB
- Tags: Source
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.7
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
9cadb3abc6cff4eaddbe94bf28523a50fc362c9924de2f099e1978dbde5cf52a
|
|
| MD5 |
da2039031bb25eb4037aaada819af9bc
|
|
| BLAKE2b-256 |
570012222516ccf9c85ee0dfda960dad21d83d899bccc95bdf14c42f81a58e5b
|
Provenance
The following attestation bundles were made for swiss_statistics_mcp-0.1.0.tar.gz:
Publisher:
publish.yml on malkreide/swiss-statistics-mcp
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
swiss_statistics_mcp-0.1.0.tar.gz -
Subject digest:
9cadb3abc6cff4eaddbe94bf28523a50fc362c9924de2f099e1978dbde5cf52a - Sigstore transparency entry: 1196999650
- Sigstore integration time:
-
Permalink:
malkreide/swiss-statistics-mcp@b721ab2ac5d90d733bfc13a6ec9fedf30b1ff9fa -
Branch / Tag:
refs/tags/v0.1.0 - Owner: https://github.com/malkreide
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
publish.yml@b721ab2ac5d90d733bfc13a6ec9fedf30b1ff9fa -
Trigger Event:
release
-
Statement type:
File details
Details for the file swiss_statistics_mcp-0.1.0-py3-none-any.whl.
File metadata
- Download URL: swiss_statistics_mcp-0.1.0-py3-none-any.whl
- Upload date:
- Size: 17.6 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.7
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
116b9c2460f87f339d1d453bf36d2004e676831e374b0d2e1a12034fc4862e72
|
|
| MD5 |
771b5a467699823209e02ea9c47a0e86
|
|
| BLAKE2b-256 |
247580f3b85082f35aa1c307cbc06afedd33add1c8928d8bb6ae6900d688ea0e
|
Provenance
The following attestation bundles were made for swiss_statistics_mcp-0.1.0-py3-none-any.whl:
Publisher:
publish.yml on malkreide/swiss-statistics-mcp
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
swiss_statistics_mcp-0.1.0-py3-none-any.whl -
Subject digest:
116b9c2460f87f339d1d453bf36d2004e676831e374b0d2e1a12034fc4862e72 - Sigstore transparency entry: 1196999663
- Sigstore integration time:
-
Permalink:
malkreide/swiss-statistics-mcp@b721ab2ac5d90d733bfc13a6ec9fedf30b1ff9fa -
Branch / Tag:
refs/tags/v0.1.0 - Owner: https://github.com/malkreide
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
publish.yml@b721ab2ac5d90d733bfc13a6ec9fedf30b1ff9fa -
Trigger Event:
release
-
Statement type: