关于 InfraNode
InfraNode 将德国城市的公共基础设施开放数据统一为免 API 密钥的 REST API,也提供远程 MCP 服务。它面向应用开发者和 AI Agent,提供规范化数据结构,并为每条数据附带来源和许可信息。
主要功能
- 01覆盖德国 84 个城市
- 02聚合天气、交通、能源等数据
- 03统一响应结构与字段
- 04附带数据来源和许可信息
- 05上游故障时提供状态信息
- 06提供只读工具、提示词和资源
适用场景
- 01查询城市天气和空气质量
- 02查看公共交通实时班次与延误
- 03比较多座城市的基础设施数据
- 04为城市数据应用提供统一接口
MCP 相关
提供远程 MCP 服务,通过 12 个只读工具访问城市开放数据,并附带提示词和资源。
配置
远程服务无需本地安装。选择你使用的客户端,复制配置或使用一键安装。
https://mcp.infranode.dev/mcpclaude mcp add --transport http dev-infranode-infranode https://mcp.infranode.dev/mcp{"mcpServers":{"dev-infranode-infranode":{"type":"http","url":"https://mcp.infranode.dev/mcp"}}}在 Cursor 中打开{"servers":{"dev-infranode-infranode":{"type":"http","url":"https://mcp.infranode.dev/mcp"}}}在 VS Code 中打开{"mcpServers":{"dev-infranode-infranode":{"type":"http","url":"https://mcp.infranode.dev/mcp"}}}{"mcpServers":{"dev-infranode-infranode":{"serverUrl":"https://mcp.infranode.dev/mcp"}}}命令在终端中运行;JSON 粘贴到对应客户端的 MCP 配置后重启。需要授权的服务会在首次连接时提示登录。
工具
12| 参数 | 类型 | 必填 | 说明 |
|---|---|---|---|
| slug | string | 是 | 城市标识符,例如 'berlin' 或 'hamburg'。解析较为宽松:德语名称可以带或不带变音符号,也接受任意大小写、常见的英文名称或简称(München/munich/munchen -> muenchen,cologne -> koeln,frankfurt -> frankfurt-am-main)。未知名称会返回 404,并附带 'Meintest du ...?' 建议。list_cities 提供规范 slug。 |
详细介绍
德语 | 英语
InfraNode
德国开放数据 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 等。
使用场景
只需调用一次 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 & 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。
完整的交互式参考文档和各城市的覆盖情况请访问 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。
- 在 GPT 编辑器中打开 Configure → Actions →
Create new action → Import from URL,并填入
https://infranode.dev/actions/openapi.json。 - 将身份验证保持为 None,并填写隐私政策 URL:
https://infranode.dev/datenschutz/。 - 在 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。
评论
一个开放协议,规定了 AI 应用如何以统一方式连接外部工具与数据源。客户端负责与模型对话,MCP 服务负责提供工具、资源和提示模板,两者通过标准消息通信,同一个服务可以被不同客户端复用。
