swiss-environment-mcp
This MCP server gives AI assistants direct access to real-time Swiss environmental data from federal authorities (BAFU, SLF, BAZL), without requiring API keys. All tools are read-only, and support both stdio (local) and SSE (cloud) transports. Responses can be formatted as Markdown or JSON.
Air Quality (NABEL)
List all 16 NABEL monitoring stations across Switzerland with location type and canton
Get current air quality data for a specific station (NO₂, O₃, PM10, PM2.5, SO₂, CO)
Check pollutant values against Swiss LRV limits and WHO 2021 guidelines (local calculation)
Hydrology
Search hydrological gauging stations filtered by canton or water body
Get current water level, flow rate, and temperature at a specific station (updated every 10 minutes)
Access up to 30 days of historical hourly data (with download links for full time series)
View active flood warnings across Switzerland filtered by danger level (1–5) and canton
Check bathing water quality (E.coli, enterococci) at Swiss bathing sites — multi-year seasonal time series since 2020
Natural Hazards
Get a natural hazard overview routing to the correct live tool or official portal for each hazard type (flood, avalanche, wildfire, snow)
Get region-specific hazard routing for planning purposes (events, excursions, infrastructure)
Get wildfire danger index by canton and region (5-level scale, updated daily)
Snow & Avalanches (SLF)
List SLF/IMIS automatic snow measurement stations filtered by canton
Get current snow depth (HS) and 24h new snow (HN_1D) per station in cm
Get avalanche bulletin with danger levels (EAWS 1–5) per warning region (seasonal)
Hunting & Wildlife
List all 36 species tracked by federal hunting statistics with their codes
Retrieve hunting statistics — cull, game loss, population figures per species, canton, and year (2015–2024)
Environmental Data Catalogue (BAFU / opendata.swiss)
Search BAFU datasets on opendata.swiss (air, water, soil, biodiversity, noise, climate, forest, etc.)
Get full dataset metadata and download URLs (CSV, JSON, WMS/WFS) for a specific BAFU dataset
Aircraft Noise (BAZL)
Query aircraft noise exposure at a specific LV95 coordinate — returns a dB bracket from the official noise cadastre (requires LV95 / EPSG:2056 coordinates, not WGS84)
List all published aircraft noise cadastres (airfields, validity dates 2009–2024, dB range, official PDF plan links)
Check a noise level against Swiss LSV legal limits (planning value / immission limit / alarm value) by sensitivity zone ES I–IV (local calculation, civil airfields only)
Click on "Install Server".
Wait a few minutes for the server to deploy. Once ready, it will show a "Started" state.
In the chat, type
@followed by the MCP server name and your instructions, e.g., "@swiss-environment-mcpWhat is the air quality at Zürich-Kaserne?"
That's it! The server will respond to your query, and you can continue using it as needed.
Here is a step-by-step guide with screenshots.
🇨🇭 Part of the Swiss Public Data MCP Portfolio
🌿 swiss-environment-mcp
MCP server connecting AI models to Swiss environmental data from BAFU – air quality, hydrology, natural hazards, wildfire danger and open environmental datasets.
Overview
swiss-environment-mcp gives AI assistants like Claude direct access to real-time environmental data from Swiss federal authorities – no API keys required. Air quality readings from the national NABEL monitoring network, hydrological gauging stations, natural hazard bulletins, and the full BAFU dataset catalogue are all accessible through a single standardised MCP interface.
The server covers four thematic clusters: air quality (NABEL), hydrology, natural hazards, and the BAFU open data catalogue. Each cluster maps to a group of purpose-built tools that translate raw agency data into clean JSON responses.
Anchor demo query: "What is the current air quality at the NABEL station Zürich-Kaserne – and does it comply with WHO 2021 guidelines?" → More use cases by audience →
Related MCP server: meteoswiss-mcp
Features
🌬️ Air quality monitoring – 16 NABEL stations, NO₂/O₃/PM10/PM2.5/SO₂/CO, Swiss LRV + WHO 2021 limit checks
💧 Hydrology – water levels, flow rates, temperatures across Swiss gauging stations
🚨 Flood warnings – active alerts filtered by danger level and canton
🏔️ Natural hazard bulletin – SLF/BAFU bulletin in DE/FR/IT/EN, region-specific warnings
🔥 Wildfire danger – canton- and region-level fire danger index
❄️ Snow & avalanches (SLF) – snow depth, new snow per IMIS station; avalanche danger levels (EAWS)
🦌 Hunting statistics – cull & game-loss figures per species, canton and year (federal hunting statistics)
📦 BAFU open data catalogue – search and retrieve environmental datasets via CKAN
🔑 No authentication required – all data sources are publicly accessible
☁️ Dual transport – stdio for Claude Desktop, Streamable HTTP/SSE for cloud deployment
Prerequisites
Python 3.11+
No API keys needed – all endpoints are publicly accessible without authentication
Installation
# Clone the repository
git clone https://github.com/malkreide/swiss-environment-mcp.git
cd swiss-environment-mcp
# Install
pip install -e .Or with uvx (no permanent installation):
uvx swiss-environment-mcpOr via pip:
pip install swiss-environment-mcpQuickstart
# Start the server (stdio mode for Claude Desktop)
swiss-environment-mcpTry it immediately in Claude Desktop:
"What is the current air quality at NABEL station Zürich-Kaserne?" "Are there any active flood warnings in Switzerland right now?" "What is the wildfire danger level in Canton Valais?"
Configuration
Claude Desktop
Minimal (recommended):
{
"mcpServers": {
"swiss-environment": {
"command": "uvx",
"args": ["swiss-environment-mcp"],
"env": {}
}
}
}Config file locations:
macOS:
~/Library/Application Support/Claude/claude_desktop_config.jsonWindows:
%APPDATA%\Claude\claude_desktop_config.json
After saving, restart Claude Desktop completely.
Cloud Deployment (SSE for browser access)
For use via claude.ai in the browser (e.g. on managed workstations without local software):
Render.com (recommended):
Push/fork the repository to GitHub
On render.com: New Web Service → connect GitHub repo
Render detects
render.yamlautomaticallyIn claude.ai under Settings → MCP Servers, add:
https://your-app.onrender.com/sse
Docker:
docker build -t swiss-environment-mcp .
docker run -p 8000:8000 swiss-environment-mcp💡 "stdio for the developer laptop, SSE for the browser."
Available Tools
All tools share the stable env_ name prefix — a deliberate namespace choice so
that the server's tools are recognisable and unlikely to collide when several MCP
servers are mounted together. Tool definitions (name, description, input schema)
are pinned via tool-snapshot.json; changes require a CHANGELOG entry (see
CONTRIBUTING).
Tool budget (21 tools, 7 clusters) — exhausted. Every tool maps to a distinct
user question, not to a REST endpoint — there is no CRUD/endpoint mirroring, and
the anchor queries are each answerable in a single call. The count sits above the
≤12 rule of thumb because the server deliberately spans seven environmental
domains (air, water, hazards, snow, hunting, catalogue, aircraft noise), each
needing a list/detail pair or a domain-specific action. Further consolidation was
considered and rejected: the *_stations/*_current pairs (NABEL, hydro, snow)
serve genuinely different intents (discovery vs. reading a known station) and
collapsing them would overload a single tool's parameters.
This is the ceiling. With the aircraft-noise cluster the server's tool budget
is spent: any further data source belongs in a separate *-mcp server, not here.
The next addition would instead trigger a review of whether some listings should
migrate to MCP resources rather than tools.
🌬️ Air Quality / NABEL (3 tools)
Tool | Description | Data Source |
| List all 16 NABEL monitoring stations with location type and canton | NABEL / BAFU |
| Current air quality data for a station (NO₂, O₃, PM10, PM2.5, SO₂, CO) | NABEL / BAFU |
| Compare a measurement against Swiss LRV limits and WHO 2021 guidelines | Built-in |
💧 Hydrology (5 tools)
Tool | Description | Data Source |
| Filter hydrological gauging stations by water body (canton filter unavailable — see notes) | LINDAS SPARQL → hydrodaten.admin.ch (fallback) |
| Current water level, flow rate and temperature at a station | LINDAS SPARQL → hydrodaten.admin.ch (fallback) |
| Historical hourly values (up to 30 days) with download links ⚠️ | hydrodaten.admin.ch |
| Active flood warnings filtered by danger level (nationwide — canton filter not applied) | LINDAS SPARQL |
| Bathing water quality (E.coli, enterococci) per bathing site — multi-year time series | LINDAS SPARQL (data cube |
🏔️ Natural Hazards (3 tools)
Tool | Description | Data Source |
| Router: points to the dedicated live hazard tools + official portals (no network call — the aggregate | local |
| Router: maps a hazard type (flood/avalanche/wildfire/snow) to the right live tool + portal (no network call) | local |
| Wildfire danger index by canton and region | waldbrandgefahr.ch |
❄️ Snow & Avalanches / SLF (3 tools)
Tool | Description | Data Source |
| List automatic SLF/IMIS snow measurement stations (by canton) | measurement-api.slf.ch |
| Current snow depth (HS) and 24 h new snow (HN_1D) per station, in cm | measurement-api.slf.ch |
| Avalanche danger levels (EAWS 1–5) per warning region, seasonal | aws.slf.ch |
🦌 Hunting & Wildlife (2 tools)
Tool | Description | Data Source |
| List the 36 species tracked by the federal hunting statistics (with codes) | jagdstatistik.ch (embedded) |
| Cull / game-loss / population figures per species, canton and year (2015–2024) | jagdstatistik.ch |
📊 Environmental Data Catalogue (2 tools)
Tool | Description | Data Source |
| Search BAFU datasets on opendata.swiss (CKAN API) | opendata.swiss |
| Full metadata and download URLs for a specific dataset | opendata.swiss |
✈️ Aircraft Noise / BAZL noise cadastre (3 tools)
Tool | Description | Data Source |
| Aircraft noise exposure at an LV95 point — resolves the overlapping noise contours and returns a dB bracket with the highest value as an upper bound | api3.geo.admin.ch (BAZL) |
| Which airfields have a published cadastre, with validity dates, dB range and the official plan (PDF) — the provenance tool | api3.geo.admin.ch (BAZL) |
| Compare a rating level against the LSV exposure limit values (planning value / immission limit / alarm value) by sensitivity level ES I–IV | Built-in (SR 814.41, Annex 5) |
⚖️ Legal notice — carried in every response of these three tools. The noise cadastre is an orientation aid. Legally binding information on construction projects is issued by the competent cantonal office or by the FOCA (BAZL). These tools do not replace a building permit clarification.
Coordinates must be LV95 (EPSG:2056, metres: E ≈ 2'480'000–2'840'000,
N ≈ 1'070'000–1'300'000). WGS84 degrees such as 8.54 / 47.37 are rejected
fail-fast with a conversion hint — this is the single most common LLM error
with Swiss geodata. Convert via swisstopo REFRAME or convert_coordinates in
swisstopo-mcp.
The contours are lines, not areas. The cadastre publishes MultiLineString
isolines, so identify performs a proximity query within a search radius — not
a point-in-polygon test. env_noise_aircraft_at therefore returns a bracket
(«the point lies between the 61 dB and the 62 dB contour») with the highest value
as a stated upper bound, never an interpolated point value. The search radius
is reported in every response; enlarging it inflates the result (at one Kloten
point: 100 m → 61–62 dB, but 500 m → 58–75 dB, because the 75 dB runway contour
sits 1.5 km away).
Anchor demo query
"Is the planned school site inside an aircraft-noise zone with building restrictions — and at which dB level?"
Cross-server flow: resolve an address or EGID via
swiss-housing-mcp → convert to
an LV95 coordinate → env_noise_aircraft_at(east=…, north=…, period="day") →
feed the resulting level_db into env_noise_limits_check(level_db=…, sensitivity_level="II", period="day") for the legal classification.
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 dBExample Use Cases
Query | Tool |
"Air quality at Zürich-Kaserne right now?" |
|
"Does 45 µg/m³ NO₂ exceed the Swiss limit?" |
|
"Current water level of the Limmat in Zurich?" |
|
"Is the water quality at Strandbad Küsnacht safe for swimming?" |
|
"Active flood warnings in Switzerland?" |
|
"Natural hazard bulletin for Graubünden?" |
|
"Wildfire danger in Canton Valais?" |
|
"BAFU biodiversity datasets on opendata.swiss?" |
|
"Is the planned school site in an aircraft-noise zone — at which dB level?" |
|
"How old is the noise cadastre for Geneva airport?" |
|
"Does 62 dB at night exceed the LSV limit in an ES II residential zone?" |
|
🛡️ Safety & Limits
Aspect | Details |
Access | Read-only ( |
Personal data | No personal data — all sources are aggregated, public environmental measurements |
Rate limits | Built-in per-query caps (e.g. max 30 days hydrology history, 50 dataset search results) |
Timeout | 30 seconds per API call |
Authentication | No API keys required — all BAFU endpoints are publicly accessible |
Licenses | BAFU Open Government Data (OGD) — free reuse with mandatory attribution |
Terms of Service | Subject to ToS of the respective data sources: BAFU / opendata.swiss, hydrodaten.admin.ch, naturgefahren.ch, waldbrandgefahr.ch |
Architecture
┌─────────────────┐ ┌───────────────────────────┐ ┌──────────────────────────┐
│ 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) │
└───────────────────────────┘Architecture note — extractable lindas/ module
All LINDAS SPARQL access goes through the deliberately extractable
src/swiss_environment_mcp/lindas/ module, built as three strict layers:
client.py knows only SPARQL and HTTP (GET/POST, 45 s client-side timeout,
QueryError carrying the server's MALFORMED message, 2 s/4 s/8 s retry);
cube.py knows the cube.link vocabulary (mandatory observationSet
two-phase access, version deduplication via schema:expires, code→label
resolution, licence lookup); the tools only ever call cube.py. The module
will be lifted into a shared lindas-mcp as soon as a second server uses
LINDAS (candidate: wsl-envidat-mcp).
Architecture decision — live API for the aircraft-noise cadastre
The rest of this server follows the portfolio's dump-first standard. The
aircraft-noise cluster deliberately deviates: env_noise_aircraft_at and
env_noise_aircraft_registers query api3.geo.admin.ch live on every call.
This is not a size argument. Measured on 2026-07-28, the entire cadastre is 747 objects (~3 MB of GeoJSON) across all eight sublayers — it would mirror without difficulty. Two other reasons decide it:
A mirror would falsify the freshness claim. The cadastres are revised per airfield, individually and without announcement (validity dates 2009–2024). Read from a dump,
source_freshnesswould report thevalidfromas of the mirroring date — the tool would assert provenance it no longer has. For a cluster whose third tool exists precisely to answer "how old is the basis", that is the worst possible failure mode.The spatial query is the value, not the attributes. Evaluated locally it means point-to-line distances over 26'000+ vertices per layer. That requires either shapely/GEOS — the first compiled dependency in a deliberately binary-free
pyproject.toml(Docker image, wheel matrix and security surface all change) — or hand-rolled distance maths. The latter is feasible, since LV95 is a metric projection and Euclidean distance is exact; but then this server would own the correctness of an official noise-cadastre statement instead of the federal office.
Full measurements and reasoning: docs/probe-fluglaerm.md.
Data Sources
Source | Data | Licence |
Current hydrology (level, discharge, water temperature) and bathing water quality via SPARQL | BAFU Open-Use / OGD (declared per graph/dataset — each response carries a licence field) | |
Water levels, flow rates, temperatures (REST fallback) | BAFU OGD | |
Natural hazard bulletin (SLF/BAFU) | BAFU/SLF | |
Wildfire danger index | BAFU | |
Snow depth, new snow (IMIS); avalanche bulletin | SLF (WSL) CC BY 4.0 | |
Federal hunting statistics (cull, game loss, population) | BAFU — source attribution required (no explicit licence published) | |
BAZL aircraft noise cadastre ( | swisstopo / BAZL — free reuse with attribution | |
BAFU data catalogue (CKAN API) | OGD |
All data: publicly accessible, no authentication required.
Attribution required: BAFU / SLF (WSL) must be cited as the source when using their data.
Project Structure
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)Single-module layout (rationale, audit ARCH-011): the 21 tools live in one
server.pyrather than atools/package. They are thin, uniform wrappers overapi_client.pysharing the same input/response patterns, so a single well-sectioned module stays more navigable than 4 near-identical files. This is a deliberate, documented deviation; a split is revisited if tool logic grows non-uniform.
MCP Protocol Version & Maintenance
This server speaks two protocol eras over the same endpoint. The client's first request on a connection decides which one applies; a later claim from the other era is refused.
Era | Revision | Who reaches it |
|
| What today's clients speak. The server answers with the revision asked for, or with the |
Per-request envelope |
| A request carrying the |
Both revisions are pinned in
tests/test_protocol_version.py and asserted
against the installed SDK, so a Dependabot bump of mcp cannot move either one
silently. This server builds no ASGI app to send an initialize through, so
the gate asserts the SDK constants rather than a measured response — the
weaker form, named rather than left unsaid.
Note that the SDK's LATEST_PROTOCOL_VERSION is an alias for the modern
era, not for the handshake era — pinning against it alone would leave the era
that current clients actually negotiate free to drift.
Update policy. When the gate fails, do not edit the constant blindly: read
the spec changelog between the two revisions, verify the server still behaves,
then move the constant, this section, README.de.md and
CHANGELOG.md together.
Tool-definition stability (audit SEC-022): any change to a tool's name, description or parameters changes
tool-snapshot.json; CI fails until the snapshot is regenerated and aCHANGELOGentry + version bump are added.Update policy: review Dependabot PRs monthly; bump the version (semver) on any tool-definition or behaviour change.
Lifecycle Phase
This server is in Phase 1 (read-only) — all tools read-only, no auth, no side
effects. The phase model and prerequisites for Phase 2 (write/auth) are in
docs/roadmap.md. Security architecture (SSRF/egress, secret
management, lethal-trifecta assessment): docs/security.md.
Scaling/session strategy: docs/scaling.md.
Known Limitations
Hydrology via LINDAS:
env_hydro_current,env_hydro_stationsandenv_flood_warningsquery the BAFU LINDAS SPARQL endpoint (typed live values: level, discharge, water temperature, danger level). LINDAS holds current values only (one observation per station) — it is not a historical time series. Seedocs/probe-lindas-hydro.md.Historical hydrology /
env_hydro_history(BUG-01 resolved): the oldhydrodaten.admin.ch/lhg/az/*REST endpoints (hourly CSV,warnings.json, station JSON) are decommissioned (404).env_flood_warningsnow uses LINDASdangerLevelinstead. Real historical time series (daily / long-term means — e.g. summer 2024 vs. long-term average) are not freely available via API; they must be ordered from the BAFU Hydrological Enquiry Service (abfragezentrale@bafu.admin.ch).env_hydro_historyreturns the latest LINDAS value plus this access path.Flood warnings:
env_flood_warningsreads LINDASdangerLevel. A canton filter is not available there (LINDAS carries no canton code), so the response is always nationwide; acantonvalue is echoed back and flagged as not applied — in the JSON envelope viamatch_type: "fuzzy"plus a note, in Markdown as a warning line above the table. This matters most when there are no warnings at all: „no active warnings" plus a canton in the request otherwise reads as an all-clear for that canton.Gauging stations / canton filter:
env_hydro_stationsno longer servescanton. The only source that carried the canton code —hydrodaten.admin.ch/lhg/az/json/mobile_stations.json— is decommissioned (404), and LINDAS has no canton attribute. A request withcantonset returns an explanation instead of a station list; usewater_body, or fetch the full list (233 stations) unfiltered.Bathing water quality (
env_bathing_water): reads the LINDAS data cubefoen/ubd01041prod— the only hydro cube with a real multi-year time series (seasonal samples since 2020). Data is refreshed annually after the bathing season (no real-time monitoring), and the survey covers only the officially reported bathing sites (many popular lidos are not part of it). The licence is declared at graph/dataset level, not on the cube; every response therefore carries an explicit licence field — with an honest «not declared» note where none exists. Seedocs/probe-lindas-hydro.md(addendum N1–N7).No groundwater data in LINDAS: verified 2026-07-24 via multilingual cube search — LINDAS contains no groundwater cube (NAQUA groundwater levels are not available via SPARQL).
NABEL: Near-real-time data only; no historical time series via this server.
Natural hazards (
env_hazard_overview/env_hazard_regions): the formernaturgefahren.ch/api/v1/warnings/*REST endpoints were decommissioned (2026) and — verified 2026-07-26 — there is no stable, documented public JSON feed for the aggregated warnings (MeteoSwiss OGD/STAC, opendata.swiss and the undocumented app API were all checked). Rather than a fragile scrape, both tools are now network-free orientation/router tools: they deterministically point to this server's dedicated live tools (flood→env_flood_warnings, avalanche→env_avalanche_bulletin, wildfire→env_wildfire_danger, snow→env_snow_current) and the official portals. Aggregated weather warnings (storm/thunderstorm/heat) are MeteoSwiss's domain and belong tometeoswiss-mcp. Seedocs/probe-naturgefahren-hazards.md.Wildfire danger (
env_wildfire_danger):waldbrandgefahr.chreplaced its REST API with a Rails/React app in 2026; there is no stable JSON endpoint. Current danger levels are read via a two-step, HTML-borne contract: the homepage'sdata-react-propsyields a signed ActiveStorage blob URL (warnMapJsonPath) plus the canton mapping, which is then fetched. A schema-guard degrades gracefully if that structure changes. Unfiltered results are capped at 40 regions (highest levels first); filter bycantonfor a full cantonal list. Seedocs/probe-naturgefahren-waldbrand.md.Hunting statistics (
env_hunting_stats): Thejagdstatistik.chbackend is undocumented (a content-negotiated web-app endpoint). A schema-guard degrades gracefully if the structure changes. Species/canton/datatype lookups are embedded (harvested 2026-07-19); figures are fetched live for 2015–2024. Licence (researched 2026-07-19): the data is owned by BAFU (compiled from cantonal offices; site tech by Wildtier Schweiz) and is not published as a licensed dataset on opendata.swiss; no explicit licence is stated on the source. Responses therefore require source attribution to BAFU; formal licence confirmation from BAFU is still pending. Seedocs/probe-jagdstatistik.md.Road and railway noise are out of scope (
ch.bafu.laerm-*,ch.bav.laermbelastung-*): verified 2026-07-28. The BAFU road-noise layersch.bafu.laerm-strassenlaerm_tag/_nachtanswer the sameidentifyrequest with HTTP 400 — they are pure raster services (type: wmts,tooltip: false) with no attribute query, so a point lookup is technically impossible. Railway noise is different:ch.bav.laermbelastung-eisenbahn_*does answer with HTTP 200 and real attributes (de_es,de_pointofdetermination), so it is queryable but deliberately not connected — the server's tool budget is exhausted at 21 and rail noise would need its own period/attribute model. Mnemonic: aircraft noise has lines, road noise has only pixels — rail noise would have data, but is a conscious omission. Seedocs/probe-fluglaerm.md.Aircraft noise is a cut-off-date cadastre, not a live service (
env_noise_*):validfromranges from 01.03.2009 (CDB Genève) to 16.04.2024 (LBK St. Gallen-Altenrhein), and each airfield is revised individually and without notice.source_freshnesstherefore never claims "live" — it carries thevalidfromof the register actually matched. Coverage is limited to the surroundings of airfields; most of Switzerland has no cadastre at all, which the tool reports explicitly rather than returning an empty list. A zero-hit result at a small radius is ambiguous (outside any cadastre or inside the innermost contour — on the Kloten runway both look identical at 100 m), so the tool re-queries once at a far radius and distinguishesno_cadastrefromwide_area_only.LSV limit check excludes military airfields: Annex 5 of the Noise Abatement Ordinance applies expressly to civil airfields. For military airfields Annex 8 governs; it was not verified, so
env_noise_limits_checkrefuses the check forperiod="military"and points to the correct basis instead of applying a plausible-looking wrong table.
Responsibility matrix — water, snow & precipitation (delineation vs. meteoswiss-mcp)
To avoid duplicating water, snow and precipitation data across the portfolio,
responsibilities are split as follows. meteoswiss-mcp owns atmospheric
precipitation and weather; swiss-environment-mcp owns surface waters
(BAFU domain: discharge, water level, water temperature, bathing quality),
snow on the ground and avalanche danger. Checked against the actual LINDAS
cube dimensions (2026-07-24): there is no overlap in measured quantities.
Data | swiss-environment-mcp (BAFU / SLF) | meteoswiss-mcp (MeteoSwiss) |
Discharge (m³/s) | ✅ | ❌ |
Water level (m a.s.l.) | ✅ | ❌ |
Water temperature (°C) | ✅ | ❌ (measures air temperature) |
Bathing water quality (E.coli etc.) | ✅ | ❌ |
Snow depth on the ground ( | ✅ | ❌ |
Fresh snow 24 h ( | ✅ | ❌ |
Avalanche danger level | ✅ | ❌ |
Snowfall as a current weather condition | ❌ | ✅ |
Precipitation amount (mm): measurement network, forecast, climate normals | ❌ | ✅ |
Precipitation at SLF IMIS mountain stations | ✅ only as snow-cover context, no standalone precipitation tool | (MeteoSwiss network) |
Weather warnings (storm, thunderstorm, heat) | ❌ | ✅ |
Natural-hazard warnings (flood, avalanche, wildfire) | ✅ | ❌ |
Rule: everything in and on water bodies (discharge, level, water
temperature, bathing quality), snow on the ground and avalanche danger
belong to swiss-environment-mcp (BAFU/SLF); atmospheric precipitation
(rain/snowfall as mm) plus weather, forecast, warnings and climate normals belong
to meteoswiss-mcp. The SLF IMIS precipitation endpoint (RR_10MIN_SUM) is
deliberately not wired up as a tool, so it does not duplicate MeteoSwiss. The
snow/avalanche tools are live (see docs/probe-slf.md).
TODO (out of scope here): mirror this matrix in the meteoswiss-mcp README —
that repository is not part of this change.
Testing
# 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
See CONTRIBUTING.md (English) · CONTRIBUTING.de.md (German)
Security
Security policy and posture: SECURITY.md (English) · SECURITY.de.md (German).
Full security architecture: docs/security.md.
Changelog
See CHANGELOG.md
License
MIT License — see LICENSE
Source data is subject to BAFU terms of use. Attribution to BAFU is required when using their data.
Author
Hayal Oezkan · github.com/malkreide
Credits & Related Projects
Data: BAFU / Bundesamt für Umwelt · hydrodaten.admin.ch · naturgefahren.ch · opendata.swiss
Protocol: Model Context Protocol – Anthropic / Linux Foundation
Related:
Server | Description |
City of Zurich open data (OSTLUFT air quality, weather, parking, geodata) | |
Swiss public transport – OJP 2.0 journey planning, SIRI-SX disruptions | |
GBFS shared mobility, EV charging, DATEX II traffic | |
BFS STAT-TAB – 682 statistical datasets |
Synergy example: "What was the air quality at Schulhaus Leutschenbach today – and how does it compare to the national NABEL average?"
→ zurich-opendata-mcp (OSTLUFT, local) + swiss-environment-mcp (NABEL, national)
Portfolio: Swiss Public Data MCP Portfolio
Installation
Run via uv's uvx — no clone or manual install needed. Add to your MCP client config (mcpServers for Claude Desktop, Cursor and Windsurf; use a top-level servers key for VS Code in .vscode/mcp.json):
{
"mcpServers": {
"swiss-environment-mcp": {
"command": "uvx",
"args": [
"swiss-environment-mcp"
]
}
}
}Available Tools
21 toolsenv_air_limits_checkARead-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.
| Name | Required | Description | Default |
|---|---|---|---|
| params | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
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.
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.
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.
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.
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.
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_bulletinARead-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.
| Name | Required | Description | Default |
|---|---|---|---|
| params | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
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.
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.
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.
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.
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.
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_detailARead-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.
| Name | Required | Description | Default |
|---|---|---|---|
| params | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
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.
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.
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.
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.
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.
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_datasetsARead-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.
| Name | Required | Description | Default |
|---|---|---|---|
| params | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
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.
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.
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.
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.
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.
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_waterARead-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.
| Name | Required | Description | Default |
|---|---|---|---|
| params | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
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.
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.
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.
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.
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.
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_warningsARead-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.
| Name | Required | Description | Default |
|---|---|---|---|
| params | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
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.
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.
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.
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.
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.
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_overviewARead-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.
| Name | Required | Description | Default |
|---|---|---|---|
| params | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
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.
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.
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.
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.
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.
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_regionsARead-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.
| Name | Required | Description | Default |
|---|---|---|---|
| params | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
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.
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.
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.
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.
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.
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_speciesARead-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.
| Name | Required | Description | Default |
|---|---|---|---|
| params | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
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.
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.
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.
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.
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.
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_statsARead-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.
| Name | Required | Description | Default |
|---|---|---|---|
| params | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
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.
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.
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.
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.
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.
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_currentARead-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.
| Name | Required | Description | Default |
|---|---|---|---|
| params | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
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.
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.
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.
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.
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.
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_historyARead-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.
| Name | Required | Description | Default |
|---|---|---|---|
| params | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
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.
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.
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.
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.
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.
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_stationsARead-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.
| Name | Required | Description | Default |
|---|---|---|---|
| params | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
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.
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.
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.
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.
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.
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_currentARead-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.
| Name | Required | Description | Default |
|---|---|---|---|
| params | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
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.
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.
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.
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.
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.
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_stationsARead-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.
| Name | Required | Description | Default |
|---|---|---|---|
| params | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
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.
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.
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.
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.
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.
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_atARead-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.
| Name | Required | Description | Default |
|---|---|---|---|
| params | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
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.
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.
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.
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.
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.
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_registersARead-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.
| Name | Required | Description | Default |
|---|---|---|---|
| params | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
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.
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.
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.
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.
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.
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_checkARead-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.
| Name | Required | Description | Default |
|---|---|---|---|
| params | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
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.
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.
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.
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.
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.
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_currentARead-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.
| Name | Required | Description | Default |
|---|---|---|---|
| params | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
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.
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.
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.
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.
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.
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_stationsARead-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.
| Name | Required | Description | Default |
|---|---|---|---|
| params | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
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.
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.
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.
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.
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.
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_dangerARead-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.
| Name | Required | Description | Default |
|---|---|---|---|
| params | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
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.
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.
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.
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.
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.
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.
2 tool updates
v0.6.0- Changed
env_flood_warnings1 field changed- changed
Input schema / $defs / FloodWarningsInput / properties / canton / descriptionPrevious 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."
- Changed
env_hydro_stations2 fields changed- changed
Input schema / $defs / HydroStationsInput / properties / canton / descriptionPrevious 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." - changed
Input schema / $defs / HydroStationsInput / properties / water_body / descriptionPrevious 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"
21 tool updates
v0.5.2- First observed
env_air_limits_check - First observed
env_avalanche_bulletin - First observed
env_bafu_dataset_detail - First observed
env_bafu_datasets - First observed
env_bathing_water - First observed
env_flood_warnings - First observed
env_hazard_overview - First observed
env_hazard_regions - First observed
env_hunting_species - First observed
env_hunting_stats - First observed
env_hydro_current - First observed
env_hydro_history - First observed
env_hydro_stations - First observed
env_nabel_current - First observed
env_nabel_stations - First observed
env_noise_aircraft_at - First observed
env_noise_aircraft_registers - First observed
env_noise_limits_check - First observed
env_snow_current - First observed
env_snow_stations - First observed
env_wildfire_danger
TDQS
Scored across 21 tools
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.
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.
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.
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
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
Swiss weather data for AI assistants — forecasts, measurements, stations, pollen.
Real-world data for agents: air quality, geocoding, quakes, holidays, web search
Access UK flood warnings, river levels, water quality, Met Office forecasts, and carbon data
Pay-per-use weather, environment, finance, and on-chain intelligence tools for AI agents via x402.
Related MCP Servers
- AlicenseNot gradedqualityDmaintenanceProvides 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.34Apache 2.0
- AlicenseAqualityAmaintenanceEnables AI models to access Swiss weather and climate data from MeteoSwiss, including current observations, forecasts, and warnings.6MIT

jiskta-mcpofficial
AlicenseAqualityFmaintenanceProvides AI assistants with direct access to historical air quality, ERA5 meteorology, water risk, geocoding, and industrial facility data via the Jiskta API.10MIT- AlicenseNot gradedqualityDmaintenanceConnects AI assistants to the Swiss I14Y Interoperability Platform, enabling natural language exploration of government datasets, APIs, codelists, and public services.MIT