mcpField
S
swiss-geodata-mcp

swiss-geodata-mcp

ローカル
github.com地図・旅行013 週間前に更新

swiss-geodata-mcp について

swiss-geodata-mcpは、レイヤー、ゾーニング、自治体境界、標高、座標変換を照会するスイス連邦地理データ向けMCPサーバーです。非推奨で保守終了となっており、機能を統合した`swisstopo-mcp`への移行が案内されています。

主な機能

  1. 01連邦地理データのレイヤーカタログ検索
  2. 02地図フィーチャーの識別・検索
  3. 03ゾーニングと自治体の照会
  4. 04地形標高と標高プロファイルの取得
  5. 05WGS84とLV95の座標変換

活用シーン

  1. 01テーマ別に連邦地理データのレイヤーを探す
  2. 02地点のゾーンや自治体を確認する
  3. 03地形標高や標高プロファイルを調べる
  4. 04WGS84とLV95の座標を変換する

MCP 対応

geo.admin.chのサービスを照会する9個の読み取り専用地理データツールをMCPクライアントに公開します。リポジトリは非推奨で、`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 エンドポイントをラップし、 主要な 5 つのツール(レイヤー検索、地点情報の特定、検索、高度、 標高プロファイル)が重複していました。1 つのデータソースに対して 2 つのサーバーを維持すると、 監査と 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 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_coordinatesWGS84 ↔ 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=layers200✅ 動作カタログは全文検索可能
MapServer identify(bauzonen、境界)200✅ 動作ポリゴンレイヤーでは tolerance 0 が機能
height service200✅ 動作値は 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 番号に対応します)
  • 「この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 および公開を担う連邦機関)。出典表示が必要なオープンガバメントデータです。

クレジットと関連プロジェクト

作者

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_at拘束力のない ARE に関する注意事項が、各結果レコードに含まれるようになりました
geo_municipality_atswisstopo_municipality_atBFS 番号は bfs_commune_number という名前で、int に正規化されます
geo_layer_infoswisstopo_layer_info—
geo_convert_coordinatesswisstopo_convert_coordinatesdirection の値と 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 を参照する必要があります。

コメント

MCP は初めてですか?

プロトコルの概要から最初のサーバーの導入まで、よくある疑問にまとめて答えます。

AI アプリケーションが外部のツールやデータソースに統一的な方法で接続するためのオープンなプロトコルです。クライアントはモデルとの対話を担い、MCP サーバーはツール・リソース・プロンプトテンプレートを提供します。標準メッセージでやり取りするため、1 つのサーバーを複数のクライアントで再利用できます。