About noden
Noden is a marketplace for agents to find and purchase callable skills, with Lightning payments and output schema checks. Its MCP server provides catalog and purchase operations with operator limits.
Key features
- 01Search and inspect skill listings
- 02Pay per call with Bitcoin Lightning
- 03Validate outputs against JSON Schema
- 04Enforce operator spend caps
- 05Check order status and retry failures
Use cases
- 01Find a callable capability for an agent
- 02Purchase a skill for a specific input
- 03Track payment and delivery outcomes
MCP support
A remote Streamable HTTP MCP server at `https://shop.getnoden.com/mcp` exposes tools for searching, purchasing and checking skills, plus the `noden://catalog` resource.
Configuration
Remote servers need no local install. Pick your client, then copy the config or install in one click.
https://shop.getnoden.com/mcpclaude mcp add --transport http com-getnoden-noden https://shop.getnoden.com/mcp{"mcpServers":{"com-getnoden-noden":{"type":"http","url":"https://shop.getnoden.com/mcp"}}}Open in Cursor{"servers":{"com-getnoden-noden":{"type":"http","url":"https://shop.getnoden.com/mcp"}}}Open in VS Code{"mcpServers":{"com-getnoden-noden":{"type":"http","url":"https://shop.getnoden.com/mcp"}}}{"mcpServers":{"com-getnoden-noden":{"serverUrl":"https://shop.getnoden.com/mcp"}}}Run commands in a terminal; paste JSON into the client’s MCP config and restart. Servers that need sign-in will prompt on first connect.
Tools
6| Parameter | Type | Required | Description |
|---|---|---|---|
| tags | array | No | Extra keywords, matched the same way as query |
| query | string | No | Free-text capability description, e.g. 'reviews contracts' |
| category | string | No | |
| max_price_sats | number | No |
Details
From the project READMENoden 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 for the exact price of one call, and the delivered output is checked against the schema. A failed check returns no output and earns a single-use retry token for one free call. 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.
Quick start for an agent: call create_operator (or POST /api/v1/operators)
to get an API key, search_skills to find a skill, then purchase_skill —
keys you create this way pay over Lightning; the one free call belongs to a verified human account (sign up and confirm your email).
Step-by-step for any LLM: getnoden.com/connect.
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
| Tool | Params | Returns |
|---|---|---|
search_skills | query?, tags?, category?, max_price_sats? | { skills: [{ id, name, description, price_sats, reputation, success_rate, reputation_status }] } |
get_skill | skill_id | { skill: {...full listing, input schema, output field names} } |
create_operator | spend_cap_sats? | { api_key, spend_cap_daily_sats, free_first_call, note } — self-serve key, no human signup; fixed daily cap (default 1000, max 5000 sats); no free call (that belongs to a verified account) |
purchase_skill | skill_id, input, api_key, agent_wallet_connection? | { order_id, amount_sats, invoice, expires_at, wallet_payment_requested?, wallet_payment_error? } — or, for a verified account's one free call, { order_id, amount_sats: 0, free_trial: true, invoice: null } (no payment; just poll) |
check_order_status | order_id | { order: {...status (pending/completed/failed); output + verification result once completed; a retryToken if failed} } |
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:
- Resolves
api_keyto an operator account — rejects with a 401-equivalentMarketplaceErrorif it's missing or unknown. - Checks the seller allowlist (unless the operator has
allowAllSellersset). - 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. - Validates
inputagainst 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 that triggers running the skill. 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,
same as if the invoice had been handed off any other way and not yet paid.
[email protected]'s publishedexportsmap omits the./nip47subpath even though the module exists in the package —lib/payments/nwc.tsreimplements the same two functions (parseConnectionString,makeNwcRequestEvent) directly fromnostr-tools's already-exportednip04,pure, andkindssubpaths 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.
Comments
New to MCP?
From what the protocol is to installing your first server, these answers cover most first questions.
An open protocol that defines how AI applications connect to external tools and data in a uniform way. Clients talk to the model; MCP servers provide tools, resources and prompt templates. They exchange standard messages, so one server can be reused by many clients.