TATUAT.RO — Tattoo & Piercing Supplies

io.github.estartoken由 GitHub 账号 estartoken 发布v0.1.0更新于 Oct 24, 2026

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

已验证Streamable HTTP可网页运行网页搜索与抓取商业与电商

概览

AI 生成的概览

面向罗马尼亚 TATUAT.RO 纹身与穿孔用品目录的远程 MCP 服务器:商品搜索、实时库存、运费计算和签名结账链接。

可以做什么
  • 按名称、品牌、商品类型或分类搜索和浏览目录,返回 RON 价格、库存状态和商品链接
  • 读取完整商品详情:描述、实际价格、折扣前价格、品牌,以及各自带价格和库存的规格变体
  • 按客户所需数量查询真实库存,包括部分有货、预售和单行上限等状态
  • 为购物车计算运费、免运费门槛以及达到门槛时附赠的礼品
  • 为选定购物车生成限时有效的签名结账链接
适用场景
当对话涉及在罗马尼亚购买纹身或穿孔器材时适用:确认商品是否存在、RON 价格多少、某个尺码或变体是否有货、运费多少,或把完成下单的链接交给客户。
运行要求
远程 streamable HTTP 端点;无需认证、令牌或 API 密钥。客户端需发送服务器主机白名单所接受的 Host 头。价格以 RON 计价。
安装前请注意
结账链接只包含商品、变体和数量,不含价格;最终价格在商店网站上确认,购买也在那里完成。链接有时效限制。服务器不处理支付、不保存购物车、也不验证用户身份。部分商品可能仅限配送至匈牙利。

安装

在 SourceWeft 中

  1. 打开 控制台中的 TATUAT.RO — Tattoo & Piercing Supplies,将其添加到工作区。
  2. 为需要使用其工具的对话启用该服务。

Web executable,通过 Streamable HTTP。 远程服务在工作区中配置后即可从网页运行时运行。

交给智能体安装

把这段提示词粘贴到 Claude Code、Codex、Cursor 等智能体,或 SourceWeft 对话中。智能体会读取该服务器的安装指南,先向你展示发布者、端点和登录方式,经你同意后再把它添加到你的客户端。密钥不会写进任何命令。

阅读 https://sourceweft.com/mcp/io.github.estartoken%2Ftatuat-mcp/install.md,并按其中说明把这个 MCP 服务器接入我的客户端。修改任何配置之前,先告诉我它的发布者、端点和登录方式,等我确认。不要把 API 密钥写进命令或我会提交的文件;问我密钥应从哪里获取。

查看智能体所依据的安装指南

其他 MCP 客户端

把它添加到你客户端的 mcpServers 配置中。

{
  "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.

来源:README.md,提交 7a3c025

工具

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.

输入参数limitquery必填

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.

输入参数linessubtotal

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ă.

输入参数qtyslug必填variant_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.

输入参数sortlimitoffsetcategory_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.

输入参数slug必填

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.

输入参数items必填

版本历史

1
  1. v0.1.0最新Sep 30, 2026

评分

已满足适用检查项的 90%

该评分衡量此收录条目的完整程度,依据注册中心条目、端点与公开来源计算得出。它不是对服务器本身的评价,也不表示服务器安全或当前可用:可连通性是带日期的检查结果,评分也不包含安装量或用户评价。

  • 近 30 天内可连通必需25 分
  • 已声明认证方式必需10 分
  • 已列出工具必需15 分
  • 描述必需15 分
  • 图标10 分
  • 文档15 分
  • 许可证10 分

    请在仓库或注册中心条目中声明许可证。