Zurich Open Data MCP Server
The Zurich Open Data MCP Server provides AI-powered access to 900+ open datasets and real-time data from the City of Zurich, Switzerland, through specialized tools and resources:
Open Data Catalog (CKAN)
Search 900+ datasets with full-text or SQL queries; retrieve metadata and download URLs
Browse 19 thematic categories and tags; analyze datasets for relevance, recency, and structure
Get catalog statistics and curated school-related datasets
Real-Time Environmental Data
Current weather (temperature, humidity, pressure, rain) from 4 UGZ stations
Live air quality (NO₂, O₃, PM10, PM2.5) with WHO thresholds
Lake Zurich data (water temperature, level, wind) updated every 10 minutes
Real-Time Mobility Data
Pedestrian counts on Bahnhofstrasse (3 locations, hourly)
VBZ public transit ridership across 800,000+ records
Real-time occupancy for 36 parking garages
Geodata (WFS/GeoJSON)
List 14 available layers (schools, districts, playgrounds, etc.) and fetch GeoJSON features with optional filtering
City Parliament & Council Resolutions
Search parliamentary proceedings (motions, interpellations, postulates) and council members by name, party, or commission
Full-text search of council resolutions by title, department, or date; retrieve resolutions by department or number
Tourism
Search attractions, restaurants, hotels, and events via Zürich Tourism API in multiple languages
Linked Data (SPARQL, opt-in)
Run SPARQL queries on the statistical linked data endpoint (experimental; enable with
ZURICH_OPENDATA_ENABLE_SPARQL=1)
MCP Resources
Access dataset metadata, category details, parking data, GeoJSON geodata, and tourism categories via
zurich://URIs
Click on "Install Server".
Wait a few minutes for the server to deploy. Once ready, it will show a "Started" state.
In the chat, type
@followed by the MCP server name and your instructions, e.g., "@Zurich Open Data MCP ServerWhat's the current air quality in Zurich?"
That's it! The server will respond to your query, and you can continue using it as needed.
Here is a step-by-step guide with screenshots.
🇨🇭 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. 23 Tools (+3 deprecated aliases), 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 4 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 (endpoint not productive yet — the tool is not registered by default; opt in with the environment variableZURICH_OPENDATA_ENABLE_SPARQL=1)
Stadtratsbeschlüsse (Council Resolutions)
zurich_strb_search– 📜 Full-text search of public council resolutions (title, department, date range)zurich_strb_by_department– 📜 List all resolutions of a department (e.g.SSD,FD,PRD)zurich_strb_detail– 📜 Single resolution byNNNN/YYYYnumber
(The former names search_stadtratsbeschluesse, get_beschluesse_by_departement and get_stadtratsbeschluss_detail remain available as deprecated aliases until the next major release.)
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
Related MCP server: mcp-swiss
🚀 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.serverCursor / 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" →
zurich_strb_search"List all SSD resolutions in 2025" →
zurich_strb_by_department"Show council resolution 1203/2025" →
zurich_strb_detail
Tourism
"What restaurants does Zurich Tourism recommend?" →
zurich_tourism
🔗 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 |
|
Base Maps |
|
Construction & Housing |
|
Population |
|
Education |
|
Energy |
|
Finance |
|
Leisure |
|
Health |
|
Crime |
|
Culture |
|
Mobility |
|
Politics |
|
Prices |
|
Social Affairs |
|
Tourism |
|
Environment |
|
Administration |
|
Economy |
|
📍 Available Geo Layers
Source of truth: GEOPORTAL_LAYERS in src/zurich_opendata_mcp/config.py.
Layer ID | Description |
| School facilities (kindergartens, schools, after-school care) |
| School district boundaries (polygons) |
| School-route crossings and hazard points |
| City district boundaries (polygons) |
| Public playgrounds |
| City district offices |
| Waste collection points |
| Sports facilities |
| Climate data (raster, temperatures, heat islands) |
| Educational trails |
| Polling stations |
| Social centres |
| Bicycle exam routes for schools |
| 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/ # respx round-trip, unit and live-marked tests
├── 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; transient upstream errors (connect failures, HTTP 502/503/504) are retried once with a short backoff.Data freshness: Real-time tools (parking, weather, air quality) reflect the upstream source at query time. Measurement data is never cached; only the lookup of the current per-year UGZ resource ID (weather/air quality) is cached in-process for 24h.
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 • 23 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"
]
}
}
}Maintenance
Resources
Unclaimed servers have limited discoverability.
Looking for Admin?
If you are the server author, to access and configure the admin panel.
Latest Blog Posts
- Who's Calling? MCP Hosts Are an Identity Blind Spot (And the Spec Knows It)By Om-Shree-0709 on .mcpAgent IdentityOAuth 2.1
- Your AI Chatbot Just Exposed Your CEO's Salary to an InternBy Om-Shree-0709 on .Agent IdentityMCP SecurityOAuth Delegation
- Why MCP Servers Need Execution Sandboxing (And Why Your Current Stack Isn't Enough)By Om-Shree-0709 on .Agentic AiPrompt InjectionWebAssembly
MCP directory API
We provide all the information about MCP servers via our MCP API.
curl -X GET 'https://glama.ai/api/mcp/v1/servers/malkreide/zurich-opendata-mcp'
If you have feedback or need assistance with the MCP directory API, please join our Discord server