Zurich Open Data MCP Server
Enables Claude, ChatGPT, and other MCP-compatible AI assistants to directly query 900+ datasets, geodata, parliamentary proceedings, tourism data, linked data, and real-time environmental and mobility information from the City of Zurich. 20 Tools, 6 Resources, 6 APIs.
Dokumentasi
π¨π Part of the Swiss Public Data MCP Portfolio
ποΈ Zurich Open Data MCP Server
π English | Deutsch
An MCP (Model Context Protocol) server providing AI-powered access to Open Data from the City of Zurich, Switzerland.
Enables Claude, ChatGPT, and other MCP-compatible AI assistants to directly query 900+ datasets, geodata, parliamentary proceedings, council resolutions, tourism data, linked data, and real-time environmental and mobility information from the City of Zurich. 24 Tools, 5 Resources, 6 APIs.
Demo
β¨ Features
CKAN Open Data (data.stadt-zuerich.ch)
zurich_search_datasetsβ Full-text search with Solr syntax across 900+ datasetszurich_get_datasetβ Complete metadata and download URLs for a datasetzurich_datastore_queryβ Query tabular data directly (filters, sorting)zurich_datastore_sqlβ SQL queries on the DataStorezurich_list_categoriesβ Browse 19 thematic categorieszurich_list_tagsβ Tag-based thematic search
Real-Time Environmental Data
zurich_weather_liveβ π€οΈ Current weather (temperature, humidity, pressure, rain) from 5 UGZ stationszurich_air_qualityβ π¬οΈ Live air quality (NOβ, Oβ, PM10, PM2.5) with WHO thresholdszurich_water_weatherβ π Lake Zurich data (water temperature, level, wind) every 10 min
Real-Time Mobility Data
zurich_pedestrian_trafficβ πΆ Pedestrian counts on Bahnhofstrasse (3 locations, hourly)zurich_vbz_passengersβ π VBZ public transit ridership (800,000+ records, all lines/stops)zurich_parking_liveβ π ΏοΈ Real-time occupancy of 36 parking garages (ParkenDD)
Geoportal (WFS Geodata)
zurich_geo_layersβ π List 14 available geodata layerszurich_geo_featuresβ π Fetch GeoJSON features (schools, districts, playgrounds, climate data, etc.)
City Parliament (Paris API)
zurich_parliament_searchβ ποΈ Search parliamentary proceedings (interpellations, motions, postulates)zurich_parliament_membersβ ποΈ Search council members (party, commissions, mandates)
Zurich Tourism
zurich_tourismβ π¨ Attractions, restaurants, hotels, events (Schema.org data, 4 languages)
Linked Data (SPARQL)
zurich_sparqlβ π SPARQL queries on the statistical linked data endpoint (currently disabled β endpoint not productive yet)
StadtratsbeschlΓΌsse (Council Resolutions)
search_stadtratsbeschluesseβ π Full-text search of public council resolutions (title, department, date range)get_beschluesse_by_departementβ π List all resolutions of a department (e.g.SSD,FD,PRD)get_stadtratsbeschluss_detailβ π Single resolution byNNNN/YYYYnumber
Analysis Tools
zurich_analyze_datasetsβ Comprehensive analysis: relevance, recency, data structurezurich_catalog_statsβ Catalog overview with statisticszurich_find_school_dataβ Curated search for education-related datasets
MCP Resources
zurich://dataset/{name}β Dataset metadatazurich://category/{group_id}β Category detailszurich://parkingβ Current parking datazurich://geo/{layer_id}β GeoJSON geodata (14 layers)zurich://tourism/categoriesβ Tourism categories
π Installation
Prerequisites
- Python 3.11+
- pip or uv
Install
# Clone
git clone https://github.com/malkreide/zurich-opendata-mcp.git
cd zurich-opendata-mcp
# Install
pip install -e .
# Or with uv
uv pip install -e .
βοΈ Configuration
Claude Desktop
Edit ~/Library/Application Support/Claude/claude_desktop_config.json (macOS):
{
"mcpServers": {
"zurich-opendata": {
"command": "python",
"args": ["-m", "zurich_opendata_mcp.server"],
"env": {}
}
}
}
Alternatively, using the installed command:
{
"mcpServers": {
"zurich-opendata": {
"command": "zurich-opendata-mcp"
}
}
}
Claude Code (CLI)
claude mcp add zurich-opendata -- python -m zurich_opendata_mcp.server
Cursor / VS Code
Add to .vscode/settings.json:
{
"mcpServers": {
"zurich-opendata": {
"command": "python",
"args": ["-m", "zurich_opendata_mcp.server"]
}
}
}
π¬ Example Queries
Once configured, you can ask Claude:
Open Data
- "What datasets are available about schools in Zurich?"
- "Show me school holidays for public schools"
- "Analyze the available geodata"
Real-Time Data
- "What's the current temperature in Zurich?" β
zurich_weather_live - "How is the air quality today?" β
zurich_air_quality - "What's the water temperature in Lake Zurich?" β
zurich_water_weather - "How many parking spaces are free right now?" β
zurich_parking_live - "How many people are on Bahnhofstrasse right now?" β
zurich_pedestrian_traffic
Geodata
- "Show me all school facilities in Zurich as GeoJSON" β
zurich_geo_features - "What geodata layers are available?" β
zurich_geo_layers - "Where are the playgrounds in Zurich?"
City Parliament
- "What parliamentary motions about schools were filed?" β
zurich_parliament_search - "Which council members belong to the SP party?" β
zurich_parliament_members
Council Resolutions (StadtratsbeschlΓΌsse)
- "Find council resolutions about Volksschule from 2025" β
search_stadtratsbeschluesse - "List all SSD resolutions in 2025" β
get_beschluesse_by_departement - "Show council resolution 1203/2025" β
get_stadtratsbeschluss_detail
Tourism & Statistics
- "What restaurants does Zurich Tourism recommend?" β
zurich_tourism - "How has Zurich's population evolved?" β
zurich_sparql
π Data Sources
| API | Endpoint | Data |
|---|---|---|
| CKAN | data.stadt-zuerich.ch/api/3/ | 900+ open datasets |
| Geoportal WFS | ogd.stadt-zuerich.ch/wfs/geoportal | 14 geodata layers (GeoJSON) |
| Paris API | gemeinderat-zuerich.ch/api | Parliamentary proceedings & members |
| Zurich Tourism | zuerich.com/en/api/v2/data | Attractions, restaurants, hotels |
| SPARQL | ld.stadt-zuerich.ch/query | Linked Open Data / statistics |
| ParkenDD | api.parkendd.de/Zuerich | Real-time parking occupancy |
π Available Data Categories
| Category | ID |
|---|---|
| Employment | arbeit-und-erwerb |
| Base Maps | basiskarten |
| Construction & Housing | bauen-und-wohnen |
| Population | bevolkerung |
| Education | bildung |
| Energy | energie |
| Finance | finanzen |
| Leisure | freizeit |
| Health | gesundheit |
| Crime | kriminalitat |
| Culture | kultur |
| Mobility | mobilitat |
| Politics | politik |
| Prices | preise |
| Social Affairs | soziales |
| Tourism | tourismus |
| Environment | umwelt |
| Administration | verwaltung |
| Economy | volkswirtschaft |
π Available Geo Layers
Source of truth: GEOPORTAL_LAYERS in src/zurich_opendata_mcp/config.py.
| Layer ID | Description |
|---|---|
schulanlagen | School facilities (kindergartens, schools, after-school care) |
schulkreise | School district boundaries (polygons) |
schulwege | School-route crossings and hazard points |
stadtkreise | City district boundaries (polygons) |
spielplaetze | Public playgrounds |
kreisbuero | City district offices |
sammelstelle | Waste collection points |
sport | Sports facilities |
klimadaten | Climate data (raster, temperatures, heat islands) |
lehrpfade | Educational trails |
stimmlokale | Polling stations |
sozialzentrum | Social centres |
velopruefstrecken | Bicycle exam routes for schools |
familienberatung | Family-counselling meeting points |
ποΈ Project Structure
zurich-opendata-mcp/
βββ src/zurich_opendata_mcp/
β βββ __init__.py
β βββ app.py # Shared FastMCP instance
β βββ server.py # Console entry + back-compat re-exports
β βββ config.py # Endpoints, layer maps, resource IDs
β βββ http_client.py # Shared httpx client + CKAN wrapper
β βββ formatters.py # CKANβmodel mapping + Markdown rendering
β βββ models.py # Pydantic structured-output models
β βββ clients/ # API clients: paris, sparql, tourism, wfs
β βββ tools/ # @mcp.tool implementations:
β # catalog, datastore, geo, parliament,
β # realtime, sparql, strb, tourism,
β # resources (zurich:// URIs)
βββ tests/
β βββ test_server.py # Pydantic + integration tests (live-marked)
βββ audits/ # Code-audit reports
βββ .github/workflows/ # ci.yml + publish.yml (Trusted Publisher)
βββ pyproject.toml
βββ README.md / README.de.md
βββ CONTRIBUTING.md / .de.md
βββ SECURITY.md / .de.md
βββ CHANGELOG.md
βββ CLAUDE.md # Project conventions for Claude
βββ LICENSE
βββ claude_desktop_config.json
π§ͺ Development
# Install dev dependencies
pip install -e ".[dev]"
# Unit + validation tests (no network)
pytest tests/ -m "not live"
# Live integration tests (against live APIs β opt-in)
pytest tests/ -m live
# Linting
ruff check src/ tests/
Safety & Limits
- Read-only: All tools perform HTTP GET requests only β no data is written, modified, or deleted.
- No personal data: The APIs return open civic datasets (parking occupancy, weather readings, parliamentary proceedings). No personally identifiable information (PII) is processed or stored by this server.
- Rate limits: CKAN Solr search and ParkenDD are public APIs without documented rate limits; use
rowsandlimitparameters conservatively. The server enforces a 30s timeout per request. - Data freshness: Real-time tools (parking, weather, air quality) reflect the upstream source at query time. No caching is performed by this server.
- Terms of service: Data is subject to the ToS of each source β data.stadt-zuerich.ch, ParkenDD, gemeinderat-zuerich.ch. All City of Zurich data is published under CC0 (Open by Default since 2021).
- No guarantees: This server is a community project, not affiliated with the City of Zurich or any of the API providers. Availability depends on upstream APIs.
π€ Contributing
Contributions are welcome β see CONTRIBUTING.md (Deutsch).
π Security
Read-only, no PII, no authentication, a fixed set of public-data endpoints. See SECURITY.md (Deutsch) for the full security posture and accepted-risk decisions.
π License
MIT License β see LICENSE. All data used is published under open licenses (CC0 / Open by Default since 2021).
π€ Author
Hayal Oezkan Β· malkreide
Powered by Model Context Protocol β’ 6 APIs β’ 24 Tools β’ 5 Resources
Installation
Run via uv's uvx β no clone or manual install needed. Add to your MCP client config (mcpServers for Claude Desktop, Cursor and Windsurf; use a top-level servers key for VS Code in .vscode/mcp.json):
{
"mcpServers": {
"zurich-opendata-mcp": {
"command": "uvx",
"args": [
"zurich-opendata-mcp"
]
}
}
}