{"name":"com.ikeytz/maps","slug":"ikeytz-maps","title":"ikeytz Einsatzgebiet-Karten","description":"Read/Link MCP for maps.ikeytz.com. Public read-only. No forms. ai-train=no.","url":"https://mcp.market/server/ikeytz-maps","rating":null,"grade":"B","score":77,"certified":false,"status":"active","category":"other","tags":[],"presence":{"score":18,"stars":null,"forks":null,"downloads_week":106,"last_push_at":null,"license":"LicenseRef-ikeytz-terms"},"uptime":{"percent":100,"checks":6,"ok":6,"last_checked_at":"2026-09-20T20:26:06.720Z","last_ok_at":"2026-09-20T20:26:06.720Z","latency_ms":527},"claimed":false,"transport":"mixed","callable_via_gateway":true,"default_price_micros":0,"repository":null,"website":"https://maps.ikeytz.com","version":"1.0.4","remotes":[{"type":"streamable-http","url":"https://maps.ikeytz.com/mcp"}],"packages":[{"registryType":"npm","registryBaseUrl":"https://registry.npmjs.org","identifier":"@ikeytz/maps-mcp","version":"1.0.18","runtimeHint":"npx","transport":{"type":"stdio"}}],"tools":[{"name":"compose_mailto","description":"WHAT: mailto:info@ikeytz.com plus mapsEmail info@maps.ikeytz.com (mapsHref). Call with {}. USE for email CTAs. DOES NOT send mail. NEXT: get_contact, list_footer.","write_action":false,"price_micros":0,"input_schema":{"type":"object","properties":{},"additionalProperties":false,"description":"This tool takes no arguments. Call tools/call with arguments: {}. Extra keys are ignored."}},{"name":"compose_tel_landline","description":"WHAT: tel: href for the public landline. Call with {}. RETURNS href + display. USE as secondary call CTA. NEXT: compose_tel_mobile.","write_action":false,"price_micros":0,"input_schema":{"type":"object","properties":{},"additionalProperties":false,"description":"This tool takes no arguments. Call tools/call with arguments: {}. Extra keys are ignored."}},{"name":"compose_tel_mobile","description":"WHAT: tel: href for the public mobile number. Call with {}. RETURNS href + display. USE as the primary call CTA. DOES NOT place the call. NEXT: compose_tel_landline, list_whatsapp_options.","write_action":false,"price_micros":0,"input_schema":{"type":"object","properties":{},"additionalProperties":false,"description":"This tool takes no arguments. Call tools/call with arguments: {}. Extra keys are ignored."}},{"name":"compose_whatsapp","description":"WHAT: wa.me link. Optional option=zugefallen|abgeschlossen|zylinder|beratung (or list_whatsapp_options ids). Link only — no form. USE to open WhatsApp with a prefab. NEXT: compose_mailto, get_contact.","write_action":false,"price_micros":0,"input_schema":{"type":"object","properties":{"option":{"type":"string","description":"Optional situation id: zugefallen|abgeschlossen|zylinder|beratung (or ids from list_whatsapp_options)."}}}},{"name":"distance_to_office","description":"WHAT: Air distance (km) from a Gebiet (slug|plz|name) or lat/lng/icbm to the Gewerbesitz. walkIn=false. RETURNS from, office, distance_km. USE for rough proximity — not driving time. DOES NOT route via OSRM. NEXT: get_geo_office, find_by_geo.","write_action":false,"price_micros":0,"input_schema":{"type":"object","properties":{"slug":{"type":"string","description":"URL slug of one of the 52 Einsatzgebiete, e.g. pattonville, bietigheim-bissingen, walheim, gruenbuehl. Matches https://maps.ikeytz.com/{slug}. Lookup order when combined with plz/name: slug first."},"plz":{"type":"string","description":"German postcode (PLZ). Several Gebiete can share one PLZ (e.g. 71638). For single lookup first match wins; use find_by_plz for all matches."},"name":{"type":"string","description":"German place name substring (case-insensitive, umlauts ok), e.g. Grünbühl, Pattonville. Used when slug/plz omitted."},"lat":{"type":"number","description":"Optional query latitude instead of place lookup"},"lng":{"type":"number","description":"Optional query longitude"},"icbm":{"type":"string","description":"Optional 'lat, lng' instead of place lookup"}}}},{"name":"find_by_area","description":"WHAT: Alias of find_by_gebiet — multi-match by q/name/slug. Same inputs and outputs. USE when the agent prefers 'area' naming. NEXT: get_service_area, get_embed_map.","write_action":false,"price_micros":0,"input_schema":{"type":"object","properties":{"q":{"type":"string","description":"Name or slug query"},"name":{"type":"string","description":"German place name substring (case-insensitive, umlauts ok), e.g. Grünbühl, Pattonville. Used when slug/plz omitted."},"slug":{"type":"string","description":"URL slug of one of the 52 Einsatzgebiete, e.g. pattonville, bietigheim-bissingen, walheim, gruenbuehl. Matches https://maps.ikeytz.com/{slug}. Lookup order when combined with plz/name: slug first."}}}},{"name":"find_by_gebiet","description":"WHAT: Multi-match Gebiete by q, name, or slug (substring, umlauts ok). RETURNS all matching point cards. USE for fuzzy place names. DOES NOT require exact slug. NEXT: get_service_area for one, or get_grenze.","write_action":false,"price_micros":0,"input_schema":{"type":"object","properties":{"q":{"type":"string","description":"Name or slug query (preferred)"},"name":{"type":"string","description":"German place name substring (case-insensitive, umlauts ok), e.g. Grünbühl, Pattonville. Used when slug/plz omitted."},"slug":{"type":"string","description":"URL slug of one of the 52 Einsatzgebiete, e.g. pattonville, bietigheim-bissingen, walheim, gruenbuehl. Matches https://maps.ikeytz.com/{slug}. Lookup order when combined with plz/name: slug first."}}}},{"name":"find_by_geo","description":"WHAT: Rank Einsatzgebiete by lat/lng (or icbm). Optional radius_km; else nearest N (limit, default 5). (0,0) and far points → ok=false outside_service_area. RETURNS items with distance_km. USE for 'near this coordinate'. DOES NOT route or drive-time. NEXT: get_service_area, get_grenze, distance_to_office.","write_action":false,"price_micros":0,"input_schema":{"type":"object","properties":{"lat":{"type":"number","description":"WGS84 latitude. Required with lng unless icbm is set. (0,0) → outside_service_area."},"lng":{"type":"number","description":"WGS84 longitude. Required with lat unless icbm is set."},"icbm":{"type":"string","description":"ICBM or paste 'lat, lng' (comma-separated). Alternative to lat+lng."},"radius_km":{"type":"number","description":"Optional air-radius filter in km. Omit = return nearest N (limit). Far points / (0,0) → outside_service_area."},"limit":{"type":"integer","minimum":1,"description":"Maximum items or lines to return after offset. Omit = all remaining in the window (subject to tool-specific clamps). For geo near-search default is often 5 without radius_km, up to 52 with radius."}}}},{"name":"find_by_google_maps","description":"WHAT: Paste Google Maps / ICBM coordinates (q or icbm or lat/lng) → nearest ikeytz Gebiete (same ranking as find_by_geo). (0,0) → outside_service_area. USE when the user pastes a Maps pin. NEXT: get_service_area, get_embed_map.","write_action":false,"price_micros":0,"input_schema":{"type":"object","properties":{"q":{"type":"string","description":"Paste string containing 'lat, lng'"},"icbm":{"type":"string","description":"ICBM or paste 'lat, lng' (comma-separated). Alternative to lat+lng."},"lat":{"type":"number","description":"WGS84 latitude. Required with lng unless icbm is set. (0,0) → outside_service_area."},"lng":{"type":"number","description":"WGS84 longitude. Required with lat unless icbm is set."},"radius_km":{"type":"number","description":"Optional air-radius filter in km. Omit = return nearest N (limit). Far points / (0,0) → outside_service_area."},"limit":{"type":"integer","minimum":1,"description":"Maximum items or lines to return after offset. Omit = all remaining in the window (subject to tool-specific clamps). For geo near-search default is often 5 without radius_km, up to 52 with radius."}}}},{"name":"find_by_icbm","description":"WHAT: Same as find_by_geo but prefers icbm string 'lat, lng'. Optional lat/lng/radius_km/limit. (0,0) → outside_service_area. USE when the user pastes ICBM metadata. NEXT: get_embed_map, get_grenze.","write_action":false,"price_micros":0,"input_schema":{"type":"object","properties":{"icbm":{"type":"string","description":"ICBM or paste 'lat, lng' (comma-separated). Alternative to lat+lng."},"lat":{"type":"number","description":"WGS84 latitude. Required with lng unless icbm is set. (0,0) → outside_service_area."},"lng":{"type":"number","description":"WGS84 longitude. Required with lat unless icbm is set."},"radius_km":{"type":"number","description":"Optional air-radius filter in km. Omit = return nearest N (limit). Far points / (0,0) → outside_service_area."},"limit":{"type":"integer","minimum":1,"description":"Maximum items or lines to return after offset. Omit = all remaining in the window (subject to tool-specific clamps). For geo near-search default is often 5 without radius_km, up to 52 with radius."}}}},{"name":"find_by_keyword","description":"WHAT: Search maps llms-keywords.txt (keyword → maps URL). q required. RETURNS matching keyword/url rows (clamped limit). USE for SEO/keyword → Gebiet page. DOES NOT search www keywords. NEXT: get_service_area / get_embed_map with the slug from the URL.","write_action":false,"price_micros":0,"input_schema":{"type":"object","properties":{"q":{"type":"string","description":"Required search string matched against keyword and URL (substring, case-insensitive)."},"limit":{"type":"integer","minimum":1,"description":"Maximum items or lines to return after offset. Omit = all remaining in the window (subject to tool-specific clamps). For geo near-search default is often 5 without radius_km, up to 52 with radius."},"locale":{"type":"string","enum":["de"],"default":"de","description":"maps is German-only (de). Omit or pass de. Other values are ignored; URLs stay https://maps.ikeytz.com/… with no locale prefix. Not a www multi-locale switch — use @ikeytz/mcp list_locales on www for en|fr|ru|fa|ar|tr."}},"required":["q"]}},{"name":"find_by_plz","description":"WHAT: All Einsatzgebiete with this PLZ (not only the first). plz required (or q as PLZ). RETURNS items[] point cards + count. USE when several Stadtteile share a postcode. NEXT: get_service_area(slug) for one card.","write_action":false,"price_micros":0,"input_schema":{"type":"object","properties":{"plz":{"type":"string","description":"Required German postcode."},"q":{"type":"string","description":"Alias for plz if plz omitted"}},"required":["plz"]}},{"name":"find_by_serp","description":"WHAT: Search maps llms-serp.txt blocks by q, path, url, or slug. RETURNS path/url/snippet items. USE for title/H1/description SERP cards on maps. DOES NOT scrape live HTML. NEXT: get_serp_snippet for one full block.","write_action":false,"price_micros":0,"input_schema":{"type":"object","properties":{"q":{"type":"string","description":"Free-text search in SERP blocks"},"path":{"type":"string","description":"maps path fragment, e.g. /pattonville"},"url":{"type":"string","description":"Full https://maps.ikeytz.com/… URL"},"slug":{"type":"string","description":"Gebiet slug"},"limit":{"type":"integer","minimum":1,"description":"Maximum items or lines to return after offset. Omit = all remaining in the window (subject to tool-specific clamps). For geo near-search default is often 5 without radius_km, up to 52 with radius."}}}},{"name":"get_about","description":"WHAT: About maps.ikeytz.com (same core card as site_overview — 52 maps, not www Über-uns corpus). USE for 'what is this host'. DOES NOT return www about body. NEXT: site_overview, get_links, get_business_identity.","write_action":false,"price_micros":0,"input_schema":{"type":"object","properties":{"locale":{"type":"string","enum":["de"],"default":"de","description":"maps is German-only (de). Omit or pass de. Other values are ignored; URLs stay https://maps.ikeytz.com/… with no locale prefix. Not a www multi-locale switch — use @ikeytz/mcp list_locales on www for en|fr|ru|fa|ar|tr."}}}},{"name":"get_agb","description":"WHAT: www pointer only — AGB live at www.ikeytz.com/agb. maps returns html + note, not the corpus. USE to open/hand off to www MCP. DOES NOT return AGB body text. NEXT: @ikeytz/mcp get_legal(doc=agb).","write_action":false,"price_micros":0,"input_schema":{"type":"object","properties":{},"additionalProperties":false,"description":"This tool takes no arguments. Call tools/call with arguments: {}. Extra keys are ignored."}},{"name":"get_ai_page","description":"WHAT: Read maps /ai-pages/de/{slug}.txt when present; else www pointer for the path. path or slug. RETURNS text for maps AI pages. USE for agent-ready Gebiet prose. NEXT: get_service_area, get_lage.","write_action":false,"price_micros":0,"input_schema":{"type":"object","properties":{"path":{"type":"string","description":"Path or ai-pages path fragment"},"slug":{"type":"string","description":"Gebiet or ai-page slug"},"locale":{"type":"string","enum":["de"],"default":"de","description":"maps is German-only (de). Omit or pass de. Other values are ignored; URLs stay https://maps.ikeytz.com/… with no locale prefix. Not a www multi-locale switch — use @ikeytz/mcp list_locales on www for en|fr|ru|fa|ar|tr."}}}},{"name":"get_ai_txt","description":"WHAT: Alias get_discovery(which=ai-txt) — maps /.well-known/ai.txt 1:1. USE for crawl/train policy (ai-train=no). NEXT: get_llms_txt.","write_action":false,"price_micros":0,"input_schema":{"type":"object","properties":{"offset":{"type":"integer","minimum":0,"default":0,"description":"0-based index into a list or discovery file lines (split on \\n). 0 = first. Omit = 0. Combine with limit to page. Use nextOffset / offset+limit from a previous result when present."},"limit":{"type":"integer","minimum":1,"description":"Maximum items or lines to return after offset. Omit = all remaining in the window (subject to tool-specific clamps). For geo near-search default is often 5 without radius_km, up to 52 with radius."}}}},{"name":"get_auswahl_item","description":"WHAT: www pointer only — one Auswahl item on www /auswahl/{slug}. slug required. maps returns html to that path. NEXT: www get_auswahl_item.","write_action":false,"price_micros":0,"input_schema":{"type":"object","properties":{"slug":{"type":"string","description":"Required Auswahl slug on www"},"locale":{"type":"string","enum":["de"],"default":"de","description":"maps is German-only (de). Omit or pass de. Other values are ignored; URLs stay https://maps.ikeytz.com/… with no locale prefix. Not a www multi-locale switch — use @ikeytz/mcp list_locales on www for en|fr|ru|fa|ar|tr."}},"required":["slug"]}},{"name":"get_business_identity","description":"WHO: Inhaber, brand, legalName, hours, NAP, office coords. walkIn=false — mobile only. USE for LocalBusiness / impressum-grade facts on maps. DOES NOT update records. NEXT: get_contact, get_geo_office, get_impressum.","write_action":false,"price_micros":0,"input_schema":{"type":"object","properties":{"locale":{"type":"string","enum":["de"],"default":"de","description":"maps is German-only (de). Omit or pass de. Other values are ignored; URLs stay https://maps.ikeytz.com/… with no locale prefix. Not a www multi-locale switch — use @ikeytz/mcp list_locales on www for en|fr|ru|fa|ar|tr."}}}},{"name":"get_contact","description":"WHAT: Public NAP — mobile, landline, fax, email, mapsEmail (info@maps.ikeytz.com), WhatsApp, address, office coords. walkIn=false. USE for call/WhatsApp/mail CTAs. DOES NOT open tickets or send messages. NEXT: compose_tel_mobile, compose_whatsapp, compose_mailto, list_whatsapp_options.","write_action":false,"price_micros":0,"input_schema":{"type":"object","properties":{"locale":{"type":"string","enum":["de"],"default":"de","description":"maps is German-only (de). Omit or pass de. Other values are ignored; URLs stay https://maps.ikeytz.com/… with no locale prefix. Not a www multi-locale switch — use @ikeytz/mcp list_locales on www for en|fr|ru|fa|ar|tr."}}}},{"name":"get_copyright","description":"WHAT: English map copyright text from maps /llms-copyright.txt. Optional offset/limit. USE for EN citations of map authorship. NEXT: get_urheberrecht.","write_action":false,"price_micros":0,"input_schema":{"type":"object","properties":{"offset":{"type":"integer","minimum":0,"default":0,"description":"0-based index into a list or discovery file lines (split on \\n). 0 = first. Omit = 0. Combine with limit to page. Use nextOffset / offset+limit from a previous result when present."},"limit":{"type":"integer","minimum":1,"description":"Maximum items or lines to return after offset. Omit = all remaining in the window (subject to tool-specific clamps). For geo near-search default is often 5 without radius_km, up to 52 with radius."}}}},{"name":"get_datenschutz","description":"WHAT: www pointer only — Datenschutz on www.ikeytz.com. maps returns html link. DOES NOT return the privacy policy body. NEXT: www MCP.","write_action":false,"price_micros":0,"input_schema":{"type":"object","properties":{},"additionalProperties":false,"description":"This tool takes no arguments. Call tools/call with arguments: {}. Extra keys are ignored."}},{"name":"get_discovery","description":"WHAT: 1:1 mirror of a maps discovery file (UTF-8 text/JSON). which is required — common ids: ard, ai-catalog, ai-txt, ai-plugin, answer-engine, agent-skills, llms, llms-full, llms-index, llms-keywords, llms-serp, llms-impressum-kontakt, llms-orte-geo, llms-urheberrecht, llms-copyright, llms-mcp-server, llms-mcp-web, robots, sitemap-txt, sitemap-xml. Optional offset/limit line window. USE for agent-ready catalogs and robots/sitemap. DOES NOT invent missing files (missing=true). NEXT: find_by_keyword / find_by_serp for structured search; get_llms_txt / get_ai_txt aliases.","write_action":false,"price_micros":0,"input_schema":{"type":"object","properties":{"which":{"type":"string","description":"Required discovery id. Examples: ard, ai-catalog, ai-txt, ai-plugin, answer-engine, agent-skills, llms, llms-full, llms-index, llms-keywords, llms-serp, llms-impressum-kontakt, llms-orte-geo, llms-urheberrecht, llms-copyright, llms-mcp-server, llms-mcp-web, robots, sitemap-txt, sitemap-xml."},"offset":{"type":"integer","minimum":0,"default":0,"description":"0-based index into a list or discovery file lines (split on \\n). 0 = first. Omit = 0. Combine with limit to page. Use nextOffset / offset+limit from a previous result when present."},"limit":{"type":"integer","minimum":1,"description":"Maximum items or lines to return after offset. Omit = all remaining in the window (subject to tool-specific clamps). For geo near-search default is often 5 without radius_km, up to 52 with radius."}},"required":["which"]}},{"name":"get_embed_map","description":"WHAT: Canonical map page URL https://maps.ikeytz.com/{slug} for iframe/src and Visitenkarte. Lookup slug|plz|name. RETURNS area card + canonicalUrl. USE for embedding or linking a Gebiet map. NEXT: get_geo_api, get_grenze, get_lage.","write_action":false,"price_micros":0,"input_schema":{"type":"object","properties":{"slug":{"type":"string","description":"URL slug of one of the 52 Einsatzgebiete, e.g. pattonville, bietigheim-bissingen, walheim, gruenbuehl. Matches https://maps.ikeytz.com/{slug}. Lookup order when combined with plz/name: slug first."},"plz":{"type":"string","description":"German postcode (PLZ). Several Gebiete can share one PLZ (e.g. 71638). For single lookup first match wins; use find_by_plz for all matches."},"name":{"type":"string","description":"German place name substring (case-insensitive, umlauts ok), e.g. Grünbühl, Pattonville. Used when slug/plz omitted."}}}},{"name":"get_emergency","description":"WHAT: www pointer only — Notfall-Türöffnung page on www. maps returns html; use get_contact / compose_tel_mobile here for phones. DOES NOT dispatch. NEXT: compose_tel_mobile, www get_emergency.","write_action":false,"price_micros":0,"input_schema":{"type":"object","properties":{"locale":{"type":"string","enum":["de"],"default":"de","description":"maps is German-only (de). Omit or pass de. Other values are ignored; URLs stay https://maps.ikeytz.com/… with no locale prefix. Not a www multi-locale switch — use @ikeytz/mcp list_locales on www for en|fr|ru|fa|ar|tr."}}}},{"name":"get_faq","description":"WHAT: www pointer only — one FAQ answer lives on www. Optional id/q for www; maps returns /faq html. NEXT: www get_faq.","write_action":false,"price_micros":0,"input_schema":{"type":"object","properties":{"id":{"type":"string","description":"FAQ id on www"},"q":{"type":"string","description":"FAQ question search on www"},"locale":{"type":"string","enum":["de"],"default":"de","description":"maps is German-only (de). Omit or pass de. Other values are ignored; URLs stay https://maps.ikeytz.com/… with no locale prefix. Not a www multi-locale switch — use @ikeytz/mcp list_locales on www for en|fr|ru|fa|ar|tr."}}}},{"name":"get_geo_api","description":"WHAT: Public embed JSON URL https://maps.ikeytz.com/api/v1/embed/ort/{slug} (point + Grenze on that endpoint). Lookup slug|plz|name. RETURNS URL pointer + area card; note that the MCP payload itself is not the polygon. USE to fetch/open the public JSON. NEXT: get_grenze for GeoJSON polygon inside MCP.","write_action":false,"price_micros":0,"input_schema":{"type":"object","properties":{"slug":{"type":"string","description":"URL slug of one of the 52 Einsatzgebiete, e.g. pattonville, bietigheim-bissingen, walheim, gruenbuehl. Matches https://maps.ikeytz.com/{slug}. Lookup order when combined with plz/name: slug first."},"plz":{"type":"string","description":"German postcode (PLZ). Several Gebiete can share one PLZ (e.g. 71638). For single lookup first match wins; use find_by_plz for all matches."},"name":{"type":"string","description":"German place name substring (case-insensitive, umlauts ok), e.g. Grünbühl, Pattonville. Used when slug/plz omitted."}}}},{"name":"get_geo_office","description":"WHO/WHAT: Gewerbesitz (registered office) coordinates and street in Ludwigsburg. walkIn=false always — mobile locksmith, not a shop counter. RETURNS street, postal, city, lat, lng, google_maps/icbm, walkIn. USE for NAP/schema or distance_to_office. DOES NOT accept walk-in customers or bookings. NEXT: get_contact, distance_to_office, get_business_identity.","write_action":false,"price_micros":0,"input_schema":{"type":"object","properties":{"locale":{"type":"string","enum":["de"],"default":"de","description":"maps is German-only (de). Omit or pass de. Other values are ignored; URLs stay https://maps.ikeytz.com/… with no locale prefix. Not a www multi-locale switch — use @ikeytz/mcp list_locales on www for en|fr|ru|fa|ar|tr."}}}},{"name":"get_geschichte","description":"WHAT: Geschichte (history) text for one Einsatzgebiet Visitenkarte. Lookup slug|plz|name. RETURNS slug, name, geschichte. USE for place history prose on the map page. NEXT: get_lage, get_ai_page.","write_action":false,"price_micros":0,"input_schema":{"type":"object","properties":{"slug":{"type":"string","description":"URL slug of one of the 52 Einsatzgebiete, e.g. pattonville, bietigheim-bissingen, walheim, gruenbuehl. Matches https://maps.ikeytz.com/{slug}. Lookup order when combined with plz/name: slug first."},"plz":{"type":"string","description":"German postcode (PLZ). Several Gebiete can share one PLZ (e.g. 71638). For single lookup first match wins; use find_by_plz for all matches."},"name":{"type":"string","description":"German place name substring (case-insensitive, umlauts ok), e.g. Grünbühl, Pattonville. Used when slug/plz omitted."}}}},{"name":"get_grenze","description":"WHAT: OSM Gebietspolygon for one Einsatzgebiet as GeoJSON FeatureCollection inside the MCP result. Lookup slug|plz|name. RETURNS hasPolygon, polygon, point, osmRelationId/osmWayId, via. USE when the agent needs the boundary geometry. DOES NOT replace get_geo_api (that remains the URL pointer). NEXT: get_lage, get_embed_map.","write_action":false,"price_micros":0,"input_schema":{"type":"object","properties":{"slug":{"type":"string","description":"URL slug of one of the 52 Einsatzgebiete, e.g. pattonville, bietigheim-bissingen, walheim, gruenbuehl. Matches https://maps.ikeytz.com/{slug}. Lookup order when combined with plz/name: slug first."},"plz":{"type":"string","description":"German postcode (PLZ). Several Gebiete can share one PLZ (e.g. 71638). For single lookup first match wins; use find_by_plz for all matches."},"name":{"type":"string","description":"German place name substring (case-insensitive, umlauts ok), e.g. Grünbühl, Pattonville. Used when slug/plz omitted."}}}},{"name":"get_hub","description":"WHAT: maps hub card https://maps.ikeytz.com/ — title/h1 + 52 Gebiet links (not a single Visitenkarte). Call with {}. USE as the maps landing overview. DOES NOT include www prices. NEXT: get_service_area, list_service_areas.","write_action":false,"price_micros":0,"input_schema":{"type":"object","properties":{},"additionalProperties":false,"description":"This tool takes no arguments. Call tools/call with arguments: {}. Extra keys are ignored."}},{"name":"get_impressum","description":"WHAT: Impressum/Kontakt text from maps /llms-impressum-kontakt.txt. Optional offset/limit. USE for NAP/legal imprint on maps. NEXT: get_contact, get_business_identity; www /impressum for HTML.","write_action":false,"price_micros":0,"input_schema":{"type":"object","properties":{"offset":{"type":"integer","minimum":0,"default":0,"description":"0-based index into a list or discovery file lines (split on \\n). 0 = first. Omit = 0. Combine with limit to page. Use nextOffset / offset+limit from a previous result when present."},"limit":{"type":"integer","minimum":1,"description":"Maximum items or lines to return after offset. Omit = all remaining in the window (subject to tool-specific clamps). For geo near-search default is often 5 without radius_km, up to 52 with radius."}}}},{"name":"get_invoice_line_items","description":"WHAT: www pointer only — invoice line items are computed on www MCP. maps accepts situationKey/whenKey/breakdown for symmetry but returns html link to /preise, not totals. DOES NOT return totalEur. NEXT: @ikeytz/mcp get_invoice_line_items; get_ort_datetime here for Berlin clock/whenKey.","write_action":false,"price_micros":0,"input_schema":{"type":"object","properties":{"situationKey":{"type":"string","description":"Required for www. Situation id (opening_slam, opening_locked, pkg_key_*, cylinder_only, cylinder_mount, aliases)."},"whenKey":{"type":"string","description":"day|night|now — used on www; maps only points."},"breakdown":{"type":"boolean","description":"www flag; ignored for maps pointer payload."},"locale":{"type":"string","enum":["de"],"default":"de","description":"maps is German-only (de). Omit or pass de. Other values are ignored; URLs stay https://maps.ikeytz.com/… with no locale prefix. Not a www multi-locale switch — use @ikeytz/mcp list_locales on www for en|fr|ru|fa|ar|tr."}},"required":["situationKey"]}},{"name":"get_lage","description":"WHAT: Lage (location description) text for one Einsatzgebiet Visitenkarte. Lookup slug|plz|name. RETURNS slug, name, lage. USE for human-readable geography prose. NEXT: get_geschichte, get_service_area.","write_action":false,"price_micros":0,"input_schema":{"type":"object","properties":{"slug":{"type":"string","description":"URL slug of one of the 52 Einsatzgebiete, e.g. pattonville, bietigheim-bissingen, walheim, gruenbuehl. Matches https://maps.ikeytz.com/{slug}. Lookup order when combined with plz/name: slug first."},"plz":{"type":"string","description":"German postcode (PLZ). Several Gebiete can share one PLZ (e.g. 71638). For single lookup first match wins; use find_by_plz for all matches."},"name":{"type":"string","description":"German place name substring (case-insensitive, umlauts ok), e.g. Grünbühl, Pattonville. Used when slug/plz omitted."}}}},{"name":"get_legal","description":"WHAT: Legal doc router. doc enum: urheberrecht|copyright|impressum (maps text via discovery) or agb|nutzungsbedingungen|datenschutz|widerruf (www URL pointer only). Optional offset/limit for maps text. USE for citations. DOES NOT serve www legal HTML body on maps. NEXT: get_urheberrecht / get_impressum shortcuts; www for AGB body.","write_action":false,"price_micros":0,"input_schema":{"type":"object","properties":{"doc":{"type":"string","enum":["urheberrecht","copyright","impressum","agb","nutzungsbedingungen","datenschutz","widerruf"],"description":"Required. maps corpus: urheberrecht|copyright|impressum. www links only: agb|nutzungsbedingungen|datenschutz|widerruf."},"offset":{"type":"integer","minimum":0,"default":0,"description":"0-based index into a list or discovery file lines (split on \\n). 0 = first. Omit = 0. Combine with limit to page. Use nextOffset / offset+limit from a previous result when present."},"limit":{"type":"integer","minimum":1,"description":"Maximum items or lines to return after offset. Omit = all remaining in the window (subject to tool-specific clamps). For geo near-search default is often 5 without radius_km, up to 52 with radius."},"locale":{"type":"string","enum":["de"],"default":"de","description":"maps is German-only (de). Omit or pass de. Other values are ignored; URLs stay https://maps.ikeytz.com/… with no locale prefix. Not a www multi-locale switch — use @ikeytz/mcp list_locales on www for en|fr|ru|fa|ar|tr."}},"required":["doc"]}},{"name":"get_links","description":"WHAT: maps discovery URLs — hub, mcp, server-card, agent-skills, llms, registry search, npm @ikeytz/maps-mcp. USE as the machine bookmark set. NEXT: get_discovery, get_llms_txt.","write_action":false,"price_micros":0,"input_schema":{"type":"object","properties":{"locale":{"type":"string","enum":["de"],"default":"de","description":"maps is German-only (de). Omit or pass de. Other values are ignored; URLs stay https://maps.ikeytz.com/… with no locale prefix. Not a www multi-locale switch — use @ikeytz/mcp list_locales on www for en|fr|ru|fa|ar|tr."}}}},{"name":"get_llms_mcp_server","description":"WHAT: Alias of get_discovery(which=llms-mcp-server) — machine/catalog text for the maps MCP server. Optional offset/limit. USE when an agent needs the server-side llms MCP catalog. NEXT: get_llms_mcp_web, get_links.","write_action":false,"price_micros":0,"input_schema":{"type":"object","properties":{"offset":{"type":"integer","minimum":0,"default":0,"description":"0-based index into a list or discovery file lines (split on \\n). 0 = first. Omit = 0. Combine with limit to page. Use nextOffset / offset+limit from a previous result when present."},"limit":{"type":"integer","minimum":1,"description":"Maximum items or lines to return after offset. Omit = all remaining in the window (subject to tool-specific clamps). For geo near-search default is often 5 without radius_km, up to 52 with radius."}}}},{"name":"get_llms_mcp_web","description":"WHAT: Alias of get_discovery(which=llms-mcp-web) — web/UI-oriented MCP catalog on maps. Optional offset/limit. USE for browser/agent web discovery copy. NEXT: get_llms_mcp_server, get_mcp hub HTML /mcp-hub.","write_action":false,"price_micros":0,"input_schema":{"type":"object","properties":{"offset":{"type":"integer","minimum":0,"default":0,"description":"0-based index into a list or discovery file lines (split on \\n). 0 = first. Omit = 0. Combine with limit to page. Use nextOffset / offset+limit from a previous result when present."},"limit":{"type":"integer","minimum":1,"description":"Maximum items or lines to return after offset. Omit = all remaining in the window (subject to tool-specific clamps). For geo near-search default is often 5 without radius_km, up to 52 with radius."}}}},{"name":"get_llms_txt","description":"WHAT: Alias get_discovery(which=llms) — maps /llms.txt 1:1 with optional offset/limit. USE as the primary maps machine index. NEXT: get_ai_txt, get_sitemap_txt, get_links.","write_action":false,"price_micros":0,"input_schema":{"type":"object","properties":{"offset":{"type":"integer","minimum":0,"default":0,"description":"0-based index into a list or discovery file lines (split on \\n). 0 = first. Omit = 0. Combine with limit to page. Use nextOffset / offset+limit from a previous result when present."},"limit":{"type":"integer","minimum":1,"description":"Maximum items or lines to return after offset. Omit = all remaining in the window (subject to tool-specific clamps). For geo near-search default is often 5 without radius_km, up to 52 with radius."}}}},{"name":"get_nutzungsbedingungen","description":"WHAT: www pointer only — Nutzungsbedingungen on www.ikeytz.com. maps returns html link. DOES NOT return the body. NEXT: www MCP / open html.","write_action":false,"price_micros":0,"input_schema":{"type":"object","properties":{},"additionalProperties":false,"description":"This tool takes no arguments. Call tools/call with arguments: {}. Extra keys are ignored."}},{"name":"get_ort_datetime","description":"WHAT: Europe/Berlin wall clock to the second (stand YYYY-MM-DD HH:MM:SS CEST|CET) for pricing whenKey context. Optional slug|plz|name like get_service_area; omit = all 52 places with the same clock. RETURNS timezone, stand, iso, unix, date, time, tz, and whenKey day|night for www invoicing. USE before quoting via www get_invoice_line_items. DOES NOT return euro amounts (no price matrix on maps). NEXT: www @ikeytz/mcp get_invoice_line_items({situationKey, whenKey}) or get_prices.","write_action":false,"price_micros":0,"input_schema":{"type":"object","properties":{"slug":{"type":"string","description":"URL slug of one of the 52 Einsatzgebiete, e.g. pattonville, bietigheim-bissingen, walheim, gruenbuehl. Matches https://maps.ikeytz.com/{slug}. Lookup order when combined with plz/name: slug first."},"plz":{"type":"string","description":"German postcode (PLZ). Several Gebiete can share one PLZ (e.g. 71638). For single lookup first match wins; use find_by_plz for all matches."},"name":{"type":"string","description":"German place name substring (case-insensitive, umlauts ok), e.g. Grünbühl, Pattonville. Used when slug/plz omitted."}}}},{"name":"get_page_summary","description":"WHAT: Short summary for a maps Gebiet (path/slug → area card) or www pointer for non-maps paths. path required (or slug). USE to decide maps vs www. NEXT: get_ai_page, get_service_area.","write_action":false,"price_micros":0,"input_schema":{"type":"object","properties":{"path":{"type":"string","description":"Required. maps path (/pattonville) or www path for pointer fallback."},"slug":{"type":"string","description":"Alias for path/slug"},"locale":{"type":"string","enum":["de"],"default":"de","description":"maps is German-only (de). Omit or pass de. Other values are ignored; URLs stay https://maps.ikeytz.com/… with no locale prefix. Not a www multi-locale switch — use @ikeytz/mcp list_locales on www for en|fr|ru|fa|ar|tr."}},"required":["path"]}},{"name":"get_partner_info","description":"WHAT: www pointer only — Partner-werden on www. maps returns html. NEXT: www get_partner_info.","write_action":false,"price_micros":0,"input_schema":{"type":"object","properties":{"locale":{"type":"string","enum":["de"],"default":"de","description":"maps is German-only (de). Omit or pass de. Other values are ignored; URLs stay https://maps.ikeytz.com/… with no locale prefix. Not a www multi-locale switch — use @ikeytz/mcp list_locales on www for en|fr|ru|fa|ar|tr."}}}},{"name":"get_prices","description":"WHAT: www pointer only — Festpreis matrix lives on www.ikeytz.com/preise via @ikeytz/mcp get_prices. maps returns html + note, no euro rows. USE to hand off. DOES NOT invent prices. NEXT: www get_prices; maps get_ort_datetime for whenKey.","write_action":false,"price_micros":0,"input_schema":{"type":"object","properties":{"locale":{"type":"string","enum":["de"],"default":"de","description":"maps is German-only (de). Omit or pass de. Other values are ignored; URLs stay https://maps.ikeytz.com/… with no locale prefix. Not a www multi-locale switch — use @ikeytz/mcp list_locales on www for en|fr|ru|fa|ar|tr."}}}},{"name":"get_ratgeber","description":"WHAT: www pointer only — Ratgeber page /ratgeber/{slug}. slug required. maps returns html. NEXT: www get_ratgeber.","write_action":false,"price_micros":0,"input_schema":{"type":"object","properties":{"slug":{"type":"string","description":"Required Ratgeber slug"},"locale":{"type":"string","enum":["de"],"default":"de","description":"maps is German-only (de). Omit or pass de. Other values are ignored; URLs stay https://maps.ikeytz.com/… with no locale prefix. Not a www multi-locale switch — use @ikeytz/mcp list_locales on www for en|fr|ru|fa|ar|tr."}},"required":["slug"]}},{"name":"get_review_url","description":"WHAT: www pointer only — Google review entry on www /review. maps returns html. NEXT: www get_review_url.","write_action":false,"price_micros":0,"input_schema":{"type":"object","properties":{"locale":{"type":"string","enum":["de"],"default":"de","description":"maps is German-only (de). Omit or pass de. Other values are ignored; URLs stay https://maps.ikeytz.com/… with no locale prefix. Not a www multi-locale switch — use @ikeytz/mcp list_locales on www for en|fr|ru|fa|ar|tr."}}}},{"name":"get_serp_snippet","description":"WHAT: One SERP block from maps llms-serp.txt via path, url, slug, or q. RETURNS path, url, matchContext (full block). USE for a single page's SERP copy. DOES NOT invent meta tags. NEXT: get_ai_page or get_page_summary for body.","write_action":false,"price_micros":0,"input_schema":{"type":"object","properties":{"path":{"type":"string","description":"maps path, e.g. /pattonville"},"url":{"type":"string","description":"Full maps URL"},"slug":{"type":"string","description":"Gebiet slug"},"q":{"type":"string","description":"Fallback search string"}}}},{"name":"get_service_area","description":"WHAT: One Einsatzgebiet by slug → plz (first match) → name substring. RETURNS point card + optional Lage texts (h1, kicker, blurb, lage, geschichte) unless compact=true. fields= filters keys. USE when the user names a town/district in Landkreis Ludwigsburg. DOES NOT geocode free addresses outside the 52; unknown → ok=false unknown_place. NEXT: get_lage, get_geschichte, get_grenze, get_embed_map, distance_to_office.","write_action":false,"price_micros":0,"input_schema":{"type":"object","properties":{"slug":{"type":"string","description":"URL slug of one of the 52 Einsatzgebiete, e.g. pattonville, bietigheim-bissingen, walheim, gruenbuehl. Matches https://maps.ikeytz.com/{slug}. Lookup order when combined with plz/name: slug first."},"plz":{"type":"string","description":"German postcode (PLZ). Several Gebiete can share one PLZ (e.g. 71638). For single lookup first match wins; use find_by_plz for all matches."},"name":{"type":"string","description":"German place name substring (case-insensitive, umlauts ok), e.g. Grünbühl, Pattonville. Used when slug/plz omitted."},"locale":{"type":"string","enum":["de"],"default":"de","description":"maps is German-only (de). Omit or pass de. Other values are ignored; URLs stay https://maps.ikeytz.com/… with no locale prefix. Not a www multi-locale switch — use @ikeytz/mcp list_locales on www for en|fr|ru|fa|ar|tr."},"compact":{"type":"boolean","description":"If true, omit h1/kicker/blurb/lage/geschichte — coords + URLs only."},"fields":{"type":"string","description":"Optional field filter: comma-separated names or array. Keeps envelope keys (ok, tool, summary, canonicalUrl, attribution, locale, related, count, total, offset, limit, compact) plus listed fields. Example: slug,name,plz,lat,lng."}}}},{"name":"get_sitemap_txt","description":"WHAT: Alias get_discovery(which=sitemap-txt) — maps /sitemap.txt 1:1 (embed URLs). Optional offset/limit. USE to list public maps URLs. NEXT: resolve_maps_url, get_embed_map.","write_action":false,"price_micros":0,"input_schema":{"type":"object","properties":{"offset":{"type":"integer","minimum":0,"default":0,"description":"0-based index into a list or discovery file lines (split on \\n). 0 = first. Omit = 0. Combine with limit to page. Use nextOffset / offset+limit from a previous result when present."},"limit":{"type":"integer","minimum":1,"description":"Maximum items or lines to return after offset. Omit = all remaining in the window (subject to tool-specific clamps). For geo near-search default is often 5 without radius_km, up to 52 with radius."}}}},{"name":"get_urheberrecht","description":"WHAT: Karten-Urheberrecht text from maps /llms-urheberrecht.txt (HTML page remains www /urheberrecht). Optional offset/limit. USE when citing map copyright (Mahmud Reza Kashani · ikeytz). NEXT: get_copyright, get_legal(doc=urheberrecht).","write_action":false,"price_micros":0,"input_schema":{"type":"object","properties":{"offset":{"type":"integer","minimum":0,"default":0,"description":"0-based index into a list or discovery file lines (split on \\n). 0 = first. Omit = 0. Combine with limit to page. Use nextOffset / offset+limit from a previous result when present."},"limit":{"type":"integer","minimum":1,"description":"Maximum items or lines to return after offset. Omit = all remaining in the window (subject to tool-specific clamps). For geo near-search default is often 5 without radius_km, up to 52 with radius."}}}},{"name":"get_widerruf","description":"WHAT: www pointer only — Widerruf on www.ikeytz.com. maps returns html link. DOES NOT return withdrawal text. NEXT: www MCP.","write_action":false,"price_micros":0,"input_schema":{"type":"object","properties":{},"additionalProperties":false,"description":"This tool takes no arguments. Call tools/call with arguments: {}. Extra keys are ignored."}},{"name":"get_wissen_entry","description":"WHAT: www pointer only — Wissen article /wissen/{id}. id required. maps returns html. NEXT: www get_wissen_entry.","write_action":false,"price_micros":0,"input_schema":{"type":"object","properties":{"id":{"type":"string","description":"Required Wissen entry id"},"locale":{"type":"string","enum":["de"],"default":"de","description":"maps is German-only (de). Omit or pass de. Other values are ignored; URLs stay https://maps.ikeytz.com/… with no locale prefix. Not a www multi-locale switch — use @ikeytz/mcp list_locales on www for en|fr|ru|fa|ar|tr."}},"required":["id"]}},{"name":"list_auswahl","description":"WHAT: www pointer only — Auswahl hub on www /auswahl. maps returns html. NEXT: www list_auswahl / get_auswahl_item.","write_action":false,"price_micros":0,"input_schema":{"type":"object","properties":{"locale":{"type":"string","enum":["de"],"default":"de","description":"maps is German-only (de). Omit or pass de. Other values are ignored; URLs stay https://maps.ikeytz.com/… with no locale prefix. Not a www multi-locale switch — use @ikeytz/mcp list_locales on www for en|fr|ru|fa|ar|tr."}}}},{"name":"list_faq","description":"WHAT: www pointer only — FAQ list on www /faq. maps returns html, not FAQ rows. NEXT: www list_faq / get_faq.","write_action":false,"price_micros":0,"input_schema":{"type":"object","properties":{"locale":{"type":"string","enum":["de"],"default":"de","description":"maps is German-only (de). Omit or pass de. Other values are ignored; URLs stay https://maps.ikeytz.com/… with no locale prefix. Not a www multi-locale switch — use @ikeytz/mcp list_locales on www for en|fr|ru|fa|ar|tr."}}}},{"name":"list_footer","description":"WHAT: maps footer links (Hub, MCP-Hub, MCP, mapsEmail mailto, Urheberrecht, Copyright, Impressum-Kontakt) plus www HTML legal links (no price corpus). RETURNS maps[], html_www[], email, mapsEmail. USE for footer/legal discovery. NEXT: get_legal, compose_mailto.","write_action":false,"price_micros":0,"input_schema":{"type":"object","properties":{"locale":{"type":"string","enum":["de"],"default":"de","description":"maps is German-only (de). Omit or pass de. Other values are ignored; URLs stay https://maps.ikeytz.com/… with no locale prefix. Not a www multi-locale switch — use @ikeytz/mcp list_locales on www for en|fr|ru|fa|ar|tr."}}}},{"name":"list_locales","description":"WHAT: Locales on maps — only de (MAPS-E8: no /en). Call with {}. RETURNS items[{locale,url}]. USE before resolve_locale_url. DOES NOT list www's seven locales — use @ikeytz/mcp list_locales for those.","write_action":false,"price_micros":0,"input_schema":{"type":"object","properties":{},"additionalProperties":false,"description":"This tool takes no arguments. Call tools/call with arguments: {}. Extra keys are ignored."}},{"name":"list_nav","description":"WHAT: maps navigation links — Hub, MCP, Urheberrecht, plus all 52 Gebiet URLs. USE to pick a maps page. DOES NOT include www header hubs (Preise/FAQ). NEXT: get_embed_map, get_page_summary.","write_action":false,"price_micros":0,"input_schema":{"type":"object","properties":{"locale":{"type":"string","enum":["de"],"default":"de","description":"maps is German-only (de). Omit or pass de. Other values are ignored; URLs stay https://maps.ikeytz.com/… with no locale prefix. Not a www multi-locale switch — use @ikeytz/mcp list_locales on www for en|fr|ru|fa|ar|tr."}}}},{"name":"list_plz","description":"WHAT: PLZ → slugs map for the 52 Gebiete (shared postcodes visible). Call with {}. RETURNS items[{plz,count,slugs}]. USE to see multi-Gebiet PLZ. NEXT: find_by_plz.","write_action":false,"price_micros":0,"input_schema":{"type":"object","properties":{},"additionalProperties":false,"description":"This tool takes no arguments. Call tools/call with arguments: {}. Extra keys are ignored."}},{"name":"list_ratgeber","description":"WHAT: www pointer only — Ratgeber list on www /ratgeber. maps returns html. NEXT: www list_ratgeber.","write_action":false,"price_micros":0,"input_schema":{"type":"object","properties":{"locale":{"type":"string","enum":["de"],"default":"de","description":"maps is German-only (de). Omit or pass de. Other values are ignored; URLs stay https://maps.ikeytz.com/… with no locale prefix. Not a www multi-locale switch — use @ikeytz/mcp list_locales on www for en|fr|ru|fa|ar|tr."}}}},{"name":"list_service_areas","description":"WHAT: List all 52 ikeytz Einsatzgebiete on maps.ikeytz.com as point cards (slug, name, plz, lat/lng, embed_map, geo_api) — not polygons. RETURNS items[], count, total, offset, limit. Optional fields= comma filter; limit/offset page the list. USE to enumerate the service area or build a picker. DOES NOT return OSM boundaries (use get_grenze per slug) or prices. NEXT: get_service_area, get_embed_map, get_grenze, find_by_plz.","write_action":false,"price_micros":0,"input_schema":{"type":"object","properties":{"locale":{"type":"string","enum":["de"],"default":"de","description":"maps is German-only (de). Omit or pass de. Other values are ignored; URLs stay https://maps.ikeytz.com/… with no locale prefix. Not a www multi-locale switch — use @ikeytz/mcp list_locales on www for en|fr|ru|fa|ar|tr."},"limit":{"type":"integer","minimum":1,"description":"Maximum items or lines to return after offset. Omit = all remaining in the window (subject to tool-specific clamps). For geo near-search default is often 5 without radius_km, up to 52 with radius."},"offset":{"type":"integer","minimum":0,"default":0,"description":"0-based index into a list or discovery file lines (split on \\n). 0 = first. Omit = 0. Combine with limit to page. Use nextOffset / offset+limit from a previous result when present."},"fields":{"type":"string","description":"Optional field filter: comma-separated names or array. Keeps envelope keys (ok, tool, summary, canonicalUrl, attribution, locale, related, count, total, offset, limit, compact) plus listed fields. Example: slug,name,plz,lat,lng."}}}},{"name":"list_services","description":"WHAT: www pointer only — Leistungen list on www /leistungen. maps returns html link. DOES NOT list service rows. NEXT: www list_services.","write_action":false,"price_micros":0,"input_schema":{"type":"object","properties":{"locale":{"type":"string","enum":["de"],"default":"de","description":"maps is German-only (de). Omit or pass de. Other values are ignored; URLs stay https://maps.ikeytz.com/… with no locale prefix. Not a www multi-locale switch — use @ikeytz/mcp list_locales on www for en|fr|ru|fa|ar|tr."}}}},{"name":"list_slugs","description":"WHAT: All 52 maps slugs as a flat string array. Call with {}. USE for validation or autocomplete. NEXT: get_service_area(slug), get_embed_map(slug).","write_action":false,"price_micros":0,"input_schema":{"type":"object","properties":{},"additionalProperties":false,"description":"This tool takes no arguments. Call tools/call with arguments: {}. Extra keys are ignored."}},{"name":"list_whatsapp_options","description":"WHAT: WhatsApp situation options (link only — zugefallen/abgeschlossen/zylinder/beratung style ids). No form submit. USE before compose_whatsapp. DOES NOT send a message. NEXT: compose_whatsapp(option), compose_tel_mobile.","write_action":false,"price_micros":0,"input_schema":{"type":"object","properties":{"locale":{"type":"string","enum":["de"],"default":"de","description":"maps is German-only (de). Omit or pass de. Other values are ignored; URLs stay https://maps.ikeytz.com/… with no locale prefix. Not a www multi-locale switch — use @ikeytz/mcp list_locales on www for en|fr|ru|fa|ar|tr."}}}},{"name":"list_wissen","description":"WHAT: www pointer only — Wissen lexicon hub on www /wissen. maps returns html. NEXT: www list_wissen.","write_action":false,"price_micros":0,"input_schema":{"type":"object","properties":{"locale":{"type":"string","enum":["de"],"default":"de","description":"maps is German-only (de). Omit or pass de. Other values are ignored; URLs stay https://maps.ikeytz.com/… with no locale prefix. Not a www multi-locale switch — use @ikeytz/mcp list_locales on www for en|fr|ru|fa|ar|tr."}}}},{"name":"resolve_locale_url","description":"WHAT: path + locale → maps URL. maps is de-only: non-de requested still yields https://maps.ikeytz.com{path} with locale=de. Known Gebiet paths resolve to maps; unknown paths may www-pointer. REQUIRED path and locale. DOES NOT create /en on maps. NEXT: get_embed_map, www resolve_locale_url for marketing locales.","write_action":false,"price_micros":0,"input_schema":{"type":"object","properties":{"path":{"type":"string","description":"Required. Path starting with / (e.g. /pattonville) or a maps URL."},"locale":{"type":"string","description":"Required. Only de is meaningful on maps; others ignored with a note."}},"required":["path","locale"]}},{"name":"resolve_maps_url","description":"WHAT: Resolve a maps.ikeytz.com url/path/q to hub or Gebiet. RETURNS kind=hub|ort + area fields when ort. USE to normalize pasted maps links. DOES NOT accept www hosts (not_maps_host). NEXT: get_service_area, get_embed_map.","write_action":false,"price_micros":0,"input_schema":{"type":"object","properties":{"url":{"type":"string","description":"Full https://maps.ikeytz.com/… URL"},"path":{"type":"string","description":"Path e.g. /pattonville"},"q":{"type":"string","description":"URL or path alias"}}}},{"name":"site_overview","description":"WHO/WHAT: What maps.ikeytz.com is — 52 Einsatzgebiet maps for Schlüsseldienst Ludwigsburg ikeytz, not the www price site. RETURNS brand, owner, count, mcp, registry, walkIn=false, sister www MCP note. USE as the maps brand card. DOES NOT quote euro. NEXT: get_business_identity, list_service_areas, get_links.","write_action":false,"price_micros":0,"input_schema":{"type":"object","properties":{"locale":{"type":"string","enum":["de"],"default":"de","description":"maps is German-only (de). Omit or pass de. Other values are ignored; URLs stay https://maps.ikeytz.com/… with no locale prefix. Not a www multi-locale switch — use @ikeytz/mcp list_locales on www for en|fr|ru|fa|ar|tr."}}}}],"scan":{"score":77,"grade":"B","scanned_at":"2026-09-20T16:19:09.446Z","report":{"scannerVersion":"0.1.9","scannedAt":"2026-09-20T16:19:09.382Z","components":{"code":{"score":25,"max":25,"notes":["6 source files scanned"]},"reliability":{"score":20,"max":20,"notes":["remote reachable in 1900ms"]},"poisoning":{"score":15,"max":15,"notes":["67 tool descriptions checked"]},"auth":{"score":10,"max":15,"notes":["open endpoint, read-only tools"]},"maintenance":{"score":3,"max":15,"notes":["no repository listed"]},"identity":{"score":4,"max":10,"notes":["verified namespace with website, no repo"]}},"findings":[{"id":"maint.no-repo","severity":"low","component":"maintenance","title":"No source repository listed"}],"inputs":{"probes":[{"url":"https://maps.ikeytz.com/mcp","reachable":true,"authRequired":false,"latencyMs":1900,"serverInfo":{"name":"ikeytz-maps","version":"1.0.0"}}],"packages":[{"registryType":"npm","identifier":"@ikeytz/maps-mcp","version":"1.0.18","found":true,"license":"LicenseRef-ikeytz-terms","hasInstallScripts":false,"dependencyCount":0,"publishedAt":"2026-09-03T05:13:05.470Z","weeklyDownloads":106}],"repo":{"found":false},"icon":{"url":"https://maps.ikeytz.com/icon.svg","source":"site"},"presence":{"stars":null,"forks":null,"downloadsWeek":106,"license":"LicenseRef-ikeytz-terms","lastPushAt":null,"score":18}}}},"grade_history":[],"reviews":[]}