InfraNode

Servidor MCP gratuito y sin clave para datos abiertos de 84 ciudades alemanas: clima y advertencias del DWD, calidad del aire, tránsito, tráfico, niveles de agua, energía/SMARD. 38 herramientas, Apache-2.0.

Documentación

Deutsch | English

InfraNode

GitHub stars License: Apache 2.0 Glama score MCP Registry Smithery

La API REST de datos abiertos para Alemania: una API HTTP sin clave de API para datos abiertos sobre infraestructura pública, también disponible como servidor MCP.

Las ciudades alemanas publican muchos datos abiertos, pero cada fuente tiene su propio formato, sus propios campos y sus propias particularidades, y para varias de ellas se requiere un registro en el portal correspondiente. InfraNode normaliza alrededor de 20 categorías: clima (DWD), calidad del aire (UBA), transporte público (incluidas salidas en tiempo real), tráfico, precio de la electricidad (SMARD), valores de suelo (BORIS), estacionamiento, infraestructura de carga, niveles de agua, demografía, energía y más, para más de 84 ciudades alemanas detrás de una interfaz. Sin clave de API, sin cuenta. Cada respuesta utiliza el mismo envoltorio canónico { data, meta } con licencia y atribución por conjunto de datos. Los mismos datos también están disponibles para agentes de IA como servidor MCP (12 herramientas de solo lectura y ligeras en 78 tipos de datos). El punto de partida es get_city_overview, una única llamada: proporciona un catálogo de todos los tipos de datos disponibles para una ciudad, junto con un extracto en vivo de los valores más importantes. Así, los agentes ven toda la amplitud y no solo el clima. InfraNode crece continuamente; nuevos tipos de datos y ciudades se añaden regularmente.

Entre las fuentes se incluyen el Servicio Meteorológico Alemán (DWD), la Agencia Federal de Medio Ambiente (UBA), Mobilithek/DELFI, el VBB (Asociación de Transporte de Berlín-Brandeburgo, CC-BY 4.0), GovData, OpenStreetMap, la Agencia Federal de Redes, el KBA y otras.

En uso

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

Una única llamada a get_city_overview("koeln"): clima actual, calidad del aire oficial, avisos del DWD, salidas de tren en vivo con retrasos, obras y el catálogo completo de datos de la ciudad, desde un endpoint sin clave de API. Cada ciudad se puede probar en vivo en infranode.dev.

Cómo funciona

Un cliente HTTP común consulta las fuentes upstream; cada respuesta se mapea al esquema canónico, pasa por la puerta de licencias con su atribución y se almacena en caché en Redis (con respaldo de datos obsoletos en caso de error). Luego se entrega a través de una API REST y un servidor MCP. Si una fuente falla, esto se refleja en source_status. La llamada en sí nunca falla por ello.

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"]

Si InfraNode te ahorra una integración de datos: una estrella ayuda a otros desarrolladores a encontrar el proyecto.

Inicio rápido

URL base https://infranode.dev/api/v1. Sin clave, sin cuenta, simplemente llama:

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": "..." }
}

Cada respuesta sigue el mismo envoltorio { data, meta }: cada conjunto de datos lleva su attribution (licencia y fuente), y meta.source_status indica si la fuente upstream ha proporcionado datos. Una fuente caída se degrada limpiamente en lugar de hacer fallar la llamada.

En todos los tipos de datos, los nombres de campo están en snake_case y en inglés, y el mismo concepto siempre se llama igual: post_code, street, house_number, place, name, start, end, distance_km, power_kw, lat, lon. post_code es siempre una cadena de cinco dígitos (los ceros iniciales se conservan), las marcas de tiempo son ISO 8601 con zona horaria, y un valor que la fuente no proporciona es null, nunca una cadena vacía. Algunas respuestas incluyen además nombres duplicados más antiguos con valores idénticos (plz, zip, strasse, hausnummer, ort, city, bezeichnung, beginn, ende, art, dist_km, leistung_kw, einheit_typ, además de los campos crudos en camelCase de los mensajes de tráfico de autopistas). Estos nombres están obsoletos; usa los canónicos.

Consejo: llama primero a /api/v1/cities para encontrar los slugs canónicos de las ciudades (por ejemplo, koeln, berlin, hamburg), y luego un endpoint específico de ciudad.

El {slug} se resuelve de forma tolerante, por lo que rara vez necesitas la forma ASCII exacta: el nombre alemán con o sin diéresis, cualquier combinación de mayúsculas y minúsculas, exónimos ingleses comunes y formas abreviadas conducen todos al slug canónico (München/münchen/munich/munchen → muenchen, cologne → koeln, frankfurt → frankfurt-am-main). Un nombre desconocido devuelve 404 con la indicación Meintest du ...?, que menciona el slug más cercano.

Run in Postman

La referencia interactiva completa y la cobertura por ciudad están en infranode.dev. La API de InfraNode en Postman API Network refleja cada endpoint con respuestas de ejemplo reales, de modo que la Colección de Postman de la API de InfraNode se puede probar directamente en el navegador sin clave de API.

Datos (84 ciudades, 124 endpoints)

Cada categoría a continuación es un endpoint REST bajo /api/v1/cities/{slug}/<key>. A través de MCP, los mismos datos llegan mediante 12 herramientas ligeras: algunas con nombre (get_city_overview, weather, air_quality, pois, compare, los paneles en vivo) y una genérica get_city_resource(slug, resource=<key>) para cualquier otro tipo de datos (su enumeración resource lista las 81 claves).

GrupoTipos de datos (claves de endpoint)
Descubrirlist_cities, sources, compare (un tipo de datos en muchas ciudades), overview (catálogo más extracto en vivo en una llamada)
Clima y medio ambienteweather, weather-warnings, civil-protection-warnings (BBK NINA), air-uba (oficial), air (en vivo), pollen-uv, water-level, flood, fire-danger, bathing-water
Movilidadtransit, salidas en vivo por parada (herramienta transit_departures), stations (catálogo), paneles de estación según EVA (herramientas station_board_departures/station_board_arrivals, incluidos transporte regional e incidencias), station-departures, station-arrivals, traffic, road-events, webcams, charging, parking (ocupación en vivo), parking-onstreet, park-and-ride, mobility-points, bike-parking, sharing, fuel-prices, bike-counts
Ciudad y personasbase, geo, demographics, indicators, sustainability (indicadores ODS por municipio como serie temporal 2006-2023, Wegweiser Kommune / Fundación Bertelsmann, CC0), unemployment, tourism, construction, accidents, crime-stats, health, icu-live, holidays, election, events, council-papers (información municipal de concejos a través de OParl: propuestas, solicitudes y resoluciones por ciudad), pois, parques infantiles, mercados, baños públicos y otros tipos de OSM
Economía e inmueblesland-values, tax-rates (tipos de gravamen para impuesto comercial y predial por municipio), business-registrations (dinámica de creación de empresas por distrito), insolvencies (procedimientos de insolvencia por distrito: empresas y otros deudores, anual), public-tenders (contratación pública: licitaciones en curso y contratos adjudicados por ciudad)
Energía y vehículospower-load, power-price, energy, solar, solar-roofs, district-heating, vehicle-registrations

Comportamiento en operación

  • Sin clave, solo lectura. Sin credenciales, sin accesos de escritura, sin cuentas de usuario.
  • Envoltorio canónico. { data, meta } con estado y atribución por fuente.
  • Degradación suave. Una fuente caída devuelve source_status, no un error.
  • Diseño seguro. Las puertas SSRF e de inyección verifican cada solicitud; las entradas se validan contra listas permitidas fijas.

El modelo de seguridad está en SECURITY.md.

Paginación y preferencias por canal

Las listas de tipos de datos (charging, energy, events, transit, los endpoints de características OSM) tienen una preferencia según el canal con la misma URL:

  • REST directo devuelve la lista completa en una llamada (limit=null, returned == total, truncated=false).
  • GPT Actions (encabezados de OpenAI) y MCP están limitados a un tamaño de página predefinido para que las respuestas sean pequeñas para los agentes.
  • limit=all (o ?all=1) fuerza la lista completa en cualquier canal; limit y offset permiten paginar explícitamente.
  • meta.pagination (total/returned/limit/offset/truncated) está disponible en todos los canales, por lo que el extracto entregado siempre es trazable.

En traffic, la polilínea cruda es opcional: añade include=geometry (o ?full=1); la respuesta estándar permanece ligera.

Estabilidad, registro de cambios y hoja de ruta

¿Estás construyendo en producción sobre InfraNode? Entonces mantente al día con los cambios:

  • Registro de cambios lista cada cambio visible (nuevos tipos de datos, nuevas ciudades, comportamiento modificado, correcciones de errores, deprecaciones), el más reciente primero. Suscribible por RSS.
  • Hoja de ruta muestra lo planificado y el compromiso de estabilidad: la API crece de forma aditiva, el envoltorio permanece estable y los cambios en las respuestas existentes se anuncian con antelación (normalmente 30+ días).
  • Página de estado y los lanzamientos de GitHub cubren la disponibilidad y los cambios versionados.

Usar como servidor MCP

La misma API está disponible como servidor MCP remoto, por lo que los agentes de IA pueden llamar a los 78 tipos de datos como herramientas. Con Claude Code basta una línea:

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

Cualquier otro cliente MCP se configura en el mismo endpoint remoto (HTTP Streamable):

{
  "mcpServers": {
    "infranode": { "url": "https://mcp.infranode.dev/mcp" }
  }
}
  • Cursor / Windsurf: introduce el bloque anterior en ~/.cursor/mcp.json (o en la configuración MCP de la aplicación).
  • VS Code: code --add-mcp '{"name":"infranode","url":"https://mcp.infranode.dev/mcp"}'
  • Claude Desktop: introduce el mismo bloque mcpServers en claude_desktop_config.json.
  • ChatGPT: crea un conector con la URL https://mcp.infranode.dev/mcp.

Todas las herramientas llevan las anotaciones readOnlyHint: true / destructiveHint: false / idempotentHint: true, por lo que los clientes MCP pueden aprobarlas automáticamente sin riesgo. La capa MCP también incluye prompts listos (city_briefing, compare_air_quality, commute_check) y recursos (infranode://cities, infranode://sources). La guía de instalación completa, el manifiesto completo de herramientas con salidas de ejemplo, el modelo de permisos y una transcripción de ejemplo están en docs/mcp-install.md. El manifiesto de registro es server.json.

Usar en ChatGPT (acción de GPT personalizado)

GPT listo: InfraNode: German City Data - Weather & Transit está en la tienda de GPT (Research & Analysis) y funciona de inmediato.

Para una variante propia, InfraNode ofrece una especificación OpenAPI curada para GPT Actions: 23 de las operaciones más útiles (ChatGPT permite como máximo 30 por acción), sin clave, todas GET.

  1. En el Editor de GPT abre Configure → Actions → Create new action → Import from URL e inserta https://infranode.dev/actions/openapi.json.
  2. Deja la autenticación en None e introduce https://infranode.dev/datenschutz/ como política de privacidad.
  3. En las instrucciones del GPT, indica: comenzar con getCityOverview(slug), resolver nombres de ciudades mediante getCities y citar data.attribution (las licencias de datos exigen la atribución).

Detalles e instrucciones recomendadas: infranode.dev/chatgpt/. La especificación se genera desde scripts/build_actions_spec.py a partir de docs/openapi.yaml.

Alternativas y cómo se posiciona InfraNode

Otros servidores MCP cubren partes del espacio de datos alemán o europeo. Para datos abiertos a nivel de ciudad, InfraNode es el más amplio, y los proyectos a continuación a menudo se complementan entre sí:

  • germany-mcp-server Datos federales y gubernamentales (Autobahn, DWD, NINA, SMARD, Bundestag). A nivel nacional, sin profundidad por ciudad.
  • db-mcp-server / db-timetable-mcp solo horarios de Deutsche Bahn.
  • mcp-server-public-transport Transporte público en Europa; en Alemania cubre Berlín/Brandeburgo (VBB).
  • Servidores para ciudades individuales (como Múnich, Berlín) cubren una ciudad cada uno.

InfraNode cubre 84 ciudades alemanas y 82 tipos de datos detrás de un endpoint alojado sin clave API: medio ambiente, movilidad, energía, economía y vida urbana. La comparación completa lado a lado está en infranode.dev/mcp-vergleich.

Autoalojamiento (opcional)

No es necesario; el endpoint alojado anterior es la vía más rápida. El código está abierto. Inicia el stack de API localmente con 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}

Ejecuta el servidor MCP localmente vía stdio (contra la API pública):

uv sync --group mcp
INFRANODE_MCP_API_BASE=https://infranode.dev/api/v1 uv run python -m infranode.mcp.server

Para todas las configuraciones aplica el prefijo de entorno INFRANODE_ (ver .env.example), cada fuente de datos tiene su propio interruptor INFRANODE_ENABLE_*. Los secretos reales nunca llegan al repositorio; solo .env.example está versionado, y la CI ejecuta un escaneo de gitleaks.

Licencia: código y datos están separados

  • Código: Apache-2.0 (ver LICENSE).
  • Datos: Los datos abiertos que InfraNode entrega conservan las licencias de sus fuentes upstream (por ejemplo, ODbL para OpenStreetMap, DL-DE-BY para GovData, atribución para DWD). Estas licencias de datos y la atribución se gestionan por separado en DATA-LICENSES.md. La licencia Apache-2.0 aplica solo al código fuente de la API, no a los datos reenviados.

Contribuir

Las contribuciones son bienvenidas. La configuración, los comandos de puerta y la regla de secretos están en CONTRIBUTING.md. Para una nueva fuente de datos, el registro declarativo de fuentes en src/infranode/registry/source_specs.py es el punto de partida (una entrada SourceSpec por upstream); la lista de verificación completa está en CONTRIBUTING.md.