InfraNode

SSE

by street1983nk

316 downloads Not rated yet
GitHub SSE

About

Keyless open data for 84 German cities: 12 lean read-only MCP tools covering 64 data types (weather, air quality, public transit with live delays, parking, charging, energy, solar, statistics and more). Official German sources (DWD, UBA, DB, city portals), license and attribution

Details

Transport
SSE

Explore

Setting up with Highlight

This MCP is not yet compatible with Highlight’s one-click setup. However, you can still use it with Highlight by following these steps:

  1. Download and install Highlight from highlightai.com/download
  2. Navigate to the plugins tab and select "Add Custom Plugin"
  3. Configure the plugin with the settings below
    Plugin Name InfraNode
    Command (node, npx, python, etc.)

    Please refer to the README for specific instructions on how to obtain API keys or other required environment variables.

  4. Enable "Start Automatically" if you want the plugin to start when Highlight launches

From the repository

Connect any MCP client to the remote endpoint at https://mcp.infranode.dev/mcp. No installation, configuration, or API key is needed. Simply point your client to that URL and the 12 tools become

get_city

Get base data for a German city (population, area, coordinates). Sourced from Wikidata. Read-only. Useful as a first lookup to confirm a city exists and get its core attributes. For a broader question about the city (what data is available at all) use ``get_city_overview`` instead.

get_city_overview

Get a ONE-CALL overview of everything InfraNode knows about a German city. Start here for any city question. Returns: the city's base data, a CATALOG of all 81 available data types (weather, air quality, public transit, trains, traffic, charging, parking, solar, energy, demographics, taxes, accidents, tourism, heritage, trees, population density, playgrounds, post boxes and many more), each with its coverage status and the exact tool to call next (for most data types that is ``get_city_resource(slug, resource=<type>)``), plus a small live highlights snapshot (current weather, air quality and train departures). Data types not yet covered for this city show where they ARE available so you can pivot. InfraNode keeps adding data and cities, so the catalog grows over time. Read-only.

get_city_resource

Fetch ANY per-city data type by its key (generic accessor, 81 data types). One tool for the whole breadth of InfraNode: live data (air, traffic, transit stops, parking, charging, water-level, flood, sharing, fuel-prices, webcams, station-departures/-arrivals/stations, ...), statistics (demographics, unemployment, tourism, accidents, crime-stats, indicators, land-values, tax-rates, insolvencies, ...), multi-year TIME SERIES (``sustainability``: SDG indicators per municipality, one value per year from 2006 to 2023, so trends can be answered without stitching snapshots), infrastructure and environment (solar, solar-roofs, district-heating, energy, heritage, tree-cadastre, playgrounds, public-toilets, markets, education, ...) and more. Discover the valid keys and per-city coverage with ``get_city_overview(slug)`` or the ``infranode://catalog`` resource; the ``resource`` enum lists every key. Uncovered types return ``source_status="not_covered"`` (plus where they ARE available), never an error. Read-only.

air_quality

Get official air quality for a German city (PM10, NO2 and more). Sourced from the Umweltbundesamt (UBA). Read-only. For live nearest-station hourly readings use ``get_city_resource(slug, resource='air')`` instead.

weather

Get current weather observations for a German city. Sourced from the Deutscher Wetterdienst (DWD): temperature, wind, precipitation and related fields. Read-only, current conditions only (not a forecast). For warnings use ``get_city_resource(slug, resource='weather-warnings')``. For a broader question about the city (not just weather) use ``get_city_overview`` instead, which already includes a live weather highlight.

pois

Get points of interest in a German city, filtered by type. Sourced from OpenStreetMap. Read-only.

station_board_departures

Get live departures for ANY railway station by its EVA number. Covers all train categories including local/regional (S/RB/RE) and long distance, with real-time delays, cancellations and disruption messages. Get the EVA from ``get_city_resource(slug, resource='stations')``. Read-only.

station_board_arrivals

Get live arrivals for ANY railway station by its EVA number. Mirror of ``station_board_departures`` for arriving trains (all categories, real-time delays, disruption messages). Get the EVA from ``get_city_resource(slug, resource='stations')``. Read-only.

transit_departures

Get live public-transport departures with real-time delays for a stop. Sourced from GTFS-RT/HVV/VGN. Unlike the static stop list (``get_city_resource(slug, resource='transit')``), this returns minute-fresh departures including delay for ONE stop. A ``stop_id`` is required: fetch the city's transit stops first to discover valid stop IDs, then pass one here. Read-only.

list_cities

List all covered cities (slug, federal state, population, coverage). Takes no arguments. Call this first to discover valid city slugs before invoking any city-scoped tool. Read-only.

sources

List all data sources with license, attribution and availability. Takes no arguments. Shows which upstream sources InfraNode bundles and whether each is currently active. Read-only.

compare

Compare ONE resource across MULTIPLE cities in a single response. Fans the resource out over the listed cities and returns a per-city ``source_status`` (ok/disabled/no_data/error/not_found), so a missing or failing city source does not spoil the whole answer. Read-only.

- get_city: Get base data for a German city (population, area, coordinates).

Sourced from Wikidata. Read-only. Useful as a first lookup to confirm a city
exists and get its core attributes. For a broader question about the city
(what data is available at all) use `get_city_overview instead.
-
get_city_overview: Get a ONE-CALL overview of everything InfraNode knows about a German city.

Start here for any city question. Returns: the city's base data, a CATALOG of
all 81 available data types (weather, air quality, public transit, trains,
traffic, charging, parking, solar, energy, demographics, taxes, accidents,
tourism, heritage, trees, population density, playgrounds, post boxes and many
more), each with its coverage status and the exact tool to call next (for most
data types that is
get_city_resource(slug, resource=<type>)), plus a small
live highlights snapshot (current weather, air quality and train departures).
Data types not yet covered for this city show where they ARE available so you
can pivot. InfraNode keeps adding data and cities, so the catalog grows over
time. Read-only.
-
get_city_resource: Fetch ANY per-city data type by its key (generic accessor, 81 data types).

One tool for the whole breadth of InfraNode: live data (air, traffic, transit
stops, parking, charging, water-level, flood, sharing, fuel-prices,
webcams, station-departures/-arrivals/stations, ...), statistics
(demographics, unemployment, tourism, accidents, crime-stats, indicators,
land-values, tax-rates, insolvencies, ...), multi-year TIME SERIES
(
sustainability: SDG indicators per municipality, one value per year from
2006 to 2023, so trends can be answered without stitching snapshots),
infrastructure and environment
(solar, solar-roofs, district-heating, energy, heritage, tree-cadastre,
playgrounds, public-toilets, markets, education, ...) and more. Discover the
valid keys and per-city coverage with
get_city_overview(slug) or the
infranode://catalog resource; the resource enum lists every key.
Uncovered types return
source_status="not_covered" (plus where they ARE
available), never an error. Read-only.
-
air_quality: Get official air quality for a German city (PM10, NO2 and more).

Sourced from the Umweltbundesamt (UBA). Read-only. For live nearest-station
hourly readings use
get_city_resource(slug, resource='air') instead.
-
weather: Get current weather observations for a German city.

Sourced from the Deutscher Wetterdienst (DWD): temperature, wind,
precipitation and related fields. Read-only, current conditions only (not a
forecast). For warnings use
get_city_resource(slug,
resource='weather-warnings')
. For a broader question about the city (not
just weather) use
get_city_overview instead, which already includes a
live weather highlight.
-
pois: Get points of interest in a German city, filtered by type.

Sourced from OpenStreetMap. Read-only.
-
station_board_departures: Get live departures for ANY railway station by its EVA number.

Covers all train categories including local/regional (S/RB/RE) and long
distance, with real-time delays, cancellations and disruption messages. Get
the EVA from
get_city_resource(slug, resource='stations'). Read-only.
-
station_board_arrivals: Get live arrivals for ANY railway station by its EVA number.

Mirror of station_board_departures for arriving trains (all categories,
real-time delays, disruption messages). Get the EVA from
get_city_resource(slug, resource='stations'). Read-only.
-
transit_departures: Get live public-transport departures with real-time delays for a stop.

Sourced from GTFS-RT/HVV/VGN. Unlike the static stop list
(
get_city_resource(slug, resource='transit')), this returns minute-fresh
departures including delay for ONE stop. A
stop_id is required: fetch the
city's transit stops first to discover valid stop IDs, then pass one here.
Read-only.
-
list_cities: List all covered cities (slug, federal state, population, coverage).

Takes no arguments. Call this first to discover valid city slugs before
invoking any city-scoped tool. Read-only.
-
sources: List all data sources with license, attribution and availability.

Takes no arguments. Shows which upstream sources InfraNode bundles and
whether each is currently active. Read-only.
-
compare: Compare ONE resource across MULTIPLE cities in a single response.

Fans the resource out over the listed cities and returns a per-city
source_status` (ok/disabled/no_data/error/not_found), so a missing or
failing city source does not spoil the whole answer. Read-only.

Claude Desktop / Cursor

Paste into your MCP client config file to install this server.

{
    "mcpServers": {
        "infranode": {
            "infranode": {
                "url": "https://mcp.infranode.dev/mcp"
            }
        }
    }
}

McpServers

{
    "infranode": {
        "url": "https://mcp.infranode.dev/mcp"
    }
}

The open-data REST API for Germany: a keyless HTTP API for German public-infrastructure open data, also available as an MCP server.

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 (DWD), air quality (UBA), public transit (incl. realtime departures), traffic, electricity price (SMARD), land values (BORIS), parking, charging, water levels, demographics, energy and more, for84+ German citiesbehindoneinterface.No API key, no account.Every response uses one canonical{ data, meta }envelope with per-record license and attribution. The same data is also exposed as an MCP server (12 lean read-only tools covering 67 data types) for AI agents. Start with the one-callget_city_overview: it returns a catalog of every data type available for a city plus a live highlights snapshot, so agents discover the full breadth, not just weather. InfraNode is actively growing, with more data types and cities added regularly.

Sources include the Deutscher Wetterdienst (DWD), Umweltbundesamt (UBA), Mobilithek/DELFI, GovData, OpenStreetMap, Bundesnetzagentur, KBA, DIVI and more.

A singleget_city_overview("koeln")call: current weather, official air quality, DWD warnings, live train departures with delays, roadworks and the full per-city data catalog, from one keyless endpoint. Try any city live atinfranode.dev.

One shared HTTP client fans out to the upstream sources, each response is mapped into the canonical schema, license-gated with its attribution and cached in Redis (with stale-on-error fallback), then served through both a REST API and an MCP server. A failing upstream degrades tosource_status, it never fails the call.

flowchart LR subgraph SRC["25+ German open-data sources"] direction TB S1["DWD, UBA<br/>weather, air"] S2["Mobilithek, DELFI, DB<br/>transit, realtime"] S3["SMARD, BNetzA, MaStR<br/>energy"] S4["BORIS, GovData, OSM,<br/>DIVI, KBA, ..."] end subgraph CORE["InfraNode core"] direction TB N["Normalize<br/>one canonical schema"] --> L["License-gate<br/>per-record attribution"] --> C["Redis cache<br/>stale-on-error fallback"] end SRC --> CORE CORE --> API["REST API<br/>infranode.dev/api/v1<br/>84 cities, keyless"] CORE --> MCP["MCP server<br/>mcp.infranode.dev<br/>12 read-only tools"] API --> APPS["Apps &amp; dashboards"] MCP --> AGENTS["AI agents<br/>Claude, ChatGPT"]

If InfraNode saves you a data integration, a star helps other developers find it.

Base URLhttps://infranode.dev/api/v1. No key, no account, just call it:

curl https://infranode.dev/api/v1/cities/koeln/weather
{ "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 itsattribution(license + source), andmeta.source_statustells you whether the upstream source delivered data, so a dead source degrades gracefully instead of failing the call.

Tip: call/api/v1/citiesfirst to discover valid city slugs (e.g.koeln,berlin,hamburg), then call any city-scoped endpoint.

The full interactive reference and per-city coverage live atinfranode.dev. TheInfraNode API on the Postman API Networkmirrors every endpoint with real example responses, so you can try theInfraNode API Postman collectionin the browser without an API key.

Every category below is a REST endpoint under/api/v1/cities/{slug}/<key>. Over MCP the same data comes through 12 lean tools: a few named ones (get_city_overview,weather,air_quality,pois,compare, live boards) plus one genericget_city_resource(slug, resource=<key>)for every other data type (itsresourceenum lists all 67 keys).

- 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 returnssource_status, not an error.
- Safe by design.SSRF and injection gates validate every request; inputs are checked against fixed allowlists.

The same API is exposed as a remote MCP server, so AI agents can call all 67 data types as tools. One line with Claude Code:

claude mcp add --transport http infranode https://mcp.infranode.dev/mcp

Any 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 samemcpServersblock to yourclaude_desktop_config.json.
- ChatGPT:add a connector with the URLhttps://mcp.infranode.dev/mcp.

All tools are annotatedreadOnlyHint: true/destructiveHint: false/idempotentHint: true, so MCP clients can safely auto-allow them. The MCP layer also ships ready-madeprompts(city_briefing,compare_air_quality,commute_check) andresources(infranode://cities,infranode://sources). Full install guide, the complete tool manifest with example outputs, the permission model and an example transcript are indocs/mcp-install.md. The registry manifest isserver.json.

Ready-made GPT:German City Data (InfraNode)is listed in the GPT Store (Research & Analysis) and works out of the box.

To build your own: InfraNode ships a curated OpenAPI spec for GPT actions: 23 of the most useful operations (ChatGPT allows at most 30 per action), keyless, all GET.
- In the
GPT editoropenConfigure → Actions → Create new action → Import from URLand pastehttps://infranode.dev/actions/openapi.json.
- Leave authentication atNone; as privacy policy usehttps://infranode.dev/en/privacy/.
- Tell the GPT in its instructions to start withgetCityOverview(slug), resolve city names viagetCities, and citedata.attribution(the data licences require attribution).

Details and recommended instructions:infranode.dev/en/chatgpt/. The spec is generated fromdocs/openapi.yamlbyscripts/build_actions_spec.py.

Other MCP servers cover parts of the German or European data space. InfraNode is the broadest for city-level open data, and the projects below often complement each other:

- germany-mcp-serverfederal and government data (Autobahn, DWD, NINA, SMARD, Bundestag). Nationwide, no per-city breadth.
-
db-mcp-server/ db-timetable-mcp Deutsche Bahn rail timetables only.
-
mcp-server-public-transportpublic transport across Europe; in Germany it covers Berlin/Brandenburg (VBB).
- Single-city servers(e.g. Munich, Berlin) cover one city each.

InfraNode covers84 German cities and 67 data typesbehind one keyless, hosted endpoint, from environment and mobility to energy, economy and city life. Full side-by-side comparison:infranode.dev/en/mcp-comparison.

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.server

All settings use theINFRANODE_env prefix (see.env.example); each data source is toggled by its ownINFRANODE_ENABLE_*flag. Real secrets are never committed, only.env.exampleis versioned and CI runs a gitleaks scan.

- Code:Apache-2.0 (seeLICENSE).
- 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 inDATA-LICENSES.md. The Apache-2.0 license covers only the API source code, not the passed-through data.

Contributions are welcome. Setup, gate commands and the secret rule are inCONTRIBUTING.md. To add a new data source, start with the declarative source registry insrc/infranode/registry/source_specs.py(oneSourceSpecentry per upstream); CONTRIBUTING.md has the full checklist.

Get water temperature and swimming conditions for the Aare river in Switzerland.

Global pollen forecasts for any city or coordinate, with per-species values for multiple plants and a multiple day outlook.

Provides advanced Formula 1 data analysis, including real-time telemetry, tire performance, weather prediction, and race strategy simulation.

Provides weather data using the Open-Meteo API.

Real-time surf, trails, volcano, ocean safety, weather, and restaurants for all Hawaiian islands — built for AI agents.

Access meteorological data for Portugal from the IPMA public API using natural language.

Provides live images, time-lapse videos, and current weather updates for Jade Dragon Snow Mountain.

Provides accurate Islamic prayer times for locations throughout Malaysia using the waktusolat.app API.

A collection of MCP servers for Cursor IDE, including demo and weather services.

Swiss open data MCP server — transport, weather, geodata, companies, etc,. Zero API keys.

No reviews yet — be the first

Sign in to leave a review

Use Google, GitHub, or an email account so ratings stay tied to real people.

Email sign in

No reviews posted yet.