InfraNode
InfraNode is a keyless, read-only MCP server providing normalized access to ~20 categories of German public infrastructure open data across 84+ cities via 38 tools. No API keys, accounts, or local installation required. All responses use a consistent { data, meta } envelope with attribution and source status, and degrade gracefully if an upstream source fails.
Discovery
list_cities– List covered cities with slugs, state, population, and coveragesources– Browse data sources with license and attribution infocompare– Fetch one resource (e.g., weather, air quality) across multiple cities at onceget_city/geo– City master data (population, area, geography, boundaries)
Weather & Environment
weather– Current weather (DWD)weather_warnings– Official DWD weather warningsair_quality/air_quality_live– Historical (UBA) and live (OpenAQ) air quality (PM10, NO2, etc.)pollen_uv– Pollen count and UV index (DWD)water_level– River gauge levels (PEGELONLINE)flood– Flood warning levels
Mobility & Transport
transit/transit_departures– Public transit stops and live ÖPNV departures with real-time delaysstation_departures/station_arrivals– Live long-distance train departures/arrivals (DB)traffic/road_events– Highway and inner-city construction/traffic alertswebcams– Traffic webcamscharging– EV charging station locationssharing– Bike/scooter sharing vehicles and stationsfuel_prices– Current fuel prices (average/minimum per type)
City, Demographics & Society
demographics/indicators– Demographic and socioeconomic indicators (GENESIS/INKAR/BBSR)unemployment– Unemployed count and rate per districttourism– Guest overnight stays and arrivalsconstruction– Building permits (residential buildings/units)accidents– Road traffic accidents per district (Unfallatlas)health/icu_live– Hospital directory and live ICU bed utilization (DIVI)holidays– Public holidays by city/federal stateelection– Election resultsevents– City events and public gatheringspois– Points of interest by type (hospital, school, pharmacy, restaurant, police, kindergarten)
Energy & Vehicles
power_load– Daily electricity grid load (SMARD)power_price– Day-ahead electricity exchange price (SMARD)energy– Energy/plant indicators (Marktstammdatenregister)vehicle_registrations– Car stock and EV share per registration district (KBA)
Provides read-only access to city data from OpenStreetMap, including points of interest, traffic, and construction sites for German cities.
Provides read-only access to city master data from Wikidata for German cities, such as population, area, and administrative details.
InfraNode
A keyless, remote MCP server for German public-infrastructure open data.
German cities publish a lot of open data, but every source has its own format, fields and quirks, and several need portal registration. InfraNode normalizes ~20 categories, weather, air quality, public transit (incl. realtime departures), traffic, parking, charging, water levels, demographics, energy and more, for 84+ German cities behind one interface, and serves it as an MCP server. 38 read-only tools, no API key, no account, no install.
Sources include the Deutscher Wetterdienst (DWD), Umweltbundesamt (UBA), Mobilithek/DELFI, GovData, OpenStreetMap, Bundesnetzagentur, KBA, DIVI and more.
Connect
One line with Claude Code:
claude mcp add --transport http infranode https://mcp.infranode.dev/mcpAny other MCP client, point it at the remote endpoint (Streamable HTTP):
{
"mcpServers": {
"infranode": { "url": "https://mcp.infranode.dev/mcp" }
}
}Cursor / Windsurf: add the block above to
~/.cursor/mcp.json(or the app's MCP settings).VS Code:
code --add-mcp '{"name":"infranode","url":"https://mcp.infranode.dev/mcp"}'Claude Desktop: add the same
mcpServersblock to yourclaude_desktop_config.json.ChatGPT: add a connector with the URL
https://mcp.infranode.dev/mcp.
Full install guide, the complete tool manifest with example outputs, the permission model and an example transcript are in docs/mcp-install.md. The registry manifest is server.json.
Related MCP server: mcp-swiss
Example
Ask your agent something like "What's the weather in Cologne right now?" and it
calls weather:
// weather(slug="koeln")
{
"data": {
"city_slug": "koeln",
"observed_at": "2026-06-18T13:00:00Z",
"source": "dwd",
"attribution": { "text": "Datenbasis: Deutscher Wetterdienst", "modified": true },
"payload": { "kind": "weather", "temperature_c": 30.4, "humidity": 43.0, "station_id": "02667" }
},
"meta": { "source_status": "ok", "cache_status": "hit", "correlation_id": "..." }
}Every response follows the same { data, meta } envelope: each record carries
its attribution (license + source), and meta.source_status tells you whether
the upstream source delivered data, so a dead source degrades gracefully instead
of failing the call.
Tip: call
list_citiesfirst to discover valid city slugs (e.g.koeln,berlin,hamburg), then call any city-scoped tool.
Tools (38)
Group | Tools |
Discovery |
|
Weather & environment |
|
Mobility |
|
City & people |
|
Energy & vehicles |
|
All tools are annotated readOnlyHint: true / destructiveHint: false /
idempotentHint: true, so MCP clients can safely auto-allow them.
Prompts & resources
Prompts:
city_briefing,compare_air_quality,commute_check, ready-made flows that chain several tools.Resources:
infranode://citiesandinfranode://sources, browse the coverage catalog without a tool call.
How it behaves
Keyless & read-only. No credentials, no writes, no user accounts.
Canonical envelope.
{ data, meta }with per-source status and attribution.Graceful degradation. A failing upstream returns
source_status, not an error.Safe by design. SSRF and injection gates validate every request; inputs are checked against fixed allowlists.
See SECURITY.md for the security model.
Self-host (optional)
You don't need to, the hosted endpoint above is the fastest path. But the code is open. Run the API stack locally with Docker (Compose v2):
cp .env.example .env # example config, contains NO real secrets
docker compose -f deploy/docker-compose.yml up
curl http://localhost/api/v1/health # -> {"status":"ok","version":"1.0.0","redis":true}To run the MCP server itself locally over stdio (against the public API):
uv sync --group mcp
INFRANODE_MCP_API_BASE=https://infranode.dev/api/v1 uv run python -m infranode.mcp.serverAll settings use the INFRANODE_ env prefix (see .env.example); each data
source is toggled by its own INFRANODE_ENABLE_* flag. Real secrets are never
committed, only .env.example is versioned and CI runs a gitleaks scan.
License: code and data are separate
Code: Apache-2.0 (see LICENSE).
Data: the open data served through InfraNode keeps the licenses of its upstream sources (e.g. ODbL for OpenStreetMap, DL-DE-BY for GovData, attribution for DWD). These data licenses and attribution are tracked separately in
DATA-LICENSES.md. The Apache-2.0 license covers only the API source code, not the passed-through data.
Contributing
Contributions are welcome. Setup, gate commands and the secret rule are in CONTRIBUTING.md.
Maintenance
Latest Blog Posts
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/street1983nk/infranode'
If you have feedback or need assistance with the MCP directory API, please join our Discord server