Blockchain0x su MCP.
Dai a qualsiasi host MCP - Claude Desktop, Cursor, VS Code - strumenti per il portafoglio agente con un blocco di configurazione. E quando vuoi addebitare i tuoi strumenti, usa il vero costruttore requirePayment x402.
Il server @blockchain0x/mcp fornisce a un host MCP cinque strumenti per wallet di agenti: leggi un wallet, elenca i wallet, controlla una transazione, invia un pagamento USDC e regola una fattura x402. Eseguilo con npx @blockchain0x/mcp (la tua chiave rimane sul tuo computer) o punta all'URL ospitato. Separatamente, il pacchetto esporta requirePayment così puoi mettere un prezzo sui tuoi strumenti MCP con una sfida x402 402.
Spendi tramite MCP. Addebita tramite MCP.
Primo compito: lascia che un agente UTILIZZI un wallet dall'interno del suo host. Il server @blockchain0x/mcp è un sottile proxy stateless sopra il @blockchain0x/node SDK. Espone cinque strumenti wallet a Claude Desktop, Cursor o VS Code, e l'ambito, l'assegnazione e i limiti per periodo della tua chiave API sono applicati dal backend esattamente come per qualsiasi altra chiamata API. Il server non detiene chiavi e non memorizza nulla.
Secondo compito: addebitare agli agenti l'uso dei TUOI strumenti. MCP ha reso l'invocazione degli strumenti senza attriti, il che è fantastico finché il tuo server non consuma egress, token e costi API di terze parti gratuitamente. Il modello 402 Payment Required si adatta perfettamente qui. requirePayment genera una sfida x402 strutturata con un URL di checkout ospitato; la restituisci quando uno strumento non è pagato e lasci passare la chiamata una volta che il pagamento è regolato. I client che parlano x402 pagano automaticamente; gli altri mostrano l'URL a un umano.
Due modi per eseguirlo. Nessuna installazione per quello ospitato.
Esegui localmente tramite stdio con npx (la tua chiave rimane sulla tua macchina), oppure punta qualsiasi host MCP all'URL HTTP Streamable ospitato e passa la chiave come token Bearer. Entrambi vanno direttamente nella configurazione MCP dell'host. Node 20+ per il percorso locale.
{ "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 è una chiave sk_test_ testnet o sk_live_ mainnet dal tuo dashboard; BLOCKCHAIN0X_API_BASE_URL predefinito è https://api.blockchain0x.com. Il server inoltra la tua chiave al backend e non memorizza nulla, quindi l'ambito e i limiti su quella chiave sono esattamente ciò che l'agente può fare. I cinque strumenti che espone: get_wallet, list_wallets, get_transaction, send_payment e settle_payment_request.
Limita uno strumento con il vero costruttore requirePayment.
requirePayment è una funzione pura di @blockchain0x/mcp. La chiami quando uno strumento non è pagato, genera una sfida x402 402 (prezzo, il tuo portafoglio, un URL di checkout ospitato) e restituisci quel corpo nella forma di errore standard MCP. Non avvolge il tuo gestore e non tiene traccia di chi ha pagato - quella parte è tua, il che mantiene l'aiuto piccolo e onesto.
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) }] }; }, );
Quando l'agente chiama search_docs non pagato, riceve il corpo 402. I clienti che parlano x402 lo pagano automaticamente; Claude Desktop e Cursor mostrano l'URL di checkout per un umano. Una volta che il pagamento si è concluso, segni che quel chiamante ha pagato (sezione successiva) e la chiamata va a buon fine. Preferisci un server HTTP semplice rispetto a uno MCP? L'adattatore x402 lato ricevente - createX402Middleware per Express, createX402Plugin per Fastify - fa lo stesso gating a livello di framework.
Segna il chiamante come pagato quando il webhook arriva.
Quando un pagamento si stabilisce, Blockchain0x POSTa un evento firmato payment.received al tuo URL webhook. Verificalo con webhooks.verify dal Node SDK, poi registra che il chiamante ha pagato in qualsiasi store tu stia già utilizzando. Non c'è una cache di ricevute inclusa da configurare - possiedi quella parte, il che significa nessuna infrastruttura a sorpresa.
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 esegue HMAC-SHA256 in tempo costante e restituisce un'unione discriminata, quindi ramifichi su result.ok senza try/catch. Leggi il corpo grezzo, non una copia analizzata, perché la firma copre i byte esatti. Gli eventi inviati sono payment.received, payment.sent, wallet.deployed e webhook.test; un pagamento al tuo portafoglio è payment.received. Dove persisti 'questo chiamante ha pagato' - una riga nel tuo database, una chiave in Redis, una mappa in memoria per un singolo processo - è una tua scelta.
Il server è aperto e senza stato. Leggilo.
Il server MCP e il builder requirePayment sono un sottile pass-through sopra il Node SDK, senza database e senza volumi, quindi non c'è molto da verificare - ed è proprio questo il punto. Il supporto nativo a MCP OAuth 2.1 è previsto come evoluzione successiva; il flusso con chiave incollata viene rilasciato per primo perché riutilizza il modello di trust delle API key esistente.
github.com/tosh-labs/blockchain0x-nodeL'elenco completo degli strumenti, gli scope e gli URL degli ambienti hosted sono documentati in the docs. Gli endpoint hosted di staging e dev esistono insieme alla produzione per i test prima di puntare una chiave reale.
Cinque trappole specifiche di MCP da evitare.
Questi provengono da operatori che gestiscono server MCP a pagamento in produzione. La maggior parte riguarda l'architettura della cache e il formato di errore specifico del protocollo MCP.
requirePayment è un costruttore, non middleware
requirePayment è una funzione pura: la chiami, restituisce { status: 402, body }, e restituisci quel corpo quando uno strumento non è pagato. Non avvolge il tuo gestore, non tiene traccia di chi ha pagato, e non prende opzioni di motivo o finestra di cache - solo amountUsdc, payTo, hostedUrl e una rete e descrizione opzionali. Tenere traccia dello stato di pagamento è tuo compito: una riga nel tuo database, una chiave nel tuo Redis, qualunque cosa si adatti. Blockchain0x fornisce il costruttore della sfida e il webhook di regolamento, non una cache delle ricevute.
stdio mantiene la tua chiave sulla tua macchina
Esegui il server con npx e BLOCKCHAIN0X_API_KEY nell'ambiente, e la chiave non lascia mai la tua macchina - viene letta localmente, non inviata come intestazione di rete. L'URL ospitato è il commercio opposto: zero installazione, ma incolli la chiave come token Bearer a mcp.blockchain0x.com. Scegli stdio per la macchina di un sviluppatore, ospitato per un'implementazione condivisa.
Le superfici solo da dashboard non sono esposte
Il server è un proxy sottile e senza stato su @blockchain0x/node. Espone esattamente cinque strumenti: get_wallet, list_wallets, get_transaction, send_payment, settle_payment_request. Le modifiche all'identità, CRUD di API-key e webhook, prelievi e fatturazione sono bloccati sotto l'autenticazione API-key e il server non accede mai oltre l'SDK. Non aspettarti uno strumento per quelli - vivono nel dashboard per design.
send_payment è idempotente e non ripete
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 su requirePayment è una stringa a 6 decimali
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.