InfraNode

dev.infranode由 infranode.dev 發布官方發布者v1.1.1更新於 Oct 28, 2026

Keyless open data for 84 German cities: 12 lean read-only MCP tools covering 67 data types.

已驗證Streamable HTTP可網頁執行位置與生活資料與分析

概覽

AI 產生的概覽

免金鑰的遠端 MCP 伺服器,提供 84 座德國城市的開放資料:天氣、空氣品質、大眾運輸、交通、能源、人口等,全部唯讀。

可以做什麼
  • 查詢涵蓋的城市與資料來源,並以一次呼叫取得某城市的資料目錄與即時摘要
  • 透過一個通用資源工具讀取各類城市資料
  • 讀取城市目前天氣、官方空氣品質與景點
  • 依車站編號取得即時列車到開資訊,依站點取得即時大眾運輸發車資訊
  • 在單次回應中跨多座城市比較同一類資料
適用情境
適合需要德國城市層級事實或即時基礎設施資料(天氣、空氣、運輸誤點、停車、充電、電價、人口等),又不想逐一註冊各上游入口的情況。
執行需求
遠端 Streamable HTTP 端點;不需要 API 金鑰、帳號或環境變數。需要能連線至該託管端點的網路。
安裝前請注意
唯讀且免金鑰,沒有寫入操作。資料來自第三方開放資料來源(DWD、UBA、OpenStreetMap、運輸營運單位等),其授權要求標示出處,回答時應註明來源。在 MCP 通道下列表類回應預設分頁。

安裝

在 SourceWeft 中

  1. 開啟 儀表板中的 InfraNode,將其新增到工作區。
  2. 為需要使用其工具的對話啟用該服務。

Web executable,透過 Streamable HTTP。 遠端服務在工作區中設定後即可從網頁執行環境執行。

交給代理程式安裝

把這段提示詞貼上到 Claude Code、Codex、Cursor 等代理程式,或 SourceWeft 對話中。代理程式會讀取該伺服器的安裝指南,先向你展示發布者、端點和登入方式,經你同意後再把它新增到你的客戶端。金鑰不會寫進任何命令。

閱讀 https://sourceweft.com/mcp/dev.infranode%2Finfranode/install.md,並按其中說明把這個 MCP 伺服器接入我的客戶端。修改任何設定之前,先告訴我它的發布者、端點和登入方式,等我確認。不要把 API 金鑰寫進命令或我會提交的檔案;問我金鑰應從哪裡取得。

檢視代理程式所依據的安裝指南

其他 MCP 客戶端

把它新增到你客戶端的 mcpServers 設定中。

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

README

Deutsch | English

InfraNode

[GitHub stars] [License: Apache 2.0] [Glama score] [MCP Registry] [Smithery]

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

[InfraNode-Live-Übersicht für Köln: aktuelles Wetter, amtliche Luftqualität, DWD-Warnungen, Live-Zugabfahrten mit Verspätungen, Baustellen und der vollständige Katalog der Datenarten, alles aus einem Aufruf ohne API-Key]

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.

mermaid
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 &amp; 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:

bash
curl https://infranode.dev/api/v1/cities/koeln/weather
jsonc
{  "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/cities auf, um die kanonischen Stadt-Slugs zu finden (etwa koeln, 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 liefert 404 mit dem Hinweis Meintest du ...?, der den nächstliegenden Slug nennt.

[Run in Postman]

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.

SDKs

Keylose Client-Bibliotheken, Quellcode und Issues in eigenen Repos:

SpracheInstallationRepo
Pythonpip install infranode (PyPI)infranode-python, mit LangChain- und LlamaIndex-Tools
JavaScript/TypeScriptnpm install infranode-sdk (npm)infranode-js, mit Vercel-AI-SDK-Tool
Javaohne PaketTutorial: HttpClient oder OpenAPI Generator

Daten (84 Städte, 122 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).

GruppeDatenarten (Endpoint-Keys)
Entdeckenlist_cities, sources, compare (eine Datenart über viele Städte), overview (Katalog plus Live-Auszug in einem Aufruf)
Wetter & Umweltweather, weather-warnings, civil-protection-warnings (BBK NINA), air-uba (amtlich), air (live), pollen-uv, water-level, flood, fire-danger, bathing-water
Mobilitättransit, 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, charging, parking (Live-Belegung), parking-onstreet, park-and-ride, mobility-points, bike-parking, sharing, fuel-prices, bike-counts
Stadt & Menschenbase, 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 & Immobilienland-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 & Fahrzeugepower-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, limit und offset blä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:

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

Jeden anderen MCP-Client richtest du auf denselben Remote-Endpoint (Streamable HTTP):

jsonc
{  "mcpServers": {    "infranode": { "url": "https://mcp.infranode.dev/mcp" }  }}
  • Cursor / Windsurf: den Block oben in ~/.cursor/mcp.json eintragen (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 die claude_desktop_config.json eintragen.
  • ChatGPT: einen Connector mit der URL https://mcp.infranode.dev/mcp anlegen.

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.

  1. Im GPT-Editor Configure → Actions → Create new action → Import from URL öffnen und https://infranode.dev/actions/openapi.json einfügen.
  2. Die Authentifizierung auf None stehen lassen, als Datenschutzerklärung https://infranode.dev/datenschutz/ eintragen.
  3. In den Instructions des GPT festhalten: mit getCityOverview(slug) starten, Stadtnamen über getCities auflösen und data.attribution zitieren (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:

bash
cp .env.example .env          # example config, contains NO real secretsdocker compose -f deploy/docker-compose.yml upcurl 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):

bash
uv sync --group mcpINFRANODE_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.md gefü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.

來源:README.md,提交 66794e6

工具

12

get_city

City Base Data

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.

輸入參數slug必填

get_city_overview

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

輸入參數slug必填

get_city_resource

City Data by Type

Fetch ANY per-city data type by its key (generic accessor, 80 data types). One tool for the whole breadth of InfraNode: live data (air, traffic, transit stops, parking, charging, water-level, flood, sharing, fuel-prices, 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.

輸入參數slug必填resource必填

air_quality

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.

輸入參數slug必填

weather

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.

輸入參數slug必填

pois

Points of Interest

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

輸入參數slug必填type必填

station_board_departures

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.

輸入參數eva必填

station_board_arrivals

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.

輸入參數eva必填

transit_departures

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.

輸入參數slug必填stop_id

list_cities

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

Data 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 Cities

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.

輸入參數cities必填resource必填

版本歷史

1
  1. v1.1.1最新Sep 16, 2026

評分

已滿足適用檢查項的 100%

該評分衡量此收錄條目的完整程度,依據註冊中心條目、端點與公開來源計算得出。它不是對伺服器本身的評價,也不表示伺服器安全或目前可用:可連通性是帶日期的檢查結果,評分也不包含安裝量或使用者評價。

  • 近 30 天內可連通必需25 分
  • 已宣告認證方式必需10 分
  • 已列出工具必需15 分
  • 描述必需15 分
  • 圖示10 分
  • 文件15 分
  • 授權條款10 分