Skip to main content
ClaudeWave

Server MCP public pentru TATUAT.RO — catalogul de echipament de tatuaj și piercing disponibil pentru ChatGPT, Claude și orice agent AI. Căutare, stoc real, calcul transport și link de comandă. Live: api.tatuat.ro/mcp

MCP ServersOfficial Registry0 stars0 forks● JavaScriptUpdated today
ClaudeWave Trust Score
70/100
· OK
Passed
  • ✓Actively maintained (<30d)
  • ✓Clear description
  • ✓Topics declared
  • ✓Documented (README)
Flags
  • !No standard license detected
Last scanned: 10/1/2026
Install in Claude Code / Claude Desktop
Method: Manual
Claude Code CLI
git clone https://github.com/estartoken/tatuat-mcp
claude_desktop_config.json (Claude Desktop)
{
  "mcpServers": {
    "tatuat-mcp": {
      "command": "node",
      "args": ["/path/to/tatuat-mcp/dist/index.js"]
    }
  }
}
1. Run the command above in your terminal (Claude Code), or paste the JSON config into claude_desktop_config.json (Claude Desktop).
2. Replace any <placeholder> values with your API keys or paths.
3. Restart Claude. The MCP server and its tools appear automatically.
💡 Clone https://github.com/estartoken/tatuat-mcp and follow its README for install instructions.
Use cases

MCP Servers overview

# TATUAT.RO — server MCP

**Catalogul [tatuat.ro](https://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](https://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

| Tool | Ce face |
|---|---|
| `search_products` | Caută după nume, brand sau tip de produs. Întoarce preț în RON, disponibilitate și link direct la fișă. |
| `browse_category` | O pagină de produse dintr-o categorie (sau din tot catalogul), cu sortare. |
| `get_product` | Fișa completă: descriere, preț efectiv, preț dinainte de reducere, brand, variante cu preț și stoc propriu. |
| `get_stock` | Disponibilitatea reală pentru o cantitate cerută. Patru stări: integral, parțial, pe comandă, indisponibil. |
| `calculate_shipping` | Cost de transport, pragul de transport gratuit și cadourile atinse la prag. |
| `create_checkout` | Link 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_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` 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

| Rută | Metode | Ce face |
|---|---|---|
| `/mcp` | POST, GET, DELETE | Endpointul MCP. Toate trei delegate pachetului, ca 405-ul să vină de la protocol, nu de la Next. |
| `/.well-known/mcp-server-card.json` | GET | Cartea de vizită a serverului. |
| `/.well-known/openai-apps-challenge` | GET | Verificarea 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`](.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ă | Obligatorie | Notă |
|---|---|---|
| `SUPABASE_URL` | da | PostgREST, server-to-server |
| `SUPABASE_ANON_KEY` | da | Cheia **anon**, nu `service_role`: tot ce citesc tool-urile e deja public prin RLS |
| `AGENT_CHECKOUT_SECRET` | pentru `create_checkout` | Aceeași valoare și în proiectul site-ului |
| `MCP_ALLOWED_HOSTS` | nu | Implicit `api.tatuat.ro`. Listă separată prin virgulă |
| `TATUAT_SITE_URL` | nu | Implicit `https://tatuat.ro` |
| `OPENAI_APPS_CHALLENGE_TOKEN` | la submission | Dat 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.
- **RO-only deliberat.** `p_lang` nu 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

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

### Gardă înainte de push

```bash
git config core.hooksPath .githooks
```

Activează [`.githooks/pre-push`](.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](https://tatuat.ro)** — echipament profesional de tatuaj și piercing.
ai-agentschatgptclaudeecommercemcpmcp-servermodel-context-protocolnextjsromaniastreamable-httpsupabasetattoo

What people ask about tatuat-mcp

What is estartoken/tatuat-mcp?

+

estartoken/tatuat-mcp is mcp servers for the Claude AI ecosystem. Server MCP public pentru TATUAT.RO — catalogul de echipament de tatuaj și piercing disponibil pentru ChatGPT, Claude și orice agent AI. Căutare, stoc real, calcul transport și link de comandă. Live: api.tatuat.ro/mcp It has 0 GitHub stars and its last recorded update is dated 2026-09-30.

How do I install tatuat-mcp?

+

You can install tatuat-mcp by cloning the repository (https://github.com/estartoken/tatuat-mcp) or following the README instructions on GitHub. ClaudeWave also provides quick install blocks on this page.

Is estartoken/tatuat-mcp safe to use?

+

Our security agent has analyzed estartoken/tatuat-mcp and assigned a Trust Score of 70/100 (tier: OK). See the full breakdown of passed checks and flags on this page.

Who maintains estartoken/tatuat-mcp?

+

estartoken/tatuat-mcp is maintained by estartoken. The last recorded GitHub activity is dated 2026-09-30, with 1 open issues.

Are there alternatives to tatuat-mcp?

+

Yes. On ClaudeWave you can browse similar mcp servers at /categories/mcp, sorted by popularity or recent activity.

Deploy tatuat-mcp to your cloud

Ship this repo to production in minutes. Each platform spins up its own environment with editable env vars.

Maintain this repo? Add a badge to your README

Drop the badge into your GitHub README to show it's tracked on ClaudeWave. Each badge links back to this page and reflects the live Trust Score.

Featured on ClaudeWave: estartoken/tatuat-mcp
[![Featured on ClaudeWave](https://claudewave.com/api/badge/estartoken-tatuat-mcp)](https://claudewave.com/repo/estartoken-tatuat-mcp)
<a href="https://claudewave.com/repo/estartoken-tatuat-mcp"><img src="https://claudewave.com/api/badge/estartoken-tatuat-mcp" alt="Featured on ClaudeWave: estartoken/tatuat-mcp" width="320" height="64" /></a>

More MCP Servers

tatuat-mcp alternatives