
Wsl Envidat Mcp
io.github.malkreide由 GitHub 账号 malkreide 发布v0.3.1更新于 Oct 24, 2026
WSL / EnviDat environmental research datasets via CKAN
概览
让助手检索瑞士 WSL 的 EnviDat 公开环境研究数据集,涵盖森林、积雪、雪崩与自然灾害等主题。
- 可以做什么
- 把 EnviDat 的 CKAN API 封装为十个只读工具和两个资源。工具支持统一检索,可按关键词、研究领域、机构和地理边界框过滤,还能获取数据集元数据与 DOI、机构与标签列表、最新数据集、目录统计,以及雪崩与积雪、森林(含国家森林清查 LFI)、滑坡落石洪水等自然灾害的专题查询。资源用于查看研究机构和研究领域。
- 适用场景
- 当助手需要瑞士环境研究数据时适用,例如雪崩事故记录、森林状况与清查数据、积雪与冰、生物多样性、景观或自然灾害数据集,并可按关键词、领域、机构或地理范围筛选。
- 运行要求
- 需要 Python 3.11+ 以及 pip 或 uv/uvx;以 stdio 方式在本地运行,也可作为 Streamable HTTP 端点运行。所有工具都会实时访问 envidat.ch,因此需要联网。无需 API 密钥或账号。可选环境变量 MCP_TRANSPORT、MCP_HOST 和 PORT 用于配置 HTTP 模式。
安装
在 SourceWeft 中
- 打开 控制台中的 Wsl Envidat Mcp,将其添加到工作区。
- 为需要使用其工具的对话启用该服务。
Desktop only,通过 STDIO。 STDIO 服务会启动本地进程,因此需要 SourceWeft 桌面宿主。
其他 MCP 客户端
参照 仓库 中的启动说明。
README
🇨🇭 Part of the Swiss Public Data MCP Portfolio
wsl-envidat-mcp 🌲❄️⛰️
[Version] [License: MIT] [Python 3.11+] [MCP] [Data Source] [No API Key] [CI]
MCP server connecting AI models to Swiss environmental research data from WSL via EnviDat — forest, snow, avalanches, natural hazards and biodiversity, no API key required.
Phase
This server is in Phase 1: Read-only Wrapper.
Phase-2 ideas (caching layer, semantic aggregation tool combining forest +
snow + hazard data into a "Lage-Übersicht"): tracked under docs/.
Overview
The WSL (Eidgenössische Forschungsanstalt für Wald, Schnee und Landschaft / Swiss Federal Research Institute for Forest, Snow and Landscape) is one of Europe's leading environmental research institutes. Its open data platform EnviDat provides access to 1,000+ research datasets, time series of up to 130 years, and data from 6,000+ monitoring stations.
This MCP server exposes the EnviDat CKAN API as 10 tools and 2 resources, enabling AI assistants to search, filter and retrieve WSL research data by keyword, domain, or geographic bounding box — all without an API key.
Anchor demo query: "How was air quality and forest health around Schulhaus Leutschenbach in Zurich — and what does the WSL say about the current forest condition in the canton?"
Demo
[Demo: Claude using wsl_get_avalanche_data, wsl_get_forest_data and wsl_catalog_stats]
Features
- 10 tools covering full-text search, domain-specific queries, spatial search, and curated thematic tools (avalanche, forest, natural hazards)
- 2 MCP resources for organizations and research domains
- 5 research domains: Forest · Biodiversity · Natural Hazards · Snow & Ice · Landscape
- 815+ datasets, time series since 1890, data from the SLF avalanche research institute
- No API key required — all data publicly accessible via open licenses
- Dual transport: stdio (Claude Desktop / local) + Streamable HTTP (cloud deployment)
- Model-agnostic: works with Claude, GPT-4, and any MCP-compatible client
Prerequisites
- Python 3.11+
piporuv/uvx- Internet connection (live API calls to envidat.ch)
Installation
Quickstart
Claude Desktop
Edit ~/Library/Application Support/Claude/claude_desktop_config.json (macOS) or %APPDATA%\Claude\claude_desktop_config.json (Windows):
Restart Claude Desktop, then ask:
- "What WSL datasets exist on fatal avalanche accidents in Switzerland?"
- "Show me forest inventory data from the LFI for the canton of Zurich."
- "Which natural hazard research data does the SLF publish on EnviDat?"
- "Are there WSL datasets on drought conditions in summer 2022?"
- "What biodiversity data is available for alpine ecosystems?"
Configuration
No API key required. Optional environment variables:
Cloud Deployment (Streamable HTTP)
For use via claude.ai in the browser (e.g. on managed workstations without local software):
💡 "stdio for the developer laptop, streamable-http for the browser."
⚠️ Multi-Replica Cloud Deployments: Session state lives in the server. Run a single replica or enable sticky sessions (Railway/Render setting, or
sessionAffinity: ClientIPon Kubernetes Services).
⚠️ Multi-Tenant / Unauthenticated Streamable HTTP: This server has no auth layer (
auth_model: none). Streamable HTTP without a reverse-proxy + OAuth/API-Gateway is intended only for single-user deployments (e.g. one user's claude.ai browser session). For multi-tenant use, front the server with an authenticating gateway.
Container image (recommended for cloud)
A hardened multi-stage image is published to GitHub Container Registry on
every main push and semver tag. Runs as non-root (uid=1000), no build
tools in the runtime layer, multi-arch (linux/amd64 + linux/arm64).
The publishing workflow is .github/workflows/container.yml —
not publish.yml, which only uploads the Python package to PyPI on a
release. container.yml is delivery, not a gate: it does not gate a pull
request, and a red run there means the image is missing, not that the code
is broken.
Kubernetes hardening (excerpt):
Available Tools
Example Use Cases
Resources
Valid domain values: wald, biodiversitaet, naturgefahren, schnee_eis, landschaft
Architecture
Infrastructure Components
Project Structure
Combination with Other MCP Servers
This server is part of the Swiss Open Data MCP Portfolio and integrates well with:
Known Limitations
- Solr search:
ORis treated as a stopword — use single, specific search terms per query - Domain search: Results depend on WSL's internal keyword tagging — not all datasets are tagged consistently
- Spatial search: Bounding box filtering is approximate; verify coordinates with individual dataset metadata
- Live API: All tools make live calls to envidat.ch — results depend on availability of the public API
- Languages: Dataset metadata is primarily in English and German; some older entries may be in German only
Safety & Limits
- Read-only: All tools perform HTTP GET requests only — no data is written, modified, or deleted on EnviDat.
- No personal data: The API returns research metadata, dataset descriptions, and download URLs. No personally identifiable information (PII) is processed or stored by this server.
- Rate limits: The EnviDat CKAN API is public without documented rate limits. Use
limitandrowsparameters conservatively. The server enforces a 30-second timeout per request. - Data freshness: All tools make live API calls — results reflect the current state of the EnviDat catalog at query time. No caching is performed by this server.
- Terms of service: Data is subject to the EnviDat Terms of Use. Individual datasets are published under various open licenses (Creative Commons, CC0) — see dataset metadata.
- No guarantees: This is a community project, not affiliated with WSL or EnviDat. Availability depends on the upstream EnviDat API.
For the full security posture (egress allow-list, redirect handling, accepted risks) see SECURITY.md.
MCP Protocol Version
This server speaks two protocol eras over the same endpoint. The client's first request on a connection decides which one applies; a later claim from the other era is refused.
Both revisions are pinned in
tests/test_protocol_version.py and asserted
against the installed SDK, so a Dependabot bump of mcp cannot move either one
silently. This server builds no ASGI app to send an initialize through, so
the gate asserts the SDK constants rather than a measured response — the
weaker form, named rather than left unsaid.
SUPPORTED_MCP_PROTOCOL_VERSION in
server.py names the modern era; a
mismatch against the SDK logs a warning at startup. A warning is not a gate —
that is what the test file is for.
Note that the SDK's LATEST_PROTOCOL_VERSION is an alias for the modern
era, not for the handshake era — pinning against it alone would leave the era
that current clients actually negotiate free to drift.
Update policy. When the gate fails, do not edit the constant blindly: read
the spec changelog between the two revisions, verify the server still behaves,
then move the constant, this section, README.de.md and
CHANGELOG.md together.
What the server uses from 2026-07-28
Pinning a revision is not the same as speaking it. Until now this server
pinned 2026-07-28 and used the shape of the era before it; the table above
was true and the wire was older than it sounded.
Two channels per tool result. The revision gives a tool result content
for the reader and structuredContent for the application, with
outputSchema as the contract between them. Every tool now fills both: the
same human-readable Markdown as before in content, and the data behind it —
typed, schema-backed — in structuredContent.
This is not a new interface. The fields are exactly the payload that
response_format="json" has always produced. That option is the predecessor
of structuredContent: it exists only because, before 2026-07-28, there was
one channel, so the machine-readable version had to travel as a JSON string
inside the reader's channel. response_format still works and still controls
only the text block.
What it replaces is worse than nothing. A signature of -> str makes the SDK
publish an outputSchema of {"result": string} and repeat the Markdown block
underneath it. Measured on wsl_search against the recorded fixture: 2058
characters of text, 2058 characters of structuredContent.result,
character-identical. An outputSchema is a promise; that one promised
structure and delivered prose under a key called result.
serverInfo carries its six fields. It carried two, one of them empty.
version was the expensive one: the number is kept in step across
pyproject.toml, server.json and both README badges by
scripts/check_version_sync.py — and reached every place except the one a
client reads. It now comes from the package metadata, so no literal enters
src/.
Tool titles moved to title. They sat in annotations.title, the slot
from before this revision. A client that follows the schema and reads
tool.title got None and displayed the slug.
Deliberately not used: icons on server, tools and resources, and the
task-augmented call flow (execution). Both are optional, and neither has
anything real to point at here — this repository ships no icon asset, and every
call is a short CKAN query that finishes well inside a request. Declaring
either would be a claim without a thing behind it.
tests/test_structured_output.py holds all
of the above against a live ClientSession, with a negative control that shows
what the SDK does when a server does not do this — so the day the default
changes, the assertions say so instead of quietly passing.
Testing
CI runs the offline suite on every PR. The live suite runs only on main
pushes and manual workflow_dispatch triggers, so build status is not
coupled to upstream availability.
Changelog
See CHANGELOG.md
Contributing
See CONTRIBUTING.md
Security
See SECURITY.md (Deutsch) for the security posture and how to report a vulnerability.
License
MIT License — see LICENSE
Data on EnviDat is published under various open licenses (Creative Commons, CC0) — see individual dataset metadata.
Author
Hayal Oezkan · malkreide
Credits & Related Projects
- Data: EnviDat – WSL Swiss Federal Research Institute for Forest, Snow and Landscape
- Protocol: Model Context Protocol – Anthropic / Linux Foundation
- Portfolio: Swiss Public Data MCP Portfolio
Installation
Run via uv's uvx — no clone or manual install needed. Add to your MCP client config (mcpServers for Claude Desktop, Cursor and Windsurf; use a top-level servers key for VS Code in .vscode/mcp.json):
来源:README.md,提交 4c370e9
工具
0版本历史
3- v0.3.1最新Sep 20, 2026
- v0.3.0Sep 20, 2026
- v0.2.5Sep 16, 2026
评分
已满足适用检查项的 50%
该评分衡量此收录条目的完整程度,依据注册中心条目、端点与公开来源计算得出。它不是对服务器本身的评价,也不表示服务器安全或当前可用:可连通性是带日期的检查结果,评分也不包含安装量或用户评价。
- 近 30 天内可连通25 分
请保持端点能够响应 MCP 握手;SourceWeft 每 30 天探测一次。
- 已声明认证方式10 分
请在注册中心条目中声明凭据请求头,或保持端点能够响应探测,以便判定其认证方式。
- 已列出工具15 分
请让服务器在无凭据时响应 tools/list,或发布可在沙箱中无凭据启动的软件包。
- 描述必需15 分
- 图标10 分
- 文档15 分
- 许可证10 分