The design decision that matters for agents is `get_city_overview`: it returns the catalogue of what exists for that city plus live highlights in one shot, so the model sees the full breadth rather than stopping at the weather. The generic `get_city_resource` then covers the long tail without bloating the tool list. Field names are English snake_case and stable; some responses still carry older German duplicates with identical values, and the docs are explicit that those are deprecated — use the canonical names.
A hosted MCP server over a normalising layer for German public open data. German cities publish plenty, but every source has its own format, fields and registration; InfraNode maps 25+ upstream sources — DWD, UBA, Mobilithek/DELFI, VBB, GovData, OpenStreetMap, Bundesnetzagentur, KBA and others — onto one canonical response shape, and serves the result over a remote endpoint with no API key and no account.
- A single call that returns a city's base data, a catalogue of all 82 data types with coverage status, and a live snapshot of the headline values — the intended entry point — `get_city_overview`
- Any of those 82 data types fetched by its resource key, so one tool covers everything without 82 tool definitions in your context — `get_city_resource`
- Named tools for the ones you reach for constantly: current observations, official air quality, points of interest by type, and a city's base record — `weather`, `air_quality`, `pois`, `get_city`
- Live rail boards by EVA station number, including local trains and disruptions, and live public-transport departures with real-time delays — `station_board_departures`, `station_board_arrivals`, `transit_departures`
- Coverage and provenance you can check: every covered city listed, and every source with its licence, attribution and status — `list_cities`, `sources`
- One data type compared across several cities in a single call — `compare`
- Ready-made prompts `city_briefing`, `compare_air_quality`, `commute_check` and the resources `infranode://cities` and `infranode://sources`
- Every tool annotated `readOnlyHint: true`, `destructiveHint: false`, `idempotentHint: true`, so a client can auto-approve them safely
Nothing — no account, no key, read-only. Point any client at the Streamable HTTP endpoint `https://mcp.infranode.dev/mcp`; with Claude Code that is `claude mcp add --transport http infranode https://mcp.infranode.dev/mcp`. Self-hosting is optional and documented, with the API stack under Docker Compose and the MCP server over stdio against the public API. Every response carries `attribution` per record and `meta.source_status`, so a dead upstream degrades to a status flag instead of failing the call — and the data licences require you to pass that attribution through.
One command — claude mcp add --transport http infranode https://mcp.infranode.dev/mcp
