Zurich Opendata Mcp — independently scanned and version-tracked by SaferSkills.
SaferSkills independently audited Zurich Opendata Mcp (Agent Skill) and scored it 100/100 (green). The audit ran 55 deterministic rules across Security, Supply Chain, Maintenance, Transparency, and Community; it found 0 high-severity and 0 lower-severity findings. The full rule-by-rule trace and per-finding evidence are below. Free, methodology-open.
Findings & checks · 0 flagged
Every scanned point with the score it earned and what moved between them.
First recorded scan — no prior version to compare against.
The primary manifest — the file an agent reads to learn what this artifact does.
🇨🇭 Part of the [Swiss Public Data MCP Portfolio](https://github.com/malkreide)
🌐 English | [Deutsch](README.de.md)
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: Claude using zurich_parking_live and zurich_air_quality
SSD, FD, PRD)NNNN/YYYY numberzurich://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# 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 .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 mcp add zurich-opendata -- python -m zurich_opendata_mcp.serverAdd to .vscode/settings.json:
{
"mcpServers": {
"zurich-opendata": {
"command": "python",
"args": ["-m", "zurich_opendata_mcp.server"]
}
}
}Once configured, you can ask Claude:
zurich_weather_livezurich_air_qualityzurich_water_weatherzurich_parking_livezurich_pedestrian_trafficzurich_geo_featureszurich_geo_layerszurich_parliament_searchzurich_parliament_memberssearch_stadtratsbeschluesseget_beschluesse_by_departementget_stadtratsbeschluss_detailzurich_tourismzurich_sparql| 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 |
| 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 |
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 |
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 # Markdown + error formatting
│ ├── 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# 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/rows and limit parameters conservatively. The server enforces a 30s timeout per request.Contributions are welcome — see CONTRIBUTING.md (Deutsch).
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.
MIT License — see LICENSE. All data used is published under open licenses (CC0 / Open by Default since 2021).
Hayal Oezkan · malkreide
Powered by [Model Context Protocol](https://modelcontextprotocol.io/) • 6 APIs • 24 Tools • 5 Resources
<!-- mcp-name: io.github.malkreide/zurich-opendata-mcp -->
<!-- BEGIN GENERATED: install -->
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"
]
}
}
}<!-- END GENERATED: install -->
~30 seconds. Free. No account. Every finding cites a rule and a line of evidence.