wsl-envidat-mcp について
wsl-envidat-mcpは、スイスのWSL研究機関がEnviDatで公開する環境研究データをMCPクライアントに提供します。森林、雪氷、自然災害、生物多様性、景観データをキーワード、分野、地理範囲で検索でき、複数分野の専用ツールも備えています。
主な機能
- 01キーワード、分野、位置による検索
- 02データセット詳細とダウンロードリンク取得
- 03研究部門、タグ、最新データセットの閲覧
- 04雪崩、森林、自然災害データの照会
- 05組織・分野リソースへのアクセス
- 06stdioとStreamable HTTPに対応
活用シーン
- 01ヴァレー州の雪崩事故データを検索
- 02チューリヒ州の森林健全性データを確認
- 03ブリエンツ周辺の地滑りリスクデータを検索
- 04ボーデン湖周辺を対象とするデータを検索
MCP 対応
MCPサーバーは、EnviDat CKAN APIの公開環境研究データをツールとリソースとして提供します。すべてのツールは読み取り専用で、APIキーは不要です。
設定
ローカルサーバーの設定はどのクライアントでも共通です。コピーしてクライアントの MCP 設定ファイルに貼り付けてください。
ツール
10掲載時のツール一覧 · 2 週間前に更新
| パラメーター | 型 | 必須 | 説明 |
|---|---|---|---|
| params | any | はい |
詳細
🇨🇭 スイス公共データ MCP ポートフォリオの一部
wsl-envidat-mcp 🌲❄️⛰️
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 は何と述べていますか?」
デモ
特長
- 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_TRANSPORT | stdio | トランスポートモード:stdio または streamable-http(従来の streamable_http も使用できます) |
MCP_HOST | 127.0.0.1 | streamable-http のバインドアドレスです。コンテナ内でのみ 0.0.0.0 を使用してください。 |
PORT | 8000 | Streamable 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_organizations | EnviDat 上の WSL 研究ユニットをすべて一覧表示します |
wsl_get_organization | 特定の研究ユニットの詳細(データセットを含む) |
wsl_list_tags | 利用可能なタグ/キーワードを参照します |
wsl_get_recent_datasets | 最近更新されたデータセット |
wsl_get_avalanche_data | SLF の雪崩・積雪データ(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-28 | 2026-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
クレジットと関連プロジェクト
- データ: EnviDat – WSL Swiss Federal Research Institute for Forest, Snow and Landscape
- プロトコル: Model Context Protocol – Anthropic / Linux Foundation
- ポートフォリオ: Swiss Public Data MCP Portfolio
インストール
uvのuvxを使って実行できます。クローンや手動でのインストールは不要です。MCPクライアントの設定に追加してください(Claude Desktop、Cursor、WindsurfではmcpServersを使用し、VS Codeでは.vscode/mcp.json内のトップレベルのserversキーを使用します)。
{
"mcpServers": {
"wsl-envidat-mcp": {
"command": "uvx",
"args": [
"wsl-envidat-mcp"
]
}
}
}
コメント
AI アプリケーションが外部のツールやデータソースに統一的な方法で接続するためのオープンなプロトコルです。クライアントはモデルとの対話を担い、MCP サーバーはツール・リソース・プロンプトテンプレートを提供します。標準メッセージでやり取りするため、1 つのサーバーを複数のクライアントで再利用できます。