关于 swiss-geodata-mcp
swiss-geodata-mcp 是用于查询瑞士联邦地理数据的 MCP 服务,涵盖图层、分区、市镇边界、高程和坐标转换。该项目已弃用且不再维护;README 建议改用整合了其功能的 `swisstopo-mcp`。
主要功能
- 01搜索联邦地理数据图层目录
- 02识别和查找地图要素
- 03查询分区和市镇
- 04获取地形高程和剖面
- 05转换 WGS84 与 LV95 坐标
适用场景
- 01按主题查找联邦地理数据图层
- 02查询某点所属分区或市镇
- 03查看地形高程或高程剖面
- 04转换 WGS84 与 LV95 坐标
MCP 相关
向 MCP 客户端提供九个只读地理数据工具,并查询 geo.admin.ch 服务。该仓库已弃用,项目建议用户改用 `swisstopo-mcp`。
配置
本地服务的配置在各客户端中通用,复制后粘贴到客户端的 MCP 配置文件即可。
工具
9收录的工具列表 · 更新于 2 周前
| 参数 | 类型 | 必填 | 说明 |
|---|---|---|---|
| params | any | 是 |
详细介绍
⚠️ 已弃用 — 请改用
swisstopo-mcp此服务已整合至
swisstopo-mcp, 不再维护。它提供的所有功能现在都已纳入该项目, 包括此前仅由它提供的官方 REFRAME 坐标转换功能。**原因:**两个服务都封装了相同的
api3.geo.admin.ch端点, 且在五项核心工具(图层搜索、识别、查找、高度、 高程剖面)上存在重叠。为同一数据源维护两个服务,意味着审计工作量翻倍、 CVE 更新次数翻倍,也让用户难以选择。相关原因和迁移步骤详见docs/merge-plan-swiss-geodata-mcp.md。**此仓库将归档。**以下代码仍可运行,但 不会再收到修复或依赖项更新。请参阅下文的 迁移。
🇨🇭 属于 瑞士公共数据 MCP 组合
🗺️ swiss-geodata-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_coordinates | WGS84 ↔ 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=layers | 200 | ✅ 正常 | 目录支持全文搜索 |
| MapServer identify(bauzonen、boundaries) | 200 | ✅ 正常 | 多边形图层的容差为 0 时也能正常工作 |
| height 服务 | 200 | ✅ 正常 | 返回的值是 JSON 字符串 |
| profile.json(GET + geom) | 200 | ✅ 正常 | COMB/DTM2/DTM25 高程 |
MapServer {layer}/legend | 200 | ⚠️ HTML | geo_layer_info 会将其转换为纯文本 |
| reframe wgs84↔lv95 | 200 | ✅ 正常 | 返回的坐标是 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_TRANSPORT | stdio | stdio | streamable-http | sse |
HOST / PORT | 127.0.0.1 / 8000 | HTTP 绑定(仅限云端传输)。默认绑定到环回地址;在云端部署中,需显式设置 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 及发布数据的联邦部门),注明来源即可使用的开放政府数据。
致谢与相关项目
- 数据与服务:geo.admin.ch(swisstopo)、ARE、swisstopo geodesy
- 同系列项目:
swiss-housing-mcp(登记图层)、swiss-statistics-mcp(统计图层)、zurich-opendata-mcp(市政图层)
作者
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_layers | swisstopo_search_layers | — |
geo_identify | swisstopo_identify_features | — |
geo_find | swisstopo_find_features | — |
geo_height | swisstopo_get_height | — |
geo_elevation_profile | swisstopo_elevation_profile | 接受坐标字符串;对于 LV95 支持点,请设置 coordinate_system="lv95" |
geo_zoning_at | swisstopo_zoning_at | ARE 的非约束性说明现在会随每条结果记录一并返回 |
geo_municipality_at | swisstopo_municipality_at | BFS 编号命名为 bfs_commune_number,并规范化为 int |
geo_layer_info | swisstopo_layer_info | — |
geo_convert_coordinates | swisstopo_convert_coordinates | direction 的取值相同;使用相同的 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。
评论
一个开放协议,规定了 AI 应用如何以统一方式连接外部工具与数据源。客户端负责与模型对话,MCP 服务负责提供工具、资源和提示模板,两者通过标准消息通信,同一个服务可以被不同客户端复用。