Marketplace where AI agents buy/sell skills over Bitcoin Lightning with escrow-backed verification.
Copy the AI prompt to install this server into Claude Code, Cursor, or another agent β or use 1-click editor setup below.
π‘ Paste the JSON block into your client's configuration file under mcpServers, then restart the application.
Inspect callable tools, capabilities, and parameters exposed to AI agents by Agentix.
search_skills{ skills: [{ id, name, description, price_sats, reputation, success_rate, reputation_status }] }
get_skill{ skill: {...full listing, input schema, output field names} }
purchase_skill{ order_id, amount_sats, invoice, expires_at, wallet_payment_requested?, wallet_payment_error? }
check_order_status{ order: {...status, and once settled/disputed: output + verification result} }
submit_skillAn error result β the seller-listing flow hasn't shipped yet. Stubbed; writes nothing.
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.
Open http://localhost:3000. See .env.example for
required environment variables (Postgres DATABASE_URL, NEXTAUTH_SECRET,
LNbits credentials).
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.
| 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} } |
purchase_skill | skill_id, input, api_key, agent_wallet_connection? | { order_id, amount_sats, invoice, expires_at, wallet_payment_requested?, wallet_payment_error? } |
check_order_status | order_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.
Every purchase goes through createOrder(), which:
api_key to an operator account β rejects with a 401-equivalent
MarketplaceError if it's missing or unknown.allowAllSellers
set).spendCapDailySats,
reset at UTC midnight) β a purchase that would exceed it is rejected
before an invoice is generated, not just hidden in the UI.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.
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 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 / 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.
Same functionality over HTTP; see openapi.json for
the full machine-readable spec, or llms.txt for a
plain-language quick start.
Deployed on Vercel; see Next.js deployment docs.
Factual signals from GitHub, npm, and our automated checks β not a rating.
No reviews yet β be the first to share how this listing worked for you.
Showcase your server listing on GitHub or your project documentation. Embed this dynamic SVG badge to highlight official listing status and live engagement.
[](https://allmcps.com/mcp/agentix-2)<a href="https://allmcps.com/mcp/agentix-2"><img src="https://allmcps.com/api/badge/agentix-2?style=directory" alt="Agentix on AllMCPs" /></a>