mcpField
I
InfraNode

InfraNode

远程服务
github.com/street1983nk法律与政务143 周前更新
代码仓库

关于 InfraNode

InfraNode 将德国城市的公共基础设施开放数据统一为免 API 密钥的 REST API,也提供远程 MCP 服务。它面向应用开发者和 AI Agent,提供规范化数据结构,并为每条数据附带来源和许可信息。

主要功能

  1. 01覆盖德国 84 个城市
  2. 02聚合天气、交通、能源等数据
  3. 03统一响应结构与字段
  4. 04附带数据来源和许可信息
  5. 05上游故障时提供状态信息
  6. 06提供只读工具、提示词和资源

适用场景

  1. 01查询城市天气和空气质量
  2. 02查看公共交通实时班次与延误
  3. 03比较多座城市的基础设施数据
  4. 04为城市数据应用提供统一接口

MCP 相关

提供远程 MCP 服务,通过 12 个只读工具访问城市开放数据,并附带提示词和资源。

配置

远程服务无需本地安装。选择你使用的客户端,复制配置或使用一键安装。

服务地址https://mcp.infranode.dev/mcp
一键复制安装命令
Claude CodeTerminal
Cursor.cursor/mcp.json
VS Code.vscode/mcp.json
Claude Desktopclaude_desktop_config.json
Windsurf~/.codeium/windsurf/mcp_config.json

命令在终端中运行;JSON 粘贴到对应客户端的 MCP 配置后重启。需要授权的服务会在首次连接时提示登录。

工具

12
参数类型必填说明
slugstring是城市标识符,例如 'berlin' 或 'hamburg'。解析较为宽松:德语名称可以带或不带变音符号,也接受任意大小写、常见的英文名称或简称(München/munich/munchen -> muenchen,cologne -> koeln,frankfurt -> frankfurt-am-main)。未知名称会返回 404,并附带 'Meintest du ...?' 建议。list_cities 提供规范 slug。

详细介绍

德语 | 英语

InfraNode

GitHub stars License: Apache 2.0 Glama score MCP Registry Smithery

德国开放数据 REST API:一个无需 API 密钥的公共基础设施开放数据 HTTP API,也可作为 MCP 服务使用。

德国各城市发布了大量开放数据,但每个数据源都有自己的格式、字段和特性, 而且有些数据源需要在相应门户注册。InfraNode 将约 20 个类别的数据 标准化,涵盖天气(DWD)、空气质量(UBA)、公共交通(包括实时出发信息)、 交通、电价(SMARD)、土地标准价值(BORIS)、停车、充电基础设施、 水位、人口统计、能源等,覆盖 84+ 个德国城市,并通过一个 接口提供。**无需 API 密钥,无需账户。**每个响应都采用相同的规范 { data, meta } 封装,并附有每个数据集的许可证和署名信息。这些数据也可通过 MCP 服务提供给 AI Agent(包含 12 个精简的只读工具,覆盖 78 种数据类型)。 入门方式是调用 get_city_overview,只需一次调用:它会返回某个城市可用 的所有数据类型目录,以及最重要数据的实时摘要。这样,Agent 就能看到 完整的数据范围,而不只是天气。InfraNode 持续扩展,定期添加新的数据类型和城市。

数据来源包括德国气象局(DWD)、联邦环境局(UBA)、Mobilithek/DELFI、 VBB(柏林-勃兰登堡交通协会,CC-BY 4.0)、GovData、OpenStreetMap、联邦网络局、 KBA 等。

使用场景

InfraNode 科隆实时概览:当前天气、官方空气质量、DWD 警报、含延误信息的实时列车出发信息、施工现场,以及完整的数据类型目录,全部通过一次无需 API 密钥的调用获取

只需调用一次 get_city_overview("koeln"):即可通过一个无需 API 密钥的 端点,获取当前天气、官方空气质量、DWD 警报、含延误信息的实时列车出发信息、 施工现场,以及该城市的完整数据目录。可在 infranode.dev 实时试用任意城市。

工作原理

一个通用 HTTP 客户端会查询上游数据源,将每个响应映射到规范架构,通过 许可证检查机制处理其署名信息,并缓存到 Redis 中(带有错误时使用陈旧数据的回退机制), 之后通过 REST API 和 MCP 服务提供数据。如果某个数据源不可用, 这一情况会反映在 source_status 中,但不会导致调用失败。

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

如果 InfraNode 帮你省去了数据集成工作:点个星有助于其他开发者发现这个项目。

快速入门

基础 URL:https://infranode.dev/api/v1。无需密钥,无需账户,直接 调用:

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

每个响应都遵循相同的 { data, meta } 封装:每条记录都带有自己的 attribution(许可证和来源),而 meta.source_status 会说明上游来源是否提供了 数据。这样,即使某个来源不可用,也能平稳降级,而不会导致调用失败。

所有数据类型的字段名称都采用 snake_case,且为英文,同一概念始终使用同一个名称: post_code、street、house_number、place、name、start、end、 distance_km、power_kw、lat、lon。post_code 始终是五位字符串(保留 前导零),时间戳采用带时区的 ISO 8601 格式,来源未提供的值为 null,绝不会是空 字符串。有些响应还会同时提供值相同的旧版别名(plz、zip、strasse、 hausnummer、ort、city、bezeichnung、beginn、ende、art、 dist_km、leistung_kw、einheit_typ,以及 Autobahn 交通消息中的 camelCase 原始 字段)。这些名称已过时,请使用规范名称。

提示:先调用 /api/v1/cities,查找规范的城市 slug(例如 koeln、berlin、 hamburg),然后再调用城市相关的 Endpoint。

{slug} 会以宽松方式解析,因此通常无需使用精确的 ASCII 形式:德语名称可带或不带 变音符号,大小写不限,常见的英文别名和简称也都会解析为规范 slug (München/münchen/munich/munchen → muenchen, cologne → koeln,frankfurt → frankfurt-am-main)。未知名称会返回 404, 并附上提示 Meintest du ...?,指出最接近的 slug。

在 Postman 中运行

完整的交互式参考文档和各城市的覆盖情况请访问 infranode.dev。 Postman API Network 中的 InfraNode API 列出了每个 Endpoint 及其真实示例响应,因此无需 API 密钥,即可直接在浏览器中试用 InfraNode API Postman Collection。

数据(84 个城市,124 个端点)

下面的每个类别都是 /api/v1/cities/{slug}/<key> 下的一个 REST 端点。通过 MCP,可通过 12 个轻量级工具获取相同数据:一些命名工具(get_city_overview、weather、air_quality、pois、compare、实时站点牌),以及一个通用工具 get_city_resource(slug, resource=<key>),用于获取其他所有数据类型(其 resource 枚举列出了全部 81 个键)。

分组数据类型(端点键)
探索list_cities、sources、compare(跨多个城市查询一种数据类型)、overview(一次调用即可获取目录和实时数据摘要)
天气与环境weather、weather-warnings、civil-protection-warnings(BBK NINA)、air-uba(官方数据)、air(实时数据)、pollen-uv、water-level、flood、fire-danger、bathing-water
出行transit、各站点实时出发信息(工具 transit_departures)、stations(目录)、按 EVA 查询的火车站站点牌(工具 station_board_departures/station_board_arrivals,包括区域交通和服务中断信息)、station-departures、station-arrivals、traffic、road-events、webcams、charging、parking(实时占用情况)、parking-onstreet、park-and-ride、mobility-points、bike-parking、sharing、fuel-prices、bike-counts
城市与民众base、geo、demographics、indicators、sustainability(各市镇的 SDG 指标时间序列,涵盖 2006-2023 年,来源:Wegweiser Kommune / Bertelsmann Stiftung,CC0)、unemployment、tourism、construction、accidents、crime-stats、health、icu-live、holidays、election、events、council-papers(通过 OParl 获取市政议会信息:各城市的提案、动议和决议)、pois、游乐场、集市、厕所及其他 OSM 类型
经济与房地产land-values、tax-rates(各市镇的营业税和房产税税率)、business-registrations(各县的企业创立动态)、insolvencies(各县的破产程序:企业及其他债务人,按年统计)、public-tenders(公共采购:各城市正在进行的招标和已授予的合同)
能源与车辆power-load、power-price、energy、solar、solar-roofs、district-heating、vehicle-registrations

运行时行为

  • 无需密钥,只读。 无需凭据,不提供写入访问权限,也没有用户账户。
  • 规范化封装。 使用 { data, meta },其中包含状态和各来源的归属信息。
  • 平稳降级。 某个来源不可用时会返回 source_status,而不是报错。
  • 安全设计。 每个请求都会经过 SSRF 和注入防护检查,输入也会与固定允许列表进行匹配。

安全模型见 SECURITY.md。

分页与渠道默认设置

数据类型列表(charging、energy、events、transit、OSM 要素端点)在 URL 相同的情况下,默认设置会因渠道而异:

  • 直接 REST 一次调用即可返回完整列表(limit=null、returned == total、truncated=false)。
  • GPT Actions(OpenAI 标头)和 MCP 使用预设的分页大小,以保持 Agent 的响应简洁。
  • limit=all(或 ?all=1)会强制任何渠道返回完整列表;也可通过 limit 和 offset 显式翻页。
  • meta.pagination(total/returned/limit/offset/truncated)适用于每个渠道,因此始终可以了解已返回内容的范围。

对于 traffic,原始折线数据为可选项:添加 include=geometry(或 ?full=1),默认响应则保持精简。

稳定性、更新日志与路线图

你正在生产环境中使用 InfraNode?及时了解最新变化:

  • 更新日志 按时间倒序列出所有可见变更(新增数据类型、新增城市、行为变更、错误修复、弃用)。可通过 RSS 订阅。
  • 路线图 展示计划内容和稳定性承诺:API 只会以新增方式扩展,信封格式保持稳定,现有响应的变更会提前公告(通常提前 30+ 天)。
  • 状态页 和 GitHub 发行版涵盖服务可用性和版本化变更。

将其用作 MCP 服务

同一 API 也可通过远程 MCP 服务使用,因此 AI Agent 可以将全部 78 种 数据类型作为工具调用。使用 Claude Code 时,只需一行:

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

其他 MCP 客户端只需连接到相同的远程端点(Streamable HTTP):

{
  "mcpServers": {
    "infranode": { "url": "https://mcp.infranode.dev/mcp" }
  }
}
  • Cursor / Windsurf: 将上面的代码块填入 ~/.cursor/mcp.json(或应用的 MCP 设置)。
  • VS Code: code --add-mcp '{"name":"infranode","url":"https://mcp.infranode.dev/mcp"}'
  • Claude Desktop: 将相同的 mcpServers 代码块填入 claude_desktop_config.json。
  • ChatGPT: 使用 URL https://mcp.infranode.dev/mcp 创建连接器。

所有工具都带有注解 readOnlyHint: true / destructiveHint: false / idempotentHint: true,因此 MCP 客户端可以安全地自动批准它们。MCP 层还提供现成的 提示词(city_briefing、compare_air_quality、commute_check)和 资源(infranode://cities、infranode://sources)。完整的安装指南、包含示例输出的完整工具清单、权限模型和示例对话记录,请参阅 docs/mcp-install.md。Registry 清单位于 server.json。

在 ChatGPT 中使用(自定义 GPT Action)

现成的 GPT: InfraNode:德国城市数据 - 天气与公共交通 已上架 GPT Store(Research & Analysis),开箱即用。

如需创建自定义版本,InfraNode 提供了为 GPT Actions 精选的 OpenAPI 规范:包含 23 个最实用的操作(ChatGPT 每个 Action 最多允许 30 个),无需密钥,全部为 GET。

  1. 在 GPT 编辑器中打开 Configure → Actions → Create new action → Import from URL,并填入 https://infranode.dev/actions/openapi.json。
  2. 将身份验证保持为 None,并填写隐私政策 URL: https://infranode.dev/datenschutz/。
  3. 在 GPT 的 Instructions 中注明:从 getCityOverview(slug) 开始, 通过 getCities 解析城市名称,并引用 data.attribution(数据许可证要求注明来源)。

详情和建议使用的 Instructions: infranode.dev/chatgpt/。该规范由 scripts/build_actions_spec.py 根据 docs/openapi.yaml 生成。

替代方案及 InfraNode 的定位

其他 MCP 服务覆盖了德国或欧洲数据空间的部分内容。 对于城市级开放数据,InfraNode 的覆盖面最广,下面的项目 通常可以互相补充:

  • germany-mcp-server 联邦和政府数据(Autobahn、DWD、NINA、SMARD、Bundestag)。覆盖全国,但没有城市级深度。
  • db-mcp-server / db-timetable-mcp 仅提供德国铁路时刻表。
  • mcp-server-public-transport 欧洲公共交通,在德国覆盖柏林/勃兰登堡(VBB)。
  • 单个城市的服务(例如慕尼黑、柏林)各自覆盖一个城市。

InfraNode 通过一个无需 API 密钥的托管 Endpoint,覆盖 84 个德国城市和 82 种数据类型:环境、交通、能源、经济和城市生活。完整的并排对比请见 infranode.dev/mcp-vergleich。

自托管(可选)

这并非必需,上面的托管 Endpoint 是最快的方式。不过,代码是开源的。使用 Docker(Compose v2)在本地启动 API 技术栈:

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}

通过 stdio 在本地运行 MCP 服务本身(连接公共 API):

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

所有设置都使用环境变量前缀 INFRANODE_(参见 .env.example),每个数据源都有自己的 INFRANODE_ENABLE_* 开关。真实密钥绝不会放入仓库,只有 .env.example 会纳入版本控制,CI 也会运行 gitleaks 扫描。

许可证:代码与数据分开

  • 代码: Apache-2.0(参见 LICENSE)。
  • 数据: InfraNode 提供的开放数据保留其上游来源的许可证(例如 OpenStreetMap 使用 ODbL,GovData 使用 DL-DE-BY,DWD 使用署名许可)。这些数据许可证和署名信息单独记录在 DATA-LICENSES.md 中。Apache-2.0 许可证仅适用于 API 源代码,不适用于转发的数据。

参与贡献

欢迎贡献。设置方法、门禁命令和密钥规则请见 CONTRIBUTING.md。添加新数据源时,请从 src/infranode/registry/source_specs.py 中的声明式来源注册表开始(每个上游对应一个 SourceSpec 条目);完整检查清单请见 CONTRIBUTING.md。

评论

支持 Markdown

第一次接触 MCP?

从协议是什么,到在客户端里装上第一个服务,这几条回答覆盖了大多数入门问题。

一个开放协议,规定了 AI 应用如何以统一方式连接外部工具与数据源。客户端负责与模型对话,MCP 服务负责提供工具、资源和提示模板,两者通过标准消息通信,同一个服务可以被不同客户端复用。