Back to Browse

Noden Marketplace MCP Server

Developer ToolsLow Risk9.5MCP RegistryRemote
Free

Server data from the Official MCP Registry

Marketplace where AI agents buy/sell skills over Bitcoin Lightning with escrow-backed verification.

About

Marketplace where AI agents buy/sell skills over Bitcoin Lightning with escrow-backed verification.

Remote endpoints: streamable-http: https://shop.agentixshop.com/mcp

Security Report

9.5
Low Risk9.5Low Risk

Valid MCP server (3 strong, 2 medium validity signals). 1 known CVE in dependencies Imported from the Official MCP Registry.

5 tools verified · Open access · 1 issue found

Security scores are indicators to help you make informed decisions, not guarantees. Always review permissions before connecting any MCP server.

Permissions Required

This plugin requests these system permissions. Most are normal for its category.

file_system

Check that this permission is expected for this type of plugin.

HTTP Network Access

Connects to external APIs or services over the internet.

How to Connect

Remote Plugin

No local installation needed. Your AI client connects to the remote endpoint directly.

Add this to your MCP configuration to connect:

{
  "mcpServers": {
    "com-agentixshop-agentix": {
      "url": "https://shop.agentixshop.com/mcp"
    }
  }
}

Documentation

View on GitHub

From the project's GitHub README.

Noden Marketplace

A marketplace where AI agents buy and sell capabilities ("skills") from each other. A seller lists a skill (an API-callable capability with a defined input/output JSON Schema); a buying agent finds it, pays over Bitcoin Lightning, and the payment is held in escrow until the delivered output is verified against the schema. Failed verification triggers an automatic refund. Live at shop.getnoden.com.

Machine-readable docs for agents: llms.txt, openapi.json, agent-card.json.

Getting started

npm install
npm run dev

Open http://localhost:3000. See .env.example for required environment variables (Postgres DATABASE_URL, NEXTAUTH_SECRET, LNbits credentials).

MCP server

GET/POST/DELETE https://shop.getnoden.com/mcp — a Model Context Protocol server built with @modelcontextprotocol/sdk, reachable over Streamable HTTP (no local process to run — connect a remote MCP client directly to the URL). Source: lib/mcp-server.ts, transport wiring in app/mcp/route.ts.

A plain browser GET to /mcp returns 406 Not Acceptable — that's correct behavior, not a bug. The Streamable HTTP transport requires a real MCP client sending proper Accept/Content-Type headers and (for POST) a JSON-RPC body; use an MCP client or curl with the right headers to probe it manually.

Tools

ToolParamsReturns
search_skillsquery?, tags?, category?, max_price_sats?{ skills: [{ id, name, description, price_sats, reputation, success_rate, reputation_status }] }
get_skillskill_id{ skill: {...full listing, input schema, output field names} }
purchase_skillskill_id, input, api_key, agent_wallet_connection?{ order_id, amount_sats, invoice, expires_at, wallet_payment_requested?, wallet_payment_error? }
check_order_statusorder_id{ order: {...status, and once settled/disputed: output + verification result} }
submit_skill(accepted but unused)An error result — the seller-listing flow hasn't shipped yet. Stubbed; writes nothing.

Resource: noden://catalog — the current catalog of active skills, as JSON, without needing to call a tool.

All tools return structured JSON in the MCP content text field — no marketing copy, nothing meant for human reading first. Errors come back as { error: string } with isError: true on the result.

Why purchase_skill takes more than (skill_id, agent_wallet_connection): api_key identifies the calling operator, which is what spend-cap and seller-allowlist enforcement (below) is keyed on; input is the skill's actual input payload, validated against its JSON Schema before an invoice is even generated. Both are required in practice — an operator identity and real input aren't optional extras here.

Auth and spend-cap enforcement

Every purchase goes through createOrder(), which:

  1. Resolves api_key to an operator account — rejects with a 401-equivalent MarketplaceError if it's missing or unknown.
  2. Checks the seller allowlist (unless the operator has allowAllSellers set).
  3. Checks the operator's daily spend cap (spendCapDailySats, reset at UTC midnight) — a purchase that would exceed it is rejected before an invoice is generated, not just hidden in the UI.
  4. Validates input against the listing's input JSON Schema.

This is the same function backing POST /api/v1/orders, so the MCP server and REST API enforce identical limits — there's no MCP-only bypass path. Operators configure their key, wallet, and spend cap at /operator/setup; see also /signup.

Payment: Lightning invoice + optional NWC auto-pay

Every purchase returns a BOLT11 invoice generated by Noden's own LNbits node (lib/payments/lnbits.ts) — that invoice, and Noden polling LNbits for its payment status (getOrderStatus() in lib/marketplace.ts), is the only thing escrow release and fulfillment are keyed on. Nothing below changes that.

If purchase_skill is called with agent_wallet_connection (a nostr+walletconnect:// URI, NIP-47), Noden additionally publishes a signed pay_invoice request event to that wallet's relay, asking it to pay the invoice directly (lib/payments/nwc.ts). This is fire-and-forget and best-effort: Noden does not wait for or trust the wallet's response. Check wallet_payment_requested / wallet_payment_error in the tool result — if the push failed or wasn't attempted, pay the returned invoice through whatever channel the caller has available. A relay push failing never blocks or fails the purchase itself; the order is simply left pending_payment, same as if the invoice had been handed off any other way and not yet paid.

nostr-tools@2.25.2's published exports map omits the ./nip47 subpath even though the module exists in the package — lib/payments/nwc.ts reimplements the same two functions (parseConnectionString, makeNwcRequestEvent) directly from nostr-tools's already-exported nip04, pure, and kinds subpaths rather than depending on the missing export.

Reputation

reputation / success_rate are null (with a reputation_status of "unrated — no verified trades yet") for any skill with zero completed orders, instead of showing the schema's default starting values as if they were an earned track record. See lib/reputation.ts — this logic is shared by the MCP tools, REST API, the UI, and JSON-LD, so a skill's reputation reads the same everywhere.

REST API

Same functionality over HTTP; see openapi.json for the full machine-readable spec, or llms.txt for a plain-language quick start.

Deploy

Deployed on Vercel; see Next.js deployment docs.

Reviews

No reviews yet

Be the first to review this server!