TATUAT.RO — Tattoo & Piercing Supplies

io.github.estartokenPublished by GitHub account estartokenv0.1.0Updated Oct 24, 2026

Tattoo and piercing supply catalog (Romania): search, live stock, shipping cost, checkout link.

VerifiedStreamable HTTPWeb executableWeb Search & ScrapingBusiness & Commerce

Overview

AI-generated overview

Remote MCP server for the TATUAT.RO tattoo and piercing supply catalog in Romania: product search, live stock, shipping cost and a signed checkout link.

What you can do
  • Search and browse the catalog by name, brand, product type or category, with RON prices, availability and product links
  • Read a full product sheet: description, effective price, pre-discount price, brand and variants with their own price and stock
  • Check real availability for a requested quantity, including partial stock, pre-order and per-line maximum states
  • Calculate shipping cost, the free-shipping threshold and gifts reached at that threshold for a cart
  • Generate a signed checkout link for a chosen cart, valid for a limited time
When to use it
Useful when a conversation turns to buying tattoo or piercing equipment in Romania: checking whether a product exists, what it costs in RON, whether a size or variant is in stock, what shipping would add, or handing the customer a link to finish the order on the shop site.
Requirements
Remote streamable HTTP endpoint; no authentication, token or API key is needed. The client must send a Host header accepted by the server's host allowlist. Prices are in RON.
Before you install
The checkout link carries only product, variant and quantity, not prices; the final price is confirmed on the shop site and the purchase is completed there. The link is time-limited. The server does not process payments, keep a cart or authenticate users. Some products may be restricted to delivery in Hungary only.

Installation

In SourceWeft

  1. Open TATUAT.RO — Tattoo & Piercing Supplies in the dashboard and add it to a workspace.
  2. 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.

Use with an agent

Paste this prompt into Claude Code, Codex, Cursor or another agent — or into SourceWeft chat. The agent reads this server's install guide, shows you its publisher, endpoint and sign-in, and adds it to your client once you agree. Keys never go into a command.

Read https://sourceweft.com/mcp/io.github.estartoken%2Ftatuat-mcp/install.md and connect the MCP server it describes to my client. Before changing any config, show me its publisher, endpoint and sign-in method and wait for my OK. Never put an API key in a command or in a file I would commit; ask me where it should come from.

Read the install guide the agent follows

Other MCP clients

Add this to your client's mcpServers config.

{
  "mcpServers": {
    "tatuat-ro-tattoo-piercing-supplies": {
      "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.

Documentație publică: api.tatuat.ro · llms.txt

🟢 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

ToolCe face
search_productsCaută după nume, brand sau tip de produs. Întoarce preț în RON, disponibilitate și link direct la fișă.
browse_categoryO pagină de produse dintr-o categorie (sau din tot catalogul), cu sortare.
get_productFișa completă: descriere, preț efectiv, preț dinainte de reducere, brand, variante cu preț și stoc propriu.
get_stockDisponibilitatea reală pentru o cantitate cerută. Patru stări: integral, parțial, precomandă și cantitate la plafonul maxim pe linie.
calculate_shippingCost de transport, pragul de transport gratuit și cadourile atinse la prag.
create_checkoutLink semnat către coșul de pe tatuat.ro. Valabil 15 minute.

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_product (alege varianta) → 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

bash
claude mcp add --transport http tatuat https://api.tatuat.ro/mcp

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 când variantele au prețuri diferite, ca agentul să spună „de la X RON", nu „X RON".

Pentru calculate_shipping, fiecare linie acceptă variant_id din get_product. Când variantele au prețuri diferite, ID-ul este necesar pentru un total exact. Fără el, serverul cere selecția. Un produs/variantă neconfirmată sau un preț lipsă oprește calculul cu isError, fără un subtotal parțial. Produsele cu variante la același preț pot fi calculate fără selecție. subtotal direct nu poate verifica produse sau tarife de colet greu.

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

RutăMetodeCe face
/GETDocumentație publică indexabilă, fără JavaScript sau autentificare.
/robots.txtGETPermite documentația și exclude transportul MCP și verificarea domeniului.
/llms.txtGETRezumat compact al conectării, uneltelor și regulilor de utilizare.
/mcpPOST, GET, DELETEEndpointul MCP. Toate trei delegate pachetului, ca 405-ul să vină de la protocol, nu de la Next.
/.well-known/mcp-server-card.jsonGETCartea de vizită a serverului.
/.well-known/openai-apps-challengeGETVerificarea proprietății domeniului. Întoarce doar tokenul din OPENAI_APPS_CHALLENGE_TOKEN; 404 dacă lipsește.

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_HOSTS pentru acel environment; nu relaxa validarea.
  • Host absent → 403 (missing_host), fail-closed: clienții MCP trimit mereu Host.
  • Origin absent → trece. Polaritate opusă față de Host: clienții non-browser nu trimit Origin, iar a-i respinge ar rupe exact clientul pentru care există serverul. Un Origin prezent dar de pe alt host, sau literalul null, 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.

VariabilăObligatorieNotă
SUPABASE_URLdaPostgREST, server-to-server
SUPABASE_ANON_KEYdaCheia anon, nu service_role: tot ce citesc tool-urile e deja public prin RLS
AGENT_CHECKOUT_SECRETpentru create_checkoutAceeași valoare și în proiectul site-ului
MCP_ALLOWED_HOSTSnuImplicit api.tatuat.ro. Listă separată prin virgulă
TATUAT_SITE_URLnuImplicit https://tatuat.ro
OPENAI_APPS_CHALLENGE_TOKENla submissionDat de portalul OpenAI

Arhitectură

  • Logica în .mjs, glue-ul în .ts. app/**/route.ts sunt delegări pure, fără nicio decizie: repo-ul nu are teste pe .ts, deci un .ts nu are voie să conțină ceva care poate greși. Tot ce decide ceva e în src/**/*.mjs, acoperit de node --test.
  • Fără @supabase/supabase-js. Acces direct pe PostgREST cu fetch — CORS e o restricție de browser, nu se aplică server-to-server.
  • Rate limiting singleton la nivel de modul. createMcpHandler rulează 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.
  • Căutare în catalogul RO. p_lang nu se trimite în căutare/listare. Fișele accesate direct pot întoarce produse cu livrare limitată la Ungaria; get_product, get_stock și calculate_shipping declară atunci order_restriction: "hu_only". Fail-closed.
  • Proiect separat de magazin, ca un tool schimbat să nu ceară redeploy al site-ului.

Comenzi

bash
npm run test           # node --test pe src/mcp, src/mcp/tools, src/well-knownnpm run typecheck      # tsc --noEmit — vede și .mjs (checkJs + include)npm run test:critical  # ambelenpm run dev            # Next dev pe :3000npm run build          # next build

Gardă înainte de push

bash
git config core.hooksPath .githooks

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

Tools

6

search_products

Caută produse pe tatuat.ro

Caută în catalogul tatuat.ro după nume, brand sau tip de produs și întoarce produse cu preț în RON, disponibilitate și link direct la fișa de produs. Folosește acest tool când clientul întreabă dacă un produs există, cât costă sau ce opțiuni sunt disponibile. Pentru detaliile unui produs anume, folosește după aceea get_product cu slug-ul întors aici.

Parameterslimitqueryrequired

calculate_shipping

Calculează transportul pe tatuat.ro

Calculează costul de transport, pragul pentru transport gratuit și cadourile atinse la prag pentru un coș tatuat.ro. Dă fie 'lines' (produsele coșului, ca tool-ul să citească prețul real din catalog), fie un 'subtotal' deja cunoscut. Pentru variante cu prețuri diferite, trimite variant_id din get_product. Un produs sau o variantă neconfirmată oprește calculul, fără total parțial. Folosește acest tool când clientul întreabă cât costă transportul sau cât mai trebuie să cumpere pentru livrare gratuită sau cadou.

Parameterslinessubtotal

get_stock

Verifică stocul unui produs pe tatuat.ro

Verifică disponibilitatea reală a unui produs (sau al unei variante a lui, ex. o mărime) pentru o cantitate cerută de client, folosind slug-ul întors de search_products. Întoarce una din patru stări — disponibil integral acum, parțial disponibil cu rest pe precomandă, precomandă integrală (stoc 0), sau cantitate la plafonul maxim comandabil — plus un text pe care îl poți spune clientului fără să inventezi o cifră.

Parametersqtyslugrequiredvariant_id

browse_category

Răsfoiește o categorie de pe tatuat.ro

Întoarce o pagină de produse dintr-o categorie tatuat.ro (sau din tot catalogul, dacă nu se dă un ID de categorie), cu preț în RON, disponibilitate și link direct la fișa de produs. Folosește acest tool când clientul vrea să vadă ce e disponibil într-o categorie sau vrea produsele cele mai populare/ieftine/scumpe/noi. Pentru un produs anume folosește după aceea get_product cu slug-ul întors aici.

Parameterssortlimitoffsetcategory_id

get_product

Fișa unui produs de pe tatuat.ro

Întoarce fișa completă a unui produs de pe tatuat.ro după slug: nume, descriere, preț efectiv în RON (cu prețul dinainte de reducere dacă e cazul), disponibilitate, link direct la fișă, brand și variantele cu preț și stoc propriu. Folosește slug-ul întors de search_products. Dacă slug-ul nu corespunde unui produs activ, found este false — nu e o eroare.

Parametersslugrequired

create_checkout

Creează link de finalizare comandă pe tatuat.ro

Generează un link semnat către checkout-ul tatuat.ro pentru coșul dat (produse, variante, cantități, opțiuni). Linkul e valabil un timp limitat și NU conține prețuri — prețul final se confirmă pe site. Folosește acest tool când clientul e decis să cumpere; pentru a găsi produse sau prețuri folosește search_products/get_product înainte.

Parametersitemsrequired

Version history

1
  1. v0.1.0LatestSep 30, 2026

Score

90% of the applicable checks met

How complete this listing is, computed from the registry entry, the endpoint and public sources. Not a rating of the server and not a statement that it is safe or working today: reachability is a dated check, and no installs or reviews go into the score.

  • Reached in the last 30 daysRequired25 pts
  • Auth declaredRequired10 pts
  • Tools listedRequired15 pts
  • DescriptionRequired15 pts
  • Logo10 pts
  • Documentation15 pts
  • License10 pts

    Declare a license in the repository or the registry entry.