TATUAT.RO — Tattoo & Piercing Supplies
io.github.estartokenv0.1.0更新於 Sep 30, 2026
Tattoo and piercing supply catalog (Romania): search, live stock, shipping cost, checkout link.
概覽
讓助理搜尋羅馬尼亞的紋身與穿洞用品目錄、查詢即時庫存、估算運費並產生結帳連結。
- 功能
- 透過六個工具把 TATUAT.RO 商品目錄開放給 AI 助理:依名稱、品牌或類型搜尋商品,依分類分頁瀏覽並排序,查看含變體與價格的完整商品詳情,查詢指定數量的即時庫存,計算運費與免運門檻,以及產生有效期 15 分鐘的簽章結帳連結。價格以 RON 回傳,含變體的商品會標示為最低價起。前五個工具為唯讀,結帳工具只產生連結,不會下單。
- 適用情境
- 當對話涉及向這家羅馬尼亞商店購買紋身或穿洞器材,且助理需要在客戶於商店網站完成購買前提供真實價格、庫存與運費時適用。
- 執行需求
- 遠端 streamable HTTP 端點,不需要驗證、權杖或本機執行環境。伺服器由商店自行營運,其 Supabase 與結帳密鑰等設定由營運方提供,使用者無需填寫。
安裝
在 SourceWeft 中
- 開啟 儀表板中的 TATUAT.RO — Tattoo & Piercing Supplies,將其新增到工作區。
- 為需要使用其工具的對話啟用該服務。
Web executable,透過 Streamable HTTP。 遠端服務在工作區中設定後即可從網頁執行環境執行。
其他 MCP 客戶端
把它新增到你客戶端的 mcpServers 設定中。
{
"mcpServers": {
"tatuat-mcp": {
"type": "http",
"url": "https://api.tatuat.ro/mcp"
}
}
}README
TATUAT.RO — server MCP
Catalogul tatuat.ro — echipament de tatuaj și piercing — disponibil pentru ChatGPT, Claude și orice agent AI. Caută produse, verifică stocul real, calculează transportul și generează un link de comandă, direct din conversație.
🟢 Live: https://api.tatuat.ro/mcp · transport streamable HTTP · fără autentificare
English — MCP server exposing the TATUAT.RO catalog (tattoo & piercing supplies, Romania) to AI agents. Live at
https://api.tatuat.ro/mcp, streamable HTTP, no auth required. Six tools: product search, category browsing, product detail, real-time stock, shipping calculator, and a signed checkout link. Prices in RON. Read-only except the checkout link — the purchase is completed on tatuat.ro.
Ce poate face un agent
Primele cinci sunt read-only — nu scriu nimic. Al șaselea generează doar un link; nu plasează comanda și nu atinge baza de date.
Exemplu
— Am nevoie de cartușe 0.30 RL, vreo 20 de bucăți. Cât mă costă cu transport?
Agentul apelează search_products → get_stock → calculate_shipping, răspunde cu prețul
real și cu cât mai trebuie până la transport gratuit, apoi create_checkout dă linkul pe
care clientul finalizează comanda pe tatuat.ro.
Cum îl conectezi
Claude Code
Claude Desktop — Settings → Connectors → Add custom connector → https://api.tatuat.ro/mcp
Orice client MCP — endpoint streamable HTTP, protocol 2025-06-18, fără token.
Prețuri și monedă
Prețul contractual e RON, etichetat explicit în fiecare răspuns. Magazinul are și prețuri în HUF (rată fixă), dar nu se expun aici: un preț fără etichetă de monedă, citit de un model, e exact felul în care un client ajunge să creadă că plătește altă sumă.
La produsele cu variante (mărimi, configurații) prețul întors e minimul dintre variante,
marcat price_from: true ca agentul să spună „de la X RON", nu „X RON".
Ce NU face
- Nu scrie nimic în baza de date. Niciun tool nu mutează stare.
- Nu ține coș pe server. Coșul trăiește pe tatuat.ro.
- Nu autentifică utilizatori. OAuth e fază ulterioară.
- Nu procesează plăți. Checkout-ul se finalizează pe tatuat.ro — cerință explicită OpenAI pentru plugin-uri („external checkout").
- Linkul de checkout nu conține prețuri. Transportă doar intenția (produs, variantă, cantitate); prețul final se calculează și se confirmă pe site.
Pentru dezvoltatori
Rute
Allowlist de gazde
Marginea HTTP validează Host și Origin împotriva unei allowlist statice din
MCP_ALLOWED_HOSTS (implicit api.tatuat.ro). Lista nu se derivă niciodată din cererea
însăși — o allowlist construită din propriul header Host ar accepta trivial o pagină de
DNS rebinding.
Consecințe care arată ca defecțiuni, dar sunt intenționate:
- Un URL de preview Vercel primește 403 — nu e în allowlist. Adaugă hostul în
MCP_ALLOWED_HOSTSpentru acel environment; nu relaxa validarea. Hostabsent → 403 (missing_host), fail-closed: clienții MCP trimit mereuHost.Originabsent → trece. Polaritate opusă față deHost: clienții non-browser nu trimitOrigin, iar a-i respinge ar rupe exact clientul pentru care există serverul. UnOriginprezent dar de pe alt host, sau literalulnull, primește 403.- Validarea e port-agnostică și normalizează majusculele.
Refuzul are formă JSON-RPC cu status 403, nu HTML — un client MCP îl poate parsa.
Variabile de mediu
Numele sunt în .env.example, fără valori. Valorile vin din env-ul
proiectului Vercel în producție și din macOS Keychain la setup local — niciodată din repo.
Arhitectură
- Logica în
.mjs, glue-ul în.ts.app/**/route.tssunt delegări pure, fără nicio decizie: repo-ul nu are teste pe.ts, deci un.tsnu are voie să conțină ceva care poate greși. Tot ce decide ceva e însrc/**/*.mjs, acoperit denode --test. - Fără
@supabase/supabase-js. Acces direct pe PostgREST cufetch— CORS e o restricție de browser, nu se aplică server-to-server. - Rate limiting singleton la nivel de modul.
createMcpHandlerrulează factory-ul pe fiecare cerere; o găleată creată în factory s-ar reseta de fiecare dată. Plafonul e per-instanță de funcție, deci „best effort", nu global. - RO-only deliberat.
p_langnu se trimite, deci produsele doar-Ungaria nu apar. Fail-closed. - Proiect separat de magazin, ca un tool schimbat să nu ceară redeploy al site-ului.
Comenzi
Gardă înainte de push
Activează .githooks/pre-push, care rulează test:critical
și oprește push-ul dacă pică ceva. O singură dată pe clonă. Ocolire, când chiar
trebuie: git push --no-verify.
npm run typecheck acoperă și fișierele .mjs (checkJs: true plus "**/*.mjs" în
include). Fără acele două linii, gate-ul privea zero fișiere și trecea mereu.
Magazinul: tatuat.ro — echipament profesional de tatuaj și piercing.
來源:README.md,提交 506eac4
工具
0版本歷史
1- v0.1.0最新Sep 30, 2026
