Skip to main content

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.

Python 3.11+ MCP Lizenz: MIT Open Data CI


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) oder pip

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.json im Projektordner oder ~/.cursor/mcp.json global
  • 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


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

swiss_statistics_mcp-0.1.0.tar.gz (23.6 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

swiss_statistics_mcp-0.1.0-py3-none-any.whl (17.6 kB view details)

Uploaded Python 3

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

Hashes for swiss_statistics_mcp-0.1.0.tar.gz
Algorithm Hash digest
SHA256 9cadb3abc6cff4eaddbe94bf28523a50fc362c9924de2f099e1978dbde5cf52a
MD5 da2039031bb25eb4037aaada819af9bc
BLAKE2b-256 570012222516ccf9c85ee0dfda960dad21d83d899bccc95bdf14c42f81a58e5b

See more details on using hashes here.

Provenance

The following attestation bundles were made for swiss_statistics_mcp-0.1.0.tar.gz:

Publisher: publish.yml on malkreide/swiss-statistics-mcp

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file swiss_statistics_mcp-0.1.0-py3-none-any.whl.

File metadata

File hashes

Hashes for swiss_statistics_mcp-0.1.0-py3-none-any.whl
Algorithm Hash digest
SHA256 116b9c2460f87f339d1d453bf36d2004e676831e374b0d2e1a12034fc4862e72
MD5 771b5a467699823209e02ea9c47a0e86
BLAKE2b-256 247580f3b85082f35aa1c307cbc06afedd33add1c8928d8bb6ae6900d688ea0e

See more details on using hashes here.

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

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page