Blockchain0x via MCP.
Geef elke MCP-host - Claude Desktop, Cursor, VS Code - agentportemonneetools met één configuratieblok. En wanneer je voor je eigen tools wilt vragen, gebruik je de echte requirePayment x402-builder.
De @blockchain0x/mcp server geeft een MCP-host vijf agent-wallettools: lees een wallet, lijst wallets, controleer een transactie, stuur een USDC-betaling en verwerk een x402-factuur. Voer het uit met npx @blockchain0x/mcp (je sleutel blijft op je machine) of wijs naar de gehoste URL. Afzonderlijk exporteert het pakket requirePayment zodat je een prijs kunt stellen op je eigen MCP-tools met een x402 402-uitdaging.
Besteed via MCP. Breng kosten in rekening via MCP.
Taak één: laat een agent een portemonnee GEBRUIKEN vanuit zijn host. De @blockchain0x/mcp-server is een dunne, stateless proxy over de @blockchain0x/node SDK. Het biedt vijf portemonneetools aan Claude Desktop, Cursor of VS Code, en de reikwijdte, toelage en limieten per periode van je API-sleutel worden precies zoals bij elke andere API-aanroep afgedwongen door de backend. De server houdt geen sleutel vast en slaat niets op.
Taak twee: vraag agents om JOUW tools aan te roepen. MCP maakte de aanroep van tools soepel, wat geweldig is totdat je server egress, tokens en kosten voor derde partijen gratis consumeert. Het 402 Payment Required-patroon past hier precies. requirePayment genereert een gestructureerde x402-uitdaging met een gehoste checkout-URL; je retourneert het wanneer een tool niet betaald is en laat de oproep doorgaan zodra de betaling is afgehandeld. Clients die x402 spreken, betalen automatisch; de rest toont de URL aan een mens.
Twee manieren om het uit te voeren. Geen installatie voor de gehoste versie.
Draai het lokaal via stdio met npx (je sleutel blijft op je machine), of wijs een MCP-host aan de gehoste Streamable HTTP-URL en geef de sleutel door als een Bearer-token. Beide worden rechtstreeks in de MCP-configuratie van de host geplaatst. Node 20+ voor het lokale pad.
{ "mcpServers": { "blockchain0x": { "command": "npx", "args": ["-y", "@blockchain0x/mcp"], "env": { "BLOCKCHAIN0X_API_KEY": "sk_live_...", "BLOCKCHAIN0X_API_BASE_URL": "https://api.blockchain0x.com" } } } }
{ "mcpServers": { "blockchain0x": { "url": "https://mcp.blockchain0x.com/mcp", "headers": { "Authorization": "Bearer sk_live_..." } } } }
BLOCKCHAIN0X_API_KEY is een sk_test_ testnet of sk_live_ mainnet sleutel van je dashboard; BLOCKCHAIN0X_API_BASE_URL is standaard ingesteld op https://api.blockchain0x.com. De server stuurt je sleutel door naar de backend en slaat niets op, zodat de scope en limieten op die sleutel precies zijn wat de agent kan doen. De vijf tools die het blootstelt: get_wallet, list_wallets, get_transaction, send_payment en settle_payment_request.
Beperk een tool met de echte requirePayment-builder.
requirePayment is een pure functie van @blockchain0x/mcp. Je roept het aan wanneer een tool niet betaald is, het mint een x402 402-uitdaging (prijs, jouw wallet, een gehoste checkout-URL), en je geeft dat lichaam terug in de standaard MCP-foutvorm. Het omhult je handler niet en het houdt niet bij wie heeft betaald - dat deel is van jou, wat de helper klein en eerlijk houdt.
import { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js"; import { requirePayment } from "@blockchain0x/mcp"; import { z } from "zod"; const server = new McpServer({ name: "docs-search-mcp", version: "1.0.0" }); server.tool( "search_docs", "Semantic search across our private docs", { query: z.string() }, async ({ query }, extra) => { if (!hasPaid(extra)) { // Mint an x402 402 challenge and hand it back to the caller. const { body } = requirePayment({ amountUsdc: "0.10", payTo: "0xYourWallet", hostedUrl: "https://pay.blockchain0x.com/checkout/abc", }); return { content: [{ type: "text", text: JSON.stringify(body) }], isError: true }; } const results = await runVectorSearch(query); return { content: [{ type: "text", text: JSON.stringify(results) }] }; }, );
Wanneer de agent search_docs onbetaald aanroept, krijgt hij de 402-body. Klanten die x402 spreken, betalen het automatisch; Claude Desktop en Cursor tonen de checkout-URL voor een mens. Zodra de betaling is afgehandeld, markeer je die beller als betaald (volgende sectie) en gaat de oproep door. Geef je de voorkeur aan een gewone HTTP-server boven een MCP-server? De ontvangzijde x402-adapter - createX402Middleware voor Express, createX402Plugin voor Fastify - doet dezelfde afscherming op het frameworkniveau.
Markeer de beller als betaald wanneer de webhook aankomt.
Wanneer een betaling wordt afgehandeld, POST Blockchain0x een ondertekende payment.received-gebeurtenis naar je webhook-URL. Verifieer het met webhooks.verify van de Node SDK, en registreer dan dat de beller betaald heeft in welke opslag je ook al gebruikt. Er is geen geleverde ontvangstcache om te configureren - jij bezit dat stuk, wat betekent dat er geen verrassende infrastructuur is.
import express from "express"; import { webhooks } from "@blockchain0x/node"; const app = express(); // Capture the RAW body. The HMAC is over the exact bytes on the wire. app.use(express.raw({ type: "application/json" })); app.post("/webhooks/payment", (req, res) => { const result = webhooks.verify({ headers: req.headers, rawBody: req.body, // Buffer, raw bytes secret: process.env.BLOCKCHAIN0X_WEBHOOK_SECRET!, }); if (!result.ok) return res.status(400).json({ code: result.code }); if (result.eventType === "payment.received") { // Mark this payer paid however you like - a DB row, a Redis key, your call. markPaid(result.eventId); } res.status(200).send("ok"); });
webhooks.verify doet HMAC-SHA256 in constante tijd en retourneert een gediscrimineerde unie, zodat je takken op result.ok zonder try/catch. Lees het ruwe lichaam, niet een geparsed exemplaar, omdat de handtekening de exacte bytes dekt. De verzonden gebeurtenissen zijn payment.received, payment.sent, wallet.deployed, en webhook.test; een betaling naar je wallet is payment.received. Waar je 'deze beller heeft betaald' vasthoudt - een database rij, een Redis sleutel, een in-memory kaart voor een enkel proces - is jouw keuze.
De server is open en stateless. Lees het.
De MCP server en de requirePayment builder zijn een dunne doorgeeflaag boven de Node SDK, zonder database en zonder volumes, dus er is weinig te auditen - en dat is precies de bedoeling. Native MCP OAuth 2.1 is een geplande vervolgstap; het pad met geplakte sleutel wordt eerst uitgebracht, omdat het het bestaande API-key vertrouwensmodel hergebruikt.
github.com/tosh-labs/blockchain0x-nodeDe volledige lijst met tools, scopes en de hosted environment URLs zijn gedocumenteerd in de docs. Staging- en dev hosted endpoints bestaan naast production om te testen voordat je er een echte key op richt.
Vijf MCP-specifieke valkuilen om te vermijden.
Deze komen van operators die betaalde MCP-servers in productie draaien. De meeste hebben betrekking op de cache-architectuur en het specifieke foutformaat van het MCP-protocol.
requirePayment is een bouwer, geen middleware
requirePayment is een pure functie: je roept het aan, het retourneert { status: 402, body }, en je geeft dat lichaam terug wanneer een tool niet betaald is. Het omhult je handler niet, het houdt niet bij wie heeft betaald, en het neemt geen reden of cache-venster opties - alleen amountUsdc, payTo, hostedUrl, en een optioneel netwerk en beschrijving. Het bijhouden van de betalingsstatus is jouw taak: een rij in je database, een sleutel in je eigen Redis, wat past. Blockchain0x levert de uitdaging bouwer en de afreken webhook, niet een ontvangst cache.
stdio houdt je sleutel op je machine
Draai de server met npx en BLOCKCHAIN0X_API_KEY in de omgeving, en de sleutel verlaat nooit je box - deze wordt lokaal gelezen, niet als een netwerkheader verzonden. De gehoste URL is de tegenovergestelde handel: geen installatie, maar je plakt de sleutel als een Bearer-token naar mcp.blockchain0x.com. Kies stdio voor de eigen machine van een ontwikkelaar, gehost voor een gedeelde implementatie.
Dashboard-only oppervlakken zijn niet blootgesteld
De server is een dunne, stateless proxy over @blockchain0x/node. Het biedt precies vijf tools: get_wallet, list_wallets, get_transaction, send_payment, settle_payment_request. Identiteitswijzigingen, API-sleutel en webhook CRUD, opnames en facturering zijn hard-blokkeerd onder API-sleutelauthenticatie en de server bereikt ze nooit voorbij de SDK. Verwacht geen tool voor die - ze leven in het dashboard volgens ontwerp.
send_payment is idempotent en probeert niet opnieuw
The send_payment tool wraps payments.create: it auto-mints an Idempotency-Key so a retried call collapses to one transfer, and it does not retry on its own. It can also answer 503 until the chain adapter is wired for your network. If the model gets a 503, do not let it hammer the tool - surface the state and move on. amountWei is USDC base units (6 decimals), so 0.01 USDC is the string "10000".
amountUsdc op requirePayment is een 6-decimaal string
requirePayment validates amountUsdc as a USDC decimal with at most six fractional digits, so "0.10" is fine and "0.1234567" throws. payTo and hostedUrl are required; network defaults to mainnet. Keep the hostedUrl pointing at a real checkout you control (the pattern is https://pay.blockchain0x.com/checkout/<id>). A malformed amount fails fast rather than minting a broken challenge.