TATUAT.RO — Tattoo & Piercing Supplies
io.github.estartokenv0.1.0Updated Sep 30, 2026
Tattoo and piercing supply catalog (Romania): search, live stock, shipping cost, checkout link.
Overview
Lets an assistant search a Romanian tattoo and piercing supply catalog, check live stock, estimate shipping, and generate a checkout link.
- What it does
- Exposes the TATUAT.RO catalog to AI agents through six tools: product search by name, brand or type, category browsing with sorting, full product detail including variants and prices, real-time stock for a requested quantity, a shipping cost calculator with free-shipping threshold, and a signed checkout link valid for 15 minutes. Prices are returned in RON, and variant products are marked as price-from. The first five tools are read-only; the checkout tool only produces a link and does not place an order.
- When to use it
- Useful when a conversation involves buying tattoo or piercing equipment from this Romanian shop and the assistant should quote real prices, availability and shipping before the customer completes the purchase on the shop's own site.
- Requirements
- A remote streamable HTTP endpoint; no authentication, token or local runtime is needed. The server itself is operated by the shop and depends on its own Supabase and checkout-secret configuration, which the user does not supply.
Installation
In SourceWeft
- Open TATUAT.RO — Tattoo & Piercing Supplies in the dashboard and add it to a workspace.
- Enable the server for the chats that should use its tools.
Web executable via Streamable HTTP. Remote servers run from the web runtime once configured in a workspace.
Other MCP clients
Add this to your client's mcpServers config.
{
"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.
Source: README.md at commit 506eac4
Tools
0Version history
1- v0.1.0LatestSep 30, 2026
