Blockchain0x sur MCP.
Donnez à tout hôte MCP - Claude Desktop, Cursor, VS Code - des outils de portefeuille d'agent avec un bloc de configuration. Et quand vous voulez facturer vos propres outils, utilisez le véritable constructeur requirePayment x402.
Le serveur @blockchain0x/mcp fournit à un hôte MCP cinq outils de portefeuille d'agent : lire un portefeuille, lister les portefeuilles, vérifier une transaction, envoyer un paiement USDC et régler une facture x402. Exécutez-le avec npx @blockchain0x/mcp (votre clé reste sur votre machine) ou pointez vers l'URL hébergée. Séparément, le paquet exporte requirePayment afin que vous puissiez mettre un prix sur vos propres outils MCP avec un défi x402 402.
Dépensez via MCP. Chargez via MCP.
Tâche numéro un : permettre à un agent d'UTILISER un portefeuille depuis l'intérieur de son hôte. Le serveur @blockchain0x/mcp est un proxy mince et sans état sur le SDK @blockchain0x/node. Il expose cinq outils de portefeuille à Claude Desktop, Cursor ou VS Code, et la portée, l'allocation et les plafonds par période de votre clé API sont appliqués par le backend exactement comme pour tout autre appel API. Le serveur ne détient aucune clé et ne stocke rien.
Tâche numéro deux : facturer aux agents l'appel de VOS outils. MCP a rendu l'invocation des outils sans friction, ce qui est génial jusqu'à ce que votre serveur consomme des coûts de sortie, des jetons et des API tierces gratuitement. Le modèle 402 Payment Required s'applique exactement ici. requirePayment crée un défi x402 structuré avec une URL de paiement hébergée ; vous le retournez lorsqu'un outil n'est pas payé et laissez l'appel passer une fois le paiement réglé. Les clients qui parlent x402 paient automatiquement ; les autres affichent l'URL à un humain.
Deux façons de l'exécuter. Pas d'installation pour celui hébergé.
Exécutez-le localement via stdio avec npx (votre clé reste sur votre machine), ou pointez n'importe quel hôte MCP vers l'URL HTTP Streamable hébergée et passez la clé en tant que token Bearer. Les deux s'intègrent directement dans la configuration MCP de l'hôte. Node 20+ pour le chemin local.
{ "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 est une clé sk_test_ testnet ou sk_live_ mainnet de votre tableau de bord ; BLOCKCHAIN0X_API_BASE_URL par défaut est https://api.blockchain0x.com. Le serveur transmet votre clé au backend et ne stocke rien, donc la portée et les plafonds de cette clé sont exactement ce que l'agent peut faire. Les cinq outils qu'il expose : get_wallet, list_wallets, get_transaction, send_payment, et settle_payment_request.
Contrôlez un outil avec le véritable constructeur requirePayment.
requirePayment est une fonction pure de @blockchain0x/mcp. Vous l'appelez lorsqu'un outil est impayé, il génère un défi x402 402 (prix, votre portefeuille, une URL de paiement hébergée), et vous renvoyez ce corps dans la forme d'erreur standard MCP. Il n'enveloppe pas votre gestionnaire et ne suit pas qui a payé - cette partie vous appartient, ce qui garde l'assistant petit et honnête.
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) }] }; }, );
Lorsque l'agent appelle search_docs sans paiement, il reçoit le corps 402. Les clients qui parlent x402 le paient automatiquement ; Claude Desktop et Cursor affichent l'URL de paiement pour un humain. Une fois le paiement réglé, vous marquez cet appelant comme payé (section suivante) et l'appel passe. Préférez-vous un serveur HTTP simple à un serveur MCP ? L'adaptateur x402 côté réception - createX402Middleware pour Express, createX402Plugin pour Fastify - fait le même filtrage au niveau du framework.
Marquez l'appelant comme payé lorsque le webhook arrive.
Lorsque qu'un paiement est réglé, Blockchain0x envoie un événement signé payment.received à votre URL de webhook. Vérifiez-le avec webhooks.verify du SDK Node, puis enregistrez que l'appelant a payé dans le magasin que vous utilisez déjà. Il n'y a pas de cache de reçu expédié à configurer - vous possédez cette partie, ce qui signifie pas d'infrastructure surprise.
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 effectue HMAC-SHA256 en temps constant et renvoie une union discriminée, donc vous branchez sur result.ok sans try/catch. Lisez le corps brut, pas une copie analysée, car la signature couvre les octets exacts. Les événements expédiés sont payment.received, payment.sent, wallet.deployed, et webhook.test ; un paiement vers votre portefeuille est payment.received. Où vous persistez 'cet appelant a payé' - une ligne de base de données, une clé Redis, une carte en mémoire pour un seul processus - est votre choix.
Le serveur est ouvert et sans état. Lisez-le.
Le serveur MCP et le constructeur requirePayment sont un simple passage par le SDK Node sans base de données ni volumes, donc il n'y a pas grand-chose à auditer - ce qui est le but. L'OAuth 2.1 natif de MCP est un suivi prévu ; le chemin de clé collée est expédié en premier car il réutilise le modèle de confiance de clé API existant.
github.com/tosh-labs/blockchain0x-nodeLa liste complète des outils, les portées et les URL des environnements hébergés sont documentées dans la documentation. Les points de terminaison de staging et de développement existent aux côtés de la production pour des tests avant que vous ne pointez une vraie clé vers cela.
Cinq pièges spécifiques à MCP à éviter.
Celles-ci proviennent d'opérateurs exécutant des serveurs MCP payants en production. La plupart concernent l'architecture de cache et le format d'erreur spécifique du protocole MCP.
requirePayment est un constructeur, pas un middleware
requirePayment est une fonction pure : vous l'appelez, elle renvoie { status: 402, body }, et vous renvoyez ce corps lorsque l'outil est impayé. Il n'enveloppe pas votre gestionnaire, ne suit pas qui a payé, et ne prend pas d'options de raison ou de fenêtre de cache - juste amountUsdc, payTo, hostedUrl, et un réseau et une description optionnels. Le suivi de l'état de paiement est votre travail : une ligne dans votre base de données, une clé dans votre propre Redis, quoi que ce soit qui convienne. Blockchain0x expédie le constructeur de défi et le webhook de règlement, pas un cache de reçus.
stdio garde votre clé sur votre machine
Exécutez le serveur avec npx et BLOCKCHAIN0X_API_KEY dans l'environnement, et la clé ne quitte jamais votre boîte - elle est lue localement, pas envoyée en tant qu'en-tête réseau. L'URL hébergée est l'échange opposé : zéro installation, mais vous collez la clé en tant que token Bearer à mcp.blockchain0x.com. Choisissez stdio pour la machine d'un développeur, hébergé pour un déploiement partagé.
Les surfaces réservées au tableau de bord ne sont pas exposées
Le serveur est un mince proxy sans état sur @blockchain0x/node. Il expose exactement cinq outils : get_wallet, list_wallets, get_transaction, send_payment, settle_payment_request. Les changements d'identité, la gestion des clés API et des webhooks, les retraits et la facturation sont bloqués sous l'authentification par clé API et le serveur n'atteint jamais le SDK pour cela. N'attendez pas un outil pour cela - ils vivent dans le tableau de bord par conception.
send_payment est idempotent et ne réessaie pas
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 sur requirePayment est une chaîne à 6 décimales
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.