tiendanube-mcp@1.1.0
CAUTION· static onlyPublisher claims: "A free, open-source MCP server that connects AI assistants to the Tiendanube/Nuvemshop API so they can manage products, variants, stock, orders, fulfillment, customers, coupons, shipping, payments, content and webhooks from plain-language requests. It exposes 191 tools across 39 API resources, with a read-only mode, honest tool annotations and rate-limit-aware, context-friendly responses." Observed in sandbox: static analysis only — behavior not yet observed.
Coverage
Static only; nothing was run yet.The label rests on the code, the instruction files and the publisher. The honeypot run replaces this verdict when it completes.
Before you give it your token
Code inventory arrives with this version's next honeypot run.- It will ask for
- unknown until the next run
- Where it talks to
- unknown until the next run
- What the honeypot saw
- nothing has run yet
- What we could not test
- everything: the server has not run yet
Run it before you trust it. Nothing has run yet: the code was read, the server was not. `vet-skills try` runs this exact version in the honeypot in about a minute.
Never paste a credential into a chat, a ticket or a report, including ours. How the guard holds it.
Is [email protected] safe to install?
KillerSkills analysed it statically (a sandbox run is pending) on 2026-11-07 and scored it 53/100 (Caution). It is not known to be malicious, but it has behaviour or code a security policy should decide on before install. Notable findings: Access to sensitive file paths; Access to sensitive file paths; Access to sensitive file paths. Summary: static analysis only — behavior not yet observed.
Behavior trace
Queued for honeypot run · static analysis onlyThis version has not been detonated yet. The score above counts behavior as unknown (50/100), so it cannot read Verified until the honeypot run completes and replaces this verdict.
Static findings
console.error(`tiendanube-mcp-server ${VERSION} on http://${host}:${port}/mcp${ro ? " (read-only)" : ""}`);Fix: Namespace tool names and keep tool descriptions literal; no instructions to the agent inside them."403 (missing scope) -> in the app settings tick ALL permissions (scopes), then re-authorize so a NEW token is issued (scopes only apply to new tokens): npx -y github:fedeclavero/tiendanube-mcp login Fix: Pin versions and sources; vendor anything fetched at install time.note: "An existing custom 'tiendanube' entry was kept as is (it does not use the standard npx launch). Use --force to replace it.",Fix: Pin versions and sources; vendor anything fetched at install time.const methodNotAllowed = (_req, res) => res.status(405).json({ jsonrpc: "2.0", error: { code: -32000, message: "Method not allowed (stateless server: use POST)." }, id: null });Fix: Remove the call, or declare the host in frontmatter and explain in the README what is sent and why."Open the app settings and tick ALL permissions (Partner Portal > the app > Basic Data; custom app: Settings > Custom apps). Then re-authorize so a NEW token is issued (scopes only apply to new tokensFix: Pin versions and sources; vendor anything fetched at install time.assert.equal(calls[1], "mcp add tiendanube --scope user -e TIENDANUBE_STORE_ID=42 -- npx -y github:fedeclavero/tiendanube-mcp");Fix: Pin versions and sources; vendor anything fetched at install time./** Replace an existing custom entry (one that does not use the standard npx launch). */Fix: Pin versions and sources; vendor anything fetched at install time.const npx = ["-y", opts.source ?? DEFAULT_SOURCE];Fix: Pin versions and sources; vendor anything fetched at install time."Ask the user for a valid access token and Store ID (guides/GETTING_CREDENTIALS.md) and save them yourself: npx -y github:fedeclavero/tiendanube-mcp configure --store-id <ID> --token <TOKEN>, then resFix: Pin versions and sources; vendor anything fetched at install time.res.status(405).json({ jsonrpc: "2.0", error: { code: -32000, message: "Method not allowed (stateless server: use POST)." }, id: null });Fix: Remove the call, or declare the host in frontmatter and explain in the README what is sent and why."401 -> the token is wrong/rotated/uninstalled. Ask the user for the new token (or run the login flow below) and save it yourself: npx -y github:fedeclavero/tiendanube-mcp configure --store-id <ID> --Fix: Pin versions and sources; vendor anything fetched at install time.console.error(`tiendanube-mcp-server ${VERSION} on http://${host}:${port}/mcp${ro ? " (read-only)" : ""}`);Fix: Namespace tool names and keep tool descriptions literal; no instructions to the agent inside them."(see guides/GETTING_CREDENTIALS.md) and run: npx -y github:fedeclavero/tiendanube-mcp configure --store-id <ID> --token <TOKEN> " +Fix: Pin versions and sources; vendor anything fetched at install time.out(`Unknown command "${command}". Run: npx -y ${DEFAULT_SOURCE} --help`);Fix: Pin versions and sources; vendor anything fetched at install time.assert.match(tomlBlock({ command: "npx", args: ["-y", "github:x/y"], env: { K: 'a"b' } }), /\[mcp_servers\.tiendanube\.env\]\nK = "a\\"b"/);Fix: Stop enumerating or reading credential locations; take secrets from a declared environment variable the user sets on purpose.inEnv = table === `${own}.env`;Fix: Stop enumerating or reading credential locations; take secrets from a declared environment variable the user sets on purpose.<summary>Do I need to know how to code?</summary><p>No. Paste the one-line install prompt into your AI agent; it handles the keys and the configuration for you.Fix: Remove the text that addresses the agent rather than the reader; describe behavior, do not instruct.inEnv = table === `${own}.env`;Fix: Stop enumerating or reading credential locations; take secrets from a declared environment variable the user sets on purpose.const launch = { ...requested, env: { ...(prior?.env ?? {}), ...requested.env } };Fix: Stop enumerating or reading credential locations; take secrets from a declared environment variable the user sets on purpose.<summary>¿Necesito saber programar?</summary><p>No. Pegá el prompt de instalación en tu agente de IA; él maneja las claves y la configuración por vos. La guía dFix: Remove the text that addresses the agent rather than the reader; describe behavior, do not instruct.next = "call tiendanube_doctor. Then get a valid token yourself: ask the user for it (guides/GETTING_CREDENTIALS.md) and save it with: npx -y github:fedeclavero/tiendanube-mcp configure --store-id <IDFix: Pin versions and sources; vendor anything fetched at install time.next = "re-read the tool's example arguments and fix the parameters; if every call fails with 400, run: npx -y github:fedeclavero/tiendanube-mcp configure --user-agent \"MyStore ([email protected])\" anFix: Pin versions and sources; vendor anything fetched at install time.return { text: JSON.stringify(entry), env: env && typeof env === "object" ? { ...env } : {} };Fix: Stop enumerating or reading credential locations; take secrets from a declared environment variable the user sets on purpose.assert.match(t, /\[mcp_servers\.tiendanube\.env\]\nTIENDANUBE_STORE_ID = "42"/);Fix: Stop enumerating or reading credential locations; take secrets from a declared environment variable the user sets on purpose.return fail("Error: the server is in read-only mode, only GET is allowed.\nNext step: ask the user to switch to read-write (run: npx -y github:fedeclavero/tiendanube-mcp configure --read-write) and reFix: Pin versions and sources; vendor anything fetched at install time.next = `the token lacks ${ctx.scope ?? "a scope"}. Fix it yourself: (1) have the user open the app settings and tick ALL permissions (Partner Portal > the app > Basic Data, or Settings > Custom apps iFix: Pin versions and sources; vendor anything fetched at install time.lines.push("", `[mcp_servers.${name}.env]`, ...Object.entries(l.env).map(([k, v]) => `${k} = ${tomlString(v)}`));Fix: Stop enumerating or reading credential locations; take secrets from a declared environment variable the user sets on purpose.return { text: JSON.stringify(entry), env: env && typeof env === "object" ? { ...env } : {} };Fix: Stop enumerating or reading credential locations; take secrets from a declared environment variable the user sets on purpose.lines.push("", `[mcp_servers.${name}.env]`, ...Object.entries(l.env).map(([k, v]) => `${k} = ${tomlString(v)}`));Fix: Stop enumerating or reading credential locations; take secrets from a declared environment variable the user sets on purpose.out(`Unknown command "${command}". Run: npx -y ${DEFAULT_SOURCE} --help`);Fix: Pin versions and sources; vendor anything fetched at install time.assert.match(t, /\[mcp_servers\.tiendanube\.env\]\nTIENDANUBE_STORE_ID = "42"/);Fix: Stop enumerating or reading credential locations; take secrets from a declared environment variable the user sets on purpose.report.nextSteps.push("Open the app settings and tick ALL permissions (Partner Portal > the app > Basic Data; custom app: Settings > Custom apps). Then re-authorize so a NEW token is issued (scopes onFix: Pin versions and sources; vendor anything fetched at install time.assert.match(tomlBlock({ command: "npx", args: ["-y", "github:x/y"], env: { K: 'a"b' } }), /\[mcp_servers\.tiendanube\.env\]\nK = "a\\"b"/);Fix: Stop enumerating or reading credential locations; take secrets from a declared environment variable the user sets on purpose.const launch: Launch = { ...requested, env: { ...(prior?.env ?? {}), ...requested.env } };Fix: Stop enumerating or reading credential locations; take secrets from a declared environment variable the user sets on purpose.- `npx -y github:fedeclavero/tiendanube-mcp configure --store-id <ID> --token <TOKEN>`Fix: Pin versions and sources; vendor anything fetched at install time.5. `npx -y github:fedeclavero/tiendanube-mcp doctor` must say `OK`; do every `NEXT STEP:` it prints.Fix: Pin versions and sources; vendor anything fetched at install time.4. `npx -y github:fedeclavero/tiendanube-mcp install --client all` (never edit client config files by hand).Fix: Pin versions and sources; vendor anything fetched at install time.* extension), so a prompt-injected "upload ~/.ssh/id_rsa" can never leave the machine through this tool.Fix: Stop enumerating or reading credential locations; take secrets from a declared environment variable the user sets on purpose.* extension), so a prompt-injected "upload ~/.ssh/id_rsa" can never leave the machine through this tool.Fix: Stop enumerating or reading credential locations; take secrets from a declared environment variable the user sets on purpose.while (items.length > 1 && asText({ ...env, items }).length > CHARACTER_LIMIT) {Fix: Stop enumerating or reading credential locations; take secrets from a declared environment variable the user sets on purpose.- or OAuth: `npx -y github:fedeclavero/tiendanube-mcp login --client-id <APP_ID> --client-secret <SECRET>`Fix: Pin versions and sources; vendor anything fetched at install time.const npx = ["-y", opts.source ?? DEFAULT_SOURCE];Fix: Pin versions and sources; vendor anything fetched at install time."401 -> the token is wrong/rotated/uninstalled. Ask the user for the new token (or run the login flow below) and save it yourself: npx -y github:fedeclavero/tiendanube-mcp configure --store-id <ID> --Fix: Pin versions and sources; vendor anything fetched at install time.note: "An existing custom 'tiendanube' entry was kept as is (it does not use the standard npx launch). Use --force to replace it.",Fix: Pin versions and sources; vendor anything fetched at install time.assert.equal(calls[1], "mcp add tiendanube --scope user -e TIENDANUBE_STORE_ID=42 -- npx -y github:fedeclavero/tiendanube-mcp");Fix: Pin versions and sources; vendor anything fetched at install time."403 (missing scope) -> in the app settings tick ALL permissions (scopes), then re-authorize so a NEW token is issued (scopes only apply to new tokens): npx -y github:fedeclavero/tiendanube-mcp login Fix: Pin versions and sources; vendor anything fetched at install time.report.nextSteps.push("Ask the user for a valid access token and Store ID (guides/GETTING_CREDENTIALS.md) and save them yourself: npx -y github:fedeclavero/tiendanube-mcp configure --store-id <ID> --tFix: Pin versions and sources; vendor anything fetched at install time.Cost to the agent
Tokens estimated at four characters each. Skills load their instruction text when triggered; the figure is what that costs.
Known vulnerabilities
Vulnerability advisories (OSV) cover npm and PyPI packages; this registry has no advisory database.
What would make this Verified
27 points to 80 · weights: behavior 45%, static 25%, prompt 15%, publisher 15%- Unclaimed publisher≈ +8 on the totalClaim fedeclavero: a verified publisher gets +50 on publisher trust. It is free and usually instant with GitHub sign-in.
- Access to sensitive file paths≈ +4 on the totalStop enumerating or reading credential locations; take secrets from a declared environment variable the user sets on purpose.
- References a credential file in the home directory≈ +4 on the totalStop enumerating or reading credential locations; take secrets from a declared environment variable the user sets on purpose.
- MCP server using network transport (SSE/HTTP)≈ +2 on the totalNamespace tool names and keep tool descriptions literal; no instructions to the agent inside them.
- npx invocation of non-well-known package≈ +2 on the totalPin versions and sources; vendor anything fetched at install time.
- File type combined with upload action≈ +2 on the totalRemove the call, or declare the host in frontmatter and explain in the README what is sent and why.