TourismMCP
Server Details
Sights, events, opening hours, weather and tides; nearby sharing as currently reported.
- Status
- Healthy
- Uptime
- 99.9% over 21 days
- Last Tested
- Transport
- Streamable HTTP · MCP 2025-11-25
- URL
TDQS
Scored across 14 tools
Each tool has a clearly stated role and the descriptions invest heavily in explicit boundary notes (e.g. expand_kg_pois vs nearby vs search_tourism, and get_poi_details vs get_tourism_details). Genuine overlap remains in the POI-discovery cluster (three tools surface attractions) and the two detail tools, so an agent must read carefully rather than rely on the name alone.
All names use uniform snake_case and most follow a clear verb_noun pattern (get_*, search_*, link_*, resolve_*, reverse_*, expand_*). The lone exception is the bare adverb 'nearby', which breaks the verb_noun convention but stays readable and unambiguous.
With 14 tools spanning tourism discovery, curated content, POI/place/address resolution, reverse geocoding, weather, tides, and time linking, the count sits comfortably in the well-scoped 3-15 range and feels earned rather than padded.
The surface covers discovery (OSM + curated), single-item detail for both sources, current and forecast weather, tides, forward and reverse geocoding, and time linking. Since it is a read-only information server, CRUD lifecycle is not the model and routing is deliberately delegated, leaving only minor gaps.
Available Tools
14 toolsexpand_kg_poisARead-onlyInspect
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 (schema.org-Keywords als Substring-Filter, z.B. ["TouristAttraction"], ["Museum"], ["Event"] — case-insensitive; leer = alle Aktivitäts-/ Tourismus-Klassen), include_address (bool, Default true — löst die Postadresse je Entity auf), 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.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | Maximum number of enriched tourism entities to return (default 8, clamped to 1..=20). | |
| types | No | Optional schema.org type keywords to narrow the result, e.g. ["TouristAttraction"], ["Hotel"], or ["Event"]. Matched case-insensitively as substrings against each entity's schema.org rdf:type. When omitted, all tourism-relevant entities (attractions, hotels, events, gastronomy) are returned. | |
| osm_id | Yes | OpenStreetMap 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_only | No | Family 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_only | No | Restrict the family result to indoor (rain-safe) POIs (aquarium/indoor_play). Only meaningful with `family_only=true`. | |
| include_address | No | Whether to also resolve each entity's structured postal address (locality, region, postal code) with an extra lookup. Defaults to true. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Beyond annotations (readOnlyHint/openWorldHint/destructiveHint=false), it discloses non-obvious behavior: accommodations are excluded server-side even when filtered for, empty results must be reported as such rather than invented, per-POI optional fields are tag-backed or absent (never guessed), and an ODbL attribution object appears once per non-empty response. This is genuinely useful context an agent could not derive from the structured fields.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with purpose before the routing apparatus, and the bold section headers make the long text navigable. It is nevertheless verbose, with repetitive capitalized emphasis (WELCHE/WELCHER/WELCHER) and some restatement of the when/when-not split, which costs it the top score.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a 6-parameter, no-output-schema tool this covers everything an agent needs: required vs optional args with defaults and clamps, the exclusion rule, error/empty-state handling, result field shape, attribution obligation, and OSM coverage caveats. Nothing material is left dangling.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
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 meaning: it notes the hotel-type example in the schema yields nothing here (backend accommodation exclusion), states the osm_id provenance (osmRel ID from search_place, osmNode fallback), and flags that indoor_only is only meaningful together with family_only. It stops short of extending meaning for every parameter, so not a 5.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource: expands a city/region OSM ID into the tourism POIs contained in it, naming the OSM Knowledge Graph as the source. It explicitly distinguishes itself from three siblings (nearby, search_place, resolve_location) with a labelled 'Tool-Semantik-Abgrenzung' section, so an agent can position it without opening any schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Provides dedicated 'When to use' and 'When NOT to use' blocks with concrete German and English trigger phrases ('was kann ich in <REGION> unternehmen'), plus routing rules to nearby for radius queries, get_poi_details for one POI, and search_tourism for hotels. The Typical chain (search_place → this tool → get_poi_details) and multi-call guidance remove all inference.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_current_weatherARead-onlyInspect
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.
| Name | Required | Description | Default |
|---|---|---|---|
| lat | Yes | Latitude of the location | |
| lon | Yes | Longitude of the location | |
| lang | No | Language code for descriptions (e.g. "en", "de"). Defaults to "en". | |
| units | No | Unit system: "metric" (°C, m/s), "imperial" (°F, mph), or "standard" (K). Defaults to "metric". |
TDQS
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.
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.
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.
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.
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.
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_detailsARead-onlyInspect
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.
| Name | Required | Description | Default |
|---|---|---|---|
| osm_id | Yes | Bare 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
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.
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.
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.
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.
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.
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_tideARead-onlyInspect
Gezeiten (Niedrig-/Hochwasser) für einen Küstenort. 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 — DE: „niedrigwasser in Cuxhaven", „wann ist Ebbe in Wilhelmshaven", „Tide bei Norderney". EN: „low tide in Cuxhaven", „when is high tide at Norderney". 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 (z.B. 'Hamburg', 'Cuxhaven', 'Norderney') ODER (lat+lon). Optional bei Koord-Mode: station_limit, date_start, date_end (YYYY-MM-DD). 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.
| Name | Required | Description | Default |
|---|---|---|---|
| lat | No | Latitude. Must be combined with lon. Use this or city. | |
| lon | No | Longitude. Must be combined with lat. Use this or city. | |
| city | No | City name to get tide data for (e.g. "Hamburg"). Use this or lat+lon. | |
| date_end | No | End date for tide data in YYYY-MM-DD format (only used with lat+lon) | |
| date_start | No | Start date for tide data in YYYY-MM-DD format (only used with lat+lon) | |
| station_limit | No | Maximum number of tide stations to return (only used with lat+lon) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already cover the safety profile (readOnlyHint, destructiveHint=false, openWorldHint). The description adds genuine behavioral context beyond that: the anti-fabrication note that tide times come only from this call's output, the one-call-per-location/day-range rule, and the argument-mode requirement. It stops short of describing output format or latency, so not a 5.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The core purpose is front-loaded in the first sentence, followed by clearly labeled sections. It is dense with many query examples, which is slightly verbose, but each block (routing, required args, chain, anti-fab) earns its place.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
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 partially addresses it via the anti-fabrication caveat that tide times appear only in the output. For a read-only tool with 100% schema coverage and thorough usage guidance, this is nearly complete, though an explicit return-shape hint would raise it further.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the schema already documents all six parameters including the lat/lon pairing and the lat+lon-only constraint on date_start/date_end/station_limit. The description reinforces the either/or argument logic and gives city examples, but adds little beyond the schema — baseline 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb+resource (retrieving low/high tide times for a coastal location) and explicitly distinguishes itself from siblings like get_current_weather, resolve_location, and a routing server. An agent can immediately tell what this tool returns and what it does not.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It provides explicit 'When to use' triggers with concrete DE/EN example queries, a 'When NOT to use' section naming the correct alternative tool for each excluded case, plus a typical chain and multi-call guidance. This is a textbook routing-oriented usage block.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_tourism_detailsARead-onlyInspect
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 (Region/ Name-Hint — dieselbe Region wie bei der Suche; die kuratierte Quelle hat KEINEN Objekt-per-id-Endpunkt, daher re-sucht das Detail diesen Scope und matcht die id; ohne Hint ggf. honest-empty für ids außerhalb der Default-Seite). Typical chain: search_tourism(region=<R>, type=event) → get_tourism_details(id=<treffer.id>, query=<R>). 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, und NUR das Detail trägt sie (die Suche nicht). 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. 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.
| Name | Required | Description | Default |
|---|---|---|---|
| id | Yes | The `id` or `global_id` of a curated record from a prior `search_tourism` result (e.g. "e_101102405"). | |
| query | No | Region/name hint to scope the lookup — pass the same region you searched in `search_tourism`. The curated source has no object-by-id endpoint, so the details lookup re-searches that scope and matches the id; without the hint it may honest-empty for ids outside the broad default page. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already cover safety (readOnlyHint=true, openWorldHint=true, destructiveHint=false), but the description adds substantial operational context beyond them: honest-empty behavior when sources:[], the no-object-by-id re-search quirk, the license/attribution obligation (license.holder must be named), and the anti-fabrication rule for name/price/hours. It does not, however, discuss rate limits or failure modes beyond the empty case.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded and sectioned with bold labels, but heavily over-long (~700 words) for a two-parameter read tool. Much of the text is return-value documentation that repeats the same honesty rule several times ('nie erfunden', 'noch nie eine geratene Vorgabe-Lizenz'), diluting the selection-critical guidance.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
No output schema exists, so the description carries the full burden and does so exhaustively: it enumerates the return shape (sources[].subjects[].properties), the additive facts block, tour-only fields (path_on_map, trail_shape, entries), and hub_detail_url/license placement. An agent knows both what it gets back and how to present it.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
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 earns extra by explaining provenance of `id` (id or global_id from a search_tourism hit, e.g. 'e_101102405') and the real role of `query` (the source has no object-by-id endpoint, so the detail re-searches that scope and matches the id). That rationale is more than the schema field descriptions give.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource: 'Kuratiertes Detail zu EINEM Niedersachsen-Hub-Treffer per id', and immediately delimits against siblings: NOT get_poi_details (OSM bridge), NOT search_tourism (the curated search). An agent can distinguish the three tools 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.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicit 'When to use' (after search_tourism returned a hit with an id, with quoted DE/EN example utterances) and 'When NOT to use' (no prior hit / no id guessing → search_tourism; OSM detail → get_poi_details). It also documents the typical call chain and parallel multi-call pattern.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_usage_guideARead-onlyInspect
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.
| Name | Required | Description | Default |
|---|---|---|---|
| tool | No | Der Name genau eines Werkzeugs aus diesem Katalog, dessen Abschnitt zurückkommen soll. Weglassen für die ganze Anleitung. |
TDQS
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.
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.
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.
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.
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.
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_forecastARead-onlyInspect
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.
| Name | Required | Description | Default |
|---|---|---|---|
| lat | Yes | Latitude of the location | |
| lon | Yes | Longitude of the location | |
| lang | No | Language code for descriptions (e.g. "en", "de"). Defaults to "en". | |
| limit | No | Maximum number of forecast entries to return | |
| units | No | Unit system: "metric" (°C, m/s), "imperial" (°F, mph), or "standard" (K). Defaults to "metric". |
TDQS
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.
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.
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.
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.
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.
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.
link_datetimeARead-onlyInspect
Löst eine Zeit-Nennung in einen absoluten ISO-8601-Zeitpunkt auf — „morgen früh", „heute Abend um 18 Uhr", „in zwei Stunden", „um 8:30". Auch „jetzt"/„now"/„aktuell" wird aufgelöst: nutze das als kanonische Quelle für die aktuelle Zeit, statt dir selbst ein Datum auszudenken. Das Ergebnis (candidates[].datetime_range.start) ist der Zeitpunkt, mit dem du weiterarbeitest. Nennt der Nutzer bereits eine vollständige ISO-8601-Zeit mit Offset, ist kein Aufruf nötig. Pflicht: text — die Nennung, so wie der Nutzer sie schrieb. Optional: lang ('de' Default, 'en', 'fr') und tz (IANA-Name; ohne ihn wird die Lokalzeit als Europe/Berlin gelesen und als korrekter UTC-Instant zurückgegeben). Was zurückkommt: EIN Zeitpunkt, kein Fenster — start und end sind derselbe Instant. Eine nicht auflösbare Phrase liefert candidates: []; dann nachfragen, statt selbst zu rechnen. Anleitung: get_usage_guide mit tool='link_datetime' — insbesondere, auf welche Stunde eine vage Tageszeit fällt und was dann zu tun ist. Anti-Fab: Datum und Uhrzeit sind Fakten wie eine Liniennummer und stammen aus diesem Werkzeug — kein selbst-erfundenes Datum, keine eigene Datums-Arithmetik. Returns candidates[].datetime_range:{start,end}.
| Name | Required | Description | Default |
|---|---|---|---|
| tz | No | Optional IANA timezone the stated local time is interpreted in (default `Europe/Berlin`). DST-aware. Pass e.g. `"Europe/Berlin"`; omit for the default. Determines the UTC instant emitted for a wall-clock mention ("8:30" → `06:30Z` in summer). | |
| lang | No | Optional ISO language code (default `de`). Supported: `de`, `en`, `fr`. | |
| text | Yes | Free-text time mention to resolve via the rustling NLU. E.g. "morgen früh", "heute Abend um 18 Uhr", "in zwei Stunden". | |
| format | No | Answer serialisation: `"toon"` (default) or `"json"` — the detail is in `get_usage_guide`. **An agent leaves this out.** |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Beyond the annotations, the description discloses that start and end are the same instant, that unresolvable phrases return an empty candidates array, that timezone handling is DST-aware with a Europe/Berlin default, and that fabricating dates/time is forbidden. These behaviors materially shape agent reasoning and are consistent with readOnlyHint, openWorldHint, and destructiveHint.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is well-structured and front-loaded with the purpose and no-call condition, and it uses clear sections for parameters, return behavior, and anti-fabrication rules. It is somewhat long and repeats the return shape a few times, so it is not maximally concise, but each block earns its place for a tool this complex.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema, the description still explains the exact return shape (candidates[].datetime_range.{start,end}), clarifies the no-window behavior, specifies the empty-candidates failure mode, and delegates edge-case hour mapping to get_usage_guide. Nothing needed to invoke the tool or interpret its result is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The schema already provides rich, 100%-coverage parameter descriptions covering text, lang defaults, tz IANA/DST semantics, and the format serialization. The description mostly restates these—text as written by the user, optional lang, optional tz—adding only marginal emphasis on using the raw user wording. Therefore it stays at the high-coverage baseline of 3.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with a specific operation and resource: resolving a time mention into an absolute ISO-8601 timestamp, with concrete examples and a clear no-call condition for full ISO-8601 inputs with offset. However, it does not explicitly contrast itself with sibling tools such as link_dynamic, so sibling differentiation is implicit rather than explicit.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description gives explicit when-to-use guidance (natural-language time mentions, 'jetzt'/'now' as canonical current time), when-not-to-use guidance (complete ISO-8601 with offset), and what to do on failure (ask the user rather than computing). It also directs the agent to get_usage_guide for nuanced cases like hour mapping for vague dayparts.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
link_dynamicARead-onlyInspect
Match-Mention gegen Caller-supplied Kandidaten-Vokabular. When to use: Caller hat ein eigenes Vokabular (z.B. Custom-Enum, App-State, Domänen-spezifische Begriff-Liste) und will eine User-Mention darauf mappen. When NOT to use: Standard-Place/Stop/Time/MoT/Line-Linking → die spezialisierten link_*-Tools nutzen. Ohne Kandidaten ist der Linker leer. Required args: text, candidates ([{name, synonyms?, coord?}, …]) MUST be non-empty — die candidate-Liste IST das Vokabular. Typical chain: THIS_TOOL → (custom Caller-Logik). Multi-call: ein Call pro Mention/Vokabular-Set. Anti-Fab note: nur Kandidaten aus dem candidates-Arg matchen, KEIN impliziter Vokabular-Erweiterung. Returns candidates[].candidate:<name>, score, span.
| Name | Required | Description | Default |
|---|---|---|---|
| text | Yes | Free-text mention to match against the caller-supplied candidate list. | |
| candidates | Yes | Candidate vocabulary the linker should pick from. REQUIRED — the backend rejects empty candidate lists with 400. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, openWorldHint=true, and destructiveHint=false. The description adds meaningful behavioral detail: the anti-fab note that only candidates from the arg are matched (no implicit vocabulary expansion) and the explicit return format (candidates[].candidate, score, span). It also mentions the empty-candidate rejection, complementing the schema. No contradiction with annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is dense but well-organized with bold labels (When to use, When NOT to use, Required args, Typical chain, Multi-call, Anti-Fab note). Every sentence carries essential information; there is no filler. The core purpose is front-loaded, and the structure makes scanning easy for an agent.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Despite having no output schema, the description supplies the return format. It covers prerequisites (candidates non-empty), the anti-fab constraint, multi-call behavior, and the intended chain. For a tool with two required parameters and a nuanced matching rule, this is a complete operational guide.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100% (both text and candidates have descriptions). The description adds semantic clarity: it explains that the candidate list IS the vocabulary and must be non-empty, and it outlines the candidate structure ({name, synonyms?, coord?}). This goes beyond the schema's basic property descriptions, justifying a score above the baseline 3.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with a precise verb+resource statement: 'Match-Mention gegen Caller-supplied Kandidaten-Vokabular' (match mention against caller-supplied candidate vocabulary). It explicitly contrasts with specialized link_* tools by naming the alternative family, making the tool's unique role unmistakable.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It provides explicit when-to-use (caller has custom vocabulary) and when-not-to-use (standard place/stop/time etc. go to specialized link_* tools). It also adds a typical chain, multi-call guidance, and a critical constraint (candidates must be non-empty), leaving no ambiguity about invocation context.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
nearbyARead-onlyInspect
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', oder 'any' ('stop,bike_rental'); include_mots (legt die bedienenden Linien über die Haltestellen-Treffer); only_available (nur Sharing-Treffer mit gemeldetem freiem Fahrzeug — 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, 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.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | Maximum number of results, at least 1. Default 10. | |
| format | No | Answer serialisation: `"toon"` (default) or `"json"` — the detail is in `get_usage_guide`. **An agent leaves this out.** | |
| latitude | Yes | Latitude in WGS-84 decimal degrees. | |
| radius_m | Yes | Search radius in metres. | |
| longitude | Yes | Longitude in WGS-84 decimal degrees. | |
| node_types | No | Which 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"`, 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 ten 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 are the exception `"any"` does NOT cover — ask for them by name, and with a `radius_m` of a few kilometres, because such sites are sparse. | |
| include_mots | No | `true` overlays the serving transit lines on stop results. Default `false`, which keeps the answer small. | |
| only_available | No | Set 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. A station 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
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already mark this as read-only and open-world, and the description adds important behavior beyond them: output is TOON text, not JSON; missing fields mean the source did not tag them; opening hours and prices are not present; unknown availability is not treated as free for `only_available`. This gives the agent a realistic model of what the tool can and cannot return.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The text is long but well-structured: bold labels break it into purpose, required/optional parameters, format, further guidance, and anti-fabrication rules. The core purpose is front-loaded, and while some details are dense, each sentence carries practical information. It is comprehensive rather than wasteful.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema, the description compensates by naming the return format (`TOON`), the kinds of fields a hit carries (`category`, `modality`, `parking`, `contactInfo`), and the data limitations. It covers defaults, edge cases, exclusions, and how to get more detail. For a complex eight-parameter tool, nothing essential is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Although the schema already documents every parameter, the description adds valuable semantics: `node_types` is one comma-separated string rather than an array, `'any'` does not cover park-and-ride kinds, `'poi'` alone activates a special filter, and shared-mobility offers split the limit. These operational details go well beyond the schema text and materially affect how the agent should construct calls.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with a precise verb and resource: finding stops, POIs, and addresses within a radius around a coordinate, with a clear geographic focus. It also distinguishes itself from name-based search by explicitly routing those cases to `search_place`, so an agent can tell it apart from siblings without opening the schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It clearly states when to use this tool (a coordinate is present) and that name-only queries should first go through `search_place`. It also points to `get_usage_guide` for finer details and flags the `'any'` exception for park-and-ride kinds. It does not explicitly mention other siblings like `reverse_geocode`, but the coordinate-vs-name distinction is sufficient guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
resolve_locationRead-onlyInspect
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. Anleitung: get_usage_guide — Abgrenzung, Argumente, Rangfolge. Anti-Fab: nur die Treffer aus dem Output dieses Aufrufs verwenden.
| Name | Required | Description | Default |
|---|---|---|---|
| lat | No | Optional latitude (WGS-84) to bias ranking toward nearby stops. | |
| lon | No | Optional longitude (WGS-84) to bias ranking toward nearby stops. | |
| limit | No | Maximum number of results. Defaults to 5 if omitted. | |
| query | Yes | Free-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"). | |
| format | No | Answer serialisation: `"toon"` (default) or `"json"` — the detail is in `get_usage_guide`. **An agent leaves this out.** | |
| node_types | No | Which 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_station | No | When `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. |
reverse_geocodeARead-onlyInspect
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.
| Name | Required | Description | Default |
|---|---|---|---|
| lat | Yes | Latitude of the coordinate to reverse-geocode. Also accepted spelled `latitude`, the way the vicinity search takes it — one of the two spellings per call. | |
| lon | Yes | Longitude of the coordinate to reverse-geocode. Also accepted spelled `longitude`, the way the vicinity search takes it — one of the two spellings per call. | |
| level | No | Optional 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"`. | |
| limit | No | Optional 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`. | |
| format | No | Answer serialisation: `"toon"` (default) or `"json"` — the detail is in `get_usage_guide`. **An agent leaves this out.** | |
| radius_m | No | Optional 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
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.
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.
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.
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.
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.
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_placeARead-onlyInspect
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 — wird für Symmetrie mit den übrigen Geo-Werkzeugen angenommen, derzeit aber nicht ans Backend durchgereicht und ändert das Ergebnis nicht. Anleitung: get_usage_guide mit tool='search_place' — die Abgrenzung im Detail, die typischen Ketten und der Umgang mit einem mehrdeutigen Namen. Anti-Fab: nur die zurückgegebenen Namen und Ids nutzen, keine Bauch-Geographie.
| Name | Required | Description | Default |
|---|---|---|---|
| lang | No | Optional 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. | |
| name | Yes | Name of the place to search for. Free-text fuzzy match against the place index behind this endpoint (e.g. "Hannover", "Maschsee", "Wangerland"). | |
| format | No | Answer serialisation: `"toon"` (default) or `"json"` — the detail is in `get_usage_guide`. **An agent leaves this out.** |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already mark it as read-only, open-world, and non-destructive. The description adds substantial behavior beyond that: it returns OSM IDs rather than stop IDs, mis-resolves station names to districts or cities, ignores the lang parameter, and warns against geographic hallucination. 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.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is dense and long, but well structured with bold markers, concrete examples, and a clear lead sentence. It earns its length by resolving high-stakes sibling ambiguity, though a few examples could be trimmed without losing meaning.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Even without an output schema, the description tells the agent what comes back (coordinates and OSM IDs), what failure modes look like, how to route non-matching cases, and where to find deeper guidance via get_usage_guide. Nothing needed to call it correctly is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
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 restates that name is required and that lang is optional and ignored, but the schema already documents these properties in similar detail. The format parameter is not mentioned in the description, but it is adequately covered by the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states the exact operation in the first sentence: resolving a city, region, or district name into coordinates and OSM IDs, and frames it as the first step for locating an area. It then explicitly excludes stops, addresses, and POIs, so an agent can distinguish it from sibling geolocation tools without inspecting their schemas.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It gives explicit when-to-use guidance with concrete query examples, and clearly says when not to use it: stop names containing Bahnhof/Hbf/Bf belong to the Ortsauflösung, and addresses/POIs/trip endpoints are also excluded. It names concrete alternatives: reverse_geocode for coordinate-to-name and nearby for listing surroundings.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
search_tourismARead-onlyInspect
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. Bei mehreren die best-passende per get_tourism_details zeichnen, die anderen namentlich 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 (Default 8, clamped 1..=20), family_only (bool, Default false — nur die kuratierten Family-Kategorien, je mit der belegten suitability-Achse) und, nur zusammen damit, indoor_only (bool — davon nur die Schlechtwetter-tauglichen). activity (nur mit type=tour): wie eine Tour zurückgelegt wird — "wandern" | "fahrrad" | "kanu" + Synonyme ("wanderweg"/"e-bike"/ "paddeln"). Filtert serverseitig auf die GANZE Familie kuratierter Aktivitätswerte, also auch "Winterwandern"/"Nordic Walking"/ "Mountainbike" — 8 % der zu Fuß zurückgelegten Touren tragen keinen "Wandern"-Wert; weglassen oder unbekannt = alle. Coord-Vicinity-Modus (Umkreis, POI-Anker): für „ am/bei " den POI ZUERST via search_place zu einer Coord auflösen, dann lat+lon setzen (beide nötig; + optional radius_m, Default 2000 m, clamped 100..=20000). region/query sind dann nur Pool-Hint, nicht mehr Pflicht; die Treffer sind auf den Umkreis gefiltert, nächster zuerst, je mit distance_m in Metern. 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, query=<R>) pro Treffer — der Regions-Hinweis ist nötig, sonst antwortet das Detail leer. 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); Dubletten werden de-dupliziert, in der NDS-Region gewinnt der Niedersachsen-Hub-Eintrag (regionale Tiefe). 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?, 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?}], events:[{name,date,location,source?,license?}]}. Das Top-Level source bleibt shape-stabil; welche Quelle einen Treffer geliefert hat, sagt sein eigenes 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.
| Name | Required | Description | Default |
|---|---|---|---|
| lat | No | Coord-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). | |
| lon | No | Coord-vicinity center longitude (paired with `lat`). | |
| type | No | Content 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). | |
| limit | No | Maximum number of curated entities to return (default 8, clamped 1..=20). | |
| query | No | Free-text query (name / keyword) when not searching a whole region, e.g. "Sielhafenmuseum". Alias for `region`; one of the two is required. | |
| region | No | Region 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. | |
| activity | No | How 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_m | No | Coord-vicinity radius in metres (default 2000, clamped 100..=20000). | |
| timeframe | No | Optional 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_only | No | Family 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_only | No | Restrict to rain-safe family records (the `suitability.indoor_bad_weather` / Schlechtwetterangebot proxy). Only meaningful with `family_only=true`. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With readOnlyHint/destructiveHint/openWorldHint already covering the safety profile, the description still adds a great deal of behavioural context: de-duplication and source-precedence rules (NDS hub beats DZT; DZT excluded entirely for tours), OSM augmentation only in vicinity mode with explicit exclusions, the requirement that query/region be a candidate-pool hint in vicinity mode, the per-hit license naming obligation, hub_detail_url semantics, and an explicit anti-fabrication rule for names, dates and prices.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
It is front-loaded correctly, with purpose first and the when-to-use/when-not-to-use routing blocks early, and the bolded section markers aid scanning. However it is an extremely long block that re-states several schema facts and packs return-shape and license boilerplate into the same field as selection guidance, so not every sentence is earning its place in a description whose primary job is tool selection.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
There is no output schema, and the description compensates by spelling out the full return shape (place, source, type, returned, mode, center, radius_m, pois[], events[]) and the meaning of empty results (returned: 0 means nothing was retrievable for that region). For an 11-parameter, multi-mode, multi-source search tool this is complete enough to call correctly without further context.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
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 genuine cross-parameter semantics the schema does not: tours are practically never returned without type=tour, accommodations are excluded from the activity scope even in region mode, activity selects an entire value family while unknown values silently mean "all", and id is the key for get_tourism_details. It does repeat some schema content (default 8, clamped 1..=20), which caps it below 5.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The opening line names a specific verb and resource ("Kuratierte Tourismus-Suche des Niedersachsen-Hubs") and immediately states the scope: editorially curated entries with events, prices, media, opening hours and tours. It differentiates itself from siblings by name (expand_kg_pois, nearby, search_place, get_tourism_details, MobilityMCP, get_current_weather/get_tide), 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.
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" blocks with concrete user-utterance examples in German and English, each mapped to the correct sibling or server. It also supplies the canonical chain (search_tourism → get_tourism_details) and tells the agent it must pass the region hint, plus the multi-call-per-region rule.
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.
14 tool updates
- First observed
expand_kg_pois - First observed
get_current_weather - First observed
get_poi_details - First observed
get_tide - First observed
get_tourism_details - First observed
get_usage_guide - First observed
get_weather_forecast - First observed
link_datetime - First observed
link_dynamic - First observed
nearby - First observed
resolve_location - First observed
reverse_geocode - First observed
search_place - First observed
search_tourism
Publisher details
- Operator
- PROJEKTIONISTEN GmbH · Publisher source
- Operator website
- https://www.projektionisten.de/ · Publisher source
- Vendor relationship
- Not applicable
- Documentation
- https://ai.projektionisten.eu/mcp-landingpage/ · Publisher source
- Trust center
- Not applicable
- Restrictions
- https://ai.projektionisten.eu/mcp-landingpage/ · Publisher source
Related MCP Connectors
Journeys, departures, line courses, disruptions in Germany; nearby sharing as currently reported.
Airports, runways and frequencies worldwide, tides, UK road collisions and London transport.
311Marine and outdoor weather: multi-model forecasts, official bulletins, tides, anchorages.
Live status of the physical world: ski lifts, theme park rides, national parks, campgrounds, surf.
Related MCP Servers
- AlicenseNot gradedqualityCmaintenanceEnables 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.1MIT
- FlicenseNot gradedqualityDmaintenanceProvides emergency hotline numbers, restrooms and outdoor safety bells, after-hours clinics, pharmacies, ER beds, and foreign visitor phrase cards. Information only—does not place calls or diagnose.1-
- FlicenseNot gradedqualityDmaintenanceProvides AI assistants read-only access to discover and compare 184,900+ beaches, lakes, and swimming spots worldwide with current planning signals.-
- AlicenseNot gradedqualityDmaintenanceProvides real-time water temperature and tide predictions for any lake, river, ocean, bay, or beach using NOAA, USGS, and other sources.MIT
Glama MCP Gateway
Add one secure layer between your agents and this server.