mcpField
S
swiss-geodata-mcp

swiss-geodata-mcp

本地服务
github.com地图与出行013 周前更新

关于 swiss-geodata-mcp

swiss-geodata-mcp 是用于查询瑞士联邦地理数据的 MCP 服务,涵盖图层、分区、市镇边界、高程和坐标转换。该项目已弃用且不再维护;README 建议改用整合了其功能的 `swisstopo-mcp`。

主要功能

  1. 01搜索联邦地理数据图层目录
  2. 02识别和查找地图要素
  3. 03查询分区和市镇
  4. 04获取地形高程和剖面
  5. 05转换 WGS84 与 LV95 坐标

适用场景

  1. 01按主题查找联邦地理数据图层
  2. 02查询某点所属分区或市镇
  3. 03查看地形高程或高程剖面
  4. 04转换 WGS84 与 LV95 坐标

MCP 相关

向 MCP 客户端提供九个只读地理数据工具,并查询 geo.admin.ch 服务。该仓库已弃用,项目建议用户改用 `swisstopo-mcp`。

配置

本地服务的配置在各客户端中通用,复制后粘贴到客户端的 MCP 配置文件即可。

mcp.json · 通用配置
{
"mcpServers": {
"malkreide-swiss-geodata": {
"command": "uvx",
"args": [
"swiss-geodata-mcp"
]
}
}
}
启动命令uvx swiss-geodata-mcp

本地服务需要在你的电脑上安装运行环境(如 Node.js 18+)。各客户端的配置文件位置不同,请参考客户端文档。

安装包
pypiswiss-geodata-mcp0.1.1

工具

9

收录的工具列表 · 更新于 2 周前

参数类型必填说明
paramsany是

详细介绍

⚠️ 已弃用 — 请改用 swisstopo-mcp

此服务已整合至 swisstopo-mcp, 不再维护。它提供的所有功能现在都已纳入该项目, 包括此前仅由它提供的官方 REFRAME 坐标转换功能。

**原因:**两个服务都封装了相同的 api3.geo.admin.ch 端点, 且在五项核心工具(图层搜索、识别、查找、高度、 高程剖面)上存在重叠。为同一数据源维护两个服务,意味着审计工作量翻倍、 CVE 更新次数翻倍,也让用户难以选择。相关原因和迁移步骤详见 docs/merge-plan-swiss-geodata-mcp.md。

**此仓库将归档。**以下代码仍可运行,但 不会再收到修复或依赖项更新。请参阅下文的 迁移。

🇨🇭 属于 瑞士公共数据 MCP 组合

🗺️ swiss-geodata-mcp

CI PyPI Python License: MIT swiss-public-data-mcp

用于瑞士联邦地理数据(geo.admin.ch)的 MCP 服务。

将 AI 模型连接至联邦地理数据基础设施:约 700 个可通过关键词发现的图层、任意点位的空间识别、建筑分区(ARE)、市镇查询(swissBOUNDARIES3D)、地形高度和高程剖面(swissALTI3D),以及 WGS84↔LV95 坐标转换。属于 swiss-public-data-mcp 组合的一部分。个人项目,与任何雇主或机构无关。

🇩🇪 德语版


演示查询(示例)

In which building zone is the school building at Seilergraben 76 in Zurich,
and how high above sea level is it?

→ geo_zoning_at(2683531, 1247914) + geo_height(2683531, 1247914) 返回协调统一的 ARE 分区和海拔 411 米 — 已于 2026-07-24 在线验证。

与 swiss-housing-mcp 结合使用:

What applies at this address?

→ address_to_egid("Seilergraben 76 Zürich")(住房)提供 LV95 坐标 → geo_zoning_at + geo_municipality_at(地理数据)提供分区和市镇信息。如果说 GWR 是地址簿,那么 geo.admin.ch 就是地图集。


工具(9 个)

工具说明数据源
geo_search_layers在约 700 个图层的联邦目录中按关键词搜索geo.admin.ch SearchServer
geo_identify此 LV95 点位上有什么?(任意图层)geo.admin.ch MapServer identify
geo_find按属性值查找图层中的要素geo.admin.ch MapServer find
geo_municipality_at获取包含某点的市镇和州swissBOUNDARIES3D
geo_zoning_at获取某点所在的建筑分区ch.are.bauzonen (ARE)
geo_height获取某点的地形高度swissALTI3D height service
geo_elevation_profile获取沿线的高程剖面geo.admin.ch profile service
geo_layer_info查询图层的可查询字段和图例(纯文本)geo.admin.ch MapServer
geo_convert_coordinatesWGS84 ↔ LV95 坐标转换geodesy.geo.admin.ch reframe

geo_search_layers 是发现入口,无需为每个图层单独提供一个工具即可覆盖整个目录;随后,geo_layer_info 会显示图层中可供 geo_find 查询的字段。

工具注解(MCP 提示)

所有工具均为只读(readOnlyHint: ✅,destructiveHint: ✗),并会查询实时上游服务(openWorldHint: ✅)。严格来说,这些工具都不具备幂等性,因为上游数据可能在调用之间发生变化。

架构决策

此服务采用 架构 A(仅实时 API)——这是有意偏离作品集默认的优先使用数据转储方案,并按照作品集惯例记录:

  • 联邦地理数据基础设施涵盖约 700 个图层和数 TB 数据;缓存数据转储既不可行,也无用。
  • api3.geo.admin.ch 专为点位/要素查询而构建,所有探测均无需身份验证且响应可靠(2026-07-24 实时探测:SearchServer、identify、find、height、profile、legend、图层元数据、reframe——均返回 HTTP 200,无需身份验证)。
  • 结果:没有本地缓存,也没有 TTL 逻辑;每个响应都带有 provenance: live_api。
实时探测结果(2026-07-24)
端点HTTP状态说明
SearchServer type=layers200✅ 正常目录支持全文搜索
MapServer identify(bauzonen、boundaries)200✅ 正常多边形图层的容差为 0 时也能正常工作
height 服务200✅ 正常返回的值是 JSON 字符串
profile.json(GET + geom)200✅ 正常COMB/DTM2/DTM25 高程
MapServer {layer}/legend200⚠️ HTMLgeo_layer_info 会将其转换为纯文本
reframe wgs84↔lv95200✅ 正常返回的坐标是 JSON 字符串
identify/find 未命中200⚠️ 软错误results 数组为空——并非 HTTP 错误

快速开始

Claude Desktop
{
  "mcpServers": {
    "swiss-geodata": {
      "command": "uvx",
      "args": ["swiss-geodata-mcp"]
    }
  }
}
云端 / Render.com(Streamable HTTP)
SWISS_GEODATA_TRANSPORT=streamable-http PORT=8000 swiss-geodata-mcp

配置

变量默认值用途
SWISS_GEODATA_TRANSPORTstdiostdio | streamable-http | sse
HOST / PORT127.0.0.1 / 8000HTTP 绑定(仅限云端传输)。默认绑定到环回地址;在云端部署中,需显式设置 HOST=0.0.0.0 以开放所有网络接口。

无需 API 密钥——第 1 阶段无需身份验证。

查询示例

学校规划
  • «拟建学校扩建项目用地适用哪种建筑区?» → geo_zoning_at
  • «此坐标位于哪个市镇和州?» → geo_municipality_at(关联 swiss-statistics-mcp 和 swiss-housing-mcp 使用的 BFS 编号)
  • «两点之间的上学路线有多陡?» → geo_elevation_profile
图层发现
  • «是否有联邦噪声暴露数据?» → geo_search_layers("lärm") → geo_layer_info → geo_identify

请参阅 EXAMPLES.md,了解按受众(学校、家长、公众、开发者)分类的使用案例,以及工具选择参考表。

测试

PYTHONPATH=src pytest tests/ -m "not live"   # CI-safe (respx-mocked)
PYTHONPATH=src pytest tests/ -m live         # against real upstream

项目结构

swiss-geodata-mcp/
├── src/swiss_geodata_mcp/
│   ├── server.py      # FastMCP tools (9, prefix geo_*)
│   ├── geoadmin.py    # geo.admin.ch client + retry + normalisation
│   ├── models.py      # Pydantic v2 envelopes (source + provenance)
│   └── __main__.py    # Dual-transport entry point
├── tests/             # respx-mocked + @pytest.mark.live
└── .github/workflows/ # CI + OIDC PyPI publish

已知限制

  • 登记信息由其他服务管理: 建筑/住宅实体(EGID/EWID)属于 swiss-housing-mcp;此服务负责空间图层(区域、边界、高程)。这是为了避免出现两个功能重复的服务而有意作出的分工。
  • 协调后的分区图层(ch.are.bauzonen)是 ARE 的综合成果;只有州级/市镇级的 Nutzungsplanung 具有法律约束力(每个 geo_zoning_at 响应中都会注明)。
  • 学区多边形属于市镇数据(→ zurich-opendata-mcp),而非联邦数据;此服务提供市镇边界,不提供 Schulkreise。
  • geo_identify 的结果数量受上游限制;本服务不支持全区域汇总(登记信息场景请参见 swiss-housing-mcp 中的 buildings_in_bbox)。
  • 坐标必须使用 LV95;使用 WGS84 输入会立即报错,并提示使用 geo_convert_coordinates。

更新日志

请参阅 CHANGELOG.md

贡献

欢迎贡献——有关如何报告错误、建议新增图层或提交代码,请参阅 CONTRIBUTING.md。

安全

这是一个只读、不处理个人身份信息(PII)的公共开放数据服务。有关安全措施以及如何报告漏洞,请参阅 SECURITY.md。

许可证

MIT 许可证 — 详见 LICENSE。数据:瑞士联邦地理数据基础设施(geo.admin.ch / swisstopo 及发布数据的联邦部门),注明来源即可使用的开放政府数据。

致谢与相关项目

作者

malkreide · GitHub


迁移到 swisstopo-mcp

在 MCP 客户端配置中替换此服务:

// before
{ "swiss-geodata": { "command": "uvx", "args": ["swiss-geodata-mcp"] } }
// after
{ "swisstopo":     { "command": "uvx", "args": ["swisstopo-mcp"] } }
工具映射
此服务swisstopo-mcp备注
geo_search_layersswisstopo_search_layers—
geo_identifyswisstopo_identify_features—
geo_findswisstopo_find_features—
geo_heightswisstopo_get_height—
geo_elevation_profileswisstopo_elevation_profile接受坐标字符串;对于 LV95 支持点,请设置 coordinate_system="lv95"
geo_zoning_atswisstopo_zoning_atARE 的非约束性说明现在会随每条结果记录一并返回
geo_municipality_atswisstopo_municipality_atBFS 编号命名为 bfs_commune_number,并规范化为 int
geo_layer_infoswisstopo_layer_info—
geo_convert_coordinatesswisstopo_convert_coordinatesdirection 的取值相同;使用相同的 REFRAME 服务
值得了解的两个差异

坐标。 此服务仅支持 LV95,并会拒绝 WGS84。swisstopo-mcp 的点位工具接受 lat/lon(WGS84)或 easting/northing(LV95) — 传入其中一组,不要两组都传。现有的 LV95 调用仍可正常使用;参数名称相同。

响应结构。 此服务返回 JSON 字符串(GeoEnvelope),有效载荷位于 result 下。swisstopo-mcp 返回结构化的 ToolResponse: 记录位于 results(复数,始终为列表)中,并附带 count、match_type、 source、license 和 Markdown 格式的 summary。解析 result 的代码需要改为读取 results。

评论

支持 Markdown

第一次接触 MCP?

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

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