Siteguide

io.github.CloudCorpRecords由 GitHub 帳號 CloudCorpRecords 發布v0.1.0更新於 Nov 4, 2026

Read and link the ikeytz locksmith website content: services, prices, areas, FAQ and guides.

概覽

AI 產生的概覽

一個唯讀轉送用戶端,讓助理讀取路德維希堡一家開鎖公司的公開網站內容:服務、固定價格、服務區域、常見問題與指南。

可以做什麼
  • 查詢商家身分、聯絡方式、法律頁面、導覽、語言版本與登記辦公地址
  • 讀取固定價格表、柏林時間計價規則,以及針對某次開鎖計算出的帳單明細
  • 瀏覽服務清單、緊急開鎖資訊、情境頁面,以及 52 個服務地點與其座標
  • 檢索並閱讀常見問題、知識文章、指南、關鍵字與搜尋摘要片段,以及網站探索檔案
  • 依公開聯絡資料產生電話、WhatsApp 與郵件連結
適用情境
當使用者詢問這家特定開鎖公司時適用,例如它是什麼、開一次門多少錢、某地是否在服務範圍內、如何聯絡,並希望答案來自網站本身公布的資料而非擷取網頁。
執行需求
透過 npx 或 Docker 以 stdio 在本機執行。需要能連線上游 streamable-HTTP 端點,預設指向該網站自身的 MCP 位址;可用環境變數 IKEYTZ_WEBSITE_MCP_URL 改為其他端點。不需帳號或 API 金鑰。
安裝前請注意
每次工具呼叫都會轉送到第三方網站端點,查詢內容與參數會離開本機。價格與帳單工具只做計算,不會預約或派工;聯絡表單與合作表單不會被送出。若設定端點覆寫,流量會送往所指定的任何主機。

安裝

在 SourceWeft 中

  1. 開啟 儀表板中的 Siteguide,將其新增到工作區。
  2. 為需要使用其工具的對話啟用該服務。

Desktop only,透過 STDIO。 STDIO 服務會啟動本機處理程序,因此需要 SourceWeft 桌面主機。

其他 MCP 客戶端

參照 儲存庫 中的啟動說明。

README

siteguide

A forwarding client for the ikeytz website read/link service — the public, read-only service behind a Ludwigsburg locksmith's main website. It covers services, fixed prices, service areas, FAQ entries, knowledge articles and guides, discovery files, and link composers for that site.

siteguide contains no website logic of its own. It serves tools/list locally from a verbatim capture of the upstream server's 47 tools (name, title, description and inputSchema; the capture's outputSchema fields and annotations are not reproduced), and forwards every tools/call to the upstream endpoint. Upstream results pass through unchanged; a failed hop comes back as a siteguide error: ... text result with isError set.

Upstream

  • Default endpoint: https://www.ikeytz.com/mcp
  • Override: set IKEYTZ_WEBSITE_MCP_URL to another streamable-HTTP MCP endpoint. (The override is a reconstruction; the default endpoint is the pinned one.)
  • No account and no API key are needed.
  • The forwarding hop runs initialize (protocolVersion 2025-03-26, clientInfo siteguide / 0.1.0), then notifications/initialized, then tools/call, and honours an Mcp-Session-Id header when the upstream issues one. Replies may be plain JSON or server-sent events.

CLI usage

bash
npx @reneturcios/siteguide get_service_area '{"slug":"pattonville"}'npx @reneturcios/siteguide site_overview '{}'npx @reneturcios/siteguide --version

Each tool subcommand takes a single JSON argument string, forwards the call and prints the result as JSON. Exit codes: 0 success, 1 a forwarded-call error, 2 usage error.

MCP usage

bash
npx @reneturcios/siteguide mcp

MCP client config:

json
{  "mcpServers": {    "siteguide": {      "command": "npx",      "args": ["-y", "@reneturcios/siteguide", "mcp"]    }  }}

Unknown tool names, and arguments that are not a JSON object, are rejected locally with InvalidParams before any network hop.

Docker

bash
docker run -i ghcr.io/cloudcorprecords/siteguide          # stdio MCP server (CMD defaults to "mcp")docker run --rm ghcr.io/cloudcorprecords/siteguide get_service_area '{"slug":"pattonville"}'

Tools (47)

site_overview, get_business_identity, list_nav, list_footer, list_locales, resolve_locale_url, get_prices, get_ort_datetime, get_invoice_line_items, list_services, get_emergency, list_auswahl, get_auswahl_item, list_service_areas, get_service_area, get_geo_office, get_contact, get_legal, get_about, get_partner_info, get_links, get_it, get_mcp_hub, get_review_url, list_faq, get_faq, list_wissen, get_wissen_entry, list_ratgeber, get_ratgeber, get_page_summary, get_ai_page, get_serp_snippet, find_by_keyword, get_discovery, get_llms_txt, get_llms_jsonld, get_llms_serp_txt, get_llms_mcp_server, get_llms_mcp_web, get_ai_txt, get_sitemap_txt, list_whatsapp_options, compose_tel_mobile, compose_tel_landline, compose_whatsapp, compose_mailto.

Development

bash
npm installnpm run build   # tsc -> dist/ (dist/cli.js is the bin)npm test        # tsx --test test/*.test.ts (fake fetch only, no network)npm run dev     # tsx src/cli.ts

License

MIT — Copyright (c) 2026 Rene Turcios.

來源:README.md,提交 eb7c164

工具

47

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

輸入參數locale

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.

輸入參數locale

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.

輸入參數locale

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

無需輸入參數。

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

輸入參數path必填locale必填

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

輸入參數locale

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.

輸入參數atlocale

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.

輸入參數atlocalewhenKeybreakdownsituationKey必填

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.

輸入參數locale

get_emergency

Get Emergency

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.

輸入參數locale

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.

輸入參數locale

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.

輸入參數slug必填locale

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 geo lookup by coordinates (not this server).

輸入參數locale

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

輸入參數plznamesluglocale

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.

輸入參數locale

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.

輸入參數locale

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'}).

輸入參數locale

get_partner_info

Get Partner Info

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.

輸入參數locale

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.

輸入參數locale

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.

輸入參數locale

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.

輸入參數locale

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

輸入參數locale

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.

輸入參數qidlocale

list_wissen

List Wissen

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.

輸入參數locale

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.

輸入參數id必填locale

list_ratgeber

List Ratgeber

WHAT: All Ratgeber slugs and locale URLs /ratgeber/{slug}. USE get_ratgeber({slug}) then get_ai_page for fulltext.

輸入參數locale

get_ratgeber

Get Ratgeber

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.

輸入參數slug必填locale

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

輸入參數pathlocale

get_ai_page

Get Ai Page

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.

輸入參數path必填locale

get_serp_snippet

Get Serp Snippet

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.

輸入參數urlpathlocale

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.

輸入參數q必填limitlocale

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

輸入參數limitwhich必填offset

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.

輸入參數limitoffset

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

輸入參數limitoffset

get_llms_serp_txt

Get Llms Serp Txt

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.

輸入參數limitoffset

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

輸入參數limitoffset

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

輸入參數limitoffset

get_ai_txt

Get Ai Txt

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.

輸入參數limitoffset

get_sitemap_txt

Get Sitemap Txt

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.

輸入參數limitoffset

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.

輸入參數locale

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.

無需輸入參數。

compose_tel_landline

Compose Tel Landline

WHAT: tel: href for the landline (Festnetz). Call with {}. Mobile/24h emergency = compose_tel_mobile.

無需輸入參數。

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.

輸入參數option

compose_mailto

Compose Mailto

WHAT: mailto:[email protected] 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).

輸入參數option

版本歷史

1
  1. v0.1.0最新Nov 4, 2026

評分

已滿足適用檢查項的 90%

該評分衡量此收錄條目的完整程度,依據註冊中心條目、端點與公開來源計算得出。它不是對伺服器本身的評價,也不表示伺服器安全或目前可用:可連通性是帶日期的檢查結果,評分也不包含安裝量或使用者評價。

  • 近 30 天內可連通25 分
  • 已宣告認證方式10 分

    請在註冊中心條目中宣告憑證請求標頭,或保持端點能夠回應探測,以便判定其認證方式。

  • 已列出工具必需15 分
  • 描述必需15 分
  • 圖示10 分
  • 文件15 分
  • 授權條款10 分