Skip to main content
Glama
malkreide

swiss-environment-mcp

by malkreide

🇨🇭 属于 Swiss Public Data MCP Portfolio 的一部分

🌿 swiss-environment-mcp

Version License: MIT Python 3.11+ MCP CI Data Source

MCP 服务器,将 AI 模型连接到来自 BAFU 的瑞士环境数据——空气质量、水文、自然灾害、野火危险和开放环境数据集。

🇩🇪 Deutsche Version


概述

swiss-environment-mcp 让 Claude 等 AI 助手能够直接访问来自瑞士联邦当局的实时环境数据——无需 API 密钥。来自国家 NABEL 监测网络的空气质量读数、水文测量站、自然灾害公报以及完整的 BAFU 数据集目录,都可以通过一个标准化的 MCP 接口访问。

该服务器涵盖四个主题集群:空气质量(NABEL)、水文、自然灾害和 BAFU 开放数据目录。每个集群对应一组专用工具,将原始机构数据转换为干净的 JSON 响应。

锚定演示查询: "NABEL 站 Zürich-Kaserne 当前的空气质量如何——是否符合 WHO 2021 指南?"按受众分类的更多用例


Related MCP server: meteoswiss-mcp

功能特性

  • 🌬️ 空气质量监测 – 16 个 NABEL 站点,NO₂/O₃/PM10/PM2.5/SO₂/CO,瑞士 LRV + WHO 2021 限值检查

  • 💧 水文 – 瑞士各测量站的水位、流量和水温

  • 🚨 洪水预警 – 按危险等级和州筛选的活跃警报

  • 🏔️ 自然灾害公报 – SLF/BAFU 公报(DE/FR/IT/EN),按地区划分的警告

  • 🔥 野火危险 – 州级和地区级火灾危险指数

  • ❄️ 雪与雪崩(SLF) – 每个 IMIS 站点的积雪深度、新增降雪;雪崩危险等级(EAWS)

  • 🦌 狩猎统计 – 按物种、州和年份统计的猎获量与野生动物损失数据(联邦狩猎统计)

  • 📦 BAFU 开放数据目录 – 通过 CKAN 搜索和检索环境数据集

  • 🔑 无需身份验证 – 所有数据源均可公开访问

  • ☁️ 双传输方式 – 面向 Claude Desktop 的 stdio,面向云端部署的 Streamable HTTP/SSE


前提条件

  • Python 3.11+

  • 无需 API 密钥——所有端点均可公开访问,无需身份验证


安装

# Clone the repository
git clone https://github.com/malkreide/swiss-environment-mcp.git
cd swiss-environment-mcp

# Install
pip install -e .

或使用 uvx(无需永久安装):

uvx swiss-environment-mcp

或通过 pip:

pip install swiss-environment-mcp

快速开始

# Start the server (stdio mode for Claude Desktop)
swiss-environment-mcp

立即在 Claude Desktop 中试用:

"NABEL 站 Zürich-Kaserne 当前的空气质量如何?" "瑞士目前是否有活跃的洪水预警?" "瓦莱州当前的野火危险等级是多少?"


配置

Claude Desktop

最小配置(推荐):

{
  "mcpServers": {
    "swiss-environment": {
      "command": "uvx",
      "args": ["swiss-environment-mcp"],
      "env": {}
    }
  }
}

配置文件位置:

  • macOS:~/Library/Application Support/Claude/claude_desktop_config.json

  • Windows:%APPDATA%\Claude\claude_desktop_config.json

保存后,请完全重启 Claude Desktop。

云端部署(面向浏览器访问的 SSE)

用于通过浏览器中的 claude.ai 使用(例如在没有本地软件的管理工作站上):

Render.com(推荐):

  1. 将仓库推送/复刻到 GitHub

  2. render.com 上:新建 Web Service → 连接 GitHub 仓库

  3. Render 会自动检测 render.yaml

  4. 在 claude.ai 的 Settings → MCP Servers 下,添加:https://your-app.onrender.com/sse

Docker:

docker build -t swiss-environment-mcp .
docker run -p 8000:8000 swiss-environment-mcp

💡 "开发者的笔记本电脑用 stdio,浏览器用 SSE。"


可用工具

所有工具都共享稳定的 env_ 名称前缀——这是一个刻意的命名空间选择,目的是让服务器的工具易于识别,并且在多个 MCP 服务器同时挂载时不太可能发生冲突。工具定义(名称、描述、输入模式)通过 tool-snapshot.json 固定;任何更改都需要在 CHANGELOG 中记录(参见 CONTRIBUTING)。

工具预算(21 个工具,7 个集群)——已用尽。 每个工具都对应一个明确的用户问题,而不是一个 REST 端点——没有 CRUD/端点镜像,锚定查询各自都能通过一次调用得到回答。数量高于 ≤12 的经验法则,因为该服务器刻意覆盖七个环境领域(空气、水、灾害、雪、狩猎、目录、飞机噪声),每个领域都需要一个列表/详情配对或一个领域特定的操作。曾考虑过进一步合并但被否决:*_stations/*_current 配对(NABEL、hydro、snow)服务于完全不同的意图(发现 vs. 读取已知站点),合并它们会使单个工具的参数过载。

这就是上限。 随着飞机噪声集群的加入,服务器的工具预算已经用尽:任何进一步的数据源都应放在单独的 *-mcp 服务器中,而不是这里。下一个新增内容反而会触发一次审查,考虑某些列表是否应迁移到 MCP 资源而非工具。

🌬️ 空气质量 / NABEL(3 个工具)

工具

描述

数据源

env_nabel_stations

列出全部 16 个 NABEL 监测站,含位置类型和州

NABEL / BAFU

env_nabel_current

某站点的当前空气质量数据(NO₂、O₃、PM10、PM2.5、SO₂、CO)

NABEL / BAFU

env_air_limits_check

将测量值与瑞士 LRV 限值和 WHO 2021 指南进行比较

内置

💧 水文(5 个工具)

工具

描述

数据源

env_hydro_stations

按水体筛选水文测量站(州筛选不可用——参见说明)

LINDAS SPARQL → hydrodaten.admin.ch(回退)

env_hydro_current

某站点的当前水位、流量和水温

LINDAS SPARQL → hydrodaten.admin.ch(回退)

env_hydro_history

历史小时值(最多 30 天),含下载链接 ⚠️

hydrodaten.admin.ch

env_flood_warnings

按危险等级筛选的活跃洪水预警(全国范围——未应用州筛选)

LINDAS SPARQL

env_bathing_water

每个浴场的水质(大肠杆菌、肠球菌)——多年时间序列

LINDAS SPARQL(数据立方体 ubd0104

🏔️ 自然灾害(3 个工具)

工具

描述

数据源

env_hazard_overview

路由器:指向专用的实时灾害工具 + 官方门户(无网络调用——聚合的 naturgefahren.ch API 已停用)

local

env_hazard_regions

路由器:将灾害类型(洪水/雪崩/野火/雪)映射到正确的实时工具 + 门户(无网络调用)

local

env_wildfire_danger

按州和地区划分的野火危险指数

waldbrandgefahr.ch

❄️ 雪与雪崩 / SLF(3 个工具)

工具

描述

数据源

env_snow_stations

列出自动 SLF/IMIS 积雪测量站(按州)

measurement-api.slf.ch

env_snow_current

每个站点的当前积雪深度(HS)和 24 小时新增降雪(HN_1D),单位为厘米

measurement-api.slf.ch

env_avalanche_bulletin

每个预警区域的雪崩危险等级(EAWS 1–5),按季节

aws.slf.ch

🦌 狩猎与野生动物(2 个工具)

工具

描述

数据源

env_hunting_species

列出联邦狩猎统计追踪的 36 个物种(含代码)

jagdstatistik.ch(内置)

env_hunting_stats

按物种、州和年份统计的猎获量 / 野生动物损失 / 种群数量(2015–2024)

jagdstatistik.ch

📊 环境数据目录(2 个工具)

工具

描述

数据源

env_bafu_datasets

在 opendata.swiss 上搜索 BAFU 数据集(CKAN API)

opendata.swiss

env_bafu_dataset_detail

特定数据集的完整元数据和下载 URL

opendata.swiss

✈️ 飞机噪声 / BAZL 噪声地籍(3 个工具)

工具

描述

数据源

env_noise_aircraft_at

LV95 坐标点处的飞机噪声暴露——解析重叠的噪声等值线,返回以最高值作为上限的 dB 区间

api3.geo.admin.ch(BAZL)

env_noise_aircraft_registers

哪些机场已发布地籍,含有效期、dB 范围和官方规划图(PDF)——溯源工具

api3.geo.admin.ch(BAZL)

env_noise_limits_check

按敏感度等级 ES I–IV,将评级声级与 LSV 暴露限值(规划值 / 影响限值 / 警报值)进行比较

内置(SR 814.41,附件 5)

⚖️ 法律声明——这三个工具的每个响应中都会附带。 噪声地籍是一种参考辅助工具。关于建筑项目的具有法律约束力的信息由主管州办公室或 FOCA(BAZL)发布。这些工具不能替代建筑许可澄清。

坐标必须是 LV95(EPSG:2056,单位为米:E ≈ 2'480'000–2'840'000,N ≈ 1'070'000–1'300'000)。诸如 8.54 / 47.37 的 WGS84 度数会被快速失败拒绝,并附带转换提示——这是 LLM 处理瑞士地理数据时最常见的错误。可通过 swisstopo REFRAME 或 swisstopo-mcp 中的 convert_coordinates 进行转换。

等值线是线,不是面。 地籍图发布的是 MultiLineString 等值线,因此 identify 在搜索半径内执行邻近查询,而不是 点面包含测试。因此 env_noise_aircraft_at 返回一个区间 (“该点位于 61 dB 与 62 dB 等值线之间”),并以最高值 作为明确的上界,绝不返回插值后的点值。搜索半径 在每次响应中都会报告;扩大半径会使结果膨胀(在克洛滕的某个 点:100 m → 61–62 dB,但 500 m → 58–75 dB,因为 75 dB 跑道等值线 位于 1.5 km 之外)。

锚点演示查询

“规划中的学校选址是否位于有建筑限制的飞机噪声区内 ——以及处于哪个 dB 级别?”

跨服务器流程:通过 swiss-housing-mcp 解析地址或 EGID → 转换为 LV95 坐标 → env_noise_aircraft_at(east=…, north=…, period="day") → 将得到的 level_db 输入 env_noise_limits_check(level_db=…, sensitivity_level="II", period="day") 以进行法律分类。

swiss-housing-mcp  →  address / EGID  →  LV95 E/N
                                          ↓
                          env_noise_aircraft_at   → 62 dB (upper bound, LBK Zürich, valid from 03.07.2015)
                                          ↓
                          env_noise_limits_check  → immission limit ES II (60 dB) exceeded by 2 dB

示例用例

查询

工具

“苏黎世卡瑟内现在的空气质量如何?”

env_nabel_current

“45 µg/m³ 的 NO₂ 是否超过瑞士限值?”

env_air_limits_check

“苏黎世利马特河当前水位如何?”

env_hydro_current

“屈斯纳赫特湖滨浴场的水质适合游泳吗?”

env_bathing_water

“瑞士有正在生效的洪水预警吗?”

env_flood_warnings

“格劳宾登的自然灾害公报如何?”

env_hazard_overview

“瓦莱州的野火风险如何?”

env_wildfire_danger

“opendata.swiss 上有哪些 BAFU 生物多样性数据集?”

env_bafu_datasets

“规划中的学校选址是否位于飞机噪声区——处于哪个 dB 级别?”

env_noise_aircraft_at

“日内瓦机场的噪声地籍图有多旧?”

env_noise_aircraft_registers

“夜间 62 dB 是否超过 ES II 居住区中的 LSV 限值?”

env_noise_limits_check


🛡️ 安全与限制

方面

详情

访问权限

只读(readOnlyHint: true)——服务器无法修改或删除任何数据

个人数据

不涉及个人数据——所有来源均为聚合的公共环境测量数据

速率限制

内置每次查询的上限(例如水文历史最多 30 天,数据集搜索结果最多 50 条)

超时

每次 API 调用 30 秒

身份验证

无需 API 密钥——所有 BAFU 端点均可公开访问

许可证

BAFU 开放政府数据(OGD)——可免费复用,但必须注明出处

服务条款

须遵守各数据来源的服务条款:BAFU / opendata.swisshydrodaten.admin.chnaturgefahren.chwaldbrandgefahr.ch


架构

┌─────────────────┐     ┌───────────────────────────┐     ┌──────────────────────────┐
│   Claude / AI   │────▶│   Swiss Environment MCP   │────▶│  BAFU / Swiss Agencies   │
│   (MCP Host)    │◀────│   (MCP Server)            │◀────│                          │
└─────────────────┘     │                           │     │  hydrodaten.admin.ch     │
                        │  21 Tools · 3 Resources   │     │  naturgefahren.ch        │
                        │  Stdio | SSE              │     │  waldbrandgefahr.ch      │
                        │                           │     │  opendata.swiss (CKAN)   │
                        │  api_client.py            │     └──────────────────────────┘
                        │  server.py (FastMCP)      │
                        └───────────────────────────┘

架构说明——可抽取的 lindas/ 模块

所有 LINDAS SPARQL 访问都经由刻意设计为可抽取src/swiss_environment_mcp/lindas/ 模块,该模块分为三个严格的层次: client.py 只了解 SPARQL 和 HTTP(GET/POST、45 秒客户端超时、 携带服务器 MALFORMED 消息的 QueryError、2 秒/4 秒/8 秒重试); cube.py 了解 cube.link 词汇表(强制 observationSet 两阶段访问、通过 schema:expires 进行版本去重、代码→标签 解析、许可证查找);工具层只调用 cube.py。该模块 一旦有第二个服务器使用 LINDAS(候选:wsl-envidat-mcp), 将被提升到共享的 lindas-mcp 中。

架构决策——飞机噪声地籍图使用实时 API

本服务器的其余部分遵循产品组合的转储优先标准。飞机 噪声集群刻意偏离了这一标准:env_noise_aircraft_atenv_noise_aircraft_registers每次调用时实时查询 api3.geo.admin.ch

不是规模方面的理由。根据 2026-07-28 的测量,整个地籍图 在所有八个子图层上共有 747 个对象(约 3 MB 的 GeoJSON)——镜像 毫无困难。另有两点原因决定了这一选择:

  1. 镜像会破坏新鲜度声明。 地籍图按机场单独 修订,且不另行通知(有效日期为 2009–2024 年)。 如果从转储中读取,source_freshness 将报告镜像日期时的 validfrom—— 该工具将断言它已不再拥有的来源信息。对于一个 第三个工具正是为了回答“基础数据有多旧”的集群来说, 这是最糟糕的失败模式。

  2. 价值在于空间查询,而非属性。 在本地计算意味着 每层要对 26'000+ 个顶点进行点到线距离计算。这需要 shapely/GEOS——这是刻意保持无二进制的 pyproject.toml 中的第一个编译依赖(Docker 镜像、wheel 矩阵和安全面 都会改变)——或者手写距离计算。后者是可行的,因为 LV95 是公制投影,欧几里得距离是精确的;但这样一来,本 服务器将承担官方噪声地籍声明的正确性责任, 而不是联邦机构。

完整测量与论证:docs/probe-fluglaerm.md

数据来源

来源

数据

许可证

lindas.admin.ch

通过 SPARQL 获取当前水文数据(水位、流量、水温)和浴场水质

BAFU Open-Use / OGD(按图/数据集声明——每个响应都带有许可证字段)

hydrodaten.admin.ch

水位、流速、温度(REST 回退)

BAFU OGD

naturgefahren.ch

自然灾害公报(SLF/BAFU)

BAFU/SLF

waldbrandgefahr.ch

野火危险指数

BAFU

SLF 数据服务

积雪深度、新雪(IMIS);雪崩公报

SLF (WSL) CC BY 4.0

jagdstatistik.ch

联邦狩猎统计(猎获量、猎物损失、种群数量)

BAFU——须注明来源(未发布明确许可证)

api3.geo.admin.ch

BAZL 飞机噪声地籍图(identify,LV95)

swisstopo / BAZL——可免费复用,须注明出处

opendata.swiss

BAFU 数据目录(CKAN API)

OGD

所有数据:可公开访问,无需身份验证。
必须注明出处: 使用 BAFU / SLF (WSL) 的数据时,必须将其列为来源。


项目结构

swiss-environment-mcp/
├── src/swiss_environment_mcp/
│   ├── __init__.py          # Package
│   ├── server.py            # FastMCP server: 21 tools, 3 resources
│   ├── api_client.py        # HTTP client + egress allow-list (SSRF guard)
│   └── logging_setup.py     # structlog -> stderr
├── tests/
│   ├── test_unit.py         # Mocked unit tests (no network) — CI default
│   ├── test_integration.py  # Live API tests (marker: live)
│   └── test_20_scenarios.py # Live scenario coverage
├── scripts/tool_snapshot.py # Tool-definition hash snapshot (rug-pull guard)
├── docs/                    # security.md, scaling.md, roadmap.md
├── .github/
│   ├── dependabot.yml       # Monthly dependency/action updates
│   └── workflows/           # ci.yml, security.yml (gitleaks), live-tests.yml, publish.yml
├── Dockerfile               # Multi-stage, non-root container
├── render.yaml / Procfile   # Cloud deployment
├── tool-snapshot.json       # Committed tool-definition snapshot
├── .env.example             # Non-secret config template
└── pyproject.toml           # Build configuration (hatchling)

单模块布局(理由,审计 ARCH-011): 21 个工具位于一个 server.py 中,而不是 tools/ 包。它们是 api_client.py 之上的薄而统一的包装器, 共享相同的输入/响应模式,因此一个分区良好的模块 比 4 个几乎相同的文件更易于导航。这是一个有意的、有文档记录的偏离; 如果工具逻辑变得不统一,将重新考虑拆分。


MCP 协议版本与维护

本服务器在同一端点上支持两个协议时代。客户端在 连接上的第一个请求决定适用哪一个;之后来自另一时代的 声明将被拒绝。

时代

修订版本

谁达到它

initialize 握手

2024-11-052025-11-25

当今客户端使用的版本。服务器以所请求的修订版应答;如果请求要求更新的版本,则以 2025-11-25 为上限应答。

请求级信封

2026-07-28

携带 2026-07-28 _meta 信封的请求会打开一个现代连接。

两个修订版都固定于 tests/test_protocol_version.py 中,并针对已安装的 SDK 进行断言,因此 mcp 的 Dependabot 升级无法悄悄移动其中任何一个。此服务器不构建 ASGI 应用来发送 initialize,因此该门禁断言的是 SDK 常量而非实测响应——这是较弱的形式,但属于显式命名而非隐晦不提。

请注意,SDK 的 LATEST_PROTOCOL_VERSION现代时代的别名,而非握手时代——如果仅固定在该常量上,当前客户端实际协商的时代就会失去约束、自由漂移。

更新策略。 当门禁失败时,不要盲目编辑常量:阅读两个修订版之间的规范变更日志,验证服务器行为仍然正确,然后一起更新该常量、本节、README.de.mdCHANGELOG.md

  • 工具定义稳定性(审计 SEC-022): 对工具名称、描述或参数的任意更改都会改变 tool-snapshot.json;CI 会失败,直到重新生成快照并添加 CHANGELOG 条目和版本提升。

  • 更新策略: 每月审查 Dependabot PR;任何工具定义或行为变更都要提升版本号(semver)。

生命周期阶段

此服务器处于阶段 1(只读)——所有工具均为只读,无认证、无副作用。阶段模型以及阶段 2(写入/认证)的前提条件见 docs/roadmap.md。安全架构(SSRF/出站流量、机密管理、致命三元组评估):docs/security.md。扩展/会话策略:docs/scaling.md


已知限制

  • 通过 LINDAS 的水文数据env_hydro_currentenv_hydro_stationsenv_flood_warnings 查询 BAFU LINDAS SPARQL 端点(类型化的实时值:水位、流量、水温、危险等级)。LINDAS 仅保存当前值(每个站点一条观测记录)——它不是历史时间序列。参见 docs/probe-lindas-hydro.md

  • 历史水文 / env_hydro_history(BUG-01 已解决):旧的 hydrodaten.admin.ch/lhg/az/* REST 端点(每小时 CSV、warnings.json、站点 JSON)已停用(404)env_flood_warnings 现在改用 LINDAS 的 dangerLevel。真正的历史时间序列(每日/长期平均值——例如 2024 年夏季与长期平均值的对比无法通过 API 免费获取;必须向 BAFU 水文查询服务abfragezentrale@bafu.admin.ch)订购。env_hydro_history 返回最新 LINDAS 值以及上述获取途径。

  • 洪水预警env_flood_warnings 读取 LINDAS 的 dangerLevel。该数据源不提供州过滤(LINDAS 没有州代码),因此响应始终是全国范围canton 值会原样回显并标记为未应用——在 JSON 信封中通过 match_type: "fuzzy" 加注释实现,在 Markdown 中则是在表格上方显示一行警告。当完全没有预警时,这一点最为重要:否则,请求中的“无活动预警”加上一个 canton 会被解读为该州一切正常。

  • 水文站点 / 州过滤env_hydro_stations 不再提供 canton。唯一带有州代码的数据源——hydrodaten.admin.ch/lhg/az/json/mobile_stations.json——已停用(404),且 LINDAS 没有州属性。带有 canton 的请求会返回解释而不是站点列表;请使用 water_body,或者不加过滤地获取完整列表(233 个站点)。

  • 沐浴水质(env_bathing_water:读取 LINDAS 数据立方体 foen/ubd01041prod——唯一拥有真正多年时间序列(自 2020 年起的季节性样本)的水文数据立方体。数据在沐浴季结束后每年刷新(无实时监测),且调查仅覆盖官方报告的沐浴场所(许多受欢迎的湖畔浴场不在此列)。许可证在图/数据集级别声明,而非在数据立方体上;因此每个响应都携带一个显式许可证字段——在没有许可证的地方给出诚实的“未声明”注释。参见 docs/probe-lindas-hydro.md(附录 N1–N7)。

  • LINDAS 中没有地下水数据:于 2026-07-24 通过多语言立方体搜索验证——LINDAS 中没有地下水数据立方体(NAQUA 地下水位无法通过 SPARQL 获取)。

  • NABEL:仅近实时数据;此服务器不提供历史时间序列。

  • 自然灾害(env_hazard_overview / env_hazard_regions:先前的 naturgefahren.ch/api/v1/warnings/* REST 端点已于 2026 年停用,并且——于 2026-07-26 验证——没有稳定、有文档的公共 JSON 数据源提供聚合预警(已检查 MeteoSwiss OGD/STAC、opendata.swiss 和未文档化的应用 API)。与其进行脆弱的抓取,这两个工具如今是不依赖网络的定向/路由工具:它们确定性地指向此服务器专用的实时工具(洪水→env_flood_warnings、雪崩→env_avalanche_bulletin、野火→env_wildfire_danger、积雪→env_snow_current)以及官方门户。聚合的天气预警(暴风雨/雷暴/高温)属于 MeteoSwiss 的领域,归 meteoswiss-mcp 负责。参见 docs/probe-naturgefahren-hazards.md

  • 野火危险(env_wildfire_dangerwaldbrandgefahr.ch 在 2026 年将其 REST API 替换为 Rails/React 应用;没有稳定的 JSON 端点。当前危险等级通过两步、基于 HTML 的约定读取:首页的 data-react-props 产生一个签名的 ActiveStorage blob URL(warnMapJsonPath)以及州映射,随后获取该 URL。如果该结构发生变化,模式守卫会优雅降级。未过滤的结果最多返回 40 个区域(最高等级优先);按 canton 过滤可获取完整的州级列表。参见 docs/probe-naturgefahren-waldbrand.md

  • 狩猎统计(env_hunting_statsjagdstatistik.ch 后端没有文档(一个经过内容协商的 Web 应用端点)。如果结构发生变化,模式守卫会优雅降级。物种/州/数据类型查找是内嵌的(于 2026-07-19 采集);2015–2024 年的数字实时获取。许可证(于 2026-07-19 调研): 数据归 BAFU 所有(由各州办公室汇总;站点技术由 Wildtier Schweiz 提供),并且作为授权数据集发布在 opendata.swiss 上;源站点未声明任何明确许可证。因此响应必须注明来源为 BAFU;BAFU 的正式许可证确认仍在等待中。参见 docs/probe-jagdstatistik.md

  • 道路交通和铁路噪声不在范围内(ch.bafu.laerm-*ch.bav.laermbelastung-*:于 2026-07-28 验证。BAFU 的道路噪声图层 ch.bafu.laerm-strassenlaerm_tag / _nacht 对相同的 identify 请求返回 HTTP 400——它们是纯栅格服务(type: wmtstooltip: false),没有属性查询,因此点查询在技术上不可能。铁路噪声则不同:ch.bav.laermbelastung-eisenbahn_* 确实以 HTTP 200 和真实属性(de_esde_pointofdetermination)应答,因此它是可查询的,但特意未连接——服务器的工具预算在 21 个时已用尽,铁路噪声将需要自己的周期/属性模型。助记:飞机噪声有轮廓线,道路噪声只有像素——铁路噪声本可以有数据,但这是有意的省略。参见 docs/probe-fluglaerm.md

  • 飞机噪声是截止日期地籍,而非实时服务(env_noise_*validfrom 的范围从 01.03.2009(CDB Genève)到 16.04.2024(LBK St. Gallen-Altenrhein),每个机场都单独修订且不另行通知。因此 source_freshness 从不声称“实时”——它携带实际匹配到的登记簿的 validfrom。覆盖范围仅限于机场周边;瑞士大部分地区根本没有地籍,工具会明确报告这一点,而不是返回空列表。小半径下的零命中结果是有歧义的(可能在任何地籍之外,也可能在最内层等值线之内——在 Kloten 跑道附近 100 米处,两者看起来完全相同),因此工具会在更远的半径重新查询一次,并区分 no_cadastrewide_area_only

  • LSV 限值检查排除军用机场:《噪声防护条例》附件 5 明确适用于民用机场。军用机场适用附件 8;该附件未经核实,因此 env_noise_limits_check 拒绝period="military" 执行检查,并指向正确的依据,而不是套用看似合理但错误的表格。

责任矩阵——水、雪与降水(与 meteoswiss-mcp 的边界划分)

为避免在整个工具组合中重复水、雪和降水数据,责任划分如下。meteoswiss-mcp 负责大气降水和天气;swiss-environment-mcp 负责地表水(BAFU 领域:流量、水位、水温、沐浴水质)、地面积雪和雪崩危险。对照实际 LINDAS 数据立方体维度(2026-07-24)检查:在测量的物理量上没有重叠

数据

swiss-environment-mcp (BAFU / SLF)

meteoswiss-mcp (MeteoSwiss)

流量(m³/s)

env_hydro_current(LINDAS hydro/river

水位(海拔米)

env_hydro_current(LINDAS hydro/river + lake

水温(°C)

env_hydro_current

❌(测量的是气温)

沐浴水质(大肠杆菌等)

env_bathing_water(LINDAS ubd0104

地面雪深(HS

env_snow_current(SLF IMIS)

24 小时新雪(HN_1D

env_snow_current(SLF IMIS)

雪崩危险等级

env_avalanche_bulletin(SLF,EAWS 1–5)

作为当前天气状况的降雪

meteo_current / meteo_forecast(天气代码)

降水量(mm):测量网络、预报、气候标准值

meteo_current / meteo_forecast / meteo_climate_normals

SLF IMIS 高山站的降水

✅ 仅作为积雪背景信息,没有独立的降水工具

(MeteoSwiss 网络)

天气预警(风暴、雷暴、高温)

meteo_warnings

自然灾害预警(洪水、雪崩、野火)

env_flood_warningsenv_hazard_*env_wildfire_danger

规则:水体中及水体上的一切(流量、水位、水温、沐浴水质)、地面积雪和 雪崩危险均属于 swiss-environment-mcp(BAFU/SLF);大气降水(以毫米计的 雨/雪)以及天气、预报、预警和气候标准值属于 meteoswiss-mcp。SLF IMIS 降水端点 (RR_10MIN_SUM)有意接入为工具,以免与 MeteoSwiss 重复。积雪/雪崩工具已 上线(参见 docs/probe-slf.md)。TODO(不在本次范围内): 在 meteoswiss-mcp 的 README 中镜像此矩阵——该仓库不属于本次变更的一部分。


测试

# Unit tests (no API keys or network required)
PYTHONPATH=src pytest tests/ -m "not live"

# Integration tests (requires live BAFU APIs)
PYTHONPATH=src pytest tests/ -m "live"

# Linting
ruff check src/

贡献

参见 CONTRIBUTING.md(英文)· CONTRIBUTING.de.md(德文)


安全

安全策略与态势:SECURITY.md(英文)· SECURITY.de.md(德文)。 完整安全架构:docs/security.md


更新日志

参见 CHANGELOG.md


许可证

MIT 许可证——参见 LICENSE

源数据受 BAFU 使用条款约束。使用其数据时须注明出处为 BAFU。


作者

Hayal Oezkan · github.com/malkreide


致谢与相关项目

服务器

描述

zurich-opendata-mcp

苏黎世市开放数据(OSTLUFT 空气质量、天气、停车、地理数据)

swiss-transport-mcp

瑞士公共交通 – OJP 2.0 行程规划、SIRI-SX 中断信息

swiss-road-mobility-mcp

GBFS 共享出行、电动汽车充电、DATEX II 交通

swiss-statistics-mcp

BFS STAT-TAB – 682 个统计数据集

协同示例: “今天 Schulhaus Leutschenbach 的空气质量如何——与全国 NABEL 平均值相比又如何?”
zurich-opendata-mcp(OSTLUFT,本地)+ swiss-environment-mcp(NABEL,全国)

安装

通过 uvuvx 运行——无需克隆或手动安装。将其添加到你的 MCP 客户端配置中(Claude Desktop、Cursor 和 Windsurf 使用 mcpServers;VS Code 在 .vscode/mcp.json 中使用顶层 servers 键):

{
  "mcpServers": {
    "swiss-environment-mcp": {
      "command": "uvx",
      "args": [
        "swiss-environment-mcp"
      ]
    }
  }
}

Available Tools

21 tools
env_air_limits_checkA
Read-onlyIdempotent

Bewertet einen gemessenen Luftschadstoffwert gegen Schweizer LRV-Grenzwerte und WHO 2021-Richtwerte.

Unterstützte Schadstoffe: NO2, PM10, PM2.5, O3, SO2, CO. Grenzwerte gemäss Schweizer Luftreinhalte-Verordnung (LRV, SR 814.318.142.1).

Einen gemessenen Schadstoffwert gegen Schweizer LRV + WHO 2021 einordnen (Überschreitung ja/nein, Verhältnis zum Grenzwert). Rein lokale Berechnung (kein Netzwerk). Unterstützt NO2, PM10, PM2.5, O3, SO2, CO.

Args: params (AirLimitsCheckInput): - pollutant: Schadstoffkürzel ('NO2', 'PM10', 'PM2.5', 'O3', 'SO2', 'CO') - value: Gemessener Wert in µg/m³ - averaging_period: Mittelungszeitraum ('annual', 'daily', 'hourly')

Returns: str: Grenzwert-Vergleich mit Schweizer LRV und WHO 2021, inkl. Überschreitungs-Flag.

ParametersJSON Schema
NameRequiredDescriptionDefault
paramsYes

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.2/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

The description adds behavior beyond annotations by stating 'Rein lokale Berechnung (kein Netzwerk)', confirming the computation is local and idempotent. Annotations already indicate read-only and idempotent, so the description reinforces and adds the local aspect.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is well-structured with <use_case> and <important_notes> tags, making it scannable. The main purpose is front-loaded in the first sentence. However, the 'Args' and 'Returns' sections duplicate some schema information, adding slight redundancy.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the simple tool (one object parameter with three fields), the description covers all necessary aspects: purpose, supported pollutants, averaging periods, return type, and the local computation nature. An output schema exists, so the description does not need to detail return structure.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The input schema already describes all three parameters (value, pollutant, averaging_period) with German text, so schema description coverage is high. The tool description lists supported pollutants and averaging periods but does not add new semantic details beyond what the schema provides.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the tool evaluates a measured air pollutant against Swiss LRV and WHO 2021 limits, using specific verbs like 'Bewertet'. It distinguishes itself from sibling tools like env_noise_limits_check by focusing on air pollutants and regulatory standards.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The <use_case> tag explicitly defines when to use the tool: to classify a measured pollutant value against Swiss and WHO limits. It provides context but does not mention when not to use it or alternatives, which keeps it from a perfect score.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

env_avalanche_bulletinA
Read-only

Ruft das aktuelle Lawinenbulletin des SLF ab (Warnstufen je Region).

Gefahrenstufen nach europäischer EAWS-Skala 1–5 (Gering bis Sehr gross). Ausserhalb der Lawinensaison wird kein Bulletin publiziert – dann meldet das Tool explizit «kein aktives Bulletin» (kein Fehler).

Aktuelle Lawinengefahr je Warnregion für Tourenplanung oder Sicherheitsbeurteilung. EAWS-Skala 1–5. Saisonal (Winter). Datenquelle SLF (CC BY 4.0). Für Schneehöhen → env_snow_current.

Args: params (AvalancheBulletinInput): - language: 'de', 'fr', 'it', 'en' - region: Regionsname/-code (Teilstring) zum Filtern

Returns: str: Warnstufen je Region oder Hinweis, dass kein Bulletin aktiv ist.

ParametersJSON Schema
NameRequiredDescriptionDefault
paramsYes

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.9/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Describes behavior beyond annotations: seasonality, explicit 'no active bulletin' message, data source SLF with CC BY 4.0, and EAWS scale. Annotations already indicate read-only and non-destructive, and description aligns.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Well-structured with main description, use_case, important_notes, and Args. Every sentence is informative; no fluff. Front-loaded with core purpose.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the tool's low complexity (1 param, output schema exists), the description covers all key aspects: purpose, usage, behavior, parameter info, and references to license. It is complete enough for correct invocation.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 0% per context, but the description provides an Args section explaining both parameters: language options and region as substring filter. This adds value, though it does not elaborate further beyond the schema's own descriptions.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states it retrieves the current avalanche bulletin from SLF with warning levels per region. It specifies the EAWS scale 1-5 and distinguishes from sibling tool env_snow_current for snow depths.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Explicitly says when to use: for tour planning/safety assessment. Notes that outside winter season the tool returns 'no active bulletin' (not an error). Recommends env_snow_current for snow height data.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

env_bafu_dataset_detailA
Read-onlyIdempotent

Ruft vollständige Metadaten und Download-URLs eines BAFU-Datensatzes ab.

Liefert: Titel, Beschreibung, Ressourcen mit Direktlinks (CSV, JSON, WMS/WFS), Lizenz, Aktualisierungsintervall und Kontaktinformationen.

Vollständige Metadaten + Download-URLs eines konkreten Datensatzes. dataset_id/Slug zuerst via env_bafu_datasets ermitteln.

Args: params (BafuDatasetDetailInput): - dataset_id: Dataset-ID oder Slug (z.B. 'nabel-luftqualitaet-stationen')

Returns: str: Vollständige Metadaten inkl. aller Download-Ressourcen.

ParametersJSON Schema
NameRequiredDescriptionDefault
paramsYes

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.5/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already provide readOnlyHint, idempotentHint, destructiveHint false. Description adds specific behavioral context: returns complete metadata including download URLs, which complements annotations. No contradictions.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Description is compact with clear sections: purpose, what it returns, use case, important notes, and args. Every sentence adds value. No fluff.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a detail retrieval tool, the description fully covers what the agent needs: metadata contents, pre-requisite, and return format. Output schema exists to supplement return values.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Only one parameter (dataset_id). Schema description provides pattern, length, and example. Description repeats parameter definition but adds minimal new meaning. Schema coverage is good, so description is adequate but not additive.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

Description clearly states it retrieves full metadata and download URLs for a specific BAFU dataset. It lists returned items (title, description, resources, links, license, etc.) and distinguishes from sibling tool env_bafu_datasets which lists datasets.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Explicit use case tag specifies when to use (full metadata for a concrete dataset) and important notes instruct to first get dataset_id via env_bafu_datasets. No ambiguity on when to use this vs alternatives.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

env_bafu_datasetsA
Read-onlyIdempotent

Sucht BAFU-Datensätze auf dem Schweizer Open-Data-Portal opendata.swiss.

Das BAFU publiziert Datensätze zu Luft, Wasser, Boden, Biodiversität, Lärm, Klima, Wald und weiteren Umweltthemen als offene Daten (OGD). Ergebnisse enthalten Titel, Beschreibung und Download-URLs (CSV, JSON, WMS).

BAFU-Open-Data auf opendata.swiss durchsuchen (CSV/JSON/WMS), um danach mit env_bafu_dataset_detail Details/Download-URLs zu holen. Paginierung via offset/rows. 0 Treffer → match_type "none", dann breitere Begriffe versuchen.

Args: params (BafuDatasetsInput): - query: Suchbegriff ('Luftqualität', 'Hochwasser', 'NABEL', etc.) - rows: Anzahl Resultate (1–50) - offset: Offset für Paginierung

Returns: str: Liste der BAFU-Datensätze mit Kurzbeschreibung und Links.

ParametersJSON Schema
NameRequiredDescriptionDefault
paramsYes

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.3/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint=true, idempotentHint=true, destructiveHint=false. The description adds that results are lists with title/description/URLs, pagination via offset/rows, and zero-result handling (match_type 'none'). This supplements the safety profile without contradictions.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is well-structured with a clear first line, details, and sections for use_case and important_notes. It is concise enough while providing necessary context, though the <use_case> and <important_notes> could be integrated more succinctly.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the tool's search function and existing annotations (read-only, idempotent), the description adequately covers purpose, parameters, pagination, and error handling. The return type is mentioned ('Liste...'), and output schema exists (though not shown). Missing details like sorting are acceptable for this complexity level.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The input schema provides thorough descriptions for rows, query, and offset (e.g., range, default, example query). The description adds operational semantics beyond the schema: pagination guidance and advice to try broader terms on zero results. This enhances parameter understanding.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the tool searches BAFU datasets on opendata.swiss, specifies topics (Luft, Wasser, etc.), and mentions results contain titles, descriptions, and download URLs. It also distinguishes from sibling tool env_bafu_dataset_detail via the <use_case> tag, making the purpose specific and differentiated.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The <use_case> provides clear context for when to use this tool (initial search) and directs to env_bafu_dataset_detail for details. The <important_notes> offers guidance on pagination and handling zero results (try broader terms). However, it does not explicitly state when not to use this tool or alternative tools.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

env_bathing_waterA
Read-onlyIdempotent

Ruft die Badegewässerqualität der BAFU-Erhebung ab (LINDAS-Data-Cube).

Die Erhebung misst die hygienische Qualität von Badestellen an Schweizer Seen und Flüssen über E.coli- und Enterokokken-Konzentrationen. Im Gegensatz zu Pegel/Abfluss ist dies eine echte Mehrjahres-Zeitreihe (Saisondaten seit 2020, jährliche Nachführung).

Wasserqualität einer Badestelle prüfen («Kann man bei X baden?») oder Badestellen eines Kantons auflisten. Ohne location wird eine Badestellen-Übersicht geliefert; mit location die letzten Probenwerte dieser Stelle. Daten werden jährlich nach der Badesaison nachgeführt (kein Echtzeit-Monitoring).

Args: params (BathingWaterInput): - location: Badestellen-Name (Teilstring), leer = Übersicht - canton: Kantonskürzel zum Filtern - limit: max. Anzahl Messwerte bzw. Badestellen - response_format: 'markdown' oder 'json'

Returns: str: Probenwerte mit aufgelösten Standort-Labels, Kantonsnummer (Join-Key) und Lizenzfeld — nie rohe Code-URIs.

ParametersJSON Schema
NameRequiredDescriptionDefault
paramsYes

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.5/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

The description adds significant behavioral context beyond annotations: explains data source, temporal scope (annual updates, no real-time), and the difference between overview and detail modes based on location parameter. No contradiction with readOnlyHint, openWorldHint, etc.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is well-structured with clear sections, including a use case and important notes. Every sentence adds value, no redundancy. It is concise yet informative.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a read-only data retrieval tool with good annotations and schema, the description covers all essential aspects: data source, temporal update frequency, parameter behavior, and return format. It is complete and self-sufficient.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The schema already provides descriptions for all parameters (limit, canton, location, response_format). The description adds behavioral nuance about location parameter (overview vs detail) but does not significantly extend schema meaning. Baseline 3 is appropriate given high schema coverage.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the tool retrieves bathing water quality data from BAFU survey, specifying data type (E.coli/Enterokokken), geographic scope (Swiss lakes and rivers), and temporal scope (multi-year since 2020). This distinguishes it from sibling tools focused on hydrology, air quality, etc.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description includes explicit use cases ('prüfen ob man baden kann' and listing stations by canton) and important notes about behavior with/without location parameter. However, it does not explicitly state when not to use this tool or mention alternatives.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

env_flood_warningsA
Read-only

Ruft aktuelle Hochwasserwarnungen aller BAFU-Messstationen in der Schweiz ab.

Das BAFU gibt Hochwasserwarnungen in 5 Gefahrenstufen aus: 1=Keine, 2=Mässig, 3=Erheblich, 4=Gross, 5=Sehr gross.

Aktive Hochwasserwarnungen schweizweit für eine Lagebeurteilung. 5 Gefahrenstufen. "Keine Warnung" ist eine explizite Entwarnung, kein Fehler. canton wird NICHT angewendet (LINDAS führt keinen Kantons-Code): die Antwort ist immer schweizweit und weist einen gesetzten Filter als nicht angewendet aus.

Args: params (FloodWarningsInput): - min_level: Minimale Gefahrenstufe (Standard: 2) - canton: wird nicht angewendet (siehe Hinweise)

Returns: str: Aktuell aktive Hochwasserwarnungen, gefiltert nach Gefahrenstufe.

ParametersJSON Schema
NameRequiredDescriptionDefault
paramsYes

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.1/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint=true and destructiveHint=false. The description adds behavioral context beyond annotations: the response is always nationwide, a set canton filter is reported as not applied, and 'Keine Warnung' is an explicit all-clear rather than an error. No contradiction with annotations.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is structured with use_case, important_notes, Args, and Returns sections. It is front-loaded with the purpose and avoids excessive prose, though the level enumeration and Args section partially duplicate the input schema.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a read-only query tool, the description covers the key context: nationwide scope, danger levels, canton no-op behavior, and the meaning of no warning. With an output schema present, not detailing return structure is acceptable. The only gap is the undocumented response_format option.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The description explains min_level and canton semantics, including the default for min_level, but omits response_format entirely even though it is part of the input schema. Schema description coverage is 0% at the top level, so the description partially compensates but misses one parameter.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description opens with a specific verb and resource: 'Ruft aktuelle Hochwasserwarnungen aller BAFU-Messstationen in der Schweiz ab' (retrieves current flood warnings from all BAFU stations in Switzerland). This clearly distinguishes it from sibling environment tools like avalanche or wildfire warnings.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The <use_case> tag states when to use: 'Aktive Hochwasserwarnungen schweizweit für eine Lagebeurteilung' (active flood warnings nationwide for situation assessment). It also clarifies that canton is not applied and that 'Keine Warnung' is an explicit all-clear, but it does not name alternative tools or exclusion cases.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

env_hazard_overviewA
Read-onlyIdempotent

Orientierungsübersicht zu Schweizer Naturgefahren: welche Gefahr über welches Tool bzw. welche offizielle Warnplattform abrufbar ist.

Hintergrund (verifiziert 2026-07-26, docs/probe-naturgefahren-hazards.md): Die frühere aggregierte naturgefahren.ch-Bulletin-API ist ersatzlos stillgelegt, und es existiert kein stabiler, dokumentierter öffentlicher JSON-Feed für die aggregierten Warnungen (weder MeteoSchweiz-OGD/STAC, opendata.swiss noch die undokumentierte App-API liefern einen sauberen Zugang). Statt eines fragilen Scrapings routet dieses Tool daher auf die dedizierten, live funktionierenden Tools dieses Servers und die offiziellen Warnplattformen. Aggregierte Wetter-/Unwetterwarnungen (Sturm/Gewitter/Hitze) sind Domäne von MeteoSchweiz bzw. meteoswiss-mcp (Zuständigkeitsmatrix).

Einstieg in die Schweizer Naturgefahrenlage: zu welcher Gefahr liefert welches Tool Live-Daten, und wo liegen die offiziellen Bulletins. Netzwerkfrei/deterministisch. Für Live-Werte die verlinkten Tools nutzen: Hochwasser→env_flood_warnings, Lawine→env_avalanche_bulletin, Waldbrand→env_wildfire_danger, Schnee→env_snow_current.

Args: params (HazardOverviewInput): - language: Sprache ('de', 'fr', 'it', 'en') — für die Portallinks

Returns: str: Gefahren→Tool-Routing plus offizielle Warnplattform-Links.

ParametersJSON Schema
NameRequiredDescriptionDefault
paramsYes

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.4/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations indicate readOnly, idempotent, non-destructive. Description adds context: deterministic, network-free, and explains the background of API shutdown. No contradiction, but could mention side effects more explicitly.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Description is front-loaded with purpose, includes background and notes. Slightly long but well-organized with tags. Minor redundancy in background section.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For an overview/routing tool, the description fully covers what it returns (mapping of hazards to tools and platform links). Output schema exists, so return values are documented externally. Complete guidance for selection and usage.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description for language is minimal but present. Description adds context that language is 'für die Portallinks'. Schema coverage is 0% per context, so description helps marginally; baseline 3 is appropriate.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the tool provides an overview of Swiss natural hazards, mapping each hazard to a specific tool or official warning platform. It distinguishes from siblings by listing concrete tools like env_flood_warnings.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Explicit usage guidance: use as entry point, for live data use linked tools. Includes when-not-to-use (aggregated weather warnings are for meteoswiss-mcp) and provides context with <use_case> and <important_notes>.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

env_hazard_regionsA
Read-onlyIdempotent

Regionsbezogene Orientierung zu Naturgefahren: verweist für eine Region auf die dedizierten Live-Tools und die offiziellen Gefahrenkarten.

Wie env_hazard_overview netzwerkfrei: die aggregierte naturgefahren.ch-Regionen-API ist stillgelegt (2026), ohne stabilen Ersatz. Für regionsscharfe Live-Werte liefern die verlinkten Tools die Daten (Waldbrand z.B. via env_wildfire_danger mit Kanton-Filter).

Regionsbezogener Einstieg (Event-, Schulausflug-, Infrastruktur- Planung): welches Tool liefert für die Region welche Gefahr. Netzwerkfrei/deterministisch. Regionsscharfe Waldbrand-Stufen: env_wildfire_danger (canton-Filter). Karten: naturgefahren.ch / BAFU GIS.

Args: params (HazardRegionsInput): - region: Regionsname/Kanton (z.B. 'Zürich', 'Graubünden', 'Wallis') - hazard_type: Gefahrentyp ('hochwasser', 'lawinen', 'steinschlag', 'rutschungen') - language: Sprache

Returns: str: Regionsbezogenes Tool-Routing plus Karten-/Portal-Links.

ParametersJSON Schema
NameRequiredDescriptionDefault
paramsYes

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.8/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

The description adds behavioral traits beyond annotations: it confirms the tool is network-free and deterministic, notes that the aggregated API is shut down, and explains that live data comes from linked tools. This aligns with readOnlyHint and idempotentHint, and provides additional context.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is well-structured with separate paragraphs, use_case and important_notes tags, and an Args section. However, it is somewhat verbose; a more concise version could convey the same information.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the tool's moderate complexity, the description covers all relevant aspects: purpose, usage context, behavioral notes, parameter details, and return value. The output schema exists, so the brief mention of return value is sufficient. Annotations and output schema together make this complete.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The description includes an 'Args' section that explains each parameter with examples (e.g., region name, hazard type options). Since schema description coverage is 0% (according to context signals), the description compensates by adding meaning beyond the bare schema definitions.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the tool's purpose: providing region-based orientation to natural hazards, pointing users to dedicated live tools and official hazard maps. It uses specific verbs ('verweist') and distinguishes itself from siblings by referencing 'env_wildfire_danger' for wildfire danger.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description explicitly states when to use the tool (region-based planning for events, school trips, infrastructure) and what not to use it for (live values, which are handled by linked tools like 'env_wildfire_danger'). It also explains that the tool is network-free and deterministic, providing clear guidance.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

env_hunting_speciesA
Read-onlyIdempotent

Listet die in der Eidg. Jagdstatistik erfassten Tierarten mit ihren Codes auf.

Die Liste ist statisch eingebettet (aus der Live-Probe) und dient als Nachschlagewerk für env_hunting_stats (Parameter species).

Verfügbare Tierarten + Codes nachschlagen, bevor mit env_hunting_stats Abschuss-/Fallwildzahlen abgefragt werden. Rein lokal (kein Netzwerk). 36 Arten (Huftiere, Raubtiere, weitere Säuger).

Args: params (HuntingSpeciesInput): - response_format: 'markdown' oder 'json'

Returns: str: Liste der Tierarten mit sp-Code und Name.

ParametersJSON Schema
NameRequiredDescriptionDefault
paramsYes

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.2/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint and idempotentHint, so the description adds value by stating the data is static (no network), embedded, and contains exactly 36 species across categories. This context complements the annotations without contradiction.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is structured with clear paragraphs and XML tags for use case and important notes. It is informative without being overly verbose, though it could be slightly more streamlined.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the tool's simplicity, the description covers all necessary aspects: purpose, how it works (static embedded), output format (list with codes and names), and usage context (reference for env_hunting_stats). It is fully sufficient for an agent to invoke correctly.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 0%, but the description does mention the only parameter (response_format) and its possible values ('markdown' oder 'json'). However, it does not explain the difference between formats or how they affect output, leaving the agent to infer from the enum. This is adequate for a simple parameter but not exemplary.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states that the tool lists animal species with their codes from the Swiss hunting statistics, and explicitly links it to the sibling tool env_hunting_stats for reference. The verb 'listet auf' and resource 'Tierarten mit Codes' are specific and distinguish it from other environmental tools.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description includes a use case tag explicitly recommending use before querying env_hunting_stats to obtain valid species codes. It implies a lookup-only purpose but does not explicitly state when not to use or mention alternatives, which prevents a 5.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

env_hunting_statsA
Read-only

Ruft Zeitreihen der Eidg. Jagdstatistik ab: Abschuss-, Bestand-, Aussetzungs- oder Fallwildzahlen je Tierart und Kanton (Jahre 2015–2024).

Datenherr ist das BAFU. Der zugrundeliegende Endpoint ist undokumentiert (Web-App-Backend); ein Schema-Guard fängt Strukturänderungen ab.

Entwicklung der Abschuss- oder Fallwildzahlen einer Tierart in einem Kanton über die Zeit. Tierart via Name oder Code (siehe env_hunting_species). Werte je Alters-/Geschlechtsklasse; Total = Summe. Jagdjahr meist 1. Apr.–31. März.

Args: params (HuntingStatsInput): - species: Tierart (Name oder sp-Code) - canton: Kantonskürzel oder 'CH' - data_type: 'abschuss', 'bestand', 'aussetzung', 'fallwild' - response_format: 'markdown' oder 'json'

Returns: str: Jahreswerte (Total + Klassen) oder aktionabler Hinweis bei Problemen.

ParametersJSON Schema
NameRequiredDescriptionDefault
paramsYes

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A3.9/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations declare readOnlyHint=true and destructiveHint=false, which aligns with the tool's read-only nature. The description adds transparency by disclosing that the underlying endpoint is undocumented and that a schema guard handles structural changes, plus specifying the data owner (BAFU). This goes beyond annotations without contradiction.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is well-structured with separate paragraphs and XML tags for use_case and important_notes. It is front-loaded with the main purpose and then provides additional context. It is not overly verbose for the complexity of the tool, earning a 4.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given that the tool has no output schema, the description explains the return value as yearly values (total and classes) or an actionable hint. It covers parameters well via schema, and adds usage context. However, it lacks detail on the exact structure of markdown vs JSON response. Still, for a tool with 4 parameters and a string output, this is fairly complete.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Although the input schema covers all four parameters with detailed descriptions, the description adds some extra context (e.g., species via name or code, values per age/sex class, total is sum, hunting year definition). Since schema coverage is high, the baseline is 3, and the added value is marginal but present.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states that the tool retrieves time series of Federal Hunting Statistics (kill, population, release, or accidental game numbers) per species and canton for 2015-2024. It specifies the data types and time range. While it distinguishes from sibling env_hunting_species implicitly, it doesn't explicitly differentiate from other sibling tools, so a 4 is appropriate.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description provides a use_case tag explaining when to use the tool (e.g., tracking development of kill or accidental numbers over time) and important_notes with details on species coding and hunting year definition. It lacks explicit exclusions or alternatives, but the context is clear enough for correct usage.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

env_hydro_currentA
Read-only

Ruft aktuelle Messwerte einer hydrologischen BAFU-Messstation ab.

Liefert Pegel (m ü.M.), Abfluss (m³/s), Wassertemperatur (°C) sowie 24h-Min/Max-Werte. Daten werden alle 10 Minuten aktualisiert.

Bekannte Zürich-relevante Stationen:

  • 2099: Limmat – Zürich/Unterwerk

  • 2243: Sihl – Zürich

  • 2034: Zürichsee – Zürich/Tiefenbrunnen (Pegel)

Aktueller Pegel/Abfluss/Temperatur einer Station, z.B. für einen Hochwasser-Lagecheck. Station-ID via env_hydro_stations. 10-Minuten-Aktualisierung. Quelle ist LINDAS; kennt es die Nummer nicht, meldet das Tool das explizit (kein Ersatzwert aus einer anderen Quelle).

Args: params (HydroCurrentInput): - station_id: BAFU-Stationsnummer (z.B. '2099') - response_format: 'markdown' oder 'json'

Returns: str: Aktuelle Messwerte inkl. Zeitstempel.

ParametersJSON Schema
NameRequiredDescriptionDefault
paramsYes

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.6/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

The description adds substantial behavioral context beyond the readOnlyHint: data source is LINDAS, values update every 10 minutes, and unknown station IDs are explicitly reported with no fallback. It also details the return content (Pegel, Abfluss, Wassertemperatur, 24h min/max) and the timestamp. This goes well beyond annotations, covering potential edge cases and data freshness.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is well-structured with clear sections (intro, return values, station list, use case, important notes, Args, Returns) and is front-loaded with the core action. It is slightly redundant (10-minute update appears twice) and the station list is somewhat niche, but every section contributes to usability. Not overly verbose.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a simple read-only tool, the description is complete: it explains what data is returned, how to get station IDs, the update frequency, and error behavior for unknown IDs. Given the output schema exists (though not shown), the brief 'Returns' line suffices. It covers usage, parameters, and edge cases effectively.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Despite the schema description coverage being 0% according to context, the description's 'Args' section explains both parameters: station_id as 'BAFU-Stationsnummer' with examples, and response_format as 'markdown' or 'json'. It also provides a list of known Zürich station IDs, which adds real-world context. However, it could explain the effect of response_format on the output structure in more depth.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the tool's function: 'Ruft aktuelle Messwerte einer hydrologischen BAFU-Messstation ab' (retrieves current measurements). It specifies the resource (hydrological BAFU measuring station) and the scope (current values, with units listed). It distinguishes itself from siblings like env_hydro_history by focusing on current data and includes known station IDs.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description provides specific usage context via the '<use_case>' tag (e.g., flood situation check) and important notes (station ID via env_hydro_stations). It implicitly differentiates from historical data by stating 'aktuelle Messwerte', but it does not explicitly name alternatives like env_hydro_history. This is clear guidance, but lacks an explicit 'when not to use'.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

env_hydro_historyA
Read-onlyIdempotent

Ruft historische Stundenwerte einer BAFU-Hydromesstations ab.

Ermöglicht zeitliche Analysen von Wasserstand, Abfluss und Temperatur über bis zu 30 Tage. Ideal für Trendanalysen und Extremereignis-Recherche.

Aktuellsten Messwert einer Station holen und den Zugang zu echten historischen Zeitreihen (Tages-/Langzeitmittel) aufzeigen. LINDAS liefert nur den aktuellen Wert (keine Zeitreihe). Historische Tages-/Langzeitmittel sind NICHT frei per API verfügbar und müssen bei der BAFU-Abfragezentrale bezogen werden.

Args: params (HydroHistoryInput): - station_id: BAFU-Stationsnummer - parameter: 'Abfluss', 'Pegel' oder 'Temperatur' (Kontext) - days: Anzahl Tage (Kontext)

Returns: str: Aktuellster Messwert (LINDAS) + Bezugsweg für historische Reihen.

ParametersJSON Schema
NameRequiredDescriptionDefault
paramsYes

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.4/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already provide readOnlyHint=true, destructiveHint=false, idempotentHint=true. The description adds that it returns the current value and a reference path for historical series, and explains limitations about daily averages. This complements the annotations without contradiction.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness3/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is somewhat verbose, with an args list that largely duplicates schema information. It has good structure with sections, but could be more concise by removing redundant parameter details.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a read-only tool with simple output, the description covers the core behavior, limitations (no daily averages), data source (LINDAS), and a reference path. It lacks examples or error info, but is otherwise complete given annotations and simple output.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 0% for the top-level parameter, but the description lists station_id, parameter, and days with brief context (e.g., 'Kontext'). It adds value by clarifying the use context, though it mostly repeats schema descriptions. The important notes also add parameter-related guidance.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states it retrieves historical hourly values for a BAFU hydrometric station, specifying water level, flow, and temperature over up to 30 days. It distinguishes from siblings like env_hydro_current (current values) and env_hydro_stations (station list) by focusing on historical time series.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The <use_case> and <important_notes> explicitly guide when to use: for fetching the current value and pointing to historical daily/long-term series, and notes that daily averages are not available via API, requiring contacting BAFU. This provides clear when-to-use and when-not-to-use context.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

env_hydro_stationsA
Read-onlyIdempotent

Listet hydrologische Messstationen des BAFU an Schweizer Flüssen und Seen auf.

Das BAFU betreibt ca. 260 Messstationen in der Schweiz. Stationen messen Wasserstand (Pegel), Abfluss (m³/s), Wassertemperatur und weitere Parameter in einem 10-Minuten-Intervall.

Hydromessstationen finden (nach Gewässer), um danach mit env_hydro_current Pegel/Abfluss abzurufen. canton wird derzeit NICHT bedient: die Quelle, die den Kantons-Code mitlieferte, ist stillgelegt, und LINDAS führt keinen — das Tool sagt das explizit, statt eine unvollständige Liste auszugeben. Stattdessen water_body nutzen. Bei LINDAS-Ausfall Fallback mit Beispielstationen, im JSON an provenance erkennbar. Leeres Filterresultat → match_type "none".

Args: params (HydroStationsInput): - canton: derzeit nicht bedienbar (Quelle stillgelegt) - water_body: Gewässername zum Filtern (z.B. 'Limmat') - response_format: 'markdown' oder 'json'

Returns: str: Stationsliste, Absage zum Kantonsfilter, oder Fallback bei Ausfall.

ParametersJSON Schema
NameRequiredDescriptionDefault
paramsYes

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.6/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Adds rich behavioral context: ~260 stations, measurement interval, fallback to example stations on LINDAS failure (recognizable via provenance), and match_type 'none' for empty results. These details go well beyond the readOnlyHint annotation.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Structured with a clear summary, use_case, and important_notes. Front-loaded and efficient; the length is justified by the need to explain the unsupported canton and fallback behavior.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Covers listing, filtering, unsupported parameters, fallback behavior, and return format. With an output schema available, the description is complete for effective use.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The description includes an Args section listing all parameters and notes canton is currently unavailable, water_body is the supported filter, and response_format accepts markdown or json. Given schema description coverage is 0%, this compensates well, though it could elaborate on response_format behavior.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

Description clearly states it lists BAFU hydrological stations at Swiss rivers and lakes, and distinguishes it from env_hydro_current by positioning it as the station-finding step before retrieving current values.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Provides an explicit use case ('Hydromessstationen finden... um danach mit env_hydro_current Pegel/Abfluss abzurufen') and clearly states the canton filter is not supported, recommending water_body instead. It does not explicitly compare to other siblings like env_hydro_history, but the context is clear.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

env_nabel_currentA
Read-only

Ruft aktuelle und historische Luftqualitätsdaten einer NABEL-Station ab.

Liefert Metadaten, Download-Links für Messdaten (CSV) sowie direkte Abfrage-URLs für den BAFU-Datenbrowser. Gemessene Parameter: NO₂, O₃, PM10, PM2.5, SO₂, CO, Russ (BC).

Aktuelle Luftqualität / Datenzugang einer konkreten NABEL-Station. Liefert Metadaten + Datenlinks, keine Echtzeit-Rohwerte. Stationskürzel via env_nabel_stations ermitteln.

Args: params (NabelCurrentInput): - station: Stationskürzel (z.B. 'ZUE', 'DUB', 'BER')

Returns: str: Stationsinformationen, Messparameter, Datenlinks und Grenzwertkontext.

ParametersJSON Schema
NameRequiredDescriptionDefault
paramsYes

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A5/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Beyond annotations (readOnlyHint, etc.), description adds critical behavior: it returns metadata and download links, not real-time raw values, and specifies output contents (station info, parameters, data links, limit context). No contradiction with annotations.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Concise yet comprehensive: one sentence summary, then structured details, use case, and important notes. Every sentence adds value, no redundancy.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given low parameter count and existence of output schema, description sufficiently covers return type (station info, parameters, data links, limit context) and the tool's scope. No omissions noted.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters5/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The single parameter (station) is explained with examples in both the description and schema description. Important notes add context on how to obtain station codes, significantly aiding parameter understanding.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

Description clearly states it retrieves current and historical air quality data for a specific NABEL station, listing measured parameters. It distinguishes from sibling tools like env_nabel_stations and env_air_limits_check by focusing on data access for a single station.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Explicit use case (current air quality / data access) and important notes (returns metadata and data links, not real-time raw values; station codes from env_nabel_stations) provide clear when-to-use and how-to-prequisites, with alternative tool mentioned.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

env_nabel_stationsA
Read-onlyIdempotent

Listet alle 16 NABEL-Messstationen des nationalen Luftmessnetzes (BAFU) auf.

Das NABEL (Nationales Beobachtungsnetz für Luftfremdstoffe) misst seit 1991 kontinuierlich an 16 Standorten in der Schweiz: NO₂, O₃, PM10, PM2.5, SO₂, CO, Russ und weitere Parameter.

Einstieg in Luftqualitätsdaten: Stationsübersicht, um danach mit env_nabel_current die Messwerte einer konkreten Station zu holen. 16 feste NABEL-Stationen (statisch, kein Live-Call).

Args: params (NabelStationsInput): - response_format: 'markdown' oder 'json'

Returns: str: Liste aller NABEL-Stationen mit Kürzel, Name, Kanton und Standorttyp. Enthält auch den Link zur BAFU-Datenabfrage.

ParametersJSON Schema
NameRequiredDescriptionDefault
paramsYes

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.2/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already indicate read-only, idempotent, non-destructive. Description adds that the data is static (not a live call) and lists the measured parameters, enhancing behavioral understanding.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Well-structured with use case and important notes sections, but slightly wordy. Clear and informative without being overly terse.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Provides complete context: number of stations, what is measured, output structure, and how to proceed. Output schema exists, so return details are covered.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The schema's parameter description already covers 'markdown' or 'json' output. The tool description does not add new semantics beyond that, resulting in a baseline score of 3.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the tool lists all 16 NABEL stations, uses the verb 'auflisten', and distinguishes itself from siblings by mentioning a follow-up use case with env_nabel_current.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Includes a <use_case> tag explaining it's the entry point for air quality data, and notes the stations are static. Does not explicitly state when not to use, but provides good context.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

env_noise_aircraft_atA
Read-onlyIdempotent

Fluglärmbelastung an einem Punkt aus dem BAZL-Lärmbelastungskataster.

Beantwortet: «Liegt dieser Standort in einer Fluglärmzone — und in welcher dB-Stufe?» Grundlage sind die amtlichen Lärmkurven der zivilen Flugplätze (und, für period='military', von Locarno-Magadino).

Standortabklärung für Bauvorhaben, Schulhaus- oder Wohnbau- planung: dB-Belastung und Kataster-Referenz an einer LV95-Koordinate. Eingabe MUSS LV95 sein (EPSG:2056, Meter: E ~2.48–2.84 Mio, N ~1.07–1.30 Mio). WGS84-Grad (z.B. 8.54/47.37) wird abgewiesen. Die Kurven sind Isolinien, keine Flächen — das Ergebnis ist eine dB-Klammer mit dem höchsten Wert als oberer Schranke, kein interpolierter Punktwert. Orientierungsgrundlage, keine Baubewilligungsauskunft.

Args: params (NoiseAircraftAtInput): - east/north: LV95-Koordinate in Metern - period: Beurteilungszeitraum bzw. Verkehrsart (8 Werte, s. Schema) - radius_m: Suchradius in Metern (10–1000, Default 100) - response_format: 'markdown' oder 'json'

Returns: str: Massgebender dB-Wert, dB-Klammer, alle gefundenen Kurven, Kataster-Provenienz und amtlicher PDF-Link.

ParametersJSON Schema
NameRequiredDescriptionDefault
paramsYes

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.5/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint=true, idempotentHint=true, and destructiveHint=false. The description adds behavioral context: results are based on isolines (not interpolation), output is a bracket with upper bound, and the result is an orientation basis, not a building permit. No contradiction with annotations.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is well-structured with clear sections (purpose, use case, important notes). It is slightly verbose but each sentence adds value. The important notes are appropriately emphasized with <important_notes> tags.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the tool's complexity (coordinate system, isolines, multiple periods), the description is thorough. It covers input requirements, output structure (dB value, bracket, provenance, PDF link), and limitations. The use case is concrete. No obvious gaps remain.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters5/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Despite schema descriptions for parameters, the tool description adds significant value: it warns about coordinate system confusion (LV95 vs WGS84), gives concrete examples (Zürich HB), explains each period value in detail, and warns that a large radius_m overestimates noise. These details are not in the schema alone.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the tool evaluates aircraft noise at a point using official BAZL noise cadastre data. It specifies the exact question answered ('Liegt dieser Standort in einer Fluglärmzone — und in welcher dB-Stufe?') and distinguishes itself from sibling tools like env_noise_aircraft_registers or env_noise_limits_check by focusing on point-based noise level lookup.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description provides explicit usage context: site assessment for construction projects. Important notes clarify coordinate system requirements (LV95, not WGS84), the nature of results (isolines producing a dB bracket), and that output is for orientation only. While it doesn't explicitly list when not to use, the constraints are clearly stated.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

env_noise_aircraft_registersA
Read-onlyIdempotent

Übersicht der publizierten Fluglärm-Lärmbelastungskataster.

Das Provenienz-Tool: Es beantwortet «wie alt ist die Grundlage». Für jeden Flugplatz die Gültigkeitsdaten, die Anzahl Lärmkurven, den abgedeckten dB-Bereich und den Link auf den amtlichen Katasterplan.

Vor einer Standortabklärung prüfen, ob für den betreffenden Flugplatz überhaupt ein Kataster existiert und wie aktuell er ist. Ohne period werden alle acht Sublayer abgefragt (acht Upstream-Requests). Die Gültigkeitsdaten streuen erheblich (2009–2024) — ein Kataster ist ein Stichtagsdokument, kein Echtzeitdienst.

Args: params (NoiseAircraftRegistersInput): - period: optionaler Filter auf einen Sublayer - response_format: 'markdown' oder 'json'

Returns: str: Tabelle der Kataster mit Gültigkeitsdaten und amtlichen PDF-Links.

ParametersJSON Schema
NameRequiredDescriptionDefault
paramsYes

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.8/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Description adds significant behavioral context beyond annotations: queries eight sublayers without period, validity dates vary widely (2009-2024), data is a snapshot not real-time. Annotations already declare readOnly, idempotent, non-destructive, so the description enriches understanding without contradiction.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Description is well-structured with sections (overview, use case, important notes, args, returns). Every sentence adds value, and it is front-loaded with the core purpose. No redundant or vague sentences.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the tool's complexity (multiple sublayers, filtering options, data staleness) and the presence of annotations and output schema, the description is complete. It covers purpose, parameters, behavior, return format, and usage context. All necessary information is present.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters5/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Description explicitly lists both parameters (period and response_format) and adds meaning beyond schema: period optional with eight sublayers explained, without period triggers eight requests. Even though schema coverage is low, the description compensates fully, providing clear semantics for each parameter.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

Description clearly states the tool provides an overview of published aircraft noise pollution registers with validity dates, number of curves, dB range, and links. The use case and 'Provenienz-Tool' label further clarify its purpose, distinguishing it from sibling tools like env_noise_aircraft_at by focusing on register metadata rather than real-time noise data.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description provides a clear use case ('before a site assessment, check if a register exists and how current it is') and important notes (e.g., without period multiple requests, data is not real-time). However, it does not explicitly contrast with sibling tools or specify when not to use it, missing some exclusion criteria.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

env_noise_limits_checkA
Read-onlyIdempotent

Vergleicht einen Fluglärm-Beurteilungspegel gegen die LSV-Belastungsgrenzwerte.

Grundlage: Lärmschutz-Verordnung (LSV, SR 814.41), Anhang 5 «Belastungsgrenzwerte für den Lärm ziviler Flugplätze» — differenziert nach Empfindlichkeitsstufe (ES I–IV) und Schwelle (Planungswert / Immissionsgrenzwert / Alarmwert).

Einen dB-Wert aus env_noise_aircraft_at (oder aus einem Gutachten) rechtlich einordnen: welche Schwelle ist überschritten und mit welcher Folge. Rein lokale Berechnung (kein Netzwerk). Für period='military' wird die Prüfung bewusst verweigert — Anhang 5 gilt nur für zivile Flugplätze, für Militärflugplätze ist Anhang 8 einschlägig. Die Werte für ES II in der ersten Nachtstunde weichen von den übrigen Nachtstunden ab (Fussnote zu Ziff. 222).

Args: params (NoiseLimitsCheckInput): - level_db: Beurteilungspegel in dB(A) - sensitivity_level: 'I', 'II', 'III' oder 'IV' (auch 'ES II', '2') - period: Beurteilungszeitraum bzw. Verkehrsart - response_format: 'markdown' oder 'json'

Returns: str: Überschreitung je Schwelle mit Grenzwert, Differenz und Rechtsgrundlage im Klartext.

ParametersJSON Schema
NameRequiredDescriptionDefault
paramsYes

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.1/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

The description discloses that the calculation is purely local ('Rein lokale Berechnung, kein Netzwerk'), which aligns with the readOnlyHint and idempotentHint. It also notes the refusal for military periods and the footnote-driven deviation for ES II first night hour, adding behavioral context beyond what annotations provide. No contradictions with annotations exist.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is well-structured with a clear opening sentence, legal basis, use case, and important notes sections. While it is relatively long, each part adds necessary context for a domain-specific legal comparison tool. The structure aids quick scanning and comprehension, though some redundancy exists between the description and schema.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the tool's complexity (nested input, four parameters, output schema), the description covers purpose, legal framework, usage context, key exceptions, and return format. It references the expected input source (sibling tool) and addresses edge cases. The presence of an output schema reduces the need to detail return structure in the description, so completeness is satisfactory.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The input schema already provides detailed descriptions for all parameters, including enum values for period and explanations for sensitivity_level. The description adds marginal value by linking level_db to the sibling tool env_noise_aircraft_at and reiterating legal context, but the schema coverage is high enough that the description does not significantly shift understanding of parameter semantics.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states 'Vergleicht einen Fluglärm-Beurteilungspegel gegen die LSV-Belastungsgrenzwerte' (compares a flight noise assessment level against LSV limit values), specifying a concrete verb and resource. It also cites the exact legal basis (LSV, Anhang 5) and differentiates the tool from siblings like env_noise_aircraft_at by focusing on legal classification rather than noise level retrieval.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The use case section explicitly tells when to use this tool: 'Einen dB-Wert aus env_noise_aircraft_at (oder aus einem Gutachten) rechtlich einordnen'. The important notes explain that the tool deliberately refuses the 'military' period because Annex 5 only applies to civil airports, providing a clear exclusion criterion. It also highlights the special case for ES II in the first night hour, guiding correct parameter choice.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

env_snow_currentA
Read-only

Ruft aktuelle Schneehöhe (HS) und Neuschnee 24 h (HN_1D) der SLF-IMIS- Stationen ab.

Werte in cm, modelliert aus dem SLF-Schneedeckenmodell. Ausserhalb der Schneesaison sind die Werte 0 (schneefrei) – das ist kein Fehler.

Aktuelle Schneelage nach Kanton oder Station, z.B. für Tourenplanung oder Schulausflüge. HS/HN_1D in cm. Kein Niederschlag (→ meteoswiss-mcp). Datenquelle SLF (CC BY 4.0).

Args: params (SnowCurrentInput): - canton: Kantonskürzel zum Filtern - station: IMIS-Stationscode zum Filtern - limit: max. Anzahl Stationen - response_format: 'markdown' oder 'json'

Returns: str: Schneehöhe und Neuschnee je Station, nach Schneehöhe absteigend.

ParametersJSON Schema
NameRequiredDescriptionDefault
paramsYes

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.3/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already indicate readOnlyHint=true and openWorldHint=true. The description adds behavioral context: data is modeled from SLF model, values are in cm, and zero outside snow season is not an error. No contradictions with annotations.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is well-structured with sections using HTML-like tags, bullet arguments, and a clear return description. It is concise yet complete, with no unnecessary words.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a simple data retrieval tool, the description covers purpose, usage guidance, behavioral notes, parameter list, and return format. Combined with annotations and an output schema, it provides sufficient context for the agent to use the tool correctly.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Despite schema_description_coverage being 0% (as per context), the description lists parameters (canton, station, limit, response_format) with brief explanations. However, it mostly repeats what is in the schema. It adds units clarification but no additional constraints or examples beyond the schema.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the tool retrieves current snow height and new snow 24h from SLF-IMIS stations, with specific units and model source. It also notes that zero values are normal outside snow season. However, it does not explicitly differentiate from sibling tools like env_snow_stations, though the purpose is clear enough.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description provides explicit use cases (current snow situation for planning), an alternative tool for precipitation (meteoswiss-mcp), and mentions the data license. This guides the agent on when and when not to use this tool, and where to go for related data.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

env_snow_stationsA
Read-onlyIdempotent

Listet die automatischen IMIS-Schneemessstationen des SLF auf.

Das SLF betreibt ein Netz automatischer Stationen (IMIS) in den Schweizer Bergen, die u.a. Schneehöhe, Neuschnee, Wind und Temperaturen messen.

Einstieg in die Schneedaten: Stationsübersicht (nach Kanton), um danach mit env_snow_current Schneehöhe/Neuschnee abzurufen. Datenquelle SLF (CC BY 4.0). type=SNOW_FLAT sind Flachfeld-Schneestationen. Kein Niederschlags-Tool (→ meteoswiss-mcp).

Args: params (SnowStationsInput): - canton: Kantonskürzel zum Filtern (z.B. 'GR') - response_format: 'markdown' oder 'json'

Returns: str: Stationsliste mit Code, Name, Kanton, Höhe und Typ.

ParametersJSON Schema
NameRequiredDescriptionDefault
paramsYes

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.4/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already provide readOnlyHint=true, idempotentHint=true, destructiveHint=false, so the description's job is to add context beyond that. The description adds the data source (SLF CC BY 4.0) and the explanation of station types, but does not disclose much else about behavior (e.g., rate limits, authentication, or edge cases). With annotations covering the safety profile, a 3 is appropriate – the description adds some value but not rich behavioral context.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is well-structured with paragraphs, use_case, and important_notes tags, and is front-loaded with the purpose. However, it is somewhat lengthy; each sentence earns its place but could be slightly more concise. Still, the structure aids readability.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given that an output schema exists (context confirms), the description does not need to detail return values, but it still mentions the return fields (Code, Name, Kanton, Höhe, Typ). It covers the use case, important notes about data source and station types, and provides clear entry-point guidance. For a list tool with good annotations, this is complete.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The description explicitly lists both parameters (canton and response_format) with brief explanations, adding meaning beyond what the input schema provides. The schema already has a description for canton, but the response_format parameter is an enum and the description clarifies the options. Since the schema description coverage is low (0% per context, though the schema itself has descriptions), the description compensates well.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states it lists automatic IMIS snow measurement stations of SLF, and specifies what parameters they measure (snow height, new snow, wind, temperature). This distinguishes it from sibling tools like env_snow_current which retrieves actual snow data.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The use_case tag explicitly says it's an entry point to snow data, to be followed by env_snow_current. The important_notes tag explains the data source (SLF, CC BY 4.0), clarifies that type=SNOW_FLAT are flat-field stations, and importantly tells users that this is NOT a precipitation tool, directing them to meteoswiss-mcp instead. This is excellent guidance for when to use or not use this tool.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

env_wildfire_dangerA
Read-only

Ruft den aktuellen Waldbrandgefahren-Index nach Regionen ab.

Die Waldbrandgefahr wird täglich durch das BAFU berechnet und auf einer 5-stufigen Skala (gering bis sehr gross) kommuniziert. Relevant für Schulausflüge, Events und Forstbetriebe.

Waldbrandgefahr-Index pro Region/Kanton, z.B. für Forstbetriebe oder Event-Planung. 5-stufige Skala, tagesaktuell (de/fr/it/en). Ohne Kanton-Filter werden die höchsten Stufen zuerst und auf 40 Regionen begrenzt gezeigt. Datenzugriff über einen zweistufigen, HTML-getragenen Vertrag (react-props der Startseite → signierte Blob-JSON-URL).

Args: params (WildfireDangerInput): - language: 'de', 'fr', 'it' - canton: Kantonskürzel zum Filtern

Returns: str: Aktuelle Waldbrandgefahr nach Regionen/Kantonen.

ParametersJSON Schema
NameRequiredDescriptionDefault
paramsYes

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.6/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

The description goes well beyond the annotations (readOnlyHint, openWorldHint) by detailing the data access mechanism (two-step HTML-backed contract), daily updates, language support, the 5-level scale, and the filtering behavior. This provides rich, non-contradictory behavioral context.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is moderately sized with clear tags (<use_case>, <important_notes>) and a direct first sentence. It is structured but could be slightly more concise without losing essential information.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the tool's moderate complexity (one nested input parameter, output as string, and data source details), the description provides sufficient context for an agent to use it correctly. The presence of an output schema (implied) and the detailed notes make it complete within its domain.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Although the schema descriptions already cover the parameters (canton and language), the tool description adds value by explaining the default behavior when no canton is given (highest levels first, limit 40) and the broader context of the five-step scale. This compensates for the 0% schema description coverage.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the tool retrieves the current forest fire danger index by region, computed daily by BAFU on a 5-level scale, and specifies its relevance for school trips, events, and forestry operations. This is a specific verb+resource with sufficient detail to distinguish it from sibling environmental tools.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description provides explicit use cases (forest operations, event planning) and contextual notes (daily updates, canton filtering, default behavior when no filter is applied). However, it does not explicitly state when not to use the tool or suggest alternatives, falling short of a perfect score.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

Tool Schema Changelog

Recent tool additions, removals, and schema changes observed during successful MCP inspections.

  1. 2 tool updatesv0.6.0
    • Changedenv_flood_warnings1 field changed
      • changedInput schema / $defs / FloodWarningsInput / properties / canton / description
        Previous value: -"Kantonskürzel zum Filtern (z.B. 'ZH') – leer = ganze Schweiz"New value: +"NICHT ANGEWENDET – LINDAS führt keinen Kantons-Code. Die Antwort umfasst immer die ganze Schweiz; ein gesetzter Wert ändert daran nichts und wird in der Antwort als nicht angewendet ausgewiesen."
    • Changedenv_hydro_stations2 fields changed
      • changedInput schema / $defs / HydroStationsInput / properties / canton / description
        Previous value: -"Kantonskürzel zum Filtern (z.B. 'ZH', 'BE', 'GR') – leer = alle Kantone"New value: +"NICHT UNTERSTÜTZT – die Quelle mit Kantons-Code ist stillgelegt, LINDAS führt keinen. Ein gesetzter Wert liefert nur eine Erklärung, keine Stationen. Zum Eingrenzen `water_body` verwenden."
      • changedInput schema / $defs / HydroStationsInput / properties / water_body / description
        Previous value: -"Gewässername zum Filtern (z.B. 'Limmat', 'Rhein', 'Sihl')"New value: +"Gewässername zum Filtern (z.B. 'Limmat', 'Rhein', 'Sihl') – der unterstützte Filter dieses Tools"
  2. 21 tool updatesv0.5.2
    • First observedenv_air_limits_check
    • First observedenv_avalanche_bulletin
    • First observedenv_bafu_dataset_detail
    • First observedenv_bafu_datasets
    • First observedenv_bathing_water
    • First observedenv_flood_warnings
    • First observedenv_hazard_overview
    • First observedenv_hazard_regions
    • First observedenv_hunting_species
    • First observedenv_hunting_stats
    • First observedenv_hydro_current
    • First observedenv_hydro_history
    • First observedenv_hydro_stations
    • First observedenv_nabel_current
    • First observedenv_nabel_stations
    • First observedenv_noise_aircraft_at
    • First observedenv_noise_aircraft_registers
    • First observedenv_noise_limits_check
    • First observedenv_snow_current
    • First observedenv_snow_stations
    • First observedenv_wildfire_danger

TDQS

A4.1/5.0

Scored across 21 tools

Disambiguation4/5

Tools are organized into clear domain families (air, hydro, snow, noise, hunting, open data) with distinct list/current/detail/check roles, and cross-references in descriptions reduce risk of misselection. The main ambiguity is between env_hazard_overview and env_hazard_regions, which are both non-data routing tools, and env_hydro_history's name implies historical data while it only returns a current value and pointers.

Naming Consistency5/5

All tools consistently use the env_ prefix with snake_case and a predictable domain+resource pattern, e.g. env_nabel_stations/env_nabel_current, env_hydro_stations/env_hydro_current, env_bafu_datasets/env_bafu_dataset_detail. Parallel suffixes like _current, _check, and _detail make the set highly navigable.

Tool Count3/5

21 tools is at the heavy end of the range, though the broad Swiss-environment scope gives most tools a distinct purpose. The count is inflated by meta-tools like env_hazard_overview and env_hazard_regions, which route rather than retrieve data, and could potentially be consolidated.

Completeness3/5

The set covers the major advertised domains: air, water, snow, natural hazards, noise, hunting, and open data. However, env_nabel_current returns only metadata and download links rather than actual air-quality values, and env_hydro_history explicitly cannot deliver true historical time series, leaving notable gaps for common data retrieval workflows.

Maintenance

ActivityActive
ResponsivenessUnresponsive

Resources

Unclaimed servers have limited discoverability.

Looking for Admin?

If you are the server author, to access and configure the admin panel.

Related MCP Connectors

Related MCP Servers

  • A
    license
    Not graded
    quality
    D
    maintenance
    Provides comprehensive Swiss agricultural environmental compliance data covering water protection zones, ammonia emission limits, biodiversity requirements, and nutrient regulations from BAFU, BLW, and Agroscope. Enables AI assistants to search federal ordinances and verify farm compliance through specialized tools for GSchG, LRV, DZV, and other environmental laws.
    34
    Apache 2.0
  • A
    license
    A
    quality
    A
    maintenance
    Enables AI models to access Swiss weather and climate data from MeteoSwiss, including current observations, forecasts, and warnings.
    6
    MIT
  • A
    license
    A
    quality
    F
    maintenance
    Provides AI assistants with direct access to historical air quality, ERA5 meteorology, water risk, geocoding, and industrial facility data via the Jiskta API.
    10
    MIT
  • A
    license
    Not graded
    quality
    D
    maintenance
    Connects AI assistants to the Swiss I14Y Interoperability Platform, enabling natural language exploration of government datasets, APIs, codelists, and public services.
    MIT