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.
概览
让助手搜索罗马尼亚纹身与穿孔用品目录、查询实时库存、估算运费并生成结账链接。
- 功能
- 通过六个工具向 AI 助手开放 TATUAT.RO 商品目录:按名称、品牌或类型搜索商品,按分类分页浏览并排序,查看含变体与价格的完整商品详情,查询指定数量的实时库存,计算运费与免运费门槛,以及生成有效期 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