Skip to main content
Glama

ikeytz Einsatzgebiet-Karten

Server Details

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

If you are the author of this connector, you can claim ownership with GitHub, an HTTP challenge, or a DNS record. Claimed connector authors can inspect health checks, view analytics, and manage their listing.
Status
Healthy
Last Tested
Transport
Streamable HTTP
URL

Available Tools

67 tools
compose_mailtoA
Read-only
Inspect

WHAT: mailto:info@ikeytz.com plus mapsEmail info@maps.ikeytz.com (mapsHref). Call with {}. USE for email CTAs. DOES NOT send mail. NEXT: get_contact, list_footer.

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/5.0
Behavior4/5

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

Annotations already declare readOnlyHint=true, and the description reinforces this with 'DOES NOT send mail' while adding real context beyond the annotation: the exact content yielded (two email addresses, with one surfaced as mapsHref). This is genuinely useful because the compose_* verb could otherwise imply sending. No contradiction with annotations.

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

Conciseness4/5

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

Roughly 20 words, dense and front-loaded: resource, usage, exclusion, next steps in a fixed WHAT/USE/DOES NOT/NEXT pattern. Every clause earns its place. The telegraphic style trades a little readability for compactness but remains scannable.

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-argument compose helper with an output schema present, the description covers all call-relevant facts: the exact addresses, when to use it, that it does not transmit mail, and suggested next calls. Return-shape details are already owned by the output schema, so nothing needed to select or invoke 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?

With zero parameters, the input schema is already exhaustive, so baseline 4 applies. 'Call with {}' restates the no-arg invocation and confirms no hidden arguments exist, which is all the description needs to add. Schema coverage at 100% leaves no param semantics gap.

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:' line identifies the exact resources produced — mailto:info@ikeytz.com and the mapsEmail variant info@maps.ikeytz.com — and 'USE for email CTAs' ties it to a concrete purpose. The name compose_mailto alongside compose_tel_landline/compose_tel_mobile/compose_whatsapp siblings pins down the email channel. It lacks an explicit behavioral verb like 'returns' or 'builds', but an agent can infer the tool supplies email contact data.

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 email CTAs' explicitly states the intended scenario, and 'DOES NOT send mail' is a clear exclusion that prevents misuse when actual sending is needed. It doesn't name alternatives like compose_whatsapp, but sibling names plus the CTA context make the boundary legible. 'NEXT: get_contact, list_footer' adds useful follow-up flow guidance.

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

compose_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.3/5.0
Behavior3/5

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

Annotations already declare readOnlyHint=true, so the read-only behavior is covered. The description adds the return shape ('RETURNS href + display') and the no-argument call style, but does not add richer behavioral context such as what the link is intended for beyond a CTA.

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

Conciseness5/5

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

The description is compact and front-loaded with WHAT, RETURNS, USE, and NEXT. Every segment delivers a distinct piece of information 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?

For a zero-argument read-only tool with an output schema, the description covers the purpose, usage context, return value, and related sibling. Nothing essential is missing for an agent to select and invoke this tool 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 has zero parameters and the schema already documents this with 100% coverage. The description's 'Call with {}' reinforces that no arguments are needed, which is sufficient given there are no meaningful parameter semantics to define.

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

Purpose5/5

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

The description opens with 'WHAT: tel: href for the public landline,' which names a specific resource and format of output. It also signals the sibling distinction by saying 'public landline' and points to compose_tel_mobile as the next tool.

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 description gives clear context by stating 'USE as secondary call CTA' and alludes to the mobile alternative with 'NEXT: compose_tel_mobile.' It does not explicitly state when not to use it, but the landline versus mobile distinction provides workable guidance.

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

compose_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.5/5.0
Behavior4/5

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

The annotations already declare readOnlyHint=true. The description adds valuable non-obvious behavior: 'DOES NOT place the call' and 'RETURNS href + display', clarifying that this only composes a link and has no dialing side effects. This goes beyond the annotation without contradicting it.

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

Conciseness5/5

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

The description uses a compact, labeled format (WHAT, RETURNS, USE, DOES NOT, NEXT) that front-loads the core purpose and keeps each sentence meaningful. There is no filler or redundant restating of the schema.

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 zero-argument, read-only tool with an output schema, this description covers everything needed: what it returns, how to use it, what it does not do, and where to go next. The output schema already defines the return value structure, so no additional return documentation is needed.

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 has zero parameters and the schema already documents this with 100% coverage, including 'Call with {}'. The description reinforces the empty-call convention. With no parameters, the baseline of 4 is appropriate; there is nothing more to explain.

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

Purpose5/5

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

The description states the exact deliverable ('tel: href for the public mobile number'), the returned data ('href + display'), and its role as the primary call CTA. It also names distinct siblings via the NEXT line, making it easy to differentiate from compose_tel_landline and list_whatsapp_options.

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 context ('USE as the primary call CTA') and suggests follow-up tools with NEXT, which implies the caller should decide between mobile, landline, and WhatsApp. It does not explicitly state when NOT to use this tool, but the placement and naming of siblings provide adequate guidance.

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

compose_whatsappA
Read-only
Inspect

WHAT: wa.me link. Optional option=zugefallen|abgeschlossen|zylinder|beratung (or list_whatsapp_options ids). Link only — no form. USE to open WhatsApp with a prefab. NEXT: compose_mailto, get_contact.

ParametersJSON Schema
NameRequiredDescriptionDefault
optionNoOptional situation id: zugefallen|abgeschlossen|zylinder|beratung (or ids from list_whatsapp_options).

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.
optionNoEchoed option
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.9/5.0
Behavior4/5

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

The annotation readOnlyHint=true already establishes the safety profile, and the description adds meaningful behavior beyond it: 'Link only — no form' clarifies the tool produces a link and performs no sending or UI rendering. This is consistent with the readOnlyHint annotation, so no contradiction 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?

Five short labeled clauses (WHAT, option, Link only, USE, NEXT) each carry distinct information: core purpose, parameter, behavioral caveat, use case, and follow-up routing. There is no filler, and the most essential facts are front-loaded. The label-shorthand style is slightly unconventional but economical.

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 simple tool with one optional parameter, a readOnlyHint, and an output schema, the description covers purpose, parameter semantics, behavioral scope, and use case. The only notable gap is that it never states the default behavior when option is omitted, though the schema's 'Optional' flag partially mitigates this.

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 description's parameter text (zugefallen|abgeschlossen|zylinder|beratung, or list_whatsapp_options ids) nearly duplicates the schema's own description. Per the baseline rule for high coverage, 3 is appropriate — the description adds no real semantic value beyond the structured 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 identifies the resource ('wa.me link') and the action ('open WhatsApp with a prefab'), and its channel-specific wording distinguishes it from the compose_* siblings (compose_mailto, compose_tel_landline, compose_tel_mobile). It loses a point because 'WHAT: wa.me link' is a noun phrase rather than a clean verb+resource statement, leaving the purpose to be inferred from telegraphic shorthand.

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 open WhatsApp with a prefab' explicitly states the intended use case, and 'NEXT: compose_mailto, get_contact' routes the agent to related follow-up tools. However, there are no explicit exclusion rules telling the agent when NOT to use this tool versus those alternatives, so it stops short of the full when/when-not guidance a 5 requires.

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

distance_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.7/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 adds valuable behavioral context: the result is air distance, not driving distance; no routing occurs; and the response contains from, office, and distance_km. This goes well beyond the safety annotation.

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

Conciseness5/5

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

The description is compact, keyword-labeled, and front-loaded with the core behavior. Every sentence earns its place: input types, output fields, usage intent, routing limitation, and suggested next tools.

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?

Combined with a fully documented schema, an output schema, and a read-only annotation, this description covers inputs, outputs, limitations, and alternatives. An agent has everything needed to call it correctly and to avoid misusing it for driving-time calculations.

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

Parameters3/5

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

Schema description coverage is 100%, so the schema already documents each parameter precisely. The description groups them into 'Gebiet (slug|plz|name) or lat/lng/icbm' but does not add new meaning beyond that grouping.

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: computes air distance in km from a Gebiet or lat/lng/icbm to the Gewerbesitz. It also distinguishes itself as a rough-proximity tool rather than a routing tool, separating it from sibling geo 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?

'USE for rough proximity — not driving time' explicitly states when to use the tool and what it is not for. 'DOES NOT route via OSRM' and 'NEXT: get_geo_office, find_by_geo' give the agent an actionable reason to choose this tool or move to a sibling.

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

find_by_areaA
Read-only
Inspect

WHAT: Alias of find_by_gebiet — multi-match by q/name/slug. Same inputs and outputs. USE when the agent prefers 'area' naming. 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.

TDQS

A4/5.0
Behavior4/5

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

With readOnlyHint=true, the description does not need to restate safety, and it adds 'multi-match by q/name/slug' and 'same inputs and outputs' as behavioral context. It stays consistent with the annotation and contributes useful matching behavior.

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/NEXT structure is compact, front-loaded, and every sentence provides a distinct piece of information. No filler or repetition.

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 the output schema, readOnly annotation, and the explicit alias to find_by_gebiet, the remaining context (what find_by_gebiet returns, how matches are ordered) is delegated to the sibling and output schema. That is sufficient for selecting and invoking the tool, though slightly less self-contained.

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, name, and slug thoroughly. The description merely lists the same parameter names without adding new meaning, 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 identifies the tool as an alias of find_by_gebiet and specifies the query dimensions (q/name/slug) and multi-match behavior, so an agent can tell what it does. It does not fully define 'area' or the result semantics on its own, leaning on the sibling's definition, which prevents a 5.

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 when to choose this tool: when the agent prefers 'area' naming, and points to next tools. It does not explicitly state when not to use it or contrast with other find_by_* siblings beyond the alias relation.

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

find_by_gebietA
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.

TDQS

A4.4/5.0
Behavior4/5

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

The readOnlyHint annotation already communicates safety, so the description adds useful behavior beyond it: substring matching, multi-match results, umlaut tolerance, and no necessity for an exact slug. It discloses that the tool returns all matching point cards rather than a single exact hit. This exceeds the annotation's minimal coverage.

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

Conciseness5/5

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

The description is tightly structured with concise labels (WHAT, RETURNS, USE, DOES NOT, NEXT) and front-loads the core purpose. Every sentence contributes value, and there is no redundant repetition of schema content. It is both compact and highly scannable.

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 the output schema, readOnly annotation, and straightforward parameter list, the description covers the tool's purpose, usage, behavioral expectations, and next steps. Minor gaps like behavior when no parameters are supplied or direct alternatives among the find_by_* siblings are not addressed, but these are secondary for a fuzzy search tool.

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

Parameters4/5

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

Schema coverage is 100%, so the baseline is 3, and the description adds meaningful semantics by framing all three parameters as fuzzy, substring-based search inputs and emphasizing multi-match behavior. It clarifies that exact slug matching is not required, which is not directly stated in the schema. This provides additional operational meaning beyond the field-level 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?

The description clearly identifies a specific resource (Gebiete) and operation (multi-match search by q, name, or slug), stating it returns all matching point cards. It distinguishes itself by emphasizing substring matching, umlaut tolerance, and the lack of an exact slug requirement. This is specific enough to tell it apart from the many sibling find_by_* 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?

The description gives a clear usage context ('USE for fuzzy place names') and asserts a key exclusion ('DOES NOT require exact slug'). It also suggests follow-up tools (get_service_area, get_grenze) via 'NEXT'. It does not explicitly contrast with find_by_plz or find_by_keyword, but it provides sufficient contextual guidance for when to choose this tool.

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

find_by_geoA
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.

TDQS

A4.9/5.0
Behavior5/5

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

Beyond the readOnlyHint annotation, the description discloses key edge behavior: '(0,0) and far points → ok=false outside_service_area' and the return field 'distance_km'. It also clarifies ordering semantics ('nearest N') and that routing is not supported.

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

Conciseness5/5

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

The description is compact and front-loaded with labeled sections ('WHAT', 'RETURNS', 'USE', 'DOES NOT', 'NEXT'), making it easy to scan. Every sentence adds value, and there is no redundant filler.

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

Completeness5/5

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

Given the read-only annotation, complete schema descriptions, and presence of an output schema, the description covers the essential behavior, parameter interactions, edge cases, and usage guidance. No critical operational information appears missing for an agent to select and invoke the tool 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 schema already covers 100% of parameters in detail. The description adds interaction semantics by explaining 'Optional radius_km; else nearest N (limit, default 5)' and linking coordinates to the outside_service_area edge case, which goes beyond the schema 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?

The description clearly states the action ('Rank Einsatzgebiete by lat/lng (or icbm)') and the resource being queried. The 'RETURNS items with distance_km' statement makes the purpose concrete and distinguishes it from sibling tools like find_by_plz or find_by_area.

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

Usage Guidelines5/5

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

It explicitly says 'USE for "near this coordinate"' and 'DOES NOT route or drive-time', which tells the agent when to choose this tool and what it will not do. The 'NEXT:' list also points to related tools, providing helpful routing context.

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

find_by_google_mapsA
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.

TDQS

A4.2/5.0
Behavior4/5

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

Beyond the readOnlyHint annotation, the description discloses the special (0,0) → outside_service_area behavior and the ranking equivalence with find_by_geo. This gives agents useful behavioral context for interpreting results that annotations alone do not provide.

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

Conciseness5/5

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

The description is compact and well-structured with 'WHAT:', 'USE when', and 'NEXT:' labels. Every sentence earns its place, front-loading the core action before edge cases and suggested follow-ups.

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 fully documented schema and an output schema, the description covers the key usage context, special-case behavior, and next steps. Its only minor gap is not disambiguating from find_by_icbm when raw ICBM coordinates are pasted, but it is otherwise complete for the stated Maps pin scenario.

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 description is not burdened with documenting parameters. It does restate the q/icbm/lat/lng alternatives in prose, but adds minimal new meaning beyond the schema's own 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?

The description states a specific verb and resource: 'Paste Google Maps / ICBM coordinates' yields 'nearest ikeytz Gebiete'. It also distinguishes itself by noting the same ranking as find_by_geo and the (0,0) edge case, making it clear which coordinate-paste scenario this tool handles.

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 description explicitly says 'USE when the user pastes a Maps pin', providing a clear trigger condition. It does not, however, explicitly state when not to use it or compare to closely related siblings like find_by_icbm or find_by_geo beyond the ranking note.

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

find_by_icbmA
Read-only
Inspect

WHAT: Same as find_by_geo but prefers icbm string 'lat, lng'. Optional lat/lng/radius_km/limit. (0,0) → outside_service_area. USE when the user pastes ICBM metadata. NEXT: 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.

TDQS

A3.6/5.0
Behavior3/5

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

Annotations already declare readOnlyHint=true, so the description does not need to cover safety. It adds some behavioral context beyond annotations, such as preferring the ICBM string when both forms are supplied and the '(0,0) → outside_service_area' special case, though '(0,0)' is also present in the schema. The behavior is not richly described, but it is adequate for a read-only 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.

Conciseness4/5

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

The description is compact and skimmable, using labeled fragments (WHAT/USE/NEXT) that front-load the core purpose and trigger. It earns its length, though 'Same as find_by_geo' is not fully self-contained and shifts some burden onto the sibling's definition.

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 tool with five optional parameters, full schema coverage, an output schema, and a read-only annotation, the description covers the essential selection trigger and special edge case. It could say more about what the tool returns or which sibling to use for plain lat/lng, but the provided information is sufficient for correct tool selection in most cases.

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. The description repeats the parameter list and adds the priority of ICBM over lat/lng, but provides no substantially new meaning beyond what the schema already conveys. Baseline of 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?

The description identifies a specific find operation with a clear input preference (ICBM 'lat, lng') and distinguishes it from the sibling find_by_geo by saying it is 'same as find_by_geo but prefers icbm string.' It does not state what entity is being found, so it relies partly on the sibling's definition, but the name and trigger make the purpose reasonably clear.

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 description gives an explicit trigger: 'USE when the user pastes ICBM metadata.' This is clear, practical guidance for selection. It does not explicitly say when not to use it or fully contrast it with find_by_geo, but the reference to find_by_geo and the input preference imply the boundary.

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

find_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.3/5.0
Behavior4/5

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

The readOnlyHint annotation already declares the read-only safety profile, so the bar is lower here. The description adds meaningful behavioral context: it targets maps llms-keywords.txt, returns keyword/url rows, applies a clamped limit, and explicitly does not search www keywords. These are non-obvious behaviors beyond annotation defaults.

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

Conciseness5/5

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

The description is tightly structured with WHAT/RETURNS/USE/DOES NOT/NEXT, and every phrase earns its place. It is short, scannable, and front-loads the most important facts before the follow-up guidance. There is no filler or repetition of schema details.

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 has an output schema, so return structure is covered elsewhere. The description covers the data source, required parameter, result shape, intended use case, non-www exclusion, and a clear next step. For a search tool with one truly required parameter, the definition is complete enough for an agent to select and invoke it correctly.

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

Parameters3/5

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

The schema description coverage is 100%, so the baseline is 3. The description confirms that q is required and that results are clamped, but it does not add meaning beyond what the rich schema already provides for q, limit, and locale. The schema itself carries the parameter documentation burden, so no penalty is warranted, but there is also no extra semantic lift.

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 uses a specific verb ('Search') plus a precise resource ('maps llms-keywords.txt (keyword → maps URL)'), immediately making the tool's job unambiguous. It also states the 'DOES NOT search www keywords' exclusion, which distinguishes it from a likely point of confusion. The format clearly communicates the verb, resource, and scope.

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 description gives an explicit use case ('USE for SEO/keyword → Gebiet page') and a clear exclusion ('DOES NOT search www keywords'). It also provides a follow-up workflow ('NEXT: get_service_area / get_embed_map'), but it does not explicitly name alternative sibling tools like find_by_geo or find_by_gebiet for when this tool is not appropriate. Still, the when-to-use guidance is concrete and useful.

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

find_by_plzA
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.

TDQS

A4.5/5.0
Behavior4/5

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

The annotation only declares readOnlyHint=true; the description adds meaningful behavioral details beyond that, such as returning all matching entries rather than just the first, and the response shape 'items[] point cards + count.' This enriches the agent's understanding of what will happen.

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

Conciseness5/5

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

The description is compact and well-structured with WHAT, RETURNS, USE, and NEXT labels. Every sentence adds a distinct piece of information, and the most important scoping detail is front-loaded.

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 simple read-only lookup with an existing output schema and full schema coverage, this description covers the essential points: what it returns, when to use it, how to specify the postcode, and what to do next. 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%, so the schema already documents plz and q well. The description's 'plz required (or q as PLZ)' restates the schema's alias relationship without adding new format, constraints, or interaction details, so it stays at the 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?

The description clearly states that the tool returns all Einsatzgebiete matching a PLZ, with the explicit caveat 'not only the first' to distinguish it from tools that might return a single result. It also names the next tool in the workflow, get_service_area(slug), for drilling into one card.

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 usage condition: 'USE when several Stadtteile share a postcode.' It also provides an alternative path with 'NEXT: get_service_area(slug) for one card,' which tells the agent when to move on to a different tool.

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

find_by_serpA
Read-only
Inspect

WHAT: Search maps llms-serp.txt blocks by q, path, url, or slug. RETURNS path/url/snippet items. 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.5/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 already covered. The description adds useful behavioral context beyond that: it searches a specific local file format rather than live HTML, and returns path/url/snippet items, giving the agent a clear expectation of scope and output granularity.

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?

Each label (WHAT, RETURNS, USE, DOES NOT, NEXT) carries distinct information with no wasted words. The description is front-loaded with the core action and purpose, then covers boundaries and alternatives efficiently.

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 search tool with an output schema and well-documented parameters, the description supplies the missing context: the data source scope, the intended use case, the no-scraping boundary, and the follow-up tool. An agent has enough to select and invoke it correctly among many find_by_* siblings.

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, url, path, slug, and limit. The description adds a compact grouping of the searchable fields but no additional parameter-level semantics beyond what the schema provides. Baseline 3 is appropriate.

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

Purpose5/5

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

States a specific verb and resource ('Search maps llms-serp.txt blocks') plus the searchable fields and the returned item shape. The description clearly differentiates from siblings by naming get_serp_snippet for full-block retrieval and noting it does not scrape 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 Guidelines5/5

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

Explicitly says when to use it ('USE for title/H1/description SERP cards on maps'), what it does not do ('DOES NOT scrape live HTML'), and names the next appropriate tool ('get_serp_snippet for one full block'). This gives an agent actionable routing guidance beyond the schema.

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

get_aboutA
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.

TDQS

A4.5/5.0
Behavior4/5

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

Annotations already declare readOnlyHint=true, so the description does not need to restate safety. It adds meaningful behavioral context: the tool is scoped to maps.ikeytz.com, returns the same core card as site_overview, and excludes the www about body. This goes beyond the annotation without contradicting it.

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 front-loads the key facts in a compact, scannable format. Every sentence contributes distinct information, and there is no filler or repetition of the schema.

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 single-optional-parameter read-only tool with schema coverage at 100% and an output schema present, the description is complete. It covers scope, exclusions, related tools, and the intended use case, leaving no critical gap for the agent to call it correctly.

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

Parameters3/5

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

Schema coverage is 100%, and the schema already documents locale fully: enum de, default de, and explanation that maps is German-only and locale is not a www switch. The description adds little parameter-level meaning beyond what the schema already provides, so the baseline score of 3 applies.

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

Purpose5/5

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

The description clearly identifies the resource ('About maps.ikeytz.com'), the intended query ('what is this host'), and the exact scope ('52 maps, not www Über-uns corpus'). It also explicitly states what the tool does NOT return, which sharply distinguishes it from related tools like site_overview and www about pages.

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 case ('what is this host'), an explicit exclusion ('DOES NOT return www about body'), and names related/next tools. It also routes the agent to list_locales when a www multi-locale switch is needed, so the agent knows when to pick a different tool.

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

get_agbA
Read-only
Inspect

WHAT: www pointer only — AGB live at www.ikeytz.com/agb. maps returns html + note, not the corpus. USE to open/hand off to www MCP. DOES NOT return AGB body text. NEXT: @ikeytz/mcp get_legal(doc=agb).

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?

Beyond the readOnlyHint annotation, the description discloses that the tool returns a pointer/html+note rather than the corpus, and that the body text is deliberately not returned. The 'maps' wording is unclear, but the core behavioral limitation is stated directly.

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 description is short and front-loaded with 'WHAT: www pointer only,' which is good. However, the compressed fragments and the unclear 'maps returns html + note' clause make it feel cryptic rather than cleanly concise.

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 that this is a zero-argument pointer tool with an output schema and a read-only annotation, the description covers the essential context: the URL, the purpose, the non-return of body text, and the alternative tool for the full document. The ambiguity around 'maps' prevents a perfect score.

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 has zero parameters and the schema already documents that no arguments are needed, so the baseline for this dimension is 4. The description adds no parameter-specific meaning, but none is needed.

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 identifies the tool as a www pointer to the AGB page at www.ikeytz.com/agb and explicitly states it does not return the AGB body text. The 'maps returns html + note, not the corpus' clause is ambiguous and slightly muddles 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 Guidelines5/5

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

It explicitly says to use this tool for opening or handing off to the www MCP, and names get_legal(doc=agb) as the next step for the actual document body. This gives the agent a clear when-to-use and when-not-to-use boundary.

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

get_ai_pageA
Read-only
Inspect

WHAT: Read maps /ai-pages/de/{slug}.txt when present; else www pointer for the path. path or slug. RETURNS text for maps AI pages. USE for agent-ready Gebiet prose. NEXT: get_service_area, get_lage.

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.7/5.0
Behavior4/5

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

Beyond the readOnlyHint annotation, the description discloses a real behavioral trait: it reads the maps file 'when present; else www pointer for the path'. It also clarifies that the return value is text. The 'www pointer' phrase is vague, but there is no annotation contradiction and the read-only nature is accurately represented.

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 labeled WHAT / RETURNS / USE / NEXT structure is compact, front-loaded, and mostly free of filler. The telegraphic style and the ambiguous 'www pointer' phrase keep it from a perfect score.

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 tool with no required parameters, an output schema, and 100% schema coverage, the description covers the target resource, fallback behavior, return type, and intended use case. The main gaps are the unexplained 'www pointer' and the absence of explicit sibling selection guidance.

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 input schema already explains path, slug, and locale in detail. The description only adds 'path or slug', which is a marginal restatement of the schema. Baseline 3 applies because the schema does the heavy lifting.

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?

Description opens with the verb 'Read' and a precise resource, 'maps /ai-pages/de/{slug}.txt', and distinguishes the tool by calling it 'maps AI pages' with 'agent-ready Gebiet prose'. It does not fully contrast with sibling tools like get_ai_txt or get_page_summary, so it stops short of a 5.

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 for agent-ready Gebiet prose' gives a clear intended context, and 'NEXT: get_service_area, get_lage' suggests related follow-ups. However, the description does not state when not to use this tool or name alternatives for the same task; the locale-based exclusion lives in the schema rather than the tool description.

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

get_ai_txtA
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 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.
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.
bodyNoUTF-8 text window after offset/limit
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
textNoAlias/window of body when present
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.
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.

TDQS

A3.9/5.0
Behavior3/5

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

The description adds that the tool maps /.well-known/ai.txt 1:1, clarifying it is a direct read of a static resource. The readOnlyHint annotation already covers the safe-read behavior, and no contradictions are present. However, it does not disclose error handling, encoding, or content shape beyond what the schema and output schema already imply.

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 uses clear WHAT/USE/NEXT labels to front-load the key information. Every segment earns its place, though the 'ai-train=no' parenthetical is somewhat cryptic and could be clearer.

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 simple read-only discovery-file tool with fully documented parameters and an output schema, the description provides enough context: what it aliases, what it maps, when to use it, and where to go next. The only minor gap is that the exact meaning of 'ai-train=no' is left unexplained.

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 limit and offset parameters are fully documented in the schema. The description itself adds no parameter-level meaning, so the baseline score of 3 applies.

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

Purpose5/5

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

The description clearly states this tool is an alias for get_discovery(which=ai-txt) and maps /.well-known/ai.txt 1:1, making the resource and operation explicit. It also distinguishes itself from nearby siblings like get_discovery and get_llms_txt by naming the alias target and the next tool.

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 description explicitly says 'USE for crawl/train policy', giving a concrete scenario for when to invoke this tool. It also points to get_llms_txt as the next tool, which implies an alternative, though it does not fully explain the trade-off between the two.

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

get_auswahl_itemB
Read-only
Inspect

WHAT: www pointer only — one Auswahl item on www /auswahl/{slug}. slug required. maps returns html to that path. NEXT: www get_auswahl_item.

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

B3.1/5.0
Behavior3/5

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

With readOnlyHint=true, the safety profile is already covered by annotations. The description adds minor behavioral context by calling it a 'www pointer only' and mentioning that 'maps returns html to that path,' but these phrases are cryptic and do not clearly explain what the agent should expect beyond the output schema.

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 description is short and front-loaded with WHAT/NEXT labels, but the 'NEXT: www get_auswahl_item' line is redundant and the sentence 'maps returns html to that path' is unclear. It is concise but not cleanly structured for an AI agent.

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?

The tool is simple with only two parameters, an output schema, and a read-only annotation, so the description does not need to explain return values. However, the cryptic phrasing and lack of routing guidance leave enough gaps that the description is only minimally complete.

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

Parameters3/5

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

Schema description coverage is 100%, so the description does not need to explain the parameters. It only repeats that slug is required, which the schema already states, and adds no meaningful semantics beyond the 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 states a specific verb and resource: it retrieves one Auswahl item at the www path /auswahl/{slug}, and notes that slug is required. This distinguishes it from list_auswahl, which would return multiple items, even though the phrase 'www pointer only' and the trailing 'NEXT: www get_auswahl_item' add some ambiguity.

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

Usage Guidelines2/5

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

There is no explicit guidance about when to use this tool versus alternatives such as list_auswahl or get_wissen_entry. The description implies it is for a single Auswahl item by slug, but it never states conditions, exclusions, or sibling tool routing.

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

get_business_identityA
Read-only
Inspect

WHO: Inhaber, brand, legalName, hours, NAP, office coords. walkIn=false — mobile only. USE for LocalBusiness / impressum-grade facts on maps. DOES NOT update records. NEXT: get_contact, get_geo_office, get_impressum.

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

A3.5/5.0
Behavior3/5

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

Annotations already declare readOnlyHint=true, and the description reinforces it with 'DOES NOT update records.' It also adds a non-obvious behavioral/data fact: 'walkIn=false — mobile only.' This is useful context beyond the annotation, though it mostly describes the business entity rather than tool 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?

The description is four compact, scannable segments (WHO/USE/DOES NOT/NEXT) with no filler. Each segment earns its place and key information is front-loaded.

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 parameter, a full output schema, and a readOnly annotation, the description covers the scope of data, use case, exclusivity, and follow-up tools. The only small gap is an explicit statement that the tool can be called with no arguments, but the schema/context already conveys this.

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 parameter is fully documented in the schema, including its German-only behavior and ignored values. The tool description adds no parameter-level information, 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 explicitly lists the returned data fields (Inhaber, brand, legalName, hours, NAP, office coords) and states 'USE for LocalBusiness / impressum-grade facts on maps.' This clearly identifies the tool as a getter for business identity and distinguishes it from update tools with 'DOES NOT update records.' It only misses a direct verb phrase, relying on the name for 'get.'

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?

It gives an explicit use case ('USE for LocalBusiness / impressum-grade facts on maps') and an exclusion ('DOES NOT update records'). The 'NEXT: get_contact, get_geo_office, get_impressum' hints at related tools but doesn't explicitly state when to choose them over this one, so the guidance is more implied than explicit.

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

get_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.5/5.0
Behavior4/5

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

The readOnlyHint annotation already signals a safe read; the description adds an explicit behavioral disclaimer that the tool 'DOES NOT open tickets or send messages' and contributes domain context like 'Public NAP' and 'walkIn=false'. It does not go into availability/caching details, but given the low side-effect surface and the existing annotation, this is a solid disclosure.

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

Conciseness5/5

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

The description is compact and effectively front-loaded: WHAT enumerates the payload, USE gives the trigger, DOES NOT sets boundaries, and NEXT provides routing. Every sentence earns its place, and the labeled structure makes scanning easy for an agent.

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

Completeness5/5

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

For a low-complexity getter with one optional parameter, a rich parameter schema, readOnlyHint, and an output schema, the description covers purpose, usage, exclusions, and follow-up tools. Nothing an agent needs to decide to call it or interpret its side effects 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?

The tool description itself contributes no parameter-level meaning, but schema description coverage is 100% and the schema's locale description is highly detailed (German-only, default de, ignored other values, distinction from www list_locales). Per the high-coverage baseline, the schema carries the parameter semantics adequately, so no penalty beyond 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?

The description opens with 'WHAT: Public NAP' and enumerates exactly which contact fields are returned (mobile, landline, fax, email, mapsEmail, WhatsApp, address, office coords), making the verb+resource mapping explicit. It also distinguishes itself from action-oriented siblings by stating 'DOES NOT open tickets or send messages' and listing NEXT compose tools, so an agent can tell it apart from compose_* and list_* 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?

'USE for call/WhatsApp/mail CTAs' explicitly states when the tool should be selected, and 'DOES NOT open tickets or send messages' defines exclusions. The NEXT line names the concrete alternatives (compose_tel_mobile, compose_whatsapp, compose_mailto, list_whatsapp_options) that should be used when the agent wants to take an action rather than fetch contact data.

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

get_datenschutzA
Read-only
Inspect

WHAT: www pointer only — Datenschutz on www.ikeytz.com. maps returns html link. DOES NOT return the privacy policy body. NEXT: www MCP.

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

A3.6/5.0
Behavior4/5

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

Annotations only declare readOnlyHint; the description adds meaningful behavioral context by explicitly stating that the tool returns only a pointer/link and does NOT return the privacy policy body. This prevents the agent from expecting full policy content and sets accurate output expectations.

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 short and front-loaded with the core limitation ('www pointer only'). The 'WHAT:/NEXT:' structure is efficient, though 'maps returns html link' is slightly unclear and could be rewritten for smoother 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?

Given zero parameters, an output schema, and a readOnly annotation, the description covers the essential facts: what the tool returns, what it does not return, and the domain. It is complete enough for correct invocation, though it could name sibling alternatives for better routing.

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 has zero parameters, so the description need not clarify parameter meanings. The baseline of 4 applies here, and the description appropriately focuses on behavior rather than inputs.

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 the resource (Datenschutz on www.ikeytz.com) and clarifies the exact behavior: it returns an HTML link/pointer, not the privacy policy body. This distinguishes it from the many sibling get_* tools, though the phrasing 'maps returns html link' is somewhat awkward.

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

Usage Guidelines2/5

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

There is no explicit guidance on when to use this tool instead of related tools such as get_legal, get_impressum, or other content-returning getters. The 'NEXT: www MCP' line hints at next steps but does not explain selection criteria or alternatives.

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

get_discoveryA
Read-only
Inspect

WHAT: 1:1 mirror of a maps discovery file (UTF-8 text/JSON). 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-impressum-kontakt, llms-orte-geo, llms-urheberrecht, llms-copyright, llms-mcp-server, llms-mcp-web, robots, sitemap-txt, sitemap-xml. Optional offset/limit line window. 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 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.
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-impressum-kontakt, llms-orte-geo, 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.
bodyNoUTF-8 text window after offset/limit
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
textNoAlias/window of body when present
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.
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.

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. The description adds value beyond that by disclosing the file format (UTF-8 text/JSON), the 1:1 mirror behavior, the optional offset/limit line window, and the behavior for missing files ('DOES NOT invent missing files (missing=true)'). This is solid supplemental behavioral context.

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 uses helpful labels (WHAT, USE, DOES NOT, NEXT) and is information-dense without being excessive. It repeats some examples already present in the schema, but the overall structure makes the key facts easy to scan.

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 retrieval tool with a fully documented schema, output schema, and readOnlyHint annotation, the description provides enough context: what the tool returns, when to use it, what it does not do, and which sibling tools to use next. Nothing critical is missing for correct invocation.

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 three parameters thoroughly. The description adds a little context via 'which is required' and 'Optional offset/limit line window', but most parameter meaning is already in the schema, and the repeated id list does not add new parameter 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?

The description states a specific verb ('get') and resource ('maps discovery file') and clearly describes a 1:1 mirror of that file. It lists concrete discovery ids and explicitly names sibling aliases (get_llms_txt / get_ai_txt), distinguishing this tool from related getters and structured-search 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?

The description explicitly says 'USE for agent-ready catalogs and robots/sitemap' and directs to alternatives: 'NEXT: find_by_keyword / find_by_serp for structured search'. It also tells the agent that missing files are not invented, which helps decide when this tool is appropriate.

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

get_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 + canonicalUrl. USE for embedding or linking a Gebiet map. NEXT: get_geo_api, get_grenze, get_lage.

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.
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/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 useful behavioral context beyond that, including the canonical URL form, the supported lookup modes, and the return value ('area card + canonicalUrl'). No contradiction with annotations is present.

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

Conciseness5/5

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

The description is compact and well-structured with WHAT, RETURNS, USE, and NEXT labels. Every segment earns its place, and the most important information is front-loaded.

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 a fully documented input schema, an output schema, and a read-only annotation, the description covers the essential selection and invocation context. It states the use case, lookup modes, and return shape. It could be slightly stronger by mentioning when to prefer a sibling like find_by_plz or resolve_maps_url, but 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%, so the parameters are already fully documented in the input schema. The description merely lists slug, plz, and name as lookup keys without adding new semantic details; the schema already explains lookup order and edge cases like shared PLZ.

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 the tool's purpose: it returns the canonical map page URL for a Gebiet, for use in iframe/src and Visitenkarte. It identifies the lookup keys (slug|plz|name) and the return shape (area card + canonicalUrl). It does not explicitly distinguish itself from close siblings like resolve_maps_url, so it stops short of full sibling differentiation.

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 description gives explicit usage context: 'USE for embedding or linking a Gebiet map.' This tells the agent when the tool is appropriate. However, it does not state when not to use it or mention alternatives such as resolve_maps_url, so exclusions are absent.

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

get_emergencyB
Read-only
Inspect

WHAT: www pointer only — Notfall-Türöffnung page on www. maps returns html; use get_contact / compose_tel_mobile here for phones. DOES NOT dispatch. NEXT: compose_tel_mobile, www get_emergency.

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.2/5.0
Behavior3/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 'DOES NOT dispatch' and 'www pointer only,' which are useful behavioral signals, but it never defines what a 'pointer' is or what the HTML/maps distinction means for the caller.

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 description is short and uses a 'WHAT'/'NEXT' structure, but it reads as telegraphic fragments ('maps returns html; use get_contact / compose_tel_mobile here for phones') rather than clear prose. Compactness is achieved at the cost of comprehensibility.

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?

The input schema and output schema cover the return shape and locale semantics, and the description gives some workflow context. However, the core output concept ('www pointer only') is left unexplained, and the phrase 'NEXT: compose_tel_mobile, www get_emergency' is confusing enough to leave the overall behavior incomplete.

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 thoroughly documented with enum, default, and behavior for ignored values. The tool description itself adds no parameter-level information, so the baseline of 3 is appropriate.

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

Purpose3/5

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

The description names a concrete resource (the Notfall-Türöffnung page) but expresses the action as 'www pointer only' rather than an explicit verb like 'returns' or 'fetches.' The phrase 'maps returns html' further blurs what get_emergency itself actually returns.

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 useful routing guidance: use get_contact / compose_tel_mobile for phones, and it explicitly says 'DOES NOT dispatch,' which helps the agent avoid misuse. It also suggests next steps with 'NEXT: compose_tel_mobile, www get_emergency,' though it never states the positive 'use this when...' condition.

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

get_faqC
Read-only
Inspect

WHAT: www pointer only — one FAQ answer lives on www. Optional id/q for www; maps returns /faq html. 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

C2.7/5.0
Behavior3/5

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

Annotations already provide readOnlyHint=true; the description adds that maps returns an HTML page and acts as a pointer to www rather than the terminal answer source. This is useful but phrased ambiguously, and the 'NEXT' instruction reads more like a directive than a disclosed behavior.

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 description is short, but it sacrifices clarity for brevity, relying on jargon ('www pointer only', 'maps returns /faq html', 'NEXT:') that requires inference. It is terse but not well-structured for an agent.

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

Completeness2/5

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

The tool is simple (0 required params, no nesting, output schema present), yet the description leaves the core return value ('/faq html') and the routing semantics ambiguous. An agent cannot confidently predict what invoking this tool yields or when to chain it with the www-side get_faq.

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 fully documents q, id, and locale — including that locale is German-only and other values are ignored. The description's 'Optional id/q for www' restates the schema without adding new meaning, so baseline 3 applies.

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

Purpose3/5

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

The description indicates this tool is a 'www pointer' to a FAQ answer that lives on www, with maps returning '/faq html'. The verb+resource are inferable ('point to FAQ on www'), but the phrasing is cryptic and fails to plainly state what the tool does and what an agent gets back.

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

Usage Guidelines2/5

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

The 'NEXT: www get_faq' line hints that the actual answer must be fetched from a www-side tool, but it never states when to call this tool versus siblings like list_faq or get_llms_txt, nor does it explain the routing condition clearly.

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

get_geo_apiA
Read-only
Inspect

WHAT: Public embed JSON URL https://maps.ikeytz.com/api/v1/embed/ort/{slug} (point + Grenze on that endpoint). Lookup slug|plz|name. RETURNS URL pointer + area card; note that the MCP payload itself is not the polygon. USE to fetch/open the public JSON. NEXT: get_grenze for GeoJSON polygon inside MCP.

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 pointer; 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.
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.4/5.0
Behavior4/5

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

Beyond the readOnlyHint annotation, the description reveals that the tool returns a URL pointer and area card rather than the polygon itself, which is critical behavioral context. It also specifies the endpoint contains point and Grenze data without delivering the polygon payload in MCP.

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

Conciseness5/5

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

The description is compact and highly structured using WHAT, RETURNS, USE, and NEXT labels. Every segment adds distinct operational value, and the essential disambiguation about the polygon payload is front-loaded in the RETURNS section.

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 that an output schema exists and the tool has three optional parameters fully documented in the schema, the description covers the needed usage context, including the endpoint, return type, and relationship to get_grenze. It is complete for an agent to select and invoke this tool 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?

The schema already documents all three parameters in detail with 100% coverage, so the baseline is 3. The description adds only the shorthand 'Lookup slug|plz|name' without materially meaning more than the schema's parameter descriptions, though the URL pattern does clarify how slug maps to the endpoint.

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 action — fetch/open the public embed JSON — and identifies the exact URL pattern with the resource ({slug}). It also distinguishes itself from get_grenze by explicitly noting what it returns and what it does not return.

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 contains an explicit 'USE' directive telling the agent when to call this tool, and a 'NEXT' pointer directing the agent to get_grenze when a GeoJSON polygon is needed. This gives clear routing between this tool and the most relevant alternative.

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

get_geo_officeA
Read-only
Inspect

WHO/WHAT: Gewerbesitz (registered office) coordinates and street in Ludwigsburg. walkIn=false always — mobile locksmith, not a shop counter. RETURNS street, postal, city, lat, lng, google_maps/icbm, walkIn. USE for NAP/schema or distance_to_office. 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
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
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'
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
Behavior4/5

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

The annotations declare readOnlyHint=true, and the description adds meaningful behavioral context beyond that: 'walkIn=false always — mobile locksmith, not a shop counter' and 'DOES NOT accept walk-in customers or bookings.' It also discloses the return fields, though the output schema may already cover some of that detail.

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

Conciseness5/5

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

The description is compact and well-structured with scannable labels: WHO/WHAT, RETURNS, USE, DOES NOT, NEXT. Every sentence adds useful information, and the most important behavioral constraint (walkIn=false) is front-loaded. There is no fluff or repetition.

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, fully documented parameter and an output schema. The description fills the remaining context by explaining the business context, the return values, the intended use cases, and the walk-in limitation. For an agent needing to correctly invoke the tool, nothing essential is missing.

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

Parameters5/5

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

Even though the schema covers the 'locale' parameter at 100%, the description adds substantial practical meaning: 'maps is German-only (de). Omit or pass de. Other values are ignored; URLs stay https://maps.ikeytz.com/…' It also clarifies the distinction from the www multi-locale switch and points to list_locales as the alternative. This far exceeds a plain schema definition.

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: 'Gewerbesitz (registered office) coordinates and street in Ludwigsburg.' It also differentiates the tool from siblings by explicitly noting 'walkIn=false always — mobile locksmith, not a shop counter,' which prevents confusion with other location-related 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?

The description gives explicit usage context: 'USE for NAP/schema or distance_to_office.' It also lists relevant next steps and clearly states what the tool does not do: 'DOES NOT accept walk-in customers or bookings.' This provides actionable guidance for selecting this tool over alternatives.

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

get_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.2/5.0
Behavior4/5

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

The readOnlyHint annotation already signals a safe read operation, and the description adds useful lookup behavior on top: slug-first ordering when parameters are combined, first-match-wins for shared PLZ, and case-insensitive name matching. It also states exactly what gets returned.

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

Conciseness5/5

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

The description uses a compact, labeled structure (WHAT, Lookup, RETURNS, USE, NEXT) that front-loads purpose, output, and usage. Every segment earns its place, and there is no filler or redundant restating of the input 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?

For a read-only tool with three optional parameters, full schema coverage, and an output schema, the description is nearly complete: it covers lookup order, return fields, the intended use case, and related next tools. The only minor gap is not specifying what happens if none of slug/plz/name are provided, but the schema already marks all as optional.

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

Parameters3/5

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

Schema description coverage is 100%, and the parameter descriptions already explain PLZ sharing, name fallback, and slug-first lookup order. The tool description's 'Lookup slug|plz|name' line is a concise summary but does not add meaningful semantics beyond the schema, so the baseline 3 is appropriate.

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

Purpose5/5

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

The description clearly states what the tool returns: German history text for one Einsatzgebiet Visitenkarte, with the specific lookup fields (slug, plz, name) and output fields (slug, name, geschichte). The 'USE for place history prose on the map page' line makes it easy to distinguish from the many get_* sibling tools.

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

Usage Guidelines4/5

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

It gives a clear use context ('USE for place history prose on the map page') and points to related tools in NEXT (get_lage, get_ai_page). It does not explicitly say when not to use this tool, but the map-page context and schema note about find_by_plz provide enough orientation for an agent.

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

get_grenzeA
Read-only
Inspect

WHAT: OSM Gebietspolygon for one Einsatzgebiet as GeoJSON FeatureCollection inside the MCP result. Lookup slug|plz|name. RETURNS hasPolygon, polygon, point, osmRelationId/osmWayId, via. USE when the agent needs the boundary geometry. DOES NOT replace get_geo_api (that remains the URL pointer). NEXT: 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

TDQS

A4.2/5.0
Behavior4/5

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

With readOnlyHint=true already covering safety, the description adds meaningful behavior: it names the return fields (hasPolygon, polygon, point, osmRelationId/osmWayId, via) and clarifies the output is a GeoJSON FeatureCollection. There is no contradiction with annotations.

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

Conciseness5/5

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

The description is compact, front-loaded, and every labeled segment (WHAT, RETURNS, USE, DOES NOT, NEXT) earns its place. It packs purpose, return fields, usage trigger, and an exclusion into a few short lines.

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 an output schema, the description covers what the tool returns, when to use it, and what it does not replace. It does not state behavior when no parameters are supplied or when lookup fails, but the schema and output schema already carry much of that burden.

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 already explains slug priority, PLZ first-match behavior, and name substring matching. The description only restates 'Lookup slug|plz|name', adding no new parameter semantics beyond 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?

The description identifies a specific verb+resource: returns the OSM Gebietspolygon for one Einsatzgebiet as a GeoJSON FeatureCollection, with lookup by slug|plz|name. It actively separates itself from get_geo_api by stating it is not the URL pointer, so the tool's unique purpose is clear.

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 an explicit trigger ('USE when the agent needs the boundary geometry') and an explicit counter-rule ('DOES NOT replace get_geo_api'). It does not, however, explain when to prefer related siblings like get_lage/get_embed_map or find_by_plz, so the routing guidance is good but not exhaustive.

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

get_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.4/5.0
Behavior4/5

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

Annotations already declare readOnlyHint=true. The description adds value beyond that by describing the response shape ('title/h1 + 52 Gebiet links') and a meaningful limitation ('DOES NOT include www prices'). This is useful behavioral context without contradicting 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-loaded with WHAT/USE/NEXT sections, and nearly every fragment adds value. The 'Call with {}' fragment is redundant with the schema, but the overall structure is highly scannable and efficient.

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 zero-parameter read-only tool with an output schema, the description supplies everything needed to select and invoke it: purpose, resource URL, expected content, exclusions, and follow-up tools. Nothing important appears 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 has zero parameters and schema description coverage is 100%, so there is no parameter burden for the description to carry. The description's 'Call with {}' merely restates what the schema already states, but no additional parameter semantics are needed.

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 resource ('maps hub card at https://maps.ikeytz.com/'), exactly what it returns ('title/h1 + 52 Gebiet links'), and what it is not ('not a single Visitenkarte'). This clearly distinguishes it from sibling get_* tools that return individual entries.

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 description explicitly says to use this as 'the maps landing overview' and notes it 'DOES NOT include www prices,' which is a useful exclusion. It names follow-up tools ('NEXT: get_service_area, list_service_areas'), though it does not spell out explicit when-not-to-use conditions for every sibling.

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

get_impressumA
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 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.
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.

TDQS

A4.3/5.0
Behavior4/5

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

The readOnlyHint annotation already establishes that this is a safe read operation. The description adds useful behavioral context by naming the exact source file and clarifying that the content is plain-text NAP/legal imprint. It does not contradict the annotation and gives enough beyond the schema to help an agent understand what this tool actually reads.

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

Conciseness5/5

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

The description is extremely compact and front-loaded: WHAT names the resource first, USE gives the purpose, and NEXT supplies routing to alternatives. Every clause carries useful information 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 simple read-only paginated text retrieval tool with 0 required parameters and a full output schema, the description covers the source, purpose, pagination option, and sibling alternatives. Nothing essential is missing for an agent to select and invoke it correctly.

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

Parameters3/5

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

Schema description coverage is 100%, so the schema already fully documents offset and limit with detailed semantics. The description only repeats 'Optional offset/limit', adding no new meaning beyond the structured parameter definitions.

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 names a specific resource ('maps /llms-impressum-kontakt.txt') and a clear purpose: retrieving Impressum/Kontakt text for NAP/legal imprint on maps. It also distinguishes itself from sibling tools by pointing to get_contact and get_business_identity as next steps and noting the HTML variant is at /impressum.

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 'USE for NAP/legal imprint on maps' phrase gives a clear intended context. The 'NEXT' pointer provides alternatives, but it does not explicitly state when to choose those alternatives over this tool, so it stops short of a full when/when-not specification.

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

get_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.7/5.0
Behavior5/5

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

Annotations only declare readOnlyHint; the description goes well beyond that by disclosing that the tool returns no totalEur, ignores whenKey/breakdown for the pointer payload, is German-only, and leaves URLs without a locale prefix. These are exactly the unexpected behaviors an agent needs to know.

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 dense sentences with WHAT/NEXT labels and front-loaded scoping; no filler. One minor deduction because the 'NEXT:' line is a slightly cryptic developer-style pointer rather than a plain instruction, though it remains informative.

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 description, schema, readOnly annotation, and output schema together cover return type, ignored params, locale behavior, and the correct alternative tool. It is complete for a pointer tool, but the situationKey requirement ambiguity and the unexplained 'Berlin clock/whenKey' reference keep it from being fully self-sufficient.

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 covers 100% of parameters and already documents locale, whenKey, breakdown, and situationKey. The description adds useful 'for symmetry' semantics that the params are mostly ignored in the maps pointer payload. However, the situationKey description says 'Required for www' while the schema marks it required here, leaving some ambiguity about whether/how it is required on maps.

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 immediately identifies the tool as a 'www pointer only' and states exactly what it returns: an html link to /preise, not totals, and explicitly 'DOES NOT return totalEur.' This distinguishes it from the actual @ikeytz/mcp get_invoice_line_items tool and from siblings like get_prices.

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 names the proper alternative for real invoice line items ('NEXT: @ikeytz/mcp get_invoice_line_items') and routes whenKey/Berlin-clock needs to get_ort_datetime here. The 'maps accepts ... for symmetry' phrasing tells the agent this maps tool is only for pointer/link purposes, giving clear when-to-use versus when-not-to-use guidance.

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

get_lageA
Read-only
Inspect

WHAT: Lage (location description) text for one Einsatzgebiet Visitenkarte. Lookup slug|plz|name. RETURNS slug, name, lage. USE for human-readable geography prose. NEXT: get_geschichte, 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.
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.1/5.0
Behavior3/5

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

Annotations already declare readOnlyHint=true, and the description's 'Lookup' and 'RETURNS' wording confirms a read-only operation. The description adds the single-object scoping ('for one Einsatzgebiet'), which is useful, but it doesn't go into edge cases like first-match-wins behavior — that detail lives in the parameter schema. This is adequate given the annotation coverage.

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

Conciseness5/5

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

The description is compact and front-loads the key information with clear 'WHAT', 'RETURNS', 'USE', and 'NEXT' labels. Every sentence earns its place and there is no filler or redundancy.

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

Completeness5/5

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

For a simple read-only lookup tool with full parameter schema coverage and an output schema present, the description covers selection context (geography prose), lookup keys, and return fields. The schema handles the remaining edge cases (e.g., first-match PLZ), so nothing critical is missing for an agent to invoke 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 description coverage is 100%: each parameter (plz, name, slug) is already well documented with examples and lookup rules. The description only restates the lookup keys as 'slug|plz|name', adding no new meaning beyond the schema. A baseline 3 is appropriate.

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

Purpose5/5

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

The description states a specific resource ('Lage (location description) text for one Einsatzgebiet Visitenkarte'), the lookup keys (slug|plz|name), and the exact return fields (slug, name, lage). This is unambiguous and distinguishes the tool from siblings like get_geschichte and get_service_area by its geography-prose focus.

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 'USE for human-readable geography prose' phrase gives a clear context for when to select this tool. It also names related next tools ('NEXT: get_geschichte, get_service_area'), but does not explicitly state when those should be used instead of this one, so it stops short of full exclusion logic.

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

get_llms_mcp_serverA
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 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.
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.
bodyNoUTF-8 text window after offset/limit
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
textNoAlias/window of body when present
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.
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.

TDQS

A4.3/5.0
Behavior4/5

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

Annotations already declare readOnlyHint=true, and the description adds the disclosure that this is an alias of get_discovery and returns 'machine/catalog text'. This gives useful semantic context beyond the structured fields, though it does not describe pagination clamps or output formatting in detail.

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

Conciseness5/5

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

The description is compact, labeled, and front-loaded with WHAT, USE, and NEXT. Every clause provides actionable information 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?

The tool is simple, has an output schema, readOnlyHint annotation, and the description covers its alias relationship, purpose, and next-step siblings. Nothing an agent needs to select and 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%, so the parameters are already fully documented. The description only restates that offset/limit are optional and does not add substantive meaning beyond 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 it is an alias of get_discovery(which=llms-mcp-server) for serving the maps MCP catalog, which is a specific verb+resource. The reference to sibling tools get_llms_mcp_web and get_links helps differentiate it from neighboring retrieval 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?

Explicitly states when to use it ('USE when an agent needs the server-side llms MCP catalog') and points to follow-on alternatives with 'NEXT'. It stops short of explicitly naming situations where another sibling should be chosen instead, so it is clear context without full exclusions.

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

get_llms_mcp_webA
Read-only
Inspect

WHAT: Alias of get_discovery(which=llms-mcp-web) — web/UI-oriented MCP catalog on maps. Optional offset/limit. USE for browser/agent web discovery copy. NEXT: get_llms_mcp_server, get_mcp hub HTML /mcp-hub.

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.
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.
bodyNoUTF-8 text window after offset/limit
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
textNoAlias/window of body when present
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.
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.

TDQS

A4.3/5.0
Behavior3/5

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

Annotations already declare readOnlyHint=true, so the safety profile is covered. The description adds some behavioral context by noting it is an alias, web/UI-oriented, and supports optional offset/limit, but it does not go deep into pagination clamps or return behavior; however, an output schema exists to cover return structure.

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

Conciseness5/5

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

The description is compact and structured into WHAT, USE, and NEXT segments. Every part contributes useful routing or scoping information 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?

Given the simple two-parameter schema, full schema coverage, output schema presence, and read-only annotation, the description supplies enough extra routing context. It identifies the source alias, its web-oriented purpose, pagination options, and related tools, leaving no critical gap for correct invocation.

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 detailed descriptions for both limit and offset. The description only restates 'Optional offset/limit,' adding no semantic value beyond the schema, so the baseline of 3 is appropriate.

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

Purpose5/5

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

Description states the tool is an alias of get_discovery(which=llms-mcp-web) and identifies it as a 'web/UI-oriented MCP catalog on maps,' making the resource and scope explicit. It also differentiates itself from sibling tools by naming get_llms_mcp_server and the MCP hub HTML as distinct alternatives.

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 provides a use directive: 'USE for browser/agent web discovery copy.' It also names next-step alternatives, which helps an agent decide when this tool is appropriate versus related siblings.

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

get_llms_txtA
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 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.
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.
bodyNoUTF-8 text window after offset/limit
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
textNoAlias/window of body when present
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.
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.

TDQS

A4/5.0
Behavior4/5

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

readOnlyHint=true already covers the safety/read-only profile. The description adds value by disclosing the alias relationship to get_discovery(which=llms), the 1:1 correspondence with /llms.txt, and the optional offset/limit behavior. There is no contradiction with the read-only annotation.

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

Conciseness5/5

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

The description is compact, front-loaded with WHAT and USE, and each segment earns its place. The NEXT line is terse and informative rather than filler, and the structure makes the key facts easy to scan.

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 simple read-only retrieval tool with an output schema and fully documented parameters, the description provides the essential selection context: alias, primary use, pagination capability, and related tools. It doesn't fully explain when to avoid this tool in favor of alternatives, but the NEXT list and sibling names partially compensate.

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?

The input schema provides 100% coverage of both parameters, including detailed semantics, defaults, and pagination guidance. The description only says 'optional offset/limit,' which adds no new meaning beyond the schema. Baseline 3 is appropriate because the schema does the heavy lifting.

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 concrete resource (/llms.txt), identifies the tool as an alias for get_discovery(which=llms), and labels it 'the primary maps machine index.' This is specific and clearly not a tautology. However, it doesn't explicitly differentiate get_llms_txt from similar sibling tools like get_links or get_sitemap_txt, so it stops short of full sibling distinction.

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 primary maps machine index' provides clear guidance on when to prefer this tool. The NEXT pointer to related tools hints at alternatives, but there are no explicit when-not conditions or selection criteria explaining when to choose get_ai_txt, get_sitemap_txt, or get_links instead.

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

get_nutzungsbedingungenA
Read-only
Inspect

WHAT: www pointer only — Nutzungsbedingungen on www.ikeytz.com. maps returns html link. DOES NOT return the body. NEXT: www MCP / open html.

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
Behavior5/5

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

Beyond the readOnlyHint annotation, the description discloses a critical behavioral trait: the tool returns only a link and not the terms-of-use body. It also tells the agent that a follow-up action ('www MCP / open html') is required, which prevents an incorrect expectation of receiving full content.

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 short and front-loaded with the most important fact ('WHAT: www pointer only'). The labeled fragments are efficient, though the phrase 'maps returns html link' is slightly ambiguous and the all-caps structure is telegraphic rather than polished.

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 zero-parameter, read-only pointer tool with an output schema, the description covers purpose, return type, what it does not return, and the recommended next step. Nothing essential is missing for an agent to invoke 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 and the schema already covers this completely, so no additional parameter explanation is needed. The description does not need to compensate for missing parameter docs, and the 0-parameter baseline applies.

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

Purpose5/5

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

The description clearly states the resource ('Nutzungsbedingungen on www.ikeytz.com') and the exact behavior: it returns only an HTML link/pointer, not the body. It also distinguishes itself from content-returning sibling tools by explicitly saying 'DOES NOT return the body.'

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?

Usage is implied through phrases like 'www pointer only' and the explicit next step 'NEXT: www MCP / open html.' However, the description does not name alternatives or state conditions for choosing this tool over closely related siblings such as get_agb or get_legal.

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

get_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

A4.2/5.0
Behavior4/5

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

With readOnlyHint=true, the safety profile is already known, and the description adds meaningful context beyond that: it returns a second-precision wall clock value, applies to all 52 places when parameters are omitted, and explicitly excludes euro pricing. It also discloses the returned fields including the day/night whenKey classification. Minor gaps like rate limits or auth are not relevant for a read-only clock 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?

The description is compact and front-loads the core WHAT, then RETURNS, USE, DOES NOT, and NEXT sections. Every sentence serves a purpose. The use of ALL-CAPS labels keeps sections scannable, though some phrasing is awkward and dense ('stand YYYY-MM-DD HH:MM:SS CEST|CET' and 'whenKey context') which slightly hurts 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, all parameters are documented in the schema, and the annotation confirms this is read-only. The description adds the remaining needed context: usage timing before quoting, the all-52-places behavior, the day/night whenKey output, and what it deliberately does not return. This is sufficient for correct invocation, with minor ambiguity around terminology like 'stand'.

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

Parameters4/5

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

Schema coverage is 100%, so the baseline is 3, but the description adds real value by explaining that omitting all parameters returns all 52 places with the same clock and that slug/plz/name behave like get_service_area. It also provides format context for the returned stand timestamp. This meaningfully supplements the already well-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 identifies a specific resource (Europe/Berlin wall clock) and states the output fields returned (timezone, stand, iso, unix, date, time, tz, whenKey). It distinguishes itself from pricing tools with 'DOES NOT return euro amounts' and points to get_invoice_line_items as the next step. The phrasing is slightly metaphorical and dense, but an agent can determine what the tool does.

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 description explicitly says 'USE before quoting via www get_invoice_line_items' and gives the next call shape with parameters. It also states what the tool does NOT return ('DOES NOT return euro amounts'), routing agents to get_prices/get_invoice_line_items instead. This is direct, actionable guidance with little 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_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). 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

A4.5/5.0
Behavior4/5

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

With readOnlyHint=true, the safety profile is already known. The description adds meaningful behavioral context: map paths yield an area card, non-maps paths yield a pointer fallback, and locale values beyond de are ignored rather than switching the www locale. This goes beyond the annotation without contradicting it.

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/NEXT format front-loads the essential information in two compact sentences with zero filler. The maps-vs-www behavior, required input, and follow-up tools are all communicated efficiently.

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 tool with three well-documented parameters and an output schema, the description provides the selection context, fallback behavior, and locale caveat. Nothing an agent needs to choose and invoke this tool correctly appears to be missing.

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

Parameters3/5

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

Schema description coverage is 100%, so the schema already documents path, slug, and locale. The description's 'path required (or slug)' and maps-vs-www mapping add some relational meaning, but most parameter semantics are already present in the schema, keeping this at the 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?

The description states an explicit operation: return a short summary for a maps Gebiet (as an area card) or a www pointer for non-maps paths. This clearly distinguishes the tool from the many sibling get_* tools by keying on the maps-vs-www path distinction.

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 decide maps vs www" states the primary invocation condition directly, and the locale-parameter description explicitly excludes a multi-locale use case, pointing to @ikeytz/mcp list_locales instead. The NEXT line also names the natural follow-up tools, so an agent has both the when and the when-not guidance.

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

get_partner_infoC
Read-only
Inspect

WHAT: www pointer only — Partner-werden on www. maps returns html. NEXT: www get_partner_info.

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

C2.2/5.0
Behavior2/5

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

The readOnlyHint annotation already signals safety; the description adds only a cryptic 'maps returns html' fragment and notes in the parameter description that other locale values are ignored. These are useful but minimal and ambiguously connected to the tool's actual behavior. No clear statement covers side effects, output format, or operational traits 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.

Conciseness2/5

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

The description is short but severely under-specified and cryptic, using telegraphic internal labels like 'WHAT:', 'NEXT:', and 'www pointer only'. It is not effective conciseness; it sacrifices clarity to the point that the main action is unclear.

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

Completeness2/5

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

The tool has only one optional parameter and has an output schema plus a readOnly annotation, so the surface is simple. However, the description never explains what partner info is returned, how it relates to 'Partner-werden', or what 'NEXT: www get_partner_info' instructs the agent to do. An agent cannot confidently select or invoke it based on the provided wording.

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

Parameters5/5

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

The schema gives an enum of 'de' and a default, but the description adds substantial meaning: it explains that maps is German-only, that omitting or passing 'de' is expected, that other values are ignored, and that URLs remain with no locale prefix. It also explicitly redirects multi-locale use to list_locales. This greatly exceeds the schema's bare coverage.

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

Purpose1/5

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

The description never states that the tool retrieves partner information; it reads as an internal note ('www pointer only', 'NEXT: www get_partner_info') rather than a functional definition. It neither names a clear verb+resource nor distinguishes this from the many sibling get_* tools. It is effectively missing/misleading as a purpose statement.

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

Usage Guidelines2/5

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

The parameter description does provide one exclusion: it says not to use this as a www multi-locale switch and points to list_locales for other locales. However, there is no general guidance on when to call get_partner_info versus the many sibling get_* tools. The parenthetical alternative is buried in parameter semantics and does not establish tool-level usage context.

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

get_pricesA
Read-only
Inspect

WHAT: www pointer only — Festpreis matrix lives on www.ikeytz.com/preise via @ikeytz/mcp get_prices. maps returns html + note, no euro rows. USE to hand off. DOES NOT invent prices. NEXT: www get_prices; maps get_ort_datetime for 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

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

A3.9/5.0
Behavior4/5

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

Annotations already mark readOnlyHint=true, so this is known to be a safe read operation. The description adds genuinely useful behavioral detail beyond that: the tool returns only html + note, contains no euro rows, and explicitly 'DOES NOT invent prices'. This manages agent expectations about hallucinated pricing data. No contradiction with annotations.

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

Conciseness4/5

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

The description is highly compact and front-loaded with the core point ('www pointer only'), then gives return behavior, usage, and next steps in short labeled sections. Every clause contributes. Some domain jargon ('Festpreis matrix', 'euro rows', 'whenKey') is cryptic to outsiders, but within its context the density is efficient rather than bloated.

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 the tool has only one optional parameter, a readOnly annotation, and an output schema, the description covers what an agent needs to invoke it correctly: the pointer-to-www behavior, the non-invention guarantee, and suggested next tools. The only slight gap is the unexplained 'whenKey', but that relates to a follow-up tool and does not affect calling get_prices itself.

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?

The input schema already documents the only parameter (locale) thoroughly, including its enum, default, German-only constraint, behavior for other values, and pointer to list_locales for multi-locale needs. With 100% schema description coverage, the description does not need to add parameter details. It adds no param semantics, so the 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?

The description opens with 'www pointer only' and clearly identifies the Festpreis matrix as living on www.ikeytz.com/preise, so the agent knows this maps-side tool does not itself serve prices. It also states 'maps returns html + note, no euro rows', reinforcing the pointer role. The action is a bit implied ('USE to hand off') rather than a clean verb+resource, but it is specific enough to distinguish from the many get_* siblings.

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 hand off' explicitly gives the call context, and 'NEXT: www get_prices; maps get_ort_datetime for whenKey' names follow-up alternatives. This gives clear guidance on when to invoke this tool versus proceeding to the www pricing tool. A formal when-not-to-use statement is absent, but the pointer-only framing makes the boundary reasonably explicit.

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

get_ratgeberB
Read-only
Inspect

WHAT: www pointer only — Ratgeber page /ratgeber/{slug}. slug required. maps returns html. NEXT: www get_ratgeber.

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

TDQS

B3.3/5.0
Behavior4/5

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

With readOnlyHint already set, the description adds useful behavioral context: this tool is a pointer, not a content fetcher, and 'maps returns html' hints at the response format. It does not fully explain the 'NEXT' relationship, but it does not contradict 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.

Conciseness3/5

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

The description is short and front-loaded, but the labels and fragment 'NEXT: www get_ratgeber' are cryptic and not self-explanatory. Brevity is achieved at the cost of clarity.

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?

For a simple 2-parameter tool with an output schema, the input contract is adequately covered. But the workflow hint 'NEXT: www get_ratgeber' is unresolved and the tool's relationship to the many get_* siblings is left unclear, so an agent cannot confidently decide this is the right endpoint.

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 slug and locale, including the German-only constraint and ignored values. The description only restates that slug is required and adds no parameter behavior beyond the 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?

States a concrete resource and operation: a pointer to the Ratgeber page at /ratgeber/{slug}, with slug required. It is more specific than a tautology, but never names sibling tools, so an agent must infer how 'www pointer only' differs from tools like get_wissen_entry or get_ai_page.

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

Usage Guidelines2/5

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

Only cryptic hints ('www pointer only', 'NEXT: www get_ratgeber') suggest a multi-server workflow, with no explicit when-to-use or when-not-to-use against siblings. No alternatives are named and no conditions select this tool over list_ratgeber or get_wissen_entry.

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

get_review_urlB
Read-only
Inspect

WHAT: www pointer only — Google review entry on www /review. maps returns html. NEXT: www get_review_url.

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.3/5.0
Behavior3/5

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

The readOnlyHint annotation already covers the safety profile, and the description adds the useful behavioral detail that the result is only a pointer, not HTML. It does not contradict annotations, but it also does not reveal much else beyond what the annotation plus tool name already imply.

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 description is short and front-loaded with a 'WHAT' label, which is good. However, the fragmented phrasing and the apparently redundant 'NEXT: www get_review_url' weaken the structure; not every fragment clearly earns its place.

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?

For a simple read-only tool with one optional parameter, an output schema, and a detailed parameter schema, the description is largely adequate for invocation. The 'NEXT' fragment is confusing and does not clearly explain what follows or why, leaving some ambiguity around the intended flow.

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?

The main description provides no parameter-specific detail, but the input schema fully documents locale: it explains the German-only enum, the default, ignored values, and the direction to list_locales for multi-locale needs. With schema description coverage at 100%, the description does not need to compensate.

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 resource ('Google review entry on www /review') and clarifies that the tool returns 'www pointer only' rather than full content. The contrast with 'maps returns html' also helps distinguish the tool from the maps variant, though the telegraphic phrasing keeps it from being fully polished.

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?

'maps returns html' implies this tool is for the www pointer form and not for maps HTML output, giving some context. However, it never explicitly names alternatives or states when to prefer this tool over siblings, and the cryptic 'NEXT: www get_review_url' does not act as a real usage guideline.

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

get_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). 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.4/5.0
Behavior4/5

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

ReadOnlyHint already establishes this is a safe read operation, and the description adds a meaningful behavioral guarantee: it does not invent meta tags. It also clarifies that matchContext is the full block, which sets expectations beyond the schema.

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 labeled WHAT/RETURNS/USE/DOES NOT/NEXT structure is compact, front-loaded, and each sentence serves a distinct purpose. There is no redundant or filler content.

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

Completeness4/5

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

Given the read-only annotation, output schema, and fully documented parameters, the description covers purpose, selector semantics, return contents, and next steps. The only notable gap is the exact precedence or fallback behavior when multiple lookup parameters are supplied.

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 schema already documents all four parameters, and the description adds the useful relationship that path, url, slug, or q are alternative lookup routes. The fallback nature of q could be clearer, but the description still adds meaning beyond the individual 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?

The description states a specific operation: retrieving one SERP block from maps llms-serp.txt, and identifies the key selectors and return fields. It also clarifies this is for a single page's SERP copy, distinguishing it from broader search/body-content 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?

It explicitly says to use this tool for a single page's SERP copy and points to get_ai_page or get_page_summary for body content. It does not explicitly distinguish it from find_by_serp, but the context and follow-up guidance make the primary use case clear.

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

get_service_areaA
Read-only
Inspect

WHAT: One Einsatzgebiet by slug → plz (first match) → name substring. RETURNS point card + 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 only.

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.
embed_mapNo
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.7/5.0
Behavior5/5

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

Beyond readOnlyHint=true, the description discloses the lookup precedence chain, the response shape variation with compact, the fields filtering role, and the failure mode (unknown → ok=false unknown_place). It also flags the boundary condition that free addresses outside the 52 are not geocoded. This is far more behavioral context than the annotation alone.

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

Conciseness5/5

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

The description is a compact set of labeled clauses (WHAT/RETURNS/USE/DOES NOT/NEXT) with no filler. Every clause adds operational information, and the most important lookup semantics are front-loaded. This is well-structured and appropriately sized.

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 available and 100% parameter coverage, the description only needs to provide selection and behavioral context, which it does thoroughly: when to use, what it won't do, failure mode, and related next tools. Nothing an agent needs to invoke this 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 input schema already documents all six parameters with 100% coverage, so the baseline is 3. The description adds the lookup order (slug first, then plz first-match, then name substring) and that fields filters keys, which is not obvious from individual parameter docs. That extra precedence information justifies a 4.

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

Purpose5/5

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

The description opens with 'WHAT: One Einsatzgebiet by slug → plz (first match) → name substring,' clearly stating the verb (get), the resource (one Einsatzgebiet), and the exact lookup keys. It also specifies the return shape ('point card + optional Lage texts'), which distinguishes it from sibling search tools like find_by_plz and list_service_areas. This is a precise, unambiguous statement of 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?

'USE when the user names a town/district in Landkreis Ludwigsburg' gives an explicit trigger condition, and 'DOES NOT geocode free addresses outside the 52; unknown → ok=false unknown_place' states an exclusion. The schema note to use find_by_plz for all matches when multiple Gebiete share a PLZ reinforces routing, though the main description doesn't name alternatives beyond the NEXT list. This is clear context, with a slight reliance on the schema and sibling list for alternatives.

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

get_sitemap_txtA
Read-only
Inspect

WHAT: Alias get_discovery(which=sitemap-txt) — maps /sitemap.txt 1:1 (embed URLs). Optional offset/limit. USE to list public maps URLs. NEXT: resolve_maps_url, get_embed_map.

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.
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.
bodyNoUTF-8 text window after offset/limit
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
textNoAlias/window of body when present
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.
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.

TDQS

A4.3/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 valuable behavioral context beyond that: it explains the tool is a 1:1 map of /sitemap.txt, that it returns embed URLs, and that it supports optional offset/limit pagination. This gives an agent a clear model of what to expect without contradicting 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.

Conciseness5/5

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

The description is compact and front-loaded: WHAT, source mapping, optional parameters, USE, and NEXT are all conveyed in a few short clauses. Every sentence contributes distinct information, and there is no filler or repetition of schema content.

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 simple read-only tool with two optional parameters, complete schema descriptions, an output schema, and a readOnlyHint annotation, the description is fully adequate. It states the data source, the purpose, the parameter option, and the natural next tools, so an agent has everything needed to select and invoke it correctly.

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

Parameters3/5

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

Schema description coverage is 100%, and the schema already documents limit and offset in detail. The description only adds 'Optional offset/limit', which is useful but does not meaningfully extend the schema's parameter semantics. Baseline 3 is appropriate since the schema carries the parameter documentation load.

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 clearly states what the tool does: it is an alias for get_discovery(which=sitemap-txt) and maps /sitemap.txt 1:1 to embed URLs. It adds an explicit use case, 'USE to list public maps URLs', and distinguishes itself from related follow-up tools by listing NEXT: resolve_maps_url, get_embed_map.

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 description explicitly says when to use it ('USE to list public maps URLs') and provides follow-up tool guidance ('NEXT: resolve_maps_url, get_embed_map'). It does not explicitly state when not to use it or compare it directly with sibling get_* tools, but the alias relationship to get_discovery and the clear use case are sufficient context.

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

get_urheberrechtA
Read-only
Inspect

WHAT: Karten-Urheberrecht text from maps /llms-urheberrecht.txt (HTML page remains www /urheberrecht). Optional offset/limit. USE when citing map copyright (Mahmud Reza Kashani · ikeytz). NEXT: get_copyright, get_legal(doc=urheberrecht).

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.
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.

TDQS

A3.9/5.0
Behavior4/5

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

With readOnlyHint=true, the safety profile is already disclosed, so the description's main job is to add source and behavior context. It reveals that the tool reads from a specific text file, that the HTML page remains at /urheberrecht, and that offset/limit are optional for paging. This goes meaningfully beyond the annotation without contradicting it, though it does not describe edge cases like empty results or invalid offsets.

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 scannable, using WHAT/USE/NEXT labels that front-load the key information. Every phrase contributes something, but some fragments are cryptic (e.g., 'HTML page remains www /urheberrecht') and the overall style is terse to the point of mild ambiguity. It earns a strong score for efficiency, not a perfect one for 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?

For a simple read-only retrieval tool with two optional parameters, an output schema, and readOnlyHint annotation, the description covers the essential context: what is returned, where it comes from, when to use it, and which related tools to consider next. It does not explain return-value shape, but the presence of an output schema makes that unnecessary. The only minor gap is the unclear relationship between this tool, get_copyright, and get_legal.

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

Parameters3/5

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

Schema description coverage is 100%, and the schema already explains offset and limit in detail, including line-splitting and pagination behavior. The description only restates that offset/limit are optional, adding no extra semantics. Baseline 3 is appropriate because the schema carries the parameter documentation burden and the description does not need to compensate.

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 identifies the resource as 'Karten-Urheberrecht text from maps /llms-urheberrecht.txt' and notes the HTML counterpart, so an agent can tell this returns map copyright text rather than a web page. It does not use an explicit action verb like 'retrieves' or 'lists', but the 'WHAT:' label plus the tool name makes the operation clear. It also points to related sibling tools, adding some differentiation.

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 description explicitly states when to use this tool: 'USE when citing map copyright', including the exact copyright attribution '(Mahmud Reza Kashani · ikeytz)'. It also names related next steps ('NEXT: get_copyright, get_legal(doc=urheberrecht)'), though it does not explain the conditions for choosing those alternatives instead. This is clear usage context but not a full when-not-to-use guide.

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

get_widerrufA
Read-only
Inspect

WHAT: www pointer only — Widerruf on www.ikeytz.com. maps returns html link. DOES NOT return withdrawal text. NEXT: www MCP.

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

A3.7/5.0
Behavior4/5

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

Despite readOnlyHint=true, the description adds behavioral context by revealing the tool is a 'www pointer only' and returns an HTML link rather than the actual Widerruf content. This goes beyond the annotation and helps set agent expectations, though it omits details like error or timeout behavior.

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 description is short and front-loads the key 'www pointer only' concept, but the sentence 'maps returns html link' is grammatically muddled and 'NEXT: www MCP' is cryptic. These fragments do not fully earn their place and could confuse an agent.

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-argument, read-only tool with an output schema, the description covers the essential context: the target resource, the return type, the explicit limitation, and a suggested next step. The ambiguity of the 'maps returns' wording keeps it from being a 5.

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 has zero parameters and schema coverage is 100%, so the baseline of 4 applies. The description correctly spends no space on arguments and adds no unnecessary 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?

The description identifies the specific resource (Widerruf page on www.ikeytz.com) and states it returns an HTML link, not the withdrawal text. This distinguishes it from sibling tools like get_legal or get_impressum, though the phrasing 'maps returns html link' is awkward and could be clearer.

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?

It clearly warns that the tool does NOT return withdrawal text, which tells an agent when not to use it, and 'NEXT: www MCP' hints at a follow-up. However, it never names an alternative tool or states an explicit when-to-use condition, leaving usage mostly implied.

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

get_wissen_entryB
Read-only
Inspect

WHAT: www pointer only — Wissen article /wissen/{id}. id required. maps returns html. NEXT: www get_wissen_entry.

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

B3.3/5.0
Behavior3/5

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

The readOnlyHint=true annotation already signals a safe read operation, lowering the descriptive burden. The description adds the useful behavioral fact that this is pointer-only and mentions "maps returns html", but this line is cryptic and does not clearly disclose return behavior or constraints beyond what annotations and the schema already imply.

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 description is brief and front-loads the core WHAT statement, but the "maps returns html. NEXT: www get_wissen_entry." fragment is opaque and requires domain context to interpret. Compactness is achieved at the cost of clarity.

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?

Given the output schema exists and annotations mark the tool read-only, the description does not need to explain return values or safety. However, the ambiguous "maps returns html" and the unexplained NEXT notation leave enough room for an agent to misunderstand the tool's exact purpose and output.

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 fully documents both id and locale. The description only repeats that "id required" and does not add meaningful parameter semantics beyond what the schema already provides, matching the baseline for full coverage.

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 specifies a concrete resource, "Wissen article /wissen/{id}", and a clear behavior: it is a "www pointer only" tool, so it returns a pointer/URL rather than content. It also distinguishes itself from the www-side entry by the "NEXT: www get_wissen_entry" note, though the terse phrasing keeps it from being a 5.

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?

The "www pointer only" phrasing implies this tool is for pointer/URL retrieval rather than full entry content, and "NEXT: www get_wissen_entry" names an alternative. However, it never explicitly states when to prefer this tool over alternatives such as list_wissen or get_ai_page, leaving the decision partially to inference.

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

list_auswahlC
Read-only
Inspect

WHAT: www pointer only — Auswahl hub on www /auswahl. maps returns html. NEXT: www list_auswahl / get_auswahl_item.

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

C2.6/5.0
Behavior3/5

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

Annotations already declare readOnlyHint=true, and the description does not contradict this. It adds the behavioral note that the tool is a 'www pointer only' and that 'maps returns html,' which signals context-dependent behavior, but the note is too abbreviated to describe the actual return format or side effects 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 very short and front-loaded with WHAT/NEXT labels; there is no padding or unnecessary prose. However, the telegraphic style and odd fragments ('www pointer only', 'maps returns html') reduce readability despite the appropriate size.

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

Completeness2/5

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

The tool is structurally simple: one optional, fully documented parameter, an output schema, and a read-only annotation. But because the description never clearly states what list_auswahl returns or the exact purpose of the tool, an agent cannot confidently decide when to invoke it; the cryptic pointer-only note is insufficient.

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 fully documents the locale parameter, including the warning that it is not a www multi-locale switch. The description adds no parameter information, but the high schema coverage makes the baseline 3 appropriate.

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

Purpose2/5

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

The description labels the tool as a 'www pointer only' and names the resource 'Auswahl hub on www /auswahl,' but it never plainly states that this tool lists Auswahl entries or what the returned data represents. The contrast with 'maps returns html' is suggestive, but the wording is cryptic and relies heavily on the tool name and the sibling get_auswahl_item.

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

Usage Guidelines2/5

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

No explicit when-to-use or when-not-to-use guidance is provided. The phrase 'www pointer only' implies the www context and 'maps returns html' hints at a different behavior, but neither states conditions for choosing this tool over alternatives. 'NEXT' mentions get_auswahl_item as a follow-up but does not clarify selection criteria.

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

list_faqA
Read-only
Inspect

WHAT: www pointer only — FAQ list on www /faq. maps returns html, not FAQ rows. NEXT: www list_faq / 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

A3.9/5.0
Behavior4/5

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

With readOnlyHint=true already covering safety, the description adds a useful behavioral fact: the tool returns html and does not return FAQ rows. This is meaningful beyond the annotation, even if the exact structure of the html/pointer is left to the output schema.

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

Conciseness4/5

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

The description is very short and front-loaded with the essential WHAT and NEXT information. The internal 'WHAT:'/'NEXT:' structure is efficient, though the telegraphic style makes some parts cryptic.

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 tool with one optional parameter, an output schema, and a simple pointer behavior, the description covers purpose, output nature, and alternatives. Slight ambiguity around what exactly the 'pointer' returns and the terse 'NEXT' phrasing keep it from being fully complete.

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

Parameters3/5

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

Schema description coverage is 100%, and the schema thoroughly explains locale behavior, defaults, and ignored values. The tool description itself adds no parameter-level meaning, so the baseline of 3 is appropriate.

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

Purpose4/5

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

The description identifies the tool as a 'www pointer only' for the FAQ list at www /faq and explicitly clarifies that the maps version returns html, not FAQ rows. This is specific enough to distinguish it from a real FAQ-list retrieval tool, though the 'pointer only' phrasing is jargon-heavy.

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 states that maps returns html rather than FAQ rows, helping an agent decide not to use it when structured FAQ data is needed. The 'NEXT: www list_faq / get_faq' line explicitly points to alternative tools for the actual FAQ content, though it doesn't state a crisp when-to-use condition.

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

list_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.7/5.0
Behavior4/5

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

Annotations already signal readOnlyHint=true, and the description adds meaningful behavioral detail: the locale scope is limited to de, the return shape is items[{locale,url}], and it does not cover the www site's seven locales. This goes beyond the annotation without contradicting it. A small deduction because it does not explain what MAPS-E8 refers to, but the core behavior is transparent enough.

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

Conciseness5/5

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

The description is telegraphic and front-loaded: purpose first, then return shape, then usage ordering, then the exclusion and alternative. Every sentence earns its place; there is no filler or redundancy.

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

Completeness5/5

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

For a parameterless, read-only list tool with an output schema, the description covers what the tool returns, the locale limitation, ordering relative to resolve_locale_url, and the sibling alternative. An agent has everything needed to decide when and how to invoke 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?

There are zero parameters and the schema description coverage is 100%, so the baseline is high. The description reinforces the no-argument call with 'Call with {}' and clarifies the expected invocation form outside the schema. Nothing more is needed for a parameterless 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?

The description states a specific verb ('list'), a specific resource ('locales on maps'), and an explicit constraint ('only de (MAPS-E8: no /en)'). It clearly distinguishes this tool from resolve_locale_url and from a different list_locales tool, so an agent can select it correctly without ambiguity.

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?

Usage is explicitly guided: 'Call with {}', 'USE before resolve_locale_url', and a clear exclusion with an alternative ('DOES NOT list www's seven locales — use @ikeytz/mcp list_locales for those'). The when-to-use and when-not-to-use guidance is direct and unambiguous.

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

list_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.5/5.0
Behavior4/5

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

Beyond the readOnlyHint annotation, the description reveals that the tool is maps-specific and German-only, that invalid locale values are ignored, and that URLs remain unchanged. This adds meaningful behavioral context about edge cases.

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

Conciseness5/5

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

The description is compact, labeled (WHAT/USE/DOES NOT/NEXT), and every sentence carries information. It front-loads the core purpose and follows with necessary exclusions and next-step hints.

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 list tool with a full output schema and a well-documented parameter, the description covers purpose, scope, exclusions, and related actions. Nothing essential is missing for an agent to invoke it correctly.

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

Parameters3/5

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

Schema description coverage is 100%, with a detailed description of the locale parameter including its enum, default, and behavior. The tool description itself does not need to add parameter details because the schema already provides them.

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 clearly identifies the tool's function: mapping navigation links for maps pages, listing Hub, MCP, Urheberrecht, and all 52 Gebiet URLs. It also clarifies what it is not (www header hubs), distinguishing it from broader navigation/list 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?

The description explicitly states when to use this tool ('USE to pick a maps page') and what it excludes, with a direct pointer to an alternative for www locales via list_locales. This gives an agent unambiguous selection guidance.

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

list_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.5/5.0
Behavior4/5

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

With readOnlyHint=true already covering safety, the description adds useful behavioral scope: only shared/multi-Gebiet PLZs are included, and the return shape is explicitly summarized as items[{plz,count,slugs}]. No hidden side effects or prerequisites are omitted for this argument-free read 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?

The description is a tightly organized labeled sequence (WHAT, Call, RETURNS, USE, NEXT) where each segment serves a distinct purpose. There is no filler, and the scope is front-loaded before the alternative pointer.

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 zero-argument, read-only list tool with an output schema, the description covers purpose, invocation style, return shape, and a sibling pointer. Nothing an agent needs to safely call this tool 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 no parameters and the schema already documents this with 100% coverage. The description reinforces the calling convention with 'Call with {}', which adds no ambiguity but is harmless; the baseline for zero-parameter tools 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 opens with a concrete data contract: it maps PLZ to slugs across the 52 Gebiete, specifically for shared postcodes. The 'USE' clause ties it to a distinct need (multi-Gebiet PLZ) and names the next sibling, helping an agent distinguish it from the find_by_* family.

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 description states the primary use case ('USE to see multi-Gebiet PLZ') and points to find_by_plz as the follow-up, giving clear context for when this tool is relevant. However, it never explicitly says when not to use it or contrasts it with the sibling, so exclusions remain implied rather than stated.

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

list_ratgeberC
Read-only
Inspect

WHAT: www pointer only — Ratgeber list on www /ratgeber. maps returns html. NEXT: www list_ratgeber.

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

C2.9/5.0
Behavior3/5

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

readOnlyHint already covers the safety profile, and the description adds some behavioral detail: 'maps returns html,' other locale values are ignored, and URLs retain no locale prefix. But the cryptic 'www pointer only' does not explain what actually happens or what the agent will receive.

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

Conciseness2/5

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

The description is short but telegraphic, relying on 'WHAT' and 'NEXT' fragments instead of clear sentences. 'NEXT: www list_ratgeber' does not earn its place because it is ambiguous and does not explain a concrete follow-up.

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?

The tool is simple, read-only, has one optional parameter, and an output schema exists, so the schema carries much of the needed context. However, the description does not clarify what the returned pointer/list represents or whether the 'NEXT' step must be invoked, leaving a meaningful gap.

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?

The schema fully documents the single optional locale parameter with enum, default, and detailed behavior, so schema coverage is 100%. The tool description adds no parameter semantics beyond that, which places it at the high-coverage baseline.

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

Purpose3/5

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

The description names the resource ('Ratgeber list on www /ratgeber') and labels the tool as a 'www pointer only,' but it never clearly states what is returned or what 'pointer only' means. The fragment 'NEXT: www list_ratgeber' adds confusion rather than clarifying the tool's function.

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?

There is one explicit exclusion: 'Not a www multi-locale switch — use @ikeytz/mcp list_locales on www for en|fr|ru|fa|ar|tr,' which prevents misuse of the locale parameter. However, there is no guidance on when to use list_ratgeber versus related list/get siblings, so usage direction is partial.

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

list_service_areasA
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) — not polygons. 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 (use get_grenze 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.

TDQS

A4.7/5.0
Behavior5/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 meaningful behavioral context: the exact return envelope (items[], count, total, offset, limit), the point-card field set, pagination behavior, and what is deliberately excluded (OSM boundaries, prices). This 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.

Conciseness5/5

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

The description is compact, label-structured (WHAT, RETURNS, USE, DOES NOT, NEXT), and every clause adds information about scope, output, usage, or exclusions. There is no redundant 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 read-only list tool with four optional, well-documented parameters and an existing output schema, the description covers what the tool returns, how to page/filter, what to use it for, and which alternatives cover excluded cases. 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 schema already documents highlight, all four parameters with detailed semantics. The description only restates the fields and paging options that the schema already covers, so it adds little beyond the baseline expected when the 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?

The description names a specific verb and resource: 'List all 52 ikeytz Einsatzgebiete' as point cards, and explicitly contrasts itself with polygon-returning tools by adding 'not polygons'. It also names the sibling tool for boundaries, so an agent can distinguish it from get_grenze without opening schemas.

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

Usage Guidelines5/5

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

It gives explicit use cases ('USE to enumerate the service area or build a picker'), explicit non-goals ('DOES NOT return OSM boundaries or prices'), and names the alternative for the boundary case ('use get_grenze per slug'). It also mentions the NEXT related tools, giving clear routing guidance.

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

list_servicesA
Read-only
Inspect

WHAT: www pointer only — Leistungen list on www /leistungen. maps returns html link. DOES NOT list service rows. NEXT: www list_services.

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?

Annotations already declare readOnlyHint=true, and the description adds a valuable behavioral trait: it returns an HTML link and does not list service rows. This goes beyond the annotation by clarifying the tool's limited scope, but it still does not describe the exact link structure (which is likely covered by the output schema).

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

Conciseness4/5

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

The description is extremely concise, using clear 'WHAT' and 'NEXT' markers to structure the information. Each clause adds value: it defines the tool as a pointer, states the target URL, clarifies it does not list rows, and directs to the successor tool. No wasteful filler.

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, one well-documented parameter, and annotations covering read-only behavior, the description is sufficiently complete. It clearly positions the tool relative to its purpose and the alternative for actual listing. The only minor gap is the lack of detail about the exact format of the returned HTML link, but that is likely specified in 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?

The single parameter 'locale' has a thorough schema description covering default, allowed enum, behavior for other values, and pointers to alternative locale tools. Schema coverage is 100%, so the description does not need to add parameter details; it only reinforces the German-only constraint. Given high coverage, a baseline of 3 is appropriate.

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

Purpose5/5

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

The description clearly states the tool's role: it is a 'www pointer only' that returns an HTML link to the /leistungen page, and explicitly disclaims that it does not list service rows. This distinguishes it from any list-like sibling and is a specific verb+resource action.

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 description tells the agent that this tool provides a pointer/link rather than actual data, and points to 'www list_services' as the next step for getting the actual list. It clearly indicates when not to use this tool (if service rows are needed) and suggests an alternative, though it does not elaborate on the full set of use cases.

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

list_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
Behavior4/5

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

Annotations already mark the tool readOnlyHint=true, so the safety profile is established. The description adds useful behavioral detail by specifying that all slugs are returned in a flat string array and that there are exactly 52, plus explicitly stating the no-argument call shape. This goes beyond the minimal annotation-only disclosure.

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

Conciseness5/5

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

The description is extremely compact and well structured with WHAT/USE/NEXT labels. Every sentence carries meaningful information and there is no filler or repetition of the tool name.

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 zero-parameter, read-only tool with an output schema, the description fully covers what the tool does, why to use it, and what to do next. The downstream tool hints complete the picture, so an agent has everything needed to invoke 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 has zero parameters and the schema already documents that no arguments are needed. The description's 'Call with {}' reinforces this, and with 100% schema coverage there is no missing parameter information to compensate for. A baseline of 4 is appropriate for a no-parameter 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?

The description states exactly what the tool returns: 'All 52 maps slugs as a flat string array.' It names the specific resource (map slugs) and the output format, which clearly separates it from sibling list tools. The 'NEXT' note also anchors it in the workflow by naming get_service_area(slug) and get_embed_map(slug).

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 description explicitly says 'USE for validation or autocomplete,' giving clear contexts where this tool is the right choice. It does not enumerate alternatives or exclusion cases, but the 'NEXT' line implies downstream usage and the sibling list names make the distinction inferable.

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

list_whatsapp_optionsA
Read-only
Inspect

WHAT: WhatsApp situation options (link only — zugefallen/abgeschlossen/zylinder/beratung style ids). 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.

TDQS

A4.7/5.0
Behavior5/5

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

Beyond the readOnlyHint annotation, the description adds valuable behavioral context: it returns link-only options, performs no form submission, and has no message-sending side effect. It also hints at the nature of the returned ids. No contradiction with annotations; it enriches them.

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

Conciseness5/5

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

The description is telegraphic but information-dense, with clear labels (WHAT, USE, NEXT) front-loading the key points. Every sentence earns its place: purpose, side-effect negation, usage ordering, and follow-up options. No fluff.

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 readOnlyHint annotation, the description covers the remaining essentials: what the tool returns conceptually, what it does not do, and what to call next. It is complete for correct selection and invocation.

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 locale parameter is fully documented in the schema. The tool description does not need to repeat parameter details; it focuses on overall behavior. Baseline 3 is appropriate since the schema carries the semantic burden.

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: 'list' 'WhatsApp situation options', and differentiates from compose_whatsapp by noting it is link-only and does not send a message. Examples of option ids (zugefallen/abgeschlossen/zylinder/beratung) further clarify the resource. This clearly distinguishes it from siblings in the tool 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?

Explicitly says 'USE before compose_whatsapp' and provides the next step 'compose_whatsapp(option)'. It also states what it does NOT do ('No form submit', 'DOES NOT send a message'), helping the agent avoid misuse. This is direct, actionable guidance with clear context.

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

list_wissenC
Read-only
Inspect

WHAT: www pointer only — Wissen lexicon hub on www /wissen. maps returns html. NEXT: www list_wissen.

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

C2.2/5.0
Behavior2/5

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

Annotations already state readOnlyHint=true, and the description adds 'www pointer only', which suggests the tool returns pointers rather than full content. However, the phrasing is so cryptic that the behavioral contract remains unclear, and 'maps returns html' is not clearly tied to this tool.

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

Conciseness2/5

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

The text is short, but brevity is not the issue: clarity is. Fragments like 'WHAT: www pointer only', 'maps returns html', and 'NEXT: www list_wissen' are under-specified rather than concise, and they do not form a coherent structure.

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

Completeness2/5

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

Even with a trivial parameter set, an output schema, and readOnly annotations, the description fails to state plainly what list_wissen returns or what 'Wissen lexicon hub' means in practice. An agent would still be guessing about the tool's actual purpose and result shape.

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 input schema already explains the locale parameter in detail, including its German-only behavior and the alternative for multi-locale usage. The description adds no parameter-specific meaning, so the baseline of 3 is appropriate.

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

Purpose2/5

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

The description mentions 'Wissen lexicon hub on www /wissen' as the resource, but it never states the action clearly. 'www pointer only' and 'NEXT: www list_wissen' read like developer shorthand rather than a specification of what the tool does or how it differs from siblings like get_wissen_entry.

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

Usage Guidelines2/5

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

No explicit guidance is given on when to use list_wissen versus alternatives such as get_wissen_entry or list_locales. The phrase 'maps returns html' hints at an environment distinction but does not explain a decision rule, and 'NEXT: www list_wissen' is not actionable guidance.

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

resolve_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

A4.2/5.0
Behavior5/5

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

Annotations provide readOnlyHint=true, but the description goes well beyond that by revealing non-obvious trap behaviors: maps is de-only, non-de locales still resolve to a de URL, unknown paths may return a www-pointer, and /en is never created. This gives an agent critical behavioral context that prevents incorrect assumptions about locale handling.

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 information-dense, using labeled segments (WHAT, REQUIRED, DOES NOT, NEXT) that are easy to scan and front-loaded with the core purpose. The telegraphic style sacrifices some readability, but every segment earns its place by covering behavior, requirements, limitations, and next steps.

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 the tool's two required parameters and the presence of an output schema, the description covers the important edge cases: de-only maps, unknown-path fallback, and the absence of /en creation. The phrase 'may www-pointer' leaves some ambiguity about the exact outcome for unknown paths, but the overall guidance is sufficient for correct invocation in most cases.

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% for both parameters, so baseline is 3. The description adds value by explaining that known Gebiet paths resolve to maps while unknown paths may yield a www-pointer, and it elaborates on locale behavior ('non-de requested still yields ... with locale=de'). This enriches the semantics beyond the schema's own descriptions.

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 starts with 'WHAT: path + locale → maps URL', giving a clear transform and resource. It further clarifies the exact scope with 'maps is de-only' and 'Known Gebiet paths resolve to maps; unknown paths may www-pointer', so an agent can tell what the tool does. It does not explicitly differentiate from siblings like resolve_maps_url, but the behavior is clear enough.

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 description provides explicit situational guidance: 'non-de requested still yields ... with locale=de' and 'DOES NOT create /en on maps' tell the agent when this tool is not appropriate. The line 'NEXT: get_embed_map, www resolve_locale_url for marketing locales' points to alternatives, though 'www resolve_locale_url' is not a clearly named sibling, slightly reducing clarity.

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

resolve_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. USE to normalize pasted maps links. DOES NOT accept www hosts (not_maps_host). NEXT: get_service_area, get_embed_map.

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/5.0
Behavior4/5

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

Annotations provide readOnlyHint, and the description adds meaningful behavior beyond that: it specifies the output discriminator ('kind=hub|ort') and a validation boundary ('DOES NOT accept www hosts (not_maps_host)'). No contradiction with annotations. It could disclose more about invalid or empty input, but the key traits are covered.

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

Conciseness5/5

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

The description uses compact labeled sections (WHAT, RETURNS, USE, DOES NOT, NEXT) with no filler. Each sentence carries distinct operational information and the most important scoping details are front-loaded.

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 simple optional-parameter resolver with an output schema, the description covers the host, the accepted input forms, the purpose, and an error boundary. The main gap is the absence of behavior when multiple params (q/url/path) are passed together, but the low complexity and existing output schema keep this from being a serious deficiency.

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 baseline is 3. The description adds the grouping 'url/path/q' and the maps.ikeytz.com host context, but it does not explain precedence when multiple optional parameters are supplied, nor does it add formats beyond what the schema already gives.

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 'WHAT: Resolve a maps.ikeytz.com url/path/q to hub or Gebiet', naming a specific verb, resource, and outcome. It also states the return shape ('kind=hub|ort + area fields when ort') and the normalization use case. It does not explicitly name sibling tools it is not, so it misses the top tier, but the purpose 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 Guidelines4/5

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

'USE to normalize pasted maps links' gives a clear, concrete trigger for when to invoke this tool. 'DOES NOT accept www hosts' is an explicit exclusion. No alternatives are named for when not to use it, so it stops 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.

site_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

A4.2/5.0
Behavior4/5

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

readOnlyHint=true already signals a safe read; the description adds return payload fields, the walkIn=false constant, the sister www MCP note, and the no-euro exclusion, all useful behavioral context 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?

Compact and front-loaded with the resource identity; labeled fragments (WHO/WHAT, RETURNS, USE, DOES NOT, NEXT) make it scannable. The phrase 'sister www MCP note' is cryptic but not wasteful.

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 single optional-parameter read-only tool with an output schema, the description covers what the site is, what is returned, when to use it, what it does not do, and which tools to try next—nothing material 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 fully explained in the schema (German-only, omit or pass de, other values ignored, not a www locale switch). The description itself adds no parameter-level detail, so the baseline 3 is appropriate.

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

Purpose5/5

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

States precisely that the tool describes maps.ikeytz.com (52 Einsatzgebiet maps for Schlüsseldienst Ludwigsburg) and explicitly excludes the www price-site scope, distinguishing it from the many get_* siblings. 'RETURNS brand, owner, count, mcp, registry...' supplies a concrete operational outcome.

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 an explicit use case ('USE as the maps brand card') and a clear exclusion ('DOES NOT quote euro', 'not the www price site'). It does not name a specific sibling to use instead for pricing, so it stops short of a full 5.

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. Dates show when Glama detected each change.

  1. 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"
        +}
  2. 2 tool updates
    • Changedget_discovery1 field changed
      • changedInput schema / properties / which / enum
        Previous 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",
        -  "agent-skills"
        -]New 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"
        +]
    • Addedget_grenze
  3. 66 tool updates
    • First observedcompose_mailto
    • First observedcompose_tel_landline
    • First observedcompose_tel_mobile
    • First observedcompose_whatsapp
    • First observeddistance_to_office
    • First observedfind_by_area
    • First observedfind_by_gebiet
    • First observedfind_by_geo
    • First observedfind_by_google_maps
    • First observedfind_by_icbm
    • First observedfind_by_keyword
    • First observedfind_by_plz
    • First observedfind_by_serp
    • First observedget_about
    • First observedget_agb
    • First observedget_ai_page
    • First observedget_ai_txt
    • First observedget_auswahl_item
    • First observedget_business_identity
    • First observedget_contact
    • First observedget_copyright
    • First observedget_datenschutz
    • First observedget_discovery
    • First observedget_embed_map
    • First observedget_emergency
    • First observedget_faq
    • First observedget_geo_api
    • First observedget_geo_office
    • First observedget_geschichte
    • First observedget_hub
    • First observedget_impressum
    • First observedget_invoice_line_items
    • First observedget_lage
    • First observedget_legal
    • First observedget_links
    • First observedget_llms_mcp_server
    • First observedget_llms_mcp_web
    • First observedget_llms_txt
    • First observedget_nutzungsbedingungen
    • First observedget_ort_datetime
    • First observedget_page_summary
    • First observedget_partner_info
    • First observedget_prices
    • First observedget_ratgeber
    • First observedget_review_url
    • First observedget_serp_snippet
    • First observedget_service_area
    • First observedget_sitemap_txt
    • First observedget_urheberrecht
    • First observedget_widerruf
    • First observedget_wissen_entry
    • First observedlist_auswahl
    • First observedlist_faq
    • First observedlist_footer
    • First observedlist_locales
    • First observedlist_nav
    • First observedlist_plz
    • First observedlist_ratgeber
    • First observedlist_service_areas
    • First observedlist_services
    • First observedlist_slugs
    • First observedlist_whatsapp_options
    • First observedlist_wissen
    • First observedresolve_locale_url
    • First observedresolve_maps_url
    • First observedsite_overview

Frequently Asked Questions

Discussions

No comments yet. Be the first to start the discussion!

Related MCP Connectors

Related MCP Servers

  • A
    license
    A
    quality
    A
    maintenance
    Read-only MCP server for aggregate HitKeep analytics and official documentation, including traffic, events, goals, funnels, ecommerce, Search Console, and AI visibility reporting.
    16
    85
    MIT
  • 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
Try in Browser

Glama MCP Gateway

Add one secure layer between your agents and this server.

TDQS

B3.1/5.0
Disambiguation2/5

Many tools have heavily overlapping purposes: find_by_geo, find_by_google_maps, and find_by_icbm all do the same coordinate ranking, while find_by_area is an explicit alias of find_by_gebiet. Several get_llms_* and get_ai_txt/get_sitemap_txt tools are just aliases of get_discovery, forcing agents to distinguish between near-identical accessors.

Naming Consistency4/5

The vast majority follow a clear verb_noun snake_case pattern (compose_*, find_by_*, get_*, list_*). Minor deviations like distance_to_office, site_overview, and resolve_maps_url break the pattern slightly, but the overall convention is highly predictable.

Tool Count1/5

67 tools is extreme for a read-only maps discovery server. Many are aliases or www pointer-only stubs that add bulk without adding distinct capability, making the surface far larger than the underlying domain requires.

Completeness4/5

The core domain of listing, finding, and describing the 52 Einsatzgebiete is thoroughly covered: enumeration, slug/PLZ/geo/keyword lookup, polygons, embed URLs, prose texts, and discovery files. The main gap is that many legal and content tools return only www pointers rather than actual content, but this is explicit and mitigated by handoff notes.

Resources