Skip to main content
Glama

ikeytz Einsatzgebiet-Karten

Server Details

Read/Link MCP for maps.ikeytz.com. Public read-only. ai-train=no.

Ownership verified
Status
Healthy
Uptime
100.0% over 42 days
Last Tested
Transport
Streamable HTTP · MCP 2025-11-25
URL

TDQS

B3.4/5.0

Scored across 68 tools

Disambiguation2/5

Many tools target the same function: find_by_gebiet/find_by_area are explicitly the same match logic, find_by_geo/find_by_google_maps/find_by_icbm share ranking, and get_discovery/get_llms_txt/get_ai_txt/get_sitemap_txt are aliases. Detailed descriptions and NEXT hints reduce confusion, but the set still forces agents to choose between near-duplicates.

Naming Consistency4/5

Nearly all tools use snake_case verb_noun or verb_by_noun patterns (get_, list_, find_by_, compose_, resolve_), which is highly predictable. Minor deviations like site_overview and distance_to_office keep it from perfect 5.

Tool Count1/5

68 tools for a read-only map/area server is far beyond a well-scoped surface, with many aliases and URL hand-offs padded into the list. This is an extreme over-provisioning rather than each tool earning its place.

Completeness4/5

The server covers area lookup, geo/polygon data, contacts, legal/discovery files, CTA composition, and hand-offs to the sister www MCP. Gaps exist in that several tools only return URLs (FAQs, prices, articles) rather than data, but for a maps-only read surface coverage is broad.

Available Tools

68 tools
compose_mailtoCompose MailtoA
Read-only
Inspect

WHAT: Returns mailto:info@ikeytz.com and mapsEmail info@maps.ikeytz.com (mapsHref). Call with {}. USE for email CTAs. Prefer compose_whatsapp or compose_tel_mobile when the user wants chat or a phone call instead. DOES NOT send mail.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

Output Schema

ParametersJSON Schema
NameRequiredDescription
okYestrue = use summary, canonicalUrl, and extra keys. false = do not invent data; read error + hint and retry with valid args or open hint.
hintNoPresent when ok=false. Absolute URL or short recovery hint the agent should open or pass to another tool.
hrefNomailto:info@ikeytz.com
toolYesEcho of the tool name that produced this object (e.g. get_service_area).
errorNoPresent when ok=false. Codes include: unknown_place, unknown_discovery, unknown_doc, q_required, plz_required, coords_required, outside_service_area, url_required, not_maps_host, bad_url, path_or_url_required, serp_not_found, slug_or_coords_required, path_required.
localeNoLocale actually used for URLs. maps is German-only: always de (MAPS-E8 — no /en on maps). Requested non-de is ignored; payload locale=de.
relatedNoAlways includes https://maps.ikeytz.com/llms.txt.
summaryNoPrimary text for the model. For discovery tools this is the file window. For list tools a compact one-liner. Quote with attribution.
mapsHrefNomailto:info@maps.ikeytz.com
mapsEmailNoinfo@maps.ikeytz.com
attributionYesRequired citation: 'Quelle: Schlüsseldienst Ludwigsburg ikeytz (ikeytz.com) · ai-train=no · https://maps.ikeytz.com/.well-known/ai.txt'
canonicalUrlNoBest URL to show the user: https://maps.ikeytz.com… page, public embed JSON, tel:+49…, mailto:…, https://wa.me/…, or a www pointer. Prefer this over constructing URLs.

TDQS

A4.7/5.0
Behavior4/5

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

Annotations declare readOnlyHint=true, so safety is already covered. The description adds genuinely useful behavioral context beyond that: "DOES NOT send mail" clarifies that this only produces a link rather than performing an action, and "Call with {}" confirms the no-argument invocation. It stops short of any rate-limit or format nuance, but for a pure constructor tool that is minor.

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

Conciseness5/5

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

A single tight block with WHAT / USE / DOES NOT front-loaded, so the agent gets purpose, routing, and the key caveat in one pass. Every clause earns its place with no filler.

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

Completeness5/5

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

An output schema exists, so return-value structure needn't be re-explained; the description still names the salient returned fields. For a zero-param constructor tool with annotations, 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.

Parameters4/5

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

Zero parameters, so the baseline is 4. The description's "Call with {}" is consistent with the empty schema and adds the one piece of invocation guidance an agent needs, though it only restates what the schema already enforces.

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

Purpose5/5

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

States a specific verb and resource: it returns a mailto: link plus a mapsEmail/mapsHref value. It also names sibling tools (compose_whatsapp, compose_tel_mobile) so an agent can distinguish it from other contact-channel composers without opening schemas.

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

Usage Guidelines5/5

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

"USE for email CTAs" gives the triggering condition, and "Prefer compose_whatsapp or compose_tel_mobile when the user wants chat or a phone call instead" explicitly names the alternatives and the intent that selects them. Nothing about when-to-use is left to inference.

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

compose_tel_landlineCompose Tel LandlineA
Read-only
Inspect

WHAT: tel: href for the public landline. Call with {}. RETURNS href + display. USE as secondary call CTA. NEXT: compose_tel_mobile.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

Output Schema

ParametersJSON Schema
NameRequiredDescription
okYestrue = use summary, canonicalUrl, and extra keys. false = do not invent data; read error + hint and retry with valid args or open hint.
hintNoPresent when ok=false. Absolute URL or short recovery hint the agent should open or pass to another tool.
hrefNotel:+49…
toolYesEcho of the tool name that produced this object (e.g. get_service_area).
errorNoPresent when ok=false. Codes include: unknown_place, unknown_discovery, unknown_doc, q_required, plz_required, coords_required, outside_service_area, url_required, not_maps_host, bad_url, path_or_url_required, serp_not_found, slug_or_coords_required, path_required.
localeNoLocale actually used for URLs. maps is German-only: always de (MAPS-E8 — no /en on maps). Requested non-de is ignored; payload locale=de.
displayNoHuman display number
relatedNoAlways includes https://maps.ikeytz.com/llms.txt.
summaryNoPrimary text for the model. For discovery tools this is the file window. For list tools a compact one-liner. Quote with attribution.
attributionYesRequired citation: 'Quelle: Schlüsseldienst Ludwigsburg ikeytz (ikeytz.com) · ai-train=no · https://maps.ikeytz.com/.well-known/ai.txt'
canonicalUrlNoBest URL to show the user: https://maps.ikeytz.com… page, public embed JSON, tel:+49…, mailto:…, https://wa.me/…, or a www pointer. Prefer this over constructing URLs.

TDQS

A4.2/5.0
Behavior3/5

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

readOnlyHint=true already signals a safe read operation. The description adds value by confirming it is argument-free ('Call with {}') and naming the return shape, but discloses no further behavior beyond the annotation's coverage, so a mid score is appropriate.

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

Conciseness5/5

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

Four labeled fragments (WHAT/RETURNS/USE/NEXT) with zero waste, front-loading the core purpose before return info and routing. Every clause earns its place.

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

Completeness4/5

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

For a zero-argument tool with an output schema documenting the return values, the description covers purpose, no-arg invocation, and sibling routing. Little is missing, though it could note when the landline is preferred over mobile.

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

Parameters4/5

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

The tool takes zero parameters, so the baseline is 4. The description reinforces this with 'Call with {}', aligning with the schema's no-argument contract without needing further elaboration.

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

Purpose5/5

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

States a specific verb and resource ('tel: href for the public landline') and differentiates from the mobile sibling ('secondary call CTA', 'NEXT: compose_tel_mobile'). An agent can tell it apart from compose_tel_mobile without opening either schema.

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

Usage Guidelines4/5

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

'USE as secondary call CTA' gives clear usage context and 'NEXT: compose_tel_mobile' routes to the alternative call tool. It does not explicitly state when the mobile option should be preferred, so the guidance is clear but not exhaustive.

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

compose_tel_mobileCompose Tel MobileA
Read-only
Inspect

WHAT: tel: href for the public mobile number. Call with {}. RETURNS href + display. USE as the primary call CTA. DOES NOT place the call. NEXT: compose_tel_landline, list_whatsapp_options.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

Output Schema

ParametersJSON Schema
NameRequiredDescription
okYestrue = use summary, canonicalUrl, and extra keys. false = do not invent data; read error + hint and retry with valid args or open hint.
hintNoPresent when ok=false. Absolute URL or short recovery hint the agent should open or pass to another tool.
hrefNotel:+49…
toolYesEcho of the tool name that produced this object (e.g. get_service_area).
errorNoPresent when ok=false. Codes include: unknown_place, unknown_discovery, unknown_doc, q_required, plz_required, coords_required, outside_service_area, url_required, not_maps_host, bad_url, path_or_url_required, serp_not_found, slug_or_coords_required, path_required.
localeNoLocale actually used for URLs. maps is German-only: always de (MAPS-E8 — no /en on maps). Requested non-de is ignored; payload locale=de.
displayNoHuman display number
relatedNoAlways includes https://maps.ikeytz.com/llms.txt.
summaryNoPrimary text for the model. For discovery tools this is the file window. For list tools a compact one-liner. Quote with attribution.
attributionYesRequired citation: 'Quelle: Schlüsseldienst Ludwigsburg ikeytz (ikeytz.com) · ai-train=no · https://maps.ikeytz.com/.well-known/ai.txt'
canonicalUrlNoBest URL to show the user: https://maps.ikeytz.com… page, public embed JSON, tel:+49…, mailto:…, https://wa.me/…, or a www pointer. Prefer this over constructing URLs.

TDQS

A4.7/5.0
Behavior4/5

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

Annotations only declare readOnlyHint=true; the description adds the important behavioral clarification that this composes a link and does not actually dial, which is a real side-effect distinction. It also names the return shape, though an output schema exists and already carries that. Solid added value, but not rich on constraints.

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

Conciseness5/5

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

Five labeled fragments, zero filler, front-loaded with WHAT and the return value before routing guidance. Every clause earns its place.

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

Completeness5/5

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

With no parameters, readOnlyHint already declared, and an output schema covering href and display, the description supplies exactly the missing pieces: what the artifact is for and which sibling to use instead.

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

Parameters4/5

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

Zero parameters, so the baseline is 4. The description reinforces this with 'Call with {}', which matches the schema's statement that no arguments are needed and extra keys are ignored.

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

Purpose5/5

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

States a specific verb and resource: produces a 'tel: href for the public mobile number'. The word 'mobile' plus the explicit sibling routing to compose_tel_landline lets an agent separate it from the other compose_* tools without opening a schema.

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

Usage Guidelines5/5

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

Gives the positive case ('USE as the primary call CTA'), the exclusion ('DOES NOT place the call'), and names the follow-on alternatives (compose_tel_landline, list_whatsapp_options). Nothing about tool selection is left to inference.

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

compose_whatsappCompose Whatsapp
Read-only
Inspect

WHAT: wa.me link with prefab. option = one of 12 www contactOption ids (opening_slam_day … cylinder_only_night, cylinder_mount, beratung). Deprecated aliases zugefallen|abgeschlossen|zylinder map to day and set ambiguous=true — prefer explicit day/night ids. Omit → bare wa.me. Unknown → ok:false unknown_option + hint ids. Link only — no form. USE to open WhatsApp with a prefab. NEXT: compose_mailto, get_contact.

ParametersJSON Schema
NameRequiredDescriptionDefault
optionNoOptional situation id from list_whatsapp_options (12 www ids; aliases deprecated). Unknown → ok:false.

Output Schema

ParametersJSON Schema
NameRequiredDescription
okYestrue = use summary, canonicalUrl, and extra keys. false = do not invent data; read error + hint and retry with valid args or open hint.
hintNoPresent when ok=false. Absolute URL or short recovery hint the agent should open or pass to another tool.
hrefNohttps://wa.me/…
noteNoLink only. Kein Formular.
toolYesEcho of the tool name that produced this object (e.g. get_service_area).
errorNoPresent when ok=false. Codes include: unknown_place, unknown_discovery, unknown_doc, q_required, plz_required, coords_required, outside_service_area, url_required, not_maps_host, bad_url, path_or_url_required, serp_not_found, slug_or_coords_required, path_required.
localeNoLocale actually used for URLs. maps is German-only: always de (MAPS-E8 — no /en on maps). Requested non-de is ignored; payload locale=de.
optionNoResolved option (null if omitted)
relatedNoAlways includes https://maps.ikeytz.com/llms.txt.
summaryNoPrimary text for the model. For discovery tools this is the file window. For list tools a compact one-liner. Quote with attribution.
ambiguousNotrue if deprecated alias was used
attributionYesRequired citation: 'Quelle: Schlüsseldienst Ludwigsburg ikeytz (ikeytz.com) · ai-train=no · https://maps.ikeytz.com/.well-known/ai.txt'
canonicalUrlNoBest URL to show the user: https://maps.ikeytz.com… page, public embed JSON, tel:+49…, mailto:…, https://wa.me/…, or a www pointer. Prefer this over constructing URLs.
deprecatedAliasNoAlias used, if any
distance_to_officeDistance To OfficeA
Read-only
Inspect

WHAT: Air distance (km) from a Gebiet (slug|plz|name) or lat/lng/icbm to the Gewerbesitz. walkIn=false. RETURNS from, office, distance_km. USE for rough proximity — not driving time. DOES NOT route via OSRM. NEXT: get_geo_office, find_by_geo.

ParametersJSON Schema
NameRequiredDescriptionDefault
latNoOptional query latitude instead of place lookup
lngNoOptional query longitude
plzNoGerman postcode (PLZ). Several Gebiete can share one PLZ (e.g. 71638). For single lookup first match wins; use find_by_plz for all matches.
icbmNoOptional 'lat, lng' instead of place lookup
nameNoGerman place name substring (case-insensitive, umlauts ok), e.g. Grünbühl, Pattonville. Used when slug/plz omitted.
slugNoURL slug of one of the 52 Einsatzgebiete, e.g. pattonville, bietigheim-bissingen, walheim, gruenbuehl. Matches https://maps.ikeytz.com/{slug}. Lookup order when combined with plz/name: slug first.

Output Schema

ParametersJSON Schema
NameRequiredDescription
okYestrue = use summary, canonicalUrl, and extra keys. false = do not invent data; read error + hint and retry with valid args or open hint.
fromNoOrigin {lat,lng}
hintNoPresent when ok=false. Absolute URL or short recovery hint the agent should open or pass to another tool.
slugNoResolved slug if from place lookup
toolYesEcho of the tool name that produced this object (e.g. get_service_area).
errorNoPresent when ok=false. Codes include: unknown_place, unknown_discovery, unknown_doc, q_required, plz_required, coords_required, outside_service_area, url_required, not_maps_host, bad_url, path_or_url_required, serp_not_found, slug_or_coords_required, path_required.
localeNoLocale actually used for URLs. maps is German-only: always de (MAPS-E8 — no /en on maps). Requested non-de is ignored; payload locale=de.
officeNoOffice {lat,lng,icbm}
walkInNoAlways false
relatedNoAlways includes https://maps.ikeytz.com/llms.txt.
summaryNoPrimary text for the model. For discovery tools this is the file window. For list tools a compact one-liner. Quote with attribution.
attributionYesRequired citation: 'Quelle: Schlüsseldienst Ludwigsburg ikeytz (ikeytz.com) · ai-train=no · https://maps.ikeytz.com/.well-known/ai.txt'
distance_kmNoAir distance kilometres
canonicalUrlNoBest URL to show the user: https://maps.ikeytz.com… page, public embed JSON, tel:+49…, mailto:…, https://wa.me/…, or a www pointer. Prefer this over constructing URLs.

TDQS

A4.1/5.0
Behavior4/5

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

Annotations only supply readOnlyHint, so the description carries most of the burden and does deliver: it discloses the return fields (from, office, distance_km), the no-routing behavior (must not be read as an ETA), and the walkIn=false mode. It does not explain what happens on a failed place lookup or on ambiguous PLZ/name matches.

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

Conciseness4/5

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

Front-loaded WHAT / RETURNS / USE / NEXT labels make it scannable and every clause earns its place, with zero filler prose. The telegraphic fragments "walkIn=false" and "NEXT:" assume vocabulary the reader may not have, costing a point.

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

Completeness4/5

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

Output schema exists, so the RETURNS line is a helpful bonus rather than a necessity, and the input families are fully covered by the schema. The notable remaining gap is that all six parameters are optional, and the description never says what the tool returns when invoked with no arguments at all.

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

Parameters3/5

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

Schema description coverage is 100%, so every one of the six parameters is already documented in the schema, including the slug>plz>name precedence. The description only restates the accepted input families (slug|plz|name or lat/lng/icbm), adding no syntax or precedence detail beyond the schema — baseline 3.

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

Purpose5/5

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

States a specific verb+resource (air distance in km from a Gebiet or coordinate pair to the Gewerbesitz) and immediately bounds it against the nearest confusing sibling by declaring it is NOT driving time and does NOT route via OSRM. An agent can distinguish this from routing/geo-lookup tools without opening a schema.

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

Usage Guidelines4/5

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

"USE for rough proximity — not driving time" gives an explicit when-to-use plus an explicit exclusion, which is more than most siblings offer. It stops short of saying when get_geo_office or find_by_geo should be chosen instead; "NEXT" reads as a chaining hint rather than an alternative selection rule.

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

find_by_areaFind By Area
Read-only
Inspect

WHAT: Multi-match Einsatzgebiete by q, name, or slug (substring, umlauts ok). RETURNS all matching point cards. Same match rules as find_by_gebiet — prefer this name when the agent thinks in 'area' wording. USE for fuzzy place names. DOES NOT require an exact slug. Prefer find_by_plz for postcode-only queries. NEXT: get_service_area, get_embed_map.

ParametersJSON Schema
NameRequiredDescriptionDefault
qNoName or slug query
nameNoGerman place name substring (case-insensitive, umlauts ok), e.g. Grünbühl, Pattonville. Used when slug/plz omitted.
slugNoURL slug of one of the 52 Einsatzgebiete, e.g. pattonville, bietigheim-bissingen, walheim, gruenbuehl. Matches https://maps.ikeytz.com/{slug}. Lookup order when combined with plz/name: slug first.

Output Schema

ParametersJSON Schema
NameRequiredDescription
qNo
okYestrue = use summary, canonicalUrl, and extra keys. false = do not invent data; read error + hint and retry with valid args or open hint.
hintNoPresent when ok=false. Absolute URL or short recovery hint the agent should open or pass to another tool.
toolYesEcho of the tool name that produced this object (e.g. get_service_area).
countNo
errorNoPresent when ok=false. Codes include: unknown_place, unknown_discovery, unknown_doc, q_required, plz_required, coords_required, outside_service_area, url_required, not_maps_host, bad_url, path_or_url_required, serp_not_found, slug_or_coords_required, path_required.
itemsNo
localeNoLocale actually used for URLs. maps is German-only: always de (MAPS-E8 — no /en on maps). Requested non-de is ignored; payload locale=de.
relatedNoAlways includes https://maps.ikeytz.com/llms.txt.
summaryNoPrimary text for the model. For discovery tools this is the file window. For list tools a compact one-liner. Quote with attribution.
attributionYesRequired citation: 'Quelle: Schlüsseldienst Ludwigsburg ikeytz (ikeytz.com) · ai-train=no · https://maps.ikeytz.com/.well-known/ai.txt'
canonicalUrlNoBest URL to show the user: https://maps.ikeytz.com… page, public embed JSON, tel:+49…, mailto:…, https://wa.me/…, or a www pointer. Prefer this over constructing URLs.
find_by_gebietFind By Gebiet
Read-only
Inspect

WHAT: Multi-match Gebiete by q, name, or slug (substring, umlauts ok). RETURNS all matching point cards. USE for fuzzy place names. DOES NOT require exact slug. NEXT: get_service_area for one, or get_grenze.

ParametersJSON Schema
NameRequiredDescriptionDefault
qNoName or slug query (preferred)
nameNoGerman place name substring (case-insensitive, umlauts ok), e.g. Grünbühl, Pattonville. Used when slug/plz omitted.
slugNoURL slug of one of the 52 Einsatzgebiete, e.g. pattonville, bietigheim-bissingen, walheim, gruenbuehl. Matches https://maps.ikeytz.com/{slug}. Lookup order when combined with plz/name: slug first.

Output Schema

ParametersJSON Schema
NameRequiredDescription
qNoResolved query
okYestrue = use summary, canonicalUrl, and extra keys. false = do not invent data; read error + hint and retry with valid args or open hint.
hintNoPresent when ok=false. Absolute URL or short recovery hint the agent should open or pass to another tool.
toolYesEcho of the tool name that produced this object (e.g. get_service_area).
countNo
errorNoPresent when ok=false. Codes include: unknown_place, unknown_discovery, unknown_doc, q_required, plz_required, coords_required, outside_service_area, url_required, not_maps_host, bad_url, path_or_url_required, serp_not_found, slug_or_coords_required, path_required.
itemsNo
localeNoLocale actually used for URLs. maps is German-only: always de (MAPS-E8 — no /en on maps). Requested non-de is ignored; payload locale=de.
relatedNoAlways includes https://maps.ikeytz.com/llms.txt.
summaryNoPrimary text for the model. For discovery tools this is the file window. For list tools a compact one-liner. Quote with attribution.
attributionYesRequired citation: 'Quelle: Schlüsseldienst Ludwigsburg ikeytz (ikeytz.com) · ai-train=no · https://maps.ikeytz.com/.well-known/ai.txt'
canonicalUrlNoBest URL to show the user: https://maps.ikeytz.com… page, public embed JSON, tel:+49…, mailto:…, https://wa.me/…, or a www pointer. Prefer this over constructing URLs.
find_by_geoFind By Geo
Read-only
Inspect

WHAT: Rank Einsatzgebiete by lat/lng (or icbm). Optional radius_km; else nearest N (limit, default 5). (0,0) and far points → ok=false outside_service_area. RETURNS items with distance_km. USE for 'near this coordinate'. DOES NOT route or drive-time. NEXT: get_service_area, get_grenze, distance_to_office.

ParametersJSON Schema
NameRequiredDescriptionDefault
latNoWGS84 latitude. Required with lng unless icbm is set. (0,0) → outside_service_area.
lngNoWGS84 longitude. Required with lat unless icbm is set.
icbmNoICBM or paste 'lat, lng' (comma-separated). Alternative to lat+lng.
limitNoMaximum items or lines to return after offset. Omit = all remaining in the window (subject to tool-specific clamps). For geo near-search default is often 5 without radius_km, up to 52 with radius.
radius_kmNoOptional air-radius filter in km. Omit = return nearest N (limit). Far points / (0,0) → outside_service_area.

Output Schema

ParametersJSON Schema
NameRequiredDescription
okYestrue = use summary, canonicalUrl, and extra keys. false = do not invent data; read error + hint and retry with valid args or open hint.
latNoQuery latitude
lngNoQuery longitude
hintNoPresent when ok=false. Absolute URL or short recovery hint the agent should open or pass to another tool.
icbmNoQuery ICBM
toolYesEcho of the tool name that produced this object (e.g. get_service_area).
countNo
errorNoPresent when ok=false. Codes include: unknown_place, unknown_discovery, unknown_doc, q_required, plz_required, coords_required, outside_service_area, url_required, not_maps_host, bad_url, path_or_url_required, serp_not_found, slug_or_coords_required, path_required.
itemsNoRanked Gebiete with distance_km
localeNoLocale actually used for URLs. maps is German-only: always de (MAPS-E8 — no /en on maps). Requested non-de is ignored; payload locale=de.
relatedNoAlways includes https://maps.ikeytz.com/llms.txt.
summaryNoPrimary text for the model. For discovery tools this is the file window. For list tools a compact one-liner. Quote with attribution.
radius_kmNoApplied radius or null
nearest_kmNoOn outside_service_area failures: nearest distance if any
attributionYesRequired citation: 'Quelle: Schlüsseldienst Ludwigsburg ikeytz (ikeytz.com) · ai-train=no · https://maps.ikeytz.com/.well-known/ai.txt'
canonicalUrlNoBest URL to show the user: https://maps.ikeytz.com… page, public embed JSON, tel:+49…, mailto:…, https://wa.me/…, or a www pointer. Prefer this over constructing URLs.
find_by_google_mapsFind By Google Maps
Read-only
Inspect

WHAT: Paste Google Maps / ICBM coordinates (q or icbm or lat/lng) → nearest ikeytz Gebiete (same ranking as find_by_geo). (0,0) → outside_service_area. USE when the user pastes a Maps pin. NEXT: get_service_area, get_embed_map.

ParametersJSON Schema
NameRequiredDescriptionDefault
qNoPaste string containing 'lat, lng'
latNoWGS84 latitude. Required with lng unless icbm is set. (0,0) → outside_service_area.
lngNoWGS84 longitude. Required with lat unless icbm is set.
icbmNoICBM or paste 'lat, lng' (comma-separated). Alternative to lat+lng.
limitNoMaximum items or lines to return after offset. Omit = all remaining in the window (subject to tool-specific clamps). For geo near-search default is often 5 without radius_km, up to 52 with radius.
radius_kmNoOptional air-radius filter in km. Omit = return nearest N (limit). Far points / (0,0) → outside_service_area.

Output Schema

ParametersJSON Schema
NameRequiredDescription
okYestrue = use summary, canonicalUrl, and extra keys. false = do not invent data; read error + hint and retry with valid args or open hint.
latNo
lngNo
hintNoPresent when ok=false. Absolute URL or short recovery hint the agent should open or pass to another tool.
icbmNo
toolYesEcho of the tool name that produced this object (e.g. get_service_area).
countNo
errorNoPresent when ok=false. Codes include: unknown_place, unknown_discovery, unknown_doc, q_required, plz_required, coords_required, outside_service_area, url_required, not_maps_host, bad_url, path_or_url_required, serp_not_found, slug_or_coords_required, path_required.
itemsNo
localeNoLocale actually used for URLs. maps is German-only: always de (MAPS-E8 — no /en on maps). Requested non-de is ignored; payload locale=de.
relatedNoAlways includes https://maps.ikeytz.com/llms.txt.
summaryNoPrimary text for the model. For discovery tools this is the file window. For list tools a compact one-liner. Quote with attribution.
radius_kmNo
nearest_kmNo
attributionYesRequired citation: 'Quelle: Schlüsseldienst Ludwigsburg ikeytz (ikeytz.com) · ai-train=no · https://maps.ikeytz.com/.well-known/ai.txt'
canonicalUrlNoBest URL to show the user: https://maps.ikeytz.com… page, public embed JSON, tel:+49…, mailto:…, https://wa.me/…, or a www pointer. Prefer this over constructing URLs.
find_by_icbmFind By Icbm
Read-only
Inspect

WHAT: Rank Einsatzgebiete by an ICBM 'lat, lng' string (optional lat/lng, radius_km, limit). RETURNS items with distance_km. USE when the user pastes ICBM metadata. Prefer find_by_geo instead for plain lat/lng without an ICBM string. (0,0) and far points → ok=false outside_service_area. DOES NOT route or drive-time. NEXT: get_service_area, get_embed_map, get_grenze.

ParametersJSON Schema
NameRequiredDescriptionDefault
latNoWGS84 latitude. Required with lng unless icbm is set. (0,0) → outside_service_area.
lngNoWGS84 longitude. Required with lat unless icbm is set.
icbmNoICBM or paste 'lat, lng' (comma-separated). Alternative to lat+lng.
limitNoMaximum items or lines to return after offset. Omit = all remaining in the window (subject to tool-specific clamps). For geo near-search default is often 5 without radius_km, up to 52 with radius.
radius_kmNoOptional air-radius filter in km. Omit = return nearest N (limit). Far points / (0,0) → outside_service_area.

Output Schema

ParametersJSON Schema
NameRequiredDescription
okYestrue = use summary, canonicalUrl, and extra keys. false = do not invent data; read error + hint and retry with valid args or open hint.
latNo
lngNo
hintNoPresent when ok=false. Absolute URL or short recovery hint the agent should open or pass to another tool.
icbmNo
toolYesEcho of the tool name that produced this object (e.g. get_service_area).
countNo
errorNoPresent when ok=false. Codes include: unknown_place, unknown_discovery, unknown_doc, q_required, plz_required, coords_required, outside_service_area, url_required, not_maps_host, bad_url, path_or_url_required, serp_not_found, slug_or_coords_required, path_required.
itemsNo
localeNoLocale actually used for URLs. maps is German-only: always de (MAPS-E8 — no /en on maps). Requested non-de is ignored; payload locale=de.
relatedNoAlways includes https://maps.ikeytz.com/llms.txt.
summaryNoPrimary text for the model. For discovery tools this is the file window. For list tools a compact one-liner. Quote with attribution.
radius_kmNo
nearest_kmNo
attributionYesRequired citation: 'Quelle: Schlüsseldienst Ludwigsburg ikeytz (ikeytz.com) · ai-train=no · https://maps.ikeytz.com/.well-known/ai.txt'
canonicalUrlNoBest URL to show the user: https://maps.ikeytz.com… page, public embed JSON, tel:+49…, mailto:…, https://wa.me/…, or a www pointer. Prefer this over constructing URLs.
find_by_keywordFind By KeywordA
Read-only
Inspect

WHAT: Search maps llms-keywords.txt (keyword → maps URL). q required. RETURNS matching keyword/url rows (clamped limit). USE for SEO/keyword → Gebiet page. DOES NOT search www keywords. NEXT: get_service_area / get_embed_map with the slug from the URL.

ParametersJSON Schema
NameRequiredDescriptionDefault
qYesRequired search string matched against keyword and URL (substring, case-insensitive).
limitNoMaximum items or lines to return after offset. Omit = all remaining in the window (subject to tool-specific clamps). For geo near-search default is often 5 without radius_km, up to 52 with radius.
localeNomaps is German-only (de). Omit or pass de. Other values are ignored; URLs stay https://maps.ikeytz.com/… with no locale prefix. Not a www multi-locale switch — use @ikeytz/mcp list_locales on www for en|fr|ru|fa|ar|tr.de

Output Schema

ParametersJSON Schema
NameRequiredDescription
qNoQuery echoed
okYestrue = use summary, canonicalUrl, and extra keys. false = do not invent data; read error + hint and retry with valid args or open hint.
hintNoPresent when ok=false. Absolute URL or short recovery hint the agent should open or pass to another tool.
toolYesEcho of the tool name that produced this object (e.g. get_service_area).
countNoReturned hits
errorNoPresent when ok=false. Codes include: unknown_place, unknown_discovery, unknown_doc, q_required, plz_required, coords_required, outside_service_area, url_required, not_maps_host, bad_url, path_or_url_required, serp_not_found, slug_or_coords_required, path_required.
itemsNokeyword + url rows
linesNoRaw TSV lines
totalNoTotal matches before limit
localeNoLocale actually used for URLs. maps is German-only: always de (MAPS-E8 — no /en on maps). Requested non-de is ignored; payload locale=de.
relatedNoAlways includes https://maps.ikeytz.com/llms.txt.
summaryNoPrimary text for the model. For discovery tools this is the file window. For list tools a compact one-liner. Quote with attribution.
attributionYesRequired citation: 'Quelle: Schlüsseldienst Ludwigsburg ikeytz (ikeytz.com) · ai-train=no · https://maps.ikeytz.com/.well-known/ai.txt'
canonicalUrlNoBest URL to show the user: https://maps.ikeytz.com… page, public embed JSON, tel:+49…, mailto:…, https://wa.me/…, or a www pointer. Prefer this over constructing URLs.

TDQS

A4.1/5.0
Behavior4/5

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

Annotations already declare readOnlyHint=true, so safety is covered, but the description adds useful behavior beyond that: it returns 'matching keyword/url rows' and notes the limit is 'clamped', warning the agent that results may be truncated. No auth or rate-limit context, but the added return/clamp detail is meaningful.

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

Conciseness4/5

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

Front-loaded with labeled sections (WHAT/RETURNS/USE/DOES NOT/NEXT) and every clause carries information with almost no filler. The telegraphic style is dense but efficient, with no duplicated sentences.

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

Completeness4/5

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

An output schema exists so return-shape detail is not required, yet the description still summarizes the returned rows and the next-step tools. Combined with the explicit exclusion and required-param note, an agent has enough to invoke it correctly, though deployment context like indexing scope is left implicit.

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

Parameters3/5

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

Schema description coverage is 100%, so the schema already documents q, limit, and locale in detail. The description only echoes 'q required', adding no format or syntax guidance beyond what the schema already provides, which matches the baseline 3 for fully-covered schemas.

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

Purpose5/5

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

States a specific verb and resource: 'Search maps llms-keywords.txt (keyword → maps URL)'. It explicitly scopes itself against the sibling space with 'DOES NOT search www keywords', so an agent can distinguish it from the other find_by_* and list_* tools without opening the schema.

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

Usage Guidelines4/5

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

Gives clear when-to-use ('USE for SEO/keyword → Gebiet page'), an explicit exclusion ('DOES NOT search www keywords'), and follow-up routing ('NEXT: get_service_area / get_embed_map with the slug from the URL'). It stops short of naming a directly competing alternative tool for the same query, so it is strong but not maximal.

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

find_by_plzFind By Plz
Read-only
Inspect

WHAT: All Einsatzgebiete with this PLZ (not only the first). plz required (or q as PLZ). RETURNS items[] point cards + count. USE when several Stadtteile share a postcode. NEXT: get_service_area(slug) for one card.

ParametersJSON Schema
NameRequiredDescriptionDefault
qNoAlias for plz if plz omitted
plzYesRequired German postcode.

Output Schema

ParametersJSON Schema
NameRequiredDescription
okYestrue = use summary, canonicalUrl, and extra keys. false = do not invent data; read error + hint and retry with valid args or open hint.
plzNoQueried PLZ
hintNoPresent when ok=false. Absolute URL or short recovery hint the agent should open or pass to another tool.
toolYesEcho of the tool name that produced this object (e.g. get_service_area).
countNoNumber of Gebiete
errorNoPresent when ok=false. Codes include: unknown_place, unknown_discovery, unknown_doc, q_required, plz_required, coords_required, outside_service_area, url_required, not_maps_host, bad_url, path_or_url_required, serp_not_found, slug_or_coords_required, path_required.
itemsNoAll matches
localeNoLocale actually used for URLs. maps is German-only: always de (MAPS-E8 — no /en on maps). Requested non-de is ignored; payload locale=de.
relatedNoAlways includes https://maps.ikeytz.com/llms.txt.
summaryNoPrimary text for the model. For discovery tools this is the file window. For list tools a compact one-liner. Quote with attribution.
attributionYesRequired citation: 'Quelle: Schlüsseldienst Ludwigsburg ikeytz (ikeytz.com) · ai-train=no · https://maps.ikeytz.com/.well-known/ai.txt'
canonicalUrlNoBest URL to show the user: https://maps.ikeytz.com… page, public embed JSON, tel:+49…, mailto:…, https://wa.me/…, or a www pointer. Prefer this over constructing URLs.
find_by_serpFind By SerpA
Read-only
Inspect

WHAT: Search maps llms-serp.txt blocks by q, path, url, or slug. RETURNS path/url/snippet items. DOCS/API: https://maps.ikeytz.com/llms-serp.txt (source catalog). USE for title/H1/description SERP cards on maps. DOES NOT scrape live HTML. NEXT: get_serp_snippet for one full block.

ParametersJSON Schema
NameRequiredDescriptionDefault
qNoFree-text search in SERP blocks
urlNoFull https://maps.ikeytz.com/… URL
pathNomaps path fragment, e.g. /pattonville
slugNoGebiet slug
limitNoMaximum items or lines to return after offset. Omit = all remaining in the window (subject to tool-specific clamps). For geo near-search default is often 5 without radius_km, up to 52 with radius.

Output Schema

ParametersJSON Schema
NameRequiredDescription
qNoResolved query
okYestrue = use summary, canonicalUrl, and extra keys. false = do not invent data; read error + hint and retry with valid args or open hint.
hintNoPresent when ok=false. Absolute URL or short recovery hint the agent should open or pass to another tool.
toolYesEcho of the tool name that produced this object (e.g. get_service_area).
countNo
errorNoPresent when ok=false. Codes include: unknown_place, unknown_discovery, unknown_doc, q_required, plz_required, coords_required, outside_service_area, url_required, not_maps_host, bad_url, path_or_url_required, serp_not_found, slug_or_coords_required, path_required.
itemsNoSERP hits
totalNo
localeNoLocale actually used for URLs. maps is German-only: always de (MAPS-E8 — no /en on maps). Requested non-de is ignored; payload locale=de.
relatedNoAlways includes https://maps.ikeytz.com/llms.txt.
summaryNoPrimary text for the model. For discovery tools this is the file window. For list tools a compact one-liner. Quote with attribution.
attributionYesRequired citation: 'Quelle: Schlüsseldienst Ludwigsburg ikeytz (ikeytz.com) · ai-train=no · https://maps.ikeytz.com/.well-known/ai.txt'
canonicalUrlNoBest URL to show the user: https://maps.ikeytz.com… page, public embed JSON, tel:+49…, mailto:…, https://wa.me/…, or a www pointer. Prefer this over constructing URLs.

TDQS

A4.1/5.0
Behavior4/5

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

With only readOnlyHint available, the description adds real behavioral context: it discloses it does not scrape live HTML, names the underlying source catalog URL, and indicates the item shape (path/url/snippet). It does not cover pagination limits or combined-filter behavior.

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

Conciseness4/5

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

Tagged WHAT/RETURNS/USE/DOES NOT/NEXT structure is well front-loaded and scannable. Slightly dense with some overlap between the WHAT clause and the parameter list.

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

Completeness4/5

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

For a read-only search tool with a full schema and an output schema, this covers purpose, negative constraints, and the follow-up call. The remaining gap is filter-combination semantics, which matters given four optional, non-required query parameters.

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

Parameters3/5

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

Schema description coverage is 100%, so the schema already documents all five parameters, giving a baseline of 3. The description restates the query keys but adds nothing about how they combine, precedence when multiple are supplied, or matching semantics for q.

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

Purpose5/5

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

States a specific verb and resource ('Search maps llms-serp.txt blocks') and enumerates the four lookup keys (q, path, url, slug). It also distinguishes itself from sibling lookup tools by clarifying it searches the SERP block catalog rather than live HTML.

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

Usage Guidelines4/5

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

'USE for title/H1/description SERP cards on maps' gives a clear usage context, and 'NEXT: get_serp_snippet for one full block' routes the agent to the follow-up tool. It lacks explicit exclusions against close siblings like find_by_gebiet or find_by_keyword, so 4 rather than 5.

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

get_aboutGet About
Read-only
Inspect

WHAT: About maps.ikeytz.com (same core card as site_overview — 52 maps, not www Über-uns corpus). USE for 'what is this host'. DOES NOT return www about body. NEXT: site_overview, get_links, get_business_identity.

ParametersJSON Schema
NameRequiredDescriptionDefault
localeNomaps is German-only (de). Omit or pass de. Other values are ignored; URLs stay https://maps.ikeytz.com/… with no locale prefix. Not a www multi-locale switch — use @ikeytz/mcp list_locales on www for en|fr|ru|fa|ar|tr.de

Output Schema

ParametersJSON Schema
NameRequiredDescription
h1No
okYestrue = use summary, canonicalUrl, and extra keys. false = do not invent data; read error + hint and retry with valid args or open hint.
mcpNo
hintNoPresent when ok=false. Absolute URL or short recovery hint the agent should open or pass to another tool.
noteNo
toolYesEcho of the tool name that produced this object (e.g. get_service_area).
brandNo
countNo
errorNoPresent when ok=false. Codes include: unknown_place, unknown_discovery, unknown_doc, q_required, plz_required, coords_required, outside_service_area, url_required, not_maps_host, bad_url, path_or_url_required, serp_not_found, slug_or_coords_required, path_required.
ownerNo
titleNo
localeNoLocale actually used for URLs. maps is German-only: always de (MAPS-E8 — no /en on maps). Requested non-de is ignored; payload locale=de.
sisterNo
walkInNo
relatedNoAlways includes https://maps.ikeytz.com/llms.txt.
summaryNoPrimary text for the model. For discovery tools this is the file window. For list tools a compact one-liner. Quote with attribution.
registryNo
legalNameNo
attributionYesRequired citation: 'Quelle: Schlüsseldienst Ludwigsburg ikeytz (ikeytz.com) · ai-train=no · https://maps.ikeytz.com/.well-known/ai.txt'
canonicalUrlNoBest URL to show the user: https://maps.ikeytz.com… page, public embed JSON, tel:+49…, mailto:…, https://wa.me/…, or a www pointer. Prefer this over constructing URLs.
get_agbGet AgbA
Read-only
Inspect

WHAT: Returns only a URL to www.ikeytz.com/agb — not AGB clause text. USE when the user asks for AGB while on maps and you only need the link. Prefer www MCP get_legal(doc=agb) or www get_agb when you need the legal corpus. DOES NOT invent legal clauses.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

Output Schema

ParametersJSON Schema
NameRequiredDescription
okYestrue = use summary, canonicalUrl, and extra keys. false = do not invent data; read error + hint and retry with valid args or open hint.
npmNowww CLI package @ikeytz/mcp
hintNoPresent when ok=false. Absolute URL or short recovery hint the agent should open or pass to another tool.
htmlNoAbsolute www.ikeytz.com URL — open there or call @ikeytz/mcp
noteNomaps only points; Volltext/Preise/FAQ live on www
toolYesEcho of the tool name that produced this object (e.g. get_service_area).
errorNoPresent when ok=false. Codes include: unknown_place, unknown_discovery, unknown_doc, q_required, plz_required, coords_required, outside_service_area, url_required, not_maps_host, bad_url, path_or_url_required, serp_not_found, slug_or_coords_required, path_required.
localeNoLocale actually used for URLs. maps is German-only: always de (MAPS-E8 — no /en on maps). Requested non-de is ignored; payload locale=de.
relatedNoAlways includes https://maps.ikeytz.com/llms.txt.
summaryNoPrimary text for the model. For discovery tools this is the file window. For list tools a compact one-liner. Quote with attribution.
www_mcpNohttps://www.ikeytz.com/mcp — sister machine for prices/FAQ/corpus
www_toolNoSame tool name on www MCP that holds the real payload
attributionYesRequired citation: 'Quelle: Schlüsseldienst Ludwigsburg ikeytz (ikeytz.com) · ai-train=no · https://maps.ikeytz.com/.well-known/ai.txt'
canonicalUrlNoBest URL to show the user: https://maps.ikeytz.com… page, public embed JSON, tel:+49…, mailto:…, https://wa.me/…, or a www pointer. Prefer this over constructing URLs.
requested_localeNoLocale the caller asked for; maps still returns locale=de

TDQS

A4.7/5.0
Behavior4/5

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

Annotations already declare readOnlyHint=true, so the safety profile is covered. The description adds meaningful behavioral context beyond that: its output is a URL only, not clause text, which prevents the agent from expecting a legal corpus, and it disclaims clause invention. It doesn't discuss latency or failure modes, but the output nature is a valuable addition.

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

Conciseness5/5

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

Three front-loaded sentences in a clear WHAT/USE/DOES-NOT structure, each earning its place with no waste. The most important constraint (URL only) comes first.

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

Completeness5/5

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

An output schema exists so return values needn't be spelled out, yet the description still clarifies the output is a link. For a zero-parameter, annotated, read-only helper, nothing an agent needs to select and call it correctly is missing.

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

Parameters4/5

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

The tool takes zero parameters and the schema documents this fully ('This tool takes no arguments'), so the baseline is 4. The description correctly implies a no-argument call, adding no confusion.

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

Purpose5/5

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

The description states a specific verb and resource and sharply scopes it: 'Returns only a URL to www.ikeytz.com/agb — not AGB clause text.' It explicitly distinguishes itself from siblings get_legal(doc=agb) and www get_agb, so an agent can pick it apart from near-identical tools.

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

Usage Guidelines5/5

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

It gives an explicit use condition ('USE when the user asks for AGB while on maps and you only need the link') and names the alternatives with the condition that selects them ('Prefer ... get_legal(doc=agb) ... when you need the legal corpus'). Both when-to-use and when-not-to-use are covered.

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

get_ai_pageGet Ai PageA
Read-only
Inspect

WHAT: Reads maps /ai-pages/de/{slug}.txt when the path is a maps Gebiet/ai-page; otherwise returns a www HTML hand-off for non-maps paths. path or slug. DOCS/API: https://maps.ikeytz.com/ai-pages/de/{slug}.txt (plain text corpus) and https://maps.ikeytz.com/{slug} (HTML). USE for agent-ready maps Gebiet prose — not for site-wide crawl policy (that is get_ai_txt). DOES NOT invent page bodies. NEXT: get_service_area, get_lage, get_ai_txt.

ParametersJSON Schema
NameRequiredDescriptionDefault
pathNoPath or ai-pages path fragment
slugNoGebiet or ai-page slug
localeNomaps is German-only (de). Omit or pass de. Other values are ignored; URLs stay https://maps.ikeytz.com/… with no locale prefix. Not a www multi-locale switch — use @ikeytz/mcp list_locales on www for en|fr|ru|fa|ar|tr.de

Output Schema

ParametersJSON Schema
NameRequiredDescription
okYestrue = use summary, canonicalUrl, and extra keys. false = do not invent data; read error + hint and retry with valid args or open hint.
hintNoPresent when ok=false. Absolute URL or short recovery hint the agent should open or pass to another tool.
htmlNoWhen www pointer
noteNo
pathNo/ai-pages/de/{slug}.txt
slugNo
textNoFull ai-page UTF-8 text
toolYesEcho of the tool name that produced this object (e.g. get_service_area).
errorNoPresent when ok=false. Codes include: unknown_place, unknown_discovery, unknown_doc, q_required, plz_required, coords_required, outside_service_area, url_required, not_maps_host, bad_url, path_or_url_required, serp_not_found, slug_or_coords_required, path_required.
localeNoLocale actually used for URLs. maps is German-only: always de (MAPS-E8 — no /en on maps). Requested non-de is ignored; payload locale=de.
relatedNoAlways includes https://maps.ikeytz.com/llms.txt.
summaryNoPrimary text for the model. For discovery tools this is the file window. For list tools a compact one-liner. Quote with attribution.
attributionYesRequired citation: 'Quelle: Schlüsseldienst Ludwigsburg ikeytz (ikeytz.com) · ai-train=no · https://maps.ikeytz.com/.well-known/ai.txt'
canonicalUrlNoBest URL to show the user: https://maps.ikeytz.com… page, public embed JSON, tel:+49…, mailto:…, https://wa.me/…, or a www pointer. Prefer this over constructing URLs.

TDQS

A3.6/5.0
Behavior3/5

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

Annotations only declare readOnlyHint=true, so safety is covered. The description adds branch behavior (txt corpus vs HTML hand-off) and the guarantee 'DOES NOT invent page bodies', but does not mention auth needs, caching, or rate limits. With an output schema present, return values need not be re-explained, so a 3 is appropriate.

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

Conciseness4/5

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

Front-loaded with WHAT/USE/NEXT labels and no filler sentences, though the two inline URLs and the 'Not a www multi-locale switch' tangent add density. Nothing is truly wasted, but the entry is cramped.

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

Completeness4/5

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

For a read tool with an output schema and full param coverage, the description supplies the branch logic, the sibling routing, and the doc URLs an agent needs. It leaves minor gaps around error cases for invalid slugs, but is broadly complete.

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

Parameters3/5

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

Schema description coverage is 100% with 3 well-documented params including an enum and its locale caveat. The description only restates 'path or slug', adding nothing beyond the schema. Baseline 3 for a fully-documented schema.

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

Purpose4/5

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

The description opens with a specific verb+resource ('Reads maps /ai-pages/de/{slug}.txt') and clarifies the fallback branch for non-maps paths. It distinguishes itself from get_ai_txt. However, the phrasing around 'www HTML hand-off' is somewhat tangled, so an agent must parse carefully to distinguish it from sibling page tools.

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

Usage Guidelines4/5

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

Explicit 'USE for agent-ready maps Gebiet prose — not for site-wide crawl policy (that is get_ai_txt)' names both the intended use and the exclusion, plus NEXT suggestions. It stops short of a full when/when-not matrix for the many other get_* page tools, but the key routing is present.

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

get_ai_txtGet Ai Txt
Read-only
Inspect

WHAT: Alias get_discovery(which=ai-txt) — maps /.well-known/ai.txt 1:1. USE for crawl/train policy (ai-train=no). NEXT: get_llms_txt.

ParametersJSON Schema
NameRequiredDescriptionDefault
limitNoMaximum number of lines to return after offset. Omit or null = if remaining payload ≤~30KB return all remaining lines; if larger, return first ~30KB window + nextOffset (O9). Explicit limit keeps 1..10000 line window (MCP caps unchanged — not forced to 30KB). Meta also as trailing # MCP-META lines in summary.
offsetNo0-based index into a list or discovery file lines (split on \n). 0 = first. Omit = 0. Combine with limit to page. Use nextOffset / offset+limit from a previous result when present.

Output Schema

ParametersJSON Schema
NameRequiredDescription
okYestrue = use summary, canonicalUrl, and extra keys. false = do not invent data; read error + hint and retry with valid args or open hint.
hintNoPresent when ok=false. Absolute URL or short recovery hint the agent should open or pass to another tool.
pathNoPublic relative path of the file on maps
textNoUTF-8 line window (file body before # MCP-META). Same bytes as summary without meta trailer.
toolYesEcho of the tool name that produced this object (e.g. get_service_area).
errorNoPresent when ok=false. Codes include: unknown_place, unknown_discovery, unknown_doc, q_required, plz_required, coords_required, outside_service_area, url_required, not_maps_host, bad_url, path_or_url_required, serp_not_found, slug_or_coords_required, path_required.
limitNoApplied line limit, or null if omitted
whichNoResolved discovery id (ard, ai-catalog, llms, robots, sitemap-txt, llms-mcp-server, …).
localeNoLocale actually used for URLs. maps is German-only: always de (MAPS-E8 — no /en on maps). Requested non-de is ignored; payload locale=de.
offsetNoApplied 0-based line offset
missingNotrue if the discovery file was not found on disk
relatedNoAlways includes https://maps.ikeytz.com/llms.txt.
summaryNoPrimary text for the model. For discovery tools this is the file window. For list tools a compact one-liner. Quote with attribution.
totalUrlsNohttp(s) lines in the full file
truncatedNotrue if offset+limit left more lines. Also in trailing # MCP-META.
nextOffsetNoPass as next offset when truncated; else null. Also in # MCP-META.
totalBytesNoFull discovery file size in bytes (UTF-8). Also in trailing # MCP-META.
totalCharsNoFull discovery file character length before offset/limit. Also in # MCP-META.
totalLinesNoAlias of total_lines
attributionYesRequired citation: 'Quelle: Schlüsseldienst Ludwigsburg ikeytz (ikeytz.com) · ai-train=no · https://maps.ikeytz.com/.well-known/ai.txt'
total_linesNoLine count of the full file
canonicalUrlNoBest URL to show the user: https://maps.ikeytz.com… page, public embed JSON, tel:+49…, mailto:…, https://wa.me/…, or a www pointer. Prefer this over constructing URLs.
returnedUrlsNohttp(s) lines in this window
bytesReturnedNoUTF-8 length of text window
returnedLinesNoLines in this window (before # MCP-META)
fetchTruncatedNotrue if a load cap cut the file before paging (www Cap). maps reads full from disk → always false.
get_auswahl_itemGet Auswahl ItemA
Read-only
Inspect

WHAT: Returns only a URL to www /auswahl/{slug} — not the Auswahl article body. slug required. USE when the user names a specific Auswahl slug on maps. Prefer list_auswahl for the hub link; prefer www MCP get_auswahl_item({slug}) when you need the full article. DOES NOT return article text.

ParametersJSON Schema
NameRequiredDescriptionDefault
slugYesRequired Auswahl slug on www
localeNomaps is German-only (de). Omit or pass de. Other values are ignored; URLs stay https://maps.ikeytz.com/… with no locale prefix. Not a www multi-locale switch — use @ikeytz/mcp list_locales on www for en|fr|ru|fa|ar|tr.de

Output Schema

ParametersJSON Schema
NameRequiredDescription
okYestrue = use summary, canonicalUrl, and extra keys. false = do not invent data; read error + hint and retry with valid args or open hint.
npmNowww CLI package @ikeytz/mcp
hintNoPresent when ok=false. Absolute URL or short recovery hint the agent should open or pass to another tool.
htmlNoAbsolute www.ikeytz.com URL — open there or call @ikeytz/mcp
noteNomaps only points; Volltext/Preise/FAQ live on www
toolYesEcho of the tool name that produced this object (e.g. get_service_area).
errorNoPresent when ok=false. Codes include: unknown_place, unknown_discovery, unknown_doc, q_required, plz_required, coords_required, outside_service_area, url_required, not_maps_host, bad_url, path_or_url_required, serp_not_found, slug_or_coords_required, path_required.
localeNoLocale actually used for URLs. maps is German-only: always de (MAPS-E8 — no /en on maps). Requested non-de is ignored; payload locale=de.
relatedNoAlways includes https://maps.ikeytz.com/llms.txt.
summaryNoPrimary text for the model. For discovery tools this is the file window. For list tools a compact one-liner. Quote with attribution.
www_mcpNohttps://www.ikeytz.com/mcp — sister machine for prices/FAQ/corpus
www_toolNoSame tool name on www MCP that holds the real payload
attributionYesRequired citation: 'Quelle: Schlüsseldienst Ludwigsburg ikeytz (ikeytz.com) · ai-train=no · https://maps.ikeytz.com/.well-known/ai.txt'
canonicalUrlNoBest URL to show the user: https://maps.ikeytz.com… page, public embed JSON, tel:+49…, mailto:…, https://wa.me/…, or a www pointer. Prefer this over constructing URLs.
requested_localeNoLocale the caller asked for; maps still returns locale=de

TDQS

A4.3/5.0
Behavior4/5

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

Annotations only provide readOnlyHint=true, and the description adds useful scope context beyond that: it returns a URL, not article text, and it is maps-specific rather than a www multi-locale switch. It does not cover auth or rate limits, but for a read-only lookup with an output schema the added clarity is strong.

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

Conciseness4/5

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

Front-loaded WHAT/USE/DOES-NOT structure with no wasted sentences. Slight redundancy between 'not the Auswahl article body' and 'DOES NOT return article text', but overall tight.

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

Completeness4/5

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

The tool is simple, the output schema exists so return structure needn't be restated, and the description still confirms the returned artifact (a URL). 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.

Parameters3/5

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

Schema description coverage is 100% and the locale semantics are fully documented in the schema itself (German-only, ignored for others). The description only restates that slug is required, adding no syntax or format detail beyond the schema, so baseline 3 applies.

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

Purpose5/5

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

States a specific verb+resource and precise scope: it returns only a URL to www /auswahl/{slug}, explicitly not the article body. It also differentiates itself from list_auswahl and the www MCP's get_auswahl_item, so an agent can distinguish it without opening other schemas.

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

Usage Guidelines5/5

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

Gives explicit when-to-use (user names a specific Auswahl slug on maps) and names two alternatives with the condition that selects each: list_auswahl for the hub link, www MCP get_auswahl_item for the full article. No inference required.

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

get_business_identityGet Business IdentityA
Read-only
Inspect

WHAT: Returns Inhaber, brand, legalName, hours, NAP, and office coords for LocalBusiness / impressum-grade facts on maps. Call with {} or locale=de. walkIn=false — mobile locksmith only. USE when you need the identity card (who owns the business, hours, legal name). Prefer get_contact for phone/email/WhatsApp CTAs; prefer get_geo_office for the /buero pin and embed; prefer get_impressum for the full imprint text file. DOES NOT update records or accept walk-in bookings.

ParametersJSON Schema
NameRequiredDescriptionDefault
localeNomaps is German-only (de). Omit or pass de. Other values are ignored; URLs stay https://maps.ikeytz.com/… with no locale prefix. Not a www multi-locale switch — use @ikeytz/mcp list_locales on www for en|fr|ru|fa|ar|tr.de

Output Schema

ParametersJSON Schema
NameRequiredDescription
okYestrue = use summary, canonicalUrl, and extra keys. false = do not invent data; read error + hint and retry with valid args or open hint.
napNoPublic NAP payload
wwwNo
hintNoPresent when ok=false. Absolute URL or short recovery hint the agent should open or pass to another tool.
mapsNo
noteNo
toolYesEcho of the tool name that produced this object (e.g. get_service_area).
brandNo
errorNoPresent when ok=false. Codes include: unknown_place, unknown_discovery, unknown_doc, q_required, plz_required, coords_required, outside_service_area, url_required, not_maps_host, bad_url, path_or_url_required, serp_not_found, slug_or_coords_required, path_required.
hoursNo
ownerNoMahmud Reza Kashani
localeNoLocale actually used for URLs. maps is German-only: always de (MAPS-E8 — no /en on maps). Requested non-de is ignored; payload locale=de.
officeNolat/lng/google_maps/icbm
walkInNoAlways false
relatedNoAlways includes https://maps.ikeytz.com/llms.txt.
summaryNoPrimary text for the model. For discovery tools this is the file window. For list tools a compact one-liner. Quote with attribution.
legalNameNo
attributionYesRequired citation: 'Quelle: Schlüsseldienst Ludwigsburg ikeytz (ikeytz.com) · ai-train=no · https://maps.ikeytz.com/.well-known/ai.txt'
office_noteNo
canonicalUrlNoBest URL to show the user: https://maps.ikeytz.com… page, public embed JSON, tel:+49…, mailto:…, https://wa.me/…, or a www pointer. Prefer this over constructing URLs.

TDQS

A4.4/5.0
Behavior4/5

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

readOnlyHint=true already declares the safe-read profile, so the bar is lower. The description still adds real context beyond annotations: it flags 'walkIn=false — mobile locksmith only' and states it does not update records or accept bookings. It does not discuss rate limits or auth needs, but given the annotation coverage this is solid.

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

Conciseness4/5

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

Front-loaded with WHAT/USE/DOES NOT headers that make scanning easy. Slightly redundant, as the no-walk-in constraint appears twice ('walkIn=false — mobile locksmith only' and 'accept walk-in bookings'), but overall tight and well organized.

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

Completeness5/5

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

An output schema exists, so return values need not be restated. For a single-optional-param, read-only lookup the description covers purpose, selection vs alternatives, and exclusions; nothing an agent needs to call it correctly is missing.

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

Parameters3/5

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

Schema coverage is 100% and the sole parameter carries a thorough enum description, so the schema does the heavy lifting. The description only reinforces calling with {} or locale=de, adding no syntax or meaning beyond the schema, which matches the baseline 3.

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

Purpose5/5

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

States a specific verb and enumerates exactly what is returned (Inhaber, brand, legalName, hours, NAP, office coords) and the scope (LocalBusiness / impressum-grade facts). It explicitly distinguishes itself from the three closest siblings (get_contact, get_geo_office, get_impressum), so an agent can select it without opening any schema.

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

Usage Guidelines5/5

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

Provides an explicit USE condition plus three named alternatives with the exact condition that selects each (phone/email CTA, /buero pin and embed, full imprint text). It also states two exclusions (no record updates, no walk-in bookings), leaving little to inference.

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

get_contactGet ContactA
Read-only
Inspect

WHAT: Public NAP — mobile, landline, fax, email, mapsEmail (info@maps.ikeytz.com), WhatsApp, address, office coords. walkIn=false. USE for call/WhatsApp/mail CTAs. DOES NOT open tickets or send messages. NEXT: compose_tel_mobile, compose_whatsapp, compose_mailto, list_whatsapp_options.

ParametersJSON Schema
NameRequiredDescriptionDefault
localeNomaps is German-only (de). Omit or pass de. Other values are ignored; URLs stay https://maps.ikeytz.com/… with no locale prefix. Not a www multi-locale switch — use @ikeytz/mcp list_locales on www for en|fr|ru|fa|ar|tr.de

Output Schema

ParametersJSON Schema
NameRequiredDescription
okYestrue = use summary, canonicalUrl, and extra keys. false = do not invent data; read error + hint and retry with valid args or open hint.
faxNoFax display
latNoOffice lat
lngNoOffice lng
hintNoPresent when ok=false. Absolute URL or short recovery hint the agent should open or pass to another tool.
icbmNo
toolYesEcho of the tool name that produced this object (e.g. get_service_area).
emailNoinfo@ikeytz.com
errorNoPresent when ok=false. Codes include: unknown_place, unknown_discovery, unknown_doc, q_required, plz_required, coords_required, outside_service_area, url_required, not_maps_host, bad_url, path_or_url_required, serp_not_found, slug_or_coords_required, path_required.
localeNoLocale actually used for URLs. maps is German-only: always de (MAPS-E8 — no /en on maps). Requested non-de is ignored; payload locale=de.
mobileNoMobile display
walkInNoAlways false
addressNoStructured address block
relatedNoAlways includes https://maps.ikeytz.com/llms.txt.
summaryNoPrimary text for the model. For discovery tools this is the file window. For list tools a compact one-liner. Quote with attribution.
landlineNoLandline display
whatsappNowa.me URL
mapsEmailNoinfo@maps.ikeytz.com
addressLineNoSingle-line address
attributionYesRequired citation: 'Quelle: Schlüsseldienst Ludwigsburg ikeytz (ikeytz.com) · ai-train=no · https://maps.ikeytz.com/.well-known/ai.txt'
google_mapsNo
canonicalUrlNoBest URL to show the user: https://maps.ikeytz.com… page, public embed JSON, tel:+49…, mailto:…, https://wa.me/…, or a www pointer. Prefer this over constructing URLs.

TDQS

A4.3/5.0
Behavior4/5

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

Annotations only declare readOnlyHint=true, so the description must add the rest; it does disclose that the tool is a pure data fetch that sends nothing and opens no tickets, plus the walkIn=false flag. It does not discuss caching, freshness, or failure modes, but it covers the behavior an agent needs to avoid misusing it as a messaging tool.

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

Conciseness4/5

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

Front-loaded WHAT/USE/DOES NOT/NEXT structure with zero filler sentences; every clause earns its place. The telegraphic label style is dense but readable, at most slightly clipped for less common terms like mapsEmail.

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

Completeness4/5

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

With an output schema present, return-value documentation is unnecessary, and the description covers payload contents, negative scope, and next-step routing for a read-only one-param tool. The only omission is any mention of the locale behavior, which the schema already handles, so nothing critical is missing.

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

Parameters3/5

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

Schema description coverage is 100% and the single locale parameter is documented in exhaustive detail inside the schema (German-only, ignored values, www multi-locale pointer). The description adds nothing about locale, so the baseline 3 applies — the schema carries this dimension entirely.

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

Purpose5/5

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

States a specific verb+resource and enumerates the exact payload (mobile, landline, fax, email, mapsEmail, WhatsApp, address, office coords), so an agent knows precisely what it retrieves. The 'DOES NOT' clause and the NEXT routing to compose_* siblings distinguish it from adjacent tools without opening any schema.

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

Usage Guidelines5/5

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

Explicit when-to-use ('USE for call/WhatsApp/mail CTAs'), explicit exclusions ('DOES NOT open tickets or send messages'), and named alternatives (compose_tel_mobile, compose_whatsapp, compose_mailto, list_whatsapp_options). Nothing is left to inference about when this tool is the right pick.

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

get_datenschutzGet DatenschutzA
Read-only
Inspect

WHAT: Returns only a URL to www Datenschutz — not the privacy-policy body. USE when the user asks for Datenschutz while on maps and you only need the link. Prefer www MCP get_datenschutz or get_legal for the corpus. DOES NOT invent privacy clauses.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

Output Schema

ParametersJSON Schema
NameRequiredDescription
okYestrue = use summary, canonicalUrl, and extra keys. false = do not invent data; read error + hint and retry with valid args or open hint.
npmNowww CLI package @ikeytz/mcp
hintNoPresent when ok=false. Absolute URL or short recovery hint the agent should open or pass to another tool.
htmlNoAbsolute www.ikeytz.com URL — open there or call @ikeytz/mcp
noteNomaps only points; Volltext/Preise/FAQ live on www
toolYesEcho of the tool name that produced this object (e.g. get_service_area).
errorNoPresent when ok=false. Codes include: unknown_place, unknown_discovery, unknown_doc, q_required, plz_required, coords_required, outside_service_area, url_required, not_maps_host, bad_url, path_or_url_required, serp_not_found, slug_or_coords_required, path_required.
localeNoLocale actually used for URLs. maps is German-only: always de (MAPS-E8 — no /en on maps). Requested non-de is ignored; payload locale=de.
relatedNoAlways includes https://maps.ikeytz.com/llms.txt.
summaryNoPrimary text for the model. For discovery tools this is the file window. For list tools a compact one-liner. Quote with attribution.
www_mcpNohttps://www.ikeytz.com/mcp — sister machine for prices/FAQ/corpus
www_toolNoSame tool name on www MCP that holds the real payload
attributionYesRequired citation: 'Quelle: Schlüsseldienst Ludwigsburg ikeytz (ikeytz.com) · ai-train=no · https://maps.ikeytz.com/.well-known/ai.txt'
canonicalUrlNoBest URL to show the user: https://maps.ikeytz.com… page, public embed JSON, tel:+49…, mailto:…, https://wa.me/…, or a www pointer. Prefer this over constructing URLs.
requested_localeNoLocale the caller asked for; maps still returns locale=de

TDQS

A4.4/5.0
Behavior4/5

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

Annotations already declare readOnlyHint=true, so the safety profile is covered. The description adds genuinely useful behavioral detail beyond that: it returns only a URL and not the policy body, and it 'DOES NOT invent privacy clauses,' which tells the agent not to synthesize content. Auth/rate-limit behavior is unspecified but unimportant for a read-only URL lookup.

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

Conciseness4/5

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

The WHAT/USE/DOES-NOT structure front-loads the essential fact (URL only, not the body) and each sentence carries information. The repeated 'www' qualifier and the terse 'www Datenschutz' phrasing are slightly opaque, but nothing is padded.

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

Completeness5/5

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

With an output schema present, the description needn't enumerate return values, and it already states the return is a URL. For a zero-parameter, read-only lookup with annotations covering safety, the agent has everything needed to select and call it correctly.

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

Parameters4/5

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

The tool takes zero parameters, which is the baseline-4 case. The schema itself states no arguments are accepted and that extra keys are ignored, so no additional parameter explanation is required from the description.

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

Purpose5/5

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

States a specific verb and resource ('Returns only a URL to www Datenschutz') and explicitly bounds the scope by negating the privacy-policy body. This lets an agent distinguish it from sibling legal-page getters like get_legal and get_impressum without opening any schema.

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

Usage Guidelines4/5

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

Gives explicit when-to-use ('user asks for Datenschutz while on maps and you only need the link') and names alternatives ('Prefer www MCP get_datenschutz or get_legal for the corpus'). The only weakness is that the referenced 'www MCP get_datenschutz' is a same-named tool on a different server, which is ambiguous routing information rather than a clean sibling pointer.

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

get_discoveryGet Discovery
Read-only
Inspect

WHAT: 1:1 mirror of a maps discovery file (UTF-8 text/JSON). summary ≡ line window + trailing # MCP-META (truncated, totalUrls, nextOffset) — not a one-line stub. which is required — common ids: ard, ai-catalog, ai-txt, ai-plugin, answer-engine, agent-skills, llms, llms-full, llms-index, llms-keywords, llms-serp, llms-jsonld, llms-navigation, llms-impressum-kontakt, llms-orte-geo, llms-grenzen-koordinaten, llms-urheberrecht, llms-copyright, llms-mcp-server, llms-mcp-web, robots, sitemap-txt, sitemap-xml. Omit limit: if remaining >~30KB → first ~30KB window + nextOffset (O9); explicit limit keeps line window 1..10000 (not forced to 30KB). USE for agent-ready catalogs and robots/sitemap. DOES NOT invent missing files (missing=true). NEXT: find_by_keyword / find_by_serp for structured search; get_llms_txt / get_ai_txt aliases.

ParametersJSON Schema
NameRequiredDescriptionDefault
limitNoMaximum number of lines to return after offset. Omit or null = if remaining payload ≤~30KB return all remaining lines; if larger, return first ~30KB window + nextOffset (O9). Explicit limit keeps 1..10000 line window (MCP caps unchanged — not forced to 30KB). Meta also as trailing # MCP-META lines in summary.
whichYesRequired discovery id. Examples: ard, ai-catalog, ai-txt, ai-plugin, answer-engine, agent-skills, llms, llms-full, llms-index, llms-keywords, llms-serp, llms-jsonld, llms-navigation, llms-impressum-kontakt, llms-orte-geo, llms-grenzen-koordinaten, llms-urheberrecht, llms-copyright, llms-mcp-server, llms-mcp-web, robots, sitemap-txt, sitemap-xml.
offsetNo0-based index into a list or discovery file lines (split on \n). 0 = first. Omit = 0. Combine with limit to page. Use nextOffset / offset+limit from a previous result when present.

Output Schema

ParametersJSON Schema
NameRequiredDescription
okYestrue = use summary, canonicalUrl, and extra keys. false = do not invent data; read error + hint and retry with valid args or open hint.
hintNoPresent when ok=false. Absolute URL or short recovery hint the agent should open or pass to another tool.
pathNoPublic relative path of the file on maps
textNoUTF-8 line window (file body before # MCP-META). Same bytes as summary without meta trailer.
toolYesEcho of the tool name that produced this object (e.g. get_service_area).
errorNoPresent when ok=false. Codes include: unknown_place, unknown_discovery, unknown_doc, q_required, plz_required, coords_required, outside_service_area, url_required, not_maps_host, bad_url, path_or_url_required, serp_not_found, slug_or_coords_required, path_required.
limitNoApplied line limit, or null if omitted
whichNoResolved discovery id (ard, ai-catalog, llms, robots, sitemap-txt, llms-mcp-server, …).
localeNoLocale actually used for URLs. maps is German-only: always de (MAPS-E8 — no /en on maps). Requested non-de is ignored; payload locale=de.
offsetNoApplied 0-based line offset
missingNotrue if the discovery file was not found on disk
relatedNoAlways includes https://maps.ikeytz.com/llms.txt.
summaryNoPrimary text for the model. For discovery tools this is the file window. For list tools a compact one-liner. Quote with attribution.
totalUrlsNohttp(s) lines in the full file
truncatedNotrue if offset+limit left more lines. Also in trailing # MCP-META.
nextOffsetNoPass as next offset when truncated; else null. Also in # MCP-META.
totalBytesNoFull discovery file size in bytes (UTF-8). Also in trailing # MCP-META.
totalCharsNoFull discovery file character length before offset/limit. Also in # MCP-META.
totalLinesNoAlias of total_lines
attributionYesRequired citation: 'Quelle: Schlüsseldienst Ludwigsburg ikeytz (ikeytz.com) · ai-train=no · https://maps.ikeytz.com/.well-known/ai.txt'
total_linesNoLine count of the full file
canonicalUrlNoBest URL to show the user: https://maps.ikeytz.com… page, public embed JSON, tel:+49…, mailto:…, https://wa.me/…, or a www pointer. Prefer this over constructing URLs.
returnedUrlsNohttp(s) lines in this window
bytesReturnedNoUTF-8 length of text window
returnedLinesNoLines in this window (before # MCP-META)
fetchTruncatedNotrue if a load cap cut the file before paging (www Cap). maps reads full from disk → always false.
get_embed_mapGet Embed MapA
Read-only
Inspect

WHAT: Canonical map page URL https://maps.ikeytz.com/{slug} for iframe/src and Visitenkarte. Lookup slug|plz|name. RETURNS area card + maps_nav + neighbors (MAPS-IL1/IL2) + canonicalUrl. USE for embedding or linking a Gebiet map. NEXT: get_geo_api, get_grenze, get_lage, get_service_area.

ParametersJSON Schema
NameRequiredDescriptionDefault
plzNoGerman postcode (PLZ). Several Gebiete can share one PLZ (e.g. 71638). For single lookup first match wins; use find_by_plz for all matches.
nameNoGerman place name substring (case-insensitive, umlauts ok), e.g. Grünbühl, Pattonville. Used when slug/plz omitted.
slugNoURL slug of one of the 52 Einsatzgebiete, e.g. pattonville, bietigheim-bissingen, walheim, gruenbuehl. Matches https://maps.ikeytz.com/{slug}. Lookup order when combined with plz/name: slug first.

Output Schema

ParametersJSON Schema
NameRequiredDescription
okYestrue = use summary, canonicalUrl, and extra keys. false = do not invent data; read error + hint and retry with valid args or open hint.
latNo
lngNo
plzNo
hintNoPresent when ok=false. Absolute URL or short recovery hint the agent should open or pass to another tool.
nameNo
slugNo
toolYesEcho of the tool name that produced this object (e.g. get_service_area).
errorNoPresent when ok=false. Codes include: unknown_place, unknown_discovery, unknown_doc, q_required, plz_required, coords_required, outside_service_area, url_required, not_maps_host, bad_url, path_or_url_required, serp_not_found, slug_or_coords_required, path_required.
localeNoLocale actually used for URLs. maps is German-only: always de (MAPS-E8 — no /en on maps). Requested non-de is ignored; payload locale=de.
geo_apiNo
relatedNoAlways includes https://maps.ikeytz.com/llms.txt.
summaryNoPrimary text for the model. For discovery tools this is the file window. For list tools a compact one-liner. Quote with attribution.
maps_navNoMAPS-IL1 mini-chrome URLs
embed_mapNo
neighborsNoUp to 5 nearest Gebiete
attributionYesRequired citation: 'Quelle: Schlüsseldienst Ludwigsburg ikeytz (ikeytz.com) · ai-train=no · https://maps.ikeytz.com/.well-known/ai.txt'
canonicalUrlNoBest URL to show the user: https://maps.ikeytz.com… page, public embed JSON, tel:+49…, mailto:…, https://wa.me/…, or a www pointer. Prefer this over constructing URLs.

TDQS

A3.6/5.0
Behavior3/5

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

Annotations only declare readOnlyHint=true, so the description carries the rest; it discloses the returned payload shape (area card, maps_nav, neighbors, canonicalUrl) and the slug-first lookup precedence. However, since an output schema already exists, the RETURNS block largely restates structured data, and nothing is said about failure behaviour when a slug/plz/name matches nothing.

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

Conciseness4/5

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

Front-loaded WHAT/RETURNS/USE/NEXT structure with no filler sentences. Slightly telegraphic jargon (Visitenkarte, MAPS-IL1/IL2) costs a little clarity but keeps it short.

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

Completeness4/5

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

For a read-only slug resolver with a full schema and an output schema, the definition covers purpose, parameters, return shape, and next steps. The main missing piece is what happens on a failed lookup and whether any of the three lookup keys is preferred when the caller supplies none.

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

Parameters3/5

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

Schema description coverage is 100% and the schema itself already documents PLZ ambiguity, name substring matching, and slug-first lookup order. The description's 'Lookup slug|plz|name' adds only a compact restatement, so the baseline 3 applies.

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

Purpose4/5

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

Names a specific verb+resource (returns the canonical map page URL for a Gebiet) and pins the scope to iframe/src embedding and Visitenkarte use. It partially differentiates from siblings by listing follow-up tools (get_geo_api, get_grenze, get_lage, get_service_area), though it never contrasts itself with the near neighbour resolve_maps_url.

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

Usage Guidelines4/5

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

Explicit 'USE for embedding or linking a Gebiet map' gives a clear activation condition, and the 'NEXT:' chain routes the agent onward. It lacks an explicit when-not rule (e.g. versus resolve_maps_url or find_by_gebiet), so it stops short of full alternative routing.

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

get_emergencyGet EmergencyA
Read-only
Inspect

WHAT: Returns only a URL to the www Notfall-Türöffnung page — not a dispatch. USE for emergency lockout context on maps when you only need the link. Prefer maps get_contact or compose_tel_mobile for phone CTAs here; prefer www MCP get_emergency for the full Notfall body. Optional locale selects the www URL language only. DOES NOT dispatch technicians or claim a van was sent.

ParametersJSON Schema
NameRequiredDescriptionDefault
localeNomaps is German-only (de). Omit or pass de. Other values are ignored; URLs stay https://maps.ikeytz.com/… with no locale prefix. Not a www multi-locale switch — use @ikeytz/mcp list_locales on www for en|fr|ru|fa|ar|tr.de

Output Schema

ParametersJSON Schema
NameRequiredDescription
okYestrue = use summary, canonicalUrl, and extra keys. false = do not invent data; read error + hint and retry with valid args or open hint.
npmNowww CLI package @ikeytz/mcp
hintNoPresent when ok=false. Absolute URL or short recovery hint the agent should open or pass to another tool.
htmlNoAbsolute www.ikeytz.com URL — open there or call @ikeytz/mcp
noteNomaps only points; Volltext/Preise/FAQ live on www
toolYesEcho of the tool name that produced this object (e.g. get_service_area).
errorNoPresent when ok=false. Codes include: unknown_place, unknown_discovery, unknown_doc, q_required, plz_required, coords_required, outside_service_area, url_required, not_maps_host, bad_url, path_or_url_required, serp_not_found, slug_or_coords_required, path_required.
localeNoLocale actually used for URLs. maps is German-only: always de (MAPS-E8 — no /en on maps). Requested non-de is ignored; payload locale=de.
relatedNoAlways includes https://maps.ikeytz.com/llms.txt.
summaryNoPrimary text for the model. For discovery tools this is the file window. For list tools a compact one-liner. Quote with attribution.
www_mcpNohttps://www.ikeytz.com/mcp — sister machine for prices/FAQ/corpus
www_toolNoSame tool name on www MCP that holds the real payload
attributionYesRequired citation: 'Quelle: Schlüsseldienst Ludwigsburg ikeytz (ikeytz.com) · ai-train=no · https://maps.ikeytz.com/.well-known/ai.txt'
canonicalUrlNoBest URL to show the user: https://maps.ikeytz.com… page, public embed JSON, tel:+49…, mailto:…, https://wa.me/…, or a www pointer. Prefer this over constructing URLs.
requested_localeNoLocale the caller asked for; maps still returns locale=de

TDQS

A4.4/5.0
Behavior4/5

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

With only readOnlyHint in annotations, the description carries the extra burden and does add real context: no dispatch, no van claim, and it returns a URL only. Some of that is restated twice ('not a dispatch' vs 'DOES NOT dispatch technicians'), so it earns a 4 rather than a 5.

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

Conciseness4/5

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

The WHAT/USE/DOES NOT structure is front-loaded and scannable, and each clause mostly earns its place. Minor redundancy between 'not a dispatch' and 'DOES NOT dispatch technicians' keeps it from a 5.

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

Completeness5/5

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

The tool is simple (one optional enum param, output schema present, readOnlyHint annotation), and the description covers what it returns, what it does not do, and which siblings to use instead. 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.

Parameters3/5

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

Schema coverage is 100% and the locale parameter already carries a detailed enum/default description, so the schema does the heavy lifting. The description only adds that locale selects the 'www URL language only', which is marginal value over the schema.

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

Purpose5/5

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

States a specific verb and resource: returns a URL to the www Notfall-Türöffnung page, explicitly narrowing scope to the link rather than an action or dispatch. It also distinguishes itself from siblings by noting it is not a dispatch and by naming alternate tools for alternate needs.

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

Usage Guidelines5/5

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

Explicitly gives when to use it ('emergency lockout context on maps when you only need the link') and names concrete alternatives with conditions: get_contact or compose_tel_mobile for phone CTAs, www get_emergency for the full Notfall body. Nothing is left to inference.

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

get_faqGet FaqA
Read-only
Inspect

Returns only a maps HTML hand-off to www /faq (optional id/q are for www symmetry, not answered here). Does not return the FAQ answer body. USE when the user asks one FAQ while on maps; use list_faq for the hub. Prefer www MCP get_faq({id}|{q}) for the real answer. NEXT: www get_faq.

ParametersJSON Schema
NameRequiredDescriptionDefault
qNoFAQ question search on www
idNoFAQ id on www
localeNomaps is German-only (de). Omit or pass de. Other values are ignored; URLs stay https://maps.ikeytz.com/… with no locale prefix. Not a www multi-locale switch — use @ikeytz/mcp list_locales on www for en|fr|ru|fa|ar|tr.de

Output Schema

ParametersJSON Schema
NameRequiredDescription
okYestrue = use summary, canonicalUrl, and extra keys. false = do not invent data; read error + hint and retry with valid args or open hint.
npmNowww CLI package @ikeytz/mcp
hintNoPresent when ok=false. Absolute URL or short recovery hint the agent should open or pass to another tool.
htmlNoAbsolute www.ikeytz.com URL — open there or call @ikeytz/mcp
noteNomaps only points; Volltext/Preise/FAQ live on www
toolYesEcho of the tool name that produced this object (e.g. get_service_area).
errorNoPresent when ok=false. Codes include: unknown_place, unknown_discovery, unknown_doc, q_required, plz_required, coords_required, outside_service_area, url_required, not_maps_host, bad_url, path_or_url_required, serp_not_found, slug_or_coords_required, path_required.
localeNoLocale actually used for URLs. maps is German-only: always de (MAPS-E8 — no /en on maps). Requested non-de is ignored; payload locale=de.
relatedNoAlways includes https://maps.ikeytz.com/llms.txt.
summaryNoPrimary text for the model. For discovery tools this is the file window. For list tools a compact one-liner. Quote with attribution.
www_mcpNohttps://www.ikeytz.com/mcp — sister machine for prices/FAQ/corpus
www_toolNoSame tool name on www MCP that holds the real payload
attributionYesRequired citation: 'Quelle: Schlüsseldienst Ludwigsburg ikeytz (ikeytz.com) · ai-train=no · https://maps.ikeytz.com/.well-known/ai.txt'
canonicalUrlNoBest URL to show the user: https://maps.ikeytz.com… page, public embed JSON, tel:+49…, mailto:…, https://wa.me/…, or a www pointer. Prefer this over constructing URLs.
requested_localeNoLocale the caller asked for; maps still returns locale=de

TDQS

A4.2/5.0
Behavior4/5

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

Beyond the readOnlyHint=true annotation, it discloses that the tool does not return the answer body and that id/q are present only for www symmetry and are not answered here — non-obvious behavior an agent would otherwise get wrong. It stops short of describing the hand-off payload's shape or any latency/rate behavior, so not a full 5.

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

Conciseness4/5

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

Short and front-loaded with what is returned before the routing advice. Minor waste: 'NEXT: www get_faq' largely repeats the earlier 'Prefer www MCP get_faq({id}|{q})' instruction, and the telegraphic fragments slightly hurt readability.

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

Completeness4/5

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

An output schema exists, so return values need not be described, and the annotations cover the safety profile. The description supplies the missing conceptual framing (this is a stub/hand-off, not an answer provider) plus the next step, leaving little an agent needs to call it correctly.

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

Parameters4/5

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

Schema coverage is 100%, so the schema already carries the parameter docs. The description adds meaning beyond the schema by warning that the optional id/q parameters are inert on this endpoint ('not answered here'), which corrects the schema's misleading 'FAQ question search on www' wording.

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

Purpose4/5

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

The description states a specific and unusual purpose: it returns only a maps HTML hand-off to www /faq and explicitly does not return the FAQ answer body. It also differentiates itself from siblings by naming list_faq (hub) and www MCP get_faq (real answer). The phrasing is somewhat garbled ('Returns only a maps HTML hand-off to www /faq'), but the scope is ascertainable.

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

Usage Guidelines5/5

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

It gives an explicit trigger ('USE when the user asks one FAQ while on maps'), an explicit non-trigger alternative ('use list_faq for the hub'), and a preferred alternative with argument syntax ('Prefer www MCP get_faq({id}|{q}) for the real answer'). Routing is unambiguous.

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

get_geo_apiGet Geo Api
Read-only
Inspect

WHAT: Public Geo-API URL pointers for one Einsatzgebiet. Ort JSON: https://maps.ikeytz.com/api/v1/embed/ort/{slug}. Grenze GeoJSON: …/grenze. Punkt GeoJSON: …/punkt. Sammel: /api/v1/embed/orte · /orte/grenzen · /orte/punkte. Lookup slug|plz|name. RETURNS geo_api, grenze_api, punkt_api, Sammel URLs + area card; MCP payload is not the polygon. USE to fetch/open public JSON/GeoJSON. NEXT: get_grenze for polygon inside MCP, or GET grenze_api / punkt_api.

ParametersJSON Schema
NameRequiredDescriptionDefault
plzNoGerman postcode (PLZ). Several Gebiete can share one PLZ (e.g. 71638). For single lookup first match wins; use find_by_plz for all matches.
nameNoGerman place name substring (case-insensitive, umlauts ok), e.g. Grünbühl, Pattonville. Used when slug/plz omitted.
slugNoURL slug of one of the 52 Einsatzgebiete, e.g. pattonville, bietigheim-bissingen, walheim, gruenbuehl. Matches https://maps.ikeytz.com/{slug}. Lookup order when combined with plz/name: slug first.

Output Schema

ParametersJSON Schema
NameRequiredDescription
okYestrue = use summary, canonicalUrl, and extra keys. false = do not invent data; read error + hint and retry with valid args or open hint.
latNo
lngNo
plzNo
hintNoPresent when ok=false. Absolute URL or short recovery hint the agent should open or pass to another tool.
nameNo
noteNoPublic JSON/GeoJSON pointers; use get_grenze for polygon in MCP
slugNo
toolYesEcho of the tool name that produced this object (e.g. get_service_area).
errorNoPresent when ok=false. Codes include: unknown_place, unknown_discovery, unknown_doc, q_required, plz_required, coords_required, outside_service_area, url_required, not_maps_host, bad_url, path_or_url_required, serp_not_found, slug_or_coords_required, path_required.
localeNoLocale actually used for URLs. maps is German-only: always de (MAPS-E8 — no /en on maps). Requested non-de is ignored; payload locale=de.
geo_apiNo
relatedNoAlways includes https://maps.ikeytz.com/llms.txt.
summaryNoPrimary text for the model. For discovery tools this is the file window. For list tools a compact one-liner. Quote with attribution.
orte_apiNo
embed_mapNo
punkt_apiNo
grenze_apiNo
attributionYesRequired citation: 'Quelle: Schlüsseldienst Ludwigsburg ikeytz (ikeytz.com) · ai-train=no · https://maps.ikeytz.com/.well-known/ai.txt'
canonicalUrlNoBest URL to show the user: https://maps.ikeytz.com… page, public embed JSON, tel:+49…, mailto:…, https://wa.me/…, or a www pointer. Prefer this over constructing URLs.
orte_punkte_apiNo
orte_grenzen_apiNo
get_geo_officeGet Geo Office
Read-only
Inspect

WHO/WHAT: Gewerbesitz (registered office) pin on maps.ikeytz.com/buero. walkIn=false always — mobile locksmith, not a shop counter. RETURNS street, postal, city, lat, lng, google_maps/icbm (same 'lat, lng' string), embed_map, geo_api (/api/v1/embed/office), note, walkIn. USE for NAP/schema or Footer iframe. DOES NOT accept walk-in customers or bookings. NEXT: get_contact, distance_to_office, get_business_identity.

ParametersJSON Schema
NameRequiredDescriptionDefault
localeNomaps is German-only (de). Omit or pass de. Other values are ignored; URLs stay https://maps.ikeytz.com/… with no locale prefix. Not a www multi-locale switch — use @ikeytz/mcp list_locales on www for en|fr|ru|fa|ar|tr.de

Output Schema

ParametersJSON Schema
NameRequiredDescription
okYestrue = use summary, canonicalUrl, and extra keys. false = do not invent data; read error + hint and retry with valid args or open hint.
latNoOffice latitude
lngNoOffice longitude
cityNoCity
hintNoPresent when ok=false. Absolute URL or short recovery hint the agent should open or pass to another tool.
icbmNoICBM string (same as google_maps)
noteNoBüro · kein Kundenverkehr vor Ort
toolYesEcho of the tool name that produced this object (e.g. get_service_area).
errorNoPresent when ok=false. Codes include: unknown_place, unknown_discovery, unknown_doc, q_required, plz_required, coords_required, outside_service_area, url_required, not_maps_host, bad_url, path_or_url_required, serp_not_found, slug_or_coords_required, path_required.
localeNoLocale actually used for URLs. maps is German-only: always de (MAPS-E8 — no /en on maps). Requested non-de is ignored; payload locale=de.
postalNoPostal code
streetNoOffice street
walkInNoAlways false — no shop counter
geo_apiNohttps://maps.ikeytz.com/api/v1/embed/office
relatedNoAlways includes https://maps.ikeytz.com/llms.txt.
summaryNoPrimary text for the model. For discovery tools this is the file window. For list tools a compact one-liner. Quote with attribution.
embed_mapNohttps://maps.ikeytz.com/buero
attributionYesRequired citation: 'Quelle: Schlüsseldienst Ludwigsburg ikeytz (ikeytz.com) · ai-train=no · https://maps.ikeytz.com/.well-known/ai.txt'
google_mapsNo'lat, lng'
canonicalUrlNoBest URL to show the user: https://maps.ikeytz.com… page, public embed JSON, tel:+49…, mailto:…, https://wa.me/…, or a www pointer. Prefer this over constructing URLs.
get_geschichteGet GeschichteA
Read-only
Inspect

WHAT: Geschichte (history) text for one Einsatzgebiet Visitenkarte. Lookup slug|plz|name. RETURNS slug, name, geschichte. USE for place history prose on the map page. NEXT: get_lage, get_ai_page.

ParametersJSON Schema
NameRequiredDescriptionDefault
plzNoGerman postcode (PLZ). Several Gebiete can share one PLZ (e.g. 71638). For single lookup first match wins; use find_by_plz for all matches.
nameNoGerman place name substring (case-insensitive, umlauts ok), e.g. Grünbühl, Pattonville. Used when slug/plz omitted.
slugNoURL slug of one of the 52 Einsatzgebiete, e.g. pattonville, bietigheim-bissingen, walheim, gruenbuehl. Matches https://maps.ikeytz.com/{slug}. Lookup order when combined with plz/name: slug first.

Output Schema

ParametersJSON Schema
NameRequiredDescription
okYestrue = use summary, canonicalUrl, and extra keys. false = do not invent data; read error + hint and retry with valid args or open hint.
hintNoPresent when ok=false. Absolute URL or short recovery hint the agent should open or pass to another tool.
nameNo
slugNo
toolYesEcho of the tool name that produced this object (e.g. get_service_area).
errorNoPresent when ok=false. Codes include: unknown_place, unknown_discovery, unknown_doc, q_required, plz_required, coords_required, outside_service_area, url_required, not_maps_host, bad_url, path_or_url_required, serp_not_found, slug_or_coords_required, path_required.
localeNoLocale actually used for URLs. maps is German-only: always de (MAPS-E8 — no /en on maps). Requested non-de is ignored; payload locale=de.
relatedNoAlways includes https://maps.ikeytz.com/llms.txt.
summaryNoPrimary text for the model. For discovery tools this is the file window. For list tools a compact one-liner. Quote with attribution.
geschichteNoGeschichte prose (may be empty)
attributionYesRequired citation: 'Quelle: Schlüsseldienst Ludwigsburg ikeytz (ikeytz.com) · ai-train=no · https://maps.ikeytz.com/.well-known/ai.txt'
canonicalUrlNoBest URL to show the user: https://maps.ikeytz.com… page, public embed JSON, tel:+49…, mailto:…, https://wa.me/…, or a www pointer. Prefer this over constructing URLs.

TDQS

A4.1/5.0
Behavior3/5

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

Annotations declare readOnlyHint=true, so the safety profile is already covered, lowering the bar. The description adds the return field set (slug, name, geschichte) which is useful, but nothing about fallback behavior, error handling when no match is found, or how single-lookup first-match behaves (though schema covers some of this). Adequate but not rich.

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

Conciseness5/5

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

Uses a WHAT/RETURNS/USE/NEXT structure that is front-loaded and scannable. Every clause is functional and there is no filler.

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

Completeness5/5

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

An output schema exists, so return values needn't be explained in depth; the description still summarizes them. With readOnlyHint annotations covering safety, 100% schema coverage, and explicit next-step routing, an agent has everything needed to call this correctly.

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

Parameters3/5

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

Schema coverage is 100% with detailed descriptions including lookup order (slug first), e.g. values, and multi-match behavior. The description only names the lookup keys ('slug|plz|name') without adding meaning beyond the schema. Baseline 3 is correct when schema does the heavy lifting.

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

Purpose5/5

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

States a specific verb (lookup/retrieve) and resource (Geschichte text for one Einsatzgebiet Visitenkarte), with the lookup key stated explicitly. Clearly distinguishable from siblings like get_lage and get_ai_page, which it explicitly names as next steps.

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

Usage Guidelines4/5

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

Explicitly states the use case ('USE for place history prose on the map page') and points to next tools (get_lage, get_ai_page). It doesn't state when NOT to use it or contrast with alternatives like get_wissen_entry or get_ai_page for prose content, which would be a 5.

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

get_grenzeGet Grenze
Read-only
Inspect

WHAT: OSM Gebietspolygon for one Einsatzgebiet as GeoJSON FeatureCollection inside the MCP result. Same geometry as public GET https://maps.ikeytz.com/api/v1/embed/ort/{slug}/grenze (application/geo+json). Lookup slug|plz|name. RETURNS hasPolygon, polygon, point, osmRelationId/osmWayId, via, grenze_api, punkt_api. USE when the agent needs the boundary geometry. DOES NOT replace get_geo_api (URL pointers) or get_grenze_koordinaten (full embed blob). NEXT: get_grenze_koordinaten, get_lage, get_embed_map.

ParametersJSON Schema
NameRequiredDescriptionDefault
plzNoGerman postcode (PLZ). Several Gebiete can share one PLZ (e.g. 71638). For single lookup first match wins; use find_by_plz for all matches.
nameNoGerman place name substring (case-insensitive, umlauts ok), e.g. Grünbühl, Pattonville. Used when slug/plz omitted.
slugNoURL slug of one of the 52 Einsatzgebiete, e.g. pattonville, bietigheim-bissingen, walheim, gruenbuehl. Matches https://maps.ikeytz.com/{slug}. Lookup order when combined with plz/name: slug first.

Output Schema

ParametersJSON Schema
NameRequiredDescription
okYestrue = use summary, canonicalUrl, and extra keys. false = do not invent data; read error + hint and retry with valid args or open hint.
latNo
lngNo
plzNo
viaNoFetch path hint
hintNoPresent when ok=false. Absolute URL or short recovery hint the agent should open or pass to another tool.
nameNo
slugNo
toolYesEcho of the tool name that produced this object (e.g. get_service_area).
errorNoPresent when ok=false. Codes include: unknown_place, unknown_discovery, unknown_doc, q_required, plz_required, coords_required, outside_service_area, url_required, not_maps_host, bad_url, path_or_url_required, serp_not_found, slug_or_coords_required, path_required.
pointNoPoint feature or null
localeNoLocale actually used for URLs. maps is German-only: always de (MAPS-E8 — no /en on maps). Requested non-de is ignored; payload locale=de.
geo_apiNo
polygonNoGeoJSON FeatureCollection (may be empty)
relatedNoAlways includes https://maps.ikeytz.com/llms.txt.
summaryNoPrimary text for the model. For discovery tools this is the file window. For list tools a compact one-liner. Quote with attribution.
osmWayIdNoOSM way id if any
hasPolygonNotrue if polygon.features length > 0
attributionYesRequired citation: 'Quelle: Schlüsseldienst Ludwigsburg ikeytz (ikeytz.com) · ai-train=no · https://maps.ikeytz.com/.well-known/ai.txt'
canonicalUrlNoBest URL to show the user: https://maps.ikeytz.com… page, public embed JSON, tel:+49…, mailto:…, https://wa.me/…, or a www pointer. Prefer this over constructing URLs.
osmRelationIdNoOSM relation id if any
get_grenze_koordinatenGet Grenze Koordinaten
Read-only
Inspect

WHAT: Full public Ort-Embed JSON for one Einsatzgebiet — same fields as GET https://maps.ikeytz.com/api/v1/embed/ort/{slug} (part=full): phone/NAP, style, point, featureCollection (Polygon+Punkt), OSM ids, embed paths (ort/grenze/punkt), iframe. Separate GeoJSON also at …/grenze and …/punkt; Sammel /api/v1/embed/orte/grenzen and /orte/punkte. No separate polygon/points keys (L-16). Lookup slug|plz|name. USE when the agent needs coordinates+boundary+NAP in one MCP call. DOES NOT change the HTTP embed API. DOES NOT replace slim get_grenze (polygon-only) or get_geo_api (URL pointers). NEXT: get_grenze, get_contact, get_embed_map.

ParametersJSON Schema
NameRequiredDescriptionDefault
plzNoGerman postcode (PLZ). Several Gebiete can share one PLZ (e.g. 71638). For single lookup first match wins; use find_by_plz for all matches.
nameNoGerman place name substring (case-insensitive, umlauts ok), e.g. Grünbühl, Pattonville. Used when slug/plz omitted.
slugNoURL slug of one of the 52 Einsatzgebiete, e.g. pattonville, bietigheim-bissingen, walheim, gruenbuehl. Matches https://maps.ikeytz.com/{slug}. Lookup order when combined with plz/name: slug first.

Output Schema

ParametersJSON Schema
NameRequiredDescription
okYestrue = use summary, canonicalUrl, and extra keys. false = do not invent data; read error + hint and retry with valid args or open hint.
latNo
lngNo
plzNo
viaNo
hintNoPresent when ok=false. Absolute URL or short recovery hint the agent should open or pass to another tool.
hrefNowww keyword page
icbmNo
nameNo
partNoAlways full
slugNo
toolYesEcho of the tool name that produced this object (e.g. get_service_area).
colorNo
errorNoPresent when ok=false. Codes include: unknown_place, unknown_discovery, unknown_doc, q_required, plz_required, coords_required, outside_service_area, url_required, not_maps_host, bad_url, path_or_url_required, serp_not_found, slug_or_coords_required, path_required.
phoneNoNAP block (mobile, landline, fax, email, address, …)
pointNo
storeNo
styleNoMapLibre-ish style colors
gruppeNo
iframeNo
localeNoLocale actually used for URLs. maps is German-only: always de (MAPS-E8 — no /en on maps). Requested non-de is ignored; payload locale=de.
pointsNoGeoJSON FeatureCollection
polygonNoGeoJSON FeatureCollection (polygons only)
purposeNo
relatedNoAlways includes https://maps.ikeytz.com/llms.txt.
summaryNoPrimary text for the model. For discovery tools this is the file window. For list tools a compact one-liner. Quote with attribution.
osmWayIdNo
hasPolygonNo
attributionYesRequired citation: 'Quelle: Schlüsseldienst Ludwigsburg ikeytz (ikeytz.com) · ai-train=no · https://maps.ikeytz.com/.well-known/ai.txt'
countPointsNo
embedPublicNoPublic relative embed path /api/v1/embed/ort/{slug}
geoPositionNolat;lng
canonicalUrlNoBest URL to show the user: https://maps.ikeytz.com… page, public embed JSON, tel:+49…, mailto:…, https://wa.me/…, or a www pointer. Prefer this over constructing URLs.
countPolygonsNo
osmRelationIdNo
hasPolygonKnownNo
featureCollectionNoPolygon + point FeatureCollection
get_hubGet HubA
Read-only
Inspect

WHAT: maps hub card https://maps.ikeytz.com/ — title/h1 + 52 Gebiet links (not a single Visitenkarte). Call with {}. USE as the maps landing overview. DOES NOT include www prices. NEXT: get_service_area, list_service_areas.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

Output Schema

ParametersJSON Schema
NameRequiredDescription
h1NoHub H1
okYestrue = use summary, canonicalUrl, and extra keys. false = do not invent data; read error + hint and retry with valid args or open hint.
hintNoPresent when ok=false. Absolute URL or short recovery hint the agent should open or pass to another tool.
toolYesEcho of the tool name that produced this object (e.g. get_service_area).
countNo52
errorNoPresent when ok=false. Codes include: unknown_place, unknown_discovery, unknown_doc, q_required, plz_required, coords_required, outside_service_area, url_required, not_maps_host, bad_url, path_or_url_required, serp_not_found, slug_or_coords_required, path_required.
itemsNoslug/name/embed_map rows
titleNoHub title
localeNoLocale actually used for URLs. maps is German-only: always de (MAPS-E8 — no /en on maps). Requested non-de is ignored; payload locale=de.
relatedNoAlways includes https://maps.ikeytz.com/llms.txt.
summaryNoPrimary text for the model. For discovery tools this is the file window. For list tools a compact one-liner. Quote with attribution.
attributionYesRequired citation: 'Quelle: Schlüsseldienst Ludwigsburg ikeytz (ikeytz.com) · ai-train=no · https://maps.ikeytz.com/.well-known/ai.txt'
canonicalUrlNoBest URL to show the user: https://maps.ikeytz.com… page, public embed JSON, tel:+49…, mailto:…, https://wa.me/…, or a www pointer. Prefer this over constructing URLs.

TDQS

A4.3/5.0
Behavior4/5

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

readOnlyHint=true already covers the safety profile, and the description adds real behavioral context: the payload shape (title/h1 + 52 Gebiet links), the scope boundary (no www prices), and the required empty call. The output schema carries the return structure, so nothing material is missing.

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

Conciseness4/5

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

Telegraphic WHAT/USE/NEXT structure is front-loaded and every fragment earns its place, but the keyword-caps style and the redundant "Call with {}" (already in the schema) cost a point against a clean 5.

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

Completeness4/5

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

For a no-arg, read-only hub with a rich output schema and annotation coverage, the description supplies the entry-point role, content summary, an exclusion, and successor tools. Complete enough to invoke correctly, with only the sibling-routing comparison left implicit.

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

Parameters4/5

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

Zero parameters, so the baseline is 4; the schema itself documents the empty-object contract, and "Call with {}" reinforces it without adding new meaning. Nothing further is needed for a no-arg tool.

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

Purpose5/5

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

States a specific resource (maps hub card at a given URL) and its exact contents — title/h1 plus 52 Gebiet links — and explicitly distinguishes it from a single Visitenkarte. An agent can tell this apart from sibling list/find tools from the description alone.

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

Usage Guidelines4/5

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

"USE as the maps landing overview" gives a clear entry-point context, and "NEXT: get_service_area, list_service_areas" routes the agent onward. "DOES NOT include www prices" adds a useful exclusion, but it never states when a find_by_* tool should be preferred over this hub.

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

get_impressumGet Impressum
Read-only
Inspect

WHAT: Impressum/Kontakt text from maps /llms-impressum-kontakt.txt. Optional offset/limit. USE for NAP/legal imprint on maps. NEXT: get_contact, get_business_identity; www /impressum for HTML.

ParametersJSON Schema
NameRequiredDescriptionDefault
limitNoMaximum number of lines to return after offset. Omit or null = if remaining payload ≤~30KB return all remaining lines; if larger, return first ~30KB window + nextOffset (O9). Explicit limit keeps 1..10000 line window (MCP caps unchanged — not forced to 30KB). Meta also as trailing # MCP-META lines in summary.
offsetNo0-based index into a list or discovery file lines (split on \n). 0 = first. Omit = 0. Combine with limit to page. Use nextOffset / offset+limit from a previous result when present.

Output Schema

ParametersJSON Schema
NameRequiredDescription
okYestrue = use summary, canonicalUrl, and extra keys. false = do not invent data; read error + hint and retry with valid args or open hint.
docNo
bodyNo
hintNoPresent when ok=false. Absolute URL or short recovery hint the agent should open or pass to another tool.
htmlNowww /impressum
toolYesEcho of the tool name that produced this object (e.g. get_service_area).
errorNoPresent when ok=false. Codes include: unknown_place, unknown_discovery, unknown_doc, q_required, plz_required, coords_required, outside_service_area, url_required, not_maps_host, bad_url, path_or_url_required, serp_not_found, slug_or_coords_required, path_required.
whichNo
localeNoLocale actually used for URLs. maps is German-only: always de (MAPS-E8 — no /en on maps). Requested non-de is ignored; payload locale=de.
relatedNoAlways includes https://maps.ikeytz.com/llms.txt.
summaryNoPrimary text for the model. For discovery tools this is the file window. For list tools a compact one-liner. Quote with attribution.
attributionYesRequired citation: 'Quelle: Schlüsseldienst Ludwigsburg ikeytz (ikeytz.com) · ai-train=no · https://maps.ikeytz.com/.well-known/ai.txt'
canonicalUrlNoBest URL to show the user: https://maps.ikeytz.com… page, public embed JSON, tel:+49…, mailto:…, https://wa.me/…, or a www pointer. Prefer this over constructing URLs.
get_invoice_line_itemsGet Invoice Line ItemsA
Read-only
Inspect

WHAT: www pointer only — invoice line items are computed on www MCP. maps accepts situationKey/whenKey/breakdown for symmetry but returns html link to /preise, not totals. DOES NOT return totalEur. NEXT: @ikeytz/mcp get_invoice_line_items; get_ort_datetime here for Berlin clock/whenKey.

ParametersJSON Schema
NameRequiredDescriptionDefault
localeNomaps is German-only (de). Omit or pass de. Other values are ignored; URLs stay https://maps.ikeytz.com/… with no locale prefix. Not a www multi-locale switch — use @ikeytz/mcp list_locales on www for en|fr|ru|fa|ar|tr.de
whenKeyNoday|night|now — used on www; maps only points.
breakdownNowww flag; ignored for maps pointer payload.
situationKeyYesRequired for www. Situation id (opening_slam, opening_locked, pkg_key_*, cylinder_only, cylinder_mount, aliases).

Output Schema

ParametersJSON Schema
NameRequiredDescription
okYestrue = use summary, canonicalUrl, and extra keys. false = do not invent data; read error + hint and retry with valid args or open hint.
npmNowww CLI package @ikeytz/mcp
hintNoPresent when ok=false. Absolute URL or short recovery hint the agent should open or pass to another tool.
htmlNoAbsolute www.ikeytz.com URL — open there or call @ikeytz/mcp
noteNomaps only points; Volltext/Preise/FAQ live on www
toolYesEcho of the tool name that produced this object (e.g. get_service_area).
errorNoPresent when ok=false. Codes include: unknown_place, unknown_discovery, unknown_doc, q_required, plz_required, coords_required, outside_service_area, url_required, not_maps_host, bad_url, path_or_url_required, serp_not_found, slug_or_coords_required, path_required.
localeNoLocale actually used for URLs. maps is German-only: always de (MAPS-E8 — no /en on maps). Requested non-de is ignored; payload locale=de.
relatedNoAlways includes https://maps.ikeytz.com/llms.txt.
summaryNoPrimary text for the model. For discovery tools this is the file window. For list tools a compact one-liner. Quote with attribution.
www_mcpNohttps://www.ikeytz.com/mcp — sister machine for prices/FAQ/corpus
www_toolNoSame tool name on www MCP that holds the real payload
attributionYesRequired citation: 'Quelle: Schlüsseldienst Ludwigsburg ikeytz (ikeytz.com) · ai-train=no · https://maps.ikeytz.com/.well-known/ai.txt'
canonicalUrlNoBest URL to show the user: https://maps.ikeytz.com… page, public embed JSON, tel:+49…, mailto:…, https://wa.me/…, or a www pointer. Prefer this over constructing URLs.
requested_localeNoLocale the caller asked for; maps still returns locale=de

TDQS

A4/5.0
Behavior4/5

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

readOnlyHint=true already flags a safe read, and the description adds real value beyond it: it discloses that the tool does NOT return totalEur and instead returns an html link, and that line items are computed elsewhere. This candid limitation disclosure is exactly the behavioral context an agent needs, though it omits details like response shape or pagination.

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

Conciseness4/5

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

It is short and front-loads the WHAT, then the DOES NOT, then NEXT. The abbreviated, telegraphic style is dense but roughly earns its words; some phrasing ('maps accepts … for symmetry') is a little cryptic but not wasteful.

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

Completeness4/5

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

An output schema exists, so return values need not be specified, yet the description still usefully clarifies what is NOT returned and where to get it. Combined with the routing hints, an agent has enough to call it correctly, though a clearer statement of the actual pointer payload would complete it.

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

Parameters4/5

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

Schema coverage is 100%, so the baseline is 3; the description nonetheless adds interpretive value by explaining that situationKey/whenKey/breakdown are accepted 'for symmetry' on maps and do not drive computation. This clarifies that these params are effectively inert for this endpoint, which the schema alone does not make obvious.

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

Purpose4/5

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

The description clearly states this is a 'www pointer only' that returns an html link to /preise rather than computed line items, directly countering the misleading name/title. It distinguishes itself from the www sibling that actually computes line items. It is specific about verb, resource, and scope, though the telegraphic phrasing makes it slightly harder to parse than ideal.

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

Usage Guidelines4/5

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

The 'NEXT: @ikeytz/mcp get_invoice_line_items' line explicitly routes the agent to the www tool that actually returns totals, and it names get_ort_datetime for the Berlin clock/whenKey use case. The condition selecting the www alternative is stated ('invoice line items are computed on www MCP'). It stops short of an explicit 'use this when…' statement for the pointer itself, so not a full 5.

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

get_lageGet LageA
Read-only
Inspect

WHAT: Returns Lage (location description) prose for one Einsatzgebiet Visitenkarte. Lookup slug|plz|name. RETURNS slug, name, lage. USE for human-readable geography prose. Prefer get_geschichte for place history; prefer get_service_area for the full point card/embed. DOES NOT return polygons.

ParametersJSON Schema
NameRequiredDescriptionDefault
plzNoGerman postcode (PLZ). Several Gebiete can share one PLZ (e.g. 71638). For single lookup first match wins; use find_by_plz for all matches.
nameNoGerman place name substring (case-insensitive, umlauts ok), e.g. Grünbühl, Pattonville. Used when slug/plz omitted.
slugNoURL slug of one of the 52 Einsatzgebiete, e.g. pattonville, bietigheim-bissingen, walheim, gruenbuehl. Matches https://maps.ikeytz.com/{slug}. Lookup order when combined with plz/name: slug first.

Output Schema

ParametersJSON Schema
NameRequiredDescription
okYestrue = use summary, canonicalUrl, and extra keys. false = do not invent data; read error + hint and retry with valid args or open hint.
hintNoPresent when ok=false. Absolute URL or short recovery hint the agent should open or pass to another tool.
lageNoLage prose (may be empty)
nameNo
slugNo
toolYesEcho of the tool name that produced this object (e.g. get_service_area).
errorNoPresent when ok=false. Codes include: unknown_place, unknown_discovery, unknown_doc, q_required, plz_required, coords_required, outside_service_area, url_required, not_maps_host, bad_url, path_or_url_required, serp_not_found, slug_or_coords_required, path_required.
localeNoLocale actually used for URLs. maps is German-only: always de (MAPS-E8 — no /en on maps). Requested non-de is ignored; payload locale=de.
relatedNoAlways includes https://maps.ikeytz.com/llms.txt.
summaryNoPrimary text for the model. For discovery tools this is the file window. For list tools a compact one-liner. Quote with attribution.
attributionYesRequired citation: 'Quelle: Schlüsseldienst Ludwigsburg ikeytz (ikeytz.com) · ai-train=no · https://maps.ikeytz.com/.well-known/ai.txt'
canonicalUrlNoBest URL to show the user: https://maps.ikeytz.com… page, public embed JSON, tel:+49…, mailto:…, https://wa.me/…, or a www pointer. Prefer this over constructing URLs.

TDQS

A4.4/5.0
Behavior4/5

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

Annotations already declare readOnlyHint=true, so the safety profile is covered and the description's marginal contribution is the negative disclosure 'DOES NOT return polygons' plus the promised return fields (slug, name, lage). It does not describe empty-result/error behavior or rate limits, which would be the remaining behavioral gaps for a lookup tool.

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

Conciseness5/5

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

Capsule format (WHAT / RETURNS / USE / DOES NOT) is maximally front-loaded: the one-line WHAT comes first, routing second, exclusions last. Every clause carries new information; nothing is padding.

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

Completeness4/5

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

With an output schema present, the description needn't enumerate return values, and it correctly focuses on lookup keys, routing, and scope limits. It is nearly complete, missing only what an agent should expect on no-match or when multiple Gebiete share a PLZ, which is left to the schema.

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

Parameters3/5

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

Schema description coverage is 100%, so the schema already explains each of slug/plz/name, including the 'slug first' lookup order and the find_by_plz escalation. The description's 'Lookup slug|plz|name' restates rather than extends that, so the baseline 3 applies.

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

Purpose5/5

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

States a specific verb and resource ('Returns Lage (location description) prose for one Einsatzgebiet Visitenkarte') and pins the lookup keys. It goes further by naming what it does not do ('DOES NOT return polygons') and naming the siblings it is not (get_geschichte, get_service_area), so an agent can separate it from adjacent tools immediately.

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

Usage Guidelines5/5

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

The USE line states the positive condition ('human-readable geography prose') and then gives explicit routing rules: prefer get_geschichte for place history, prefer get_service_area for the full point card/embed. That is a when-to-use plus two named alternatives, which is the strongest form of guidance.

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

get_llms_mcp_serverGet Llms Mcp Server
Read-only
Inspect

WHAT: Alias of get_discovery(which=llms-mcp-server) — machine/catalog text for the maps MCP server. Optional offset/limit. USE when an agent needs the server-side llms MCP catalog. NEXT: get_llms_mcp_web, get_links.

ParametersJSON Schema
NameRequiredDescriptionDefault
limitNoMaximum number of lines to return after offset. Omit or null = if remaining payload ≤~30KB return all remaining lines; if larger, return first ~30KB window + nextOffset (O9). Explicit limit keeps 1..10000 line window (MCP caps unchanged — not forced to 30KB). Meta also as trailing # MCP-META lines in summary.
offsetNo0-based index into a list or discovery file lines (split on \n). 0 = first. Omit = 0. Combine with limit to page. Use nextOffset / offset+limit from a previous result when present.

Output Schema

ParametersJSON Schema
NameRequiredDescription
okYestrue = use summary, canonicalUrl, and extra keys. false = do not invent data; read error + hint and retry with valid args or open hint.
hintNoPresent when ok=false. Absolute URL or short recovery hint the agent should open or pass to another tool.
pathNoPublic relative path of the file on maps
textNoUTF-8 line window (file body before # MCP-META). Same bytes as summary without meta trailer.
toolYesEcho of the tool name that produced this object (e.g. get_service_area).
errorNoPresent when ok=false. Codes include: unknown_place, unknown_discovery, unknown_doc, q_required, plz_required, coords_required, outside_service_area, url_required, not_maps_host, bad_url, path_or_url_required, serp_not_found, slug_or_coords_required, path_required.
limitNoApplied line limit, or null if omitted
whichNoResolved discovery id (ard, ai-catalog, llms, robots, sitemap-txt, llms-mcp-server, …).
localeNoLocale actually used for URLs. maps is German-only: always de (MAPS-E8 — no /en on maps). Requested non-de is ignored; payload locale=de.
offsetNoApplied 0-based line offset
missingNotrue if the discovery file was not found on disk
relatedNoAlways includes https://maps.ikeytz.com/llms.txt.
summaryNoPrimary text for the model. For discovery tools this is the file window. For list tools a compact one-liner. Quote with attribution.
totalUrlsNohttp(s) lines in the full file
truncatedNotrue if offset+limit left more lines. Also in trailing # MCP-META.
nextOffsetNoPass as next offset when truncated; else null. Also in # MCP-META.
totalBytesNoFull discovery file size in bytes (UTF-8). Also in trailing # MCP-META.
totalCharsNoFull discovery file character length before offset/limit. Also in # MCP-META.
totalLinesNoAlias of total_lines
attributionYesRequired citation: 'Quelle: Schlüsseldienst Ludwigsburg ikeytz (ikeytz.com) · ai-train=no · https://maps.ikeytz.com/.well-known/ai.txt'
total_linesNoLine count of the full file
canonicalUrlNoBest URL to show the user: https://maps.ikeytz.com… page, public embed JSON, tel:+49…, mailto:…, https://wa.me/…, or a www pointer. Prefer this over constructing URLs.
returnedUrlsNohttp(s) lines in this window
bytesReturnedNoUTF-8 length of text window
returnedLinesNoLines in this window (before # MCP-META)
fetchTruncatedNotrue if a load cap cut the file before paging (www Cap). maps reads full from disk → always false.
get_llms_mcp_webGet Llms Mcp Web
Read-only
Inspect

WHAT: Returns the web/UI-oriented MCP catalog text on maps (alias of get_discovery(which=llms-mcp-web)). Optional offset/limit. USE for browser/agent web discovery copy. Prefer get_llms_mcp_server for the server-side catalog; prefer get_llms_txt for the primary maps index. DOES NOT replace the live /mcp tools/list.

ParametersJSON Schema
NameRequiredDescriptionDefault
limitNoMaximum number of lines to return after offset. Omit or null = if remaining payload ≤~30KB return all remaining lines; if larger, return first ~30KB window + nextOffset (O9). Explicit limit keeps 1..10000 line window (MCP caps unchanged — not forced to 30KB). Meta also as trailing # MCP-META lines in summary.
offsetNo0-based index into a list or discovery file lines (split on \n). 0 = first. Omit = 0. Combine with limit to page. Use nextOffset / offset+limit from a previous result when present.

Output Schema

ParametersJSON Schema
NameRequiredDescription
okYestrue = use summary, canonicalUrl, and extra keys. false = do not invent data; read error + hint and retry with valid args or open hint.
hintNoPresent when ok=false. Absolute URL or short recovery hint the agent should open or pass to another tool.
pathNoPublic relative path of the file on maps
textNoUTF-8 line window (file body before # MCP-META). Same bytes as summary without meta trailer.
toolYesEcho of the tool name that produced this object (e.g. get_service_area).
errorNoPresent when ok=false. Codes include: unknown_place, unknown_discovery, unknown_doc, q_required, plz_required, coords_required, outside_service_area, url_required, not_maps_host, bad_url, path_or_url_required, serp_not_found, slug_or_coords_required, path_required.
limitNoApplied line limit, or null if omitted
whichNoResolved discovery id (ard, ai-catalog, llms, robots, sitemap-txt, llms-mcp-server, …).
localeNoLocale actually used for URLs. maps is German-only: always de (MAPS-E8 — no /en on maps). Requested non-de is ignored; payload locale=de.
offsetNoApplied 0-based line offset
missingNotrue if the discovery file was not found on disk
relatedNoAlways includes https://maps.ikeytz.com/llms.txt.
summaryNoPrimary text for the model. For discovery tools this is the file window. For list tools a compact one-liner. Quote with attribution.
totalUrlsNohttp(s) lines in the full file
truncatedNotrue if offset+limit left more lines. Also in trailing # MCP-META.
nextOffsetNoPass as next offset when truncated; else null. Also in # MCP-META.
totalBytesNoFull discovery file size in bytes (UTF-8). Also in trailing # MCP-META.
totalCharsNoFull discovery file character length before offset/limit. Also in # MCP-META.
totalLinesNoAlias of total_lines
attributionYesRequired citation: 'Quelle: Schlüsseldienst Ludwigsburg ikeytz (ikeytz.com) · ai-train=no · https://maps.ikeytz.com/.well-known/ai.txt'
total_linesNoLine count of the full file
canonicalUrlNoBest URL to show the user: https://maps.ikeytz.com… page, public embed JSON, tel:+49…, mailto:…, https://wa.me/…, or a www pointer. Prefer this over constructing URLs.
returnedUrlsNohttp(s) lines in this window
bytesReturnedNoUTF-8 length of text window
returnedLinesNoLines in this window (before # MCP-META)
fetchTruncatedNotrue if a load cap cut the file before paging (www Cap). maps reads full from disk → always false.
get_llms_txtGet Llms Txt
Read-only
Inspect

WHAT: Alias get_discovery(which=llms) — maps /llms.txt 1:1 with optional offset/limit. USE as the primary maps machine index. NEXT: get_ai_txt, get_sitemap_txt, get_links.

ParametersJSON Schema
NameRequiredDescriptionDefault
limitNoMaximum number of lines to return after offset. Omit or null = if remaining payload ≤~30KB return all remaining lines; if larger, return first ~30KB window + nextOffset (O9). Explicit limit keeps 1..10000 line window (MCP caps unchanged — not forced to 30KB). Meta also as trailing # MCP-META lines in summary.
offsetNo0-based index into a list or discovery file lines (split on \n). 0 = first. Omit = 0. Combine with limit to page. Use nextOffset / offset+limit from a previous result when present.

Output Schema

ParametersJSON Schema
NameRequiredDescription
okYestrue = use summary, canonicalUrl, and extra keys. false = do not invent data; read error + hint and retry with valid args or open hint.
hintNoPresent when ok=false. Absolute URL or short recovery hint the agent should open or pass to another tool.
pathNoPublic relative path of the file on maps
textNoUTF-8 line window (file body before # MCP-META). Same bytes as summary without meta trailer.
toolYesEcho of the tool name that produced this object (e.g. get_service_area).
errorNoPresent when ok=false. Codes include: unknown_place, unknown_discovery, unknown_doc, q_required, plz_required, coords_required, outside_service_area, url_required, not_maps_host, bad_url, path_or_url_required, serp_not_found, slug_or_coords_required, path_required.
limitNoApplied line limit, or null if omitted
whichNoResolved discovery id (ard, ai-catalog, llms, robots, sitemap-txt, llms-mcp-server, …).
localeNoLocale actually used for URLs. maps is German-only: always de (MAPS-E8 — no /en on maps). Requested non-de is ignored; payload locale=de.
offsetNoApplied 0-based line offset
missingNotrue if the discovery file was not found on disk
relatedNoAlways includes https://maps.ikeytz.com/llms.txt.
summaryNoPrimary text for the model. For discovery tools this is the file window. For list tools a compact one-liner. Quote with attribution.
totalUrlsNohttp(s) lines in the full file
truncatedNotrue if offset+limit left more lines. Also in trailing # MCP-META.
nextOffsetNoPass as next offset when truncated; else null. Also in # MCP-META.
totalBytesNoFull discovery file size in bytes (UTF-8). Also in trailing # MCP-META.
totalCharsNoFull discovery file character length before offset/limit. Also in # MCP-META.
totalLinesNoAlias of total_lines
attributionYesRequired citation: 'Quelle: Schlüsseldienst Ludwigsburg ikeytz (ikeytz.com) · ai-train=no · https://maps.ikeytz.com/.well-known/ai.txt'
total_linesNoLine count of the full file
canonicalUrlNoBest URL to show the user: https://maps.ikeytz.com… page, public embed JSON, tel:+49…, mailto:…, https://wa.me/…, or a www pointer. Prefer this over constructing URLs.
returnedUrlsNohttp(s) lines in this window
bytesReturnedNoUTF-8 length of text window
returnedLinesNoLines in this window (before # MCP-META)
fetchTruncatedNotrue if a load cap cut the file before paging (www Cap). maps reads full from disk → always false.
get_nutzungsbedingungenGet NutzungsbedingungenA
Read-only
Inspect

Returns only a maps HTML hand-off to www Nutzungsbedingungen. Does not return the terms body. USE when the user asks for Nutzungsbedingungen on maps; prefer www MCP for the corpus. DOES NOT invent clauses. NEXT: www get_nutzungsbedingungen / get_legal.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

Output Schema

ParametersJSON Schema
NameRequiredDescription
okYestrue = use summary, canonicalUrl, and extra keys. false = do not invent data; read error + hint and retry with valid args or open hint.
npmNowww CLI package @ikeytz/mcp
hintNoPresent when ok=false. Absolute URL or short recovery hint the agent should open or pass to another tool.
htmlNoAbsolute www.ikeytz.com URL — open there or call @ikeytz/mcp
noteNomaps only points; Volltext/Preise/FAQ live on www
toolYesEcho of the tool name that produced this object (e.g. get_service_area).
errorNoPresent when ok=false. Codes include: unknown_place, unknown_discovery, unknown_doc, q_required, plz_required, coords_required, outside_service_area, url_required, not_maps_host, bad_url, path_or_url_required, serp_not_found, slug_or_coords_required, path_required.
localeNoLocale actually used for URLs. maps is German-only: always de (MAPS-E8 — no /en on maps). Requested non-de is ignored; payload locale=de.
relatedNoAlways includes https://maps.ikeytz.com/llms.txt.
summaryNoPrimary text for the model. For discovery tools this is the file window. For list tools a compact one-liner. Quote with attribution.
www_mcpNohttps://www.ikeytz.com/mcp — sister machine for prices/FAQ/corpus
www_toolNoSame tool name on www MCP that holds the real payload
attributionYesRequired citation: 'Quelle: Schlüsseldienst Ludwigsburg ikeytz (ikeytz.com) · ai-train=no · https://maps.ikeytz.com/.well-known/ai.txt'
canonicalUrlNoBest URL to show the user: https://maps.ikeytz.com… page, public embed JSON, tel:+49…, mailto:…, https://wa.me/…, or a www pointer. Prefer this over constructing URLs.
requested_localeNoLocale the caller asked for; maps still returns locale=de

TDQS

A4.2/5.0
Behavior4/5

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

Annotations already declare readOnlyHint=true, so safety is covered. The description adds genuinely useful behavior beyond the annotations: the return is a hand-off, not the terms text, and 'DOES NOT invent clauses' warns against fabricating content. It does not discuss failure modes or hand-off resolution, keeping it short of a 5.

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

Conciseness4/5

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

Three tight sentences, front-loaded with scope, then usage, then next steps; nothing is wasted. The telegraphic ALL-CAPS USE/DOES NOT/NEXT markers read as machine-oriented cues rather than prose, which costs a little polish but not clarity.

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

Completeness4/5

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

An output schema exists, so return values need no explanation, and the description wisely states only the one thing the output schema can't convey to a caller — that the terms body is not included. For a zero-param, read-only hand-off tool, this is nearly complete; only failure/fallback behavior is unaddressed.

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

Parameters4/5

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

The tool takes zero parameters, so the schema-plus-description baseline is 4. There is nothing to add — the empty schema and the no-arguments note fully cover the parameter surface.

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

Purpose4/5

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

States a specific verb and resource: it returns 'a maps HTML hand-off to www Nutzungsbedingungen' and explicitly adds the negative scope 'Does not return the terms body.' That negative framing is what separates it from content-returning siblings like get_agb or get_legal. Slightly jargon-y ('hand-off') but the scope is unambiguous.

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

Usage Guidelines5/5

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

Explicitly says 'USE when the user asks for Nutzungsbedingungen on maps; prefer www MCP for the corpus,' naming both the trigger and the preferred alternative. It also chains forward with 'NEXT: www get_nutzungsbedingungen / get_legal,' so the agent knows what to call when this hand-off is not what it wants.

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

get_ort_datetimeGet Ort DatetimeA
Read-only
Inspect

WHAT: Europe/Berlin wall clock to the second (stand YYYY-MM-DD HH:MM:SS CEST|CET) for pricing whenKey context. Optional slug|plz|name like get_service_area; omit = all 52 places with the same clock. RETURNS timezone, stand, iso, unix, date, time, tz, and whenKey day|night for www invoicing. USE before quoting via www get_invoice_line_items. DOES NOT return euro amounts (no price matrix on maps). NEXT: www @ikeytz/mcp get_invoice_line_items({situationKey, whenKey}) or get_prices.

ParametersJSON Schema
NameRequiredDescriptionDefault
plzNoGerman postcode (PLZ). Several Gebiete can share one PLZ (e.g. 71638). For single lookup first match wins; use find_by_plz for all matches.
nameNoGerman place name substring (case-insensitive, umlauts ok), e.g. Grünbühl, Pattonville. Used when slug/plz omitted.
slugNoURL slug of one of the 52 Einsatzgebiete, e.g. pattonville, bietigheim-bissingen, walheim, gruenbuehl. Matches https://maps.ikeytz.com/{slug}. Lookup order when combined with plz/name: slug first.

Output Schema

ParametersJSON Schema
NameRequiredDescription
okYestrue = use summary, canonicalUrl, and extra keys. false = do not invent data; read error + hint and retry with valid args or open hint.
tzNoAbbreviation
isoNoISO-8601 with Berlin offset
plzNoPLZ when resolved
dateNoYYYY-MM-DD in Berlin
hintNoPresent when ok=false. Absolute URL or short recovery hint the agent should open or pass to another tool.
nameNoPlace name when resolved
slugNoPresent when a place was resolved
timeNoHH:MM:SS in Berlin (24h)
toolYesEcho of the tool name that produced this object (e.g. get_service_area).
unixNoUnix timestamp seconds
countNo52 when listing all places
errorNoPresent when ok=false. Codes include: unknown_place, unknown_discovery, unknown_doc, q_required, plz_required, coords_required, outside_service_area, url_required, not_maps_host, bad_url, path_or_url_required, serp_not_found, slug_or_coords_required, path_required.
itemsNoAll 52 slug/name/plz + clock when called without lookup
standNoHuman clock 'YYYY-MM-DD HH:MM:SS CEST|CET' Europe/Berlin to the second
localeNoLocale actually used for URLs. maps is German-only: always de (MAPS-E8 — no /en on maps). Requested non-de is ignored; payload locale=de.
relatedNoAlways includes https://maps.ikeytz.com/llms.txt.
summaryNoPrimary text for the model. For discovery tools this is the file window. For list tools a compact one-liner. Quote with attribution.
whenKeyNoPrice bucket for www get_invoice_line_items. day = Mo–Fr 08:00–17:59 Berlin except BW holidays; else night. Pass to www MCP — maps has no euro matrix.
timezoneNoAlways Europe/Berlin
attributionYesRequired citation: 'Quelle: Schlüsseldienst Ludwigsburg ikeytz (ikeytz.com) · ai-train=no · https://maps.ikeytz.com/.well-known/ai.txt'
canonicalUrlNoBest URL to show the user: https://maps.ikeytz.com… page, public embed JSON, tel:+49…, mailto:…, https://wa.me/…, or a www pointer. Prefer this over constructing URLs.

TDQS

A3.9/5.0
Behavior4/5

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

Annotations only declare readOnlyHint=true, so the description usefully adds behavior: the default scope when all params are omitted ('all 52 places with the same clock') and a negative capability statement ('DOES NOT return euro amounts'). It also enumerates the returned fields, going beyond the read-only hint. It does not discuss error behavior or rate limits, but an output schema exists to carry the return shape.

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

Conciseness3/5

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

It is front-loaded with WHAT/RETURNS/USE/DOES NOT/NEXT labels, so the structure is scannable and nothing is padded. However, the telegraphic fragments and internal jargon ('whenKey', 'www invoicing', '@ikeytz/mcp') trade clarity for brevity, so conciseness comes at a readability cost rather than being cleanly efficient.

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

Completeness4/5

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

For a read-only lookup with three optional params and an existing output schema, the description supplies the essentials: purpose, default scope, negative boundary, and next-step tools. An agent can call it correctly without opening the schema. It stops short of explaining how 'stand'/'whenKey' values should be consumed downstream, leaving a small gap.

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

Parameters4/5

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

Schema description coverage is already 100%, so the baseline is 3; the description adds genuine value by explaining the no-parameter default ('omit = all 52 places with the same clock') and by relating the three optional inputs to the sibling get_service_area. It correctly mirrors the slug/plz/name optionality rather than contradicting it.

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

Purpose4/5

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

The description states a specific verb+resource: it returns the Europe/Berlin wall-clock time to the second for a location ('Ort'), including the exact output format and the fields returned. It partially differentiates from siblings by pointing to get_service_area for the same slug/plz/name inputs and to get_invoice_line_items/get_prices as the follow-on tools. The phrasing is telegraphic ('for pricing whenKey context'), which slightly muddies an otherwise clear purpose.

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

Usage Guidelines4/5

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

It gives explicit sequencing ('USE before quoting via www get_invoice_line_items') and an explicit exclusion ('DOES NOT return euro amounts'), plus NEXT-step alternatives (get_invoice_line_items or get_prices). That covers when-to-use, when-not, and alternatives, but the routing between the two named alternatives is not distinguished, and the internal shorthand reduces confidence.

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

get_page_summaryGet Page SummaryA
Read-only
Inspect

WHAT: Short summary for a maps Gebiet (path/slug → area card) or www pointer for non-maps paths. path required (or slug). DOCS/API: https://maps.ikeytz.com/{slug} (HTML Visitenkarte) and https://maps.ikeytz.com/api/v1/embed/ort/{slug} (public embed JSON). USE to decide maps vs www. NEXT: get_ai_page, get_service_area.

ParametersJSON Schema
NameRequiredDescriptionDefault
pathYesRequired. maps path (/pattonville) or www path for pointer fallback.
slugNoAlias for path/slug
localeNomaps is German-only (de). Omit or pass de. Other values are ignored; URLs stay https://maps.ikeytz.com/… with no locale prefix. Not a www multi-locale switch — use @ikeytz/mcp list_locales on www for en|fr|ru|fa|ar|tr.de

Output Schema

ParametersJSON Schema
NameRequiredDescription
okYestrue = use summary, canonicalUrl, and extra keys. false = do not invent data; read error + hint and retry with valid args or open hint.
latNo
lngNo
plzNo
hintNoPresent when ok=false. Absolute URL or short recovery hint the agent should open or pass to another tool.
htmlNoWhen www pointer
nameNo
noteNo
slugNo
toolYesEcho of the tool name that produced this object (e.g. get_service_area).
errorNoPresent when ok=false. Codes include: unknown_place, unknown_discovery, unknown_doc, q_required, plz_required, coords_required, outside_service_area, url_required, not_maps_host, bad_url, path_or_url_required, serp_not_found, slug_or_coords_required, path_required.
localeNoLocale actually used for URLs. maps is German-only: always de (MAPS-E8 — no /en on maps). Requested non-de is ignored; payload locale=de.
relatedNoAlways includes https://maps.ikeytz.com/llms.txt.
summaryNoPrimary text for the model. For discovery tools this is the file window. For list tools a compact one-liner. Quote with attribution.
embed_mapNo
attributionYesRequired citation: 'Quelle: Schlüsseldienst Ludwigsburg ikeytz (ikeytz.com) · ai-train=no · https://maps.ikeytz.com/.well-known/ai.txt'
canonicalUrlNoBest URL to show the user: https://maps.ikeytz.com… page, public embed JSON, tel:+49…, mailto:…, https://wa.me/…, or a www pointer. Prefer this over constructing URLs.

TDQS

A3.7/5.0
Behavior4/5

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

Annotations only declare readOnlyHint=true, so the description usefully adds the underlying data sources: the HTML Visitenkarte at maps.ikeytz.com/{slug} and the public embed JSON endpoint. It also discloses that maps is German-only. It does not mention auth or rate limits, but the source disclosure goes well beyond the annotation.

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

Conciseness4/5

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

The description is compact and front-loads the WHAT clause, with labeled WHAT/USE/NEXT/DOCS-API sections that are easy to scan. The dense telegraphic style and unexplained jargon slightly reduce readability, but no sentence is wasted.

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

Completeness4/5

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

An output schema exists, so return values need not be explained, and readOnlyHint covers the safety profile. Combined with the stated next-step tools and data-source endpoints, the description is adequate for a read-only summary tool, leaving only the exact summary contents underspecified.

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

Parameters3/5

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

Schema description coverage is 100%, so all three parameters (path, slug, locale enum) are already fully documented in the schema. The description only restates 'path required (or slug)' and adds no syntax or format detail beyond the structured fields, so the baseline 3 applies.

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

Purpose4/5

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

The WHAT clause gives a specific verb+resource: a short summary/pointer for a maps Gebiet (path/slug → area card) versus a www pointer for non-maps paths. It is more than a name restatement, though jargon like 'area card' and 'www pointer' is domain-specific and takes effort to parse. It partially differentiates from siblings by naming get_ai_page and get_service_area as follow-ups.

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

Usage Guidelines3/5

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

'USE to decide maps vs www' states a clear reason to call the tool, and 'NEXT: get_ai_page, get_service_area' gives sequencing. However there is no explicit when-not-to-use or comparison to alternatives like get_embed_map, get_lage, or resolve_maps_url, so routing remains partly inferred.

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

get_partner_infoGet Partner InfoA
Read-only
Inspect

Returns only a maps HTML hand-off to www Partner-werden (/partner-werden). Does not return partnerEmail corpus or submit the partner form. USE when the user asks about becoming a partner while on maps. Prefer www MCP get_partner_info if already connected to www. formSubmit=false — never claim a form was sent. NEXT: www get_partner_info; or maps compose_mailto after opening www.

ParametersJSON Schema
NameRequiredDescriptionDefault
localeNomaps is German-only (de). Omit or pass de. Other values are ignored; URLs stay https://maps.ikeytz.com/… with no locale prefix. Not a www multi-locale switch — use @ikeytz/mcp list_locales on www for en|fr|ru|fa|ar|tr.de

Output Schema

ParametersJSON Schema
NameRequiredDescription
okYestrue = use summary, canonicalUrl, and extra keys. false = do not invent data; read error + hint and retry with valid args or open hint.
npmNowww CLI package @ikeytz/mcp
hintNoPresent when ok=false. Absolute URL or short recovery hint the agent should open or pass to another tool.
htmlNoAbsolute www.ikeytz.com URL — open there or call @ikeytz/mcp
noteNomaps only points; Volltext/Preise/FAQ live on www
toolYesEcho of the tool name that produced this object (e.g. get_service_area).
errorNoPresent when ok=false. Codes include: unknown_place, unknown_discovery, unknown_doc, q_required, plz_required, coords_required, outside_service_area, url_required, not_maps_host, bad_url, path_or_url_required, serp_not_found, slug_or_coords_required, path_required.
localeNoLocale actually used for URLs. maps is German-only: always de (MAPS-E8 — no /en on maps). Requested non-de is ignored; payload locale=de.
relatedNoAlways includes https://maps.ikeytz.com/llms.txt.
summaryNoPrimary text for the model. For discovery tools this is the file window. For list tools a compact one-liner. Quote with attribution.
www_mcpNohttps://www.ikeytz.com/mcp — sister machine for prices/FAQ/corpus
www_toolNoSame tool name on www MCP that holds the real payload
attributionYesRequired citation: 'Quelle: Schlüsseldienst Ludwigsburg ikeytz (ikeytz.com) · ai-train=no · https://maps.ikeytz.com/.well-known/ai.txt'
canonicalUrlNoBest URL to show the user: https://maps.ikeytz.com… page, public embed JSON, tel:+49…, mailto:…, https://wa.me/…, or a www pointer. Prefer this over constructing URLs.
requested_localeNoLocale the caller asked for; maps still returns locale=de

TDQS

A4.1/5.0
Behavior4/5

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

With readOnlyHint=true already declaring the safety profile, the description adds genuinely new behavioral facts: the form is not submitted, formSubmit=false so the agent must never claim a form was sent, and partnerEmail data is not returned. That is meaningful beyond the annotation, though it doesn't cover response format or redirect behavior in depth.

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

Conciseness4/5

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

Front-loaded with the return scope, then the USE trigger, the preferred alternative, and the formSubmit guardrail. Dense and mostly earned, though it reads as a compressed run-on with several embedded clauses.

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

Completeness4/5

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

An output schema exists, so return values needn't be explained, and the description covers trigger, alternative, side-effect guardrail, and follow-up. It is complete for its complexity, with only minor ambiguity about the actual HTML payload.

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

Parameters3/5

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

Schema coverage is 100% and the single locale parameter is fully documented in the schema, including the German-only enum and the contrast with www multi-locale. The description adds nothing param-specific, so the baseline 3 is correct when the schema carries the load.

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

Purpose4/5

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

It states what the tool returns (a maps HTML hand-off to www /partner-werden) and, crucially, what it does NOT return (partnerEmail corpus) or do (submit the form), which separates it from siblings. The phrase 'HTML hand-off' is jargon-y, so the exact return payload is slightly opaque, but the verb+resource is identifiable.

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

Usage Guidelines5/5

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

It gives an explicit trigger ('USE when the user asks about becoming a partner while on maps') and an explicit alternative ('Prefer www MCP get_partner_info if already connected to www'), plus NEXT-step routing (compose_mailto after opening www). Nothing is left to inference.

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

get_pricesGet PricesA
Read-only
Inspect

WHAT: Returns only a URL/note pointing to the Festpreis matrix on www.ikeytz.com/preise — no euro rows. USE to hand the agent from maps to www pricing. Prefer www MCP get_prices for the real matrix; call maps get_ort_datetime first if you need whenKey (day|night) for a later www invoice. DOES NOT invent prices or return totalEur.

ParametersJSON Schema
NameRequiredDescriptionDefault
localeNomaps is German-only (de). Omit or pass de. Other values are ignored; URLs stay https://maps.ikeytz.com/… with no locale prefix. Not a www multi-locale switch — use @ikeytz/mcp list_locales on www for en|fr|ru|fa|ar|tr.de

Output Schema

ParametersJSON Schema
NameRequiredDescription
okYestrue = use summary, canonicalUrl, and extra keys. false = do not invent data; read error + hint and retry with valid args or open hint.
npmNowww CLI package @ikeytz/mcp
hintNoPresent when ok=false. Absolute URL or short recovery hint the agent should open or pass to another tool.
htmlNoAbsolute www.ikeytz.com URL — open there or call @ikeytz/mcp
noteNomaps only points; Volltext/Preise/FAQ live on www
toolYesEcho of the tool name that produced this object (e.g. get_service_area).
errorNoPresent when ok=false. Codes include: unknown_place, unknown_discovery, unknown_doc, q_required, plz_required, coords_required, outside_service_area, url_required, not_maps_host, bad_url, path_or_url_required, serp_not_found, slug_or_coords_required, path_required.
localeNoLocale actually used for URLs. maps is German-only: always de (MAPS-E8 — no /en on maps). Requested non-de is ignored; payload locale=de.
relatedNoAlways includes https://maps.ikeytz.com/llms.txt.
summaryNoPrimary text for the model. For discovery tools this is the file window. For list tools a compact one-liner. Quote with attribution.
www_mcpNohttps://www.ikeytz.com/mcp — sister machine for prices/FAQ/corpus
www_toolNoSame tool name on www MCP that holds the real payload
attributionYesRequired citation: 'Quelle: Schlüsseldienst Ludwigsburg ikeytz (ikeytz.com) · ai-train=no · https://maps.ikeytz.com/.well-known/ai.txt'
canonicalUrlNoBest URL to show the user: https://maps.ikeytz.com… page, public embed JSON, tel:+49…, mailto:…, https://wa.me/…, or a www pointer. Prefer this over constructing URLs.
requested_localeNoLocale the caller asked for; maps still returns locale=de

TDQS

A4.4/5.0
Behavior4/5

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

Annotations already mark it readOnlyHint=true, so safety is covered. The description adds real behavioral context: it returns a pointer rather than data, does not invent prices, and does not return totalEur — useful for setting agent expectations. It stops short of describing the note/URL format in detail, so a 4 rather than 5.

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

Conciseness4/5

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

Front-loaded with WHAT/USE/DOES NOT labels so the key facts are scannable and each sentence carries distinct information. The all-caps labels are slightly shouty and the run-on USE clause is dense, costing it a point.

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

Completeness5/5

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

With an output schema present and annotations covering safety, the description only needs to explain purpose, routing, and limits — all of which it does. Nothing an agent needs to call this correctly is missing.

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

Parameters3/5

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

Schema coverage is 100% and the single locale parameter is fully documented in the schema, including its enum and the warning that it is not a www multi-locale switch. The description text adds nothing about locale, so the schema carries the load — baseline 3.

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

Purpose5/5

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

States a specific verb and resource ('Returns only a URL/note pointing to the Festpreis matrix') and explicitly rules out what it is not ('no euro rows'). It also distinguishes itself from the sibling www get_prices, so an agent can tell them apart without opening either schema.

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

Usage Guidelines5/5

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

Explicit routing guidance: use this to hand off from maps to www pricing, prefer www MCP get_prices for the real matrix, and call get_ort_datetime first when a whenKey (day|night) is needed. When, when-not, and the alternative are all named.

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

get_ratgeberGet Ratgeber
Read-only
Inspect

WHAT: Returns only a URL to www /ratgeber/{slug} — not the article body. slug required. USE when the user names a Ratgeber slug on maps. Prefer list_ratgeber for the hub link when the slug is unknown; prefer www MCP get_ratgeber for fulltext. DOES NOT return article text.

ParametersJSON Schema
NameRequiredDescriptionDefault
slugYesRequired Ratgeber slug
localeNomaps is German-only (de). Omit or pass de. Other values are ignored; URLs stay https://maps.ikeytz.com/… with no locale prefix. Not a www multi-locale switch — use @ikeytz/mcp list_locales on www for en|fr|ru|fa|ar|tr.de

Output Schema

ParametersJSON Schema
NameRequiredDescription
okYestrue = use summary, canonicalUrl, and extra keys. false = do not invent data; read error + hint and retry with valid args or open hint.
npmNowww CLI package @ikeytz/mcp
hintNoPresent when ok=false. Absolute URL or short recovery hint the agent should open or pass to another tool.
htmlNoAbsolute www.ikeytz.com URL — open there or call @ikeytz/mcp
noteNomaps only points; Volltext/Preise/FAQ live on www
toolYesEcho of the tool name that produced this object (e.g. get_service_area).
errorNoPresent when ok=false. Codes include: unknown_place, unknown_discovery, unknown_doc, q_required, plz_required, coords_required, outside_service_area, url_required, not_maps_host, bad_url, path_or_url_required, serp_not_found, slug_or_coords_required, path_required.
localeNoLocale actually used for URLs. maps is German-only: always de (MAPS-E8 — no /en on maps). Requested non-de is ignored; payload locale=de.
relatedNoAlways includes https://maps.ikeytz.com/llms.txt.
summaryNoPrimary text for the model. For discovery tools this is the file window. For list tools a compact one-liner. Quote with attribution.
www_mcpNohttps://www.ikeytz.com/mcp — sister machine for prices/FAQ/corpus
www_toolNoSame tool name on www MCP that holds the real payload
attributionYesRequired citation: 'Quelle: Schlüsseldienst Ludwigsburg ikeytz (ikeytz.com) · ai-train=no · https://maps.ikeytz.com/.well-known/ai.txt'
canonicalUrlNoBest URL to show the user: https://maps.ikeytz.com… page, public embed JSON, tel:+49…, mailto:…, https://wa.me/…, or a www pointer. Prefer this over constructing URLs.
requested_localeNoLocale the caller asked for; maps still returns locale=de
get_review_urlGet Review UrlA
Read-only
Inspect

WHAT: Returns only a URL to www.ikeytz.com/review (Google-review entry page) — not a review payload. USE when the user asks where to leave a Google review while already on maps. Prefer www MCP get_review_url when connected to www for the canonical review-link payload. DOES NOT post a review.

ParametersJSON Schema
NameRequiredDescriptionDefault
localeNomaps is German-only (de). Omit or pass de. Other values are ignored; URLs stay https://maps.ikeytz.com/… with no locale prefix. Not a www multi-locale switch — use @ikeytz/mcp list_locales on www for en|fr|ru|fa|ar|tr.de

Output Schema

ParametersJSON Schema
NameRequiredDescription
okYestrue = use summary, canonicalUrl, and extra keys. false = do not invent data; read error + hint and retry with valid args or open hint.
npmNowww CLI package @ikeytz/mcp
hintNoPresent when ok=false. Absolute URL or short recovery hint the agent should open or pass to another tool.
htmlNoAbsolute www.ikeytz.com URL — open there or call @ikeytz/mcp
noteNomaps only points; Volltext/Preise/FAQ live on www
toolYesEcho of the tool name that produced this object (e.g. get_service_area).
errorNoPresent when ok=false. Codes include: unknown_place, unknown_discovery, unknown_doc, q_required, plz_required, coords_required, outside_service_area, url_required, not_maps_host, bad_url, path_or_url_required, serp_not_found, slug_or_coords_required, path_required.
localeNoLocale actually used for URLs. maps is German-only: always de (MAPS-E8 — no /en on maps). Requested non-de is ignored; payload locale=de.
relatedNoAlways includes https://maps.ikeytz.com/llms.txt.
summaryNoPrimary text for the model. For discovery tools this is the file window. For list tools a compact one-liner. Quote with attribution.
www_mcpNohttps://www.ikeytz.com/mcp — sister machine for prices/FAQ/corpus
www_toolNoSame tool name on www MCP that holds the real payload
attributionYesRequired citation: 'Quelle: Schlüsseldienst Ludwigsburg ikeytz (ikeytz.com) · ai-train=no · https://maps.ikeytz.com/.well-known/ai.txt'
canonicalUrlNoBest URL to show the user: https://maps.ikeytz.com… page, public embed JSON, tel:+49…, mailto:…, https://wa.me/…, or a www pointer. Prefer this over constructing URLs.
requested_localeNoLocale the caller asked for; maps still returns locale=de

TDQS

A4.4/5.0
Behavior4/5

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

readOnlyHint=true already declares the safe-read profile, but the description adds meaningful context beyond it: the return is only a URL, not a review payload, and it 'DOES NOT post a review'. That clarifies side-effect absence beyond the annotation. It doesn't add rate-limit/auth detail, keeping it at a 4.

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

Conciseness4/5

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

Front-loaded WHAT/USE/DOES-NOT structure is easy to scan, and each clause carries routing or behavioral information. Slightly verbose, with 'not a review payload' and 'DOES NOT post a review' being near-adjacent reassurances, but nothing is wasted outright.

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

Completeness5/5

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

An output schema exists, so return-value explanation is not required, and the description covers purpose, trigger, alternative, and non-mutation. Nothing an agent needs to invoke it correctly is missing.

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

Parameters3/5

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

Schema coverage is 100% and the schema's own locale description already explains the de-only enum and the www-unused caveat. The description adds no parameter-level meaning, so the baseline 3 applies.

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

Purpose5/5

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

States a specific verb and resource ('Returns only a URL ... not a review payload') and explicitly scopes it to the maps variant versus the www MCP get_review_url. An agent can tell exactly what it yields and how it differs from the similarly-named sibling.

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

Usage Guidelines5/5

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

Names the trigger condition ('when the user asks where to leave a Google review while already on maps') and the alternative ('Prefer www MCP get_review_url when connected to www for the canonical review-link payload'). Both when-to-use and routing are explicit.

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

get_serp_snippetGet Serp SnippetA
Read-only
Inspect

WHAT: One SERP block from maps llms-serp.txt via path, url, slug, or q. RETURNS path, url, matchContext (full block). DOCS/API: https://maps.ikeytz.com/llms-serp.txt (one block from that file). USE for a single page's SERP copy. DOES NOT invent meta tags. NEXT: get_ai_page or get_page_summary for body.

ParametersJSON Schema
NameRequiredDescriptionDefault
qNoFallback search string
urlNoFull maps URL
pathNomaps path, e.g. /pattonville
slugNoGebiet slug

Output Schema

ParametersJSON Schema
NameRequiredDescription
okYestrue = use summary, canonicalUrl, and extra keys. false = do not invent data; read error + hint and retry with valid args or open hint.
urlNoMatched maps URL
hintNoPresent when ok=false. Absolute URL or short recovery hint the agent should open or pass to another tool.
pathNoMatched path
toolYesEcho of the tool name that produced this object (e.g. get_service_area).
errorNoPresent when ok=false. Codes include: unknown_place, unknown_discovery, unknown_doc, q_required, plz_required, coords_required, outside_service_area, url_required, not_maps_host, bad_url, path_or_url_required, serp_not_found, slug_or_coords_required, path_required.
localeNoLocale actually used for URLs. maps is German-only: always de (MAPS-E8 — no /en on maps). Requested non-de is ignored; payload locale=de.
relatedNoAlways includes https://maps.ikeytz.com/llms.txt.
summaryNoPrimary text for the model. For discovery tools this is the file window. For list tools a compact one-liner. Quote with attribution.
attributionYesRequired citation: 'Quelle: Schlüsseldienst Ludwigsburg ikeytz (ikeytz.com) · ai-train=no · https://maps.ikeytz.com/.well-known/ai.txt'
canonicalUrlNoBest URL to show the user: https://maps.ikeytz.com… page, public embed JSON, tel:+49…, mailto:…, https://wa.me/…, or a www pointer. Prefer this over constructing URLs.
matchContextNoFull SERP markdown block

TDQS

A4.1/5.0
Behavior3/5

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

readOnlyHint=true already establishes this as a safe read, and an output schema exists, so the description's job is narrow. It usefully discloses the return shape (matchContext is the full block) and a guardrail ('DOES NOT invent meta tags'), but says nothing about behavior when multiple lookup keys are supplied or how a block is matched.

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

Conciseness4/5

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

Label-led structure (WHAT / RETURNS / DOCS / USE / NEXT) is front-loaded and every line carries signal. The telegraphic phrasing is dense but readable; nothing here is padding.

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

Completeness4/5

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

Return values are described and also backed by an output schema, a docs pointer is supplied, and the next tools are named — enough for an agent to call this correctly. It does not cover the no-match case or multi-key ambiguity, which is a minor remaining gap.

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

Parameters4/5

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

Schema coverage is 100%, so baseline is 3, but the phrase 'via path, url, slug, or q' adds real meaning: it tells the agent these four are alternative lookup keys rather than combinable filters, which the flat schema does not convey. No precedence among the keys is given, so not a 5.

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

Purpose5/5

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

States a specific verb+resource: fetch 'One SERP block from maps llms-serp.txt' via path/url/slug/q, and the RETURNS line names the exact payload (path, url, matchContext). It clearly separates itself from body-content siblings, which it names explicitly in the NEXT line.

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

Usage Guidelines4/5

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

'USE for a single page's SERP copy' gives a concrete selection criterion, and 'NEXT: get_ai_page or get_page_summary for body' routes the agent to the right alternative for a different need. It lacks an explicit when-not condition (e.g., when a full page or multiple SERP blocks are wanted), which keeps it short of a 5.

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

get_service_areaGet Service AreaA
Read-only
Inspect

WHAT: One Einsatzgebiet by slug → plz (first match) → name substring. RETURNS point card + maps_nav (hub/buero/mcp-hub) + neighbors (5 nearest by airline, MAPS-IL2) + optional Lage texts (h1, kicker, blurb, lage, geschichte) unless compact=true. fields= filters keys. USE when the user names a town/district in Landkreis Ludwigsburg. DOES NOT geocode free addresses outside the 52; unknown → ok=false unknown_place. NEXT: get_lage, get_geschichte, get_grenze, get_embed_map, distance_to_office.

ParametersJSON Schema
NameRequiredDescriptionDefault
plzNoGerman postcode (PLZ). Several Gebiete can share one PLZ (e.g. 71638). For single lookup first match wins; use find_by_plz for all matches.
nameNoGerman place name substring (case-insensitive, umlauts ok), e.g. Grünbühl, Pattonville. Used when slug/plz omitted.
slugNoURL slug of one of the 52 Einsatzgebiete, e.g. pattonville, bietigheim-bissingen, walheim, gruenbuehl. Matches https://maps.ikeytz.com/{slug}. Lookup order when combined with plz/name: slug first.
fieldsNoOptional field filter: comma-separated names or array. Keeps envelope keys (ok, tool, summary, canonicalUrl, attribution, locale, related, count, total, offset, limit, compact) plus listed fields. Example: slug,name,plz,lat,lng.
localeNomaps is German-only (de). Omit or pass de. Other values are ignored; URLs stay https://maps.ikeytz.com/… with no locale prefix. Not a www multi-locale switch — use @ikeytz/mcp list_locales on www for en|fr|ru|fa|ar|tr.de
compactNoIf true, omit h1/kicker/blurb/lage/geschichte — coords + URLs + neighbors still present.

Output Schema

ParametersJSON Schema
NameRequiredDescription
h1NoVisitenkarte H1 when not compact
okYestrue = use summary, canonicalUrl, and extra keys. false = do not invent data; read error + hint and retry with valid args or open hint.
latNoPlace latitude
lngNoPlace longitude
plzNoPostcode
hintNoPresent when ok=false. Absolute URL or short recovery hint the agent should open or pass to another tool.
icbmNoICBM string
kindNostadtteil | ort
lageNoLage text when not compact
nameNoGerman name
slugNoResolved slug
toolYesEcho of the tool name that produced this object (e.g. get_service_area).
blurbNoShort blurb when not compact
errorNoPresent when ok=false. Codes include: unknown_place, unknown_discovery, unknown_doc, q_required, plz_required, coords_required, outside_service_area, url_required, not_maps_host, bad_url, path_or_url_required, serp_not_found, slug_or_coords_required, path_required.
kickerNoKicker when not compact
localeNoLocale actually used for URLs. maps is German-only: always de (MAPS-E8 — no /en on maps). Requested non-de is ignored; payload locale=de.
parentNoParent label
walkInNoAlways false
compactNoWhether compact mode was applied
geo_apiNo
relatedNoAlways includes https://maps.ikeytz.com/llms.txt.
summaryNoPrimary text for the model. For discovery tools this is the file window. For list tools a compact one-liner. Quote with attribution.
maps_navNoMAPS-IL1 mini-chrome URLs
embed_mapNo
neighborsNoUp to 5 nearest Gebiete (slug/name/embed_map)
geschichteNoGeschichte text when not compact
office_latNoGewerbesitz lat
office_lngNoGewerbesitz lng
attributionYesRequired citation: 'Quelle: Schlüsseldienst Ludwigsburg ikeytz (ikeytz.com) · ai-train=no · https://maps.ikeytz.com/.well-known/ai.txt'
google_mapsNo'lat, lng'
canonicalUrlNoBest URL to show the user: https://maps.ikeytz.com… page, public embed JSON, tel:+49…, mailto:…, https://wa.me/…, or a www pointer. Prefer this over constructing URLs.

TDQS

A4.8/5.0
Behavior5/5

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

Annotations only declare readOnlyHint=true, so the description carries the rest — and it delivers: return payload shape (point card, maps_nav hub/buero/mcp-hub, 5 nearest neighbors by airline), conditional Lage texts suppressed by compact=true, field filtering semantics, the 52-area scope, single-lookup precedence, and the unknown_place error path. This is well beyond what the annotation provides.

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

Conciseness4/5

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

Tightly front-loaded with WHAT/RETURNS/USE/DOES NOT/NEXT labels and no filler, though the density borders on cryptic — tokens like 'MAPS-IL2' and '/mcp-hub' are opaque shorthand that cost a little readability.

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

Completeness5/5

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

With an output schema present the description need not restate return values, yet its brief return summary, error-code contract, scope limit (52 areas, German-only) and tool chaining make it fully sufficient for correct invocation alongside a readOnly annotation.

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

Parameters4/5

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

Schema description coverage is 100%, so a baseline of 3 applies, but the description adds genuine parameter behavior: the slug-first precedence when combined with plz/name, first-match-wins for shared PLZ values, and compact's effect on which keys survive. The only omission is that plz/name syntax detail lives in the schema rather than the description.

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

Purpose5/5

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

States a specific verb+resource (fetch one Einsatzgebiet) and the exact resolution order (slug → plz first match → name substring), which immediately separates it from sibling lookups like find_by_plz, find_by_gebiet and list_service_areas. An agent can tell what this returns without opening the schema.

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

Usage Guidelines5/5

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

Explicit USE clause (user names a town/district in Landkreis Ludwigsburg), an explicit DOES NOT boundary (no geocoding of free addresses outside the 52), a defined failure mode (ok=false unknown_place), and a NEXT list routing to get_lage, get_geschichte, get_grenze, get_embed_map and distance_to_office. Alternatives and exclusions are both named.

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

get_sitemap_txtGet Sitemap Txt
Read-only
Inspect

WHAT: Reads maps /sitemap.txt 1:1 (alias of get_discovery(which=sitemap-txt)); summary is a line window plus trailing # MCP-META. Optional offset/limit. USE to list public maps embed URLs including /buero. Prefer get_discovery for other discovery ids; prefer site_overview for the brand card, not a URL list. NEXT: resolve_maps_url, get_embed_map, get_geo_office.

ParametersJSON Schema
NameRequiredDescriptionDefault
limitNoMaximum number of lines to return after offset. Omit or null = if remaining payload ≤~30KB return all remaining lines; if larger, return first ~30KB window + nextOffset (O9). Explicit limit keeps 1..10000 line window (MCP caps unchanged — not forced to 30KB). Meta also as trailing # MCP-META lines in summary.
offsetNo0-based index into a list or discovery file lines (split on \n). 0 = first. Omit = 0. Combine with limit to page. Use nextOffset / offset+limit from a previous result when present.

Output Schema

ParametersJSON Schema
NameRequiredDescription
okYestrue = use summary, canonicalUrl, and extra keys. false = do not invent data; read error + hint and retry with valid args or open hint.
hintNoPresent when ok=false. Absolute URL or short recovery hint the agent should open or pass to another tool.
pathNoPublic relative path of the file on maps
textNoUTF-8 line window (file body before # MCP-META). Same bytes as summary without meta trailer.
toolYesEcho of the tool name that produced this object (e.g. get_service_area).
errorNoPresent when ok=false. Codes include: unknown_place, unknown_discovery, unknown_doc, q_required, plz_required, coords_required, outside_service_area, url_required, not_maps_host, bad_url, path_or_url_required, serp_not_found, slug_or_coords_required, path_required.
limitNoApplied line limit, or null if omitted
whichNoResolved discovery id (ard, ai-catalog, llms, robots, sitemap-txt, llms-mcp-server, …).
localeNoLocale actually used for URLs. maps is German-only: always de (MAPS-E8 — no /en on maps). Requested non-de is ignored; payload locale=de.
offsetNoApplied 0-based line offset
missingNotrue if the discovery file was not found on disk
relatedNoAlways includes https://maps.ikeytz.com/llms.txt.
summaryNoPrimary text for the model. For discovery tools this is the file window. For list tools a compact one-liner. Quote with attribution.
totalUrlsNohttp(s) lines in the full file
truncatedNotrue if offset+limit left more lines. Also in trailing # MCP-META.
nextOffsetNoPass as next offset when truncated; else null. Also in # MCP-META.
totalBytesNoFull discovery file size in bytes (UTF-8). Also in trailing # MCP-META.
totalCharsNoFull discovery file character length before offset/limit. Also in # MCP-META.
totalLinesNoAlias of total_lines
attributionYesRequired citation: 'Quelle: Schlüsseldienst Ludwigsburg ikeytz (ikeytz.com) · ai-train=no · https://maps.ikeytz.com/.well-known/ai.txt'
total_linesNoLine count of the full file
canonicalUrlNoBest URL to show the user: https://maps.ikeytz.com… page, public embed JSON, tel:+49…, mailto:…, https://wa.me/…, or a www pointer. Prefer this over constructing URLs.
returnedUrlsNohttp(s) lines in this window
bytesReturnedNoUTF-8 length of text window
returnedLinesNoLines in this window (before # MCP-META)
fetchTruncatedNotrue if a load cap cut the file before paging (www Cap). maps reads full from disk → always false.
get_urheberrechtGet Urheberrecht
Read-only
Inspect

WHAT: Returns Karten-Urheberrecht plain text from maps /llms-urheberrecht.txt (attribution: Mahmud Reza Kashani · ikeytz). Optional offset/limit. USE when citing map copyright in German. Prefer get_copyright for the English citation file; prefer get_legal(doc=urheberrecht) for the legal-doc router. DOES NOT return www HTML body.

ParametersJSON Schema
NameRequiredDescriptionDefault
limitNoMaximum number of lines to return after offset. Omit or null = if remaining payload ≤~30KB return all remaining lines; if larger, return first ~30KB window + nextOffset (O9). Explicit limit keeps 1..10000 line window (MCP caps unchanged — not forced to 30KB). Meta also as trailing # MCP-META lines in summary.
offsetNo0-based index into a list or discovery file lines (split on \n). 0 = first. Omit = 0. Combine with limit to page. Use nextOffset / offset+limit from a previous result when present.

Output Schema

ParametersJSON Schema
NameRequiredDescription
okYestrue = use summary, canonicalUrl, and extra keys. false = do not invent data; read error + hint and retry with valid args or open hint.
docNo
bodyNo
hintNoPresent when ok=false. Absolute URL or short recovery hint the agent should open or pass to another tool.
htmlNowww /urheberrecht
toolYesEcho of the tool name that produced this object (e.g. get_service_area).
errorNoPresent when ok=false. Codes include: unknown_place, unknown_discovery, unknown_doc, q_required, plz_required, coords_required, outside_service_area, url_required, not_maps_host, bad_url, path_or_url_required, serp_not_found, slug_or_coords_required, path_required.
whichNo
localeNoLocale actually used for URLs. maps is German-only: always de (MAPS-E8 — no /en on maps). Requested non-de is ignored; payload locale=de.
relatedNoAlways includes https://maps.ikeytz.com/llms.txt.
summaryNoPrimary text for the model. For discovery tools this is the file window. For list tools a compact one-liner. Quote with attribution.
attributionYesRequired citation: 'Quelle: Schlüsseldienst Ludwigsburg ikeytz (ikeytz.com) · ai-train=no · https://maps.ikeytz.com/.well-known/ai.txt'
canonicalUrlNoBest URL to show the user: https://maps.ikeytz.com… page, public embed JSON, tel:+49…, mailto:…, https://wa.me/…, or a www pointer. Prefer this over constructing URLs.
get_widerrufGet WiderrufA
Read-only
Inspect

WHAT: Returns only a URL to www Widerruf — not withdrawal-policy text. USE when the user asks for Widerruf while on maps and you only need the link. Prefer www MCP get_widerruf or get_legal for the corpus. DOES NOT invent clauses.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

Output Schema

ParametersJSON Schema
NameRequiredDescription
okYestrue = use summary, canonicalUrl, and extra keys. false = do not invent data; read error + hint and retry with valid args or open hint.
npmNowww CLI package @ikeytz/mcp
hintNoPresent when ok=false. Absolute URL or short recovery hint the agent should open or pass to another tool.
htmlNoAbsolute www.ikeytz.com URL — open there or call @ikeytz/mcp
noteNomaps only points; Volltext/Preise/FAQ live on www
toolYesEcho of the tool name that produced this object (e.g. get_service_area).
errorNoPresent when ok=false. Codes include: unknown_place, unknown_discovery, unknown_doc, q_required, plz_required, coords_required, outside_service_area, url_required, not_maps_host, bad_url, path_or_url_required, serp_not_found, slug_or_coords_required, path_required.
localeNoLocale actually used for URLs. maps is German-only: always de (MAPS-E8 — no /en on maps). Requested non-de is ignored; payload locale=de.
relatedNoAlways includes https://maps.ikeytz.com/llms.txt.
summaryNoPrimary text for the model. For discovery tools this is the file window. For list tools a compact one-liner. Quote with attribution.
www_mcpNohttps://www.ikeytz.com/mcp — sister machine for prices/FAQ/corpus
www_toolNoSame tool name on www MCP that holds the real payload
attributionYesRequired citation: 'Quelle: Schlüsseldienst Ludwigsburg ikeytz (ikeytz.com) · ai-train=no · https://maps.ikeytz.com/.well-known/ai.txt'
canonicalUrlNoBest URL to show the user: https://maps.ikeytz.com… page, public embed JSON, tel:+49…, mailto:…, https://wa.me/…, or a www pointer. Prefer this over constructing URLs.
requested_localeNoLocale the caller asked for; maps still returns locale=de

TDQS

A4.1/5.0
Behavior4/5

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

Annotations already declare readOnlyHint=true, so safety is covered. The description adds genuinely useful behavioral context beyond that: it returns a URL only (no policy prose) and 'DOES NOT invent clauses', which is a meaningful hallucination guardrail for an agent.

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

Conciseness5/5

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

Uses a clean WHAT/USE/DOES NOT structure, front-loading the key fact (URL only). Every sentence earns its place, including the terse guardrail against inventing clauses.

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

Completeness4/5

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

With an output schema present, return format need not be explained, and zero params mean no schema gaps. The definition covers what it returns, when to use it, and its limits. Only the ambiguous cross-reference to the 'www MCP' variant keeps it from being fully self-contained.

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

Parameters4/5

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

The tool takes zero parameters, so there is nothing for the description to disambiguate – baseline 4. The schema itself confirms no-argument invocation, and the description does not need to add parameter detail.

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

Purpose4/5

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

States a specific verb and resource ('Returns only a URL to www Widerruf') and even bounds the scope by contrasting with 'withdrawal-policy text.' It distinguishes itself from content siblings like get_legal. The phrase 'Prefer www MCP get_widerruf' is confusingly self-referential, slightly muddying what this variant actually is.

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

Usage Guidelines4/5

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

Explicitly states the condition ('when the user asks for Widerruf while on maps and you only need the link') and names alternatives (get_legal, the www MCP tool). Only weakness is that the named alternative 'www MCP get_widerruf' does not appear in the sibling list, so the routing is not fully resolvable from the definition alone.

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

get_wissen_entryGet Wissen EntryA
Read-only
Inspect

Returns only a maps HTML hand-off to www /wissen/{id}. id required. Does not return the Wissen article body. USE when the user names a Wissen id on maps; use list_wissen for the hub. Prefer www MCP get_wissen_entry for fulltext. NEXT: www get_wissen_entry({id}).

ParametersJSON Schema
NameRequiredDescriptionDefault
idYesRequired Wissen entry id
localeNomaps is German-only (de). Omit or pass de. Other values are ignored; URLs stay https://maps.ikeytz.com/… with no locale prefix. Not a www multi-locale switch — use @ikeytz/mcp list_locales on www for en|fr|ru|fa|ar|tr.de

Output Schema

ParametersJSON Schema
NameRequiredDescription
okYestrue = use summary, canonicalUrl, and extra keys. false = do not invent data; read error + hint and retry with valid args or open hint.
npmNowww CLI package @ikeytz/mcp
hintNoPresent when ok=false. Absolute URL or short recovery hint the agent should open or pass to another tool.
htmlNoAbsolute www.ikeytz.com URL — open there or call @ikeytz/mcp
noteNomaps only points; Volltext/Preise/FAQ live on www
toolYesEcho of the tool name that produced this object (e.g. get_service_area).
errorNoPresent when ok=false. Codes include: unknown_place, unknown_discovery, unknown_doc, q_required, plz_required, coords_required, outside_service_area, url_required, not_maps_host, bad_url, path_or_url_required, serp_not_found, slug_or_coords_required, path_required.
localeNoLocale actually used for URLs. maps is German-only: always de (MAPS-E8 — no /en on maps). Requested non-de is ignored; payload locale=de.
relatedNoAlways includes https://maps.ikeytz.com/llms.txt.
summaryNoPrimary text for the model. For discovery tools this is the file window. For list tools a compact one-liner. Quote with attribution.
www_mcpNohttps://www.ikeytz.com/mcp — sister machine for prices/FAQ/corpus
www_toolNoSame tool name on www MCP that holds the real payload
attributionYesRequired citation: 'Quelle: Schlüsseldienst Ludwigsburg ikeytz (ikeytz.com) · ai-train=no · https://maps.ikeytz.com/.well-known/ai.txt'
canonicalUrlNoBest URL to show the user: https://maps.ikeytz.com… page, public embed JSON, tel:+49…, mailto:…, https://wa.me/…, or a www pointer. Prefer this over constructing URLs.
requested_localeNoLocale the caller asked for; maps still returns locale=de

TDQS

A4/5.0
Behavior4/5

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

Annotations provide readOnlyHint=true, so the safety profile is covered. The description adds meaningful behavioral context beyond that: it does not return the article body, it only produces a hand-off URL, and it points to the www MCP tool for fulltext. The limitation disclosure ('Does not return the Wissen article body') is valuable and non-obvious. Minor gap: no mention of redirect behavior or error cases when id is unknown.

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

Conciseness3/5

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

Front-loaded with the core behavior, but the fragmented, telegraphic style ('Returns only a maps HTML hand-off to www /wissen/{id}. id required.') reads as stitched-together notes. The NEXT clause repeats the tool name and could be tighter. No wasted sentences exactly, but the structure is choppy.

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

Completeness4/5

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

Output schema exists, so return values needn't be explained. The description covers what the tool is not (not the article body), what it is for, alternatives, and the required parameter. It is nearly complete for a simple 2-param read tool; only error/redirect behavior is unstated.

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

Parameters3/5

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

Schema coverage is 100%, including the locale enum explanation, so the schema does the heavy lifting. The description adds that id is required but little beyond the schema. Baseline 3 is appropriate.

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

Purpose4/5

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

States a specific verb and resource (returns a maps HTML hand-off to /wissen/{id}) and explicitly distinguishes itself from the sibling list_wissen and from the www variant. The phrase 'HTML hand-off' is somewhat jargon-y but conveys that this is not the article body. It is clear enough that an agent knows this returns a URL forwarding artifact, not content.

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

Usage Guidelines5/5

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

Explicit use conditions: 'USE when the user names a Wissen id on maps', names the alternative for the hub ('use list_wissen'), and routes to the www tool for fulltext. When/when-not/alternative are all present.

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

list_auswahlList AuswahlB
Read-only
Inspect

WHAT: Returns only a URL to the www Auswahl hub (/auswahl) — not Auswahl items. USE when the user asks for the Auswahl overview on maps. Prefer www MCP list_auswahl for the real item list; prefer maps get_auswahl_item({slug}) only when a slug is known (still URL-only). Optional locale (de|en|fr|ru|fa|ar|tr, default de) selects the www URL language only — it does not list items. DOES NOT list items.

ParametersJSON Schema
NameRequiredDescriptionDefault
localeNomaps is German-only (de). Omit or pass de. Other values are ignored; URLs stay https://maps.ikeytz.com/… with no locale prefix. Not a www multi-locale switch — use @ikeytz/mcp list_locales on www for en|fr|ru|fa|ar|tr.de

Output Schema

ParametersJSON Schema
NameRequiredDescription
okYestrue = use summary, canonicalUrl, and extra keys. false = do not invent data; read error + hint and retry with valid args or open hint.
npmNowww CLI package @ikeytz/mcp
hintNoPresent when ok=false. Absolute URL or short recovery hint the agent should open or pass to another tool.
htmlNoAbsolute www.ikeytz.com URL — open there or call @ikeytz/mcp
noteNomaps only points; Volltext/Preise/FAQ live on www
toolYesEcho of the tool name that produced this object (e.g. get_service_area).
errorNoPresent when ok=false. Codes include: unknown_place, unknown_discovery, unknown_doc, q_required, plz_required, coords_required, outside_service_area, url_required, not_maps_host, bad_url, path_or_url_required, serp_not_found, slug_or_coords_required, path_required.
localeNoLocale actually used for URLs. maps is German-only: always de (MAPS-E8 — no /en on maps). Requested non-de is ignored; payload locale=de.
relatedNoAlways includes https://maps.ikeytz.com/llms.txt.
summaryNoPrimary text for the model. For discovery tools this is the file window. For list tools a compact one-liner. Quote with attribution.
www_mcpNohttps://www.ikeytz.com/mcp — sister machine for prices/FAQ/corpus
www_toolNoSame tool name on www MCP that holds the real payload
attributionYesRequired citation: 'Quelle: Schlüsseldienst Ludwigsburg ikeytz (ikeytz.com) · ai-train=no · https://maps.ikeytz.com/.well-known/ai.txt'
canonicalUrlNoBest URL to show the user: https://maps.ikeytz.com… page, public embed JSON, tel:+49…, mailto:…, https://wa.me/…, or a www pointer. Prefer this over constructing URLs.
requested_localeNoLocale the caller asked for; maps still returns locale=de

TDQS

B3.4/5.0
Behavior3/5

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

readOnlyHint=true already marks this as a safe read; the description usefully adds that the output is a URL only and explicitly not an item list. However, it also asserts the locale 'selects the www URL language', which contradicts the schema's statement that URLs carry no locale prefix — a partially inaccurate behavioral claim.

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

Conciseness3/5

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

The WHAT/USE front-loading is good, but the same negation is repeated three times ('not Auswahl items', 'it does not list items', 'DOES NOT list items') and the stale seven-value locale enumeration is dead weight that also misleads.

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

Completeness3/5

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

An output schema exists, so return shape needn't be spelled out, and the description covers the core routing job well. It falls short because its parameter guidance is wrong, leaving an agent with contradictory locale instructions it must resolve by reading the schema.

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

Parameters1/5

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

The description claims locale accepts de|en|fr|ru|fa|ar|tr, but the schema enum is ['de'] and the schema explicitly says other values are ignored and that this is 'Not a www multi-locale switch'. Even at 100% schema coverage, the description actively contradicts the authoritative schema rather than reinforcing it.

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

Purpose4/5

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

The description states a specific operation and scope: it returns a URL to the www Auswahl hub (/auswahl), not Auswahl items, and it names the siblings it differs from (www list_auswahl, get_auswahl_item). The only dent is the misleading tool name 'list_auswahl', which the description has to spend effort correcting.

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

Usage Guidelines5/5

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

Explicit when-to-use ('when the user asks for the Auswahl overview on maps') plus two named alternatives with the condition that selects each ('prefer www MCP list_auswahl for the real item list'; 'get_auswahl_item({slug}) only when a slug is known'). Nothing is left to inference.

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

list_faqList FaqA
Read-only
Inspect

Returns only a maps HTML hand-off to www /faq. Does not return FAQ question rows or answers. USE for the FAQ hub on maps; use get_faq when an id/q is known (still a hand-off). Prefer www MCP list_faq / get_faq for real FAQ data. NEXT: www list_faq; maps get_faq.

ParametersJSON Schema
NameRequiredDescriptionDefault
localeNomaps is German-only (de). Omit or pass de. Other values are ignored; URLs stay https://maps.ikeytz.com/… with no locale prefix. Not a www multi-locale switch — use @ikeytz/mcp list_locales on www for en|fr|ru|fa|ar|tr.de

Output Schema

ParametersJSON Schema
NameRequiredDescription
okYestrue = use summary, canonicalUrl, and extra keys. false = do not invent data; read error + hint and retry with valid args or open hint.
npmNowww CLI package @ikeytz/mcp
hintNoPresent when ok=false. Absolute URL or short recovery hint the agent should open or pass to another tool.
htmlNoAbsolute www.ikeytz.com URL — open there or call @ikeytz/mcp
noteNomaps only points; Volltext/Preise/FAQ live on www
toolYesEcho of the tool name that produced this object (e.g. get_service_area).
errorNoPresent when ok=false. Codes include: unknown_place, unknown_discovery, unknown_doc, q_required, plz_required, coords_required, outside_service_area, url_required, not_maps_host, bad_url, path_or_url_required, serp_not_found, slug_or_coords_required, path_required.
localeNoLocale actually used for URLs. maps is German-only: always de (MAPS-E8 — no /en on maps). Requested non-de is ignored; payload locale=de.
relatedNoAlways includes https://maps.ikeytz.com/llms.txt.
summaryNoPrimary text for the model. For discovery tools this is the file window. For list tools a compact one-liner. Quote with attribution.
www_mcpNohttps://www.ikeytz.com/mcp — sister machine for prices/FAQ/corpus
www_toolNoSame tool name on www MCP that holds the real payload
attributionYesRequired citation: 'Quelle: Schlüsseldienst Ludwigsburg ikeytz (ikeytz.com) · ai-train=no · https://maps.ikeytz.com/.well-known/ai.txt'
canonicalUrlNoBest URL to show the user: https://maps.ikeytz.com… page, public embed JSON, tel:+49…, mailto:…, https://wa.me/…, or a www pointer. Prefer this over constructing URLs.
requested_localeNoLocale the caller asked for; maps still returns locale=de

TDQS

A4.3/5.0
Behavior4/5

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

Annotations only declare readOnlyHint=true, so the description carries the burden of the important behavioral fact: the tool returns a hand-off URL, not actual FAQ content. That is genuine value beyond structured data, though it says nothing about error behavior or the hand-off's shape.

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

Conciseness4/5

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

Front-loaded with the key fact (hand-off, not data) in the first sentence, which is the right priority. However, the telegraphic phrasing and the trailing 'NEXT: www list_faq; maps get_faq' fragment are slightly cryptic and overlap with the earlier routing guidance.

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

Completeness4/5

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

An output schema exists, so return-value detail is not required, and the description covers the hand-off nature plus routing. What remains unstated (e.g., what the hand-off payload looks like) is reasonably delegated to the output schema.

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

Parameters3/5

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

Schema description coverage is 100%; the locale enum and its German-only constraint are fully documented in the schema itself, including the note about www multi-locale switching. The description adds no parameter-level meaning beyond that, so the baseline 3 applies.

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

Purpose5/5

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

The description states a specific behavior ('Returns only a maps HTML hand-off to www /faq') and explicitly negates the obvious misreading ('Does not return FAQ question rows or answers'). It cleanly distinguishes itself from the get_faq sibling, so an agent can tell them apart without opening schemas.

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

Usage Guidelines5/5

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

It gives an explicit when-to-use ('USE for the FAQ hub on maps') and a conditional alternative ('use get_faq when an id/q is known'), plus a routing preference to the www MCP for real data. The condition selecting each tool is spelled out rather than left to inference.

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

list_localesList LocalesA
Read-only
Inspect

WHAT: Locales on maps — only de (MAPS-E8: no /en). Call with {}. RETURNS items[{locale,url}]. USE before resolve_locale_url. DOES NOT list www's seven locales — use @ikeytz/mcp list_locales for those.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

Output Schema

ParametersJSON Schema
NameRequiredDescription
okYestrue = use summary, canonicalUrl, and extra keys. false = do not invent data; read error + hint and retry with valid args or open hint.
hintNoPresent when ok=false. Absolute URL or short recovery hint the agent should open or pass to another tool.
noteNo
toolYesEcho of the tool name that produced this object (e.g. get_service_area).
errorNoPresent when ok=false. Codes include: unknown_place, unknown_discovery, unknown_doc, q_required, plz_required, coords_required, outside_service_area, url_required, not_maps_host, bad_url, path_or_url_required, serp_not_found, slug_or_coords_required, path_required.
itemsNoOnly de
localeNoLocale actually used for URLs. maps is German-only: always de (MAPS-E8 — no /en on maps). Requested non-de is ignored; payload locale=de.
relatedNoAlways includes https://maps.ikeytz.com/llms.txt.
summaryNoPrimary text for the model. For discovery tools this is the file window. For list tools a compact one-liner. Quote with attribution.
attributionYesRequired citation: 'Quelle: Schlüsseldienst Ludwigsburg ikeytz (ikeytz.com) · ai-train=no · https://maps.ikeytz.com/.well-known/ai.txt'
canonicalUrlNoBest URL to show the user: https://maps.ikeytz.com… page, public embed JSON, tel:+49…, mailto:…, https://wa.me/…, or a www pointer. Prefer this over constructing URLs.

TDQS

A4.6/5.0
Behavior4/5

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

Annotations only supply readOnlyHint=true, which the description does not merely repeat. It adds real behavioral context: the result set is restricted to a single locale despite the plural tool name, the return shape is items[{locale,url}], and it is a prerequisite for resolve_locale_url. It stops short of covering failure modes, but for a no-arg read that is a minor omission.

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

Conciseness4/5

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

Four labeled fragments (WHAT/RETURNS/USE/DOES NOT) front-load the scope restriction and route the agent quickly. The "Call with {}" clause duplicates the schema's own no-argument declaration and is the one sentence that does not earn its place.

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

Completeness5/5

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

An output schema exists, yet the description still names the returned fields, and it covers scope, invocation, ordering, and the sibling alternative. Nothing needed to call this tool correctly is absent.

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

Parameters4/5

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

Zero parameters, so the baseline is 4. "Call with {}" only restates what the schema already enforces via additionalProperties:false, but no parameter meaning is missing or misleading.

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

Purpose5/5

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

States a specific verb+resource ("Locales on maps") and immediately narrows the scope to a single value ("only de (MAPS-E8: no /en)"). It also disambiguates from a same-named tool on a different server, so an agent can separate it from every sibling in the list.

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

Usage Guidelines5/5

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

Explicit sequencing ("USE before resolve_locale_url") tells the agent where this fits in a workflow, and "DOES NOT list www's seven locales — use @ikeytz/mcp list_locales for those" names the alternative and the condition that selects it. Both when-to-use and when-not-to-use are covered.

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

list_navList NavA
Read-only
Inspect

WHAT: maps navigation links — Hub, MCP, Urheberrecht, plus all 52 Gebiet URLs. USE to pick a maps page. DOES NOT include www header hubs (Preise/FAQ). NEXT: get_embed_map, get_page_summary.

ParametersJSON Schema
NameRequiredDescriptionDefault
localeNomaps is German-only (de). Omit or pass de. Other values are ignored; URLs stay https://maps.ikeytz.com/… with no locale prefix. Not a www multi-locale switch — use @ikeytz/mcp list_locales on www for en|fr|ru|fa|ar|tr.de

Output Schema

ParametersJSON Schema
NameRequiredDescription
okYestrue = use summary, canonicalUrl, and extra keys. false = do not invent data; read error + hint and retry with valid args or open hint.
hintNoPresent when ok=false. Absolute URL or short recovery hint the agent should open or pass to another tool.
noteNo
toolYesEcho of the tool name that produced this object (e.g. get_service_area).
countNo
errorNoPresent when ok=false. Codes include: unknown_place, unknown_discovery, unknown_doc, q_required, plz_required, coords_required, outside_service_area, url_required, not_maps_host, bad_url, path_or_url_required, serp_not_found, slug_or_coords_required, path_required.
itemsNoNav links {label,url,slug?}
localeNoLocale actually used for URLs. maps is German-only: always de (MAPS-E8 — no /en on maps). Requested non-de is ignored; payload locale=de.
relatedNoAlways includes https://maps.ikeytz.com/llms.txt.
summaryNoPrimary text for the model. For discovery tools this is the file window. For list tools a compact one-liner. Quote with attribution.
attributionYesRequired citation: 'Quelle: Schlüsseldienst Ludwigsburg ikeytz (ikeytz.com) · ai-train=no · https://maps.ikeytz.com/.well-known/ai.txt'
canonicalUrlNoBest URL to show the user: https://maps.ikeytz.com… page, public embed JSON, tel:+49…, mailto:…, https://wa.me/…, or a www pointer. Prefer this over constructing URLs.

TDQS

A4.1/5.0
Behavior4/5

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

Annotations only declare readOnlyHint=true, so the safety profile is already covered and the bar is lower. The description adds real behavioral context: the exact content boundary (52 Gebiet URLs, excludes www header hubs), which tells the agent what will and will not appear in the result. No pagination or format notes, but the output schema presumably covers the return shape.

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

Conciseness5/5

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

The WHAT / USE / DOES NOT / NEXT structure is front-loaded and dense with zero filler — every clause carries selection-relevant information. Ideal size for a simple list tool.

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

Completeness5/5

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

For a read-only listing tool with a fully documented single parameter and an existing output schema, this covers the essentials: what is listed, what is deliberately omitted, and what to call next. Nothing an agent needs to invoke it correctly is missing.

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

Parameters3/5

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

Schema description coverage is 100% and the locale parameter is documented exhaustively in the schema itself (German-only, other values ignored, not a www multi-locale switch). The description says nothing about locale, so it neither adds nor detracts — baseline 3 for a schema that does all the work.

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

Purpose4/5

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

The description names a specific verb (maps/lists) and resource (navigation links) and enumerates concrete contents: Hub, MCP, Urheberrecht, and all 52 Gebiet URLs. It also scopes itself against adjacent concepts by excluding www header hubs (Preise/FAQ), though it stops short of naming the sibling tools (e.g. list_footer, get_hub) that cover that excluded ground.

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

Usage Guidelines4/5

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

'USE to pick a maps page' gives a clear selection context, and the explicit exclusion of www header hubs is a genuine when-not statement. 'NEXT: get_embed_map, get_page_summary' signals a chaining pattern, though it does not say which tool handles the excluded Preise/FAQ cases, leaving one alternative unresolved.

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

list_plzList PlzA
Read-only
Inspect

WHAT: PLZ → slugs map for the 52 Gebiete (shared postcodes visible). Call with {}. RETURNS items[{plz,count,slugs}]. USE to see multi-Gebiet PLZ. NEXT: find_by_plz.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

Output Schema

ParametersJSON Schema
NameRequiredDescription
okYestrue = use summary, canonicalUrl, and extra keys. false = do not invent data; read error + hint and retry with valid args or open hint.
hintNoPresent when ok=false. Absolute URL or short recovery hint the agent should open or pass to another tool.
toolYesEcho of the tool name that produced this object (e.g. get_service_area).
countNoDistinct PLZ count
errorNoPresent when ok=false. Codes include: unknown_place, unknown_discovery, unknown_doc, q_required, plz_required, coords_required, outside_service_area, url_required, not_maps_host, bad_url, path_or_url_required, serp_not_found, slug_or_coords_required, path_required.
itemsNoPLZ groups
localeNoLocale actually used for URLs. maps is German-only: always de (MAPS-E8 — no /en on maps). Requested non-de is ignored; payload locale=de.
relatedNoAlways includes https://maps.ikeytz.com/llms.txt.
summaryNoPrimary text for the model. For discovery tools this is the file window. For list tools a compact one-liner. Quote with attribution.
attributionYesRequired citation: 'Quelle: Schlüsseldienst Ludwigsburg ikeytz (ikeytz.com) · ai-train=no · https://maps.ikeytz.com/.well-known/ai.txt'
canonicalUrlNoBest URL to show the user: https://maps.ikeytz.com… page, public embed JSON, tel:+49…, mailto:…, https://wa.me/…, or a www pointer. Prefer this over constructing URLs.

TDQS

A4.1/5.0
Behavior3/5

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

The readOnlyHint already declares this a safe read, so the bar is lower, and the description does add that only shared/multi-assignment postcodes appear plus the 52-Gebiete scope. Beyond that there is no auth, rate-limit, or ordering context, so it is adequate but not rich.

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

Conciseness4/5

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

Four telegraphic WHAT/CALL/RETURNS/USE/NEXT labels, front-loaded and free of filler. The clipped all-caps style is efficient, though the RETURNS line duplicates information available in the output schema.

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

Completeness4/5

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

With an output schema present, the return shape need not be explained, and annotations cover the safety profile; the description supplies purpose, the empty call, and the next tool. Nothing critical is missing for a no-arg listing tool, though the sibling boundary with find_by_gebiet stays implicit.

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

Parameters4/5

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

Zero parameters, so the baseline is 4, and schema coverage is already 100%. The 'Call with {}' line merely restates the empty-args fact the schema already documents, adding no new semantics.

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

Purpose5/5

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

States a specific verb and resource: a PLZ→slugs map covering the 52 Gebiete. The phrase 'shared postcodes visible' and the sibling list make it distinguishable from list_slugs (plain slug list) and find_by_plz (a lookup).

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

Usage Guidelines4/5

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

'USE to see multi-Gebiet PLZ' gives a clear selection condition, and 'NEXT: find_by_plz' routes the agent onward. It stops short of naming when NOT to use it versus find_by_gebiet or find_by_area, so it is context without exclusions.

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

list_ratgeberList RatgeberA
Read-only
Inspect

WHAT: Returns only a URL to the www Ratgeber hub (/ratgeber) — not titles or article bodies. USE when the user asks for the Ratgeber overview on maps. Prefer www MCP list_ratgeber for the real list; prefer maps get_ratgeber({slug}) only when a slug is known (still URL-only). Optional locale (de|en|fr|ru|fa|ar|tr, default de) selects the www URL language only. DOES NOT list Ratgeber entries.

ParametersJSON Schema
NameRequiredDescriptionDefault
localeNomaps is German-only (de). Omit or pass de. Other values are ignored; URLs stay https://maps.ikeytz.com/… with no locale prefix. Not a www multi-locale switch — use @ikeytz/mcp list_locales on www for en|fr|ru|fa|ar|tr.de

Output Schema

ParametersJSON Schema
NameRequiredDescription
okYestrue = use summary, canonicalUrl, and extra keys. false = do not invent data; read error + hint and retry with valid args or open hint.
npmNowww CLI package @ikeytz/mcp
hintNoPresent when ok=false. Absolute URL or short recovery hint the agent should open or pass to another tool.
htmlNoAbsolute www.ikeytz.com URL — open there or call @ikeytz/mcp
noteNomaps only points; Volltext/Preise/FAQ live on www
toolYesEcho of the tool name that produced this object (e.g. get_service_area).
errorNoPresent when ok=false. Codes include: unknown_place, unknown_discovery, unknown_doc, q_required, plz_required, coords_required, outside_service_area, url_required, not_maps_host, bad_url, path_or_url_required, serp_not_found, slug_or_coords_required, path_required.
localeNoLocale actually used for URLs. maps is German-only: always de (MAPS-E8 — no /en on maps). Requested non-de is ignored; payload locale=de.
relatedNoAlways includes https://maps.ikeytz.com/llms.txt.
summaryNoPrimary text for the model. For discovery tools this is the file window. For list tools a compact one-liner. Quote with attribution.
www_mcpNohttps://www.ikeytz.com/mcp — sister machine for prices/FAQ/corpus
www_toolNoSame tool name on www MCP that holds the real payload
attributionYesRequired citation: 'Quelle: Schlüsseldienst Ludwigsburg ikeytz (ikeytz.com) · ai-train=no · https://maps.ikeytz.com/.well-known/ai.txt'
canonicalUrlNoBest URL to show the user: https://maps.ikeytz.com… page, public embed JSON, tel:+49…, mailto:…, https://wa.me/…, or a www pointer. Prefer this over constructing URLs.
requested_localeNoLocale the caller asked for; maps still returns locale=de

TDQS

A4.2/5.0
Behavior4/5

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

Annotations carry only readOnlyHint=true and the title, so safety is covered; the description adds real behavioral context by clarifying the return is URL-only (no titles or bodies) and that it does not list entries. It does not touch auth needs or edge-case behavior, but the output schema exists to cover the return shape. No annotation contradiction.

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

Conciseness4/5

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

Front-loaded WHAT/USE/PREFER structure with no wasted sentences; each clause adds routing or scoping value. It is slightly dense with cross-server references (www MCP, maps) that require careful reading, but stays compact.

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

Completeness4/5

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

An output schema exists, so return-shape detail is not the description's burden, and the description fully covers what the tool is and is not. The one completeness gap is the locale guidance that contradicts the schema, which could lead an agent to pass an invalid value.

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

Parameters2/5

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

Schema coverage is 100%, which would normally anchor a 3, but the description actively conflicts with the schema: it claims locale accepts 'de|en|fr|ru|fa|ar|tr' and 'selects the www URL language only,' while the schema enum is ['de'] and its description states maps is German-only with URLs staying https://maps.ikeytz.com/ and no locale prefix. Misleading parameter guidance is worse than silence, so this drops below baseline.

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

Purpose5/5

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

States a precise verb and resource: 'Returns only a URL to the www Ratgeber hub (/ratgeber) — not titles or article bodies,' and explicitly disclaims what the name implies ('DOES NOT list Ratgeber entries'). It differentiates itself from get_ratgeber({slug}) and the www variant, so an agent can tell it apart from siblings without opening a schema.

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

Usage Guidelines5/5

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

Explicit routing guidance: 'USE when the user asks for the Ratgeber overview on maps,' plus two named alternatives with the conditions that select them ('Prefer www MCP list_ratgeber for the real list; prefer maps get_ratgeber({slug}) only when a slug is known'). When-to-use, when-not-to-use, and alternatives are all present.

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

list_service_areasList Service Areas
Read-only
Inspect

WHAT: List all 52 ikeytz Einsatzgebiete on maps.ikeytz.com as point cards (slug, name, plz, lat/lng, embed_map, geo_api, grenze_api, punkt_api) — not polygons. Also public Sammel: /api/v1/embed/orte · /orte/grenzen · /orte/punkte. RETURNS items[], count, total, offset, limit. Optional fields= comma filter; limit/offset page the list. USE to enumerate the service area or build a picker. DOES NOT return OSM boundaries in the list (use get_grenze or GET grenze_api per slug) or prices. NEXT: get_service_area, get_embed_map, get_grenze, find_by_plz.

ParametersJSON Schema
NameRequiredDescriptionDefault
limitNoMaximum items or lines to return after offset. Omit = all remaining in the window (subject to tool-specific clamps). For geo near-search default is often 5 without radius_km, up to 52 with radius.
fieldsNoOptional field filter: comma-separated names or array. Keeps envelope keys (ok, tool, summary, canonicalUrl, attribution, locale, related, count, total, offset, limit, compact) plus listed fields. Example: slug,name,plz,lat,lng.
localeNomaps is German-only (de). Omit or pass de. Other values are ignored; URLs stay https://maps.ikeytz.com/… with no locale prefix. Not a www multi-locale switch — use @ikeytz/mcp list_locales on www for en|fr|ru|fa|ar|tr.de
offsetNo0-based index into a list or discovery file lines (split on \n). 0 = first. Omit = 0. Combine with limit to page. Use nextOffset / offset+limit from a previous result when present.

Output Schema

ParametersJSON Schema
NameRequiredDescription
okYestrue = use summary, canonicalUrl, and extra keys. false = do not invent data; read error + hint and retry with valid args or open hint.
hintNoPresent when ok=false. Absolute URL or short recovery hint the agent should open or pass to another tool.
toolYesEcho of the tool name that produced this object (e.g. get_service_area).
countNoItems in this page
errorNoPresent when ok=false. Codes include: unknown_place, unknown_discovery, unknown_doc, q_required, plz_required, coords_required, outside_service_area, url_required, not_maps_host, bad_url, path_or_url_required, serp_not_found, slug_or_coords_required, path_required.
itemsNoService-area point cards
limitNoApplied limit
totalNoTotal Gebiete (52)
localeNoLocale actually used for URLs. maps is German-only: always de (MAPS-E8 — no /en on maps). Requested non-de is ignored; payload locale=de.
offsetNoApplied offset
relatedNoAlways includes https://maps.ikeytz.com/llms.txt.
summaryNoPrimary text for the model. For discovery tools this is the file window. For list tools a compact one-liner. Quote with attribution.
attributionYesRequired citation: 'Quelle: Schlüsseldienst Ludwigsburg ikeytz (ikeytz.com) · ai-train=no · https://maps.ikeytz.com/.well-known/ai.txt'
canonicalUrlNoBest URL to show the user: https://maps.ikeytz.com… page, public embed JSON, tel:+49…, mailto:…, https://wa.me/…, or a www pointer. Prefer this over constructing URLs.
list_servicesList ServicesA
Read-only
Inspect

WHAT: Returns only a URL to www /leistungen — not Leistungs rows or prices. USE when the user asks for services while on maps and you only need the link. Prefer www MCP list_services for the real catalog. Optional locale (de|en|fr|ru|fa|ar|tr, default de) selects the www URL language only — it does not load service rows. DOES NOT invent service rows.

ParametersJSON Schema
NameRequiredDescriptionDefault
localeNomaps is German-only (de). Omit or pass de. Other values are ignored; URLs stay https://maps.ikeytz.com/… with no locale prefix. Not a www multi-locale switch — use @ikeytz/mcp list_locales on www for en|fr|ru|fa|ar|tr.de

Output Schema

ParametersJSON Schema
NameRequiredDescription
okYestrue = use summary, canonicalUrl, and extra keys. false = do not invent data; read error + hint and retry with valid args or open hint.
npmNowww CLI package @ikeytz/mcp
hintNoPresent when ok=false. Absolute URL or short recovery hint the agent should open or pass to another tool.
htmlNoAbsolute www.ikeytz.com URL — open there or call @ikeytz/mcp
noteNomaps only points; Volltext/Preise/FAQ live on www
toolYesEcho of the tool name that produced this object (e.g. get_service_area).
errorNoPresent when ok=false. Codes include: unknown_place, unknown_discovery, unknown_doc, q_required, plz_required, coords_required, outside_service_area, url_required, not_maps_host, bad_url, path_or_url_required, serp_not_found, slug_or_coords_required, path_required.
localeNoLocale actually used for URLs. maps is German-only: always de (MAPS-E8 — no /en on maps). Requested non-de is ignored; payload locale=de.
relatedNoAlways includes https://maps.ikeytz.com/llms.txt.
summaryNoPrimary text for the model. For discovery tools this is the file window. For list tools a compact one-liner. Quote with attribution.
www_mcpNohttps://www.ikeytz.com/mcp — sister machine for prices/FAQ/corpus
www_toolNoSame tool name on www MCP that holds the real payload
attributionYesRequired citation: 'Quelle: Schlüsseldienst Ludwigsburg ikeytz (ikeytz.com) · ai-train=no · https://maps.ikeytz.com/.well-known/ai.txt'
canonicalUrlNoBest URL to show the user: https://maps.ikeytz.com… page, public embed JSON, tel:+49…, mailto:…, https://wa.me/…, or a www pointer. Prefer this over constructing URLs.
requested_localeNoLocale the caller asked for; maps still returns locale=de

TDQS

A4.2/5.0
Behavior4/5

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

Annotations only declare readOnlyHint=true, so the description carries the rest and does so well: it discloses that the output is a bare URL, that no rows/prices are returned, and that it will not fabricate service rows. It does not mention pagination or exactly which URL field is returned, but those are minor given the output schema exists.

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

Conciseness4/5

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

WHAT / USE / DOES-NOT structure is front-loaded and scannable, with the key non-obvious constraint (returns only a link) leading. Slightly redundant with the schema text on locale, which costs a point.

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

Completeness4/5

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

Given a single optional param, read-only annotation, and an existing output schema, the description covers routing, scope, and failure mode adequately. The remaining gap is that its locale guidance conflicts with the schema rather than amplifying it.

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

Parameters2/5

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

Schema coverage is 100% so the baseline would be 3, but the description actively misleads: it advertises locale as 'de|en|fr|ru|fa|ar|tr' while the schema enum only permits 'de' and the schema text states other values are ignored. The claim that locale 'selects the www URL language only' contradicts the German-only maps schema description, so the added parameter text is worse than silence.

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

Purpose5/5

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

States a specific verb+resource (returns a URL to www/leistungen) and explicitly bounds it by what it is NOT (not Leistungs rows or prices). An agent can distinguish it from the many list_* siblings and from the www MCP's list_services without opening a schema.

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

Usage Guidelines5/5

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

Gives explicit when-to-use (user asks for services while on maps and only the link is needed) and names the preferred alternative (www MCP list_services for the real catalog). Routing is unambiguous.

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

list_slugsList SlugsA
Read-only
Inspect

WHAT: All 52 maps slugs as a flat string array. Call with {}. USE for validation or autocomplete. NEXT: get_service_area(slug), get_embed_map(slug).

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

Output Schema

ParametersJSON Schema
NameRequiredDescription
okYestrue = use summary, canonicalUrl, and extra keys. false = do not invent data; read error + hint and retry with valid args or open hint.
hintNoPresent when ok=false. Absolute URL or short recovery hint the agent should open or pass to another tool.
toolYesEcho of the tool name that produced this object (e.g. get_service_area).
countNo52
errorNoPresent when ok=false. Codes include: unknown_place, unknown_discovery, unknown_doc, q_required, plz_required, coords_required, outside_service_area, url_required, not_maps_host, bad_url, path_or_url_required, serp_not_found, slug_or_coords_required, path_required.
itemsNoSlug strings
localeNoLocale actually used for URLs. maps is German-only: always de (MAPS-E8 — no /en on maps). Requested non-de is ignored; payload locale=de.
relatedNoAlways includes https://maps.ikeytz.com/llms.txt.
summaryNoPrimary text for the model. For discovery tools this is the file window. For list tools a compact one-liner. Quote with attribution.
attributionYesRequired citation: 'Quelle: Schlüsseldienst Ludwigsburg ikeytz (ikeytz.com) · ai-train=no · https://maps.ikeytz.com/.well-known/ai.txt'
canonicalUrlNoBest URL to show the user: https://maps.ikeytz.com… page, public embed JSON, tel:+49…, mailto:…, https://wa.me/…, or a www pointer. Prefer this over constructing URLs.

TDQS

A4.5/5.0
Behavior3/5

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

The readOnlyHint already tells the agent this is a safe read, and the schema documents the empty-argument call ('Call with {}'). The description adds the return shape (flat string array of 52 entries), which is useful but partly redundant with the existing output schema. A 3 is appropriate given annotations and output schema carry most of the burden.

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

Conciseness5/5

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

Three compact clauses labeled WHAT/USE/NEXT, front-loading the resource and scope before usage and follow-ups. Every sentence earns its place with no filler.

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

Completeness5/5

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

For a no-argument, read-only list tool with an output schema, the description covers purpose, invocation, use cases, and next steps. Nothing an agent needs to call it correctly is missing.

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

Parameters4/5

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

The tool takes zero parameters, so the baseline is 4. The schema fully documents the empty-object contract, and the description reinforces 'Call with {}' without needing to add parameter detail.

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

Purpose5/5

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

States a specific verb (list) and resource (maps slugs) and quantifies the result ('all 52 maps slugs as a flat string array'). This distinguishes it cleanly from siblings like list_service_areas or list_plz, which return different resources.

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

Usage Guidelines5/5

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

Gives explicit use cases ('validation or autocomplete') and names the follow-up tools (get_service_area(slug), get_embed_map(slug)), so an agent knows both when to call it and what to do next. Nothing is left to inference.

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

list_whatsapp_optionsList Whatsapp Options
Read-only
Inspect

WHAT: WhatsApp situation options (link only). Same 12 contactOption ids as www: opening_slam_day|opening_slam_night|opening_locked_day|opening_locked_night|pkg_key_slam_day|pkg_key_slam_night|pkg_key_locked_day|pkg_key_locked_night|cylinder_only_day|cylinder_only_night|cylinder_mount|beratung. Deprecated aliases zugefallen|abgeschlossen|zylinder → day invoices. No form submit. USE before compose_whatsapp. DOES NOT send a message. NEXT: compose_whatsapp(option), compose_tel_mobile.

ParametersJSON Schema
NameRequiredDescriptionDefault
localeNomaps is German-only (de). Omit or pass de. Other values are ignored; URLs stay https://maps.ikeytz.com/… with no locale prefix. Not a www multi-locale switch — use @ikeytz/mcp list_locales on www for en|fr|ru|fa|ar|tr.de

Output Schema

ParametersJSON Schema
NameRequiredDescription
okYestrue = use summary, canonicalUrl, and extra keys. false = do not invent data; read error + hint and retry with valid args or open hint.
hintNoPresent when ok=false. Absolute URL or short recovery hint the agent should open or pass to another tool.
noteNoLink only; Festpreis SSOT remains www
toolYesEcho of the tool name that produced this object (e.g. get_service_area).
errorNoPresent when ok=false. Codes include: unknown_place, unknown_discovery, unknown_doc, q_required, plz_required, coords_required, outside_service_area, url_required, not_maps_host, bad_url, path_or_url_required, serp_not_found, slug_or_coords_required, path_required.
itemsNoOptions {id,label,href}
localeNoLocale actually used for URLs. maps is German-only: always de (MAPS-E8 — no /en on maps). Requested non-de is ignored; payload locale=de.
relatedNoAlways includes https://maps.ikeytz.com/llms.txt.
summaryNoPrimary text for the model. For discovery tools this is the file window. For list tools a compact one-liner. Quote with attribution.
attributionYesRequired citation: 'Quelle: Schlüsseldienst Ludwigsburg ikeytz (ikeytz.com) · ai-train=no · https://maps.ikeytz.com/.well-known/ai.txt'
canonicalUrlNoBest URL to show the user: https://maps.ikeytz.com… page, public embed JSON, tel:+49…, mailto:…, https://wa.me/…, or a www pointer. Prefer this over constructing URLs.
deprecated_aliasesNoOld ids → day invoice (ambiguous)
list_wissenList WissenA
Read-only
Inspect

WHAT: Returns only a URL to the www Wissen hub (/wissen) — not lexicon entries or article text. USE when the user asks for the Wissen overview on maps. Prefer www MCP list_wissen for the real index; prefer maps get_wissen_entry({id}) only as a URL hand-off for one id. DOES NOT list entries.

ParametersJSON Schema
NameRequiredDescriptionDefault
localeNomaps is German-only (de). Omit or pass de. Other values are ignored; URLs stay https://maps.ikeytz.com/… with no locale prefix. Not a www multi-locale switch — use @ikeytz/mcp list_locales on www for en|fr|ru|fa|ar|tr.de

Output Schema

ParametersJSON Schema
NameRequiredDescription
okYestrue = use summary, canonicalUrl, and extra keys. false = do not invent data; read error + hint and retry with valid args or open hint.
npmNowww CLI package @ikeytz/mcp
hintNoPresent when ok=false. Absolute URL or short recovery hint the agent should open or pass to another tool.
htmlNoAbsolute www.ikeytz.com URL — open there or call @ikeytz/mcp
noteNomaps only points; Volltext/Preise/FAQ live on www
toolYesEcho of the tool name that produced this object (e.g. get_service_area).
errorNoPresent when ok=false. Codes include: unknown_place, unknown_discovery, unknown_doc, q_required, plz_required, coords_required, outside_service_area, url_required, not_maps_host, bad_url, path_or_url_required, serp_not_found, slug_or_coords_required, path_required.
localeNoLocale actually used for URLs. maps is German-only: always de (MAPS-E8 — no /en on maps). Requested non-de is ignored; payload locale=de.
relatedNoAlways includes https://maps.ikeytz.com/llms.txt.
summaryNoPrimary text for the model. For discovery tools this is the file window. For list tools a compact one-liner. Quote with attribution.
www_mcpNohttps://www.ikeytz.com/mcp — sister machine for prices/FAQ/corpus
www_toolNoSame tool name on www MCP that holds the real payload
attributionYesRequired citation: 'Quelle: Schlüsseldienst Ludwigsburg ikeytz (ikeytz.com) · ai-train=no · https://maps.ikeytz.com/.well-known/ai.txt'
canonicalUrlNoBest URL to show the user: https://maps.ikeytz.com… page, public embed JSON, tel:+49…, mailto:…, https://wa.me/…, or a www pointer. Prefer this over constructing URLs.
requested_localeNoLocale the caller asked for; maps still returns locale=de

TDQS

A4.4/5.0
Behavior4/5

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

Annotations only declare readOnlyHint=true, so the description carries the rest of the burden and does well: it discloses that the return is a bare URL, not an index of entries, which preempts a likely misread of a 'list_*' name. It adds no detail on redirection or URL shape, but an output schema exists to cover the payload.

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

Conciseness5/5

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

Three short clauses in WHAT/USE/DOES-NOT order, front-loading the surprising fact (returns only a URL) before usage and exclusions. No filler sentences.

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

Completeness4/5

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

Scope, trigger, alternatives, and exclusions are all covered, and the output schema handles return-value detail, so an agent can select and call this correctly. Minor residual ambiguity: the phrase 'Prefer www MCP list_wissen' names a same-named tool on another server, which could momentarily blur which list_wissen is being invoked.

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

Parameters3/5

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

With a single optional locale parameter at 100% schema description coverage, the schema already documents the German-only behavior and the no-locale-prefix rule. The description adds no parameter-level meaning beyond that, so the baseline 3 applies.

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

Purpose5/5

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

States a specific verb+resource (returns a URL to the Wissen hub at /wissen) and immediately disambiguates scope: 'not lexicon entries or article text' / 'DOES NOT list entries.' This clearly separates it from sibling get_wissen_entry without opening either schema.

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

Usage Guidelines5/5

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

Explicit trigger ('USE when the user asks for the Wissen overview on maps') plus named alternatives with selection conditions: the www MCP list_wissen for the real index, and maps get_wissen_entry({id}) for a single-id URL hand-off. Nothing is left to inference.

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

resolve_locale_urlResolve Locale UrlA
Read-only
Inspect

WHAT: path + locale → maps URL. maps is de-only: non-de requested still yields https://maps.ikeytz.com{path} with locale=de. Known Gebiet paths resolve to maps; unknown paths may www-pointer. REQUIRED path and locale. DOES NOT create /en on maps. NEXT: get_embed_map, www resolve_locale_url for marketing locales.

ParametersJSON Schema
NameRequiredDescriptionDefault
pathYesRequired. Path starting with / (e.g. /pattonville) or a maps URL.
localeYesRequired. Only de is meaningful on maps; others ignored with a note.

Output Schema

ParametersJSON Schema
NameRequiredDescription
okYestrue = use summary, canonicalUrl, and extra keys. false = do not invent data; read error + hint and retry with valid args or open hint.
hintNoPresent when ok=false. Absolute URL or short recovery hint the agent should open or pass to another tool.
htmlNoPresent when falling through to www pointer
noteNo
pathNoNormalized path
slugNoWhen a Gebiet matched
toolYesEcho of the tool name that produced this object (e.g. get_service_area).
errorNoPresent when ok=false. Codes include: unknown_place, unknown_discovery, unknown_doc, q_required, plz_required, coords_required, outside_service_area, url_required, not_maps_host, bad_url, path_or_url_required, serp_not_found, slug_or_coords_required, path_required.
localeNo
relatedNoAlways includes https://maps.ikeytz.com/llms.txt.
summaryNoPrimary text for the model. For discovery tools this is the file window. For list tools a compact one-liner. Quote with attribution.
attributionYesRequired citation: 'Quelle: Schlüsseldienst Ludwigsburg ikeytz (ikeytz.com) · ai-train=no · https://maps.ikeytz.com/.well-known/ai.txt'
canonicalUrlNoBest URL to show the user: https://maps.ikeytz.com… page, public embed JSON, tel:+49…, mailto:…, https://wa.me/…, or a www pointer. Prefer this over constructing URLs.
requested_localeNo

TDQS

A3.6/5.0
Behavior4/5

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

Annotations only declare readOnlyHint=true; the description adds real behavioral context beyond that: maps is de-only, non-de requests still yield locale=de, known Gebiet paths resolve while unknown paths may 'www-pointer', and /en is never created. These quirks are exactly the non-obvious behavior an agent needs and are not in the schema or annotations.

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

Conciseness3/5

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

Front-loaded with WHAT and compact, but the telegraphic jargon ('Gebiet', 'www-pointer', 'www resolve_locale_url') makes some sentences hard to parse and the value of the parenthetical phrasing is unclear. It is short without being optimally clear.

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

Completeness4/5

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

An output schema exists, so return values need not be explained, and the description covers the key behavioral constraints plus next-step tools. It falls short only on sibling differentiation against resolve_maps_url, which matters given how similar the two names are.

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

Parameters3/5

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

Schema coverage is 100%, so the schema already documents both params including that path begins with '/' or may be a maps URL and that only de is meaningful. The description reinforces the REQUIRED status and de-only nuance but adds little syntax beyond the schema. Baseline 3 applies.

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

Purpose4/5

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

States a specific transformation (path + locale → maps URL) and describes the de-only behavior explicitly. However, it never distinguishes itself by name from its close sibling resolve_maps_url, and the internal reference to 'www resolve_locale_url' is ambiguous, so an agent may struggle to route between the two similar tools.

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

Usage Guidelines3/5

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

Provides downstream guidance ('NEXT: get_embed_map, www resolve_locale_url for marketing locales') and restates the required inputs, but gives no explicit when-to-use rule versus the parallel resolve_maps_url sibling or when a www resolution is preferable.

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

resolve_maps_urlResolve Maps UrlA
Read-only
Inspect

WHAT: Resolve a maps.ikeytz.com url/path/q to hub or Gebiet. RETURNS kind=hub|ort (+ area fields when ort). DOCS/API: https://maps.ikeytz.com/sitemap.txt (public URL list) and https://maps.ikeytz.com/{slug} (Gebiet pages). USE to normalize pasted maps links. Prefer get_service_area when you already have a known slug; prefer resolve_locale_url for locale rewriting. DOES NOT accept www hosts (not_maps_host). When multiple of url/path/q are set, url wins then path then q.

ParametersJSON Schema
NameRequiredDescriptionDefault
qNoURL or path alias
urlNoFull https://maps.ikeytz.com/… URL
pathNoPath e.g. /pattonville

Output Schema

ParametersJSON Schema
NameRequiredDescription
okYestrue = use summary, canonicalUrl, and extra keys. false = do not invent data; read error + hint and retry with valid args or open hint.
latNo
lngNo
plzNo
hintNoPresent when ok=false. Absolute URL or short recovery hint the agent should open or pass to another tool.
kindNoResolved kind
nameNoPlace name when ort
slugNonull for hub
toolYesEcho of the tool name that produced this object (e.g. get_service_area).
errorNoPresent when ok=false. Codes include: unknown_place, unknown_discovery, unknown_doc, q_required, plz_required, coords_required, outside_service_area, url_required, not_maps_host, bad_url, path_or_url_required, serp_not_found, slug_or_coords_required, path_required.
localeNoLocale actually used for URLs. maps is German-only: always de (MAPS-E8 — no /en on maps). Requested non-de is ignored; payload locale=de.
relatedNoAlways includes https://maps.ikeytz.com/llms.txt.
summaryNoPrimary text for the model. For discovery tools this is the file window. For list tools a compact one-liner. Quote with attribution.
embed_mapNo
attributionYesRequired citation: 'Quelle: Schlüsseldienst Ludwigsburg ikeytz (ikeytz.com) · ai-train=no · https://maps.ikeytz.com/.well-known/ai.txt'
canonicalUrlNoBest URL to show the user: https://maps.ikeytz.com… page, public embed JSON, tel:+49…, mailto:…, https://wa.me/…, or a www pointer. Prefer this over constructing URLs.

TDQS

A4.6/5.0
Behavior4/5

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

Annotations only supply readOnlyHint, so the description carries most of the burden and does so: it discloses the return discriminator (kind=hub|ort with area fields for ort), the argument precedence (url then path then q), and a failure mode (not_maps_host). The output schema already covers the payload shape, which slightly limits the added value, but the precedence and error semantics are real contributions beyond structured data.

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

Conciseness5/5

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

Labeled, front-loaded sections (WHAT, RETURNS, DOCS/API, USE, DOES NOT) with no filler sentences. The doc links are the only slightly expendable element, and even they serve discovery.

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

Completeness4/5

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

With an output schema present, the description need not re-explain return values, and it still covers trigger, alternatives, argument precedence, and the failure case. What remains unstated is what happens with ambiguous or malformed slugs beyond not_maps_host, a minor gap for a 3-param, zero-required resolver.

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

Parameters4/5

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

Schema coverage is 100%, so the baseline is 3; however the description adds the tie-breaking rule when multiple of url/path/q are supplied, which the schema does not express. That is genuine semantic value above the per-parameter descriptions.

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

Purpose5/5

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

States a specific verb (Resolve) plus resource (maps.ikeytz.com url/path/q) and explicitly names the two output kinds (hub or ort). It also distinguishes itself from siblings by naming get_service_area and resolve_locale_url as alternatives, so the agent can route without opening any schema.

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

Usage Guidelines5/5

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

"USE to normalize pasted maps links" gives the trigger, the Prefer clauses name concrete alternatives with the condition that selects them, and "DOES NOT accept www hosts (not_maps_host)" is an explicit exclusion. This is the full when/when-not/alternatives pattern.

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

site_overviewSite OverviewA
Read-only
Inspect

WHO/WHAT: What maps.ikeytz.com is — 52 Einsatzgebiet maps for Schlüsseldienst Ludwigsburg ikeytz, not the www price site. RETURNS brand, owner, count, mcp, registry, walkIn=false, sister www MCP note. USE as the maps brand card. DOES NOT quote euro. NEXT: get_business_identity, list_service_areas, get_links.

ParametersJSON Schema
NameRequiredDescriptionDefault
localeNomaps is German-only (de). Omit or pass de. Other values are ignored; URLs stay https://maps.ikeytz.com/… with no locale prefix. Not a www multi-locale switch — use @ikeytz/mcp list_locales on www for en|fr|ru|fa|ar|tr.de

Output Schema

ParametersJSON Schema
NameRequiredDescription
h1No
okYestrue = use summary, canonicalUrl, and extra keys. false = do not invent data; read error + hint and retry with valid args or open hint.
mcpNo
hintNoPresent when ok=false. Absolute URL or short recovery hint the agent should open or pass to another tool.
noteNo
toolYesEcho of the tool name that produced this object (e.g. get_service_area).
brandNo
countNo52
errorNoPresent when ok=false. Codes include: unknown_place, unknown_discovery, unknown_doc, q_required, plz_required, coords_required, outside_service_area, url_required, not_maps_host, bad_url, path_or_url_required, serp_not_found, slug_or_coords_required, path_required.
ownerNo
titleNo
localeNoLocale actually used for URLs. maps is German-only: always de (MAPS-E8 — no /en on maps). Requested non-de is ignored; payload locale=de.
sisterNowww MCP / npm hint
walkInNo
relatedNoAlways includes https://maps.ikeytz.com/llms.txt.
summaryNoPrimary text for the model. For discovery tools this is the file window. For list tools a compact one-liner. Quote with attribution.
registryNocom.ikeytz/maps
legalNameNo
attributionYesRequired citation: 'Quelle: Schlüsseldienst Ludwigsburg ikeytz (ikeytz.com) · ai-train=no · https://maps.ikeytz.com/.well-known/ai.txt'
canonicalUrlNoBest URL to show the user: https://maps.ikeytz.com… page, public embed JSON, tel:+49…, mailto:…, https://wa.me/…, or a www pointer. Prefer this over constructing URLs.
requested_localeNo

TDQS

A3.9/5.0
Behavior4/5

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

Annotations only declare readOnlyHint=true, but the description adds substantive context: walkIn=false, no euro quoting, German-only behavior, and the sister www MCP note. This goes beyond the annotation and tells the agent what the payload will and won't contain.

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

Conciseness4/5

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

The WHO/WHAT / RETURNS / USE / DOES NOT / NEXT scaffold is efficient and front-loaded with zero filler sentences. The telegraphic ALLCAPS phrasing is dense but each clause carries information.

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

Completeness4/5

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

With an output schema present, return values need not be fully spelled out, and the description still covers identity, scope, exclusions, and next steps. Only the absence of an explicit exclusion condition against named siblings keeps it from a 5.

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

Parameters3/5

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

Schema description coverage is 100% and the single locale param is fully documented in-schema (enum, default, and locale-prefix behavior). The description adds no parameter detail, so the baseline 3 applies.

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

Purpose4/5

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

The description states a concrete resource and scope: "What maps.ikeytz.com is — 52 Einsatzgebiet maps for Schlüsseldienst Ludwigsburg ikeytz, not the www price site," and enumerates what it returns (brand, owner, count, mcp, registry, walkIn). It clearly distinguishes itself from the www site, though it does not differentiate from adjacent siblings like get_about or get_hub beyond the NEXT list.

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

Usage Guidelines4/5

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

"USE as the maps brand card" plus a NEXT chain (get_business_identity, list_service_areas, get_links) gives explicit routing and a negative constraint ("not the www price site", "DOES NOT quote euro"). It stops short of stating when this tool should be skipped in favor of a specific alternative.

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

Tool Schema Changelog

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

  1. 10 tool updates
    • Changedcompose_whatsapp4 fields changed
      • changedInput schema / properties / option / description
        Previous value: -"Optional situation id from list_whatsapp_options (zugefallen|abgeschlossen|zylinder). Unknown → ok:false."New value: +"Optional situation id from list_whatsapp_options (12 www ids; aliases deprecated). Unknown → ok:false."
      • addedOutput schema / properties / ambiguous
        Added value: +{
        +  "description": "true if deprecated alias was used",
        +  "type": "boolean"
        +}
      • addedOutput schema / properties / deprecatedAlias
        Added value: +{
        +  "description": "Alias used, if any",
        +  "type": [
        +    "string",
        +    "null"
        +  ]
        +}
      • changedOutput schema / properties / option / description
        Previous value: -"Echoed option (null if omitted)"New value: +"Resolved option (null if omitted)"
    • Changedfind_by_area2 fields changed
      • addedOutput schema / properties / items / items / properties / grenze_api
        Added value: +{
        +  "description": "https://maps.ikeytz.com/api/v1/embed/ort/{slug}/grenze (GeoJSON)",
        +  "format": "uri",
        +  "type": "string"
        +}
      • addedOutput schema / properties / items / items / properties / punkt_api
        Added value: +{
        +  "description": "https://maps.ikeytz.com/api/v1/embed/ort/{slug}/punkt (GeoJSON Point)",
        +  "format": "uri",
        +  "type": "string"
        +}
    • Changedfind_by_gebiet2 fields changed
      • addedOutput schema / properties / items / items / properties / grenze_api
        Added value: +{
        +  "description": "https://maps.ikeytz.com/api/v1/embed/ort/{slug}/grenze (GeoJSON)",
        +  "format": "uri",
        +  "type": "string"
        +}
      • addedOutput schema / properties / items / items / properties / punkt_api
        Added value: +{
        +  "description": "https://maps.ikeytz.com/api/v1/embed/ort/{slug}/punkt (GeoJSON Point)",
        +  "format": "uri",
        +  "type": "string"
        +}
    • Changedfind_by_geo2 fields changed
      • addedOutput schema / properties / items / items / properties / grenze_api
        Added value: +{
        +  "description": "https://maps.ikeytz.com/api/v1/embed/ort/{slug}/grenze (GeoJSON)",
        +  "format": "uri",
        +  "type": "string"
        +}
      • addedOutput schema / properties / items / items / properties / punkt_api
        Added value: +{
        +  "description": "https://maps.ikeytz.com/api/v1/embed/ort/{slug}/punkt (GeoJSON Point)",
        +  "format": "uri",
        +  "type": "string"
        +}
    • Changedfind_by_google_maps2 fields changed
      • addedOutput schema / properties / items / items / properties / grenze_api
        Added value: +{
        +  "description": "https://maps.ikeytz.com/api/v1/embed/ort/{slug}/grenze (GeoJSON)",
        +  "format": "uri",
        +  "type": "string"
        +}
      • addedOutput schema / properties / items / items / properties / punkt_api
        Added value: +{
        +  "description": "https://maps.ikeytz.com/api/v1/embed/ort/{slug}/punkt (GeoJSON Point)",
        +  "format": "uri",
        +  "type": "string"
        +}
    • Changedfind_by_icbm2 fields changed
      • addedOutput schema / properties / items / items / properties / grenze_api
        Added value: +{
        +  "description": "https://maps.ikeytz.com/api/v1/embed/ort/{slug}/grenze (GeoJSON)",
        +  "format": "uri",
        +  "type": "string"
        +}
      • addedOutput schema / properties / items / items / properties / punkt_api
        Added value: +{
        +  "description": "https://maps.ikeytz.com/api/v1/embed/ort/{slug}/punkt (GeoJSON Point)",
        +  "format": "uri",
        +  "type": "string"
        +}
    • Changedfind_by_plz2 fields changed
      • addedOutput schema / properties / items / items / properties / grenze_api
        Added value: +{
        +  "description": "https://maps.ikeytz.com/api/v1/embed/ort/{slug}/grenze (GeoJSON)",
        +  "format": "uri",
        +  "type": "string"
        +}
      • addedOutput schema / properties / items / items / properties / punkt_api
        Added value: +{
        +  "description": "https://maps.ikeytz.com/api/v1/embed/ort/{slug}/punkt (GeoJSON Point)",
        +  "format": "uri",
        +  "type": "string"
        +}
    • Changedget_geo_api6 fields changed
      • addedOutput schema / properties / grenze_api
        Added value: +{
        +  "format": "uri",
        +  "type": "string"
        +}
      • changedOutput schema / properties / note / description
        Previous value: -"Public JSON pointer; use get_grenze for polygon in MCP"New value: +"Public JSON/GeoJSON pointers; use get_grenze for polygon in MCP"
      • addedOutput schema / properties / orte_api
        Added value: +{
        +  "format": "uri",
        +  "type": "string"
        +}
      • addedOutput schema / properties / orte_grenzen_api
        Added value: +{
        +  "format": "uri",
        +  "type": "string"
        +}
      • addedOutput schema / properties / orte_punkte_api
        Added value: +{
        +  "format": "uri",
        +  "type": "string"
        +}
      • addedOutput schema / properties / punkt_api
        Added value: +{
        +  "format": "uri",
        +  "type": "string"
        +}
    • Changedlist_service_areas2 fields changed
      • addedOutput schema / properties / items / items / properties / grenze_api
        Added value: +{
        +  "description": "https://maps.ikeytz.com/api/v1/embed/ort/{slug}/grenze (GeoJSON)",
        +  "format": "uri",
        +  "type": "string"
        +}
      • addedOutput schema / properties / items / items / properties / punkt_api
        Added value: +{
        +  "description": "https://maps.ikeytz.com/api/v1/embed/ort/{slug}/punkt (GeoJSON Point)",
        +  "format": "uri",
        +  "type": "string"
        +}
    • Changedlist_whatsapp_options1 field changed
      • addedOutput schema / properties / deprecated_aliases
        Added value: +{
        +  "description": "Old ids → day invoice (ambiguous)",
        +  "type": "object"
        +}
  2. 1 tool update
    • Changedget_grenze_koordinaten4 fields changed
      • removedOutput schema / properties / embed
        Removed value: -{
        -  "description": "Relative fn embed path",
        -  "type": "string"
        -}
      • removedOutput schema / properties / embedGrenze
        Removed value: -{
        -  "type": "string"
        -}
      • addedOutput schema / properties / embedPublic / description
        Added value: +"Public relative embed path /api/v1/embed/ort/{slug}"
      • removedOutput schema / properties / embedPunkt
        Removed value: -{
        -  "type": "string"
        -}
  3. 9 tool updates
    • Changedget_ai_txt2 fields changed
      • changedInput schema / properties / limit / description
        Previous value: -"Maximum items or lines to return after offset. Omit = all remaining in the window (subject to tool-specific clamps). For geo near-search default is often 5 without radius_km, up to 52 with radius."New value: +"Maximum number of lines to return after offset. Omit or null = if remaining payload ≤~30KB return all remaining lines; if larger, return first ~30KB window + nextOffset (O9). Explicit limit keeps 1..10000 line window (MCP caps unchanged — not forced to 30KB). Meta also as trailing # MCP-META lines in summary."
      • addedInput schema / properties / limit / maximum
        Added value: +10000
    • Changedget_copyright2 fields changed
      • changedInput schema / properties / limit / description
        Previous value: -"Maximum items or lines to return after offset. Omit = all remaining in the window (subject to tool-specific clamps). For geo near-search default is often 5 without radius_km, up to 52 with radius."New value: +"Maximum number of lines to return after offset. Omit or null = if remaining payload ≤~30KB return all remaining lines; if larger, return first ~30KB window + nextOffset (O9). Explicit limit keeps 1..10000 line window (MCP caps unchanged — not forced to 30KB). Meta also as trailing # MCP-META lines in summary."
      • addedInput schema / properties / limit / maximum
        Added value: +10000
    • Changedget_discovery2 fields changed
      • changedInput schema / properties / limit / description
        Previous value: -"Maximum items or lines to return after offset. Omit = all remaining in the window (subject to tool-specific clamps). For geo near-search default is often 5 without radius_km, up to 52 with radius."New value: +"Maximum number of lines to return after offset. Omit or null = if remaining payload ≤~30KB return all remaining lines; if larger, return first ~30KB window + nextOffset (O9). Explicit limit keeps 1..10000 line window (MCP caps unchanged — not forced to 30KB). Meta also as trailing # MCP-META lines in summary."
      • addedInput schema / properties / limit / maximum
        Added value: +10000
    • Changedget_impressum2 fields changed
      • changedInput schema / properties / limit / description
        Previous value: -"Maximum items or lines to return after offset. Omit = all remaining in the window (subject to tool-specific clamps). For geo near-search default is often 5 without radius_km, up to 52 with radius."New value: +"Maximum number of lines to return after offset. Omit or null = if remaining payload ≤~30KB return all remaining lines; if larger, return first ~30KB window + nextOffset (O9). Explicit limit keeps 1..10000 line window (MCP caps unchanged — not forced to 30KB). Meta also as trailing # MCP-META lines in summary."
      • addedInput schema / properties / limit / maximum
        Added value: +10000
    • Changedget_llms_mcp_server2 fields changed
      • changedInput schema / properties / limit / description
        Previous value: -"Maximum items or lines to return after offset. Omit = all remaining in the window (subject to tool-specific clamps). For geo near-search default is often 5 without radius_km, up to 52 with radius."New value: +"Maximum number of lines to return after offset. Omit or null = if remaining payload ≤~30KB return all remaining lines; if larger, return first ~30KB window + nextOffset (O9). Explicit limit keeps 1..10000 line window (MCP caps unchanged — not forced to 30KB). Meta also as trailing # MCP-META lines in summary."
      • addedInput schema / properties / limit / maximum
        Added value: +10000
    • Changedget_llms_mcp_web2 fields changed
      • changedInput schema / properties / limit / description
        Previous value: -"Maximum items or lines to return after offset. Omit = all remaining in the window (subject to tool-specific clamps). For geo near-search default is often 5 without radius_km, up to 52 with radius."New value: +"Maximum number of lines to return after offset. Omit or null = if remaining payload ≤~30KB return all remaining lines; if larger, return first ~30KB window + nextOffset (O9). Explicit limit keeps 1..10000 line window (MCP caps unchanged — not forced to 30KB). Meta also as trailing # MCP-META lines in summary."
      • addedInput schema / properties / limit / maximum
        Added value: +10000
    • Changedget_llms_txt2 fields changed
      • changedInput schema / properties / limit / description
        Previous value: -"Maximum items or lines to return after offset. Omit = all remaining in the window (subject to tool-specific clamps). For geo near-search default is often 5 without radius_km, up to 52 with radius."New value: +"Maximum number of lines to return after offset. Omit or null = if remaining payload ≤~30KB return all remaining lines; if larger, return first ~30KB window + nextOffset (O9). Explicit limit keeps 1..10000 line window (MCP caps unchanged — not forced to 30KB). Meta also as trailing # MCP-META lines in summary."
      • addedInput schema / properties / limit / maximum
        Added value: +10000
    • Changedget_sitemap_txt2 fields changed
      • changedInput schema / properties / limit / description
        Previous value: -"Maximum items or lines to return after offset. Omit = all remaining in the window (subject to tool-specific clamps). For geo near-search default is often 5 without radius_km, up to 52 with radius."New value: +"Maximum number of lines to return after offset. Omit or null = if remaining payload ≤~30KB return all remaining lines; if larger, return first ~30KB window + nextOffset (O9). Explicit limit keeps 1..10000 line window (MCP caps unchanged — not forced to 30KB). Meta also as trailing # MCP-META lines in summary."
      • addedInput schema / properties / limit / maximum
        Added value: +10000
    • Changedget_urheberrecht2 fields changed
      • changedInput schema / properties / limit / description
        Previous value: -"Maximum items or lines to return after offset. Omit = all remaining in the window (subject to tool-specific clamps). For geo near-search default is often 5 without radius_km, up to 52 with radius."New value: +"Maximum number of lines to return after offset. Omit or null = if remaining payload ≤~30KB return all remaining lines; if larger, return first ~30KB window + nextOffset (O9). Explicit limit keeps 1..10000 line window (MCP caps unchanged — not forced to 30KB). Meta also as trailing # MCP-META lines in summary."
      • addedInput schema / properties / limit / maximum
        Added value: +10000
  4. 1 tool update
    • Changedget_discovery1 field changed
      • changedInput schema / properties / which / description
        Previous value: -"Required discovery id. Examples: ard, ai-catalog, ai-txt, ai-plugin, answer-engine, agent-skills, llms, llms-full, llms-index, llms-keywords, llms-serp, llms-jsonld, llms-impressum-kontakt, llms-orte-geo, llms-grenzen-koordinaten, llms-urheberrecht, llms-copyright, llms-mcp-server, llms-mcp-web, robots, sitemap-txt, sitemap-xml."New value: +"Required discovery id. Examples: ard, ai-catalog, ai-txt, ai-plugin, answer-engine, agent-skills, llms, llms-full, llms-index, llms-keywords, llms-serp, llms-jsonld, llms-navigation, llms-impressum-kontakt, llms-orte-geo, llms-grenzen-koordinaten, llms-urheberrecht, llms-copyright, llms-mcp-server, llms-mcp-web, robots, sitemap-txt, sitemap-xml."
  5. 1 tool update
    • Changedget_discovery1 field changed
      • changedInput schema / properties / which / description
        Previous value: -"Required discovery id. Examples: ard, ai-catalog, ai-txt, ai-plugin, answer-engine, agent-skills, llms, llms-full, llms-index, llms-keywords, llms-serp, llms-impressum-kontakt, llms-orte-geo, llms-urheberrecht, llms-copyright, llms-mcp-server, llms-mcp-web, robots, sitemap-txt, sitemap-xml."New value: +"Required discovery id. Examples: ard, ai-catalog, ai-txt, ai-plugin, answer-engine, agent-skills, llms, llms-full, llms-index, llms-keywords, llms-serp, llms-jsonld, llms-impressum-kontakt, llms-orte-geo, llms-grenzen-koordinaten, llms-urheberrecht, llms-copyright, llms-mcp-server, llms-mcp-web, robots, sitemap-txt, sitemap-xml."
  6. 1 tool update
    • Addedget_grenze_koordinaten
  7. 1 tool update
    • Changedcompose_whatsapp2 fields changed
      • changedInput schema / properties / option / description
        Previous value: -"Optional situation id: zugefallen|abgeschlossen|zylinder|beratung (or ids from list_whatsapp_options)."New value: +"Optional situation id from list_whatsapp_options (zugefallen|abgeschlossen|zylinder). Unknown → ok:false."
      • changedOutput schema / properties / option / description
        Previous value: -"Echoed option"New value: +"Echoed option (null if omitted)"
  8. 6 tool updates
    • Changedget_ai_txt3 fields changed
      • addedOutput schema / properties / fetchTruncated
        Added value: +{
        +  "description": "true if a load cap cut the file before paging (www Cap). maps reads full from disk → always false.",
        +  "type": "boolean"
        +}
      • addedOutput schema / properties / totalBytes
        Added value: +{
        +  "description": "Full discovery file size in bytes (UTF-8). Also in trailing # MCP-META.",
        +  "type": "number"
        +}
      • addedOutput schema / properties / totalChars
        Added value: +{
        +  "description": "Full discovery file character length before offset/limit. Also in # MCP-META.",
        +  "type": "number"
        +}
    • Changedget_discovery3 fields changed
      • addedOutput schema / properties / fetchTruncated
        Added value: +{
        +  "description": "true if a load cap cut the file before paging (www Cap). maps reads full from disk → always false.",
        +  "type": "boolean"
        +}
      • addedOutput schema / properties / totalBytes
        Added value: +{
        +  "description": "Full discovery file size in bytes (UTF-8). Also in trailing # MCP-META.",
        +  "type": "number"
        +}
      • addedOutput schema / properties / totalChars
        Added value: +{
        +  "description": "Full discovery file character length before offset/limit. Also in # MCP-META.",
        +  "type": "number"
        +}
    • Changedget_llms_mcp_server3 fields changed
      • addedOutput schema / properties / fetchTruncated
        Added value: +{
        +  "description": "true if a load cap cut the file before paging (www Cap). maps reads full from disk → always false.",
        +  "type": "boolean"
        +}
      • addedOutput schema / properties / totalBytes
        Added value: +{
        +  "description": "Full discovery file size in bytes (UTF-8). Also in trailing # MCP-META.",
        +  "type": "number"
        +}
      • addedOutput schema / properties / totalChars
        Added value: +{
        +  "description": "Full discovery file character length before offset/limit. Also in # MCP-META.",
        +  "type": "number"
        +}
    • Changedget_llms_mcp_web3 fields changed
      • addedOutput schema / properties / fetchTruncated
        Added value: +{
        +  "description": "true if a load cap cut the file before paging (www Cap). maps reads full from disk → always false.",
        +  "type": "boolean"
        +}
      • addedOutput schema / properties / totalBytes
        Added value: +{
        +  "description": "Full discovery file size in bytes (UTF-8). Also in trailing # MCP-META.",
        +  "type": "number"
        +}
      • addedOutput schema / properties / totalChars
        Added value: +{
        +  "description": "Full discovery file character length before offset/limit. Also in # MCP-META.",
        +  "type": "number"
        +}
    • Changedget_llms_txt3 fields changed
      • addedOutput schema / properties / fetchTruncated
        Added value: +{
        +  "description": "true if a load cap cut the file before paging (www Cap). maps reads full from disk → always false.",
        +  "type": "boolean"
        +}
      • addedOutput schema / properties / totalBytes
        Added value: +{
        +  "description": "Full discovery file size in bytes (UTF-8). Also in trailing # MCP-META.",
        +  "type": "number"
        +}
      • addedOutput schema / properties / totalChars
        Added value: +{
        +  "description": "Full discovery file character length before offset/limit. Also in # MCP-META.",
        +  "type": "number"
        +}
    • Changedget_sitemap_txt3 fields changed
      • addedOutput schema / properties / fetchTruncated
        Added value: +{
        +  "description": "true if a load cap cut the file before paging (www Cap). maps reads full from disk → always false.",
        +  "type": "boolean"
        +}
      • addedOutput schema / properties / totalBytes
        Added value: +{
        +  "description": "Full discovery file size in bytes (UTF-8). Also in trailing # MCP-META.",
        +  "type": "number"
        +}
      • addedOutput schema / properties / totalChars
        Added value: +{
        +  "description": "Full discovery file character length before offset/limit. Also in # MCP-META.",
        +  "type": "number"
        +}
  9. 2 tool updates
    • Changedget_embed_map2 fields changed
      • addedOutput schema / properties / maps_nav
        Added value: +{
        +  "description": "MAPS-IL1 mini-chrome URLs",
        +  "properties": {
        +    "buero": {
        +      "format": "uri",
        +      "type": "string"
        +    },
        +    "hub": {
        +      "format": "uri",
        +      "type": "string"
        +    },
        +    "mcp_hub": {
        +      "format": "uri",
        +      "type": "string"
        +    }
        +  },
        +  "type": "object"
        +}
      • addedOutput schema / properties / neighbors
        Added value: +{
        +  "description": "Up to 5 nearest Gebiete",
        +  "items": {
        +    "properties": {
        +      "embed_map": {
        +        "format": "uri",
        +        "type": "string"
        +      },
        +      "name": {
        +        "type": "string"
        +      },
        +      "slug": {
        +        "type": "string"
        +      }
        +    },
        +    "type": "object"
        +  },
        +  "type": "array"
        +}
    • Changedget_service_area3 fields changed
      • changedInput schema / properties / compact / description
        Previous value: -"If true, omit h1/kicker/blurb/lage/geschichte — coords + URLs only."New value: +"If true, omit h1/kicker/blurb/lage/geschichte — coords + URLs + neighbors still present."
      • addedOutput schema / properties / maps_nav
        Added value: +{
        +  "description": "MAPS-IL1 mini-chrome URLs",
        +  "properties": {
        +    "buero": {
        +      "format": "uri",
        +      "type": "string"
        +    },
        +    "hub": {
        +      "format": "uri",
        +      "type": "string"
        +    },
        +    "mcp_hub": {
        +      "format": "uri",
        +      "type": "string"
        +    }
        +  },
        +  "type": "object"
        +}
      • addedOutput schema / properties / neighbors
        Added value: +{
        +  "description": "Up to 5 nearest Gebiete (slug/name/embed_map)",
        +  "items": {
        +    "properties": {
        +      "embed_map": {
        +        "format": "uri",
        +        "type": "string"
        +      },
        +      "name": {
        +        "type": "string"
        +      },
        +      "slug": {
        +        "type": "string"
        +      }
        +    },
        +    "type": "object"
        +  },
        +  "type": "array"
        +}
  10. 6 tool updates
    • Changedget_ai_txt9 fields changed
      • removedOutput schema / properties / body
        Removed value: -{
        -  "description": "UTF-8 text window after offset/limit",
        -  "type": "string"
        -}
      • addedOutput schema / properties / bytesReturned
        Added value: +{
        +  "description": "UTF-8 length of text window",
        +  "type": "number"
        +}
      • addedOutput schema / properties / nextOffset
        Added value: +{
        +  "description": "Pass as next offset when truncated; else null. Also in # MCP-META.",
        +  "type": [
        +    "number",
        +    "null"
        +  ]
        +}
      • addedOutput schema / properties / returnedLines
        Added value: +{
        +  "description": "Lines in this window (before # MCP-META)",
        +  "type": "number"
        +}
      • addedOutput schema / properties / returnedUrls
        Added value: +{
        +  "description": "http(s) lines in this window",
        +  "type": "number"
        +}
      • changedOutput schema / properties / text / description
        Previous value: -"Alias/window of body when present"New value: +"UTF-8 line window (file body before # MCP-META). Same bytes as summary without meta trailer."
      • addedOutput schema / properties / totalLines
        Added value: +{
        +  "description": "Alias of total_lines",
        +  "type": "number"
        +}
      • addedOutput schema / properties / totalUrls
        Added value: +{
        +  "description": "http(s) lines in the full file",
        +  "type": "number"
        +}
      • addedOutput schema / properties / truncated
        Added value: +{
        +  "description": "true if offset+limit left more lines. Also in trailing # MCP-META.",
        +  "type": "boolean"
        +}
    • Changedget_discovery9 fields changed
      • removedOutput schema / properties / body
        Removed value: -{
        -  "description": "UTF-8 text window after offset/limit",
        -  "type": "string"
        -}
      • addedOutput schema / properties / bytesReturned
        Added value: +{
        +  "description": "UTF-8 length of text window",
        +  "type": "number"
        +}
      • addedOutput schema / properties / nextOffset
        Added value: +{
        +  "description": "Pass as next offset when truncated; else null. Also in # MCP-META.",
        +  "type": [
        +    "number",
        +    "null"
        +  ]
        +}
      • addedOutput schema / properties / returnedLines
        Added value: +{
        +  "description": "Lines in this window (before # MCP-META)",
        +  "type": "number"
        +}
      • addedOutput schema / properties / returnedUrls
        Added value: +{
        +  "description": "http(s) lines in this window",
        +  "type": "number"
        +}
      • changedOutput schema / properties / text / description
        Previous value: -"Alias/window of body when present"New value: +"UTF-8 line window (file body before # MCP-META). Same bytes as summary without meta trailer."
      • addedOutput schema / properties / totalLines
        Added value: +{
        +  "description": "Alias of total_lines",
        +  "type": "number"
        +}
      • addedOutput schema / properties / totalUrls
        Added value: +{
        +  "description": "http(s) lines in the full file",
        +  "type": "number"
        +}
      • addedOutput schema / properties / truncated
        Added value: +{
        +  "description": "true if offset+limit left more lines. Also in trailing # MCP-META.",
        +  "type": "boolean"
        +}
    • Changedget_llms_mcp_server9 fields changed
      • removedOutput schema / properties / body
        Removed value: -{
        -  "description": "UTF-8 text window after offset/limit",
        -  "type": "string"
        -}
      • addedOutput schema / properties / bytesReturned
        Added value: +{
        +  "description": "UTF-8 length of text window",
        +  "type": "number"
        +}
      • addedOutput schema / properties / nextOffset
        Added value: +{
        +  "description": "Pass as next offset when truncated; else null. Also in # MCP-META.",
        +  "type": [
        +    "number",
        +    "null"
        +  ]
        +}
      • addedOutput schema / properties / returnedLines
        Added value: +{
        +  "description": "Lines in this window (before # MCP-META)",
        +  "type": "number"
        +}
      • addedOutput schema / properties / returnedUrls
        Added value: +{
        +  "description": "http(s) lines in this window",
        +  "type": "number"
        +}
      • changedOutput schema / properties / text / description
        Previous value: -"Alias/window of body when present"New value: +"UTF-8 line window (file body before # MCP-META). Same bytes as summary without meta trailer."
      • addedOutput schema / properties / totalLines
        Added value: +{
        +  "description": "Alias of total_lines",
        +  "type": "number"
        +}
      • addedOutput schema / properties / totalUrls
        Added value: +{
        +  "description": "http(s) lines in the full file",
        +  "type": "number"
        +}
      • addedOutput schema / properties / truncated
        Added value: +{
        +  "description": "true if offset+limit left more lines. Also in trailing # MCP-META.",
        +  "type": "boolean"
        +}
    • Changedget_llms_mcp_web9 fields changed
      • removedOutput schema / properties / body
        Removed value: -{
        -  "description": "UTF-8 text window after offset/limit",
        -  "type": "string"
        -}
      • addedOutput schema / properties / bytesReturned
        Added value: +{
        +  "description": "UTF-8 length of text window",
        +  "type": "number"
        +}
      • addedOutput schema / properties / nextOffset
        Added value: +{
        +  "description": "Pass as next offset when truncated; else null. Also in # MCP-META.",
        +  "type": [
        +    "number",
        +    "null"
        +  ]
        +}
      • addedOutput schema / properties / returnedLines
        Added value: +{
        +  "description": "Lines in this window (before # MCP-META)",
        +  "type": "number"
        +}
      • addedOutput schema / properties / returnedUrls
        Added value: +{
        +  "description": "http(s) lines in this window",
        +  "type": "number"
        +}
      • changedOutput schema / properties / text / description
        Previous value: -"Alias/window of body when present"New value: +"UTF-8 line window (file body before # MCP-META). Same bytes as summary without meta trailer."
      • addedOutput schema / properties / totalLines
        Added value: +{
        +  "description": "Alias of total_lines",
        +  "type": "number"
        +}
      • addedOutput schema / properties / totalUrls
        Added value: +{
        +  "description": "http(s) lines in the full file",
        +  "type": "number"
        +}
      • addedOutput schema / properties / truncated
        Added value: +{
        +  "description": "true if offset+limit left more lines. Also in trailing # MCP-META.",
        +  "type": "boolean"
        +}
    • Changedget_llms_txt9 fields changed
      • removedOutput schema / properties / body
        Removed value: -{
        -  "description": "UTF-8 text window after offset/limit",
        -  "type": "string"
        -}
      • addedOutput schema / properties / bytesReturned
        Added value: +{
        +  "description": "UTF-8 length of text window",
        +  "type": "number"
        +}
      • addedOutput schema / properties / nextOffset
        Added value: +{
        +  "description": "Pass as next offset when truncated; else null. Also in # MCP-META.",
        +  "type": [
        +    "number",
        +    "null"
        +  ]
        +}
      • addedOutput schema / properties / returnedLines
        Added value: +{
        +  "description": "Lines in this window (before # MCP-META)",
        +  "type": "number"
        +}
      • addedOutput schema / properties / returnedUrls
        Added value: +{
        +  "description": "http(s) lines in this window",
        +  "type": "number"
        +}
      • changedOutput schema / properties / text / description
        Previous value: -"Alias/window of body when present"New value: +"UTF-8 line window (file body before # MCP-META). Same bytes as summary without meta trailer."
      • addedOutput schema / properties / totalLines
        Added value: +{
        +  "description": "Alias of total_lines",
        +  "type": "number"
        +}
      • addedOutput schema / properties / totalUrls
        Added value: +{
        +  "description": "http(s) lines in the full file",
        +  "type": "number"
        +}
      • addedOutput schema / properties / truncated
        Added value: +{
        +  "description": "true if offset+limit left more lines. Also in trailing # MCP-META.",
        +  "type": "boolean"
        +}
    • Changedget_sitemap_txt9 fields changed
      • removedOutput schema / properties / body
        Removed value: -{
        -  "description": "UTF-8 text window after offset/limit",
        -  "type": "string"
        -}
      • addedOutput schema / properties / bytesReturned
        Added value: +{
        +  "description": "UTF-8 length of text window",
        +  "type": "number"
        +}
      • addedOutput schema / properties / nextOffset
        Added value: +{
        +  "description": "Pass as next offset when truncated; else null. Also in # MCP-META.",
        +  "type": [
        +    "number",
        +    "null"
        +  ]
        +}
      • addedOutput schema / properties / returnedLines
        Added value: +{
        +  "description": "Lines in this window (before # MCP-META)",
        +  "type": "number"
        +}
      • addedOutput schema / properties / returnedUrls
        Added value: +{
        +  "description": "http(s) lines in this window",
        +  "type": "number"
        +}
      • changedOutput schema / properties / text / description
        Previous value: -"Alias/window of body when present"New value: +"UTF-8 line window (file body before # MCP-META). Same bytes as summary without meta trailer."
      • addedOutput schema / properties / totalLines
        Added value: +{
        +  "description": "Alias of total_lines",
        +  "type": "number"
        +}
      • addedOutput schema / properties / totalUrls
        Added value: +{
        +  "description": "http(s) lines in the full file",
        +  "type": "number"
        +}
      • addedOutput schema / properties / truncated
        Added value: +{
        +  "description": "true if offset+limit left more lines. Also in trailing # MCP-META.",
        +  "type": "boolean"
        +}
  11. 1 tool update
    • Changedget_geo_office4 fields changed
      • addedOutput schema / properties / embed_map
        Added value: +{
        +  "description": "https://maps.ikeytz.com/buero",
        +  "format": "uri",
        +  "type": "string"
        +}
      • addedOutput schema / properties / geo_api
        Added value: +{
        +  "description": "https://maps.ikeytz.com/api/v1/embed/office",
        +  "format": "uri",
        +  "type": "string"
        +}
      • changedOutput schema / properties / icbm / description
        Previous value: -"ICBM string"New value: +"ICBM string (same as google_maps)"
      • addedOutput schema / properties / note
        Added value: +{
        +  "description": "Büro · kein Kundenverkehr vor Ort",
        +  "type": "string"
        +}
  12. 67 tool updates
    • Changedcompose_mailto3 fields changed
      • addedInput schema / additionalProperties
        Added value: +false
      • addedInput schema / description
        Added value: +"This tool takes no arguments. Call tools/call with arguments: {}. Extra keys are ignored."
      • changedOutput schema / (root)
        Previous value: -nullNew value: +{
        +  "additionalProperties": true,
        +  "description": "Always the same envelope. tools/call returns content[0].text = summary (or JSON) AND structuredContent = this object. On success ok=true with summary + canonicalUrl + extra fields. On failure ok=false with error (snake_case code) and hint (recovery URL). Never writes, never submits forms, never books. Attribution must be kept when quoting. Policy: ai-input yes with attribution; ai-train=no. Host is maps.ikeytz.com (geo/Einsatzgebiet). Prices/FAQ/legal HTML live on www — maps only points.",
        +  "properties": {
        +    "attribution": {
        +      "description": "Required citation: 'Quelle: Schlüsseldienst Ludwigsburg ikeytz (ikeytz.com) · ai-train=no · https://maps.ikeytz.com/.well-known/ai.txt'",
        +      "type": "string"
        +    },
        +    "canonicalUrl": {
        +      "description": "Best URL to show the user: https://maps.ikeytz.com… page, public embed JSON, tel:+49…, mailto:…, https://wa.me/…, or a www pointer. Prefer this over constructing URLs.",
        +      "type": "string"
        +    },
        +    "error": {
        +      "description": "Present when ok=false. Codes include: unknown_place, unknown_discovery, unknown_doc, q_required, plz_required, coords_required, outside_service_area, url_required, not_maps_host, bad_url, path_or_url_required, serp_not_found, slug_or_coords_required, path_required.",
        +      "type": "string"
        +    },
        +    "hint": {
        +      "description": "Present when ok=false. Absolute URL or short recovery hint the agent should open or pass to another tool.",
        +      "type": "string"
        +    },
        +    "href": {
        +      "description": "mailto:info@ikeytz.com",
        +      "type": "string"
        +    },
        +    "locale": {
        +      "description": "Locale actually used for URLs. maps is German-only: always de (MAPS-E8 — no /en on maps). Requested non-de is ignored; payload locale=de.",
        +      "enum": [
        +        "de"
        +      ],
        +      "type": "string"
        +    },
        +    "mapsEmail": {
        +      "description": "info@maps.ikeytz.com",
        +      "type": "string"
        +    },
        +    "mapsHref": {
        +      "description": "mailto:info@maps.ikeytz.com",
        +      "type": "string"
        +    },
        +    "ok": {
        +      "description": "true = use summary, canonicalUrl, and extra keys. false = do not invent data; read error + hint and retry with valid args or open hint.",
        +      "type": "boolean"
        +    },
        +    "related": {
        +      "description": "Always includes https://maps.ikeytz.com/llms.txt.",
        +      "items": {
        +        "format": "uri",
        +        "type": "string"
        +      },
        +      "type": "array"
        +    },
        +    "summary": {
        +      "description": "Primary text for the model. For discovery tools this is the file window. For list tools a compact one-liner. Quote with attribution.",
        +      "type": "string"
        +    },
        +    "tool": {
        +      "description": "Echo of the tool name that produced this object (e.g. get_service_area).",
        +      "type": "string"
        +    }
        +  },
        +  "required": [
        +    "ok",
        +    "tool",
        +    "attribution"
        +  ],
        +  "type": "object"
        +}
    • Changedcompose_tel_landline3 fields changed
      • addedInput schema / additionalProperties
        Added value: +false
      • addedInput schema / description
        Added value: +"This tool takes no arguments. Call tools/call with arguments: {}. Extra keys are ignored."
      • changedOutput schema / (root)
        Previous value: -nullNew value: +{
        +  "additionalProperties": true,
        +  "description": "Always the same envelope. tools/call returns content[0].text = summary (or JSON) AND structuredContent = this object. On success ok=true with summary + canonicalUrl + extra fields. On failure ok=false with error (snake_case code) and hint (recovery URL). Never writes, never submits forms, never books. Attribution must be kept when quoting. Policy: ai-input yes with attribution; ai-train=no. Host is maps.ikeytz.com (geo/Einsatzgebiet). Prices/FAQ/legal HTML live on www — maps only points.",
        +  "properties": {
        +    "attribution": {
        +      "description": "Required citation: 'Quelle: Schlüsseldienst Ludwigsburg ikeytz (ikeytz.com) · ai-train=no · https://maps.ikeytz.com/.well-known/ai.txt'",
        +      "type": "string"
        +    },
        +    "canonicalUrl": {
        +      "description": "Best URL to show the user: https://maps.ikeytz.com… page, public embed JSON, tel:+49…, mailto:…, https://wa.me/…, or a www pointer. Prefer this over constructing URLs.",
        +      "type": "string"
        +    },
        +    "display": {
        +      "description": "Human display number",
        +      "type": "string"
        +    },
        +    "error": {
        +      "description": "Present when ok=false. Codes include: unknown_place, unknown_discovery, unknown_doc, q_required, plz_required, coords_required, outside_service_area, url_required, not_maps_host, bad_url, path_or_url_required, serp_not_found, slug_or_coords_required, path_required.",
        +      "type": "string"
        +    },
        +    "hint": {
        +      "description": "Present when ok=false. Absolute URL or short recovery hint the agent should open or pass to another tool.",
        +      "type": "string"
        +    },
        +    "href": {
        +      "description": "tel:+49…",
        +      "type": "string"
        +    },
        +    "locale": {
        +      "description": "Locale actually used for URLs. maps is German-only: always de (MAPS-E8 — no /en on maps). Requested non-de is ignored; payload locale=de.",
        +      "enum": [
        +        "de"
        +      ],
        +      "type": "string"
        +    },
        +    "ok": {
        +      "description": "true = use summary, canonicalUrl, and extra keys. false = do not invent data; read error + hint and retry with valid args or open hint.",
        +      "type": "boolean"
        +    },
        +    "related": {
        +      "description": "Always includes https://maps.ikeytz.com/llms.txt.",
        +      "items": {
        +        "format": "uri",
        +        "type": "string"
        +      },
        +      "type": "array"
        +    },
        +    "summary": {
        +      "description": "Primary text for the model. For discovery tools this is the file window. For list tools a compact one-liner. Quote with attribution.",
        +      "type": "string"
        +    },
        +    "tool": {
        +      "description": "Echo of the tool name that produced this object (e.g. get_service_area).",
        +      "type": "string"
        +    }
        +  },
        +  "required": [
        +    "ok",
        +    "tool",
        +    "attribution"
        +  ],
        +  "type": "object"
        +}
    • Changedcompose_tel_mobile3 fields changed
      • addedInput schema / additionalProperties
        Added value: +false
      • addedInput schema / description
        Added value: +"This tool takes no arguments. Call tools/call with arguments: {}. Extra keys are ignored."
      • changedOutput schema / (root)
        Previous value: -nullNew value: +{
        +  "additionalProperties": true,
        +  "description": "Always the same envelope. tools/call returns content[0].text = summary (or JSON) AND structuredContent = this object. On success ok=true with summary + canonicalUrl + extra fields. On failure ok=false with error (snake_case code) and hint (recovery URL). Never writes, never submits forms, never books. Attribution must be kept when quoting. Policy: ai-input yes with attribution; ai-train=no. Host is maps.ikeytz.com (geo/Einsatzgebiet). Prices/FAQ/legal HTML live on www — maps only points.",
        +  "properties": {
        +    "attribution": {
        +      "description": "Required citation: 'Quelle: Schlüsseldienst Ludwigsburg ikeytz (ikeytz.com) · ai-train=no · https://maps.ikeytz.com/.well-known/ai.txt'",
        +      "type": "string"
        +    },
        +    "canonicalUrl": {
        +      "description": "Best URL to show the user: https://maps.ikeytz.com… page, public embed JSON, tel:+49…, mailto:…, https://wa.me/…, or a www pointer. Prefer this over constructing URLs.",
        +      "type": "string"
        +    },
        +    "display": {
        +      "description": "Human display number",
        +      "type": "string"
        +    },
        +    "error": {
        +      "description": "Present when ok=false. Codes include: unknown_place, unknown_discovery, unknown_doc, q_required, plz_required, coords_required, outside_service_area, url_required, not_maps_host, bad_url, path_or_url_required, serp_not_found, slug_or_coords_required, path_required.",
        +      "type": "string"
        +    },
        +    "hint": {
        +      "description": "Present when ok=false. Absolute URL or short recovery hint the agent should open or pass to another tool.",
        +      "type": "string"
        +    },
        +    "href": {
        +      "description": "tel:+49…",
        +      "type": "string"
        +    },
        +    "locale": {
        +      "description": "Locale actually used for URLs. maps is German-only: always de (MAPS-E8 — no /en on maps). Requested non-de is ignored; payload locale=de.",
        +      "enum": [
        +        "de"
        +      ],
        +      "type": "string"
        +    },
        +    "ok": {
        +      "description": "true = use summary, canonicalUrl, and extra keys. false = do not invent data; read error + hint and retry with valid args or open hint.",
        +      "type": "boolean"
        +    },
        +    "related": {
        +      "description": "Always includes https://maps.ikeytz.com/llms.txt.",
        +      "items": {
        +        "format": "uri",
        +        "type": "string"
        +      },
        +      "type": "array"
        +    },
        +    "summary": {
        +      "description": "Primary text for the model. For discovery tools this is the file window. For list tools a compact one-liner. Quote with attribution.",
        +      "type": "string"
        +    },
        +    "tool": {
        +      "description": "Echo of the tool name that produced this object (e.g. get_service_area).",
        +      "type": "string"
        +    }
        +  },
        +  "required": [
        +    "ok",
        +    "tool",
        +    "attribution"
        +  ],
        +  "type": "object"
        +}
    • Changedcompose_whatsapp2 fields changed
      • addedInput schema / properties / option / description
        Added value: +"Optional situation id: zugefallen|abgeschlossen|zylinder|beratung (or ids from list_whatsapp_options)."
      • changedOutput schema / (root)
        Previous value: -nullNew value: +{
        +  "additionalProperties": true,
        +  "description": "Always the same envelope. tools/call returns content[0].text = summary (or JSON) AND structuredContent = this object. On success ok=true with summary + canonicalUrl + extra fields. On failure ok=false with error (snake_case code) and hint (recovery URL). Never writes, never submits forms, never books. Attribution must be kept when quoting. Policy: ai-input yes with attribution; ai-train=no. Host is maps.ikeytz.com (geo/Einsatzgebiet). Prices/FAQ/legal HTML live on www — maps only points.",
        +  "properties": {
        +    "attribution": {
        +      "description": "Required citation: 'Quelle: Schlüsseldienst Ludwigsburg ikeytz (ikeytz.com) · ai-train=no · https://maps.ikeytz.com/.well-known/ai.txt'",
        +      "type": "string"
        +    },
        +    "canonicalUrl": {
        +      "description": "Best URL to show the user: https://maps.ikeytz.com… page, public embed JSON, tel:+49…, mailto:…, https://wa.me/…, or a www pointer. Prefer this over constructing URLs.",
        +      "type": "string"
        +    },
        +    "error": {
        +      "description": "Present when ok=false. Codes include: unknown_place, unknown_discovery, unknown_doc, q_required, plz_required, coords_required, outside_service_area, url_required, not_maps_host, bad_url, path_or_url_required, serp_not_found, slug_or_coords_required, path_required.",
        +      "type": "string"
        +    },
        +    "hint": {
        +      "description": "Present when ok=false. Absolute URL or short recovery hint the agent should open or pass to another tool.",
        +      "type": "string"
        +    },
        +    "href": {
        +      "description": "https://wa.me/…",
        +      "format": "uri",
        +      "type": "string"
        +    },
        +    "locale": {
        +      "description": "Locale actually used for URLs. maps is German-only: always de (MAPS-E8 — no /en on maps). Requested non-de is ignored; payload locale=de.",
        +      "enum": [
        +        "de"
        +      ],
        +      "type": "string"
        +    },
        +    "note": {
        +      "description": "Link only. Kein Formular.",
        +      "type": "string"
        +    },
        +    "ok": {
        +      "description": "true = use summary, canonicalUrl, and extra keys. false = do not invent data; read error + hint and retry with valid args or open hint.",
        +      "type": "boolean"
        +    },
        +    "option": {
        +      "description": "Echoed option",
        +      "type": [
        +        "string",
        +        "null"
        +      ]
        +    },
        +    "related": {
        +      "description": "Always includes https://maps.ikeytz.com/llms.txt.",
        +      "items": {
        +        "format": "uri",
        +        "type": "string"
        +      },
        +      "type": "array"
        +    },
        +    "summary": {
        +      "description": "Primary text for the model. For discovery tools this is the file window. For list tools a compact one-liner. Quote with attribution.",
        +      "type": "string"
        +    },
        +    "tool": {
        +      "description": "Echo of the tool name that produced this object (e.g. get_service_area).",
        +      "type": "string"
        +    }
        +  },
        +  "required": [
        +    "ok",
        +    "tool",
        +    "attribution"
        +  ],
        +  "type": "object"
        +}
    • Changeddistance_to_office7 fields changed
      • addedInput schema / properties / icbm / description
        Added value: +"Optional 'lat, lng' instead of place lookup"
      • addedInput schema / properties / lat / description
        Added value: +"Optional query latitude instead of place lookup"
      • addedInput schema / properties / lng / description
        Added value: +"Optional query longitude"
      • addedInput schema / properties / name / description
        Added value: +"German place name substring (case-insensitive, umlauts ok), e.g. Grünbühl, Pattonville. Used when slug/plz omitted."
      • addedInput schema / properties / plz / description
        Added value: +"German postcode (PLZ). Several Gebiete can share one PLZ (e.g. 71638). For single lookup first match wins; use find_by_plz for all matches."
      • addedInput schema / properties / slug / description
        Added value: +"URL slug of one of the 52 Einsatzgebiete, e.g. pattonville, bietigheim-bissingen, walheim, gruenbuehl. Matches https://maps.ikeytz.com/{slug}. Lookup order when combined with plz/name: slug first."
      • changedOutput schema / (root)
        Previous value: -nullNew value: +{
        +  "additionalProperties": true,
        +  "description": "Always the same envelope. tools/call returns content[0].text = summary (or JSON) AND structuredContent = this object. On success ok=true with summary + canonicalUrl + extra fields. On failure ok=false with error (snake_case code) and hint (recovery URL). Never writes, never submits forms, never books. Attribution must be kept when quoting. Policy: ai-input yes with attribution; ai-train=no. Host is maps.ikeytz.com (geo/Einsatzgebiet). Prices/FAQ/legal HTML live on www — maps only points.",
        +  "properties": {
        +    "attribution": {
        +      "description": "Required citation: 'Quelle: Schlüsseldienst Ludwigsburg ikeytz (ikeytz.com) · ai-train=no · https://maps.ikeytz.com/.well-known/ai.txt'",
        +      "type": "string"
        +    },
        +    "canonicalUrl": {
        +      "description": "Best URL to show the user: https://maps.ikeytz.com… page, public embed JSON, tel:+49…, mailto:…, https://wa.me/…, or a www pointer. Prefer this over constructing URLs.",
        +      "type": "string"
        +    },
        +    "distance_km": {
        +      "description": "Air distance kilometres",
        +      "type": "number"
        +    },
        +    "error": {
        +      "description": "Present when ok=false. Codes include: unknown_place, unknown_discovery, unknown_doc, q_required, plz_required, coords_required, outside_service_area, url_required, not_maps_host, bad_url, path_or_url_required, serp_not_found, slug_or_coords_required, path_required.",
        +      "type": "string"
        +    },
        +    "from": {
        +      "description": "Origin {lat,lng}",
        +      "properties": {
        +        "lat": {
        +          "type": "number"
        +        },
        +        "lng": {
        +          "type": "number"
        +        }
        +      },
        +      "type": "object"
        +    },
        +    "hint": {
        +      "description": "Present when ok=false. Absolute URL or short recovery hint the agent should open or pass to another tool.",
        +      "type": "string"
        +    },
        +    "locale": {
        +      "description": "Locale actually used for URLs. maps is German-only: always de (MAPS-E8 — no /en on maps). Requested non-de is ignored; payload locale=de.",
        +      "enum": [
        +        "de"
        +      ],
        +      "type": "string"
        +    },
        +    "office": {
        +      "description": "Office {lat,lng,icbm}",
        +      "type": "object"
        +    },
        +    "ok": {
        +      "description": "true = use summary, canonicalUrl, and extra keys. false = do not invent data; read error + hint and retry with valid args or open hint.",
        +      "type": "boolean"
        +    },
        +    "related": {
        +      "description": "Always includes https://maps.ikeytz.com/llms.txt.",
        +      "items": {
        +        "format": "uri",
        +        "type": "string"
        +      },
        +      "type": "array"
        +    },
        +    "slug": {
        +      "description": "Resolved slug if from place lookup",
        +      "type": [
        +        "string",
        +        "null"
        +      ]
        +    },
        +    "summary": {
        +      "description": "Primary text for the model. For discovery tools this is the file window. For list tools a compact one-liner. Quote with attribution.",
        +      "type": "string"
        +    },
        +    "tool": {
        +      "description": "Echo of the tool name that produced this object (e.g. get_service_area).",
        +      "type": "string"
        +    },
        +    "walkIn": {
        +      "description": "Always false",
        +      "type": "boolean"
        +    }
        +  },
        +  "required": [
        +    "ok",
        +    "tool",
        +    "attribution"
        +  ],
        +  "type": "object"
        +}
    • Changedfind_by_area4 fields changed
      • addedInput schema / properties / name / description
        Added value: +"German place name substring (case-insensitive, umlauts ok), e.g. Grünbühl, Pattonville. Used when slug/plz omitted."
      • addedInput schema / properties / q / description
        Added value: +"Name or slug query"
      • addedInput schema / properties / slug / description
        Added value: +"URL slug of one of the 52 Einsatzgebiete, e.g. pattonville, bietigheim-bissingen, walheim, gruenbuehl. Matches https://maps.ikeytz.com/{slug}. Lookup order when combined with plz/name: slug first."
      • changedOutput schema / (root)
        Previous value: -nullNew value: +{
        +  "additionalProperties": true,
        +  "description": "Always the same envelope. tools/call returns content[0].text = summary (or JSON) AND structuredContent = this object. On success ok=true with summary + canonicalUrl + extra fields. On failure ok=false with error (snake_case code) and hint (recovery URL). Never writes, never submits forms, never books. Attribution must be kept when quoting. Policy: ai-input yes with attribution; ai-train=no. Host is maps.ikeytz.com (geo/Einsatzgebiet). Prices/FAQ/legal HTML live on www — maps only points.",
        +  "properties": {
        +    "attribution": {
        +      "description": "Required citation: 'Quelle: Schlüsseldienst Ludwigsburg ikeytz (ikeytz.com) · ai-train=no · https://maps.ikeytz.com/.well-known/ai.txt'",
        +      "type": "string"
        +    },
        +    "canonicalUrl": {
        +      "description": "Best URL to show the user: https://maps.ikeytz.com… page, public embed JSON, tel:+49…, mailto:…, https://wa.me/…, or a www pointer. Prefer this over constructing URLs.",
        +      "type": "string"
        +    },
        +    "count": {
        +      "type": "number"
        +    },
        +    "error": {
        +      "description": "Present when ok=false. Codes include: unknown_place, unknown_discovery, unknown_doc, q_required, plz_required, coords_required, outside_service_area, url_required, not_maps_host, bad_url, path_or_url_required, serp_not_found, slug_or_coords_required, path_required.",
        +      "type": "string"
        +    },
        +    "hint": {
        +      "description": "Present when ok=false. Absolute URL or short recovery hint the agent should open or pass to another tool.",
        +      "type": "string"
        +    },
        +    "items": {
        +      "items": {
        +        "additionalProperties": true,
        +        "description": "One Einsatzgebiet point card (not a polygon).",
        +        "properties": {
        +          "distance_km": {
        +            "description": "Present on geo-ranked results: air distance from query point",
        +            "type": "number"
        +          },
        +          "embed_map": {
        +            "description": "https://maps.ikeytz.com/{slug}",
        +            "format": "uri",
        +            "type": "string"
        +          },
        +          "geo_api": {
        +            "description": "https://maps.ikeytz.com/api/v1/embed/ort/{slug}",
        +            "format": "uri",
        +            "type": "string"
        +          },
        +          "google_maps": {
        +            "description": "Paste-ready 'lat, lng'",
        +            "type": "string"
        +          },
        +          "icbm": {
        +            "description": "ICBM 'lat, lng' (same as google_maps)",
        +            "type": "string"
        +          },
        +          "kind": {
        +            "description": "stadtteil | ort",
        +            "type": "string"
        +          },
        +          "lat": {
        +            "description": "WGS84 latitude of THIS place",
        +            "type": "number"
        +          },
        +          "lng": {
        +            "description": "WGS84 longitude of THIS place",
        +            "type": "number"
        +          },
        +          "maps_mcp": {
        +            "const": "https://maps.ikeytz.com/mcp",
        +            "description": "maps MCP endpoint",
        +            "format": "uri",
        +            "type": "string"
        +          },
        +          "name": {
        +            "description": "German place name",
        +            "type": "string"
        +          },
        +          "parent": {
        +            "description": "Ludwigsburg or Landkreis Ludwigsburg",
        +            "type": "string"
        +          },
        +          "plz": {
        +            "description": "Postcode",
        +            "type": "string"
        +          },
        +          "slug": {
        +            "description": "maps slug",
        +            "type": "string"
        +          },
        +          "url": {
        +            "description": "Keyword/www page URL when present",
        +            "type": "string"
        +          }
        +        },
        +        "type": "object"
        +      },
        +      "type": "array"
        +    },
        +    "locale": {
        +      "description": "Locale actually used for URLs. maps is German-only: always de (MAPS-E8 — no /en on maps). Requested non-de is ignored; payload locale=de.",
        +      "enum": [
        +        "de"
        +      ],
        +      "type": "string"
        +    },
        +    "ok": {
        +      "description": "true = use summary, canonicalUrl, and extra keys. false = do not invent data; read error + hint and retry with valid args or open hint.",
        +      "type": "boolean"
        +    },
        +    "q": {
        +      "type": "string"
        +    },
        +    "related": {
        +      "description": "Always includes https://maps.ikeytz.com/llms.txt.",
        +      "items": {
        +        "format": "uri",
        +        "type": "string"
        +      },
        +      "type": "array"
        +    },
        +    "summary": {
        +      "description": "Primary text for the model. For discovery tools this is the file window. For list tools a compact one-liner. Quote with attribution.",
        +      "type": "string"
        +    },
        +    "tool": {
        +      "description": "Echo of the tool name that produced this object (e.g. get_service_area).",
        +      "type": "string"
        +    }
        +  },
        +  "required": [
        +    "ok",
        +    "tool",
        +    "attribution"
        +  ],
        +  "type": "object"
        +}
    • Changedfind_by_gebiet4 fields changed
      • addedInput schema / properties / name / description
        Added value: +"German place name substring (case-insensitive, umlauts ok), e.g. Grünbühl, Pattonville. Used when slug/plz omitted."
      • addedInput schema / properties / q / description
        Added value: +"Name or slug query (preferred)"
      • addedInput schema / properties / slug / description
        Added value: +"URL slug of one of the 52 Einsatzgebiete, e.g. pattonville, bietigheim-bissingen, walheim, gruenbuehl. Matches https://maps.ikeytz.com/{slug}. Lookup order when combined with plz/name: slug first."
      • changedOutput schema / (root)
        Previous value: -nullNew value: +{
        +  "additionalProperties": true,
        +  "description": "Always the same envelope. tools/call returns content[0].text = summary (or JSON) AND structuredContent = this object. On success ok=true with summary + canonicalUrl + extra fields. On failure ok=false with error (snake_case code) and hint (recovery URL). Never writes, never submits forms, never books. Attribution must be kept when quoting. Policy: ai-input yes with attribution; ai-train=no. Host is maps.ikeytz.com (geo/Einsatzgebiet). Prices/FAQ/legal HTML live on www — maps only points.",
        +  "properties": {
        +    "attribution": {
        +      "description": "Required citation: 'Quelle: Schlüsseldienst Ludwigsburg ikeytz (ikeytz.com) · ai-train=no · https://maps.ikeytz.com/.well-known/ai.txt'",
        +      "type": "string"
        +    },
        +    "canonicalUrl": {
        +      "description": "Best URL to show the user: https://maps.ikeytz.com… page, public embed JSON, tel:+49…, mailto:…, https://wa.me/…, or a www pointer. Prefer this over constructing URLs.",
        +      "type": "string"
        +    },
        +    "count": {
        +      "type": "number"
        +    },
        +    "error": {
        +      "description": "Present when ok=false. Codes include: unknown_place, unknown_discovery, unknown_doc, q_required, plz_required, coords_required, outside_service_area, url_required, not_maps_host, bad_url, path_or_url_required, serp_not_found, slug_or_coords_required, path_required.",
        +      "type": "string"
        +    },
        +    "hint": {
        +      "description": "Present when ok=false. Absolute URL or short recovery hint the agent should open or pass to another tool.",
        +      "type": "string"
        +    },
        +    "items": {
        +      "items": {
        +        "additionalProperties": true,
        +        "description": "One Einsatzgebiet point card (not a polygon).",
        +        "properties": {
        +          "distance_km": {
        +            "description": "Present on geo-ranked results: air distance from query point",
        +            "type": "number"
        +          },
        +          "embed_map": {
        +            "description": "https://maps.ikeytz.com/{slug}",
        +            "format": "uri",
        +            "type": "string"
        +          },
        +          "geo_api": {
        +            "description": "https://maps.ikeytz.com/api/v1/embed/ort/{slug}",
        +            "format": "uri",
        +            "type": "string"
        +          },
        +          "google_maps": {
        +            "description": "Paste-ready 'lat, lng'",
        +            "type": "string"
        +          },
        +          "icbm": {
        +            "description": "ICBM 'lat, lng' (same as google_maps)",
        +            "type": "string"
        +          },
        +          "kind": {
        +            "description": "stadtteil | ort",
        +            "type": "string"
        +          },
        +          "lat": {
        +            "description": "WGS84 latitude of THIS place",
        +            "type": "number"
        +          },
        +          "lng": {
        +            "description": "WGS84 longitude of THIS place",
        +            "type": "number"
        +          },
        +          "maps_mcp": {
        +            "const": "https://maps.ikeytz.com/mcp",
        +            "description": "maps MCP endpoint",
        +            "format": "uri",
        +            "type": "string"
        +          },
        +          "name": {
        +            "description": "German place name",
        +            "type": "string"
        +          },
        +          "parent": {
        +            "description": "Ludwigsburg or Landkreis Ludwigsburg",
        +            "type": "string"
        +          },
        +          "plz": {
        +            "description": "Postcode",
        +            "type": "string"
        +          },
        +          "slug": {
        +            "description": "maps slug",
        +            "type": "string"
        +          },
        +          "url": {
        +            "description": "Keyword/www page URL when present",
        +            "type": "string"
        +          }
        +        },
        +        "type": "object"
        +      },
        +      "type": "array"
        +    },
        +    "locale": {
        +      "description": "Locale actually used for URLs. maps is German-only: always de (MAPS-E8 — no /en on maps). Requested non-de is ignored; payload locale=de.",
        +      "enum": [
        +        "de"
        +      ],
        +      "type": "string"
        +    },
        +    "ok": {
        +      "description": "true = use summary, canonicalUrl, and extra keys. false = do not invent data; read error + hint and retry with valid args or open hint.",
        +      "type": "boolean"
        +    },
        +    "q": {
        +      "description": "Resolved query",
        +      "type": "string"
        +    },
        +    "related": {
        +      "description": "Always includes https://maps.ikeytz.com/llms.txt.",
        +      "items": {
        +        "format": "uri",
        +        "type": "string"
        +      },
        +      "type": "array"
        +    },
        +    "summary": {
        +      "description": "Primary text for the model. For discovery tools this is the file window. For list tools a compact one-liner. Quote with attribution.",
        +      "type": "string"
        +    },
        +    "tool": {
        +      "description": "Echo of the tool name that produced this object (e.g. get_service_area).",
        +      "type": "string"
        +    }
        +  },
        +  "required": [
        +    "ok",
        +    "tool",
        +    "attribution"
        +  ],
        +  "type": "object"
        +}
    • Changedfind_by_geo7 fields changed
      • addedInput schema / properties / icbm / description
        Added value: +"ICBM or paste 'lat, lng' (comma-separated). Alternative to lat+lng."
      • addedInput schema / properties / lat / description
        Added value: +"WGS84 latitude. Required with lng unless icbm is set. (0,0) → outside_service_area."
      • addedInput schema / properties / limit / description
        Added value: +"Maximum items or lines to return after offset. Omit = all remaining in the window (subject to tool-specific clamps). For geo near-search default is often 5 without radius_km, up to 52 with radius."
      • addedInput schema / properties / limit / minimum
        Added value: +1
      • addedInput schema / properties / lng / description
        Added value: +"WGS84 longitude. Required with lat unless icbm is set."
      • addedInput schema / properties / radius_km / description
        Added value: +"Optional air-radius filter in km. Omit = return nearest N (limit). Far points / (0,0) → outside_service_area."
      • changedOutput schema / (root)
        Previous value: -nullNew value: +{
        +  "additionalProperties": true,
        +  "description": "Always the same envelope. tools/call returns content[0].text = summary (or JSON) AND structuredContent = this object. On success ok=true with summary + canonicalUrl + extra fields. On failure ok=false with error (snake_case code) and hint (recovery URL). Never writes, never submits forms, never books. Attribution must be kept when quoting. Policy: ai-input yes with attribution; ai-train=no. Host is maps.ikeytz.com (geo/Einsatzgebiet). Prices/FAQ/legal HTML live on www — maps only points.",
        +  "properties": {
        +    "attribution": {
        +      "description": "Required citation: 'Quelle: Schlüsseldienst Ludwigsburg ikeytz (ikeytz.com) · ai-train=no · https://maps.ikeytz.com/.well-known/ai.txt'",
        +      "type": "string"
        +    },
        +    "canonicalUrl": {
        +      "description": "Best URL to show the user: https://maps.ikeytz.com… page, public embed JSON, tel:+49…, mailto:…, https://wa.me/…, or a www pointer. Prefer this over constructing URLs.",
        +      "type": "string"
        +    },
        +    "count": {
        +      "type": "number"
        +    },
        +    "error": {
        +      "description": "Present when ok=false. Codes include: unknown_place, unknown_discovery, unknown_doc, q_required, plz_required, coords_required, outside_service_area, url_required, not_maps_host, bad_url, path_or_url_required, serp_not_found, slug_or_coords_required, path_required.",
        +      "type": "string"
        +    },
        +    "hint": {
        +      "description": "Present when ok=false. Absolute URL or short recovery hint the agent should open or pass to another tool.",
        +      "type": "string"
        +    },
        +    "icbm": {
        +      "description": "Query ICBM",
        +      "type": "string"
        +    },
        +    "items": {
        +      "description": "Ranked Gebiete with distance_km",
        +      "items": {
        +        "additionalProperties": true,
        +        "description": "One Einsatzgebiet point card (not a polygon).",
        +        "properties": {
        +          "distance_km": {
        +            "description": "Present on geo-ranked results: air distance from query point",
        +            "type": "number"
        +          },
        +          "embed_map": {
        +            "description": "https://maps.ikeytz.com/{slug}",
        +            "format": "uri",
        +            "type": "string"
        +          },
        +          "geo_api": {
        +            "description": "https://maps.ikeytz.com/api/v1/embed/ort/{slug}",
        +            "format": "uri",
        +            "type": "string"
        +          },
        +          "google_maps": {
        +            "description": "Paste-ready 'lat, lng'",
        +            "type": "string"
        +          },
        +          "icbm": {
        +            "description": "ICBM 'lat, lng' (same as google_maps)",
        +            "type": "string"
        +          },
        +          "kind": {
        +            "description": "stadtteil | ort",
        +            "type": "string"
        +          },
        +          "lat": {
        +            "description": "WGS84 latitude of THIS place",
        +            "type": "number"
        +          },
        +          "lng": {
        +            "description": "WGS84 longitude of THIS place",
        +            "type": "number"
        +          },
        +          "maps_mcp": {
        +            "const": "https://maps.ikeytz.com/mcp",
        +            "description": "maps MCP endpoint",
        +            "format": "uri",
        +            "type": "string"
        +          },
        +          "name": {
        +            "description": "German place name",
        +            "type": "string"
        +          },
        +          "parent": {
        +            "description": "Ludwigsburg or Landkreis Ludwigsburg",
        +            "type": "string"
        +          },
        +          "plz": {
        +            "description": "Postcode",
        +            "type": "string"
        +          },
        +          "slug": {
        +            "description": "maps slug",
        +            "type": "string"
        +          },
        +          "url": {
        +            "description": "Keyword/www page URL when present",
        +            "type": "string"
        +          }
        +        },
        +        "type": "object"
        +      },
        +      "type": "array"
        +    },
        +    "lat": {
        +      "description": "Query latitude",
        +      "type": "number"
        +    },
        +    "lng": {
        +      "description": "Query longitude",
        +      "type": "number"
        +    },
        +    "locale": {
        +      "description": "Locale actually used for URLs. maps is German-only: always de (MAPS-E8 — no /en on maps). Requested non-de is ignored; payload locale=de.",
        +      "enum": [
        +        "de"
        +      ],
        +      "type": "string"
        +    },
        +    "nearest_km": {
        +      "description": "On outside_service_area failures: nearest distance if any",
        +      "type": [
        +        "number",
        +        "null"
        +      ]
        +    },
        +    "ok": {
        +      "description": "true = use summary, canonicalUrl, and extra keys. false = do not invent data; read error + hint and retry with valid args or open hint.",
        +      "type": "boolean"
        +    },
        +    "radius_km": {
        +      "description": "Applied radius or null",
        +      "type": [
        +        "number",
        +        "null"
        +      ]
        +    },
        +    "related": {
        +      "description": "Always includes https://maps.ikeytz.com/llms.txt.",
        +      "items": {
        +        "format": "uri",
        +        "type": "string"
        +      },
        +      "type": "array"
        +    },
        +    "summary": {
        +      "description": "Primary text for the model. For discovery tools this is the file window. For list tools a compact one-liner. Quote with attribution.",
        +      "type": "string"
        +    },
        +    "tool": {
        +      "description": "Echo of the tool name that produced this object (e.g. get_service_area).",
        +      "type": "string"
        +    }
        +  },
        +  "required": [
        +    "ok",
        +    "tool",
        +    "attribution"
        +  ],
        +  "type": "object"
        +}
    • Changedfind_by_google_maps8 fields changed
      • addedInput schema / properties / icbm / description
        Added value: +"ICBM or paste 'lat, lng' (comma-separated). Alternative to lat+lng."
      • addedInput schema / properties / lat / description
        Added value: +"WGS84 latitude. Required with lng unless icbm is set. (0,0) → outside_service_area."
      • addedInput schema / properties / limit / description
        Added value: +"Maximum items or lines to return after offset. Omit = all remaining in the window (subject to tool-specific clamps). For geo near-search default is often 5 without radius_km, up to 52 with radius."
      • addedInput schema / properties / limit / minimum
        Added value: +1
      • addedInput schema / properties / lng / description
        Added value: +"WGS84 longitude. Required with lat unless icbm is set."
      • addedInput schema / properties / q / description
        Added value: +"Paste string containing 'lat, lng'"
      • addedInput schema / properties / radius_km / description
        Added value: +"Optional air-radius filter in km. Omit = return nearest N (limit). Far points / (0,0) → outside_service_area."
      • changedOutput schema / (root)
        Previous value: -nullNew value: +{
        +  "additionalProperties": true,
        +  "description": "Always the same envelope. tools/call returns content[0].text = summary (or JSON) AND structuredContent = this object. On success ok=true with summary + canonicalUrl + extra fields. On failure ok=false with error (snake_case code) and hint (recovery URL). Never writes, never submits forms, never books. Attribution must be kept when quoting. Policy: ai-input yes with attribution; ai-train=no. Host is maps.ikeytz.com (geo/Einsatzgebiet). Prices/FAQ/legal HTML live on www — maps only points.",
        +  "properties": {
        +    "attribution": {
        +      "description": "Required citation: 'Quelle: Schlüsseldienst Ludwigsburg ikeytz (ikeytz.com) · ai-train=no · https://maps.ikeytz.com/.well-known/ai.txt'",
        +      "type": "string"
        +    },
        +    "canonicalUrl": {
        +      "description": "Best URL to show the user: https://maps.ikeytz.com… page, public embed JSON, tel:+49…, mailto:…, https://wa.me/…, or a www pointer. Prefer this over constructing URLs.",
        +      "type": "string"
        +    },
        +    "count": {
        +      "type": "number"
        +    },
        +    "error": {
        +      "description": "Present when ok=false. Codes include: unknown_place, unknown_discovery, unknown_doc, q_required, plz_required, coords_required, outside_service_area, url_required, not_maps_host, bad_url, path_or_url_required, serp_not_found, slug_or_coords_required, path_required.",
        +      "type": "string"
        +    },
        +    "hint": {
        +      "description": "Present when ok=false. Absolute URL or short recovery hint the agent should open or pass to another tool.",
        +      "type": "string"
        +    },
        +    "icbm": {
        +      "type": "string"
        +    },
        +    "items": {
        +      "items": {
        +        "additionalProperties": true,
        +        "description": "One Einsatzgebiet point card (not a polygon).",
        +        "properties": {
        +          "distance_km": {
        +            "description": "Present on geo-ranked results: air distance from query point",
        +            "type": "number"
        +          },
        +          "embed_map": {
        +            "description": "https://maps.ikeytz.com/{slug}",
        +            "format": "uri",
        +            "type": "string"
        +          },
        +          "geo_api": {
        +            "description": "https://maps.ikeytz.com/api/v1/embed/ort/{slug}",
        +            "format": "uri",
        +            "type": "string"
        +          },
        +          "google_maps": {
        +            "description": "Paste-ready 'lat, lng'",
        +            "type": "string"
        +          },
        +          "icbm": {
        +            "description": "ICBM 'lat, lng' (same as google_maps)",
        +            "type": "string"
        +          },
        +          "kind": {
        +            "description": "stadtteil | ort",
        +            "type": "string"
        +          },
        +          "lat": {
        +            "description": "WGS84 latitude of THIS place",
        +            "type": "number"
        +          },
        +          "lng": {
        +            "description": "WGS84 longitude of THIS place",
        +            "type": "number"
        +          },
        +          "maps_mcp": {
        +            "const": "https://maps.ikeytz.com/mcp",
        +            "description": "maps MCP endpoint",
        +            "format": "uri",
        +            "type": "string"
        +          },
        +          "name": {
        +            "description": "German place name",
        +            "type": "string"
        +          },
        +          "parent": {
        +            "description": "Ludwigsburg or Landkreis Ludwigsburg",
        +            "type": "string"
        +          },
        +          "plz": {
        +            "description": "Postcode",
        +            "type": "string"
        +          },
        +          "slug": {
        +            "description": "maps slug",
        +            "type": "string"
        +          },
        +          "url": {
        +            "description": "Keyword/www page URL when present",
        +            "type": "string"
        +          }
        +        },
        +        "type": "object"
        +      },
        +      "type": "array"
        +    },
        +    "lat": {
        +      "type": "number"
        +    },
        +    "lng": {
        +      "type": "number"
        +    },
        +    "locale": {
        +      "description": "Locale actually used for URLs. maps is German-only: always de (MAPS-E8 — no /en on maps). Requested non-de is ignored; payload locale=de.",
        +      "enum": [
        +        "de"
        +      ],
        +      "type": "string"
        +    },
        +    "nearest_km": {
        +      "type": [
        +        "number",
        +        "null"
        +      ]
        +    },
        +    "ok": {
        +      "description": "true = use summary, canonicalUrl, and extra keys. false = do not invent data; read error + hint and retry with valid args or open hint.",
        +      "type": "boolean"
        +    },
        +    "radius_km": {
        +      "type": [
        +        "number",
        +        "null"
        +      ]
        +    },
        +    "related": {
        +      "description": "Always includes https://maps.ikeytz.com/llms.txt.",
        +      "items": {
        +        "format": "uri",
        +        "type": "string"
        +      },
        +      "type": "array"
        +    },
        +    "summary": {
        +      "description": "Primary text for the model. For discovery tools this is the file window. For list tools a compact one-liner. Quote with attribution.",
        +      "type": "string"
        +    },
        +    "tool": {
        +      "description": "Echo of the tool name that produced this object (e.g. get_service_area).",
        +      "type": "string"
        +    }
        +  },
        +  "required": [
        +    "ok",
        +    "tool",
        +    "attribution"
        +  ],
        +  "type": "object"
        +}
    • Changedfind_by_icbm7 fields changed
      • addedInput schema / properties / icbm / description
        Added value: +"ICBM or paste 'lat, lng' (comma-separated). Alternative to lat+lng."
      • addedInput schema / properties / lat / description
        Added value: +"WGS84 latitude. Required with lng unless icbm is set. (0,0) → outside_service_area."
      • addedInput schema / properties / limit / description
        Added value: +"Maximum items or lines to return after offset. Omit = all remaining in the window (subject to tool-specific clamps). For geo near-search default is often 5 without radius_km, up to 52 with radius."
      • addedInput schema / properties / limit / minimum
        Added value: +1
      • addedInput schema / properties / lng / description
        Added value: +"WGS84 longitude. Required with lat unless icbm is set."
      • addedInput schema / properties / radius_km / description
        Added value: +"Optional air-radius filter in km. Omit = return nearest N (limit). Far points / (0,0) → outside_service_area."
      • changedOutput schema / (root)
        Previous value: -nullNew value: +{
        +  "additionalProperties": true,
        +  "description": "Always the same envelope. tools/call returns content[0].text = summary (or JSON) AND structuredContent = this object. On success ok=true with summary + canonicalUrl + extra fields. On failure ok=false with error (snake_case code) and hint (recovery URL). Never writes, never submits forms, never books. Attribution must be kept when quoting. Policy: ai-input yes with attribution; ai-train=no. Host is maps.ikeytz.com (geo/Einsatzgebiet). Prices/FAQ/legal HTML live on www — maps only points.",
        +  "properties": {
        +    "attribution": {
        +      "description": "Required citation: 'Quelle: Schlüsseldienst Ludwigsburg ikeytz (ikeytz.com) · ai-train=no · https://maps.ikeytz.com/.well-known/ai.txt'",
        +      "type": "string"
        +    },
        +    "canonicalUrl": {
        +      "description": "Best URL to show the user: https://maps.ikeytz.com… page, public embed JSON, tel:+49…, mailto:…, https://wa.me/…, or a www pointer. Prefer this over constructing URLs.",
        +      "type": "string"
        +    },
        +    "count": {
        +      "type": "number"
        +    },
        +    "error": {
        +      "description": "Present when ok=false. Codes include: unknown_place, unknown_discovery, unknown_doc, q_required, plz_required, coords_required, outside_service_area, url_required, not_maps_host, bad_url, path_or_url_required, serp_not_found, slug_or_coords_required, path_required.",
        +      "type": "string"
        +    },
        +    "hint": {
        +      "description": "Present when ok=false. Absolute URL or short recovery hint the agent should open or pass to another tool.",
        +      "type": "string"
        +    },
        +    "icbm": {
        +      "type": "string"
        +    },
        +    "items": {
        +      "items": {
        +        "additionalProperties": true,
        +        "description": "One Einsatzgebiet point card (not a polygon).",
        +        "properties": {
        +          "distance_km": {
        +            "description": "Present on geo-ranked results: air distance from query point",
        +            "type": "number"
        +          },
        +          "embed_map": {
        +            "description": "https://maps.ikeytz.com/{slug}",
        +            "format": "uri",
        +            "type": "string"
        +          },
        +          "geo_api": {
        +            "description": "https://maps.ikeytz.com/api/v1/embed/ort/{slug}",
        +            "format": "uri",
        +            "type": "string"
        +          },
        +          "google_maps": {
        +            "description": "Paste-ready 'lat, lng'",
        +            "type": "string"
        +          },
        +          "icbm": {
        +            "description": "ICBM 'lat, lng' (same as google_maps)",
        +            "type": "string"
        +          },
        +          "kind": {
        +            "description": "stadtteil | ort",
        +            "type": "string"
        +          },
        +          "lat": {
        +            "description": "WGS84 latitude of THIS place",
        +            "type": "number"
        +          },
        +          "lng": {
        +            "description": "WGS84 longitude of THIS place",
        +            "type": "number"
        +          },
        +          "maps_mcp": {
        +            "const": "https://maps.ikeytz.com/mcp",
        +            "description": "maps MCP endpoint",
        +            "format": "uri",
        +            "type": "string"
        +          },
        +          "name": {
        +            "description": "German place name",
        +            "type": "string"
        +          },
        +          "parent": {
        +            "description": "Ludwigsburg or Landkreis Ludwigsburg",
        +            "type": "string"
        +          },
        +          "plz": {
        +            "description": "Postcode",
        +            "type": "string"
        +          },
        +          "slug": {
        +            "description": "maps slug",
        +            "type": "string"
        +          },
        +          "url": {
        +            "description": "Keyword/www page URL when present",
        +            "type": "string"
        +          }
        +        },
        +        "type": "object"
        +      },
        +      "type": "array"
        +    },
        +    "lat": {
        +      "type": "number"
        +    },
        +    "lng": {
        +      "type": "number"
        +    },
        +    "locale": {
        +      "description": "Locale actually used for URLs. maps is German-only: always de (MAPS-E8 — no /en on maps). Requested non-de is ignored; payload locale=de.",
        +      "enum": [
        +        "de"
        +      ],
        +      "type": "string"
        +    },
        +    "nearest_km": {
        +      "type": [
        +        "number",
        +        "null"
        +      ]
        +    },
        +    "ok": {
        +      "description": "true = use summary, canonicalUrl, and extra keys. false = do not invent data; read error + hint and retry with valid args or open hint.",
        +      "type": "boolean"
        +    },
        +    "radius_km": {
        +      "type": [
        +        "number",
        +        "null"
        +      ]
        +    },
        +    "related": {
        +      "description": "Always includes https://maps.ikeytz.com/llms.txt.",
        +      "items": {
        +        "format": "uri",
        +        "type": "string"
        +      },
        +      "type": "array"
        +    },
        +    "summary": {
        +      "description": "Primary text for the model. For discovery tools this is the file window. For list tools a compact one-liner. Quote with attribution.",
        +      "type": "string"
        +    },
        +    "tool": {
        +      "description": "Echo of the tool name that produced this object (e.g. get_service_area).",
        +      "type": "string"
        +    }
        +  },
        +  "required": [
        +    "ok",
        +    "tool",
        +    "attribution"
        +  ],
        +  "type": "object"
        +}
    • Changedfind_by_keyword7 fields changed
      • addedInput schema / properties / limit / description
        Added value: +"Maximum items or lines to return after offset. Omit = all remaining in the window (subject to tool-specific clamps). For geo near-search default is often 5 without radius_km, up to 52 with radius."
      • addedInput schema / properties / limit / minimum
        Added value: +1
      • addedInput schema / properties / locale / default
        Added value: +"de"
      • addedInput schema / properties / locale / description
        Added value: +"maps is German-only (de). Omit or pass de. Other values are ignored; URLs stay https://maps.ikeytz.com/… with no locale prefix. Not a www multi-locale switch — use @ikeytz/mcp list_locales on www for en|fr|ru|fa|ar|tr."
      • addedInput schema / properties / locale / enum
        Added value: +[
        +  "de"
        +]
      • addedInput schema / properties / q / description
        Added value: +"Required search string matched against keyword and URL (substring, case-insensitive)."
      • changedOutput schema / (root)
        Previous value: -nullNew value: +{
        +  "additionalProperties": true,
        +  "description": "Always the same envelope. tools/call returns content[0].text = summary (or JSON) AND structuredContent = this object. On success ok=true with summary + canonicalUrl + extra fields. On failure ok=false with error (snake_case code) and hint (recovery URL). Never writes, never submits forms, never books. Attribution must be kept when quoting. Policy: ai-input yes with attribution; ai-train=no. Host is maps.ikeytz.com (geo/Einsatzgebiet). Prices/FAQ/legal HTML live on www — maps only points.",
        +  "properties": {
        +    "attribution": {
        +      "description": "Required citation: 'Quelle: Schlüsseldienst Ludwigsburg ikeytz (ikeytz.com) · ai-train=no · https://maps.ikeytz.com/.well-known/ai.txt'",
        +      "type": "string"
        +    },
        +    "canonicalUrl": {
        +      "description": "Best URL to show the user: https://maps.ikeytz.com… page, public embed JSON, tel:+49…, mailto:…, https://wa.me/…, or a www pointer. Prefer this over constructing URLs.",
        +      "type": "string"
        +    },
        +    "count": {
        +      "description": "Returned hits",
        +      "type": "number"
        +    },
        +    "error": {
        +      "description": "Present when ok=false. Codes include: unknown_place, unknown_discovery, unknown_doc, q_required, plz_required, coords_required, outside_service_area, url_required, not_maps_host, bad_url, path_or_url_required, serp_not_found, slug_or_coords_required, path_required.",
        +      "type": "string"
        +    },
        +    "hint": {
        +      "description": "Present when ok=false. Absolute URL or short recovery hint the agent should open or pass to another tool.",
        +      "type": "string"
        +    },
        +    "items": {
        +      "description": "keyword + url rows",
        +      "items": {
        +        "properties": {
        +          "keyword": {
        +            "type": "string"
        +          },
        +          "url": {
        +            "format": "uri",
        +            "type": "string"
        +          }
        +        },
        +        "type": "object"
        +      },
        +      "type": "array"
        +    },
        +    "lines": {
        +      "description": "Raw TSV lines",
        +      "items": {
        +        "type": "string"
        +      },
        +      "type": "array"
        +    },
        +    "locale": {
        +      "description": "Locale actually used for URLs. maps is German-only: always de (MAPS-E8 — no /en on maps). Requested non-de is ignored; payload locale=de.",
        +      "enum": [
        +        "de"
        +      ],
        +      "type": "string"
        +    },
        +    "ok": {
        +      "description": "true = use summary, canonicalUrl, and extra keys. false = do not invent data; read error + hint and retry with valid args or open hint.",
        +      "type": "boolean"
        +    },
        +    "q": {
        +      "description": "Query echoed",
        +      "type": "string"
        +    },
        +    "related": {
        +      "description": "Always includes https://maps.ikeytz.com/llms.txt.",
        +      "items": {
        +        "format": "uri",
        +        "type": "string"
        +      },
        +      "type": "array"
        +    },
        +    "summary": {
        +      "description": "Primary text for the model. For discovery tools this is the file window. For list tools a compact one-liner. Quote with attribution.",
        +      "type": "string"
        +    },
        +    "tool": {
        +      "description": "Echo of the tool name that produced this object (e.g. get_service_area).",
        +      "type": "string"
        +    },
        +    "total": {
        +      "description": "Total matches before limit",
        +      "type": "number"
        +    }
        +  },
        +  "required": [
        +    "ok",
        +    "tool",
        +    "attribution"
        +  ],
        +  "type": "object"
        +}
    • Changedfind_by_plz3 fields changed
      • addedInput schema / properties / plz / description
        Added value: +"Required German postcode."
      • addedInput schema / properties / q / description
        Added value: +"Alias for plz if plz omitted"
      • changedOutput schema / (root)
        Previous value: -nullNew value: +{
        +  "additionalProperties": true,
        +  "description": "Always the same envelope. tools/call returns content[0].text = summary (or JSON) AND structuredContent = this object. On success ok=true with summary + canonicalUrl + extra fields. On failure ok=false with error (snake_case code) and hint (recovery URL). Never writes, never submits forms, never books. Attribution must be kept when quoting. Policy: ai-input yes with attribution; ai-train=no. Host is maps.ikeytz.com (geo/Einsatzgebiet). Prices/FAQ/legal HTML live on www — maps only points.",
        +  "properties": {
        +    "attribution": {
        +      "description": "Required citation: 'Quelle: Schlüsseldienst Ludwigsburg ikeytz (ikeytz.com) · ai-train=no · https://maps.ikeytz.com/.well-known/ai.txt'",
        +      "type": "string"
        +    },
        +    "canonicalUrl": {
        +      "description": "Best URL to show the user: https://maps.ikeytz.com… page, public embed JSON, tel:+49…, mailto:…, https://wa.me/…, or a www pointer. Prefer this over constructing URLs.",
        +      "type": "string"
        +    },
        +    "count": {
        +      "description": "Number of Gebiete",
        +      "type": "number"
        +    },
        +    "error": {
        +      "description": "Present when ok=false. Codes include: unknown_place, unknown_discovery, unknown_doc, q_required, plz_required, coords_required, outside_service_area, url_required, not_maps_host, bad_url, path_or_url_required, serp_not_found, slug_or_coords_required, path_required.",
        +      "type": "string"
        +    },
        +    "hint": {
        +      "description": "Present when ok=false. Absolute URL or short recovery hint the agent should open or pass to another tool.",
        +      "type": "string"
        +    },
        +    "items": {
        +      "description": "All matches",
        +      "items": {
        +        "additionalProperties": true,
        +        "description": "One Einsatzgebiet point card (not a polygon).",
        +        "properties": {
        +          "distance_km": {
        +            "description": "Present on geo-ranked results: air distance from query point",
        +            "type": "number"
        +          },
        +          "embed_map": {
        +            "description": "https://maps.ikeytz.com/{slug}",
        +            "format": "uri",
        +            "type": "string"
        +          },
        +          "geo_api": {
        +            "description": "https://maps.ikeytz.com/api/v1/embed/ort/{slug}",
        +            "format": "uri",
        +            "type": "string"
        +          },
        +          "google_maps": {
        +            "description": "Paste-ready 'lat, lng'",
        +            "type": "string"
        +          },
        +          "icbm": {
        +            "description": "ICBM 'lat, lng' (same as google_maps)",
        +            "type": "string"
        +          },
        +          "kind": {
        +            "description": "stadtteil | ort",
        +            "type": "string"
        +          },
        +          "lat": {
        +            "description": "WGS84 latitude of THIS place",
        +            "type": "number"
        +          },
        +          "lng": {
        +            "description": "WGS84 longitude of THIS place",
        +            "type": "number"
        +          },
        +          "maps_mcp": {
        +            "const": "https://maps.ikeytz.com/mcp",
        +            "description": "maps MCP endpoint",
        +            "format": "uri",
        +            "type": "string"
        +          },
        +          "name": {
        +            "description": "German place name",
        +            "type": "string"
        +          },
        +          "parent": {
        +            "description": "Ludwigsburg or Landkreis Ludwigsburg",
        +            "type": "string"
        +          },
        +          "plz": {
        +            "description": "Postcode",
        +            "type": "string"
        +          },
        +          "slug": {
        +            "description": "maps slug",
        +            "type": "string"
        +          },
        +          "url": {
        +            "description": "Keyword/www page URL when present",
        +            "type": "string"
        +          }
        +        },
        +        "type": "object"
        +      },
        +      "type": "array"
        +    },
        +    "locale": {
        +      "description": "Locale actually used for URLs. maps is German-only: always de (MAPS-E8 — no /en on maps). Requested non-de is ignored; payload locale=de.",
        +      "enum": [
        +        "de"
        +      ],
        +      "type": "string"
        +    },
        +    "ok": {
        +      "description": "true = use summary, canonicalUrl, and extra keys. false = do not invent data; read error + hint and retry with valid args or open hint.",
        +      "type": "boolean"
        +    },
        +    "plz": {
        +      "description": "Queried PLZ",
        +      "type": "string"
        +    },
        +    "related": {
        +      "description": "Always includes https://maps.ikeytz.com/llms.txt.",
        +      "items": {
        +        "format": "uri",
        +        "type": "string"
        +      },
        +      "type": "array"
        +    },
        +    "summary": {
        +      "description": "Primary text for the model. For discovery tools this is the file window. For list tools a compact one-liner. Quote with attribution.",
        +      "type": "string"
        +    },
        +    "tool": {
        +      "description": "Echo of the tool name that produced this object (e.g. get_service_area).",
        +      "type": "string"
        +    }
        +  },
        +  "required": [
        +    "ok",
        +    "tool",
        +    "attribution"
        +  ],
        +  "type": "object"
        +}
    • Changedfind_by_serp7 fields changed
      • addedInput schema / properties / limit / description
        Added value: +"Maximum items or lines to return after offset. Omit = all remaining in the window (subject to tool-specific clamps). For geo near-search default is often 5 without radius_km, up to 52 with radius."
      • addedInput schema / properties / limit / minimum
        Added value: +1
      • addedInput schema / properties / path / description
        Added value: +"maps path fragment, e.g. /pattonville"
      • addedInput schema / properties / q / description
        Added value: +"Free-text search in SERP blocks"
      • addedInput schema / properties / slug / description
        Added value: +"Gebiet slug"
      • addedInput schema / properties / url / description
        Added value: +"Full https://maps.ikeytz.com/… URL"
      • changedOutput schema / (root)
        Previous value: -nullNew value: +{
        +  "additionalProperties": true,
        +  "description": "Always the same envelope. tools/call returns content[0].text = summary (or JSON) AND structuredContent = this object. On success ok=true with summary + canonicalUrl + extra fields. On failure ok=false with error (snake_case code) and hint (recovery URL). Never writes, never submits forms, never books. Attribution must be kept when quoting. Policy: ai-input yes with attribution; ai-train=no. Host is maps.ikeytz.com (geo/Einsatzgebiet). Prices/FAQ/legal HTML live on www — maps only points.",
        +  "properties": {
        +    "attribution": {
        +      "description": "Required citation: 'Quelle: Schlüsseldienst Ludwigsburg ikeytz (ikeytz.com) · ai-train=no · https://maps.ikeytz.com/.well-known/ai.txt'",
        +      "type": "string"
        +    },
        +    "canonicalUrl": {
        +      "description": "Best URL to show the user: https://maps.ikeytz.com… page, public embed JSON, tel:+49…, mailto:…, https://wa.me/…, or a www pointer. Prefer this over constructing URLs.",
        +      "type": "string"
        +    },
        +    "count": {
        +      "type": "number"
        +    },
        +    "error": {
        +      "description": "Present when ok=false. Codes include: unknown_place, unknown_discovery, unknown_doc, q_required, plz_required, coords_required, outside_service_area, url_required, not_maps_host, bad_url, path_or_url_required, serp_not_found, slug_or_coords_required, path_required.",
        +      "type": "string"
        +    },
        +    "hint": {
        +      "description": "Present when ok=false. Absolute URL or short recovery hint the agent should open or pass to another tool.",
        +      "type": "string"
        +    },
        +    "items": {
        +      "description": "SERP hits",
        +      "items": {
        +        "properties": {
        +          "path": {
        +            "type": "string"
        +          },
        +          "snippet": {
        +            "type": "string"
        +          },
        +          "url": {
        +            "type": "string"
        +          }
        +        },
        +        "type": "object"
        +      },
        +      "type": "array"
        +    },
        +    "locale": {
        +      "description": "Locale actually used for URLs. maps is German-only: always de (MAPS-E8 — no /en on maps). Requested non-de is ignored; payload locale=de.",
        +      "enum": [
        +        "de"
        +      ],
        +      "type": "string"
        +    },
        +    "ok": {
        +      "description": "true = use summary, canonicalUrl, and extra keys. false = do not invent data; read error + hint and retry with valid args or open hint.",
        +      "type": "boolean"
        +    },
        +    "q": {
        +      "description": "Resolved query",
        +      "type": "string"
        +    },
        +    "related": {
        +      "description": "Always includes https://maps.ikeytz.com/llms.txt.",
        +      "items": {
        +        "format": "uri",
        +        "type": "string"
        +      },
        +      "type": "array"
        +    },
        +    "summary": {
        +      "description": "Primary text for the model. For discovery tools this is the file window. For list tools a compact one-liner. Quote with attribution.",
        +      "type": "string"
        +    },
        +    "tool": {
        +      "description": "Echo of the tool name that produced this object (e.g. get_service_area).",
        +      "type": "string"
        +    },
        +    "total": {
        +      "type": "number"
        +    }
        +  },
        +  "required": [
        +    "ok",
        +    "tool",
        +    "attribution"
        +  ],
        +  "type": "object"
        +}
    • Changedget_about4 fields changed
      • addedInput schema / properties / locale / default
        Added value: +"de"
      • addedInput schema / properties / locale / description
        Added value: +"maps is German-only (de). Omit or pass de. Other values are ignored; URLs stay https://maps.ikeytz.com/… with no locale prefix. Not a www multi-locale switch — use @ikeytz/mcp list_locales on www for en|fr|ru|fa|ar|tr."
      • addedInput schema / properties / locale / enum
        Added value: +[
        +  "de"
        +]
      • changedOutput schema / (root)
        Previous value: -nullNew value: +{
        +  "additionalProperties": true,
        +  "description": "Always the same envelope. tools/call returns content[0].text = summary (or JSON) AND structuredContent = this object. On success ok=true with summary + canonicalUrl + extra fields. On failure ok=false with error (snake_case code) and hint (recovery URL). Never writes, never submits forms, never books. Attribution must be kept when quoting. Policy: ai-input yes with attribution; ai-train=no. Host is maps.ikeytz.com (geo/Einsatzgebiet). Prices/FAQ/legal HTML live on www — maps only points.",
        +  "properties": {
        +    "attribution": {
        +      "description": "Required citation: 'Quelle: Schlüsseldienst Ludwigsburg ikeytz (ikeytz.com) · ai-train=no · https://maps.ikeytz.com/.well-known/ai.txt'",
        +      "type": "string"
        +    },
        +    "brand": {
        +      "type": "string"
        +    },
        +    "canonicalUrl": {
        +      "description": "Best URL to show the user: https://maps.ikeytz.com… page, public embed JSON, tel:+49…, mailto:…, https://wa.me/…, or a www pointer. Prefer this over constructing URLs.",
        +      "type": "string"
        +    },
        +    "count": {
        +      "type": "number"
        +    },
        +    "error": {
        +      "description": "Present when ok=false. Codes include: unknown_place, unknown_discovery, unknown_doc, q_required, plz_required, coords_required, outside_service_area, url_required, not_maps_host, bad_url, path_or_url_required, serp_not_found, slug_or_coords_required, path_required.",
        +      "type": "string"
        +    },
        +    "h1": {
        +      "type": "string"
        +    },
        +    "hint": {
        +      "description": "Present when ok=false. Absolute URL or short recovery hint the agent should open or pass to another tool.",
        +      "type": "string"
        +    },
        +    "legalName": {
        +      "type": "string"
        +    },
        +    "locale": {
        +      "description": "Locale actually used for URLs. maps is German-only: always de (MAPS-E8 — no /en on maps). Requested non-de is ignored; payload locale=de.",
        +      "enum": [
        +        "de"
        +      ],
        +      "type": "string"
        +    },
        +    "mcp": {
        +      "format": "uri",
        +      "type": "string"
        +    },
        +    "note": {
        +      "type": "string"
        +    },
        +    "ok": {
        +      "description": "true = use summary, canonicalUrl, and extra keys. false = do not invent data; read error + hint and retry with valid args or open hint.",
        +      "type": "boolean"
        +    },
        +    "owner": {
        +      "type": "string"
        +    },
        +    "registry": {
        +      "type": "string"
        +    },
        +    "related": {
        +      "description": "Always includes https://maps.ikeytz.com/llms.txt.",
        +      "items": {
        +        "format": "uri",
        +        "type": "string"
        +      },
        +      "type": "array"
        +    },
        +    "sister": {
        +      "type": "string"
        +    },
        +    "summary": {
        +      "description": "Primary text for the model. For discovery tools this is the file window. For list tools a compact one-liner. Quote with attribution.",
        +      "type": "string"
        +    },
        +    "title": {
        +      "type": "string"
        +    },
        +    "tool": {
        +      "description": "Echo of the tool name that produced this object (e.g. get_service_area).",
        +      "type": "string"
        +    },
        +    "walkIn": {
        +      "type": "boolean"
        +    }
        +  },
        +  "required": [
        +    "ok",
        +    "tool",
        +    "attribution"
        +  ],
        +  "type": "object"
        +}
    • Changedget_agb3 fields changed
      • addedInput schema / additionalProperties
        Added value: +false
      • addedInput schema / description
        Added value: +"This tool takes no arguments. Call tools/call with arguments: {}. Extra keys are ignored."
      • changedOutput schema / (root)
        Previous value: -nullNew value: +{
        +  "additionalProperties": true,
        +  "description": "Always the same envelope. tools/call returns content[0].text = summary (or JSON) AND structuredContent = this object. On success ok=true with summary + canonicalUrl + extra fields. On failure ok=false with error (snake_case code) and hint (recovery URL). Never writes, never submits forms, never books. Attribution must be kept when quoting. Policy: ai-input yes with attribution; ai-train=no. Host is maps.ikeytz.com (geo/Einsatzgebiet). Prices/FAQ/legal HTML live on www — maps only points.",
        +  "properties": {
        +    "attribution": {
        +      "description": "Required citation: 'Quelle: Schlüsseldienst Ludwigsburg ikeytz (ikeytz.com) · ai-train=no · https://maps.ikeytz.com/.well-known/ai.txt'",
        +      "type": "string"
        +    },
        +    "canonicalUrl": {
        +      "description": "Best URL to show the user: https://maps.ikeytz.com… page, public embed JSON, tel:+49…, mailto:…, https://wa.me/…, or a www pointer. Prefer this over constructing URLs.",
        +      "type": "string"
        +    },
        +    "error": {
        +      "description": "Present when ok=false. Codes include: unknown_place, unknown_discovery, unknown_doc, q_required, plz_required, coords_required, outside_service_area, url_required, not_maps_host, bad_url, path_or_url_required, serp_not_found, slug_or_coords_required, path_required.",
        +      "type": "string"
        +    },
        +    "hint": {
        +      "description": "Present when ok=false. Absolute URL or short recovery hint the agent should open or pass to another tool.",
        +      "type": "string"
        +    },
        +    "html": {
        +      "description": "Absolute www.ikeytz.com URL — open there or call @ikeytz/mcp",
        +      "format": "uri",
        +      "type": "string"
        +    },
        +    "locale": {
        +      "description": "Locale actually used for URLs. maps is German-only: always de (MAPS-E8 — no /en on maps). Requested non-de is ignored; payload locale=de.",
        +      "enum": [
        +        "de"
        +      ],
        +      "type": "string"
        +    },
        +    "note": {
        +      "description": "maps only points; Volltext/Preise/FAQ live on www",
        +      "type": "string"
        +    },
        +    "npm": {
        +      "description": "www CLI package @ikeytz/mcp",
        +      "type": "string"
        +    },
        +    "ok": {
        +      "description": "true = use summary, canonicalUrl, and extra keys. false = do not invent data; read error + hint and retry with valid args or open hint.",
        +      "type": "boolean"
        +    },
        +    "related": {
        +      "description": "Always includes https://maps.ikeytz.com/llms.txt.",
        +      "items": {
        +        "format": "uri",
        +        "type": "string"
        +      },
        +      "type": "array"
        +    },
        +    "requested_locale": {
        +      "description": "Locale the caller asked for; maps still returns locale=de",
        +      "type": "string"
        +    },
        +    "summary": {
        +      "description": "Primary text for the model. For discovery tools this is the file window. For list tools a compact one-liner. Quote with attribution.",
        +      "type": "string"
        +    },
        +    "tool": {
        +      "description": "Echo of the tool name that produced this object (e.g. get_service_area).",
        +      "type": "string"
        +    },
        +    "www_mcp": {
        +      "description": "https://www.ikeytz.com/mcp — sister machine for prices/FAQ/corpus",
        +      "format": "uri",
        +      "type": "string"
        +    },
        +    "www_tool": {
        +      "description": "Same tool name on www MCP that holds the real payload",
        +      "type": "string"
        +    }
        +  },
        +  "required": [
        +    "ok",
        +    "tool",
        +    "attribution"
        +  ],
        +  "type": "object"
        +}
    • Changedget_ai_page6 fields changed
      • addedInput schema / properties / locale / default
        Added value: +"de"
      • addedInput schema / properties / locale / description
        Added value: +"maps is German-only (de). Omit or pass de. Other values are ignored; URLs stay https://maps.ikeytz.com/… with no locale prefix. Not a www multi-locale switch — use @ikeytz/mcp list_locales on www for en|fr|ru|fa|ar|tr."
      • addedInput schema / properties / locale / enum
        Added value: +[
        +  "de"
        +]
      • addedInput schema / properties / path / description
        Added value: +"Path or ai-pages path fragment"
      • addedInput schema / properties / slug / description
        Added value: +"Gebiet or ai-page slug"
      • changedOutput schema / (root)
        Previous value: -nullNew value: +{
        +  "additionalProperties": true,
        +  "description": "Always the same envelope. tools/call returns content[0].text = summary (or JSON) AND structuredContent = this object. On success ok=true with summary + canonicalUrl + extra fields. On failure ok=false with error (snake_case code) and hint (recovery URL). Never writes, never submits forms, never books. Attribution must be kept when quoting. Policy: ai-input yes with attribution; ai-train=no. Host is maps.ikeytz.com (geo/Einsatzgebiet). Prices/FAQ/legal HTML live on www — maps only points.",
        +  "properties": {
        +    "attribution": {
        +      "description": "Required citation: 'Quelle: Schlüsseldienst Ludwigsburg ikeytz (ikeytz.com) · ai-train=no · https://maps.ikeytz.com/.well-known/ai.txt'",
        +      "type": "string"
        +    },
        +    "canonicalUrl": {
        +      "description": "Best URL to show the user: https://maps.ikeytz.com… page, public embed JSON, tel:+49…, mailto:…, https://wa.me/…, or a www pointer. Prefer this over constructing URLs.",
        +      "type": "string"
        +    },
        +    "error": {
        +      "description": "Present when ok=false. Codes include: unknown_place, unknown_discovery, unknown_doc, q_required, plz_required, coords_required, outside_service_area, url_required, not_maps_host, bad_url, path_or_url_required, serp_not_found, slug_or_coords_required, path_required.",
        +      "type": "string"
        +    },
        +    "hint": {
        +      "description": "Present when ok=false. Absolute URL or short recovery hint the agent should open or pass to another tool.",
        +      "type": "string"
        +    },
        +    "html": {
        +      "description": "When www pointer",
        +      "type": "string"
        +    },
        +    "locale": {
        +      "description": "Locale actually used for URLs. maps is German-only: always de (MAPS-E8 — no /en on maps). Requested non-de is ignored; payload locale=de.",
        +      "enum": [
        +        "de"
        +      ],
        +      "type": "string"
        +    },
        +    "note": {
        +      "type": "string"
        +    },
        +    "ok": {
        +      "description": "true = use summary, canonicalUrl, and extra keys. false = do not invent data; read error + hint and retry with valid args or open hint.",
        +      "type": "boolean"
        +    },
        +    "path": {
        +      "description": "/ai-pages/de/{slug}.txt",
        +      "type": "string"
        +    },
        +    "related": {
        +      "description": "Always includes https://maps.ikeytz.com/llms.txt.",
        +      "items": {
        +        "format": "uri",
        +        "type": "string"
        +      },
        +      "type": "array"
        +    },
        +    "slug": {
        +      "type": "string"
        +    },
        +    "summary": {
        +      "description": "Primary text for the model. For discovery tools this is the file window. For list tools a compact one-liner. Quote with attribution.",
        +      "type": "string"
        +    },
        +    "text": {
        +      "description": "Full ai-page UTF-8 text",
        +      "type": "string"
        +    },
        +    "tool": {
        +      "description": "Echo of the tool name that produced this object (e.g. get_service_area).",
        +      "type": "string"
        +    }
        +  },
        +  "required": [
        +    "ok",
        +    "tool",
        +    "attribution"
        +  ],
        +  "type": "object"
        +}
    • Changedget_ai_txt6 fields changed
      • addedInput schema / properties / limit / description
        Added value: +"Maximum items or lines to return after offset. Omit = all remaining in the window (subject to tool-specific clamps). For geo near-search default is often 5 without radius_km, up to 52 with radius."
      • addedInput schema / properties / limit / minimum
        Added value: +1
      • addedInput schema / properties / offset / default
        Added value: +0
      • addedInput schema / properties / offset / description
        Added value: +"0-based index into a list or discovery file lines (split on \\n). 0 = first. Omit = 0. Combine with limit to page. Use nextOffset / offset+limit from a previous result when present."
      • addedInput schema / properties / offset / minimum
        Added value: +0
      • changedOutput schema / (root)
        Previous value: -nullNew value: +{
        +  "additionalProperties": true,
        +  "description": "Always the same envelope. tools/call returns content[0].text = summary (or JSON) AND structuredContent = this object. On success ok=true with summary + canonicalUrl + extra fields. On failure ok=false with error (snake_case code) and hint (recovery URL). Never writes, never submits forms, never books. Attribution must be kept when quoting. Policy: ai-input yes with attribution; ai-train=no. Host is maps.ikeytz.com (geo/Einsatzgebiet). Prices/FAQ/legal HTML live on www — maps only points.",
        +  "properties": {
        +    "attribution": {
        +      "description": "Required citation: 'Quelle: Schlüsseldienst Ludwigsburg ikeytz (ikeytz.com) · ai-train=no · https://maps.ikeytz.com/.well-known/ai.txt'",
        +      "type": "string"
        +    },
        +    "body": {
        +      "description": "UTF-8 text window after offset/limit",
        +      "type": "string"
        +    },
        +    "canonicalUrl": {
        +      "description": "Best URL to show the user: https://maps.ikeytz.com… page, public embed JSON, tel:+49…, mailto:…, https://wa.me/…, or a www pointer. Prefer this over constructing URLs.",
        +      "type": "string"
        +    },
        +    "error": {
        +      "description": "Present when ok=false. Codes include: unknown_place, unknown_discovery, unknown_doc, q_required, plz_required, coords_required, outside_service_area, url_required, not_maps_host, bad_url, path_or_url_required, serp_not_found, slug_or_coords_required, path_required.",
        +      "type": "string"
        +    },
        +    "hint": {
        +      "description": "Present when ok=false. Absolute URL or short recovery hint the agent should open or pass to another tool.",
        +      "type": "string"
        +    },
        +    "limit": {
        +      "description": "Applied line limit, or null if omitted",
        +      "type": [
        +        "number",
        +        "null"
        +      ]
        +    },
        +    "locale": {
        +      "description": "Locale actually used for URLs. maps is German-only: always de (MAPS-E8 — no /en on maps). Requested non-de is ignored; payload locale=de.",
        +      "enum": [
        +        "de"
        +      ],
        +      "type": "string"
        +    },
        +    "missing": {
        +      "description": "true if the discovery file was not found on disk",
        +      "type": "boolean"
        +    },
        +    "offset": {
        +      "description": "Applied 0-based line offset",
        +      "type": "number"
        +    },
        +    "ok": {
        +      "description": "true = use summary, canonicalUrl, and extra keys. false = do not invent data; read error + hint and retry with valid args or open hint.",
        +      "type": "boolean"
        +    },
        +    "path": {
        +      "description": "Public relative path of the file on maps",
        +      "type": "string"
        +    },
        +    "related": {
        +      "description": "Always includes https://maps.ikeytz.com/llms.txt.",
        +      "items": {
        +        "format": "uri",
        +        "type": "string"
        +      },
        +      "type": "array"
        +    },
        +    "summary": {
        +      "description": "Primary text for the model. For discovery tools this is the file window. For list tools a compact one-liner. Quote with attribution.",
        +      "type": "string"
        +    },
        +    "text": {
        +      "description": "Alias/window of body when present",
        +      "type": "string"
        +    },
        +    "tool": {
        +      "description": "Echo of the tool name that produced this object (e.g. get_service_area).",
        +      "type": "string"
        +    },
        +    "total_lines": {
        +      "description": "Line count of the full file",
        +      "type": "number"
        +    },
        +    "which": {
        +      "description": "Resolved discovery id (ard, ai-catalog, llms, robots, sitemap-txt, llms-mcp-server, …).",
        +      "type": "string"
        +    }
        +  },
        +  "required": [
        +    "ok",
        +    "tool",
        +    "attribution"
        +  ],
        +  "type": "object"
        +}
    • Changedget_auswahl_item5 fields changed
      • addedInput schema / properties / locale / default
        Added value: +"de"
      • addedInput schema / properties / locale / description
        Added value: +"maps is German-only (de). Omit or pass de. Other values are ignored; URLs stay https://maps.ikeytz.com/… with no locale prefix. Not a www multi-locale switch — use @ikeytz/mcp list_locales on www for en|fr|ru|fa|ar|tr."
      • addedInput schema / properties / locale / enum
        Added value: +[
        +  "de"
        +]
      • addedInput schema / properties / slug / description
        Added value: +"Required Auswahl slug on www"
      • changedOutput schema / (root)
        Previous value: -nullNew value: +{
        +  "additionalProperties": true,
        +  "description": "Always the same envelope. tools/call returns content[0].text = summary (or JSON) AND structuredContent = this object. On success ok=true with summary + canonicalUrl + extra fields. On failure ok=false with error (snake_case code) and hint (recovery URL). Never writes, never submits forms, never books. Attribution must be kept when quoting. Policy: ai-input yes with attribution; ai-train=no. Host is maps.ikeytz.com (geo/Einsatzgebiet). Prices/FAQ/legal HTML live on www — maps only points.",
        +  "properties": {
        +    "attribution": {
        +      "description": "Required citation: 'Quelle: Schlüsseldienst Ludwigsburg ikeytz (ikeytz.com) · ai-train=no · https://maps.ikeytz.com/.well-known/ai.txt'",
        +      "type": "string"
        +    },
        +    "canonicalUrl": {
        +      "description": "Best URL to show the user: https://maps.ikeytz.com… page, public embed JSON, tel:+49…, mailto:…, https://wa.me/…, or a www pointer. Prefer this over constructing URLs.",
        +      "type": "string"
        +    },
        +    "error": {
        +      "description": "Present when ok=false. Codes include: unknown_place, unknown_discovery, unknown_doc, q_required, plz_required, coords_required, outside_service_area, url_required, not_maps_host, bad_url, path_or_url_required, serp_not_found, slug_or_coords_required, path_required.",
        +      "type": "string"
        +    },
        +    "hint": {
        +      "description": "Present when ok=false. Absolute URL or short recovery hint the agent should open or pass to another tool.",
        +      "type": "string"
        +    },
        +    "html": {
        +      "description": "Absolute www.ikeytz.com URL — open there or call @ikeytz/mcp",
        +      "format": "uri",
        +      "type": "string"
        +    },
        +    "locale": {
        +      "description": "Locale actually used for URLs. maps is German-only: always de (MAPS-E8 — no /en on maps). Requested non-de is ignored; payload locale=de.",
        +      "enum": [
        +        "de"
        +      ],
        +      "type": "string"
        +    },
        +    "note": {
        +      "description": "maps only points; Volltext/Preise/FAQ live on www",
        +      "type": "string"
        +    },
        +    "npm": {
        +      "description": "www CLI package @ikeytz/mcp",
        +      "type": "string"
        +    },
        +    "ok": {
        +      "description": "true = use summary, canonicalUrl, and extra keys. false = do not invent data; read error + hint and retry with valid args or open hint.",
        +      "type": "boolean"
        +    },
        +    "related": {
        +      "description": "Always includes https://maps.ikeytz.com/llms.txt.",
        +      "items": {
        +        "format": "uri",
        +        "type": "string"
        +      },
        +      "type": "array"
        +    },
        +    "requested_locale": {
        +      "description": "Locale the caller asked for; maps still returns locale=de",
        +      "type": "string"
        +    },
        +    "summary": {
        +      "description": "Primary text for the model. For discovery tools this is the file window. For list tools a compact one-liner. Quote with attribution.",
        +      "type": "string"
        +    },
        +    "tool": {
        +      "description": "Echo of the tool name that produced this object (e.g. get_service_area).",
        +      "type": "string"
        +    },
        +    "www_mcp": {
        +      "description": "https://www.ikeytz.com/mcp — sister machine for prices/FAQ/corpus",
        +      "format": "uri",
        +      "type": "string"
        +    },
        +    "www_tool": {
        +      "description": "Same tool name on www MCP that holds the real payload",
        +      "type": "string"
        +    }
        +  },
        +  "required": [
        +    "ok",
        +    "tool",
        +    "attribution"
        +  ],
        +  "type": "object"
        +}
    • Changedget_business_identity4 fields changed
      • addedInput schema / properties / locale / default
        Added value: +"de"
      • addedInput schema / properties / locale / description
        Added value: +"maps is German-only (de). Omit or pass de. Other values are ignored; URLs stay https://maps.ikeytz.com/… with no locale prefix. Not a www multi-locale switch — use @ikeytz/mcp list_locales on www for en|fr|ru|fa|ar|tr."
      • addedInput schema / properties / locale / enum
        Added value: +[
        +  "de"
        +]
      • changedOutput schema / (root)
        Previous value: -nullNew value: +{
        +  "additionalProperties": true,
        +  "description": "Always the same envelope. tools/call returns content[0].text = summary (or JSON) AND structuredContent = this object. On success ok=true with summary + canonicalUrl + extra fields. On failure ok=false with error (snake_case code) and hint (recovery URL). Never writes, never submits forms, never books. Attribution must be kept when quoting. Policy: ai-input yes with attribution; ai-train=no. Host is maps.ikeytz.com (geo/Einsatzgebiet). Prices/FAQ/legal HTML live on www — maps only points.",
        +  "properties": {
        +    "attribution": {
        +      "description": "Required citation: 'Quelle: Schlüsseldienst Ludwigsburg ikeytz (ikeytz.com) · ai-train=no · https://maps.ikeytz.com/.well-known/ai.txt'",
        +      "type": "string"
        +    },
        +    "brand": {
        +      "type": "string"
        +    },
        +    "canonicalUrl": {
        +      "description": "Best URL to show the user: https://maps.ikeytz.com… page, public embed JSON, tel:+49…, mailto:…, https://wa.me/…, or a www pointer. Prefer this over constructing URLs.",
        +      "type": "string"
        +    },
        +    "error": {
        +      "description": "Present when ok=false. Codes include: unknown_place, unknown_discovery, unknown_doc, q_required, plz_required, coords_required, outside_service_area, url_required, not_maps_host, bad_url, path_or_url_required, serp_not_found, slug_or_coords_required, path_required.",
        +      "type": "string"
        +    },
        +    "hint": {
        +      "description": "Present when ok=false. Absolute URL or short recovery hint the agent should open or pass to another tool.",
        +      "type": "string"
        +    },
        +    "hours": {
        +      "type": "string"
        +    },
        +    "legalName": {
        +      "type": "string"
        +    },
        +    "locale": {
        +      "description": "Locale actually used for URLs. maps is German-only: always de (MAPS-E8 — no /en on maps). Requested non-de is ignored; payload locale=de.",
        +      "enum": [
        +        "de"
        +      ],
        +      "type": "string"
        +    },
        +    "maps": {
        +      "format": "uri",
        +      "type": "string"
        +    },
        +    "nap": {
        +      "description": "Public NAP payload",
        +      "type": "object"
        +    },
        +    "note": {
        +      "type": "string"
        +    },
        +    "office": {
        +      "description": "lat/lng/google_maps/icbm",
        +      "type": "object"
        +    },
        +    "office_note": {
        +      "type": "string"
        +    },
        +    "ok": {
        +      "description": "true = use summary, canonicalUrl, and extra keys. false = do not invent data; read error + hint and retry with valid args or open hint.",
        +      "type": "boolean"
        +    },
        +    "owner": {
        +      "description": "Mahmud Reza Kashani",
        +      "type": "string"
        +    },
        +    "related": {
        +      "description": "Always includes https://maps.ikeytz.com/llms.txt.",
        +      "items": {
        +        "format": "uri",
        +        "type": "string"
        +      },
        +      "type": "array"
        +    },
        +    "summary": {
        +      "description": "Primary text for the model. For discovery tools this is the file window. For list tools a compact one-liner. Quote with attribution.",
        +      "type": "string"
        +    },
        +    "tool": {
        +      "description": "Echo of the tool name that produced this object (e.g. get_service_area).",
        +      "type": "string"
        +    },
        +    "walkIn": {
        +      "description": "Always false",
        +      "type": "boolean"
        +    },
        +    "www": {
        +      "format": "uri",
        +      "type": "string"
        +    }
        +  },
        +  "required": [
        +    "ok",
        +    "tool",
        +    "attribution"
        +  ],
        +  "type": "object"
        +}
    • Changedget_contact4 fields changed
      • addedInput schema / properties / locale / default
        Added value: +"de"
      • addedInput schema / properties / locale / description
        Added value: +"maps is German-only (de). Omit or pass de. Other values are ignored; URLs stay https://maps.ikeytz.com/… with no locale prefix. Not a www multi-locale switch — use @ikeytz/mcp list_locales on www for en|fr|ru|fa|ar|tr."
      • addedInput schema / properties / locale / enum
        Added value: +[
        +  "de"
        +]
      • changedOutput schema / (root)
        Previous value: -nullNew value: +{
        +  "additionalProperties": true,
        +  "description": "Always the same envelope. tools/call returns content[0].text = summary (or JSON) AND structuredContent = this object. On success ok=true with summary + canonicalUrl + extra fields. On failure ok=false with error (snake_case code) and hint (recovery URL). Never writes, never submits forms, never books. Attribution must be kept when quoting. Policy: ai-input yes with attribution; ai-train=no. Host is maps.ikeytz.com (geo/Einsatzgebiet). Prices/FAQ/legal HTML live on www — maps only points.",
        +  "properties": {
        +    "address": {
        +      "description": "Structured address block",
        +      "type": "object"
        +    },
        +    "addressLine": {
        +      "description": "Single-line address",
        +      "type": "string"
        +    },
        +    "attribution": {
        +      "description": "Required citation: 'Quelle: Schlüsseldienst Ludwigsburg ikeytz (ikeytz.com) · ai-train=no · https://maps.ikeytz.com/.well-known/ai.txt'",
        +      "type": "string"
        +    },
        +    "canonicalUrl": {
        +      "description": "Best URL to show the user: https://maps.ikeytz.com… page, public embed JSON, tel:+49…, mailto:…, https://wa.me/…, or a www pointer. Prefer this over constructing URLs.",
        +      "type": "string"
        +    },
        +    "email": {
        +      "description": "info@ikeytz.com",
        +      "type": "string"
        +    },
        +    "error": {
        +      "description": "Present when ok=false. Codes include: unknown_place, unknown_discovery, unknown_doc, q_required, plz_required, coords_required, outside_service_area, url_required, not_maps_host, bad_url, path_or_url_required, serp_not_found, slug_or_coords_required, path_required.",
        +      "type": "string"
        +    },
        +    "fax": {
        +      "description": "Fax display",
        +      "type": "string"
        +    },
        +    "google_maps": {
        +      "type": "string"
        +    },
        +    "hint": {
        +      "description": "Present when ok=false. Absolute URL or short recovery hint the agent should open or pass to another tool.",
        +      "type": "string"
        +    },
        +    "icbm": {
        +      "type": "string"
        +    },
        +    "landline": {
        +      "description": "Landline display",
        +      "type": "string"
        +    },
        +    "lat": {
        +      "description": "Office lat",
        +      "type": "number"
        +    },
        +    "lng": {
        +      "description": "Office lng",
        +      "type": "number"
        +    },
        +    "locale": {
        +      "description": "Locale actually used for URLs. maps is German-only: always de (MAPS-E8 — no /en on maps). Requested non-de is ignored; payload locale=de.",
        +      "enum": [
        +        "de"
        +      ],
        +      "type": "string"
        +    },
        +    "mapsEmail": {
        +      "description": "info@maps.ikeytz.com",
        +      "type": "string"
        +    },
        +    "mobile": {
        +      "description": "Mobile display",
        +      "type": "string"
        +    },
        +    "ok": {
        +      "description": "true = use summary, canonicalUrl, and extra keys. false = do not invent data; read error + hint and retry with valid args or open hint.",
        +      "type": "boolean"
        +    },
        +    "related": {
        +      "description": "Always includes https://maps.ikeytz.com/llms.txt.",
        +      "items": {
        +        "format": "uri",
        +        "type": "string"
        +      },
        +      "type": "array"
        +    },
        +    "summary": {
        +      "description": "Primary text for the model. For discovery tools this is the file window. For list tools a compact one-liner. Quote with attribution.",
        +      "type": "string"
        +    },
        +    "tool": {
        +      "description": "Echo of the tool name that produced this object (e.g. get_service_area).",
        +      "type": "string"
        +    },
        +    "walkIn": {
        +      "description": "Always false",
        +      "type": "boolean"
        +    },
        +    "whatsapp": {
        +      "description": "wa.me URL",
        +      "format": "uri",
        +      "type": "string"
        +    }
        +  },
        +  "required": [
        +    "ok",
        +    "tool",
        +    "attribution"
        +  ],
        +  "type": "object"
        +}
    • Changedget_copyright6 fields changed
      • addedInput schema / properties / limit / description
        Added value: +"Maximum items or lines to return after offset. Omit = all remaining in the window (subject to tool-specific clamps). For geo near-search default is often 5 without radius_km, up to 52 with radius."
      • addedInput schema / properties / limit / minimum
        Added value: +1
      • addedInput schema / properties / offset / default
        Added value: +0
      • addedInput schema / properties / offset / description
        Added value: +"0-based index into a list or discovery file lines (split on \\n). 0 = first. Omit = 0. Combine with limit to page. Use nextOffset / offset+limit from a previous result when present."
      • addedInput schema / properties / offset / minimum
        Added value: +0
      • changedOutput schema / (root)
        Previous value: -nullNew value: +{
        +  "additionalProperties": true,
        +  "description": "Always the same envelope. tools/call returns content[0].text = summary (or JSON) AND structuredContent = this object. On success ok=true with summary + canonicalUrl + extra fields. On failure ok=false with error (snake_case code) and hint (recovery URL). Never writes, never submits forms, never books. Attribution must be kept when quoting. Policy: ai-input yes with attribution; ai-train=no. Host is maps.ikeytz.com (geo/Einsatzgebiet). Prices/FAQ/legal HTML live on www — maps only points.",
        +  "properties": {
        +    "attribution": {
        +      "description": "Required citation: 'Quelle: Schlüsseldienst Ludwigsburg ikeytz (ikeytz.com) · ai-train=no · https://maps.ikeytz.com/.well-known/ai.txt'",
        +      "type": "string"
        +    },
        +    "body": {
        +      "type": "string"
        +    },
        +    "canonicalUrl": {
        +      "description": "Best URL to show the user: https://maps.ikeytz.com… page, public embed JSON, tel:+49…, mailto:…, https://wa.me/…, or a www pointer. Prefer this over constructing URLs.",
        +      "type": "string"
        +    },
        +    "doc": {
        +      "const": "copyright",
        +      "type": "string"
        +    },
        +    "error": {
        +      "description": "Present when ok=false. Codes include: unknown_place, unknown_discovery, unknown_doc, q_required, plz_required, coords_required, outside_service_area, url_required, not_maps_host, bad_url, path_or_url_required, serp_not_found, slug_or_coords_required, path_required.",
        +      "type": "string"
        +    },
        +    "hint": {
        +      "description": "Present when ok=false. Absolute URL or short recovery hint the agent should open or pass to another tool.",
        +      "type": "string"
        +    },
        +    "html": {
        +      "type": "string"
        +    },
        +    "locale": {
        +      "description": "Locale actually used for URLs. maps is German-only: always de (MAPS-E8 — no /en on maps). Requested non-de is ignored; payload locale=de.",
        +      "enum": [
        +        "de"
        +      ],
        +      "type": "string"
        +    },
        +    "ok": {
        +      "description": "true = use summary, canonicalUrl, and extra keys. false = do not invent data; read error + hint and retry with valid args or open hint.",
        +      "type": "boolean"
        +    },
        +    "related": {
        +      "description": "Always includes https://maps.ikeytz.com/llms.txt.",
        +      "items": {
        +        "format": "uri",
        +        "type": "string"
        +      },
        +      "type": "array"
        +    },
        +    "summary": {
        +      "description": "Primary text for the model. For discovery tools this is the file window. For list tools a compact one-liner. Quote with attribution.",
        +      "type": "string"
        +    },
        +    "tool": {
        +      "description": "Echo of the tool name that produced this object (e.g. get_service_area).",
        +      "type": "string"
        +    },
        +    "which": {
        +      "type": "string"
        +    }
        +  },
        +  "required": [
        +    "ok",
        +    "tool",
        +    "attribution"
        +  ],
        +  "type": "object"
        +}
    • Changedget_datenschutz3 fields changed
      • addedInput schema / additionalProperties
        Added value: +false
      • addedInput schema / description
        Added value: +"This tool takes no arguments. Call tools/call with arguments: {}. Extra keys are ignored."
      • changedOutput schema / (root)
        Previous value: -nullNew value: +{
        +  "additionalProperties": true,
        +  "description": "Always the same envelope. tools/call returns content[0].text = summary (or JSON) AND structuredContent = this object. On success ok=true with summary + canonicalUrl + extra fields. On failure ok=false with error (snake_case code) and hint (recovery URL). Never writes, never submits forms, never books. Attribution must be kept when quoting. Policy: ai-input yes with attribution; ai-train=no. Host is maps.ikeytz.com (geo/Einsatzgebiet). Prices/FAQ/legal HTML live on www — maps only points.",
        +  "properties": {
        +    "attribution": {
        +      "description": "Required citation: 'Quelle: Schlüsseldienst Ludwigsburg ikeytz (ikeytz.com) · ai-train=no · https://maps.ikeytz.com/.well-known/ai.txt'",
        +      "type": "string"
        +    },
        +    "canonicalUrl": {
        +      "description": "Best URL to show the user: https://maps.ikeytz.com… page, public embed JSON, tel:+49…, mailto:…, https://wa.me/…, or a www pointer. Prefer this over constructing URLs.",
        +      "type": "string"
        +    },
        +    "error": {
        +      "description": "Present when ok=false. Codes include: unknown_place, unknown_discovery, unknown_doc, q_required, plz_required, coords_required, outside_service_area, url_required, not_maps_host, bad_url, path_or_url_required, serp_not_found, slug_or_coords_required, path_required.",
        +      "type": "string"
        +    },
        +    "hint": {
        +      "description": "Present when ok=false. Absolute URL or short recovery hint the agent should open or pass to another tool.",
        +      "type": "string"
        +    },
        +    "html": {
        +      "description": "Absolute www.ikeytz.com URL — open there or call @ikeytz/mcp",
        +      "format": "uri",
        +      "type": "string"
        +    },
        +    "locale": {
        +      "description": "Locale actually used for URLs. maps is German-only: always de (MAPS-E8 — no /en on maps). Requested non-de is ignored; payload locale=de.",
        +      "enum": [
        +        "de"
        +      ],
        +      "type": "string"
        +    },
        +    "note": {
        +      "description": "maps only points; Volltext/Preise/FAQ live on www",
        +      "type": "string"
        +    },
        +    "npm": {
        +      "description": "www CLI package @ikeytz/mcp",
        +      "type": "string"
        +    },
        +    "ok": {
        +      "description": "true = use summary, canonicalUrl, and extra keys. false = do not invent data; read error + hint and retry with valid args or open hint.",
        +      "type": "boolean"
        +    },
        +    "related": {
        +      "description": "Always includes https://maps.ikeytz.com/llms.txt.",
        +      "items": {
        +        "format": "uri",
        +        "type": "string"
        +      },
        +      "type": "array"
        +    },
        +    "requested_locale": {
        +      "description": "Locale the caller asked for; maps still returns locale=de",
        +      "type": "string"
        +    },
        +    "summary": {
        +      "description": "Primary text for the model. For discovery tools this is the file window. For list tools a compact one-liner. Quote with attribution.",
        +      "type": "string"
        +    },
        +    "tool": {
        +      "description": "Echo of the tool name that produced this object (e.g. get_service_area).",
        +      "type": "string"
        +    },
        +    "www_mcp": {
        +      "description": "https://www.ikeytz.com/mcp — sister machine for prices/FAQ/corpus",
        +      "format": "uri",
        +      "type": "string"
        +    },
        +    "www_tool": {
        +      "description": "Same tool name on www MCP that holds the real payload",
        +      "type": "string"
        +    }
        +  },
        +  "required": [
        +    "ok",
        +    "tool",
        +    "attribution"
        +  ],
        +  "type": "object"
        +}
    • Changedget_discovery8 fields changed
      • addedInput schema / properties / limit / description
        Added value: +"Maximum items or lines to return after offset. Omit = all remaining in the window (subject to tool-specific clamps). For geo near-search default is often 5 without radius_km, up to 52 with radius."
      • addedInput schema / properties / limit / minimum
        Added value: +1
      • addedInput schema / properties / offset / default
        Added value: +0
      • addedInput schema / properties / offset / description
        Added value: +"0-based index into a list or discovery file lines (split on \\n). 0 = first. Omit = 0. Combine with limit to page. Use nextOffset / offset+limit from a previous result when present."
      • addedInput schema / properties / offset / minimum
        Added value: +0
      • addedInput schema / properties / which / description
        Added value: +"Required discovery id. Examples: ard, ai-catalog, ai-txt, ai-plugin, answer-engine, agent-skills, llms, llms-full, llms-index, llms-keywords, llms-serp, llms-impressum-kontakt, llms-orte-geo, llms-urheberrecht, llms-copyright, llms-mcp-server, llms-mcp-web, robots, sitemap-txt, sitemap-xml."
      • removedInput schema / properties / which / enum
        Removed value: -[
        -  "llms",
        -  "llms-full",
        -  "llms-index",
        -  "llms-keywords",
        -  "llms-serp",
        -  "llms-impressum-kontakt",
        -  "llms-orte-geo",
        -  "llms-urheberrecht",
        -  "llms-copyright",
        -  "llms-mcp-server",
        -  "llms-mcp-web",
        -  "robots",
        -  "sitemap-txt",
        -  "sitemap-xml",
        -  "ai-txt",
        -  "ai-plugin",
        -  "answer-engine",
        -  "ai-catalog",
        -  "ard",
        -  "agent-skills"
        -]
      • changedOutput schema / (root)
        Previous value: -nullNew value: +{
        +  "additionalProperties": true,
        +  "description": "Always the same envelope. tools/call returns content[0].text = summary (or JSON) AND structuredContent = this object. On success ok=true with summary + canonicalUrl + extra fields. On failure ok=false with error (snake_case code) and hint (recovery URL). Never writes, never submits forms, never books. Attribution must be kept when quoting. Policy: ai-input yes with attribution; ai-train=no. Host is maps.ikeytz.com (geo/Einsatzgebiet). Prices/FAQ/legal HTML live on www — maps only points.",
        +  "properties": {
        +    "attribution": {
        +      "description": "Required citation: 'Quelle: Schlüsseldienst Ludwigsburg ikeytz (ikeytz.com) · ai-train=no · https://maps.ikeytz.com/.well-known/ai.txt'",
        +      "type": "string"
        +    },
        +    "body": {
        +      "description": "UTF-8 text window after offset/limit",
        +      "type": "string"
        +    },
        +    "canonicalUrl": {
        +      "description": "Best URL to show the user: https://maps.ikeytz.com… page, public embed JSON, tel:+49…, mailto:…, https://wa.me/…, or a www pointer. Prefer this over constructing URLs.",
        +      "type": "string"
        +    },
        +    "error": {
        +      "description": "Present when ok=false. Codes include: unknown_place, unknown_discovery, unknown_doc, q_required, plz_required, coords_required, outside_service_area, url_required, not_maps_host, bad_url, path_or_url_required, serp_not_found, slug_or_coords_required, path_required.",
        +      "type": "string"
        +    },
        +    "hint": {
        +      "description": "Present when ok=false. Absolute URL or short recovery hint the agent should open or pass to another tool.",
        +      "type": "string"
        +    },
        +    "limit": {
        +      "description": "Applied line limit, or null if omitted",
        +      "type": [
        +        "number",
        +        "null"
        +      ]
        +    },
        +    "locale": {
        +      "description": "Locale actually used for URLs. maps is German-only: always de (MAPS-E8 — no /en on maps). Requested non-de is ignored; payload locale=de.",
        +      "enum": [
        +        "de"
        +      ],
        +      "type": "string"
        +    },
        +    "missing": {
        +      "description": "true if the discovery file was not found on disk",
        +      "type": "boolean"
        +    },
        +    "offset": {
        +      "description": "Applied 0-based line offset",
        +      "type": "number"
        +    },
        +    "ok": {
        +      "description": "true = use summary, canonicalUrl, and extra keys. false = do not invent data; read error + hint and retry with valid args or open hint.",
        +      "type": "boolean"
        +    },
        +    "path": {
        +      "description": "Public relative path of the file on maps",
        +      "type": "string"
        +    },
        +    "related": {
        +      "description": "Always includes https://maps.ikeytz.com/llms.txt.",
        +      "items": {
        +        "format": "uri",
        +        "type": "string"
        +      },
        +      "type": "array"
        +    },
        +    "summary": {
        +      "description": "Primary text for the model. For discovery tools this is the file window. For list tools a compact one-liner. Quote with attribution.",
        +      "type": "string"
        +    },
        +    "text": {
        +      "description": "Alias/window of body when present",
        +      "type": "string"
        +    },
        +    "tool": {
        +      "description": "Echo of the tool name that produced this object (e.g. get_service_area).",
        +      "type": "string"
        +    },
        +    "total_lines": {
        +      "description": "Line count of the full file",
        +      "type": "number"
        +    },
        +    "which": {
        +      "description": "Resolved discovery id (ard, ai-catalog, llms, robots, sitemap-txt, llms-mcp-server, …).",
        +      "type": "string"
        +    }
        +  },
        +  "required": [
        +    "ok",
        +    "tool",
        +    "attribution"
        +  ],
        +  "type": "object"
        +}
    • Changedget_embed_map4 fields changed
      • addedInput schema / properties / name / description
        Added value: +"German place name substring (case-insensitive, umlauts ok), e.g. Grünbühl, Pattonville. Used when slug/plz omitted."
      • addedInput schema / properties / plz / description
        Added value: +"German postcode (PLZ). Several Gebiete can share one PLZ (e.g. 71638). For single lookup first match wins; use find_by_plz for all matches."
      • addedInput schema / properties / slug / description
        Added value: +"URL slug of one of the 52 Einsatzgebiete, e.g. pattonville, bietigheim-bissingen, walheim, gruenbuehl. Matches https://maps.ikeytz.com/{slug}. Lookup order when combined with plz/name: slug first."
      • changedOutput schema / (root)
        Previous value: -nullNew value: +{
        +  "additionalProperties": true,
        +  "description": "Always the same envelope. tools/call returns content[0].text = summary (or JSON) AND structuredContent = this object. On success ok=true with summary + canonicalUrl + extra fields. On failure ok=false with error (snake_case code) and hint (recovery URL). Never writes, never submits forms, never books. Attribution must be kept when quoting. Policy: ai-input yes with attribution; ai-train=no. Host is maps.ikeytz.com (geo/Einsatzgebiet). Prices/FAQ/legal HTML live on www — maps only points.",
        +  "properties": {
        +    "attribution": {
        +      "description": "Required citation: 'Quelle: Schlüsseldienst Ludwigsburg ikeytz (ikeytz.com) · ai-train=no · https://maps.ikeytz.com/.well-known/ai.txt'",
        +      "type": "string"
        +    },
        +    "canonicalUrl": {
        +      "description": "Best URL to show the user: https://maps.ikeytz.com… page, public embed JSON, tel:+49…, mailto:…, https://wa.me/…, or a www pointer. Prefer this over constructing URLs.",
        +      "type": "string"
        +    },
        +    "embed_map": {
        +      "format": "uri",
        +      "type": "string"
        +    },
        +    "error": {
        +      "description": "Present when ok=false. Codes include: unknown_place, unknown_discovery, unknown_doc, q_required, plz_required, coords_required, outside_service_area, url_required, not_maps_host, bad_url, path_or_url_required, serp_not_found, slug_or_coords_required, path_required.",
        +      "type": "string"
        +    },
        +    "geo_api": {
        +      "format": "uri",
        +      "type": "string"
        +    },
        +    "hint": {
        +      "description": "Present when ok=false. Absolute URL or short recovery hint the agent should open or pass to another tool.",
        +      "type": "string"
        +    },
        +    "lat": {
        +      "type": "number"
        +    },
        +    "lng": {
        +      "type": "number"
        +    },
        +    "locale": {
        +      "description": "Locale actually used for URLs. maps is German-only: always de (MAPS-E8 — no /en on maps). Requested non-de is ignored; payload locale=de.",
        +      "enum": [
        +        "de"
        +      ],
        +      "type": "string"
        +    },
        +    "name": {
        +      "type": "string"
        +    },
        +    "ok": {
        +      "description": "true = use summary, canonicalUrl, and extra keys. false = do not invent data; read error + hint and retry with valid args or open hint.",
        +      "type": "boolean"
        +    },
        +    "plz": {
        +      "type": "string"
        +    },
        +    "related": {
        +      "description": "Always includes https://maps.ikeytz.com/llms.txt.",
        +      "items": {
        +        "format": "uri",
        +        "type": "string"
        +      },
        +      "type": "array"
        +    },
        +    "slug": {
        +      "type": "string"
        +    },
        +    "summary": {
        +      "description": "Primary text for the model. For discovery tools this is the file window. For list tools a compact one-liner. Quote with attribution.",
        +      "type": "string"
        +    },
        +    "tool": {
        +      "description": "Echo of the tool name that produced this object (e.g. get_service_area).",
        +      "type": "string"
        +    }
        +  },
        +  "required": [
        +    "ok",
        +    "tool",
        +    "attribution"
        +  ],
        +  "type": "object"
        +}
    • Changedget_emergency4 fields changed
      • addedInput schema / properties / locale / default
        Added value: +"de"
      • addedInput schema / properties / locale / description
        Added value: +"maps is German-only (de). Omit or pass de. Other values are ignored; URLs stay https://maps.ikeytz.com/… with no locale prefix. Not a www multi-locale switch — use @ikeytz/mcp list_locales on www for en|fr|ru|fa|ar|tr."
      • addedInput schema / properties / locale / enum
        Added value: +[
        +  "de"
        +]
      • changedOutput schema / (root)
        Previous value: -nullNew value: +{
        +  "additionalProperties": true,
        +  "description": "Always the same envelope. tools/call returns content[0].text = summary (or JSON) AND structuredContent = this object. On success ok=true with summary + canonicalUrl + extra fields. On failure ok=false with error (snake_case code) and hint (recovery URL). Never writes, never submits forms, never books. Attribution must be kept when quoting. Policy: ai-input yes with attribution; ai-train=no. Host is maps.ikeytz.com (geo/Einsatzgebiet). Prices/FAQ/legal HTML live on www — maps only points.",
        +  "properties": {
        +    "attribution": {
        +      "description": "Required citation: 'Quelle: Schlüsseldienst Ludwigsburg ikeytz (ikeytz.com) · ai-train=no · https://maps.ikeytz.com/.well-known/ai.txt'",
        +      "type": "string"
        +    },
        +    "canonicalUrl": {
        +      "description": "Best URL to show the user: https://maps.ikeytz.com… page, public embed JSON, tel:+49…, mailto:…, https://wa.me/…, or a www pointer. Prefer this over constructing URLs.",
        +      "type": "string"
        +    },
        +    "error": {
        +      "description": "Present when ok=false. Codes include: unknown_place, unknown_discovery, unknown_doc, q_required, plz_required, coords_required, outside_service_area, url_required, not_maps_host, bad_url, path_or_url_required, serp_not_found, slug_or_coords_required, path_required.",
        +      "type": "string"
        +    },
        +    "hint": {
        +      "description": "Present when ok=false. Absolute URL or short recovery hint the agent should open or pass to another tool.",
        +      "type": "string"
        +    },
        +    "html": {
        +      "description": "Absolute www.ikeytz.com URL — open there or call @ikeytz/mcp",
        +      "format": "uri",
        +      "type": "string"
        +    },
        +    "locale": {
        +      "description": "Locale actually used for URLs. maps is German-only: always de (MAPS-E8 — no /en on maps). Requested non-de is ignored; payload locale=de.",
        +      "enum": [
        +        "de"
        +      ],
        +      "type": "string"
        +    },
        +    "note": {
        +      "description": "maps only points; Volltext/Preise/FAQ live on www",
        +      "type": "string"
        +    },
        +    "npm": {
        +      "description": "www CLI package @ikeytz/mcp",
        +      "type": "string"
        +    },
        +    "ok": {
        +      "description": "true = use summary, canonicalUrl, and extra keys. false = do not invent data; read error + hint and retry with valid args or open hint.",
        +      "type": "boolean"
        +    },
        +    "related": {
        +      "description": "Always includes https://maps.ikeytz.com/llms.txt.",
        +      "items": {
        +        "format": "uri",
        +        "type": "string"
        +      },
        +      "type": "array"
        +    },
        +    "requested_locale": {
        +      "description": "Locale the caller asked for; maps still returns locale=de",
        +      "type": "string"
        +    },
        +    "summary": {
        +      "description": "Primary text for the model. For discovery tools this is the file window. For list tools a compact one-liner. Quote with attribution.",
        +      "type": "string"
        +    },
        +    "tool": {
        +      "description": "Echo of the tool name that produced this object (e.g. get_service_area).",
        +      "type": "string"
        +    },
        +    "www_mcp": {
        +      "description": "https://www.ikeytz.com/mcp — sister machine for prices/FAQ/corpus",
        +      "format": "uri",
        +      "type": "string"
        +    },
        +    "www_tool": {
        +      "description": "Same tool name on www MCP that holds the real payload",
        +      "type": "string"
        +    }
        +  },
        +  "required": [
        +    "ok",
        +    "tool",
        +    "attribution"
        +  ],
        +  "type": "object"
        +}
    • Changedget_faq6 fields changed
      • addedInput schema / properties / id / description
        Added value: +"FAQ id on www"
      • addedInput schema / properties / locale / default
        Added value: +"de"
      • addedInput schema / properties / locale / description
        Added value: +"maps is German-only (de). Omit or pass de. Other values are ignored; URLs stay https://maps.ikeytz.com/… with no locale prefix. Not a www multi-locale switch — use @ikeytz/mcp list_locales on www for en|fr|ru|fa|ar|tr."
      • addedInput schema / properties / locale / enum
        Added value: +[
        +  "de"
        +]
      • addedInput schema / properties / q / description
        Added value: +"FAQ question search on www"
      • changedOutput schema / (root)
        Previous value: -nullNew value: +{
        +  "additionalProperties": true,
        +  "description": "Always the same envelope. tools/call returns content[0].text = summary (or JSON) AND structuredContent = this object. On success ok=true with summary + canonicalUrl + extra fields. On failure ok=false with error (snake_case code) and hint (recovery URL). Never writes, never submits forms, never books. Attribution must be kept when quoting. Policy: ai-input yes with attribution; ai-train=no. Host is maps.ikeytz.com (geo/Einsatzgebiet). Prices/FAQ/legal HTML live on www — maps only points.",
        +  "properties": {
        +    "attribution": {
        +      "description": "Required citation: 'Quelle: Schlüsseldienst Ludwigsburg ikeytz (ikeytz.com) · ai-train=no · https://maps.ikeytz.com/.well-known/ai.txt'",
        +      "type": "string"
        +    },
        +    "canonicalUrl": {
        +      "description": "Best URL to show the user: https://maps.ikeytz.com… page, public embed JSON, tel:+49…, mailto:…, https://wa.me/…, or a www pointer. Prefer this over constructing URLs.",
        +      "type": "string"
        +    },
        +    "error": {
        +      "description": "Present when ok=false. Codes include: unknown_place, unknown_discovery, unknown_doc, q_required, plz_required, coords_required, outside_service_area, url_required, not_maps_host, bad_url, path_or_url_required, serp_not_found, slug_or_coords_required, path_required.",
        +      "type": "string"
        +    },
        +    "hint": {
        +      "description": "Present when ok=false. Absolute URL or short recovery hint the agent should open or pass to another tool.",
        +      "type": "string"
        +    },
        +    "html": {
        +      "description": "Absolute www.ikeytz.com URL — open there or call @ikeytz/mcp",
        +      "format": "uri",
        +      "type": "string"
        +    },
        +    "locale": {
        +      "description": "Locale actually used for URLs. maps is German-only: always de (MAPS-E8 — no /en on maps). Requested non-de is ignored; payload locale=de.",
        +      "enum": [
        +        "de"
        +      ],
        +      "type": "string"
        +    },
        +    "note": {
        +      "description": "maps only points; Volltext/Preise/FAQ live on www",
        +      "type": "string"
        +    },
        +    "npm": {
        +      "description": "www CLI package @ikeytz/mcp",
        +      "type": "string"
        +    },
        +    "ok": {
        +      "description": "true = use summary, canonicalUrl, and extra keys. false = do not invent data; read error + hint and retry with valid args or open hint.",
        +      "type": "boolean"
        +    },
        +    "related": {
        +      "description": "Always includes https://maps.ikeytz.com/llms.txt.",
        +      "items": {
        +        "format": "uri",
        +        "type": "string"
        +      },
        +      "type": "array"
        +    },
        +    "requested_locale": {
        +      "description": "Locale the caller asked for; maps still returns locale=de",
        +      "type": "string"
        +    },
        +    "summary": {
        +      "description": "Primary text for the model. For discovery tools this is the file window. For list tools a compact one-liner. Quote with attribution.",
        +      "type": "string"
        +    },
        +    "tool": {
        +      "description": "Echo of the tool name that produced this object (e.g. get_service_area).",
        +      "type": "string"
        +    },
        +    "www_mcp": {
        +      "description": "https://www.ikeytz.com/mcp — sister machine for prices/FAQ/corpus",
        +      "format": "uri",
        +      "type": "string"
        +    },
        +    "www_tool": {
        +      "description": "Same tool name on www MCP that holds the real payload",
        +      "type": "string"
        +    }
        +  },
        +  "required": [
        +    "ok",
        +    "tool",
        +    "attribution"
        +  ],
        +  "type": "object"
        +}
    • Changedget_geo_api4 fields changed
      • addedInput schema / properties / name / description
        Added value: +"German place name substring (case-insensitive, umlauts ok), e.g. Grünbühl, Pattonville. Used when slug/plz omitted."
      • addedInput schema / properties / plz / description
        Added value: +"German postcode (PLZ). Several Gebiete can share one PLZ (e.g. 71638). For single lookup first match wins; use find_by_plz for all matches."
      • addedInput schema / properties / slug / description
        Added value: +"URL slug of one of the 52 Einsatzgebiete, e.g. pattonville, bietigheim-bissingen, walheim, gruenbuehl. Matches https://maps.ikeytz.com/{slug}. Lookup order when combined with plz/name: slug first."
      • changedOutput schema / (root)
        Previous value: -nullNew value: +{
        +  "additionalProperties": true,
        +  "description": "Always the same envelope. tools/call returns content[0].text = summary (or JSON) AND structuredContent = this object. On success ok=true with summary + canonicalUrl + extra fields. On failure ok=false with error (snake_case code) and hint (recovery URL). Never writes, never submits forms, never books. Attribution must be kept when quoting. Policy: ai-input yes with attribution; ai-train=no. Host is maps.ikeytz.com (geo/Einsatzgebiet). Prices/FAQ/legal HTML live on www — maps only points.",
        +  "properties": {
        +    "attribution": {
        +      "description": "Required citation: 'Quelle: Schlüsseldienst Ludwigsburg ikeytz (ikeytz.com) · ai-train=no · https://maps.ikeytz.com/.well-known/ai.txt'",
        +      "type": "string"
        +    },
        +    "canonicalUrl": {
        +      "description": "Best URL to show the user: https://maps.ikeytz.com… page, public embed JSON, tel:+49…, mailto:…, https://wa.me/…, or a www pointer. Prefer this over constructing URLs.",
        +      "type": "string"
        +    },
        +    "embed_map": {
        +      "format": "uri",
        +      "type": "string"
        +    },
        +    "error": {
        +      "description": "Present when ok=false. Codes include: unknown_place, unknown_discovery, unknown_doc, q_required, plz_required, coords_required, outside_service_area, url_required, not_maps_host, bad_url, path_or_url_required, serp_not_found, slug_or_coords_required, path_required.",
        +      "type": "string"
        +    },
        +    "geo_api": {
        +      "format": "uri",
        +      "type": "string"
        +    },
        +    "hint": {
        +      "description": "Present when ok=false. Absolute URL or short recovery hint the agent should open or pass to another tool.",
        +      "type": "string"
        +    },
        +    "lat": {
        +      "type": "number"
        +    },
        +    "lng": {
        +      "type": "number"
        +    },
        +    "locale": {
        +      "description": "Locale actually used for URLs. maps is German-only: always de (MAPS-E8 — no /en on maps). Requested non-de is ignored; payload locale=de.",
        +      "enum": [
        +        "de"
        +      ],
        +      "type": "string"
        +    },
        +    "name": {
        +      "type": "string"
        +    },
        +    "note": {
        +      "description": "Public JSON pointer; use get_grenze for polygon in MCP",
        +      "type": "string"
        +    },
        +    "ok": {
        +      "description": "true = use summary, canonicalUrl, and extra keys. false = do not invent data; read error + hint and retry with valid args or open hint.",
        +      "type": "boolean"
        +    },
        +    "plz": {
        +      "type": "string"
        +    },
        +    "related": {
        +      "description": "Always includes https://maps.ikeytz.com/llms.txt.",
        +      "items": {
        +        "format": "uri",
        +        "type": "string"
        +      },
        +      "type": "array"
        +    },
        +    "slug": {
        +      "type": "string"
        +    },
        +    "summary": {
        +      "description": "Primary text for the model. For discovery tools this is the file window. For list tools a compact one-liner. Quote with attribution.",
        +      "type": "string"
        +    },
        +    "tool": {
        +      "description": "Echo of the tool name that produced this object (e.g. get_service_area).",
        +      "type": "string"
        +    }
        +  },
        +  "required": [
        +    "ok",
        +    "tool",
        +    "attribution"
        +  ],
        +  "type": "object"
        +}
    • Changedget_geo_office4 fields changed
      • addedInput schema / properties / locale / default
        Added value: +"de"
      • addedInput schema / properties / locale / description
        Added value: +"maps is German-only (de). Omit or pass de. Other values are ignored; URLs stay https://maps.ikeytz.com/… with no locale prefix. Not a www multi-locale switch — use @ikeytz/mcp list_locales on www for en|fr|ru|fa|ar|tr."
      • addedInput schema / properties / locale / enum
        Added value: +[
        +  "de"
        +]
      • changedOutput schema / (root)
        Previous value: -nullNew value: +{
        +  "additionalProperties": true,
        +  "description": "Always the same envelope. tools/call returns content[0].text = summary (or JSON) AND structuredContent = this object. On success ok=true with summary + canonicalUrl + extra fields. On failure ok=false with error (snake_case code) and hint (recovery URL). Never writes, never submits forms, never books. Attribution must be kept when quoting. Policy: ai-input yes with attribution; ai-train=no. Host is maps.ikeytz.com (geo/Einsatzgebiet). Prices/FAQ/legal HTML live on www — maps only points.",
        +  "properties": {
        +    "attribution": {
        +      "description": "Required citation: 'Quelle: Schlüsseldienst Ludwigsburg ikeytz (ikeytz.com) · ai-train=no · https://maps.ikeytz.com/.well-known/ai.txt'",
        +      "type": "string"
        +    },
        +    "canonicalUrl": {
        +      "description": "Best URL to show the user: https://maps.ikeytz.com… page, public embed JSON, tel:+49…, mailto:…, https://wa.me/…, or a www pointer. Prefer this over constructing URLs.",
        +      "type": "string"
        +    },
        +    "city": {
        +      "description": "City",
        +      "type": "string"
        +    },
        +    "error": {
        +      "description": "Present when ok=false. Codes include: unknown_place, unknown_discovery, unknown_doc, q_required, plz_required, coords_required, outside_service_area, url_required, not_maps_host, bad_url, path_or_url_required, serp_not_found, slug_or_coords_required, path_required.",
        +      "type": "string"
        +    },
        +    "google_maps": {
        +      "description": "'lat, lng'",
        +      "type": "string"
        +    },
        +    "hint": {
        +      "description": "Present when ok=false. Absolute URL or short recovery hint the agent should open or pass to another tool.",
        +      "type": "string"
        +    },
        +    "icbm": {
        +      "description": "ICBM string",
        +      "type": "string"
        +    },
        +    "lat": {
        +      "description": "Office latitude",
        +      "type": "number"
        +    },
        +    "lng": {
        +      "description": "Office longitude",
        +      "type": "number"
        +    },
        +    "locale": {
        +      "description": "Locale actually used for URLs. maps is German-only: always de (MAPS-E8 — no /en on maps). Requested non-de is ignored; payload locale=de.",
        +      "enum": [
        +        "de"
        +      ],
        +      "type": "string"
        +    },
        +    "ok": {
        +      "description": "true = use summary, canonicalUrl, and extra keys. false = do not invent data; read error + hint and retry with valid args or open hint.",
        +      "type": "boolean"
        +    },
        +    "postal": {
        +      "description": "Postal code",
        +      "type": "string"
        +    },
        +    "related": {
        +      "description": "Always includes https://maps.ikeytz.com/llms.txt.",
        +      "items": {
        +        "format": "uri",
        +        "type": "string"
        +      },
        +      "type": "array"
        +    },
        +    "street": {
        +      "description": "Office street",
        +      "type": "string"
        +    },
        +    "summary": {
        +      "description": "Primary text for the model. For discovery tools this is the file window. For list tools a compact one-liner. Quote with attribution.",
        +      "type": "string"
        +    },
        +    "tool": {
        +      "description": "Echo of the tool name that produced this object (e.g. get_service_area).",
        +      "type": "string"
        +    },
        +    "walkIn": {
        +      "description": "Always false — no shop counter",
        +      "type": "boolean"
        +    }
        +  },
        +  "required": [
        +    "ok",
        +    "tool",
        +    "attribution"
        +  ],
        +  "type": "object"
        +}
    • Changedget_geschichte4 fields changed
      • addedInput schema / properties / name / description
        Added value: +"German place name substring (case-insensitive, umlauts ok), e.g. Grünbühl, Pattonville. Used when slug/plz omitted."
      • addedInput schema / properties / plz / description
        Added value: +"German postcode (PLZ). Several Gebiete can share one PLZ (e.g. 71638). For single lookup first match wins; use find_by_plz for all matches."
      • addedInput schema / properties / slug / description
        Added value: +"URL slug of one of the 52 Einsatzgebiete, e.g. pattonville, bietigheim-bissingen, walheim, gruenbuehl. Matches https://maps.ikeytz.com/{slug}. Lookup order when combined with plz/name: slug first."
      • changedOutput schema / (root)
        Previous value: -nullNew value: +{
        +  "additionalProperties": true,
        +  "description": "Always the same envelope. tools/call returns content[0].text = summary (or JSON) AND structuredContent = this object. On success ok=true with summary + canonicalUrl + extra fields. On failure ok=false with error (snake_case code) and hint (recovery URL). Never writes, never submits forms, never books. Attribution must be kept when quoting. Policy: ai-input yes with attribution; ai-train=no. Host is maps.ikeytz.com (geo/Einsatzgebiet). Prices/FAQ/legal HTML live on www — maps only points.",
        +  "properties": {
        +    "attribution": {
        +      "description": "Required citation: 'Quelle: Schlüsseldienst Ludwigsburg ikeytz (ikeytz.com) · ai-train=no · https://maps.ikeytz.com/.well-known/ai.txt'",
        +      "type": "string"
        +    },
        +    "canonicalUrl": {
        +      "description": "Best URL to show the user: https://maps.ikeytz.com… page, public embed JSON, tel:+49…, mailto:…, https://wa.me/…, or a www pointer. Prefer this over constructing URLs.",
        +      "type": "string"
        +    },
        +    "error": {
        +      "description": "Present when ok=false. Codes include: unknown_place, unknown_discovery, unknown_doc, q_required, plz_required, coords_required, outside_service_area, url_required, not_maps_host, bad_url, path_or_url_required, serp_not_found, slug_or_coords_required, path_required.",
        +      "type": "string"
        +    },
        +    "geschichte": {
        +      "description": "Geschichte prose (may be empty)",
        +      "type": "string"
        +    },
        +    "hint": {
        +      "description": "Present when ok=false. Absolute URL or short recovery hint the agent should open or pass to another tool.",
        +      "type": "string"
        +    },
        +    "locale": {
        +      "description": "Locale actually used for URLs. maps is German-only: always de (MAPS-E8 — no /en on maps). Requested non-de is ignored; payload locale=de.",
        +      "enum": [
        +        "de"
        +      ],
        +      "type": "string"
        +    },
        +    "name": {
        +      "type": "string"
        +    },
        +    "ok": {
        +      "description": "true = use summary, canonicalUrl, and extra keys. false = do not invent data; read error + hint and retry with valid args or open hint.",
        +      "type": "boolean"
        +    },
        +    "related": {
        +      "description": "Always includes https://maps.ikeytz.com/llms.txt.",
        +      "items": {
        +        "format": "uri",
        +        "type": "string"
        +      },
        +      "type": "array"
        +    },
        +    "slug": {
        +      "type": "string"
        +    },
        +    "summary": {
        +      "description": "Primary text for the model. For discovery tools this is the file window. For list tools a compact one-liner. Quote with attribution.",
        +      "type": "string"
        +    },
        +    "tool": {
        +      "description": "Echo of the tool name that produced this object (e.g. get_service_area).",
        +      "type": "string"
        +    }
        +  },
        +  "required": [
        +    "ok",
        +    "tool",
        +    "attribution"
        +  ],
        +  "type": "object"
        +}
    • Changedget_grenze4 fields changed
      • addedInput schema / properties / name / description
        Added value: +"German place name substring (case-insensitive, umlauts ok), e.g. Grünbühl, Pattonville. Used when slug/plz omitted."
      • addedInput schema / properties / plz / description
        Added value: +"German postcode (PLZ). Several Gebiete can share one PLZ (e.g. 71638). For single lookup first match wins; use find_by_plz for all matches."
      • addedInput schema / properties / slug / description
        Added value: +"URL slug of one of the 52 Einsatzgebiete, e.g. pattonville, bietigheim-bissingen, walheim, gruenbuehl. Matches https://maps.ikeytz.com/{slug}. Lookup order when combined with plz/name: slug first."
      • changedOutput schema / (root)
        Previous value: -nullNew value: +{
        +  "additionalProperties": true,
        +  "description": "Always the same envelope. tools/call returns content[0].text = summary (or JSON) AND structuredContent = this object. On success ok=true with summary + canonicalUrl + extra fields. On failure ok=false with error (snake_case code) and hint (recovery URL). Never writes, never submits forms, never books. Attribution must be kept when quoting. Policy: ai-input yes with attribution; ai-train=no. Host is maps.ikeytz.com (geo/Einsatzgebiet). Prices/FAQ/legal HTML live on www — maps only points.",
        +  "properties": {
        +    "attribution": {
        +      "description": "Required citation: 'Quelle: Schlüsseldienst Ludwigsburg ikeytz (ikeytz.com) · ai-train=no · https://maps.ikeytz.com/.well-known/ai.txt'",
        +      "type": "string"
        +    },
        +    "canonicalUrl": {
        +      "description": "Best URL to show the user: https://maps.ikeytz.com… page, public embed JSON, tel:+49…, mailto:…, https://wa.me/…, or a www pointer. Prefer this over constructing URLs.",
        +      "type": "string"
        +    },
        +    "error": {
        +      "description": "Present when ok=false. Codes include: unknown_place, unknown_discovery, unknown_doc, q_required, plz_required, coords_required, outside_service_area, url_required, not_maps_host, bad_url, path_or_url_required, serp_not_found, slug_or_coords_required, path_required.",
        +      "type": "string"
        +    },
        +    "geo_api": {
        +      "format": "uri",
        +      "type": "string"
        +    },
        +    "hasPolygon": {
        +      "description": "true if polygon.features length > 0",
        +      "type": "boolean"
        +    },
        +    "hint": {
        +      "description": "Present when ok=false. Absolute URL or short recovery hint the agent should open or pass to another tool.",
        +      "type": "string"
        +    },
        +    "lat": {
        +      "type": "number"
        +    },
        +    "lng": {
        +      "type": "number"
        +    },
        +    "locale": {
        +      "description": "Locale actually used for URLs. maps is German-only: always de (MAPS-E8 — no /en on maps). Requested non-de is ignored; payload locale=de.",
        +      "enum": [
        +        "de"
        +      ],
        +      "type": "string"
        +    },
        +    "name": {
        +      "type": "string"
        +    },
        +    "ok": {
        +      "description": "true = use summary, canonicalUrl, and extra keys. false = do not invent data; read error + hint and retry with valid args or open hint.",
        +      "type": "boolean"
        +    },
        +    "osmRelationId": {
        +      "description": "OSM relation id if any",
        +      "type": [
        +        "number",
        +        "null"
        +      ]
        +    },
        +    "osmWayId": {
        +      "description": "OSM way id if any",
        +      "type": [
        +        "number",
        +        "null"
        +      ]
        +    },
        +    "plz": {
        +      "type": "string"
        +    },
        +    "point": {
        +      "description": "Point feature or null",
        +      "type": [
        +        "object",
        +        "null"
        +      ]
        +    },
        +    "polygon": {
        +      "description": "GeoJSON FeatureCollection (may be empty)",
        +      "type": "object"
        +    },
        +    "related": {
        +      "description": "Always includes https://maps.ikeytz.com/llms.txt.",
        +      "items": {
        +        "format": "uri",
        +        "type": "string"
        +      },
        +      "type": "array"
        +    },
        +    "slug": {
        +      "type": "string"
        +    },
        +    "summary": {
        +      "description": "Primary text for the model. For discovery tools this is the file window. For list tools a compact one-liner. Quote with attribution.",
        +      "type": "string"
        +    },
        +    "tool": {
        +      "description": "Echo of the tool name that produced this object (e.g. get_service_area).",
        +      "type": "string"
        +    },
        +    "via": {
        +      "description": "Fetch path hint",
        +      "type": [
        +        "string",
        +        "null"
        +      ]
        +    }
        +  },
        +  "required": [
        +    "ok",
        +    "tool",
        +    "attribution"
        +  ],
        +  "type": "object"
        +}
    • Changedget_hub3 fields changed
      • addedInput schema / additionalProperties
        Added value: +false
      • addedInput schema / description
        Added value: +"This tool takes no arguments. Call tools/call with arguments: {}. Extra keys are ignored."
      • changedOutput schema / (root)
        Previous value: -nullNew value: +{
        +  "additionalProperties": true,
        +  "description": "Always the same envelope. tools/call returns content[0].text = summary (or JSON) AND structuredContent = this object. On success ok=true with summary + canonicalUrl + extra fields. On failure ok=false with error (snake_case code) and hint (recovery URL). Never writes, never submits forms, never books. Attribution must be kept when quoting. Policy: ai-input yes with attribution; ai-train=no. Host is maps.ikeytz.com (geo/Einsatzgebiet). Prices/FAQ/legal HTML live on www — maps only points.",
        +  "properties": {
        +    "attribution": {
        +      "description": "Required citation: 'Quelle: Schlüsseldienst Ludwigsburg ikeytz (ikeytz.com) · ai-train=no · https://maps.ikeytz.com/.well-known/ai.txt'",
        +      "type": "string"
        +    },
        +    "canonicalUrl": {
        +      "description": "Best URL to show the user: https://maps.ikeytz.com… page, public embed JSON, tel:+49…, mailto:…, https://wa.me/…, or a www pointer. Prefer this over constructing URLs.",
        +      "type": "string"
        +    },
        +    "count": {
        +      "description": "52",
        +      "type": "number"
        +    },
        +    "error": {
        +      "description": "Present when ok=false. Codes include: unknown_place, unknown_discovery, unknown_doc, q_required, plz_required, coords_required, outside_service_area, url_required, not_maps_host, bad_url, path_or_url_required, serp_not_found, slug_or_coords_required, path_required.",
        +      "type": "string"
        +    },
        +    "h1": {
        +      "description": "Hub H1",
        +      "type": "string"
        +    },
        +    "hint": {
        +      "description": "Present when ok=false. Absolute URL or short recovery hint the agent should open or pass to another tool.",
        +      "type": "string"
        +    },
        +    "items": {
        +      "description": "slug/name/embed_map rows",
        +      "items": {
        +        "properties": {
        +          "embed_map": {
        +            "format": "uri",
        +            "type": "string"
        +          },
        +          "name": {
        +            "type": "string"
        +          },
        +          "slug": {
        +            "type": "string"
        +          }
        +        },
        +        "type": "object"
        +      },
        +      "type": "array"
        +    },
        +    "locale": {
        +      "description": "Locale actually used for URLs. maps is German-only: always de (MAPS-E8 — no /en on maps). Requested non-de is ignored; payload locale=de.",
        +      "enum": [
        +        "de"
        +      ],
        +      "type": "string"
        +    },
        +    "ok": {
        +      "description": "true = use summary, canonicalUrl, and extra keys. false = do not invent data; read error + hint and retry with valid args or open hint.",
        +      "type": "boolean"
        +    },
        +    "related": {
        +      "description": "Always includes https://maps.ikeytz.com/llms.txt.",
        +      "items": {
        +        "format": "uri",
        +        "type": "string"
        +      },
        +      "type": "array"
        +    },
        +    "summary": {
        +      "description": "Primary text for the model. For discovery tools this is the file window. For list tools a compact one-liner. Quote with attribution.",
        +      "type": "string"
        +    },
        +    "title": {
        +      "description": "Hub title",
        +      "type": "string"
        +    },
        +    "tool": {
        +      "description": "Echo of the tool name that produced this object (e.g. get_service_area).",
        +      "type": "string"
        +    }
        +  },
        +  "required": [
        +    "ok",
        +    "tool",
        +    "attribution"
        +  ],
        +  "type": "object"
        +}
    • Changedget_impressum6 fields changed
      • addedInput schema / properties / limit / description
        Added value: +"Maximum items or lines to return after offset. Omit = all remaining in the window (subject to tool-specific clamps). For geo near-search default is often 5 without radius_km, up to 52 with radius."
      • addedInput schema / properties / limit / minimum
        Added value: +1
      • addedInput schema / properties / offset / default
        Added value: +0
      • addedInput schema / properties / offset / description
        Added value: +"0-based index into a list or discovery file lines (split on \\n). 0 = first. Omit = 0. Combine with limit to page. Use nextOffset / offset+limit from a previous result when present."
      • addedInput schema / properties / offset / minimum
        Added value: +0
      • changedOutput schema / (root)
        Previous value: -nullNew value: +{
        +  "additionalProperties": true,
        +  "description": "Always the same envelope. tools/call returns content[0].text = summary (or JSON) AND structuredContent = this object. On success ok=true with summary + canonicalUrl + extra fields. On failure ok=false with error (snake_case code) and hint (recovery URL). Never writes, never submits forms, never books. Attribution must be kept when quoting. Policy: ai-input yes with attribution; ai-train=no. Host is maps.ikeytz.com (geo/Einsatzgebiet). Prices/FAQ/legal HTML live on www — maps only points.",
        +  "properties": {
        +    "attribution": {
        +      "description": "Required citation: 'Quelle: Schlüsseldienst Ludwigsburg ikeytz (ikeytz.com) · ai-train=no · https://maps.ikeytz.com/.well-known/ai.txt'",
        +      "type": "string"
        +    },
        +    "body": {
        +      "type": "string"
        +    },
        +    "canonicalUrl": {
        +      "description": "Best URL to show the user: https://maps.ikeytz.com… page, public embed JSON, tel:+49…, mailto:…, https://wa.me/…, or a www pointer. Prefer this over constructing URLs.",
        +      "type": "string"
        +    },
        +    "doc": {
        +      "const": "impressum",
        +      "type": "string"
        +    },
        +    "error": {
        +      "description": "Present when ok=false. Codes include: unknown_place, unknown_discovery, unknown_doc, q_required, plz_required, coords_required, outside_service_area, url_required, not_maps_host, bad_url, path_or_url_required, serp_not_found, slug_or_coords_required, path_required.",
        +      "type": "string"
        +    },
        +    "hint": {
        +      "description": "Present when ok=false. Absolute URL or short recovery hint the agent should open or pass to another tool.",
        +      "type": "string"
        +    },
        +    "html": {
        +      "description": "www /impressum",
        +      "type": "string"
        +    },
        +    "locale": {
        +      "description": "Locale actually used for URLs. maps is German-only: always de (MAPS-E8 — no /en on maps). Requested non-de is ignored; payload locale=de.",
        +      "enum": [
        +        "de"
        +      ],
        +      "type": "string"
        +    },
        +    "ok": {
        +      "description": "true = use summary, canonicalUrl, and extra keys. false = do not invent data; read error + hint and retry with valid args or open hint.",
        +      "type": "boolean"
        +    },
        +    "related": {
        +      "description": "Always includes https://maps.ikeytz.com/llms.txt.",
        +      "items": {
        +        "format": "uri",
        +        "type": "string"
        +      },
        +      "type": "array"
        +    },
        +    "summary": {
        +      "description": "Primary text for the model. For discovery tools this is the file window. For list tools a compact one-liner. Quote with attribution.",
        +      "type": "string"
        +    },
        +    "tool": {
        +      "description": "Echo of the tool name that produced this object (e.g. get_service_area).",
        +      "type": "string"
        +    },
        +    "which": {
        +      "type": "string"
        +    }
        +  },
        +  "required": [
        +    "ok",
        +    "tool",
        +    "attribution"
        +  ],
        +  "type": "object"
        +}
    • Changedget_invoice_line_items7 fields changed
      • addedInput schema / properties / breakdown / description
        Added value: +"www flag; ignored for maps pointer payload."
      • addedInput schema / properties / locale / default
        Added value: +"de"
      • addedInput schema / properties / locale / description
        Added value: +"maps is German-only (de). Omit or pass de. Other values are ignored; URLs stay https://maps.ikeytz.com/… with no locale prefix. Not a www multi-locale switch — use @ikeytz/mcp list_locales on www for en|fr|ru|fa|ar|tr."
      • addedInput schema / properties / locale / enum
        Added value: +[
        +  "de"
        +]
      • addedInput schema / properties / situationKey / description
        Added value: +"Required for www. Situation id (opening_slam, opening_locked, pkg_key_*, cylinder_only, cylinder_mount, aliases)."
      • addedInput schema / properties / whenKey / description
        Added value: +"day|night|now — used on www; maps only points."
      • changedOutput schema / (root)
        Previous value: -nullNew value: +{
        +  "additionalProperties": true,
        +  "description": "Always the same envelope. tools/call returns content[0].text = summary (or JSON) AND structuredContent = this object. On success ok=true with summary + canonicalUrl + extra fields. On failure ok=false with error (snake_case code) and hint (recovery URL). Never writes, never submits forms, never books. Attribution must be kept when quoting. Policy: ai-input yes with attribution; ai-train=no. Host is maps.ikeytz.com (geo/Einsatzgebiet). Prices/FAQ/legal HTML live on www — maps only points.",
        +  "properties": {
        +    "attribution": {
        +      "description": "Required citation: 'Quelle: Schlüsseldienst Ludwigsburg ikeytz (ikeytz.com) · ai-train=no · https://maps.ikeytz.com/.well-known/ai.txt'",
        +      "type": "string"
        +    },
        +    "canonicalUrl": {
        +      "description": "Best URL to show the user: https://maps.ikeytz.com… page, public embed JSON, tel:+49…, mailto:…, https://wa.me/…, or a www pointer. Prefer this over constructing URLs.",
        +      "type": "string"
        +    },
        +    "error": {
        +      "description": "Present when ok=false. Codes include: unknown_place, unknown_discovery, unknown_doc, q_required, plz_required, coords_required, outside_service_area, url_required, not_maps_host, bad_url, path_or_url_required, serp_not_found, slug_or_coords_required, path_required.",
        +      "type": "string"
        +    },
        +    "hint": {
        +      "description": "Present when ok=false. Absolute URL or short recovery hint the agent should open or pass to another tool.",
        +      "type": "string"
        +    },
        +    "html": {
        +      "description": "Absolute www.ikeytz.com URL — open there or call @ikeytz/mcp",
        +      "format": "uri",
        +      "type": "string"
        +    },
        +    "locale": {
        +      "description": "Locale actually used for URLs. maps is German-only: always de (MAPS-E8 — no /en on maps). Requested non-de is ignored; payload locale=de.",
        +      "enum": [
        +        "de"
        +      ],
        +      "type": "string"
        +    },
        +    "note": {
        +      "description": "maps only points; Volltext/Preise/FAQ live on www",
        +      "type": "string"
        +    },
        +    "npm": {
        +      "description": "www CLI package @ikeytz/mcp",
        +      "type": "string"
        +    },
        +    "ok": {
        +      "description": "true = use summary, canonicalUrl, and extra keys. false = do not invent data; read error + hint and retry with valid args or open hint.",
        +      "type": "boolean"
        +    },
        +    "related": {
        +      "description": "Always includes https://maps.ikeytz.com/llms.txt.",
        +      "items": {
        +        "format": "uri",
        +        "type": "string"
        +      },
        +      "type": "array"
        +    },
        +    "requested_locale": {
        +      "description": "Locale the caller asked for; maps still returns locale=de",
        +      "type": "string"
        +    },
        +    "summary": {
        +      "description": "Primary text for the model. For discovery tools this is the file window. For list tools a compact one-liner. Quote with attribution.",
        +      "type": "string"
        +    },
        +    "tool": {
        +      "description": "Echo of the tool name that produced this object (e.g. get_service_area).",
        +      "type": "string"
        +    },
        +    "www_mcp": {
        +      "description": "https://www.ikeytz.com/mcp — sister machine for prices/FAQ/corpus",
        +      "format": "uri",
        +      "type": "string"
        +    },
        +    "www_tool": {
        +      "description": "Same tool name on www MCP that holds the real payload",
        +      "type": "string"
        +    }
        +  },
        +  "required": [
        +    "ok",
        +    "tool",
        +    "attribution"
        +  ],
        +  "type": "object"
        +}
    • Changedget_lage4 fields changed
      • addedInput schema / properties / name / description
        Added value: +"German place name substring (case-insensitive, umlauts ok), e.g. Grünbühl, Pattonville. Used when slug/plz omitted."
      • addedInput schema / properties / plz / description
        Added value: +"German postcode (PLZ). Several Gebiete can share one PLZ (e.g. 71638). For single lookup first match wins; use find_by_plz for all matches."
      • addedInput schema / properties / slug / description
        Added value: +"URL slug of one of the 52 Einsatzgebiete, e.g. pattonville, bietigheim-bissingen, walheim, gruenbuehl. Matches https://maps.ikeytz.com/{slug}. Lookup order when combined with plz/name: slug first."
      • changedOutput schema / (root)
        Previous value: -nullNew value: +{
        +  "additionalProperties": true,
        +  "description": "Always the same envelope. tools/call returns content[0].text = summary (or JSON) AND structuredContent = this object. On success ok=true with summary + canonicalUrl + extra fields. On failure ok=false with error (snake_case code) and hint (recovery URL). Never writes, never submits forms, never books. Attribution must be kept when quoting. Policy: ai-input yes with attribution; ai-train=no. Host is maps.ikeytz.com (geo/Einsatzgebiet). Prices/FAQ/legal HTML live on www — maps only points.",
        +  "properties": {
        +    "attribution": {
        +      "description": "Required citation: 'Quelle: Schlüsseldienst Ludwigsburg ikeytz (ikeytz.com) · ai-train=no · https://maps.ikeytz.com/.well-known/ai.txt'",
        +      "type": "string"
        +    },
        +    "canonicalUrl": {
        +      "description": "Best URL to show the user: https://maps.ikeytz.com… page, public embed JSON, tel:+49…, mailto:…, https://wa.me/…, or a www pointer. Prefer this over constructing URLs.",
        +      "type": "string"
        +    },
        +    "error": {
        +      "description": "Present when ok=false. Codes include: unknown_place, unknown_discovery, unknown_doc, q_required, plz_required, coords_required, outside_service_area, url_required, not_maps_host, bad_url, path_or_url_required, serp_not_found, slug_or_coords_required, path_required.",
        +      "type": "string"
        +    },
        +    "hint": {
        +      "description": "Present when ok=false. Absolute URL or short recovery hint the agent should open or pass to another tool.",
        +      "type": "string"
        +    },
        +    "lage": {
        +      "description": "Lage prose (may be empty)",
        +      "type": "string"
        +    },
        +    "locale": {
        +      "description": "Locale actually used for URLs. maps is German-only: always de (MAPS-E8 — no /en on maps). Requested non-de is ignored; payload locale=de.",
        +      "enum": [
        +        "de"
        +      ],
        +      "type": "string"
        +    },
        +    "name": {
        +      "type": "string"
        +    },
        +    "ok": {
        +      "description": "true = use summary, canonicalUrl, and extra keys. false = do not invent data; read error + hint and retry with valid args or open hint.",
        +      "type": "boolean"
        +    },
        +    "related": {
        +      "description": "Always includes https://maps.ikeytz.com/llms.txt.",
        +      "items": {
        +        "format": "uri",
        +        "type": "string"
        +      },
        +      "type": "array"
        +    },
        +    "slug": {
        +      "type": "string"
        +    },
        +    "summary": {
        +      "description": "Primary text for the model. For discovery tools this is the file window. For list tools a compact one-liner. Quote with attribution.",
        +      "type": "string"
        +    },
        +    "tool": {
        +      "description": "Echo of the tool name that produced this object (e.g. get_service_area).",
        +      "type": "string"
        +    }
        +  },
        +  "required": [
        +    "ok",
        +    "tool",
        +    "attribution"
        +  ],
        +  "type": "object"
        +}
    • Changedget_legal10 fields changed
      • addedInput schema / properties / doc / description
        Added value: +"Required. maps corpus: urheberrecht|copyright|impressum. www links only: agb|nutzungsbedingungen|datenschutz|widerruf."
      • addedInput schema / properties / limit / description
        Added value: +"Maximum items or lines to return after offset. Omit = all remaining in the window (subject to tool-specific clamps). For geo near-search default is often 5 without radius_km, up to 52 with radius."
      • addedInput schema / properties / limit / minimum
        Added value: +1
      • addedInput schema / properties / locale / default
        Added value: +"de"
      • addedInput schema / properties / locale / description
        Added value: +"maps is German-only (de). Omit or pass de. Other values are ignored; URLs stay https://maps.ikeytz.com/… with no locale prefix. Not a www multi-locale switch — use @ikeytz/mcp list_locales on www for en|fr|ru|fa|ar|tr."
      • addedInput schema / properties / locale / enum
        Added value: +[
        +  "de"
        +]
      • addedInput schema / properties / offset / default
        Added value: +0
      • addedInput schema / properties / offset / description
        Added value: +"0-based index into a list or discovery file lines (split on \\n). 0 = first. Omit = 0. Combine with limit to page. Use nextOffset / offset+limit from a previous result when present."
      • addedInput schema / properties / offset / minimum
        Added value: +0
      • changedOutput schema / (root)
        Previous value: -nullNew value: +{
        +  "additionalProperties": true,
        +  "description": "Always the same envelope. tools/call returns content[0].text = summary (or JSON) AND structuredContent = this object. On success ok=true with summary + canonicalUrl + extra fields. On failure ok=false with error (snake_case code) and hint (recovery URL). Never writes, never submits forms, never books. Attribution must be kept when quoting. Policy: ai-input yes with attribution; ai-train=no. Host is maps.ikeytz.com (geo/Einsatzgebiet). Prices/FAQ/legal HTML live on www — maps only points.",
        +  "properties": {
        +    "attribution": {
        +      "description": "Required citation: 'Quelle: Schlüsseldienst Ludwigsburg ikeytz (ikeytz.com) · ai-train=no · https://maps.ikeytz.com/.well-known/ai.txt'",
        +      "type": "string"
        +    },
        +    "body": {
        +      "description": "maps text window when applicable",
        +      "type": "string"
        +    },
        +    "canonicalUrl": {
        +      "description": "Best URL to show the user: https://maps.ikeytz.com… page, public embed JSON, tel:+49…, mailto:…, https://wa.me/…, or a www pointer. Prefer this over constructing URLs.",
        +      "type": "string"
        +    },
        +    "doc": {
        +      "description": "Resolved doc id",
        +      "type": "string"
        +    },
        +    "error": {
        +      "description": "Present when ok=false. Codes include: unknown_place, unknown_discovery, unknown_doc, q_required, plz_required, coords_required, outside_service_area, url_required, not_maps_host, bad_url, path_or_url_required, serp_not_found, slug_or_coords_required, path_required.",
        +      "type": "string"
        +    },
        +    "hint": {
        +      "description": "Present when ok=false. Absolute URL or short recovery hint the agent should open or pass to another tool.",
        +      "type": "string"
        +    },
        +    "html": {
        +      "description": "www HTML URL when applicable",
        +      "type": "string"
        +    },
        +    "locale": {
        +      "description": "Locale actually used for URLs. maps is German-only: always de (MAPS-E8 — no /en on maps). Requested non-de is ignored; payload locale=de.",
        +      "enum": [
        +        "de"
        +      ],
        +      "type": "string"
        +    },
        +    "note": {
        +      "description": "Host split note",
        +      "type": "string"
        +    },
        +    "ok": {
        +      "description": "true = use summary, canonicalUrl, and extra keys. false = do not invent data; read error + hint and retry with valid args or open hint.",
        +      "type": "boolean"
        +    },
        +    "related": {
        +      "description": "Always includes https://maps.ikeytz.com/llms.txt.",
        +      "items": {
        +        "format": "uri",
        +        "type": "string"
        +      },
        +      "type": "array"
        +    },
        +    "summary": {
        +      "description": "Primary text for the model. For discovery tools this is the file window. For list tools a compact one-liner. Quote with attribution.",
        +      "type": "string"
        +    },
        +    "tool": {
        +      "description": "Echo of the tool name that produced this object (e.g. get_service_area).",
        +      "type": "string"
        +    },
        +    "which": {
        +      "description": "Discovery id for maps text docs",
        +      "type": "string"
        +    }
        +  },
        +  "required": [
        +    "ok",
        +    "tool",
        +    "attribution"
        +  ],
        +  "type": "object"
        +}
    • Changedget_links4 fields changed
      • addedInput schema / properties / locale / default
        Added value: +"de"
      • addedInput schema / properties / locale / description
        Added value: +"maps is German-only (de). Omit or pass de. Other values are ignored; URLs stay https://maps.ikeytz.com/… with no locale prefix. Not a www multi-locale switch — use @ikeytz/mcp list_locales on www for en|fr|ru|fa|ar|tr."
      • addedInput schema / properties / locale / enum
        Added value: +[
        +  "de"
        +]
      • changedOutput schema / (root)
        Previous value: -nullNew value: +{
        +  "additionalProperties": true,
        +  "description": "Always the same envelope. tools/call returns content[0].text = summary (or JSON) AND structuredContent = this object. On success ok=true with summary + canonicalUrl + extra fields. On failure ok=false with error (snake_case code) and hint (recovery URL). Never writes, never submits forms, never books. Attribution must be kept when quoting. Policy: ai-input yes with attribution; ai-train=no. Host is maps.ikeytz.com (geo/Einsatzgebiet). Prices/FAQ/legal HTML live on www — maps only points.",
        +  "properties": {
        +    "attribution": {
        +      "description": "Required citation: 'Quelle: Schlüsseldienst Ludwigsburg ikeytz (ikeytz.com) · ai-train=no · https://maps.ikeytz.com/.well-known/ai.txt'",
        +      "type": "string"
        +    },
        +    "canonicalUrl": {
        +      "description": "Best URL to show the user: https://maps.ikeytz.com… page, public embed JSON, tel:+49…, mailto:…, https://wa.me/…, or a www pointer. Prefer this over constructing URLs.",
        +      "type": "string"
        +    },
        +    "error": {
        +      "description": "Present when ok=false. Codes include: unknown_place, unknown_discovery, unknown_doc, q_required, plz_required, coords_required, outside_service_area, url_required, not_maps_host, bad_url, path_or_url_required, serp_not_found, slug_or_coords_required, path_required.",
        +      "type": "string"
        +    },
        +    "hint": {
        +      "description": "Present when ok=false. Absolute URL or short recovery hint the agent should open or pass to another tool.",
        +      "type": "string"
        +    },
        +    "items": {
        +      "description": "Named absolute URLs",
        +      "properties": {
        +        "card": {
        +          "format": "uri",
        +          "type": "string"
        +        },
        +        "hub": {
        +          "format": "uri",
        +          "type": "string"
        +        },
        +        "llms": {
        +          "format": "uri",
        +          "type": "string"
        +        },
        +        "mcp": {
        +          "format": "uri",
        +          "type": "string"
        +        },
        +        "npm": {
        +          "format": "uri",
        +          "type": "string"
        +        },
        +        "registry": {
        +          "format": "uri",
        +          "type": "string"
        +        },
        +        "skills": {
        +          "format": "uri",
        +          "type": "string"
        +        }
        +      },
        +      "type": "object"
        +    },
        +    "locale": {
        +      "description": "Locale actually used for URLs. maps is German-only: always de (MAPS-E8 — no /en on maps). Requested non-de is ignored; payload locale=de.",
        +      "enum": [
        +        "de"
        +      ],
        +      "type": "string"
        +    },
        +    "note": {
        +      "type": "string"
        +    },
        +    "ok": {
        +      "description": "true = use summary, canonicalUrl, and extra keys. false = do not invent data; read error + hint and retry with valid args or open hint.",
        +      "type": "boolean"
        +    },
        +    "related": {
        +      "description": "Always includes https://maps.ikeytz.com/llms.txt.",
        +      "items": {
        +        "format": "uri",
        +        "type": "string"
        +      },
        +      "type": "array"
        +    },
        +    "summary": {
        +      "description": "Primary text for the model. For discovery tools this is the file window. For list tools a compact one-liner. Quote with attribution.",
        +      "type": "string"
        +    },
        +    "tool": {
        +      "description": "Echo of the tool name that produced this object (e.g. get_service_area).",
        +      "type": "string"
        +    }
        +  },
        +  "required": [
        +    "ok",
        +    "tool",
        +    "attribution"
        +  ],
        +  "type": "object"
        +}
    • Changedget_llms_mcp_server6 fields changed
      • addedInput schema / properties / limit / description
        Added value: +"Maximum items or lines to return after offset. Omit = all remaining in the window (subject to tool-specific clamps). For geo near-search default is often 5 without radius_km, up to 52 with radius."
      • addedInput schema / properties / limit / minimum
        Added value: +1
      • addedInput schema / properties / offset / default
        Added value: +0
      • addedInput schema / properties / offset / description
        Added value: +"0-based index into a list or discovery file lines (split on \\n). 0 = first. Omit = 0. Combine with limit to page. Use nextOffset / offset+limit from a previous result when present."
      • addedInput schema / properties / offset / minimum
        Added value: +0
      • changedOutput schema / (root)
        Previous value: -nullNew value: +{
        +  "additionalProperties": true,
        +  "description": "Always the same envelope. tools/call returns content[0].text = summary (or JSON) AND structuredContent = this object. On success ok=true with summary + canonicalUrl + extra fields. On failure ok=false with error (snake_case code) and hint (recovery URL). Never writes, never submits forms, never books. Attribution must be kept when quoting. Policy: ai-input yes with attribution; ai-train=no. Host is maps.ikeytz.com (geo/Einsatzgebiet). Prices/FAQ/legal HTML live on www — maps only points.",
        +  "properties": {
        +    "attribution": {
        +      "description": "Required citation: 'Quelle: Schlüsseldienst Ludwigsburg ikeytz (ikeytz.com) · ai-train=no · https://maps.ikeytz.com/.well-known/ai.txt'",
        +      "type": "string"
        +    },
        +    "body": {
        +      "description": "UTF-8 text window after offset/limit",
        +      "type": "string"
        +    },
        +    "canonicalUrl": {
        +      "description": "Best URL to show the user: https://maps.ikeytz.com… page, public embed JSON, tel:+49…, mailto:…, https://wa.me/…, or a www pointer. Prefer this over constructing URLs.",
        +      "type": "string"
        +    },
        +    "error": {
        +      "description": "Present when ok=false. Codes include: unknown_place, unknown_discovery, unknown_doc, q_required, plz_required, coords_required, outside_service_area, url_required, not_maps_host, bad_url, path_or_url_required, serp_not_found, slug_or_coords_required, path_required.",
        +      "type": "string"
        +    },
        +    "hint": {
        +      "description": "Present when ok=false. Absolute URL or short recovery hint the agent should open or pass to another tool.",
        +      "type": "string"
        +    },
        +    "limit": {
        +      "description": "Applied line limit, or null if omitted",
        +      "type": [
        +        "number",
        +        "null"
        +      ]
        +    },
        +    "locale": {
        +      "description": "Locale actually used for URLs. maps is German-only: always de (MAPS-E8 — no /en on maps). Requested non-de is ignored; payload locale=de.",
        +      "enum": [
        +        "de"
        +      ],
        +      "type": "string"
        +    },
        +    "missing": {
        +      "description": "true if the discovery file was not found on disk",
        +      "type": "boolean"
        +    },
        +    "offset": {
        +      "description": "Applied 0-based line offset",
        +      "type": "number"
        +    },
        +    "ok": {
        +      "description": "true = use summary, canonicalUrl, and extra keys. false = do not invent data; read error + hint and retry with valid args or open hint.",
        +      "type": "boolean"
        +    },
        +    "path": {
        +      "description": "Public relative path of the file on maps",
        +      "type": "string"
        +    },
        +    "related": {
        +      "description": "Always includes https://maps.ikeytz.com/llms.txt.",
        +      "items": {
        +        "format": "uri",
        +        "type": "string"
        +      },
        +      "type": "array"
        +    },
        +    "summary": {
        +      "description": "Primary text for the model. For discovery tools this is the file window. For list tools a compact one-liner. Quote with attribution.",
        +      "type": "string"
        +    },
        +    "text": {
        +      "description": "Alias/window of body when present",
        +      "type": "string"
        +    },
        +    "tool": {
        +      "description": "Echo of the tool name that produced this object (e.g. get_service_area).",
        +      "type": "string"
        +    },
        +    "total_lines": {
        +      "description": "Line count of the full file",
        +      "type": "number"
        +    },
        +    "which": {
        +      "description": "Resolved discovery id (ard, ai-catalog, llms, robots, sitemap-txt, llms-mcp-server, …).",
        +      "type": "string"
        +    }
        +  },
        +  "required": [
        +    "ok",
        +    "tool",
        +    "attribution"
        +  ],
        +  "type": "object"
        +}
    • Changedget_llms_mcp_web6 fields changed
      • addedInput schema / properties / limit / description
        Added value: +"Maximum items or lines to return after offset. Omit = all remaining in the window (subject to tool-specific clamps). For geo near-search default is often 5 without radius_km, up to 52 with radius."
      • addedInput schema / properties / limit / minimum
        Added value: +1
      • addedInput schema / properties / offset / default
        Added value: +0
      • addedInput schema / properties / offset / description
        Added value: +"0-based index into a list or discovery file lines (split on \\n). 0 = first. Omit = 0. Combine with limit to page. Use nextOffset / offset+limit from a previous result when present."
      • addedInput schema / properties / offset / minimum
        Added value: +0
      • changedOutput schema / (root)
        Previous value: -nullNew value: +{
        +  "additionalProperties": true,
        +  "description": "Always the same envelope. tools/call returns content[0].text = summary (or JSON) AND structuredContent = this object. On success ok=true with summary + canonicalUrl + extra fields. On failure ok=false with error (snake_case code) and hint (recovery URL). Never writes, never submits forms, never books. Attribution must be kept when quoting. Policy: ai-input yes with attribution; ai-train=no. Host is maps.ikeytz.com (geo/Einsatzgebiet). Prices/FAQ/legal HTML live on www — maps only points.",
        +  "properties": {
        +    "attribution": {
        +      "description": "Required citation: 'Quelle: Schlüsseldienst Ludwigsburg ikeytz (ikeytz.com) · ai-train=no · https://maps.ikeytz.com/.well-known/ai.txt'",
        +      "type": "string"
        +    },
        +    "body": {
        +      "description": "UTF-8 text window after offset/limit",
        +      "type": "string"
        +    },
        +    "canonicalUrl": {
        +      "description": "Best URL to show the user: https://maps.ikeytz.com… page, public embed JSON, tel:+49…, mailto:…, https://wa.me/…, or a www pointer. Prefer this over constructing URLs.",
        +      "type": "string"
        +    },
        +    "error": {
        +      "description": "Present when ok=false. Codes include: unknown_place, unknown_discovery, unknown_doc, q_required, plz_required, coords_required, outside_service_area, url_required, not_maps_host, bad_url, path_or_url_required, serp_not_found, slug_or_coords_required, path_required.",
        +      "type": "string"
        +    },
        +    "hint": {
        +      "description": "Present when ok=false. Absolute URL or short recovery hint the agent should open or pass to another tool.",
        +      "type": "string"
        +    },
        +    "limit": {
        +      "description": "Applied line limit, or null if omitted",
        +      "type": [
        +        "number",
        +        "null"
        +      ]
        +    },
        +    "locale": {
        +      "description": "Locale actually used for URLs. maps is German-only: always de (MAPS-E8 — no /en on maps). Requested non-de is ignored; payload locale=de.",
        +      "enum": [
        +        "de"
        +      ],
        +      "type": "string"
        +    },
        +    "missing": {
        +      "description": "true if the discovery file was not found on disk",
        +      "type": "boolean"
        +    },
        +    "offset": {
        +      "description": "Applied 0-based line offset",
        +      "type": "number"
        +    },
        +    "ok": {
        +      "description": "true = use summary, canonicalUrl, and extra keys. false = do not invent data; read error + hint and retry with valid args or open hint.",
        +      "type": "boolean"
        +    },
        +    "path": {
        +      "description": "Public relative path of the file on maps",
        +      "type": "string"
        +    },
        +    "related": {
        +      "description": "Always includes https://maps.ikeytz.com/llms.txt.",
        +      "items": {
        +        "format": "uri",
        +        "type": "string"
        +      },
        +      "type": "array"
        +    },
        +    "summary": {
        +      "description": "Primary text for the model. For discovery tools this is the file window. For list tools a compact one-liner. Quote with attribution.",
        +      "type": "string"
        +    },
        +    "text": {
        +      "description": "Alias/window of body when present",
        +      "type": "string"
        +    },
        +    "tool": {
        +      "description": "Echo of the tool name that produced this object (e.g. get_service_area).",
        +      "type": "string"
        +    },
        +    "total_lines": {
        +      "description": "Line count of the full file",
        +      "type": "number"
        +    },
        +    "which": {
        +      "description": "Resolved discovery id (ard, ai-catalog, llms, robots, sitemap-txt, llms-mcp-server, …).",
        +      "type": "string"
        +    }
        +  },
        +  "required": [
        +    "ok",
        +    "tool",
        +    "attribution"
        +  ],
        +  "type": "object"
        +}
    • Changedget_llms_txt6 fields changed
      • addedInput schema / properties / limit / description
        Added value: +"Maximum items or lines to return after offset. Omit = all remaining in the window (subject to tool-specific clamps). For geo near-search default is often 5 without radius_km, up to 52 with radius."
      • addedInput schema / properties / limit / minimum
        Added value: +1
      • addedInput schema / properties / offset / default
        Added value: +0
      • addedInput schema / properties / offset / description
        Added value: +"0-based index into a list or discovery file lines (split on \\n). 0 = first. Omit = 0. Combine with limit to page. Use nextOffset / offset+limit from a previous result when present."
      • addedInput schema / properties / offset / minimum
        Added value: +0
      • changedOutput schema / (root)
        Previous value: -nullNew value: +{
        +  "additionalProperties": true,
        +  "description": "Always the same envelope. tools/call returns content[0].text = summary (or JSON) AND structuredContent = this object. On success ok=true with summary + canonicalUrl + extra fields. On failure ok=false with error (snake_case code) and hint (recovery URL). Never writes, never submits forms, never books. Attribution must be kept when quoting. Policy: ai-input yes with attribution; ai-train=no. Host is maps.ikeytz.com (geo/Einsatzgebiet). Prices/FAQ/legal HTML live on www — maps only points.",
        +  "properties": {
        +    "attribution": {
        +      "description": "Required citation: 'Quelle: Schlüsseldienst Ludwigsburg ikeytz (ikeytz.com) · ai-train=no · https://maps.ikeytz.com/.well-known/ai.txt'",
        +      "type": "string"
        +    },
        +    "body": {
        +      "description": "UTF-8 text window after offset/limit",
        +      "type": "string"
        +    },
        +    "canonicalUrl": {
        +      "description": "Best URL to show the user: https://maps.ikeytz.com… page, public embed JSON, tel:+49…, mailto:…, https://wa.me/…, or a www pointer. Prefer this over constructing URLs.",
        +      "type": "string"
        +    },
        +    "error": {
        +      "description": "Present when ok=false. Codes include: unknown_place, unknown_discovery, unknown_doc, q_required, plz_required, coords_required, outside_service_area, url_required, not_maps_host, bad_url, path_or_url_required, serp_not_found, slug_or_coords_required, path_required.",
        +      "type": "string"
        +    },
        +    "hint": {
        +      "description": "Present when ok=false. Absolute URL or short recovery hint the agent should open or pass to another tool.",
        +      "type": "string"
        +    },
        +    "limit": {
        +      "description": "Applied line limit, or null if omitted",
        +      "type": [
        +        "number",
        +        "null"
        +      ]
        +    },
        +    "locale": {
        +      "description": "Locale actually used for URLs. maps is German-only: always de (MAPS-E8 — no /en on maps). Requested non-de is ignored; payload locale=de.",
        +      "enum": [
        +        "de"
        +      ],
        +      "type": "string"
        +    },
        +    "missing": {
        +      "description": "true if the discovery file was not found on disk",
        +      "type": "boolean"
        +    },
        +    "offset": {
        +      "description": "Applied 0-based line offset",
        +      "type": "number"
        +    },
        +    "ok": {
        +      "description": "true = use summary, canonicalUrl, and extra keys. false = do not invent data; read error + hint and retry with valid args or open hint.",
        +      "type": "boolean"
        +    },
        +    "path": {
        +      "description": "Public relative path of the file on maps",
        +      "type": "string"
        +    },
        +    "related": {
        +      "description": "Always includes https://maps.ikeytz.com/llms.txt.",
        +      "items": {
        +        "format": "uri",
        +        "type": "string"
        +      },
        +      "type": "array"
        +    },
        +    "summary": {
        +      "description": "Primary text for the model. For discovery tools this is the file window. For list tools a compact one-liner. Quote with attribution.",
        +      "type": "string"
        +    },
        +    "text": {
        +      "description": "Alias/window of body when present",
        +      "type": "string"
        +    },
        +    "tool": {
        +      "description": "Echo of the tool name that produced this object (e.g. get_service_area).",
        +      "type": "string"
        +    },
        +    "total_lines": {
        +      "description": "Line count of the full file",
        +      "type": "number"
        +    },
        +    "which": {
        +      "description": "Resolved discovery id (ard, ai-catalog, llms, robots, sitemap-txt, llms-mcp-server, …).",
        +      "type": "string"
        +    }
        +  },
        +  "required": [
        +    "ok",
        +    "tool",
        +    "attribution"
        +  ],
        +  "type": "object"
        +}
    • Changedget_nutzungsbedingungen3 fields changed
      • addedInput schema / additionalProperties
        Added value: +false
      • addedInput schema / description
        Added value: +"This tool takes no arguments. Call tools/call with arguments: {}. Extra keys are ignored."
      • changedOutput schema / (root)
        Previous value: -nullNew value: +{
        +  "additionalProperties": true,
        +  "description": "Always the same envelope. tools/call returns content[0].text = summary (or JSON) AND structuredContent = this object. On success ok=true with summary + canonicalUrl + extra fields. On failure ok=false with error (snake_case code) and hint (recovery URL). Never writes, never submits forms, never books. Attribution must be kept when quoting. Policy: ai-input yes with attribution; ai-train=no. Host is maps.ikeytz.com (geo/Einsatzgebiet). Prices/FAQ/legal HTML live on www — maps only points.",
        +  "properties": {
        +    "attribution": {
        +      "description": "Required citation: 'Quelle: Schlüsseldienst Ludwigsburg ikeytz (ikeytz.com) · ai-train=no · https://maps.ikeytz.com/.well-known/ai.txt'",
        +      "type": "string"
        +    },
        +    "canonicalUrl": {
        +      "description": "Best URL to show the user: https://maps.ikeytz.com… page, public embed JSON, tel:+49…, mailto:…, https://wa.me/…, or a www pointer. Prefer this over constructing URLs.",
        +      "type": "string"
        +    },
        +    "error": {
        +      "description": "Present when ok=false. Codes include: unknown_place, unknown_discovery, unknown_doc, q_required, plz_required, coords_required, outside_service_area, url_required, not_maps_host, bad_url, path_or_url_required, serp_not_found, slug_or_coords_required, path_required.",
        +      "type": "string"
        +    },
        +    "hint": {
        +      "description": "Present when ok=false. Absolute URL or short recovery hint the agent should open or pass to another tool.",
        +      "type": "string"
        +    },
        +    "html": {
        +      "description": "Absolute www.ikeytz.com URL — open there or call @ikeytz/mcp",
        +      "format": "uri",
        +      "type": "string"
        +    },
        +    "locale": {
        +      "description": "Locale actually used for URLs. maps is German-only: always de (MAPS-E8 — no /en on maps). Requested non-de is ignored; payload locale=de.",
        +      "enum": [
        +        "de"
        +      ],
        +      "type": "string"
        +    },
        +    "note": {
        +      "description": "maps only points; Volltext/Preise/FAQ live on www",
        +      "type": "string"
        +    },
        +    "npm": {
        +      "description": "www CLI package @ikeytz/mcp",
        +      "type": "string"
        +    },
        +    "ok": {
        +      "description": "true = use summary, canonicalUrl, and extra keys. false = do not invent data; read error + hint and retry with valid args or open hint.",
        +      "type": "boolean"
        +    },
        +    "related": {
        +      "description": "Always includes https://maps.ikeytz.com/llms.txt.",
        +      "items": {
        +        "format": "uri",
        +        "type": "string"
        +      },
        +      "type": "array"
        +    },
        +    "requested_locale": {
        +      "description": "Locale the caller asked for; maps still returns locale=de",
        +      "type": "string"
        +    },
        +    "summary": {
        +      "description": "Primary text for the model. For discovery tools this is the file window. For list tools a compact one-liner. Quote with attribution.",
        +      "type": "string"
        +    },
        +    "tool": {
        +      "description": "Echo of the tool name that produced this object (e.g. get_service_area).",
        +      "type": "string"
        +    },
        +    "www_mcp": {
        +      "description": "https://www.ikeytz.com/mcp — sister machine for prices/FAQ/corpus",
        +      "format": "uri",
        +      "type": "string"
        +    },
        +    "www_tool": {
        +      "description": "Same tool name on www MCP that holds the real payload",
        +      "type": "string"
        +    }
        +  },
        +  "required": [
        +    "ok",
        +    "tool",
        +    "attribution"
        +  ],
        +  "type": "object"
        +}
    • Changedget_ort_datetime4 fields changed
      • addedInput schema / properties / name / description
        Added value: +"German place name substring (case-insensitive, umlauts ok), e.g. Grünbühl, Pattonville. Used when slug/plz omitted."
      • addedInput schema / properties / plz / description
        Added value: +"German postcode (PLZ). Several Gebiete can share one PLZ (e.g. 71638). For single lookup first match wins; use find_by_plz for all matches."
      • addedInput schema / properties / slug / description
        Added value: +"URL slug of one of the 52 Einsatzgebiete, e.g. pattonville, bietigheim-bissingen, walheim, gruenbuehl. Matches https://maps.ikeytz.com/{slug}. Lookup order when combined with plz/name: slug first."
      • changedOutput schema / (root)
        Previous value: -nullNew value: +{
        +  "additionalProperties": true,
        +  "description": "Always the same envelope. tools/call returns content[0].text = summary (or JSON) AND structuredContent = this object. On success ok=true with summary + canonicalUrl + extra fields. On failure ok=false with error (snake_case code) and hint (recovery URL). Never writes, never submits forms, never books. Attribution must be kept when quoting. Policy: ai-input yes with attribution; ai-train=no. Host is maps.ikeytz.com (geo/Einsatzgebiet). Prices/FAQ/legal HTML live on www — maps only points.",
        +  "properties": {
        +    "attribution": {
        +      "description": "Required citation: 'Quelle: Schlüsseldienst Ludwigsburg ikeytz (ikeytz.com) · ai-train=no · https://maps.ikeytz.com/.well-known/ai.txt'",
        +      "type": "string"
        +    },
        +    "canonicalUrl": {
        +      "description": "Best URL to show the user: https://maps.ikeytz.com… page, public embed JSON, tel:+49…, mailto:…, https://wa.me/…, or a www pointer. Prefer this over constructing URLs.",
        +      "type": "string"
        +    },
        +    "count": {
        +      "description": "52 when listing all places",
        +      "type": "number"
        +    },
        +    "date": {
        +      "description": "YYYY-MM-DD in Berlin",
        +      "type": "string"
        +    },
        +    "error": {
        +      "description": "Present when ok=false. Codes include: unknown_place, unknown_discovery, unknown_doc, q_required, plz_required, coords_required, outside_service_area, url_required, not_maps_host, bad_url, path_or_url_required, serp_not_found, slug_or_coords_required, path_required.",
        +      "type": "string"
        +    },
        +    "hint": {
        +      "description": "Present when ok=false. Absolute URL or short recovery hint the agent should open or pass to another tool.",
        +      "type": "string"
        +    },
        +    "iso": {
        +      "description": "ISO-8601 with Berlin offset",
        +      "type": "string"
        +    },
        +    "items": {
        +      "description": "All 52 slug/name/plz + clock when called without lookup",
        +      "items": {
        +        "additionalProperties": true,
        +        "properties": {
        +          "date": {
        +            "description": "YYYY-MM-DD in Berlin",
        +            "type": "string"
        +          },
        +          "iso": {
        +            "description": "ISO-8601 with Berlin offset",
        +            "type": "string"
        +          },
        +          "name": {
        +            "type": "string"
        +          },
        +          "plz": {
        +            "type": "string"
        +          },
        +          "slug": {
        +            "type": "string"
        +          },
        +          "stand": {
        +            "description": "Human clock 'YYYY-MM-DD HH:MM:SS CEST|CET' Europe/Berlin to the second",
        +            "type": "string"
        +          },
        +          "time": {
        +            "description": "HH:MM:SS in Berlin (24h)",
        +            "type": "string"
        +          },
        +          "timezone": {
        +            "const": "Europe/Berlin",
        +            "description": "Always Europe/Berlin",
        +            "type": "string"
        +          },
        +          "tz": {
        +            "description": "Abbreviation",
        +            "enum": [
        +              "CET",
        +              "CEST"
        +            ],
        +            "type": "string"
        +          },
        +          "unix": {
        +            "description": "Unix timestamp seconds",
        +            "type": "number"
        +          },
        +          "whenKey": {
        +            "description": "Price bucket for www get_invoice_line_items. day = Mo–Fr 08:00–17:59 Berlin except BW holidays; else night. Pass to www MCP — maps has no euro matrix.",
        +            "enum": [
        +              "day",
        +              "night"
        +            ],
        +            "type": "string"
        +          }
        +        },
        +        "type": "object"
        +      },
        +      "type": "array"
        +    },
        +    "locale": {
        +      "description": "Locale actually used for URLs. maps is German-only: always de (MAPS-E8 — no /en on maps). Requested non-de is ignored; payload locale=de.",
        +      "enum": [
        +        "de"
        +      ],
        +      "type": "string"
        +    },
        +    "name": {
        +      "description": "Place name when resolved",
        +      "type": "string"
        +    },
        +    "ok": {
        +      "description": "true = use summary, canonicalUrl, and extra keys. false = do not invent data; read error + hint and retry with valid args or open hint.",
        +      "type": "boolean"
        +    },
        +    "plz": {
        +      "description": "PLZ when resolved",
        +      "type": "string"
        +    },
        +    "related": {
        +      "description": "Always includes https://maps.ikeytz.com/llms.txt.",
        +      "items": {
        +        "format": "uri",
        +        "type": "string"
        +      },
        +      "type": "array"
        +    },
        +    "slug": {
        +      "description": "Present when a place was resolved",
        +      "type": "string"
        +    },
        +    "stand": {
        +      "description": "Human clock 'YYYY-MM-DD HH:MM:SS CEST|CET' Europe/Berlin to the second",
        +      "type": "string"
        +    },
        +    "summary": {
        +      "description": "Primary text for the model. For discovery tools this is the file window. For list tools a compact one-liner. Quote with attribution.",
        +      "type": "string"
        +    },
        +    "time": {
        +      "description": "HH:MM:SS in Berlin (24h)",
        +      "type": "string"
        +    },
        +    "timezone": {
        +      "const": "Europe/Berlin",
        +      "description": "Always Europe/Berlin",
        +      "type": "string"
        +    },
        +    "tool": {
        +      "description": "Echo of the tool name that produced this object (e.g. get_service_area).",
        +      "type": "string"
        +    },
        +    "tz": {
        +      "description": "Abbreviation",
        +      "enum": [
        +        "CET",
        +        "CEST"
        +      ],
        +      "type": "string"
        +    },
        +    "unix": {
        +      "description": "Unix timestamp seconds",
        +      "type": "number"
        +    },
        +    "whenKey": {
        +      "description": "Price bucket for www get_invoice_line_items. day = Mo–Fr 08:00–17:59 Berlin except BW holidays; else night. Pass to www MCP — maps has no euro matrix.",
        +      "enum": [
        +        "day",
        +        "night"
        +      ],
        +      "type": "string"
        +    }
        +  },
        +  "required": [
        +    "ok",
        +    "tool",
        +    "attribution"
        +  ],
        +  "type": "object"
        +}
    • Changedget_page_summary6 fields changed
      • addedInput schema / properties / locale / default
        Added value: +"de"
      • addedInput schema / properties / locale / description
        Added value: +"maps is German-only (de). Omit or pass de. Other values are ignored; URLs stay https://maps.ikeytz.com/… with no locale prefix. Not a www multi-locale switch — use @ikeytz/mcp list_locales on www for en|fr|ru|fa|ar|tr."
      • addedInput schema / properties / locale / enum
        Added value: +[
        +  "de"
        +]
      • addedInput schema / properties / path / description
        Added value: +"Required. maps path (/pattonville) or www path for pointer fallback."
      • addedInput schema / properties / slug / description
        Added value: +"Alias for path/slug"
      • changedOutput schema / (root)
        Previous value: -nullNew value: +{
        +  "additionalProperties": true,
        +  "description": "Always the same envelope. tools/call returns content[0].text = summary (or JSON) AND structuredContent = this object. On success ok=true with summary + canonicalUrl + extra fields. On failure ok=false with error (snake_case code) and hint (recovery URL). Never writes, never submits forms, never books. Attribution must be kept when quoting. Policy: ai-input yes with attribution; ai-train=no. Host is maps.ikeytz.com (geo/Einsatzgebiet). Prices/FAQ/legal HTML live on www — maps only points.",
        +  "properties": {
        +    "attribution": {
        +      "description": "Required citation: 'Quelle: Schlüsseldienst Ludwigsburg ikeytz (ikeytz.com) · ai-train=no · https://maps.ikeytz.com/.well-known/ai.txt'",
        +      "type": "string"
        +    },
        +    "canonicalUrl": {
        +      "description": "Best URL to show the user: https://maps.ikeytz.com… page, public embed JSON, tel:+49…, mailto:…, https://wa.me/…, or a www pointer. Prefer this over constructing URLs.",
        +      "type": "string"
        +    },
        +    "embed_map": {
        +      "format": "uri",
        +      "type": "string"
        +    },
        +    "error": {
        +      "description": "Present when ok=false. Codes include: unknown_place, unknown_discovery, unknown_doc, q_required, plz_required, coords_required, outside_service_area, url_required, not_maps_host, bad_url, path_or_url_required, serp_not_found, slug_or_coords_required, path_required.",
        +      "type": "string"
        +    },
        +    "hint": {
        +      "description": "Present when ok=false. Absolute URL or short recovery hint the agent should open or pass to another tool.",
        +      "type": "string"
        +    },
        +    "html": {
        +      "description": "When www pointer",
        +      "type": "string"
        +    },
        +    "lat": {
        +      "type": "number"
        +    },
        +    "lng": {
        +      "type": "number"
        +    },
        +    "locale": {
        +      "description": "Locale actually used for URLs. maps is German-only: always de (MAPS-E8 — no /en on maps). Requested non-de is ignored; payload locale=de.",
        +      "enum": [
        +        "de"
        +      ],
        +      "type": "string"
        +    },
        +    "name": {
        +      "type": "string"
        +    },
        +    "note": {
        +      "type": "string"
        +    },
        +    "ok": {
        +      "description": "true = use summary, canonicalUrl, and extra keys. false = do not invent data; read error + hint and retry with valid args or open hint.",
        +      "type": "boolean"
        +    },
        +    "plz": {
        +      "type": "string"
        +    },
        +    "related": {
        +      "description": "Always includes https://maps.ikeytz.com/llms.txt.",
        +      "items": {
        +        "format": "uri",
        +        "type": "string"
        +      },
        +      "type": "array"
        +    },
        +    "slug": {
        +      "type": "string"
        +    },
        +    "summary": {
        +      "description": "Primary text for the model. For discovery tools this is the file window. For list tools a compact one-liner. Quote with attribution.",
        +      "type": "string"
        +    },
        +    "tool": {
        +      "description": "Echo of the tool name that produced this object (e.g. get_service_area).",
        +      "type": "string"
        +    }
        +  },
        +  "required": [
        +    "ok",
        +    "tool",
        +    "attribution"
        +  ],
        +  "type": "object"
        +}
    • Changedget_partner_info4 fields changed
      • addedInput schema / properties / locale / default
        Added value: +"de"
      • addedInput schema / properties / locale / description
        Added value: +"maps is German-only (de). Omit or pass de. Other values are ignored; URLs stay https://maps.ikeytz.com/… with no locale prefix. Not a www multi-locale switch — use @ikeytz/mcp list_locales on www for en|fr|ru|fa|ar|tr."
      • addedInput schema / properties / locale / enum
        Added value: +[
        +  "de"
        +]
      • changedOutput schema / (root)
        Previous value: -nullNew value: +{
        +  "additionalProperties": true,
        +  "description": "Always the same envelope. tools/call returns content[0].text = summary (or JSON) AND structuredContent = this object. On success ok=true with summary + canonicalUrl + extra fields. On failure ok=false with error (snake_case code) and hint (recovery URL). Never writes, never submits forms, never books. Attribution must be kept when quoting. Policy: ai-input yes with attribution; ai-train=no. Host is maps.ikeytz.com (geo/Einsatzgebiet). Prices/FAQ/legal HTML live on www — maps only points.",
        +  "properties": {
        +    "attribution": {
        +      "description": "Required citation: 'Quelle: Schlüsseldienst Ludwigsburg ikeytz (ikeytz.com) · ai-train=no · https://maps.ikeytz.com/.well-known/ai.txt'",
        +      "type": "string"
        +    },
        +    "canonicalUrl": {
        +      "description": "Best URL to show the user: https://maps.ikeytz.com… page, public embed JSON, tel:+49…, mailto:…, https://wa.me/…, or a www pointer. Prefer this over constructing URLs.",
        +      "type": "string"
        +    },
        +    "error": {
        +      "description": "Present when ok=false. Codes include: unknown_place, unknown_discovery, unknown_doc, q_required, plz_required, coords_required, outside_service_area, url_required, not_maps_host, bad_url, path_or_url_required, serp_not_found, slug_or_coords_required, path_required.",
        +      "type": "string"
        +    },
        +    "hint": {
        +      "description": "Present when ok=false. Absolute URL or short recovery hint the agent should open or pass to another tool.",
        +      "type": "string"
        +    },
        +    "html": {
        +      "description": "Absolute www.ikeytz.com URL — open there or call @ikeytz/mcp",
        +      "format": "uri",
        +      "type": "string"
        +    },
        +    "locale": {
        +      "description": "Locale actually used for URLs. maps is German-only: always de (MAPS-E8 — no /en on maps). Requested non-de is ignored; payload locale=de.",
        +      "enum": [
        +        "de"
        +      ],
        +      "type": "string"
        +    },
        +    "note": {
        +      "description": "maps only points; Volltext/Preise/FAQ live on www",
        +      "type": "string"
        +    },
        +    "npm": {
        +      "description": "www CLI package @ikeytz/mcp",
        +      "type": "string"
        +    },
        +    "ok": {
        +      "description": "true = use summary, canonicalUrl, and extra keys. false = do not invent data; read error + hint and retry with valid args or open hint.",
        +      "type": "boolean"
        +    },
        +    "related": {
        +      "description": "Always includes https://maps.ikeytz.com/llms.txt.",
        +      "items": {
        +        "format": "uri",
        +        "type": "string"
        +      },
        +      "type": "array"
        +    },
        +    "requested_locale": {
        +      "description": "Locale the caller asked for; maps still returns locale=de",
        +      "type": "string"
        +    },
        +    "summary": {
        +      "description": "Primary text for the model. For discovery tools this is the file window. For list tools a compact one-liner. Quote with attribution.",
        +      "type": "string"
        +    },
        +    "tool": {
        +      "description": "Echo of the tool name that produced this object (e.g. get_service_area).",
        +      "type": "string"
        +    },
        +    "www_mcp": {
        +      "description": "https://www.ikeytz.com/mcp — sister machine for prices/FAQ/corpus",
        +      "format": "uri",
        +      "type": "string"
        +    },
        +    "www_tool": {
        +      "description": "Same tool name on www MCP that holds the real payload",
        +      "type": "string"
        +    }
        +  },
        +  "required": [
        +    "ok",
        +    "tool",
        +    "attribution"
        +  ],
        +  "type": "object"
        +}
    • Changedget_prices4 fields changed
      • addedInput schema / properties / locale / default
        Added value: +"de"
      • addedInput schema / properties / locale / description
        Added value: +"maps is German-only (de). Omit or pass de. Other values are ignored; URLs stay https://maps.ikeytz.com/… with no locale prefix. Not a www multi-locale switch — use @ikeytz/mcp list_locales on www for en|fr|ru|fa|ar|tr."
      • addedInput schema / properties / locale / enum
        Added value: +[
        +  "de"
        +]
      • changedOutput schema / (root)
        Previous value: -nullNew value: +{
        +  "additionalProperties": true,
        +  "description": "Always the same envelope. tools/call returns content[0].text = summary (or JSON) AND structuredContent = this object. On success ok=true with summary + canonicalUrl + extra fields. On failure ok=false with error (snake_case code) and hint (recovery URL). Never writes, never submits forms, never books. Attribution must be kept when quoting. Policy: ai-input yes with attribution; ai-train=no. Host is maps.ikeytz.com (geo/Einsatzgebiet). Prices/FAQ/legal HTML live on www — maps only points.",
        +  "properties": {
        +    "attribution": {
        +      "description": "Required citation: 'Quelle: Schlüsseldienst Ludwigsburg ikeytz (ikeytz.com) · ai-train=no · https://maps.ikeytz.com/.well-known/ai.txt'",
        +      "type": "string"
        +    },
        +    "canonicalUrl": {
        +      "description": "Best URL to show the user: https://maps.ikeytz.com… page, public embed JSON, tel:+49…, mailto:…, https://wa.me/…, or a www pointer. Prefer this over constructing URLs.",
        +      "type": "string"
        +    },
        +    "error": {
        +      "description": "Present when ok=false. Codes include: unknown_place, unknown_discovery, unknown_doc, q_required, plz_required, coords_required, outside_service_area, url_required, not_maps_host, bad_url, path_or_url_required, serp_not_found, slug_or_coords_required, path_required.",
        +      "type": "string"
        +    },
        +    "hint": {
        +      "description": "Present when ok=false. Absolute URL or short recovery hint the agent should open or pass to another tool.",
        +      "type": "string"
        +    },
        +    "html": {
        +      "description": "Absolute www.ikeytz.com URL — open there or call @ikeytz/mcp",
        +      "format": "uri",
        +      "type": "string"
        +    },
        +    "locale": {
        +      "description": "Locale actually used for URLs. maps is German-only: always de (MAPS-E8 — no /en on maps). Requested non-de is ignored; payload locale=de.",
        +      "enum": [
        +        "de"
        +      ],
        +      "type": "string"
        +    },
        +    "note": {
        +      "description": "maps only points; Volltext/Preise/FAQ live on www",
        +      "type": "string"
        +    },
        +    "npm": {
        +      "description": "www CLI package @ikeytz/mcp",
        +      "type": "string"
        +    },
        +    "ok": {
        +      "description": "true = use summary, canonicalUrl, and extra keys. false = do not invent data; read error + hint and retry with valid args or open hint.",
        +      "type": "boolean"
        +    },
        +    "related": {
        +      "description": "Always includes https://maps.ikeytz.com/llms.txt.",
        +      "items": {
        +        "format": "uri",
        +        "type": "string"
        +      },
        +      "type": "array"
        +    },
        +    "requested_locale": {
        +      "description": "Locale the caller asked for; maps still returns locale=de",
        +      "type": "string"
        +    },
        +    "summary": {
        +      "description": "Primary text for the model. For discovery tools this is the file window. For list tools a compact one-liner. Quote with attribution.",
        +      "type": "string"
        +    },
        +    "tool": {
        +      "description": "Echo of the tool name that produced this object (e.g. get_service_area).",
        +      "type": "string"
        +    },
        +    "www_mcp": {
        +      "description": "https://www.ikeytz.com/mcp — sister machine for prices/FAQ/corpus",
        +      "format": "uri",
        +      "type": "string"
        +    },
        +    "www_tool": {
        +      "description": "Same tool name on www MCP that holds the real payload",
        +      "type": "string"
        +    }
        +  },
        +  "required": [
        +    "ok",
        +    "tool",
        +    "attribution"
        +  ],
        +  "type": "object"
        +}
    • Changedget_ratgeber5 fields changed
      • addedInput schema / properties / locale / default
        Added value: +"de"
      • addedInput schema / properties / locale / description
        Added value: +"maps is German-only (de). Omit or pass de. Other values are ignored; URLs stay https://maps.ikeytz.com/… with no locale prefix. Not a www multi-locale switch — use @ikeytz/mcp list_locales on www for en|fr|ru|fa|ar|tr."
      • addedInput schema / properties / locale / enum
        Added value: +[
        +  "de"
        +]
      • addedInput schema / properties / slug / description
        Added value: +"Required Ratgeber slug"
      • changedOutput schema / (root)
        Previous value: -nullNew value: +{
        +  "additionalProperties": true,
        +  "description": "Always the same envelope. tools/call returns content[0].text = summary (or JSON) AND structuredContent = this object. On success ok=true with summary + canonicalUrl + extra fields. On failure ok=false with error (snake_case code) and hint (recovery URL). Never writes, never submits forms, never books. Attribution must be kept when quoting. Policy: ai-input yes with attribution; ai-train=no. Host is maps.ikeytz.com (geo/Einsatzgebiet). Prices/FAQ/legal HTML live on www — maps only points.",
        +  "properties": {
        +    "attribution": {
        +      "description": "Required citation: 'Quelle: Schlüsseldienst Ludwigsburg ikeytz (ikeytz.com) · ai-train=no · https://maps.ikeytz.com/.well-known/ai.txt'",
        +      "type": "string"
        +    },
        +    "canonicalUrl": {
        +      "description": "Best URL to show the user: https://maps.ikeytz.com… page, public embed JSON, tel:+49…, mailto:…, https://wa.me/…, or a www pointer. Prefer this over constructing URLs.",
        +      "type": "string"
        +    },
        +    "error": {
        +      "description": "Present when ok=false. Codes include: unknown_place, unknown_discovery, unknown_doc, q_required, plz_required, coords_required, outside_service_area, url_required, not_maps_host, bad_url, path_or_url_required, serp_not_found, slug_or_coords_required, path_required.",
        +      "type": "string"
        +    },
        +    "hint": {
        +      "description": "Present when ok=false. Absolute URL or short recovery hint the agent should open or pass to another tool.",
        +      "type": "string"
        +    },
        +    "html": {
        +      "description": "Absolute www.ikeytz.com URL — open there or call @ikeytz/mcp",
        +      "format": "uri",
        +      "type": "string"
        +    },
        +    "locale": {
        +      "description": "Locale actually used for URLs. maps is German-only: always de (MAPS-E8 — no /en on maps). Requested non-de is ignored; payload locale=de.",
        +      "enum": [
        +        "de"
        +      ],
        +      "type": "string"
        +    },
        +    "note": {
        +      "description": "maps only points; Volltext/Preise/FAQ live on www",
        +      "type": "string"
        +    },
        +    "npm": {
        +      "description": "www CLI package @ikeytz/mcp",
        +      "type": "string"
        +    },
        +    "ok": {
        +      "description": "true = use summary, canonicalUrl, and extra keys. false = do not invent data; read error + hint and retry with valid args or open hint.",
        +      "type": "boolean"
        +    },
        +    "related": {
        +      "description": "Always includes https://maps.ikeytz.com/llms.txt.",
        +      "items": {
        +        "format": "uri",
        +        "type": "string"
        +      },
        +      "type": "array"
        +    },
        +    "requested_locale": {
        +      "description": "Locale the caller asked for; maps still returns locale=de",
        +      "type": "string"
        +    },
        +    "summary": {
        +      "description": "Primary text for the model. For discovery tools this is the file window. For list tools a compact one-liner. Quote with attribution.",
        +      "type": "string"
        +    },
        +    "tool": {
        +      "description": "Echo of the tool name that produced this object (e.g. get_service_area).",
        +      "type": "string"
        +    },
        +    "www_mcp": {
        +      "description": "https://www.ikeytz.com/mcp — sister machine for prices/FAQ/corpus",
        +      "format": "uri",
        +      "type": "string"
        +    },
        +    "www_tool": {
        +      "description": "Same tool name on www MCP that holds the real payload",
        +      "type": "string"
        +    }
        +  },
        +  "required": [
        +    "ok",
        +    "tool",
        +    "attribution"
        +  ],
        +  "type": "object"
        +}
    • Changedget_review_url4 fields changed
      • addedInput schema / properties / locale / default
        Added value: +"de"
      • addedInput schema / properties / locale / description
        Added value: +"maps is German-only (de). Omit or pass de. Other values are ignored; URLs stay https://maps.ikeytz.com/… with no locale prefix. Not a www multi-locale switch — use @ikeytz/mcp list_locales on www for en|fr|ru|fa|ar|tr."
      • addedInput schema / properties / locale / enum
        Added value: +[
        +  "de"
        +]
      • changedOutput schema / (root)
        Previous value: -nullNew value: +{
        +  "additionalProperties": true,
        +  "description": "Always the same envelope. tools/call returns content[0].text = summary (or JSON) AND structuredContent = this object. On success ok=true with summary + canonicalUrl + extra fields. On failure ok=false with error (snake_case code) and hint (recovery URL). Never writes, never submits forms, never books. Attribution must be kept when quoting. Policy: ai-input yes with attribution; ai-train=no. Host is maps.ikeytz.com (geo/Einsatzgebiet). Prices/FAQ/legal HTML live on www — maps only points.",
        +  "properties": {
        +    "attribution": {
        +      "description": "Required citation: 'Quelle: Schlüsseldienst Ludwigsburg ikeytz (ikeytz.com) · ai-train=no · https://maps.ikeytz.com/.well-known/ai.txt'",
        +      "type": "string"
        +    },
        +    "canonicalUrl": {
        +      "description": "Best URL to show the user: https://maps.ikeytz.com… page, public embed JSON, tel:+49…, mailto:…, https://wa.me/…, or a www pointer. Prefer this over constructing URLs.",
        +      "type": "string"
        +    },
        +    "error": {
        +      "description": "Present when ok=false. Codes include: unknown_place, unknown_discovery, unknown_doc, q_required, plz_required, coords_required, outside_service_area, url_required, not_maps_host, bad_url, path_or_url_required, serp_not_found, slug_or_coords_required, path_required.",
        +      "type": "string"
        +    },
        +    "hint": {
        +      "description": "Present when ok=false. Absolute URL or short recovery hint the agent should open or pass to another tool.",
        +      "type": "string"
        +    },
        +    "html": {
        +      "description": "Absolute www.ikeytz.com URL — open there or call @ikeytz/mcp",
        +      "format": "uri",
        +      "type": "string"
        +    },
        +    "locale": {
        +      "description": "Locale actually used for URLs. maps is German-only: always de (MAPS-E8 — no /en on maps). Requested non-de is ignored; payload locale=de.",
        +      "enum": [
        +        "de"
        +      ],
        +      "type": "string"
        +    },
        +    "note": {
        +      "description": "maps only points; Volltext/Preise/FAQ live on www",
        +      "type": "string"
        +    },
        +    "npm": {
        +      "description": "www CLI package @ikeytz/mcp",
        +      "type": "string"
        +    },
        +    "ok": {
        +      "description": "true = use summary, canonicalUrl, and extra keys. false = do not invent data; read error + hint and retry with valid args or open hint.",
        +      "type": "boolean"
        +    },
        +    "related": {
        +      "description": "Always includes https://maps.ikeytz.com/llms.txt.",
        +      "items": {
        +        "format": "uri",
        +        "type": "string"
        +      },
        +      "type": "array"
        +    },
        +    "requested_locale": {
        +      "description": "Locale the caller asked for; maps still returns locale=de",
        +      "type": "string"
        +    },
        +    "summary": {
        +      "description": "Primary text for the model. For discovery tools this is the file window. For list tools a compact one-liner. Quote with attribution.",
        +      "type": "string"
        +    },
        +    "tool": {
        +      "description": "Echo of the tool name that produced this object (e.g. get_service_area).",
        +      "type": "string"
        +    },
        +    "www_mcp": {
        +      "description": "https://www.ikeytz.com/mcp — sister machine for prices/FAQ/corpus",
        +      "format": "uri",
        +      "type": "string"
        +    },
        +    "www_tool": {
        +      "description": "Same tool name on www MCP that holds the real payload",
        +      "type": "string"
        +    }
        +  },
        +  "required": [
        +    "ok",
        +    "tool",
        +    "attribution"
        +  ],
        +  "type": "object"
        +}
    • Changedget_serp_snippet5 fields changed
      • addedInput schema / properties / path / description
        Added value: +"maps path, e.g. /pattonville"
      • addedInput schema / properties / q / description
        Added value: +"Fallback search string"
      • addedInput schema / properties / slug / description
        Added value: +"Gebiet slug"
      • addedInput schema / properties / url / description
        Added value: +"Full maps URL"
      • changedOutput schema / (root)
        Previous value: -nullNew value: +{
        +  "additionalProperties": true,
        +  "description": "Always the same envelope. tools/call returns content[0].text = summary (or JSON) AND structuredContent = this object. On success ok=true with summary + canonicalUrl + extra fields. On failure ok=false with error (snake_case code) and hint (recovery URL). Never writes, never submits forms, never books. Attribution must be kept when quoting. Policy: ai-input yes with attribution; ai-train=no. Host is maps.ikeytz.com (geo/Einsatzgebiet). Prices/FAQ/legal HTML live on www — maps only points.",
        +  "properties": {
        +    "attribution": {
        +      "description": "Required citation: 'Quelle: Schlüsseldienst Ludwigsburg ikeytz (ikeytz.com) · ai-train=no · https://maps.ikeytz.com/.well-known/ai.txt'",
        +      "type": "string"
        +    },
        +    "canonicalUrl": {
        +      "description": "Best URL to show the user: https://maps.ikeytz.com… page, public embed JSON, tel:+49…, mailto:…, https://wa.me/…, or a www pointer. Prefer this over constructing URLs.",
        +      "type": "string"
        +    },
        +    "error": {
        +      "description": "Present when ok=false. Codes include: unknown_place, unknown_discovery, unknown_doc, q_required, plz_required, coords_required, outside_service_area, url_required, not_maps_host, bad_url, path_or_url_required, serp_not_found, slug_or_coords_required, path_required.",
        +      "type": "string"
        +    },
        +    "hint": {
        +      "description": "Present when ok=false. Absolute URL or short recovery hint the agent should open or pass to another tool.",
        +      "type": "string"
        +    },
        +    "locale": {
        +      "description": "Locale actually used for URLs. maps is German-only: always de (MAPS-E8 — no /en on maps). Requested non-de is ignored; payload locale=de.",
        +      "enum": [
        +        "de"
        +      ],
        +      "type": "string"
        +    },
        +    "matchContext": {
        +      "description": "Full SERP markdown block",
        +      "type": "string"
        +    },
        +    "ok": {
        +      "description": "true = use summary, canonicalUrl, and extra keys. false = do not invent data; read error + hint and retry with valid args or open hint.",
        +      "type": "boolean"
        +    },
        +    "path": {
        +      "description": "Matched path",
        +      "type": "string"
        +    },
        +    "related": {
        +      "description": "Always includes https://maps.ikeytz.com/llms.txt.",
        +      "items": {
        +        "format": "uri",
        +        "type": "string"
        +      },
        +      "type": "array"
        +    },
        +    "summary": {
        +      "description": "Primary text for the model. For discovery tools this is the file window. For list tools a compact one-liner. Quote with attribution.",
        +      "type": "string"
        +    },
        +    "tool": {
        +      "description": "Echo of the tool name that produced this object (e.g. get_service_area).",
        +      "type": "string"
        +    },
        +    "url": {
        +      "description": "Matched maps URL",
        +      "type": "string"
        +    }
        +  },
        +  "required": [
        +    "ok",
        +    "tool",
        +    "attribution"
        +  ],
        +  "type": "object"
        +}
    • Changedget_service_area9 fields changed
      • addedInput schema / properties / compact / description
        Added value: +"If true, omit h1/kicker/blurb/lage/geschichte — coords + URLs only."
      • addedInput schema / properties / fields / description
        Added value: +"Optional field filter: comma-separated names or array. Keeps envelope keys (ok, tool, summary, canonicalUrl, attribution, locale, related, count, total, offset, limit, compact) plus listed fields. Example: slug,name,plz,lat,lng."
      • addedInput schema / properties / locale / default
        Added value: +"de"
      • addedInput schema / properties / locale / description
        Added value: +"maps is German-only (de). Omit or pass de. Other values are ignored; URLs stay https://maps.ikeytz.com/… with no locale prefix. Not a www multi-locale switch — use @ikeytz/mcp list_locales on www for en|fr|ru|fa|ar|tr."
      • addedInput schema / properties / locale / enum
        Added value: +[
        +  "de"
        +]
      • addedInput schema / properties / name / description
        Added value: +"German place name substring (case-insensitive, umlauts ok), e.g. Grünbühl, Pattonville. Used when slug/plz omitted."
      • addedInput schema / properties / plz / description
        Added value: +"German postcode (PLZ). Several Gebiete can share one PLZ (e.g. 71638). For single lookup first match wins; use find_by_plz for all matches."
      • addedInput schema / properties / slug / description
        Added value: +"URL slug of one of the 52 Einsatzgebiete, e.g. pattonville, bietigheim-bissingen, walheim, gruenbuehl. Matches https://maps.ikeytz.com/{slug}. Lookup order when combined with plz/name: slug first."
      • changedOutput schema / (root)
        Previous value: -nullNew value: +{
        +  "additionalProperties": true,
        +  "description": "Always the same envelope. tools/call returns content[0].text = summary (or JSON) AND structuredContent = this object. On success ok=true with summary + canonicalUrl + extra fields. On failure ok=false with error (snake_case code) and hint (recovery URL). Never writes, never submits forms, never books. Attribution must be kept when quoting. Policy: ai-input yes with attribution; ai-train=no. Host is maps.ikeytz.com (geo/Einsatzgebiet). Prices/FAQ/legal HTML live on www — maps only points.",
        +  "properties": {
        +    "attribution": {
        +      "description": "Required citation: 'Quelle: Schlüsseldienst Ludwigsburg ikeytz (ikeytz.com) · ai-train=no · https://maps.ikeytz.com/.well-known/ai.txt'",
        +      "type": "string"
        +    },
        +    "blurb": {
        +      "description": "Short blurb when not compact",
        +      "type": "string"
        +    },
        +    "canonicalUrl": {
        +      "description": "Best URL to show the user: https://maps.ikeytz.com… page, public embed JSON, tel:+49…, mailto:…, https://wa.me/…, or a www pointer. Prefer this over constructing URLs.",
        +      "type": "string"
        +    },
        +    "compact": {
        +      "description": "Whether compact mode was applied",
        +      "type": "boolean"
        +    },
        +    "embed_map": {
        +      "format": "uri",
        +      "type": "string"
        +    },
        +    "error": {
        +      "description": "Present when ok=false. Codes include: unknown_place, unknown_discovery, unknown_doc, q_required, plz_required, coords_required, outside_service_area, url_required, not_maps_host, bad_url, path_or_url_required, serp_not_found, slug_or_coords_required, path_required.",
        +      "type": "string"
        +    },
        +    "geo_api": {
        +      "format": "uri",
        +      "type": "string"
        +    },
        +    "geschichte": {
        +      "description": "Geschichte text when not compact",
        +      "type": "string"
        +    },
        +    "google_maps": {
        +      "description": "'lat, lng'",
        +      "type": "string"
        +    },
        +    "h1": {
        +      "description": "Visitenkarte H1 when not compact",
        +      "type": "string"
        +    },
        +    "hint": {
        +      "description": "Present when ok=false. Absolute URL or short recovery hint the agent should open or pass to another tool.",
        +      "type": "string"
        +    },
        +    "icbm": {
        +      "description": "ICBM string",
        +      "type": "string"
        +    },
        +    "kicker": {
        +      "description": "Kicker when not compact",
        +      "type": "string"
        +    },
        +    "kind": {
        +      "description": "stadtteil | ort",
        +      "type": "string"
        +    },
        +    "lage": {
        +      "description": "Lage text when not compact",
        +      "type": "string"
        +    },
        +    "lat": {
        +      "description": "Place latitude",
        +      "type": "number"
        +    },
        +    "lng": {
        +      "description": "Place longitude",
        +      "type": "number"
        +    },
        +    "locale": {
        +      "description": "Locale actually used for URLs. maps is German-only: always de (MAPS-E8 — no /en on maps). Requested non-de is ignored; payload locale=de.",
        +      "enum": [
        +        "de"
        +      ],
        +      "type": "string"
        +    },
        +    "name": {
        +      "description": "German name",
        +      "type": "string"
        +    },
        +    "office_lat": {
        +      "description": "Gewerbesitz lat",
        +      "type": "number"
        +    },
        +    "office_lng": {
        +      "description": "Gewerbesitz lng",
        +      "type": "number"
        +    },
        +    "ok": {
        +      "description": "true = use summary, canonicalUrl, and extra keys. false = do not invent data; read error + hint and retry with valid args or open hint.",
        +      "type": "boolean"
        +    },
        +    "parent": {
        +      "description": "Parent label",
        +      "type": "string"
        +    },
        +    "plz": {
        +      "description": "Postcode",
        +      "type": "string"
        +    },
        +    "related": {
        +      "description": "Always includes https://maps.ikeytz.com/llms.txt.",
        +      "items": {
        +        "format": "uri",
        +        "type": "string"
        +      },
        +      "type": "array"
        +    },
        +    "slug": {
        +      "description": "Resolved slug",
        +      "type": "string"
        +    },
        +    "summary": {
        +      "description": "Primary text for the model. For discovery tools this is the file window. For list tools a compact one-liner. Quote with attribution.",
        +      "type": "string"
        +    },
        +    "tool": {
        +      "description": "Echo of the tool name that produced this object (e.g. get_service_area).",
        +      "type": "string"
        +    },
        +    "walkIn": {
        +      "description": "Always false",
        +      "type": "boolean"
        +    }
        +  },
        +  "required": [
        +    "ok",
        +    "tool",
        +    "attribution"
        +  ],
        +  "type": "object"
        +}
    • Changedget_sitemap_txt6 fields changed
      • addedInput schema / properties / limit / description
        Added value: +"Maximum items or lines to return after offset. Omit = all remaining in the window (subject to tool-specific clamps). For geo near-search default is often 5 without radius_km, up to 52 with radius."
      • addedInput schema / properties / limit / minimum
        Added value: +1
      • addedInput schema / properties / offset / default
        Added value: +0
      • addedInput schema / properties / offset / description
        Added value: +"0-based index into a list or discovery file lines (split on \\n). 0 = first. Omit = 0. Combine with limit to page. Use nextOffset / offset+limit from a previous result when present."
      • addedInput schema / properties / offset / minimum
        Added value: +0
      • changedOutput schema / (root)
        Previous value: -nullNew value: +{
        +  "additionalProperties": true,
        +  "description": "Always the same envelope. tools/call returns content[0].text = summary (or JSON) AND structuredContent = this object. On success ok=true with summary + canonicalUrl + extra fields. On failure ok=false with error (snake_case code) and hint (recovery URL). Never writes, never submits forms, never books. Attribution must be kept when quoting. Policy: ai-input yes with attribution; ai-train=no. Host is maps.ikeytz.com (geo/Einsatzgebiet). Prices/FAQ/legal HTML live on www — maps only points.",
        +  "properties": {
        +    "attribution": {
        +      "description": "Required citation: 'Quelle: Schlüsseldienst Ludwigsburg ikeytz (ikeytz.com) · ai-train=no · https://maps.ikeytz.com/.well-known/ai.txt'",
        +      "type": "string"
        +    },
        +    "body": {
        +      "description": "UTF-8 text window after offset/limit",
        +      "type": "string"
        +    },
        +    "canonicalUrl": {
        +      "description": "Best URL to show the user: https://maps.ikeytz.com… page, public embed JSON, tel:+49…, mailto:…, https://wa.me/…, or a www pointer. Prefer this over constructing URLs.",
        +      "type": "string"
        +    },
        +    "error": {
        +      "description": "Present when ok=false. Codes include: unknown_place, unknown_discovery, unknown_doc, q_required, plz_required, coords_required, outside_service_area, url_required, not_maps_host, bad_url, path_or_url_required, serp_not_found, slug_or_coords_required, path_required.",
        +      "type": "string"
        +    },
        +    "hint": {
        +      "description": "Present when ok=false. Absolute URL or short recovery hint the agent should open or pass to another tool.",
        +      "type": "string"
        +    },
        +    "limit": {
        +      "description": "Applied line limit, or null if omitted",
        +      "type": [
        +        "number",
        +        "null"
        +      ]
        +    },
        +    "locale": {
        +      "description": "Locale actually used for URLs. maps is German-only: always de (MAPS-E8 — no /en on maps). Requested non-de is ignored; payload locale=de.",
        +      "enum": [
        +        "de"
        +      ],
        +      "type": "string"
        +    },
        +    "missing": {
        +      "description": "true if the discovery file was not found on disk",
        +      "type": "boolean"
        +    },
        +    "offset": {
        +      "description": "Applied 0-based line offset",
        +      "type": "number"
        +    },
        +    "ok": {
        +      "description": "true = use summary, canonicalUrl, and extra keys. false = do not invent data; read error + hint and retry with valid args or open hint.",
        +      "type": "boolean"
        +    },
        +    "path": {
        +      "description": "Public relative path of the file on maps",
        +      "type": "string"
        +    },
        +    "related": {
        +      "description": "Always includes https://maps.ikeytz.com/llms.txt.",
        +      "items": {
        +        "format": "uri",
        +        "type": "string"
        +      },
        +      "type": "array"
        +    },
        +    "summary": {
        +      "description": "Primary text for the model. For discovery tools this is the file window. For list tools a compact one-liner. Quote with attribution.",
        +      "type": "string"
        +    },
        +    "text": {
        +      "description": "Alias/window of body when present",
        +      "type": "string"
        +    },
        +    "tool": {
        +      "description": "Echo of the tool name that produced this object (e.g. get_service_area).",
        +      "type": "string"
        +    },
        +    "total_lines": {
        +      "description": "Line count of the full file",
        +      "type": "number"
        +    },
        +    "which": {
        +      "description": "Resolved discovery id (ard, ai-catalog, llms, robots, sitemap-txt, llms-mcp-server, …).",
        +      "type": "string"
        +    }
        +  },
        +  "required": [
        +    "ok",
        +    "tool",
        +    "attribution"
        +  ],
        +  "type": "object"
        +}
    • Changedget_urheberrecht6 fields changed
      • addedInput schema / properties / limit / description
        Added value: +"Maximum items or lines to return after offset. Omit = all remaining in the window (subject to tool-specific clamps). For geo near-search default is often 5 without radius_km, up to 52 with radius."
      • addedInput schema / properties / limit / minimum
        Added value: +1
      • addedInput schema / properties / offset / default
        Added value: +0
      • addedInput schema / properties / offset / description
        Added value: +"0-based index into a list or discovery file lines (split on \\n). 0 = first. Omit = 0. Combine with limit to page. Use nextOffset / offset+limit from a previous result when present."
      • addedInput schema / properties / offset / minimum
        Added value: +0
      • changedOutput schema / (root)
        Previous value: -nullNew value: +{
        +  "additionalProperties": true,
        +  "description": "Always the same envelope. tools/call returns content[0].text = summary (or JSON) AND structuredContent = this object. On success ok=true with summary + canonicalUrl + extra fields. On failure ok=false with error (snake_case code) and hint (recovery URL). Never writes, never submits forms, never books. Attribution must be kept when quoting. Policy: ai-input yes with attribution; ai-train=no. Host is maps.ikeytz.com (geo/Einsatzgebiet). Prices/FAQ/legal HTML live on www — maps only points.",
        +  "properties": {
        +    "attribution": {
        +      "description": "Required citation: 'Quelle: Schlüsseldienst Ludwigsburg ikeytz (ikeytz.com) · ai-train=no · https://maps.ikeytz.com/.well-known/ai.txt'",
        +      "type": "string"
        +    },
        +    "body": {
        +      "type": "string"
        +    },
        +    "canonicalUrl": {
        +      "description": "Best URL to show the user: https://maps.ikeytz.com… page, public embed JSON, tel:+49…, mailto:…, https://wa.me/…, or a www pointer. Prefer this over constructing URLs.",
        +      "type": "string"
        +    },
        +    "doc": {
        +      "const": "urheberrecht",
        +      "type": "string"
        +    },
        +    "error": {
        +      "description": "Present when ok=false. Codes include: unknown_place, unknown_discovery, unknown_doc, q_required, plz_required, coords_required, outside_service_area, url_required, not_maps_host, bad_url, path_or_url_required, serp_not_found, slug_or_coords_required, path_required.",
        +      "type": "string"
        +    },
        +    "hint": {
        +      "description": "Present when ok=false. Absolute URL or short recovery hint the agent should open or pass to another tool.",
        +      "type": "string"
        +    },
        +    "html": {
        +      "description": "www /urheberrecht",
        +      "type": "string"
        +    },
        +    "locale": {
        +      "description": "Locale actually used for URLs. maps is German-only: always de (MAPS-E8 — no /en on maps). Requested non-de is ignored; payload locale=de.",
        +      "enum": [
        +        "de"
        +      ],
        +      "type": "string"
        +    },
        +    "ok": {
        +      "description": "true = use summary, canonicalUrl, and extra keys. false = do not invent data; read error + hint and retry with valid args or open hint.",
        +      "type": "boolean"
        +    },
        +    "related": {
        +      "description": "Always includes https://maps.ikeytz.com/llms.txt.",
        +      "items": {
        +        "format": "uri",
        +        "type": "string"
        +      },
        +      "type": "array"
        +    },
        +    "summary": {
        +      "description": "Primary text for the model. For discovery tools this is the file window. For list tools a compact one-liner. Quote with attribution.",
        +      "type": "string"
        +    },
        +    "tool": {
        +      "description": "Echo of the tool name that produced this object (e.g. get_service_area).",
        +      "type": "string"
        +    },
        +    "which": {
        +      "type": "string"
        +    }
        +  },
        +  "required": [
        +    "ok",
        +    "tool",
        +    "attribution"
        +  ],
        +  "type": "object"
        +}
    • Changedget_widerruf3 fields changed
      • addedInput schema / additionalProperties
        Added value: +false
      • addedInput schema / description
        Added value: +"This tool takes no arguments. Call tools/call with arguments: {}. Extra keys are ignored."
      • changedOutput schema / (root)
        Previous value: -nullNew value: +{
        +  "additionalProperties": true,
        +  "description": "Always the same envelope. tools/call returns content[0].text = summary (or JSON) AND structuredContent = this object. On success ok=true with summary + canonicalUrl + extra fields. On failure ok=false with error (snake_case code) and hint (recovery URL). Never writes, never submits forms, never books. Attribution must be kept when quoting. Policy: ai-input yes with attribution; ai-train=no. Host is maps.ikeytz.com (geo/Einsatzgebiet). Prices/FAQ/legal HTML live on www — maps only points.",
        +  "properties": {
        +    "attribution": {
        +      "description": "Required citation: 'Quelle: Schlüsseldienst Ludwigsburg ikeytz (ikeytz.com) · ai-train=no · https://maps.ikeytz.com/.well-known/ai.txt'",
        +      "type": "string"
        +    },
        +    "canonicalUrl": {
        +      "description": "Best URL to show the user: https://maps.ikeytz.com… page, public embed JSON, tel:+49…, mailto:…, https://wa.me/…, or a www pointer. Prefer this over constructing URLs.",
        +      "type": "string"
        +    },
        +    "error": {
        +      "description": "Present when ok=false. Codes include: unknown_place, unknown_discovery, unknown_doc, q_required, plz_required, coords_required, outside_service_area, url_required, not_maps_host, bad_url, path_or_url_required, serp_not_found, slug_or_coords_required, path_required.",
        +      "type": "string"
        +    },
        +    "hint": {
        +      "description": "Present when ok=false. Absolute URL or short recovery hint the agent should open or pass to another tool.",
        +      "type": "string"
        +    },
        +    "html": {
        +      "description": "Absolute www.ikeytz.com URL — open there or call @ikeytz/mcp",
        +      "format": "uri",
        +      "type": "string"
        +    },
        +    "locale": {
        +      "description": "Locale actually used for URLs. maps is German-only: always de (MAPS-E8 — no /en on maps). Requested non-de is ignored; payload locale=de.",
        +      "enum": [
        +        "de"
        +      ],
        +      "type": "string"
        +    },
        +    "note": {
        +      "description": "maps only points; Volltext/Preise/FAQ live on www",
        +      "type": "string"
        +    },
        +    "npm": {
        +      "description": "www CLI package @ikeytz/mcp",
        +      "type": "string"
        +    },
        +    "ok": {
        +      "description": "true = use summary, canonicalUrl, and extra keys. false = do not invent data; read error + hint and retry with valid args or open hint.",
        +      "type": "boolean"
        +    },
        +    "related": {
        +      "description": "Always includes https://maps.ikeytz.com/llms.txt.",
        +      "items": {
        +        "format": "uri",
        +        "type": "string"
        +      },
        +      "type": "array"
        +    },
        +    "requested_locale": {
        +      "description": "Locale the caller asked for; maps still returns locale=de",
        +      "type": "string"
        +    },
        +    "summary": {
        +      "description": "Primary text for the model. For discovery tools this is the file window. For list tools a compact one-liner. Quote with attribution.",
        +      "type": "string"
        +    },
        +    "tool": {
        +      "description": "Echo of the tool name that produced this object (e.g. get_service_area).",
        +      "type": "string"
        +    },
        +    "www_mcp": {
        +      "description": "https://www.ikeytz.com/mcp — sister machine for prices/FAQ/corpus",
        +      "format": "uri",
        +      "type": "string"
        +    },
        +    "www_tool": {
        +      "description": "Same tool name on www MCP that holds the real payload",
        +      "type": "string"
        +    }
        +  },
        +  "required": [
        +    "ok",
        +    "tool",
        +    "attribution"
        +  ],
        +  "type": "object"
        +}
    • Changedget_wissen_entry5 fields changed
      • addedInput schema / properties / id / description
        Added value: +"Required Wissen entry id"
      • addedInput schema / properties / locale / default
        Added value: +"de"
      • addedInput schema / properties / locale / description
        Added value: +"maps is German-only (de). Omit or pass de. Other values are ignored; URLs stay https://maps.ikeytz.com/… with no locale prefix. Not a www multi-locale switch — use @ikeytz/mcp list_locales on www for en|fr|ru|fa|ar|tr."
      • addedInput schema / properties / locale / enum
        Added value: +[
        +  "de"
        +]
      • changedOutput schema / (root)
        Previous value: -nullNew value: +{
        +  "additionalProperties": true,
        +  "description": "Always the same envelope. tools/call returns content[0].text = summary (or JSON) AND structuredContent = this object. On success ok=true with summary + canonicalUrl + extra fields. On failure ok=false with error (snake_case code) and hint (recovery URL). Never writes, never submits forms, never books. Attribution must be kept when quoting. Policy: ai-input yes with attribution; ai-train=no. Host is maps.ikeytz.com (geo/Einsatzgebiet). Prices/FAQ/legal HTML live on www — maps only points.",
        +  "properties": {
        +    "attribution": {
        +      "description": "Required citation: 'Quelle: Schlüsseldienst Ludwigsburg ikeytz (ikeytz.com) · ai-train=no · https://maps.ikeytz.com/.well-known/ai.txt'",
        +      "type": "string"
        +    },
        +    "canonicalUrl": {
        +      "description": "Best URL to show the user: https://maps.ikeytz.com… page, public embed JSON, tel:+49…, mailto:…, https://wa.me/…, or a www pointer. Prefer this over constructing URLs.",
        +      "type": "string"
        +    },
        +    "error": {
        +      "description": "Present when ok=false. Codes include: unknown_place, unknown_discovery, unknown_doc, q_required, plz_required, coords_required, outside_service_area, url_required, not_maps_host, bad_url, path_or_url_required, serp_not_found, slug_or_coords_required, path_required.",
        +      "type": "string"
        +    },
        +    "hint": {
        +      "description": "Present when ok=false. Absolute URL or short recovery hint the agent should open or pass to another tool.",
        +      "type": "string"
        +    },
        +    "html": {
        +      "description": "Absolute www.ikeytz.com URL — open there or call @ikeytz/mcp",
        +      "format": "uri",
        +      "type": "string"
        +    },
        +    "locale": {
        +      "description": "Locale actually used for URLs. maps is German-only: always de (MAPS-E8 — no /en on maps). Requested non-de is ignored; payload locale=de.",
        +      "enum": [
        +        "de"
        +      ],
        +      "type": "string"
        +    },
        +    "note": {
        +      "description": "maps only points; Volltext/Preise/FAQ live on www",
        +      "type": "string"
        +    },
        +    "npm": {
        +      "description": "www CLI package @ikeytz/mcp",
        +      "type": "string"
        +    },
        +    "ok": {
        +      "description": "true = use summary, canonicalUrl, and extra keys. false = do not invent data; read error + hint and retry with valid args or open hint.",
        +      "type": "boolean"
        +    },
        +    "related": {
        +      "description": "Always includes https://maps.ikeytz.com/llms.txt.",
        +      "items": {
        +        "format": "uri",
        +        "type": "string"
        +      },
        +      "type": "array"
        +    },
        +    "requested_locale": {
        +      "description": "Locale the caller asked for; maps still returns locale=de",
        +      "type": "string"
        +    },
        +    "summary": {
        +      "description": "Primary text for the model. For discovery tools this is the file window. For list tools a compact one-liner. Quote with attribution.",
        +      "type": "string"
        +    },
        +    "tool": {
        +      "description": "Echo of the tool name that produced this object (e.g. get_service_area).",
        +      "type": "string"
        +    },
        +    "www_mcp": {
        +      "description": "https://www.ikeytz.com/mcp — sister machine for prices/FAQ/corpus",
        +      "format": "uri",
        +      "type": "string"
        +    },
        +    "www_tool": {
        +      "description": "Same tool name on www MCP that holds the real payload",
        +      "type": "string"
        +    }
        +  },
        +  "required": [
        +    "ok",
        +    "tool",
        +    "attribution"
        +  ],
        +  "type": "object"
        +}
    • Changedlist_auswahl4 fields changed
      • addedInput schema / properties / locale / default
        Added value: +"de"
      • addedInput schema / properties / locale / description
        Added value: +"maps is German-only (de). Omit or pass de. Other values are ignored; URLs stay https://maps.ikeytz.com/… with no locale prefix. Not a www multi-locale switch — use @ikeytz/mcp list_locales on www for en|fr|ru|fa|ar|tr."
      • addedInput schema / properties / locale / enum
        Added value: +[
        +  "de"
        +]
      • changedOutput schema / (root)
        Previous value: -nullNew value: +{
        +  "additionalProperties": true,
        +  "description": "Always the same envelope. tools/call returns content[0].text = summary (or JSON) AND structuredContent = this object. On success ok=true with summary + canonicalUrl + extra fields. On failure ok=false with error (snake_case code) and hint (recovery URL). Never writes, never submits forms, never books. Attribution must be kept when quoting. Policy: ai-input yes with attribution; ai-train=no. Host is maps.ikeytz.com (geo/Einsatzgebiet). Prices/FAQ/legal HTML live on www — maps only points.",
        +  "properties": {
        +    "attribution": {
        +      "description": "Required citation: 'Quelle: Schlüsseldienst Ludwigsburg ikeytz (ikeytz.com) · ai-train=no · https://maps.ikeytz.com/.well-known/ai.txt'",
        +      "type": "string"
        +    },
        +    "canonicalUrl": {
        +      "description": "Best URL to show the user: https://maps.ikeytz.com… page, public embed JSON, tel:+49…, mailto:…, https://wa.me/…, or a www pointer. Prefer this over constructing URLs.",
        +      "type": "string"
        +    },
        +    "error": {
        +      "description": "Present when ok=false. Codes include: unknown_place, unknown_discovery, unknown_doc, q_required, plz_required, coords_required, outside_service_area, url_required, not_maps_host, bad_url, path_or_url_required, serp_not_found, slug_or_coords_required, path_required.",
        +      "type": "string"
        +    },
        +    "hint": {
        +      "description": "Present when ok=false. Absolute URL or short recovery hint the agent should open or pass to another tool.",
        +      "type": "string"
        +    },
        +    "html": {
        +      "description": "Absolute www.ikeytz.com URL — open there or call @ikeytz/mcp",
        +      "format": "uri",
        +      "type": "string"
        +    },
        +    "locale": {
        +      "description": "Locale actually used for URLs. maps is German-only: always de (MAPS-E8 — no /en on maps). Requested non-de is ignored; payload locale=de.",
        +      "enum": [
        +        "de"
        +      ],
        +      "type": "string"
        +    },
        +    "note": {
        +      "description": "maps only points; Volltext/Preise/FAQ live on www",
        +      "type": "string"
        +    },
        +    "npm": {
        +      "description": "www CLI package @ikeytz/mcp",
        +      "type": "string"
        +    },
        +    "ok": {
        +      "description": "true = use summary, canonicalUrl, and extra keys. false = do not invent data; read error + hint and retry with valid args or open hint.",
        +      "type": "boolean"
        +    },
        +    "related": {
        +      "description": "Always includes https://maps.ikeytz.com/llms.txt.",
        +      "items": {
        +        "format": "uri",
        +        "type": "string"
        +      },
        +      "type": "array"
        +    },
        +    "requested_locale": {
        +      "description": "Locale the caller asked for; maps still returns locale=de",
        +      "type": "string"
        +    },
        +    "summary": {
        +      "description": "Primary text for the model. For discovery tools this is the file window. For list tools a compact one-liner. Quote with attribution.",
        +      "type": "string"
        +    },
        +    "tool": {
        +      "description": "Echo of the tool name that produced this object (e.g. get_service_area).",
        +      "type": "string"
        +    },
        +    "www_mcp": {
        +      "description": "https://www.ikeytz.com/mcp — sister machine for prices/FAQ/corpus",
        +      "format": "uri",
        +      "type": "string"
        +    },
        +    "www_tool": {
        +      "description": "Same tool name on www MCP that holds the real payload",
        +      "type": "string"
        +    }
        +  },
        +  "required": [
        +    "ok",
        +    "tool",
        +    "attribution"
        +  ],
        +  "type": "object"
        +}
    • Changedlist_faq4 fields changed
      • addedInput schema / properties / locale / default
        Added value: +"de"
      • addedInput schema / properties / locale / description
        Added value: +"maps is German-only (de). Omit or pass de. Other values are ignored; URLs stay https://maps.ikeytz.com/… with no locale prefix. Not a www multi-locale switch — use @ikeytz/mcp list_locales on www for en|fr|ru|fa|ar|tr."
      • addedInput schema / properties / locale / enum
        Added value: +[
        +  "de"
        +]
      • changedOutput schema / (root)
        Previous value: -nullNew value: +{
        +  "additionalProperties": true,
        +  "description": "Always the same envelope. tools/call returns content[0].text = summary (or JSON) AND structuredContent = this object. On success ok=true with summary + canonicalUrl + extra fields. On failure ok=false with error (snake_case code) and hint (recovery URL). Never writes, never submits forms, never books. Attribution must be kept when quoting. Policy: ai-input yes with attribution; ai-train=no. Host is maps.ikeytz.com (geo/Einsatzgebiet). Prices/FAQ/legal HTML live on www — maps only points.",
        +  "properties": {
        +    "attribution": {
        +      "description": "Required citation: 'Quelle: Schlüsseldienst Ludwigsburg ikeytz (ikeytz.com) · ai-train=no · https://maps.ikeytz.com/.well-known/ai.txt'",
        +      "type": "string"
        +    },
        +    "canonicalUrl": {
        +      "description": "Best URL to show the user: https://maps.ikeytz.com… page, public embed JSON, tel:+49…, mailto:…, https://wa.me/…, or a www pointer. Prefer this over constructing URLs.",
        +      "type": "string"
        +    },
        +    "error": {
        +      "description": "Present when ok=false. Codes include: unknown_place, unknown_discovery, unknown_doc, q_required, plz_required, coords_required, outside_service_area, url_required, not_maps_host, bad_url, path_or_url_required, serp_not_found, slug_or_coords_required, path_required.",
        +      "type": "string"
        +    },
        +    "hint": {
        +      "description": "Present when ok=false. Absolute URL or short recovery hint the agent should open or pass to another tool.",
        +      "type": "string"
        +    },
        +    "html": {
        +      "description": "Absolute www.ikeytz.com URL — open there or call @ikeytz/mcp",
        +      "format": "uri",
        +      "type": "string"
        +    },
        +    "locale": {
        +      "description": "Locale actually used for URLs. maps is German-only: always de (MAPS-E8 — no /en on maps). Requested non-de is ignored; payload locale=de.",
        +      "enum": [
        +        "de"
        +      ],
        +      "type": "string"
        +    },
        +    "note": {
        +      "description": "maps only points; Volltext/Preise/FAQ live on www",
        +      "type": "string"
        +    },
        +    "npm": {
        +      "description": "www CLI package @ikeytz/mcp",
        +      "type": "string"
        +    },
        +    "ok": {
        +      "description": "true = use summary, canonicalUrl, and extra keys. false = do not invent data; read error + hint and retry with valid args or open hint.",
        +      "type": "boolean"
        +    },
        +    "related": {
        +      "description": "Always includes https://maps.ikeytz.com/llms.txt.",
        +      "items": {
        +        "format": "uri",
        +        "type": "string"
        +      },
        +      "type": "array"
        +    },
        +    "requested_locale": {
        +      "description": "Locale the caller asked for; maps still returns locale=de",
        +      "type": "string"
        +    },
        +    "summary": {
        +      "description": "Primary text for the model. For discovery tools this is the file window. For list tools a compact one-liner. Quote with attribution.",
        +      "type": "string"
        +    },
        +    "tool": {
        +      "description": "Echo of the tool name that produced this object (e.g. get_service_area).",
        +      "type": "string"
        +    },
        +    "www_mcp": {
        +      "description": "https://www.ikeytz.com/mcp — sister machine for prices/FAQ/corpus",
        +      "format": "uri",
        +      "type": "string"
        +    },
        +    "www_tool": {
        +      "description": "Same tool name on www MCP that holds the real payload",
        +      "type": "string"
        +    }
        +  },
        +  "required": [
        +    "ok",
        +    "tool",
        +    "attribution"
        +  ],
        +  "type": "object"
        +}
    • Changedlist_footer4 fields changed
      • addedInput schema / properties / locale / default
        Added value: +"de"
      • addedInput schema / properties / locale / description
        Added value: +"maps is German-only (de). Omit or pass de. Other values are ignored; URLs stay https://maps.ikeytz.com/… with no locale prefix. Not a www multi-locale switch — use @ikeytz/mcp list_locales on www for en|fr|ru|fa|ar|tr."
      • addedInput schema / properties / locale / enum
        Added value: +[
        +  "de"
        +]
      • changedOutput schema / (root)
        Previous value: -nullNew value: +{
        +  "additionalProperties": true,
        +  "description": "Always the same envelope. tools/call returns content[0].text = summary (or JSON) AND structuredContent = this object. On success ok=true with summary + canonicalUrl + extra fields. On failure ok=false with error (snake_case code) and hint (recovery URL). Never writes, never submits forms, never books. Attribution must be kept when quoting. Policy: ai-input yes with attribution; ai-train=no. Host is maps.ikeytz.com (geo/Einsatzgebiet). Prices/FAQ/legal HTML live on www — maps only points.",
        +  "properties": {
        +    "attribution": {
        +      "description": "Required citation: 'Quelle: Schlüsseldienst Ludwigsburg ikeytz (ikeytz.com) · ai-train=no · https://maps.ikeytz.com/.well-known/ai.txt'",
        +      "type": "string"
        +    },
        +    "canonicalUrl": {
        +      "description": "Best URL to show the user: https://maps.ikeytz.com… page, public embed JSON, tel:+49…, mailto:…, https://wa.me/…, or a www pointer. Prefer this over constructing URLs.",
        +      "type": "string"
        +    },
        +    "email": {
        +      "description": "info@ikeytz.com",
        +      "type": "string"
        +    },
        +    "error": {
        +      "description": "Present when ok=false. Codes include: unknown_place, unknown_discovery, unknown_doc, q_required, plz_required, coords_required, outside_service_area, url_required, not_maps_host, bad_url, path_or_url_required, serp_not_found, slug_or_coords_required, path_required.",
        +      "type": "string"
        +    },
        +    "hint": {
        +      "description": "Present when ok=false. Absolute URL or short recovery hint the agent should open or pass to another tool.",
        +      "type": "string"
        +    },
        +    "html_www": {
        +      "description": "www HTML footer links (host=www)",
        +      "type": "array"
        +    },
        +    "locale": {
        +      "description": "Locale actually used for URLs. maps is German-only: always de (MAPS-E8 — no /en on maps). Requested non-de is ignored; payload locale=de.",
        +      "enum": [
        +        "de"
        +      ],
        +      "type": "string"
        +    },
        +    "maps": {
        +      "description": "maps-hosted footer links",
        +      "type": "array"
        +    },
        +    "mapsEmail": {
        +      "description": "info@maps.ikeytz.com",
        +      "type": "string"
        +    },
        +    "note": {
        +      "type": "string"
        +    },
        +    "ok": {
        +      "description": "true = use summary, canonicalUrl, and extra keys. false = do not invent data; read error + hint and retry with valid args or open hint.",
        +      "type": "boolean"
        +    },
        +    "related": {
        +      "description": "Always includes https://maps.ikeytz.com/llms.txt.",
        +      "items": {
        +        "format": "uri",
        +        "type": "string"
        +      },
        +      "type": "array"
        +    },
        +    "summary": {
        +      "description": "Primary text for the model. For discovery tools this is the file window. For list tools a compact one-liner. Quote with attribution.",
        +      "type": "string"
        +    },
        +    "tool": {
        +      "description": "Echo of the tool name that produced this object (e.g. get_service_area).",
        +      "type": "string"
        +    }
        +  },
        +  "required": [
        +    "ok",
        +    "tool",
        +    "attribution"
        +  ],
        +  "type": "object"
        +}
    • Changedlist_locales3 fields changed
      • addedInput schema / additionalProperties
        Added value: +false
      • addedInput schema / description
        Added value: +"This tool takes no arguments. Call tools/call with arguments: {}. Extra keys are ignored."
      • changedOutput schema / (root)
        Previous value: -nullNew value: +{
        +  "additionalProperties": true,
        +  "description": "Always the same envelope. tools/call returns content[0].text = summary (or JSON) AND structuredContent = this object. On success ok=true with summary + canonicalUrl + extra fields. On failure ok=false with error (snake_case code) and hint (recovery URL). Never writes, never submits forms, never books. Attribution must be kept when quoting. Policy: ai-input yes with attribution; ai-train=no. Host is maps.ikeytz.com (geo/Einsatzgebiet). Prices/FAQ/legal HTML live on www — maps only points.",
        +  "properties": {
        +    "attribution": {
        +      "description": "Required citation: 'Quelle: Schlüsseldienst Ludwigsburg ikeytz (ikeytz.com) · ai-train=no · https://maps.ikeytz.com/.well-known/ai.txt'",
        +      "type": "string"
        +    },
        +    "canonicalUrl": {
        +      "description": "Best URL to show the user: https://maps.ikeytz.com… page, public embed JSON, tel:+49…, mailto:…, https://wa.me/…, or a www pointer. Prefer this over constructing URLs.",
        +      "type": "string"
        +    },
        +    "error": {
        +      "description": "Present when ok=false. Codes include: unknown_place, unknown_discovery, unknown_doc, q_required, plz_required, coords_required, outside_service_area, url_required, not_maps_host, bad_url, path_or_url_required, serp_not_found, slug_or_coords_required, path_required.",
        +      "type": "string"
        +    },
        +    "hint": {
        +      "description": "Present when ok=false. Absolute URL or short recovery hint the agent should open or pass to another tool.",
        +      "type": "string"
        +    },
        +    "items": {
        +      "description": "Only de",
        +      "items": {
        +        "properties": {
        +          "locale": {
        +            "const": "de",
        +            "type": "string"
        +          },
        +          "url": {
        +            "format": "uri",
        +            "type": "string"
        +          }
        +        },
        +        "type": "object"
        +      },
        +      "type": "array"
        +    },
        +    "locale": {
        +      "description": "Locale actually used for URLs. maps is German-only: always de (MAPS-E8 — no /en on maps). Requested non-de is ignored; payload locale=de.",
        +      "enum": [
        +        "de"
        +      ],
        +      "type": "string"
        +    },
        +    "note": {
        +      "type": "string"
        +    },
        +    "ok": {
        +      "description": "true = use summary, canonicalUrl, and extra keys. false = do not invent data; read error + hint and retry with valid args or open hint.",
        +      "type": "boolean"
        +    },
        +    "related": {
        +      "description": "Always includes https://maps.ikeytz.com/llms.txt.",
        +      "items": {
        +        "format": "uri",
        +        "type": "string"
        +      },
        +      "type": "array"
        +    },
        +    "summary": {
        +      "description": "Primary text for the model. For discovery tools this is the file window. For list tools a compact one-liner. Quote with attribution.",
        +      "type": "string"
        +    },
        +    "tool": {
        +      "description": "Echo of the tool name that produced this object (e.g. get_service_area).",
        +      "type": "string"
        +    }
        +  },
        +  "required": [
        +    "ok",
        +    "tool",
        +    "attribution"
        +  ],
        +  "type": "object"
        +}
    • Changedlist_nav4 fields changed
      • addedInput schema / properties / locale / default
        Added value: +"de"
      • addedInput schema / properties / locale / description
        Added value: +"maps is German-only (de). Omit or pass de. Other values are ignored; URLs stay https://maps.ikeytz.com/… with no locale prefix. Not a www multi-locale switch — use @ikeytz/mcp list_locales on www for en|fr|ru|fa|ar|tr."
      • addedInput schema / properties / locale / enum
        Added value: +[
        +  "de"
        +]
      • changedOutput schema / (root)
        Previous value: -nullNew value: +{
        +  "additionalProperties": true,
        +  "description": "Always the same envelope. tools/call returns content[0].text = summary (or JSON) AND structuredContent = this object. On success ok=true with summary + canonicalUrl + extra fields. On failure ok=false with error (snake_case code) and hint (recovery URL). Never writes, never submits forms, never books. Attribution must be kept when quoting. Policy: ai-input yes with attribution; ai-train=no. Host is maps.ikeytz.com (geo/Einsatzgebiet). Prices/FAQ/legal HTML live on www — maps only points.",
        +  "properties": {
        +    "attribution": {
        +      "description": "Required citation: 'Quelle: Schlüsseldienst Ludwigsburg ikeytz (ikeytz.com) · ai-train=no · https://maps.ikeytz.com/.well-known/ai.txt'",
        +      "type": "string"
        +    },
        +    "canonicalUrl": {
        +      "description": "Best URL to show the user: https://maps.ikeytz.com… page, public embed JSON, tel:+49…, mailto:…, https://wa.me/…, or a www pointer. Prefer this over constructing URLs.",
        +      "type": "string"
        +    },
        +    "count": {
        +      "type": "number"
        +    },
        +    "error": {
        +      "description": "Present when ok=false. Codes include: unknown_place, unknown_discovery, unknown_doc, q_required, plz_required, coords_required, outside_service_area, url_required, not_maps_host, bad_url, path_or_url_required, serp_not_found, slug_or_coords_required, path_required.",
        +      "type": "string"
        +    },
        +    "hint": {
        +      "description": "Present when ok=false. Absolute URL or short recovery hint the agent should open or pass to another tool.",
        +      "type": "string"
        +    },
        +    "items": {
        +      "description": "Nav links {label,url,slug?}",
        +      "items": {
        +        "additionalProperties": true,
        +        "properties": {
        +          "label": {
        +            "type": "string"
        +          },
        +          "slug": {
        +            "type": "string"
        +          },
        +          "url": {
        +            "format": "uri",
        +            "type": "string"
        +          }
        +        },
        +        "type": "object"
        +      },
        +      "type": "array"
        +    },
        +    "locale": {
        +      "description": "Locale actually used for URLs. maps is German-only: always de (MAPS-E8 — no /en on maps). Requested non-de is ignored; payload locale=de.",
        +      "enum": [
        +        "de"
        +      ],
        +      "type": "string"
        +    },
        +    "note": {
        +      "type": "string"
        +    },
        +    "ok": {
        +      "description": "true = use summary, canonicalUrl, and extra keys. false = do not invent data; read error + hint and retry with valid args or open hint.",
        +      "type": "boolean"
        +    },
        +    "related": {
        +      "description": "Always includes https://maps.ikeytz.com/llms.txt.",
        +      "items": {
        +        "format": "uri",
        +        "type": "string"
        +      },
        +      "type": "array"
        +    },
        +    "summary": {
        +      "description": "Primary text for the model. For discovery tools this is the file window. For list tools a compact one-liner. Quote with attribution.",
        +      "type": "string"
        +    },
        +    "tool": {
        +      "description": "Echo of the tool name that produced this object (e.g. get_service_area).",
        +      "type": "string"
        +    }
        +  },
        +  "required": [
        +    "ok",
        +    "tool",
        +    "attribution"
        +  ],
        +  "type": "object"
        +}
    • Changedlist_plz3 fields changed
      • addedInput schema / additionalProperties
        Added value: +false
      • addedInput schema / description
        Added value: +"This tool takes no arguments. Call tools/call with arguments: {}. Extra keys are ignored."
      • changedOutput schema / (root)
        Previous value: -nullNew value: +{
        +  "additionalProperties": true,
        +  "description": "Always the same envelope. tools/call returns content[0].text = summary (or JSON) AND structuredContent = this object. On success ok=true with summary + canonicalUrl + extra fields. On failure ok=false with error (snake_case code) and hint (recovery URL). Never writes, never submits forms, never books. Attribution must be kept when quoting. Policy: ai-input yes with attribution; ai-train=no. Host is maps.ikeytz.com (geo/Einsatzgebiet). Prices/FAQ/legal HTML live on www — maps only points.",
        +  "properties": {
        +    "attribution": {
        +      "description": "Required citation: 'Quelle: Schlüsseldienst Ludwigsburg ikeytz (ikeytz.com) · ai-train=no · https://maps.ikeytz.com/.well-known/ai.txt'",
        +      "type": "string"
        +    },
        +    "canonicalUrl": {
        +      "description": "Best URL to show the user: https://maps.ikeytz.com… page, public embed JSON, tel:+49…, mailto:…, https://wa.me/…, or a www pointer. Prefer this over constructing URLs.",
        +      "type": "string"
        +    },
        +    "count": {
        +      "description": "Distinct PLZ count",
        +      "type": "number"
        +    },
        +    "error": {
        +      "description": "Present when ok=false. Codes include: unknown_place, unknown_discovery, unknown_doc, q_required, plz_required, coords_required, outside_service_area, url_required, not_maps_host, bad_url, path_or_url_required, serp_not_found, slug_or_coords_required, path_required.",
        +      "type": "string"
        +    },
        +    "hint": {
        +      "description": "Present when ok=false. Absolute URL or short recovery hint the agent should open or pass to another tool.",
        +      "type": "string"
        +    },
        +    "items": {
        +      "description": "PLZ groups",
        +      "items": {
        +        "properties": {
        +          "count": {
        +            "type": "number"
        +          },
        +          "plz": {
        +            "type": "string"
        +          },
        +          "slugs": {
        +            "items": {
        +              "type": "string"
        +            },
        +            "type": "array"
        +          }
        +        },
        +        "type": "object"
        +      },
        +      "type": "array"
        +    },
        +    "locale": {
        +      "description": "Locale actually used for URLs. maps is German-only: always de (MAPS-E8 — no /en on maps). Requested non-de is ignored; payload locale=de.",
        +      "enum": [
        +        "de"
        +      ],
        +      "type": "string"
        +    },
        +    "ok": {
        +      "description": "true = use summary, canonicalUrl, and extra keys. false = do not invent data; read error + hint and retry with valid args or open hint.",
        +      "type": "boolean"
        +    },
        +    "related": {
        +      "description": "Always includes https://maps.ikeytz.com/llms.txt.",
        +      "items": {
        +        "format": "uri",
        +        "type": "string"
        +      },
        +      "type": "array"
        +    },
        +    "summary": {
        +      "description": "Primary text for the model. For discovery tools this is the file window. For list tools a compact one-liner. Quote with attribution.",
        +      "type": "string"
        +    },
        +    "tool": {
        +      "description": "Echo of the tool name that produced this object (e.g. get_service_area).",
        +      "type": "string"
        +    }
        +  },
        +  "required": [
        +    "ok",
        +    "tool",
        +    "attribution"
        +  ],
        +  "type": "object"
        +}
    • Changedlist_ratgeber4 fields changed
      • addedInput schema / properties / locale / default
        Added value: +"de"
      • addedInput schema / properties / locale / description
        Added value: +"maps is German-only (de). Omit or pass de. Other values are ignored; URLs stay https://maps.ikeytz.com/… with no locale prefix. Not a www multi-locale switch — use @ikeytz/mcp list_locales on www for en|fr|ru|fa|ar|tr."
      • addedInput schema / properties / locale / enum
        Added value: +[
        +  "de"
        +]
      • changedOutput schema / (root)
        Previous value: -nullNew value: +{
        +  "additionalProperties": true,
        +  "description": "Always the same envelope. tools/call returns content[0].text = summary (or JSON) AND structuredContent = this object. On success ok=true with summary + canonicalUrl + extra fields. On failure ok=false with error (snake_case code) and hint (recovery URL). Never writes, never submits forms, never books. Attribution must be kept when quoting. Policy: ai-input yes with attribution; ai-train=no. Host is maps.ikeytz.com (geo/Einsatzgebiet). Prices/FAQ/legal HTML live on www — maps only points.",
        +  "properties": {
        +    "attribution": {
        +      "description": "Required citation: 'Quelle: Schlüsseldienst Ludwigsburg ikeytz (ikeytz.com) · ai-train=no · https://maps.ikeytz.com/.well-known/ai.txt'",
        +      "type": "string"
        +    },
        +    "canonicalUrl": {
        +      "description": "Best URL to show the user: https://maps.ikeytz.com… page, public embed JSON, tel:+49…, mailto:…, https://wa.me/…, or a www pointer. Prefer this over constructing URLs.",
        +      "type": "string"
        +    },
        +    "error": {
        +      "description": "Present when ok=false. Codes include: unknown_place, unknown_discovery, unknown_doc, q_required, plz_required, coords_required, outside_service_area, url_required, not_maps_host, bad_url, path_or_url_required, serp_not_found, slug_or_coords_required, path_required.",
        +      "type": "string"
        +    },
        +    "hint": {
        +      "description": "Present when ok=false. Absolute URL or short recovery hint the agent should open or pass to another tool.",
        +      "type": "string"
        +    },
        +    "html": {
        +      "description": "Absolute www.ikeytz.com URL — open there or call @ikeytz/mcp",
        +      "format": "uri",
        +      "type": "string"
        +    },
        +    "locale": {
        +      "description": "Locale actually used for URLs. maps is German-only: always de (MAPS-E8 — no /en on maps). Requested non-de is ignored; payload locale=de.",
        +      "enum": [
        +        "de"
        +      ],
        +      "type": "string"
        +    },
        +    "note": {
        +      "description": "maps only points; Volltext/Preise/FAQ live on www",
        +      "type": "string"
        +    },
        +    "npm": {
        +      "description": "www CLI package @ikeytz/mcp",
        +      "type": "string"
        +    },
        +    "ok": {
        +      "description": "true = use summary, canonicalUrl, and extra keys. false = do not invent data; read error + hint and retry with valid args or open hint.",
        +      "type": "boolean"
        +    },
        +    "related": {
        +      "description": "Always includes https://maps.ikeytz.com/llms.txt.",
        +      "items": {
        +        "format": "uri",
        +        "type": "string"
        +      },
        +      "type": "array"
        +    },
        +    "requested_locale": {
        +      "description": "Locale the caller asked for; maps still returns locale=de",
        +      "type": "string"
        +    },
        +    "summary": {
        +      "description": "Primary text for the model. For discovery tools this is the file window. For list tools a compact one-liner. Quote with attribution.",
        +      "type": "string"
        +    },
        +    "tool": {
        +      "description": "Echo of the tool name that produced this object (e.g. get_service_area).",
        +      "type": "string"
        +    },
        +    "www_mcp": {
        +      "description": "https://www.ikeytz.com/mcp — sister machine for prices/FAQ/corpus",
        +      "format": "uri",
        +      "type": "string"
        +    },
        +    "www_tool": {
        +      "description": "Same tool name on www MCP that holds the real payload",
        +      "type": "string"
        +    }
        +  },
        +  "required": [
        +    "ok",
        +    "tool",
        +    "attribution"
        +  ],
        +  "type": "object"
        +}
    • Changedlist_service_areas10 fields changed
      • changedInput schema / properties / fields / description
        Previous value: -"Komma-Liste oder Array: slug,name,plz,…"New value: +"Optional field filter: comma-separated names or array. Keeps envelope keys (ok, tool, summary, canonicalUrl, attribution, locale, related, count, total, offset, limit, compact) plus listed fields. Example: slug,name,plz,lat,lng."
      • addedInput schema / properties / limit / description
        Added value: +"Maximum items or lines to return after offset. Omit = all remaining in the window (subject to tool-specific clamps). For geo near-search default is often 5 without radius_km, up to 52 with radius."
      • addedInput schema / properties / limit / minimum
        Added value: +1
      • addedInput schema / properties / locale / default
        Added value: +"de"
      • addedInput schema / properties / locale / description
        Added value: +"maps is German-only (de). Omit or pass de. Other values are ignored; URLs stay https://maps.ikeytz.com/… with no locale prefix. Not a www multi-locale switch — use @ikeytz/mcp list_locales on www for en|fr|ru|fa|ar|tr."
      • addedInput schema / properties / locale / enum
        Added value: +[
        +  "de"
        +]
      • addedInput schema / properties / offset / default
        Added value: +0
      • addedInput schema / properties / offset / description
        Added value: +"0-based index into a list or discovery file lines (split on \\n). 0 = first. Omit = 0. Combine with limit to page. Use nextOffset / offset+limit from a previous result when present."
      • addedInput schema / properties / offset / minimum
        Added value: +0
      • changedOutput schema / (root)
        Previous value: -nullNew value: +{
        +  "additionalProperties": true,
        +  "description": "Always the same envelope. tools/call returns content[0].text = summary (or JSON) AND structuredContent = this object. On success ok=true with summary + canonicalUrl + extra fields. On failure ok=false with error (snake_case code) and hint (recovery URL). Never writes, never submits forms, never books. Attribution must be kept when quoting. Policy: ai-input yes with attribution; ai-train=no. Host is maps.ikeytz.com (geo/Einsatzgebiet). Prices/FAQ/legal HTML live on www — maps only points.",
        +  "properties": {
        +    "attribution": {
        +      "description": "Required citation: 'Quelle: Schlüsseldienst Ludwigsburg ikeytz (ikeytz.com) · ai-train=no · https://maps.ikeytz.com/.well-known/ai.txt'",
        +      "type": "string"
        +    },
        +    "canonicalUrl": {
        +      "description": "Best URL to show the user: https://maps.ikeytz.com… page, public embed JSON, tel:+49…, mailto:…, https://wa.me/…, or a www pointer. Prefer this over constructing URLs.",
        +      "type": "string"
        +    },
        +    "count": {
        +      "description": "Items in this page",
        +      "type": "number"
        +    },
        +    "error": {
        +      "description": "Present when ok=false. Codes include: unknown_place, unknown_discovery, unknown_doc, q_required, plz_required, coords_required, outside_service_area, url_required, not_maps_host, bad_url, path_or_url_required, serp_not_found, slug_or_coords_required, path_required.",
        +      "type": "string"
        +    },
        +    "hint": {
        +      "description": "Present when ok=false. Absolute URL or short recovery hint the agent should open or pass to another tool.",
        +      "type": "string"
        +    },
        +    "items": {
        +      "description": "Service-area point cards",
        +      "items": {
        +        "additionalProperties": true,
        +        "description": "One Einsatzgebiet point card (not a polygon).",
        +        "properties": {
        +          "distance_km": {
        +            "description": "Present on geo-ranked results: air distance from query point",
        +            "type": "number"
        +          },
        +          "embed_map": {
        +            "description": "https://maps.ikeytz.com/{slug}",
        +            "format": "uri",
        +            "type": "string"
        +          },
        +          "geo_api": {
        +            "description": "https://maps.ikeytz.com/api/v1/embed/ort/{slug}",
        +            "format": "uri",
        +            "type": "string"
        +          },
        +          "google_maps": {
        +            "description": "Paste-ready 'lat, lng'",
        +            "type": "string"
        +          },
        +          "icbm": {
        +            "description": "ICBM 'lat, lng' (same as google_maps)",
        +            "type": "string"
        +          },
        +          "kind": {
        +            "description": "stadtteil | ort",
        +            "type": "string"
        +          },
        +          "lat": {
        +            "description": "WGS84 latitude of THIS place",
        +            "type": "number"
        +          },
        +          "lng": {
        +            "description": "WGS84 longitude of THIS place",
        +            "type": "number"
        +          },
        +          "maps_mcp": {
        +            "const": "https://maps.ikeytz.com/mcp",
        +            "description": "maps MCP endpoint",
        +            "format": "uri",
        +            "type": "string"
        +          },
        +          "name": {
        +            "description": "German place name",
        +            "type": "string"
        +          },
        +          "parent": {
        +            "description": "Ludwigsburg or Landkreis Ludwigsburg",
        +            "type": "string"
        +          },
        +          "plz": {
        +            "description": "Postcode",
        +            "type": "string"
        +          },
        +          "slug": {
        +            "description": "maps slug",
        +            "type": "string"
        +          },
        +          "url": {
        +            "description": "Keyword/www page URL when present",
        +            "type": "string"
        +          }
        +        },
        +        "type": "object"
        +      },
        +      "type": "array"
        +    },
        +    "limit": {
        +      "description": "Applied limit",
        +      "type": "number"
        +    },
        +    "locale": {
        +      "description": "Locale actually used for URLs. maps is German-only: always de (MAPS-E8 — no /en on maps). Requested non-de is ignored; payload locale=de.",
        +      "enum": [
        +        "de"
        +      ],
        +      "type": "string"
        +    },
        +    "offset": {
        +      "description": "Applied offset",
        +      "type": "number"
        +    },
        +    "ok": {
        +      "description": "true = use summary, canonicalUrl, and extra keys. false = do not invent data; read error + hint and retry with valid args or open hint.",
        +      "type": "boolean"
        +    },
        +    "related": {
        +      "description": "Always includes https://maps.ikeytz.com/llms.txt.",
        +      "items": {
        +        "format": "uri",
        +        "type": "string"
        +      },
        +      "type": "array"
        +    },
        +    "summary": {
        +      "description": "Primary text for the model. For discovery tools this is the file window. For list tools a compact one-liner. Quote with attribution.",
        +      "type": "string"
        +    },
        +    "tool": {
        +      "description": "Echo of the tool name that produced this object (e.g. get_service_area).",
        +      "type": "string"
        +    },
        +    "total": {
        +      "description": "Total Gebiete (52)",
        +      "type": "number"
        +    }
        +  },
        +  "required": [
        +    "ok",
        +    "tool",
        +    "attribution"
        +  ],
        +  "type": "object"
        +}
    • Changedlist_services4 fields changed
      • addedInput schema / properties / locale / default
        Added value: +"de"
      • addedInput schema / properties / locale / description
        Added value: +"maps is German-only (de). Omit or pass de. Other values are ignored; URLs stay https://maps.ikeytz.com/… with no locale prefix. Not a www multi-locale switch — use @ikeytz/mcp list_locales on www for en|fr|ru|fa|ar|tr."
      • addedInput schema / properties / locale / enum
        Added value: +[
        +  "de"
        +]
      • changedOutput schema / (root)
        Previous value: -nullNew value: +{
        +  "additionalProperties": true,
        +  "description": "Always the same envelope. tools/call returns content[0].text = summary (or JSON) AND structuredContent = this object. On success ok=true with summary + canonicalUrl + extra fields. On failure ok=false with error (snake_case code) and hint (recovery URL). Never writes, never submits forms, never books. Attribution must be kept when quoting. Policy: ai-input yes with attribution; ai-train=no. Host is maps.ikeytz.com (geo/Einsatzgebiet). Prices/FAQ/legal HTML live on www — maps only points.",
        +  "properties": {
        +    "attribution": {
        +      "description": "Required citation: 'Quelle: Schlüsseldienst Ludwigsburg ikeytz (ikeytz.com) · ai-train=no · https://maps.ikeytz.com/.well-known/ai.txt'",
        +      "type": "string"
        +    },
        +    "canonicalUrl": {
        +      "description": "Best URL to show the user: https://maps.ikeytz.com… page, public embed JSON, tel:+49…, mailto:…, https://wa.me/…, or a www pointer. Prefer this over constructing URLs.",
        +      "type": "string"
        +    },
        +    "error": {
        +      "description": "Present when ok=false. Codes include: unknown_place, unknown_discovery, unknown_doc, q_required, plz_required, coords_required, outside_service_area, url_required, not_maps_host, bad_url, path_or_url_required, serp_not_found, slug_or_coords_required, path_required.",
        +      "type": "string"
        +    },
        +    "hint": {
        +      "description": "Present when ok=false. Absolute URL or short recovery hint the agent should open or pass to another tool.",
        +      "type": "string"
        +    },
        +    "html": {
        +      "description": "Absolute www.ikeytz.com URL — open there or call @ikeytz/mcp",
        +      "format": "uri",
        +      "type": "string"
        +    },
        +    "locale": {
        +      "description": "Locale actually used for URLs. maps is German-only: always de (MAPS-E8 — no /en on maps). Requested non-de is ignored; payload locale=de.",
        +      "enum": [
        +        "de"
        +      ],
        +      "type": "string"
        +    },
        +    "note": {
        +      "description": "maps only points; Volltext/Preise/FAQ live on www",
        +      "type": "string"
        +    },
        +    "npm": {
        +      "description": "www CLI package @ikeytz/mcp",
        +      "type": "string"
        +    },
        +    "ok": {
        +      "description": "true = use summary, canonicalUrl, and extra keys. false = do not invent data; read error + hint and retry with valid args or open hint.",
        +      "type": "boolean"
        +    },
        +    "related": {
        +      "description": "Always includes https://maps.ikeytz.com/llms.txt.",
        +      "items": {
        +        "format": "uri",
        +        "type": "string"
        +      },
        +      "type": "array"
        +    },
        +    "requested_locale": {
        +      "description": "Locale the caller asked for; maps still returns locale=de",
        +      "type": "string"
        +    },
        +    "summary": {
        +      "description": "Primary text for the model. For discovery tools this is the file window. For list tools a compact one-liner. Quote with attribution.",
        +      "type": "string"
        +    },
        +    "tool": {
        +      "description": "Echo of the tool name that produced this object (e.g. get_service_area).",
        +      "type": "string"
        +    },
        +    "www_mcp": {
        +      "description": "https://www.ikeytz.com/mcp — sister machine for prices/FAQ/corpus",
        +      "format": "uri",
        +      "type": "string"
        +    },
        +    "www_tool": {
        +      "description": "Same tool name on www MCP that holds the real payload",
        +      "type": "string"
        +    }
        +  },
        +  "required": [
        +    "ok",
        +    "tool",
        +    "attribution"
        +  ],
        +  "type": "object"
        +}
    • Changedlist_slugs3 fields changed
      • addedInput schema / additionalProperties
        Added value: +false
      • addedInput schema / description
        Added value: +"This tool takes no arguments. Call tools/call with arguments: {}. Extra keys are ignored."
      • changedOutput schema / (root)
        Previous value: -nullNew value: +{
        +  "additionalProperties": true,
        +  "description": "Always the same envelope. tools/call returns content[0].text = summary (or JSON) AND structuredContent = this object. On success ok=true with summary + canonicalUrl + extra fields. On failure ok=false with error (snake_case code) and hint (recovery URL). Never writes, never submits forms, never books. Attribution must be kept when quoting. Policy: ai-input yes with attribution; ai-train=no. Host is maps.ikeytz.com (geo/Einsatzgebiet). Prices/FAQ/legal HTML live on www — maps only points.",
        +  "properties": {
        +    "attribution": {
        +      "description": "Required citation: 'Quelle: Schlüsseldienst Ludwigsburg ikeytz (ikeytz.com) · ai-train=no · https://maps.ikeytz.com/.well-known/ai.txt'",
        +      "type": "string"
        +    },
        +    "canonicalUrl": {
        +      "description": "Best URL to show the user: https://maps.ikeytz.com… page, public embed JSON, tel:+49…, mailto:…, https://wa.me/…, or a www pointer. Prefer this over constructing URLs.",
        +      "type": "string"
        +    },
        +    "count": {
        +      "description": "52",
        +      "type": "number"
        +    },
        +    "error": {
        +      "description": "Present when ok=false. Codes include: unknown_place, unknown_discovery, unknown_doc, q_required, plz_required, coords_required, outside_service_area, url_required, not_maps_host, bad_url, path_or_url_required, serp_not_found, slug_or_coords_required, path_required.",
        +      "type": "string"
        +    },
        +    "hint": {
        +      "description": "Present when ok=false. Absolute URL or short recovery hint the agent should open or pass to another tool.",
        +      "type": "string"
        +    },
        +    "items": {
        +      "description": "Slug strings",
        +      "items": {
        +        "type": "string"
        +      },
        +      "type": "array"
        +    },
        +    "locale": {
        +      "description": "Locale actually used for URLs. maps is German-only: always de (MAPS-E8 — no /en on maps). Requested non-de is ignored; payload locale=de.",
        +      "enum": [
        +        "de"
        +      ],
        +      "type": "string"
        +    },
        +    "ok": {
        +      "description": "true = use summary, canonicalUrl, and extra keys. false = do not invent data; read error + hint and retry with valid args or open hint.",
        +      "type": "boolean"
        +    },
        +    "related": {
        +      "description": "Always includes https://maps.ikeytz.com/llms.txt.",
        +      "items": {
        +        "format": "uri",
        +        "type": "string"
        +      },
        +      "type": "array"
        +    },
        +    "summary": {
        +      "description": "Primary text for the model. For discovery tools this is the file window. For list tools a compact one-liner. Quote with attribution.",
        +      "type": "string"
        +    },
        +    "tool": {
        +      "description": "Echo of the tool name that produced this object (e.g. get_service_area).",
        +      "type": "string"
        +    }
        +  },
        +  "required": [
        +    "ok",
        +    "tool",
        +    "attribution"
        +  ],
        +  "type": "object"
        +}
    • Changedlist_whatsapp_options4 fields changed
      • addedInput schema / properties / locale / default
        Added value: +"de"
      • addedInput schema / properties / locale / description
        Added value: +"maps is German-only (de). Omit or pass de. Other values are ignored; URLs stay https://maps.ikeytz.com/… with no locale prefix. Not a www multi-locale switch — use @ikeytz/mcp list_locales on www for en|fr|ru|fa|ar|tr."
      • addedInput schema / properties / locale / enum
        Added value: +[
        +  "de"
        +]
      • changedOutput schema / (root)
        Previous value: -nullNew value: +{
        +  "additionalProperties": true,
        +  "description": "Always the same envelope. tools/call returns content[0].text = summary (or JSON) AND structuredContent = this object. On success ok=true with summary + canonicalUrl + extra fields. On failure ok=false with error (snake_case code) and hint (recovery URL). Never writes, never submits forms, never books. Attribution must be kept when quoting. Policy: ai-input yes with attribution; ai-train=no. Host is maps.ikeytz.com (geo/Einsatzgebiet). Prices/FAQ/legal HTML live on www — maps only points.",
        +  "properties": {
        +    "attribution": {
        +      "description": "Required citation: 'Quelle: Schlüsseldienst Ludwigsburg ikeytz (ikeytz.com) · ai-train=no · https://maps.ikeytz.com/.well-known/ai.txt'",
        +      "type": "string"
        +    },
        +    "canonicalUrl": {
        +      "description": "Best URL to show the user: https://maps.ikeytz.com… page, public embed JSON, tel:+49…, mailto:…, https://wa.me/…, or a www pointer. Prefer this over constructing URLs.",
        +      "type": "string"
        +    },
        +    "error": {
        +      "description": "Present when ok=false. Codes include: unknown_place, unknown_discovery, unknown_doc, q_required, plz_required, coords_required, outside_service_area, url_required, not_maps_host, bad_url, path_or_url_required, serp_not_found, slug_or_coords_required, path_required.",
        +      "type": "string"
        +    },
        +    "hint": {
        +      "description": "Present when ok=false. Absolute URL or short recovery hint the agent should open or pass to another tool.",
        +      "type": "string"
        +    },
        +    "items": {
        +      "description": "Options {id,label,href}",
        +      "items": {
        +        "properties": {
        +          "href": {
        +            "format": "uri",
        +            "type": "string"
        +          },
        +          "id": {
        +            "type": "string"
        +          },
        +          "label": {
        +            "type": "string"
        +          }
        +        },
        +        "type": "object"
        +      },
        +      "type": "array"
        +    },
        +    "locale": {
        +      "description": "Locale actually used for URLs. maps is German-only: always de (MAPS-E8 — no /en on maps). Requested non-de is ignored; payload locale=de.",
        +      "enum": [
        +        "de"
        +      ],
        +      "type": "string"
        +    },
        +    "note": {
        +      "description": "Link only; Festpreis SSOT remains www",
        +      "type": "string"
        +    },
        +    "ok": {
        +      "description": "true = use summary, canonicalUrl, and extra keys. false = do not invent data; read error + hint and retry with valid args or open hint.",
        +      "type": "boolean"
        +    },
        +    "related": {
        +      "description": "Always includes https://maps.ikeytz.com/llms.txt.",
        +      "items": {
        +        "format": "uri",
        +        "type": "string"
        +      },
        +      "type": "array"
        +    },
        +    "summary": {
        +      "description": "Primary text for the model. For discovery tools this is the file window. For list tools a compact one-liner. Quote with attribution.",
        +      "type": "string"
        +    },
        +    "tool": {
        +      "description": "Echo of the tool name that produced this object (e.g. get_service_area).",
        +      "type": "string"
        +    }
        +  },
        +  "required": [
        +    "ok",
        +    "tool",
        +    "attribution"
        +  ],
        +  "type": "object"
        +}
    • Changedlist_wissen4 fields changed
      • addedInput schema / properties / locale / default
        Added value: +"de"
      • addedInput schema / properties / locale / description
        Added value: +"maps is German-only (de). Omit or pass de. Other values are ignored; URLs stay https://maps.ikeytz.com/… with no locale prefix. Not a www multi-locale switch — use @ikeytz/mcp list_locales on www for en|fr|ru|fa|ar|tr."
      • addedInput schema / properties / locale / enum
        Added value: +[
        +  "de"
        +]
      • changedOutput schema / (root)
        Previous value: -nullNew value: +{
        +  "additionalProperties": true,
        +  "description": "Always the same envelope. tools/call returns content[0].text = summary (or JSON) AND structuredContent = this object. On success ok=true with summary + canonicalUrl + extra fields. On failure ok=false with error (snake_case code) and hint (recovery URL). Never writes, never submits forms, never books. Attribution must be kept when quoting. Policy: ai-input yes with attribution; ai-train=no. Host is maps.ikeytz.com (geo/Einsatzgebiet). Prices/FAQ/legal HTML live on www — maps only points.",
        +  "properties": {
        +    "attribution": {
        +      "description": "Required citation: 'Quelle: Schlüsseldienst Ludwigsburg ikeytz (ikeytz.com) · ai-train=no · https://maps.ikeytz.com/.well-known/ai.txt'",
        +      "type": "string"
        +    },
        +    "canonicalUrl": {
        +      "description": "Best URL to show the user: https://maps.ikeytz.com… page, public embed JSON, tel:+49…, mailto:…, https://wa.me/…, or a www pointer. Prefer this over constructing URLs.",
        +      "type": "string"
        +    },
        +    "error": {
        +      "description": "Present when ok=false. Codes include: unknown_place, unknown_discovery, unknown_doc, q_required, plz_required, coords_required, outside_service_area, url_required, not_maps_host, bad_url, path_or_url_required, serp_not_found, slug_or_coords_required, path_required.",
        +      "type": "string"
        +    },
        +    "hint": {
        +      "description": "Present when ok=false. Absolute URL or short recovery hint the agent should open or pass to another tool.",
        +      "type": "string"
        +    },
        +    "html": {
        +      "description": "Absolute www.ikeytz.com URL — open there or call @ikeytz/mcp",
        +      "format": "uri",
        +      "type": "string"
        +    },
        +    "locale": {
        +      "description": "Locale actually used for URLs. maps is German-only: always de (MAPS-E8 — no /en on maps). Requested non-de is ignored; payload locale=de.",
        +      "enum": [
        +        "de"
        +      ],
        +      "type": "string"
        +    },
        +    "note": {
        +      "description": "maps only points; Volltext/Preise/FAQ live on www",
        +      "type": "string"
        +    },
        +    "npm": {
        +      "description": "www CLI package @ikeytz/mcp",
        +      "type": "string"
        +    },
        +    "ok": {
        +      "description": "true = use summary, canonicalUrl, and extra keys. false = do not invent data; read error + hint and retry with valid args or open hint.",
        +      "type": "boolean"
        +    },
        +    "related": {
        +      "description": "Always includes https://maps.ikeytz.com/llms.txt.",
        +      "items": {
        +        "format": "uri",
        +        "type": "string"
        +      },
        +      "type": "array"
        +    },
        +    "requested_locale": {
        +      "description": "Locale the caller asked for; maps still returns locale=de",
        +      "type": "string"
        +    },
        +    "summary": {
        +      "description": "Primary text for the model. For discovery tools this is the file window. For list tools a compact one-liner. Quote with attribution.",
        +      "type": "string"
        +    },
        +    "tool": {
        +      "description": "Echo of the tool name that produced this object (e.g. get_service_area).",
        +      "type": "string"
        +    },
        +    "www_mcp": {
        +      "description": "https://www.ikeytz.com/mcp — sister machine for prices/FAQ/corpus",
        +      "format": "uri",
        +      "type": "string"
        +    },
        +    "www_tool": {
        +      "description": "Same tool name on www MCP that holds the real payload",
        +      "type": "string"
        +    }
        +  },
        +  "required": [
        +    "ok",
        +    "tool",
        +    "attribution"
        +  ],
        +  "type": "object"
        +}
    • Changedresolve_locale_url3 fields changed
      • addedInput schema / properties / locale / description
        Added value: +"Required. Only de is meaningful on maps; others ignored with a note."
      • addedInput schema / properties / path / description
        Added value: +"Required. Path starting with / (e.g. /pattonville) or a maps URL."
      • changedOutput schema / (root)
        Previous value: -nullNew value: +{
        +  "additionalProperties": true,
        +  "description": "Always the same envelope. tools/call returns content[0].text = summary (or JSON) AND structuredContent = this object. On success ok=true with summary + canonicalUrl + extra fields. On failure ok=false with error (snake_case code) and hint (recovery URL). Never writes, never submits forms, never books. Attribution must be kept when quoting. Policy: ai-input yes with attribution; ai-train=no. Host is maps.ikeytz.com (geo/Einsatzgebiet). Prices/FAQ/legal HTML live on www — maps only points.",
        +  "properties": {
        +    "attribution": {
        +      "description": "Required citation: 'Quelle: Schlüsseldienst Ludwigsburg ikeytz (ikeytz.com) · ai-train=no · https://maps.ikeytz.com/.well-known/ai.txt'",
        +      "type": "string"
        +    },
        +    "canonicalUrl": {
        +      "description": "Best URL to show the user: https://maps.ikeytz.com… page, public embed JSON, tel:+49…, mailto:…, https://wa.me/…, or a www pointer. Prefer this over constructing URLs.",
        +      "type": "string"
        +    },
        +    "error": {
        +      "description": "Present when ok=false. Codes include: unknown_place, unknown_discovery, unknown_doc, q_required, plz_required, coords_required, outside_service_area, url_required, not_maps_host, bad_url, path_or_url_required, serp_not_found, slug_or_coords_required, path_required.",
        +      "type": "string"
        +    },
        +    "hint": {
        +      "description": "Present when ok=false. Absolute URL or short recovery hint the agent should open or pass to another tool.",
        +      "type": "string"
        +    },
        +    "html": {
        +      "description": "Present when falling through to www pointer",
        +      "type": "string"
        +    },
        +    "locale": {
        +      "const": "de",
        +      "type": "string"
        +    },
        +    "note": {
        +      "type": "string"
        +    },
        +    "ok": {
        +      "description": "true = use summary, canonicalUrl, and extra keys. false = do not invent data; read error + hint and retry with valid args or open hint.",
        +      "type": "boolean"
        +    },
        +    "path": {
        +      "description": "Normalized path",
        +      "type": "string"
        +    },
        +    "related": {
        +      "description": "Always includes https://maps.ikeytz.com/llms.txt.",
        +      "items": {
        +        "format": "uri",
        +        "type": "string"
        +      },
        +      "type": "array"
        +    },
        +    "requested_locale": {
        +      "type": "string"
        +    },
        +    "slug": {
        +      "description": "When a Gebiet matched",
        +      "type": "string"
        +    },
        +    "summary": {
        +      "description": "Primary text for the model. For discovery tools this is the file window. For list tools a compact one-liner. Quote with attribution.",
        +      "type": "string"
        +    },
        +    "tool": {
        +      "description": "Echo of the tool name that produced this object (e.g. get_service_area).",
        +      "type": "string"
        +    }
        +  },
        +  "required": [
        +    "ok",
        +    "tool",
        +    "attribution"
        +  ],
        +  "type": "object"
        +}
    • Changedresolve_maps_url4 fields changed
      • addedInput schema / properties / path / description
        Added value: +"Path e.g. /pattonville"
      • addedInput schema / properties / q / description
        Added value: +"URL or path alias"
      • addedInput schema / properties / url / description
        Added value: +"Full https://maps.ikeytz.com/… URL"
      • changedOutput schema / (root)
        Previous value: -nullNew value: +{
        +  "additionalProperties": true,
        +  "description": "Always the same envelope. tools/call returns content[0].text = summary (or JSON) AND structuredContent = this object. On success ok=true with summary + canonicalUrl + extra fields. On failure ok=false with error (snake_case code) and hint (recovery URL). Never writes, never submits forms, never books. Attribution must be kept when quoting. Policy: ai-input yes with attribution; ai-train=no. Host is maps.ikeytz.com (geo/Einsatzgebiet). Prices/FAQ/legal HTML live on www — maps only points.",
        +  "properties": {
        +    "attribution": {
        +      "description": "Required citation: 'Quelle: Schlüsseldienst Ludwigsburg ikeytz (ikeytz.com) · ai-train=no · https://maps.ikeytz.com/.well-known/ai.txt'",
        +      "type": "string"
        +    },
        +    "canonicalUrl": {
        +      "description": "Best URL to show the user: https://maps.ikeytz.com… page, public embed JSON, tel:+49…, mailto:…, https://wa.me/…, or a www pointer. Prefer this over constructing URLs.",
        +      "type": "string"
        +    },
        +    "embed_map": {
        +      "format": "uri",
        +      "type": "string"
        +    },
        +    "error": {
        +      "description": "Present when ok=false. Codes include: unknown_place, unknown_discovery, unknown_doc, q_required, plz_required, coords_required, outside_service_area, url_required, not_maps_host, bad_url, path_or_url_required, serp_not_found, slug_or_coords_required, path_required.",
        +      "type": "string"
        +    },
        +    "hint": {
        +      "description": "Present when ok=false. Absolute URL or short recovery hint the agent should open or pass to another tool.",
        +      "type": "string"
        +    },
        +    "kind": {
        +      "description": "Resolved kind",
        +      "enum": [
        +        "hub",
        +        "ort"
        +      ],
        +      "type": "string"
        +    },
        +    "lat": {
        +      "type": "number"
        +    },
        +    "lng": {
        +      "type": "number"
        +    },
        +    "locale": {
        +      "description": "Locale actually used for URLs. maps is German-only: always de (MAPS-E8 — no /en on maps). Requested non-de is ignored; payload locale=de.",
        +      "enum": [
        +        "de"
        +      ],
        +      "type": "string"
        +    },
        +    "name": {
        +      "description": "Place name when ort",
        +      "type": "string"
        +    },
        +    "ok": {
        +      "description": "true = use summary, canonicalUrl, and extra keys. false = do not invent data; read error + hint and retry with valid args or open hint.",
        +      "type": "boolean"
        +    },
        +    "plz": {
        +      "type": "string"
        +    },
        +    "related": {
        +      "description": "Always includes https://maps.ikeytz.com/llms.txt.",
        +      "items": {
        +        "format": "uri",
        +        "type": "string"
        +      },
        +      "type": "array"
        +    },
        +    "slug": {
        +      "description": "null for hub",
        +      "type": [
        +        "string",
        +        "null"
        +      ]
        +    },
        +    "summary": {
        +      "description": "Primary text for the model. For discovery tools this is the file window. For list tools a compact one-liner. Quote with attribution.",
        +      "type": "string"
        +    },
        +    "tool": {
        +      "description": "Echo of the tool name that produced this object (e.g. get_service_area).",
        +      "type": "string"
        +    }
        +  },
        +  "required": [
        +    "ok",
        +    "tool",
        +    "attribution"
        +  ],
        +  "type": "object"
        +}
    • Changedsite_overview4 fields changed
      • addedInput schema / properties / locale / default
        Added value: +"de"
      • addedInput schema / properties / locale / description
        Added value: +"maps is German-only (de). Omit or pass de. Other values are ignored; URLs stay https://maps.ikeytz.com/… with no locale prefix. Not a www multi-locale switch — use @ikeytz/mcp list_locales on www for en|fr|ru|fa|ar|tr."
      • addedInput schema / properties / locale / enum
        Added value: +[
        +  "de"
        +]
      • changedOutput schema / (root)
        Previous value: -nullNew value: +{
        +  "additionalProperties": true,
        +  "description": "Always the same envelope. tools/call returns content[0].text = summary (or JSON) AND structuredContent = this object. On success ok=true with summary + canonicalUrl + extra fields. On failure ok=false with error (snake_case code) and hint (recovery URL). Never writes, never submits forms, never books. Attribution must be kept when quoting. Policy: ai-input yes with attribution; ai-train=no. Host is maps.ikeytz.com (geo/Einsatzgebiet). Prices/FAQ/legal HTML live on www — maps only points.",
        +  "properties": {
        +    "attribution": {
        +      "description": "Required citation: 'Quelle: Schlüsseldienst Ludwigsburg ikeytz (ikeytz.com) · ai-train=no · https://maps.ikeytz.com/.well-known/ai.txt'",
        +      "type": "string"
        +    },
        +    "brand": {
        +      "type": "string"
        +    },
        +    "canonicalUrl": {
        +      "description": "Best URL to show the user: https://maps.ikeytz.com… page, public embed JSON, tel:+49…, mailto:…, https://wa.me/…, or a www pointer. Prefer this over constructing URLs.",
        +      "type": "string"
        +    },
        +    "count": {
        +      "description": "52",
        +      "type": "number"
        +    },
        +    "error": {
        +      "description": "Present when ok=false. Codes include: unknown_place, unknown_discovery, unknown_doc, q_required, plz_required, coords_required, outside_service_area, url_required, not_maps_host, bad_url, path_or_url_required, serp_not_found, slug_or_coords_required, path_required.",
        +      "type": "string"
        +    },
        +    "h1": {
        +      "type": "string"
        +    },
        +    "hint": {
        +      "description": "Present when ok=false. Absolute URL or short recovery hint the agent should open or pass to another tool.",
        +      "type": "string"
        +    },
        +    "legalName": {
        +      "type": "string"
        +    },
        +    "locale": {
        +      "description": "Locale actually used for URLs. maps is German-only: always de (MAPS-E8 — no /en on maps). Requested non-de is ignored; payload locale=de.",
        +      "enum": [
        +        "de"
        +      ],
        +      "type": "string"
        +    },
        +    "mcp": {
        +      "format": "uri",
        +      "type": "string"
        +    },
        +    "note": {
        +      "type": "string"
        +    },
        +    "ok": {
        +      "description": "true = use summary, canonicalUrl, and extra keys. false = do not invent data; read error + hint and retry with valid args or open hint.",
        +      "type": "boolean"
        +    },
        +    "owner": {
        +      "type": "string"
        +    },
        +    "registry": {
        +      "description": "com.ikeytz/maps",
        +      "type": "string"
        +    },
        +    "related": {
        +      "description": "Always includes https://maps.ikeytz.com/llms.txt.",
        +      "items": {
        +        "format": "uri",
        +        "type": "string"
        +      },
        +      "type": "array"
        +    },
        +    "requested_locale": {
        +      "type": "string"
        +    },
        +    "sister": {
        +      "description": "www MCP / npm hint",
        +      "type": "string"
        +    },
        +    "summary": {
        +      "description": "Primary text for the model. For discovery tools this is the file window. For list tools a compact one-liner. Quote with attribution.",
        +      "type": "string"
        +    },
        +    "title": {
        +      "type": "string"
        +    },
        +    "tool": {
        +      "description": "Echo of the tool name that produced this object (e.g. get_service_area).",
        +      "type": "string"
        +    },
        +    "walkIn": {
        +      "type": "boolean"
        +    }
        +  },
        +  "required": [
        +    "ok",
        +    "tool",
        +    "attribution"
        +  ],
        +  "type": "object"
        +}

Publisher details

Operator
ikeytz - Schlüsseldienst Ludwigsburg · Mahmud Reza Kashani · Publisher source
Vendor relationship
First-party · Publisher source
Trust center
Unknown
Restrictions
Public read-only. No API key. No forms. ai-train=no. · Publisher source

Related MCP Connectors

Related MCP Servers

  • A
    license
    Not graded
    quality
    F
    maintenance
    Read-only MCP server for Kan's FxTwitter API proxy, enabling public X/Twitter search and retrieval.
    MIT
  • F
    license
    Not graded
    quality
    C
    maintenance
    Read-only MCP server for AI clients to browse and search project files securely, with configurable permissions, virtual paths, and key-based access.
    -
Try in Browser

Glama MCP Gateway

Add one secure layer between your agents and this server.

Resources