swiss-geodata-mcp について
swiss-geodata-mcpは、レイヤー、ゾーニング、自治体境界、標高、座標変換を照会するスイス連邦地理データ向けMCPサーバーです。非推奨で保守終了となっており、機能を統合した`swisstopo-mcp`への移行が案内されています。
主な機能
- 01連邦地理データのレイヤーカタログ検索
- 02地図フィーチャーの識別・検索
- 03ゾーニングと自治体の照会
- 04地形標高と標高プロファイルの取得
- 05WGS84とLV95の座標変換
活用シーン
- 01テーマ別に連邦地理データのレイヤーを探す
- 02地点のゾーンや自治体を確認する
- 03地形標高や標高プロファイルを調べる
- 04WGS84とLV95の座標を変換する
MCP 対応
geo.admin.chのサービスを照会する9個の読み取り専用地理データツールをMCPクライアントに公開します。リポジトリは非推奨で、`swisstopo-mcp`への移行が案内されています。
設定
ローカルサーバーの設定はどのクライアントでも共通です。コピーしてクライアントの MCP 設定ファイルに貼り付けてください。
ツール
9掲載時のツール一覧 · 2 週間前に更新
| パラメーター | 型 | 必須 | 説明 |
|---|---|---|---|
| params | any | はい |
詳細
⚠️ 非推奨 — 代わりに
swisstopo-mcpをご利用くださいこのサーバーの機能は
swisstopo-mcpに統合されており、 メンテナンスは終了しています。このサーバーが提供していたすべての機能が移行先に含まれており、 このサーバーだけが提供していた公式の REFRAME 座標変換も利用できます。理由: どちらのサーバーも同じ
api3.geo.admin.chエンドポイントをラップし、 主要な 5 つのツール(レイヤー検索、地点情報の特定、検索、高度、 標高プロファイル)が重複していました。1 つのデータソースに対して 2 つのサーバーを維持すると、 監査と 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 m が返されます — 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レイヤー、数テラバイトに及ぶため、ダンプのキャッシュは実現不可能で、有用でもありません。
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、境界) | 200 | ✅ 動作 | ポリゴンレイヤーでは tolerance 0 が機能 |
| height service | 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 番号に対応します) - 「この2地点間の通学路はどのくらい急ですか?」→
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 を参照してください。
セキュリティ
これは読み取り専用で、個人を特定できる情報を扱わない、一般公開データ用のサーバーです。セキュリティ方針と脆弱性の報告方法については、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 サービスは同じです |
知っておきたい 2 つの違い
座標。 このサーバーは LV95 のみを受け付け、WGS84 は拒否していました。swisstopo-mcp の座標ベースのツールでは、lat/lon(WGS84)または easting/northing(LV95)のどちらかを指定できます。両方ではなく、いずれか一組を渡してください。既存の LV95 呼び出し元は引き続き動作します。引数名も同じです。
レスポンスの形式。 このサーバーは、ペイロードを result の下に格納した JSON 文字列(GeoEnvelope)を返していました。swisstopo-mcp は構造化された ToolResponse を返します。レコードは results(複数形。常にリスト)の中にあり、count、match_type、source、license、Markdown の summary も併せて返されます。result を解析していたコードでは、results を参照する必要があります。
コメント
AI アプリケーションが外部のツールやデータソースに統一的な方法で接続するためのオープンなプロトコルです。クライアントはモデルとの対話を担い、MCP サーバーはツール・リソース・プロンプトテンプレートを提供します。標準メッセージでやり取りするため、1 つのサーバーを複数のクライアントで再利用できます。