Blockchain0x sobre MCP.
Dê a qualquer host MCP - Claude Desktop, Cursor, VS Code - ferramentas de carteira de agente com um bloco de configuração. E quando você quiser cobrar por suas próprias ferramentas, use o verdadeiro construtor requirePayment x402.
O servidor @blockchain0x/mcp fornece a um host MCP cinco ferramentas de carteira de agente: ler uma carteira, listar carteiras, verificar uma transação, enviar um pagamento USDC e liquidar uma fatura x402. Execute com npx @blockchain0x/mcp (sua chave permanece na sua máquina) ou aponte para a URL hospedada. Separadamente, o pacote exporta requirePayment para que você possa colocar um preço em suas próprias ferramentas MCP com um desafio x402 402.
Gaste através do MCP. Cobrança através do MCP.
Tarefa um: deixe um agente USAR uma carteira de dentro de seu host. O servidor @blockchain0x/mcp é um proxy fino e sem estado sobre o SDK @blockchain0x/node. Ele expõe cinco ferramentas de carteira para Claude Desktop, Cursor ou VS Code, e o escopo, a concessão e os limites por período da sua chave de API são aplicados pelo backend exatamente como para qualquer outra chamada de API. O servidor não possui chave e não armazena nada.
Tarefa dois: cobre dos agentes para chamar SUAS ferramentas. O MCP tornou a invocação de ferramentas sem atrito, o que é ótimo até que seu servidor esteja consumindo egress, tokens e custos de API de terceiros gratuitamente. O padrão 402 Payment Required se encaixa exatamente aqui. requirePayment gera um desafio x402 estruturado com uma URL de checkout hospedada; você a retorna quando uma ferramenta não é paga e deixa a chamada passar uma vez que o pagamento é liquidado. Clientes que falam x402 pagam automaticamente; os demais apresentam a URL a um humano.
Duas maneiras de executá-lo. Sem instalação para o hospedado.
Execute localmente via stdio com npx (sua chave permanece em sua máquina), ou aponte qualquer host MCP para a URL HTTP hospedada Streamable e passe a chave como um token Bearer. Ambos se integram diretamente à configuração MCP do host. Node 20+ para o caminho 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 é uma chave sk_test_ testnet ou sk_live_ mainnet do seu painel; BLOCKCHAIN0X_API_BASE_URL é https://api.blockchain0x.com por padrão. O servidor encaminha sua chave para o backend e não armazena nada, então o escopo e os limites dessa chave são exatamente o que o agente pode fazer. As cinco ferramentas que ele expõe: get_wallet, list_wallets, get_transaction, send_payment e settle_payment_request.
Controle uma ferramenta com o verdadeiro construtor requirePayment.
requirePayment é uma função pura de @blockchain0x/mcp. Você a chama quando uma ferramenta não é paga, ela cria um desafio x402 402 (preço, sua carteira, uma URL de checkout hospedada) e você devolve esse corpo na forma padrão de erro MCP. Não envolve seu manipulador e não rastreia quem pagou - essa parte é sua, o que mantém o auxiliar pequeno e honesto.
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 o agente chama search_docs unpaid, ele recebe o corpo 402. Clientes que falam x402 pagam automaticamente; Claude Desktop e Cursor exibem a URL de checkout para um humano. Assim que o pagamento é liquidado, você marca que o chamador pagou (próxima seção) e a chamada passa. Prefere um servidor HTTP simples em vez de um MCP? O adaptador x402 do lado de recebimento - createX402Middleware para Express, createX402Plugin para Fastify - faz a mesma filtragem na camada do framework.
Marque o chamador como pago quando o webhook chegar.
Quando um pagamento é liquidado, Blockchain0x POSTa um evento payment.received assinado para sua URL de webhook. Verifique-o com webhooks.verify do SDK do Node, então registre que o chamador pagou em qualquer armazenamento que você já utiliza. Não há cache de recibos enviado para configurar - você possui essa parte, o que significa que não há infraestrutura surpresa.
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 faz HMAC-SHA256 em tempo constante e retorna uma união discriminada, então você ramifica em result.ok sem try/catch. Leia o corpo bruto, não uma cópia analisada, porque a assinatura cobre os bytes exatos. Os eventos enviados são payment.received, payment.sent, wallet.deployed e webhook.test; um pagamento para sua carteira é payment.received. Onde você persiste 'este chamador pagou' - uma linha de banco de dados, uma chave Redis, um mapa em memória para um único processo - é sua decisão.
O servidor é aberto e sem estado. Leia-o.
O servidor MCP e o builder requirePayment são um pass-through fino sobre o Node SDK, sem banco de dados e sem volumes, então não há muito o que auditar - esse é o ponto. O MCP OAuth 2.1 nativo é um próximo passo planejado; o fluxo de chave colada será lançado primeiro porque reutiliza o modelo de confiança já existente das API keys.
github.com/tosh-labs/blockchain0x-nodeA lista completa de tools, os escopos e as URLs dos ambientes hospedados estão documentados em the docs. Endpoints hospedados de staging e dev existem ao lado da produção para testes antes de você apontar uma chave real para eles.
Cinco armadilhas específicas do MCP a evitar.
Estes vêm de operadores que executam servidores MCP pagos em produção. A maioria se relaciona com a arquitetura de cache e o formato de erro específico do protocolo MCP.
requirePayment é um construtor, não middleware
requirePayment é uma função pura: você a chama, ela retorna { status: 402, body }, e você devolve esse corpo quando uma ferramenta não é paga. Não envolve seu manipulador, não rastreia quem pagou e não aceita opções de razão ou janela de cache - apenas amountUsdc, payTo, hostedUrl e uma rede e descrição opcionais. Rastrear o estado do pagamento é seu trabalho: uma linha no seu banco de dados, uma chave no seu próprio Redis, o que se adequar. Blockchain0x fornece o construtor de desafios e o webhook de liquidação, não um cache de recibos.
stdio mantém sua chave na sua máquina
Execute o servidor com npx e BLOCKCHAIN0X_API_KEY no ambiente, e a chave nunca sai da sua máquina - ela é lida localmente, não enviada como um cabeçalho de rede. A URL hospedada é a troca oposta: zero instalação, mas você cola a chave como um token Bearer em mcp.blockchain0x.com. Escolha stdio para a máquina do desenvolvedor, hospedada para uma implantação compartilhada.
Superfícies somente do painel não estão expostas
O servidor é um proxy fino e sem estado sobre @blockchain0x/node. Ele expõe exatamente cinco ferramentas: get_wallet, list_wallets, get_transaction, send_payment, settle_payment_request. Mudanças de identidade, CRUD de chave de API e webhook, retiradas e faturamento são bloqueados sob autenticação de chave de API e o servidor nunca alcança além do SDK para eles. Não espere uma ferramenta para isso - elas vivem no painel por design.
send_payment é idempotente e não tenta novamente
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 em requirePayment é uma string de 6 casas decimais
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.