Skip to main content
Glama

ViaFrei

npm Glama

Germany's traffic, trains, charging and roads — in your AI assistant.

Ask in plain words. Get the live answer, with its source.

website node licence no API key MCP

viafrei.de · Connect your assistant · For developers · For businesses · All tools · API reference


claude mcp add --transport http viafrei https://mcp.viafrei.de/mcp

Free. No account, no API key, no sign-up. One line and your assistant knows whether the A8 is jammed, whether your train is late, where the nearest Type 2 charger is (and whether it is free, where the operator publishes that) and whether the lift at your station works — from official German open data, live, with the source named in every answer.

New in 1.7: the front page of viafrei.de gains three everyday moments — stuck in traffic, finding places, tell me when — nine in all, each with questions you can copy and today's live figure beside them, in seven languages (Deutsch, English, Русский, Български, Українська, Română, Türkçe). The questions are in the table below. The tools themselves are the same twenty as in 1.6.


🧳 What you can ask

You don't need to know any tool names. Ask the way you'd ask a friend who happens to have every German traffic feed open. German or English; the answer comes back in the language you asked in.

when you're…

ask

🌅 about to commute

Fahren Busse und Bahnen in Bayern gerade pünktlich? · When does the next train leave Hamburg Hbf?

🚗 about to drive

Gibt es Stau auf der A8? · Are there roadworks on the A7 next week? · Is the A1 closed anywhere?

🚧 stuck in traffic

How much time is the jam on the A3 between Frankfurt and Würzburg costing right now? · Is traffic backed up on the Cologne motorway ring — A1, A3 or A4? · Ist der Elbtunnel auf der A7 heute Nacht gesperrt?

⚡ driving electric

Where can I charge with Type 2 near Leipzig? · Wo gibt es einen Schnelllader mit 150 kW bei Nürnberg?

🅿️ driving a lorry

Find a rest area with lorry parking on the A9 · Wo ist der nächste Lkw-Parkplatz an der A7?

♿ travelling step-free

Funktioniert der Aufzug am Bahnhof Köln Messe/Deutz?

🌦️ watching the weather

Gibt es eine Unwetterwarnung für Freiburg?

📍 looking for a place

What is the address of the Elbphilharmonie in Hamburg? · Welche Apotheken gibt es in Fulda? · My satnav shows 50.1109, 8.6821 — what address is that?

🇩🇪 new to German roads

Do I need an emission sticker for Stuttgart? · Is there a speed limit on the Autobahn?

⏳ waiting for news

Tell me as soon as the closure on the A7 is lifted. · Sag mir Bescheid, wenn in Köln ein Viertel oder mehr der Bus- und Bahnfahrten verspätet ist. · Warn me when a DWD severe-weather warning comes into force for Cologne.

What the answers cover, honestly. Traffic is the motorways and federal roads: in cities that means the urban motorways, not the streets in between. Places and addresses come from OpenStreetMap, so what is not mapped there cannot be found, and opening hours and ratings are not part of it. A watch lives in the conversation that opened it: the server keeps every change there, and your assistant shows it when you ask, or on its own if your client supports MCP notifications. Nothing is sent by e-mail or SMS. Up to 10 watches per conversation, each for up to 24 hours (3 by default), and a road is watched as a whole, not one section of it.

Related MCP server: germany-mcp-server

💬 Real answers

These came back from the production server at https://mcp.viafrei.de/mcp on 2026-10-03, 23:54 Berlin time. They are not mock-ups. Each one shows the first lines of what the tool returned, and the source line exactly as it was sent.

Abfahrten ab Hamburg Hbf (nächste 60 Minuten):
23:56 NBE RB61 → Elmshorn, Gleis 14D-F (statt 13D-F), +5 min (ca. 04.10. 00:01)
04.10. 00:06 RE RE5 → Stade, Gleis 12A-B, pünktlich
23:22 ICE 2514 → Hamburg-Altona, Gleis 11, +51 min (ca. 04.10. 00:13)
04.10. 00:17 NBE RB71 → Wrist, Gleis 13D-F, pünktlich

Stand 23:54 · Quelle: Fahrplandaten: Deutsche Bahn AG, DB API Marketplace, CC BY 4.0, bearbeitet (https://developers.deutschebahn.com) · …

Platform changes, delays and the estimated real departure, in one line each. Edited: one of five departures omitted, and the second source of the line cut to ….

In Köln Messe/Deutz sind alle 10 gemeldeten Anlagen in Betrieb.
Aufzug Aufzug Gl. 12 KVB Tunnel: in Betrieb
Aufzug Aufzug tief Gleis 12: in Betrieb
Fahrtreppe Fahrtreppe Gl. 1/2: in Betrieb
…
Stand 23:54 · Quelle: Aufzüge und Fahrtreppen: Deutsche Bahn AG, DB API Marketplace, CC BY 4.0, bearbeitet (https://developers.deutschebahn.com) · …

For anyone with a wheelchair, a pram or a heavy suitcase, this is the difference between a station being usable and not. Edited: seven of ten facilities omitted.

Charging around Leipzig (within 10 km, Type 2), nearest first:
1. Leipzig, Petersstr. eBox1, Petersstraße 36-44, 04109 Leipzig (E.ON Drive) — 0.3 km, Type 2, up to 3.7 kW, no status data
3. Pocher Service e.K. - Nordstraße, Nordstraße 3, 04105 Leipzig (EA EnergieArchitektur GmbH) — 0.8 km, Type 2, up to 22 kW, 1.20 €/kWh, no status data
4. CCEL-L-Elsterstraße, Elsterstraße 22, 04109 Leipzig (City Concept E-Ladestationen GmbH) — 1.0 km, Type 2, up to 22 kW, 0.80 €/kWh, no status data
Only a few operators publish live occupancy; "no status data" means unknown, not free.

As of 23:54 · Source: Ladepunkte: Eco-Movement via Mobilithek, CC BY 4.0, bearbeitet (https://mobilithek.info/offers/954064102947180544) · …

It says what it does not know: "no status data" is unknown, never free. Edited: entry 2 omitted, a municipality key removed from the heading, and the second source cut to ….

North Rhine-Westphalia: 11% of observed trips more than 5 minutes late (308 of 2,790 trips
in the last 60 minutes, from 30,988 reports at 12,939 stops), 38 trips with cancelled stops.
…
As of 23:52 · Source: Echtzeitdaten: DELFI e.V. via Mobilithek, CC BY-SA (https://mobilithek.info)
These figures are licensed CC BY-SA (share-alike): anyone who passes them on, or builds
something on them, must release the result under the same licence and with this attribution.

Region-wide, with the method stated. The share-alike condition arrives as part of the answer, because it is part of the data. Edited: four method paragraphs between the figure and the source line omitted.

Description of 52.5163, 13.3777:
- Nearest address: Pariser Platz 1, 10117 Berlin (3 m)
- settlement: Unter den Linden (0.7 km)
- district: Berlin (1.9 km)
- junction: AS Sachsendamm (A100) (5.0 km)

Address data as of 2026-09-22
As of 23:54 · Source: Ortsdaten: © GeoNames (CC BY 4.0), bearbeitet (…) · … · OSM-Standortdaten: © OpenStreetMap-Mitwirkende, ODbL 1.0 (https://www.openstreetmap.org/copyright)

That's the Brandenburg Gate. Edited: one line ("administrative area") omitted, and two of four sources cut to ….

Low-emission zone Stuttgart: yes, you need the green Feinstaubplakette.
• Stuttgart: Zone covering the entire city area — it starts at the city boundary, not at the centre.
  Required: the green plaque (emission group 4). …
• A French Crit'Air sticker or any other foreign environmental badge is not valid in Germany —
  only the German Feinstaubplakette counts. (Umweltbundesamt, Umweltzonen in Deutschland)
…
Reviewed 2026-09-19 · Informational, not legal advice.

Every statement carries its source and the date it was checked, and says [to verify] where we could not confirm it. Edited: eight of eleven points omitted.

Parking along the A9:
1. Aster Moos O — Lorry parking (Lkw-Parkplatz), 14 lorry spaces, no occupancy published
2. Baarer Weiher O — Lorry parking (Lkw-Parkplatz), 45 lorry spaces, no occupancy published
…
As of 23:54 · Source: Verkehrsdaten: Autobahn GmbH des Bundes (https://verkehr.autobahn.de)
Where no "free" count is shown the operator publishes no occupancy — it does not mean the site is full.

Edited: two of four sites omitted.

Why the source line matters. Every answer ends with one, and it is the licence speaking: show it to whoever reads the answer. Copy the line the server sends you, not the ones on this page, which are shortened. See Using the data you get back.

🔌 Connect in one minute

The product is a hosted MCP server. Point your client at it and the tools appear. There is nothing to install, no key to request and no quota to negotiate. Step-by-step guides for each assistant: viafrei.de/en/connect.

Claude Code

claude mcp add --transport http viafrei https://mcp.viafrei.de/mcp

Claude (desktop app and claude.ai), ChatGPT and other apps that take a connector URL — add a custom connector with this address (in Claude: Settings → Connectors → Add custom connector; in ChatGPT the connector settings need developer mode):

https://mcp.viafrei.de/mcp

Cursor, and any client with an mcpServers file that takes a url, over HTTP:

{ "mcpServers": { "viafrei": { "url": "https://mcp.viafrei.de/mcp" } } }

VS Code (.vscode/mcp.json, or MCP: Add Server from the command palette):

{ "servers": { "viafrei": { "type": "http", "url": "https://mcp.viafrei.de/mcp" } } }

Clients that speak only stdio — for example Claude Desktop's config file (claude_desktop_config.json, opened from Settings → Developer → Edit Config). That is what this package is for:

{ "mcpServers": { "viafrei": { "command": "npx", "args": ["-y", "viafrei"] } } }

Node 22 or newer. npx fetches the bridge when your client starts it. If the file already has an mcpServers block, add the "viafrei" entry inside it rather than pasting a second block.

An older client on HTTP+SSE is answered too, at https://mcp.viafrei.de/sse. The transport is deprecated in the specification, so prefer the address above when you can:

claude mcp add --transport sse viafrei https://mcp.viafrei.de/sse

Restart the client and ask one of the questions above.

Where to find ViaFrei

🧰 Everything it can do

20 tools, 9 prompts, 10 resources and 2 resource templates — server 1.7.3, snapshot of 2026-10-04. Each line is the server's own words; the full parameters are in API.md.

🚗 On the road

tool

what it answers

check_autobahn_traffic — Autobahn traffic

Returns jams, slow traffic, closures and roadworks in force this minute on up to 5 German motorways, with delay and speed.

check_road_status — Road status and closures

Returns whether one German motorway or federal road is open, closed or restricted, now and in the coming days.

find_roadworks_ahead — Planned roadworks

Returns the roadworks PLANNED on one German motorway inside a date window: the section and direction as published, what is restricted, and the start and end.

find_parking — Parking nearby

Returns parking near a place, a coordinate or along one motorway: rest areas with lorry spaces, car parks and park-and-ride sites, with total spaces and, where published, free spaces now and the reading's age.

🚆 Public transport

tool

what it answers

get_train_departures — Train departures

Next departures from a German railway station, with platform, delay and cancellations.

get_departures — Scheduled departures (bus, tram, train)

Scheduled departures from any German public-transport stop — bus, tram, U-Bahn, S-Bahn, train, ferry — with line, destination, platform.

check_transit_disruption — Public-transport disruption in a region

Returns how punctual public transport is right now in one German region: the share of distinct trips at least once more than 5 minutes late, trips with a cancelled stop, the trend against the previous window, and how many trips that rests on.

check_station_facilities — Station lifts and escalators

Report whether a German railway station's lifts and escalators are working right now: each one, where it is, its state (in service / out of service / unknown) and the operator's own explanation.

⚡ Charging and fuel

tool

what it answers

find_charging_station — EV charging nearby

Returns EV charging sites near a place or coordinate with operator, connector types, maximum power, price per kWh where published, and how many points are free right now where the operator publishes live status.

find_cheapest_fuel — Cheapest fuel nearby

Returns the cheapest stations for one fuel grade near a place or coordinate: price per litre, brand, address, distance, open state.

find_fuel_station — Find a filling station

Finds filling stations around a place or coordinate under any combination of filters — grade, brand, name, open now, open at a time you name, open 24 h — sorted by distance, price or name.

📍 Places and addresses

tool

what it answers

find_place — Look up a place

Looks up a place name and returns every place that matches, each with its kind, official key (AGS/RS), population, English name and coordinate.

find_poi — Find a named place

Finds a named business or landmark — company, shop, clinic, hotel — and returns its address, category and coordinate.

find_address — Look up a street address

Looks up a street address and returns its coordinate, plus what OpenStreetMap holds under it.

describe_location — Describe a coordinate

Turns a coordinate into words: the nearest address, settlement, Kreis, administrative area and motorway junction, each with its own distance.

find_nearby — What is nearby

Overview of what is around a place or coordinate: nearby fuel stations, EV charging, parking, the nearest railway station and motorway junction, each with its distance.

🌦️ Weather and rules

tool

what it answers

check_weather_warnings — Official weather warnings

Returns the official DWD weather warnings in force for a place or coordinate — storm, snow, ice, heavy rain, thunderstorm, heat — with the DWD's own Warnstufe 1–4, the area, the local validity window and the official text unaltered.

get_driving_rules — German driving rules

Returns the German road rules a visitor needs: low-emission zones (Umweltzone) and which Feinstaubplakette a city requires, speed limits (advisory 130), winter tyres, alcohol, the Sunday lorry ban, tolls (no car toll), Rettungsgasse, what must be in the car, and electric cars (E-Kennzeichen, ad-hoc payment, plugs).

🔔 Watches

tool

what it answers

watch_situation — Watch for a change

Opens a watch so THIS conversation is told when something changes: a road reopening, a stop running late, a weather warning starting, a charge point turning free.

stop_watch — Stop a watch

Ends a watch this conversation opened with watch_situation, so no further change notifications arrive for it.

🧭 Prompts — ready-made briefings

Pick one in your client's prompt menu and fill in the blanks; it calls the right tools in the right order.

prompt

what it does

plan_departure — Trip briefing before departure — Reise-Briefing vor der Abfahrt

Briefs a drive that is about to start: the official weather warnings at both ends, whether each motorway is open, and the jams in force this minute, ending in one go/no-go sentence.

compare_travel_options — Drive or take the train? — Auto oder Bahn?

Weighs one trip by car against the same trip by rail: closures and live jams on the motorway side, the next departures and the region's punctuality on the rail side, as two paragraphs the traveller can compare.

prepare_car_trip — What you need before driving in Germany — Vorbereitung der Autofahrt

Collects what a driver must carry and know before driving in Germany and into one particular city: the low-emission-zone badge, speed limits, winter tyres, the alcohol limit, tolls, mandatory equipment and the rules for an electric car.

plan_fuel_stop — Refuel or charge on the way — Tank- oder Ladestopp unterwegs

Finds where this traveller fills up or charges on the way: the cheapest stations for one fuel grade around one place, or the charging points with the right connector and power, and the rest area beside them if they also need a break.

plan_commute — Plan today's commute by train — Pendelfahrt für heute planen

Plans one public-transport leg on the day itself: the next departures from the station with delays, platforms and cancellations, and whether the region's buses and trains are running normally at this hour.

plan_arrival_parking — Where to leave the car on arrival — Parken am Ziel

Finds where to leave the car at the end of the drive: the car park in town, the park-and-ride at the edge with the onward departures, or the rest area if the traveller is early.

find_a_place — Find out what a name refers to — Herausfinden, was ein Name meint

Resolves a bare name of unknown kind into a place, a named thing, or an address, trying each table in turn and stopping at the first that answers.

plan_local_errand — What is around this place? — Was ist hier in der Nähe?

Answers "what is around here" for one place: the nearest fuel, EV charging, parking, railway station and motorway junction in one glance, then — only if the traveller wants more than the nearest one — the depth tool for that one category.

explain_this_coordinate — Say where a coordinate is — Sagen, wo eine Koordinate liegt

Turns a bare lat/lon into a sentence a traveller understands: the nearest address, settlement, Kreis, administrative area and motorway junction, each with its own distance.

📚 Resources — reference your assistant can read

resource

what it holds

viafrei://attribution — Data sources & attribution

Licence and attribution text for every data source ViaFrei uses.

viafrei://coverage — Coverage

Which feeds, places and vehicles ViaFrei can answer for right now — licence, cadence and freshness per feed, plus what is deliberately not covered.

viafrei://rules/driving-in-germany — Driving in Germany — the rules a visitor needs (DE/EN)

Curated, sourced and dated: low-emission zones, speed, winter tyres, alcohol, tolls, the Sunday lorry ban, equipment, emergencies and electric driving.

viafrei://rules/low-emission-zones — Low-emission zones (Umweltzonen) — city, zone, plaque, where to buy it (DE/EN)

Which German cities run a low-emission zone, which Feinstaubplakette they require and where to buy it.

viafrei://emergency — Emergency in Germany — 112, 110, rescue lane, breakdown, crash (DE/EN)

What to dial, how to form the Rettungsgasse, what to do in a breakdown or after a crash, and what the law requires you to carry.

viafrei://rules/electric-driving — Electric driving in Germany — E plate, charging, payment, plugs (DE/EN)

What an electric car needs in Germany: the E-Kennzeichen and why its privileges differ per city, the green plaque, the right to ad-hoc card payment, plug standards, how prices are shown, etiquette and what to do in an emergency.

viafrei://status/feeds — Feed status

Per feed: is it still arriving?

viafrei://watches — My watches

The watches THIS conversation has open, with what each one is watching and when it expires.

viafrei://gazetteer — Gazetteer coverage

What the place index (gazetteer_places) holds: rows and last load per source and kind, how many carry an English name, and the sixteen Länder it can name — the coverage behind find_place/find_poi/find_nearby's place answers.

viafrei://addresses — Address coverage

What the OSM-derived address table (osm_addresses) holds per Bundesland — rows and the extract date — plus the ODbL § 4.6 offer owed to anyone who receives an address-derived result.

viafrei://watch/{id} — One watch

One watch of this conversation: what is being watched, what it has reported, and the attribution of the data behind each report.

viafrei://place/{query} — A resolved place

One place, poi or address resolved the same way every tool resolves place — a point, a short list of candidates, or an honest no — so a name can be pinned once and reused as lat/lon.

The running server is the source of truth. This list and API.md are rendered from a dated snapshot of it, and CI fails if either drifts from that snapshot. Ask any MCP client for tools/list to see what is live this minute.

Worked use cases

Walkthroughs that chain several tools, each naming what comes back:

🛠️ For developers

It's plain MCP over HTTP. You can call it without an SDK:

# 1. open a session
curl -si https://mcp.viafrei.de/mcp \
  -H 'content-type: application/json' -H 'accept: application/json, text/event-stream' \
  -d '{"jsonrpc":"2.0","id":1,"method":"initialize","params":{"protocolVersion":"2025-06-18","capabilities":{},"clientInfo":{"name":"me","version":"0"}}}' \
  | grep -i mcp-session-id

# 1b. tell the server you are ready — the MCP lifecycle requires it before any request
curl -s https://mcp.viafrei.de/mcp \
  -H 'content-type: application/json' -H 'accept: application/json, text/event-stream' \
  -H 'mcp-session-id: <from step 1>' -H 'mcp-protocol-version: 2025-06-18' \
  -d '{"jsonrpc":"2.0","method":"notifications/initialized"}'

# 2. ask a question (put the session id from step 1 in the header)
curl -s https://mcp.viafrei.de/mcp \
  -H 'content-type: application/json' -H 'accept: application/json, text/event-stream' \
  -H 'mcp-session-id: <from step 1>' -H 'mcp-protocol-version: 2025-06-18' \
  -d '{"jsonrpc":"2.0","id":2,"method":"tools/call","params":{"name":"check_weather_warnings","arguments":{"place":"Freiburg im Breisgau","language":"en"}}}'
  • One endpoint instead of a stack of integrations. SOURCES.md lists the publishers behind it, among them Autobahn GmbH, Deutsche Bahn, DWD, DELFI, the national access point Mobilithek, BKG, GeoNames, OpenStreetMap and MTS-K. Each has its own format, release rhythm and licence, and they arrive here as one protocol.

  • Results are written to be read aloud. A tool answers in sentences an assistant can pass on, says what it does not know ("no status data means unknown, not free"), and ends with the source line.

  • Annotated honestly. Eighteen of the twenty tools are read-only and idempotent (readOnlyHint, idempotentHint), so a client can call them without a confirmation prompt. The two watch tools are not, because opening or stopping a watch changes what the server will tell you later, and their annotations say so.

  • Prompts and resources, not only tools. Nine ready-made briefings, and a reference shelf (driving rules, emission zones, emergency numbers, attribution) your assistant can read directly.

  • Watches. watch_situation turns polling into a notification for as long as the session lives: a road closure appearing or clearing, a stop's departures running late, a region's late share reaching a threshold (a quarter by default), a DWD warning coming into force, a charge point turning free. Three hours by default, 24 at most, and at most 10 per session. What a watch has reported is readable at viafrei://watches and viafrei://watch/{id}, and a client that subscribes to that resource is told when it reports something new. It reaches no inbox and no phone.

  • Machine-readable failures, in the bridge too: one line on stderr and a distinct exit code per cause (see below).

Bridge configuration

option

what it does

--url <url>

endpoint to relay to. Default https://mcp.viafrei.de/mcp. See the note below

--header "Name: value"

extra HTTP header on every request, repeatable. For an API key, when there is one

--timeout <ms>

per-request timeout, default 30000. The event stream is never timed out

--version, --help

print and exit

Many MCP clients can only pass an env block, not arguments, so every option has an environment variable too:

variable

same as

VIAFREI_MCP_URL

--url

VIAFREI_MCP_HEADER

--header. Separate several headers with a newline, which can never appear in a header name or value. That way nothing you might need to send is unrepresentable: a comma, a semicolon and a space all occur inside real header values

VIAFREI_MCP_TIMEOUT_MS

--timeout

A flag wins over the variable, and the variable wins over the built-in default. A --header of the same name replaces one from the variable; a --header of a different name is added alongside it.

There is no self-hosted ViaFrei. The server is a hosted service. --url is not a way to run your own: it exists for a proxy or gateway in front of the service, and for the stub server this repository's test suite starts.

When something is wrong

The bridge prints one line to stderr and exits with a code that says what happened. No stack traces:

viafrei: cannot reach https://example.invalid/mcp: host not found (DNS) (ENOTFOUND) - check your network connection; --url only if you relay through a proxy

The same text also goes back to the client as a JSON-RPC error, so an assistant can say what went wrong instead of going quiet.

exit

meaning

0

clean shutdown (the client closed stdin, or sent SIGINT/SIGTERM)

1

something else went wrong; the line says what

2

bad usage: a flag or a value the bridge does not accept

3

the endpoint could not be reached, stopped answering, or never answered in time

4

the endpoint answered and the bridge cannot continue: it refused (the line names the HTTP status), forgot the session, answered with something that is not MCP, or redirected to another origin

5

protocol version mismatch; the line names the version the server speaks

A slow call may be a retried call. A 429, 502, 503 or 504 is tried again once, after the delay the server asked for in Retry-After, or 250 ms when it asked for none. A connection that fails outright (reset, broken pipe, socket or connect timeout) is tried once more after 250 ms. Two cases are not retried, because waiting would be worse than answering: a 429 with no usable Retry-After, and any requested delay longer than your timeout. An event stream is never retried.

Your timeout bounds each request, not the whole call. Two attempts plus a delay can add up to about three times the timeout, and more if the endpoint redirects. If you need a hard ceiling, enforce it on your side.

An established session may wobble: a dropped event stream is a warning, and the bridge reconnects. It may not stay dead in silence. Several failures in a row with nothing succeeding in between end the process with the code above, so the client that started it finds out.

What the bridge does not do

  • No tracking. No telemetry, no analytics, no usage counter, no update check.

  • No stored files or credentials. It writes no file outside the OS temp directory. --header is passed through to the endpoint and is never persisted or logged.

  • No cross-origin redirects. A redirect off the origin you pointed it at is refused with one line naming both ends, so a server cannot forward your API key somewhere you did not choose. Same-origin redirects are followed normally.

💼 For businesses

  • The licence work is done, and it travels with the answer. Each result carries the attribution its sources require. Where a source attaches a condition, the result states it: share-alike is flagged, and the MTS-K purpose limit arrives as a sentence you are meant to show.

  • Built for answering people. Live figures, sourced and dated, in the language of the question. Good for travel and mobility assistants, dispatchers' briefings, customer service and step-free station checks.

  • Read the business page: viafrei.de/en/business. It covers six use cases and how to work with us.

⚖️ Using the data you get back

Every result carries an attribution line. Show it to the person reading the answer. The full register is at the resource viafrei://attribution, and SOURCES.md is the readable version: every publisher, what it covers, its licence, and the exact line to reproduce.

Two constraints matter more than the rest, because getting them wrong is a licence breach rather than a style problem:

  • MTS-K fuel prices are consumer information only. No redistribution in any form, including aggregates, comparisons, price tables and anything derived. Answer the person who asked; do not build a product out of it. (This is also why this page shows no fuel price.)

  • DELFI public-transport data is Creative Commons Attribution-ShareAlike. Share-alike travels with anything you derive from it: recompute it, reshape it, rearrange it or build a delay table out of it, and that is Adapted Material you must license under BY-SA (art. 1(a) names material "translated, altered, arranged, transformed, or otherwise modified"). Merely showing it beside another source's data is an aggregation and puts no obligation on the other source. The catalogue record for the realtime feed names no licence version, so do not rely on one for a derivative; SOURCES.md has the detail.

See also NOTICE and LICENSE.

🗣️ Tell us when an answer is wrong

ViaFrei is live, free, and still growing. Some sources are thinner than they will be, and a tool can be slow or wrong. A tool that fails is something the server sees. A tool that answers confidently with the wrong thing is not. Use the A tool answered badly, or not at all issue template, saying what you asked and what came back. That report is the one thing we cannot get any other way.

The server itself

The MCP server is a hosted service, and its source is closed. It is not in this repository and is not published. What is public is the part meant to be: the tool names, descriptions, input schemas, result shapes and attribution lines, which is everything a client reads from tools/list. We say this plainly so nobody spends an evening looking for the server code.

Contributing · Security · Licence

  • Contributing: yes, please. See CONTRIBUTING.md and CODE_OF_CONDUCT.md. The bridge is small and self-contained, which makes it a good place for a first patch.

  • Security: never open a public issue for a key, a token or anything that looks like one. SECURITY.md has the private reporting path.

  • Licence: Apache-2.0 for this code. Data obtained through the server keeps its provider's licence; see NOTICE.

viafrei.de — Deutsch · English · Русский · Български · Українська · Română · Türkçe

Available Tools

20 tools
check_autobahn_trafficA
Read-onlyIdempotent

Returns jams, slow traffic, closures and roadworks in force this minute on up to 5 German motorways, with delay and speed. Use when the question is about the road now: Stau, a delay, how it looks, or which closures are reported; name every motorway (Munich→Berlin: A9). Do NOT use for whether a road is open or passable — check_road_status at any clock — nor a closure with no time word or a later one (tonight, the weekend); for Baustellen dated or geplant — find_roadworks_ahead; nor city streets, fuel (find_cheapest_fuel) or trains (get_train_departures). ~5 min old. Show the attribution line.

ParametersJSON Schema
NameRequiredDescriptionDefault
kindsNoWhich event kinds to return: warning = live traffic (jams, slow traffic, hazards), closure = full closures, roadworks = construction sites. Set it when the SUBJECT of the question is one of those categories by name: "Baustellen auf der A8?" is ["roadworks"], "welche Sperrungen sind in diesem Moment gemeldet?" is ["closure"]. Omit it when the question is how the road IS — Stau, frei, a delay, "wie sieht es aus", "everything"; the German "Stau?" is the idiom for the whole picture, and a filter nobody asked for hides the closure on the same stretch. Whether a closure question is this tool's at all is decided by two things, and the noun (Sperrung, Vollsperrung, closure) is neither. FIRST THE CLOCK: only a question about this minute (jetzt, gerade, in diesem Moment, right now, at this very minute) can be this tool's — with no time word at all, or for a later window (tonight, heute Abend, am Wochenende, the coming days), it is check_road_status. SECOND, WHAT IS ASKED, which the clock cannot see: what is REPORTED or in force on a named motorway is this tool ("ist auf der A5 in diesem Moment eine Vollsperrung gemeldet?", "which closures are in force on the A100 at this very minute?"), while whether the road is OPEN or passable is check_road_status AT ANY CLOCK — "ist die A8 offen", "ist die A3 in diesem Moment gesperrt?", "komme ich da durch?" — and so is a closure asked around a town instead of on a motorway number. Baustellen with a date or the word geplant are find_roadworks_ahead. Default: all three.
limitNoMaximum events to return across all roads (1–50, default 10). Roads keep the order you listed them; within a road, jams come first, then closures and roadworks.
roadsYesAutobahn numbers, e.g. ["A9"] or ["A8", "A99", "A9"] (1–5 per call). Name every motorway on the route so the whole drive is briefed in one call — "A9", "A 9" and "a9" are the same road. Results are grouped per road, in the order you list them.
cursorNoPagination cursor from a previous result's _meta.nextCursor. Omit for the first page.
languageNoSet this on every call to the language the person is writing in: "en" if they wrote English, "de" if they wrote German. Do not leave it out because it has a default — the default is only the fallback when the language is genuinely unclear, and an English question answered in German is a wrong answer. Place names, station names and road numbers are never translated in either language; in English the German term is kept in parentheses so the person recognises it on signs and in local apps.de

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, openWorldHint=false and destructiveHint=false, so the safety profile is covered. The description adds genuine behavioral context beyond that: the data is '~5 min old' and the caller must 'Show the attribution line', both of which an agent cannot infer from structured fields.

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?

Purpose is front-loaded in the first sentence, followed by routing rules and a data-freshness note. It is dense and long, but nearly every clause carries routing or constraint information; only the abrupt 'Show the attribution line' tail feels tacked on.

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?

With no output schema, the description still characterizes the payload (event kinds with delay and speed, grouped per road in listed order) and points to cursor pagination via _meta.nextCursor. The only shortfall is that the exact shape of each event is left implicit.

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 100%, so the schema already documents roads, kinds, limit, cursor and language in depth. The description only reinforces the roads cap ('up to 5 motorways') and does not add syntax or format meaning beyond the schema, so the baseline 3 applies.

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?

States a specific verb and resource: 'Returns jams, slow traffic, closures and roadworks in force this minute on up to 5 German motorways, with delay and speed.' It goes further and names the siblings it must not be confused with (check_road_status, find_roadworks_ahead), so an agent can distinguish it without opening any schema.

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

Usage Guidelines5/5

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

Explicit when-to-use ('the question is about the road now: Stau, a delay, how it looks') and when-not ('Do NOT use for whether a road is open or passable', later time windows, city streets, fuel, trains), each paired with the alternative tool by name. The clock-vs-question routing rule is spelled out in full.

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

check_road_statusA
Read-onlyIdempotent

Returns whether one German motorway or federal road is open, closed or restricted, now and in the coming days. Use when the question is whether the road is open or passable — "ist die A8 offen", "ist die A8 in diesem Moment gesperrt", "komme ich durch" — at any clock, plus closures tonight, at the weekend or with no time word. Do NOT use for jams and delays, a whole multi-motorway route, or what is reported on a motorway this minute — call check_autobahn_traffic; for roadworks over a date window — find_roadworks_ahead. One road per call, ≤ 14 days, ≤ 11 entries. Show the attribution line.

ParametersJSON Schema
NameRequiredDescriptionDefault
latNoLatitude in WGS 84, e.g. 48.137. Use with lon when the caller already holds coordinates; otherwise use place.
lonNoLongitude in WGS 84, e.g. 11.576. Use with lat; otherwise use place.
roadNoOne German motorway or federal road, e.g. "A8" or "B27". "A8", "A 8" and "a8" are the same road. Use this whenever the person named a road — it is the only input that reaches the planned-works data, which is filed by road and section and carries no coordinates. Give exactly one of road, place, or lat+lon.
limitNoMaximum entries to return (1–11, default 10). Closures come first, then restrictions in force, then planned works.
placeNoWhere to look, as free text: a city ("München", "Munich"), a district or Kreis ("Kreis Fulda"), a Bundesland, a station or stop ("Hamburg Hbf"), a motorway ("A7"), or a street address with a house number ("Hauptstraße 12, 36037 Fulda"). Use this instead of coordinates whenever the person named a place. An address needs its town or postcode — a street and a number alone exist in many towns. Give either place OR lat+lon, never both.
languageNoSet this on every call to the language the person is writing in: "en" if they wrote English, "de" if they wrote German. Do not leave it out because it has a default — the default is only the fallback when the language is genuinely unclear, and an English question answered in German is a wrong answer. Place names, station names and road numbers are never translated in either language; in English the German term is kept in parentheses so the person recognises it on signs and in local apps.de
horizon_daysNoHow many days ahead to look, counting from now (0 = right now only, max 14, default 3). Set it only to what the person actually asked for: 0 when they said right now / gerade / jetzt / in diesem Moment, 1 for tonight or heute Abend, 3 for "this weekend", 7 for "next week", and for a named weekday ("am Freitag", "on Friday") the number of days from today to that day. A bare "is the A8 open?" asks for no window — omit the argument and take the default rather than reading it as 0. Live closures are always included whatever this is.

TDQS

A4.5/5.0
Behavior4/5

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

Annotations already carry readOnlyHint/idempotentHint/openWorldHint/destructiveHint so safety profile is covered. The description adds operational constraints beyond annotations: one road per call, ≤14 days, ≤11 entries, and a required 'show the attribution line' instruction, which the annotations do not express.

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?

Front-loads the purpose, then when-to-use, then exclusions, then constraints. Dense but no filler; every clause is functional. Slightly long but the length is justified by the routing and horizon heuristics.

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?

No output schema, so the description must convey return semantics: it does via 'closures come first, then restrictions in force, then planned works' (from the limit param) and 'live closures are always included'. What isn't covered is the shape of a single entry, but the routing, constraints, and attribution requirement make it complete enough to invoke correctly.

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

Parameters4/5

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

Schema coverage is 100%, so baseline is 3. Description adds meaning beyond the schema by stating the exclusivity rule among road/place/lat+lon and the horizon_days heuristic mapping ('this weekend' → 3, named weekday → days from today, bare question → omit). This is genuinely beyond what the schema properties say.

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?

States a specific verb+resource: returns open/closed/restricted status for one German motorway or federal road, now and in coming days. Explicitly distinguishes from siblings (check_autobahn_traffic, find_roadworks_ahead) by naming what it is NOT for.

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?

Gives explicit when-to-use with quoted example phrasings, plus a clear 'Do NOT use for' section that routes to two named alternatives with their distinguishing conditions. Turn-by-turn routing for an agent is unusually complete.

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

check_station_facilitiesA
Read-onlyIdempotent

Report whether a German railway station's lifts and escalators are working right now: each one, where it is, its state (in service / out of service / unknown) and the operator's own explanation. Use when someone asks about step-free access or a broken lift — "Funktioniert der Aufzug am Kölner Hauptbahnhof?", "is the lift at Hamburg Hbf working?", "Rolltreppe kaputt?", travelling with a wheelchair, a pram or heavy luggage. Do NOT use for train times, platforms or delays — call get_train_departures. At most 50 facilities, out-of-service ones first. Results carry their attribution line.

ParametersJSON Schema
NameRequiredDescriptionDefault
limitNoHow many facilities to list (1–50, default 20). Out-of-service equipment is listed first and the counts in the summary always cover ALL of them, so a shorter list never hides a broken lift.
eva_noNoThe station's EVA number (6–8 digits, e.g. 8000207 for Köln Hbf), when a previous result — a departure board, for instance — already gave you one. It skips the name lookup and is exact.
stationNoThe railway station, as the person says it: "Köln Hbf", "Hamburg Hbf", "Munich Central". Pass their words — English names and "central station" are understood. If the name fits several stations the result lists them and asks which; do not guess one yourself. Give either station OR eva_no, never both.
facilityNoWhich equipment to report: "elevator" for lifts only, "escalator" for escalators only, "any" for both (default). Pass a value only when the person named the equipment itself ("Aufzug", "Rolltreppe", "lift", "escalator"): a question about a wheelchair, a pram, heavy luggage or step-free access keeps the default — an escalator carries a suitcase too, and a filter there hides half of what the traveller needs. Filtering does not change how a broken one is reported, only which ones are listed.any
languageNoSet this on every call to the language the person is writing in: "en" if they wrote English, "de" if they wrote German. Do not leave it out because it has a default — the default is only the fallback when the language is genuinely unclear, and an English question answered in German is a wrong answer. Place names, station names and road numbers are never translated in either language; in English the German term is kept in parentheses so the person recognises it on signs and in local apps.de

TDQS

A4.5/5.0
Behavior4/5

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

Annotations already declare readOnly/openWorld/idempotent/non-destructive, so the bar is lower, and the description still adds real traits: a hard 50-facility cap, out-of-service-first ordering, and the fact that results carry an attribution line. It does not discuss error/ambiguity behaviour beyond the schema, so a 4 rather than a 5.

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?

Front-loaded with the purpose, then usage triggers, then the explicit exclusion, then behavioral facts. It is long but every clause carries distinct information (examples, exclusion, cap, ordering, attribution) with no filler.

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?

With no output schema, the description supplies the return shape (each facility, its location, state of in service/out of service/unknown, and operator explanation) plus attribution, while annotations carry the safety profile. An agent has everything needed to call it and interpret the result.

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 100% and the parameter docs are unusually rich (station-vs-eva_no mutual exclusion, enum guidance, language default warning), so the baseline is 3. The description's only added parameter meaning is the 50-cap and out-of-service-first ordering tied to limit, which the schema also states.

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?

States a specific verb and resource (report working state of a German station's lifts and escalators) plus the exact returned fields: per-facility state and operator explanation. It also names the sibling it is not (get_train_departures), so an agent can separate it from departure tools without opening either schema.

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?

Gives explicit when-to-use triggers with real multilingual example utterances ("Funktioniert der Aufzug am Kölner Hauptbahnhof?", wheelchair/pram/luggage scenarios) and an explicit when-not-to-use rule routing to get_train_departures for times, platforms and delays. Nothing is left to inference.

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

check_transit_disruptionA
Read-onlyIdempotent

Returns how punctual public transport is right now in one German region: the share of distinct trips at least once more than 5 minutes late, trips with a cancelled stop, the trend against the previous window, and how many trips that rests on. Use when the user asks whether buses and trains are running normally, or whether a strike or storm is disrupting local transport. Do NOT use for one line, trip or station — per-line realtime is unavailable; the region's figures are the answer. Region-wide aggregates only; window ≤ 120 min. CC BY-SA (share-alike): show the attribution line to the user.

ParametersJSON Schema
NameRequiredDescriptionDefault
latNoLatitude in WGS 84, e.g. 48.137. Use with lon when the caller already holds coordinates; otherwise use region.
lonNoLongitude in WGS 84, e.g. 11.576. Use with lat; otherwise use region.
regionNoThe German region to report on, as free text: a Bundesland ("Bayern", "Bavaria", "Nordrhein-Westfalen"), a city ("Hamburg", "Köln"), a Kreis ("Landkreis Fulda") or one of the conurbations Ruhrgebiet, Rhein-Ruhr and Rhein-Main. A town inside a Kreis is reported as that Kreis and the answer says so, because the data is filed at Kreis level. Not a stop, not a street, not an address. Give either region OR lat+lon, never both.
languageNoSet this on every call to the language the person is writing in: "en" if they wrote English, "de" if they wrote German. Do not leave it out because it has a default — the default is only the fallback when the language is genuinely unclear, and an English question answered in German is a wrong answer. Place names, station names and road numbers are never translated in either language; in English the German term is kept in parentheses so the person recognises it on signs and in local apps.de
window_minNoHow many minutes back to look, 5–120 (default 60). The trend compares this window with the equally long one before it, so 60 means "the last hour against the hour before". Use a short window for "right now" and a long one for "has it been bad all morning".

TDQS

A4.8/5.0
Behavior4/5

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

Annotations already declare read-only, idempotent, non-destructive behavior, so the safety profile is covered. The description adds valuable non-annotation context: the region-vs-line data limitation, the aggregation constraint, the license with an obligation to show attribution, and the direction to set language on every call. Missing only return-shape/pagination details, which are less relevant for an aggregate tool.

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?

Front-loaded with purpose, then when-to-use, then exclusions, then constraints, then attribution. Every clause earns its place; no filler.

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 five parameters, no output schema, and an open-world-free read-only operation, the description supplies the remaining decision-relevant facts: use case, exclusions, aggregation limits, window semantics, bilingual behavior, and the CC BY-SA attribution requirement. Nothing material for correct invocation 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 coverage is 100%, so the baseline is 3, but the description still adds meaning beyond the schema: it clarifies that lat/lon are alternatives to region ('either region OR lat+lon, never both'), states the window cap, and stresses that language must be set on every call regardless of default. That is genuine value on top of the structured fields.

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?

States a specific verb+resource+scope: punctuality of public transport in one German region, with enumerated metrics (share of trips >5 min late, cancelled stops, trend, sample size). It is distinguishable from siblings such as check_autobahn_traffic and check_road_status by being explicitly rail/bus network punctuality rather than road conditions.

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?

Gives explicit when-to-use ('whether buses and trains are running normally, or whether a strike or storm is disrupting local transport') and an explicit exclusion ('Do NOT use for one line, trip or station — per-line realtime is unavailable'), plus a hard constraint (region-wide aggregates only, window ≤ 120 min). An agent can route to this tool without further inference.

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

check_weather_warningsA
Read-onlyIdempotent

Returns the official DWD weather warnings in force for a place or coordinate — storm, snow, ice, heavy rain, thunderstorm, heat — with the DWD's own Warnstufe 1–4, the area, the local validity window and the official text unaltered. Use when someone asks about weather for a trip, whether it is safe to drive somewhere, or about storm, snow or ice warnings. Do NOT use for a plain forecast (not offered: warnings only) or for closures and jams (call check_autobahn_traffic). Says so when the data is not current instead of reporting an all-clear. Show the result's attribution line to the user.

ParametersJSON Schema
NameRequiredDescriptionDefault
latNoLatitude in WGS 84, e.g. 48.137. Use with lon when the caller already holds coordinates; otherwise use place.
lonNoLongitude in WGS 84, e.g. 11.576. Use with lat; otherwise use place.
placeNoWhere to look, as free text: a city ("München", "Munich"), a district or Kreis ("Kreis Fulda"), a Bundesland, a station or stop ("Hamburg Hbf"), a motorway ("A7"), or a street address with a house number ("Hauptstraße 12, 36037 Fulda"). Use this instead of coordinates whenever the person named a place. An address needs its town or postcode — a street and a number alone exist in many towns. Give either place OR lat+lon, never both.
languageNoSet this on every call to the language the person is writing in: "en" if they wrote English, "de" if they wrote German. Do not leave it out because it has a default — the default is only the fallback when the language is genuinely unclear, and an English question answered in German is a wrong answer. Place names, station names and road numbers are never translated in either language; in English the German term is kept in parentheses so the person recognises it on signs and in local apps.de
min_levelNoLowest official DWD level to report, 0–4 (default 0, i.e. everything). The DWD's own names: 1 = Wetterwarnung, 2 = Markante Wetterwarnung, 3 = Unwetterwarnung, 4 = Warnung vor extremem Unwetter; 0 = Vorabinformation Unwetter, an advance notice that is not yet a Warnstufe. Raise it ONLY when the question names a level or a Warnstufe in so many words ("ab Stufe 3", "level 3 or higher", "nur Stufe 4"). Unwetter, Unwetterwarnung, severe and storm are the ordinary way to ask about bad weather, not a filter: leave it at 0 there — a level the caller filtered away is a warning the person is never told about.

TDQS

A4.6/5.0
Behavior5/5

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

Annotations already establish readOnly/openWorld/idempotent/non-destructive, and the description adds genuinely new behavior: it reports data staleness rather than defaulting to an all-clear, and requires surfacing the attribution line to the user. Those are operational traits an agent could not infer from annotations or schema.

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?

Front-loaded with purpose, then use/do-not-use, then behavioral caveats and display requirement. Dense but each sentence carries signal; slightly over-long with the parenthetical hazard list, which is the only marginal fat.

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

Completeness5/5

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

For a read-only warning lookup with no output schema, the description names the returned components (Warnstufe, area, validity window, official text), the freshness caveat, and the attribution obligation — everything an agent needs to call and present the result correctly.

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

Parameters3/5

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

Schema description coverage is 100% and each parameter (lat/lon vs place, language default, min_level) is documented in rich detail in the schema itself, including the place-vs-coordinates exclusivity. The description's mention of Warnstufe 1–4 loosely frames min_level but adds no new parameter guidance, so the baseline 3 applies.

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?

States a specific verb (returns) and resource (official DWD weather warnings) with scope: the hazard types, Warnstufe 1–4, area, validity window and unaltered official text. It explicitly distinguishes itself from siblings by declaring 'warnings only' and routing closures/jams to check_autobahn_traffic.

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?

Gives concrete triggering situations (a trip, whether it is safe to drive somewhere, storm/snow/ice warnings) and explicit exclusions plus an alternative tool (check_autobahn_traffic for closures and jams; no plain forecast). This is as close to a complete when/when-not/alternative mapping as a definition gets.

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

describe_locationA
Read-onlyIdempotent

Turns a coordinate into words: the nearest address, settlement, Kreis, administrative area and motorway junction, each with its own distance. Use when you already HAVE a lat/lon and need to say where that is. Do NOT use to look up a place or address BY NAME — that is find_place, find_poi or find_address; this only goes coordinate to words. The gazetteer facts are the NEAREST point, not a boundary lookup — near a border it can differ, and the admin point can be a Regierungsbezirk, not a Land. OpenStreetMap ODbL 1.0 for the address; show the attribution line.

ParametersJSON Schema
NameRequiredDescriptionDefault
latYesLatitude of the point to describe (WGS84).
lonYesLongitude of the point to describe (WGS84).
languageNoSet this on every call to the language the person is writing in: "en" if they wrote English, "de" if they wrote German. Do not leave it out because it has a default — the default is only the fallback when the language is genuinely unclear, and an English question answered in German is a wrong answer. Place names, station names and road numbers are never translated in either language; in English the German term is kept in parentheses so the person recognises it on signs and in local apps.de

TDQS

A4.6/5.0
Behavior5/5

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

Annotations already declare readOnly/idempotent/non-destructive, yet the description adds genuinely new behavioral context: gazetteer facts are nearest-point not boundary lookups, results can differ near borders, the admin point may be a Regierungsbezirk rather than a Land, and OpenStreetMap ODbL 1.0 attribution must be shown. These are obligations and caveats the structured fields cannot convey.

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

Conciseness4/5

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

Front-loads the core definition and the exclusion before the caveats, so the most decision-relevant content comes first. It is dense and somewhat run-on in the middle clauses, but no sentence is filler.

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?

No output schema exists, so the description must characterize the return, and it does so explicitly by listing the five fact types and their per-fact distances. Combined with the attribution requirement and boundary caveats, an agent has everything needed to call it and present results correctly.

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

Parameters3/5

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

Schema description coverage is 100%, and the language parameter already carries a very detailed schema description, so the baseline of 3 applies. The prose adds no syntax or format guidance for lat/lon or language beyond what the schema states.

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 opening 'Turns a coordinate into words' states a precise verb+resource, and the description enumerates what comes back (address, settlement, Kreis, administrative area, motorway junction with distances). It explicitly distinguishes itself from find_place, find_poi and find_address, so an agent can route correctly without opening any schema.

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?

Both the trigger ('Use when you already HAVE a lat/lon') and the anti-trigger ('Do NOT use to look up a place or address BY NAME') are stated, and the three alternative siblings are named by name. This is the textbook when/when-not/alternatives pattern.

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

find_addressA
Read-onlyIdempotent

Looks up a street address and returns its coordinate, plus what OpenStreetMap holds under it. Use when the person gives a STREET AND NUMBER — "Hauptstraße 12, Fulda" — for the point, or to see what is mapped there. The coordinate passes to any other tool as lat/lon. Do NOT use for a town/district/station name alone (find_place) or a company/shop/landmark by name (find_poi) — needs a street and a number. At most 5 results; more than one means the door is mapped twice, not that the address is ambiguous. OpenStreetMap ODbL 1.0; show the attribution line.

ParametersJSON Schema
NameRequiredDescriptionDefault
limitNoHow many results to return (1–5, default 3) — more than one means the same address carries more than one OpenStreetMap object.
queryYesA street address, as a person writes one: street and house number, plus a town or postcode — "Hauptstraße 12, 36037 Fulda" or "Hauptstraße 12, Fulda". Both orders work. A street and number with neither a town nor a postcode cannot be placed (the same street name exists in about two thousand German towns) and is refused.
languageNoSet this on every call to the language the person is writing in: "en" if they wrote English, "de" if they wrote German. Do not leave it out because it has a default — the default is only the fallback when the language is genuinely unclear, and an English question answered in German is a wrong answer. Place names, station names and road numbers are never translated in either language; in English the German term is kept in parentheses so the person recognises it on signs and in local apps.de

TDQS

A4.6/5.0
Behavior4/5

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

Annotations already cover readOnly/idempotent/non-destructive, so the bar is lower; the description adds genuinely non-obvious traits: a hard cap of 5 results, the interpretation that multiple hits mean a doubly-mapped door rather than ambiguity, and an attribution obligation (ODbL 1.0 line). It does not discuss failure modes or rate limits, but the added context is substantive.

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?

Front-loads the core purpose and then the routing rules; every sentence carries information (trigger, exclusions, result semantics, license). It is dense but not padded, though the license sentence is a slight tail appendage.

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?

No output schema exists, and the description covers the return (coordinate plus OSM objects), the cardinality behavior, and the attribution requirement, so an agent has everything needed to call and interpret it correctly.

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

Parameters4/5

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

Schema coverage is 100%, so baseline is 3; the description still adds value by explaining that the query must carry a town or postcode to be placeable, that both field orders work, and that `language` must be set explicitly rather than left to its default. These are behavioral constraints the schema states only partially.

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?

States a specific verb and resource ('looks up a street address and returns its coordinate, plus what OpenStreetMap holds under it') and explicitly distinguishes itself from find_place and find_poi by input shape. An agent can select it without opening the schema.

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?

Gives positive triggers (street AND number given, or to see what is mapped there) and explicit exclusions routed to named siblings: town/district/station name alone → find_place, company/shop/landmark → find_poi. It also states the coordinate can be passed to any other tool as lat/lon.

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

find_charging_stationA
Read-onlyIdempotent

Returns EV charging sites near a place or coordinate with operator, connector types, maximum power, price per kWh where published, and how many points are free right now where the operator publishes live status. Use when an EV driver asks where to charge ("Wo kann ich laden?", "CCS 150 kW near Leipzig", "ist gerade eine Säule frei?"). Do NOT use for petrol or diesel — call find_cheapest_fuel; for E-Kennzeichen or Ladekarte rules — call get_driving_rules. Radius ≤ 25 km, ≤ 10 sites; availability is missing for most operators and is then unknown, never free. Show the attribution line.

ParametersJSON Schema
NameRequiredDescriptionDefault
latNoLatitude in WGS 84, e.g. 48.137. Use with lon when the caller already holds coordinates; otherwise use place.
lonNoLongitude in WGS 84, e.g. 11.576. Use with lat; otherwise use place.
limitNoHow many charging sites to return, nearest first (1–10, default 5).
placeNoWhere to look, as free text: a city ("München", "Munich"), a district or Kreis ("Kreis Fulda"), a Bundesland, a station or stop ("Hamburg Hbf"), a motorway ("A7"), or a street address with a house number ("Hauptstraße 12, 36037 Fulda"). Use this instead of coordinates whenever the person named a place. An address needs its town or postcode — a street and a number alone exist in many towns. Give either place OR lat+lon, never both.
languageNoSet this on every call to the language the person is writing in: "en" if they wrote English, "de" if they wrote German. Do not leave it out because it has a default — the default is only the fallback when the language is genuinely unclear, and an English question answered in German is a wrong answer. Place names, station names and road numbers are never translated in either language; in English the German term is kept in parentheses so the person recognises it on signs and in local apps.de
connectorNoPlug the car needs: "ccs2" (CCS Combo 2 — the DC fast-charging standard on almost every European EV), "type2" (Typ 2 / Mennekes, the AC socket) or "chademo" (older Japanese DC, e.g. Nissan Leaf). Omit unless the person named their plug or their car model — filtering on a guess hides chargers they could have used.
radius_kmNoSearch radius around the place in kilometres (1–25, default 10). A charging stop is worth a detour, so this is wider than the fuel radius — but 25 km is the cap, and a larger circle is a dataset request rather than a driver's question.
min_power_kwNoOnly charging points of at least this many kW (1–1000). Use when the person asks for fast charging or names a number: 50 = DC fast, 150 = HPC, 300 = the fastest posts in Germany. Omit for "where can I charge" — 11 kW overnight is a valid answer to that question.
only_availableNoWhen true, return only sites with at least one point reported FREE right now. Default false. Use it when the person asks what is free at this moment. Note that only some operators publish live status: the result always says how many nearby sites were dropped because their status is unknown, so the filter never silently hides a charger that may well be free.

TDQS

A4.6/5.0
Behavior5/5

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

Beyond the readOnly/idempotent annotations, it discloses non-obvious behavior: availability is missing for most operators and must be reported as unknown, never as free; the radius and result caps are hard limits; and the caller must display the attribution line. These are real operational constraints 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.

Conciseness4/5

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

It is front-loaded with the purpose and return fields, then routing rules, then limits — a sensible order. It is dense and runs long, but nearly every clause (exclusions, unknown-status caveat, attribution) carries distinct information, so little is wasted.

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?

With no output schema, the description still explains the return payload, the uncertainty in the availability field, and the hard caps on radius and site count. For a 9-parameter, zero-required tool, an agent has everything needed to call it correctly and interpret results.

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 100%, so the schema already documents every parameter, including place-vs-coordinate exclusivity, connector semantics and min_power_kw guidance. The description restates the radius and result caps but adds no parameter detail beyond the schema, so the baseline of 3 applies.

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 gives a specific verb and resource ('Returns EV charging sites near a place or coordinate') and enumerates the returned fields (operator, connector types, max power, price per kWh, free-point counts). It explicitly distinguishes itself from the nearest siblings, find_cheapest_fuel and get_driving_rules, so an agent can route without opening any schema.

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?

It states when to use the tool with concrete driver-style triggers ('Wo kann ich laden?', 'CCS 150 kW near Leipzig') and gives explicit when-NOT-to-use rules naming the correct alternatives for fuel and for E-Kennzeichen/Ladekarte questions. Nothing is left to inference.

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

find_cheapest_fuelA
Read-onlyIdempotent

Returns the cheapest stations for one fuel grade near a place or coordinate: price per litre, brand, address, distance, open state. Use when the user asks where to fill up or what fuel costs. Do NOT use for charging an electric car (call find_charging_station), price history, or traffic (call check_autobahn_traffic). Radius ≤ 25 km, at most 10 stations. For a brand, a name, open now or at a named time, or nearest-first, call find_fuel_station. Each line names the age of its price and opening-hours claim. Prices are consumer information only; the attribution line and MTS-K note must be shown.

ParametersJSON Schema
NameRequiredDescriptionDefault
latNoLatitude in WGS 84, e.g. 48.137. Use with lon when the caller already holds coordinates; otherwise use place.
lonNoLongitude in WGS 84, e.g. 11.576. Use with lat; otherwise use place.
fuelNoFuel grade: "e5" (Super E5), "e10" (Super E10, the standard German petrol) or "diesel". Default "e10". Pass the grade the person named — a diesel driver is not helped by a petrol price.e10
limitNoHow many stations to return, cheapest first (1–10, default 5). The provider's terms cap it at 10.
placeNoWhere to look, as free text: a city ("München", "Munich"), a district or Kreis ("Kreis Fulda"), a Bundesland, a station or stop ("Hamburg Hbf"), a motorway ("A7"), or a street address with a house number ("Hauptstraße 12, 36037 Fulda"). Use this instead of coordinates whenever the person named a place. An address needs its town or postcode — a street and a number alone exist in many towns. Give either place OR lat+lon, never both.
languageNoSet this on every call to the language the person is writing in: "en" if they wrote English, "de" if they wrote German. Do not leave it out because it has a default — the default is only the fallback when the language is genuinely unclear, and an English question answered in German is a wrong answer. Place names, station names and road numbers are never translated in either language; in English the German term is kept in parentheses so the person recognises it on signs and in local apps.de
radius_kmNoSearch radius around the place in kilometres (1–25, default 5). The provider's terms cap it at 25 km — a larger circle is a dataset request, not a consumer question.

TDQS

A4.3/5.0
Behavior4/5

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

Annotations already cover read-only, idempotent, open-world safety, so the description correctly spends its budget on non-structured constraints: radius ≤ 25 km, max 10 stations, per-line price/opening-hours age, and the MTS-K attribution/display obligation. It stops short of noting rate limits or fallback behavior when no station matches.

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?

Front-loaded with purpose, then usage, then exclusions, then limits. Dense but mostly high-value; the 'Each line names the age...' sentence is useful, though the attribution sentence is a compliance note rather than invocation guidance.

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 7-param, no-output-schema, read-only search tool, the description covers selection, exclusions, hard limits, and output-content expectations plus a legal display note. It never mentions result ordering guarantees beyond 'cheapest' or failure modes (no results, invalid place), but those are minor.

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 100% and the parameter descriptions are unusually rich (place vs lat/lon mutual exclusion, language default pitfall, fuel enum meaning). The description only echoes the radius and limit caps, adding little beyond the schema. Baseline 3 applies.

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?

States a specific verb (Returns), resource (cheapest stations), and scope (one fuel grade near a place or coordinate), with an enumerated return payload. It explicitly separates itself from find_fuel_station, find_charging_station, and check_autobahn_traffic.

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?

Gives the triggering condition ('when the user asks where to fill up or what fuel costs'), explicit exclusions with named alternatives, and a routing rule: brand/name/open-now/nearest-first goes to find_fuel_station. Nothing is left to inference.

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

find_fuel_stationA
Read-onlyIdempotent

Finds filling stations around a place or coordinate under any combination of filters — grade, brand, name, open now, open at a time you name, open 24 h — sorted by distance, price or name. Use when the question is WHICH station: the closest diesel to a stop, an ARAL open tonight, what one forecourt sells. Do NOT use for the plain "where is fuel cheapest" question (call find_cheapest_fuel) or for charging an electric car (call find_charging_station). Every result carries the attribution and the MTS-K note, and says how old each price and opening-hours claim is.

ParametersJSON Schema
NameRequiredDescriptionDefault
latNoLatitude in WGS 84, e.g. 48.137. Use with lon when the caller already holds coordinates; otherwise use place.
lonNoLongitude in WGS 84, e.g. 11.576. Use with lat; otherwise use place.
fuelNoOnly stations with a current price for this grade: "e5" (Super E5), "e10" (Super E10) or "diesel". Omit to get every station near the place whatever it sells — the answer then lists all the grades it holds a price for. Required when sort is "price", because a price ordering needs a grade.
nameNoPart of the station's own name or brand, case-insensitive: "Autohof", "Raststätte Fulda". Use it when the person named a specific forecourt rather than a chain. Combine with place to keep the search local.
sortNoOrder of the answer: "distance" (nearest first, the default — use it for "closest diesel to Hamburg Hbf"), "price" (cheapest first, needs fuel), or "name" (alphabetical, for a person scanning a list of a brand's forecourts).distance
brandNoOnly stations of this brand, matched case-insensitively anywhere in the brand field: "ARAL", "Shell", "TotalEnergies", "JET". Use it when the person named a chain ("die ARAL an der B1"). Free stations often carry no brand at all and are then not matched by any brand.
limitNoHow many stations to return (1–10, default 5).
placeNoWhere to look, as free text: a city ("München", "Munich"), a district or Kreis ("Kreis Fulda"), a Bundesland, a station or stop ("Hamburg Hbf"), a motorway ("A7"), or a street address with a house number ("Hauptstraße 12, 36037 Fulda"). Use this instead of coordinates whenever the person named a place. An address needs its town or postcode — a street and a number alone exist in many towns. Give either place OR lat+lon, never both.
open_atNoOnly stations open at that time in Germany (Europe/Berlin): "23:30" means the next time the clock shows 23:30, and "2026-09-30 06:15" a specific local date and time. Use it for "is it still open tonight". Do not pass it together with open_now — they ask the same question about two different clocks.
languageNoSet this on every call to the language the person is writing in: "en" if they wrote English, "de" if they wrote German. Do not leave it out because it has a default — the default is only the fallback when the language is genuinely unclear, and an English question answered in German is a wrong answer. Place names, station names and road numbers are never translated in either language; in English the German term is kept in parentheses so the person recognises it on signs and in local apps.de
open_nowNoWhen true, only stations the published opening hours say are open at this moment. Default false. A station whose hours we have never read is NOT returned by this filter and is counted in the answer instead — the result never guesses that an unknown station is open.
radius_kmNoSearch radius around the place in kilometres (1–25, default 5). 25 km is the provider's own ceiling — a larger circle is a dataset request, not a consumer question.
whole_dayNoWhen true, only stations the provider flags as open around the clock (24/7). Default false. Use it for a night drive; it is a stricter filter than open_now, which is satisfied by a station that closes at 22:00.

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, openWorldHint and destructiveHint=false, so the safety profile is covered. The description adds genuinely new behavioral context beyond that: results carry attribution and an MTS-K note and disclose the age/freshness of each price and opening-hours claim, which matters for a data-source-backed lookup. It stops short of describing pagination or result shape, but with annotations carrying safety this is strong.

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?

Front-loads purpose, then usage, then exclusions, then result behavior — a clean information hierarchy. Despite being three dense sentences it earns every clause, and the length is justified for a 13-parameter tool.

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 13-parameter, zero-required read tool with no output schema, the description covers routing, filtering axes and return-value provenance (attribution, MTS-K, staleness). It gives enough for correct invocation; only the detailed result shape is left implicit, which is a minor gap given the lack of an 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?

Schema description coverage is 100%, so the schema already documents all 13 parameters in depth (including the place-XOR-lat/lon rule). The description's filter/sort enumeration largely restates what the schema provides, adding only natural-language framing rather than new semantics. Baseline 3 applies.

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?

States a specific verb ("Finds") and resource ("filling stations") with explicit scope ("around a place or coordinate") and summarizes the filter/sort axes. It also names the siblings it must not be confused with (find_cheapest_fuel, find_charging_station), so an agent can disambiguate without opening any schema.

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

Usage Guidelines5/5

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

Explicit when-to-use framing ("Use when the question is WHICH station") with concrete examples, plus explicit when-NOT-to-use guidance naming the correct alternative tool for each excluded case. This is the textbook routing pattern.

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

find_nearbyA
Read-onlyIdempotent

Overview of what is around a place or coordinate: nearby fuel stations, EV charging, parking, the nearest railway station and motorway junction, each with its distance. Use when someone asks "what is around me" or "what is near " — a broad look, not one category in depth. Do NOT use for a fuel grade's price (find_cheapest_fuel), charger/connector status (find_charging_station), parking kind/occupancy (find_parking), a NAME lookup (find_place/find_poi/find_address), or a coordinate's address (describe_location). Radius ≤ 15 km, up to 3 per category. Shows each source's attribution.

ParametersJSON Schema
NameRequiredDescriptionDefault
latNoLatitude in WGS 84, e.g. 48.137. Use with lon when the caller already holds coordinates; otherwise use place.
lonNoLongitude in WGS 84, e.g. 11.576. Use with lat; otherwise use place.
placeNoWhere to look, as free text: a city ("München", "Munich"), a district or Kreis ("Kreis Fulda"), a Bundesland, a station or stop ("Hamburg Hbf"), a motorway ("A7"), or a street address with a house number ("Hauptstraße 12, 36037 Fulda"). Use this instead of coordinates whenever the person named a place. An address needs its town or postcode — a street and a number alone exist in many towns. Give either place OR lat+lon, never both.
languageNoSet this on every call to the language the person is writing in: "en" if they wrote English, "de" if they wrote German. Do not leave it out because it has a default — the default is only the fallback when the language is genuinely unclear, and an English question answered in German is a wrong answer. Place names, station names and road numbers are never translated in either language; in English the German term is kept in parentheses so the person recognises it on signs and in local apps.de
radius_kmNoSearch radius around place or lat+lon in kilometres (1–15, default 5). This tool answers "what is around me", not "search a wide area" — for that, use the specific tool with its own wider radius.
categoriesNoWhich categories to include: "fuel", "charging", "parking", "station" (railway station), "junction" (motorway junction). Omit for all five. Pass a subset only when the person named one — otherwise the full picture is the point of this tool.

TDQS

A4.5/5.0
Behavior4/5

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

Annotations already declare readOnly/idempotent/non-destructive safety, so the description only needs to add operational context — and it does: radius cap of 15 km, a result cap of up to 3 items per category, and the fact that source attribution is shown. It does not describe pagination or result ordering, and the capsule output shape is only implied, which keeps it short of a 5.

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 lead sentence defines the tool, the second gives usage and the routing exclusions, and the closing fragment carries the hard limits and attribution note. Despite being dense with sibling names, every clause is load-bearing for routing and no sentence is filler.

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?

With no output schema, the description must convey what comes back — it does: per-category items with distances, capped at 3 each, plus attribution. Combined with the radius constraint and the place-vs-coordinates rule, an agent has everything needed to call this correctly and interpret the result.

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 100%, so the parameter contract (lat/lon vs. place, the language override, radius range, category enum) is already fully documented in the schema. The description repeats the categories and the ≤15 km bound but adds no semantics beyond what the schema states, so the baseline 3 applies.

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?

States a specific verb+resource (an at-a-glance overview of what surrounds a place or coordinate) and enumerates the exact categories covered: fuel, charging, parking, railway station, motorway junction. It explicitly distinguishes itself from sibling tools such as find_cheapest_fuel, find_parking and describe_location, so an agent can select it without opening any schema.

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?

Gives the trigger phrasing ('what is around me', 'what is near <place>') and then an explicit do-NOT list mapping each out-of-scope case to the correct sibling (find_cheapest_fuel, find_charging_station, find_parking, find_place/find_poi/find_address, describe_location). The boundary between this broad tool and the category-specific tools is unambiguous.

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

find_parkingA
Read-onlyIdempotent

Returns parking near a place, a coordinate or along one motorway: rest areas with lorry spaces, car parks and park-and-ride sites, with total spaces and, where published, free spaces now and the reading's age. Use when someone asks where to park or leave the car for the train ("Parkhaus in Köln", "Rastplatz A3", "P+R"). Do NOT use for fuel (find_cheapest_fuel) or EV charging (find_charging_station). Radius ≤ 25 km, ≤ 10 sites per list; ODbL and CC BY-SA sources are separate lists (up to three). No "free now" means no published count, not full. Every answer carries each source's attribution.

ParametersJSON Schema
NameRequiredDescriptionDefault
latNoLatitude in WGS 84, e.g. 48.137. Use with lon when the caller already holds coordinates; otherwise use place.
lonNoLongitude in WGS 84, e.g. 11.576. Use with lat; otherwise use place.
kindNoWhich kind of parking: "rest_area" = motorway rest and service area (no feed we ingest classifies this category at all, so an answer filtered to it says so and names the parking we do hold), "car_park" = public car park (Parkhaus/Parkplatz), "park_and_ride" = P+R beside a station, "truck" = lorry parking, "any" = all of them. Default "any". Pass a kind only when the person named one — "Rastanlage"/"Raststätte" is "rest_area", a lorry driver asking for a break wants "truck", someone leaving the car for the train wants "park_and_ride". A camper, a caravan or a coach is none of the five: leave the argument out rather than filtering a tourist into lorry bays.any
roadNoA single motorway number to list parking along, e.g. "A3" ("A 3" and "a3" are the same road). Use this when the person named a road and no town — "Rastplatz auf der A7". Give road OR place OR lat+lon, never two of them: a road is a 900 km line and a place is a point, so the two answer different questions. When the question names BOTH — "Parkhaus in Köln an der A3" — use the place: a person parks at a point, and the radius already covers the motorway beside it.
limitNoHow many facilities to return, nearest first (1–10, default 5).
placeNoWhere to look, as free text: a city ("München", "Munich"), a district or Kreis ("Kreis Fulda"), a Bundesland, a station or stop ("Hamburg Hbf"), a motorway ("A7"), or a street address with a house number ("Hauptstraße 12, 36037 Fulda"). Use this instead of coordinates whenever the person named a place. An address needs its town or postcode — a street and a number alone exist in many towns. Give either place OR lat+lon, never both.
languageNoSet this on every call to the language the person is writing in: "en" if they wrote English, "de" if they wrote German. Do not leave it out because it has a default — the default is only the fallback when the language is genuinely unclear, and an English question answered in German is a wrong answer. Place names, station names and road numbers are never translated in either language; in English the German term is kept in parentheses so the person recognises it on signs and in local apps.de
radius_kmNoSearch radius around place or lat+lon in kilometres (1–25, default 10). Ignored when you pass road, which covers the whole motorway. Start small in a city and widen if the answer is empty.
only_with_free_spacesNoSet true ONLY when the person insists on somewhere with free spaces right now. It keeps just the facilities whose operator publishes live occupancy AND currently reports a space, and the result says how many were dropped for publishing nothing — most German parking publishes no occupancy at all, so true usually narrows the answer to very little. Default false.

TDQS

A4.2/5.0
Behavior3/5

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

Annotations already declare readOnlyHint=true, idempotentHint=true, destructiveHint=false and openWorldHint=false, so the safety profile is covered. The description still adds real behavioral context: the 25 km / 10-site caps, up to three separate source lists, mandatory attribution, and the crucial caveat that a missing "free now" means no published count rather than a full lot. That caveat and the result-shape notes go beyond the annotations, so it lands above baseline but does not fully describe pagination or result ordering beyond 'nearest first'.

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?

Front-loaded with the core capability and exclusions, and nearly every clause carries decision-relevant information (exclusions, radius cap, source split, attribution). It is dense and long for a single paragraph, but not padded.

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?

With no output schema, the description correctly carries the return-shape burden: total spaces, published free spaces plus the reading's age, up to three attributed source lists, and the interpretation rule for absent free-space data. For a zero-required-parameter, nine-param read tool this is complete.

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

Parameters3/5

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

Schema description coverage is 100% and the schema descriptions are themselves unusually rich (enum meanings, mutually exclusive lat/lon vs place vs road, radius ignored for road). The tool description largely restates that guidance at a higher level rather than adding new per-parameter syntax, so with full schema coverage the baseline of 3 is the right anchor.

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?

States a specific verb+resource and the full scope: parking near a place, coordinate, or along one motorway, covering rest areas with lorry spaces, car parks and park-and-ride sites, with total and free-space counts. It explicitly distinguishes itself from siblings find_cheapest_fuel and find_charging_station, so an agent can route without opening any schema.

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?

Gives concrete when-to-use triggers ("where to park or leave the car for the train") with sample German queries, plus explicit when-NOT-to-use alternatives by name (fuel, EV charging). The road-vs-place-vs-coordinate selection rule is also spelled out, including the both-named tiebreak.

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

find_placeA
Read-onlyIdempotent

Looks up a place name and returns every place that matches, each with its kind, official key (AGS/RS), population, English name and coordinate. Use when the person asks where somewhere is, when you need a coordinate for another tool, and above all to RECOVER after a tool reported a name as ambiguous — this is where you find out which Neustadt is which. Pass near to rank and separate same-named places by distance. Do NOT use to find a company, shop or landmark: call find_poi. At most 10 results, radius <= 200 km. Every result carries an attribution line that must be shown to the user.

ParametersJSON Schema
NameRequiredDescriptionDefault
latNoLatitude to measure from, instead of `near`.
lonNoLongitude to measure from, instead of `near`.
kindNoNarrow to one kind: "city", "district" (Kreis), "admin" (Land or Regierungsbezirk), "station", "stop", "motorway" or "junction". Omit unless the person was specific.
nearNoA second place to measure from, used to tell same-named candidates apart: "Neustadt" near "Hamburg" is one of twenty Neustadts. Every result then carries its distance from this point.
limitNoHow many candidates to return, best match first (1–10, default 5).
queryYesThe place name to look up, as the person said it — "Neustadt", "Munich", "Kreis Fulda", "Köln Hbf". English names and spellings without umlauts both work.
languageNoSet this on every call to the language the person is writing in: "en" if they wrote English, "de" if they wrote German. Do not leave it out because it has a default — the default is only the fallback when the language is genuinely unclear, and an English question answered in German is a wrong answer. Place names, station names and road numbers are never translated in either language; in English the German term is kept in parentheses so the person recognises it on signs and in local apps.de
radius_kmNoWhen near/lat+lon is given, keep only candidates within this many kilometres (1–200). Omit to rank by distance without dropping any.

TDQS

A4.7/5.0
Behavior5/5

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

With annotations already covering read-only, idempotent, and non-destructive behavior, the description adds substantial operational context: the 10-result cap, the 200 km radius limit, the attribution line that must be shown to the user, and how `near` separates same-named places. These are behavioral traits beyond what the annotations state and are important for correct use.

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 front-loaded with the core action and result shape, then moves through usage, exclusions, and limits without filler. Each sentence earns its place by adding a distinct rule or distinction.

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 lookup tool with no output schema, the description covers what is returned, how many results, geographic limits, the required attribution, and the main sibling alternative. The annotations already cover safety, so no important calling context is missing.

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 100%, so the schema already documents each parameter's meaning, including `near`, `language`, and the result/radius limits. The description reinforces the disambiguation role of `near` and the language default rule but does not add meaning beyond the schema, so the baseline 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 states a specific verb and resource: 'looks up a place name and returns every place that matches', and it enumerates the returned fields (kind, AGS/RS key, population, English name, coordinate). It explicitly distinguishes itself from find_poi, so an agent can separate it from the many sibling lookup tools without opening schemas.

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?

It gives explicit when-to-use triggers: where somewhere is, when a coordinate is needed for another tool, and recovering from an ambiguity report. It also gives an explicit when-not-to-use rule ('Do NOT use to find a company, shop or landmark: call find_poi') and a disambiguation pattern using `near`.

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

find_poiA
Read-onlyIdempotent

Finds a named business or landmark — company, shop, clinic, hotel — and returns its address, category and coordinate. Use when the person names a THING rather than a town: "the adesso office in Dortmund", "the nearest Aldi". The coordinate it returns passes to any other tool as lat/lon. Do NOT use for a town, district or station (every tool's place resolves those), nor for fuel, charging or parking, which have their own tools. Give "in" (a town) when you can: far faster than searching nationwide. At most 10 results, radius <= 50 km. OpenStreetMap under ODbL 1.0; show the attribution line.

ParametersJSON Schema
NameRequiredDescriptionDefault
inNoA town to search in — "Dortmund", "Fulda". Strongly preferred: it is both far faster and far less ambiguous than a nationwide search. Use this OR near/lat+lon, not both.
latNoLatitude of the point to search around, when the caller already holds a coordinate.
lonNoLongitude of the point to search around.
nameYesThe name of the thing to find — a company, shop, clinic, hotel, office or landmark. Part of the name is enough: "adesso" finds "adesso SE". A chain name works too, because brands are matched as well as names.
nearNoA place to search around, when the question is "the nearest X" rather than "X in Y". Use with radius_km.
limitNoHow many to return, best match first (1–10, default 5).
categoryNoNarrow to one OpenStreetMap family: "office" (companies, agencies), "shop", "amenity" (fuel, pharmacy, school, restaurant), "healthcare", "tourism" (hotels, attractions), "leisure", "industrial" or "building". Omit unless the person was specific.
languageNoSet this on every call to the language the person is writing in: "en" if they wrote English, "de" if they wrote German. Do not leave it out because it has a default — the default is only the fallback when the language is genuinely unclear, and an English question answered in German is a wrong answer. Place names, station names and road numbers are never translated in either language; in English the German term is kept in parentheses so the person recognises it on signs and in local apps.de
radius_kmNoSearch radius in kilometres around near/lat+lon (1–50, default 10). Ignored when "in" is used.

TDQS

A4.6/5.0
Behavior5/5

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

Annotations already cover the safety profile (readOnly, idempotent, non-destructive, closed-world), so the bar is lower; the description still adds real behavior beyond them: a hard result cap (max 10), radius ceiling (<= 50 km), the ODbL attribution obligation, and the workflow hint that the returned coordinate chains into any other tool as lat/lon.

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?

Front-loaded with purpose, then usage, then constraints and licensing. Dense and mostly waste-free, but the result/radius caps restate schema constraints that are already explicit, costing a little 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 9-parameter geocoding tool with no output schema, the description covers purpose, alternatives, return contents, limits, and licensing, leaving nothing an agent needs in order to call it correctly.

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

Parameters3/5

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

Schema description coverage is 100%, so parameters are already fully documented, including the nuanced language-parameter guidance. The description largely repeats schema facts ("At most 10 results, radius <= 50 km") and only mildly reinforces the 'in' preference, so the baseline 3 applies.

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?

States a specific verb (finds), resource (named business or landmark), examples (company, shop, clinic, hotel) and return shape (address, category, coordinate). It explicitly differentiates from find_place and the fuel/charging/parking siblings, so an agent can route without opening any schema.

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?

Gives explicit when-to-use ("the person names a THING rather than a town"), when-not-to-use ("Do NOT use for a town, district or station... nor for fuel, charging or parking"), and names the alternatives. The performance hint ("Give 'in' when you can: far faster than searching nationwide") further guides correct invocation.

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

find_roadworks_aheadA
Read-onlyIdempotent

Returns the roadworks PLANNED on one German motorway inside a date window: the section and direction as published, what is restricted, and the start and end. Use when a date or window is named, the question says geplant, or someone asks how long a site lasts ("Baustellen auf der A7 in den Sommerferien?"). ONE road per call. Do NOT use when more than one motorway is named, for the situation this minute, or for Baustellen with neither date nor geplant — all three are check_autobahn_traffic; whether a road is open — call check_road_status. ≤ 92 days, max 20 sites. Show the attribution line.

ParametersJSON Schema
NameRequiredDescriptionDefault
toNoLast day of the window, inclusive, as YYYY-MM-DD. Omit for 7 days after `from`, which is the right window for "am I going to hit roadworks on this drive". The window may span at most 92 days. For "how long will this last" / "wie lange dauert die Baustelle noch", leave both dates out: the default 7 days already returns the site's planned end date. Only widen — 28 days is the sensible step — when the person asked about a period that long.
fromNoFirst day of the window, as YYYY-MM-DD in German local time. Omit for today. Resolve relative wording ("next Friday", "in den Sommerferien", "nächsten Monat") into real dates yourself, counted from today's date; this argument never takes words, and it never takes a fixed example date — the window a person means moves with the calendar.
roadYesThe Autobahn to look at, one per call, e.g. "A7" or "A100" — "A7", "A 7" and "a7" are the same road. Bundesautobahnen only: this feed carries no Bundesstraßen and no city streets. Ask again for a second motorway.
limitNoMaximum sites to return (1–20, default 10), ordered by planned start. Every returned site is in the structured result; the readable text prints the first 10 and says how many more of them are in the structured half. The answer always names how many sites the window holds in total, so a small limit never hides the size of the problem.
languageNoSet this on every call to the language the person is writing in: "en" if they wrote English, "de" if they wrote German. Do not leave it out because it has a default — the default is only the fallback when the language is genuinely unclear, and an English question answered in German is a wrong answer. Place names, station names and road numbers are never translated in either language; in English the German term is kept in parentheses so the person recognises it on signs and in local apps.de

TDQS

A4.6/5.0
Behavior4/5

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

Annotations already establish readOnly, idempotent, non-destructive, closed-world behavior, so the description's burden is lighter. The description still adds operational facts: a 92-day window cap, a 20-site cap, the 'show the attribution line' output expectation, and how the readable text truncates beyond 10 sites. 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?

Front-loaded with purpose, then usage rules, then constraints, then the attribution reminder. Dense but every clause carries a routing or parameter rule. Slightly overstuffed with nested parentheses and quoted examples, which costs a point on tightness.

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 5-parameter read-only lookup with no output schema, the description covers windows, caps, language behavior, attribution, and alternatives to sibling tools. An agent has everything needed to call it correctly and to route the excluded cases elsewhere.

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

Parameters4/5

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

Schema coverage is 100%, so the baseline is 3. The description nonetheless reinforces parameter behavior in prose — one road per call, resolve relative dates to real dates, the default 7-day window, and that 'language' must be set on every call rather than left to its default. That is meaningful semantic reinforcement, though it largely mirrors the schema text.

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?

States a specific verb and resource ('roadworks PLANNED on one German motorway inside a date window') plus the fields returned (section, direction, restrictions, start/end). It explicitly contrasts with sibling tools check_autobahn_traffic and check_road_status, so an agent can distinguish it without inspecting schemas.

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?

Gives explicit triggers (date or window named, the word 'geplant', 'how long'), explicit exclusions (multiple motorways, current situation, no date/geplant), and names the alternative for each excluded case. This is exactly the when/when-not/alternatives guidance the rubric rewards.

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

get_departuresA
Read-onlyIdempotent

Scheduled departures from any German public-transport stop — bus, tram, U-Bahn, S-Bahn, train, ferry — with line, destination, platform. Use when someone asks when a bus, tram, U-Bahn or ferry goes, or for another DAY or a clock time over 2 h away: "Wann fährt der nächste Bus ab Fulda Bahnhof?" Do NOT use for a railway station's trains now or later today — get_train_departures. Planned times only: for "is my bus late?" give the plan and say so; regional punctuality check_transit_disruption. No destination filter: read the board. Window 48 h, 15 per call. Results carry their attribution line.

ParametersJSON Schema
NameRequiredDescriptionDefault
stopNoThe stop, as the person says it: "Fulda, Bahnhof", "München, Marienplatz", "Köln, Hbf", "Hamburg, Rathausmarkt" (town first). Include the town when the person did — half the names in Germany exist in twenty towns, and a bare "Bahnhof" or "Hauptbahnhof" comes back as a list of candidates to choose from, so call it and let the result ask. Pass their words; do not guess an id. Give either stop OR the stop id, never both.
whenNoStart of the window as an ISO-8601 instant with an offset ("2026-10-02T07:30:00+02:00"). Leave it out for "now". Convert the person's words yourself — "morgen früh", "tonight" — and pass the instant; the answer is always rendered in Europe/Berlin.
limitNoHow many departures to return, earliest first (1–15, default 10). The result always says how many more were in the window.
modesNoKeep only these kinds of service: "bus", "tram", "subway" (U-Bahn), "rail" (every train, including S-Bahn and regional) or "ferry". Omit it unless the person named a kind — "nur Busse", "welche Tram". Several are allowed, which is what "die Busse und Bahnen vor dem Hbf" means. An S-Bahn is "rail": the feed does not always distinguish it, and the line name ("S 6") says which it is.
stop_idNoThe stop's timetable id, exactly as a previous result of this tool gave it ("de:06631:1234"). It skips the name lookup and is exact — use it for a follow-up about a stop this tool has already named, and for one the person picked out of a candidate list.
languageNoSet this on every call to the language the person is writing in: "en" if they wrote English, "de" if they wrote German. Do not leave it out because it has a default — the default is only the fallback when the language is genuinely unclear, and an English question answered in German is a wrong answer. Place names, station names and road numbers are never translated in either language; in English the German term is kept in parentheses so the person recognises it on signs and in local apps.de
duration_minNoHow far past that moment to look, in minutes (5–1440, default 60). Small for "what goes now", a few hours for an evening. To reach the far end of the 48 h timetable, move `when` instead of widening this: a window of a whole day returns at most 15 rows and would answer about the wrong half of it.

TDQS

A4.6/5.0
Behavior4/5

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

Annotations already declare readOnly/idempotent/non-destructive, and the description adds real behavioral context beyond them: planned times only (not live), no destination filtering, a 48 h window, a 15-row cap, and that results carry an attribution line. It does not state auth or rate-limit behavior, but for a read-only public-data lookup that is a minor gap.

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?

Front-loaded with the core purpose and mode list, then usage rules, then behavioral constraints — each sentence carries distinct information. It is dense and mixes German example phrases into an English description, which costs a little readability but not correctness.

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 7-parameter, no-output-schema lookup tool, the description covers purpose, routing to alternatives, result contents (line, destination, platform, attribution), result limits, and the planned-vs-live distinction. Nothing an agent needs to call it correctly is missing.

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

Parameters4/5

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

Schema coverage is 100% and the parameter descriptions are already unusually rich, so the baseline is 3. The description still adds value by stating the 48 h window, the 15-per-call cap, and the 'no destination filter — read the board' constraint, which shapes how the agent sets when/duration_min.

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?

States a specific verb and resource ('Scheduled departures from any German public-transport stop') and enumerates the covered modes, so the scope is unambiguous. It explicitly separates itself from the closest sibling, get_train_departures, which an agent could otherwise confuse it with.

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?

Gives explicit when-to-use triggers (any bus/tram/U-Bahn/ferry, another day, or a clock time over 2 h away), an explicit when-NOT-to-use rule routing railway station trains to get_train_departures, and a further alternative (check_transit_disruption) for punctuality questions. Nothing is left to inference.

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

get_driving_rulesA
Read-onlyIdempotent

Returns the German road rules a visitor needs: low-emission zones (Umweltzone) and which Feinstaubplakette a city requires, speed limits (advisory 130), winter tyres, alcohol, the Sunday lorry ban, tolls (no car toll), Rettungsgasse, what must be in the car, and electric cars (E-Kennzeichen, ad-hoc payment, plugs). Use when someone drives through Germany or asks whether they may enter a city. Do NOT use for live traffic or closures: check_autobahn_traffic; to FIND a charger: find_charging_station. Optional city narrows to its zone. Sourced and dated; show the attribution. Not legal advice.

ParametersJSON Schema
NameRequiredDescriptionDefault
cityNoCity the question is about, e.g. "Stuttgart", "München", "Munich". Narrows "lez" to that city's zone and adds the per-city caveat for "ev". Other topics are nationwide. Omit when the question is not about one city.
topicNoWhich rule to answer. "lez" = low-emission zone and Feinstaubplakette, "speed" = speed limits including the Autobahn advisory 130, "winter" = winter-tyre duty, "alcohol" = alcohol and drugs, "toll" = car and lorry toll, "truck_ban" = Sunday and holiday lorry ban, "equipment" = what the law requires in the car, "emergency" = 112/110, rescue lane, breakdown, crash, "ev" = electric car (E-Kennzeichen, charging payment, plugs). Omit for a one-line overview of all nine.
languageNoSet this on every call to the language the person is writing in: "en" if they wrote English, "de" if they wrote German. Do not leave it out because it has a default — the default is only the fallback when the language is genuinely unclear, and an English question answered in German is a wrong answer. Place names, station names and road numbers are never translated in either language; in English the German term is kept in parentheses so the person recognises it on signs and in local apps.de

TDQS

A4.8/5.0
Behavior5/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 is a safe read. The description adds valuable behavioral context beyond that: results are sourced and dated and the attribution must be shown, the tool is not legal advice, and the city parameter behaves differently per topic (narrows lez, adds a per-city caveat for ev, while other topics stay nationwide). 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 long but every sentence earns its place. It front-loads the purpose and topic list, then gives usage rules, exclusions, city behavior, language guidance, and sourcing. It is structured and scannable, though a bit dense. It could be slightly tighter, but it is far from bloated given the tool's complexity.

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 tool with 9 topics, no output schema, and sparse annotations, the description covers everything an agent needs: what it returns, when to use it, when not to, how the city parameter modifies results, the mandatory language setting, and the need to show attribution and note it is not legal advice. Nothing essential is missing.

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

Parameters4/5

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

Schema coverage is 100%, so the baseline is 3. The description adds extra meaning on top of the schema: for 'city' it explains that it narrows only the 'lez' topic and adds a caveat for 'ev' while other topics are nationwide; for 'language' it stresses that the default is only a fallback and must be set to the user's language, and it explains translation behavior (German terms kept in parentheses). These details go beyond the schema's property descriptions, so a 4 is warranted.

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 precise statement: returns German road rules a visitor needs, then enumerates the exact topics (low-emission zones, speed limits, winter tyres, etc.). It names the resource (German road rules) and clearly differentiates from siblings by explicitly excluding live traffic and charger lookups, so an agent can tell this apart without reading other schemas.

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?

It gives explicit use cases ('Use when someone drives through Germany or asks whether they may enter a city') and explicit non-use cases with named alternatives ('Do NOT use for live traffic or closures: check_autobahn_traffic; to FIND a charger: find_charging_station'). It also explains the optional city parameter narrows results and that the language parameter must be set to match the user's language, with a fallback rule. This is fully actionable routing guidance.

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

get_train_departuresA
Read-onlyIdempotent

Next departures from a German railway station, with platform, delay and cancellations. Use when asked when a train, S-Bahn or ICE leaves a named station, or whether THAT departure is late; vague later-today wording ("heute Abend") stays here. Whether ONE line is punctual ("ist die S1 pünktlich?") is NOT this tool, though it is rail and about delay — call check_transit_disruption. Do NOT use for buses, trams, a non-railway stop, another day or a time over 2 h away — get_departures. No destination filter: read the board. Max 15 departures, window 120 min. Results carry their attribution line.

ParametersJSON Schema
NameRequiredDescriptionDefault
whenNoStart of the window as an ISO-8601 instant with an offset ("2026-09-20T18:30:00+02:00"). Leave it out for "now", which is what almost every question means. Times in the answer are Europe/Berlin whatever you pass.
limitNoHow many departures to return, earliest first (1–15, default 10). More than 15 is refused — that is a board a person can read, not a dataset.
eva_noNoThe station's EVA number (6–8 digits, e.g. 8002549 for Hamburg Hbf), when a previous result gave you one. It skips the name lookup and is exact — use it to answer a follow-up about a station this tool has already named.
stationNoThe railway station, as the person says it: "Hamburg Hbf", "Köln Hbf", "Munich Central", "Frankfurt (Main) Hbf". Pass their words — English names and "central station" are understood. If the name fits several stations (a bare "Hauptbahnhof"), call anyway: the result lists them and asks which; do not guess one yourself. Give either station OR eva_no, never both.
languageNoSet this on every call to the language the person is writing in: "en" if they wrote English, "de" if they wrote German. Do not leave it out because it has a default — the default is only the fallback when the language is genuinely unclear, and an English question answered in German is a wrong answer. Place names, station names and road numbers are never translated in either language; in English the German term is kept in parentheses so the person recognises it on signs and in local apps.de
duration_minNoHow far ahead to look, in minutes (5–120, default 60). Use a small window for "what leaves now" and a larger one for "this evening". Above 120 is refused: a departure board is not a timetable search.

TDQS

A4.3/5.0
Behavior4/5

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

Annotations declare readOnlyHint=true and idempotentHint=true, so the description carries a lower burden; it adds useful operational constraints (max 15 departures, 120-minute window, no destination filter) that go beyond the annotations. It does not describe pagination or error behavior, but for a read-only board tool it covers the key behavioral limits.

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?

Front-loads the purpose, then interleaves usage boundaries and constraints compactly. The parenthetical asides (S-Bahn/ICE, 'heute Abend', the S1 example) are dense but each earns its place by disambiguating intent.

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?

With annotations covering safety and the 100%-covered schema handling parameters, the description adds the routing logic needed to avoid the three sibling tools and states the result window and cap. It lacks return-shape detail, but no output schema exists and the payload fields are already listed, so it is largely complete.

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

Parameters3/5

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

Schema description coverage is 100%, so the schema already fully documents all six parameters, including the language-priority guidance and the station vs. eva_no mutual exclusivity. The description repeats the max-15 and 120-minute limits rather than adding new parameter meaning, so the 3 baseline applies.

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?

States a specific verb and resource (get next departures from a German railway station) and enumerates the payload (platform, delay, cancellations). It actively distinguishes itself from the sibling check_transit_disruption and get_departures, telling the agent exactly which questions belong here.

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?

Gives explicit when-to-use examples ('when a train, S-Bahn or ICE leaves a named station', 'that departure is late'), when-not-to-use cases ('buses, trams, a non-railway stop, another day or a time over 2 h away'), and names the alternative tool (check_transit_disruption) for the single-line-punctuality case with the reasoning for the split.

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

stop_watchA

Ends a watch this conversation opened with watch_situation, so no further change notifications arrive for it. Use when the person no longer needs to be told — "du musst mir nichts mehr zur A8 sagen", "stop watching that charger". When they name the subject and not an id, take the id from viafrei://watches. Do NOT use to look a situation up (call check_road_status), to list what is running (read viafrei://watches), or to cancel anything outside this chat — there is nothing subscribed elsewhere. A watch id from another session is not found, never stopped. Results carry their attribution line.

ParametersJSON Schema
NameRequiredDescriptionDefault
uriNoThe watch's resource uri, e.g. "viafrei://watch/12". Give either this or `watch_id`, not both.
languageNoSet this on every call to the language the person is writing in: "en" if they wrote English, "de" if they wrote German. Do not leave it out because it has a default — the default is only the fallback when the language is genuinely unclear, and an English question answered in German is a wrong answer. Place names, station names and road numbers are never translated in either language; in English the German term is kept in parentheses so the person recognises it on signs and in local apps.de
watch_idNoThe numeric id of the watch to stop, as `watch_situation` returned it (the 12 in viafrei://watch/12).

TDQS

A4.6/5.0
Behavior4/5

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

Annotations already declare readOnlyHint=false, destructiveHint=false, openWorldHint=false and idempotentHint=false. The description adds context annotations cannot express: session-scoped ownership, cross-session watches being 'not found, never stopped', and that results carry an attribution line. It does not state behavior on re-stopping an already-stopped watch, but overall disclosure is strong.

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?

Front-loads the core effect, then usage triggers, then the id-resolution procedure, then exclusions — a sensible order. It is dense and includes bilingual example phrasing, but every sentence carries routing or behavioral information rather than filler.

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 session-scoped mutation tool with no output schema, the definition covers effect, triggers, id resolution, ownership semantics, and error behavior for foreign watches. Nothing an agent needs in order to call it correctly is missing.

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

Parameters4/5

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

Schema coverage is 100%, so the baseline is 3, but the description genuinely adds value by telling the agent how to derive the id when the person names a subject instead of an id ('take the id from viafrei://watches'). It leaves the uri vs watch_id choice to the schema, which already documents it.

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?

States a specific verb and resource ('Ends a watch this conversation opened with watch_situation') and its immediate consequence (no further change notifications). It explicitly distinguishes itself from check_road_status, watch_situation, and viafrei://watches, so an agent can route correctly without opening another schema.

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?

Gives concrete triggers ('du musst mir nichts mehr zur A8 sagen', 'stop watching that charger'), names the alternatives for adjacent intents (check_road_status for lookups, viafrei://watches for listing), and states a hard exclusion ('cancel anything outside this chat — there is nothing subscribed elsewhere').

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

watch_situationA

Opens a watch so THIS conversation is told when something changes: a road reopening, a stop running late, a weather warning starting, a charge point turning free. Use when the person asks to be told later: "sag mir Bescheid, wenn die A8 wieder frei ist", "tell me when a charger is free". Do NOT use to look something up now (call check_road_status, check_autobahn_traffic or find_charging_station), and do NOT use when an e-mail, SMS or any alert outside this chat was asked for — we cannot send one; say so. Session-scoped. At most 10 watches, 24 h each. Results carry their attribution line.

ParametersJSON Schema
NameRequiredDescriptionDefault
keyYesThe thing being watched, in the vocabulary of `kind`: a road number, a stop DHID, an AGS prefix, a place name, a DWD warncell, a charging site id. For `road` and `place` it is the person's own words — "A8", "B27", "Fulda" — and needs no lookup. For `station`, `region`, `weather` and `charger` it is an identifier the matching read tool returned — look it up first: `station` = one of `stop.stopIds` from get_departures ("de:14612:28"); an EVA number from get_train_departures ("8000207") is NOT a stop id and is refused, as is any id no known stop carries; `region` from check_transit_disruption, `weather` from check_weather_warnings, `charger` from find_charging_station — a key nothing matches there produces a watch that is simply never triggered.
kindYesWhat kind of thing to watch. `road` = one motorway or federal road (key: "A8", "B27") — reports a closure or restriction appearing or clearing; `station` = one public-transport stop by its DHID (key: "de:14612:28") — reports departures running late past the threshold; `region` = a city or district by AGS prefix (key: "14612") — reports the share of late trips crossing the threshold; `place` = a town or address (key: "Fulda") — reports road restrictions appearing within the radius; `weather` = a DWD warncell (key: "105315000") — reports an official warning coming into force; `charger` = one charging site (key: the site id from find_charging_station) — reports a point turning free.
hoursNoHow long to watch, in hours (default 3, maximum 24). Prefer this over `until`: it needs no knowledge of the current time. Give one of `hours` or `until`, never both.
untilNoAn explicit end instant as ISO-8601 with an offset ("2026-09-20T18:40:00+02:00"), at most 24 hours ahead. Use only when the person named a time; otherwise use `hours`. Give one of `hours` or `until`, never both.
languageNoSet this on every call to the language the person is writing in: "en" if they wrote English, "de" if they wrote German. Do not leave it out because it has a default — the default is only the fallback when the language is genuinely unclear, and an English question answered in German is a wrong answer. Place names, station names and road numbers are never translated in either language; in English the German term is kept in parentheses so the person recognises it on signs and in local apps.de
conditionNoOptional threshold. Each key belongs to ONE kind and a key that does not belong to the chosen kind is refused by name; leave it out to use that kind's default.

TDQS

A4.6/5.0
Behavior5/5

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

Annotations only state the generic mutation profile (readOnlyHint=false, idempotentHint=false, destructiveHint=false, openWorldHint=false). The description adds the operationally important traits: session-scoped, a hard cap of 10 watches, 24 h maximum lifetime, inability to send external alerts, and that results carry an attribution line. None of that is derivable from the annotations or schema.

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?

Front-loaded with purpose, then usage, then constraints, and every clause carries information — the example utterances and the 'say so' instruction are functional, not filler. It is dense and slightly long, but nothing reads as padding.

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?

There is no output schema, so the description must carry the interaction contract, and it does: lifetime, watch cap, session scoping, refusal behaviour for unmatched keys, and attribution on results. For a non-idempotent subscription tool with a nested condition object, an agent has everything needed to call it correctly.

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

Parameters3/5

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

Schema description coverage is 100% and the schema already documents kind/key mapping, hours-vs-until exclusivity, the language override and every condition sub-key, so the description is not the primary source of parameter meaning. The description adds nothing about parameters beyond what the schema states (its '24 h each' note is a limit, not param semantics), so the baseline 3 applies.

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?

Names a concrete verb and resource ('opens a watch') and immediately illustrates what it does with four concrete change types (road reopening, stop running late, weather warning, charge point freeing). It also explicitly contrasts itself with the read siblings check_road_status, check_autobahn_traffic and find_charging_station, so an agent can separate it from them without opening a schema.

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?

Gives both when-to-use (person asks to be told later, with bilingual example utterances) and two explicit when-not-to-use cases: looking something up now (with the three alternative tools named) and any out-of-chat notification channel (email/SMS, with the instruction to say so). This is the full when/when-not/alternatives triad.

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. 18 tool updatesv1.7.3
    • Changedcheck_autobahn_traffic1 field changed
      • addedInput schema / properties / cursor / maxLength
        Added value: +256
    • Changedcheck_road_status1 field changed
      • addedInput schema / properties / place / maxLength
        Added value: +120
    • Changedcheck_station_facilities1 field changed
      • addedInput schema / properties / station / maxLength
        Added value: +120
    • Changedcheck_transit_disruption2 fields changed
      • changedInput schema / properties / region / description
        Previous value: -"The German region to report on, as free text: a Bundesland (\"Bayern\", \"Bavaria\", \"Nordrhein-Westfalen\"), a city (\"Hamburg\", \"Köln\") or a Kreis (\"Landkreis Fulda\"). A town inside a Kreis is reported as that Kreis and the answer says so, because the data is filed at Kreis level. Not a stop, not a street, not an address. Give either region OR lat+lon, never both."New value: +"The German region to report on, as free text: a Bundesland (\"Bayern\", \"Bavaria\", \"Nordrhein-Westfalen\"), a city (\"Hamburg\", \"Köln\"), a Kreis (\"Landkreis Fulda\") or one of the conurbations Ruhrgebiet, Rhein-Ruhr and Rhein-Main. A town inside a Kreis is reported as that Kreis and the answer says so, because the data is filed at Kreis level. Not a stop, not a street, not an address. Give either region OR lat+lon, never both."
      • addedInput schema / properties / region / maxLength
        Added value: +120
    • Changedcheck_weather_warnings1 field changed
      • addedInput schema / properties / place / maxLength
        Added value: +120
    • Changedfind_address1 field changed
      • addedInput schema / properties / query / maxLength
        Added value: +160
    • Changedfind_charging_station1 field changed
      • addedInput schema / properties / place / maxLength
        Added value: +120
    • Changedfind_cheapest_fuel1 field changed
      • addedInput schema / properties / place / maxLength
        Added value: +120
    • Changedfind_fuel_station3 fields changed
      • addedInput schema / properties / brand / maxLength
        Added value: +60
      • addedInput schema / properties / name / maxLength
        Added value: +120
      • addedInput schema / properties / place / maxLength
        Added value: +120
    • Changedfind_nearby1 field changed
      • addedInput schema / properties / place / maxLength
        Added value: +120
    • Changedfind_parking2 fields changed
      • addedInput schema / properties / place / maxLength
        Added value: +120
      • addedInput schema / properties / road / maxLength
        Added value: +16
    • Changedfind_place2 fields changed
      • addedInput schema / properties / near / maxLength
        Added value: +120
      • addedInput schema / properties / query / maxLength
        Added value: +120
    • Changedfind_poi3 fields changed
      • addedInput schema / properties / in / maxLength
        Added value: +120
      • addedInput schema / properties / name / maxLength
        Added value: +120
      • addedInput schema / properties / near / maxLength
        Added value: +120
    • Changedfind_roadworks_ahead1 field changed
      • changedInput schema / properties / to / description
        Previous value: -"Last day of the window, inclusive, as YYYY-MM-DD. Omit for 7 days after `from`, which is the right window for \"am I going to hit roadworks on this drive\". The window may span at most 90 days. For \"how long will this last\" / \"wie lange dauert die Baustelle noch\", leave both dates out: the default 7 days already returns the site's planned end date. Only widen — 28 days is the sensible step — when the person asked about a period that long."New value: +"Last day of the window, inclusive, as YYYY-MM-DD. Omit for 7 days after `from`, which is the right window for \"am I going to hit roadworks on this drive\". The window may span at most 92 days. For \"how long will this last\" / \"wie lange dauert die Baustelle noch\", leave both dates out: the default 7 days already returns the site's planned end date. Only widen — 28 days is the sensible step — when the person asked about a period that long."
    • Changedget_departures2 fields changed
      • addedInput schema / properties / stop / maxLength
        Added value: +120
      • addedInput schema / properties / stop_id / maxLength
        Added value: +64
    • Changedget_train_departures1 field changed
      • addedInput schema / properties / station / maxLength
        Added value: +120
    • Changedstop_watch1 field changed
      • addedInput schema / properties / uri / maxLength
        Added value: +64
    • Changedwatch_situation1 field changed
      • changedInput schema / properties / key / description
        Previous value: -"The thing being watched, in the vocabulary of `kind`: a road number, a stop id, an AGS prefix, a place name, a DWD warncell, a charging site id. For `road` and `place` it is the person's own words — \"A8\", \"B27\", \"Fulda\" — and needs no lookup. For `station`, `region`, `weather` and `charger` it is an identifier, and it must be the one the matching read tool returned (get_train_departures, check_transit_disruption, check_weather_warnings, find_charging_station): look it up first, because a key nothing matches produces a watch that is simply never triggered."New value: +"The thing being watched, in the vocabulary of `kind`: a road number, a stop DHID, an AGS prefix, a place name, a DWD warncell, a charging site id. For `road` and `place` it is the person's own words — \"A8\", \"B27\", \"Fulda\" — and needs no lookup. For `station`, `region`, `weather` and `charger` it is an identifier the matching read tool returned — look it up first: `station` = one of `stop.stopIds` from get_departures (\"de:14612:28\"); an EVA number from get_train_departures (\"8000207\") is NOT a stop id and is refused, as is any id no known stop carries; `region` from check_transit_disruption, `weather` from check_weather_warnings, `charger` from find_charging_station — a key nothing matches there produces a watch that is simply never triggered."
  2. 2 tool updatesv1.4.9
    • Addedget_departures
    • Changedget_train_departures1 field changed
      • changedInput schema / properties / station / description
        Previous value: -"The railway station, as the person says it: \"Hamburg Hbf\", \"Köln Hbf\", \"Munich Central\", \"Frankfurt (Main) Hbf\". Pass their words — English names and \"central station\" are understood. If the name fits several stations the result lists them and asks which; do not guess one yourself. Give either station OR eva_no, never both."New value: +"The railway station, as the person says it: \"Hamburg Hbf\", \"Köln Hbf\", \"Munich Central\", \"Frankfurt (Main) Hbf\". Pass their words — English names and \"central station\" are understood. If the name fits several stations (a bare \"Hauptbahnhof\"), call anyway: the result lists them and asks which; do not guess one yourself. Give either station OR eva_no, never both."
  3. 6 tool updatesv1.4.8
    • Addeddescribe_location
    • Addedfind_address
    • Addedfind_fuel_station
    • Addedfind_nearby
    • Addedfind_place
    • Addedfind_poi
  4. 13 tool updatesv0.0.9
    • First observedcheck_autobahn_traffic
    • First observedcheck_road_status
    • First observedcheck_station_facilities
    • First observedcheck_transit_disruption
    • First observedcheck_weather_warnings
    • First observedfind_charging_station
    • First observedfind_cheapest_fuel
    • First observedfind_parking
    • First observedfind_roadworks_ahead
    • First observedget_driving_rules
    • First observedget_train_departures
    • First observedstop_watch
    • First observedwatch_situation

TDQS

A4.4/5.0

Scored across 20 tools

Disambiguation4/5

The descriptions do exceptional work with explicit 'Do NOT use' cross-references, so most tools have distinct purposes. However, several pairs are genuinely easy to confuse on first read — check_autobahn_traffic vs check_road_status vs find_roadworks_ahead, and get_train_departures vs get_departures — which rely heavily on the prose to separate.

Naming Consistency5/5

Names follow a consistent verb_noun pattern throughout (check_, find_, get_, describe_, watch_, stop_). The verb variety maps sensibly to the action (find for discovery, check for status), and there is no mixing of casing or arbitrary styles.

Tool Count4/5

20 tools is on the heavy side but the domain is genuinely broad (traffic, fuel, EV, parking, geocoding, transit, weather, watches, rules), and each tool appears to earn its place. Slightly over what one agent can comfortably hold, but not padded.

Completeness4/5

Coverage is strong across mobility data sources, with CRUD-like lifecycle on watches and multi-modal lookups. The notable gap is route planning/directions (A-to-B routing), which is a core navigation need, though the server explicitly declares its non-offerings so agents can work around them.

Maintenance

ActivityMaintained
ResponsivenessResponsive

Related MCP Connectors

Related MCP Servers

  • A
    license
    B
    quality
    D
    maintenance
    A comprehensive MCP server providing 30 tools for geocoding, routing, and OpenStreetMap data analysis. It enables AI assistants to search for locations, calculate travel routes, and perform quality assurance checks on map data.
    30
    251 npm
    5
    MIT
  • A
    license
    B
    quality
    D
    maintenance
    MCP server providing AI agents with access to German government open data. 12 tools across 6 categories: Autobahn traffic, DWD weather, NINA disaster warnings, SMARD energy market, Bundestag parliamentary data, and pollen forecasts. All APIs are free, no keys required.
    16
    2
    MIT
  • A
    license
    A
    quality
    D
    maintenance
    An MCP server that exposes the Deutsche Bahn public transport API to any MCP-compatible client (Claude Desktop, Cursor, Cline, Continue, etc.). Five tools cover station search, departures, journey planning, trip details, and nearby stations.
    6
    MIT
  • A
    license
    A
    quality
    B
    maintenance
    Keyless remote MCP server for German public-infrastructure open data: weather, air quality, traffic, public transit, parking and roadworks across 84+ German cities (DWD, Umweltbundesamt, Mobilithek, GovData). 38 read-only tools.
    12
    15
    Apache 2.0