Skip to main content
Glama

πŸ‡¨πŸ‡­ Part of the Swiss Public Data MCP Portfolio

swisstopo-mcp

Version License: MIT Python 3.11+ MCP No Auth Required CI

MCP server for Swiss federal geodata -- maps, elevation, geocoding, cadastral extracts, and downloadable datasets via Swisstopo APIs

πŸ‡©πŸ‡ͺ Deutsche Version


Overview

swisstopo-mcp gives AI assistants access to Switzerland's official geodata infrastructure through 20 tools, all without authentication:

Source

Data

API

Swisstopo REST API

500+ geodata layers (buildings, boundaries, land use)

REST/JSON

Geocoding

Official addresses, place names, postal codes

REST/JSON

Height Service

Elevation above sea level, elevation profiles

REST/JSON

STAC Catalog

Orthophotos, elevation models, 3D buildings

STAC 0.9

WMTS

National maps, aerial images, zoning maps

URL builder

OEREB Cadastre

Public-law restrictions, parcels

REST/JSON (cantonal)

geodienste.ch

Interkantonale Basisgeodaten (cadastral survey, contaminated sites, hazard maps, …)

OGC API Features / WMS / WFS

OpenStreetMap

Points of interest (schools, playgrounds, pharmacies, …)

Overpass API (ODbL)

OpenPLZ API

Administrative address level: postal codes β†’ commune (BFS number) β†’ district β†’ canton

REST/JSON (BFS + swisstopo OGD)

Anchor demo query: "Which communes are in the Uster district, and what are their BFS numbers for joining with BFS statistics data?" (The BFS commune number is the official join key to swiss-statistics-mcp and zurich-opendata-mcp β€” this is what turns a geodata wrapper into a semantic connector at the commune level.) β†’ More use cases by audience β†’

Demo

Demo: Claude using swisstopo_find_commune and swisstopo_lookup_postal_code


Related MCP server: wsl-envidat-mcp

Features

  • πŸ—ΊοΈ 20 tools (REST, Geocoding, Height, STAC, WMTS, OEREB, geodienste.ch, OpenStreetMap/Overpass, OpenPLZ)

  • πŸ›οΈ Resolve the administrative address level (PLZ β†’ commune/BFS number β†’ district β†’ canton) via OpenPLZ

  • πŸ” Geocode Swiss addresses and reverse-geocode coordinates

  • πŸ”οΈ Query elevation and compute elevation profiles

  • πŸ“¦ Discover and download geodatasets (orthophotos, 3D buildings, historical maps)

  • πŸ—οΈ Identify map features at coordinates across 500+ Swisstopo layers

  • πŸ”— Generate shareable map.geo.admin.ch links

  • πŸ“‹ Look up cadastral property IDs (EGRID) and retrieve OEREB extracts

  • πŸ”“ No API key required for all tools (OEREB extract needs a supported canton)

  • ☁️ Dual transport -- stdio (Claude Desktop) + Streamable HTTP (cloud)


Prerequisites

  • Python 3.11+

  • uv (recommended) or pip


Installation

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

# Install
pip install -e .
# or with uv:
uv pip install -e .

Or with uvx (no permanent installation):

uvx swisstopo-mcp

Quickstart

# stdio (for Claude Desktop)
python -m swisstopo_mcp.server

# Streamable HTTP (port 8000)
python -m swisstopo_mcp.server --http --port 8000

Try it immediately in Claude Desktop:

"Where is Bahnhofstrasse 1, Zurich? Give me the coordinates." "What is the elevation at the Uetliberg summit?" "What buildings are at coordinates 2683500, 1247500 (LV95)?"


Configuration

Claude Desktop

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

{
  "mcpServers": {
    "swisstopo": {
      "command": "python",
      "args": ["-m", "swisstopo_mcp.server"]
    }
  }
}

Or with uvx:

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

Config file locations:

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

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

Cloud Deployment (SSE for browser access)

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

Render.com (recommended):

  1. Push/fork the repository to GitHub

  2. On render.com: New Web Service -> connect GitHub repo

  3. Set start command: python -m swisstopo_mcp.server --http --port 8000

  4. In claude.ai under Settings -> MCP Servers, add: https://your-app.onrender.com/sse


Available Tools

REST API (Layer & Feature Queries)

Tool

Description

swisstopo_map_query

The national map catalogue (api3.geo.admin.ch). One operation per call β€” see the five below

swisstopo_zoning_at

Harmonised building zone at a coordinate β€” one call, no layer lookup (not legally binding)

swisstopo_municipality_at

Municipality, canton and official BFS number at a coordinate

swisstopo_map_query operations

operation

Answers

Required arguments

search_layers

Which layers exist for a keyword? (500+ catalogue)

query

layer_info

What fields can I query on this layer, and what is its legend?

layer

features_at_point

What is at this coordinate?

layers + a point (lat/lon or easting/northing)

features_by_attribute

Which features carry this value? (e.g. buildings by EGID)

layer, search_field, search_text

feature_by_id

Give me this one feature in full, with geometry

layer, feature_id

Arguments belonging to a different operation are rejected, not ignored β€” the error names the ones the chosen operation accepts. Silently dropping a misplaced search_field would return a plausible answer to a question nobody asked, which is the failure mode the whole envelope design is against.

Geocoding

Tool

Description

swisstopo_geocode

Convert Swiss addresses, place names, or postal codes to coordinates

swisstopo_reverse_geocode

Find the nearest address for given coordinates

Height Service

Tool

Description

swisstopo_get_height

Get elevation above sea level (m a.s.l.) at a coordinate

swisstopo_elevation_profile

Compute an elevation profile along a line

swisstopo_convert_coordinates

Official WGS84 ↔ LV95 conversion via the swisstopo REFRAME service

STAC Catalog (Geodata Downloads)

Tool

Description

swisstopo_search_geodata

Search the STAC catalog for downloadable geodatasets

swisstopo_get_collection

Get details and download links for a STAC collection

WMTS (Map URLs)

Tool

Description

swisstopo_map_url

Generate a map.geo.admin.ch URL for browser display

OEREB Cadastre

Tool

Description

swisstopo_get_egrid

Resolve a cadastral property ID (EGRID) from coordinates

swisstopo_get_oereb_extract

Retrieve public-law land-use restrictions (OEREB) for a parcel

Consolidated Geodata FaΓ§ade

One faΓ§ade over several map/layer sources, kept under the 25-tool budget (see docs/geodaten-erweiterung-phase1.md):

Tool

Description

swisstopo_list_available_layers

Discover layer keys for swisstopo_query_geodata (strassenverzeichnis, oereb-verfuegbarkeit, geodienste:<topic>:<canton>); filters to contract-free geodienste datasets

swisstopo_query_geodata

Query a chosen layer by point / bbox / commune β€” amtliches Strassenverzeichnis, interkantonale geodienste.ch data (OGC API Features), or Γ–REB availability

swisstopo_query_osm_features

OpenStreetMap POIs (schools, playgrounds, pharmacies, …) around a point via Overpass β€” separate source, ODbL (Β© OpenStreetMap contributors)

Administrative Address Level (OpenPLZ)

The amtliche address hierarchy PLZ β†’ commune β†’ district β†’ canton, served by the OpenPLZ API (data: BFS municipal directory + swisstopo street directory, Swiss OGD β€” a separate source and licence from the swisstopo geodata above). Every commune-bearing response exposes bfs_commune_number as a named top-level field: the official join key to BFS statistics (swiss-statistics-mcp) and zurich-opendata-mcp.

Tool

Description

swisstopo_lookup_postal_code

Resolve a Swiss postal code β†’ locality, commune (+BFS number), district, canton

swisstopo_find_commune

Resolve a commune both directions (name ↔ bfs_number) or list all communes of a canton / district. Accepts canton abbreviation (ZH) or key (1); resolution happens server-side

swisstopo_search_address

Full-text search over Swiss streets and localities, returning commune + BFS number per hit

Example Use Cases

Query

Tool

"Where is Bahnhofstrasse 1, Zurich?"

swisstopo_geocode

"What is the elevation at the Uetliberg summit?"

swisstopo_get_height

"What buildings are at coordinates 2683500, 1247500?"

swisstopo_map_query (operation='features_at_point')

"Find orthophoto datasets for download"

swisstopo_search_geodata

"Show me a map of Bern at zoom level 10"

swisstopo_map_url

"What restrictions apply to parcel at Musterstrasse 5?"

swisstopo_oereb_at

"Which schools are within 500 m of Bederstrasse 109, 8002 ZΓΌrich, and which streets lead there?"

swisstopo_query_osm_features + swisstopo_query_geodata (strassenverzeichnis)

"Which contaminated-sites data is free for canton ZH?"

swisstopo_list_available_layers + swisstopo_query_geodata (geodienste:kataster_belasteter_standorte:ZH)

"Which communes are in the Uster district and what are their BFS numbers?"

swisstopo_find_commune (district=109)

"Which commune and canton does postal code 8001 belong to?"

swisstopo_lookup_postal_code

"What is the BFS number of Winterthur (to join with BFS statistics)?"

swisstopo_find_commune (name=Winterthur)


Architecture

β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”     β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”     β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
β”‚   Claude / AI   │────▢│  swisstopo-mcp               │────▢│  Swisstopo REST API      β”‚
β”‚   (MCP Host)    │◀────│  (MCP Server)                │◀────│  api3.geo.admin.ch       β”‚
β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜     β”‚                              β”‚     β”œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€
                        β”‚  20 Tools                    │────▢│  Geocoding               β”‚
                        β”‚  Stdio | Streamable HTTP     │◀────│  api3.geo.admin.ch       β”‚
                        β”‚                              β”‚     β”œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€
                        β”‚  No authentication required  │────▢│  STAC Catalog            β”‚
                        β”‚  (all tools; OEREB canton opt) │◀────│  data.geo.admin.ch       β”‚
                        β”‚                              β”‚     β”œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€
                        β”‚                              │────▢│  OEREB Cadastre          β”‚
                        β”‚                              │◀────│  (cantonal endpoints)    β”‚
                        β”‚                              β”‚     β”œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€
                        β”‚                              │────▢│  geodienste.ch (OGC API) β”‚
                        β”‚                              │◀────│  overpass.osm.ch (ODbL)  β”‚
                        β”‚                              β”‚     β”œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€
                        β”‚  BFS-Nr = join key to        │────▢│  OpenPLZ API             β”‚
                        β”‚  swiss-statistics-mcp        │◀────│  openplzapi.org (BFS/OGD)β”‚
                        β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜     β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜

Project Structure

swisstopo-mcp/
β”œβ”€β”€ src/swisstopo_mcp/
β”‚   β”œβ”€β”€ __init__.py              # Package version
β”‚   β”œβ”€β”€ server.py                # MCP server wiring (tool registrations)
β”‚   β”œβ”€β”€ api_client.py            # Shared HTTP client (httpx + error handling)
β”‚   β”œβ”€β”€ geocoding.py             # swisstopo_geocode, swisstopo_reverse_geocode
β”‚   β”œβ”€β”€ rest_api.py              # swisstopo_map_query (5 operations), zoning_at, municipality_at
β”‚   β”œβ”€β”€ height.py                # swisstopo_get_height, swisstopo_elevation_profile
β”‚   β”œβ”€β”€ stac.py                  # swisstopo_search_geodata, swisstopo_get_collection
β”‚   β”œβ”€β”€ wmts.py                  # swisstopo_map_url
β”‚   β”œβ”€β”€ oereb.py                 # swisstopo_get_egrid, swisstopo_get_oereb_extract
β”‚   β”œβ”€β”€ geodata.py               # swisstopo_query_geodata + swisstopo_list_available_layers (faΓ§ade)
β”‚   β”œβ”€β”€ overpass.py              # swisstopo_query_osm_features (OpenStreetMap / Overpass)
β”‚   └── openplz.py               # swisstopo_lookup_postal_code, swisstopo_find_commune, swisstopo_search_address (OpenPLZ)
β”œβ”€β”€ tests/
β”‚   β”œβ”€β”€ test_api_client.py
β”‚   β”œβ”€β”€ test_geocoding.py
β”‚   β”œβ”€β”€ test_height.py
β”‚   β”œβ”€β”€ test_oereb.py
β”‚   β”œβ”€β”€ test_rest_api.py
β”‚   β”œβ”€β”€ test_stac.py
β”‚   β”œβ”€β”€ test_wmts.py
β”‚   β”œβ”€β”€ test_geodata.py
β”‚   β”œβ”€β”€ test_overpass.py
β”‚   β”œβ”€β”€ test_openplz.py
β”‚   └── test_retry.py
β”œβ”€β”€ .github/workflows/ci.yml     # GitHub Actions (Python 3.11/3.12/3.13)
β”œβ”€β”€ pyproject.toml
β”œβ”€β”€ CHANGELOG.md
β”œβ”€β”€ CONTRIBUTING.md               # Contribution guide (English)
β”œβ”€β”€ CONTRIBUTING.de.md            # Contribution guide (German)
β”œβ”€β”€ SECURITY.md                   # Security policy (English)
β”œβ”€β”€ SECURITY.de.md                # Security policy (German)
β”œβ”€β”€ LICENSE
β”œβ”€β”€ README.md                    # This file (English)
└── README.de.md                 # German version

Security & Limits

The full security policy and posture is documented in SECURITY.md.

Phase

This server is in Phase 2.5 β€” Consolidation of swiss-geodata-mcp (see docs/roadmap.md, the single authority for phase state).

Property

Status

Read tools

24, all readOnlyHint: true / destructiveHint: false

Write tools

none β€” Phase 3, not planned

Transport

stdio (default) and Streamable-HTTP

ISDS classification

docs/isds-dsg.md β€” low protection requirement

DSG processing record

not maintained, with reasons β€” docs/isds-dsg.md Β§5

Last audit

audits/2026-07-27T162602-Z-swisstopo-mcp/

A phase advance requires: the phase's roadmap items checked off, a re-run audit with no open critical findings, and a CHANGELOG entry naming the new phase. Phase 3 (write tools) additionally requires re-running the Lethal-Trifecta assessment and a security review before any implementation starts.

Tool budget and aggregation

20 tools against a self-imposed budget of 25. The check's ideal is ≀12, so the count still needs an argument, not just a number. Per cluster:

The five api3 tools are merged (0.4.1, breaking). search_layers, layer_info, identify_features, find_features and get_feature are now operation values on swisstopo_map_query. They were the textbook one-tool-per-REST-endpoint mapping the check names, and they are gone as such.

Earlier releases argued the opposite here, and the argument is worth keeping visible because it was not wrong so much as outweighed: merging relocates the decision from tool selection into schema navigation, where a model has less help, because tool descriptions are what it actually reads. Three things address that directly rather than hoping it does not matter:

  • The operations are named for questions, not endpoints. identify and find are ESRI vocabulary β€” they say which MapServer route is called, not what is being asked, and nobody without ArcGIS experience can tell them apart. features_at_point and features_by_attribute can be picked correctly from the operation list alone.

  • A misplaced argument is an error, not a silent drop. With five tools the schema made a wrong pairing impossible. With one tool it does not, so validation does: each operation declares the fields it accepts, and anything else is refused with a message naming the alternatives.

  • The note hints from ARCH-003 still name the next step, now as operations rather than tool names β€” an empty attribute search points at operation='layer_info' for the valid field names, and so on.

Observability was the other cost, and it is not paid: each operation keeps its own log and trace label (swisstopo_map_query:features_at_point), so per-operation timing and error rates survive the merge.

The two pairs that stay separate, both named by the audit:

  • geocode + reverse_geocode do hit the same SearchServer endpoint, so on the API axis this is a 1:1 mapping twice over. They stay separate on the axis that matters for tool selection: "address β†’ coordinates" and "coordinates β†’ address" are different questions with different input types, and collapsing them into one tool with a mode would make the model choose a variant instead of a tool. Sharing an endpoint is an implementation detail of the upstream.

  • search_geodata β†’ get_collection is a genuine search β†’ detail pair over STAC; see below.

The naming ambiguity is resolved, which the audit did not raise but the previous version of this section recorded for "the next breaking release" β€” this is it. swisstopo_search_layers and swisstopo_list_available_layers both said "layers" while fronting different catalogues. The first is now swisstopo_map_query with operation='search_layers', which puts the national catalogue in the tool name and leaves list_available_layers unambiguously the consolidated faΓ§ade.

Search β†’ detail pairs. search_geodata β†’ get_collection is a genuine pair: STAC collection metadata is large and callers usually want one of many search hits. get_egrid β†’ get_oereb_extract was the same shape and has been collapsed: swisstopo_oereb_at answers the actual question in one call and resolves the EGRID internally, because the EGRID is an upstream identifier rather than something a caller asked for. get_egrid remains for callers who want the parcel ID itself.

Genuine aggregation already in place. query_geodata fronts three sources behind one tool; zoning_at and municipality_at each collapse a discovery chain that previously took two calls.

When the next source is added, the choice is a raise or a consolidation. With the api3 five merged there is no obvious consolidation left holding headroom, so the next surface growth is a real conversation about the ceiling rather than a deferred cleanup. tests/test_tool_namespace.py::TestToolBudget is where that conversation is forced: raising the budget means editing the number there and in both READMEs.

Data sources and licences

Every response carries source and license. ARE is a different federal office from swisstopo, so its licence is asserted rather than inherited.

Source

Served by

Licence

swisstopo / geo.admin.ch

most tools

Swiss OGD (opendata.swiss)

swisstopo REFRAME (geodesy.geo.admin.ch)

swisstopo_convert_coordinates

Swiss OGD (opendata.swiss)

swissBOUNDARIES3D (swisstopo)

swisstopo_municipality_at

Swiss OGD (opendata.swiss)

ch.are.bauzonen (ARE)

swisstopo_zoning_at

Swiss OGD β€” Bundesamt fΓΌr Raumentwicklung ARE

Cantonal Γ–REB cadastre

swisstopo_get_egrid, swisstopo_get_oereb_extract, swisstopo_oereb_at, swisstopo_query_geodata

Cantonal Γ–REB terms

geodienste.ch (cantons)

swisstopo_query_geodata

Free use β€” attribution required

OpenStreetMap (Overpass)

swisstopo_query_osm_features

ODbL β€” Β© OpenStreetMap contributors

OpenPLZ (BFS + swisstopo)

swisstopo_lookup_postal_code, swisstopo_find_commune, swisstopo_search_address

Free use β€” attribution required

ch.are.bauzonen is a federal synthesis for cross-cantonal comparability and is not legally binding β€” only the cantonal or communal Nutzungsplanung is. That caveat is carried on every swisstopo_zoning_at result record.

Project structure

The tool modules sit flat under src/swisstopo_mcp/ rather than in a tools/ sub-package. Each module maps to exactly one upstream API family β€” rest_api.py β†’ api3 MapServer, stac.py β†’ STAC, oereb.py β†’ cantonal Γ–REB, openplz.py β†’ OpenPLZ, overpass.py β†’ OSM, coords.py β†’ REFRAME β€” which is the axis along which this server's code actually varies. A tools/ level would add a directory without adding a distinction.

server.py contains tool registrations only; every tool body lives in its domain module. Splitting it further is a readability question, not a structural one.

Lethal Trifecta assessment

Capability

Status

Rationale

Access to private data

❌ No

Public Open Data only (federal/cantonal geodata)

Exposure to untrusted content

⚠️ Limited

Reads only from a fixed allow-list of trusted geo.admin / OEREB hosts

External communication (write/send)

❌ No

Read-only; no mail/webhook/write tools

Trifecta score: at most 1 of 3 β€” safe by design.

Egress

Outbound requests are restricted to an explicit code-layer allow-list and redirects are disabled β€” see docs/network-egress.md.

Container deployment

For containerised HTTP deployments, a hardened Dockerfile and Kubernetes manifests (non-root, read-only root filesystem, dropped capabilities, egress NetworkPolicy) are provided β€” see docs/deployment.md.

MCP Protocol Version

The MCP protocol version is negotiated during initialize; the Python SDK does not expose an author-settable pin. As of mcp 1.28.1 the negotiated version is 2025-11-25 (mcp.types.LATEST_PROTOCOL_VERSION). The SDK is pinned to the 1.x major in pyproject.toml so an update cannot silently move it, and tests/test_protocol_version.py fails if it does β€” a Dependabot bump cannot change the protocol version unnoticed.

Update policy

  • SDK updates are tested on a feature branch before merge.

  • A change to the negotiated protocol version is recorded in CHANGELOG.md under ### Changed, naming the old and the new version.

  • A protocol change that breaks existing clients triggers a major release.

Sessions & Authentication

The server is unauthenticated by design β€” it serves only public open data. Over HTTP, session IDs are managed entirely by the FastMCP framework; there is no per-user state, so there is nothing user-specific to bind a session to. If an authenticated deployment is ever introduced, session IDs must be bound to the validated user identity (audit finding SEC-009).

Error handling

  • Execution errors (upstream failure, invalid value) are returned as a ToolResponse with is_error: true and a user-friendly summary; unexpected exception text is masked and logged to stderr instead. No upstream body or internal configuration is forwarded: Overpass error pages are classified against a fixed signature table, and an egress refusal returns a fixed message rather than the allow-list (OBS-002).

  • Protocol errors (unknown tool, malformed/invalid arguments) come back from the SDK as tool results with the protocol isError flag set β€” not as JSON-RPC error objects. Verified against mcp 1.28.1 by runtime probe; an earlier version of this section claimed -32602 and was wrong. Input validation happens at the Pydantic boundary (SEC-018).

  • Both flags agree. A handled execution error sets the protocol isError flag and the payload field is_error, so a client can branch on either. The envelope β€” including source and license β€” survives on the error path (OBS-001).

MCP Primitives

Tools are the surface, and almost all of it: every result is a live, parameterised API query rather than a static addressable document.

One Resource β€” swisstopo://catalogue/layers β€” serves the faΓ§ade layer catalogue. It is the one thing here that behaves like a document: deterministic, idempotent, and already served with provenance: "cached". swisstopo_list_available_layers remains for filtered queries; the resource is for a client that wants the catalogue itself, addressably.

Two Prompts encode the workflows below, including the precedence rule for point questions. That rule lives in the tool descriptions and in the server instructions too, but a prompt is the one place a model reads it as guidance rather than as one of 24 descriptions (audit ARCH-007/ARCH-008):

Prompt

Arguments

swisstopo_feature_lookup

ort, was

swisstopo_geodata_download

thema

Tool workflows

Most tools return a thought-complete result in a single call. Two domains use a short, documented discovery chain (each tool's description states the next step):

  • Feature query: all four steps are swisstopo_map_query with a different operation: search_layers (find layer IDs) β†’ layer_info (see the queryable fields) β†’ features_at_point / features_by_attribute β†’ feature_by_id (full detail).

  • Cadastre: swisstopo_geocode β†’ swisstopo_oereb_at (one call: coordinates β†’ EGRID β†’ extract). Use swisstopo_get_egrid β†’ swisstopo_get_oereb_extract only when the parcel ID itself is wanted.

  • Downloads: swisstopo_search_geodata β†’ swisstopo_get_collection.


Response Format

Every tool returns a structured ToolResponse (FastMCP emits it as structured content with an output schema, plus a JSON text block):

Field

Meaning

summary

Human-readable Markdown summary

results

Machine-readable structured records

count

Number of results

match_type

exact / fuzzy / none (search-style tools)

source / license

Data attribution (OGD-CH, CC/OGD terms)

provenance / retrieved_at

How and when the data was obtained

is_error

true for handled errors


Known Limitations

  • OEREB tools require a canton parameter; not all cantons expose the same API format

  • STAC catalog uses Swisstopo's v0.9 endpoint; some collections may lack complete metadata

  • Geocoding covers Swiss addresses only (no Liechtenstein)

  • Rate limits are enforced by Swisstopo; high-frequency usage may be throttled

Known findings β€” OpenPLZ live probe (2026-07-20)

The OpenPLZ endpoints were probed live before implementation. Findings baked into the tools:

Endpoint / behaviour

Result

Handling

/Cantons

200, 26 records, key = BFS canton number (ZH = 1)

canton abbreviation resolved from this list

/Cantons/{key}/Districts|Communes

200

path param is the numeric key

/Cantons/ZH/Districts (abbreviation)

200 + [] β€” not an error

ZH→1 resolved server-side; empty answer gets an explanatory note

/Localities?postalCode=8001

200, commune.key = 261 (BFS ZΓΌrich)

bfs_commune_number surfaced top-level

/Localities?postalCode=9999 (unknown)

200 + []

reported as a note β€” empty β‰  absent

list endpoints pagination

default pageSize=10, hard max 50 (100 β†’ HTTP 400)

tools iterate pages via x-total-count

raw umlaut in query (?name=ZΓΌrich)

HTTP 400

httpx URL-encodes params automatically

historicalCode field

β‰  key for communes (historized-directory id)

not used; the join key is the current key

bulk dump

none from OpenPLZ (only /swagger)

Architecture A (live-API-only) β€” adequate for a lookup connector

The abbreviation-vs-key trap in one line: an empty OpenPLZ list is almost never proof that something does not exist β€” it usually means a wrong path parameter (an abbreviation where a numeric key was expected). The tools resolve abbreviations server-side and annotate every empty result.


Testing

# Unit tests (no network required)
pytest tests/ -m "not live"

# Integration tests (live API calls)
pytest tests/ -m "live"

Changelog

See CHANGELOG.md


Contributing

See CONTRIBUTING.md


Security

Read-only, no authentication, public geodata only. See SECURITY.md (Deutsch) for the security posture and how to report a vulnerability.


License

MIT License -- see LICENSE

Data provided by swisstopo under Open Government Data terms.


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

Available Tools

20 tools
swisstopo_convert_coordinatesA
Read-onlyIdempotent

Rechnet Koordinaten amtlich zwischen WGS84 und LV95 um (swisstopo REFRAME).

Wenn Koordinaten in LV95 (EPSG:2056) vorliegen und fΓΌr die ΓΌbrigen Tools nach WGS84 gebracht werden mΓΌssen β€” oder umgekehrt fΓΌr den Katasterbezug, wo Zentimeter zΓ€hlen. Achsenreihenfolge beachten: REFRAME benennt beide Eingaben easting/northing. Bei wgs84_to_lv95 ist easting der LΓ„NGENgrad und northing der BREITENgrad β€” umgekehrt zur lat/lon-Reihenfolge der ΓΌbrigen Tools. Vertauschte Achsen werden abgewiesen, nicht stillschweigend umgerechnet.

ParametersJSON Schema
NameRequiredDescriptionDefault
paramsYes

Output Schema

ParametersJSON Schema
NameRequiredDescription
noteNoActionable hint when a search returns nothing β€” what to try next, rather than a bare negative (audit ARCH-003).
countNoNumber of structured results.
sourceNoData source attribution.
licenseNoData licence.
resultsNoStructured result records (machine-readable).
summaryYesHuman-readable Markdown summary of the result.
is_errorNoTrue if this represents a handled error.
match_typeNoexact | fuzzy | none (for search-style tools).
provenanceNoHow the data was obtained.
retrieved_atNoISO-8601 retrieval timestamp.

TDQS

A4.7/5.0
Behavior5/5

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

Die Annotationen liefern bereits readOnlyHint, idempotentHint und destructiveHint=false. Die Beschreibung ergΓ€nzt darΓΌber hinaus das kritische Verhalten: die Achsenreihenfolge je Richtung und dass vertauschte Achsen abgewiesen statt stillschweigend umgerechnet werden. Das geht deutlich ΓΌber die Annotationen hinaus.

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?

Die Beschreibung ist kurz, in use_case und important_notes strukturiert und enthΓ€lt keine ΓΌberflΓΌssigen Wiederholungen. Jeder der drei Abschnitte liefert direkt verwertbare Information.

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

Completeness5/5

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

Angesichts eines vorhandenen Output-Schemas und der ausfΓΌhrlichen Annotationen deckt die Beschreibung alle relevanten Aspekte ab: Anwendungsfall, Richtung, Achsenfehler und Fehlerverhalten. FΓΌr einen koordinatenbasierten Umrechnungs-Tool ist sie damit vollstΓ€ndig.

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?

Obwohl das Tool-Schema laut Signal eine Beschreibungsabdeckung von 0% hat, enthΓ€lt die Tool-Beschreibung die wichtigste Parameter-Semantik: easting/northing sind richtungsabhΓ€ngig, und bei wgs84_to_lv95 ist easting der LΓ€ngengrad und northing der Breitengrad. Die Enum-Werte und Einheiten bleiben dem Schema ΓΌberlassen, aber der kritische Verwechslungsfall wird klar kompensiert.

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?

Die Beschreibung nennt das konkrete Verb 'umrechnen' und die Zielsysteme WGS84 und LV95, ergΓ€nzt durch den offiziellen Dienstnamen REFRAME. Damit ist der Zweck eindeutig und klar von den ΓΌbrigen swisstopo-Tools abgegrenzt.

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?

Das use_case-Tag beschreibt explizit, wann die Umrechnung benΓΆtigt wird: um LV95-Koordinaten fΓΌr andere Tools nach WGS84 zu bringen oder umgekehrt fΓΌr den Katasterbezug. Es wird keine Alternative genannt, da auch unter den Geschwister-Tools kein direkter Koordinaten-Umrechner existiert; die Einsatzbedingung ist hinreichend klar.

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

swisstopo_elevation_profileA
Read-onlyIdempotent

Berechnet ein HΓΆhenprofil entlang einer Linie aus mehreren Koordinatenpaaren.

HΓΆhenverlauf z.B. fΓΌr Wander-/Schulweg-Analysen. BenΓΆtigt β‰₯2 Koordinatenpaare. Standard ist WGS84 ('lat1,lon1;lat2,lon2;…'); fΓΌr LV95 coordinate_system='lv95' setzen und die Paare als 'easting,northing' ΓΌbergeben.

ParametersJSON Schema
NameRequiredDescriptionDefault
paramsYes

Output Schema

ParametersJSON Schema
NameRequiredDescription
noteNoActionable hint when a search returns nothing β€” what to try next, rather than a bare negative (audit ARCH-003).
countNoNumber of structured results.
sourceNoData source attribution.
licenseNoData licence.
resultsNoStructured result records (machine-readable).
summaryYesHuman-readable Markdown summary of the result.
is_errorNoTrue if this represents a handled error.
match_typeNoexact | fuzzy | none (for search-style tools).
provenanceNoHow the data was obtained.
retrieved_atNoISO-8601 retrieval timestamp.

TDQS

A4.2/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. The description adds valuable behavioral context: the requirement of at least 2 coordinate pairs, the default WGS84 coordinate system with option for LV95, and the deprecation note for the 'sr' parameter. These details help the agent understand constraints and edge cases 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.

Conciseness5/5

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

The description is concise and well-structured: a one-sentence purpose followed by structured <use_case> and <important_notes> tags. Every element earns its place, with no redundancy or filler. The German text is clear and front-loaded with the primary action.

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

Completeness4/5

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

Given the presence of an output schema and existing annotations, the description covers the essential aspects: purpose, use case, prerequisites, and coordinate system handling. It doesn't elaborate on return values, but that's sufficiently handled by the output schema. The tool is relatively simple, and this description is adequate without major gaps.

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

Parameters3/5

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

The input schema fully documents all parameters with descriptions (coordinates format, defaults, ranges). The description's important_notes largely reiterate schema information but add the 'β‰₯2 Koordinatenpaare' constraint and the deprecation of 'sr'. Since schema description coverage is effectively high, a baseline of 3 is appropriate; the description provides marginal but non-essential additions.

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 starts with 'Berechnet ein HΓΆhenprofil entlang einer Linie aus mehreren Koordinatenpaaren', which is a specific verb (Berechnet) + resource (HΓΆhenprofil) + scope (entlang einer Linie). It clearly distinguishes from the sibling tool swisstopo_get_height (which likely handles single points) and other location-based tools. The use_case tag reinforces the intended domain.

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

Usage Guidelines4/5

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

The <use_case> tag explicitly states when to use the tool (e.g., hiking/school-route analyses), providing clear contextual guidance. It doesn't explicitly name alternatives or exclusion conditions, but the purpose and use case are specific enough. The <important_notes> also give prerequisites (β‰₯2 coordinate pairs), which helps the agent decide if the tool is appropriate.

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

swisstopo_find_communeA
Read-onlyIdempotent

Lâst Gemeinden auf: Name→BFS-Nummer, BFS-Nummer→Name, oder alle Gemeinden eines Kantons/Bezirks.

Vier Modi (genau einen Parameter angeben): name (Name → BFS-Nummer), bfs_number (BFS-Nummer → Gemeinde), canton (alle Gemeinden eines Kantons) oder district (alle Gemeinden eines Bezirks). Beantwortet z.B. «Welche Gemeinden liegen im Bezirk Uster und wie lauten ihre BFS-Nummern?». bfs_commune_number ist der amtliche Join-Schlüssel zu BFS-Statistikdaten (swiss-statistics-mcp). canton akzeptiert Kürzel ('ZH') oder BFS-Nummer ('1') — die Kürzel→Schlüssel-Auflâsung erfolgt serverseitig, weil der Pfad sonst still eine leere Liste liefert. Gemeindelisten sind vollstÀndig (interne Pagination), nicht auf 10 EintrÀge gekürzt.

ParametersJSON Schema
NameRequiredDescriptionDefault
paramsYes

Output Schema

ParametersJSON Schema
NameRequiredDescription
noteNoActionable hint when a search returns nothing β€” what to try next, rather than a bare negative (audit ARCH-003).
countNoNumber of structured results.
sourceNoData source attribution.
licenseNoData licence.
resultsNoStructured result records (machine-readable).
summaryYesHuman-readable Markdown summary of the result.
is_errorNoTrue if this represents a handled error.
match_typeNoexact | fuzzy | none (for search-style tools).
provenanceNoHow the data was obtained.
retrieved_atNoISO-8601 retrieval timestamp.

TDQS

A4.8/5.0
Behavior5/5

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

Beyond the annotations (readOnlyHint, idempotentHint, etc.), the description adds valuable behavioral details: lists are complete ('interne Pagination, nicht auf 10 EintrÀge gekürzt'), canton abbreviation→key resolution happens server-side to avoid silent empty results, and the BFS number is the official join key. These details help the agent anticipate behavior and pitfalls.

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

Conciseness5/5

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

The description is well-structured with a concise opening sentence, a <use_case> block, and an <important_notes> block. Each sentence serves a purposeβ€”covering modes, examples, and caveatsβ€”without fluff. The use of tags helps an agent scan key information efficiently.

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

Completeness5/5

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

Given the tool's complexity (four modes, exact-one-parameter constraint) and the existence of an output schema (which covers return values), the description is complete. It covers all parameter semantics, a usage example, and important edge cases like canton abbreviation resolution and full pagination. No critical information is missing.

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

Parameters5/5

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

Schema description coverage is effectively 0% at the top level (only 'params' wrapper has no description), so the prose must compensate. The description thoroughly explains each of the four modes and parameters: name (forward), bfs_number (reverse), canton (abbreviation or number), district (numeric). It also emphasizes that exactly one parameter must be given, which is critical for correct invocation.

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

Purpose5/5

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

The description opens with a specific verb and resource: 'Lâst Gemeinden auf: Name→BFS-Nummer, BFS-Nummer→Name, oder alle Gemeinden eines Kantons/Bezirks.' This clearly defines the tool as a commune resolver, distinct from siblings like swisstopo_geocode or swisstopo_reverse_geocode. The four modes are enumerated, making the purpose unmistakable.

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

Usage Guidelines4/5

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

The description provides clear context on when to use the tool: 'Vier Modi (genau einen Parameter angeben)' followed by a concrete example ('Welche Gemeinden liegen im Bezirk Uster...'). It explains the input constraints and the exact modes. It does not explicitly exclude alternatives or name sibling tools, but the guidance is sufficient for an agent to decide 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.

swisstopo_geocodeA
Read-onlyIdempotent

Wandelt eine Adresse, einen Ortsnamen oder eine PLZ in Koordinaten um (Geocoding).

Startpunkt fΓΌr ortsbezogene Abfragen: Adresse β†’ Koordinaten, die danach an swisstopo_get_height, swisstopo_map_query (operation='features_at_point') oder swisstopo_get_egrid ΓΌbergeben werden.

ParametersJSON Schema
NameRequiredDescriptionDefault
paramsYes

Output Schema

ParametersJSON Schema
NameRequiredDescription
noteNoActionable hint when a search returns nothing β€” what to try next, rather than a bare negative (audit ARCH-003).
countNoNumber of structured results.
sourceNoData source attribution.
licenseNoData licence.
resultsNoStructured result records (machine-readable).
summaryYesHuman-readable Markdown summary of the result.
is_errorNoTrue if this represents a handled error.
match_typeNoexact | fuzzy | none (for search-style tools).
provenanceNoHow the data was obtained.
retrieved_atNoISO-8601 retrieval timestamp.

TDQS

A4/5.0
Behavior3/5

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

Annotations already declare readOnlyHint=true, openWorldHint=true, idempotentHint=true, and destructiveHint=false, covering safety. The description adds the workflow context but does not disclose additional behavioral details like pagination or handling of multiple results. With annotations, a 3 is appropriate.

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 concise: one main sentence plus a structured use_case block. Every sentence serves a purpose, with no redundant information.

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

Completeness4/5

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

Given the rich schema and annotations, the description is complete enough for an agent to understand when and how to use the tool. The use_case ties it into a larger workflow, and return values are covered by the output schema. Minor gap: it doesn't explicitly explain the optional filters, but these are well-documented in the schema.

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

Parameters3/5

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

The description does not mention any parameters, but the input schema provides detailed descriptions for each property (search_text, sr, limit, origins). Since the schema covers parameter semantics, the description adds little beyond it, and the baseline is 3.

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

Purpose5/5

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

The description clearly states a specific verb and resource: 'Wandelt eine Adresse, einen Ortsnamen oder eine PLZ in Koordinaten um (Geocoding).' It distinguishes this from reverse geocoding and other sibling tools by naming the conversion direction and the downstream tool usage.

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

Usage Guidelines4/5

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

The use_case explicitly describes when to use this tool ('Startpunkt fΓΌr ortsbezogene Abfragen') and which downstream tools it feeds into, providing clear context. However, it does not explicitly mention when not to use it or directly compare with reverse_geocode, so it's not a full 5.

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

swisstopo_get_collectionA
Read-onlyIdempotent

Ruft Detailinformationen und Download-Links einer STAC-Collection ab.

Zweiter Schritt nach swisstopo_search_geodata, um Assets/Download-URLs einer Collection zu erhalten.

ParametersJSON Schema
NameRequiredDescriptionDefault
paramsYes

Output Schema

ParametersJSON Schema
NameRequiredDescription
noteNoActionable hint when a search returns nothing β€” what to try next, rather than a bare negative (audit ARCH-003).
countNoNumber of structured results.
sourceNoData source attribution.
licenseNoData licence.
resultsNoStructured result records (machine-readable).
summaryYesHuman-readable Markdown summary of the result.
is_errorNoTrue if this represents a handled error.
match_typeNoexact | fuzzy | none (for search-style tools).
provenanceNoHow the data was obtained.
retrieved_atNoISO-8601 retrieval timestamp.

TDQS

A3.9/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. The description adds workflow context but no additional behavioral details such as authentication, rate limits, or output quirks. It does not contradict annotations.

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

Conciseness5/5

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

The description is extremely concise, with two sentences: the first states the core function, and the second gives the workflow context. Information is front-loaded and every sentence 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?

The tool is simple (one parameter), has an output schema, and annotations cover safety. The description provides workflow context via the use_case, but could be more explicit about how to derive collection_id from search results. Overall, it is sufficient for selection and 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?

The description does not mention the collection_id parameter at all. Schema description coverage is 0%, meaning the description fails to compensate. The schema provides an example but lacks detailed semantics on how to obtain a valid collection ID.

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

Purpose5/5

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

The description clearly states the tool's function: retrieving detailed information and download links for a STAC collection. The use_case further specifies that it is the second step after swisstopo_search_geodata, which distinguishes it from sibling search tools.

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

Usage Guidelines4/5

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

The use_case explicitly tells when to use this tool: after swisstopo_search_geodata, to obtain assets/download URLs. It does not list when-not-to-use or explicit alternatives, but the sequential workflow provides clear guidance.

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

swisstopo_get_egridA
Read-onlyIdempotent

Ermittelt die EGRID (GrundstΓΌck-ID) aus Koordinaten fΓΌr einen bestimmten Kanton.

GrundstΓΌck-ID (EGRID) zu einer Koordinate, wenn die ID selbst gebraucht wird. FΓΌr die BeschrΓ€nkungen direkt swisstopo_oereb_at nutzen β€” das lΓΆst den EGRID intern auf. Erfordert einen unterstΓΌtzten Kanton (z.B. ZH, BE).

ParametersJSON Schema
NameRequiredDescriptionDefault
paramsYes

Output Schema

ParametersJSON Schema
NameRequiredDescription
noteNoActionable hint when a search returns nothing β€” what to try next, rather than a bare negative (audit ARCH-003).
countNoNumber of structured results.
sourceNoData source attribution.
licenseNoData licence.
resultsNoStructured result records (machine-readable).
summaryYesHuman-readable Markdown summary of the result.
is_errorNoTrue if this represents a handled error.
match_typeNoexact | fuzzy | none (for search-style tools).
provenanceNoHow the data was obtained.
retrieved_atNoISO-8601 retrieval timestamp.

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=false. The description adds useful context about the need for a supported canton, which could cause errors otherwise. It doesn't contradict annotations and provides the key behavioral constraint beyond what annotations state.

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 extremely concise: one main sentence, a use_case block, and a short important note. It's well-structured with tagged sections, front-loads the core purpose, and every sentence earns its place without redundancy.

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 lookup tool with strong annotations and an output schema, the description covers the primary use case, an alternative, and an important prerequisite. It misses explicitly stating the coordinate pair requirement, but the schema handles that detail. Overall, it's adequately complete for an agent to invoke correctly.

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

Parameters2/5

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

The tool description does not explain parameter semantics; it only says 'aus Koordinaten' (from coordinates). The schema does describe each parameter, but with schema_description_coverage at 0%, the description provides almost no value beyond the schema. It gives no hints about the need to supply either lat/lon or easting/northing, nor the coordinate systems.

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 the specific verb 'ermittelt' (determines) and clearly identifies the resource (EGRID property ID) and the input (coordinates for a specific canton). It also distinguishes itself from siblings by explicitly directing users to swisstopo_oereb_at for restrictions, resolving the EGRID internally.

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

Usage Guidelines5/5

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

The use_case section states when to use the tool ('wenn die ID selbst gebraucht wird') and explicitly points to an alternative for restriction lookups (swisstopo_oereb_at). The important_notes adds a prerequisite (supported canton), giving clear usage guidance.

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

swisstopo_get_heightA
Read-onlyIdempotent

Gibt die HΓΆhe ΓΌber Meer (m ΓΌ. M.) an einer Koordinate zurΓΌck.

PunkthΓΆhe fΓΌr eine Adresse/Koordinate; fΓΌr Linien siehe swisstopo_elevation_profile. Koordinaten entweder als lat/lon (WGS84) ODER als easting/northing (LV95) angeben β€” nicht beides.

ParametersJSON Schema
NameRequiredDescriptionDefault
paramsYes

Output Schema

ParametersJSON Schema
NameRequiredDescription
noteNoActionable hint when a search returns nothing β€” what to try next, rather than a bare negative (audit ARCH-003).
countNoNumber of structured results.
sourceNoData source attribution.
licenseNoData licence.
resultsNoStructured result records (machine-readable).
summaryYesHuman-readable Markdown summary of the result.
is_errorNoTrue if this represents a handled error.
match_typeNoexact | fuzzy | none (for search-style tools).
provenanceNoHow the data was obtained.
retrieved_atNoISO-8601 retrieval timestamp.

TDQS

A4.7/5.0
Behavior4/5

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

Annotations deklarieren readOnly, idempotent, nicht destruktiv. Die Beschreibung ergΓ€nzt die wichtige EinschrΓ€nkung, dass entweder lat/lon ODER easting/northing angegeben werden darf ('nicht beides') – ein Verhaltenshinweis, der ΓΌber die Annotationen hinausgeht.

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?

Die Beschreibung ist mit zwei knappen AbsΓ€tzen und Tags strukturiert und enthΓ€lt keine unnΓΆtigen Informationen.

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?

Mit Schema (Parameterdetails), Annotations (Safety) und Output-Schema ist die Beschreibung angemessen: Sie erklΓ€rt Use Case, Koordinatensysteme und die wichtigste EinschrΓ€nkung. Sie muss nicht jedes Schema-Detail wiederholen.

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?

Das Schema dokumentiert alle Parameter mit Beschreibungen (z.B. sr als veraltet, lat/lon-Grenzen). Die Beschreibung fΓΌgt den gegenseitigen Ausschluss der Koordinatenpaare hinzu, was die Schema-Einzelbeschreibungen nicht explizit sagen.

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?

Die Beschreibung beginnt mit 'Gibt die HΓΆhe ΓΌber Meer (m ΓΌ. M.) an einer Koordinate zurΓΌck' – ein spezifisches Verb und Ressource. Der use_case grenzt explizit von swisstopo_elevation_profile ab (Punkt vs. Linie).

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

Usage Guidelines5/5

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

Im use_case steht 'PunkthΓΆhe fΓΌr eine Adresse/Koordinate; fΓΌr Linien siehe swisstopo_elevation_profile.' Das gibt eine klare Entscheidungsregel und nennt die Alternative.

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

swisstopo_get_oereb_extractA
Read-onlyIdempotent

Ruft ΓΆffentlich-rechtliche EigentumsbeschrΓ€nkungen (Γ–REB) fΓΌr ein GrundstΓΌck (EGRID) ab.

Γ–REB-Auszug zu einem bereits bekannten EGRID. Wer von einer Koordinate ausgeht, nimmt swisstopo_oereb_at β€” das erledigt beide Schritte in einem Aufruf. Erfordert einen unterstΓΌtzten Kanton.

ParametersJSON Schema
NameRequiredDescriptionDefault
paramsYes

Output Schema

ParametersJSON Schema
NameRequiredDescription
noteNoActionable hint when a search returns nothing β€” what to try next, rather than a bare negative (audit ARCH-003).
countNoNumber of structured results.
sourceNoData source attribution.
licenseNoData licence.
resultsNoStructured result records (machine-readable).
summaryYesHuman-readable Markdown summary of the result.
is_errorNoTrue if this represents a handled error.
match_typeNoexact | fuzzy | none (for search-style tools).
provenanceNoHow the data was obtained.
retrieved_atNoISO-8601 retrieval timestamp.

TDQS

A4.2/5.0
Behavior3/5

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

Annotations already convey read-only, idempotent, and non-destructive behavior. The description adds the constraint that a supported canton is required, which is useful but not a major behavioral disclosure. It does not mention response format or error handling, but the output schema covers the return structure.

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 concise, with the core purpose in the first sentence and supplementary information in clearly labeled XML tags (<use_case>, <important_notes>). No wasted words; the structure aids parsing and scannability.

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?

The description provides essential usage context: purpose, when to use vs. an alternative, and a key prerequisite. Combined with the annotations and a rich input schema, it is nearly complete. However, it does not mention any edge cases (e.g., unsupported canton behavior) or response size limits, so a slight deduction applies.

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 tool description does not discuss parameters, but the input schema independently provides rich descriptions for all four fields (egrid, canton, lang, topics) with examples and constraints. The description adds no additional parameter semantics beyond the schema, so a baseline score of 3 is appropriate.

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

Purpose5/5

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

The description clearly states the tool's function: 'Ruft ΓΆffentlich-rechtliche EigentumsbeschrΓ€nkungen (Γ–REB) fΓΌr ein GrundstΓΌck (EGRID) ab.' This is a specific verb+resource combination and distinguishes from siblings by noting that coordinate-based lookups should use swisstopo_oereb_at.

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

Usage Guidelines5/5

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

The use_case explicitly defines when to use this tool ('Γ–REB-Auszug zu einem bereits bekannten EGRID') and directs users starting from a coordinate to an alternative sibling tool. It also adds a prerequisite ('Erfordert einen unterstΓΌtzten Kanton'), providing clear decision guidance.

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

swisstopo_list_available_layersA
Read-onlyIdempotent

Discovery-Tool: listet die Layer-Kennungen, die swisstopo_query_geodata akzeptiert.

Erster Schritt vor swisstopo_query_geodata: herausfinden, welche DatensΓ€tze (Strassenverzeichnis, Γ–REB-VerfΓΌgbarkeit, interkantonale geodienste.ch-Topics) verfΓΌgbar und ohne Vertrag frei nutzbar sind. FΓΌr konkrete geodienste-Kennungen einen Kanton angeben (z.B. canton='ZH').

ParametersJSON Schema
NameRequiredDescriptionDefault
paramsYes

Output Schema

ParametersJSON Schema
NameRequiredDescription
noteNoActionable hint when a search returns nothing β€” what to try next, rather than a bare negative (audit ARCH-003).
countNoNumber of structured results.
sourceNoData source attribution.
licenseNoData licence.
resultsNoStructured result records (machine-readable).
summaryYesHuman-readable Markdown summary of the result.
is_errorNoTrue if this represents a handled error.
match_typeNoexact | fuzzy | none (for search-style tools).
provenanceNoHow the data was obtained.
retrieved_atNoISO-8601 retrieval timestamp.

TDQS

A4.1/5.0
Behavior4/5

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

Annotations already declare readOnlyHint=true, idempotentHint=true, and destructiveHint=false. The description adds beyond these by framing the tool as a 'Discovery-Tool' and explaining that it outputs layer IDs accepted by query_geodata, with emphasis on free availability without contract. This provides useful behavioral context without contradicting 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.

Conciseness5/5

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

The description is extremely concise: two sentences and a use_case tag. The first line immediately states the core purpose, and the use_case adds practical context without any fluff. Every sentence 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?

The description covers the tool's purpose, usage timing, and a practical example. Since an output schema exists, the description need not explain return values. It also mentions the free-availability constraint. Some details like response format or filtering semantics are not described, but they are either in the schema or not essential for a simple discovery tool.

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% (the top-level 'params' property has no description), and the description does not explain the parameters object. It only gives a single example (canton='ZH'). The inner schema does describe each field, but the description fails to compensate for the lack of top-level param documentation, so the agent gets minimal guidance on how to construct the input.

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

Purpose5/5

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

The description clearly states the tool's function: 'listet die Layer-Kennungen, die swisstopo_query_geodata akzeptiert' (lists layer identifiers accepted by swisstopo_query_geodata). It uses a specific verb (listet) and resource (Layer-Kennungen), and explicitly distinguishes itself from the sibling query tool by being a discovery step.

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 explicitly says 'Erster Schritt vor swisstopo_query_geodata' (first step before query_geodata), giving clear when-to-use context. It also provides a concrete use case and an example of specifying a canton. However, it does not mention when not to use or name alternatives, so it falls short of a 5.

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

swisstopo_lookup_postal_codeA
Read-onlyIdempotent

LΓΆst eine Schweizer PLZ in Ort, Gemeinde, Bezirk und Kanton auf (OpenPLZ, amtlich).

Beantwortet Β«Zu welcher Gemeinde/welchem Kanton gehΓΆrt PLZ 8001?Β» und liefert die BFS-Gemeindenummer (bfs_commune_number). bfs_commune_number ist der amtliche Join-SchlΓΌssel zu BFS-Statistikdaten (swiss-statistics-mcp) und zu zurich-opendata-mcp. Quelle OpenPLZ (BFS/swisstopo OGD), nicht die swisstopo-Geodaten. Eine unbekannte PLZ liefert eine leere Trefferliste mit erklΓ€rendem Hinweis.

ParametersJSON Schema
NameRequiredDescriptionDefault
paramsYes

Output Schema

ParametersJSON Schema
NameRequiredDescription
noteNoActionable hint when a search returns nothing β€” what to try next, rather than a bare negative (audit ARCH-003).
countNoNumber of structured results.
sourceNoData source attribution.
licenseNoData licence.
resultsNoStructured result records (machine-readable).
summaryYesHuman-readable Markdown summary of the result.
is_errorNoTrue if this represents a handled error.
match_typeNoexact | fuzzy | none (for search-style tools).
provenanceNoHow the data was obtained.
retrieved_atNoISO-8601 retrieval timestamp.

TDQS

A4.3/5.0
Behavior4/5

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

Annotations already declare readOnlyHint=true, idempotentHint=true, and destructiveHint=false. The description adds valuable context beyond annotations: unknown postal codes return an empty list with an explanatory hint, and the data source is OpenPLZ (not swisstopo geodata). This enriches transparency without contradicting annotations.

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

Conciseness5/5

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

The description is compact and well-structured with XML-like tags (use_case, important_notes). Each sentence adds distinct value: the main statement, an example use case, and essential notes about the BFS key and unknown-PLZ behavior. No wasted words.

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

Completeness5/5

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

For a simple single-parameter lookup tool with an output schema present, the description covers all essential aspects: what it does, the use case, key output (BFS number), data source caveat, and behavior for unknown inputs. No gaps are evident.

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

Parameters3/5

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

The schema provides a clear description for the single parameter ('Schweizer Postleitzahl (4-stellig, z.B. 8001)'). The tool description only adds an example ('8001') in the use_case, contributing minimal additional meaning beyond the schema. Given the schema coverage is 0% from the description side, this is a baseline score.

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 ('LΓΆst auf') and resource ('Schweizer PLZ') to clearly state the output ('Ort, Gemeinde, Bezirk und Kanton'). The use_case further clarifies by giving a direct example question and mentioning the BFS commune number, which distinguishes it from sibling tools like geocode or reverse_geocode.

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 important_notes section clarifies the data source (OpenPLZ) and the primary use case (joining to BFS statistics), which implies when to use this tool. However, it does not explicitly name alternative tools or state when not to use it, so it falls slightly short of full explicit guidance.

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

swisstopo_map_queryA
Read-onlyIdempotent

Fragt den nationalen Swisstopo-Kartenkatalog ab (500+ Layer): Layer finden, Felder ansehen, Features abfragen.

Der ΓΌbliche Ablauf ist eine Kette: operation='search_layers' liefert Layer-IDs, operation='layer_info' zeigt deren abfragbare Felder, danach operation='features_at_point' (rΓ€umlich) oder 'features_by_attribute' (nach Attributwert), und operation='feature_by_id' holt ein einzelnes Feature vollstΓ€ndig. Genau eine operation pro Aufruf. Felder, die zu einer anderen operation gehΓΆren, werden abgelehnt statt ignoriert β€” die Fehlermeldung nennt die zulΓ€ssigen. FΓΌr Bauzone bzw. Gemeinde gibt es direkte Tools (swisstopo_zoning_at, swisstopo_municipality_at). 'features_at_point' nur nutzen, wenn zusΓ€tzliche Rohattribute gebraucht werden oder ein anderer Layer gefragt ist. Das ist der nationale Katalog von api3.geo.admin.ch. FΓΌr interkantonale und kantonale Quellen ist swisstopo_list_available_layers β†’ swisstopo_query_geodata zustΓ€ndig, fΓΌr herunterladbare DatensΓ€tze swisstopo_search_geodata.

ParametersJSON Schema
NameRequiredDescriptionDefault
paramsYes

Output Schema

ParametersJSON Schema
NameRequiredDescription
noteNoActionable hint when a search returns nothing β€” what to try next, rather than a bare negative (audit ARCH-003).
countNoNumber of structured results.
sourceNoData source attribution.
licenseNoData licence.
resultsNoStructured result records (machine-readable).
summaryYesHuman-readable Markdown summary of the result.
is_errorNoTrue if this represents a handled error.
match_typeNoexact | fuzzy | none (for search-style tools).
provenanceNoHow the data was obtained.
retrieved_atNoISO-8601 retrieval timestamp.

TDQS

A4.7/5.0
Behavior4/5

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

The annotations already declare readOnlyHint=true, idempotentHint=true, and destructiveHint=false, so the safety profile is covered. The description adds genuinely useful behavioral context beyond those annotations: exactly one operation per call is required, and fields from a different operation are rejected with an error listing allowed fields. This exposes strictness that the annotations do not convey.

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

Conciseness5/5

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

The description is well-structured with a crisp opening sentence followed by clearly delineated <use_case> and <important_notes> sections. Every sentence carries unique informationβ€”there is no filler, repetition, or verbosity. The structure makes the content easy to scan and consume for an AI agent.

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 multi-operation tool with a nested schema and output schema present, the description covers the full decision space: what the tool does, when to use it vs alternatives, how operations chain together, and a critical behavioral constraint. The presence of an output schema means return-value documentation is not necessary, and the description delivers everything else needed for correct invocation.

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

Parameters4/5

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

Although the context signal indicates 0% schema description coverage, the tool description compensates by explaining the operational flow and how operations relate to parameters (e.g., 'features_at_point' for spatial queries, 'features_by_attribute' for attribute-based). The schema itself also contains detailed per-parameter descriptions inside the nested MapQueryInput object, so the description adds semantic sequencing rather than repeating field-level details. The use_case block meaningfully links parameter categories to operations.

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

Purpose5/5

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

The description opens with 'Fragt den nationalen Swisstopo-Kartenkatalog ab (500+ Layer): Layer finden, Felder ansehen, Features abfragen', which uses a specific verb and resource and enumerates the tool's core actions. It also distinguishes this tool from siblings by explicitly naming alternative tools for zoning/municipality and for intercantonal/cantonal sources, making its scope unambiguous.

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

Usage Guidelines5/5

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

The <use_case> block lays out a clear chain of operations (search_layers β†’ layer_info β†’ features_at_point/features_by_attribute β†’ feature_by_id) and the <important_notes> give explicit when-not-to-use guidance, pointing to swisstopo_zoning_at, swisstopo_municipality_at, swisstopo_list_available_layers, and swisstopo_search_geodata for alternative needs. This is exemplary usage direction.

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

swisstopo_map_urlA
Read-onlyIdempotent

Generiert eine teilbare map.geo.admin.ch-URL zum Γ–ffnen im Browser.

Einen Kartenausschnitt mit optionalen Layern als Link bereitstellen (kein Datenabruf).

ParametersJSON Schema
NameRequiredDescriptionDefault
paramsYes

Output Schema

ParametersJSON Schema
NameRequiredDescription
noteNoActionable hint when a search returns nothing β€” what to try next, rather than a bare negative (audit ARCH-003).
countNoNumber of structured results.
sourceNoData source attribution.
licenseNoData licence.
resultsNoStructured result records (machine-readable).
summaryYesHuman-readable Markdown summary of the result.
is_errorNoTrue if this represents a handled error.
match_typeNoexact | fuzzy | none (for search-style tools).
provenanceNoHow the data was obtained.
retrieved_atNoISO-8601 retrieval timestamp.

TDQS

A3.9/5.0
Behavior3/5

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

Annotations already declare readOnlyHint, idempotentHint, and destructiveHint. The description adds that it produces a shareable link and does not perform data retrieval, but it doesn't disclose details about URL format, coordinate limitations, or error behavior. The added context is helpful but minimal beyond the safety profile.

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 extremely conciseβ€”two short sentences. The first sentence states the core action, and the second clarifies the use case. Every word earns its place with no redundancy.

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?

The description clearly explains the tool's purpose and use case. While it doesn't detail URL construction or parameter constraints, the schema and output schema fill in those details. For a simple URL-generation tool, the context is sufficiently complete.

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% for the top-level parameter, and the tool description does not compensate by explaining the required 'params' object or its fields. The nested schema has descriptions, but the description text provides no guidance on parameters, leaving a gap for the agent.

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

Purpose5/5

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

The description clearly states the tool's function: 'Generiert eine teilbare map.geo.admin.ch-URL zum Γ–ffnen im Browser.' This is a specific verb (generates) with a specific resource (map.geo.admin.ch URL), and it distinctly contrasts with sibling tools that perform data retrieval or geocoding.

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

Usage Guidelines4/5

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

The use_case block clarifies when to use the tool: 'Einen Kartenausschnitt mit optionalen Layern als Link bereitstellen (kein Datenabruf).' This gives clear context and explicitly states the tool does NOT retrieve data, helping distinguish it from siblings.

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

swisstopo_municipality_atA
Read-onlyIdempotent

Gibt Gemeinde, BFS-Nummer und Kanton an einer Koordinate zurΓΌck (swissBOUNDARIES3D).

Koordinate β†’ amtliche BFS-Gemeindenummer, der Join-Key zu swiss-statistics-mcp und zurich-opendata-mcp. Der Layer fΓΌhrt eine FlΓ€che pro historischem Jahrgang; es wird der aktuelle Stand zurΓΌckgegeben. Auf einer Gemeindegrenze oder ausserhalb der Schweiz bleibt das Resultat leer.

ParametersJSON Schema
NameRequiredDescriptionDefault
paramsYes

Output Schema

ParametersJSON Schema
NameRequiredDescription
noteNoActionable hint when a search returns nothing β€” what to try next, rather than a bare negative (audit ARCH-003).
countNoNumber of structured results.
sourceNoData source attribution.
licenseNoData licence.
resultsNoStructured result records (machine-readable).
summaryYesHuman-readable Markdown summary of the result.
is_errorNoTrue if this represents a handled error.
match_typeNoexact | fuzzy | none (for search-style tools).
provenanceNoHow the data was obtained.
retrieved_atNoISO-8601 retrieval timestamp.

TDQS

A4.2/5.0
Behavior4/5

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

Beyond the readOnlyHint and idempotentHint annotations, the description adds key behavioral details: it returns the current state from a layer with per-historical-year features, and that results are empty on boundaries or outside Switzerland. This is meaningful context that the annotations do not convey.

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 well-structured: a one-sentence summary, a use_case block, and important_notes. Every sentence provides distinct valueβ€”function, context, and edge-case behaviorβ€”with no redundancy or filler.

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

Completeness4/5

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

Given the output schema exists and the schema documents parameters, the description is nearly complete. It covers the primary use case (BFS join key), the current-state behavior, and empty-result conditions. It does not explicitly state that lat/lon and easting/northing are mutually exclusive coordinate systems, but the schema hints at this, so a small gap remains.

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

Parameters3/5

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

The description does not discuss parameters, and schema_description_coverage is 0%. However, the input schema itself provides thorough descriptions for lat/lon/easting/northing, including coordinate system hints and examples, so the schema carries the semantic burden. The description adds no additional parameter meaning, so a baseline score of 3 is appropriate.

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

Purpose5/5

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

The description clearly states the tool returns 'Gemeinde, BFS-Nummer und Kanton an einer Koordinate' (municipality, BFS number, and canton at a coordinate), specifying the resource and output. This distinguishes it from siblings like reverse_geocode or geocode, which focus on addresses or broader features.

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

Usage Guidelines4/5

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

The use_case explicitly describes when to use: to obtain the official BFS municipality number as a join key for other MCPs. It also warns in important_notes that results are empty on borders or outside Switzerland, giving practical guidance. It does not name alternative tools, but the context is clear enough for selection.

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

swisstopo_oereb_atA
Read-onlyIdempotent

Gibt die Γ–REB-EigentumsbeschrΓ€nkungen an einer Koordinate zurΓΌck (ein Aufruf).

Β«Welche BeschrΓ€nkungen gelten auf diesem GrundstΓΌck?Β» β€” lΓΆst den EGRID intern auf. Das ist der normale Weg; swisstopo_get_egrid braucht es nur, wer die Parzellen-ID selbst benΓΆtigt. Nur fΓΌr Kantone mit angebundenem Γ–REB-Dienst (siehe SWISSTOPO_OEREB_CANTONS). Koordinaten als lat/lon (WGS84) oder easting/northing (LV95).

ParametersJSON Schema
NameRequiredDescriptionDefault
paramsYes

Output Schema

ParametersJSON Schema
NameRequiredDescription
noteNoActionable hint when a search returns nothing β€” what to try next, rather than a bare negative (audit ARCH-003).
countNoNumber of structured results.
sourceNoData source attribution.
licenseNoData licence.
resultsNoStructured result records (machine-readable).
summaryYesHuman-readable Markdown summary of the result.
is_errorNoTrue if this represents a handled error.
match_typeNoexact | fuzzy | none (for search-style tools).
provenanceNoHow the data was obtained.
retrieved_atNoISO-8601 retrieval timestamp.

TDQS

A4.4/5.0
Behavior4/5

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

Annotations already declare readOnlyHint, idempotentHint, destructiveHint, and openWorldHint. The description adds valuable behavioral context beyond these: it is a single call ('ein Aufruf'), it resolves the EGRID internally, and it is restricted to cantons with a connected Γ–REB service. It also notes coordinate formats. However, it does not clarify behavior when both coordinate systems are provided or what happens for unsupported cantons.

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

Conciseness5/5

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

The description is well-structured with distinct use_case and important_notes blocks. The main sentence is front-loaded and direct. Each sentence provides actionable information, such as the EGRID resolution, the alternative tool, and coordinate format requirements, without any filler.

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?

The tool is relatively complex with multiple parameters, coordinate systems, and an output schema. The description covers the primary use case, internal EGRID resolution, cantonal availability, and coordinate formats. The output schema is present, so return structure need not be described. However, it omits topics and language parameters, which are only in the schema, and does not address edge cases like no coordinates provided or conflicting coordinate systems.

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

Parameters3/5

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

The description provides essentially no parameter documentation (0% coverage), but the input schema itself has detailed descriptions for each field (e.g., lat: 'Breitengrad (WGS84). Zusammen mit lon angeben.'). The description's note about lat/lon or easting/northing and the cantonal restriction adds a bit beyond the schema, especially the requirement that the canton must have an Γ–REB service. Still, the description does not compensate for the low coverage; it relies on the schema.

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

Purpose5/5

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

The description clearly states the tool's function: 'Gibt die Γ–REB-EigentumsbeschrΓ€nkungen an einer Koordinate zurΓΌck' (returns Γ–REB property restrictions at a coordinate), with a specific verb, resource, and scope. It also distinguishes from sibling tool swisstopo_get_egrid by explaining that this tool resolves EGRID internally and is the normal way, while get_egrid is only for needing the parcel ID itself.

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

Usage Guidelines5/5

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

The description provides explicit usage context via the use_case block: 'Β«Welche BeschrΓ€nkungen gelten auf diesem GrundstΓΌck?Β»' and states 'Das ist der normale Weg; swisstopo_get_egrid braucht es nur, wer die Parzellen-ID selbst benΓΆtigt.' This gives clear when-to-use and when-not-to-use guidance, names an alternative, and also specifies a precondition: 'Nur fΓΌr Kantone mit angebundenem Γ–REB-Dienst'.

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

swisstopo_query_geodataA
Read-onlyIdempotent

Einheitliche Fassade ΓΌber mehrere Geodaten-Quellen anhand einer Layer-Kennung.

Ein Tool fΓΌr drei Quellen: 'strassenverzeichnis' (Strassen um einen Punkt), 'oereb-verfuegbarkeit' (Γ–REB-Status/ZustΓ€ndigkeit an einem Punkt) und 'geodienste:&lt;topic&gt;:&lt;KANTON&gt;' (interkantonale Basisgeodaten via OGC API Features). Genau eine Ortsangabe (point | bbox | commune) ΓΌbergeben. GΓΌltige Layer-Kennungen via swisstopo_list_available_layers. geodienste-Layer erfordern bbox oder point (mit radius_m).

ParametersJSON Schema
NameRequiredDescriptionDefault
paramsYes

Output Schema

ParametersJSON Schema
NameRequiredDescription
noteNoActionable hint when a search returns nothing β€” what to try next, rather than a bare negative (audit ARCH-003).
countNoNumber of structured results.
sourceNoData source attribution.
licenseNoData licence.
resultsNoStructured result records (machine-readable).
summaryYesHuman-readable Markdown summary of the result.
is_errorNoTrue if this represents a handled error.
match_typeNoexact | fuzzy | none (for search-style tools).
provenanceNoHow the data was obtained.
retrieved_atNoISO-8601 retrieval timestamp.

TDQS

A4.2/5.0
Behavior4/5

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

Annotations already declare readOnlyHint, idempotentHint, and destructiveHint=false, so safety is covered. The description adds behavioral context about the faΓ§ade nature, the requirement to pass exactly one location, and layer-specific parameter requirements (geodienste require bbox/point). No contradictions.

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

Conciseness5/5

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

The description is concise, with a clear primary sentence followed by structured use_case and important_notes tags. Every sentence adds value, and the format is front-loaded and easy to parse.

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

Completeness4/5

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

Given the tool's complexity (7 parameters, multiple layer types) and the presence of a detailed input schema and output schema, the description covers the core usage rules (exactly one location, layer-source mapping, geodienste requirements). It does not explicitly state which location types apply to each layer, but the schema covers parameter constraints, making this acceptable.

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

Parameters3/5

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

Schema description coverage is 0%, so the description must compensate. It does mention point, bbox, commune, and radius_m, and explains that geodienste layers require bbox or point, adding meaning beyond the schema. However, it does not systematically describe the parameters or their mutual exclusivity; the schema itself handles most 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 clearly identifies the tool as a unified facade over multiple geodata sources based on a layer identifier, and enumerates the specific source types ('strassenverzeichnis', 'oereb-verfuegbarkeit', 'geodienste'). This distinguishes it from sibling tools that handle narrower queries.

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 explicit constraints: exactly one location parameter (point, bbox, or commune), and notes that geodienste layers require bbox or point with radius_m. It also directs users to swisstopo_list_available_layers for valid layer IDs. It lacks explicit 'when not to use' alternatives, but provides clear context.

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

swisstopo_query_osm_featuresA
Read-onlyIdempotent

Findet OpenStreetMap-POIs (Schulen, SpielplΓ€tze, Apotheken …) im Umkreis.

Beantwortet Β«Welche SchulhΓ€user/SpielplΓ€tze liegen im Umkreis von R Metern um diesen Punkt/diese Adresse?Β». ErgΓ€nzt die amtlichen swisstopo-Daten um Points-of-Interest aus OpenStreetMap. Quelle OpenStreetMap (ODbL, Β© OpenStreetMap contributors), nicht swisstopo. Overpass hat Rate-Limits/Timeouts β€” kleiner Radius bevorzugt; bei Überlastung kommt eine sprechende Fehlermeldung statt Daten.

ParametersJSON Schema
NameRequiredDescriptionDefault
paramsYes

Output Schema

ParametersJSON Schema
NameRequiredDescription
noteNoActionable hint when a search returns nothing β€” what to try next, rather than a bare negative (audit ARCH-003).
countNoNumber of structured results.
sourceNoData source attribution.
licenseNoData licence.
resultsNoStructured result records (machine-readable).
summaryYesHuman-readable Markdown summary of the result.
is_errorNoTrue if this represents a handled error.
match_typeNoexact | fuzzy | none (for search-style tools).
provenanceNoHow the data was obtained.
retrieved_atNoISO-8601 retrieval timestamp.

TDQS

A4.7/5.0
Behavior5/5

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

Die Anmerkungen lesen sich als readOnlyHint, openWorldHint, idempotentHint und destructiveHint false. Die Beschreibung fΓΌgt hinzu, dass die Quelle OpenStreetMap (ODbL) ist und nicht swisstopo, und dass Overpass Rate-Limits/Timeouts hat, weshalb ein kleinerer Radius bevorzugt werden sollte. Dies geht ΓΌber die Annotationen hinaus und schafft Verhaltens-Transparenz, inklusive mΓΆglicher Fehlermeldungen.

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?

Die Beschreibung ist kompakt: ein einleitender Satz, gefolgt von klar strukturierten Abschnitten use_case und important_notes. Jede Zeile liefert einen Mehrwert, ohne ΓΌberflΓΌssige Wiederholungen. Die Struktur mit XML-Tags erleichtert das Parsing.

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?

Das Tool hat 4 Parameter und eine Ausgabe-Schema, daher muss die Beschreibung nur den Kontext und die Besonderheiten abdecken. Sie erklΓ€rt die externe Datenquelle, den Anwendungsfall, die EinschrΓ€nkungen von Overpass und das Fehlerverhalten. Das ist fΓΌr ein Such-Werkzeug eine vollstΓ€ndige Beschreibung.

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?

Obwohl das Schema für alle vier Parameter Beschreibungen enthÀlt (area, limit, radius_m, feature_type), liefert die Tool-Beschreibung keine zusÀtzliche syntaktische Information. Sie erwÀhnt jedoch den Suchradius und die POI-Kategorien im Fließtext, was den Zweck der Parameter kontextualisiert. Das Schema trÀgt die Hauptlast, daher ist 3 angemessen.

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?

Die Beschreibung nennt das Verb 'Findet', die Ressource 'OpenStreetMap-POIs' und den Kontext 'im Umkreis'. Beispiele wie Schulen, SpielplΓ€tze und Apotheken machen den Zweck konkret. Sie grenzt sich von den amtlichen swisstopo-Daten ab und ist klar von den Geschwister-Tools unterscheidbar.

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

Usage Guidelines5/5

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

Das use_case-Feld definiert genau, wann das Tool eingesetzt wird: fΓΌr die Beantwortung von Umkreisfragen nach POIs. important_notes gibt zusΓ€tzlich Hinweise zu Overpass-Limits und Fehlerverhalten, was eine informierte Nutzung ermΓΆglicht. Alternativen werden zwar nicht explizit genannt, aber der Zusatz 'ErgΓ€nzt die amtlichen swisstopo-Daten' impliziert die Abgrenzung.

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

swisstopo_reverse_geocodeA
Read-onlyIdempotent

Findet die nΓ€chstgelegene Adresse zu gegebenen WGS84-Koordinaten (Reverse Geocoding).

Koordinaten aus Karte oder GPS in eine lesbare Adresse auflΓΆsen.

ParametersJSON Schema
NameRequiredDescriptionDefault
paramsYes

Output Schema

ParametersJSON Schema
NameRequiredDescription
noteNoActionable hint when a search returns nothing β€” what to try next, rather than a bare negative (audit ARCH-003).
countNoNumber of structured results.
sourceNoData source attribution.
licenseNoData licence.
resultsNoStructured result records (machine-readable).
summaryYesHuman-readable Markdown summary of the result.
is_errorNoTrue if this represents a handled error.
match_typeNoexact | fuzzy | none (for search-style tools).
provenanceNoHow the data was obtained.
retrieved_atNoISO-8601 retrieval timestamp.

TDQS

A3.8/5.0
Behavior3/5

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

Annotations already declare readOnlyHint, idempotentHint, and destructiveHint, covering safety. The description adds context about WGS84 input and that it finds the nearest address, but does not disclose e.g., return format or geographic bounds. No contradiction with annotations.

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

Conciseness5/5

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

The description is two concise sentences plus a use_case tag, front-loaded with the main purpose. Every word earns its place with no filler or repetition.

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 is relatively simple and has an output schema plus safety annotations. However, the description omits important context like Swiss bounds, configurable coordinate systems (sr), and result limit (limit), relying on the schema to convey these. For a tool with nested parameters, this is adequate but not fully complete.

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?

The context signal reports 0% schema description coverage for the top-level params object, meaning the description must compensate for parameter semantics. It only mentions 'WGS84-Koordinaten', which partially explains lat/lon, but does not describe 'sr', 'limit', or the nested structure. The nested schema has descriptions, but the tool description itself adds minimal parameter value.

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 specifies a clear verb+resource: 'Findet die nΓ€chstgelegene Adresse zu gegebenen WGS84-Koordinaten (Reverse Geocoding).' This precisely identifies reverse geocoding and differentiates it from sibling forward geocoding tools like swisstopo_geocode. The use case tag further clarifies the intended scenario.

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

Usage Guidelines4/5

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

The use_case ('Koordinaten aus Karte oder GPS in eine lesbare Adresse auflΓΆsen') explicitly states when to use the tool. It implies the distinction from forward geocoding but does not name alternative tools or provide explicit exclusions, so it falls short of a top score.

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

swisstopo_search_addressA
Read-onlyIdempotent

Volltextsuche ΓΌber Schweizer Strassen und Ortschaften (OpenPLZ FullTextSearch).

Findet Strassen und Orte zu einem freien Suchbegriff und liefert je Treffer Gemeinde und BFS-Nummer, wenn vorhanden. Quelle OpenPLZ (BFS/swisstopo OGD). Ergebnisse sind paginiert (max. 50/Abfrage); die Gesamttrefferzahl wird ausgewiesen. Für die exakte PLZ→Gemeinde-Auflâsung ist swisstopo_lookup_postal_code prÀziser.

ParametersJSON Schema
NameRequiredDescriptionDefault
paramsYes

Output Schema

ParametersJSON Schema
NameRequiredDescription
noteNoActionable hint when a search returns nothing β€” what to try next, rather than a bare negative (audit ARCH-003).
countNoNumber of structured results.
sourceNoData source attribution.
licenseNoData licence.
resultsNoStructured result records (machine-readable).
summaryYesHuman-readable Markdown summary of the result.
is_errorNoTrue if this represents a handled error.
match_typeNoexact | fuzzy | none (for search-style tools).
provenanceNoHow the data was obtained.
retrieved_atNoISO-8601 retrieval timestamp.

TDQS

A4.5/5.0
Behavior4/5

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

Annotations already declare readOnlyHint=true and idempotentHint=true, so the safety profile is known. The description adds behavioral details: results are paginated, max 50 per request, total hit count is shown, and data source is OpenPLZ (BFS/swisstopo OGD). It also mentions it returns Gemeinde and BFS number if available, which is useful context beyond annotations.

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

Conciseness5/5

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

The description is compact and well-structured, using clear tags for use_case and important_notes. Each sentence delivers distinct value: purpose, output, pagination, data source, and alternative tool. No redundant or filler content.

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 presence of an output schema and strong annotations, the description covers all necessary selection and invocation context: clear use case, pagination behavior, data source, and when to prefer a sibling tool. It fully equips an agent to decide and call the tool correctly.

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

Parameters3/5

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

The input schema already provides descriptions for both 'query' and 'limit', including patterns and constraints. The description adds only minor extra context (e.g., 'freien Suchbegriff', pagination limit) that largely mirrors the schema. With schema coverage at 100% for parameter meaning, baseline 3 is appropriate.

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

Purpose5/5

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

The description clearly states it is a full-text search over Swiss streets and localities ('Volltextsuche ΓΌber Schweizer Strassen und Ortschaften') and specifies the output includes municipality and BFS number. It also distinguishes itself from sibling swisstopo_lookup_postal_code by noting that tool is more precise for exact PLZ-to-municipality resolution.

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

Usage Guidelines5/5

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

The description explicitly provides an alternative: 'Für die exakte PLZ→Gemeinde-Auflâsung ist swisstopo_lookup_postal_code prÀziser.' It also states pagination behavior (max 50 per query) and that total hits are returned, giving concrete usage context.

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

swisstopo_search_geodataA
Read-onlyIdempotent

Durchsucht den STAC-Katalog nach herunterladbaren Geodaten.

Findet Orthophotos, HΓΆhenmodelle (swissALTI3D), 3D-GebΓ€ude und historische Karten zum Download. Liefert Collections/Metadaten; Download-Links via swisstopo_get_collection.

ParametersJSON Schema
NameRequiredDescriptionDefault
paramsYes

Output Schema

ParametersJSON Schema
NameRequiredDescription
noteNoActionable hint when a search returns nothing β€” what to try next, rather than a bare negative (audit ARCH-003).
countNoNumber of structured results.
sourceNoData source attribution.
licenseNoData licence.
resultsNoStructured result records (machine-readable).
summaryYesHuman-readable Markdown summary of the result.
is_errorNoTrue if this represents a handled error.
match_typeNoexact | fuzzy | none (for search-style tools).
provenanceNoHow the data was obtained.
retrieved_atNoISO-8601 retrieval timestamp.

TDQS

A4.3/5.0
Behavior4/5

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

Annotations already declare the operation as read-only, idempotent, and non-destructive. The description adds behavioral context by specifying that the result is collections/metadata, not direct data, and that download links require a complementary tool. This goes beyond the annotations and clarifies the tool's role in a workflow.

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 extremely compact, with a one-sentence main purpose and two clearly labeled sections (use_case and important_notes). Every sentence contributes meaningful guidance without unnecessary detail. The structure front-loads the core function and separates practical usage notes.

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

Completeness4/5

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

For a read-only search tool, the description is largely complete: it states the resource, the output type, and directs to the sibling tool for downloads. It does not explain the full return structure or edge cases, but an output schema exists and the annotations cover safety, so the missing details are not critical.

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?

The context signal indicates 0% schema description coverage, meaning the description does not explain any parameter semantics. Although the schema itself contains descriptions for query and limit, the description offers no added guidance; it merely repeats query examples from the schema. The limit parameter is entirely unmentioned in the description, failing to compensate for the low coverage.

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

Purpose5/5

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

The description uses the specific verb 'Durchsucht' (searches) with a clear resource 'STAC-Katalog' and object 'herunterladbaren Geodaten'. It also lists concrete data types (Orthophotos, HΓΆhenmodelle, 3D-GebΓ€ude, historische Karten), distinguishing it from sibling tools like swisstopo_get_collection.

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

Usage Guidelines5/5

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

The important_notes explicitly state that the tool returns collections/metadata and that download links are obtained via swisstopo_get_collection, providing a clear alternative. The use_case gives concrete examples of when to use the tool, making the selection rationale explicit.

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

swisstopo_zoning_atA
Read-onlyIdempotent

Gibt die harmonisierte Bauzone an einer Koordinate zurΓΌck (ch.are.bauzonen, ARE).

Β«Welche Bauzone gilt hier?Β» in einem Aufruf β€” ohne vorher die Layer-ID via swisstopo_map_query erst suchen zu mΓΌssen. Der harmonisierte ARE-Layer ist eine Synthese fΓΌr die schweizweite Vergleichbarkeit und NICHT rechtsverbindlich β€” verbindlich ist allein die kantonale/kommunale Nutzungsplanung. Der Hinweis steht in jedem Resultat. Koordinaten als lat/lon (WGS84) oder easting/northing (LV95).

ParametersJSON Schema
NameRequiredDescriptionDefault
paramsYes

Output Schema

ParametersJSON Schema
NameRequiredDescription
noteNoActionable hint when a search returns nothing β€” what to try next, rather than a bare negative (audit ARCH-003).
countNoNumber of structured results.
sourceNoData source attribution.
licenseNoData licence.
resultsNoStructured result records (machine-readable).
summaryYesHuman-readable Markdown summary of the result.
is_errorNoTrue if this represents a handled error.
match_typeNoexact | fuzzy | none (for search-style tools).
provenanceNoHow the data was obtained.
retrieved_atNoISO-8601 retrieval timestamp.

TDQS

A4.1/5.0
Behavior4/5

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

Annotations already declare readOnlyHint, openWorldHint, idempotentHint, and destructiveHint=false. The description adds valuable context by explaining the ARE layer is a non-binding synthesis and that the legal disclaimers appear in every result, which is beyond the annotation set. No contradictions found.

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 efficiently structured with a leading one-sentence summary followed by tagged use_case and important_notes sections. It avoids redundancies and front-loads the core purpose, though the XML-like tags add some bulk.

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 point-lookup tool with an output schema, the description covers the essential context: purpose, coordinate formats, the legal caveat, and the relationship to sibling tools. It does not address edge cases like out-of-bounds coordinates or service limitations, but these are secondary given the schema's bounds and annotations.

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

Parameters3/5

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

The description mentions 'lat/lon (WGS84) oder easting/northing (LV95)', which adds coordinate-system semantics beyond the schema's terse per-property descriptions. However, it does not clarify that the two coordinate pairs are mutually exclusive alternatives, nor does it explain the required 'params' object wrapper. The schema's own descriptions provide some context, so the description partially compensates for the low coverage.

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

Purpose5/5

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

The description begins with a clear verb+resource statement: 'Gibt die harmonisierte Bauzone an einer Koordinate zurΓΌck' (returns the harmonized building zone at a coordinate). It also distinguishes itself from sibling tool swisstopo_map_query by explicitly noting it avoids a prior layer-ID lookup, making its purpose unambiguous.

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

Usage Guidelines4/5

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

The use_case section provides a direct query example ('Welche Bauzone gilt hier?') and explains when to use this tool instead of swisstopo_map_query. However, it does not explicitly state when not to use it beyond the legal caveat, nor compare to other 'at coordinate' siblings like swisstopo_municipality_at.

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

TDQS

A4/5.0
Disambiguation3/5

Several tool pairs have overlapping purposes, such as get_oereb_extract vs oereb_at, get_egrid vs oereb_at, and find_commune vs lookup_postal_code vs search_address. The descriptions do clarify when to use each, but an agent may misselect based on names alone. More than one or two tools could be confused, so this is not mostly distinct.

Naming Consistency3/5

All tools share the swisstopo_ prefix, but the naming convention is mixed: verb-first names (get_height, search_geodata), noun-at names (zoning_at, municipality_at), and noun phrases (map_url, elevation_profile) are all present. This is a readable but inconsistent pattern, not a uniform verb_noun structure.

Tool Count4/5

With 20 tools, the server is on the heavier side but still reasonable for the broad Swiss geospatial domain it covers. Each tool addresses a distinct need (geocoding, elevation, map query, property restrictions, data download), so the count is only slightly above the ideal range.

Completeness5/5

The tool set covers the full lifecycle of common geospatial workflows: geocoding, reverse geocoding, coordinate conversion, elevation point/profile, map layer query, zoning/municipality lookups, EGRID/OEREB property information, STAC search/download, and address/PLZ/commune resolution. No critical operations appear to be missing for the announced purpose.

Maintenance

ActivityActive
ResponsivenessUnresponsive

Resources

Unclaimed servers have limited discoverability.

Looking for Admin?

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

Related MCP Connectors

Related MCP Servers

Latest Blog Posts

MCP directory API

We provide all the information about MCP servers via our MCP API.

curl -X GET 'https://glama.ai/api/mcp/v1/servers/malkreide/swisstopo-mcp'

If you have feedback or need assistance with the MCP directory API, please join our Discord server