TourismMCP
Server Details
Sights, events, opening hours, weather and tides; nearby sharing as currently reported.
- Status
- Healthy
- Last Tested
- Transport
- Streamable HTTP · MCP 2025-11-25
- URL
TDQS
Scored across 14 tools
Each tool has a clearly distinct purpose, reinforced by explicit 'Tool-Semantik-Abgrenzung' sections that separate overlapping functions (e.g., expand_kg_pois vs search_tourism vs nearby). Weather, forecast, tide, and the two detail-lookup tools (OSM vs curated) are cleanly differentiated. No two tools appear to do the same thing.
Tool names mostly follow a consistent verb_noun snake_case pattern (get_*, search_*, link_*, resolve_*), making the set predictable. The only deviation is 'nearby', which is a single word rather than verb_noun, but it remains clear and doesn't clash with the rest. Overall naming is strong with minor inconsistency.
14 tools is within a reasonable range for a tourism domain server, covering location, POI, weather, tide, and curated tourism content. The inclusion of meta-tools like get_usage_guide and generic link_dynamic adds slight bloat but doesn't feel excessive. The count is appropriate for the stated scope.
There are notable gaps: descriptions repeatedly reference tools like stops, connections, departures, and lookup_place_osm that are not included in the set, which would cause agent chaining failures. Additionally, there is no routing or transit information tool despite references to such workflows. The surface is therefore incomplete relative to its own documentation.
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, nicht das Allgemeinwissen — 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 stops (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. Wenn returned: 0 / pois: [] → honest fallback („Ich konnte für aktuell keine Attraktionen abrufen"), NIEMALS POIs aus Trainings-Wissen ergänzen. 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?
Annotations already declare readOnlyHint=true and destructiveHint=false, but the description adds substantial behavioral context: accommodations are backend-excluded, fields are tag-derived and never guessed, attribution must be shown once, and there is an explicit anti-fabrication rule (never supplement POIs from training knowledge). 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 very long, but it is well-structured with headers, bold labels, and bullet-like sections that front-load the purpose and differentiate siblings. Every sentence adds value, though it could be trimmed slightly without losing critical information. It is more thorough than concise, hence a 4.
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?
Complete for a complex tool: covers typical chain (search_place → this tool → optional get_poi_details), multi-call guidance, anti-fabrication, OSM coverage, and return structure (pois fields, attribution, honesty fallback). An agent has everything needed to invoke it correctly, even without an output schema.
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%, but the description adds meaning beyond schema: osm_id is sourced from search_place with an example (1187768), limit defaults and clamping are clarified, types are substring and case-insensitive, include_address default, and the family_only/indoor_only coupling is explained. It also warns that a hotel types filter returns nothing because accommodations are excluded.
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 place OSM ID to the tourism POIs inside it. The first sentence clearly defines the operation and scope, and it explicitly differentiates from nearby, search_place, and stops, so an agent can distinguish it from siblings without inspecting schemas.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
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 concrete query examples in both German and English, and names alternative tools (nearby, get_poi_details, search_place, get_current_weather/get_tide) for each exclusion case. Also gives a typical chaining sequence and a multi-call note.
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, nicht das Allgemeinwissen — 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/stops 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 cover readOnlyHint and openWorldHint, so the bar is lower; the description adds substantial operational constraints: lat/lon must come from search_place and never be guessed, weather values must only come from this tool's output (anti-fabrication), and legal attribution to Deutscher Wetterdienst/GeoNutzV is required. This goes well beyond the structured 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 well-structured with bold labels and front-loaded purpose. It is longer than average, and the opening overlaps somewhat with the 'When to use' section, but nearly every sentence earns its place with operational or routing 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?
For a tool without an output schema, it covers what data will be returned (temperature, conditions, wind, humidity), the attribution object, and the one-call-per-place behavior. An agent has enough context to invoke the tool correctly and interpret its results, though exact response field names are not specified.
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 adds the crucial rule that lat/lon must originate from search_place rather than estimation, and clarifies unit options with temperature symbols. It mostly restates schema defaults for lang and units, but the sourcing constraint is meaningful extra semantics.
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 states the tool returns current weather for coordinates and explicitly positions it as the answer source for 'wie ist das Wetter in X', distinguishing it from general knowledge. It also contrasts itself with get_weather_forecast and get_tide, so the agent can clearly differentiate it among siblings.
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 has explicit 'When to use' and 'When NOT to use' sections naming alternatives: get_weather_forecast for forecasts beyond one hour and get_tide for tides. It also provides a typical chain (search_place → this tool) and multi-call guidance, leaving no ambiguity about when to select it.
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, nicht das Allgemeinwissen — erst verorten, dann abfragen: die osm_id stammt aus nearby/stops/search_place. When to use: nach nearby / stops / 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 lookup_place_osm oder search_place); ohne vorherigen Tool-Call mit OSM-ID-Output (KEIN raten); wenn die Anfrage Routing/Abfahrten will (dann connections/departures). 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 + stops(node_types='poi') → THIS_TOOL ×3-5 (Trigger: „was kann ich in unternehmen" ohne Wetter-Bezug — dichtere OSM-Coverage über stops-Pfad). Multi-call: JA. Nach stops/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. Wenn sources: [] → honest fallback („Zu diesem Ort konnte ich aktuell keine Detail-Informationen abrufen"), NIEMALS aus Trainings-Wissen ergänzen. 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?
Annotations already mark this as read-only (readOnlyHint=true, destructiveHint=false), and the description adds substantial behavioral context: data is from OpenStreetMap, raw tags versus normalized facts, honest fallback when sources is empty, anti-fabrication instructions, attribution/licensing requirements, and coverage caveats. No contradiction exists between description and 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 long but exceptionally well structured with bolded section headers, examples, and a clear front-loaded purpose statement. Some content, such as repeated examples and detailed attribution text, could be trimmed, but it remains focused and each section supports correct tool usage.
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 documents the response shape, including sources, subjects, properties, coord, facts, price, and attribution, plus fallback behavior when sources is empty. It also covers the multi-call pattern, typical chains, and regional coverage, leaving no critical gap for an agent to call the tool correctly.
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 already explains that osm_id is a bare numeric string matching ^\d+$. The description goes beyond the schema by stating the parameter's provenance (from nearby/stops/search_place), reinforcing the no-prefix rule, and explicitly warning not to guess the ID. This adds meaningful semantic guidance for the only parameter.
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 first line states a specific verb plus resource: 'POI-Detail-Lookup per OSM-ID' and clarifies the tool answers 'Öffnungszeiten von X' or 'erzähl mir was über X' rather than general knowledge. It differentiates from siblings by explicitly naming alternatives like lookup_place_osm, search_place, connections, and departures.
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 contains explicit 'When to use' and 'When NOT to use' sections, names concrete alternatives for excluded cases, and even provides typical chains with triggers. The guidance that osm_id must come from prior tool calls and never be guessed is especially valuable for correct invocation.
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, nicht das Allgemeinwissen — 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 oder Stops → connections/stops; 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. KEINE „typischen" Tide-Schätzungen aus Bauch-Wissen.
| 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 mark the tool read-only, and the description adds an explicit anti-fabrication rule: tide times must come only from tool output and must not be estimated from general knowledge. It also discloses the multi-call pattern (one call per place/date range), which is useful behavioral context beyond the schema and 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 long but densely structured with bolded sections for when-to-use, when-not-to-use, required args, typical chain, multi-call, and anti-fabrication. Every section earns its place and the most important scoping information is front-loaded.
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 tool with no output schema, the description compensates well: it explains the invocation contract, the coordinate vs city modes, exclusions, chaining, and even tells the agent to rely only on returned values. Nothing needed to select and call the tool 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?
The schema already covers 100% of parameters, so the baseline is 3; the description adds value by grouping the either/or requirement (city vs lat+lon), noting which parameters only apply in coordinate mode, and giving station_limit/date range semantics. This goes beyond the schema but the schema was already thorough.
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 clearly states that this tool answers tide (high/low water) questions for coastal places and explicitly positions it against general world knowledge and sibling tools like get_current_weather. It gives concrete example queries in both German and English, making the resource and scope unambiguous.
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 provides a dedicated 'When to use' section with positive examples, a 'When NOT to use' section naming get_current_weather and connections/stops, and even warns against inland locations. It also prescribes the typical chain with search_place, leaving no ambiguity about when this tool should be selected.
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, nicht das Allgemeinwissen. 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. Wenn sources: [] → honest fallback („Zu diesem Treffer konnte ich keine Detail-Informationen abrufen"), NIEMALS aus Trainings-Wissen. 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. 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?
Beyond the readOnly/openWorld/destructive annotations, it discloses honest-fallback behavior for empty sources, states that data never comes from training knowledge, explains that absent fields/facts/license are deliberately omitted, and documents the re-search scoping behavior. This is substantial additional behavioral context that annotations alone would not provide.
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 very long but well-structured with bold headings, front-loaded purpose, and uses sections. It earns most of its length through necessary edge-case and provenance rules, though some repeated 'additiv/abwesend' phrasing could be trimmed.
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 documents the return shape (id, sources[].subjects[].properties, facts, hub_detail_url, license), tour-specific fields, and fallback semantics. Coverage is strong enough for an agent to invoke the tool correctly and interpret results without external knowledge.
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?
Though schema coverage is 100%, the description adds critical semantics: id can be id or global_id from search_tourism and must not be guessed; query is a region/name hint because the source has no object-by-id endpoint and its absence can cause honest-empty. It also gives a concrete id example.
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 verb and resource: 'Kuratiertes Detail zu EINEM Niedersachsen-Hub-Treffer per id' listing the fields (description, opening hours, price, address, media). It explicitly differentiates from get_poi_details and search_tourism, making the purpose unmistakable even among siblings.
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 dedicated 'When to use' and 'When NOT to use' sections, names alternatives (get_poi_details, search_tourism), and gives a typical chain plus multi-call guidance. The conditions for when not to use (no prior search_tourism hit, no guessing ids) are explicit and actionable.
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, nicht das Allgemeinwissen — 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 stops(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 — KEINE Tag-für-Tag-Schätzungen aus Trainings-Wissen. 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 readOnlyHint, openWorldHint, and destructiveHint, and the description adds valuable context beyond them: forecast values must come only from the tool output (anti-fabrication), coordinates must originate from search_place, one call per place, multi-day queries via limit, and the mandatory GeoNutzV attribution naming Deutscher Wetterdienst. This significantly enriches the behavioral contract without contradicting any annotation.
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 long but densely structured with bolded labels ('When to use', 'When NOT to use', 'Required args', 'Typical chain', 'Multi-call', 'Anti-Fab note', 'attribution'). Purpose is front-loaded, and every section earns its place by conveying a distinct operational rule. 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?
Despite having no output schema, the description covers all needed call context: parameter semantics, chaining, multi-call behavior, data integrity rules, and attribution obligations. The absence of a return-structure description is mitigated by the instruction that forecast values come exclusively from tool output, and the agent can inspect the actual response at runtime.
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 meaning beyond the schema: it marks lat/lon as required and sourced from search_place (never self-estimated), explains limit as forecast slots that span multi-day queries, and lists units and lang with their defaults and examples. This is substantive semantic guidance, not mere repetition.
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 verb+resource: 'Wetter-Vorhersage zu Koordinaten' (weather forecast to coordinates) and explicitly states this tool is the answer for 'wie wird das Wetter morgen in X'. It also differentiates from siblings by naming get_current_weather and get_tide as the tools for current conditions and tides, so an agent can disambiguate immediately.
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 provides explicit 'When to use' and 'When NOT to use' sections with concrete examples in both German and English, and names the exact sibling tools to use instead. It also gives a typical chain (search_place → THIS_TOOL → optional POI tools) and a multi-call rule, leaving no ambiguity about when to select this tool.
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) geht direkt als connections.time bzw. departures.time weiter. 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?
Even though annotations already declare readOnlyHint=true and openWorldHint=true, the description adds real behavioral detail: the result is a single instant (start == end), unresolvable phrases return candidates: [], and the agent must not fabricate dates or do its own date arithmetic. Nothing 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 fairly long and restates some schema details, but it is well structured: purpose and examples first, then parameters, then response semantics, then anti-fabrication guidance. Every part earns its place, though a bit of trimming would make it tighter.
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 tool with no output schema and subtle semantics (timezone interpretation, vague phrases, single-instant result), the description is complete: it states the return shape, where the value flows (connections.time / departures.time), the empty-candidates behavior, and the required follow-up action. It also points to get_usage_guide for finer details.
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 four parameters. The description adds meaningful operational semantics beyond that: text is marked as Pflicht, tz default is explicitly tied to Europe/Berlin local-time interpretation, and format is labeled as something the agent should leave out. This is more than the baseline needed for full schema coverage.
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 uses a specific verb+resource construction: "Löst eine Zeit-Nennung in einen absoluten ISO-8601-Zeitpunkt auf" and then gives concrete examples like "morgen früh" and "in zwei Stunden". It also states a clear boundary against a sibling scenario (full ISO-8601 with offset needs no call), so an agent can tell exactly what this tool does.
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 invoke (any time mention), when not to invoke (user already gave a complete ISO-8601 timestamp with offset), and points to get_usage_guide for the ambiguous-time case. It even instructs the agent to use this tool as the canonical source for "now" instead of inventing a date, which is strong usage guidance.
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_locationARead-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. 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. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Beyond the readOnly/openWorld/destructive annotations, the description discloses normalization rules (omit für/von/nach, keep leading am/an/in), argument-error behavior for invalid node_types, the fact that only a `stop` yields a usable routing ID, and an explicit anti-fabrication rule ('nie eine erfinden'). No statement 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 text is dense but organized with bold semantic chunks (Pflicht, Optional, Art-Wort, A→B, Anti-Fab) and front-loads the core purpose before details. Every sentence carries a distinct rule or pointer, so the length is justified by the tool's complexity.
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 7-parameter resolver with no output schema, the description covers the call intent, all relevant parameter semantics, the two-call A→B pattern, result shape (type and location, stop-only ID), and anti-hallucination guidance. It even routes to `get_usage_guide` for remaining depth.
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 already 100%, and the description still adds substantial meaning: `lat`/`lon` are ranking bias, `node_types` combinability and error behavior, `city_station` city→main-station behavior, and the rule to move the user's type word out of `query` into `node_types`. This goes well beyond the schema descriptions.
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 names a precise verb and resource: it resolves free text ('Löst Freitext') into an ID for stops, addresses, or POIs, and situates itself in concrete flows (routing, departure board, POI profile). It also differentiates itself from the sibling `search_place` by explicitly assigning areas (Stadt/Region) to that tool.
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 states when to call it ('Wo Routing, Abfahrtstafel oder POI-Steckbrief eine Id brauchen, steht es davor') and gives an explicit alternative: areas go to `search_place`. It also includes actionable call patterns (A→B call twice), prerequisites for `city_station`, and points to `get_usage_guide` for further delimitation.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
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 — die redaktionelle TIEFE die OSM fehlt: EVENTS MIT DATUM, PREISE, Beschreibungen, Medien, Öffnungszeiten, Touren. Für „welche Veranstaltungen sind in X", „was kostet der Eintritt" ist dieses Werkzeug die Auskunft, nicht das Allgemeinwissen — erst verorten, dann abfragen: region/query aus der Frage, lat/lon nur aus search_place. Tool-Semantik-Abgrenzung: dieses Tool = die kuratierte Quelle. NICHT expand_kg_pois (das ist OSM-BREITE — alle Tags, all-NDS, aber ohne Events/ Preise/Redaktion). Für Region-Tourismus dürfen BEIDE laufen (OSM-Breite ∥ NDS-Kuration). NICHT nearby (Radius-um-Punkt), NICHT search_place (Place-Disambiguierung). 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") — 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: reine OSM-Breite/„alle Sehenswürdigkeiten per Tags" → expand_kg_pois; Detail zu EINEM Treffer → get_tourism_details; Routing/ Abfahrten, auch „von A nach B mit dem Rad" → connections/departures; 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. Wenn returned: 0 / pois: [] / events: [] → ehrlich sagen, dass für nichts abrufbar war, NIEMALS Events/Preise/POIs aus Trainings-Wissen ergänzen. 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?,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?
Annotations already mark the tool read-only, open-world, and non-destructive, and the description is consistent with that. It adds substantial behavioral context: vicinity-mode semantics, OSM breadth only in vicinity mode, de-duplication rules, DZT source fallback, per-result licensing and attribution requirements, and an explicit anti-fabrication policy for empty results. 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 very long, but its length is largely justified by 11 parameters, sibling disambiguation, source-licensing rules, and no output schema. Bold section labels such as 'When to use', 'When NOT to use', 'Typical chain', and 'Anti-Fab note' make it navigable. A few points are repeated or could be tightened, but the density is purposeful rather than padding.
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 full burden of explaining return values, and it does: it sketches the full return shape (place, source, type, returned, pois[], events[]), defines per-result fields, explains license and hub_detail_url semantics, and tells the agent how to behave when results are empty. It also covers multi-call patterns and the typical search_tourism → get_tourism_details chain. Nothing essential for correct invocation 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%, but the description adds meaning well beyond the schema: the one-of region/query requirement, type aliases like accommodation=hotel and gastro=restaurant, the behavior of unknown type/activity values, the family_only/indoor_only coupling, and the constraint that activity applies only to type=tour. It also clarifies timeframes, defaults, clamps, and the role of lat/lon in vicinity mode. This is far more than the schema alone provides.
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 and resource: a curated tourism search over the Niedersachsen-Hub, contrasting its editorial depth (events with dates, prices, descriptions, opening hours, tours) with OSM breadth. It explicitly names sibling tools it is not, such as expand_kg_pois, nearby, and search_place, so an agent can disambiguate without opening schemas.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description gives explicit when-to-use guidance with concrete German and English example queries for events, accommodations, gastronomy, and tours. It also gives equally explicit when-not-to-use routing to expand_kg_pois, get_tourism_details, connections/departures, and weather/tide tools, plus a typical call chain. This is exemplary usage guidance.
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.
Real-time surf, weather, trail status, volcano, ocean safety, and restaurants for Hawaii.
Plan your perfect day out anywhere: itineraries and neighbourhood guides, tuned to mood and weather.
7 day surf forecasts (wave, wind, period) for any coordinate or named surf spot.
Related MCP Servers
- FlicenseNot gradedqualityBmaintenanceProvides 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 gradedqualityCmaintenanceProvides AI assistants read-only access to discover and compare 184,900+ beaches, lakes, and swimming spots worldwide with current planning signals.-
- AlicenseNot gradedqualityBmaintenanceProvides real-time water temperature and tide predictions for any lake, river, ocean, bay, or beach using NOAA, USGS, and other sources.MIT
- AlicenseAqualityDmaintenanceReal-time weather, forecasts, astronomy, marine data for 200+ countries2119 npm1MIT
Glama MCP Gateway
Add one secure layer between your agents and this server.