streamable-httpApache-2.0updated 14d ago
Die Open-Data-REST-API fĂŒr Deutschland: eine HTTP-API ohne API-Key fĂŒr Open Data zur öffentlichen Infrastruktur, auch als MCP-Server verfĂŒgbar.
What can you do with InfraNode?
Deutsch | English
InfraNode
Die Open-Data-REST-API fĂŒr Deutschland: eine HTTP-API ohne API-Key fĂŒr Open Data zur öffentlichen Infrastruktur, auch als MCP-Server verfĂŒgbar.
Deutsche StÀdte veröffentlichen viel Open Data, aber jede Quelle hat ihr eigenes
Format, eigene Felder und eigene Eigenheiten, und fĂŒr mehrere braucht es eine
Registrierung im jeweiligen Portal. InfraNode normalisiert rund 20 Kategorien,
Wetter (DWD), LuftqualitĂ€t (UBA), ĂPNV (inklusive Echtzeit-Abfahrten), Verkehr,
Strompreis (SMARD), Bodenrichtwerte (BORIS), Parken, Ladeinfrastruktur,
PegelstĂ€nde, Demografie, Energie und mehr, fĂŒr 84+ deutsche StĂ€dte hinter
einer Schnittstelle. Kein API-Key, kein Konto. Jede Antwort nutzt
denselben kanonischen { data, meta }-Umschlag mit Lizenz und Attribution je
Datensatz. Dieselben Daten stehen KI-Agenten auch als MCP-Server zur VerfĂŒgung
(12 schlanke Read-only-Tools ĂŒber 78 Datenarten).
Der Einstieg ist get_city_overview, ein einziger Aufruf: Er liefert einen
Katalog aller Datenarten, die es fĂŒr eine Stadt gibt, dazu einen Live-Auszug der
wichtigsten Werte. So sehen Agenten die volle Breite und nicht nur das Wetter.
InfraNode wĂ€chst laufend, neue Datenarten und StĂ€dte kommen regelmĂ€Ăig dazu.
Zu den Quellen gehören der Deutsche Wetterdienst (DWD), das Umweltbundesamt (UBA), Mobilithek/DELFI, der VBB (Verkehrsverbund Berlin-Brandenburg, CC-BY 4.0), GovData, OpenStreetMap, die Bundesnetzagentur, das KBA und weitere.
Im Einsatz
Ein einziger get_city_overview("koeln")-Aufruf: aktuelles Wetter, amtliche
LuftqualitÀt, DWD-Warnungen, Live-Zugabfahrten mit VerspÀtungen, Baustellen und
der vollstÀndige Datenkatalog der Stadt, aus einem Endpoint ohne API-Key. Jede
Stadt lÀsst sich live ausprobieren auf
infranode.dev.
So funktioniert es
Ein gemeinsamer HTTP-Client fragt die Upstream-Quellen ab, jede Antwort wird auf
das kanonische Schema abgebildet, mit ihrer Attribution durch das Lizenz-Gate
gefĂŒhrt und in Redis zwischengespeichert (mit Stale-on-Error-Fallback), danach
ĂŒber eine REST-API und einen MCP-Server ausgeliefert. FĂ€llt eine Quelle aus,
schlÀgt sich das in source_status nieder. Der Aufruf selbst scheitert nie
daran.
flowchart LR
subgraph SRC["25+ deutsche Open-Data-Quellen"]
direction TB
S1["DWD, UBA<br/>Wetter, Luft"]
S2["Mobilithek, DELFI, DB<br/>ĂPNV, Echtzeit"]
S3["SMARD, BNetzA, MaStR<br/>Energie"]
S4["BORIS, GovData, OSM,<br/>KBA, ..."]
end
subgraph CORE["InfraNode-Kern"]
direction TB
N["Normalisieren<br/>ein kanonisches Schema"] --> L["Lizenz-Gate<br/>Attribution je Datensatz"] --> C["Redis-Cache<br/>Stale-on-Error-Fallback"]
end
SRC --> CORE
CORE --> API["REST-API<br/>infranode.dev/api/v1<br/>84 StÀdte, ohne API-Key"]
CORE --> MCP["MCP-Server<br/>mcp.infranode.dev<br/>12 Read-only-Tools"]
API --> APPS["Apps & Dashboards"]
MCP --> AGENTS["KI-Agenten<br/>Claude, ChatGPT"]
Wenn InfraNode dir eine Datenintegration erspart: Ein Stern hilft anderen Entwicklern, das Projekt zu finden.
Schnellstart
Basis-URL https://infranode.dev/api/v1. Kein Key, kein Konto, einfach
aufrufen:
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": "..." }
}
Jede Antwort folgt demselben { data, meta }-Umschlag: Jeder Datensatz trÀgt
seine attribution (Lizenz und Quelle), und meta.source_status sagt, ob die
Upstream-Quelle Daten geliefert hat. Eine tote Quelle degradiert damit sauber,
statt den Aufruf scheitern zu lassen.
Ăber alle Datenarten hinweg sind Feldnamen snake_case und englisch, und dasselbe
Konzept heiĂt immer gleich: post_code, street, house_number, place,
name, start, end, distance_km, power_kw, lat, lon. post_code ist
immer ein fĂŒnfstelliger String (fĂŒhrende Nullen bleiben erhalten), Zeitstempel
sind ISO 8601 mit Zeitzone, und ein Wert, den die Quelle nicht liefert, ist
null, nie ein leerer String. Manche Antworten fĂŒhren daneben noch Ă€ltere
Doppelnamen mit identischen Werten (plz, zip, strasse, hausnummer, ort,
city, bezeichnung, beginn, ende, art, dist_km, leistung_kw,
einheit_typ, dazu die camelCase-Rohfelder der Autobahn-Verkehrsmeldungen).
Diese Namen sind veraltet, nimm die kanonischen.
Tipp: Ruf zuerst
/api/v1/citiesauf, um die kanonischen Stadt-Slugs zu finden (etwakoeln,berlin,hamburg), und danach einen stadtbezogenen Endpoint.Der
{slug}wird tolerant aufgelöst, die exakte ASCII-Form brauchst du also selten: der deutsche Name mit oder ohne Umlaute, jede GroĂ- und Kleinschreibung, gĂ€ngige englische Exonyme und Kurzformen fĂŒhren alle auf den kanonischen Slug (MĂŒnchen/mĂŒnchen/munich/munchenâmuenchen,cologneâkoeln,frankfurtâfrankfurt-am-main). Ein unbekannter Name liefert404mit dem HinweisMeintest du ...?, der den nĂ€chstliegenden Slug nennt.
Die vollstÀndige interaktive Referenz und die Abdeckung je Stadt stehen auf infranode.dev. Die InfraNode API im Postman API Network spiegelt jeden Endpoint mit echten Beispielantworten, sodass sich die InfraNode API Postman Collection ohne API-Key direkt im Browser ausprobieren lÀsst.
Daten (84 StÀdte, 124 Endpunkte)
Jede Kategorie unten ist ein REST-Endpoint unter
/api/v1/cities/{slug}/<key>. Ăber MCP kommen dieselben Daten durch 12 schlanke
Tools: ein paar benannte (get_city_overview, weather, air_quality, pois,
compare, die Live-Tafeln) und ein generisches
get_city_resource(slug, resource=<key>) fĂŒr jede weitere Datenart (sein
resource-Enum listet alle 81 Keys).
| Gruppe | Datenarten (Endpoint-Keys) |
|---|---|
| Entdecken | list_cities, sources, compare (eine Datenart ĂŒber viele StĂ€dte), overview (Katalog plus Live-Auszug in einem Aufruf) |
| Wetter & Umwelt | weather, weather-warnings, civil-protection-warnings (BBK NINA), air-uba (amtlich), air (live), pollen-uv, water-level, flood, fire-danger, bathing-water |
| MobilitÀt | transit, Live-Abfahrten je Haltestelle (Tool transit_departures), stations (Katalog), Bahnhofstafeln nach EVA (Tools station_board_departures/station_board_arrivals, inklusive Nahverkehr und Störungen), station-departures, station-arrivals, traffic, road-events, webcams, charging, parking (Live-Belegung), parking-onstreet, park-and-ride, mobility-points, bike-parking, sharing, fuel-prices, bike-counts |
| Stadt & Menschen | base, geo, demographics, indicators, sustainability (SDG-Indikatoren je Kommune als Zeitreihe 2006-2023, Wegweiser Kommune / Bertelsmann Stiftung, CC0), unemployment, tourism, construction, accidents, crime-stats, health, icu-live, holidays, election, events, council-papers (kommunale Ratsinformationen ĂŒber OParl: Vorlagen, AntrĂ€ge und BeschlĂŒsse je Stadt), pois, SpielplĂ€tze, MĂ€rkte, Toiletten und weitere OSM-Typen |
| Wirtschaft & Immobilien | land-values, tax-rates (HebesĂ€tze fĂŒr Gewerbe- und Grundsteuer je Kommune), business-registrations (GrĂŒndungsdynamik je Kreis), insolvencies (Insolvenzverfahren je Kreis: Unternehmen und ĂŒbrige Schuldner, jĂ€hrlich), public-tenders (öffentliche Vergabe: laufende Ausschreibungen und vergebene AuftrĂ€ge je Stadt) |
| Energie & Fahrzeuge | power-load, power-price, energy, solar, solar-roofs, district-heating, vehicle-registrations |
Verhalten im Betrieb
- Ohne Key, nur lesend. Keine Zugangsdaten, keine Schreibzugriffe, keine Nutzerkonten.
- Kanonischer Umschlag.
{ data, meta }mit Status und Attribution je Quelle. - Sanfte Degradation. Eine ausgefallene Quelle liefert
source_status, keinen Fehler. - Sicher entworfen. SSRF- und Injection-Gates prĂŒfen jede Anfrage, Eingaben laufen gegen feste Allowlists.
Das Sicherheitsmodell steht in SECURITY.md.
Paginierung & Kanal-Voreinstellungen
Listen von Datenarten (charging, energy, events, transit, die
OSM-Feature-Endpoints) haben bei gleicher URL eine kanalabhÀngige
Voreinstellung:
- Direktes REST liefert die vollstÀndige Liste in einem Aufruf (
limit=null,returned == total,truncated=false). - GPT Actions (OpenAI-Header) und MCP sind an eine voreingestellte SeitengröĂe gebunden, damit Antworten fĂŒr Agenten klein bleiben.
limit=all(oder?all=1) erzwingt auf jedem Kanal die volle Liste,limitundoffsetblÀttern explizit.meta.pagination(total/returned/limit/offset/truncated) steht auf jedem Kanal, der ausgelieferte Ausschnitt ist also immer nachvollziehbar.
Bei traffic ist die rohe Polyline optional: include=geometry (oder ?full=1)
ergÀnzen, die Standardantwort bleibt schlank.
StabilitÀt, Changelog & Roadmap
Du baust produktiv auf InfraNode auf? Dann bleib bei Ănderungen vorne:
- Changelog listet jede sichtbare Ănderung (neue Datenarten, neue StĂ€dte, geĂ€ndertes Verhalten, Fehlerbehebungen, Deprecations), die neueste zuerst. Per RSS abonnierbar.
- Roadmap zeigt das Geplante und die StabilitĂ€tszusage: Die API wĂ€chst additiv, der Umschlag bleibt stabil, und Ănderungen an bestehenden Antworten werden vorher angekĂŒndigt (in der Regel 30+ Tage).
- Statusseite und die GitHub-Releases decken VerfĂŒgbarkeit und versionierte Ănderungen ab.
Als MCP-Server nutzen
Dieselbe API steht als Remote-MCP-Server bereit, KI-Agenten können also alle 78 Datenarten als Tools aufrufen. Mit Claude Code genĂŒgt eine Zeile:
claude mcp add --transport http infranode https://mcp.infranode.dev/mcp
Jeden anderen MCP-Client richtest du auf denselben Remote-Endpoint (Streamable HTTP):
{
"mcpServers": {
"infranode": { "url": "https://mcp.infranode.dev/mcp" }
}
}
- Cursor / Windsurf: den Block oben in
~/.cursor/mcp.jsoneintragen (oder in die MCP-Einstellungen der App). - VS Code:
code --add-mcp '{"name":"infranode","url":"https://mcp.infranode.dev/mcp"}' - Claude Desktop: denselben
mcpServers-Block in dieclaude_desktop_config.jsoneintragen. - ChatGPT: einen Connector mit der URL
https://mcp.infranode.dev/mcpanlegen.
Alle Tools tragen die Annotationen readOnlyHint: true /
destructiveHint: false / idempotentHint: true, MCP-Clients können sie also
gefahrlos automatisch freigeben. Die MCP-Schicht bringt auĂerdem fertige
Prompts (city_briefing, compare_air_quality, commute_check) und
Ressourcen (infranode://cities, infranode://sources) mit. Die
vollstÀndige Installationsanleitung, das komplette Tool-Manifest mit
Beispielausgaben, das Berechtigungsmodell und ein Beispiel-Transkript stehen in
docs/mcp-install.md. Das Registry-Manifest ist
server.json.
In ChatGPT nutzen (Custom-GPT-Action)
Fertiges GPT: InfraNode: German City Data - Weather & Transit steht im GPT Store (Research & Analysis) und funktioniert sofort.
FĂŒr eine eigene Variante liefert InfraNode eine kuratierte OpenAPI-Spec fĂŒr GPT-Actions: 23 der nĂŒtzlichsten Operationen (ChatGPT erlaubt höchstens 30 pro Action), ohne Key, alle GET.
- Im GPT-Editor Configure â Actions â
Create new action â Import from URL öffnen und
https://infranode.dev/actions/openapi.jsoneinfĂŒgen. - Die Authentifizierung auf None stehen lassen, als DatenschutzerklĂ€rung
https://infranode.dev/datenschutz/eintragen. - In den Instructions des GPT festhalten: mit
getCityOverview(slug)starten, Stadtnamen ĂŒbergetCitiesauflösen unddata.attributionzitieren (die Datenlizenzen verlangen die Namensnennung).
Details und empfohlene Instructions:
infranode.dev/chatgpt/. Die Spec wird von
scripts/build_actions_spec.py aus docs/openapi.yaml erzeugt.
Alternativen und wie InfraNode dazu steht
Andere MCP-Server decken Teile des deutschen oder europĂ€ischen Datenraums ab. FĂŒr Open Data auf Stadtebene ist InfraNode am breitesten, und die Projekte unten ergĂ€nzen einander oft:
- germany-mcp-server Bundes- und Regierungsdaten (Autobahn, DWD, NINA, SMARD, Bundestag). Bundesweit, ohne Tiefe je Stadt.
- db-mcp-server / db-timetable-mcp nur FahrplÀne der Deutschen Bahn.
- mcp-server-public-transport ĂPNV in Europa, in Deutschland deckt es Berlin/Brandenburg (VBB) ab.
- Server fĂŒr einzelne StĂ€dte (etwa MĂŒnchen, Berlin) decken je eine Stadt ab.
InfraNode deckt 84 deutsche StÀdte und 82 Datenarten hinter einem gehosteten Endpoint ohne API-Key ab: Umwelt, MobilitÀt, Energie, Wirtschaft und Stadtleben. Der vollstÀndige Vergleich Seite an Seite steht auf infranode.dev/mcp-vergleich.
Selbst hosten (optional)
Nötig ist das nicht, der gehostete Endpoint oben ist der schnellste Weg. Der Code liegt aber offen. Den API-Stack lokal mit Docker (Compose v2) starten:
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}
Den MCP-Server selbst lokal ĂŒber stdio betreiben (gegen die öffentliche API):
uv sync --group mcp
INFRANODE_MCP_API_BASE=https://infranode.dev/api/v1 uv run python -m infranode.mcp.server
FĂŒr alle Einstellungen gilt das Env-PrĂ€fix INFRANODE_ (siehe .env.example),
jede Datenquelle hat ihren eigenen INFRANODE_ENABLE_*-Schalter. Echte Secrets
landen nie im Repo, versioniert ist nur .env.example, und die CI fÀhrt einen
gitleaks-Scan.
Lizenz: Code und Daten sind getrennt
- Code: Apache-2.0 (siehe LICENSE).
- Daten: Die offenen Daten, die InfraNode ausliefert, behalten die Lizenzen
ihrer Upstream-Quellen (etwa ODbL fĂŒr OpenStreetMap, DL-DE-BY fĂŒr GovData,
Namensnennung fĂŒr DWD). Diese Datenlizenzen und die Attribution werden separat
in
DATA-LICENSES.mdgefĂŒhrt. Die Apache-2.0-Lizenz gilt nur fĂŒr den Quellcode der API, nicht fĂŒr die durchgereichten Daten.
Mitmachen
BeitrÀge sind willkommen. Setup, Gate-Befehle und die Secret-Regel stehen in
CONTRIBUTING.md. FĂŒr eine neue Datenquelle ist die
deklarative Quellen-Registry in src/infranode/registry/source_specs.py der
Startpunkt (ein SourceSpec-Eintrag je Upstream), die vollstÀndige Checkliste
steht in CONTRIBUTING.md.
Install
Add InfraNode to your client. Pick the one you use.
claude mcp add --transport http infranode https://mcp.infranode.dev/mcpcodex mcp add infranode --url https://mcp.infranode.dev/mcp{
"mcpServers": {
"infranode": {
"url": "https://mcp.infranode.dev/mcp"
}
}
}Add to `~/.cursor/mcp.json`, or `.cursor/mcp.json` for a single project.
{
"servers": {
"infranode": {
"type": "http",
"url": "https://mcp.infranode.dev/mcp"
}
}
}Add to `.vscode/mcp.json` in your workspace.
{
"mcpServers": {
"infranode": {
"url": "https://mcp.infranode.dev/mcp"
}
}
}Add to `claude_desktop_config.json`, then restart Claude Desktop.
{
"mcpServers": {
"infranode": {
"serverUrl": "https://mcp.infranode.dev/mcp"
}
}
}Add to `~/.codeium/windsurf/mcp_config.json`.
Score
39 / 100
Incomplete
- Documentation25/25
- Maintenance25/25
- Trust13/20
- Capability0/15
- Install experience12/15
- Documents what it does and how to connect
- Has a resolvable package or endpoint
- Exposes at least one tool, prompt or resource
- README has substantive content
- Includes a code example
- Documents its configuration
- Mentions credentials or security posture
- Last commit 6 days ago
- Has a release history
- Repository is not archived
- Licensed Apache-2.0
- Namespace verified in the official MCP registry
- Claimed by its owner
- Published under an organisation
- 0 tool(s) documented
- Provides prompt templates
- Provides resources
- 6 documented install method(s)
- Published to a package registry
- Offers a hosted endpoint â no local install
Version history
| Versions | Published |
|---|---|
| 1.1.1Latest | Jul 6, 2026 |
| 1.1.0 | Jul 2, 2026 |
| 1.0.12 | Jul 1, 2026 |
| 1.0.5 | Jun 26, 2026 |
| 1.0.3 | Jun 20, 2026 |
| 1.0.2 | Jun 19, 2026 |
| 1.0.1 | Jun 19, 2026 |
| 1.0.0 | Jun 18, 2026 |
