ikeytz - Schlüsseldienst Ludwigsburg
by ikeytz.com · remote · local (npm) · no sign-in to list tools · v1.0.20 · published by com.ikeytz
Read/Link MCP for Schlüsseldienst Ludwigsburg ikeytz. Public read-only. ai-train=no.
47 tools: 5 change things and 42 only read.
Scanned Oct 21, 2026
- Deletes or cancels0Claude Code: deny
- Can't be undone0Claude Code: ask
- Changes things5Claude Code: ask: see these tools
- Only reads42Claude Code: allow: see these tools
No check matched anything in the tool definitions. No finding is not a safety guarantee. How the checks work.
claude mcp add --transport http website https://www.ikeytz.com/mcpTools
Open a tool for its reasons and full description. Descriptions are the publisher's own words, shown as they are.
47 tools
Changes things 5Claude Code: ask
compose_mailtoWHAT: mailto:info@ikeytz.com with the SAME prefab as compose_whatsapp (subject+body).No findings
Why it is in this group
- Nothing in its name or description says what it does, so it is counted as a write.
- The server marks it read-only (readOnlyHint: true), but an annotation never lowers a class.
Description, as the server wrote it 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).
Annotations the server declares
- title: Compose Mailto
- readOnlyHint: true
compose_tel_landlineWHAT: tel: href for the landline (Festnetz).No findings
Why it is in this group
- Nothing in its name or description says what it does, so it is counted as a write.
- The server marks it read-only (readOnlyHint: true), but an annotation never lowers a class.
Description, as the server wrote it WHAT: tel: href for the landline (Festnetz). Call with {}. Mobile/24h emergency = compose_tel_mobile.
Annotations the server declares
- title: Compose Tel Landline
- readOnlyHint: true
compose_tel_mobileWHAT: tel: href for the 24/7 mobile (Handy).No findings
Why it is in this group
- Nothing in its name or description says what it does, so it is counted as a write.
- The server marks it read-only (readOnlyHint: true), but an annotation never lowers a class.
Description, as the server wrote it 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.
Annotations the server declares
- title: Compose Tel Mobile
- readOnlyHint: true
compose_whatsappWHAT: Build a https://wa.me/… URL with one prefab = one end-invoice (or mount 49 / beratung).No findings
Why it is in this group
- Nothing in its name or description says what it does, so it is counted as a write.
- The server marks it read-only (readOnlyHint: true), but an annotation never lowers a class.
Description, as the server wrote it 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.
Annotations the server declares
- title: Compose Whatsapp
- readOnlyHint: true
site_overviewWHO/WHAT: Public brand card for Schlüsseldienst Ludwigsburg ikeytz (mobile locksmith, Landkreis Ludwigsburg, Baden-Württemberg, Germany).No findings
Why it is in this group
- Nothing in its name or description says what it does, so it is counted as a write.
- The server marks it read-only (readOnlyHint: true), but an annotation never lowers a class.
Description, as the server wrote it 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).
Annotations the server declares
- title: Site Overview
- readOnlyHint: true
Only reads 42Claude Code: allow
find_by_keywordWHAT: Substring search (case-insensitive) over https://www.ikeytz.com/llms-keywords.txt (phrase → URL map).No findings
Why it is in this group
- The name "find_by_keyword" says "find": a word for reading.
Description, as the server wrote it 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.
Annotations the server declares
- title: Find By Keyword
- readOnlyHint: true
get_aboutWHAT: Pointer to /ueber-uns (about, owner).No findings
Why it is in this group
- The name "get_about" says "get": a word for reading.
Description, as the server wrote it WHAT: Pointer to /ueber-uns (about, owner). For NAP facts prefer get_business_identity. NEXT: get_ai_page({path:'/ueber-uns'}).
Annotations the server declares
- title: Get About
- readOnlyHint: true
get_ai_pageWHAT: Fetches public https://www.ikeytz.com/ai-pages/{locale}/{file}.txt (HTML-parity fulltext for one marketing URL).No findings
Why it is in this group
- The name "get_ai_page" says "get": a word for reading.
Description, as the server wrote it WHAT: Fetches public https://www.ikeytz.com/ai-pages/{locale}/{file}.txt (HTML-parity fulltext for one marketing URL). path=/ → index.txt; else path without leading slash + .txt. summary = first 4000 chars; truncated=true if longer. USE for page body text — not site-wide crawl/train policy (that is get_ai_txt on /.well-known/ai.txt). Not get_serp_snippet (title/description only). /review has no HTML-parity footer. NEXT: get_serp_snippet for meta only; get_ai_txt for ai-train=no policy.
Annotations the server declares
- title: Get Ai Page
- readOnlyHint: true
get_ai_txtWHAT: Fetch /.well-known/ai.txt — site-wide crawl/training policy (ai-input yes with attribution, ai-train=no, contact).No findings
Why it is in this group
- The name "get_ai_txt" says "get": a word for reading.
Description, as the server wrote it WHAT: Fetch /.well-known/ai.txt — site-wide crawl/training policy (ai-input yes with attribution, ai-train=no, contact). USE for policy before quoting. Prefer this over get_ai_page (per-URL ai-pages fulltext) and over get_discovery unless you need a generic file window. Optional offset/limit page large files — see parameters / nextOffset in schema. DOES NOT return page bodies.
Annotations the server declares
- title: Get Ai Txt
- readOnlyHint: true
get_auswahl_itemWHAT: One Auswahl situation page.No findings
Why it is in this group
- The name "get_auswahl_item" says "get": a word for reading.
Description, as the server wrote it 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.
Annotations the server declares
- title: Get Auswahl Item
- readOnlyHint: true
get_business_identityWHO: Legal/trade identity and NAP for agents and citations.No findings
Why it is in this group
- The name "get_business_identity" says "get": a word for reading.
Description, as the server wrote it 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.
Annotations the server declares
- title: Get Business Identity
- readOnlyHint: true
get_contactWHAT: Public phones, fax, email, office address object.No findings
Why it is in this group
- The name "get_contact" says "get": a word for reading.
Description, as the server wrote it 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.
Annotations the server declares
- title: Get Contact
- readOnlyHint: true
get_discoveryWHAT: Fetch one public discovery file from www and return a line window.No findings
Why it is in this group
- The name "get_discovery" says "get": a word for reading.
Description, as the server wrote it 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-keywords-brand, llms-serp, llms-jsonld, llms-impressum-kontakt, llms-orte-geo, llms-grenzen-koordinaten, llms-urheberrecht, llms-copyright, llms-mcp-server, llms-mcp-web, robots, sitemap-txt, sitemap-xml, ai-txt, ai-plugin, answer-engine, ard, ai-catalog, auth-md, mcp-readme, agent-skills (+ locale slices llms-keywords-en|… ). summary = the line window + trailing # MCP-META (truncated, totalUrls, nextOffset). Omit limit: if remaining >~30KB → first ~30KB window + nextOffset (O9); explicit limit keeps line window 1..10000 (not forced to 30KB). Unknown which → unknown_discovery. Prefer dedicated get_llms_* / get_sitemap_txt when you know the file. Policy files say ai-train=no.
Annotations the server declares
- title: Get Discovery
- readOnlyHint: true
get_emergencyWHAT: Returns the 24h Notfall-Türöffnung page pointer (summary includes mobile; canonicalUrl = /notfall-tueroeffnung, locale-prefixed).No findings
Why it is in this group
- The name "get_emergency" says "get": a word for reading.
Description, as the server wrote it WHAT: Returns the 24h Notfall-Türöffnung page pointer (summary includes mobile; canonicalUrl = /notfall-tueroeffnung, locale-prefixed). USE when the user needs emergency door-opening contact on www. Prefer get_contact for general NAP; prefer compose_tel_mobile to dial. DOES NOT dispatch a technician or take a booking. NEXT: list_whatsapp_options then compose_whatsapp with a contactOption when chat is better.
Annotations the server declares
- title: Get Emergency
- readOnlyHint: true
get_faqWHAT: One FAQ Q+A (Ausweis, MwSt, 24h, Nachtpreis-Regel…).No findings
Why it is in this group
- The name "get_faq" says "get": a word for reading.
Description, as the server wrote it 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.
Annotations the server declares
- title: Get Faq
- readOnlyHint: true
get_geo_officeWHAT: Firmensitz / registered office once (SITE.geo = Adalbert-Stifter-Str.No findings
Why it is in this group
- The name "get_geo_office" says "get": a word for reading.
Description, as the server wrote it 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.
Annotations the server declares
- title: Get Geo Office
- readOnlyHint: true
get_invoice_line_itemsWHAT: Computes ONE of the 10 end-invoices (or the 49 € mount add-on).No findings
Why it is in this group
- The name "get_invoice_line_items" says "get": a word for reading.
Description, as the server wrote it 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.
Annotations the server declares
- title: Get Invoice Line Items
- readOnlyHint: true
get_itWHAT: HTML page /it — two MCP machines documented.No findings
Why it is in this group
- The name "get_it" says "get": a word for reading.
Description, as the server wrote 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.
Annotations the server declares
- title: Get It
- readOnlyHint: true
get_legalWHAT: Pointer to one legal HTML page.No findings
Why it is in this group
- The name "get_legal" says "get": a word for reading.
Description, as the server wrote it 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.
Annotations the server declares
- title: Get Legal
- readOnlyHint: true
get_linksWHAT: Pointer to /links — local directories, city sites, HWK, Webmail shortcut.No findings
Why it is in this group
- The name "get_links" says "get": a word for reading.
Description, as the server wrote it WHAT: Pointer to /links — local directories, city sites, HWK, Webmail shortcut. USE for human directory/backlink list. Prefer get_mcp_hub (or get_it) for MCP machine catalogs (npm, official registry, Glama, Smithery, mcpbeat) — those are publicLinks, not this page. DOES NOT list MCP tools. NEXT: get_mcp_hub for discovery URLs; open /links for the HTML list.
Annotations the server declares
- title: Get Links
- readOnlyHint: true
get_llms_jsonldWHAT: Fetch /llms-jsonld.txt — map every marketing HTML URL to JSON-LD relatedLink (ai-pages fulltext) + mirrorId + optional geo_api/geo_grenze/geo_punkt (maps Embed-API).No findings
Why it is in this group
- The name "get_llms_jsonld" says "get": a word for reading.
Description, as the server wrote it WHAT: Fetch /llms-jsonld.txt — map every marketing HTML URL to JSON-LD relatedLink (ai-pages fulltext) + mirrorId + optional geo_api/geo_grenze/geo_punkt (maps Embed-API). Format: pageUrl TAB relatedLink TAB mirrorId TAB geo_api TAB geo_grenze TAB geo_punkt. Ort = one URL each; PLZ = pipe-separated URLs per Ort of that PLZ (L-30). Same engine as get_sitemap_txt (offset/limit/nextOffset/# MCP-META). Not the page body (use get_ai_page). Not get_serp_snippet. Geo columns empty for Hub/Legal/non-ort.
Annotations the server declares
- title: Get Llms Jsonld
- readOnlyHint: true
get_llms_mcp_serverWHAT: Fetch /llms-mcp-server.txt — prose catalog of THIS HTTP server (47 Read/Link tools, how to call, no login).No findings
Why it is in this group
- The name "get_llms_mcp_server" says "get": a word for reading.
Description, as the server wrote it 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). USE for machine/server catalog text. Prefer get_llms_mcp_web for browser WebMCP catalog; prefer get_llms_txt for the general site index. Not the npm CLI README. Not maps.
Annotations the server declares
- title: Get Llms Mcp Server
- readOnlyHint: true
get_llms_mcp_webWHAT: Fetch /llms-mcp-web.txt — browser WebMCP catalog (early bootstrap tools + full list).No findings
Why it is in this group
- The name "get_llms_mcp_web" says "get": a word for reading.
Description, as the server wrote it WHAT: Fetch /llms-mcp-web.txt — browser WebMCP catalog (early bootstrap tools + full list). Same executeMcpTool handlers as HTTP /mcp, different transport (document.modelContext). USE for WebMCP/UI discovery copy. Prefer get_llms_mcp_server for the machine/server catalog text; prefer get_llms_txt for the general site llms index. Optional offset/limit — see schema. Not this streamable-http endpoint itself.
Annotations the server declares
- title: Get Llms Mcp Web
- readOnlyHint: true
get_llms_serp_txtWHAT: Returns /llms-serp.txt — the full SERP title/description/URL corpus as a line window (alias of get_discovery(which=llms-serp)).No findings
Why it is in this group
- The name "get_llms_serp_txt" says "get": a word for reading.
Description, as the server wrote it WHAT: Returns /llms-serp.txt — the full SERP title/description/URL corpus as a line window (alias of get_discovery(which=llms-serp)). Optional offset/limit; omit limit only if you need the whole file. USE for bulk SERP meta. Prefer get_serp_snippet for one URL's SERP block; prefer get_llms_txt for the general site index.
Annotations the server declares
- title: Get Llms Serp Txt
- readOnlyHint: true
get_llms_txtWHAT: Fetch https://www.ikeytz.com/llms.txt (short AI landmap).No findings
Why it is in this group
- The name "get_llms_txt" says "get": a word for reading.
Description, as the server wrote it 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.
Annotations the server declares
- title: Get Llms Txt
- readOnlyHint: true
get_mcp_hubWHAT: HTML hub /mcp-hub ×7 (de has no prefix).No findings
Why it is in this group
- The name "get_mcp_hub" says "get": a word for reading.
Description, as the server wrote it 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.
Annotations the server declares
- title: Get Mcp Hub
- readOnlyHint: true
get_ort_datetimeWHAT: Europe/Berlin wall clock to the second + whenKey for prices.No findings
Why it is in this group
- The name "get_ort_datetime" says "get": a word for reading.
Description, as the server wrote it 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.
Annotations the server declares
- title: Get Ort Datetime
- readOnlyHint: true
get_page_summaryWHAT: Stub pointer only — NOT the page body.No findings
Why it is in this group
- The name "get_page_summary" says "get": a word for reading.
Description, as the server wrote it 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 /).
Annotations the server declares
- title: Get Page Summary
- readOnlyHint: true
get_partner_infoWHAT: Partner-werden page facts.No findings
Why it is in this group
- The name "get_partner_info" says "get": a word for reading.
Description, as the server wrote it WHAT: Partner-werden page facts. USE when the user asks about becoming a partner / Partner-werden (not general contact — that is get_contact). RETURNS partnerEmail for mailto; formSubmit=false — never claim the form was sent. DOES NOT submit the partner form. NEXT: compose_mailto with partnerEmail, or open /partner-werden.
Annotations the server declares
- title: Get Partner Info
- readOnlyHint: true
get_pricesWHAT: Official Festpreis matrix + composition SYSTEM.No findings
Why it is in this group
- The name "get_prices" says "get": a word for reading.
Description, as the server wrote it 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).
Annotations the server declares
- title: Get Prices
- readOnlyHint: true
get_ratgeberWHAT: Returns one Ratgeber page pointer (canonicalUrl /ratgeber/{slug}).No findings
Why it is in this group
- The name "get_ratgeber" says "get": a word for reading.
Description, as the server wrote it WHAT: Returns one Ratgeber page pointer (canonicalUrl /ratgeber/{slug}). REQUIRED slug from list_ratgeber. USE when the slug is already known. Prefer list_ratgeber when the slug is unknown. Unknown slug → unknown_ratgeber (+ hub URL). NEXT: get_ai_page({path:'/ratgeber/'+slug}) for fulltext. DOES NOT return the article body here.
Annotations the server declares
- title: Get Ratgeber
- readOnlyHint: true
get_review_urlWHAT: Short /review redirect to the Google review URL.No findings
Why it is in this group
- The name "get_review_url" says "get": a word for reading.
Description, as the server wrote it 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.
Annotations the server declares
- title: Get Review Url
- readOnlyHint: true
get_serp_snippetWHAT: SERP title/description/URL slice for one marketing URL.No findings
Why it is in this group
- The name "get_serp_snippet" says "get": a word for reading.
Description, as the server wrote it WHAT: SERP title/description/URL slice for one marketing URL. Reads /llms-serp-{locale}.txt first (locale from URL prefix or args.locale), then falls back to full /llms-serp.txt. 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) + source. Not a Google API.
Annotations the server declares
- title: Get Serp Snippet
- readOnlyHint: true
get_service_areaWHAT: One service-area place.No findings
Why it is in this group
- The name "get_service_area" says "get": a word for reading.
Description, as the server wrote it 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}.
Annotations the server declares
- title: Get Service Area
- readOnlyHint: true
get_sitemap_txtWHAT: Fetch /sitemap.txt — KI-Volliste (HTML ×7 Locales + Discovery + Medien + /review).No findings
Why it is in this group
- The name "get_sitemap_txt" says "get": a word for reading.
Description, as the server wrote it WHAT: Fetch /sitemap.txt — KI-Volliste (HTML ×7 Locales + Discovery + Medien + /review). Nicht dieselbe Menge wie sitemap.xml (XML = nur HTML + Brand-Medien, ohne Discovery/Redirect). URL-Anzahl: siehe # MCP-META totalUrls (nicht fest tippen); 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.
Annotations the server declares
- title: Get Sitemap Txt
- readOnlyHint: true
get_wissen_entryWHAT: One Wissen article.No findings
Why it is in this group
- The name "get_wissen_entry" says "get": a word for reading.
Description, as the server wrote it 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.
Annotations the server declares
- title: Get Wissen Entry
- readOnlyHint: true
list_auswahlWHAT: Auswahl hub groups (situation chooser on /auswahl).No findings
Why it is in this group
- The name "list_auswahl" says "list": a word for reading.
Description, as the server wrote it 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.
Annotations the server declares
- title: List Auswahl
- readOnlyHint: true
list_faqWHAT: FAQ question list (id + question, no answers).No findings
Why it is in this group
- The name "list_faq" says "list": a word for reading.
Description, as the server wrote it 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}).
Annotations the server declares
- title: List Faq
- readOnlyHint: true
list_localesWHAT: The seven public HTML locales.No findings
Why it is in this group
- The name "list_locales" says "list": a word for reading.
Description, as the server wrote it 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 {}.
Annotations the server declares
- title: List Locales
- readOnlyHint: true
list_ratgeberWHAT: All Ratgeber slugs and locale URLs /ratgeber/{slug}.No findings
Why it is in this group
- The name "list_ratgeber" says "list": a word for reading.
Description, as the server wrote it WHAT: All Ratgeber slugs and locale URLs /ratgeber/{slug}. USE get_ratgeber({slug}) then get_ai_page for fulltext.
Annotations the server declares
- title: List Ratgeber
- readOnlyHint: true
list_service_areasWHAT: All 52 service-area places (orte SSOT).No findings
Why it is in this group
- The name "list_service_areas" says "list": a word for reading.
Description, as the server wrote it 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 geo lookup by coordinates (not this server).
Annotations the server declares
- title: List Service Areas
- readOnlyHint: true
list_servicesWHAT: Core service list from SITE.services (Türöffnung, Notdienst, Sicherheitstechnik, Schlosswechsel, …) with locale /leistungen#anchor URLs.No findings
Why it is in this group
- The name "list_services" says "list": a word for reading.
Description, as the server wrote it 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.
Annotations the server declares
- title: List Services
- readOnlyHint: true
list_whatsapp_optionsWHAT: Prefab WhatsApp AND mailto deep links (no send).No findings
Why it is in this group
- The name "list_whatsapp_options" says "list": a word for reading.
Description, as the server wrote it 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.
Annotations the server declares
- title: List Whatsapp Options
- readOnlyHint: true
list_wissenWHAT: Returns the Wissen lexicon index (id, title, url with #id).No findings
Why it is in this group
- The name "list_wissen" says "list": a word for reading.
Description, as the server wrote it WHAT: Returns the Wissen lexicon index (id, title, url with #id). USE when you need the index of articles. Prefer get_wissen_entry({id}) for a body snippet; prefer get_ai_page({path:'/wissen'}) or the hash URL for the full article. DOES NOT return full article bodies.
Annotations the server declares
- title: List Wissen
- readOnlyHint: true
resolve_locale_urlWHAT: Rewrite one marketing path into another locale without fetching HTML.No findings
Why it is in this group
- The name "resolve_locale_url" says "resolve": a word for reading.
Description, as the server wrote it 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}).
Annotations the server declares
- title: Resolve Locale Url
- readOnlyHint: true
This is not a safety rating, and no finding is not a safety guarantee. The groups and findings come from fixed checks of the tool definitions the server returned on the date shown, not from its code or what it does when called. How the checks work.
Install
Pinned to version 1.0.20. Values in angle brackets are yours to fill in.
claude mcp add --transport http website https://www.ikeytz.com/mcpRun in a terminal.
Claude Code permissions
Allow the reads, ask before a change, deny the deletes. Paste into .claude/settings.json.
{
"permissions": {
"allow": [
"mcp__website__get_business_identity",
"mcp__website__list_nav",
"mcp__website__list_footer",
"mcp__website__list_locales",
"mcp__website__resolve_locale_url",
"mcp__website__get_prices",
"mcp__website__get_ort_datetime",
"mcp__website__get_invoice_line_items",
"mcp__website__list_services",
"mcp__website__get_emergency",
"mcp__website__list_auswahl",
"mcp__website__get_auswahl_item",
"mcp__website__list_service_areas",
"mcp__website__get_service_area",
"mcp__website__get_geo_office",
"mcp__website__get_contact",
"mcp__website__get_legal",
"mcp__website__get_about",
"mcp__website__get_partner_info",
"mcp__website__get_links",
"mcp__website__get_it",
"mcp__website__get_mcp_hub",
"mcp__website__get_review_url",
"mcp__website__list_faq",
"mcp__website__get_faq",
"mcp__website__list_wissen",
"mcp__website__get_wissen_entry",
"mcp__website__list_ratgeber",
"mcp__website__get_ratgeber",
"mcp__website__get_page_summary",
"mcp__website__get_ai_page",
"mcp__website__get_serp_snippet",
"mcp__website__find_by_keyword",
"mcp__website__get_discovery",
"mcp__website__get_llms_txt",
"mcp__website__get_llms_jsonld",
"mcp__website__get_llms_serp_txt",
"mcp__website__get_llms_mcp_server",
"mcp__website__get_llms_mcp_web",
"mcp__website__get_ai_txt",
"mcp__website__get_sitemap_txt",
"mcp__website__list_whatsapp_options"
],
"ask": [
"mcp__website__site_overview",
"mcp__website__compose_tel_mobile",
"mcp__website__compose_tel_landline",
"mcp__website__compose_whatsapp",
"mcp__website__compose_mailto"
],
"deny": []
}
}Tools that only read are allowed, tools that change things ask first, tools that delete or cancel are denied. It assumes the server is installed as website. Review it before you use it.