Skip to main content
Glama
malkreide

wsl-envidat-mcp

by malkreide

🇨🇭 Part of the Swiss Public Data MCP Portfolio

wsl-envidat-mcp 🌲❄️⛰️

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

MCP server connecting AI models to Swiss environmental research data from WSL via EnviDat — forest, snow, avalanches, natural hazards and biodiversity, no API key required.

🇩🇪 Deutsche Version


Phase

This server is in Phase 1: Read-only Wrapper.

Property

Status

Read tools

✅ 10 tools, all readOnlyHint: true

Write tools

❌ none (EnviDat is read-only public data)

Semantic Layer

⚠️ partial — three domain tools curate Solr queries

OAuth / Auth Gateway

❌ not required (Public Open Data, no API key)

Container hardening

✅ multi-stage Dockerfile, non-root

Test suite

✅ 38 offline unit tests + 31 live integration tests

Audit run

✅ 2026-05-27 (mcp-audit-skill v1.0.0)

Phase-2 ideas (caching layer, semantic aggregation tool combining forest + snow + hazard data into a "Lage-Übersicht"): tracked under docs/.


Related MCP server: swisstopo-mcp

Overview

The WSL (Eidgenössische Forschungsanstalt für Wald, Schnee und Landschaft / Swiss Federal Research Institute for Forest, Snow and Landscape) is one of Europe's leading environmental research institutes. Its open data platform EnviDat provides access to 1,000+ research datasets, time series of up to 130 years, and data from 6,000+ monitoring stations.

This MCP server exposes the EnviDat CKAN API as 10 tools and 2 resources, enabling AI assistants to search, filter and retrieve WSL research data by keyword, domain, or geographic bounding box — all without an API key.

Anchor demo query: "How was air quality and forest health around Schulhaus Leutschenbach in Zurich — and what does the WSL say about the current forest condition in the canton?"

Demo

Demo: Claude using wsl_get_avalanche_data, wsl_get_forest_data and wsl_catalog_stats


Features

  • 10 tools covering full-text search, domain-specific queries, spatial search, and curated thematic tools (avalanche, forest, natural hazards)

  • 2 MCP resources for organizations and research domains

  • 5 research domains: Forest · Biodiversity · Natural Hazards · Snow & Ice · Landscape

  • 815+ datasets, time series since 1890, data from the SLF avalanche research institute

  • No API key required — all data publicly accessible via open licenses

  • Dual transport: stdio (Claude Desktop / local) + Streamable HTTP (cloud deployment)

  • Model-agnostic: works with Claude, GPT-4, and any MCP-compatible client


Prerequisites

  • Python 3.11+

  • pip or uv / uvx

  • Internet connection (live API calls to envidat.ch)


Installation

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

# Or with pip
pip install wsl-envidat-mcp

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

Quickstart

Claude Desktop

Edit ~/Library/Application Support/Claude/claude_desktop_config.json (macOS) or %APPDATA%\Claude\claude_desktop_config.json (Windows):

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

Restart Claude Desktop, then ask:

  • "What WSL datasets exist on fatal avalanche accidents in Switzerland?"

  • "Show me forest inventory data from the LFI for the canton of Zurich."

  • "Which natural hazard research data does the SLF publish on EnviDat?"

  • "Are there WSL datasets on drought conditions in summer 2022?"

  • "What biodiversity data is available for alpine ecosystems?"


Configuration

No API key required. Optional environment variables:

Variable

Default

Description

MCP_TRANSPORT

stdio

Transport mode: stdio or streamable-http (legacy streamable_http is accepted)

MCP_HOST

127.0.0.1

Bind address for streamable-http. Use 0.0.0.0 only inside a container.

PORT

8000

Port for Streamable HTTP mode

Cloud Deployment (Streamable HTTP)

For use via claude.ai in the browser (e.g. on managed workstations without local software):

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

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

💡 "stdio for the developer laptop, streamable-http for the browser."

⚠️ Multi-Replica Cloud Deployments: Session state lives in the server. Run a single replica or enable sticky sessions (Railway/Render setting, or sessionAffinity: ClientIP on Kubernetes Services).

⚠️ Multi-Tenant / Unauthenticated Streamable HTTP: This server has no auth layer (auth_model: none). Streamable HTTP without a reverse-proxy + OAuth/API-Gateway is intended only for single-user deployments (e.g. one user's claude.ai browser session). For multi-tenant use, front the server with an authenticating gateway.

A hardened multi-stage image is published to GitHub Container Registry on every main push and semver tag. Runs as non-root (uid=1000), no build tools in the runtime layer, multi-arch (linux/amd64 + linux/arm64).

The publishing workflow is .github/workflows/container.yml — not publish.yml, which only uploads the Python package to PyPI on a release. container.yml is delivery, not a gate: it does not gate a pull request, and a red run there means the image is missing, not that the code is broken.

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

Kubernetes hardening (excerpt):

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

Available Tools

Tool

Description

wsl_search

Unified search — combine query, domain, organization, and bbox filters

wsl_get_dataset

Full metadata, DOI, download URLs for a specific dataset

wsl_list_organizations

List all WSL research units on EnviDat

wsl_get_organization

Details of a specific research unit incl. datasets

wsl_list_tags

Browse available tags/keywords

wsl_get_recent_datasets

Most recently updated datasets

wsl_get_avalanche_data

SLF avalanche & snow data (incl. fatal accidents since 1936)

wsl_get_forest_data

Forest data incl. National Forest Inventory (LFI) & Sanasilva

wsl_get_naturgefahren_data

Natural hazard datasets (landslides, rockfall, floods)

wsl_catalog_stats

Catalog overview and statistics

Example Use Cases

Query

Tool

"Fatal avalanche accidents in Valais since 2000?"

wsl_get_avalanche_data

"Forest health data for canton Zurich?"

wsl_get_forest_data

"Landslide risk datasets near Brienz?"

wsl_get_naturgefahren_data

"Most recent WSL publications on biodiversity?"

wsl_search(domain="biodiversitaet")

"Which datasets cover the area around Lake Constance?"

wsl_search(bbox=[9.0, 47.5, 9.7, 47.8])

"How many datasets does SLF publish?"

wsl_get_organization


Resources

URI

Description

envidat://organization/{name}

Research unit (e.g. slf, wsl)

envidat://domain/{domain}

Domain overview with top datasets

Valid domain values: wald, biodiversitaet, naturgefahren, schnee_eis, landschaft


Architecture

┌─────────────────┐     ┌───────────────────────────┐     ┌──────────────────────────┐
│   Claude / AI   │────▶│    WSL EnviDat MCP        │────▶│       envidat.ch          │
│   (MCP Host)    │◀────│    (MCP Server)           │◀────│                          │
└─────────────────┘     │                           │     │  CKAN API  (REST/JSON)   │
                        │  10 Tools · 2 Resources   │     │  Solr full-text search   │
                        │  Stdio | Streamable HTTP  │     │  1,000+ research datasets│
                        │                           │     │  815+ open datasets      │
                        │  server.py                │     │  Time series since 1890  │
                        │  api_client.py            │     └──────────────────────────┘
                        └───────────────────────────┘

Infrastructure Components

Component

Metaphor

Function

api_client.py

Librarian

Handles all HTTP requests to EnviDat CKAN API

server.py

Reception desk

Registers all 10 tools and 2 resources with FastMCP

Domain filters

Filing cabinet

Pre-configured keyword sets per research domain

Bounding box search

Map overlay

Spatial filtering via lat/lon coordinates


Project Structure

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

Combination with Other MCP Servers

This server is part of the Swiss Open Data MCP Portfolio and integrates well with:

Combination

Use Case

+ zurich-opendata-mcp

Urban climate + forest condition around Zurich

+ swiss-statistics-mcp

Population data + environmental quality

+ swiss-transport-mcp

Avalanche risk + public transport connections

+ fedlex-mcp

Forest protection law + actual LFI forest condition

+ global-education-mcp

Compare environmental education data internationally


Known Limitations

  • Solr search: OR is treated as a stopword — use single, specific search terms per query

  • Domain search: Results depend on WSL's internal keyword tagging — not all datasets are tagged consistently

  • Spatial search: Bounding box filtering is approximate; verify coordinates with individual dataset metadata

  • Live API: All tools make live calls to envidat.ch — results depend on availability of the public API

  • Languages: Dataset metadata is primarily in English and German; some older entries may be in German only


Safety & Limits

  • Read-only: All tools perform HTTP GET requests only — no data is written, modified, or deleted on EnviDat.

  • No personal data: The API returns research metadata, dataset descriptions, and download URLs. No personally identifiable information (PII) is processed or stored by this server.

  • Rate limits: The EnviDat CKAN API is public without documented rate limits. Use limit and rows parameters conservatively. The server enforces a 30-second timeout per request.

  • Data freshness: All tools make live API calls — results reflect the current state of the EnviDat catalog at query time. No caching is performed by this server.

  • Terms of service: Data is subject to the EnviDat Terms of Use. Individual datasets are published under various open licenses (Creative Commons, CC0) — see dataset metadata.

  • No guarantees: This is a community project, not affiliated with WSL or EnviDat. Availability depends on the upstream EnviDat API.

For the full security posture (egress allow-list, redirect handling, accepted risks) see SECURITY.md.


MCP Protocol Version

This server speaks two protocol eras over the same endpoint. The client's first request on a connection decides which one applies; a later claim from the other era is refused.

Era

Revision

Who reaches it

initialize handshake

2024-11-052025-11-25

What today's clients speak. The server answers with the revision asked for, or with the 2025-11-25 ceiling when the request asks for something newer.

Per-request envelope

2026-07-28

A request carrying the 2026-07-28 _meta envelope opens a modern connection.

Both revisions are pinned in tests/test_protocol_version.py and asserted against the installed SDK, so a Dependabot bump of mcp cannot move either one silently. This server builds no ASGI app to send an initialize through, so the gate asserts the SDK constants rather than a measured response — the weaker form, named rather than left unsaid.

SUPPORTED_MCP_PROTOCOL_VERSION in server.py names the modern era; a mismatch against the SDK logs a warning at startup. A warning is not a gate — that is what the test file is for.

Note that the SDK's LATEST_PROTOCOL_VERSION is an alias for the modern era, not for the handshake era — pinning against it alone would leave the era that current clients actually negotiate free to drift.

Update policy. When the gate fails, do not edit the constant blindly: read the spec changelog between the two revisions, verify the server still behaves, then move the constant, this section, README.de.md and CHANGELOG.md together.


What the server uses from 2026-07-28

Pinning a revision is not the same as speaking it. Until now this server pinned 2026-07-28 and used the shape of the era before it; the table above was true and the wire was older than it sounded.

Two channels per tool result. The revision gives a tool result content for the reader and structuredContent for the application, with outputSchema as the contract between them. Every tool now fills both: the same human-readable Markdown as before in content, and the data behind it — typed, schema-backed — in structuredContent.

This is not a new interface. The fields are exactly the payload that response_format="json" has always produced. That option is the predecessor of structuredContent: it exists only because, before 2026-07-28, there was one channel, so the machine-readable version had to travel as a JSON string inside the reader's channel. response_format still works and still controls only the text block.

What it replaces is worse than nothing. A signature of -> str makes the SDK publish an outputSchema of {"result": string} and repeat the Markdown block underneath it. Measured on wsl_search against the recorded fixture: 2058 characters of text, 2058 characters of structuredContent.result, character-identical. An outputSchema is a promise; that one promised structure and delivered prose under a key called result.

serverInfo carries its six fields. It carried two, one of them empty. version was the expensive one: the number is kept in step across pyproject.toml, server.json and both README badges by scripts/check_version_sync.py — and reached every place except the one a client reads. It now comes from the package metadata, so no literal enters src/.

Tool titles moved to title. They sat in annotations.title, the slot from before this revision. A client that follows the schema and reads tool.title got None and displayed the slug.

Deliberately not used: icons on server, tools and resources, and the task-augmented call flow (execution). Both are optional, and neither has anything real to point at here — this repository ships no icon asset, and every call is a short CKAN query that finishes well inside a request. Declaring either would be a claim without a thing behind it.

tests/test_structured_output.py holds all of the above against a live ClientSession, with a negative control that shows what the SDK does when a server does not do this — so the day the default changes, the assertions say so instead of quietly passing.

Testing

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

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

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

CI runs the offline suite on every PR. The live suite runs only on main pushes and manual workflow_dispatch triggers, so build status is not coupled to upstream availability.


Changelog

See CHANGELOG.md


Contributing

See CONTRIBUTING.md


Security

See SECURITY.md (Deutsch) for the security posture and how to report a vulnerability.


License

MIT License — see LICENSE

Data on EnviDat is published under various open licenses (Creative Commons, CC0) — see individual dataset metadata.


Author

Hayal Oezkan · malkreide


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": {
    "wsl-envidat-mcp": {
      "command": "uvx",
      "args": [
        "wsl-envidat-mcp"
      ]
    }
  }
}

Available Tools

10 tools
wsl_catalog_statsEnviDat Katalog-ÜbersichtA
Read-onlyIdempotent

Gibt eine Übersicht über den EnviDat-Katalog zurück: Domänen, Organisationen, Datenmenge.

Nützlich als Einstiegspunkt: zeigt was im Katalog verfügbar ist, welche WSL-Forschungsdomänen besonders viele Datensätze haben, und wie der Katalog strukturiert ist.

Returns: CallToolResult: Lesbare Uebersicht im Textkanal, dazu die Zahlen als structuredContent nach CatalogStats.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

Output Schema

ParametersJSON Schema
NameRequiredDescription
portalNoURL des EnviDat-Portals.
sourceNoDatenquelle dieses Resultats.
domainsNoNaeherungswerte je Domaene.
licenseNoLizenzlage; die genaue Lizenz steht je Datensatz.
provenanceNoHerkunftsart: 'live_api' = direkt bei der Quelle abgefragt.
retrieved_atNoAbrufzeitpunkt (UTC, ISO 8601).
total_datasetsNoDatensaetze im Katalog.
top_organizationsNoDie sechs groessten Einheiten.
organization_countNoAnzahl Forschungseinheiten.

TDQS

A4.4/5.0
Behavior4/5

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

Annotations already declare readOnly, idempotent, and non-destructive behavior, so the description only needs to add context. It does so by disclosing the return shape: a readable overview in the text channel plus numbers as structuredContent, which goes beyond what the annotations convey.

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

Conciseness4/5

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

The description is compact and front-loads the core purpose in the first sentence. There is slight redundancy between 'Übersicht' in the title and the opening line, but the added detail about domains, organizations, data volume, and the structuredContent return is purposeful.

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

Completeness5/5

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

For a parameterless, read-only catalog overview with an output schema and supporting annotations, the description provides everything an agent needs: what the tool does, when to use it, and what form the result takes. No critical information is missing.

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

Parameters4/5

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

With zero parameters, the schema already fully documents the input surface; the baseline is 4. The description appropriately mentions what the output covers but does not need to add parameter-level detail.

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

Purpose5/5

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

The description names a specific verb and resource ('Gibt eine Übersicht über den EnviDat-Katalog zurück') and spells out what the overview contains: domains, organizations, and data volume. It also frames the tool as an entry point, which distinguishes it from the sibling search/get/list tools.

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

Usage Guidelines4/5

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

It clearly states the intended context: 'Nützlich als Einstiegspunkt' and describes what kind of orientation it provides. It does not explicitly name alternative tools or say when not to use it, but for a zero-parameter overview tool the usage guidance is sufficiently clear.

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

wsl_get_avalanche_dataSLF Lawinen- & SchneedatenA
Read-onlyIdempotent

Lawinen- und Schneedaten vom WSL-Institut fuer Schnee- und Lawinenforschung (SLF).

Enthält u.a.:

  • Tödliche Lawinenunfälle in der Schweiz seit 1936/37

  • Langjährige Schneemessreihen (Station Stillberg Davos, 2090 m)

  • Meteorologische Langzeitdaten Hochgebirge

  • Schneephysik-Forschungsdaten

Args: params (SimpleQueryInput): Anzahl Ergebnisse und Format

Returns: CallToolResult: Lawinen- und Schneedatensätze des SLF

ParametersJSON Schema
NameRequiredDescriptionDefault
paramsYes

Output Schema

ParametersJSON Schema
NameRequiredDescription
shownNoDavon in diesem Resultat enthalten.
sourceNoDatenquelle dieses Resultats.
licenseNoLizenzlage; die genaue Lizenz steht je Datensatz.
datasetsNoDie Treffer.
provenanceNoHerkunftsart: 'live_api' = direkt bei der Quelle abgefragt.
total_foundNoGesamtzahl der Treffer in der Quelle.
retrieved_atNoAbrufzeitpunkt (UTC, ISO 8601).
suggested_tagsNoARCH-003: verwandte Tags bei leerem Resultat. Im Textkanal stehen sie seit jeher als Prosa; hier stehen sie als Liste.

TDQS

A3.6/5.0
Behavior3/5

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

Annotations already declare read-only, idempotent, open-world, and non-destructive behavior, so the description carries a lighter burden. It adds dataset content scope and the return type, but does not disclose details like pagination, output formatting behavior, or how limit affects results beyond what schema defaults imply.

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

Conciseness4/5

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

The description is well-structured with a front-loaded domain statement, a compact bullet list, and clearly labeled Args and Returns sections. There is slight redundancy between the opening line and the Returns line, but no wasted or misleading content.

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

Completeness4/5

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

For a one-argument, read-only tool with strong annotations and an output schema, the description is largely complete: it names the data source, lists contents, and explains the parameter. The main remaining gap is explicit cross-tool usage differentiation, which is left to inference from sibling names and domain terms.

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

Parameters4/5

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

Schema property descriptions are effectively absent, and the Args line compensates by explaining the nested params as 'Anzahl Ergebnisse und Format', which directly maps to limit and response_format. The schema then supplies constraints, defaults, and enum values, so the description provides the missing semantic layer.

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

Purpose4/5

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

The description clearly identifies the resource as SLF avalanche and snow data and lists concrete dataset categories, which helps distinguish it from forest and natural-hazard siblings. It lacks an explicit action verb like 'retrieve' or 'search', but the tool name and returns section establish the operation.

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

Usage Guidelines3/5

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

The scope is implied by the title and content bullets: use this for avalanche and snow data. However, there is no explicit when-to-use guidance, and no alternatives such as wsl_get_forest_data or wsl_get_naturgefahren_data are named or excluded.

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

wsl_get_datasetEnviDat Datensatz-DetailsA
Read-onlyIdempotent

Gibt vollständige Metadaten und Ressourcen (Download-URLs) eines EnviDat-Datensatzes zurück.

Detail-Ansicht eines konkreten Datensatzes mit DOI, Lizenz, Autoren, Download-Links und räumlicher Ausdehnung. Folge-Schritt nach wsl_search.

id_or_slug ist entweder die UUID oder der URL-Slug aus dem Suchergebnis (Feld 'name'). Liefert auch nicht-öffentliche Resource-Metadaten wenn vorhanden.

id_or_slug='fatal-avalanche-accidents-in-switzerland-since-1936-37' → vollständige Lawinen-Datenbankbeschreibung mit CSV-Download-Link.

ParametersJSON Schema
NameRequiredDescriptionDefault
paramsYes

Output Schema

ParametersJSON Schema
NameRequiredDescription
doiNoDOI ohne Praefix, wenn vergeben.
orgNoTitel der Forschungseinheit.
urlNoPermalink auf dem EnviDat-Portal.
nameNoSlug (URL-Name).
tagsNoSchlagwoerter.
notesNoVollstaendige Beschreibung.
titleNoTitel.
sourceNoDatenquelle dieses Resultats.
authorsNoAutorenangabe der Quelle.
createdNoErstellt (YYYY-MM-DD).
licenseNoLizenz.
spatialNoRaeumliche Ausdehnung, GeoJSON als String wie von der Quelle geliefert.
modifiedNoLetzte Aenderung (YYYY-MM-DD).
resourcesNoHerunterladbare Dateien.
provenanceNoHerkunftsart: 'live_api' = direkt bei der Quelle abgefragt.
retrieved_atNoAbrufzeitpunkt (UTC, ISO 8601).
publication_yearNoPublikationsjahr.

TDQS

A4.5/5.0
Behavior4/5

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

Annotations already declare readOnlyHint, idempotentHint, and openWorldHint, so the safety profile is already known. The description adds meaningful behavioral context beyond that: it returns download URLs, can include non-public resource metadata when present, and lists the metadata fields such as DOI, license, authors, and spatial extent.

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

Conciseness5/5

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

The description is compact and structured with clear use_case, important_notes, and example sections. Every section earns its place and adds actionable guidance rather than repeating the title or schema.

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

Completeness5/5

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

Given the output schema exists, the description covers everything an agent needs to invoke the tool: input provenance, supported identifier forms, a concrete example, and a summary of returned metadata and resources. No critical calling information is missing.

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

Parameters4/5

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

Although the context signal reports 0% schema coverage, the embedded schema already provides descriptions and examples for both parameters. The description adds extra semantic value by explaining that id_or_slug can be a UUID or URL slug from the search result's 'name' field, and the example clarifies exactly what kind of input is expected.

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

Purpose5/5

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

The description states a specific verb and resource: it returns complete metadata and resources (download URLs) of an EnviDat dataset. The use_case explicitly distinguishes it as the detail view of a concrete dataset and positions it as the follow-up to wsl_search, so it is not confused with list/search siblings.

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

Usage Guidelines4/5

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

The description clearly states when to use the tool: as the detail view after wsl_search, with id_or_slug taken from the search result field 'name'. It does not explicitly name excluded alternatives, but the use_case and sibling context make the selection boundary clear.

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

wsl_get_forest_dataWSL Walddaten & ForstinventarB
Read-onlyIdempotent

Gibt Datensätze zum Schweizer Wald zurück, inkl. Landesforstinventar LFI.

Enthält u.a.:

  • Schweizerisches Landesforstinventar (LFI) – Waldzustand, Vorräte, Biodiversität

  • Sanasilva-Programm (Waldschadensmonitoring seit 1983)

  • Langzeitforschungsflächen LWF

  • Walddynamik und Waldentwicklung seit 1840

  • Borkenkäfer-Monitoring

  • Bodenlösung und Nährstoffhaushalt im Wald

Args: params (SimpleQueryInput): Anzahl Ergebnisse und Format

Returns: CallToolResult: Walddatensätze der WSL

ParametersJSON Schema
NameRequiredDescriptionDefault
paramsYes

Output Schema

ParametersJSON Schema
NameRequiredDescription
shownNoDavon in diesem Resultat enthalten.
sourceNoDatenquelle dieses Resultats.
licenseNoLizenzlage; die genaue Lizenz steht je Datensatz.
datasetsNoDie Treffer.
provenanceNoHerkunftsart: 'live_api' = direkt bei der Quelle abgefragt.
total_foundNoGesamtzahl der Treffer in der Quelle.
retrieved_atNoAbrufzeitpunkt (UTC, ISO 8601).
suggested_tagsNoARCH-003: verwandte Tags bei leerem Resultat. Im Textkanal stehen sie seit jeher als Prosa; hier stehen sie als Liste.

TDQS

B3.2/5.0
Behavior3/5

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

Annotations already declare readOnlyHint=true, idempotentHint=true, and destructiveHint=false, so the safety profile is covered. The description adds context about the data sources (LFI, Sanasilva, LWF, etc.) and mentions the tool returns datasets, but it doesn't disclose details like pagination, response size limits, or that the limit parameter caps results. No contradiction with annotations.

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

Conciseness4/5

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

The description is reasonably concise, with a clear opening sentence followed by a bulleted list of data categories. The Args/Returns section is brief and front-loaded. The bullet list is useful but could be trimmed; overall it earns its place.

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

Completeness3/5

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

The tool has an output schema and annotations covering safety, so the description doesn't need to explain return values. However, with 0% schema description coverage and only one parameter, the description could have explained the limit/format parameters more concretely. The data source list is helpful for an agent to decide if this tool matches a forest-related query, but usage guidance is thin.

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

Parameters2/5

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

Schema description coverage is 0%, and the description only says 'Anzahl Ergebnisse und Format' (number of results and format) for the params argument. The schema itself documents limit and response_format with defaults, but the description adds minimal value beyond that. The nested SimpleQueryInput type is described as 'Für spezialisierte thematische Suchen' which is generic and doesn't explain forest-specific parameter behavior.

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

Purpose4/5

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

The description clearly states the tool returns Swiss forest datasets including the national forest inventory (LFI), and lists specific data categories. It distinguishes itself from sibling tools like wsl_get_avalanche_data and wsl_get_naturgefahren_data by focusing on forest/Wald data, though it doesn't explicitly name a sibling.

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

Usage Guidelines3/5

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

The description implies usage for forest-related queries by listing forest data topics, but it does not explicitly state when to use this tool versus alternatives like wsl_search or wsl_get_dataset. The context is clear enough for an agent to infer forest data queries, but no explicit when/when-not guidance is provided.

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

wsl_get_naturgefahren_dataWSL Naturgefahren-DatenB
Read-onlyIdempotent

Gibt Datensätze zu Naturgefahren in der Schweiz zurück.

Enthält u.a.:

  • Tödliche Lawinenunfälle seit 1936/37

  • Murgang- und Rutschungsereignisse

  • Steinschlag- und Felssturzdaten

  • Schwemmkegel-Morphologie

  • Sedimenttransport in Gebirgsbächen

  • Hochwasserereignisse

Relevant für: Raumplanung, Schulhausstandort-Bewertungen, Katastrophenschutz, Klimafolgenabschätzung.

Args: params (SimpleQueryInput): Anzahl Ergebnisse und Format

Returns: CallToolResult: Naturgefahren-Datensätze der WSL

ParametersJSON Schema
NameRequiredDescriptionDefault
paramsYes

Output Schema

ParametersJSON Schema
NameRequiredDescription
shownNoDavon in diesem Resultat enthalten.
sourceNoDatenquelle dieses Resultats.
licenseNoLizenzlage; die genaue Lizenz steht je Datensatz.
datasetsNoDie Treffer.
provenanceNoHerkunftsart: 'live_api' = direkt bei der Quelle abgefragt.
total_foundNoGesamtzahl der Treffer in der Quelle.
retrieved_atNoAbrufzeitpunkt (UTC, ISO 8601).
suggested_tagsNoARCH-003: verwandte Tags bei leerem Resultat. Im Textkanal stehen sie seit jeher als Prosa; hier stehen sie als Liste.

TDQS

B3.2/5.0
Behavior3/5

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

Annotations already declare readOnlyHint=true, idempotentHint=true, and destructiveHint=false, so the safety profile is clear. The description adds useful scope details such as 'Tödliche Lawinenunfälle seit 1936/37' and 'u.a.', but it doesn't describe operational behavior such as result limiting, pagination, or data source freshness. It does not contradict the annotations.

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

Conciseness4/5

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

The description is well structured: a one-line summary, a useful content list, applicability areas, then parameter and return sections. The Returns line is slightly redundant with the opening sentence, but overall the structure is efficient and scannable.

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

Completeness3/5

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

For a simple read-only query tool with one parameter and an output schema, the description covers purpose, content scope, and some use cases. It is incomplete in one important area: it does not clarify when to prefer this tool over the specialized wsl_get_avalanche_data or wsl_get_forest_data, leaving some ambiguity in tool selection.

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

Parameters3/5

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

The Args line 'params (SimpleQueryInput): Anzahl Ergebnisse und Format' correctly maps to the limit and response_format properties at a high level. However, it does not mention defaults, allowed response formats, or the max limit of 20, and schema description coverage is 0%. This is adequate but not comprehensive, especially since the nested schema description mentions unrelated themes like Wald and Dürre.

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

Purpose4/5

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

The description states a clear verb and resource: 'Gibt Datensätze zu Naturgefahren in der Schweiz zurück.' The bullet list makes the data scope concrete. It is distinguishable from most siblings, though it overlaps with wsl_get_avalanche_data because avalanche accidents are listed here too, so it doesn't fully differentiate itself from that sibling.

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

Usage Guidelines2/5

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

The description gives application contexts such as 'Raumplanung' and 'Katastrophenschutz', but it never says when to choose this tool instead of wsl_get_avalanche_data or wsl_get_forest_data. No exclusions or explicit alternatives are mentioned, which is a real gap given the avalanche overlap.

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

wsl_get_organizationWSL-Forschungseinheit DetailsA
Read-onlyIdempotent

Gibt Details einer WSL-Forschungseinheit inklusive ihrer Datensätze zurück.

Liefert Beschreibung, Kontakt und Datensatz-Übersicht einer Organisation. Das SLF (Institut für Schnee- und Lawinenforschung) ist als 'slf' abrufbar.

Args: params (GetOrganizationInput): Mit: - name (str): Organisations-Slug (z.B. 'wsl', 'slf') - include_datasets (bool): Datensätze mitausgeben

Returns: CallToolResult: Lesbare Details im Textkanal, dazu die Einheit als structuredContent nach OrganizationDetail.

ParametersJSON Schema
NameRequiredDescriptionDefault
paramsYes

Output Schema

ParametersJSON Schema
NameRequiredDescription
nameNoSlug der Einheit.
titleNoAusgeschriebener Name.
sourceNoDatenquelle dieses Resultats.
licenseNoLizenzlage; die genaue Lizenz steht je Datensatz.
datasetsNoDatensaetze der Einheit. Der Textkanal zeigt hoechstens zehn; hier steht, was die Quelle geliefert hat.
provenanceNoHerkunftsart: 'live_api' = direkt bei der Quelle abgefragt.
descriptionNoBeschreibung.
retrieved_atNoAbrufzeitpunkt (UTC, ISO 8601).
package_countNoAnzahl Datensaetze insgesamt.

TDQS

A4.1/5.0
Behavior4/5

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

Annotations already declare the operation read-only, idempotent, and non-destructive. The description adds useful behavioral context by explaining that the result is delivered both as readable text and as structuredContent conforming to OrganizationDetail, which goes beyond the annotations.

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

Conciseness4/5

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

The description is well structured into purpose, Args, and Returns sections, making it easy to scan. There is slight redundancy between the first and second sentences, both stating that datasets are included, but overall every section earns its place.

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

Completeness4/5

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

For a simple tool with one required parameter, existing output schema, and strong annotations covering safety, the description is nearly complete: it explains parameters, return format, and gives a real-world slug example. The only notable gap is explicit guidance on when to choose this tool over sibling list/search tools.

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

Parameters4/5

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

With schema description coverage reported at 0%, the description compensates by explaining both parameters: name is an organization slug with 'wsl/slf examples, and include_datasets controls whether datasets are included. It does not mention the default value for include_datasets, but the schema provides that detail.

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

Purpose5/5

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

The description uses a specific verb and resource: 'Gibt Details einer WSL-Forschungseinheit inklusive ihrer Datensätze zurück' and names the fields returned (Beschreibung, Kontakt, Datensatz-Übersicht). It also distinguishes itself from siblings like wsl_list_organizations and wsl_get_dataset by focusing on a single organization's details, including its datasets.

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

Usage Guidelines3/5

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

The description makes it clear that this tool is for retrieving details of a specific known organization by slug, with 'slf' as a concrete example. However, it does not explicitly say when to choose this tool instead of alternatives, nor does it mention discovery workflows such as using wsl_list_organizations to find valid slugs.

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

wsl_get_recent_datasetsNeuste EnviDat DatensätzeA
Read-only

Gibt die zuletzt publizierten oder aktualisierten EnviDat-Datensätze zurück.

Nützlich für regelmässige Monitoring-Workflows und um neue WSL-Forschungsdaten zu entdecken.

Args: params (GetRecentDatasetsInput): Mit limit und response_format

Returns: CallToolResult: Zuletzt aktualisierte Datensätze

ParametersJSON Schema
NameRequiredDescriptionDefault
paramsYes

Output Schema

ParametersJSON Schema
NameRequiredDescription
shownNoDavon in diesem Resultat enthalten.
sourceNoDatenquelle dieses Resultats.
licenseNoLizenzlage; die genaue Lizenz steht je Datensatz.
datasetsNoDie Treffer.
provenanceNoHerkunftsart: 'live_api' = direkt bei der Quelle abgefragt.
total_foundNoGesamtzahl der Treffer in der Quelle.
retrieved_atNoAbrufzeitpunkt (UTC, ISO 8601).
suggested_tagsNoARCH-003: verwandte Tags bei leerem Resultat. Im Textkanal stehen sie seit jeher als Prosa; hier stehen sie als Liste.

TDQS

A3.5/5.0
Behavior3/5

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

Annotations already declare readOnlyHint=true and destructiveHint=false, so the safety profile is covered. The description adds that results reflect recently published or updated datasets and frames the tool for monitoring, but it does not disclose additional behavioral details such as response ordering, pagination, or external data variability beyond what annotations imply.

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

Conciseness4/5

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

The description is short and front-loaded with the core behavior in the first sentence, followed by a useful use-case sentence. The Args/Returns lines are somewhat mechanical and add little information, but there is no wasted content or unnecessary verbosity.

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

Completeness4/5

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

For a simple read-only listing tool, the description covers what it returns and when it is useful, and the output schema is already available so return-value details are not required. It is slightly incomplete in not orienting the agent toward when a sibling like wsl_search would be more appropriate, but overall the definition is sufficient for correct invocation.

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

Parameters2/5

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

Schema description coverage is 0%, so the description carries the burden of explaining parameters. It only names 'limit' and 'response_format' without explaining their meaning, allowed values, or defaults; the schema itself provides types, defaults, and constraints, but the description adds almost no semantic value.

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

Purpose4/5

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

The description clearly states a specific verb and resource: it returns the latest published or updated EnviDat datasets. It also signals a distinct focus from siblings like wsl_search or wsl_get_dataset through the 'zuletzt publiziert oder aktualisiert' qualifier, though it does not explicitly name alternatives.

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

Usage Guidelines4/5

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

The description gives concrete application contexts: regular monitoring workflows and discovering new WSL research data. It does not provide exclusions or explicitly compare with sibling tools, but the use-case framing is clear enough for an agent to recognize when this tool fits.

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

wsl_list_organizationsWSL-Forschungseinheiten auflistenA
Read-onlyIdempotent

Listet alle WSL-Forschungseinheiten und deren Datensatz-Anzahl auf.

Gibt einen Überblick über die Forschungsgruppen der WSL, die Daten auf EnviDat publiziert haben. Nützlich zur Identifikation relevanter Organisationen für nachfolgende Abfragen mit wsl_get_organization.

Returns: CallToolResult: Lesbare Liste im Textkanal, dazu die Einheiten als structuredContent nach OrganizationListOutput.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

Output Schema

ParametersJSON Schema
NameRequiredDescription
totalNoAnzahl Forschungseinheiten.
sourceNoDatenquelle dieses Resultats.
licenseNoLizenzlage; die genaue Lizenz steht je Datensatz.
provenanceNoHerkunftsart: 'live_api' = direkt bei der Quelle abgefragt.
retrieved_atNoAbrufzeitpunkt (UTC, ISO 8601).
organizationsNoDie Einheiten, nach Datensatzzahl absteigend.

TDQS

A4.3/5.0
Behavior4/5

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

Annotations already declare readOnlyHint, idempotentHint, and destructiveHint, so safety is covered. The description adds scope context (only groups with data on EnviDat) and explains the return shape: a readable text list plus structuredContent matching OrganizationListOutput. No contradiction with annotations.

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

Conciseness4/5

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

The description is reasonably concise and front-loaded with the core purpose. The second sentence adds practical context, and the Returns block is structured. It could be tightened slightly, but no sentence is wasted.

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

Completeness4/5

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

For a zero-parameter list tool with strong annotations and an output schema, the description is largely complete: it states what is listed, the scope, and the output format. Minor ambiguity remains about whether 'alle WSL-Forschungseinheiten' includes units with zero published datasets or only those with at least one, so it is not perfect.

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

Parameters4/5

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

The tool has zero parameters and the schema coverage is 100%, so there are no parameter details to document. The baseline of 4 applies because nothing is missing and the description does not need to compensate for schema gaps.

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

Purpose5/5

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

The description uses a specific verb ('Listet') and resource ('alle WSL-Forschungseinheiten'), and adds the dataset count per unit. It also distinguishes itself from the sibling wsl_get_organization by positioning this as the overview-level query that precedes a detailed organization lookup.

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

Usage Guidelines4/5

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

The description gives a clear usage context: it provides an overview of WSL research groups that published data on EnviDat and is useful for identifying relevant organizations before querying wsl_get_organization. It lacks an explicit when-not-to-use statement, but the intended workflow is evident.

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

wsl_list_tagsEnviDat Tags/Schlagwörter auflistenA
Read-onlyIdempotent

Listet verfügbare Schlagwörter (Tags) im EnviDat-Katalog auf.

Nützlich um herauszufinden, welche Suchbegriffe in wsl_search präzise Ergebnisse liefern. Unterstützt Präfix-Suche.

Args: params (ListTagsInput): Mit: - query (str): Optionaler Suchbegriff für Tags - limit (int): Maximale Anzahl Tags

Returns: CallToolResult: Lesbare Tag-Liste im Textkanal, dazu die Tags als structuredContent nach TagListOutput.

ParametersJSON Schema
NameRequiredDescriptionDefault
paramsYes

Output Schema

ParametersJSON Schema
NameRequiredDescription
tagsNoDie Schlagwoerter.
queryNoDas angefragte Praefix, falls gesetzt.
shownNoDavon nach `limit` enthalten.
totalNoWie viele Tags die Quelle zurueckgab.
sourceNoDatenquelle dieses Resultats.
licenseNoLizenzlage; die genaue Lizenz steht je Datensatz.
provenanceNoHerkunftsart: 'live_api' = direkt bei der Quelle abgefragt.
retrieved_atNoAbrufzeitpunkt (UTC, ISO 8601).

TDQS

A4.3/5.0
Behavior4/5

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

Annotations already indicate readOnly, idempotent, and non-destructive behavior. The description adds valuable behavioral details: prefix-search support and the return format (readable text channel plus structuredContent per TagListOutput). No contradiction with annotations.

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

Conciseness4/5

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

The description is compact and front-loads the core purpose before the use case and parameter details. The Args/Returns sections are minimally redundant with the schema and do not add excessive length.

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

Completeness4/5

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

Given a simple one-parameter tool with rich annotations and an output schema, the description covers purpose, usage context, prefix behavior, and return structure. Minor details like exact prefix syntax or case sensitivity are absent but not critical for this low-complexity tool.

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

Parameters4/5

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

Schema description coverage is 0%, so the description must carry parameter meaning. It explains query as an optional tag search term and limit as the maximum number of tags, and additionally mentions prefix search. This compensates for the schema gap, though limit's meaning is partly inferable from its name.

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

Purpose5/5

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

The description names a specific verb ('Listet') and resource ('verfügbare Schlagwörter (Tags) im EnviDat-Katalog'), and explicitly ties the tool's purpose to improving searches in wsl_search. This clearly distinguishes it from sibling tools like wsl_list_organizations or wsl_search.

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

Usage Guidelines4/5

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

States a concrete use case: discovering search terms that produce precise results in wsl_search. It does not explicitly list exclusions or compare against all alternatives, but the context is clear enough for an agent to know when this tool is appropriate.

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

Tool Schema Changelog

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

  1. 10 tool updatesv0.3.1
    • Changedwsl_catalog_stats15 fields changed
      • addedOutput schema / $defs
        Added value: +{
        +  "DomainCount": {
        +    "additionalProperties": false,
        +    "description": "Naeherungswert fuer eine Forschungsdomaene.",
        +    "properties": {
        +      "count": {
        +        "default": 0,
        +        "description": "Treffer der kuratierten Domaenen-Query.",
        +        "title": "Count",
        +        "type": "integer"
        +      },
        +      "domain": {
        +        "description": "Schluessel der Domaene, z.B. 'wald'.",
        +        "title": "Domain",
        +        "type": "string"
        +      },
        +      "label": {
        +        "description": "Anzeigename der Domaene.",
        +        "title": "Label",
        +        "type": "string"
        +      }
        +    },
        +    "required": [
        +      "domain",
        +      "label"
        +    ],
        +    "title": "DomainCount",
        +    "type": "object"
        +  },
        +  "OrganizationSummary": {
        +    "additionalProperties": false,
        +    "description": "Eine WSL-Forschungseinheit in Listenform.",
        +    "properties": {
        +      "description": {
        +        "default": "",
        +        "description": "Kurzbeschreibung.",
        +        "title": "Description",
        +        "type": "string"
        +      },
        +      "name": {
        +        "anyOf": [
        +          {
        +            "type": "string"
        +          },
        +          {
        +            "type": "null"
        +          }
        +        ],
        +        "default": null,
        +        "description": "Slug der Einheit.",
        +        "title": "Name"
        +      },
        +      "package_count": {
        +        "default": 0,
        +        "description": "Anzahl publizierter Datensaetze.",
        +        "title": "Package Count",
        +        "type": "integer"
        +      },
        +      "title": {
        +        "anyOf": [
        +          {
        +            "type": "string"
        +          },
        +          {
        +            "type": "null"
        +          }
        +        ],
        +        "default": null,
        +        "description": "Ausgeschriebener Name.",
        +        "title": "Title"
        +      }
        +    },
        +    "title": "OrganizationSummary",
        +    "type": "object"
        +  }
        +}
      • addedOutput schema / additionalProperties
        Added value: +false
      • addedOutput schema / description
        Added value: +"Resultat von `wsl_catalog_stats`."
      • addedOutput schema / properties / domains
        Added value: +{
        +  "description": "Naeherungswerte je Domaene.",
        +  "items": {
        +    "$ref": "#/$defs/DomainCount"
        +  },
        +  "title": "Domains",
        +  "type": "array"
        +}
      • addedOutput schema / properties / license
        Added value: +{
        +  "default": "various open licenses per dataset — see metadata",
        +  "description": "Lizenzlage; die genaue Lizenz steht je Datensatz.",
        +  "title": "License",
        +  "type": "string"
        +}
      • addedOutput schema / properties / organization_count
        Added value: +{
        +  "default": 0,
        +  "description": "Anzahl Forschungseinheiten.",
        +  "title": "Organization Count",
        +  "type": "integer"
        +}
      • addedOutput schema / properties / portal
        Added value: +{
        +  "default": "",
        +  "description": "URL des EnviDat-Portals.",
        +  "title": "Portal",
        +  "type": "string"
        +}
      • addedOutput schema / properties / provenance
        Added value: +{
        +  "default": "live_api",
        +  "description": "Herkunftsart: 'live_api' = direkt bei der Quelle abgefragt.",
        +  "title": "Provenance",
        +  "type": "string"
        +}
      • removedOutput schema / properties / result
        Removed value: -{
        -  "title": "Result",
        -  "type": "string"
        -}
      • addedOutput schema / properties / retrieved_at
        Added value: +{
        +  "description": "Abrufzeitpunkt (UTC, ISO 8601).",
        +  "title": "Retrieved At",
        +  "type": "string"
        +}
      • addedOutput schema / properties / source
        Added value: +{
        +  "default": "EnviDat / WSL (envidat.ch)",
        +  "description": "Datenquelle dieses Resultats.",
        +  "title": "Source",
        +  "type": "string"
        +}
      • addedOutput schema / properties / top_organizations
        Added value: +{
        +  "description": "Die sechs groessten Einheiten.",
        +  "items": {
        +    "$ref": "#/$defs/OrganizationSummary"
        +  },
        +  "title": "Top Organizations",
        +  "type": "array"
        +}
      • addedOutput schema / properties / total_datasets
        Added value: +{
        +  "default": 0,
        +  "description": "Datensaetze im Katalog.",
        +  "title": "Total Datasets",
        +  "type": "integer"
        +}
      • removedOutput schema / required
        Removed value: -[
        -  "result"
        -]
      • changedOutput schema / title
        Previous value: -"wsl_catalog_statsOutput"New value: +"CatalogStats"
    • Changedwsl_get_avalanche_data14 fields changed
      • addedOutput schema / $defs
        Added value: +{
        +  "DatasetSummary": {
        +    "additionalProperties": false,
        +    "description": "Ein Datensatz in Listenform — die neun Felder des bisherigen JSON.",
        +    "properties": {
        +      "license": {
        +        "anyOf": [
        +          {
        +            "type": "string"
        +          },
        +          {
        +            "type": "null"
        +          }
        +        ],
        +        "default": null,
        +        "description": "Lizenz dieses Datensatzes.",
        +        "title": "License"
        +      },
        +      "modified": {
        +        "default": "",
        +        "description": "Letzte Aenderung (YYYY-MM-DD).",
        +        "title": "Modified",
        +        "type": "string"
        +      },
        +      "name": {
        +        "anyOf": [
        +          {
        +            "type": "string"
        +          },
        +          {
        +            "type": "null"
        +          }
        +        ],
        +        "default": null,
        +        "description": "Slug (URL-Name) des Datensatzes.",
        +        "title": "Name"
        +      },
        +      "notes": {
        +        "default": "",
        +        "description": "Beschreibung, auf 300 Zeichen gekuerzt.",
        +        "title": "Notes",
        +        "type": "string"
        +      },
        +      "org": {
        +        "anyOf": [
        +          {
        +            "type": "string"
        +          },
        +          {
        +            "type": "null"
        +          }
        +        ],
        +        "default": null,
        +        "description": "Slug der Forschungseinheit.",
        +        "title": "Org"
        +      },
        +      "resources": {
        +        "default": 0,
        +        "description": "Anzahl herunterladbarer Ressourcen.",
        +        "title": "Resources",
        +        "type": "integer"
        +      },
        +      "tags": {
        +        "description": "Schlagwoerter.",
        +        "items": {
        +          "type": "string"
        +        },
        +        "title": "Tags",
        +        "type": "array"
        +      },
        +      "title": {
        +        "anyOf": [
        +          {
        +            "type": "string"
        +          },
        +          {
        +            "type": "null"
        +          }
        +        ],
        +        "default": null,
        +        "description": "Titel des Datensatzes.",
        +        "title": "Title"
        +      },
        +      "url": {
        +        "default": "",
        +        "description": "Permalink auf dem EnviDat-Portal.",
        +        "title": "Url",
        +        "type": "string"
        +      }
        +    },
        +    "title": "DatasetSummary",
        +    "type": "object"
        +  }
        +}
      • addedOutput schema / additionalProperties
        Added value: +false
      • addedOutput schema / description
        Added value: +"Resultat aller listenliefernden Such-Tools."
      • addedOutput schema / properties / datasets
        Added value: +{
        +  "description": "Die Treffer.",
        +  "items": {
        +    "$ref": "#/$defs/DatasetSummary"
        +  },
        +  "title": "Datasets",
        +  "type": "array"
        +}
      • addedOutput schema / properties / license
        Added value: +{
        +  "default": "various open licenses per dataset — see metadata",
        +  "description": "Lizenzlage; die genaue Lizenz steht je Datensatz.",
        +  "title": "License",
        +  "type": "string"
        +}
      • addedOutput schema / properties / provenance
        Added value: +{
        +  "default": "live_api",
        +  "description": "Herkunftsart: 'live_api' = direkt bei der Quelle abgefragt.",
        +  "title": "Provenance",
        +  "type": "string"
        +}
      • removedOutput schema / properties / result
        Removed value: -{
        -  "title": "Result",
        -  "type": "string"
        -}
      • addedOutput schema / properties / retrieved_at
        Added value: +{
        +  "description": "Abrufzeitpunkt (UTC, ISO 8601).",
        +  "title": "Retrieved At",
        +  "type": "string"
        +}
      • addedOutput schema / properties / shown
        Added value: +{
        +  "default": 0,
        +  "description": "Davon in diesem Resultat enthalten.",
        +  "title": "Shown",
        +  "type": "integer"
        +}
      • addedOutput schema / properties / source
        Added value: +{
        +  "default": "EnviDat / WSL (envidat.ch)",
        +  "description": "Datenquelle dieses Resultats.",
        +  "title": "Source",
        +  "type": "string"
        +}
      • addedOutput schema / properties / suggested_tags
        Added value: +{
        +  "description": "ARCH-003: verwandte Tags bei leerem Resultat. Im Textkanal stehen sie seit jeher als Prosa; hier stehen sie als Liste.",
        +  "items": {
        +    "type": "string"
        +  },
        +  "title": "Suggested Tags",
        +  "type": "array"
        +}
      • addedOutput schema / properties / total_found
        Added value: +{
        +  "default": 0,
        +  "description": "Gesamtzahl der Treffer in der Quelle.",
        +  "title": "Total Found",
        +  "type": "integer"
        +}
      • removedOutput schema / required
        Removed value: -[
        -  "result"
        -]
      • changedOutput schema / title
        Previous value: -"wsl_get_avalanche_dataOutput"New value: +"SearchOutput"
    • Changedwsl_get_dataset23 fields changed
      • addedOutput schema / $defs
        Added value: +{
        +  "ResourceEntry": {
        +    "additionalProperties": false,
        +    "description": "Eine herunterladbare Datei eines Datensatzes.",
        +    "properties": {
        +      "description": {
        +        "default": "",
        +        "description": "Beschreibung der Datei.",
        +        "title": "Description",
        +        "type": "string"
        +      },
        +      "format": {
        +        "anyOf": [
        +          {
        +            "type": "string"
        +          },
        +          {
        +            "type": "null"
        +          }
        +        ],
        +        "default": null,
        +        "description": "Format, z.B. CSV, NetCDF.",
        +        "title": "Format"
        +      },
        +      "name": {
        +        "anyOf": [
        +          {
        +            "type": "string"
        +          },
        +          {
        +            "type": "null"
        +          }
        +        ],
        +        "default": null,
        +        "description": "Dateiname oder Bezeichnung.",
        +        "title": "Name"
        +      },
        +      "size": {
        +        "anyOf": [
        +          {
        +            "type": "integer"
        +          },
        +          {
        +            "type": "null"
        +          }
        +        ],
        +        "default": null,
        +        "description": "Groesse in Bytes, wenn bekannt.",
        +        "title": "Size"
        +      },
        +      "url": {
        +        "anyOf": [
        +          {
        +            "type": "string"
        +          },
        +          {
        +            "type": "null"
        +          }
        +        ],
        +        "default": null,
        +        "description": "Direkter Download-Link.",
        +        "title": "Url"
        +      }
        +    },
        +    "title": "ResourceEntry",
        +    "type": "object"
        +  }
        +}
      • addedOutput schema / additionalProperties
        Added value: +false
      • addedOutput schema / description
        Added value: +"Die kuratierten Detailfelder eines Datensatzes.\n\nBewusst NICHT das rohe CKAN-Paket: Dessen 42 Felder haben kein stabiles\nSchema, und ein `outputSchema` darueber waere wieder eine Zusage, die\nniemand halten kann. Wer alle Rohfelder braucht, bekommt sie unveraendert\nueber `response_format=\"json\"` im Textkanal — dieser Weg wird hier nicht\nangetastet, damit niemand Daten verliert, die er heute schon abholt."
      • addedOutput schema / properties / authors
        Added value: +{
        +  "anyOf": [
        +    {
        +      "type": "string"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "default": null,
        +  "description": "Autorenangabe der Quelle.",
        +  "title": "Authors"
        +}
      • addedOutput schema / properties / created
        Added value: +{
        +  "default": "",
        +  "description": "Erstellt (YYYY-MM-DD).",
        +  "title": "Created",
        +  "type": "string"
        +}
      • addedOutput schema / properties / doi
        Added value: +{
        +  "anyOf": [
        +    {
        +      "type": "string"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "default": null,
        +  "description": "DOI ohne Praefix, wenn vergeben.",
        +  "title": "Doi"
        +}
      • addedOutput schema / properties / license
        Added value: +{
        +  "anyOf": [
        +    {
        +      "type": "string"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "default": null,
        +  "description": "Lizenz.",
        +  "title": "License"
        +}
      • addedOutput schema / properties / modified
        Added value: +{
        +  "default": "",
        +  "description": "Letzte Aenderung (YYYY-MM-DD).",
        +  "title": "Modified",
        +  "type": "string"
        +}
      • addedOutput schema / properties / name
        Added value: +{
        +  "anyOf": [
        +    {
        +      "type": "string"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "default": null,
        +  "description": "Slug (URL-Name).",
        +  "title": "Name"
        +}
      • addedOutput schema / properties / notes
        Added value: +{
        +  "default": "",
        +  "description": "Vollstaendige Beschreibung.",
        +  "title": "Notes",
        +  "type": "string"
        +}
      • addedOutput schema / properties / org
        Added value: +{
        +  "anyOf": [
        +    {
        +      "type": "string"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "default": null,
        +  "description": "Titel der Forschungseinheit.",
        +  "title": "Org"
        +}
      • addedOutput schema / properties / provenance
        Added value: +{
        +  "default": "live_api",
        +  "description": "Herkunftsart: 'live_api' = direkt bei der Quelle abgefragt.",
        +  "title": "Provenance",
        +  "type": "string"
        +}
      • addedOutput schema / properties / publication_year
        Added value: +{
        +  "anyOf": [
        +    {
        +      "type": "string"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "default": null,
        +  "description": "Publikationsjahr.",
        +  "title": "Publication Year"
        +}
      • addedOutput schema / properties / resources
        Added value: +{
        +  "description": "Herunterladbare Dateien.",
        +  "items": {
        +    "$ref": "#/$defs/ResourceEntry"
        +  },
        +  "title": "Resources",
        +  "type": "array"
        +}
      • removedOutput schema / properties / result
        Removed value: -{
        -  "title": "Result",
        -  "type": "string"
        -}
      • addedOutput schema / properties / retrieved_at
        Added value: +{
        +  "description": "Abrufzeitpunkt (UTC, ISO 8601).",
        +  "title": "Retrieved At",
        +  "type": "string"
        +}
      • addedOutput schema / properties / source
        Added value: +{
        +  "default": "EnviDat / WSL (envidat.ch)",
        +  "description": "Datenquelle dieses Resultats.",
        +  "title": "Source",
        +  "type": "string"
        +}
      • addedOutput schema / properties / spatial
        Added value: +{
        +  "anyOf": [
        +    {
        +      "type": "string"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "default": null,
        +  "description": "Raeumliche Ausdehnung, GeoJSON als String wie von der Quelle geliefert.",
        +  "title": "Spatial"
        +}
      • addedOutput schema / properties / tags
        Added value: +{
        +  "description": "Schlagwoerter.",
        +  "items": {
        +    "type": "string"
        +  },
        +  "title": "Tags",
        +  "type": "array"
        +}
      • addedOutput schema / properties / title
        Added value: +{
        +  "anyOf": [
        +    {
        +      "type": "string"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "default": null,
        +  "description": "Titel.",
        +  "title": "Title"
        +}
      • addedOutput schema / properties / url
        Added value: +{
        +  "default": "",
        +  "description": "Permalink auf dem EnviDat-Portal.",
        +  "title": "Url",
        +  "type": "string"
        +}
      • removedOutput schema / required
        Removed value: -[
        -  "result"
        -]
      • changedOutput schema / title
        Previous value: -"wsl_get_datasetOutput"New value: +"DatasetDetail"
    • Changedwsl_get_forest_data14 fields changed
      • addedOutput schema / $defs
        Added value: +{
        +  "DatasetSummary": {
        +    "additionalProperties": false,
        +    "description": "Ein Datensatz in Listenform — die neun Felder des bisherigen JSON.",
        +    "properties": {
        +      "license": {
        +        "anyOf": [
        +          {
        +            "type": "string"
        +          },
        +          {
        +            "type": "null"
        +          }
        +        ],
        +        "default": null,
        +        "description": "Lizenz dieses Datensatzes.",
        +        "title": "License"
        +      },
        +      "modified": {
        +        "default": "",
        +        "description": "Letzte Aenderung (YYYY-MM-DD).",
        +        "title": "Modified",
        +        "type": "string"
        +      },
        +      "name": {
        +        "anyOf": [
        +          {
        +            "type": "string"
        +          },
        +          {
        +            "type": "null"
        +          }
        +        ],
        +        "default": null,
        +        "description": "Slug (URL-Name) des Datensatzes.",
        +        "title": "Name"
        +      },
        +      "notes": {
        +        "default": "",
        +        "description": "Beschreibung, auf 300 Zeichen gekuerzt.",
        +        "title": "Notes",
        +        "type": "string"
        +      },
        +      "org": {
        +        "anyOf": [
        +          {
        +            "type": "string"
        +          },
        +          {
        +            "type": "null"
        +          }
        +        ],
        +        "default": null,
        +        "description": "Slug der Forschungseinheit.",
        +        "title": "Org"
        +      },
        +      "resources": {
        +        "default": 0,
        +        "description": "Anzahl herunterladbarer Ressourcen.",
        +        "title": "Resources",
        +        "type": "integer"
        +      },
        +      "tags": {
        +        "description": "Schlagwoerter.",
        +        "items": {
        +          "type": "string"
        +        },
        +        "title": "Tags",
        +        "type": "array"
        +      },
        +      "title": {
        +        "anyOf": [
        +          {
        +            "type": "string"
        +          },
        +          {
        +            "type": "null"
        +          }
        +        ],
        +        "default": null,
        +        "description": "Titel des Datensatzes.",
        +        "title": "Title"
        +      },
        +      "url": {
        +        "default": "",
        +        "description": "Permalink auf dem EnviDat-Portal.",
        +        "title": "Url",
        +        "type": "string"
        +      }
        +    },
        +    "title": "DatasetSummary",
        +    "type": "object"
        +  }
        +}
      • addedOutput schema / additionalProperties
        Added value: +false
      • addedOutput schema / description
        Added value: +"Resultat aller listenliefernden Such-Tools."
      • addedOutput schema / properties / datasets
        Added value: +{
        +  "description": "Die Treffer.",
        +  "items": {
        +    "$ref": "#/$defs/DatasetSummary"
        +  },
        +  "title": "Datasets",
        +  "type": "array"
        +}
      • addedOutput schema / properties / license
        Added value: +{
        +  "default": "various open licenses per dataset — see metadata",
        +  "description": "Lizenzlage; die genaue Lizenz steht je Datensatz.",
        +  "title": "License",
        +  "type": "string"
        +}
      • addedOutput schema / properties / provenance
        Added value: +{
        +  "default": "live_api",
        +  "description": "Herkunftsart: 'live_api' = direkt bei der Quelle abgefragt.",
        +  "title": "Provenance",
        +  "type": "string"
        +}
      • removedOutput schema / properties / result
        Removed value: -{
        -  "title": "Result",
        -  "type": "string"
        -}
      • addedOutput schema / properties / retrieved_at
        Added value: +{
        +  "description": "Abrufzeitpunkt (UTC, ISO 8601).",
        +  "title": "Retrieved At",
        +  "type": "string"
        +}
      • addedOutput schema / properties / shown
        Added value: +{
        +  "default": 0,
        +  "description": "Davon in diesem Resultat enthalten.",
        +  "title": "Shown",
        +  "type": "integer"
        +}
      • addedOutput schema / properties / source
        Added value: +{
        +  "default": "EnviDat / WSL (envidat.ch)",
        +  "description": "Datenquelle dieses Resultats.",
        +  "title": "Source",
        +  "type": "string"
        +}
      • addedOutput schema / properties / suggested_tags
        Added value: +{
        +  "description": "ARCH-003: verwandte Tags bei leerem Resultat. Im Textkanal stehen sie seit jeher als Prosa; hier stehen sie als Liste.",
        +  "items": {
        +    "type": "string"
        +  },
        +  "title": "Suggested Tags",
        +  "type": "array"
        +}
      • addedOutput schema / properties / total_found
        Added value: +{
        +  "default": 0,
        +  "description": "Gesamtzahl der Treffer in der Quelle.",
        +  "title": "Total Found",
        +  "type": "integer"
        +}
      • removedOutput schema / required
        Removed value: -[
        -  "result"
        -]
      • changedOutput schema / title
        Previous value: -"wsl_get_forest_dataOutput"New value: +"SearchOutput"
    • Changedwsl_get_naturgefahren_data14 fields changed
      • addedOutput schema / $defs
        Added value: +{
        +  "DatasetSummary": {
        +    "additionalProperties": false,
        +    "description": "Ein Datensatz in Listenform — die neun Felder des bisherigen JSON.",
        +    "properties": {
        +      "license": {
        +        "anyOf": [
        +          {
        +            "type": "string"
        +          },
        +          {
        +            "type": "null"
        +          }
        +        ],
        +        "default": null,
        +        "description": "Lizenz dieses Datensatzes.",
        +        "title": "License"
        +      },
        +      "modified": {
        +        "default": "",
        +        "description": "Letzte Aenderung (YYYY-MM-DD).",
        +        "title": "Modified",
        +        "type": "string"
        +      },
        +      "name": {
        +        "anyOf": [
        +          {
        +            "type": "string"
        +          },
        +          {
        +            "type": "null"
        +          }
        +        ],
        +        "default": null,
        +        "description": "Slug (URL-Name) des Datensatzes.",
        +        "title": "Name"
        +      },
        +      "notes": {
        +        "default": "",
        +        "description": "Beschreibung, auf 300 Zeichen gekuerzt.",
        +        "title": "Notes",
        +        "type": "string"
        +      },
        +      "org": {
        +        "anyOf": [
        +          {
        +            "type": "string"
        +          },
        +          {
        +            "type": "null"
        +          }
        +        ],
        +        "default": null,
        +        "description": "Slug der Forschungseinheit.",
        +        "title": "Org"
        +      },
        +      "resources": {
        +        "default": 0,
        +        "description": "Anzahl herunterladbarer Ressourcen.",
        +        "title": "Resources",
        +        "type": "integer"
        +      },
        +      "tags": {
        +        "description": "Schlagwoerter.",
        +        "items": {
        +          "type": "string"
        +        },
        +        "title": "Tags",
        +        "type": "array"
        +      },
        +      "title": {
        +        "anyOf": [
        +          {
        +            "type": "string"
        +          },
        +          {
        +            "type": "null"
        +          }
        +        ],
        +        "default": null,
        +        "description": "Titel des Datensatzes.",
        +        "title": "Title"
        +      },
        +      "url": {
        +        "default": "",
        +        "description": "Permalink auf dem EnviDat-Portal.",
        +        "title": "Url",
        +        "type": "string"
        +      }
        +    },
        +    "title": "DatasetSummary",
        +    "type": "object"
        +  }
        +}
      • addedOutput schema / additionalProperties
        Added value: +false
      • addedOutput schema / description
        Added value: +"Resultat aller listenliefernden Such-Tools."
      • addedOutput schema / properties / datasets
        Added value: +{
        +  "description": "Die Treffer.",
        +  "items": {
        +    "$ref": "#/$defs/DatasetSummary"
        +  },
        +  "title": "Datasets",
        +  "type": "array"
        +}
      • addedOutput schema / properties / license
        Added value: +{
        +  "default": "various open licenses per dataset — see metadata",
        +  "description": "Lizenzlage; die genaue Lizenz steht je Datensatz.",
        +  "title": "License",
        +  "type": "string"
        +}
      • addedOutput schema / properties / provenance
        Added value: +{
        +  "default": "live_api",
        +  "description": "Herkunftsart: 'live_api' = direkt bei der Quelle abgefragt.",
        +  "title": "Provenance",
        +  "type": "string"
        +}
      • removedOutput schema / properties / result
        Removed value: -{
        -  "title": "Result",
        -  "type": "string"
        -}
      • addedOutput schema / properties / retrieved_at
        Added value: +{
        +  "description": "Abrufzeitpunkt (UTC, ISO 8601).",
        +  "title": "Retrieved At",
        +  "type": "string"
        +}
      • addedOutput schema / properties / shown
        Added value: +{
        +  "default": 0,
        +  "description": "Davon in diesem Resultat enthalten.",
        +  "title": "Shown",
        +  "type": "integer"
        +}
      • addedOutput schema / properties / source
        Added value: +{
        +  "default": "EnviDat / WSL (envidat.ch)",
        +  "description": "Datenquelle dieses Resultats.",
        +  "title": "Source",
        +  "type": "string"
        +}
      • addedOutput schema / properties / suggested_tags
        Added value: +{
        +  "description": "ARCH-003: verwandte Tags bei leerem Resultat. Im Textkanal stehen sie seit jeher als Prosa; hier stehen sie als Liste.",
        +  "items": {
        +    "type": "string"
        +  },
        +  "title": "Suggested Tags",
        +  "type": "array"
        +}
      • addedOutput schema / properties / total_found
        Added value: +{
        +  "default": 0,
        +  "description": "Gesamtzahl der Treffer in der Quelle.",
        +  "title": "Total Found",
        +  "type": "integer"
        +}
      • removedOutput schema / required
        Removed value: -[
        -  "result"
        -]
      • changedOutput schema / title
        Previous value: -"wsl_get_naturgefahren_dataOutput"New value: +"SearchOutput"
    • Changedwsl_get_organization15 fields changed
      • addedOutput schema / $defs
        Added value: +{
        +  "DatasetRef": {
        +    "additionalProperties": false,
        +    "description": "Ein Datensatz-Verweis innerhalb einer Organisation.",
        +    "properties": {
        +      "modified": {
        +        "default": "",
        +        "description": "Letzte Aenderung (YYYY-MM-DD).",
        +        "title": "Modified",
        +        "type": "string"
        +      },
        +      "name": {
        +        "anyOf": [
        +          {
        +            "type": "string"
        +          },
        +          {
        +            "type": "null"
        +          }
        +        ],
        +        "default": null,
        +        "description": "Slug.",
        +        "title": "Name"
        +      },
        +      "title": {
        +        "anyOf": [
        +          {
        +            "type": "string"
        +          },
        +          {
        +            "type": "null"
        +          }
        +        ],
        +        "default": null,
        +        "description": "Titel.",
        +        "title": "Title"
        +      },
        +      "url": {
        +        "default": "",
        +        "description": "Permalink.",
        +        "title": "Url",
        +        "type": "string"
        +      }
        +    },
        +    "title": "DatasetRef",
        +    "type": "object"
        +  }
        +}
      • addedOutput schema / additionalProperties
        Added value: +false
      • addedOutput schema / description
        Added value: +"Resultat von `wsl_get_organization`."
      • addedOutput schema / properties / datasets
        Added value: +{
        +  "description": "Datensaetze der Einheit. Der Textkanal zeigt hoechstens zehn; hier steht, was die Quelle geliefert hat.",
        +  "items": {
        +    "$ref": "#/$defs/DatasetRef"
        +  },
        +  "title": "Datasets",
        +  "type": "array"
        +}
      • addedOutput schema / properties / description
        Added value: +{
        +  "default": "",
        +  "description": "Beschreibung.",
        +  "title": "Description",
        +  "type": "string"
        +}
      • addedOutput schema / properties / license
        Added value: +{
        +  "default": "various open licenses per dataset — see metadata",
        +  "description": "Lizenzlage; die genaue Lizenz steht je Datensatz.",
        +  "title": "License",
        +  "type": "string"
        +}
      • addedOutput schema / properties / name
        Added value: +{
        +  "anyOf": [
        +    {
        +      "type": "string"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "default": null,
        +  "description": "Slug der Einheit.",
        +  "title": "Name"
        +}
      • addedOutput schema / properties / package_count
        Added value: +{
        +  "default": 0,
        +  "description": "Anzahl Datensaetze insgesamt.",
        +  "title": "Package Count",
        +  "type": "integer"
        +}
      • addedOutput schema / properties / provenance
        Added value: +{
        +  "default": "live_api",
        +  "description": "Herkunftsart: 'live_api' = direkt bei der Quelle abgefragt.",
        +  "title": "Provenance",
        +  "type": "string"
        +}
      • removedOutput schema / properties / result
        Removed value: -{
        -  "title": "Result",
        -  "type": "string"
        -}
      • addedOutput schema / properties / retrieved_at
        Added value: +{
        +  "description": "Abrufzeitpunkt (UTC, ISO 8601).",
        +  "title": "Retrieved At",
        +  "type": "string"
        +}
      • addedOutput schema / properties / source
        Added value: +{
        +  "default": "EnviDat / WSL (envidat.ch)",
        +  "description": "Datenquelle dieses Resultats.",
        +  "title": "Source",
        +  "type": "string"
        +}
      • addedOutput schema / properties / title
        Added value: +{
        +  "anyOf": [
        +    {
        +      "type": "string"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "default": null,
        +  "description": "Ausgeschriebener Name.",
        +  "title": "Title"
        +}
      • removedOutput schema / required
        Removed value: -[
        -  "result"
        -]
      • changedOutput schema / title
        Previous value: -"wsl_get_organizationOutput"New value: +"OrganizationDetail"
    • Changedwsl_get_recent_datasets14 fields changed
      • addedOutput schema / $defs
        Added value: +{
        +  "DatasetSummary": {
        +    "additionalProperties": false,
        +    "description": "Ein Datensatz in Listenform — die neun Felder des bisherigen JSON.",
        +    "properties": {
        +      "license": {
        +        "anyOf": [
        +          {
        +            "type": "string"
        +          },
        +          {
        +            "type": "null"
        +          }
        +        ],
        +        "default": null,
        +        "description": "Lizenz dieses Datensatzes.",
        +        "title": "License"
        +      },
        +      "modified": {
        +        "default": "",
        +        "description": "Letzte Aenderung (YYYY-MM-DD).",
        +        "title": "Modified",
        +        "type": "string"
        +      },
        +      "name": {
        +        "anyOf": [
        +          {
        +            "type": "string"
        +          },
        +          {
        +            "type": "null"
        +          }
        +        ],
        +        "default": null,
        +        "description": "Slug (URL-Name) des Datensatzes.",
        +        "title": "Name"
        +      },
        +      "notes": {
        +        "default": "",
        +        "description": "Beschreibung, auf 300 Zeichen gekuerzt.",
        +        "title": "Notes",
        +        "type": "string"
        +      },
        +      "org": {
        +        "anyOf": [
        +          {
        +            "type": "string"
        +          },
        +          {
        +            "type": "null"
        +          }
        +        ],
        +        "default": null,
        +        "description": "Slug der Forschungseinheit.",
        +        "title": "Org"
        +      },
        +      "resources": {
        +        "default": 0,
        +        "description": "Anzahl herunterladbarer Ressourcen.",
        +        "title": "Resources",
        +        "type": "integer"
        +      },
        +      "tags": {
        +        "description": "Schlagwoerter.",
        +        "items": {
        +          "type": "string"
        +        },
        +        "title": "Tags",
        +        "type": "array"
        +      },
        +      "title": {
        +        "anyOf": [
        +          {
        +            "type": "string"
        +          },
        +          {
        +            "type": "null"
        +          }
        +        ],
        +        "default": null,
        +        "description": "Titel des Datensatzes.",
        +        "title": "Title"
        +      },
        +      "url": {
        +        "default": "",
        +        "description": "Permalink auf dem EnviDat-Portal.",
        +        "title": "Url",
        +        "type": "string"
        +      }
        +    },
        +    "title": "DatasetSummary",
        +    "type": "object"
        +  }
        +}
      • addedOutput schema / additionalProperties
        Added value: +false
      • addedOutput schema / description
        Added value: +"Resultat aller listenliefernden Such-Tools."
      • addedOutput schema / properties / datasets
        Added value: +{
        +  "description": "Die Treffer.",
        +  "items": {
        +    "$ref": "#/$defs/DatasetSummary"
        +  },
        +  "title": "Datasets",
        +  "type": "array"
        +}
      • addedOutput schema / properties / license
        Added value: +{
        +  "default": "various open licenses per dataset — see metadata",
        +  "description": "Lizenzlage; die genaue Lizenz steht je Datensatz.",
        +  "title": "License",
        +  "type": "string"
        +}
      • addedOutput schema / properties / provenance
        Added value: +{
        +  "default": "live_api",
        +  "description": "Herkunftsart: 'live_api' = direkt bei der Quelle abgefragt.",
        +  "title": "Provenance",
        +  "type": "string"
        +}
      • removedOutput schema / properties / result
        Removed value: -{
        -  "title": "Result",
        -  "type": "string"
        -}
      • addedOutput schema / properties / retrieved_at
        Added value: +{
        +  "description": "Abrufzeitpunkt (UTC, ISO 8601).",
        +  "title": "Retrieved At",
        +  "type": "string"
        +}
      • addedOutput schema / properties / shown
        Added value: +{
        +  "default": 0,
        +  "description": "Davon in diesem Resultat enthalten.",
        +  "title": "Shown",
        +  "type": "integer"
        +}
      • addedOutput schema / properties / source
        Added value: +{
        +  "default": "EnviDat / WSL (envidat.ch)",
        +  "description": "Datenquelle dieses Resultats.",
        +  "title": "Source",
        +  "type": "string"
        +}
      • addedOutput schema / properties / suggested_tags
        Added value: +{
        +  "description": "ARCH-003: verwandte Tags bei leerem Resultat. Im Textkanal stehen sie seit jeher als Prosa; hier stehen sie als Liste.",
        +  "items": {
        +    "type": "string"
        +  },
        +  "title": "Suggested Tags",
        +  "type": "array"
        +}
      • addedOutput schema / properties / total_found
        Added value: +{
        +  "default": 0,
        +  "description": "Gesamtzahl der Treffer in der Quelle.",
        +  "title": "Total Found",
        +  "type": "integer"
        +}
      • removedOutput schema / required
        Removed value: -[
        -  "result"
        -]
      • changedOutput schema / title
        Previous value: -"wsl_get_recent_datasetsOutput"New value: +"SearchOutput"
    • Changedwsl_list_organizations12 fields changed
      • addedOutput schema / $defs
        Added value: +{
        +  "OrganizationSummary": {
        +    "additionalProperties": false,
        +    "description": "Eine WSL-Forschungseinheit in Listenform.",
        +    "properties": {
        +      "description": {
        +        "default": "",
        +        "description": "Kurzbeschreibung.",
        +        "title": "Description",
        +        "type": "string"
        +      },
        +      "name": {
        +        "anyOf": [
        +          {
        +            "type": "string"
        +          },
        +          {
        +            "type": "null"
        +          }
        +        ],
        +        "default": null,
        +        "description": "Slug der Einheit.",
        +        "title": "Name"
        +      },
        +      "package_count": {
        +        "default": 0,
        +        "description": "Anzahl publizierter Datensaetze.",
        +        "title": "Package Count",
        +        "type": "integer"
        +      },
        +      "title": {
        +        "anyOf": [
        +          {
        +            "type": "string"
        +          },
        +          {
        +            "type": "null"
        +          }
        +        ],
        +        "default": null,
        +        "description": "Ausgeschriebener Name.",
        +        "title": "Title"
        +      }
        +    },
        +    "title": "OrganizationSummary",
        +    "type": "object"
        +  }
        +}
      • addedOutput schema / additionalProperties
        Added value: +false
      • addedOutput schema / description
        Added value: +"Resultat von `wsl_list_organizations`."
      • addedOutput schema / properties / license
        Added value: +{
        +  "default": "various open licenses per dataset — see metadata",
        +  "description": "Lizenzlage; die genaue Lizenz steht je Datensatz.",
        +  "title": "License",
        +  "type": "string"
        +}
      • addedOutput schema / properties / organizations
        Added value: +{
        +  "description": "Die Einheiten, nach Datensatzzahl absteigend.",
        +  "items": {
        +    "$ref": "#/$defs/OrganizationSummary"
        +  },
        +  "title": "Organizations",
        +  "type": "array"
        +}
      • addedOutput schema / properties / provenance
        Added value: +{
        +  "default": "live_api",
        +  "description": "Herkunftsart: 'live_api' = direkt bei der Quelle abgefragt.",
        +  "title": "Provenance",
        +  "type": "string"
        +}
      • removedOutput schema / properties / result
        Removed value: -{
        -  "title": "Result",
        -  "type": "string"
        -}
      • addedOutput schema / properties / retrieved_at
        Added value: +{
        +  "description": "Abrufzeitpunkt (UTC, ISO 8601).",
        +  "title": "Retrieved At",
        +  "type": "string"
        +}
      • addedOutput schema / properties / source
        Added value: +{
        +  "default": "EnviDat / WSL (envidat.ch)",
        +  "description": "Datenquelle dieses Resultats.",
        +  "title": "Source",
        +  "type": "string"
        +}
      • addedOutput schema / properties / total
        Added value: +{
        +  "default": 0,
        +  "description": "Anzahl Forschungseinheiten.",
        +  "title": "Total",
        +  "type": "integer"
        +}
      • removedOutput schema / required
        Removed value: -[
        -  "result"
        -]
      • changedOutput schema / title
        Previous value: -"wsl_list_organizationsOutput"New value: +"OrganizationListOutput"
    • Changedwsl_list_tags13 fields changed
      • addedOutput schema / additionalProperties
        Added value: +false
      • addedOutput schema / description
        Added value: +"Resultat von `wsl_list_tags`."
      • addedOutput schema / properties / license
        Added value: +{
        +  "default": "various open licenses per dataset — see metadata",
        +  "description": "Lizenzlage; die genaue Lizenz steht je Datensatz.",
        +  "title": "License",
        +  "type": "string"
        +}
      • addedOutput schema / properties / provenance
        Added value: +{
        +  "default": "live_api",
        +  "description": "Herkunftsart: 'live_api' = direkt bei der Quelle abgefragt.",
        +  "title": "Provenance",
        +  "type": "string"
        +}
      • addedOutput schema / properties / query
        Added value: +{
        +  "anyOf": [
        +    {
        +      "type": "string"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "default": null,
        +  "description": "Das angefragte Praefix, falls gesetzt.",
        +  "title": "Query"
        +}
      • removedOutput schema / properties / result
        Removed value: -{
        -  "title": "Result",
        -  "type": "string"
        -}
      • addedOutput schema / properties / retrieved_at
        Added value: +{
        +  "description": "Abrufzeitpunkt (UTC, ISO 8601).",
        +  "title": "Retrieved At",
        +  "type": "string"
        +}
      • addedOutput schema / properties / shown
        Added value: +{
        +  "default": 0,
        +  "description": "Davon nach `limit` enthalten.",
        +  "title": "Shown",
        +  "type": "integer"
        +}
      • addedOutput schema / properties / source
        Added value: +{
        +  "default": "EnviDat / WSL (envidat.ch)",
        +  "description": "Datenquelle dieses Resultats.",
        +  "title": "Source",
        +  "type": "string"
        +}
      • addedOutput schema / properties / tags
        Added value: +{
        +  "description": "Die Schlagwoerter.",
        +  "items": {
        +    "type": "string"
        +  },
        +  "title": "Tags",
        +  "type": "array"
        +}
      • addedOutput schema / properties / total
        Added value: +{
        +  "default": 0,
        +  "description": "Wie viele Tags die Quelle zurueckgab.",
        +  "title": "Total",
        +  "type": "integer"
        +}
      • removedOutput schema / required
        Removed value: -[
        -  "result"
        -]
      • changedOutput schema / title
        Previous value: -"wsl_list_tagsOutput"New value: +"TagListOutput"
    • Changedwsl_search14 fields changed
      • addedOutput schema / $defs
        Added value: +{
        +  "DatasetSummary": {
        +    "additionalProperties": false,
        +    "description": "Ein Datensatz in Listenform — die neun Felder des bisherigen JSON.",
        +    "properties": {
        +      "license": {
        +        "anyOf": [
        +          {
        +            "type": "string"
        +          },
        +          {
        +            "type": "null"
        +          }
        +        ],
        +        "default": null,
        +        "description": "Lizenz dieses Datensatzes.",
        +        "title": "License"
        +      },
        +      "modified": {
        +        "default": "",
        +        "description": "Letzte Aenderung (YYYY-MM-DD).",
        +        "title": "Modified",
        +        "type": "string"
        +      },
        +      "name": {
        +        "anyOf": [
        +          {
        +            "type": "string"
        +          },
        +          {
        +            "type": "null"
        +          }
        +        ],
        +        "default": null,
        +        "description": "Slug (URL-Name) des Datensatzes.",
        +        "title": "Name"
        +      },
        +      "notes": {
        +        "default": "",
        +        "description": "Beschreibung, auf 300 Zeichen gekuerzt.",
        +        "title": "Notes",
        +        "type": "string"
        +      },
        +      "org": {
        +        "anyOf": [
        +          {
        +            "type": "string"
        +          },
        +          {
        +            "type": "null"
        +          }
        +        ],
        +        "default": null,
        +        "description": "Slug der Forschungseinheit.",
        +        "title": "Org"
        +      },
        +      "resources": {
        +        "default": 0,
        +        "description": "Anzahl herunterladbarer Ressourcen.",
        +        "title": "Resources",
        +        "type": "integer"
        +      },
        +      "tags": {
        +        "description": "Schlagwoerter.",
        +        "items": {
        +          "type": "string"
        +        },
        +        "title": "Tags",
        +        "type": "array"
        +      },
        +      "title": {
        +        "anyOf": [
        +          {
        +            "type": "string"
        +          },
        +          {
        +            "type": "null"
        +          }
        +        ],
        +        "default": null,
        +        "description": "Titel des Datensatzes.",
        +        "title": "Title"
        +      },
        +      "url": {
        +        "default": "",
        +        "description": "Permalink auf dem EnviDat-Portal.",
        +        "title": "Url",
        +        "type": "string"
        +      }
        +    },
        +    "title": "DatasetSummary",
        +    "type": "object"
        +  }
        +}
      • addedOutput schema / additionalProperties
        Added value: +false
      • addedOutput schema / description
        Added value: +"Resultat aller listenliefernden Such-Tools."
      • addedOutput schema / properties / datasets
        Added value: +{
        +  "description": "Die Treffer.",
        +  "items": {
        +    "$ref": "#/$defs/DatasetSummary"
        +  },
        +  "title": "Datasets",
        +  "type": "array"
        +}
      • addedOutput schema / properties / license
        Added value: +{
        +  "default": "various open licenses per dataset — see metadata",
        +  "description": "Lizenzlage; die genaue Lizenz steht je Datensatz.",
        +  "title": "License",
        +  "type": "string"
        +}
      • addedOutput schema / properties / provenance
        Added value: +{
        +  "default": "live_api",
        +  "description": "Herkunftsart: 'live_api' = direkt bei der Quelle abgefragt.",
        +  "title": "Provenance",
        +  "type": "string"
        +}
      • removedOutput schema / properties / result
        Removed value: -{
        -  "title": "Result",
        -  "type": "string"
        -}
      • addedOutput schema / properties / retrieved_at
        Added value: +{
        +  "description": "Abrufzeitpunkt (UTC, ISO 8601).",
        +  "title": "Retrieved At",
        +  "type": "string"
        +}
      • addedOutput schema / properties / shown
        Added value: +{
        +  "default": 0,
        +  "description": "Davon in diesem Resultat enthalten.",
        +  "title": "Shown",
        +  "type": "integer"
        +}
      • addedOutput schema / properties / source
        Added value: +{
        +  "default": "EnviDat / WSL (envidat.ch)",
        +  "description": "Datenquelle dieses Resultats.",
        +  "title": "Source",
        +  "type": "string"
        +}
      • addedOutput schema / properties / suggested_tags
        Added value: +{
        +  "description": "ARCH-003: verwandte Tags bei leerem Resultat. Im Textkanal stehen sie seit jeher als Prosa; hier stehen sie als Liste.",
        +  "items": {
        +    "type": "string"
        +  },
        +  "title": "Suggested Tags",
        +  "type": "array"
        +}
      • addedOutput schema / properties / total_found
        Added value: +{
        +  "default": 0,
        +  "description": "Gesamtzahl der Treffer in der Quelle.",
        +  "title": "Total Found",
        +  "type": "integer"
        +}
      • removedOutput schema / required
        Removed value: -[
        -  "result"
        -]
      • changedOutput schema / title
        Previous value: -"wsl_searchOutput"New value: +"SearchOutput"
  2. 10 tool updatesv0.2.0
    • First observedwsl_catalog_stats
    • First observedwsl_get_avalanche_data
    • First observedwsl_get_dataset
    • First observedwsl_get_forest_data
    • First observedwsl_get_naturgefahren_data
    • First observedwsl_get_organization
    • First observedwsl_get_recent_datasets
    • First observedwsl_list_organizations
    • First observedwsl_list_tags
    • First observedwsl_search

TDQS

A3.7/5.0

Scored across 10 tools

Disambiguation3/5

The general search and domain-specific data tools (wsl_get_avalanche_data, wsl_get_forest_data, wsl_get_naturgefahren_data) overlap with wsl_search, since they all return datasets filtered by topic. However, the domain-specific tools are clearly labeled and serve as convenient shortcuts, while wsl_search is the flexible unified search.

Naming Consistency4/5

Most tools follow a consistent wsl_<verb>_<object> pattern (wsl_search, wsl_get_dataset, wsl_list_organizations, wsl_get_organization, wsl_list_tags, wsl_get_recent_datasets, wsl_catalog_stats). The domain-specific data tools (wsl_get_avalanche_data, wsl_get_forest_data, wsl_get_naturgefahren_data) deviate slightly by using topic nouns instead of a consistent object type, but the pattern remains readable and predictable.

Tool Count4/5

10 tools is a reasonable size for a catalog search and retrieval server. The count is well within the typical range, though the three domain-specific data tools could arguably be consolidated into one parameterized tool without losing functionality.

Completeness4/5

The server covers the core EnviDat catalog workflow: search, get details, list organizations, get organization, list tags, recent datasets, and catalog stats. Minor gaps exist, such as no direct dataset download tool or no ability to filter by domain in a dedicated way, but the search tool with domain parameter covers most needs.

Maintenance

ActivityActive
ResponsivenessNo issues

Related MCP Connectors

Related MCP Servers

  • A
    license
    A
    quality
    A
    maintenance
    MCP server for Switzerland's national metadata catalogue, enabling AI agents to discover datasets, APIs, public services, and publishers through free-text search and structured queries.
    13
    MIT
  • A
    license
    Not graded
    quality
    A
    maintenance
    MCP server for querying MeteoSwiss open weather data, providing access to station data, forecasts, radar composites, and more via natural language.
    45 PyPI
    44
    MIT