Skip to main content
Glama

Server Details

Sights, events, opening hours, weather and tides; nearby sharing as currently reported.

Ownership verified
Status
Healthy
Uptime
99.9% over 43 days
Last Tested
Transport
Streamable HTTP · MCP 2025-11-25
URL
ChatGPT
–
Claude
–

TDQS

A4.3/5.0

Scored across 14 tools

Disambiguation3/5

Multiple genuine overlaps exist: expand_kg_pois vs search_tourism both answer 'region attractions' (descriptions even admit both may run), search_tourism's coord-vicinity mode vs nearby, get_poi_details vs get_tourism_details, and resolve_location vs search_place vs reverse_geocode. The descriptions fight this with explicit 'nicht X, nutze Y' boundary paragraphs, but an agent still has to read very long text to pick correctly.

Naming Consistency4/5

Nearly all tools follow snake_case verb_noun: get_*, search_*, link_*, expand_kg_pois, resolve_location, reverse_geocode. The main deviations are the bare adjective 'nearby' (no verb) and the cryptic abbreviation in 'expand_kg_pois'; minor but noticeable inconsistencies in an otherwise predictable scheme.

Tool Count4/5

14 tools sits comfortably in the well-scoped 3-15 band and each role (place resolution, POI discovery, detail, weather, tide, time linking) earns its place. Slightly over-broad for a 'tourism' server since link_datetime/link_dynamic are generic platform utilities and weather/tide belong to adjacent domains.

Completeness4/5

Discovery (search_place, search_tourism, expand_kg_pois, nearby, reverse_geocode), detail (get_poi_details, get_tourism_details), and context (weather, forecast, tide, datetime) form a coherent end-to-end surface with clear chaining. Gaps are minor: nothing for user-side actions like saving/bookmarking or itinerary assembly, and POI detail always requires a prior id-producing call.

Available Tools

14 tools
expand_kg_poisA
Read-only
Inspect

Attraktionen / Tourismus-POIs FÜR einen Place aus dem OSM-Knowledge-Graph (Ausdehnung einer Stadt-/Region-OSM-ID auf die POIs darin). Für „was kann ich in X unternehmen" ist dieses Werkzeug die Auskunft — erst verorten, dann abfragen: die osm_id der Region stammt aus search_place. Tool-Semantik-Abgrenzung: dieses Tool = „WELCHE Attraktionen gibt es IN diesem Place" (KG-basiert). NICHT nearby (das ist Vicinity — „Dinge im Radius um EINEN Punkt"). NICHT search_place (das ist Place- Disambiguierung — „WELCHER Ort ist gemeint"). NICHT resolve_location (Transit-Halte). When to use: Region-Tourismus — DE: „was kann ich in unternehmen", „was gibt es in zu sehen", „Sehenswürdigkeiten in ". EN: „what can I do in ", „attractions in ". Nach search_place(<REGION>) mit der zurückgegebenen osmRel-ID aufrufen. When NOT to use: Vicinity-zu-Punkt (Radius um Koordinaten) → nearby; Detail-Info zu EINEM bereits gefundenen POI → get_poi_details; Place- Auflösung Name→ID → search_place; Wetter/Tide → get_current_weather/get_tide. Required args: osm_id (i64 — die osmRel-ID der Stadt/Region aus einem search_place/places-Treffer, z.B. 1187768 für Wangerland; osmNode als Fallback). Optional: limit (Default 8, clamped 1..=20), types (Stichwörter gegen die Werte der OSM-Tags tourism, historic, leisure, natural, sport und amenity, Teilstring, case-insensitive, z.B. ["museum"], ["castle"]; leer = alle Aktivitäts-/Tourismus-Klassen), include_address (bool, Default true — die Postadresse aus den addr:*-Tags), family_only (bool, Default false — nur family-taugliche POIs, je mit den tag-belegten Feldern family/indoor/family_categories) und, nur zusammen damit, indoor_only (bool — davon nur die Indoor-/Schlechtwetter-tauglichen). Unterkünfte ausgeschlossen: dieses Tool ist der Aktivitäts-/„unternehmen"- Pfad — Unterkünfte (tourism=hotel/hostel/guest_house/motel/apartment/… ) werden backend-seitig AUSGESCHLOSSEN (ein Hotel ist keine Unternehmung); auch ein Hotel-types-Filter liefert hier nichts. Für Hotels/Pensionen → search_tourism(type=accommodation) (kuratierte Unterkünfte). Typical chain: search_place(<REGION>) → THIS_TOOL(osm_id=) → (optional get_poi_details(osm_id) pro Treffer für tiefere Details). Multi-call: ein Call pro Region/Typ-Filter; Bursting nicht nötig (das Tool fan-out't intern über alle containedInPlace-Entities). Anti-Fab note: POI-Name, type, Beschreibung, Adresse kommen AUSSCHLIESSLICH aus pois[] dieses Aufrufs. returned: 0 / pois: [] heißt: für dieses Gebiet ist nichts abrufbar — so wiedergeben („Ich konnte für aktuell keine Attraktionen abrufen"). OSM-KG-Coverage: deutschlandweit; Tag-Dichte variiert je Region wie in OSM üblich. Returns {place_osm_id, total_contained, tourism_candidates, returned, pois:[{name, type, types, description?, address?, uri, coord?, opening_hours?, fee?, source:'osm'}], attribution?}. Die optionalen Felder je POI sind tag-belegt oder abwesend, nie geraten. attribution (additiv, top-level): die ODbL-Namensnennung der gelieferten OSM-Daten (ODbL) — {id:'ODbL-1.0', notice:'© OpenStreetMap contributors', url:'https://www.openstreetmap.org/copyright'}. EINMAL pro Antwort (nicht pro POI) und nur wenn pois nicht leer ist. Nennst du diese POIs, nenne „OpenStreetMap" als Quelle. „Kinderfreundlich" ist ein Daten-Fakt (Kategorie/Tag-belegt), kein Modell-Raten.

NameRequiredDescriptionDefault
limitNoMaximum number of enriched tourism entities to return (default 8, clamped to 1..=20).
typesNoOptional type keywords to narrow the result, e.g. ["museum"], ["castle"] or ["viewpoint"]. A POI's types are the values of its OpenStreetMap category tags (`tourism`, `historic`, `leisure`, `natural`, `sport`, `amenity`); a POI is kept when one of them contains a keyword, case-insensitively. When omitted, no POI is left out by its type. Accommodation (`tourism`=hotel/hostel/guest_house/…) is never returned, whatever the filter.
osm_idYesOpenStreetMap relation/node ID of the city/region (e.g. 1187768 for Wangerland). Use the osmRel id from a `places` result (preferred) or osmNode as fallback.
family_onlyNoFamily mode: query the OSM family allowlist (playground/zoo/aquarium/beach/water_park/…) and keep/rank only family-suitable POIs, each carrying the derived `family`/`indoor`/ `family_categories` fields. Defaults to false (the full region expansion).
indoor_onlyNoRestrict the family result to indoor (rain-safe) POIs (aquarium/indoor_play). Only meaningful with `family_only=true`.
include_addressNoWhether to add each entity's postal address, formatted from its own `addr:*` tags (absent where it has none). Defaults to true.

TDQS

A4.6/5.0
Behavior5/5

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

Annotations already cover safety (readOnly, non-destructive, openWorld), and the description still adds substantive behavior: accommodations are excluded backend-side, the tool fan-outs internally over containedInPlace entities, OSM-KG coverage is Germany-wide with variable tag density, and empty results must be reported as 'nothing retrievable' rather than fabricated. The attribution/ODbL obligation is also disclosed.

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

Conciseness3/5

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

Front-loaded with purpose and differentiation, but the block is long, heavy on bold pseudo-headers and mixed German/English, and repeats points already in the schema (limit clamping, address default, types semantics). Several sentences could be trimmed without losing information.

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

Completeness4/5

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

There is no output schema, yet the description discloses the full return shape (`place_osm_id`, `total_contained`, `tourism_candidates`, `returned`, `pois[]` fields, `attribution`), the anti-fabrication rule, and the empty-result behavior. That is complete for this complexity, though the return-shape prose is dense rather than structured.

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 adds meaning beyond the schema by explaining where the `osm_id` comes from (`search_place`/`places` osmRel, node fallback) and clarifying that `indoor_only` is meaningful only with `family_only`, plus the practical consequence that a hotel `types` filter yields nothing.

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: expanding a city/region OSM ID into its tourism/attraction POIs from the OSM knowledge graph. It explicitly distinguishes itself from three siblings (`nearby` = vicinity, `search_place` = place disambiguation, `resolve_location` = transit stops), so an agent can pick it without opening 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?

Provides explicit 'When to use' triggers in DE and EN with example phrasings, an explicit 'When NOT to use' section routing to `nearby`, `get_poi_details`, `search_place`, and weather/tide tools, plus a typical call chain (`search_place` → this tool → `get_poi_details`).

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

get_current_weatherA
Read-only
Inspect

Aktuelles Wetter zu Koordinaten. Für „wie ist das Wetter in X" ist dieses Werkzeug die Auskunft — erst verorten, dann abfragen: lat/lon kommen aus search_place, nie aus eigener Schätzung. When to use: aktuelle Wetterfrage zu einem Ort — DE: „wie ist das Wetter in ", „regnet es gerade in ". EN: „what's the weather like in right now". Auch als Teil des Wetter-POI-Pfads („was kann ich bei dem Wetter unternehmen"). When NOT to use: Vorhersage > 1 Stunde voraus → get_weather_forecast; Gezeiten → get_tide. Required args: lat, lon. Optional: units ('metric' (°C, default), 'imperial' (°F), 'standard' (K)), lang ('en' default, 'de'). Typical chain: search_place(city) → THIS_TOOL(lat, lon) → (optional nearby/resolve_location für POI-Match). Multi-call: ein Call pro Ort. Für Multi-Tag-Anfragen get_weather_forecast bevorzugen. Anti-Fab note: Temperatur, Bedingungen, Wind, Feuchte kommen NUR aus dem Tool-Output dieses Aufrufs — KEINE Schätz-Werte. attribution (additiv, top-level): die von der GeoNutzV verlangte Quellenangabe der Wetterdaten — {id:'GeoNutzV', notice:'Quelle: Deutscher Wetterdienst', url:…}. Nennst du Wetter-Werte, nenne den Deutscher Wetterdienst als Quelle; die Auflage reist mit dem Tool-Output, nicht mit dem Prompt.

NameRequiredDescriptionDefault
latYesLatitude of the location
lonYesLongitude of the location
langNoLanguage code for descriptions (e.g. "en", "de"). Defaults to "en".
unitsNoUnit system: "metric" (°C, m/s), "imperial" (°F, mph), or "standard" (K). Defaults to "metric".

TDQS

A4.8/5.0
Behavior5/5

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

Annotations already establish read-only, open-world, non-destructive behavior, but the description adds substantial context beyond them: an anti-fabrication rule (values only from tool output), the GeoNutzV attribution obligation that travels with the output, and one-call-per-location semantics. This is exactly the kind of disclosure structured fields cannot carry.

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?

Dense and long, but front-loaded and organized into bolded sections (When to use / When NOT / Required args / Typical chain / Anti-fab). A little redundancy between the required-args recap and the schema, but nearly every sentence carries routing or safety value.

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 tells the agent what the return carries (the additive attribution object) and how to cite it, plus the chaining path through search_place. Complete for a read-only, coordinate-driven lookup.

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 lat/lon/units/lang are already documented, but the description adds a real constraint absent from the schema: coordinates must originate from search_place and never from estimation. That elevates it above the baseline 3, though it largely restates the unit/language defaults.

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 ('Aktuelles Wetter zu Koordinaten') and explicitly contrasts itself with get_weather_forecast and get_tide. An agent can distinguish it from all siblings 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?

Provides explicit 'When to use' and 'When NOT to use' sections with named alternative tools for each exclusion (forecast >1h, tides), plus multi-call and multi-day routing guidance. 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_poi_detailsA
Read-only
Inspect

POI-Detail-Lookup per OSM-ID (Daten aus OpenStreetMap). Für „Öffnungszeiten von X", „erzähl mir was über X" ist dieses Werkzeug die Auskunft — erst verorten, dann abfragen: die osm_id stammt aus nearby/resolve_location/search_place. When to use: nach nearby / resolve_location / search_place lieferte einen POI mit osm_id und die Anfrage will Detail-Info — DE: „erzähl mir was über ", „was kostet der Eintritt", „Öffnungszeiten von ", „bei dem Wetter in unternehmen". EN: „tell me about ", „opening hours of ", „what can I do in given the weather". When NOT to use: für Stadt-/Region-IDs (nutze search_place); ohne vorherigen Tool-Call mit OSM-ID-Output (KEIN raten); wenn die Anfrage Routing/Abfahrten will (dafür der Server MobilityMCP). Required args: osm_id — bare numeric string (pattern ^\d+$, z.B. "296222553"), kein node:/way:-Prefix (der wurde beim emittierenden Tool bereits gestrippt). Typical chain: TWO distinct chains feed this tool — (1) WETTER-CONTEXT: get_current_weather + nearby(node_types='poi') → THIS_TOOL ×3-5 (Trigger: „bei dem Wetter", „given the weather"). (2) REGION-TOURISM: search_place + resolve_location(node_types='poi') → THIS_TOOL ×3-5 (Trigger: „was kann ich in unternehmen" ohne Wetter-Bezug — dichtere OSM-Coverage über resolve_location). Multi-call: JA. Nach resolve_location/nearby mit N POI-Treffern: THIS_TOOL pro Top-3 bis Top-5 OSM-IDs PARALLEL aufrufen — jeder Call ist unabhängig, ein Burst ist erlaubt. NIE nur 1× rufen wenn N>1 POIs zurückkommen. Anti-Fab note: POI-Name, Operator, Öffnungszeiten, Adresse, Tags kommen AUSSCHLIESSLICH aus sources[].subjects[].properties dieses Aufrufs. sources: [] heißt: zu diesem Ort ist nichts abrufbar — so wiedergeben („Zu diesem Ort konnte ich aktuell keine Detail-Informationen abrufen"). OSM-Coverage: deutschlandweit; Tag-Dichte variiert je Region wie in OSM üblich. Shape: {osm_id, sources:[{source:'openstreetmap', subjects:[{subject, properties:{…raw OSM tags: name, tourism/historic/leisure, opening_hours, fee, website, wheelchair, addr:*…}, coord?:{lat,lon}}]}], facts?:{opening_hours?:{value,source}, price?:{free?,raw,source}}}. Die rohen Tags tragen Typ/Adresse/Öffnungszeiten/Preis/Beschreibung bereits; coord (Geometrie-Center, additiv) liegt je Subject NEBEN properties und speist die Karte — present nur wenn das Element Geometrie hat. facts (additiv, top-level): normalisierte Öffnungszeiten + Preis mit Pro-Feld-Provenance (source:'openstreetmap') aus den opening_hours/fee-Tags — EINE stabile Stelle statt Roh-Tags durchwühlen. price.free=true bei fee=no (explizit „kostenlos"/Eintritt frei), false bei fee=yes/Betrag; price.raw trägt den Roh-Tag verbatim. Fehlt opening_hours UND fee → facts ABWESEND (honest, nie erfunden — Quellen-Priorität: kuratiert via get_tourism_details VOR diesem OSM-Bridge). attribution (additiv, top-level): die ODbL-Namensnennung der gelieferten OSM-Daten (ODbL) — {id:'ODbL-1.0', notice:'© OpenStreetMap contributors', url:'https://www.openstreetmap.org/copyright'}. EINMAL pro Antwort (nicht pro Treffer) und nur wenn sources nicht leer ist. Nennst du OSM-Daten in der Antwort, nenne die Quelle „OpenStreetMap" — die Lizenz-Auflage reist mit dem Tool-Output, nicht mit dem Prompt.

NameRequiredDescriptionDefault
osm_idYesBare numeric OSM ID (e.g. `"296222553"` — no `node:` / `way:` prefix). Must match `^\d+$` (validated at handler-time). The mcp-linking / mcp-geo callers already strip any type-prefix before exposing the value in `ids[].value`.

TDQS

A4.8/5.0
Behavior5/5

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

With readOnlyHint/openWorldHint already declared, the description still adds substantial behavior: multi-call bursts of 3-5 parallel calls, `sources: []` meaning 'nothing retrievable', absence of `facts` as an honest signal, ODbL attribution rules, and per-field provenance. It also flags OSM's variable tag coverage.

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?

Bold section headers and front-loaded purpose make a long description navigable, and each block (chains, shape, attribution) carries distinct information. It is verbose and repeats the no-prefix rule, but the density is justified by the tool's many edges.

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 fully specifies the response shape (`sources`/`subjects`/`properties`/`coord`, additive `facts`), the attribution envelope, and the anti-fabrication policy. An agent has everything needed to call and interpret it.

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 format is already documented, but the description adds the provenance of `osm_id` (comes from `nearby`/`resolve_location`/`search_place` output, prefix already stripped) which the schema only partially implies. That is genuine value beyond the schema, though the format itself is redundant.

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 states a specific verb+resource ('POI-Detail-Lookup per OSM-ID') and immediately scopes it to OpenStreetMap data. It explicitly distinguishes itself from siblings, e.g. 'für Stadt-/Region-IDs (nutze search_place)' and the curated 'get_tourism_details' source.

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?

There are explicit **When to use** and **When NOT to use** sections with concrete DE/EN trigger phrases, plus named alternatives for the excluded cases (search_place for region IDs, MobilityMCP for routing, get_tourism_details as curated priority).

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

get_tideA
Read-only
Inspect

Hoch- und Niedrigwasser der nächsten Tage für einen Küstenort, amtlich vom BSH, mit Windstau-Vorhersage. Für „wann ist Ebbe in X", „Gezeiten bei Y" ist dieses Werkzeug die Auskunft — erst verorten, dann abfragen: city aus der Frage oder lat/lon aus search_place. When to use: Gezeiten-/Ebbe-/Niedrigwasser-/Hochwasser-Frage, auch für einen kommenden Tag — „wann ist morgen Niedrigwasser in Schillig", „low tide in Cuxhaven tomorrow". When NOT to use: normales Wetter → get_current_weather; Routing → der Server MobilityMCP; Haltestellen → resolve_location; Binnen-Orte ohne Küstenbezug (Hannover, Hildesheim, Braunschweig). Required args: entweder city ODER (lat+lon). city trifft zuerst den Pegelnamen, sonst wird der Ort verortet und der Pegel nach Abstand und Revier gewählt (matched_by, query_location, distance_km); weiter als 30 km vom nächsten Pegel ist kein Küstenort. Optional: station_limit (Default 3, 1–10), date_start, date_end (YYYY-MM-DD; ohne beide heute und die zwei Tage danach). Die Vorhersage reicht etwa 6 Tage, Späteres liegt nicht vor (prediction_note). Zeiten in Ortszeit; forecast_cm/forecast_deviation = Windstau; attribution nennt BSH, CC BY 4.0. Typical chain: (optional search_place(city)) → THIS_TOOL. Multi-call: ein Call pro Ort/Tag-Range. Anti-Fab note: Tide-Zeiten kommen NUR aus dem Tool-Output dieses Aufrufs; eine Zeit, die die Antwort nicht enthält, ist unbekannt.

NameRequiredDescriptionDefault
latNoLatitude. Must be combined with lon. Use this or city.
lonNoLongitude. Must be combined with lat. Use this or city.
cityNoA place on the coast or the name of a gauge (e.g. "Schillig", "Norderney"). Matched against the gauges' names; where none carries it, the place is located and the gauges that hold for it answer. Use this or lat+lon.
date_endNoLast day the question is about, YYYY-MM-DD; without it, `date_start`'s day.
date_startNoFirst day the question is about, YYYY-MM-DD; without it and `date_end`, today and the two days after. The forecast reaches about six days; a day beyond it adds `prediction_note`.
station_limitNoHow many gauges to answer with (default 3, at most 10).

TDQS

A4.3/5.0
Behavior3/5

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

Annotations already declare readOnlyHint=true, openWorldHint=true and destructiveHint=false, so safety is covered externally. The description adds genuinely useful behavior beyond that: gauge-matching logic with matched_by/query_location/distance_km, a 30 km coastal cutoff, a ~6-day forecast horizon with prediction_note, local-time interpretation, wind-surge fields, and attribution. However it never describes the actual response structure or empty/no-gauge outcomes, so it sits at a solid but not exemplary level for a tool with annotations covering safety.

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 and routing, then structured into labeled sections (When to use / NOT / Required args / chain / anti-fab). It is long, but nearly every sentence carries actionable information; a few clauses (e.g., the anti-fab note and chain restatement) slightly overlap with earlier content.

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

Completeness4/5

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

For a 6-param open-world read with no output schema, the description covers invocation, location resolution, date defaults and horizon, and names key response fields (forecast_cm, forecast_deviation, attribution), which is nearly complete. The main remaining gap is that the returned structure (per-station grouping, tide event list) is only sketched, not described.

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 adds real semantics: city first matches a gauge name, otherwise the place is geocoded and the nearest gauge by distance and district is chosen; station_limit default 3 (1–10); date defaults to today and the next two days; either city OR lat+lon is required. That is meaningful glue beyond 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?

The first sentence names a specific resource (high/low tide for a coastal location, official BSH data with wind-surge forecast), which is precise and distinct from weather or routing siblings. It also frames it as the answer to 'when is low tide in X', making the resource unmistakable.

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' with concrete example questions and 'When NOT to use' with named alternatives (get_current_weather, MobilityMCP, resolve_location) plus inland-location exclusions. It also documents the typical chain (search_place → this tool) and that one call covers one location/date-range.

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

get_tourism_detailsA
Read-only
Inspect

Kuratiertes Detail zu EINEM Niedersachsen-Hub-Treffer per id — Beschreibung, Öffnungszeiten, ECHTER Preis, Adresse, Medien. Für „was kostet der Eintritt für X", „wann hat X geöffnet" ist dieses Werkzeug die Auskunft. Tool-Semantik-Abgrenzung: dieses Tool = Detail zu EINEM kuratierten NDS-Treffer (dessen id/global_id). NICHT get_poi_details (das ist die OSM-Detail-Bridge per OSM-ID). NICHT search_tourism (das ist die kuratierte Region-/Typ-SUCHE die die id erst liefert). When to use: nach search_tourism lieferte einen Treffer mit id und die Anfrage will Detail/Preis/Öffnungszeiten — DE: „was kostet der Eintritt für ", „Öffnungszeiten von ", „erzähl mir mehr zu ". EN: „opening hours / price of ". When NOT to use: ohne vorherigen search_tourism-Treffer mit id (KEIN raten/erfinden einer id); OSM-POI-Detail per OSM-ID → get_poi_details; Region-Suche → search_tourism. Required args: id (die id ODER global_id aus einem search_tourism-Treffer, z.B. "e_101102405"). Optional: query — ändert nichts am Inhalt, der Datensatz kommt per id vollständig; date für shade (unten). Typical chain: search_tourism(region=<R>, type=event) → get_tourism_details(id=<treffer.id>). Multi-call: ein Call pro id; nach search_tourism mit N Treffern pro Top-Treffer parallel rufbar. Anti-Fab note: Name, Beschreibung, Preis, Öffnungszeiten, Adresse kommen AUSSCHLIESSLICH aus sources[].subjects[].properties dieses Aufrufs. sources: [] heißt: zu diesem Treffer ist nichts abrufbar — so wiedergeben („Zu diesem Treffer konnte ich keine Detail-Informationen abrufen"). Returns {id, sources:[{source, license?, subjects:[{subject, properties:{name, type, description?, opening_hours?, price?, address?, date?, media?, coord?, url?, hub_detail_url?}}]}], facts?}. Die Felder sind die schema.org-Felder des kuratierten Datensatzes: price aus priceRange/offers, opening_hours aus openingHoursSpecification, coord aus geo, url = schema.org-Link — alle additiv, present nur wo die Quelle sie trägt. Bei einer Tour (t_…) zusätzlich: path_on_map — ihr Verlauf als [{lat,lon}], ausgedünnt auf die Punkte, die seine Form tragen; das ist die zeichenbare Strecke in voller Form. Dazu die Achsen des Datensatzes: length_m, duration_min, ascent_m/descent_m, round_trip, activities (wörtlich, als was er die Tour führt). Alle aus ET2014A.json, alle nur present wo die Quelle sie führt — eine fehlende Achse ist unbekannt, keine Null. Dazu trail_shape — round (Rundweg), line (Strecke) oder ascent (Aufstieg), aus dem Verlauf gelesen und vor round_trip maßgeblich — und entries: wo man einsteigt, der empfohlene Einstieg zuerst, [{lat,lon,reason,name?,stop?:{name,distance_m,source,license}}]. reason: nearest_to_stop (Punkt des Wegs am nächsten an einer Haltestelle), course_end (das haltestellennähere Ende einer Strecke) oder official_start (der Startpunkt; bei einem Aufstieg immer). stop ist die nächste bediente Haltestelle aus OpenStreetMap, distance_m die Luftlinie bis dorthin — den Fußweg nennt erst die Verbindung. Die Anreise mit Bus und Bahn (Server MobilityMCP) führt zum ersten Eintrag, mit Auto oder eigenem Rad zum official_start. Fehlt entries, war die Haltestellenfrage nicht zu beantworten: dann gilt der Startpunkt (coord), so benannt. Dazu shade für date (YYYY-MM-DD, Vorgabe heute): tree_share Anteil unter Bäumen, nicht Schatten; by_hour? Schattenanteil je Stunde 8–19 Uhr Ortszeit (Stunden ohne Sonne fehlen) am nächsten Stichtag day (MM-DD, ausgeschrieben day_text); Laubzeit Mai bis einschließlich Oktober, sonst statt tree_share trees_leafless: true, Bäume ohne Laub: nur Hang- und Gebäudeschatten; data_as_of Jahr des ältesten Fluges; covered_share, source, licence, sources; aus LGLN-Höhenmodell und Luftbild, Gebäude aus OpenStreetMap, außerhalb Niedersachsens Meta/WRI-Baumhöhe ohne by_hour. Davon nur Anteile, Uhrzeiten, Datenstand wiedergeben, ohne Zusatz. Fehlt shade: keine Angabe, nicht schätzen. licence, sources[].licence wie license wiedergeben. facts (additiv, top-level): normalisierte Öffnungszeiten + Preis mit Pro-Feld-Provenance — kuratiert hat Quellen-Priorität VOR der OSM-Bridge get_poi_details. price.free=true bei explizit kostenlos/Eintritt frei, false bei einem Betrag; price.raw trägt den kuratierten Preis-String wörtlich. Fehlen opening_hours UND price → facts ABWESEND (ehrlich, nie erfunden). hub_detail_url (additiv, in properties, nur bei source: 'niedersachsen-hub'): die kanonische Entitätsseite dieses Datensatzes beim Niedersachsen-Hub, dem Nutzer nennbar — NICHT die Betreiber-Website, die daneben in url steht. Jeder Datensatz dieser Quelle, dessen Art beim Hub eine Eintragsseite hat, trägt sie schon im ersten Aufruf: POI (p_…), Tour (t_…), Veranstaltung (e_…), Unterkunft (h_…), Gastronomie (g_…), Gebiet (r_…). Ein Medien-Datensatz (m_…) hat keine solche Seite und trägt sie nicht. Fehlt sie, keine konstruieren. license (additiv, NEBEN source im sources[]-Eintrag — nicht in properties): {id?, url?, notice?, holder?} = Lizenz-Kennung, Lizenz-Text-URL, der WÖRTLICH wiederzugebende Lizenzverweis (DZT-copyrightNotice, § 3 der DZT-Nutzerbedingungen) und der zu nennende Urheber (das author- bzw. copyrightHolder-Feld des Datensatzes). Gibt er nichts an, ist das Feld abwesend — nie eine geratene Vorgabe-Lizenz. Nennst du einen Datensatz mit license.holder, nenne den Urheber mit.

NameRequiredDescriptionDefault
idYesThe `id` or `global_id` of a curated record from a prior `search_tourism` result (e.g. "e_101102405").
dateNoThe day a tour's `shade` is given for, "YYYY-MM-DD"; today in Germany when omitted. Answered from the nearest computed day (`day`).
queryNoNot needed: the record is fetched by its `id`, complete on the first call. Accepted for a call that still passes the region it searched in; it changes nothing in the answer.

TDQS

A4.7/5.0
Behavior5/5

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

Annotations already establish read-only, open-world, non-destructive behavior, and the description adds substantial context beyond that: source provenance, anti-fabrication rules, `sources: []` handling, optional `date` effects on `shade`, and the fact that `query` does not alter the answer. No annotation contradiction is present.

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

Conciseness3/5

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

The purpose and routing guidance are front-loaded, and much of the return documentation is necessary because there is no output schema. However, the description is extremely long, dense, and mixes usage, return fields, edge cases, and anti-fabrication warnings in a way that is harder to scan than it needs to be.

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 and a complex response shape, the description comprehensively explains returned fields, tour-specific fields, `shade`, `facts`, `hub_detail_url`, and license handling. It also covers missing-data behavior and the required chaining from `search_tourism`, leaving little an agent needs absent.

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 adds meaningful semantics: `id` must come from a prior `search_tourism` hit and must not be guessed, `query` is accepted but inert, and `date` controls the tour `shade` calculation. This goes beyond the schema text enough to merit a 4.

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: fetch curated detail for ONE Niedersachsen hub hit by `id`, including description, opening hours, real price, address, and media. It explicitly distinguishes itself from `get_poi_details` and `search_tourism`, so an agent can route correctly without opening sibling 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 conditions after `search_tourism` returns an `id`, and explicit when-not-to-use cases: no prior `id`, OSM POI detail via `get_poi_details`, or region search via `search_tourism`. The typical chain and multi-call guidance remove most ambiguity.

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

get_usage_guideA
Read-only
Inspect

Die ausführliche Anleitung zu den Werkzeugen dieses Katalogs: wofür ein Werkzeug da ist, wogegen es abzugrenzen ist, was seine Argumente bewirken, was zurückkommt und was daraus zitiert werden darf. Die description eines Werkzeugs ist die Kurzform, dieser Text die vollständige. Optional tool — der Name genau eines Werkzeugs, dessen Abschnitt du lesen willst; weggelassen kommt die ganze Anleitung. Lies den Abschnitt eines Werkzeugs, bevor du dessen Filter setzt oder ein leeres Ergebnis als Antwort weitergibst. Der Abruf ohne tool ist teuer: er bringt die Abschnitte ALLER Werkzeuge dieses Katalogs auf einmal, ein Vielfaches eines einzelnen. Setze tool, sobald feststeht, um welches Werkzeug es geht; ohne Argument nur für den Überblick über den ganzen Katalog.

NameRequiredDescriptionDefault
toolNoDer Name genau eines Werkzeugs aus diesem Katalog, dessen Abschnitt zurückkommen soll. Weglassen für die ganze Anleitung.

TDQS

A4.8/5.0
Behavior5/5

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

Annotations already indicate read-only and non-destructive behavior. The description adds valuable context: omitting `tool` returns all tool sections at once, supplying `tool` returns one section, and the full retrieval is costly. No contradiction with annotations exists.

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 dense and front-loaded with purpose, then explains parameter behavior and cost. Every sentence carries useful information, though it is slightly longer than strictly necessary.

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 guide tool with one optional parameter and no output schema, this description is complete: it explains purpose, when to use it, how the parameter behaves, what is returned, and cost implications. 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% and the parameter is already documented. The description adds decision guidance around when to supply `tool` versus omit it, including the cost trade-off, which goes beyond the schema. It does not enumerate valid tool names, but catalog context provides that.

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 the tool is the detailed guide to all catalog tools, covering purpose, delimitation, arguments, return values, and quotation rules. It clearly positions itself as a meta-tool distinct from the domain-data sibling tools.

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

Usage Guidelines5/5

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

It explicitly says when to read a section (before setting filters or passing an empty result), when to omit the `tool` parameter, and when to set it. It also warns that calling without `tool` is expensive and should only be used for a full-catalog overview.

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

get_weather_forecastA
Read-only
Inspect

Wetter-Vorhersage zu Koordinaten. Für „wie wird das Wetter morgen in X" ist dieses Werkzeug die Auskunft — erst verorten, dann abfragen: lat/lon kommen aus search_place, nie aus eigener Schätzung. When to use: zukünftige Wetterfrage — DE: „wie wird das Wetter morgen / heute Abend / am Samstag in ", „regnet es morgen". EN: „forecast for tomorrow / this weekend". Auch für Halbtages-Touren-Planung („wenn das Wetter mitspielt"). When NOT to use: jetziger Zustand → get_current_weather; Tide → get_tide. Required args: lat, lon. Optional: units ('metric' default, 'imperial', 'standard'), lang ('en' default, 'de'), limit (Anzahl Forecast-Slots). Typical chain: search_place(city) → THIS_TOOL(lat, lon, limit=N) → (optional resolve_location(node_types='poi') + get_poi_details für POI-Auswahl je nach Wetter-Branche). Multi-call: ein Call pro Ort. Multi-Day-Queries decken sich über limit. Anti-Fab note: Vorhersage-Werte kommen NUR aus dem Tool-Output dieses Aufrufs; ein Tag, den die Antwort nicht enthält, hat keinen Wert. attribution (additiv, top-level): die von der GeoNutzV verlangte Quellenangabe — {id:'GeoNutzV', notice:'Quelle: Deutscher Wetterdienst', url:…}. Nennst du Vorhersage-Werte, nenne den Deutscher Wetterdienst als Quelle.

NameRequiredDescriptionDefault
latYesLatitude of the location
lonYesLongitude of the location
langNoLanguage code for descriptions (e.g. "en", "de"). Defaults to "en".
limitNoMaximum number of forecast entries to return
unitsNoUnit system: "metric" (°C, m/s), "imperial" (°F, mph), or "standard" (K). Defaults to "metric".

TDQS

A4.8/5.0
Behavior5/5

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

Annotations already declare readOnly/openWorld/non-destructive, and the description goes well beyond them: it mandates that `lat`/`lon` come from `search_place` rather than estimation, states one call per location, explains how multi-day queries map onto `limit`, and adds an anti-fabrication rule plus a legal attribution requirement (GeoNutzV/DWD).

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 one-line purpose before the bolded routing blocks, and every section earns its place. It is dense and mixes German and English, so it is longer than strictly necessary, but nothing 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 and five parameters, the description still covers what matters: the top-level `attribution` object's shape, the source of forecast values, and the constraint that unlisted days have no value. An agent has everything needed to call and interpret the result.

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 defaults are already documented; the description still adds value by specifying the provenance of `lat`/`lon` and by characterizing `limit` semantically as forecast slots rather than just 'maximum entries'. It adds meaning, though it does not extend the schema substantially.

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 (weather forecast for coordinates) and explicitly differentiates from siblings: current conditions go to `get_current_weather`, tides to `get_tide`. 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?

Contains explicit **When to use** and **When NOT to use** sections with concrete example queries in two languages, plus a typical call chain (`search_place` → this tool → optional POI tools). Alternatives are named by tool name, not implied.

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

nearbyA
Read-only
Inspect

Findet Haltestellen, POIs und Adressen im Radius um eine KOORDINATE (Schwerpunkt Hannover/Niedersachsen) — „was ist in der Nähe von <lat,lon>", „welche Haltestellen liegen um diesen Punkt". Liegt nur ein Name vor, kommt erst eine Auflösung: search_place für eine Stadt oder Region, sonst die Ortsauflösung. Pflicht: latitude, longitude, radius_m. Optional: limit (Default 10); node_types — EIN String, mehrere Arten mit Komma: 'stop', 'address', 'poi', die Sharing-Angebote 'bike_rental', 'scooter_rental', 'car_sharing', 'taxi_stand', die Abstellanlagen 'park_and_ride', 'bike_and_ride', in Südtirol Ladesäulen 'charging_station' und fahrende Taxis 'taxi', oder 'any' ('stop,bike_rental'); include_mots (legt die bedienenden Linien über die Haltestellen-Treffer); only_available (nur Sharing-Treffer, Ladesäulen und Taxis, die gerade als frei gemeldet sind — UNBEKANNTE Verfügbarkeit gilt nicht als frei). Format: kompakter Einrück-Text (TOON), kein JSON. Anleitung: get_usage_guide mit tool='nearby' — die Werte im Einzelnen, was 'any' nicht abdeckt, und was ein Treffer trägt (category, modality, parking, charging, taxi, contactInfo). Anti-Fab: nur die zurückgegebenen Namen, Typen, Distanzen und Verfügbarkeiten nennen; fehlt ein Feld, war es in der Quelle nicht getaggt — Öffnungszeiten und Preise stehen hier NICHT.

NameRequiredDescriptionDefault
limitNoMaximum number of results, at least 1. Default 10.
formatNoAnswer serialisation: `"toon"` (default) or `"json"` — the detail is in `get_usage_guide`. **An agent leaves this out.**
latitudeYesLatitude in WGS-84 decimal degrees.
radius_mYesSearch radius in metres.
longitudeYesLongitude in WGS-84 decimal degrees.
node_typesNoWhich kinds of place to answer with: the places the graph holds — `"stop"`, `"address"`, `"poi"` — plus the shared-mobility offers `"bike_rental"`, `"scooter_rental"`, `"car_sharing"` and `"taxi_stand"`, plus the places to leave a vehicle of one's own, `"park_and_ride"` and `"bike_and_ride"`, plus — in South Tyrol — the charging stations `"charging_station"` and the taxis on the road `"taxi"`, or `"any"` for all of them. Several combine in ONE comma-separated string — `"stop,bike_rental"`; an array of the same tokens is read as that string. A kind outside the twelve is an argument error, not a dropped filter. `"poi"` alone also switches on the non-tourism filter; omit (or `"any"`) for the mixed default, in which each requested kind gets its share of `limit` and the shared-mobility offers share one between them. The two park-and-ride kinds, the charging stations and the taxis are the exceptions `"any"` does NOT cover — ask for them by name; for the parking sites with a `radius_m` of a few kilometres, because they are sparse.
include_motsNo`true` overlays the serving transit lines on stop results. Default `false`, which keeps the answer small.
only_availableNoSet to `true` for „wo kann ich JETZT eines nehmen": of the shared-mobility offers, only those whose live feed reports at least one vehicle ready to be taken are answered with — and of the charging stations those with a point reported free, of the taxis those reported free. A place whose availability is unknown is NOT returned then, and neither is a taxi rank, which has no feed to report one. Omit (or `false`) to list every place in range. The other kinds — `"stop"`, `"address"`, `"poi"`, `"park_and_ride"`, `"bike_and_ride"` — are unaffected either way.

TDQS

A4.8/5.0
Behavior5/5

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

Annotations already cover the safety profile (readOnly/openWorld/destructive=false), but the description goes well beyond: it discloses the TOON text output format, the fact that opening hours and prices are absent, the fields a hit carries, and the special availability semantics (unknown availability is not treated as available). This is rich behavioral context an agent cannot get from the annotations alone.

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 required/optional, then format, guide pointer and anti-fabrication rules, so the structure is easy to scan. It is long and partly duplicates the schema's own node_types enumeration, but nearly every sentence carries operational value.

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 and 8 parameters, the description covers what an agent needs: output format, what a result carries, availability caveats, and anti-fabrication rules, while delegating exhaustive detail to `get_usage_guide`. Nothing essential for a correct call 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 nonetheless adds real meaning — required vs optional split, the comma-string form of `node_types`, the fact that `'any'` does NOT cover park_and_ride/charging_station/taxi, and the distinction between unknown and unavailable for `only_available`. It slightly repeats schema text, which keeps it from a 5.

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: finds stops, POIs and addresses within a radius of a coordinate, with two concrete example queries. It also distinguishes itself from siblings by routing name-only inputs to `search_place` (city/region) or the place resolution, so an agent can tell it apart 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?

Explicit when-to-use phrasing ("was ist in der Nähe von <lat,lon>") plus explicit alternatives (`search_place` for a city/region, otherwise the place resolution). It also directs the agent to `get_usage_guide` for the finer points and names the default serialisation, leaving little to inference.

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

resolve_locationA
Read-only
Inspect

Löst Freitext in die Id auf, mit der gefahren wird — die Haltestelle, die Adresse oder den POI hinter „von nach ", „erzähl mir was über ". Wo Routing, Abfahrtstafel oder POI-Steckbrief eine Id brauchen, steht es davor — auch wenn der Nutzer die Stadt dazu nennt („Hauptbahnhof Hannover"). Ein GEBIET (Stadt/Region) verortet search_place. Pflicht: query — nur der Name: 'Kelsterbach Bahnhof', NICHT 'für Kelsterbach Bahnhof'. Wegzulassen sind für, vom, von, nach, bis; ein führendes am/an/in/zur/auf bleibt stehen — so heißen echte Halte („Am Wehrhahn"). Optional: lat/lon (Ranking-Bias), limit, node_types ('stop'/'address'/'poi'/'any', mehrere mit Komma in EINEM String; eine andere Art ist ein Argument-Fehler), city_station (Query = ganze Stadt → deren (Haupt-)Bahnhof). Art-Wort in node_types, nicht in den Namen: „Haltestelle X" → 'stop', „Adresse X" → 'address', „POI X"/„Sehenswürdigkeit X" → 'poi', query je ohne das Wort. A→B: zweimal rufen — Start, Ziel. Jeder Treffer trägt type und location; NUR ein stop hat eine fahrbare DH-Id, nie eine erfinden. Ein stop nennt in modes, was dort hält (['tram','bus']) — so ist „die Stadtbahn-Haltestelle" unter Namensvettern zu erkennen. Nennt name den Ort in der Sprache der Frage, steht der Name vor Ort in localName. Anleitung: get_usage_guide — Abgrenzung, Argumente, Rangfolge. Anti-Fab: nur die Treffer aus dem Output dieses Aufrufs verwenden.

NameRequiredDescriptionDefault
latNoOptional latitude (WGS-84) to bias ranking toward nearby stops.
lonNoOptional longitude (WGS-84) to bias ranking toward nearby stops.
limitNoMaximum number of results. Defaults to 5 if omitted.
queryYesFree-text query, e.g. "Hauptbahnhof Hannover" or "Linden Markt". Nur der reine Orts-/Haltename — ohne das Wort, das ihn im Satz ankündigt: `"Kelsterbach Bahnhof"`, nicht `"für Kelsterbach Bahnhof"`. Ein führendes `am`/`an`/`in`/`zur`/`auf` bleibt dagegen stehen, weil echte Haltestellen so heißen ("Am Wehrhahn", "In der Au").
formatNoAnswer serialisation: `"toon"` (default) or `"json"` — the detail is in `get_usage_guide`. **An agent leaves this out.**
node_typesNoWhich kinds of place to resolve to: `"stop"`, `"address"`, `"poi"` or `"any"`. Several combine in ONE comma-separated string — `"stop,poi"`; an array of the same tokens is read as that string. A kind outside the four is an argument error, not a dropped filter — the shared-mobility kinds among them: a rental station and a taxi rank are not in the place index this searches, they are answered by the radius search `nearby`. Forwarded to mobility-middleware as `journey_node_types`. `"poi"` alone additionally drops non-tourism POI names (Kindergarten, Apotheke, Schule, …) — use this for tourism queries. Nennt der Nutzer die Art selbst, gehört sie hierher statt in `query`: "Haltestelle X" → `"stop"`, "Adresse X" → `"address"`, "POI X"/"Sehenswürdigkeit X" → `"poi"` (und `query` dann ohne das Art-Wort).
city_stationNoWhen `Some(true)` AND the query is a whole CITY, resolve it to the city's (Haupt-)Bahnhof stop and return ONLY that stop (so „von Hannover nach Celle" routes Bahnhof→Bahnhof). Forwarded to mobility-middleware as `cityStation=true`. A no-op for non-city queries. The orchestrator routing-floor sets this deterministically per endpoint; the model never has to.

TDQS

A4.5/5.0
Behavior5/5

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

Annotations only cover the safety profile (readOnly/openWorld/non-destructive). The description adds real behavioral context well beyond them: A→B needs two calls, every hit carries `type` and `location`, only a `stop` has a rideable DH-ID that must never be invented, `modes` reveals what stops there, and `name`/`localName` disambiguate language. It also states that an invalid kind is an argument error rather than a dropped filter.

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 and the rest is chunked under bold labels (Pflicht, Optional, Art-Wort, A→B, Anleitung, Anti-Fab), which makes it scannable. It is nevertheless long and partly duplicates the schema's parameter prose, so it is efficient but not maximally tight.

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 carries the return-value burden and does so (type, location, modes, localName vs name) plus an anti-fabrication rule. The remaining gap is what to do when nothing resolves — the no-match / empty-result behavior is not stated.

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 baseline is 3. The description restates the mandatory `query` hygiene rules and the `node_types`/`city_station` semantics, but these are already documented verbatim in the schema, so it adds little beyond the structured fields apart from emphasis.

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 sentence gives a precise verb+resource: it resolves free text into the ID that travel uses, and immediately names the situations (routing, departure board, POI profile). It explicitly differentiates from the sibling `search_place`, which handles an AREA (city/region) rather than a point. An agent can route between the two 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?

States when it is needed ('where routing, departures board or POI profile requires an ID'), names the alternative for areas (`search_place`), and routes shared-mobility kinds (rental station, taxi rank) to `nearby`. It also prescribes the calling pattern for A→B ('call twice') and points to `get_usage_guide` for further distinctions.

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

reverse_geocodeA
Read-only
Inspect

Benennt, was an einer KOORDINATE liegt — der Ort („was liegt bei <lat,lon>"), mit level eine bestimmte Ebene davon, mit level='street' die Straße samt nächster Hausnummer (der Lookup für eine GPS-Startposition). Abgrenzung: den Weg zurück (Name → Koordinate und OSM-Ids) geht search_place, die fahrbare Halte-Id liefert die Ortsauflösung, und nearby listet auf, was UM eine Koordinate liegt, statt den Punkt selbst zu benennen. Pflicht: lat und lon — geschrieben auch latitude/longitude, so wie nearby die Koordinate nimmt; je Aufruf nur eine der beiden Schreibweisen. Optional: radius_m (Suchradius in METERN; ein Ort, IN dem die Koordinate liegt, hat Abstand 0 und ist in jedem noch so engen Radius dabei — ohne radius_m die nächstgelegenen Treffer), limit (Höchstzahl Treffer, Default 10, Maximum 50) und level — 'place' (Default: die ganze Ortshierarchie, feinste Ebene zuerst), 'city' (die Stadt/Gemeinde), 'suburb' (der Stadtteil) oder 'street'. Kennt der Datensatz die gewünschte Ebene hier nicht, antwortet die nächst-gröbere, erkennbar am place_type; ein unbekannter Wert wirkt wie 'place'. Anleitung: get_usage_guide mit tool='reverse_geocode'. Anti-Fab: nur die zurückgegebenen Orts- und Straßen-Namen verwenden, einschließlich der Hausnummer aus dem Datensatz — nie eine erfinden.

NameRequiredDescriptionDefault
latYesLatitude of the coordinate to reverse-geocode. Also accepted spelled `latitude`, the way the vicinity search takes it — one of the two spellings per call.
lonYesLongitude of the coordinate to reverse-geocode. Also accepted spelled `longitude`, the way the vicinity search takes it — one of the two spellings per call.
levelNoOptional resolution level. `"place"` (default) answers with the coordinate's whole admin hierarchy, finest first (suburb → town → county → state → country); `"city"` with the town/municipality it lies in; `"suburb"` with the suburb; `"street"` with the nearest STREET/ADDRESS (street name + nearest house number, e.g. `"Münzstraße 3-4"`) — the level needed to label a real GPS start position. Where the data has no place at the requested level, the next coarser one answers, recognisable by its `place_type`. Any other / omitted value behaves as `"place"`.
limitNoOptional maximum number of hits, nearest first. Default 10, upper bound 50; a larger value is served as 50 and `0` as the default. Applies to every level and with or without `radius_m`.
formatNoAnswer serialisation: `"toon"` (default) or `"json"` — the detail is in `get_usage_guide`. **An agent leaves this out.**
radius_mNoOptional radius in METRES. When set, returns the places inside the circle, sorted nearest-first and capped to `limit`. A place the coordinate LIES INSIDE is at distance 0 and is therefore in every radius, however tight. When omitted, returns the `limit` nearest places.

TDQS

A4.9/5.0
Behavior5/5

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

Annotations already mark readOnlyHint=true and openWorldHint=true, so the description does not need to repeat basic safety. It adds genuinely non-obvious behavior: fallback to a coarser level when the requested level is missing and the result is recognizable via place_type, distance-0 inclusion in any radius, limit clamping, and the anti-hallucination instruction to use only returned names. Nothing in the description contradicts the annotations.

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

Conciseness5/5

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

The description is dense but highly structured: purpose, boundary, required args, optional args, fallback behavior, instruction source, and anti-hallucination rule each get a clearly labeled section. Although it is longer than many descriptions, every sentence carries operational value; there is no filler or tautology.

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 6-parameter tool with no output schema, the description covers all parameters, defaults, edge cases, sibling-tool routing, and output interpretation (place_type fallback indicator). It also gives an anti-fabrication rule for returned names, which is critical practical guidance. The reference to get_usage_guide fills any remaining serialization detail without bloating the main description.

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, and the description goes beyond it by adding the one-spelling-per-call rule, explaining the nearest-hit behavior when radius_m is omitted, and clarifying that unknown level values behave like 'place'. It largely restates schema semantics for radius_m and limit, but it provides extra operational context that helps an agent invoke the tool correctly.

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 action and resource: names what lies at a coordinate, optionally at a chosen level, including street-level reverse geocoding. The first sentence alone tells an agent not just what the tool returns but that it is the lookup for a GPS start position. It also distinguishes itself from nearby and search_place, making sibling confusion unlikely.

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

Usage Guidelines5/5

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

Explicitly gives when-to-use guidance: reverse geocoding a coordinate, street labeling for GPS positions, and the distinction from search_place (name → coordinate), nearby (what lies around), and another resolution tool. It also states required parameters, the mandatory spelling consistency rule, and points to get_usage_guide for further detail.

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

search_placeA
Read-only
Inspect

Löst den NAMEN einer Stadt, Region oder eines Bezirks in Koordinaten und OSM-Ids auf — der erste Schritt, wenn ein GEBIET verortet werden muss („was kann ich in unternehmen", „wie ist das Wetter in "). Für eine HALTESTELLE ist dieses Werkzeug fast immer falsch: es kennt Gebiete, keine Bahnsteige — auf einen Bahnhofs-Namen antwortet es mit dem Stadtteil, und die Id, die es liefert, ist eine OSM-Id und keine fahrbare Halte-Id. Trägt die Anfrage Bahnhof, Hauptbahnhof, Hbf oder Bf, gehört sie an die Ortsauflösung — „Köln Hauptbahnhof" und „Hannover Bahnhof" also dorthin, nicht hierher: auf das erste antwortet dieses Werkzeug mit einem gleichnamigen Ortsteil (einem in Potsdam), auf das zweite mit der Stadt Hannover. Dasselbe für Adresse und POI — alles, was Start, Ziel oder Abfahrtsort einer Fahrt sein kann; eine Stadt als Fahrt-Endpunkt („von Hannover nach Celle") ebenfalls. Von einer Koordinate zurück zum Namen geht reverse_geocode, die Umgebung einer Koordinate listet nearby. Pflicht: name. Optional: lang (derzeit ohne Wirkung). score: 1 = derselbe Name, ab 0,5 als ganzes Wort; liegt der erste Treffer darunter, kennt der Index keinen Ort dieses Namens → Ortsauflösung. Anleitung: get_usage_guide mit tool='search_place' — Abgrenzung, Ketten, score, mehrdeutige Namen. Anti-Fab: nur die zurückgegebenen Namen und Ids nutzen, keine Bauch-Geographie.

NameRequiredDescriptionDefault
langNoOptional ISO language code (e.g. "de", "en"). Currently advisory: the place names are the German ones the data carries, whatever is asked for. Kept in the signature so a multilingual answer needs no new argument.
nameYesName of the area to search for. Free-text fuzzy match against the place index behind this endpoint (e.g. "Hannover", "Linden", "Wangerland").
formatNoAnswer serialisation: `"toon"` (default) or `"json"` — the detail is in `get_usage_guide`. **An agent leaves this out.**

TDQS

A4.7/5.0
Behavior5/5

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

Annotations cover the safety profile (readOnly, openWorld, non-destructive), and the description goes well beyond them: it discloses that a station name yields a same-named district (one in Potsdam) and that the returned id is an OSM id, not a drivable stop id. It also explains the score matching semantics (1 = exact, >=0.5 whole word) and adds an anti-fabrication instruction about only using returned names and ids.

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, then the critical exclusion, then parameters, then the usage guide and anti-fabrication note, with bold markers making sections scannable. It is dense rather than padded, but the single block is long and some parenthetical examples could be trimmed without loss.

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

Completeness4/5

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

For a read-only lookup with no output schema, it covers purpose, alternatives, required/optional params, matching behavior and what the returned id actually is. It stops short of describing the full response shape (e.g. whether coordinates and ids come as a list of candidates), so an agent still infers some of the return structure.

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

Parameters4/5

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

Schema description coverage is 100%, so a 3 is the baseline. The description adds real signal on top: it restates name as mandatory and clarifies that lang has no current effect (the schema only says "advisory"), which is a genuine refinement. The format parameter is left to the schema and the reference to a `score` field is a bit ambiguous, keeping it from a full 5.

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 precise verb and resource: it resolves the NAME of a city, region or district into coordinates and OSM-Ids, and frames this as the first step for locating an area. It actively distinguishes itself from siblings by naming reverse_geocode and nearby for their respective jobs, 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 (locating a region/city for questions like weather or activities) and explicit when-NOT-to-use (any request containing Bahnhof/Hbf/Bf or any stop/address/POI that could be a journey endpoint, which belongs to resolve_location). Concrete examples ("Köln Hauptbahnhof", "Hannover Bahnhof") show what goes wrong otherwise, and it points to get_usage_guide for deeper chaining.

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

search_tourismA
Read-only
Inspect

Kuratierte Tourismus-Suche des Niedersachsen-Hubs: redaktionell gepflegte Einträge mit Veranstaltungen samt Datum, Preisen, Beschreibungen, Medien, Öffnungszeiten und Touren. Für „welche Veranstaltungen sind in X", „was kostet der Eintritt" ist dieses Werkzeug die Auskunft — erst verorten, dann abfragen: region/query aus der Frage, lat/lon nur aus search_place. Tool-Semantik-Abgrenzung: die in OpenStreetMap erfassten Sehenswürdigkeiten eines Gebiets listet expand_kg_pois; für Region-Tourismus dürfen beide laufen. Umkreis um einen Punkt → nearby, welcher Ort gemeint ist → search_place. When to use: Events — DE: „was ist diese Woche/am Wochenende in los", „Veranstaltungen in ". EN: „events in this weekend". Unterkünfte/Gastro — DE: „Hotels in ", „Restaurants in ". EN: „hotels/restaurants in ". Touren — DE: „touristische Radrouten/Radtouren in ", „Radwanderwege/Wanderwege am " → type=tour; jede Tour trägt dann length_m, duration_min, ascent_m/descent_m, round_trip und activities (wörtlich, als was der Datensatz sie führt: „Fahrrad", „E-Bike", „Wandern", „Kanu") sowie trail_shape (round | line | ascent, aus dem Verlauf gelesen — gilt vor round_trip) — DARAN auswählen, nicht am Namen. Die ersten 5 Touren mit Verlauf tragen ihn als path_polyline für die Karte (Encoded Polyline, ≤ 40 Punkte) — nicht vorlesen. Bei mehreren die passendste per get_tourism_details zeichnen, die anderen nennen und fragen, welche noch. When NOT to use: alle in OpenStreetMap erfassten Sehenswürdigkeiten → expand_kg_pois; Detail zu EINEM Treffer → get_tourism_details; Routing/ Abfahrten, auch „von A nach B mit dem Rad" → der Server MobilityMCP; Wetter/Tide → get_current_weather/get_tide. Required args: region ODER query (eines von beiden — Freitext-Region/ Name, z.B. region="Wangerland", query="Sielhafenmuseum"). Optional: type (genau eines von "event" | "poi" | "accommodation" (="hotel") | "gastro" (="restaurant") | "tour" — kuratierte Rad-/Wander-Routen, auch als "radtour"/"radroute"/"radwanderweg"/"wanderweg" akzeptiert; weggelassen = alle Typen; unbekannter Wert = alle. OHNE type=tour sind Touren praktisch nie unter den Treffern). Im Aktivitäts-Scope (type="poi"/"attraction"/"unternehmen"/…) sind Unterkünfte AUSGESCHLOSSEN, im Region- wie im Vicinity-Modus (ein Hotel ist keine Unternehmung); für Hotels explizit type="accommodation". timeframe (nur für type=event: "today" | "tomorrow" | "weekend" | "this_week" | "month" | ISO "YYYY-MM-DD" | Range "YYYY-MM-DD..YYYY-MM-DD"; ohne timeframe = kommende Events ab heute), limit (1..=20, Default 8), family_only (bool, Default false — nur die kuratierten Family-Kategorien, je mit der belegten suitability-Achse), indoor_only (bool — nur, was der Niedersachsen-Hub als „Schlechtwetterangebot“ führt; „drinnen“ führt er nicht. Andere Quellen entfallen, note sagt es). activity (nur mit type=tour): wie eine Tour zurückgelegt wird — "wandern" | "fahrrad" | "kanu" + Synonyme. Filtert auf die GANZE Familie kuratierter Aktivitätswerte; weglassen oder unbekannt = alle. shade (nur mit type=tour): "schattig" (überwiegend unter Bäumen) | "vormittags" | "mittags" | "nachmittags" (9–11/12–14/14–17 Uhr überwiegend im Schatten) am date (YYYY-MM-DD, Vorgabe heute) — nur solche Touren, danach sortiert, Stichtag in shade_day. Laubzeit Mai bis einschließlich Oktober, sonst shade_trees_leafless: nur Hang- und Gebäudeschatten. shade_tree_share = Anteil der Strecke unter Bäumen, nicht Schatten je Stunde. Aus LGLN-Höhenmodell und Luftbild; davon nur Anteile und Uhrzeiten wiedergeben, ohne Zusatz. Was nicht beurteilt ist, sagt note. Coord-Vicinity-Modus (Umkreis, POI-Anker): für „ am/bei " den POI ZUERST über die Ortsauflösung zu einer Coord auflösen, dann lat+lon setzen (beide nötig; + optional radius_m). region/query sind dann nur Pool-Hint, nicht mehr Pflicht; die Treffer sind auf den Umkreis gefiltert, nächster zuerst, je mit distance_m. NUR in diesem Modus kommt die OSM-Breite dazu, entdoppelt gegen die Kuration (kuratierter Treffer gewinnt): bei type=gastro die amenity-Gastronomie, im Aktivitäts-Scope (type=poi, „unternehmen") tourism ∈ attraction/museum/…, historic und leisure ∈ park/garden/… — AUSGESCHLOSSEN bleiben Unterkünfte (hotel/hostel) und Alltags-Versorgung (shop, Apotheke/Bank/Arzt), beides keine Ausflugsziele. Typical chain: search_tourism(region=<R>, type=event) → get_tourism_details(id) pro Treffer. Multi-call: ein Call pro Region/Typ. Anti-Fab note: Event-Namen, DATEN, PREISE, POI-Namen, Adressen kommen AUSSCHLIESSLICH aus pois[] / events[] dieses Aufrufs. returned: 0 / pois: [] / events: [] heißt: für war nichts abrufbar — so wiedergeben. Datum eines Events ist tool-belegt (events[].date / pois[].date, ISO-8601 Europe/Berlin) ODER abwesend — NIE geschätzt. DZT-Bündelung (zweite kuratierte Quelle, DE-weit): kuratierte Treffer AUSSERHALB Niedersachsens kommen aus der DZT-KG (Deutsche Zentrale für Tourismus), de-dupliziert; in Niedersachsen gewinnt der Niedersachsen-Hub-Eintrag. Bei type=tour bleibt sie AUSSEN VOR — sie führt keinen Touren-Inhaltstyp; kuratierte Touren gibt es nur für Niedersachsen, außerhalb ehrlich "keine Tour abrufbar". Returns {place, source:'niedersachsen-hub', type, returned, mode?, center?, radius_m?, shade_day?, shade_day_text?, shade_trees_leafless?, pois:[{name,type,description?,address?,uri?,date?,price?,media?, coord?,opening_hours?,id?,distance_m?,source?,license?,hub_detail_url?, length_m?,duration_min?,ascent_m?,descent_m?,round_trip?,trail_shape?,activities?, shade_tree_share?,path_polyline?}], events:[{name,date,location,source?,license?}]}. Die Herkunft eines Treffers sagt sein source ('osm' | 'niedersachsen-hub' | 'dzt'). id ist der Schlüssel für get_tourism_details; die Felder folgen schema.org. license (additiv, PRO Treffer): die Lizenz, die der Datensatz selbst angibt — {id?, url?, notice?, holder?}: id = Lizenz-Kennung (z.B. 'CC-BY-SA-4.0', 'CC0-1.0', 'ODbL-1.0'), url = Lizenz-Text/Deed, notice = der WÖRTLICH wiederzugebende Lizenzverweis (DZT-copyrightNotice, § 3 der DZT-Nutzerbedingungen; bei OSM-Treffern die ODbL-Namensnennung), holder = der zu nennende Urheber (das author- bzw. copyrightHolder-Feld des Datensatzes). Gibt er nichts an, ist das Feld abwesend — nie eine geratene Vorgabe-Lizenz. Nennst du einen Treffer mit license.holder, nenne den Urheber mit. hub_detail_url (additiv, PRO Treffer, nur bei source: 'niedersachsen-hub'): die Entitätsseite dieses Treffers beim Niedersachsen-Hub, dem Nutzer nennbar — NICHT die Betreiber-Website (uri). Jeder Treffer, dessen Art beim Hub eine Eintragsseite hat, trägt sie: POI (p_…), Tour (t_…), Veranstaltung (e_…), Unterkunft (h_…), Gastronomie (g_…), Gebiet (r_…). Ein Medien-Datensatz (m_…) hat keine und trägt keine; fehlt sie, keine konstruieren. Mit family_only trägt jeder Treffer zusätzlich family, suitability ({family, age_bands, pushchair, seal (Kinderferienland-Siegel), indoor_bad_weather}) und, wo die Quelle sie führt, price_child/price_family — alle feature-belegt: „kinderfreundlich" ist belegt, nicht geraten.

NameRequiredDescriptionDefault
latNoCoord-vicinity mode — center latitude. When `lat` AND `lon` are both given the search becomes a vicinity search around the point: only curated hits within `radius_m` are returned (proximity-filtered on the `coord` field), sorted nearest-first with an additive `distance_m`. Use it for POI-anchor questions ("Restaurants am Maschsee"): resolve the POI to a coord first, then pass it here. `region`/`query` then act as the enclosing-city candidate-pool hint (and are no longer required).
lonNoCoord-vicinity center longitude (paired with `lat`).
dateNoThe day `shade` is judged for, "YYYY-MM-DD"; today in Germany when omitted. Answered from the nearest computed day (`shade_day`). May to October inclusive is the leaf season; outside it the trees are bare and only slopes and buildings shade.
typeNoContent type to narrow the search. One of: "event", "poi", "accommodation" (a.k.a. "hotel"), "gastro" (a.k.a. "restaurant"), "tour". Omit to search across all curated types. Unknown values are treated as "all" (never an error).
limitNoMaximum number of curated entities to return (default 8, clamped 1..=20).
queryNoFree-text query (name / keyword) when not searching a whole region, e.g. "Sielhafenmuseum". Alias for `region`; one of the two is required.
shadeNoOnly TOURS mostly in shade, for `type=tour`, ordered by it: "schattig" (mostly under trees) or "vormittags" / "mittags" / "nachmittags" (mostly in shade 9–11 / 12–14 / 14–17 o'clock) on the day `date`. Computed from LGLN height and aerial data; pass on its shares and hours, nothing more. An unrecognised word filters nothing; with another `type` it has no effect and `note` says so.
regionNoRegion or place to search within, as free text (e.g. "Wangerland", "Hooksiel", "Hannover"). Either `region` or `query` must be given; `region` is the natural choice for a place-scoped tourism search.
activityNoHow a TOUR is travelled, for `type=tour`: "wandern" (also "wanderweg", "spaziergang", "hiking", "zu Fuß"), "fahrrad" (also "radtour", "e-bike", "mountainbike", "cycling") or "kanu" (also "paddeln", "SUP"). Each word selects the whole family of curated activity values, so a hiking question also finds the records filed under "Winterwandern", "Nordic Walking" or "Spaziergang" — 8 % of the walked ones carry no "Wandern" value at all. Which value a given record carries is on the record (`activities`). Omit to search every activity; an unrecognised word is treated as "all" (never an error).
radius_mNoCoord-vicinity radius in metres (default 2000, clamped 100..=20000).
timeframeNoOptional event-date window for `type=event`: "today", "tomorrow", "weekend", "this_week", "month", or an explicit ISO date "YYYY-MM-DD" / range "YYYY-MM-DD..YYYY-MM-DD". With no timeframe the additive `events` list defaults to upcoming events (today onward).
family_onlyNoFamily mode: search the curated NDS family categories (Tierpark/Freizeitpark/Spielplatz/Erlebnisbad/Badesee/Kletterpark/…) and overlay the curated suitability axis (age bands, Kinderwagentauglich, Kinderferienland-Siegel, Schlechtwetterangebot). Every record is then family-belegt + carries an additive `suitability` object. Defaults false.
indoor_onlyNoKeep only what the Niedersachsen-Hub marks as „Schlechtwetterangebot" (also `suitability.indoor_bad_weather`) — the source carries no attribute „indoor", this is the nearest it has. On any search; sources without that mark are then not asked, and the answer says so in `note`.

TDQS

A4.7/5.0
Behavior5/5

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

Annotations only say readOnly/openWorld/non-destructive, yet the description discloses the multi-source model (Niedersachsen hub vs. DZT vs. OSM), the de-duplication rule where the hub wins inside Niedersachsen, the fact that DZT carries no tours, and that OSM data is merged only in coord-vicinity mode with explicit exclusions. It further adds provenance semantics (`source`, `license` with mandatory attribution, `hub_detail_url`), an anti-fabrication contract for names/dates/prices, and the `note` / `returned: 0` honesty behavior — none of which the annotations carry.

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

Conciseness3/5

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

Bold section markers (Tool-Semantik-Abgrenzung, When NOT to use, Required args, Anti-Fab note, DZT-Bündelung) give it a usable skeleton and the scoping constraints are front-loaded. But it is a very long wall of text that restates much of the 100%-covered schema (type, timeframe, activity, shade, limit) and spends large stretches on per-field return-value documentation, so many sentences do not add new decision value for selection.

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 and 13 parameters, the description carries the full load and does: it documents the return envelope (`place`, `source`, `returned`, `mode`, `center`, `pois[]`, `events[]`), per-hit fields including `license`, `hub_detail_url` and `suitability`, and the `id`-to-`get_tourism_details` key. Mode branching (region search vs. coord-vicinity) and the availability/failure semantics are all covered, so nothing an agent needs to call or interpret the result 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 nonetheless adds operational meaning the schema does not spell out as clearly — that `type=tour` is effectively required to ever see tours, that `activity` matches whole value families (8% of walked records lack a "Wandern" value), that `shade_tree_share` is not shade-per-hour and must not be embellished, and that `region`/`query` stop being required once `lat`+`lon` are set. Some parameter text is repeated near-verbatim from the schema, which limits it to a 4.

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 sentence names a specific verb and resource ("Kuratierte Tourismus-Suche des Niedersachsen-Hubs") and immediately enumerates the curated content it covers (events with dates, prices, media, opening hours, tours). A dedicated "Tool-Semantik-Abgrenzung" paragraph explicitly names siblings `expand_kg_pois`, `nearby`, `search_place`, `get_tourism_details` and states what each is for instead. An agent can distinguish this tool from every other one in the sibling list 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?

There are explicit, bilingual "When to use" examples ("was ist diese Woche in <Region> los", "hotels/restaurants in <Ort>"), an explicit "When NOT to use" block routing OSM sights, single-hit details, routing and weather/tide to named alternatives, plus a stated typical chain (`search_tourism` → `get_tourism_details`). Rules like "one call per region/type" and "for hotels explicitly type=accommodation" go beyond what any schema conveys.

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. 2 tool updates
    • Changedget_tourism_details2 fields changed
      • addedInput schema / properties / date
        Added value: +{
        +  "description": "The day a tour's `shade` is given for, \"YYYY-MM-DD\"; today in Germany\nwhen omitted. Answered from the nearest computed day (`day`).",
        +  "type": [
        +    "string",
        +    "null"
        +  ]
        +}
      • changedInput schema / properties / query / description
        Previous value: -"Region/name hint to scope the lookup — pass the same region you searched\nin `search_tourism`. The curated source has no object-by-id endpoint, so\nthe details lookup re-searches that scope and matches the id; without the\nhint it may honest-empty for ids outside the broad default page."New value: +"Not needed: the record is fetched by its `id`, complete on the first\ncall. Accepted for a call that still passes the region it searched in;\nit changes nothing in the answer."
    • Changedsearch_tourism2 fields changed
      • addedInput schema / properties / date
        Added value: +{
        +  "description": "The day `shade` is judged for, \"YYYY-MM-DD\"; today in Germany when\nomitted. Answered from the nearest computed day (`shade_day`).\nMay to October inclusive is the leaf season; outside it the trees are\nbare and only slopes and buildings shade.",
        +  "type": [
        +    "string",
        +    "null"
        +  ]
        +}
      • changedInput schema / properties / shade / description
        Previous value: -"Only TOURS mostly in shade, for `type=tour`, ordered by it: \"schattig\"\n(mostly under trees) or \"vormittags\" / \"mittags\" / \"nachmittags\" (mostly in\nshade 9–11 / 12–14 / 14–17 o'clock on 21 June). Computed from LGLN height\nand aerial data; infer no weather, temperature or UV from it. An\nunrecognised word filters nothing; with another `type` it has no effect\nand `note` says so."New value: +"Only TOURS mostly in shade, for `type=tour`, ordered by it: \"schattig\"\n(mostly under trees) or \"vormittags\" / \"mittags\" / \"nachmittags\" (mostly in\nshade 9–11 / 12–14 / 14–17 o'clock) on the day `date`. Computed from LGLN\nheight and aerial data; pass on its shares and hours, nothing more. An\nunrecognised word filters nothing; with another `type` it has no effect\nand `note` says so."
  2. 1 tool update
    • Changedsearch_tourism1 field changed
      • changedInput schema / properties / shade / description
        Previous value: -"Only TOURS mostly in shade, for `type=tour`, ordered by it: \"schattig\"\n(mostly under trees) or \"vormittags\" / \"mittags\" / \"nachmittags\" (mostly in\nshade 9–11 / 12–14 / 14–17 o'clock on 21 June). Computed from LGLN height\nmodels and aerial photos, nothing about weather, temperature or UV. An\nunrecognised word filters nothing; with another `type` it has no effect\nand `note` says so."New value: +"Only TOURS mostly in shade, for `type=tour`, ordered by it: \"schattig\"\n(mostly under trees) or \"vormittags\" / \"mittags\" / \"nachmittags\" (mostly in\nshade 9–11 / 12–14 / 14–17 o'clock on 21 June). Computed from LGLN height\nand aerial data; infer no weather, temperature or UV from it. An\nunrecognised word filters nothing; with another `type` it has no effect\nand `note` says so."
  3. 1 tool update
    • Changedsearch_tourism1 field changed
      • addedInput schema / properties / shade
        Added value: +{
        +  "description": "Only TOURS mostly in shade, for `type=tour`, ordered by it: \"schattig\"\n(mostly under trees) or \"vormittags\" / \"mittags\" / \"nachmittags\" (mostly in\nshade 9–11 / 12–14 / 14–17 o'clock on 21 June). Computed from LGLN height\nmodels and aerial photos, nothing about weather, temperature or UV. An\nunrecognised word filters nothing; with another `type` it has no effect\nand `note` says so.",
        +  "type": [
        +    "string",
        +    "null"
        +  ]
        +}
  4. 1 tool update
    • Changedget_tide3 fields changed
      • changedInput schema / properties / city / description
        Previous value: -"A place on the coast or the name of a gauge (e.g. \"Cuxhaven\",\n\"Wilhelmshaven\"). Matched against the gauges' names; where none carries\nit, the place is located and its nearest gauges answer. Use this or lat+lon."New value: +"A place on the coast or the name of a gauge (e.g. \"Schillig\",\n\"Norderney\"). Matched against the gauges' names; where none carries it,\nthe place is located and the gauges that hold for it answer. Use this or\nlat+lon."
      • changedInput schema / properties / date_end / description
        Previous value: -"Last day the question is about, YYYY-MM-DD — read as `date_start` is."New value: +"Last day the question is about, YYYY-MM-DD; without it, `date_start`'s day."
      • changedInput schema / properties / date_start / description
        Previous value: -"First day the question is about, YYYY-MM-DD. The answer always carries\nthe measured last three days; a day after them adds `prediction_note`,\nsince no forecast is served."New value: +"First day the question is about, YYYY-MM-DD; without it and `date_end`,\ntoday and the two days after. The forecast reaches about six days; a day\nbeyond it adds `prediction_note`."
  5. 1 tool update
    • Changedexpand_kg_pois2 fields changed
      • changedInput schema / properties / include_address / description
        Previous value: -"Whether to also resolve each entity's structured postal address\n(locality, region, postal code) with an extra lookup. Defaults to true."New value: +"Whether to add each entity's postal address, formatted from its own\n`addr:*` tags (absent where it has none). Defaults to true."
      • changedInput schema / properties / types / description
        Previous value: -"Optional schema.org type keywords to narrow the result, e.g.\n[\"TouristAttraction\"], [\"Hotel\"], or [\"Event\"]. Matched case-insensitively\nas substrings against each entity's schema.org rdf:type. When omitted, all\ntourism-relevant entities (attractions, hotels, events, gastronomy) are returned."New value: +"Optional type keywords to narrow the result, e.g. [\"museum\"], [\"castle\"] or\n[\"viewpoint\"]. A POI's types are the values of its OpenStreetMap category\ntags (`tourism`, `historic`, `leisure`, `natural`, `sport`, `amenity`); a POI\nis kept when one of them contains a keyword, case-insensitively. When omitted,\nno POI is left out by its type.\nAccommodation (`tourism`=hotel/hostel/guest_house/…) is never returned,\nwhatever the filter."
  6. 1 tool update
    • Changednearby2 fields changed
      • changedInput schema / properties / node_types / description
        Previous value: -"Which kinds of place to answer with: the places the graph holds —\n`\"stop\"`, `\"address\"`, `\"poi\"` — plus the shared-mobility offers\n`\"bike_rental\"`, `\"scooter_rental\"`, `\"car_sharing\"` and `\"taxi_stand\"`,\nplus the places to leave a vehicle of one's own, `\"park_and_ride\"` and\n`\"bike_and_ride\"`, or `\"any\"` for all of them. Several combine in ONE\ncomma-separated string — `\"stop,bike_rental\"`; an array of the same\ntokens is read as that string. A kind outside the ten is an argument\nerror, not a dropped filter. `\"poi\"` alone also switches on the\nnon-tourism filter; omit (or `\"any\"`) for the mixed default, in which each\nrequested kind gets its share of `limit` and the shared-mobility offers\nshare one between them. The two park-and-ride kinds are the exception\n`\"any\"` does NOT cover — ask for them by name, and with a `radius_m` of a\nfew kilometres, because such sites are sparse."New value: +"Which kinds of place to answer with: the places the graph holds —\n`\"stop\"`, `\"address\"`, `\"poi\"` — plus the shared-mobility offers\n`\"bike_rental\"`, `\"scooter_rental\"`, `\"car_sharing\"` and `\"taxi_stand\"`,\nplus the places to leave a vehicle of one's own, `\"park_and_ride\"` and\n`\"bike_and_ride\"`, plus — in South Tyrol — the charging stations\n`\"charging_station\"` and the taxis on the road `\"taxi\"`, or `\"any\"` for\nall of them. Several combine in ONE comma-separated string —\n`\"stop,bike_rental\"`; an array of the same tokens is read as that string.\nA kind outside the twelve is an argument error, not a dropped filter.\n`\"poi\"` alone also switches on the non-tourism filter; omit (or `\"any\"`)\nfor the mixed default, in which each requested kind gets its share of\n`limit` and the shared-mobility offers share one between them. The two\npark-and-ride kinds, the charging stations and the taxis are the\nexceptions `\"any\"` does NOT cover — ask for them by name; for the parking\nsites with a `radius_m` of a few kilometres, because they are sparse."
      • changedInput schema / properties / only_available / description
        Previous value: -"Set to `true` for „wo kann ich JETZT eines nehmen\": of the\nshared-mobility offers, only those whose live feed reports at least one\nvehicle ready to be taken are answered with. A station whose\navailability is unknown is NOT returned then, and neither is a taxi\nrank, which has no feed to report one. Omit (or `false`) to list every\nplace in range. The other kinds — `\"stop\"`, `\"address\"`, `\"poi\"`,\n`\"park_and_ride\"`, `\"bike_and_ride\"` — are unaffected either way."New value: +"Set to `true` for „wo kann ich JETZT eines nehmen\": of the\nshared-mobility offers, only those whose live feed reports at least one\nvehicle ready to be taken are answered with — and of the charging\nstations those with a point reported free, of the taxis those reported\nfree. A place whose availability is unknown is NOT returned then, and\nneither is a taxi rank, which has no feed to report one. Omit (or\n`false`) to list every place in range. The other kinds — `\"stop\"`,\n`\"address\"`, `\"poi\"`, `\"park_and_ride\"`, `\"bike_and_ride\"` — are\nunaffected either way."
  7. 3 tool updates
    • Changedget_tide4 fields changed
      • changedInput schema / properties / city / description
        Previous value: -"City name to get tide data for (e.g. \"Hamburg\"). Use this or lat+lon."New value: +"A place on the coast or the name of a gauge (e.g. \"Cuxhaven\",\n\"Wilhelmshaven\"). Matched against the gauges' names; where none carries\nit, the place is located and its nearest gauges answer. Use this or lat+lon."
      • changedInput schema / properties / date_end / description
        Previous value: -"End date for tide data in YYYY-MM-DD format (only used with lat+lon)"New value: +"Last day the question is about, YYYY-MM-DD — read as `date_start` is."
      • changedInput schema / properties / date_start / description
        Previous value: -"Start date for tide data in YYYY-MM-DD format (only used with lat+lon)"New value: +"First day the question is about, YYYY-MM-DD. The answer always carries\nthe measured last three days; a day after them adds `prediction_note`,\nsince no forecast is served."
      • changedInput schema / properties / station_limit / description
        Previous value: -"Maximum number of tide stations to return (only used with lat+lon)"New value: +"How many gauges to answer with (default 3, at most 10)."
    • Changedsearch_place1 field changed
      • changedInput schema / properties / name / description
        Previous value: -"Name of the place to search for. Free-text fuzzy match against the place\nindex behind this endpoint (e.g. \"Hannover\", \"Maschsee\", \"Wangerland\")."New value: +"Name of the area to search for. Free-text fuzzy match against the place\nindex behind this endpoint (e.g. \"Hannover\", \"Linden\", \"Wangerland\")."
    • Changedsearch_tourism1 field changed
      • changedInput schema / properties / indoor_only / description
        Previous value: -"Restrict to rain-safe family records (the\n`suitability.indoor_bad_weather` / Schlechtwetterangebot proxy). Only\nmeaningful with `family_only=true`."New value: +"Keep only what the Niedersachsen-Hub marks as „Schlechtwetterangebot\" (also\n`suitability.indoor_bad_weather`) — the source carries no attribute\n„indoor\", this is the nearest it has. On any search; sources without that\nmark are then not asked, and the answer says so in `note`."
  8. 14 tool updates
    • First observedexpand_kg_pois
    • First observedget_current_weather
    • First observedget_poi_details
    • First observedget_tide
    • First observedget_tourism_details
    • First observedget_usage_guide
    • First observedget_weather_forecast
    • First observedlink_datetime
    • First observedlink_dynamic
    • First observednearby
    • First observedresolve_location
    • First observedreverse_geocode
    • First observedsearch_place
    • First observedsearch_tourism

Publisher details

Operator
PROJEKTIONISTEN GmbH · Publisher source
Vendor relationship
Not applicable
Trust center
Not applicable
Restrictions
https://ai.projektionisten.eu/mcp-landingpage/ · Publisher source

Related MCP Connectors

Related MCP Servers

  • A
    license
    A
    quality
    B
    maintenance
    Enables users to check whether a beach suits a beach day or a surf session today or up to six days ahead, using Open-Meteo weather and marine forecasts scored by deterministic, documented rules. It exposes tools for raw hourly forecast data, suitability scores and verdicts by activity and skill level, and finding the best multi-hour window within a day.
    4
    MIT
  • A
    license
    A
    quality
    A
    maintenance
    Enables an AI assistant to search live neighborhood bulletin-board pins by coordinates, radius, bounding box, or category, and to fetch individual pins or share their page links. It also lets the assistant publish public pins such as events, lost pets, sales, and business notices, gated behind explicit user confirmation and optional paid placement plans.
    4
    MIT
  • A
    license
    Not graded
    quality
    C
    maintenance
    Enables AI assistants to find nearby public places such as pharmacies, supermarkets, gas stations, EV chargers, libraries, and post offices, with attributed opening-hours data from OpenStreetMap.
    1
    MIT
Try in Browser

Glama MCP Gateway

Add one secure layer between your agents and this server.

Resources