Ir para o conteúdo principal
INTEGRAÇÃO MCP

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.

RESPOSTA CURTA

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.

DOIS TRABALHOS, UM PACOTE

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.

EXECUTE O SERVIDOR

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.

LOCAL - STDIO (npx)
{
  "mcpServers": {
    "blockchain0x": {
      "command": "npx",
      "args": ["-y", "@blockchain0x/mcp"],
      "env": {
        "BLOCKCHAIN0X_API_KEY": "sk_live_...",
        "BLOCKCHAIN0X_API_BASE_URL": "https://api.blockchain0x.com"
      }
    }
  }
}
HOSPEDADO - HTTP TRANSMISSÍVEL
{
  "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.

PRECIFIQUE SUAS PRÓPRIAS FERRAMENTAS

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.

SERVER.TS
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.

CONFIRMAR O PAGAMENTO

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.

WEBHOOK.TS
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.

FONTE E DOCUMENTOS

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-node

A 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.

ARMADILHAS COMUNS

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.

PITFALL 1

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.

PITFALL 2

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.

PITFALL 3

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.

PITFALL 4

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".

PITFALL 5

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.

PERGUNTAS FREQUENTES

Três perguntas específicas sobre MCP.

Isso funciona com Claude Desktop, Cursor e VS Code diretamente?

Sim. Eles são hosts MCP padrão. Adicione o servidor blockchain0x à configuração MCP do host - o bloco stdio (npx + sua chave no env) ou o bloco hospedado (a URL mcp.blockchain0x.com + uma chave Bearer) - e as cinco ferramentas de carteira aparecem para o agente. A partir daí, o agente pode ler uma carteira, verificar uma transação, enviar um pagamento USDC ou liquidar uma fatura x402, tudo dentro do escopo, limite e caps que sua chave API já impõe.

O que o agente pode realmente fazer uma vez que o servidor está conectado?

Cinco coisas, correspondendo às cinco ferramentas: get_wallet e list_wallets leem os metadados da carteira, get_transaction consulta o status e hash de uma transação, send_payment faz um pagamento USDC de saída, e settle_payment_request liquida uma fatura x402 com prova on-chain. Essa é toda a superfície. O servidor é um proxy sem estado: não mantém chave, não armazena nada e não pode acessar operações apenas do painel, então um agente não pode rotacionar chaves, mudar identidade ou retirar através dele.

Como cobro dos agentes para chamar minhas próprias ferramentas MCP?

Use o helper real requirePayment exportado por @blockchain0x/mcp. Chame requirePayment({ amountUsdc, payTo, hostedUrl }) dentro da sua ferramenta quando o chamador não tiver pago e retorne o corpo 402 resultante - ele é compatível com @blockchain0x/x402. Você rastreia quem pagou (um webhook em payment.received mais seu próprio armazenamento) e deixa a chamada passar uma vez que eles tenham pago. Para um servidor HTTP simples em vez de um MCP, o adaptador x402 do lado de recebimento (createX402Middleware para Express, createX402Plugin para Fastify) faz o mesmo trabalho na camada do framework.

Dê ao seu agente uma carteira via MCP.

Um bloco de configuração para conectar as ferramentas de carteira. O verdadeiro construtor requirePayment quando você quer cobrar pelo seu próprio. Livre para começar.