mcpField
W
wsl-envidat-mcp

wsl-envidat-mcp

ローカル
github.com科学・教育05 週間前に更新

wsl-envidat-mcp について

wsl-envidat-mcpは、スイスのWSL研究機関がEnviDatで公開する環境研究データをMCPクライアントに提供します。森林、雪氷、自然災害、生物多様性、景観データをキーワード、分野、地理範囲で検索でき、複数分野の専用ツールも備えています。

主な機能

  1. 01キーワード、分野、位置による検索
  2. 02データセット詳細とダウンロードリンク取得
  3. 03研究部門、タグ、最新データセットの閲覧
  4. 04雪崩、森林、自然災害データの照会
  5. 05組織・分野リソースへのアクセス
  6. 06stdioとStreamable HTTPに対応

活用シーン

  1. 01ヴァレー州の雪崩事故データを検索
  2. 02チューリヒ州の森林健全性データを確認
  3. 03ブリエンツ周辺の地滑りリスクデータを検索
  4. 04ボーデン湖周辺を対象とするデータを検索

MCP 対応

MCPサーバーは、EnviDat CKAN APIの公開環境研究データをツールとリソースとして提供します。すべてのツールは読み取り専用で、APIキーは不要です。

設定

ローカルサーバーの設定はどのクライアントでも共通です。コピーしてクライアントの MCP 設定ファイルに貼り付けてください。

mcp.json · 共通設定
{
"mcpServers": {
"malkreide-wsl-envidat": {
"command": "uvx",
"args": [
"wsl-envidat-mcp"
]
}
}
}
起動コマンドuvx wsl-envidat-mcp

ローカルサーバーにはマシン上の実行環境(Node.js 18 以上など)が必要です。設定ファイルの場所はクライアントごとに異なります。

パッケージ
pypiwsl-envidat-mcp0.3.1

ツール

10

掲載時のツール一覧 · 2 週間前に更新

パラメーター型必須説明
paramsanyはい

詳細

🇨🇭 スイス公共データ MCP ポートフォリオの一部

wsl-envidat-mcp 🌲❄️⛰️

Version License: MIT Python 3.11+ MCP Data Source No API Key CI

EnviDat を介して、WSL のスイス環境研究データ(森林、雪崩、自然災害、生物多様性)と AI モデルをつなぐ MCP サーバーです。API キーは不要です。

🇩🇪 ドイツ語版


フェーズ

このサーバーはフェーズ 1:読み取り専用ラッパーです。

プロパティ状態
読み取りツール✅ 10 個のツール、すべて readOnlyHint: true
書き込みツール❌ なし(EnviDat は読み取り専用の公開データです)
セマンティックレイヤー⚠️ 部分対応 — 3 つのドメインツールが Solr クエリを調整します
OAuth / 認証ゲートウェイ❌ 不要(公開オープンデータ、API キー不要)
コンテナーの強化✅ マルチステージ Dockerfile、非 root
テストスイート✅ オフライン単体テスト 38 件 + ライブ統合テスト 31 件
監査実施✅ 2026-05-27(mcp-audit-skill v1.0.0)

フェーズ 2 のアイデア(キャッシュレイヤー、森林 + 雪 + 災害データを組み合わせたセマンティック集約ツール「状況概要」)は docs/ で管理しています。


概要

WSL(森林・雪氷・景観に関するスイス連邦研究所/Swiss Federal Research Institute for Forest, Snow and Landscape)は、ヨーロッパを代表する環境研究機関の 1 つです。そのオープンデータプラットフォーム EnviDat では、1,000 件を超える研究データセット、最長 130 年分の時系列データ、6,000 以上の観測ステーションのデータを利用できます。

この MCP サーバーは、EnviDat CKAN API を 10 個のツールと 2 個のリソースとして公開し、API キーなしで、キーワード、ドメイン、または地理的な境界ボックスを使って WSL の研究データを検索、絞り込み、取得できるようにします。

デモの質問例: 「チューリッヒの Schulhaus Leutschenbach 周辺の大気質と森林の健全性はどうでしたか。また、州内の現在の森林状況について WSL は何と述べていますか?」

デモ

デモ:Claude が wsl_get_avalanche_data、wsl_get_forest_data、wsl_catalog_stats を使用


特長

  • 10 個のツールで、全文検索、ドメイン別クエリ、空間検索、テーマ別に調整されたツール(雪崩、森林、自然災害)を網羅
  • 2 個の MCP リソースで、組織と研究ドメインを提供
  • 5 つの研究ドメイン:森林 · 生物多様性 · 自然災害 · 雪と氷 · 景観
  • 815 件以上のデータセット、1890 年以降の時系列データ、SLF 雪崩研究所のデータ
  • API キー不要 — すべてのデータをオープンライセンスで公開
  • デュアルトランスポート:stdio(Claude Desktop / ローカル)+ Streamable HTTP(クラウドデプロイ)
  • モデル非依存:Claude、GPT-4、および MCP 対応クライアントで動作

前提条件

  • Python 3.11+
  • pip または uv / uvx
  • インターネット接続(envidat.ch へのライブ API 呼び出し)

インストール

# Recommended: uvx (no installation needed)
uvx wsl-envidat-mcp

# Or with pip
pip install wsl-envidat-mcp

# Development
git clone https://github.com/malkreide/wsl-envidat-mcp.git
cd wsl-envidat-mcp
pip install -e ".[dev]"

クイックスタート

Claude Desktop

~/Library/Application Support/Claude/claude_desktop_config.json(macOS)または %APPDATA%\Claude\claude_desktop_config.json(Windows)を編集します。

{
  "mcpServers": {
    "wsl-envidat": {
      "command": "uvx",
      "args": ["wsl-envidat-mcp"]
    }
  }
}

Claude Desktop を再起動してから、次のように質問します。

  • 「スイスの致命的な雪崩事故に関する WSL のデータセットには、どのようなものがありますか?」
  • 「チューリッヒ州の LFI の森林インベントリーデータを表示してください。」
  • 「SLF は EnviDat で、どのような自然災害研究データを公開していますか?」
  • 「2022 年夏の干ばつ状況に関する WSL のデータセットはありますか?」
  • 「高山の生態系で利用できる生物多様性データには、どのようなものがありますか?」

設定

API キーは不要です。次の環境変数を任意で設定できます。

変数デフォルト説明
MCP_TRANSPORTstdioトランスポートモード:stdio または streamable-http(従来の streamable_http も使用できます)
MCP_HOST127.0.0.1streamable-http のバインドアドレスです。コンテナ内でのみ 0.0.0.0 を使用してください。
PORT8000Streamable HTTP モードのポート
クラウドへのデプロイ(Streamable HTTP)

ブラウザー版の claude.ai から使用する場合(ローカルソフトウェアを利用できない管理対象ワークステーションなど):

# Local: keep MCP_HOST at its default 127.0.0.1
MCP_TRANSPORT=streamable-http PORT=8000 python -m wsl_envidat_mcp.server

# Container: bind to all interfaces inside the container only
MCP_TRANSPORT=streamable-http MCP_HOST=0.0.0.0 PORT=8000 python -m wsl_envidat_mcp.server

💡 「開発者のノート PC では stdio、ブラウザーでは streamable-http。」

⚠️ クラウドで複数レプリカをデプロイする場合: セッション状態はサーバー上に保存されます。 レプリカを 1 つだけ実行するか、スティッキーセッションを有効にしてください(Railway/Render の設定、 または Kubernetes Services の sessionAffinity: ClientIP)。

⚠️ マルチテナント/認証なしの Streamable HTTP: このサーバーには 認証レイヤーがありません(auth_model: none)。リバースプロキシと OAuth/API ゲートウェイを介さない Streamable HTTP は、シングルユーザーでのデプロイ (例:1 人のユーザーによる claude.ai のブラウザーセッション)のみを想定しています。 マルチテナントで使用する場合は、認証ゲートウェイを介してサーバーにアクセスしてください。

コンテナイメージ(クラウドに推奨)

セキュリティを強化したマルチステージイメージが、main へのプッシュおよび semver タグのたびに GitHub Container Registry に公開されます。非 root(uid=1000)で実行され、ランタイムレイヤーにビルドツールは含まれず、マルチアーキテクチャ(linux/amd64 と linux/arm64)に対応しています。

公開ワークフローは .github/workflows/container.yml です。リリース時に Python パッケージを PyPI にアップロードするだけの publish.yml ではありません。container.yml はデリバリー用であり、ゲートではありません。プルリクエストをブロックすることはなく、そこで実行が失敗してもコードに問題があるのではなく、イメージが存在しないことを意味します。

docker run --rm -p 8000:8000 \
  --read-only --tmpfs /tmp \
  --cap-drop=ALL --security-opt=no-new-privileges \
  ghcr.io/malkreide/wsl-envidat-mcp:latest

Kubernetes のセキュリティ強化(抜粋):

securityContext:
  runAsNonRoot: true
  runAsUser: 1000
  readOnlyRootFilesystem: true
  allowPrivilegeEscalation: false
  capabilities: { drop: ["ALL"] }

利用可能なツール

ツール説明
wsl_search統合検索 — query、domain、organization、bbox の各フィルターを組み合わせます
wsl_get_dataset特定のデータセットの完全なメタデータ、DOI、ダウンロード URL
wsl_list_organizationsEnviDat 上の WSL 研究ユニットをすべて一覧表示します
wsl_get_organization特定の研究ユニットの詳細(データセットを含む)
wsl_list_tags利用可能なタグ/キーワードを参照します
wsl_get_recent_datasets最近更新されたデータセット
wsl_get_avalanche_dataSLF の雪崩・積雪データ(1936 年以降の死亡事故を含む)
wsl_get_forest_data森林データ(全国森林インベントリー(LFI)と Sanasilva を含む)
wsl_get_naturgefahren_data自然災害のデータセット(土砂崩れ、落石、洪水)
wsl_catalog_statsカタログの概要と統計
使用例
クエリツール
「2000 年以降のヴァレー州の致命的な雪崩事故はありますか?」wsl_get_avalanche_data
「チューリッヒ州の森林健全性データはありますか?」wsl_get_forest_data
「ブリエンツ付近の土砂崩れリスクに関するデータセットはありますか?」wsl_get_naturgefahren_data
「生物多様性に関する WSL の最新の出版物は何ですか?」wsl_search(domain="biodiversitaet")
「ボーデン湖周辺の地域を対象とするデータセットはどれですか?」wsl_search(bbox=[9.0, 47.5, 9.7, 47.8])
「SLF はデータセットをいくつ公開していますか?」wsl_get_organization

リソース

URI説明
envidat://organization/{name}研究ユニット(例:slf、wsl)
envidat://domain/{domain}上位データセットを含むドメインの概要

有効なドメイン値:wald、biodiversitaet、naturgefahren、schnee_eis、landschaft


アーキテクチャ

┌─────────────────┐     ┌───────────────────────────┐     ┌──────────────────────────┐
│   Claude / AI   │────▶│    WSL EnviDat MCP        │────▶│       envidat.ch          │
│   (MCP Host)    │◀────│    (MCP Server)           │◀────│                          │
└─────────────────┘     │                           │     │  CKAN API  (REST/JSON)   │
                        │  10 Tools · 2 Resources   │     │  Solr full-text search   │
                        │  Stdio | Streamable HTTP  │     │  1,000+ research datasets│
                        │                           │     │  815+ open datasets      │
                        │  server.py                │     │  Time series since 1890  │
                        │  api_client.py            │     └──────────────────────────┘
                        └───────────────────────────┘
インフラストラクチャコンポーネント
コンポーネントたとえ機能
api_client.py司書EnviDat CKAN API へのすべての HTTP リクエストを処理します
server.py受付窓口10 個のツールと 2 個のリソースを FastMCP に登録します
ドメインフィルターファイリングキャビネット研究ドメインごとに事前設定されたキーワードセット
バウンディングボックス検索地図オーバーレイ緯度/経度の座標による空間フィルタリング

プロジェクト構成

wsl-envidat-mcp/
├── src/wsl_envidat_mcp/
│   ├── __init__.py         # Package
│   ├── server.py           # MCP server — 10 tools, 2 resources
│   └── api_client.py       # HTTP client for EnviDat CKAN API
├── tests/
│   └── test_integration.py # 11 live API integration tests
├── .github/workflows/
│   ├── ci.yml              # Gates: lint, format, syntax, import, tests, version sync
│   ├── live.yml            # Scheduled live tests against envidat.ch (cron 05:47 UTC)
│   ├── container.yml       # Builds & pushes the ghcr.io image (delivery, not a gate)
│   └── publish.yml         # Uploads the Python package to PyPI on a release
├── pyproject.toml          # Project config (hatchling build backend)
├── CHANGELOG.md
├── CONTRIBUTING.md         # Contribution guide (English)
├── CONTRIBUTING.de.md      # Contribution guide (German)
├── SECURITY.md             # Security policy & posture (English)
├── SECURITY.de.md          # Security policy & posture (German)
├── LICENSE                 # MIT
├── README.md               # This file (English)
└── README.de.md            # German version

他の MCP サーバーとの組み合わせ

このサーバーは Swiss Open Data MCP Portfolio の一部であり、以下とうまく連携します。

組み合わせユースケース
+ zurich-opendata-mcpチューリッヒ周辺の都市気候と森林の状態
+ swiss-statistics-mcp人口データと環境の質
+ swiss-transport-mcp雪崩リスクと公共交通機関の接続
+ fedlex-mcp森林保護法と実際の LFI 森林の状態
+ global-education-mcp環境教育データの国際比較

既知の制限事項

  • Solr 検索:OR はストップワードとして扱われます。クエリごとに具体的な検索語を 1 つ使用してください
  • ドメイン検索:結果は WSL 内部のキーワードタグ付けに依存します。すべてのデータセットに一貫してタグが付いているわけではありません
  • 空間検索:バウンディングボックスによるフィルタリングは概算です。個々のデータセットのメタデータで座標を確認してください
  • ライブ API:すべてのツールは envidat.ch にライブリクエストを行います。結果は公開 API の可用性に依存します
  • 言語:データセットのメタデータは主に英語とドイツ語です。古いエントリーの中にはドイツ語のみのものがあります

安全性と制限

  • **読み取り専用:**すべてのツールは HTTP GET リクエストのみを実行します。EnviDat 上のデータが書き込まれたり、変更されたり、削除されたりすることはありません。
  • **個人データなし:**API は研究メタデータ、データセットの説明、ダウンロード URL を返します。このサーバーでは、個人を特定できる情報(PII)は処理も保存もされません。
  • **レート制限:**EnviDat CKAN API は、文書化されたレート制限なしで公開されています。limit と rows パラメーターは控えめに使用してください。このサーバーはリクエストごとに 30 秒のタイムアウトを適用します。
  • **データの鮮度:**すべてのツールはライブ API 呼び出しを行います。結果にはクエリ時点での EnviDat カタログの現在の状態が反映されます。このサーバーはキャッシュを行いません。
  • **利用規約:**データにはEnviDat 利用規約が適用されます。個々のデータセットはさまざまなオープンライセンス(Creative Commons、CC0)の下で公開されています。詳細はデータセットのメタデータを参照してください。
  • **保証なし:**これはコミュニティプロジェクトであり、WSL または EnviDat とは提携していません。利用可能かどうかは、上流の EnviDat API に依存します。

セキュリティ対策の全容(送信先許可リスト、リダイレクト処理、受け入れているリスク)については、SECURITY.md を参照してください。


MCP プロトコルのバージョン

このサーバーは、同じエンドポイントで2つのプロトコル時代に対応しています。接続時のクライアントからの最初のリクエストによって適用される時代が決まり、後から別の時代を要求しても拒否されます。

時代リビジョン利用するクライアント
initialize ハンドシェイク2024-11-05 … 2025-11-25現在のクライアントが使用するバージョンです。サーバーは要求されたリビジョンで応答し、要求されたバージョンがそれより新しい場合は上限の 2025-11-25 で応答します。
リクエストごとのエンベロープ2026-07-282026-07-28 の _meta エンベロープを含むリクエストによって、モダンな接続が開始されます。

両方のリビジョンは tests/test_protocol_version.py で固定され、インストール済み SDK と照合されます。そのため、Dependabot による mcp の更新で、どちらかがひそかに変更されることはありません。このサーバーは initialize を送信するための ASGI アプリを構築しないため、このゲートでは測定した応答ではなく SDK の定数を検証します。明示しないままにせず、より限定的な形式で検証しています。

server.py の SUPPORTED_MCP_PROTOCOL_VERSION はモダンな時代を示します。SDK と一致しない場合は、起動時に警告がログに記録されます。警告はゲートではありません。その役割を担うのがテストファイルです。

SDK の LATEST_PROTOCOL_VERSION はモダンな時代のエイリアスであり、ハンドシェイク時代のものではない点に注意してください。これだけを基準に固定すると、現在のクライアントが実際にネゴシエートする時代が変更されても検出できなくなります。

更新ポリシー。 ゲートに失敗した場合は、定数をむやみに編集しないでください。2つのリビジョン間の仕様変更履歴を読み、サーバーが引き続き正しく動作することを確認してから、定数、このセクション、README.de.md、CHANGELOG.md をまとめて更新してください。


2026-07-28でサーバーが使用する内容

リビジョンを固定することと、その仕様に沿って通信することは同じではありません。これまでこのサーバーは2026-07-28に固定していましたが、それより前の時代の形式を使っていました。上の表は正しくても、実際の通信は名称から想像されるより古いものでした。

ツールの結果あたり2つのチャネル。 このリビジョンでは、ツールの結果に読者向けのcontentとアプリケーション向けのstructuredContentが用意され、その間の契約としてoutputSchemaが使われます。現在、すべてのツールが両方を埋めます。contentにはこれまでと同じ、人が読めるMarkdownを、structuredContentにはその背後にある型付きのスキーマ準拠データを格納します。

これは新しいインターフェースではありません。これらのフィールドは、response_format="json"が常に生成してきたペイロードそのものです。このオプションはstructuredContentの前身です。2026-07-28より前はチャネルが1つしかなかったため、機械可読な形式を読者向けチャネル内のJSON文字列として送る必要があり、それだけの理由で存在しています。response_formatは引き続き動作し、テキストブロックのみを制御します。

これによって置き換わるものは、何もしないより悪い状態です。-> strというシグネチャを使うと、SDKは{"result": string}というoutputSchemaを公開し、その下にMarkdownブロックを繰り返します。記録済みのフィクスチャを使ってwsl_searchで測定したところ、テキストは2058文字、structuredContent.resultも2058文字で、文字単位で完全に一致していました。outputSchemaは契約です。この場合、構造を約束しながら、resultというキーの下に文章を返していました。

serverInfoには6つのフィールドがあります。 以前は2つしかなく、そのうち1つは空でした。特に厄介だったのはversionです。pyproject.toml、server.json、READMEの2つのバッジ間で値を同期する処理はscripts/check_version_sync.pyが担っていましたが、クライアントが読み取る場所にだけ反映されていませんでした。現在はパッケージのメタデータから取得するため、src/にリテラルを記述する必要はありません。

ツールのタイトルをtitleに移動しました。 以前のリビジョンで使われていたannotations.titleに格納されていました。スキーマに従ってtool.titleを読み取るクライアントはNoneを受け取り、スラッグを表示していました。

意図的に使用していないもの: サーバー、ツール、リソースのiconsと、タスク拡張呼び出しフロー(execution)です。どちらも任意であり、ここには実体がありません。このリポジトリにはアイコンのアセットがなく、すべての呼び出しは短いCKANクエリで、リクエストの処理時間内に完了します。どちらかを宣言しても、実体のない主張になってしまいます。

tests/test_structured_output.pyでは、ライブのClientSessionを使って上記のすべてを検証し、この対応を行わないサーバーでSDKがどう動作するかを示すネガティブコントロールも用意しています。そのため、デフォルトが変わる日にも、アサーションがその変化を示し、気付かないまま通過することはありません。

テスト

# Unit tests — offline, no network access, all CKAN responses mocked via respx
PYTHONPATH=src pytest -m "not live"

# Live integration tests — actual HTTP calls to envidat.ch
PYTHONPATH=src pytest -m live

# Linting
ruff check src/
ruff format --check src/

CIでは、すべてのPRでオフラインのテストスイートを実行します。ライブのテストスイートを実行するのは、mainへのプッシュと手動のworkflow_dispatchトリガーのみです。そのため、ビルドステータスが上流の可用性に左右されることはありません。


変更履歴

CHANGELOG.mdを参照してください。


コントリビューション

CONTRIBUTING.mdを参照してください。


セキュリティ

セキュリティ対策と脆弱性の報告方法については、SECURITY.md(Deutsch)を参照してください。


ライセンス

MIT License — LICENSEを参照してください。

EnviDatのデータは、さまざまなオープンライセンス(Creative Commons、CC0)の下で公開されています。詳しくは各データセットのメタデータを参照してください。


作者

Hayal Oezkan · malkreide


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

インストール

uvのuvxを使って実行できます。クローンや手動でのインストールは不要です。MCPクライアントの設定に追加してください(Claude Desktop、Cursor、WindsurfではmcpServersを使用し、VS Codeでは.vscode/mcp.json内のトップレベルのserversキーを使用します)。

{
  "mcpServers": {
    "wsl-envidat-mcp": {
      "command": "uvx",
      "args": [
        "wsl-envidat-mcp"
      ]
    }
  }
}

コメント

MCP は初めてですか?

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

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