Servidor MCP

ikeytz – Schlüsseldienst Ludwigsburg

com.ikeytz/website
Negocio y operaciones Comunicación Público y accesible MCP 2026-07-28

Qué hace este MCP

Publishes read-only business information, locksmith pricing and service details, and links for phone, email, and WhatsApp contact.

compose_mailto
Compose Mailto
WHAT: mailto:info@ikeytz.com with the SAME prefab as compose_whatsapp (subject+body). option = contactOption of one of the 10 end-invoices, or cylinder_mount, or beratung. Call with {} → beratung (empty advice template), not a bare mailbox with no text. Does not send email. Partner mailbox is on get_partner_info.partnerEmail (not this href).
Solo lectura
Esquema de entrada
{'type': 'object', 'properties': {'option': {'enum': ['opening_slam_day', 'opening_slam_night', 'opening_locked_day', 'opening_locked_night', 'pkg_key_slam_day', 'pkg_key_slam_night', 'pkg_key_locked_day', 'pkg_key_locked_night', 'cylinder_only_day', 'cylinder_only_night', 'cylinder_mount', 'beratung', 'zugefallen', 'abgeschlossen', 'zylinder'], 'type': 'string', 'description': 'Same ids as compose_whatsapp. Omit = beratung template, still a prefab.'}}}
Esquema de salida
{'type': 'object', 'required': ['ok', 'tool', 'attribution'], 'properties': {'ok': {'type': 'boolean', 'description': 'true = use summary, canonicalUrl, and extra keys. false = do not invent data; read error + hint and retry with valid args or open hint.'}, 'hint': {'type': 'string', 'description': 'Present when ok=false. Absolute URL the agent should open or pass to get_ai_page / get_discovery.'}, 'href': {'type': 'string', 'description': 'mailto:info@ikeytz.com?subject=…&body=…'}, 'tool': {'type': 'string', 'description': 'Echo of the tool name that produced this object (e.g. get_service_area).'}, 'error': {'type': 'string', 'description': 'Present when ok=false. Codes include: unknown_tool, unknown_place, unknown_auswahl, unknown_ratgeber, unknown_doc, unknown_discovery, faq_not_found, wissen_not_found, serp_not_found, q_required, bad_datetime, bad_when_key, plus HTTP errors from fetch.'}, 'locale': {'enum': ['de', 'en', 'fr', 'ru', 'fa', 'ar', 'tr'], 'type': 'string', 'description': 'Locale actually used for URLs (args.locale or de).'}, 'option': {'type': 'string', 'description': 'Resolved contactOption id'}, 'related': {'type': 'array', 'items': {'type': 'string', 'format': 'uri'}, 'description': 'Always includes https://www.ikeytz.com/llms.txt. Geo tools also include https://maps.ikeytz.com/llms.txt.'}, 'subject': {'type': 'string'}, 'summary': {'type': 'string', 'description': 'Primary text for the model. For discovery tools this is the file window (possibly thousands of characters). For list tools a compact one-liner. Quote with attribution.'}, 'whenKey': {'type': ['string', 'null']}, 'ambiguous': {'type': 'boolean'}, 'amountEur': {'type': ['number', 'null']}, 'attribution': {'type': 'string', 'description': "Required citation: 'Quelle: Schlüsseldienst Ludwigsburg ikeytz (ikeytz.com) · ai-train=no · https://www.ikeytz.com/.well-known/ai.txt'"}, 'canonicalUrl': {'type': 'string', 'description': 'Best URL to show the user: https://www.ikeytz.com… page, or tel:+49…, mailto:…, https://wa.me/…. Prefer this over constructing URLs.'}, 'isEndInvoice': {'type': 'boolean'}, 'situationKey': {'type': ['string', 'null']}}, '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 calls /api/*. Attribution must be kept when quoting. Policy: ai-input yes with attribution; ai-train=no.', 'additionalProperties': True}
compose_tel_landline
Compose Tel Landline
WHAT: tel: href for the landline (Festnetz). Call with {}. Mobile/24h emergency = compose_tel_mobile.
Solo lectura
Esquema de entrada
{'type': 'object', 'properties': {}, 'description': 'This tool takes no arguments. Call tools/call with arguments: {}. Extra keys are ignored. Result is always the same public href (tel/mailto) or locale list.', 'additionalProperties': False}
Esquema de salida
{'type': 'object', 'required': ['ok', 'tool', 'attribution'], 'properties': {'ok': {'type': 'boolean', 'description': 'true = use summary, canonicalUrl, and extra keys. false = do not invent data; read error + hint and retry with valid args or open hint.'}, 'hint': {'type': 'string', 'description': 'Present when ok=false. Absolute URL the agent should open or pass to get_ai_page / get_discovery.'}, 'href': {'type': 'string', 'description': 'tel:+49… landline'}, 'tool': {'type': 'string', 'description': 'Echo of the tool name that produced this object (e.g. get_service_area).'}, 'error': {'type': 'string', 'description': 'Present when ok=false. Codes include: unknown_tool, unknown_place, unknown_auswahl, unknown_ratgeber, unknown_doc, unknown_discovery, faq_not_found, wissen_not_found, serp_not_found, q_required, bad_datetime, bad_when_key, plus HTTP errors from fetch.'}, 'locale': {'enum': ['de', 'en', 'fr', 'ru', 'fa', 'ar', 'tr'], 'type': 'string', 'description': 'Locale actually used for URLs (args.locale or de).'}, 'related': {'type': 'array', 'items': {'type': 'string', 'format': 'uri'}, 'description': 'Always includes https://www.ikeytz.com/llms.txt. Geo tools also include https://maps.ikeytz.com/llms.txt.'}, 'summary': {'type': 'string', 'description': 'Primary text for the model. For discovery tools this is the file window (possibly thousands of characters). For list tools a compact one-liner. Quote with attribution.'}, 'attribution': {'type': 'string', 'description': "Required citation: 'Quelle: Schlüsseldienst Ludwigsburg ikeytz (ikeytz.com) · ai-train=no · https://www.ikeytz.com/.well-known/ai.txt'"}, 'canonicalUrl': {'type': 'string', 'description': 'Best URL to show the user: https://www.ikeytz.com… page, or tel:+49…, mailto:…, https://wa.me/…. Prefer this over constructing URLs.'}}, '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 calls /api/*. Attribution must be kept when quoting. Policy: ai-input yes with attribution; ai-train=no.', 'additionalProperties': True}
compose_tel_mobile
Compose Tel Mobile
WHAT: tel: href for the 24/7 mobile (Handy). Call with {}. RETURNS href and canonicalUrl both tel:+49…. Show this to the user; do not pretend the call happened. Landline = compose_tel_landline.
Solo lectura
Esquema de entrada
{'type': 'object', 'properties': {}, 'description': 'This tool takes no arguments. Call tools/call with arguments: {}. Extra keys are ignored. Result is always the same public href (tel/mailto) or locale list.', 'additionalProperties': False}
Esquema de salida
{'type': 'object', 'required': ['ok', 'tool', 'attribution'], 'properties': {'ok': {'type': 'boolean', 'description': 'true = use summary, canonicalUrl, and extra keys. false = do not invent data; read error + hint and retry with valid args or open hint.'}, 'hint': {'type': 'string', 'description': 'Present when ok=false. Absolute URL the agent should open or pass to get_ai_page / get_discovery.'}, 'href': {'type': 'string', 'description': 'tel:+49… mobile'}, 'tool': {'type': 'string', 'description': 'Echo of the tool name that produced this object (e.g. get_service_area).'}, 'error': {'type': 'string', 'description': 'Present when ok=false. Codes include: unknown_tool, unknown_place, unknown_auswahl, unknown_ratgeber, unknown_doc, unknown_discovery, faq_not_found, wissen_not_found, serp_not_found, q_required, bad_datetime, bad_when_key, plus HTTP errors from fetch.'}, 'locale': {'enum': ['de', 'en', 'fr', 'ru', 'fa', 'ar', 'tr'], 'type': 'string', 'description': 'Locale actually used for URLs (args.locale or de).'}, 'related': {'type': 'array', 'items': {'type': 'string', 'format': 'uri'}, 'description': 'Always includes https://www.ikeytz.com/llms.txt. Geo tools also include https://maps.ikeytz.com/llms.txt.'}, 'summary': {'type': 'string', 'description': 'Primary text for the model. For discovery tools this is the file window (possibly thousands of characters). For list tools a compact one-liner. Quote with attribution.'}, 'attribution': {'type': 'string', 'description': "Required citation: 'Quelle: Schlüsseldienst Ludwigsburg ikeytz (ikeytz.com) · ai-train=no · https://www.ikeytz.com/.well-known/ai.txt'"}, 'canonicalUrl': {'type': 'string', 'description': 'Best URL to show the user: https://www.ikeytz.com… page, or tel:+49…, mailto:…, https://wa.me/…. Prefer this over constructing URLs.'}}, '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 calls /api/*. Attribution must be kept when quoting. Policy: ai-input yes with attribution; ai-train=no.', 'additionalProperties': True}
compose_whatsapp
Compose Whatsapp
WHAT: Build a https://wa.me/… URL with one prefab = one end-invoice (or mount 49 / beratung). option = contactOption from get_prices.composition.endInvoices or get_invoice_line_items.contactOption: opening_slam_day|opening_slam_night|opening_locked_day|opening_locked_night|pkg_key_slam_day|pkg_key_slam_night|pkg_key_locked_day|pkg_key_locked_night|cylinder_only_day|cylinder_only_night|cylinder_mount|beratung. Deprecated aliases zugefallen|abgeschlossen|zylinder map to the *day* invoice and set ambiguous=true — do not use them. Omit/unknown → beratung. 49 € is mount, not night. Does not send WhatsApp. List via list_whatsapp_options.
Solo lectura
Esquema de entrada
{'type': 'object', 'properties': {'option': {'enum': ['opening_slam_day', 'opening_slam_night', 'opening_locked_day', 'opening_locked_night', 'pkg_key_slam_day', 'pkg_key_slam_night', 'pkg_key_locked_day', 'pkg_key_locked_night', 'cylinder_only_day', 'cylinder_only_night', 'cylinder_mount', 'beratung', 'zugefallen', 'abgeschlossen', 'zylinder'], 'type': 'string', 'description': 'One invoice contactOption. Night/WE/holiday uses *_night (149/179/198/228/119), not 49. cylinder_mount is the 49 € add-on, not an end-invoice.'}}}
Esquema de salida
{'type': 'object', 'required': ['ok', 'tool', 'attribution'], 'properties': {'ok': {'type': 'boolean', 'description': 'true = use summary, canonicalUrl, and extra keys. false = do not invent data; read error + hint and retry with valid args or open hint.'}, 'hint': {'type': 'string', 'description': 'Present when ok=false. Absolute URL the agent should open or pass to get_ai_page / get_discovery.'}, 'href': {'type': 'string', 'description': 'https://wa.me/… URL'}, 'tool': {'type': 'string', 'description': 'Echo of the tool name that produced this object (e.g. get_service_area).'}, 'error': {'type': 'string', 'description': 'Present when ok=false. Codes include: unknown_tool, unknown_place, unknown_auswahl, unknown_ratgeber, unknown_doc, unknown_discovery, faq_not_found, wissen_not_found, serp_not_found, q_required, bad_datetime, bad_when_key, plus HTTP errors from fetch.'}, 'locale': {'enum': ['de', 'en', 'fr', 'ru', 'fa', 'ar', 'tr'], 'type': 'string', 'description': 'Locale actually used for URLs (args.locale or de).'}, 'option': {'type': 'string', 'description': 'Resolved contactOption id'}, 'related': {'type': 'array', 'items': {'type': 'string', 'format': 'uri'}, 'description': 'Always includes https://www.ikeytz.com/llms.txt. Geo tools also include https://maps.ikeytz.com/llms.txt.'}, 'summary': {'type': 'string', 'description': 'Primary text for the model. For discovery tools this is the file window (possibly thousands of characters). For list tools a compact one-liner. Quote with attribution.'}, 'whenKey': {'type': ['string', 'null']}, 'ambiguous': {'type': 'boolean'}, 'amountEur': {'type': ['number', 'null']}, 'attribution': {'type': 'string', 'description': "Required citation: 'Quelle: Schlüsseldienst Ludwigsburg ikeytz (ikeytz.com) · ai-train=no · https://www.ikeytz.com/.well-known/ai.txt'"}, 'canonicalUrl': {'type': 'string', 'description': 'Best URL to show the user: https://www.ikeytz.com… page, or tel:+49…, mailto:…, https://wa.me/…. Prefer this over constructing URLs.'}, 'isEndInvoice': {'type': 'boolean'}, 'situationKey': {'type': ['string', 'null']}}, '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 calls /api/*. Attribution must be kept when quoting. Policy: ai-input yes with attribution; ai-train=no.', 'additionalProperties': True}
find_by_keyword
Find By Keyword
WHAT: Substring search (case-insensitive) over https://www.ikeytz.com/llms-keywords.txt (phrase → URL map). REQUIRED q. Default 15 lines, max 30. Empty q → q_required. RETURNS q, count, lines[] (raw TSV-like rows). locale does not filter the file. USE to map a user phrase to URLs. NEXT: get_ai_page on a returned www path.
Solo lectura
Esquema de entrada
{'type': 'object', 'required': ['q'], 'properties': {'q': {'type': 'string', 'minLength': 1, 'description': 'Required search substring. Matched against the entire keyword line (phrase and URLs).'}, 'limit': {'type': 'number', 'default': 15, 'maximum': 30, 'minimum': 1, 'description': 'Max matching lines. Default 15, hard max 30.'}, 'locale': {'enum': ['de', 'en', 'fr', 'ru', 'fa', 'ar', 'tr'], 'type': 'string', 'default': 'de', 'description': 'HTML locale for canonicalUrl and path prefixes. de = default, URLs have no prefix (https://www.ikeytz.com/preise). en|fr|ru|fa|ar|tr = prefix /{locale}/ (https://www.ikeytz.com/en/preise). Omit or empty = de. Does not change prices, phone numbers, or legal German names. Not a maps.ikeytz.com locale (maps is German-only).'}}}
Esquema de salida
{'type': 'object', 'required': ['ok', 'tool', 'attribution'], 'properties': {'q': {'type': 'string', 'description': 'Search query'}, 'ok': {'type': 'boolean', 'description': 'true = use summary, canonicalUrl, and extra keys. false = do not invent data; read error + hint and retry with valid args or open hint.'}, 'hint': {'type': 'string', 'description': 'Present when ok=false. Absolute URL the agent should open or pass to get_ai_page / get_discovery.'}, 'tool': {'type': 'string', 'description': 'Echo of the tool name that produced this object (e.g. get_service_area).'}, 'count': {'type': 'number', 'description': 'Lines returned'}, 'error': {'type': 'string', 'description': 'Present when ok=false. Codes include: unknown_tool, unknown_place, unknown_auswahl, unknown_ratgeber, unknown_doc, unknown_discovery, faq_not_found, wissen_not_found, serp_not_found, q_required, bad_datetime, bad_when_key, plus HTTP errors from fetch.'}, 'lines': {'type': 'array', 'items': {'type': 'string'}, 'description': 'Matching keyword rows'}, 'locale': {'enum': ['de', 'en', 'fr', 'ru', 'fa', 'ar', 'tr'], 'type': 'string', 'description': 'Locale actually used for URLs (args.locale or de).'}, 'related': {'type': 'array', 'items': {'type': 'string', 'format': 'uri'}, 'description': 'Always includes https://www.ikeytz.com/llms.txt. Geo tools also include https://maps.ikeytz.com/llms.txt.'}, 'summary': {'type': 'string', 'description': 'Primary text for the model. For discovery tools this is the file window (possibly thousands of characters). For list tools a compact one-liner. Quote with attribution.'}, 'attribution': {'type': 'string', 'description': "Required citation: 'Quelle: Schlüsseldienst Ludwigsburg ikeytz (ikeytz.com) · ai-train=no · https://www.ikeytz.com/.well-known/ai.txt'"}, 'canonicalUrl': {'type': 'string', 'description': 'Best URL to show the user: https://www.ikeytz.com… page, or tel:+49…, mailto:…, https://wa.me/…. Prefer this over constructing URLs.'}}, '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 calls /api/*. Attribution must be kept when quoting. Policy: ai-input yes with attribution; ai-train=no.', 'additionalProperties': True}
get_about
Get About
WHAT: Pointer to /ueber-uns (about, owner). For NAP facts prefer get_business_identity. NEXT: get_ai_page({path:'/ueber-uns'}).
Solo lectura
Esquema de entrada
{'type': 'object', 'properties': {'locale': {'enum': ['de', 'en', 'fr', 'ru', 'fa', 'ar', 'tr'], 'type': 'string', 'default': 'de', 'description': 'HTML locale for canonicalUrl and path prefixes. de = default, URLs have no prefix (https://www.ikeytz.com/preise). en|fr|ru|fa|ar|tr = prefix /{locale}/ (https://www.ikeytz.com/en/preise). Omit or empty = de. Does not change prices, phone numbers, or legal German names. Not a maps.ikeytz.com locale (maps is German-only).'}}}
Esquema de salida
{'type': 'object', 'required': ['ok', 'tool', 'attribution'], 'properties': {'ok': {'type': 'boolean', 'description': 'true = use summary, canonicalUrl, and extra keys. false = do not invent data; read error + hint and retry with valid args or open hint.'}, 'hint': {'type': 'string', 'description': 'Present when ok=false. Absolute URL the agent should open or pass to get_ai_page / get_discovery.'}, 'tool': {'type': 'string', 'description': 'Echo of the tool name that produced this object (e.g. get_service_area).'}, 'error': {'type': 'string', 'description': 'Present when ok=false. Codes include: unknown_tool, unknown_place, unknown_auswahl, unknown_ratgeber, unknown_doc, unknown_discovery, faq_not_found, wissen_not_found, serp_not_found, q_required, bad_datetime, bad_when_key, plus HTTP errors from fetch.'}, 'locale': {'enum': ['de', 'en', 'fr', 'ru', 'fa', 'ar', 'tr'], 'type': 'string', 'description': 'Locale actually used for URLs (args.locale or de).'}, 'related': {'type': 'array', 'items': {'type': 'string', 'format': 'uri'}, 'description': 'Always includes https://www.ikeytz.com/llms.txt. Geo tools also include https://maps.ikeytz.com/llms.txt.'}, 'summary': {'type': 'string', 'description': 'Primary text for the model. For discovery tools this is the file window (possibly thousands of characters). For list tools a compact one-liner. Quote with attribution.'}, 'attribution': {'type': 'string', 'description': "Required citation: 'Quelle: Schlüsseldienst Ludwigsburg ikeytz (ikeytz.com) · ai-train=no · https://www.ikeytz.com/.well-known/ai.txt'"}, 'canonicalUrl': {'type': 'string', 'description': 'Best URL to show the user: https://www.ikeytz.com… page, or tel:+49…, mailto:…, https://wa.me/…. Prefer this over constructing URLs.'}}, '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 calls /api/*. Attribution must be kept when quoting. Policy: ai-input yes with attribution; ai-train=no.', 'additionalProperties': True}
get_ai_page
Get Ai Page
WHAT: Fetches public https://www.ikeytz.com/ai-pages/{locale}/{file}.txt (HTML-parity fulltext). path=/ → index.txt; else path without leading slash + .txt. summary = first 4000 chars; truncated=true if longer. HTTP errors → ok=false. USE for page content. /review has no HTML-parity footer. NEXT: get_serp_snippet for title/description only.
Solo lectura
Esquema de entrada
{'type': 'object', 'required': ['path'], 'properties': {'path': {'type': 'string', 'description': 'Required. Marketing path: / , /preise , /en/preise , /schluesseldienst-ludwigsburg-pattonville , /auswahl/tuer-zugefallen . Locale prefix in the path overrides args.locale if present.'}, 'locale': {'enum': ['de', 'en', 'fr', 'ru', 'fa', 'ar', 'tr'], 'type': 'string', 'default': 'de', 'description': 'HTML locale for canonicalUrl and path prefixes. de = default, URLs have no prefix (https://www.ikeytz.com/preise). en|fr|ru|fa|ar|tr = prefix /{locale}/ (https://www.ikeytz.com/en/preise). Omit or empty = de. Does not change prices, phone numbers, or legal German names. Not a maps.ikeytz.com locale (maps is German-only).'}}}
Esquema de salida
{'type': 'object', 'required': ['ok', 'tool', 'attribution'], 'properties': {'ok': {'type': 'boolean', 'description': 'true = use summary, canonicalUrl, and extra keys. false = do not invent data; read error + hint and retry with valid args or open hint.'}, 'hint': {'type': 'string', 'description': 'Present when ok=false. Absolute URL the agent should open or pass to get_ai_page / get_discovery.'}, 'path': {'type': 'string', 'description': 'Resolved path'}, 'tool': {'type': 'string', 'description': 'Echo of the tool name that produced this object (e.g. get_service_area).'}, 'error': {'type': 'string', 'description': 'Present when ok=false. Codes include: unknown_tool, unknown_place, unknown_auswahl, unknown_ratgeber, unknown_doc, unknown_discovery, faq_not_found, wissen_not_found, serp_not_found, q_required, bad_datetime, bad_when_key, plus HTTP errors from fetch.'}, 'locale': {'enum': ['de', 'en', 'fr', 'ru', 'fa', 'ar', 'tr'], 'type': 'string', 'description': 'Locale actually used for URLs (args.locale or de).'}, 'related': {'type': 'array', 'items': {'type': 'string', 'format': 'uri'}, 'description': 'Always includes https://www.ikeytz.com/llms.txt. Geo tools also include https://maps.ikeytz.com/llms.txt.'}, 'summary': {'type': 'string', 'description': 'Primary text for the model. For discovery tools this is the file window (possibly thousands of characters). For list tools a compact one-liner. Quote with attribution.'}, 'aiPageUrl': {'type': 'string', 'description': 'https://www.ikeytz.com/ai-pages/{locale}/….txt'}, 'truncated': {'type': 'boolean', 'description': 'true if body was cut at 4000 chars'}, 'attribution': {'type': 'string', 'description': "Required citation: 'Quelle: Schlüsseldienst Ludwigsburg ikeytz (ikeytz.com) · ai-train=no · https://www.ikeytz.com/.well-known/ai.txt'"}, 'canonicalUrl': {'type': 'string', 'description': 'Best URL to show the user: https://www.ikeytz.com… page, or tel:+49…, mailto:…, https://wa.me/…. Prefer this over constructing URLs.'}}, '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 calls /api/*. Attribution must be kept when quoting. Policy: ai-input yes with attribution; ai-train=no.', 'additionalProperties': True}
get_ai_txt
Get Ai Txt
WHAT: Fetch /.well-known/ai.txt — crawl/training policy (ai-input yes with attribution, ai-train=no, contact). Must be respected when quoting site text.
Solo lectura
Esquema de entrada
{'type': 'object', 'properties': {'limit': {'type': 'number', 'maximum': 10000, 'minimum': 1, 'description': 'Maximum number of lines to return after offset. Omit or null = return every remaining line in the loaded file. Clamped to 1..10000. For sitemap.txt (~9076 http-URLs, Stand 2026-09-22) omit limit to get the full list (or page with offset/limit + nextOffset). For llms-keywords.txt prefer a window; the file is huge. Meta also as trailing # MCP-META lines in summary.'}, 'offset': {'type': 'number', 'default': 0, 'minimum': 0, 'description': '0-based line index into the fetched UTF-8 file (split on \\n). 0 = first line. Omit = 0. Combined with limit = a sliding window. Use nextOffset from the previous result to page. Does not count bytes; one line can be a long URL.'}}}
Esquema de salida
{'type': 'object', 'required': ['ok', 'tool', 'attribution'], 'properties': {'ok': {'type': 'boolean', 'description': 'true = use summary, canonicalUrl, and extra keys. false = do not invent data; read error + hint and retry with valid args or open hint.'}, 'hint': {'type': 'string', 'description': 'Present when ok=false. Absolute URL the agent should open or pass to get_ai_page / get_discovery.'}, 'path': {'type': 'string', 'description': 'Public path on www, e.g. /llms.txt or /.well-known/ai.txt'}, 'tool': {'type': 'string', 'description': 'Echo of the tool name that produced this object (e.g. get_service_area).'}, 'error': {'type': 'string', 'description': 'Present when ok=false. Codes include: unknown_tool, unknown_place, unknown_auswahl, unknown_ratgeber, unknown_doc, unknown_discovery, faq_not_found, wissen_not_found, serp_not_found, q_required, bad_datetime, bad_when_key, plus HTTP errors from fetch.'}, 'limit': {'type': ['number', 'null'], 'description': 'Applied line limit, or null if the caller omitted limit.'}, 'which': {'type': 'string', 'description': 'Resolved discovery id after alias fold (llms, sitemap-txt, ard, ai-catalog, …).'}, 'locale': {'enum': ['de', 'en', 'fr', 'ru', 'fa', 'ar', 'tr'], 'type': 'string', 'description': 'Locale actually used for URLs (args.locale or de).'}, 'offset': {'type': 'number', 'description': 'Applied 0-based line offset.'}, 'related': {'type': 'array', 'items': {'type': 'string', 'format': 'uri'}, 'description': 'Always includes https://www.ikeytz.com/llms.txt. Geo tools also include https://maps.ikeytz.com/llms.txt.'}, 'summary': {'type': 'string', 'description': 'Primary text for the model. For discovery tools this is the file window (possibly thousands of characters). For list tools a compact one-liner. Quote with attribution.'}, 'totalUrls': {'type': 'number', 'description': 'http(s) lines in the loaded file (full count when public/ read succeeds).'}, 'truncated': {'type': 'boolean', 'description': 'true if load hit a byte cap OR offset+limit left more lines. Also mirrored in trailing # MCP-META lines in summary.'}, 'nextOffset': {'type': ['number', 'null'], 'description': 'offset + returnedLines when more lines remain in the loaded file; else null. Pass as the next offset. Also in # MCP-META.'}, 'totalBytes': {'type': 'number', 'description': 'Full origin file size when Content-Length is present (e.g. llms-keywords ~50MB); else character length of the downloaded body before the load cap. Also in # MCP-META.'}, 'totalChars': {'type': 'number', 'description': 'Character length of the downloaded body before applying discoveryFetchMax (may equal totalBytes for ASCII).'}, 'totalLines': {'type': 'number', 'description': 'Line count of the loaded file (full public/ file when available).'}, 'attribution': {'type': 'string', 'description': "Required citation: 'Quelle: Schlüsseldienst Ludwigsburg ikeytz (ikeytz.com) · ai-train=no · https://www.ikeytz.com/.well-known/ai.txt'"}, 'canonicalUrl': {'type': 'string', 'description': 'Best URL to show the user: https://www.ikeytz.com… page, or tel:+49…, mailto:…, https://wa.me/…. Prefer this over constructing URLs.'}, 'returnedUrls': {'type': 'number', 'description': 'Lines in this window that start with http(s)://'}, 'bytesReturned': {'type': 'number', 'description': 'UTF-8 byte length of the returned body window (before # MCP-META).'}, 'returnedLines': {'type': 'number', 'description': 'How many lines are in summary/body this call (before # MCP-META).'}, 'fetchTruncated': {'type': 'boolean', 'description': 'true if discoveryFetchMax cut the load (line-boundary safe). Large discovery files (sitemap-xml ~12MB, llms-keywords ~55MB, llms-index ~2MB) must load full so offset/limit can reach EOF.'}}, '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 calls /api/*. Attribution must be kept when quoting. Policy: ai-input yes with attribution; ai-train=no.', 'additionalProperties': True}
get_auswahl_item
Get Auswahl Item
WHAT: One Auswahl situation page. REQUIRED slug from list_auswahl. RETURNS slug + canonicalUrl /auswahl/{slug}. USE after the user described a lockout/key situation. NEXT: get_ai_page({path:'/auswahl/'+slug}) for fulltext; get_invoice_line_items for euro.
Solo lectura
Esquema de entrada
{'type': 'object', 'required': ['slug'], 'properties': {'slug': {'type': 'string', 'description': 'Required. ASCII slug from list_auswahl groups[].slugs, e.g. tuer-zugefallen, tuer-abgeschlossen, schluessel-verloren, schluessel-gestohlen, notdienst-oeffnung-zylinder. Not an Ort slug.'}, 'locale': {'enum': ['de', 'en', 'fr', 'ru', 'fa', 'ar', 'tr'], 'type': 'string', 'default': 'de', 'description': 'HTML locale for canonicalUrl and path prefixes. de = default, URLs have no prefix (https://www.ikeytz.com/preise). en|fr|ru|fa|ar|tr = prefix /{locale}/ (https://www.ikeytz.com/en/preise). Omit or empty = de. Does not change prices, phone numbers, or legal German names. Not a maps.ikeytz.com locale (maps is German-only).'}}}
Esquema de salida
{'type': 'object', 'required': ['ok', 'tool', 'attribution'], 'properties': {'ok': {'type': 'boolean', 'description': 'true = use summary, canonicalUrl, and extra keys. false = do not invent data; read error + hint and retry with valid args or open hint.'}, 'hint': {'type': 'string', 'description': 'Present when ok=false. Absolute URL the agent should open or pass to get_ai_page / get_discovery.'}, 'slug': {'type': 'string', 'description': 'Resolved Auswahl slug'}, 'tool': {'type': 'string', 'description': 'Echo of the tool name that produced this object (e.g. get_service_area).'}, 'error': {'type': 'string', 'description': 'Present when ok=false. Codes include: unknown_tool, unknown_place, unknown_auswahl, unknown_ratgeber, unknown_doc, unknown_discovery, faq_not_found, wissen_not_found, serp_not_found, q_required, bad_datetime, bad_when_key, plus HTTP errors from fetch.'}, 'locale': {'enum': ['de', 'en', 'fr', 'ru', 'fa', 'ar', 'tr'], 'type': 'string', 'description': 'Locale actually used for URLs (args.locale or de).'}, 'related': {'type': 'array', 'items': {'type': 'string', 'format': 'uri'}, 'description': 'Always includes https://www.ikeytz.com/llms.txt. Geo tools also include https://maps.ikeytz.com/llms.txt.'}, 'summary': {'type': 'string', 'description': 'Primary text for the model. For discovery tools this is the file window (possibly thousands of characters). For list tools a compact one-liner. Quote with attribution.'}, 'attribution': {'type': 'string', 'description': "Required citation: 'Quelle: Schlüsseldienst Ludwigsburg ikeytz (ikeytz.com) · ai-train=no · https://www.ikeytz.com/.well-known/ai.txt'"}, 'canonicalUrl': {'type': 'string', 'description': 'Best URL to show the user: https://www.ikeytz.com… page, or tel:+49…, mailto:…, https://wa.me/…. Prefer this over constructing URLs.'}}, '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 calls /api/*. Attribution must be kept when quoting. Policy: ai-input yes with attribution; ai-train=no.', 'additionalProperties': True}
get_business_identity
Get Business Identity
WHO: Legal/trade identity and NAP for agents and citations. RETURNS: gewerbeName, legalName, tradeName, inhaber (Mahmud Reza Kashani, Einzelunternehmer), street/postal/city/country, mobile/landline/fax/email, website, walkIn=false. canonicalUrl = /impressum. USE for impressum-grade facts, schema.org LocalBusiness fields, 'who owns ikeytz'. DOES NOT: prove licenses beyond what the site states; does not accept updates. walkIn is always false — do not send customers to the office. NEXT: get_legal(doc=impressum), get_contact, get_geo_office.
Solo lectura
Esquema de entrada
{'type': 'object', 'properties': {'locale': {'enum': ['de', 'en', 'fr', 'ru', 'fa', 'ar', 'tr'], 'type': 'string', 'default': 'de', 'description': 'HTML locale for canonicalUrl and path prefixes. de = default, URLs have no prefix (https://www.ikeytz.com/preise). en|fr|ru|fa|ar|tr = prefix /{locale}/ (https://www.ikeytz.com/en/preise). Omit or empty = de. Does not change prices, phone numbers, or legal German names. Not a maps.ikeytz.com locale (maps is German-only).'}}}
Esquema de salida
{'type': 'object', 'required': ['ok', 'tool', 'attribution'], 'properties': {'ok': {'type': 'boolean', 'description': 'true = use summary, canonicalUrl, and extra keys. false = do not invent data; read error + hint and retry with valid args or open hint.'}, 'fax': {'type': 'string', 'description': 'Fax display number'}, 'city': {'type': 'string', 'description': 'City'}, 'hint': {'type': 'string', 'description': 'Present when ok=false. Absolute URL the agent should open or pass to get_ai_page / get_discovery.'}, 'tool': {'type': 'string', 'description': 'Echo of the tool name that produced this object (e.g. get_service_area).'}, 'email': {'type': 'string', 'description': 'Public email'}, 'error': {'type': 'string', 'description': 'Present when ok=false. Codes include: unknown_tool, unknown_place, unknown_auswahl, unknown_ratgeber, unknown_doc, unknown_discovery, faq_not_found, wissen_not_found, serp_not_found, q_required, bad_datetime, bad_when_key, plus HTTP errors from fetch.'}, 'locale': {'enum': ['de', 'en', 'fr', 'ru', 'fa', 'ar', 'tr'], 'type': 'string', 'description': 'Locale actually used for URLs (args.locale or de).'}, 'mobile': {'type': 'string', 'description': 'Mobile display number'}, 'postal': {'type': 'string', 'description': 'Postal code'}, 'street': {'type': 'string', 'description': 'Office street (no walk-in)'}, 'walkIn': {'type': 'boolean', 'description': 'Always false — no shop walk-in'}, 'country': {'type': 'string', 'description': 'Country'}, 'inhaber': {'type': 'string', 'description': 'Owner full name'}, 'related': {'type': 'array', 'items': {'type': 'string', 'format': 'uri'}, 'description': 'Always includes https://www.ikeytz.com/llms.txt. Geo tools also include https://maps.ikeytz.com/llms.txt.'}, 'summary': {'type': 'string', 'description': 'Primary text for the model. For discovery tools this is the file window (possibly thousands of characters). For list tools a compact one-liner. Quote with attribution.'}, 'website': {'type': 'string', 'description': 'Canonical website URL'}, 'landline': {'type': 'string', 'description': 'Landline display number'}, 'legalName': {'type': 'string', 'description': 'Legal name'}, 'tradeName': {'type': 'string', 'description': 'Trade / SEO name'}, 'attribution': {'type': 'string', 'description': "Required citation: 'Quelle: Schlüsseldienst Ludwigsburg ikeytz (ikeytz.com) · ai-train=no · https://www.ikeytz.com/.well-known/ai.txt'"}, 'gewerbeName': {'type': 'string', 'description': 'Registered business name'}, 'canonicalUrl': {'type': 'string', 'description': 'Best URL to show the user: https://www.ikeytz.com… page, or tel:+49…, mailto:…, https://wa.me/…. Prefer this over constructing URLs.'}}, '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 calls /api/*. Attribution must be kept when quoting. Policy: ai-input yes with attribution; ai-train=no.', 'additionalProperties': True}
get_contact
Get Contact
WHAT: Public phones, fax, email, office address object. DOES NOT submit the website contact form and must not claim it did. USE to give the user a number. NEXT: compose_tel_mobile, compose_tel_landline, compose_mailto, compose_whatsapp, list_whatsapp_options.
Solo lectura
Esquema de entrada
{'type': 'object', 'properties': {'locale': {'enum': ['de', 'en', 'fr', 'ru', 'fa', 'ar', 'tr'], 'type': 'string', 'default': 'de', 'description': 'HTML locale for canonicalUrl and path prefixes. de = default, URLs have no prefix (https://www.ikeytz.com/preise). en|fr|ru|fa|ar|tr = prefix /{locale}/ (https://www.ikeytz.com/en/preise). Omit or empty = de. Does not change prices, phone numbers, or legal German names. Not a maps.ikeytz.com locale (maps is German-only).'}}}
Esquema de salida
{'type': 'object', 'required': ['ok', 'tool', 'attribution'], 'properties': {'ok': {'type': 'boolean', 'description': 'true = use summary, canonicalUrl, and extra keys. false = do not invent data; read error + hint and retry with valid args or open hint.'}, 'fax': {'type': 'string', 'description': 'Fax display.'}, 'hint': {'type': 'string', 'description': 'Present when ok=false. Absolute URL the agent should open or pass to get_ai_page / get_discovery.'}, 'tool': {'type': 'string', 'description': 'Echo of the tool name that produced this object (e.g. get_service_area).'}, 'email': {'type': 'string', 'description': 'Public info@ email.'}, 'error': {'type': 'string', 'description': 'Present when ok=false. Codes include: unknown_tool, unknown_place, unknown_auswahl, unknown_ratgeber, unknown_doc, unknown_discovery, faq_not_found, wissen_not_found, serp_not_found, q_required, bad_datetime, bad_when_key, plus HTTP errors from fetch.'}, 'locale': {'enum': ['de', 'en', 'fr', 'ru', 'fa', 'ar', 'tr'], 'type': 'string', 'description': 'Locale actually used for URLs (args.locale or de).'}, 'mobile': {'type': 'string', 'description': 'Mobile display (Handy), 24/7.'}, 'address': {'type': 'object', 'description': 'Office postal address (no walk-in).', 'additionalProperties': True}, 'related': {'type': 'array', 'items': {'type': 'string', 'format': 'uri'}, 'description': 'Always includes https://www.ikeytz.com/llms.txt. Geo tools also include https://maps.ikeytz.com/llms.txt.'}, 'summary': {'type': 'string', 'description': 'Primary text for the model. For discovery tools this is the file window (possibly thousands of characters). For list tools a compact one-liner. Quote with attribution.'}, 'landline': {'type': 'string', 'description': 'Landline display (Festnetz).'}, 'attribution': {'type': 'string', 'description': "Required citation: 'Quelle: Schlüsseldienst Ludwigsburg ikeytz (ikeytz.com) · ai-train=no · https://www.ikeytz.com/.well-known/ai.txt'"}, 'canonicalUrl': {'type': 'string', 'description': 'Best URL to show the user: https://www.ikeytz.com… page, or tel:+49…, mailto:…, https://wa.me/…. Prefer this over constructing URLs.'}}, '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 calls /api/*. Attribution must be kept when quoting. Policy: ai-input yes with attribution; ai-train=no.', 'additionalProperties': True}
get_discovery
Get Discovery
WHAT: Fetch one public discovery file from www and return a line window. REQUIRED which. IDs (aliases folded): llms, llms-full, llms-index, llms-keywords, llms-serp, llms-jsonld, 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, ard, ai-catalog, auth-md, mcp-readme, agent-skills. summary = the line window + trailing # MCP-META (truncated, totalUrls, nextOffset). Use offset/limit + nextOffset to page. Sitemap ~9076 http-URLs (Stand 2026-09-22) and llms-keywords (~50MB) load full; always prefer limit on huge files. Unknown which → unknown_discovery. Prefer dedicated get_llms_txt / get_llms_jsonld / get_llms_serp_txt / get_sitemap_txt / get_llms_mcp_server when you know the file. Policy files say ai-train=no.
Solo lectura
Esquema de entrada
{'type': 'object', 'required': ['which'], 'properties': {'limit': {'type': 'number', 'maximum': 10000, 'minimum': 1, 'description': 'Maximum number of lines to return after offset. Omit or null = return every remaining line in the loaded file. Clamped to 1..10000. For sitemap.txt (~9076 http-URLs, Stand 2026-09-22) omit limit to get the full list (or page with offset/limit + nextOffset). For llms-keywords.txt prefer a window; the file is huge. Meta also as trailing # MCP-META lines in summary.'}, 'which': {'type': 'string', 'description': 'Required discovery id or alias. Examples: llms, llms-full, llms-jsonld, llms-serp, llms-mcp-server, llms-mcp-web, sitemap-txt, robots, ai-txt, ard, ai-catalog, auth-md, mcp-readme, llms-orte-geo, llms-urheberrecht. Underscores accepted (llms_full → llms-full). get_ prefix and _txt suffix stripped.'}, 'offset': {'type': 'number', 'default': 0, 'minimum': 0, 'description': '0-based line index into the fetched UTF-8 file (split on \\n). 0 = first line. Omit = 0. Combined with limit = a sliding window. Use nextOffset from the previous result to page. Does not count bytes; one line can be a long URL.'}}}
Esquema de salida
{'type': 'object', 'required': ['ok', 'tool', 'attribution'], 'properties': {'ok': {'type': 'boolean', 'description': 'true = use summary, canonicalUrl, and extra keys. false = do not invent data; read error + hint and retry with valid args or open hint.'}, 'hint': {'type': 'string', 'description': 'Present when ok=false. Absolute URL the agent should open or pass to get_ai_page / get_discovery.'}, 'path': {'type': 'string', 'description': 'Public path on www, e.g. /llms.txt or /.well-known/ai.txt'}, 'tool': {'type': 'string', 'description': 'Echo of the tool name that produced this object (e.g. get_service_area).'}, 'error': {'type': 'string', 'description': 'Present when ok=false. Codes include: unknown_tool, unknown_place, unknown_auswahl, unknown_ratgeber, unknown_doc, unknown_discovery, faq_not_found, wissen_not_found, serp_not_found, q_required, bad_datetime, bad_when_key, plus HTTP errors from fetch.'}, 'limit': {'type': ['number', 'null'], 'description': 'Applied line limit, or null if the caller omitted limit.'}, 'which': {'type': 'string', 'description': 'Resolved discovery id after alias fold (llms, sitemap-txt, ard, ai-catalog, …).'}, 'locale': {'enum': ['de', 'en', 'fr', 'ru', 'fa', 'ar', 'tr'], 'type': 'string', 'description': 'Locale actually used for URLs (args.locale or de).'}, 'offset': {'type': 'number', 'description': 'Applied 0-based line offset.'}, 'related': {'type': 'array', 'items': {'type': 'string', 'format': 'uri'}, 'description': 'Always includes https://www.ikeytz.com/llms.txt. Geo tools also include https://maps.ikeytz.com/llms.txt.'}, 'summary': {'type': 'string', 'description': 'Primary text for the model. For discovery tools this is the file window (possibly thousands of characters). For list tools a compact one-liner. Quote with attribution.'}, 'totalUrls': {'type': 'number', 'description': 'http(s) lines in the loaded file (full count when public/ read succeeds).'}, 'truncated': {'type': 'boolean', 'description': 'true if load hit a byte cap OR offset+limit left more lines. Also mirrored in trailing # MCP-META lines in summary.'}, 'nextOffset': {'type': ['number', 'null'], 'description': 'offset + returnedLines when more lines remain in the loaded file; else null. Pass as the next offset. Also in # MCP-META.'}, 'totalBytes': {'type': 'number', 'description': 'Full origin file size when Content-Length is present (e.g. llms-keywords ~50MB); else character length of the downloaded body before the load cap. Also in # MCP-META.'}, 'totalChars': {'type': 'number', 'description': 'Character length of the downloaded body before applying discoveryFetchMax (may equal totalBytes for ASCII).'}, 'totalLines': {'type': 'number', 'description': 'Line count of the loaded file (full public/ file when available).'}, 'attribution': {'type': 'string', 'description': "Required citation: 'Quelle: Schlüsseldienst Ludwigsburg ikeytz (ikeytz.com) · ai-train=no · https://www.ikeytz.com/.well-known/ai.txt'"}, 'canonicalUrl': {'type': 'string', 'description': 'Best URL to show the user: https://www.ikeytz.com… page, or tel:+49…, mailto:…, https://wa.me/…. Prefer this over constructing URLs.'}, 'returnedUrls': {'type': 'number', 'description': 'Lines in this window that start with http(s)://'}, 'bytesReturned': {'type': 'number', 'description': 'UTF-8 byte length of the returned body window (before # MCP-META).'}, 'returnedLines': {'type': 'number', 'description': 'How many lines are in summary/body this call (before # MCP-META).'}, 'fetchTruncated': {'type': 'boolean', 'description': 'true if discoveryFetchMax cut the load (line-boundary safe). Large discovery files (sitemap-xml ~12MB, llms-keywords ~55MB, llms-index ~2MB) must load full so offset/limit can reach EOF.'}}, '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 calls /api/*. Attribution must be kept when quoting. Policy: ai-input yes with attribution; ai-train=no.', 'additionalProperties': True}
get_emergency
Get Emergency
WHAT: Pointer to the 24h Notfall-Türöffnung page. summary includes mobile number. canonicalUrl = /notfall-tueroeffnung (locale-prefixed). DOES NOT dispatch a technician or take a booking. NEXT: compose_tel_mobile or list_whatsapp_options then compose_whatsapp with a contactOption (opening_slam_day|opening_slam_night|…).
Solo lectura
Esquema de entrada
{'type': 'object', 'properties': {'locale': {'enum': ['de', 'en', 'fr', 'ru', 'fa', 'ar', 'tr'], 'type': 'string', 'default': 'de', 'description': 'HTML locale for canonicalUrl and path prefixes. de = default, URLs have no prefix (https://www.ikeytz.com/preise). en|fr|ru|fa|ar|tr = prefix /{locale}/ (https://www.ikeytz.com/en/preise). Omit or empty = de. Does not change prices, phone numbers, or legal German names. Not a maps.ikeytz.com locale (maps is German-only).'}}}
Esquema de salida
{'type': 'object', 'required': ['ok', 'tool', 'attribution'], 'properties': {'ok': {'type': 'boolean', 'description': 'true = use summary, canonicalUrl, and extra keys. false = do not invent data; read error + hint and retry with valid args or open hint.'}, 'hint': {'type': 'string', 'description': 'Present when ok=false. Absolute URL the agent should open or pass to get_ai_page / get_discovery.'}, 'tool': {'type': 'string', 'description': 'Echo of the tool name that produced this object (e.g. get_service_area).'}, 'error': {'type': 'string', 'description': 'Present when ok=false. Codes include: unknown_tool, unknown_place, unknown_auswahl, unknown_ratgeber, unknown_doc, unknown_discovery, faq_not_found, wissen_not_found, serp_not_found, q_required, bad_datetime, bad_when_key, plus HTTP errors from fetch.'}, 'locale': {'enum': ['de', 'en', 'fr', 'ru', 'fa', 'ar', 'tr'], 'type': 'string', 'description': 'Locale actually used for URLs (args.locale or de).'}, 'related': {'type': 'array', 'items': {'type': 'string', 'format': 'uri'}, 'description': 'Always includes https://www.ikeytz.com/llms.txt. Geo tools also include https://maps.ikeytz.com/llms.txt.'}, 'summary': {'type': 'string', 'description': 'Primary text for the model. For discovery tools this is the file window (possibly thousands of characters). For list tools a compact one-liner. Quote with attribution.'}, 'attribution': {'type': 'string', 'description': "Required citation: 'Quelle: Schlüsseldienst Ludwigsburg ikeytz (ikeytz.com) · ai-train=no · https://www.ikeytz.com/.well-known/ai.txt'"}, 'canonicalUrl': {'type': 'string', 'description': 'Best URL to show the user: https://www.ikeytz.com… page, or tel:+49…, mailto:…, https://wa.me/…. Prefer this over constructing URLs.'}}, '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 calls /api/*. Attribution must be kept when quoting. Policy: ai-input yes with attribution; ai-train=no.', 'additionalProperties': True}
get_faq
Get Faq
WHAT: One FAQ Q+A (Ausweis, MwSt, 24h, Nachtpreis-Regel…). Lookup: exact id, else first substring on q. Not a calculator — if the user needs THIS job's euro, get_invoice_line_items after composition.routes. Missing → faq_not_found. Prefer id from list_faq.
Solo lectura
Esquema de entrada
{'type': 'object', 'properties': {'q': {'type': 'string', 'description': 'Fallback search. Lowercased includes() on question or answer. Use when the user asked in natural language.'}, 'id': {'type': 'string', 'description': 'FAQ id from list_faq.items[].id. Tried first if present.'}, 'locale': {'enum': ['de', 'en', 'fr', 'ru', 'fa', 'ar', 'tr'], 'type': 'string', 'default': 'de', 'description': 'HTML locale for canonicalUrl and path prefixes. de = default, URLs have no prefix (https://www.ikeytz.com/preise). en|fr|ru|fa|ar|tr = prefix /{locale}/ (https://www.ikeytz.com/en/preise). Omit or empty = de. Does not change prices, phone numbers, or legal German names. Not a maps.ikeytz.com locale (maps is German-only).'}}}
Esquema de salida
{'type': 'object', 'required': ['ok', 'tool', 'attribution'], 'properties': {'id': {'type': 'string', 'description': 'FAQ id'}, 'ok': {'type': 'boolean', 'description': 'true = use summary, canonicalUrl, and extra keys. false = do not invent data; read error + hint and retry with valid args or open hint.'}, 'hint': {'type': 'string', 'description': 'Present when ok=false. Absolute URL the agent should open or pass to get_ai_page / get_discovery.'}, 'tool': {'type': 'string', 'description': 'Echo of the tool name that produced this object (e.g. get_service_area).'}, 'error': {'type': 'string', 'description': 'Present when ok=false. Codes include: unknown_tool, unknown_place, unknown_auswahl, unknown_ratgeber, unknown_doc, unknown_discovery, faq_not_found, wissen_not_found, serp_not_found, q_required, bad_datetime, bad_when_key, plus HTTP errors from fetch.'}, 'answer': {'type': 'string', 'description': 'Answer text'}, 'locale': {'enum': ['de', 'en', 'fr', 'ru', 'fa', 'ar', 'tr'], 'type': 'string', 'description': 'Locale actually used for URLs (args.locale or de).'}, 'related': {'type': 'array', 'items': {'type': 'string', 'format': 'uri'}, 'description': 'Always includes https://www.ikeytz.com/llms.txt. Geo tools also include https://maps.ikeytz.com/llms.txt.'}, 'summary': {'type': 'string', 'description': 'Primary text for the model. For discovery tools this is the file window (possibly thousands of characters). For list tools a compact one-liner. Quote with attribution.'}, 'question': {'type': 'string', 'description': 'Question text'}, 'attribution': {'type': 'string', 'description': "Required citation: 'Quelle: Schlüsseldienst Ludwigsburg ikeytz (ikeytz.com) · ai-train=no · https://www.ikeytz.com/.well-known/ai.txt'"}, 'canonicalUrl': {'type': 'string', 'description': 'Best URL to show the user: https://www.ikeytz.com… page, or tel:+49…, mailto:…, https://wa.me/…. Prefer this over constructing URLs.'}}, '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 calls /api/*. Attribution must be kept when quoting. Policy: ai-input yes with attribution; ai-train=no.', 'additionalProperties': True}
get_geo_office
Get Geo Office
WHAT: Firmensitz / registered office once (SITE.geo = Adalbert-Stifter-Str. 14, 71638 Ludwigsburg). RETURNS: street, postal, city, lat/lng, icbm, walkIn=false, firmensitz_url=https://maps.ikeytz.com/buero, embed_map=same, embed_map_compact=?embed=1, geo_api=/api/v1/embed/office, google_business=GBP share (external click only). canonicalUrl = firmensitz map. NOT a shop — never send customers to walk in. NOT a service-area place map (use list_service_areas / get_service_area for Ort slugs). NEXT: get_contact, get_legal(doc=impressum), or maps MCP get_geo_office on maps.ikeytz.com/mcp.
Solo lectura
Esquema de entrada
{'type': 'object', 'properties': {'locale': {'enum': ['de', 'en', 'fr', 'ru', 'fa', 'ar', 'tr'], 'type': 'string', 'default': 'de', 'description': 'HTML locale for canonicalUrl and path prefixes. de = default, URLs have no prefix (https://www.ikeytz.com/preise). en|fr|ru|fa|ar|tr = prefix /{locale}/ (https://www.ikeytz.com/en/preise). Omit or empty = de. Does not change prices, phone numbers, or legal German names. Not a maps.ikeytz.com locale (maps is German-only).'}}}
Esquema de salida
{'type': 'object', 'required': ['ok', 'tool', 'attribution'], 'properties': {'ok': {'type': 'boolean', 'description': 'true = use summary, canonicalUrl, and extra keys. false = do not invent data; read error + hint and retry with valid args or open hint.'}, 'lat': {'type': 'number', 'description': 'WGS84 latitude of THIS place or the office. Unique per slug — never a silent Pattonville fallback. Example Pattonville ≈ 48.863.'}, 'lng': {'type': 'number', 'description': 'WGS84 longitude of THIS place or the office. Example Pattonville ≈ 9.185.'}, 'city': {'type': 'string', 'description': 'Office city (Ludwigsburg).'}, 'hint': {'type': 'string', 'description': 'Present when ok=false. Absolute URL the agent should open or pass to get_ai_page / get_discovery.'}, 'icbm': {'type': 'string', 'description': "ICBM 'lat, lng' string (same as google_maps)."}, 'note': {'type': 'string', 'description': 'Büro · kein Walk-in · nicht Einsatzgebiet.'}, 'tool': {'type': 'string', 'description': 'Echo of the tool name that produced this object (e.g. get_service_area).'}, 'error': {'type': 'string', 'description': 'Present when ok=false. Codes include: unknown_tool, unknown_place, unknown_auswahl, unknown_ratgeber, unknown_doc, unknown_discovery, faq_not_found, wissen_not_found, serp_not_found, q_required, bad_datetime, bad_when_key, plus HTTP errors from fetch.'}, 'locale': {'enum': ['de', 'en', 'fr', 'ru', 'fa', 'ar', 'tr'], 'type': 'string', 'description': 'Locale actually used for URLs (args.locale or de).'}, 'postal': {'type': 'string', 'description': 'Office PLZ.'}, 'street': {'type': 'string', 'description': 'Office street line.'}, 'walkIn': {'type': 'boolean', 'const': False, 'description': 'Always false.'}, 'geo_api': {'type': 'string', 'format': 'uri', 'description': 'https://maps.ikeytz.com/api/v1/embed/office JSON.'}, 'related': {'type': 'array', 'items': {'type': 'string', 'format': 'uri'}, 'description': 'Always includes https://www.ikeytz.com/llms.txt. Geo tools also include https://maps.ikeytz.com/llms.txt.'}, 'summary': {'type': 'string', 'description': 'Primary text for the model. For discovery tools this is the file window (possibly thousands of characters). For list tools a compact one-liner. Quote with attribution.'}, 'maps_mcp': {'type': 'string', 'const': 'https://maps.ikeytz.com/mcp', 'format': 'uri', 'description': 'maps machine MCP endpoint.'}, 'embed_map': {'type': 'string', 'format': 'uri', 'description': 'Same as firmensitz_url (iframe-capable page).'}, 'attribution': {'type': 'string', 'description': "Required citation: 'Quelle: Schlüsseldienst Ludwigsburg ikeytz (ikeytz.com) · ai-train=no · https://www.ikeytz.com/.well-known/ai.txt'"}, 'google_maps': {'type': 'string', 'description': "Paste-ready 'lat, lng' for Google Maps search (same digits as lat/lng)."}, 'canonicalUrl': {'type': 'string', 'description': 'Best URL to show the user: https://www.ikeytz.com… page, or tel:+49…, mailto:…, https://wa.me/…. Prefer this over constructing URLs.'}, 'firmensitz_url': {'type': 'string', 'format': 'uri', 'description': 'https://maps.ikeytz.com/buero — Firmensitz map (not an Ort slug).'}, 'google_business': {'type': 'string', 'format': 'uri', 'description': 'Google Business Profile share link (external).'}, 'embed_map_compact': {'type': 'string', 'format': 'uri', 'description': 'https://maps.ikeytz.com/buero?embed=1 — map-only embed.'}}, '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 calls /api/*. Attribution must be kept when quoting. Policy: ai-input yes with attribution; ai-train=no.', 'additionalProperties': True}
get_invoice_line_items
Get Invoice Line Items
WHAT: Computes ONE of the 10 end-invoices (or the 49 € mount add-on). NOT a booking, NOT a PDF. FIRST classify via get_prices.composition.routes: locked_out+slam+no cylinder → opening_slam; locked_out+locked+no cylinder → opening_locked; +cylinder same trip → pkg_key_slam / pkg_key_locked; door open → cylinder_only; mount after paid opening → cylinder_mount (not an end-invoice). THEN whenKey from get_ort_datetime (day|night|now). Night/WE/holiday is NOT +49 — 49 is only cylinder_mount. Do not invent euro. Do not add 49 on top of pkg_key_*. REQUIRED situationKey. Aliases: zugefallen→opening_slam, abgeschlossen→opening_locked, schluessel_weg_zugefallen→pkg_key_slam. breakdown=true splits combo into opening+49, totalEur unchanged. RETURNS totalEur + composition + contactOption. NEXT: compose_whatsapp or compose_mailto with that contactOption. No VAT.
Solo lectura
Esquema de entrada
{'type': 'object', 'required': ['situationKey'], 'properties': {'at': {'type': 'string', 'description': 'Optional. Same formats as get_ort_datetime.at. Only used when whenKey is now or omitted.'}, 'locale': {'enum': ['de', 'en', 'fr', 'ru', 'fa', 'ar', 'tr'], 'type': 'string', 'default': 'de', 'description': 'HTML locale for canonicalUrl and path prefixes. de = default, URLs have no prefix (https://www.ikeytz.com/preise). en|fr|ru|fa|ar|tr = prefix /{locale}/ (https://www.ikeytz.com/en/preise). Omit or empty = de. Does not change prices, phone numbers, or legal German names. Not a maps.ikeytz.com locale (maps is German-only).'}, 'whenKey': {'enum': ['day', 'night', 'now'], 'type': 'string', 'description': 'day = Mo–Fr 08:00:00–17:59:59 Europe/Berlin except BW holidays. night = weekend, holiday, or 18:00–07:59. now or omit = live get_ort_datetime (or at=). Night is not +49 (49 is only cylinder_mount). Do not invent dusk/dawn.'}, 'breakdown': {'type': 'boolean', 'default': False, 'description': 'If true, pkg_key_slam / pkg_key_locked emit two rows (opening + cylinder_mount_same_trip) instead of one package row. Total euro unchanged.'}, 'situationKey': {'type': 'string', 'description': 'Required. From composition.routes: opening_slam | opening_locked | pkg_key_slam | pkg_key_locked | cylinder_only | cylinder_mount. Aliases: zugefallen, abgeschlossen, schluessel_weg_zugefallen. pkg_slam_only = opening_slam same euro.'}}}
Esquema de salida
{'type': 'object', 'required': ['ok', 'tool', 'attribution'], 'properties': {'ok': {'type': 'boolean', 'description': 'true = use summary, canonicalUrl, and extra keys. false = do not invent data; read error + hint and retry with valid args or open hint.'}, 'hint': {'type': 'string', 'description': 'Present when ok=false. Absolute URL the agent should open or pass to get_ai_page / get_discovery.'}, 'tool': {'type': 'string', 'description': 'Echo of the tool name that produced this object (e.g. get_service_area).'}, 'error': {'type': 'string', 'description': 'Present when ok=false. Codes include: unknown_tool, unknown_place, unknown_auswahl, unknown_ratgeber, unknown_doc, unknown_discovery, faq_not_found, wissen_not_found, serp_not_found, q_required, bad_datetime, bad_when_key, plus HTTP errors from fetch.'}, 'locale': {'enum': ['de', 'en', 'fr', 'ru', 'fa', 'ar', 'tr'], 'type': 'string', 'description': 'Locale actually used for URLs (args.locale or de).'}, 'related': {'type': 'array', 'items': {'type': 'string', 'format': 'uri'}, 'description': 'Always includes https://www.ikeytz.com/llms.txt. Geo tools also include https://maps.ikeytz.com/llms.txt.'}, 'summary': {'type': 'string', 'description': 'Primary text for the model. For discovery tools this is the file window (possibly thousands of characters). For list tools a compact one-liner. Quote with attribution.'}, 'whenKey': {'type': 'string', 'description': 'Resolved day|night'}, 'totalEur': {'type': 'number', 'description': 'End-invoice euro. Do not add VAT or extra 49.'}, 'line_items': {'type': 'array', 'description': 'Invoice rows'}, 'attribution': {'type': 'string', 'description': "Required citation: 'Quelle: Schlüsseldienst Ludwigsburg ikeytz (ikeytz.com) · ai-train=no · https://www.ikeytz.com/.well-known/ai.txt'"}, 'composition': {'type': 'object', 'description': 'Same SYSTEM as get_prices.composition — factors, routes, 10 invoices.'}, 'canonicalUrl': {'type': 'string', 'description': 'Best URL to show the user: https://www.ikeytz.com… page, or tel:+49…, mailto:…, https://wa.me/…. Prefer this over constructing URLs.'}, 'situationKey': {'type': 'string', 'description': 'Resolved situation id'}, 'contactOption': {'type': 'string', 'description': 'Prefab id for compose_whatsapp / compose_mailto (opening_slam_day … cylinder_only_night, or cylinder_mount).'}, 'situationLabelDe': {'type': 'string', 'description': 'German situation label'}}, '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 calls /api/*. Attribution must be kept when quoting. Policy: ai-input yes with attribution; ai-train=no.', 'additionalProperties': True}
get_it
Get It
WHAT: HTML page /it — two MCP machines documented. RETURNS website={name:com.ikeytz/website,mcp,card,npm,cli,readme=npm CLI,httpReadme=www /mcp-readme.md}, maps={name:com.ikeytz/maps,… no httpReadme}, proxy=false, page=/it, itEmail, aiEmail. USE to tell an agent there are TWO endpoints (www vs maps). www /mcp never calls maps /mcp. HTML path /it is not Italian. Hub HTML is /mcp-hub (get_mcp_hub). CLI npm is a third channel, not this HTTP server.
Solo lectura
Esquema de entrada
{'type': 'object', 'properties': {'locale': {'enum': ['de', 'en', 'fr', 'ru', 'fa', 'ar', 'tr'], 'type': 'string', 'default': 'de', 'description': 'HTML locale for canonicalUrl and path prefixes. de = default, URLs have no prefix (https://www.ikeytz.com/preise). en|fr|ru|fa|ar|tr = prefix /{locale}/ (https://www.ikeytz.com/en/preise). Omit or empty = de. Does not change prices, phone numbers, or legal German names. Not a maps.ikeytz.com locale (maps is German-only).'}}}
Esquema de salida
{'type': 'object', 'required': ['ok', 'tool', 'attribution'], 'properties': {'ok': {'type': 'boolean', 'description': 'true = use summary, canonicalUrl, and extra keys. false = do not invent data; read error + hint and retry with valid args or open hint.'}, 'hint': {'type': 'string', 'description': 'Present when ok=false. Absolute URL the agent should open or pass to get_ai_page / get_discovery.'}, 'maps': {'type': 'object', 'properties': {'cli': {'type': 'string', 'description': 'CLI binary name, e.g. ikeytz-mcp'}, 'mcp': {'type': 'string', 'format': 'uri', 'description': 'HTTPS MCP endpoint …/mcp'}, 'npm': {'type': 'string', 'description': 'npm package name, e.g. @ikeytz/mcp — CLI only, not this HTTP server'}, 'card': {'type': 'string', 'format': 'uri', 'description': 'https://…/.well-known/mcp/server-card.json'}, 'name': {'type': 'string', 'description': 'MCP server name: com.ikeytz/website or com.ikeytz/maps'}, 'readme': {'type': 'string', 'format': 'uri', 'description': 'CLI README on npm — not the HTTP MCP README'}, 'httpReadme': {'type': 'string', 'format': 'uri', 'description': 'HTTP MCP README on the machine host (www: /mcp-readme.md). Not the npm CLI README. Maps has no www copy.'}}, 'description': 'maps machine com.ikeytz/maps'}, 'page': {'type': 'string', 'format': 'uri', 'description': 'Locale /it URL.'}, 'tool': {'type': 'string', 'description': 'Echo of the tool name that produced this object (e.g. get_service_area).'}, 'error': {'type': 'string', 'description': 'Present when ok=false. Codes include: unknown_tool, unknown_place, unknown_auswahl, unknown_ratgeber, unknown_doc, unknown_discovery, faq_not_found, wissen_not_found, serp_not_found, q_required, bad_datetime, bad_when_key, plus HTTP errors from fetch.'}, 'proxy': {'type': 'boolean', 'const': False, 'description': 'www does not proxy maps.'}, 'locale': {'enum': ['de', 'en', 'fr', 'ru', 'fa', 'ar', 'tr'], 'type': 'string', 'description': 'Locale actually used for URLs (args.locale or de).'}, 'aiEmail': {'type': 'string', 'description': 'Public AI/abuse mailbox.'}, 'itEmail': {'type': 'string', 'description': 'Public IT contact mailbox.'}, 'related': {'type': 'array', 'items': {'type': 'string', 'format': 'uri'}, 'description': 'Always includes https://www.ikeytz.com/llms.txt. Geo tools also include https://maps.ikeytz.com/llms.txt.'}, 'summary': {'type': 'string', 'description': 'Primary text for the model. For discovery tools this is the file window (possibly thousands of characters). For list tools a compact one-liner. Quote with attribution.'}, 'website': {'type': 'object', 'properties': {'cli': {'type': 'string', 'description': 'CLI binary name, e.g. ikeytz-mcp'}, 'mcp': {'type': 'string', 'format': 'uri', 'description': 'HTTPS MCP endpoint …/mcp'}, 'npm': {'type': 'string', 'description': 'npm package name, e.g. @ikeytz/mcp — CLI only, not this HTTP server'}, 'card': {'type': 'string', 'format': 'uri', 'description': 'https://…/.well-known/mcp/server-card.json'}, 'name': {'type': 'string', 'description': 'MCP server name: com.ikeytz/website or com.ikeytz/maps'}, 'readme': {'type': 'string', 'format': 'uri', 'description': 'CLI README on npm — not the HTTP MCP README'}, 'httpReadme': {'type': 'string', 'format': 'uri', 'description': 'HTTP MCP README on the machine host (www: /mcp-readme.md). Not the npm CLI README. Maps has no www copy.'}}, 'description': 'www machine com.ikeytz/website'}, 'attribution': {'type': 'string', 'description': "Required citation: 'Quelle: Schlüsseldienst Ludwigsburg ikeytz (ikeytz.com) · ai-train=no · https://www.ikeytz.com/.well-known/ai.txt'"}, 'canonicalUrl': {'type': 'string', 'description': 'Best URL to show the user: https://www.ikeytz.com… page, or tel:+49…, mailto:…, https://wa.me/…. Prefer this over constructing URLs.'}}, '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 calls /api/*. Attribution must be kept when quoting. Policy: ai-input yes with attribution; ai-train=no.', 'additionalProperties': True}
get_legal
Get Legal
WHAT: Pointer to one legal HTML page. REQUIRED doc enum. Unknown doc → ok=false unknown_doc hint=/impressum. RETURNS doc + canonicalUrl. For full text call get_ai_page({path:'/'+doc}) or get_discovery(which=llms-urheberrecht) for the copyright corpus. German legal text is binding; /llms-copyright.txt is EN courtesy.
Solo lectura
Esquema de entrada
{'type': 'object', 'required': ['doc'], 'properties': {'doc': {'enum': ['impressum', 'datenschutz', 'agb', 'nutzungsbedingungen', 'widerruf', 'urheberrecht'], 'type': 'string', 'description': 'Required legal slug = path /{doc}. impressum=imprint, datenschutz=privacy, agb=T&Cs, nutzungsbedingungen=site terms, widerruf=withdrawal, urheberrecht=copyright/AI policy.'}, 'locale': {'enum': ['de', 'en', 'fr', 'ru', 'fa', 'ar', 'tr'], 'type': 'string', 'default': 'de', 'description': 'HTML locale for canonicalUrl and path prefixes. de = default, URLs have no prefix (https://www.ikeytz.com/preise). en|fr|ru|fa|ar|tr = prefix /{locale}/ (https://www.ikeytz.com/en/preise). Omit or empty = de. Does not change prices, phone numbers, or legal German names. Not a maps.ikeytz.com locale (maps is German-only).'}}}
Esquema de salida
{'type': 'object', 'required': ['ok', 'tool', 'attribution'], 'properties': {'ok': {'type': 'boolean', 'description': 'true = use summary, canonicalUrl, and extra keys. false = do not invent data; read error + hint and retry with valid args or open hint.'}, 'doc': {'type': 'string', 'description': 'Legal document id'}, 'hint': {'type': 'string', 'description': 'Present when ok=false. Absolute URL the agent should open or pass to get_ai_page / get_discovery.'}, 'tool': {'type': 'string', 'description': 'Echo of the tool name that produced this object (e.g. get_service_area).'}, 'error': {'type': 'string', 'description': 'Present when ok=false. Codes include: unknown_tool, unknown_place, unknown_auswahl, unknown_ratgeber, unknown_doc, unknown_discovery, faq_not_found, wissen_not_found, serp_not_found, q_required, bad_datetime, bad_when_key, plus HTTP errors from fetch.'}, 'locale': {'enum': ['de', 'en', 'fr', 'ru', 'fa', 'ar', 'tr'], 'type': 'string', 'description': 'Locale actually used for URLs (args.locale or de).'}, 'related': {'type': 'array', 'items': {'type': 'string', 'format': 'uri'}, 'description': 'Always includes https://www.ikeytz.com/llms.txt. Geo tools also include https://maps.ikeytz.com/llms.txt.'}, 'summary': {'type': 'string', 'description': 'Primary text for the model. For discovery tools this is the file window (possibly thousands of characters). For list tools a compact one-liner. Quote with attribution.'}, 'attribution': {'type': 'string', 'description': "Required citation: 'Quelle: Schlüsseldienst Ludwigsburg ikeytz (ikeytz.com) · ai-train=no · https://www.ikeytz.com/.well-known/ai.txt'"}, 'canonicalUrl': {'type': 'string', 'description': 'Best URL to show the user: https://www.ikeytz.com… page, or tel:+49…, mailto:…, https://wa.me/…. Prefer this over constructing URLs.'}}, '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 calls /api/*. Attribution must be kept when quoting. Policy: ai-input yes with attribution; ai-train=no.', 'additionalProperties': True}
get_links
Get Links
WHAT: Pointer to /links (directories, city sites, HWK, Webmail shortcut). External MCP catalogs (npm, registry, mcpbeat, Glama, getlulu, Smithery) are on get_mcp_hub.publicLinks, not this tool.
Solo lectura
Esquema de entrada
{'type': 'object', 'properties': {'locale': {'enum': ['de', 'en', 'fr', 'ru', 'fa', 'ar', 'tr'], 'type': 'string', 'default': 'de', 'description': 'HTML locale for canonicalUrl and path prefixes. de = default, URLs have no prefix (https://www.ikeytz.com/preise). en|fr|ru|fa|ar|tr = prefix /{locale}/ (https://www.ikeytz.com/en/preise). Omit or empty = de. Does not change prices, phone numbers, or legal German names. Not a maps.ikeytz.com locale (maps is German-only).'}}}
Esquema de salida
{'type': 'object', 'required': ['ok', 'tool', 'attribution'], 'properties': {'ok': {'type': 'boolean', 'description': 'true = use summary, canonicalUrl, and extra keys. false = do not invent data; read error + hint and retry with valid args or open hint.'}, 'hint': {'type': 'string', 'description': 'Present when ok=false. Absolute URL the agent should open or pass to get_ai_page / get_discovery.'}, 'tool': {'type': 'string', 'description': 'Echo of the tool name that produced this object (e.g. get_service_area).'}, 'error': {'type': 'string', 'description': 'Present when ok=false. Codes include: unknown_tool, unknown_place, unknown_auswahl, unknown_ratgeber, unknown_doc, unknown_discovery, faq_not_found, wissen_not_found, serp_not_found, q_required, bad_datetime, bad_when_key, plus HTTP errors from fetch.'}, 'locale': {'enum': ['de', 'en', 'fr', 'ru', 'fa', 'ar', 'tr'], 'type': 'string', 'description': 'Locale actually used for URLs (args.locale or de).'}, 'related': {'type': 'array', 'items': {'type': 'string', 'format': 'uri'}, 'description': 'Always includes https://www.ikeytz.com/llms.txt. Geo tools also include https://maps.ikeytz.com/llms.txt.'}, 'summary': {'type': 'string', 'description': 'Primary text for the model. For discovery tools this is the file window (possibly thousands of characters). For list tools a compact one-liner. Quote with attribution.'}, 'attribution': {'type': 'string', 'description': "Required citation: 'Quelle: Schlüsseldienst Ludwigsburg ikeytz (ikeytz.com) · ai-train=no · https://www.ikeytz.com/.well-known/ai.txt'"}, 'canonicalUrl': {'type': 'string', 'description': 'Best URL to show the user: https://www.ikeytz.com… page, or tel:+49…, mailto:…, https://wa.me/…. Prefer this over constructing URLs.'}}, '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 calls /api/*. Attribution must be kept when quoting. Policy: ai-input yes with attribution; ai-train=no.', 'additionalProperties': True}
get_llms_jsonld
Get Llms Jsonld
WHAT: Fetch /llms-jsonld.txt — map every marketing HTML URL to JSON-LD relatedLink (ai-pages fulltext) + mirrorId + optional geo_api (maps Embed-API when Ort-Slug). Format: pageUrl TAB relatedLink TAB mirrorId TAB geo_api. Same engine as get_sitemap_txt (offset/limit/nextOffset/# MCP-META). Not the page body (use get_ai_page). Not get_serp_snippet. geo_api empty for Hub/Legal/non-ort.
Solo lectura
Esquema de entrada
{'type': 'object', 'properties': {'limit': {'type': 'number', 'maximum': 10000, 'minimum': 1, 'description': 'Maximum number of lines to return after offset. Omit or null = return every remaining line in the loaded file. Clamped to 1..10000. For sitemap.txt (~9076 http-URLs, Stand 2026-09-22) omit limit to get the full list (or page with offset/limit + nextOffset). For llms-keywords.txt prefer a window; the file is huge. Meta also as trailing # MCP-META lines in summary.'}, 'offset': {'type': 'number', 'default': 0, 'minimum': 0, 'description': '0-based line index into the fetched UTF-8 file (split on \\n). 0 = first line. Omit = 0. Combined with limit = a sliding window. Use nextOffset from the previous result to page. Does not count bytes; one line can be a long URL.'}}}
Esquema de salida
{'type': 'object', 'required': ['ok', 'tool', 'attribution'], 'properties': {'ok': {'type': 'boolean', 'description': 'true = use summary, canonicalUrl, and extra keys. false = do not invent data; read error + hint and retry with valid args or open hint.'}, 'hint': {'type': 'string', 'description': 'Present when ok=false. Absolute URL the agent should open or pass to get_ai_page / get_discovery.'}, 'path': {'type': 'string', 'description': 'Public path on www, e.g. /llms.txt or /.well-known/ai.txt'}, 'tool': {'type': 'string', 'description': 'Echo of the tool name that produced this object (e.g. get_service_area).'}, 'error': {'type': 'string', 'description': 'Present when ok=false. Codes include: unknown_tool, unknown_place, unknown_auswahl, unknown_ratgeber, unknown_doc, unknown_discovery, faq_not_found, wissen_not_found, serp_not_found, q_required, bad_datetime, bad_when_key, plus HTTP errors from fetch.'}, 'limit': {'type': ['number', 'null'], 'description': 'Applied line limit, or null if the caller omitted limit.'}, 'which': {'type': 'string', 'description': 'Resolved discovery id after alias fold (llms, sitemap-txt, ard, ai-catalog, …).'}, 'locale': {'enum': ['de', 'en', 'fr', 'ru', 'fa', 'ar', 'tr'], 'type': 'string', 'description': 'Locale actually used for URLs (args.locale or de).'}, 'offset': {'type': 'number', 'description': 'Applied 0-based line offset.'}, 'related': {'type': 'array', 'items': {'type': 'string', 'format': 'uri'}, 'description': 'Always includes https://www.ikeytz.com/llms.txt. Geo tools also include https://maps.ikeytz.com/llms.txt.'}, 'summary': {'type': 'string', 'description': 'Primary text for the model. For discovery tools this is the file window (possibly thousands of characters). For list tools a compact one-liner. Quote with attribution.'}, 'totalUrls': {'type': 'number', 'description': 'http(s) lines in the loaded file (full count when public/ read succeeds).'}, 'truncated': {'type': 'boolean', 'description': 'true if load hit a byte cap OR offset+limit left more lines. Also mirrored in trailing # MCP-META lines in summary.'}, 'nextOffset': {'type': ['number', 'null'], 'description': 'offset + returnedLines when more lines remain in the loaded file; else null. Pass as the next offset. Also in # MCP-META.'}, 'totalBytes': {'type': 'number', 'description': 'Full origin file size when Content-Length is present (e.g. llms-keywords ~50MB); else character length of the downloaded body before the load cap. Also in # MCP-META.'}, 'totalChars': {'type': 'number', 'description': 'Character length of the downloaded body before applying discoveryFetchMax (may equal totalBytes for ASCII).'}, 'totalLines': {'type': 'number', 'description': 'Line count of the loaded file (full public/ file when available).'}, 'attribution': {'type': 'string', 'description': "Required citation: 'Quelle: Schlüsseldienst Ludwigsburg ikeytz (ikeytz.com) · ai-train=no · https://www.ikeytz.com/.well-known/ai.txt'"}, 'canonicalUrl': {'type': 'string', 'description': 'Best URL to show the user: https://www.ikeytz.com… page, or tel:+49…, mailto:…, https://wa.me/…. Prefer this over constructing URLs.'}, 'returnedUrls': {'type': 'number', 'description': 'Lines in this window that start with http(s)://'}, 'bytesReturned': {'type': 'number', 'description': 'UTF-8 byte length of the returned body window (before # MCP-META).'}, 'returnedLines': {'type': 'number', 'description': 'How many lines are in summary/body this call (before # MCP-META).'}, 'fetchTruncated': {'type': 'boolean', 'description': 'true if discoveryFetchMax cut the load (line-boundary safe). Large discovery files (sitemap-xml ~12MB, llms-keywords ~55MB, llms-index ~2MB) must load full so offset/limit can reach EOF.'}}, '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 calls /api/*. Attribution must be kept when quoting. Policy: ai-input yes with attribution; ai-train=no.', 'additionalProperties': True}
get_llms_mcp_server
Get Llms Mcp Server
WHAT: Fetch /llms-mcp-server.txt — prose catalog of THIS HTTP server (47 Read/Link tools, how to call, no login). Same as get_discovery(which=llms-mcp-server). Not the npm CLI README. Not maps.
Solo lectura
Esquema de entrada
{'type': 'object', 'properties': {'limit': {'type': 'number', 'maximum': 10000, 'minimum': 1, 'description': 'Maximum number of lines to return after offset. Omit or null = return every remaining line in the loaded file. Clamped to 1..10000. For sitemap.txt (~9076 http-URLs, Stand 2026-09-22) omit limit to get the full list (or page with offset/limit + nextOffset). For llms-keywords.txt prefer a window; the file is huge. Meta also as trailing # MCP-META lines in summary.'}, 'offset': {'type': 'number', 'default': 0, 'minimum': 0, 'description': '0-based line index into the fetched UTF-8 file (split on \\n). 0 = first line. Omit = 0. Combined with limit = a sliding window. Use nextOffset from the previous result to page. Does not count bytes; one line can be a long URL.'}}}
Esquema de salida
{'type': 'object', 'required': ['ok', 'tool', 'attribution'], 'properties': {'ok': {'type': 'boolean', 'description': 'true = use summary, canonicalUrl, and extra keys. false = do not invent data; read error + hint and retry with valid args or open hint.'}, 'hint': {'type': 'string', 'description': 'Present when ok=false. Absolute URL the agent should open or pass to get_ai_page / get_discovery.'}, 'path': {'type': 'string', 'description': 'Public path on www, e.g. /llms.txt or /.well-known/ai.txt'}, 'tool': {'type': 'string', 'description': 'Echo of the tool name that produced this object (e.g. get_service_area).'}, 'error': {'type': 'string', 'description': 'Present when ok=false. Codes include: unknown_tool, unknown_place, unknown_auswahl, unknown_ratgeber, unknown_doc, unknown_discovery, faq_not_found, wissen_not_found, serp_not_found, q_required, bad_datetime, bad_when_key, plus HTTP errors from fetch.'}, 'limit': {'type': ['number', 'null'], 'description': 'Applied line limit, or null if the caller omitted limit.'}, 'which': {'type': 'string', 'description': 'Resolved discovery id after alias fold (llms, sitemap-txt, ard, ai-catalog, …).'}, 'locale': {'enum': ['de', 'en', 'fr', 'ru', 'fa', 'ar', 'tr'], 'type': 'string', 'description': 'Locale actually used for URLs (args.locale or de).'}, 'offset': {'type': 'number', 'description': 'Applied 0-based line offset.'}, 'related': {'type': 'array', 'items': {'type': 'string', 'format': 'uri'}, 'description': 'Always includes https://www.ikeytz.com/llms.txt. Geo tools also include https://maps.ikeytz.com/llms.txt.'}, 'summary': {'type': 'string', 'description': 'Primary text for the model. For discovery tools this is the file window (possibly thousands of characters). For list tools a compact one-liner. Quote with attribution.'}, 'totalUrls': {'type': 'number', 'description': 'http(s) lines in the loaded file (full count when public/ read succeeds).'}, 'truncated': {'type': 'boolean', 'description': 'true if load hit a byte cap OR offset+limit left more lines. Also mirrored in trailing # MCP-META lines in summary.'}, 'nextOffset': {'type': ['number', 'null'], 'description': 'offset + returnedLines when more lines remain in the loaded file; else null. Pass as the next offset. Also in # MCP-META.'}, 'totalBytes': {'type': 'number', 'description': 'Full origin file size when Content-Length is present (e.g. llms-keywords ~50MB); else character length of the downloaded body before the load cap. Also in # MCP-META.'}, 'totalChars': {'type': 'number', 'description': 'Character length of the downloaded body before applying discoveryFetchMax (may equal totalBytes for ASCII).'}, 'totalLines': {'type': 'number', 'description': 'Line count of the loaded file (full public/ file when available).'}, 'attribution': {'type': 'string', 'description': "Required citation: 'Quelle: Schlüsseldienst Ludwigsburg ikeytz (ikeytz.com) · ai-train=no · https://www.ikeytz.com/.well-known/ai.txt'"}, 'canonicalUrl': {'type': 'string', 'description': 'Best URL to show the user: https://www.ikeytz.com… page, or tel:+49…, mailto:…, https://wa.me/…. Prefer this over constructing URLs.'}, 'returnedUrls': {'type': 'number', 'description': 'Lines in this window that start with http(s)://'}, 'bytesReturned': {'type': 'number', 'description': 'UTF-8 byte length of the returned body window (before # MCP-META).'}, 'returnedLines': {'type': 'number', 'description': 'How many lines are in summary/body this call (before # MCP-META).'}, 'fetchTruncated': {'type': 'boolean', 'description': 'true if discoveryFetchMax cut the load (line-boundary safe). Large discovery files (sitemap-xml ~12MB, llms-keywords ~55MB, llms-index ~2MB) must load full so offset/limit can reach EOF.'}}, '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 calls /api/*. Attribution must be kept when quoting. Policy: ai-input yes with attribution; ai-train=no.', 'additionalProperties': True}
get_llms_mcp_web
Get Llms Mcp Web
WHAT: Fetch /llms-mcp-web.txt — browser WebMCP catalog (early bootstrap tools + full list). Same executeMcpTool handlers as HTTP /mcp, different transport (document.modelContext). Not this streamable-http endpoint.
Solo lectura
Esquema de entrada
{'type': 'object', 'properties': {'limit': {'type': 'number', 'maximum': 10000, 'minimum': 1, 'description': 'Maximum number of lines to return after offset. Omit or null = return every remaining line in the loaded file. Clamped to 1..10000. For sitemap.txt (~9076 http-URLs, Stand 2026-09-22) omit limit to get the full list (or page with offset/limit + nextOffset). For llms-keywords.txt prefer a window; the file is huge. Meta also as trailing # MCP-META lines in summary.'}, 'offset': {'type': 'number', 'default': 0, 'minimum': 0, 'description': '0-based line index into the fetched UTF-8 file (split on \\n). 0 = first line. Omit = 0. Combined with limit = a sliding window. Use nextOffset from the previous result to page. Does not count bytes; one line can be a long URL.'}}}
Esquema de salida
{'type': 'object', 'required': ['ok', 'tool', 'attribution'], 'properties': {'ok': {'type': 'boolean', 'description': 'true = use summary, canonicalUrl, and extra keys. false = do not invent data; read error + hint and retry with valid args or open hint.'}, 'hint': {'type': 'string', 'description': 'Present when ok=false. Absolute URL the agent should open or pass to get_ai_page / get_discovery.'}, 'path': {'type': 'string', 'description': 'Public path on www, e.g. /llms.txt or /.well-known/ai.txt'}, 'tool': {'type': 'string', 'description': 'Echo of the tool name that produced this object (e.g. get_service_area).'}, 'error': {'type': 'string', 'description': 'Present when ok=false. Codes include: unknown_tool, unknown_place, unknown_auswahl, unknown_ratgeber, unknown_doc, unknown_discovery, faq_not_found, wissen_not_found, serp_not_found, q_required, bad_datetime, bad_when_key, plus HTTP errors from fetch.'}, 'limit': {'type': ['number', 'null'], 'description': 'Applied line limit, or null if the caller omitted limit.'}, 'which': {'type': 'string', 'description': 'Resolved discovery id after alias fold (llms, sitemap-txt, ard, ai-catalog, …).'}, 'locale': {'enum': ['de', 'en', 'fr', 'ru', 'fa', 'ar', 'tr'], 'type': 'string', 'description': 'Locale actually used for URLs (args.locale or de).'}, 'offset': {'type': 'number', 'description': 'Applied 0-based line offset.'}, 'related': {'type': 'array', 'items': {'type': 'string', 'format': 'uri'}, 'description': 'Always includes https://www.ikeytz.com/llms.txt. Geo tools also include https://maps.ikeytz.com/llms.txt.'}, 'summary': {'type': 'string', 'description': 'Primary text for the model. For discovery tools this is the file window (possibly thousands of characters). For list tools a compact one-liner. Quote with attribution.'}, 'totalUrls': {'type': 'number', 'description': 'http(s) lines in the loaded file (full count when public/ read succeeds).'}, 'truncated': {'type': 'boolean', 'description': 'true if load hit a byte cap OR offset+limit left more lines. Also mirrored in trailing # MCP-META lines in summary.'}, 'nextOffset': {'type': ['number', 'null'], 'description': 'offset + returnedLines when more lines remain in the loaded file; else null. Pass as the next offset. Also in # MCP-META.'}, 'totalBytes': {'type': 'number', 'description': 'Full origin file size when Content-Length is present (e.g. llms-keywords ~50MB); else character length of the downloaded body before the load cap. Also in # MCP-META.'}, 'totalChars': {'type': 'number', 'description': 'Character length of the downloaded body before applying discoveryFetchMax (may equal totalBytes for ASCII).'}, 'totalLines': {'type': 'number', 'description': 'Line count of the loaded file (full public/ file when available).'}, 'attribution': {'type': 'string', 'description': "Required citation: 'Quelle: Schlüsseldienst Ludwigsburg ikeytz (ikeytz.com) · ai-train=no · https://www.ikeytz.com/.well-known/ai.txt'"}, 'canonicalUrl': {'type': 'string', 'description': 'Best URL to show the user: https://www.ikeytz.com… page, or tel:+49…, mailto:…, https://wa.me/…. Prefer this over constructing URLs.'}, 'returnedUrls': {'type': 'number', 'description': 'Lines in this window that start with http(s)://'}, 'bytesReturned': {'type': 'number', 'description': 'UTF-8 byte length of the returned body window (before # MCP-META).'}, 'returnedLines': {'type': 'number', 'description': 'How many lines are in summary/body this call (before # MCP-META).'}, 'fetchTruncated': {'type': 'boolean', 'description': 'true if discoveryFetchMax cut the load (line-boundary safe). Large discovery files (sitemap-xml ~12MB, llms-keywords ~55MB, llms-index ~2MB) must load full so offset/limit can reach EOF.'}}, '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 calls /api/*. Attribution must be kept when quoting. Policy: ai-input yes with attribution; ai-train=no.', 'additionalProperties': True}
get_llms_serp_txt
Get Llms Serp Txt
WHAT: Fetch /llms-serp.txt — full SERP title/description/URL corpus with offset/limit. Same as get_discovery(which=llms-serp). For one URL use get_serp_snippet.
Solo lectura
Esquema de entrada
{'type': 'object', 'properties': {'limit': {'type': 'number', 'maximum': 10000, 'minimum': 1, 'description': 'Maximum number of lines to return after offset. Omit or null = return every remaining line in the loaded file. Clamped to 1..10000. For sitemap.txt (~9076 http-URLs, Stand 2026-09-22) omit limit to get the full list (or page with offset/limit + nextOffset). For llms-keywords.txt prefer a window; the file is huge. Meta also as trailing # MCP-META lines in summary.'}, 'offset': {'type': 'number', 'default': 0, 'minimum': 0, 'description': '0-based line index into the fetched UTF-8 file (split on \\n). 0 = first line. Omit = 0. Combined with limit = a sliding window. Use nextOffset from the previous result to page. Does not count bytes; one line can be a long URL.'}}}
Esquema de salida
{'type': 'object', 'required': ['ok', 'tool', 'attribution'], 'properties': {'ok': {'type': 'boolean', 'description': 'true = use summary, canonicalUrl, and extra keys. false = do not invent data; read error + hint and retry with valid args or open hint.'}, 'hint': {'type': 'string', 'description': 'Present when ok=false. Absolute URL the agent should open or pass to get_ai_page / get_discovery.'}, 'path': {'type': 'string', 'description': 'Public path on www, e.g. /llms.txt or /.well-known/ai.txt'}, 'tool': {'type': 'string', 'description': 'Echo of the tool name that produced this object (e.g. get_service_area).'}, 'error': {'type': 'string', 'description': 'Present when ok=false. Codes include: unknown_tool, unknown_place, unknown_auswahl, unknown_ratgeber, unknown_doc, unknown_discovery, faq_not_found, wissen_not_found, serp_not_found, q_required, bad_datetime, bad_when_key, plus HTTP errors from fetch.'}, 'limit': {'type': ['number', 'null'], 'description': 'Applied line limit, or null if the caller omitted limit.'}, 'which': {'type': 'string', 'description': 'Resolved discovery id after alias fold (llms, sitemap-txt, ard, ai-catalog, …).'}, 'locale': {'enum': ['de', 'en', 'fr', 'ru', 'fa', 'ar', 'tr'], 'type': 'string', 'description': 'Locale actually used for URLs (args.locale or de).'}, 'offset': {'type': 'number', 'description': 'Applied 0-based line offset.'}, 'related': {'type': 'array', 'items': {'type': 'string', 'format': 'uri'}, 'description': 'Always includes https://www.ikeytz.com/llms.txt. Geo tools also include https://maps.ikeytz.com/llms.txt.'}, 'summary': {'type': 'string', 'description': 'Primary text for the model. For discovery tools this is the file window (possibly thousands of characters). For list tools a compact one-liner. Quote with attribution.'}, 'totalUrls': {'type': 'number', 'description': 'http(s) lines in the loaded file (full count when public/ read succeeds).'}, 'truncated': {'type': 'boolean', 'description': 'true if load hit a byte cap OR offset+limit left more lines. Also mirrored in trailing # MCP-META lines in summary.'}, 'nextOffset': {'type': ['number', 'null'], 'description': 'offset + returnedLines when more lines remain in the loaded file; else null. Pass as the next offset. Also in # MCP-META.'}, 'totalBytes': {'type': 'number', 'description': 'Full origin file size when Content-Length is present (e.g. llms-keywords ~50MB); else character length of the downloaded body before the load cap. Also in # MCP-META.'}, 'totalChars': {'type': 'number', 'description': 'Character length of the downloaded body before applying discoveryFetchMax (may equal totalBytes for ASCII).'}, 'totalLines': {'type': 'number', 'description': 'Line count of the loaded file (full public/ file when available).'}, 'attribution': {'type': 'string', 'description': "Required citation: 'Quelle: Schlüsseldienst Ludwigsburg ikeytz (ikeytz.com) · ai-train=no · https://www.ikeytz.com/.well-known/ai.txt'"}, 'canonicalUrl': {'type': 'string', 'description': 'Best URL to show the user: https://www.ikeytz.com… page, or tel:+49…, mailto:…, https://wa.me/…. Prefer this over constructing URLs.'}, 'returnedUrls': {'type': 'number', 'description': 'Lines in this window that start with http(s)://'}, 'bytesReturned': {'type': 'number', 'description': 'UTF-8 byte length of the returned body window (before # MCP-META).'}, 'returnedLines': {'type': 'number', 'description': 'How many lines are in summary/body this call (before # MCP-META).'}, 'fetchTruncated': {'type': 'boolean', 'description': 'true if discoveryFetchMax cut the load (line-boundary safe). Large discovery files (sitemap-xml ~12MB, llms-keywords ~55MB, llms-index ~2MB) must load full so offset/limit can reach EOF.'}}, '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 calls /api/*. Attribution must be kept when quoting. Policy: ai-input yes with attribution; ai-train=no.', 'additionalProperties': True}
get_llms_txt
Get Llms Txt
WHAT: Fetch https://www.ikeytz.com/llms.txt (short AI landmap). Same engine as get_discovery(which=llms). summary = file window. USE as the first discovery read. Full dump: get_discovery(which=llms-full). MCP catalog: get_llms_mcp_server.
Solo lectura
Esquema de entrada
{'type': 'object', 'properties': {'limit': {'type': 'number', 'maximum': 10000, 'minimum': 1, 'description': 'Maximum number of lines to return after offset. Omit or null = return every remaining line in the loaded file. Clamped to 1..10000. For sitemap.txt (~9076 http-URLs, Stand 2026-09-22) omit limit to get the full list (or page with offset/limit + nextOffset). For llms-keywords.txt prefer a window; the file is huge. Meta also as trailing # MCP-META lines in summary.'}, 'offset': {'type': 'number', 'default': 0, 'minimum': 0, 'description': '0-based line index into the fetched UTF-8 file (split on \\n). 0 = first line. Omit = 0. Combined with limit = a sliding window. Use nextOffset from the previous result to page. Does not count bytes; one line can be a long URL.'}}}
Esquema de salida
{'type': 'object', 'required': ['ok', 'tool', 'attribution'], 'properties': {'ok': {'type': 'boolean', 'description': 'true = use summary, canonicalUrl, and extra keys. false = do not invent data; read error + hint and retry with valid args or open hint.'}, 'hint': {'type': 'string', 'description': 'Present when ok=false. Absolute URL the agent should open or pass to get_ai_page / get_discovery.'}, 'path': {'type': 'string', 'description': 'Public path on www, e.g. /llms.txt or /.well-known/ai.txt'}, 'tool': {'type': 'string', 'description': 'Echo of the tool name that produced this object (e.g. get_service_area).'}, 'error': {'type': 'string', 'description': 'Present when ok=false. Codes include: unknown_tool, unknown_place, unknown_auswahl, unknown_ratgeber, unknown_doc, unknown_discovery, faq_not_found, wissen_not_found, serp_not_found, q_required, bad_datetime, bad_when_key, plus HTTP errors from fetch.'}, 'limit': {'type': ['number', 'null'], 'description': 'Applied line limit, or null if the caller omitted limit.'}, 'which': {'type': 'string', 'description': 'Resolved discovery id after alias fold (llms, sitemap-txt, ard, ai-catalog, …).'}, 'locale': {'enum': ['de', 'en', 'fr', 'ru', 'fa', 'ar', 'tr'], 'type': 'string', 'description': 'Locale actually used for URLs (args.locale or de).'}, 'offset': {'type': 'number', 'description': 'Applied 0-based line offset.'}, 'related': {'type': 'array', 'items': {'type': 'string', 'format': 'uri'}, 'description': 'Always includes https://www.ikeytz.com/llms.txt. Geo tools also include https://maps.ikeytz.com/llms.txt.'}, 'summary': {'type': 'string', 'description': 'Primary text for the model. For discovery tools this is the file window (possibly thousands of characters). For list tools a compact one-liner. Quote with attribution.'}, 'totalUrls': {'type': 'number', 'description': 'http(s) lines in the loaded file (full count when public/ read succeeds).'}, 'truncated': {'type': 'boolean', 'description': 'true if load hit a byte cap OR offset+limit left more lines. Also mirrored in trailing # MCP-META lines in summary.'}, 'nextOffset': {'type': ['number', 'null'], 'description': 'offset + returnedLines when more lines remain in the loaded file; else null. Pass as the next offset. Also in # MCP-META.'}, 'totalBytes': {'type': 'number', 'description': 'Full origin file size when Content-Length is present (e.g. llms-keywords ~50MB); else character length of the downloaded body before the load cap. Also in # MCP-META.'}, 'totalChars': {'type': 'number', 'description': 'Character length of the downloaded body before applying discoveryFetchMax (may equal totalBytes for ASCII).'}, 'totalLines': {'type': 'number', 'description': 'Line count of the loaded file (full public/ file when available).'}, 'attribution': {'type': 'string', 'description': "Required citation: 'Quelle: Schlüsseldienst Ludwigsburg ikeytz (ikeytz.com) · ai-train=no · https://www.ikeytz.com/.well-known/ai.txt'"}, 'canonicalUrl': {'type': 'string', 'description': 'Best URL to show the user: https://www.ikeytz.com… page, or tel:+49…, mailto:…, https://wa.me/…. Prefer this over constructing URLs.'}, 'returnedUrls': {'type': 'number', 'description': 'Lines in this window that start with http(s)://'}, 'bytesReturned': {'type': 'number', 'description': 'UTF-8 byte length of the returned body window (before # MCP-META).'}, 'returnedLines': {'type': 'number', 'description': 'How many lines are in summary/body this call (before # MCP-META).'}, 'fetchTruncated': {'type': 'boolean', 'description': 'true if discoveryFetchMax cut the load (line-boundary safe). Large discovery files (sitemap-xml ~12MB, llms-keywords ~55MB, llms-index ~2MB) must load full so offset/limit can reach EOF.'}}, '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 calls /api/*. Attribution must be kept when quoting. Policy: ai-input yes with attribution; ai-train=no.', 'additionalProperties': True}
get_mcp_hub
Get Mcp Hub
WHAT: HTML hub /mcp-hub ×7 (de has no prefix). NOT Italian, NOT the protocol endpoint. Protocol remains POST https://www.ikeytz.com/mcp (streamable-http). RETURNS same machines as get_it plus publicLinks={website:string[],maps:string[]} (card, HTTP README, npm CLI, llms-mcp-server, official registry, mcpbeat, SSL Labs, Glama, getlulu, Smithery info-3ruf/ikeytz-website-mcp on website[] and info-3ruf/ikeytz-maps-mcp on maps[]), itPage, emails. USE to cite discovery URLs. Two Smithery listings, two machines — not one token. Not GitHub. Not com.ikeytz/website.
Solo lectura
Esquema de entrada
{'type': 'object', 'properties': {'locale': {'enum': ['de', 'en', 'fr', 'ru', 'fa', 'ar', 'tr'], 'type': 'string', 'default': 'de', 'description': 'HTML locale for canonicalUrl and path prefixes. de = default, URLs have no prefix (https://www.ikeytz.com/preise). en|fr|ru|fa|ar|tr = prefix /{locale}/ (https://www.ikeytz.com/en/preise). Omit or empty = de. Does not change prices, phone numbers, or legal German names. Not a maps.ikeytz.com locale (maps is German-only).'}}}
Esquema de salida
{'type': 'object', 'required': ['ok', 'tool', 'attribution'], 'properties': {'ok': {'type': 'boolean', 'description': 'true = use summary, canonicalUrl, and extra keys. false = do not invent data; read error + hint and retry with valid args or open hint.'}, 'hint': {'type': 'string', 'description': 'Present when ok=false. Absolute URL the agent should open or pass to get_ai_page / get_discovery.'}, 'maps': {'type': 'object', 'properties': {'cli': {'type': 'string', 'description': 'CLI binary name, e.g. ikeytz-mcp'}, 'mcp': {'type': 'string', 'format': 'uri', 'description': 'HTTPS MCP endpoint …/mcp'}, 'npm': {'type': 'string', 'description': 'npm package name, e.g. @ikeytz/mcp — CLI only, not this HTTP server'}, 'card': {'type': 'string', 'format': 'uri', 'description': 'https://…/.well-known/mcp/server-card.json'}, 'name': {'type': 'string', 'description': 'MCP server name: com.ikeytz/website or com.ikeytz/maps'}, 'readme': {'type': 'string', 'format': 'uri', 'description': 'CLI README on npm — not the HTTP MCP README'}, 'httpReadme': {'type': 'string', 'format': 'uri', 'description': 'HTTP MCP README on the machine host (www: /mcp-readme.md). Not the npm CLI README. Maps has no www copy.'}}, 'description': 'maps machine'}, 'page': {'type': 'string', 'format': 'uri', 'description': 'Locale /mcp-hub URL.'}, 'tool': {'type': 'string', 'description': 'Echo of the tool name that produced this object (e.g. get_service_area).'}, 'error': {'type': 'string', 'description': 'Present when ok=false. Codes include: unknown_tool, unknown_place, unknown_auswahl, unknown_ratgeber, unknown_doc, unknown_discovery, faq_not_found, wissen_not_found, serp_not_found, q_required, bad_datetime, bad_when_key, plus HTTP errors from fetch.'}, 'proxy': {'type': 'boolean', 'const': False}, 'itPage': {'type': 'string', 'format': 'uri', 'description': 'Locale /it URL.'}, 'locale': {'enum': ['de', 'en', 'fr', 'ru', 'fa', 'ar', 'tr'], 'type': 'string', 'description': 'Locale actually used for URLs (args.locale or de).'}, 'aiEmail': {'type': 'string'}, 'itEmail': {'type': 'string'}, 'related': {'type': 'array', 'items': {'type': 'string', 'format': 'uri'}, 'description': 'Always includes https://www.ikeytz.com/llms.txt. Geo tools also include https://maps.ikeytz.com/llms.txt.'}, 'summary': {'type': 'string', 'description': 'Primary text for the model. For discovery tools this is the file window (possibly thousands of characters). For list tools a compact one-liner. Quote with attribution.'}, 'website': {'type': 'object', 'properties': {'cli': {'type': 'string', 'description': 'CLI binary name, e.g. ikeytz-mcp'}, 'mcp': {'type': 'string', 'format': 'uri', 'description': 'HTTPS MCP endpoint …/mcp'}, 'npm': {'type': 'string', 'description': 'npm package name, e.g. @ikeytz/mcp — CLI only, not this HTTP server'}, 'card': {'type': 'string', 'format': 'uri', 'description': 'https://…/.well-known/mcp/server-card.json'}, 'name': {'type': 'string', 'description': 'MCP server name: com.ikeytz/website or com.ikeytz/maps'}, 'readme': {'type': 'string', 'format': 'uri', 'description': 'CLI README on npm — not the HTTP MCP README'}, 'httpReadme': {'type': 'string', 'format': 'uri', 'description': 'HTTP MCP README on the machine host (www: /mcp-readme.md). Not the npm CLI README. Maps has no www copy.'}}, 'description': 'www machine'}, 'attribution': {'type': 'string', 'description': "Required citation: 'Quelle: Schlüsseldienst Ludwigsburg ikeytz (ikeytz.com) · ai-train=no · https://www.ikeytz.com/.well-known/ai.txt'"}, 'publicLinks': {'type': 'object', 'properties': {'maps': {'type': 'array', 'items': {'type': 'string', 'format': 'uri'}, 'description': 'maps catalogs (no Smithery until that listing exists).'}, 'website': {'type': 'array', 'items': {'type': 'string', 'format': 'uri'}, 'description': 'www catalogs including official registry search and Smithery page when present.'}}, 'description': 'Full public catalog URLs, same order as the footer MCP tab.'}, 'canonicalUrl': {'type': 'string', 'description': 'Best URL to show the user: https://www.ikeytz.com… page, or tel:+49…, mailto:…, https://wa.me/…. Prefer this over constructing URLs.'}}, '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 calls /api/*. Attribution must be kept when quoting. Policy: ai-input yes with attribution; ai-train=no.', 'additionalProperties': True}
get_ort_datetime
Get Ort Datetime
WHAT: Europe/Berlin wall clock to the second + whenKey for prices. THIS www tool does NOT look up a place (no slug/plz). maps.ikeytz.com has a different geo clock tool. RULE: whenKey=day only Mo–Fr 08:00:00–17:59:59 Berlin and not a Baden-Württemberg statutory holiday; otherwise night (Sa, So, holiday, or 18:00–07:59). RETURNS ok, stand ('YYYY-MM-DD HH:MM:SS CEST|CET'), iso, unix, date, time, tz, timezone=Europe/Berlin, weekday, weekdayIso (1=Mon), whenKey, holiday (bool), holidayName (or null), rule, invoiceTool=get_invoice_line_items, pricesTool=get_prices. USE before invoicing. NEXT: get_invoice_line_items({situationKey, whenKey: 'now'}) or pass whenKey day|night.
Solo lectura
Esquema de entrada
{'type': 'object', 'properties': {'at': {'type': 'string', 'description': 'Optional clock. Formats: ISO-8601 with Z or ±HH:MM; or YYYY-MM-DD; or YYYY-MM-DDTHH:MM[:SS] interpreted as Europe/Berlin if no offset; or unix seconds/ms number-as-string. Omit = now. Invalid → ok=false error=bad_datetime.'}, 'locale': {'enum': ['de', 'en', 'fr', 'ru', 'fa', 'ar', 'tr'], 'type': 'string', 'default': 'de', 'description': 'HTML locale for canonicalUrl and path prefixes. de = default, URLs have no prefix (https://www.ikeytz.com/preise). en|fr|ru|fa|ar|tr = prefix /{locale}/ (https://www.ikeytz.com/en/preise). Omit or empty = de. Does not change prices, phone numbers, or legal German names. Not a maps.ikeytz.com locale (maps is German-only).'}}}
Esquema de salida
{'type': 'object', 'required': ['ok', 'tool', 'attribution'], 'properties': {'ok': {'type': 'boolean', 'description': 'true = use summary, canonicalUrl, and extra keys. false = do not invent data; read error + hint and retry with valid args or open hint.'}, 'tz': {'enum': ['CET', 'CEST'], 'type': 'string', 'description': 'Abbreviation.'}, 'iso': {'type': 'string', 'description': 'ISO-8601 with Berlin offset.'}, 'date': {'type': 'string', 'description': 'YYYY-MM-DD in Berlin.'}, 'hint': {'type': 'string', 'description': 'Present when ok=false. Absolute URL the agent should open or pass to get_ai_page / get_discovery.'}, 'rule': {'type': 'string', 'description': 'Human rule string for day vs night.'}, 'time': {'type': 'string', 'description': 'HH:MM:SS in Berlin (24h).'}, 'tool': {'type': 'string', 'description': 'Echo of the tool name that produced this object (e.g. get_service_area).'}, 'unix': {'type': 'number', 'description': 'Unix timestamp seconds.'}, 'error': {'type': 'string', 'description': 'Present when ok=false. Codes include: unknown_tool, unknown_place, unknown_auswahl, unknown_ratgeber, unknown_doc, unknown_discovery, faq_not_found, wissen_not_found, serp_not_found, q_required, bad_datetime, bad_when_key, plus HTTP errors from fetch.'}, 'stand': {'type': 'string', 'description': "Human clock 'YYYY-MM-DD HH:MM:SS CEST|CET' Europe/Berlin."}, 'locale': {'enum': ['de', 'en', 'fr', 'ru', 'fa', 'ar', 'tr'], 'type': 'string', 'description': 'Locale actually used for URLs (args.locale or de).'}, 'holiday': {'type': 'boolean', 'description': 'true if date is a BW statutory holiday.'}, 'related': {'type': 'array', 'items': {'type': 'string', 'format': 'uri'}, 'description': 'Always includes https://www.ikeytz.com/llms.txt. Geo tools also include https://maps.ikeytz.com/llms.txt.'}, 'summary': {'type': 'string', 'description': 'Primary text for the model. For discovery tools this is the file window (possibly thousands of characters). For list tools a compact one-liner. Quote with attribution.'}, 'weekday': {'type': 'string', 'description': 'en-GB short weekday (Mon…Sun).'}, 'whenKey': {'enum': ['day', 'night'], 'type': 'string', 'description': 'Price bucket. Pass to get_invoice_line_items.whenKey or use whenKey=now there.'}, 'timezone': {'type': 'string', 'const': 'Europe/Berlin'}, 'pricesTool': {'type': 'string', 'const': 'get_prices'}, 'weekdayIso': {'type': 'number', 'description': 'ISO weekday 1=Monday … 7=Sunday.'}, 'attribution': {'type': 'string', 'description': "Required citation: 'Quelle: Schlüsseldienst Ludwigsburg ikeytz (ikeytz.com) · ai-train=no · https://www.ikeytz.com/.well-known/ai.txt'"}, 'holidayName': {'type': ['string', 'null'], 'description': 'German holiday name or null. Holidays force whenKey=night.'}, 'invoiceTool': {'type': 'string', 'const': 'get_invoice_line_items'}, 'canonicalUrl': {'type': 'string', 'description': 'Best URL to show the user: https://www.ikeytz.com… page, or tel:+49…, mailto:…, https://wa.me/…. Prefer this over constructing URLs.'}}, '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 calls /api/*. Attribution must be kept when quoting. Policy: ai-input yes with attribution; ai-train=no.', 'additionalProperties': True}
get_page_summary
Get Page Summary
WHAT: Stub pointer only — NOT the page body. summary says to use ai-pages or HTML. RETURNS path (locale prefix stripped). USE get_ai_page or get_serp_snippet for real text. path optional (default /).
Solo lectura
Esquema de entrada
{'type': 'object', 'properties': {'path': {'type': 'string', 'description': 'Optional marketing path. Omit or empty = /. Examples: /preise, /en/preise, /kontakt. Locale prefix stripped in the return path.'}, 'locale': {'enum': ['de', 'en', 'fr', 'ru', 'fa', 'ar', 'tr'], 'type': 'string', 'default': 'de', 'description': 'HTML locale for canonicalUrl and path prefixes. de = default, URLs have no prefix (https://www.ikeytz.com/preise). en|fr|ru|fa|ar|tr = prefix /{locale}/ (https://www.ikeytz.com/en/preise). Omit or empty = de. Does not change prices, phone numbers, or legal German names. Not a maps.ikeytz.com locale (maps is German-only).'}}}
Esquema de salida
{'type': 'object', 'required': ['ok', 'tool', 'attribution'], 'properties': {'ok': {'type': 'boolean', 'description': 'true = use summary, canonicalUrl, and extra keys. false = do not invent data; read error + hint and retry with valid args or open hint.'}, 'hint': {'type': 'string', 'description': 'Present when ok=false. Absolute URL the agent should open or pass to get_ai_page / get_discovery.'}, 'path': {'type': 'string', 'description': 'Path without locale prefix'}, 'tool': {'type': 'string', 'description': 'Echo of the tool name that produced this object (e.g. get_service_area).'}, 'error': {'type': 'string', 'description': 'Present when ok=false. Codes include: unknown_tool, unknown_place, unknown_auswahl, unknown_ratgeber, unknown_doc, unknown_discovery, faq_not_found, wissen_not_found, serp_not_found, q_required, bad_datetime, bad_when_key, plus HTTP errors from fetch.'}, 'locale': {'enum': ['de', 'en', 'fr', 'ru', 'fa', 'ar', 'tr'], 'type': 'string', 'description': 'Locale actually used for URLs (args.locale or de).'}, 'related': {'type': 'array', 'items': {'type': 'string', 'format': 'uri'}, 'description': 'Always includes https://www.ikeytz.com/llms.txt. Geo tools also include https://maps.ikeytz.com/llms.txt.'}, 'summary': {'type': 'string', 'description': 'Primary text for the model. For discovery tools this is the file window (possibly thousands of characters). For list tools a compact one-liner. Quote with attribution.'}, 'attribution': {'type': 'string', 'description': "Required citation: 'Quelle: Schlüsseldienst Ludwigsburg ikeytz (ikeytz.com) · ai-train=no · https://www.ikeytz.com/.well-known/ai.txt'"}, 'canonicalUrl': {'type': 'string', 'description': 'Best URL to show the user: https://www.ikeytz.com… page, or tel:+49…, mailto:…, https://wa.me/…. Prefer this over constructing URLs.'}}, '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 calls /api/*. Attribution must be kept when quoting. Policy: ai-input yes with attribution; ai-train=no.', 'additionalProperties': True}
get_partner_info
Get Partner Info
WHAT: Partner-werden info. formSubmit=false — agents MUST NOT claim they sent the form. RETURNS partnerEmail for a mailto. NEXT: compose_mailto or tell the user to open /partner-werden themselves.
Solo lectura
Esquema de entrada
{'type': 'object', 'properties': {'locale': {'enum': ['de', 'en', 'fr', 'ru', 'fa', 'ar', 'tr'], 'type': 'string', 'default': 'de', 'description': 'HTML locale for canonicalUrl and path prefixes. de = default, URLs have no prefix (https://www.ikeytz.com/preise). en|fr|ru|fa|ar|tr = prefix /{locale}/ (https://www.ikeytz.com/en/preise). Omit or empty = de. Does not change prices, phone numbers, or legal German names. Not a maps.ikeytz.com locale (maps is German-only).'}}}
Esquema de salida
{'type': 'object', 'required': ['ok', 'tool', 'attribution'], 'properties': {'ok': {'type': 'boolean', 'description': 'true = use summary, canonicalUrl, and extra keys. false = do not invent data; read error + hint and retry with valid args or open hint.'}, 'hint': {'type': 'string', 'description': 'Present when ok=false. Absolute URL the agent should open or pass to get_ai_page / get_discovery.'}, 'tool': {'type': 'string', 'description': 'Echo of the tool name that produced this object (e.g. get_service_area).'}, 'error': {'type': 'string', 'description': 'Present when ok=false. Codes include: unknown_tool, unknown_place, unknown_auswahl, unknown_ratgeber, unknown_doc, unknown_discovery, faq_not_found, wissen_not_found, serp_not_found, q_required, bad_datetime, bad_when_key, plus HTTP errors from fetch.'}, 'locale': {'enum': ['de', 'en', 'fr', 'ru', 'fa', 'ar', 'tr'], 'type': 'string', 'description': 'Locale actually used for URLs (args.locale or de).'}, 'related': {'type': 'array', 'items': {'type': 'string', 'format': 'uri'}, 'description': 'Always includes https://www.ikeytz.com/llms.txt. Geo tools also include https://maps.ikeytz.com/llms.txt.'}, 'summary': {'type': 'string', 'description': 'Primary text for the model. For discovery tools this is the file window (possibly thousands of characters). For list tools a compact one-liner. Quote with attribution.'}, 'attribution': {'type': 'string', 'description': "Required citation: 'Quelle: Schlüsseldienst Ludwigsburg ikeytz (ikeytz.com) · ai-train=no · https://www.ikeytz.com/.well-known/ai.txt'"}, 'canonicalUrl': {'type': 'string', 'description': 'Best URL to show the user: https://www.ikeytz.com… page, or tel:+49…, mailto:…, https://wa.me/…. Prefer this over constructing URLs.'}}, '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 calls /api/*. Attribution must be kept when quoting. Policy: ai-input yes with attribution; ai-train=no.', 'additionalProperties': True}
get_prices
Get Prices
WHAT: Official Festpreis matrix + composition SYSTEM. Read composition first: exactly 10 end-invoices + one 49 € add-on (not 12, not 17 customer invoices). 49 € is cylinder_mount after an opening — already inside 148/198/178/228; never add 49 again. 49 € is NOT night/weekend/holiday (those are 149/179/198/228/119). RETURNS composition{ruleDe,doNotConfuse[],factors[],routes[],endInvoices[] with contactOption,howTo[]}, opening[], packages[], surcharges[], note. USE to understand how to assemble a price. DOES NOT compute one customer total — that is get_invoice_line_items(situationKey, whenKey). Contact: compose_whatsapp/compose_mailto with contactOption. whenKey: get_ort_datetime. No VAT (§ 19).
Solo lectura
Esquema de entrada
{'type': 'object', 'properties': {'locale': {'enum': ['de', 'en', 'fr', 'ru', 'fa', 'ar', 'tr'], 'type': 'string', 'default': 'de', 'description': 'HTML locale for canonicalUrl and path prefixes. de = default, URLs have no prefix (https://www.ikeytz.com/preise). en|fr|ru|fa|ar|tr = prefix /{locale}/ (https://www.ikeytz.com/en/preise). Omit or empty = de. Does not change prices, phone numbers, or legal German names. Not a maps.ikeytz.com locale (maps is German-only).'}}}
Esquema de salida
{'type': 'object', 'required': ['ok', 'tool', 'attribution'], 'properties': {'ok': {'type': 'boolean', 'description': 'true = use summary, canonicalUrl, and extra keys. false = do not invent data; read error + hint and retry with valid args or open hint.'}, 'hint': {'type': 'string', 'description': 'Present when ok=false. Absolute URL the agent should open or pass to get_ai_page / get_discovery.'}, 'note': {'type': 'string', 'description': 'Legal/price note'}, 'tool': {'type': 'string', 'description': 'Echo of the tool name that produced this object (e.g. get_service_area).'}, 'error': {'type': 'string', 'description': 'Present when ok=false. Codes include: unknown_tool, unknown_place, unknown_auswahl, unknown_ratgeber, unknown_doc, unknown_discovery, faq_not_found, wissen_not_found, serp_not_found, q_required, bad_datetime, bad_when_key, plus HTTP errors from fetch.'}, 'locale': {'enum': ['de', 'en', 'fr', 'ru', 'fa', 'ar', 'tr'], 'type': 'string', 'description': 'Locale actually used for URLs (args.locale or de).'}, 'opening': {'type': 'array', 'description': 'Door-opening price blocks'}, 'related': {'type': 'array', 'items': {'type': 'string', 'format': 'uri'}, 'description': 'Always includes https://www.ikeytz.com/llms.txt. Geo tools also include https://maps.ikeytz.com/llms.txt.'}, 'summary': {'type': 'string', 'description': 'Primary text for the model. For discovery tools this is the file window (possibly thousands of characters). For list tools a compact one-liner. Quote with attribution.'}, 'packages': {'type': 'array', 'description': 'Invoice packages (day/night)'}, 'surcharges': {'type': 'array', 'description': 'Surcharge rows'}, 'attribution': {'type': 'string', 'description': "Required citation: 'Quelle: Schlüsseldienst Ludwigsburg ikeytz (ikeytz.com) · ai-train=no · https://www.ikeytz.com/.well-known/ai.txt'"}, 'composition': {'type': 'object', 'description': 'How to assemble: 10 end-invoices, factors, question routes, formulas. Required reading before quoting €.'}, 'canonicalUrl': {'type': 'string', 'description': 'Best URL to show the user: https://www.ikeytz.com… page, or tel:+49…, mailto:…, https://wa.me/…. Prefer this over constructing URLs.'}, 'cylinderOnly': {'type': 'object', 'description': 'Cylinder-only prices'}, 'cylinderAfterOpening': {'type': 'object', 'description': 'Cylinder price after an opening'}}, '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 calls /api/*. Attribution must be kept when quoting. Policy: ai-input yes with attribution; ai-train=no.', 'additionalProperties': True}
get_ratgeber
Get Ratgeber
WHAT: Pointer to one Ratgeber. REQUIRED slug from list_ratgeber. Unknown → unknown_ratgeber. NEXT: get_ai_page({path:'/ratgeber/'+slug}).
Solo lectura
Esquema de entrada
{'type': 'object', 'required': ['slug'], 'properties': {'slug': {'type': 'string', 'description': 'Required. Exact Ratgeber slug from list_ratgeber.slugs (ASCII hyphenated).'}, 'locale': {'enum': ['de', 'en', 'fr', 'ru', 'fa', 'ar', 'tr'], 'type': 'string', 'default': 'de', 'description': 'HTML locale for canonicalUrl and path prefixes. de = default, URLs have no prefix (https://www.ikeytz.com/preise). en|fr|ru|fa|ar|tr = prefix /{locale}/ (https://www.ikeytz.com/en/preise). Omit or empty = de. Does not change prices, phone numbers, or legal German names. Not a maps.ikeytz.com locale (maps is German-only).'}}}
Esquema de salida
{'type': 'object', 'required': ['ok', 'tool', 'attribution'], 'properties': {'ok': {'type': 'boolean', 'description': 'true = use summary, canonicalUrl, and extra keys. false = do not invent data; read error + hint and retry with valid args or open hint.'}, 'hint': {'type': 'string', 'description': 'Present when ok=false. Absolute URL the agent should open or pass to get_ai_page / get_discovery.'}, 'slug': {'type': 'string', 'description': 'Resolved Ratgeber slug'}, 'tool': {'type': 'string', 'description': 'Echo of the tool name that produced this object (e.g. get_service_area).'}, 'error': {'type': 'string', 'description': 'Present when ok=false. Codes include: unknown_tool, unknown_place, unknown_auswahl, unknown_ratgeber, unknown_doc, unknown_discovery, faq_not_found, wissen_not_found, serp_not_found, q_required, bad_datetime, bad_when_key, plus HTTP errors from fetch.'}, 'locale': {'enum': ['de', 'en', 'fr', 'ru', 'fa', 'ar', 'tr'], 'type': 'string', 'description': 'Locale actually used for URLs (args.locale or de).'}, 'related': {'type': 'array', 'items': {'type': 'string', 'format': 'uri'}, 'description': 'Always includes https://www.ikeytz.com/llms.txt. Geo tools also include https://maps.ikeytz.com/llms.txt.'}, 'summary': {'type': 'string', 'description': 'Primary text for the model. For discovery tools this is the file window (possibly thousands of characters). For list tools a compact one-liner. Quote with attribution.'}, 'attribution': {'type': 'string', 'description': "Required citation: 'Quelle: Schlüsseldienst Ludwigsburg ikeytz (ikeytz.com) · ai-train=no · https://www.ikeytz.com/.well-known/ai.txt'"}, 'canonicalUrl': {'type': 'string', 'description': 'Best URL to show the user: https://www.ikeytz.com… page, or tel:+49…, mailto:…, https://wa.me/…. Prefer this over constructing URLs.'}}, '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 calls /api/*. Attribution must be kept when quoting. Policy: ai-input yes with attribution; ai-train=no.', 'additionalProperties': True}
get_review_url
Get Review Url
WHAT: Short /review redirect to the Google review URL. RETURNS googleReviewUrl (full Google) and canonicalUrl = https://www.ikeytz.com/review. USE when the user wants to leave a review. Not a list of existing ratings.
Solo lectura
Esquema de entrada
{'type': 'object', 'properties': {'locale': {'enum': ['de', 'en', 'fr', 'ru', 'fa', 'ar', 'tr'], 'type': 'string', 'default': 'de', 'description': 'HTML locale for canonicalUrl and path prefixes. de = default, URLs have no prefix (https://www.ikeytz.com/preise). en|fr|ru|fa|ar|tr = prefix /{locale}/ (https://www.ikeytz.com/en/preise). Omit or empty = de. Does not change prices, phone numbers, or legal German names. Not a maps.ikeytz.com locale (maps is German-only).'}}}
Esquema de salida
{'type': 'object', 'required': ['ok', 'tool', 'attribution'], 'properties': {'ok': {'type': 'boolean', 'description': 'true = use summary, canonicalUrl, and extra keys. false = do not invent data; read error + hint and retry with valid args or open hint.'}, 'hint': {'type': 'string', 'description': 'Present when ok=false. Absolute URL the agent should open or pass to get_ai_page / get_discovery.'}, 'tool': {'type': 'string', 'description': 'Echo of the tool name that produced this object (e.g. get_service_area).'}, 'error': {'type': 'string', 'description': 'Present when ok=false. Codes include: unknown_tool, unknown_place, unknown_auswahl, unknown_ratgeber, unknown_doc, unknown_discovery, faq_not_found, wissen_not_found, serp_not_found, q_required, bad_datetime, bad_when_key, plus HTTP errors from fetch.'}, 'locale': {'enum': ['de', 'en', 'fr', 'ru', 'fa', 'ar', 'tr'], 'type': 'string', 'description': 'Locale actually used for URLs (args.locale or de).'}, 'related': {'type': 'array', 'items': {'type': 'string', 'format': 'uri'}, 'description': 'Always includes https://www.ikeytz.com/llms.txt. Geo tools also include https://maps.ikeytz.com/llms.txt.'}, 'summary': {'type': 'string', 'description': 'Primary text for the model. For discovery tools this is the file window (possibly thousands of characters). For list tools a compact one-liner. Quote with attribution.'}, 'attribution': {'type': 'string', 'description': "Required citation: 'Quelle: Schlüsseldienst Ludwigsburg ikeytz (ikeytz.com) · ai-train=no · https://www.ikeytz.com/.well-known/ai.txt'"}, 'canonicalUrl': {'type': 'string', 'description': 'Best URL to show the user: https://www.ikeytz.com… page, or tel:+49…, mailto:…, https://wa.me/…. Prefer this over constructing URLs.'}, 'googleReviewUrl': {'type': 'string', 'description': 'Full Google review URL'}}, '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 calls /api/*. Attribution must be kept when quoting. Policy: ai-input yes with attribution; ai-train=no.', 'additionalProperties': True}
get_serp_snippet
Get Serp Snippet
WHAT: Slice of /llms-serp.txt around the first occurrence of the target URL (title/description/URL rows). path or url required in practice. If path is not http(s), it is turned into www(locale, path). No match → serp_not_found. RETURNS matchContext (~200 chars before + 400 after). Not a Google API.
Solo lectura
Esquema de entrada
{'type': 'object', 'properties': {'url': {'type': 'string', 'format': 'uri', 'description': 'If this starts with http, it is used as the search needle instead of path.'}, 'path': {'type': 'string', 'description': 'Site path (/preise) or used with locale to build the www URL to find in llms-serp.txt.'}, 'locale': {'enum': ['de', 'en', 'fr', 'ru', 'fa', 'ar', 'tr'], 'type': 'string', 'default': 'de', 'description': 'HTML locale for canonicalUrl and path prefixes. de = default, URLs have no prefix (https://www.ikeytz.com/preise). en|fr|ru|fa|ar|tr = prefix /{locale}/ (https://www.ikeytz.com/en/preise). Omit or empty = de. Does not change prices, phone numbers, or legal German names. Not a maps.ikeytz.com locale (maps is German-only).'}}}
Esquema de salida
{'type': 'object', 'required': ['ok', 'tool', 'attribution'], 'properties': {'ok': {'type': 'boolean', 'description': 'true = use summary, canonicalUrl, and extra keys. false = do not invent data; read error + hint and retry with valid args or open hint.'}, 'hint': {'type': 'string', 'description': 'Present when ok=false. Absolute URL the agent should open or pass to get_ai_page / get_discovery.'}, 'tool': {'type': 'string', 'description': 'Echo of the tool name that produced this object (e.g. get_service_area).'}, 'error': {'type': 'string', 'description': 'Present when ok=false. Codes include: unknown_tool, unknown_place, unknown_auswahl, unknown_ratgeber, unknown_doc, unknown_discovery, faq_not_found, wissen_not_found, serp_not_found, q_required, bad_datetime, bad_when_key, plus HTTP errors from fetch.'}, 'locale': {'enum': ['de', 'en', 'fr', 'ru', 'fa', 'ar', 'tr'], 'type': 'string', 'description': 'Locale actually used for URLs (args.locale or de).'}, 'related': {'type': 'array', 'items': {'type': 'string', 'format': 'uri'}, 'description': 'Always includes https://www.ikeytz.com/llms.txt. Geo tools also include https://maps.ikeytz.com/llms.txt.'}, 'summary': {'type': 'string', 'description': 'Primary text for the model. For discovery tools this is the file window (possibly thousands of characters). For list tools a compact one-liner. Quote with attribution.'}, 'attribution': {'type': 'string', 'description': "Required citation: 'Quelle: Schlüsseldienst Ludwigsburg ikeytz (ikeytz.com) · ai-train=no · https://www.ikeytz.com/.well-known/ai.txt'"}, 'canonicalUrl': {'type': 'string', 'description': 'Best URL to show the user: https://www.ikeytz.com… page, or tel:+49…, mailto:…, https://wa.me/…. Prefer this over constructing URLs.'}, 'matchContext': {'type': 'string', 'description': 'Surrounding SERP lines'}}, '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 calls /api/*. Attribution must be kept when quoting. Policy: ai-input yes with attribution; ai-train=no.', 'additionalProperties': True}
get_service_area
Get Service Area
WHAT: One service-area place. Lookup order: slug (exact getOrt), else first ORTE with plz === args.plz, else first name substring (lowercase). No silent Pattonville fallback — unknown → ok=false error=unknown_place hint=/einsatzgebiet. RETURNS that place's own lat/lng (52 unique pairs), google_maps, icbm, embed_map, geo_api, maps_mcp, kind, parent. USE when the user names a town or PLZ. NOT verify_zip_code / verify_coordinates (those names do not exist). maps MCP is a second machine. NEXT: get_ai_page path=/schluesseldienst-ludwigsburg-{slug}.
Solo lectura
Esquema de entrada
{'type': 'object', 'properties': {'plz': {'type': 'string', 'description': '5-digit German PLZ. First matching place wins (71638 → pattonville). Use slug if you already know it.'}, 'name': {'type': 'string', 'description': "German name substring, case-insensitive (e.g. 'Vaihingen'). First includes() match. Prefer slug."}, 'slug': {'type': 'string', 'description': "Preferred. Exact orte slug: pattonville, asperg, bietigheim-bissingen, kornwestheim, … (52). Not 'ludwigsburg' as a catch-all unless that slug exists."}, 'locale': {'enum': ['de', 'en', 'fr', 'ru', 'fa', 'ar', 'tr'], 'type': 'string', 'default': 'de', 'description': 'HTML locale for canonicalUrl and path prefixes. de = default, URLs have no prefix (https://www.ikeytz.com/preise). en|fr|ru|fa|ar|tr = prefix /{locale}/ (https://www.ikeytz.com/en/preise). Omit or empty = de. Does not change prices, phone numbers, or legal German names. Not a maps.ikeytz.com locale (maps is German-only).'}}}
Esquema de salida
{'type': 'object', 'required': ['ok', 'tool', 'attribution'], 'properties': {'ok': {'type': 'boolean', 'description': 'true = use summary, canonicalUrl, and extra keys. false = do not invent data; read error + hint and retry with valid args or open hint.'}, 'lat': {'type': 'number', 'description': 'WGS84 latitude of THIS place or the office. Unique per slug — never a silent Pattonville fallback. Example Pattonville ≈ 48.863.'}, 'lng': {'type': 'number', 'description': 'WGS84 longitude of THIS place or the office. Example Pattonville ≈ 9.185.'}, 'plz': {'type': 'string', 'description': 'German postcode. First match wins if several places share a PLZ (e.g. 71638 → pattonville).'}, 'url': {'type': 'string', 'format': 'uri', 'description': 'www keyword page https://www.ikeytz.com[/locale]/schluesseldienst-ludwigsburg-{slug}'}, 'hint': {'type': 'string', 'description': 'Present when ok=false. Absolute URL the agent should open or pass to get_ai_page / get_discovery.'}, 'icbm': {'type': 'string', 'description': "ICBM 'lat, lng' string (same as google_maps)."}, 'kind': {'type': 'string', 'description': 'Place kind from orte SSOT (stadtteil / gemeinde / …).'}, 'name': {'type': 'string', 'description': 'German place name as on the website.'}, 'slug': {'type': 'string', 'description': 'URL slug of a service-area place, e.g. pattonville, bietigheim-bissingen, walheim. Matches maps.ikeytz.com/{slug} and www /schluesseldienst-ludwigsburg-{slug}.'}, 'tool': {'type': 'string', 'description': 'Echo of the tool name that produced this object (e.g. get_service_area).'}, 'error': {'type': 'string', 'description': 'Present when ok=false. Codes include: unknown_tool, unknown_place, unknown_auswahl, unknown_ratgeber, unknown_doc, unknown_discovery, faq_not_found, wissen_not_found, serp_not_found, q_required, bad_datetime, bad_when_key, plus HTTP errors from fetch.'}, 'locale': {'enum': ['de', 'en', 'fr', 'ru', 'fa', 'ar', 'tr'], 'type': 'string', 'description': 'Locale actually used for URLs (args.locale or de).'}, 'parent': {'type': 'string', 'description': 'Parent place name when this is a district; else empty/omit.'}, 'geo_api': {'type': 'string', 'format': 'uri', 'description': 'https://maps.ikeytz.com/api/v1/embed/ort/{slug} JSON for the embed.'}, 'related': {'type': 'array', 'items': {'type': 'string', 'format': 'uri'}, 'description': 'Always includes https://www.ikeytz.com/llms.txt. Geo tools also include https://maps.ikeytz.com/llms.txt.'}, 'summary': {'type': 'string', 'description': 'Primary text for the model. For discovery tools this is the file window (possibly thousands of characters). For list tools a compact one-liner. Quote with attribution.'}, 'maps_mcp': {'type': 'string', 'const': 'https://maps.ikeytz.com/mcp', 'format': 'uri', 'description': 'maps machine MCP endpoint. www /mcp does not proxy this.'}, 'embed_map': {'type': 'string', 'format': 'uri', 'description': 'iframe/src and maps page: https://maps.ikeytz.com/{slug} (German host, no /en/).'}, 'attribution': {'type': 'string', 'description': "Required citation: 'Quelle: Schlüsseldienst Ludwigsburg ikeytz (ikeytz.com) · ai-train=no · https://www.ikeytz.com/.well-known/ai.txt'"}, 'google_maps': {'type': 'string', 'description': "Paste-ready 'lat, lng' for Google Maps search (same digits as lat/lng)."}, 'canonicalUrl': {'type': 'string', 'description': 'Best URL to show the user: https://www.ikeytz.com… page, or tel:+49…, mailto:…, https://wa.me/…. Prefer this over constructing URLs.'}}, '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 calls /api/*. Attribution must be kept when quoting. Policy: ai-input yes with attribution; ai-train=no.', 'additionalProperties': True}
get_sitemap_txt
Get Sitemap Txt
WHAT: Fetch /sitemap.txt (same URL set as sitemap.xml). ~9076 http-URLs (Stand 2026-09-22): marketing ×7 + discovery/media. Contains 0× maps.ikeytz.com (intentional). summary = line window + trailing # MCP-META (totalUrls, nextOffset, truncated). Use offset/limit + nextOffset to page; omit limit for the full list. Dedicated maps list is on maps.ikeytz.com, not here.
Solo lectura
Esquema de entrada
{'type': 'object', 'properties': {'limit': {'type': 'number', 'maximum': 10000, 'minimum': 1, 'description': 'Maximum number of lines to return after offset. Omit or null = return every remaining line in the loaded file. Clamped to 1..10000. For sitemap.txt (~9076 http-URLs, Stand 2026-09-22) omit limit to get the full list (or page with offset/limit + nextOffset). For llms-keywords.txt prefer a window; the file is huge. Meta also as trailing # MCP-META lines in summary.'}, 'offset': {'type': 'number', 'default': 0, 'minimum': 0, 'description': '0-based line index into the fetched UTF-8 file (split on \\n). 0 = first line. Omit = 0. Combined with limit = a sliding window. Use nextOffset from the previous result to page. Does not count bytes; one line can be a long URL.'}}}
Esquema de salida
{'type': 'object', 'required': ['ok', 'tool', 'attribution'], 'properties': {'ok': {'type': 'boolean', 'description': 'true = use summary, canonicalUrl, and extra keys. false = do not invent data; read error + hint and retry with valid args or open hint.'}, 'hint': {'type': 'string', 'description': 'Present when ok=false. Absolute URL the agent should open or pass to get_ai_page / get_discovery.'}, 'path': {'type': 'string', 'description': 'Public path on www, e.g. /llms.txt or /.well-known/ai.txt'}, 'tool': {'type': 'string', 'description': 'Echo of the tool name that produced this object (e.g. get_service_area).'}, 'error': {'type': 'string', 'description': 'Present when ok=false. Codes include: unknown_tool, unknown_place, unknown_auswahl, unknown_ratgeber, unknown_doc, unknown_discovery, faq_not_found, wissen_not_found, serp_not_found, q_required, bad_datetime, bad_when_key, plus HTTP errors from fetch.'}, 'limit': {'type': ['number', 'null'], 'description': 'Applied line limit, or null if the caller omitted limit.'}, 'which': {'type': 'string', 'description': 'Resolved discovery id after alias fold (llms, sitemap-txt, ard, ai-catalog, …).'}, 'locale': {'enum': ['de', 'en', 'fr', 'ru', 'fa', 'ar', 'tr'], 'type': 'string', 'description': 'Locale actually used for URLs (args.locale or de).'}, 'offset': {'type': 'number', 'description': 'Applied 0-based line offset.'}, 'related': {'type': 'array', 'items': {'type': 'string', 'format': 'uri'}, 'description': 'Always includes https://www.ikeytz.com/llms.txt. Geo tools also include https://maps.ikeytz.com/llms.txt.'}, 'summary': {'type': 'string', 'description': 'Primary text for the model. For discovery tools this is the file window (possibly thousands of characters). For list tools a compact one-liner. Quote with attribution.'}, 'totalUrls': {'type': 'number', 'description': 'http(s) lines in the loaded file (full count when public/ read succeeds).'}, 'truncated': {'type': 'boolean', 'description': 'true if load hit a byte cap OR offset+limit left more lines. Also mirrored in trailing # MCP-META lines in summary.'}, 'nextOffset': {'type': ['number', 'null'], 'description': 'offset + returnedLines when more lines remain in the loaded file; else null. Pass as the next offset. Also in # MCP-META.'}, 'totalBytes': {'type': 'number', 'description': 'Full origin file size when Content-Length is present (e.g. llms-keywords ~50MB); else character length of the downloaded body before the load cap. Also in # MCP-META.'}, 'totalChars': {'type': 'number', 'description': 'Character length of the downloaded body before applying discoveryFetchMax (may equal totalBytes for ASCII).'}, 'totalLines': {'type': 'number', 'description': 'Line count of the loaded file (full public/ file when available).'}, 'attribution': {'type': 'string', 'description': "Required citation: 'Quelle: Schlüsseldienst Ludwigsburg ikeytz (ikeytz.com) · ai-train=no · https://www.ikeytz.com/.well-known/ai.txt'"}, 'canonicalUrl': {'type': 'string', 'description': 'Best URL to show the user: https://www.ikeytz.com… page, or tel:+49…, mailto:…, https://wa.me/…. Prefer this over constructing URLs.'}, 'returnedUrls': {'type': 'number', 'description': 'Lines in this window that start with http(s)://'}, 'bytesReturned': {'type': 'number', 'description': 'UTF-8 byte length of the returned body window (before # MCP-META).'}, 'returnedLines': {'type': 'number', 'description': 'How many lines are in summary/body this call (before # MCP-META).'}, 'fetchTruncated': {'type': 'boolean', 'description': 'true if discoveryFetchMax cut the load (line-boundary safe). Large discovery files (sitemap-xml ~12MB, llms-keywords ~55MB, llms-index ~2MB) must load full so offset/limit can reach EOF.'}}, '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 calls /api/*. Attribution must be kept when quoting. Policy: ai-input yes with attribution; ai-train=no.', 'additionalProperties': True}
get_wissen_entry
Get Wissen Entry
WHAT: One Wissen article. REQUIRED id. summary includes title + first 500 chars of body. structuredContent has id+title (not full body). Unknown id → wissen_not_found. NEXT: get_ai_page({path:'/wissen'}) or canonicalUrl #id.
Solo lectura
Esquema de entrada
{'type': 'object', 'required': ['id'], 'properties': {'id': {'type': 'string', 'description': 'Required. Exact Wissen article id from list_wissen.items[].id.'}, 'locale': {'enum': ['de', 'en', 'fr', 'ru', 'fa', 'ar', 'tr'], 'type': 'string', 'default': 'de', 'description': 'HTML locale for canonicalUrl and path prefixes. de = default, URLs have no prefix (https://www.ikeytz.com/preise). en|fr|ru|fa|ar|tr = prefix /{locale}/ (https://www.ikeytz.com/en/preise). Omit or empty = de. Does not change prices, phone numbers, or legal German names. Not a maps.ikeytz.com locale (maps is German-only).'}}}
Esquema de salida
{'type': 'object', 'required': ['ok', 'tool', 'attribution'], 'properties': {'id': {'type': 'string', 'description': 'Article id'}, 'ok': {'type': 'boolean', 'description': 'true = use summary, canonicalUrl, and extra keys. false = do not invent data; read error + hint and retry with valid args or open hint.'}, 'hint': {'type': 'string', 'description': 'Present when ok=false. Absolute URL the agent should open or pass to get_ai_page / get_discovery.'}, 'tool': {'type': 'string', 'description': 'Echo of the tool name that produced this object (e.g. get_service_area).'}, 'error': {'type': 'string', 'description': 'Present when ok=false. Codes include: unknown_tool, unknown_place, unknown_auswahl, unknown_ratgeber, unknown_doc, unknown_discovery, faq_not_found, wissen_not_found, serp_not_found, q_required, bad_datetime, bad_when_key, plus HTTP errors from fetch.'}, 'title': {'type': 'string', 'description': 'Article title'}, 'locale': {'enum': ['de', 'en', 'fr', 'ru', 'fa', 'ar', 'tr'], 'type': 'string', 'description': 'Locale actually used for URLs (args.locale or de).'}, 'related': {'type': 'array', 'items': {'type': 'string', 'format': 'uri'}, 'description': 'Always includes https://www.ikeytz.com/llms.txt. Geo tools also include https://maps.ikeytz.com/llms.txt.'}, 'summary': {'type': 'string', 'description': 'Primary text for the model. For discovery tools this is the file window (possibly thousands of characters). For list tools a compact one-liner. Quote with attribution.'}, 'attribution': {'type': 'string', 'description': "Required citation: 'Quelle: Schlüsseldienst Ludwigsburg ikeytz (ikeytz.com) · ai-train=no · https://www.ikeytz.com/.well-known/ai.txt'"}, 'canonicalUrl': {'type': 'string', 'description': 'Best URL to show the user: https://www.ikeytz.com… page, or tel:+49…, mailto:…, https://wa.me/…. Prefer this over constructing URLs.'}}, '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 calls /api/*. Attribution must be kept when quoting. Policy: ai-input yes with attribution; ai-train=no.', 'additionalProperties': True}
list_auswahl
List Auswahl
WHAT: Auswahl hub groups (situation chooser on /auswahl). RETURNS groups[] {id, hash, hubUrl, slugs[], urls[]}. USE to discover valid slugs for get_auswahl_item. Unknown slug → get_auswahl_item ok=false unknown_auswahl.
Solo lectura
Esquema de entrada
{'type': 'object', 'properties': {'locale': {'enum': ['de', 'en', 'fr', 'ru', 'fa', 'ar', 'tr'], 'type': 'string', 'default': 'de', 'description': 'HTML locale for canonicalUrl and path prefixes. de = default, URLs have no prefix (https://www.ikeytz.com/preise). en|fr|ru|fa|ar|tr = prefix /{locale}/ (https://www.ikeytz.com/en/preise). Omit or empty = de. Does not change prices, phone numbers, or legal German names. Not a maps.ikeytz.com locale (maps is German-only).'}}}
Esquema de salida
{'type': 'object', 'required': ['ok', 'tool', 'attribution'], 'properties': {'ok': {'type': 'boolean', 'description': 'true = use summary, canonicalUrl, and extra keys. false = do not invent data; read error + hint and retry with valid args or open hint.'}, 'hint': {'type': 'string', 'description': 'Present when ok=false. Absolute URL the agent should open or pass to get_ai_page / get_discovery.'}, 'tool': {'type': 'string', 'description': 'Echo of the tool name that produced this object (e.g. get_service_area).'}, 'error': {'type': 'string', 'description': 'Present when ok=false. Codes include: unknown_tool, unknown_place, unknown_auswahl, unknown_ratgeber, unknown_doc, unknown_discovery, faq_not_found, wissen_not_found, serp_not_found, q_required, bad_datetime, bad_when_key, plus HTTP errors from fetch.'}, 'groups': {'type': 'array', 'description': 'Auswahl groups with slugs and URLs'}, 'locale': {'enum': ['de', 'en', 'fr', 'ru', 'fa', 'ar', 'tr'], 'type': 'string', 'description': 'Locale actually used for URLs (args.locale or de).'}, 'related': {'type': 'array', 'items': {'type': 'string', 'format': 'uri'}, 'description': 'Always includes https://www.ikeytz.com/llms.txt. Geo tools also include https://maps.ikeytz.com/llms.txt.'}, 'summary': {'type': 'string', 'description': 'Primary text for the model. For discovery tools this is the file window (possibly thousands of characters). For list tools a compact one-liner. Quote with attribution.'}, 'attribution': {'type': 'string', 'description': "Required citation: 'Quelle: Schlüsseldienst Ludwigsburg ikeytz (ikeytz.com) · ai-train=no · https://www.ikeytz.com/.well-known/ai.txt'"}, 'canonicalUrl': {'type': 'string', 'description': 'Best URL to show the user: https://www.ikeytz.com… page, or tel:+49…, mailto:…, https://wa.me/…. Prefer this over constructing URLs.'}}, '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 calls /api/*. Attribution must be kept when quoting. Policy: ai-input yes with attribution; ai-train=no.', 'additionalProperties': True}
list_faq
List Faq
WHAT: FAQ question list (id + question, no answers). Policy/text only — euro in answers are SSOT tokens, not a live invoice. For a customer total: get_prices.composition → get_ort_datetime → get_invoice_line_items. USE get_faq({id}) or get_faq({q}).
Solo lectura
Esquema de entrada
{'type': 'object', 'properties': {'locale': {'enum': ['de', 'en', 'fr', 'ru', 'fa', 'ar', 'tr'], 'type': 'string', 'default': 'de', 'description': 'HTML locale for canonicalUrl and path prefixes. de = default, URLs have no prefix (https://www.ikeytz.com/preise). en|fr|ru|fa|ar|tr = prefix /{locale}/ (https://www.ikeytz.com/en/preise). Omit or empty = de. Does not change prices, phone numbers, or legal German names. Not a maps.ikeytz.com locale (maps is German-only).'}}}
Esquema de salida
{'type': 'object', 'required': ['ok', 'tool', 'attribution'], 'properties': {'ok': {'type': 'boolean', 'description': 'true = use summary, canonicalUrl, and extra keys. false = do not invent data; read error + hint and retry with valid args or open hint.'}, 'hint': {'type': 'string', 'description': 'Present when ok=false. Absolute URL the agent should open or pass to get_ai_page / get_discovery.'}, 'tool': {'type': 'string', 'description': 'Echo of the tool name that produced this object (e.g. get_service_area).'}, 'error': {'type': 'string', 'description': 'Present when ok=false. Codes include: unknown_tool, unknown_place, unknown_auswahl, unknown_ratgeber, unknown_doc, unknown_discovery, faq_not_found, wissen_not_found, serp_not_found, q_required, bad_datetime, bad_when_key, plus HTTP errors from fetch.'}, 'items': {'type': 'array', 'items': {'type': 'object', 'properties': {'id': {'type': 'string'}, 'question': {'type': 'string'}}}, 'description': 'FAQ ids and questions'}, 'locale': {'enum': ['de', 'en', 'fr', 'ru', 'fa', 'ar', 'tr'], 'type': 'string', 'description': 'Locale actually used for URLs (args.locale or de).'}, 'related': {'type': 'array', 'items': {'type': 'string', 'format': 'uri'}, 'description': 'Always includes https://www.ikeytz.com/llms.txt. Geo tools also include https://maps.ikeytz.com/llms.txt.'}, 'summary': {'type': 'string', 'description': 'Primary text for the model. For discovery tools this is the file window (possibly thousands of characters). For list tools a compact one-liner. Quote with attribution.'}, 'attribution': {'type': 'string', 'description': "Required citation: 'Quelle: Schlüsseldienst Ludwigsburg ikeytz (ikeytz.com) · ai-train=no · https://www.ikeytz.com/.well-known/ai.txt'"}, 'canonicalUrl': {'type': 'string', 'description': 'Best URL to show the user: https://www.ikeytz.com… page, or tel:+49…, mailto:…, https://wa.me/…. Prefer this over constructing URLs.'}}, '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 calls /api/*. Attribution must be kept when quoting. Policy: ai-input yes with attribution; ai-train=no.', 'additionalProperties': True}
list_footer
List Footer
WHAT: Curated internal footer paths including legal + /it + /mcp-hub + /angebot + /ankuendigungen. RETURNS items[] {path,url}. Not a pixel-perfect HTML scrape; external directory URLs live on get_links / MCP_PUBLIC_LINKS via get_mcp_hub. USE to discover legal slugs before get_legal. NEXT: get_legal(doc), get_it, get_mcp_hub.
Solo lectura
Esquema de entrada
{'type': 'object', 'properties': {'locale': {'enum': ['de', 'en', 'fr', 'ru', 'fa', 'ar', 'tr'], 'type': 'string', 'default': 'de', 'description': 'HTML locale for canonicalUrl and path prefixes. de = default, URLs have no prefix (https://www.ikeytz.com/preise). en|fr|ru|fa|ar|tr = prefix /{locale}/ (https://www.ikeytz.com/en/preise). Omit or empty = de. Does not change prices, phone numbers, or legal German names. Not a maps.ikeytz.com locale (maps is German-only).'}}}
Esquema de salida
{'type': 'object', 'required': ['ok', 'tool', 'attribution'], 'properties': {'ok': {'type': 'boolean', 'description': 'true = use summary, canonicalUrl, and extra keys. false = do not invent data; read error + hint and retry with valid args or open hint.'}, 'hint': {'type': 'string', 'description': 'Present when ok=false. Absolute URL the agent should open or pass to get_ai_page / get_discovery.'}, 'tool': {'type': 'string', 'description': 'Echo of the tool name that produced this object (e.g. get_service_area).'}, 'error': {'type': 'string', 'description': 'Present when ok=false. Codes include: unknown_tool, unknown_place, unknown_auswahl, unknown_ratgeber, unknown_doc, unknown_discovery, faq_not_found, wissen_not_found, serp_not_found, q_required, bad_datetime, bad_when_key, plus HTTP errors from fetch.'}, 'items': {'type': 'array', 'items': {'type': 'object', 'properties': {'url': {'type': 'string', 'format': 'uri', 'description': 'Absolute https://www.ikeytz.com{prefix}{path} for the requested locale.'}, 'path': {'type': 'string', 'description': 'ASCII site path beginning with /, no host, no locale prefix for de.'}, 'label': {'type': 'string', 'description': 'Short human label (German hub name) when the tool provides one.'}}, 'description': 'One internal www.ikeytz.com link.', 'additionalProperties': True}, 'description': 'Internal footer paths'}, 'locale': {'enum': ['de', 'en', 'fr', 'ru', 'fa', 'ar', 'tr'], 'type': 'string', 'description': 'Locale actually used for URLs (args.locale or de).'}, 'related': {'type': 'array', 'items': {'type': 'string', 'format': 'uri'}, 'description': 'Always includes https://www.ikeytz.com/llms.txt. Geo tools also include https://maps.ikeytz.com/llms.txt.'}, 'summary': {'type': 'string', 'description': 'Primary text for the model. For discovery tools this is the file window (possibly thousands of characters). For list tools a compact one-liner. Quote with attribution.'}, 'attribution': {'type': 'string', 'description': "Required citation: 'Quelle: Schlüsseldienst Ludwigsburg ikeytz (ikeytz.com) · ai-train=no · https://www.ikeytz.com/.well-known/ai.txt'"}, 'canonicalUrl': {'type': 'string', 'description': 'Best URL to show the user: https://www.ikeytz.com… page, or tel:+49…, mailto:…, https://wa.me/…. Prefer this over constructing URLs.'}}, '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 calls /api/*. Attribution must be kept when quoting. Policy: ai-input yes with attribution; ai-train=no.', 'additionalProperties': True}
list_locales
List Locales
WHAT: The seven public HTML locales. RETURNS locales[] {id, name, prefix}. prefix is '' for de and '/en' '/fr' '/ru' '/fa' '/ar' '/tr' for others. Host is always www.ikeytz.com (apex redirects). maps.ikeytz.com has NO locales (/en/pattonville = 404). USE before resolve_locale_url. Call with {}.
Solo lectura
Esquema de entrada
{'type': 'object', 'properties': {}, 'description': 'This tool takes no arguments. Call tools/call with arguments: {}. Extra keys are ignored. Result is always the same public href (tel/mailto) or locale list.', 'additionalProperties': False}
Esquema de salida
{'type': 'object', 'required': ['ok', 'tool', 'attribution'], 'properties': {'ok': {'type': 'boolean', 'description': 'true = use summary, canonicalUrl, and extra keys. false = do not invent data; read error + hint and retry with valid args or open hint.'}, 'hint': {'type': 'string', 'description': 'Present when ok=false. Absolute URL the agent should open or pass to get_ai_page / get_discovery.'}, 'tool': {'type': 'string', 'description': 'Echo of the tool name that produced this object (e.g. get_service_area).'}, 'error': {'type': 'string', 'description': 'Present when ok=false. Codes include: unknown_tool, unknown_place, unknown_auswahl, unknown_ratgeber, unknown_doc, unknown_discovery, faq_not_found, wissen_not_found, serp_not_found, q_required, bad_datetime, bad_when_key, plus HTTP errors from fetch.'}, 'locale': {'enum': ['de', 'en', 'fr', 'ru', 'fa', 'ar', 'tr'], 'type': 'string', 'description': 'Locale actually used for URLs (args.locale or de).'}, 'locales': {'type': 'array', 'items': {'type': 'object', 'properties': {'id': {'type': 'string', 'description': 'Locale code'}, 'name': {'type': 'string', 'description': 'Native language name'}, 'prefix': {'type': 'string', 'description': 'URL prefix; empty for de'}}}, 'description': 'Seven locales with URL prefix'}, 'related': {'type': 'array', 'items': {'type': 'string', 'format': 'uri'}, 'description': 'Always includes https://www.ikeytz.com/llms.txt. Geo tools also include https://maps.ikeytz.com/llms.txt.'}, 'summary': {'type': 'string', 'description': 'Primary text for the model. For discovery tools this is the file window (possibly thousands of characters). For list tools a compact one-liner. Quote with attribution.'}, 'attribution': {'type': 'string', 'description': "Required citation: 'Quelle: Schlüsseldienst Ludwigsburg ikeytz (ikeytz.com) · ai-train=no · https://www.ikeytz.com/.well-known/ai.txt'"}, 'canonicalUrl': {'type': 'string', 'description': 'Best URL to show the user: https://www.ikeytz.com… page, or tel:+49…, mailto:…, https://wa.me/…. Prefer this over constructing URLs.'}}, '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 calls /api/*. Attribution must be kept when quoting. Policy: ai-input yes with attribution; ai-train=no.', 'additionalProperties': True}
list_nav
List Nav
WHAT: Curated main-header hubs (not a 1:1 dump of every <a> in the header). RETURNS items[]: Start, Notfall, Leistungen, Auswahl, Preise, Einsatzgebiet, Wissen, Ratgeber, FAQ, Kontakt — each path + locale URL + label. DOES NOT include /it, /mcp-hub, /links, locale switcher, or DevSecOps. USE to pick a hub URL. NEXT: get_ai_page(path) or get_page_summary(path) for body text.
Solo lectura
Esquema de entrada
{'type': 'object', 'properties': {'locale': {'enum': ['de', 'en', 'fr', 'ru', 'fa', 'ar', 'tr'], 'type': 'string', 'default': 'de', 'description': 'HTML locale for canonicalUrl and path prefixes. de = default, URLs have no prefix (https://www.ikeytz.com/preise). en|fr|ru|fa|ar|tr = prefix /{locale}/ (https://www.ikeytz.com/en/preise). Omit or empty = de. Does not change prices, phone numbers, or legal German names. Not a maps.ikeytz.com locale (maps is German-only).'}}}
Esquema de salida
{'type': 'object', 'required': ['ok', 'tool', 'attribution'], 'properties': {'ok': {'type': 'boolean', 'description': 'true = use summary, canonicalUrl, and extra keys. false = do not invent data; read error + hint and retry with valid args or open hint.'}, 'hint': {'type': 'string', 'description': 'Present when ok=false. Absolute URL the agent should open or pass to get_ai_page / get_discovery.'}, 'tool': {'type': 'string', 'description': 'Echo of the tool name that produced this object (e.g. get_service_area).'}, 'error': {'type': 'string', 'description': 'Present when ok=false. Codes include: unknown_tool, unknown_place, unknown_auswahl, unknown_ratgeber, unknown_doc, unknown_discovery, faq_not_found, wissen_not_found, serp_not_found, q_required, bad_datetime, bad_when_key, plus HTTP errors from fetch.'}, 'items': {'type': 'array', 'items': {'type': 'object', 'properties': {'url': {'type': 'string', 'format': 'uri', 'description': 'Absolute https://www.ikeytz.com{prefix}{path} for the requested locale.'}, 'path': {'type': 'string', 'description': 'ASCII site path beginning with /, no host, no locale prefix for de.'}, 'label': {'type': 'string', 'description': 'Short human label (German hub name) when the tool provides one.'}}, 'description': 'One internal www.ikeytz.com link.', 'additionalProperties': True}, 'description': 'Header hub links'}, 'locale': {'enum': ['de', 'en', 'fr', 'ru', 'fa', 'ar', 'tr'], 'type': 'string', 'description': 'Locale actually used for URLs (args.locale or de).'}, 'related': {'type': 'array', 'items': {'type': 'string', 'format': 'uri'}, 'description': 'Always includes https://www.ikeytz.com/llms.txt. Geo tools also include https://maps.ikeytz.com/llms.txt.'}, 'summary': {'type': 'string', 'description': 'Primary text for the model. For discovery tools this is the file window (possibly thousands of characters). For list tools a compact one-liner. Quote with attribution.'}, 'attribution': {'type': 'string', 'description': "Required citation: 'Quelle: Schlüsseldienst Ludwigsburg ikeytz (ikeytz.com) · ai-train=no · https://www.ikeytz.com/.well-known/ai.txt'"}, 'canonicalUrl': {'type': 'string', 'description': 'Best URL to show the user: https://www.ikeytz.com… page, or tel:+49…, mailto:…, https://wa.me/…. Prefer this over constructing URLs.'}}, '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 calls /api/*. Attribution must be kept when quoting. Policy: ai-input yes with attribution; ai-train=no.', 'additionalProperties': True}
list_ratgeber
List Ratgeber
WHAT: All Ratgeber slugs and locale URLs /ratgeber/{slug}. USE get_ratgeber({slug}) then get_ai_page for fulltext.
Solo lectura
Esquema de entrada
{'type': 'object', 'properties': {'locale': {'enum': ['de', 'en', 'fr', 'ru', 'fa', 'ar', 'tr'], 'type': 'string', 'default': 'de', 'description': 'HTML locale for canonicalUrl and path prefixes. de = default, URLs have no prefix (https://www.ikeytz.com/preise). en|fr|ru|fa|ar|tr = prefix /{locale}/ (https://www.ikeytz.com/en/preise). Omit or empty = de. Does not change prices, phone numbers, or legal German names. Not a maps.ikeytz.com locale (maps is German-only).'}}}
Esquema de salida
{'type': 'object', 'required': ['ok', 'tool', 'attribution'], 'properties': {'ok': {'type': 'boolean', 'description': 'true = use summary, canonicalUrl, and extra keys. false = do not invent data; read error + hint and retry with valid args or open hint.'}, 'hint': {'type': 'string', 'description': 'Present when ok=false. Absolute URL the agent should open or pass to get_ai_page / get_discovery.'}, 'tool': {'type': 'string', 'description': 'Echo of the tool name that produced this object (e.g. get_service_area).'}, 'urls': {'type': 'array', 'items': {'type': 'string'}, 'description': 'Locale Ratgeber URLs'}, 'error': {'type': 'string', 'description': 'Present when ok=false. Codes include: unknown_tool, unknown_place, unknown_auswahl, unknown_ratgeber, unknown_doc, unknown_discovery, faq_not_found, wissen_not_found, serp_not_found, q_required, bad_datetime, bad_when_key, plus HTTP errors from fetch.'}, 'slugs': {'type': 'array', 'items': {'type': 'string'}, 'description': 'Ratgeber slugs'}, 'locale': {'enum': ['de', 'en', 'fr', 'ru', 'fa', 'ar', 'tr'], 'type': 'string', 'description': 'Locale actually used for URLs (args.locale or de).'}, 'related': {'type': 'array', 'items': {'type': 'string', 'format': 'uri'}, 'description': 'Always includes https://www.ikeytz.com/llms.txt. Geo tools also include https://maps.ikeytz.com/llms.txt.'}, 'summary': {'type': 'string', 'description': 'Primary text for the model. For discovery tools this is the file window (possibly thousands of characters). For list tools a compact one-liner. Quote with attribution.'}, 'attribution': {'type': 'string', 'description': "Required citation: 'Quelle: Schlüsseldienst Ludwigsburg ikeytz (ikeytz.com) · ai-train=no · https://www.ikeytz.com/.well-known/ai.txt'"}, 'canonicalUrl': {'type': 'string', 'description': 'Best URL to show the user: https://www.ikeytz.com… page, or tel:+49…, mailto:…, https://wa.me/…. Prefer this over constructing URLs.'}}, '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 calls /api/*. Attribution must be kept when quoting. Policy: ai-input yes with attribution; ai-train=no.', 'additionalProperties': True}
list_service_areas
List Service Areas
WHAT: All 52 service-area places (orte SSOT). Each item: slug, name, plz, lat, lng, google_maps, icbm, kind, parent, url (www keyword page), embed_map (https://maps.ikeytz.com/{slug}), geo_api, maps_mcp. related includes maps llms.txt. count=52. USE to pick a slug before get_service_area. DOES NOT verify GPS live. www sitemap contains 0× maps.ikeytz.com. iframe on HTML is DE Ortsseiten only. NEXT: get_service_area({slug}) or maps MCP find_by_geo (not this server).
Solo lectura
Esquema de entrada
{'type': 'object', 'properties': {'locale': {'enum': ['de', 'en', 'fr', 'ru', 'fa', 'ar', 'tr'], 'type': 'string', 'default': 'de', 'description': 'HTML locale for canonicalUrl and path prefixes. de = default, URLs have no prefix (https://www.ikeytz.com/preise). en|fr|ru|fa|ar|tr = prefix /{locale}/ (https://www.ikeytz.com/en/preise). Omit or empty = de. Does not change prices, phone numbers, or legal German names. Not a maps.ikeytz.com locale (maps is German-only).'}}}
Esquema de salida
{'type': 'object', 'required': ['ok', 'tool', 'attribution'], 'properties': {'ok': {'type': 'boolean', 'description': 'true = use summary, canonicalUrl, and extra keys. false = do not invent data; read error + hint and retry with valid args or open hint.'}, 'hint': {'type': 'string', 'description': 'Present when ok=false. Absolute URL the agent should open or pass to get_ai_page / get_discovery.'}, 'tool': {'type': 'string', 'description': 'Echo of the tool name that produced this object (e.g. get_service_area).'}, 'count': {'type': 'number', 'description': 'Always 52 when ok.'}, 'error': {'type': 'string', 'description': 'Present when ok=false. Codes include: unknown_tool, unknown_place, unknown_auswahl, unknown_ratgeber, unknown_doc, unknown_discovery, faq_not_found, wissen_not_found, serp_not_found, q_required, bad_datetime, bad_when_key, plus HTTP errors from fetch.'}, 'items': {'type': 'array', 'items': {'type': 'object', 'properties': {'lat': {'type': 'number', 'description': 'WGS84 latitude of THIS place or the office. Unique per slug — never a silent Pattonville fallback. Example Pattonville ≈ 48.863.'}, 'lng': {'type': 'number', 'description': 'WGS84 longitude of THIS place or the office. Example Pattonville ≈ 9.185.'}, 'plz': {'type': 'string', 'description': 'German postcode. First match wins if several places share a PLZ (e.g. 71638 → pattonville).'}, 'url': {'type': 'string', 'format': 'uri', 'description': 'www keyword page https://www.ikeytz.com[/locale]/schluesseldienst-ludwigsburg-{slug}'}, 'icbm': {'type': 'string', 'description': "ICBM 'lat, lng' string (same as google_maps)."}, 'kind': {'type': 'string', 'description': 'Place kind from orte SSOT (stadtteil / gemeinde / …).'}, 'name': {'type': 'string', 'description': 'German place name as on the website.'}, 'slug': {'type': 'string', 'description': 'URL slug of a service-area place, e.g. pattonville, bietigheim-bissingen, walheim. Matches maps.ikeytz.com/{slug} and www /schluesseldienst-ludwigsburg-{slug}.'}, 'parent': {'type': 'string', 'description': 'Parent place name when this is a district; else empty/omit.'}, 'geo_api': {'type': 'string', 'format': 'uri', 'description': 'https://maps.ikeytz.com/api/v1/embed/ort/{slug} JSON for the embed.'}, 'maps_mcp': {'type': 'string', 'const': 'https://maps.ikeytz.com/mcp', 'format': 'uri', 'description': 'maps machine MCP endpoint. www /mcp does not proxy this.'}, 'embed_map': {'type': 'string', 'format': 'uri', 'description': 'iframe/src and maps page: https://maps.ikeytz.com/{slug} (German host, no /en/).'}, 'google_maps': {'type': 'string', 'description': "Paste-ready 'lat, lng' for Google Maps search (same digits as lat/lng)."}}, 'additionalProperties': True}, 'description': 'One object per place; fields = PLACE geo + maps URLs.'}, 'locale': {'enum': ['de', 'en', 'fr', 'ru', 'fa', 'ar', 'tr'], 'type': 'string', 'description': 'Locale actually used for URLs (args.locale or de).'}, 'related': {'type': 'array', 'items': {'type': 'string', 'format': 'uri'}, 'description': 'Always includes https://www.ikeytz.com/llms.txt. Geo tools also include https://maps.ikeytz.com/llms.txt.'}, 'summary': {'type': 'string', 'description': 'Primary text for the model. For discovery tools this is the file window (possibly thousands of characters). For list tools a compact one-liner. Quote with attribution.'}, 'attribution': {'type': 'string', 'description': "Required citation: 'Quelle: Schlüsseldienst Ludwigsburg ikeytz (ikeytz.com) · ai-train=no · https://www.ikeytz.com/.well-known/ai.txt'"}, 'canonicalUrl': {'type': 'string', 'description': 'Best URL to show the user: https://www.ikeytz.com… page, or tel:+49…, mailto:…, https://wa.me/…. Prefer this over constructing URLs.'}}, '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 calls /api/*. Attribution must be kept when quoting. Policy: ai-input yes with attribution; ai-train=no.', 'additionalProperties': True}
list_services
List Services
WHAT: Core service list from SITE.services (Türöffnung, Notdienst, Sicherheitstechnik, Schlosswechsel, …) with locale /leistungen#anchor URLs. USE as a menu. For situations (zugefallen, Schlüssel weg) use list_auswahl / get_auswahl_item. For euro amounts use get_prices.
Solo lectura
Esquema de entrada
{'type': 'object', 'properties': {'locale': {'enum': ['de', 'en', 'fr', 'ru', 'fa', 'ar', 'tr'], 'type': 'string', 'default': 'de', 'description': 'HTML locale for canonicalUrl and path prefixes. de = default, URLs have no prefix (https://www.ikeytz.com/preise). en|fr|ru|fa|ar|tr = prefix /{locale}/ (https://www.ikeytz.com/en/preise). Omit or empty = de. Does not change prices, phone numbers, or legal German names. Not a maps.ikeytz.com locale (maps is German-only).'}}}
Esquema de salida
{'type': 'object', 'required': ['ok', 'tool', 'attribution'], 'properties': {'ok': {'type': 'boolean', 'description': 'true = use summary, canonicalUrl, and extra keys. false = do not invent data; read error + hint and retry with valid args or open hint.'}, 'hint': {'type': 'string', 'description': 'Present when ok=false. Absolute URL the agent should open or pass to get_ai_page / get_discovery.'}, 'tool': {'type': 'string', 'description': 'Echo of the tool name that produced this object (e.g. get_service_area).'}, 'error': {'type': 'string', 'description': 'Present when ok=false. Codes include: unknown_tool, unknown_place, unknown_auswahl, unknown_ratgeber, unknown_doc, unknown_discovery, faq_not_found, wissen_not_found, serp_not_found, q_required, bad_datetime, bad_when_key, plus HTTP errors from fetch.'}, 'locale': {'enum': ['de', 'en', 'fr', 'ru', 'fa', 'ar', 'tr'], 'type': 'string', 'description': 'Locale actually used for URLs (args.locale or de).'}, 'related': {'type': 'array', 'items': {'type': 'string', 'format': 'uri'}, 'description': 'Always includes https://www.ikeytz.com/llms.txt. Geo tools also include https://maps.ikeytz.com/llms.txt.'}, 'summary': {'type': 'string', 'description': 'Primary text for the model. For discovery tools this is the file window (possibly thousands of characters). For list tools a compact one-liner. Quote with attribution.'}, 'services': {'type': 'array', 'description': 'Core services with locale URLs'}, 'attribution': {'type': 'string', 'description': "Required citation: 'Quelle: Schlüsseldienst Ludwigsburg ikeytz (ikeytz.com) · ai-train=no · https://www.ikeytz.com/.well-known/ai.txt'"}, 'canonicalUrl': {'type': 'string', 'description': 'Best URL to show the user: https://www.ikeytz.com… page, or tel:+49…, mailto:…, https://wa.me/…. Prefer this over constructing URLs.'}}, '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 calls /api/*. Attribution must be kept when quoting. Policy: ai-input yes with attribution; ai-train=no.', 'additionalProperties': True}
list_whatsapp_options
List Whatsapp Options
WHAT: Prefab WhatsApp AND mailto deep links (no send). 10 end-invoices + cylinder_mount (49 €, not night) + beratung. NOT zugefallen|abgeschlossen|zylinder (those mix day/night). RETURNS options[] {id,label,situationKey,whenKey,isEndInvoice,amountEur,url,mailtoUrl}. 49 € = mount only; night/WE/holiday = 149/179/198/228/119. USE compose_whatsapp or compose_mailto with id. Never claims a message was delivered.
Solo lectura
Esquema de entrada
{'type': 'object', 'properties': {'locale': {'enum': ['de', 'en', 'fr', 'ru', 'fa', 'ar', 'tr'], 'type': 'string', 'default': 'de', 'description': 'HTML locale for canonicalUrl and path prefixes. de = default, URLs have no prefix (https://www.ikeytz.com/preise). en|fr|ru|fa|ar|tr = prefix /{locale}/ (https://www.ikeytz.com/en/preise). Omit or empty = de. Does not change prices, phone numbers, or legal German names. Not a maps.ikeytz.com locale (maps is German-only).'}}}
Esquema de salida
{'type': 'object', 'required': ['ok', 'tool', 'attribution'], 'properties': {'ok': {'type': 'boolean', 'description': 'true = use summary, canonicalUrl, and extra keys. false = do not invent data; read error + hint and retry with valid args or open hint.'}, 'hint': {'type': 'string', 'description': 'Present when ok=false. Absolute URL the agent should open or pass to get_ai_page / get_discovery.'}, 'tool': {'type': 'string', 'description': 'Echo of the tool name that produced this object (e.g. get_service_area).'}, 'error': {'type': 'string', 'description': 'Present when ok=false. Codes include: unknown_tool, unknown_place, unknown_auswahl, unknown_ratgeber, unknown_doc, unknown_discovery, faq_not_found, wissen_not_found, serp_not_found, q_required, bad_datetime, bad_when_key, plus HTTP errors from fetch.'}, 'locale': {'enum': ['de', 'en', 'fr', 'ru', 'fa', 'ar', 'tr'], 'type': 'string', 'description': 'Locale actually used for URLs (args.locale or de).'}, 'options': {'type': 'array', 'description': 'Prefab WhatsApp options with wa.me URLs'}, 'related': {'type': 'array', 'items': {'type': 'string', 'format': 'uri'}, 'description': 'Always includes https://www.ikeytz.com/llms.txt. Geo tools also include https://maps.ikeytz.com/llms.txt.'}, 'summary': {'type': 'string', 'description': 'Primary text for the model. For discovery tools this is the file window (possibly thousands of characters). For list tools a compact one-liner. Quote with attribution.'}, 'attribution': {'type': 'string', 'description': "Required citation: 'Quelle: Schlüsseldienst Ludwigsburg ikeytz (ikeytz.com) · ai-train=no · https://www.ikeytz.com/.well-known/ai.txt'"}, 'canonicalUrl': {'type': 'string', 'description': 'Best URL to show the user: https://www.ikeytz.com… page, or tel:+49…, mailto:…, https://wa.me/…. Prefer this over constructing URLs.'}}, '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 calls /api/*. Attribution must be kept when quoting. Policy: ai-input yes with attribution; ai-train=no.', 'additionalProperties': True}
list_wissen
List Wissen
WHAT: Wissen lexicon index (id, title, url with #id). USE get_wissen_entry({id}) for a body snippet. Full article: get_ai_page({path:'/wissen'}) or open the hash URL.
Solo lectura
Esquema de entrada
{'type': 'object', 'properties': {'locale': {'enum': ['de', 'en', 'fr', 'ru', 'fa', 'ar', 'tr'], 'type': 'string', 'default': 'de', 'description': 'HTML locale for canonicalUrl and path prefixes. de = default, URLs have no prefix (https://www.ikeytz.com/preise). en|fr|ru|fa|ar|tr = prefix /{locale}/ (https://www.ikeytz.com/en/preise). Omit or empty = de. Does not change prices, phone numbers, or legal German names. Not a maps.ikeytz.com locale (maps is German-only).'}}}
Esquema de salida
{'type': 'object', 'required': ['ok', 'tool', 'attribution'], 'properties': {'ok': {'type': 'boolean', 'description': 'true = use summary, canonicalUrl, and extra keys. false = do not invent data; read error + hint and retry with valid args or open hint.'}, 'hint': {'type': 'string', 'description': 'Present when ok=false. Absolute URL the agent should open or pass to get_ai_page / get_discovery.'}, 'tool': {'type': 'string', 'description': 'Echo of the tool name that produced this object (e.g. get_service_area).'}, 'error': {'type': 'string', 'description': 'Present when ok=false. Codes include: unknown_tool, unknown_place, unknown_auswahl, unknown_ratgeber, unknown_doc, unknown_discovery, faq_not_found, wissen_not_found, serp_not_found, q_required, bad_datetime, bad_when_key, plus HTTP errors from fetch.'}, 'items': {'type': 'array', 'description': 'Wissen articles id/title/url'}, 'locale': {'enum': ['de', 'en', 'fr', 'ru', 'fa', 'ar', 'tr'], 'type': 'string', 'description': 'Locale actually used for URLs (args.locale or de).'}, 'related': {'type': 'array', 'items': {'type': 'string', 'format': 'uri'}, 'description': 'Always includes https://www.ikeytz.com/llms.txt. Geo tools also include https://maps.ikeytz.com/llms.txt.'}, 'summary': {'type': 'string', 'description': 'Primary text for the model. For discovery tools this is the file window (possibly thousands of characters). For list tools a compact one-liner. Quote with attribution.'}, 'attribution': {'type': 'string', 'description': "Required citation: 'Quelle: Schlüsseldienst Ludwigsburg ikeytz (ikeytz.com) · ai-train=no · https://www.ikeytz.com/.well-known/ai.txt'"}, 'canonicalUrl': {'type': 'string', 'description': 'Best URL to show the user: https://www.ikeytz.com… page, or tel:+49…, mailto:…, https://wa.me/…. Prefer this over constructing URLs.'}}, '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 calls /api/*. Attribution must be kept when quoting. Policy: ai-input yes with attribution; ai-train=no.', 'additionalProperties': True}
resolve_locale_url
Resolve Locale Url
WHAT: Rewrite one marketing path into another locale without fetching HTML. Example: path=/preise locale=en → canonicalUrl https://www.ikeytz.com/en/preise. Accepts a path or a full https://www.ikeytz.com/… URL; strips an existing /en|/fr|… prefix first. RETURNS path (no locale prefix), fromLocale, toLocale. DOES NOT translate body text. Invalid locale still required by schema — use list_locales. NEXT: get_ai_page({path, locale: toLocale}).
Solo lectura
Esquema de entrada
{'type': 'object', 'required': ['path', 'locale'], 'properties': {'path': {'type': 'string', 'description': 'Required. Site path starting with / (e.g. /preise, /en/preise, /schluesseldienst-ludwigsburg-pattonville) OR a full https://www.ikeytz.com/… URL. Host other than www is not normalized here.'}, 'locale': {'enum': ['de', 'en', 'fr', 'ru', 'fa', 'ar', 'tr'], 'type': 'string', 'description': 'Required. Target locale for the rewritten URL.'}}}
Esquema de salida
{'type': 'object', 'required': ['ok', 'tool', 'attribution'], 'properties': {'ok': {'type': 'boolean', 'description': 'true = use summary, canonicalUrl, and extra keys. false = do not invent data; read error + hint and retry with valid args or open hint.'}, 'hint': {'type': 'string', 'description': 'Present when ok=false. Absolute URL the agent should open or pass to get_ai_page / get_discovery.'}, 'path': {'type': 'string', 'description': 'Path without locale prefix'}, 'tool': {'type': 'string', 'description': 'Echo of the tool name that produced this object (e.g. get_service_area).'}, 'error': {'type': 'string', 'description': 'Present when ok=false. Codes include: unknown_tool, unknown_place, unknown_auswahl, unknown_ratgeber, unknown_doc, unknown_discovery, faq_not_found, wissen_not_found, serp_not_found, q_required, bad_datetime, bad_when_key, plus HTTP errors from fetch.'}, 'locale': {'enum': ['de', 'en', 'fr', 'ru', 'fa', 'ar', 'tr'], 'type': 'string', 'description': 'Locale actually used for URLs (args.locale or de).'}, 'related': {'type': 'array', 'items': {'type': 'string', 'format': 'uri'}, 'description': 'Always includes https://www.ikeytz.com/llms.txt. Geo tools also include https://maps.ikeytz.com/llms.txt.'}, 'summary': {'type': 'string', 'description': 'Primary text for the model. For discovery tools this is the file window (possibly thousands of characters). For list tools a compact one-liner. Quote with attribution.'}, 'toLocale': {'type': 'string', 'description': 'Requested target locale'}, 'fromLocale': {'type': 'string', 'description': 'Locale parsed from input path'}, 'attribution': {'type': 'string', 'description': "Required citation: 'Quelle: Schlüsseldienst Ludwigsburg ikeytz (ikeytz.com) · ai-train=no · https://www.ikeytz.com/.well-known/ai.txt'"}, 'canonicalUrl': {'type': 'string', 'description': 'Best URL to show the user: https://www.ikeytz.com… page, or tel:+49…, mailto:…, https://wa.me/…. Prefer this over constructing URLs.'}}, '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 calls /api/*. Attribution must be kept when quoting. Policy: ai-input yes with attribution; ai-train=no.', 'additionalProperties': True}
site_overview
Site Overview
WHO/WHAT: Public brand card for Schlüsseldienst Ludwigsburg ikeytz (mobile locksmith, Landkreis Ludwigsburg, Baden-Württemberg, Germany). RETURNS structuredContent: tradeName, gewerbeName, priceRange plus envelope (ok, summary, canonicalUrl=home). USE when the user asks who ikeytz is, whether there is a shop, opening hours positioning (24/7 mobile). DOES NOT: book, quote a live price, geocode, submit forms. No walk-in — office address is not a customer counter. NEXT: get_business_identity (NAP), get_contact (phones), get_prices (fixed matrix), get_ort_datetime (day|night).
Solo lectura
Esquema de entrada
{'type': 'object', 'properties': {'locale': {'enum': ['de', 'en', 'fr', 'ru', 'fa', 'ar', 'tr'], 'type': 'string', 'default': 'de', 'description': 'HTML locale for canonicalUrl and path prefixes. de = default, URLs have no prefix (https://www.ikeytz.com/preise). en|fr|ru|fa|ar|tr = prefix /{locale}/ (https://www.ikeytz.com/en/preise). Omit or empty = de. Does not change prices, phone numbers, or legal German names. Not a maps.ikeytz.com locale (maps is German-only).'}}}
Esquema de salida
{'type': 'object', 'required': ['ok', 'tool', 'attribution'], 'properties': {'ok': {'type': 'boolean', 'description': 'true = use summary, canonicalUrl, and extra keys. false = do not invent data; read error + hint and retry with valid args or open hint.'}, 'hint': {'type': 'string', 'description': 'Present when ok=false. Absolute URL the agent should open or pass to get_ai_page / get_discovery.'}, 'tool': {'type': 'string', 'description': 'Echo of the tool name that produced this object (e.g. get_service_area).'}, 'error': {'type': 'string', 'description': 'Present when ok=false. Codes include: unknown_tool, unknown_place, unknown_auswahl, unknown_ratgeber, unknown_doc, unknown_discovery, faq_not_found, wissen_not_found, serp_not_found, q_required, bad_datetime, bad_when_key, plus HTTP errors from fetch.'}, 'locale': {'enum': ['de', 'en', 'fr', 'ru', 'fa', 'ar', 'tr'], 'type': 'string', 'description': 'Locale actually used for URLs (args.locale or de).'}, 'related': {'type': 'array', 'items': {'type': 'string', 'format': 'uri'}, 'description': 'Always includes https://www.ikeytz.com/llms.txt. Geo tools also include https://maps.ikeytz.com/llms.txt.'}, 'summary': {'type': 'string', 'description': 'Primary text for the model. For discovery tools this is the file window (possibly thousands of characters). For list tools a compact one-liner. Quote with attribution.'}, 'tradeName': {'type': 'string', 'description': 'Public trade name'}, 'priceRange': {'type': 'string', 'description': 'Price-range hint for schema'}, 'attribution': {'type': 'string', 'description': "Required citation: 'Quelle: Schlüsseldienst Ludwigsburg ikeytz (ikeytz.com) · ai-train=no · https://www.ikeytz.com/.well-known/ai.txt'"}, 'gewerbeName': {'type': 'string', 'description': 'Registered business name'}, 'canonicalUrl': {'type': 'string', 'description': 'Best URL to show the user: https://www.ikeytz.com… page, or tel:+49…, mailto:…, https://wa.me/…. Prefer this over constructing URLs.'}}, '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 calls /api/*. Attribution must be kept when quoting. Policy: ai-input yes with attribution; ai-train=no.', 'additionalProperties': True}
Modificado
get_sitemap_txt
27 de September de 2026 a las 02:42
Modificado
get_ai_txt
27 de September de 2026 a las 02:42
Modificado
get_llms_mcp_web
27 de September de 2026 a las 02:42
Modificado
get_llms_mcp_server
27 de September de 2026 a las 02:42
Modificado
get_llms_serp_txt
27 de September de 2026 a las 02:42
Modificado
get_llms_jsonld
27 de September de 2026 a las 02:42
Modificado
get_llms_txt
27 de September de 2026 a las 02:42
Modificado
get_discovery
27 de September de 2026 a las 02:42
Modificado
get_sitemap_txt
25 de September de 2026 a las 02:50
Modificado
get_ai_txt
25 de September de 2026 a las 02:50
Modificado
get_llms_mcp_web
25 de September de 2026 a las 02:50
Modificado
get_llms_mcp_server
25 de September de 2026 a las 02:50
Añadido
get_llms_serp_txt
25 de September de 2026 a las 02:50
Añadido
get_llms_jsonld
25 de September de 2026 a las 02:50
Modificado
get_llms_txt
25 de September de 2026 a las 02:50
Modificado
get_discovery
25 de September de 2026 a las 02:50
Modificado
get_sitemap_txt
23 de September de 2026 a las 02:41
Modificado
get_ai_txt
23 de September de 2026 a las 02:41
Modificado
get_llms_mcp_web
23 de September de 2026 a las 02:41
Modificado
get_llms_mcp_server
23 de September de 2026 a las 02:41
Modificado
get_llms_txt
23 de September de 2026 a las 02:41
Modificado
get_discovery
23 de September de 2026 a las 02:41
Modificado
get_page_summary
23 de September de 2026 a las 02:41
Modificado
get_geo_office
23 de September de 2026 a las 02:41
Añadido
compose_mailto
21 de September de 2026 a las 02:48
Añadido
compose_whatsapp
21 de September de 2026 a las 02:48
Añadido
compose_tel_landline
21 de September de 2026 a las 02:48
Añadido
compose_tel_mobile
21 de September de 2026 a las 02:48
Añadido
list_whatsapp_options
21 de September de 2026 a las 02:48
Añadido
get_sitemap_txt
21 de September de 2026 a las 02:48