Skip to main content
Glama
malkreide
by malkreide

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

πŸš— Swiss Road & Mobility MCP Server

Version License: MIT Python 3.11+ MCP CI

MCP Server for Swiss road mobility β€” shared vehicles, EV charging, traffic alerts, Park & Rail, and multimodal trip planning

πŸ‡©πŸ‡ͺ Deutsche Version


Demo

Demo: Claude using road_mobility_snapshot at ZΓΌrich HB


Related MCP server: swiss-rail-mcp

Overview

swiss-road-mobility-mcp provides AI-native access to Swiss road and mobility data sources:

Source

Data

API

Auth

sharedmobility.ch

Bikes, e-scooters, cars (GBFS)

REST/JSON

None

ich-tanke-strom.ch

EV charging stations

GeoJSON

None

opentransportdata.swiss

Traffic events, counting stations

DATEX II / SOAP+XML

Free key

data.sbb.ch

Park & Rail facilities

REST/JSON (Opendatasoft)

None

transport.opendata.ch

Public transport connections

REST/JSON

None

geo.admin.ch

Address geocoding, road classification

REST/JSON

None

If the Swiss Transport MCP is the GA pass for rail, this server is the vignette + Park & Rail card + sharing subscription for the road β€” together they paint the complete multimodal picture of Swiss mobility.

Anchor demo query: "I'm in Dietikon with my car. I need to get to Bern. Where can I park? Which train should I take?"


Features

  • 15 tools across six data sources (Phase 1–4)

  • road_mobility_snapshot β€” aggregated mobility overview for any location

  • road_multimodal_plan β€” car + Park & Rail + public transport in one plan

  • No API key required for 12 of 15 tools

  • Dual transport β€” stdio (Claude Desktop) + SSE (cloud)

  • Rate limiting + caching for all endpoints


Prerequisites

  • Python 3.11+

  • uv (recommended) or pip


Installation

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

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

Or with uvx (no permanent installation):

uvx swiss-road-mobility-mcp

Quickstart

# stdio (for Claude Desktop)
swiss-road-mobility-mcp
# or:
python -m swiss_road_mobility_mcp.server

# SSE (for cloud / Render.com)
MCP_TRANSPORT=sse MCP_PORT=8001 swiss-road-mobility-mcp

Try it immediately in Claude Desktop:

"Show me everything mobility-related at Zurich HB." "Find shared bikes near Bern Bahnhof." "Where can I charge my EV near Lucerne?"

β†’ More use cases by audience β†’


Configuration

Claude Desktop

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

{
  "mcpServers": {
    "swiss-road-mobility": {
      "command": "uvx",
      "args": ["swiss-road-mobility-mcp"],
      "env": {
        "OPENTRANSPORTDATA_API_KEY": "<your-token>"
      }
    }
  }
}

Or with python:

{
  "mcpServers": {
    "swiss-road-mobility": {
      "command": "python",
      "args": ["-m", "swiss_road_mobility_mcp.server"],
      "env": {
        "OPENTRANSPORTDATA_API_KEY": "<your-token>"
      }
    }
  }
}

Shared mobility, EV charging, Park & Rail, and the multimodal planner work without an OPENTRANSPORTDATA_API_KEY. The key is only required for the DATEX II traffic tools.

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: MCP_TRANSPORT=sse MCP_PORT=8001 swiss-road-mobility-mcp

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

SSE security (SEC-009)

A public SSE endpoint is reachable by anyone. To protect it (and your upstream API quota), configure these environment variables on the host:

Variable

Effect

MCP_AUTH_TOKEN

When set, every SSE request must send Authorization: Bearer <token>. Unset = unauthenticated (the server logs a loud warning at startup). Strongly recommended for any public deployment.

MCP_RATE_LIMIT

Max requests per client IP per window (default 60, 0 disables).

MCP_RATE_WINDOW

Window length in seconds (default 60).

ALLOWED_ORIGINS

Comma-separated CORS origins for browser clients. Empty by default: no cross-origin access. * allows any origin and is logged as a warning. Does not affect stdio or other non-browser clients.

The local stdio transport needs none of this β€” it runs in the user's trusted context.

Observability (OBS-003 / OBS-006)

Variable

Effect

MCP_LOG_LEVEL

Log level: DEBUG / INFO (default) / WARNING / ERROR.

MCP_LOG_FORMAT

text (default) or json for structured logs. All logs go to stderr.

MCP_TRACING_ENABLED

true enables OpenTelemetry tracing (off by default).

OTEL_EXPORTER_OTLP_ENDPOINT

OTLP collector URL; setting it also enables tracing. Standard OTEL_* vars are honoured by the SDK.

Tracing needs the optional extra: pip install 'swiss-road-mobility-mcp[tracing]'. Once enabled, every upstream API call is traced automatically (httpx instrumentation) and SSE requests get server spans with W3C trace-context propagation.


Available Tools

Shared Mobility & EV Charging (no API key required)

Tool

Description

Cache

road_find_sharing

Shared mobility nearby (bikes, e-scooters, cars)

60s

road_search_sharing

Search sharing stations by name

5min

road_sharing_providers

All sharing providers in Switzerland

1h

road_find_charger

EV charging stations nearby

5min

road_charger_status

Real-time availability of charging stations

1min

road_check_status

Server & API health check

-

Traffic (free API key required)

Tool

Description

Cache

road_traffic_situations

Accidents, roadworks, congestion from ASTRA/VMZ-CH

2min

road_traffic_counters

Vehicles/h + km/h at counting stations near a position

1min

road_counter_sites

List counting stations nearby

24h

Park & Rail + Multimodal (no API key required)

Tool

Description

Cache

road_park_rail

Find SBB Park+Rail facilities nearby

5min

road_mobility_snapshot

Complete mobility overview for a location

-

road_multimodal_plan

Plan car -> Park+Rail -> public transport -> destination

-

Geography & Addresses β€” Phase 4 (no API key required)

Tool

Description

Cache

road_geocode_address

Swiss address -> GPS (official building address register)

-

road_reverse_geocode

GPS -> official address with EGID/EGAID (GWR)

-

road_classify_road

Road classification via swissTLM3D

-

Example Use Cases

Query

Tool

"Find shared bikes near Zurich HB"

road_find_sharing

"Where can I charge my EV near Bern?"

road_find_charger

"Any traffic incidents on the A1?"

road_traffic_situations

"Where can I park near Winterthur station?"

road_park_rail

"Plan my trip from Dietikon to Bern by car + train"

road_multimodal_plan


API Key for Traffic Tools

  1. Register: https://api-manager.opentransportdata.swiss

  2. Create a new application -> subscribe to the "Strassenverkehr" API

  3. Copy the token

export OPENTRANSPORTDATA_API_KEY=<your-token>

Without a key, the traffic tools return a descriptive error message including the exact registration link β€” no crash.


Architecture

swiss_road_mobility_mcp/
β”œβ”€β”€ server.py             # FastMCP server, 15 tools
β”œβ”€β”€ api_infrastructure.py # Rate limiter, cache, HTTP client, geo utilities
β”œβ”€β”€ shared_mobility.py    # sharedmobility.ch
β”œβ”€β”€ ev_charging.py        # ich-tanke-strom.ch
β”œβ”€β”€ traffic_situations.py # DATEX II traffic alerts (SOAP/XML)
β”œβ”€β”€ traffic_counters.py   # DATEX II counting stations (SOAP/XML)
β”œβ”€β”€ park_rail.py          # SBB Open Data Park & Rail
β”œβ”€β”€ multimodal.py         # Snapshot + trip planner (cross-source)
└── geo_admin.py          # geo.admin.ch geocoding + road classification

Data Source Characteristics

Source

Protocol

Coverage

Auth

sharedmobility.ch

REST/JSON (GBFS)

All CH sharing providers

None

ich-tanke-strom.ch

GeoJSON

All public EV chargers

None

opentransportdata.swiss

DATEX II / SOAP+XML

ASTRA traffic data

Free key

data.sbb.ch

REST/JSON (Opendatasoft)

SBB Park & Rail

None

transport.opendata.ch

REST/JSON

Public transport schedules

None

geo.admin.ch

REST/JSON

Official addresses, roads

None

In-depth docs: docs/ARCHITECTURE.md (MCP primitives, tool namespacing, use-case catalogue, phase roadmap) Β· docs/SECURITY.md (credential model, egress allow-list, auth, MCP conformance table) Β· docs/OPERATIONS.md (resource limits, restart policy, health).


Project Structure

swiss-road-mobility-mcp/
β”œβ”€β”€ src/swiss_road_mobility_mcp/
β”‚   β”œβ”€β”€ __init__.py              # Package
β”‚   β”œβ”€β”€ server.py                # FastMCP server, 15 tools
β”‚   β”œβ”€β”€ api_infrastructure.py    # Rate limiter, cache, HTTP client
β”‚   β”œβ”€β”€ shared_mobility.py       # Shared vehicles
β”‚   β”œβ”€β”€ ev_charging.py           # EV charging stations
β”‚   β”œβ”€β”€ traffic_situations.py    # Traffic events
β”‚   β”œβ”€β”€ traffic_counters.py      # Vehicle counting
β”‚   β”œβ”€β”€ park_rail.py             # Park & Rail
β”‚   β”œβ”€β”€ multimodal.py            # Snapshot + trip planning
β”‚   └── geo_admin.py             # Geocoding + roads
β”œβ”€β”€ tests/
β”‚   β”œβ”€β”€ test_integration.py      # Live API tests
β”‚   └── test_phase3.py           # Park & Rail + multimodal tests
β”œβ”€β”€ .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

Known Limitations

  • Shared Mobility: The sharedmobility.ch API does not enforce strict radius filtering; vehicles slightly outside the specified radius may appear

  • EV Charging: Station naming conventions vary between operators; some stations may appear without detailed names

  • Traffic (DATEX II): Requires a free API key; without it, traffic tools return helpful error messages

  • Park & Rail: SBB occasionally renames endpoints; the server includes a fallback chain

  • Multimodal Planner: Response time depends on the slowest of the queried sources


MCP Protocol Version

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

Era

Revision

Who reaches it

initialize handshake

2024-11-05 … 2025-11-25

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

Per-request envelope

2026-07-28

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

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

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

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


Testing

# All tests
pytest tests/ -v

# Quick check (without pytest)
python tests/test_phase3.py

Safety & Limits

  • Read-only: All tools perform HTTP GET requests only β€” no data is written, modified, or deleted on any upstream system.

  • No personal data: Location coordinates passed as tool inputs are not stored, logged, or forwarded beyond the immediate API request. API responses contain no PII β€” only vehicle counts, charger availability, traffic events, and geographic metadata.

  • Rate limiting: The server enforces client-side rate limits (Shared Mobility: 30 req/60s; EV Charging: 10 req/60s) to protect upstream APIs. The DATEX II key is subject to opentransportdata.swiss fair-use terms.

  • Caching: Responses are cached in-process (Sharing: 60s Β· EV: 5 min Β· Park+Rail: 5 min Β· Traffic: 1–2 min). Real-time data reflects the cache age, not necessarily the current second.

  • Terms of service: Data is subject to the ToS of each upstream source β€” sharedmobility.ch, ich-tanke-strom.ch, opentransportdata.swiss, data.sbb.ch (CC BY), geo.admin.ch (BGDI).

  • No guarantees: This server is an independent community project, not affiliated with SBB, ASTRA, sharedmobility.ch, or any API provider. Availability depends on upstream services.


Changelog

See CHANGELOG.md


Contributing

See CONTRIBUTING.md


Security

See SECURITY.md for the security posture and vulnerability reporting.


License

MIT License β€” see LICENSE


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

Available Tools

15 tools
road_charger_statusA
Read-only

Check real-time availability of EV charging stations.

Can check specific stations by ID, or get overall statistics for ALL charging points in Switzerland.

Use road_find_charger first to get station IDs, then use this tool to check their current status.

Returns: JSON with real-time status per station, or overall statistics (how many free/occupied/out of service).

ParametersJSON Schema
NameRequiredDescriptionDefault
paramsYes

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A4.4/5.0
Behavior4/5

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

Annotations already indicate readOnlyHint=true and destructiveHint=false. The description adds that it returns real-time status (free/occupied/out of service) and that it covers all Swiss charging points. No contradictions. However, it could mention rate limits or data freshness.

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

Conciseness4/5

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

Description is short and well-structured, with a clear first sentence stating purpose. It uses bullet points for return values. Slightly redundant with schema but not excessive. Could be trimmed slightly.

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 an output schema exists (not shown), the description sufficiently covers what the tool does, how to use it, and what results to expect. It mentions the output format (JSON with status categories) and workflow dependency (road_find_charger). No gaps observed.

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 a detailed description for the station_ids parameter, including an example and the default behavior (empty for overall statistics). The tool description does not add new parameter-level semantics beyond restating these two modes. Schema coverage is 0% by metric, but the schema itself is good, so the tool description adds minimal extra 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?

Description explicitly states 'Check real-time availability of EV charging stations' and distinguishes two modes (specific IDs or overall statistics). It also references a sibling tool (road_find_charger) for obtaining IDs, clarifying the tool's role versus related tools.

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?

Directly advises 'Use road_find_charger first to get station IDs, then use this tool to check their current status.' This tells the agent when to invoke the tool and provides a clear worklow step. It also explains the two distinct use cases (specific stations vs. overall statistics).

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

road_check_statusA
Read-onlyIdempotent

Check the health of all road mobility data sources.

Tests connectivity to sharedmobility.ch and ich-tanke-strom.ch. Useful for diagnosing connection issues.

Returns: JSON with status of each API endpoint.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A4.5/5.0
Behavior4/5

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

Annotations already indicate readOnlyHint, idempotentHint, and non-destructive behavior. The description adds value by naming the specific endpoints tested and the return format (JSON with status), which goes beyond annotations without contradiction.

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

Conciseness5/5

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

The description is three sentences, front-loaded with the main purpose, followed by specific details and return format. Every sentence is informative with no redundancy.

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

Completeness5/5

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

For a simple health-check tool with 0 params, existing annotations, and an output schema, the description provides all necessary context: purpose, endpoints tested, and return type. It is fully adequate for agent use.

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

Parameters4/5

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

No parameters exist, so schema coverage is 100%. The description adds context by explaining what the tool checks (endpoints), fulfilling the baseline expectation for a parameterless tool.

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 'Check the health of all road mobility data sources', specifies the endpoints (sharedmobility.ch, ich-tanke-strom.ch), and distinguishes from sibling tools like road_find_sharing or road_traffic_situations that serve different purposes.

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?

Explicitly states 'Useful for diagnosing connection issues', providing a clear use case. However, it does not include explicit 'when not to use' or direct alternatives, though the sibling list implicitly differentiates.

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

road_classify_roadA
Read-onlyIdempotent

Classify roads at a location using the official Swiss topographic road network (swissTLM3D).

The swissTLM3D is the authoritative federal road network dataset from swisstopo. It classifies every road in Switzerland by:

Road type (Objektart): πŸ›£οΈ Autobahn Β· πŸš— Hauptstrasse Β· 🏘️ Nebenstrasse Β· 🚢 Weg/Pfad …

Functional class (Verkehrsbedeutung): Hauptverbindungsstrasse Β· Verbindungsstrasse Β· Sammelstrasse Β· Zufahrtstrasse

Surface (Belagsart): Hartbelag (Asphalt/Beton) Β· Weich-/Naturbelag

Ownership (EigentΓΌmer): Bund Β· Kanton Β· Gemeinde Β· Privat

Access restriction (VerkehrsbeschrΓ€nkung): Keine BeschrΓ€nkung Β· EinsatzkrΓ€fte Β· Landwirtschaft Β· FussgΓ€nger und Radfahrer Β· Kein ΓΆffentlicher Verkehr …

Use cases:

  • Β«Is this a motorway or a local road?Β»

  • Β«Who maintains this road – canton or municipality?Β»

  • Enriching traffic counter data with official road classification

Phase 4 tool – no API key required! Data source: geo.admin.ch / swisstopo swissTLM3D Strassen.

Returns: JSON with road segments at the location, each containing: - road_name: Official road name (if assigned) - road_type: {code, label_de, label_en, emoji, network_importance} - surface, functional_class, ownership, access_restriction Plus a type_summary overview.

ParametersJSON Schema
NameRequiredDescriptionDefault
paramsYes

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A4.4/5.0
Behavior5/5

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

Annotations already indicate readOnlyHint, idempotentHint, and non-destructive behavior. The description adds behavioral context by detailing the return format (JSON with road segments and specific fields like road name, type, surface, etc.) and data source (geo.admin.ch / swisstopo), going 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.

Conciseness4/5

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

The description is well-structured with bullet points and emojis, front-loading the main purpose. It is slightly verbose but every sentence adds value, providing use cases and output details. Could be slightly more concise, but overall effective.

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

Completeness5/5

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

Given the tool's complexity (multiple classification dimensions), the presence of output schema (mentioned), annotations, and sibling tools, the description is complete. It covers purpose, data source, use cases, and return structure, leaving no major gaps for an AI agent to understand invocation.

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 provides detailed descriptions for all parameters (latitude, longitude, limit, tolerance) in German. The description does not add new meaning beyond listing the classification categories returned, but it does not repeat parameter details. With high schema coverage, 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 it classifies roads at a location using the official Swiss road network (swissTLM3D), listing specific categories like road type, functional class, surface, etc. It distinguishes from sibling tools, which focus on different functions (e.g., chargers, traffic, sharing).

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

Usage Guidelines4/5

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

The description provides explicit use cases (e.g., 'Is this a motorway or a local road?') and notes that no API key is required for Phase 4 tools. It does not explicitly state when not to use it, but the sibling tools cover different domains, making the context clear.

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

road_counter_sitesA
Read-onlyIdempotent

List Swiss traffic counting stations near a location (without real-time data).

Returns the measurement site metadata (name, coordinates, supplier) without fetching the live measurement data. Use this to discover available stations before querying road_traffic_counters.

Site table is cached for 24 hours (rarely changes).

REQUIRES: OPENTRANSPORTDATA_API_KEY environment variable. Free registration: https://api-manager.opentransportdata.swiss

Returns: JSON with list of nearby counting stations: - id: DATEX II station identifier (use in road_traffic_counters) - name: Human-readable station name (German) - latitude / longitude: GPS coordinates - distance_km: Distance from your search location - supplier: Data provider (ASTRA, Kanton ZH, Kanton BE, etc.)

ParametersJSON Schema
NameRequiredDescriptionDefault
paramsYes

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A4.7/5.0
Behavior5/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 behavioral context: 'without real-time data', 'site table cached for 24 hours (rarely changes)', and required API key. 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?

Description is concise (5 sentences) with clear structure: purpose statement, caching note, requirement, and bulleted return fields. Every sentence adds value; no waste.

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

Completeness5/5

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

Given low complexity (simple list tool), with annotations and output schema, the description covers purpose, usage, behavioral notes, and return format comprehensively. No 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?

Schema_description_coverage is 0%, but the schema itself has adequate descriptions for parameters (latitude, longitude, radius_km, limit). The description does not add extra semantics for input parameters beyond what's in the schema; it focuses on output. Baseline 3 is appropriate as schema covers inputs sufficiently.

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 verb 'List', the resource 'Swiss traffic counting stations', and the scope 'near a location (without real-time data)'. It further distinguishes from sibling tools by mentioning this is to discover stations before querying road_traffic_counters.

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

Usage Guidelines5/5

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

Explicitly states 'Use this to discover available stations before querying road_traffic_counters', providing clear when-to-use and alternative. Also mentions caching duration and required environment variable for registration.

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

road_find_chargerA
Read-only

Find EV charging stations near a location in Switzerland.

Searches ich-tanke-strom.ch data for nearby charging stations with real-time availability, plug types, and charging power.

Like the "nearest charger" feature in an electric car's navigation.

Data source: ich-tanke-strom.ch (Swiss Federal Office of Energy). No API key required – completely open data!

Returns: JSON with nearby charging stations sorted by distance, including real-time status (free/occupied), plug types, charging power (kW), and operator information.

ParametersJSON Schema
NameRequiredDescriptionDefault
paramsYes

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

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 and destructiveHint=false, so the description does not need to reiterate safety. It adds value by describing the output (JSON sorted by distance, real-time status, plug types, power, operator) and noting the data source is open and free. 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.

Conciseness5/5

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

The description is well-structured with a brief intro, source attribution, analogy, and bullet-pointed return fields. It is concise yet informative, with 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?

Given the presence of an output schema (mentioned in context signals), the description covers the essential aspects: data source, search capability, real-time status, and output fields. It is complete for a tool that finds chargers, including information about open data and no authentication.

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 parameters only indirectly (e.g., 'real-time availability' maps to include_details). The input schema itself has detailed descriptions for each parameter (range, examples, defaults). Since schema description coverage is 0% (meaning the top-level description doesn't list parameters), the tool description adds little beyond the schema's own parameter descriptions.

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

Purpose5/5

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

The description clearly states the tool finds EV charging stations near a location in Switzerland, specifies data source (ich-tanke-strom.ch), and includes key details like real-time availability, plug types, and charging power. The analogy to a car's navigation feature reinforces the purpose. It is well-differentiated from siblings like road_charger_status.

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 usage context: searching for nearby charging stations with open data. It mentions no API key required and real-time status. However, it does not explicitly differentiate from sibling tools like road_charger_status for checking a specific station's status, which would be helpful.

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

road_find_sharingA
Read-only

Find shared mobility vehicles and stations near a location in Switzerland.

Searches for bikes, e-bikes, e-scooters, cars, and other shared vehicles within a radius around GPS coordinates. Returns real-time availability data from sharedmobility.ch.

Like checking a mobility app: "What sharing options are near me?"

Data source: sharedmobility.ch (Swiss Federal Office of Energy). No API key required – completely open data!

Returns: JSON with nearby vehicles/stations, grouped by type, with availability status and booking app links.

ParametersJSON Schema
NameRequiredDescriptionDefault
paramsYes

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A4.5/5.0
Behavior5/5

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

Annotations indicate readOnlyHint=true and openWorldHint=true. The description adds valuable behavior: no API key required, data source (sharedmobility.ch), returns grouped JSON with availability and booking links. No contradictions with annotations.

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

Conciseness5/5

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

The description is concise and well-structured, front-loading the purpose and using bullet points for the return value. Every sentence adds value without redundancy.

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

Completeness5/5

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

Given the tool's low complexity (1 parameter object with 6 fields, all described in schema) and presence of output schema, the description fully covers necessary context: purpose, geographic scope, data source, real-time nature, and return format.

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% (description doesn't repeat parameter details). However, the input schema already has thorough descriptions for each parameter (latitude, longitude, pickup_type, etc.). The tool description adds no extra meaning beyond the schema, so 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 finds shared mobility vehicles and stations near a location in Switzerland, listing specific vehicle types (bikes, e-bikes, etc.) and comparing it to a mobility app. This distinguishes it from siblings like road_find_charger or road_search_sharing.

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: use for checking nearby shared mobility options in Switzerland with real-time data. However, it lacks explicit when-not-to-use instructions or mention of alternatives like road_search_sharing for broader searches.

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

road_geocode_addressA
Read-onlyIdempotent

Convert a Swiss address to GPS coordinates using the official federal address registry.

Uses swisstopo's amtliches GebΓ€udeadressverzeichnis (GWR-based) – the authoritative Swiss federal building address register containing every officially registered address in Switzerland.

Unlike general geocoders, this returns only verified, legally registered addresses. Every result has an EGAID (EidgenΓΆssischer Adressidentifikator) and EGID (GebΓ€udeidentifikator) from the federal GWR register.

Think of it as the Β«official digital postmanΒ»: if the address exists in Switzerland, it's here. If it's not here, it may not be officially registered.

Phase 4 tool – no API key required! Data source: geo.admin.ch / swisstopo amtliches GebΓ€udeadressverzeichnis.

Returns: JSON with matching addresses, each containing: - address: Full address string (e.g. Β«Bahnhofstrasse 1 8001 ZΓΌrichΒ») - latitude / longitude: WGS84 coordinates - feature_id: ID in the federal address register - source: Layer ID (ch.swisstopo.amtliches-gebaeudeadressverzeichnis)

ParametersJSON Schema
NameRequiredDescriptionDefault
paramsYes

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

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 nondestructive. The description adds behavioral context: it uses GWR-based registry, returns EGAID/EGID, and explains that missing addresses may not be officially registered. This enriches understanding 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.

Conciseness4/5

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

The description is well-structured with clear sections, bullet points, and front-loaded purpose. While somewhat lengthy, it earns its length by providing valuable context without being overly verbose.

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

Completeness5/5

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

Given the tool's complexity, the description covers return fields, data source, registry details, and usage tips. It is complete enough for an agent to understand and use the tool correctly, especially with the existing output 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 input schema already has detailed parameter descriptions (in German), so baseline is 3. The tool description reinforces address format examples but does not add new parameter-specific information beyond what the schema already provides.

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

Purpose5/5

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

The description clearly states the tool converts Swiss addresses to GPS coordinates using the official federal registry. It uses specific verbs ('Convert') and distinguishes from general geocoders by emphasizing verified, legally registered addresses.

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 implies it's for Swiss addresses and notes it's a Phase 4 tool with no API key, but does not explicitly state when not to use or name alternatives like sibling tools. It gives contextual hints about data authority but lacks explicit exclusion criteria.

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

road_mobility_snapshotA
Read-only

Get a complete mobility picture for any Swiss location in one call.

Aggregates in parallel:

  • Shared vehicles nearby (bikes, e-scooters, cars)

  • EV charging stations

  • Park & Rail facilities at nearby train stations

  • Nearest train station (transport.opendata.ch)

  • Traffic situations if Phase 2 API key is configured (optional)

This is the Β«mobility cockpitΒ» – the control tower view. Instead of calling 5 different tools, get everything at once.

Phase 3 cross-server tool: No extra API key needed beyond what Phase 2 already requires (and Phase 2 data is optional).

Perfect for demos: Β«Show me everything mobility-related at [location].Β»

Data sources:

  • sharedmobility.ch (no key)

  • ich-tanke-strom.ch (no key)

  • SBB Open Data / data.sbb.ch (no key)

  • transport.opendata.ch (no key)

  • opentransportdata.swiss DATEX II (optional, Phase 2 key)

Returns: JSON with nearest_station, shared_mobility, ev_charging, park_rail, and optional traffic_situations – all for one location.

ParametersJSON Schema
NameRequiredDescriptionDefault
paramsYes

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A4.2/5.0
Behavior4/5

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

Annotations already indicate readOnlyHint and openWorldHint. The description adds valuable context: parallel aggregation of data sources, optional traffic data based on API key configuration, and the fact that no extra key is needed beyond Phase 2. This clarifies the tool's behavior 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 structured with a clear lead sentence, bullet-like list of aggregated items, usage context, data sources, and return format. Every sentence serves a purpose, and the length is appropriate for the tool's complexity. No redundant 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?

The description fully covers the tool's purpose, data sources, key requirements, optional features, and return shape (JSON fields). Given the tool's complexity and the presence of an output schema, the description provides sufficient context for an agent to decide when and how to use it.

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%. While the schema has German descriptions, the tool description does not explain parameter meanings in English. It mentions radius for EV and sharing in the narrative but omits park_rail_radius and does not clarify that latitude/longitude are required. The description adds little value for understanding parameters.

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 aggregates multiple mobility data sources into one call, using specific verbs like 'Get a complete mobility picture' and listing all data types. It explicitly distinguishes from siblings: 'Instead of calling 5 different tools, get everything at once.'

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 recommends the tool for demos and comprehensive mobility queries. It implies use when a broad overview is needed, but does not explicitly exclude cases like single-source queries. The sibling tool names provide implicit alternatives, but the description could benefit from direct 'when not to use' guidance.

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

road_multimodal_planA
Read-only

Plan a multimodal trip: Drive β†’ Park & Rail β†’ Train β†’ Destination.

The Β«Holy GrailΒ» of Phase 3: combines all data sources into a complete door-to-door multimodal route plan.

Workflow (all in parallel where possible):

  1. Find the nearest train station from your start location

  2. Find Park & Rail facilities near the start (where to park your car)

  3. Get public transport connections from nearest station to destination

  4. Check shared mobility options at start for last-mile to station

  5. Assemble everything into a step-by-step route plan

Use case: Β«I'm in Dietikon with a car. I need to get to Bern. Where can I park? Which train should I take?Β»

No API key required – uses:

  • SBB Open Data (Park & Rail) – free

  • transport.opendata.ch (PT connections) – free

  • sharedmobility.ch (sharing options) – free

Data sources:

  • SBB Open Data Portal (data.sbb.ch) – Park & Rail

  • transport.opendata.ch – Journey planning

  • sharedmobility.ch – Sharing last mile

Returns: JSON with: - nearest_station: Closest train station from start - recommended_park_rail: Best P+R option - plan_steps: Step-by-step multimodal route - all_ov_connections: All available PT connections - last_mile_sharing: Sharing options at start location

ParametersJSON Schema
NameRequiredDescriptionDefault
paramsYes

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A4.3/5.0
Behavior5/5

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

The description adds extensive behavioral context beyond annotations: it outlines the parallel workflow, lists data sources (with no API key required), describes the return format, and explains the process. Annotations already indicate readOnlyHint=true, and the description is consistent with that.

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

Conciseness3/5

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

The description is front-loaded with a summary but is excessively verbose, repeating data sources twice and including a multi-step workflow that could be condensed. While structured, it contains unnecessary repetition, reducing conciseness.

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 (multimodal planning with multiple data sources), the description covers all necessary aspects: input parameters, workflow, data sources, return format, and a use case. The output schema exists, so return values are further clarified. The description is complete for an agent to understand the tool.

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

Parameters3/5

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

The input schema already provides detailed descriptions for each parameter (in German), including constraints and examples. The description does not add significant new semantic information beyond the schema; it only reinforces examples. Baseline 3 is appropriate given schema coverage.

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

Purpose5/5

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

The description clearly states that the tool plans a multimodal trip with a specific sequence (Drive β†’ Park & Rail β†’ Train β†’ Destination). It distinguishes itself from sibling tools by emphasizing it combines all data sources into a complete door-to-door plan, and provides a concrete use case example.

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

Usage Guidelines4/5

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

The description includes a workflow and a use case ('I'm in Dietikon with a car...'), giving clear context for when to use the tool. However, it does not explicitly state when not to use it or mention alternative sibling tools for simpler tasks, so it lacks complete exclusion criteria.

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

road_park_railA
Read-only

Find Park & Rail parking facilities near Swiss train stations.

Returns SBB-operated Park & Rail lots with capacity and location.

Phase 3 tool – the link between road and rail: Β«Park here, then take the train.Β»

No API key required – completely open data!

Data source: Open-Data-Plattform MobilitΓ€t Schweiz (opentransportdata.swiss, Park+Rail GeoJSON). Cache TTL: 5 minutes.

Returns: JSON with nearby Park & Rail facilities sorted by distance, including total spaces and capacity by category.

ParametersJSON Schema
NameRequiredDescriptionDefault
paramsYes

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A3.5/5.0
Behavior4/5

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

The description adds valuable behavioral details beyond annotations: it states 'No API key required – completely open data!' (authentication), 'Cache TTL: 5 minutes' (freshness), and explicitly describes the output as 'JSON with nearby Park & Rail facilities sorted by distance, including total spaces and capacity by category.' This complements the readOnlyHint and openWorldHint annotations without contradiction.

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

Conciseness3/5

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

The description is adequately structured with the main purpose front-loaded, but it includes some extraneous elements like 'Phase 3 tool' and the French quote. While not overly verbose, it could be more concise by removing marketing language and focusing on essential operational details.

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

Completeness2/5

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

The description covers the return format and data source, but it omits crucial input details such as the required latitude/longitude parameters and optional radius/limit. Given the tool's moderate complexity (4 parameters, output schema), the description is incomplete for a user unfamiliar with the API.

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?

With schema description coverage at 0% per context, the tool description must compensate by explaining parameters, but it does not. It only implies location ('near Swiss train stations') without mentioning latitude/longitude, limit, or radius_km. Users are left to infer from the tool's purpose, which is insufficient for a parameter-dependent search tool.

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

Purpose5/5

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

The description clearly states the tool's purpose: 'Find Park & Rail parking facilities near Swiss train stations.' It specifies the resource (Park & Rail facilities), the action (find), and the scope (near Swiss train stations, SBB-operated). This distinguishes it from siblings like road_find_sharing or road_find_charger, which serve different mobility needs.

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

Usage Guidelines3/5

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

The description implies usage by mentioning 'near Swiss train stations' and 'the link between road and rail,' but it does not explicitly state when to use this tool over alternatives or provide exclusions. No sibling comparisons or 'use when' guidance is given, limiting the score to adequate but not great.

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

road_reverse_geocodeA
Read-onlyIdempotent

Find the nearest official Swiss addresses for given GPS coordinates.

Uses the federal building address register (amtliches GebΓ€udeadressverzeichnis) to identify the nearest registered building addresses to any point in Switzerland.

Returns official GWR (GebΓ€ude- und Wohnungsregister) data including:

  • EGID (EidgenΓΆssischer GebΓ€udeidentifikator) – unique federal building ID

  • EGAID (EidgenΓΆssischer Adressidentifikator) – unique federal address ID

  • Building category (residential / non-residential)

  • Official address status

Especially useful for enriching mobility data: finding the exact legal address of a charging station, Park & Rail facility, or sharing station.

Phase 4 tool – no API key required! Data source: geo.admin.ch / swisstopo amtliches GebΓ€udeadressverzeichnis (GWR).

Returns: JSON with nearest official addresses including EGID/EGAID identifiers, municipality data, and building category.

ParametersJSON Schema
NameRequiredDescriptionDefault
paramsYes

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

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, non-destructive. Description adds context: uses official federal register, returns EGID/EGAID, and is a Phase 4 tool. 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?

Well-structured with clear sections, bullet points for return data, and concise sentences. 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?

Given rich annotations and output schema, description covers purpose, data source, return format, and use cases. Complete for a reverse geocoding 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% (context signal), meaning description does not describe input parameters. The tool description only mentions 'GPS coordinates' generically, not latitude, longitude, limit. Agent must rely solely on schema for parameter meaning.

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

Purpose5/5

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

Description uses strong verb 'Find' and specific resource 'nearest official Swiss addresses for given GPS coordinates'. Clearly distinguishes from sibling 'road_geocode_address' (address→coordinates vs coordinates→address).

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?

Description states useful application ('enriching mobility data') and notes 'Phase 4 tool – no API key required', but lacks explicit when-not-to-use or comparison to alternatives among siblings.

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

road_search_sharingA
Read-onlyIdempotent

Search for shared mobility stations by name or address.

Full-text search across all Swiss shared mobility stations. Useful when you know the station name but not the coordinates.

Example: "Find all PubliBike stations near 'Bahnhof'"

Returns: JSON with matching stations, their locations, and availability.

ParametersJSON Schema
NameRequiredDescriptionDefault
paramsYes

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A4/5.0
Behavior3/5

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

Annotations already declare readOnlyHint=true and idempotentHint=true, so the agent knows it's safe. The description adds that it performs full-text search and returns JSON with locations and availability, but does not discuss rate limits, pagination, or other behavioral details.

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 no wasted words: a clear purpose statement, scope, use case, example, and return format. Well-structured and front-loaded.

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 tool with 3 parameters, an output schema, and strong annotations, the description covers essential aspects: purpose, when to use, return format. It lacks parameter documentation but the schema fills that gap. Some missing details like pagination, but overall adequate.

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 covers the search_text parameter implicitly by mentioning 'by name or address' and giving an example, but it does not detail limit or provider_id. The schema provides good descriptions for all parameters, compensating somewhat. Given 0% schema coverage according to context, the description should do more, but it partially meets the need.

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

Purpose5/5

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

The description clearly states the tool searches for shared mobility stations by name or address, with a specific scope (Swiss stations). It distinguishes from siblings like road_find_sharing by focusing on name/address search rather than coordinates.

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 it's useful when the station name is known but not the coordinates, providing clear context. However, it does not mention when not to use it or suggest alternative tools for other scenarios.

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

road_sharing_providersA
Read-onlyIdempotent

List all shared mobility providers operating in Switzerland.

Shows which companies offer shared bikes, e-scooters, cars etc., what vehicle types they have, and links to their booking apps.

Like checking the "About" page of a mobility platform.

Returns: JSON with all providers, their vehicle types, and app links.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A4.3/5.0
Behavior4/5

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

Annotations already declare readOnlyHint and idempotentHint, so the description adds value by specifying the return format (JSON with providers, vehicle types, app links) and geographic scope (Switzerland). No contradictions with annotations.

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

Conciseness4/5

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

The description is concise, with two short sentences and a bullet for return value. The analogy 'Like checking the About page' is helpful but adds a bit of extra text. Overall, it is front-loaded and efficient.

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 no parameters and existing annotations, the description covers the purpose and output. It mentions the return format and scope. Since output schema exists (context signals), the description is sufficiently complete for this simple listing tool.

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

Parameters4/5

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

Input schema has no parameters, so baseline is 4. The description does not need to explain parameters, and it adds no additional semantic value beyond what the schema provides (which is empty).

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

Purpose5/5

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

The description clearly states it lists all shared mobility providers in Switzerland, using the verb 'List' and specifying the resource. It distinguishes from siblings like road_find_sharing and road_search_sharing which are for searching or finding specific providers.

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 implies this tool is for a broad overview of providers, like an 'About' page. However, it does not explicitly state when to use this vs. siblings (e.g., for specific searches or status checks). The context signals make it clear, but explicit guidance would improve it.

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

road_traffic_countersA
Read-only

Get real-time vehicle counts and speeds at Swiss traffic measurement stations.

Finds nearby counting stations and returns live traffic flow data: vehicles per hour (separated by light/heavy vehicles) and average speeds.

Data is updated every minute by ASTRA and cantonal road authorities. This is the Β«digital tally counterΒ» of Swiss roads – precise, live, distinguishing passenger cars from trucks.

Use case: Β«How busy is the A1 near Zurich right now?Β» or Β«How much truck traffic passes through Lucerne hourly?Β»

REQUIRES: OPENTRANSPORTDATA_API_KEY environment variable. Free registration: https://api-manager.opentransportdata.swiss

Data source: ASTRA & cantonal authorities via opentransportdata.swiss (DATEX II). Cache TTL: Site table 24h (static) + measurements 1 minute (real-time).

Returns: JSON with nearby counting stations and their current measurements: - site_id: Unique station identifier - name: Station name - distance_km: Distance from search center - latitude / longitude: Station coordinates - supplier: Data provider (ASTRA, Kanton ZH, etc.) - measurement_time: Timestamp of latest measurement - flow_light_vehicles_per_hour: Cars, motorcycles, buses - flow_heavy_vehicles_per_hour: Trucks, articulated lorries - flow_total_per_hour: Combined flow - avg_speed_light_kmh: Average speed of light vehicles - avg_speed_heavy_kmh: Average speed of heavy vehicles

ParametersJSON Schema
NameRequiredDescriptionDefault
paramsYes

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A4.2/5.0
Behavior4/5

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

Annotations already show readOnlyHint=true and non-destructive. The description adds valuable beyond-annotation context: data update every minute, cache TTL (site table 24h, measurements 1 min), and the need for an API key. This clarifies performance and dependency behavior.

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

Conciseness4/5

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

The description is structured with a clear lead sentence, bullet-like details, and sections for use cases, requirements, and output fields. While slightly lengthy, the information is well-organized and front-loaded, ensuring key points are immediately visible.

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 and the presence of an output schema, the description covers all necessary aspects: input requirements (latitude, longitude, radius), output fields (site_id, name, flow, speed), data source, update frequency, and API key registration. It is fully sufficient for correct invocation.

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 has well-described parameters with examples (e.g., 'latitude: 47.3769 for Zurich HB'). Since schema coverage is high, the description does not need to repeat them. However, it adds no additional meaning beyond 'finds nearby stations', earning a baseline 3.

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

Purpose5/5

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

The description clearly states the tool returns real-time vehicle counts and speeds at Swiss traffic measurement stations. It emphasizes live, per-minute data and distinguishes from sibling tools like road_traffic_situations (incidents) and road_counter_sites (static station info) by focusing on real-time traffic flow.

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

Usage Guidelines4/5

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

The description provides explicit use cases (e.g., 'How busy is the A1 near Zurich right now?') and contextual details like data sources and update frequency. However, it does not explicitly mention when to avoid this tool or suggest alternatives, only implying it's best for real-time traffic queries.

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

road_traffic_situationsA
Read-only

Get current Swiss traffic events: accidents, roadworks, congestion.

Fetches real-time traffic messages from ASTRA's DATEX II platform. Data is updated live by Swiss Traffic Management Center (VMZ-CH), cantonal police, and road operation units.

Complements Phase 1: While road_find_sharing shows WHERE vehicles are available, this tool shows WHY a road is currently blocked.

REQUIRES: OPENTRANSPORTDATA_API_KEY environment variable. Free registration: https://api-manager.opentransportdata.swiss

Data source: ASTRA VMZ-CH via opentransportdata.swiss (DATEX II v2.3). Cache TTL: 2 minutes (real-time updates).

Returns: JSON with list of traffic situations, each containing: - id: Situation identifier - records: List of situation records with: - category: Event type (accident/roadwork/congestion/etc.) - validity_status: active/revoked - start_time / end_time: Validity period - severity: highest/high/medium/low/lowest - description: Human-readable text (German preferred) - creation_time: When situation was created

ParametersJSON Schema
NameRequiredDescriptionDefault
paramsYes

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A3.9/5.0
Behavior4/5

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

Annotations already set readOnlyHint=true and destructiveHint=false, indicating a safe read operation. The description adds behavioral details: data is updated live, cache TTL of 2 minutes, and data source (ASTRA VMZ-CH). No contradictions with annotations.

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

Conciseness4/5

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

The description is moderately long but well-structured with clear sections: purpose, data source, complement info, requirements, details, and return format. Every sentence adds value, though some redundancy exists (e.g., data source repeated).

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

Completeness3/5

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

The tool has 3 input parameters (though nested) and an output schema. The description adequately covers the return structure but lacks parameter details. Given the complexity and that output schema exists, it is reasonably complete but could include parameter guidance.

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?

Context signals show schema description coverage is 0%, meaning the description does not explain the parameters. The description only lists return fields, not input parameters like 'limit', 'active_only', or 'filter_type'. With 0% coverage, the description should compensate but fails to do so.

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 a specific verb 'Get' and resource 'current Swiss traffic events: accidents, roadworks, congestion.' It clearly states what the tool does and differentiates it from sibling 'road_find_sharing' by saying 'shows WHY a road is currently blocked.'

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 compares to 'road_find_sharing' to indicate when to use this tool: 'while road_find_sharing shows WHERE vehicles are available, this tool shows WHY a road is currently blocked.' It also mentions a prerequisite: 'REQUIRES: OPENTRANSPORTDATA_API_KEY environment variable.' However, it does not provide explicit when-not-to-use scenarios.

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

Tool Schema Changelog

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

  1. 15 tool updatesv0.5.3
    • First observedroad_charger_status
    • First observedroad_check_status
    • First observedroad_classify_road
    • First observedroad_counter_sites
    • First observedroad_find_charger
    • First observedroad_find_sharing
    • First observedroad_geocode_address
    • First observedroad_mobility_snapshot
    • First observedroad_multimodal_plan
    • First observedroad_park_rail
    • First observedroad_reverse_geocode
    • First observedroad_search_sharing
    • First observedroad_sharing_providers
    • First observedroad_traffic_counters
    • First observedroad_traffic_situations

TDQS

A4.2/5.0

Scored across 15 tools

Disambiguation5/5

Each tool targets a distinct aspect of Swiss road mobility: sharing, charging, traffic, counting, parking, classification, geocoding, and aggregated views. No two tools have overlapping purposes; even closely related tools (e.g., find vs search sharing, find vs status chargers) are clearly separated by their descriptions.

Naming Consistency4/5

All tools share the 'road_' prefix, which is good. However, the naming pattern is not uniform: some use verb_noun (find_sharing, classify_road) while others use noun_noun (sharing_providers, charger_status, traffic_situations). This slight inconsistency prevents a perfect score.

Tool Count5/5

With 15 tools, the server is well-scoped for its purposeβ€”covering sharing, charging, traffic, counting, parking, classification, and geocoding. Each tool earns its place, and the count feels natural for the domain's breadth.

Completeness5/5

The tool surface appears complete for a read-only mobility data aggregation server. It covers all major phases (health check, search, status, planning, aggregation) and sub-domains, with no obvious missing operations like update or delete (which are out of scope).

Maintenance

ActivityNo data
ResponsivenessUnresponsive

Related MCP Connectors

Related MCP Servers