
Como Construir um Servidor MCP Pay-Per-Call com x402 e USDC
Se você construiu servidores MCP para Claude Code, você conhece o problema de distribuição: qualquer um que instala seu servidor tem acesso ilimitado e gratuito. Não há uma maneira limpa de cobrar por chamada sem criar sua própria autenticação + cobrança.
x402 resolve isso na camada HTTP. Aqui está como construir um servidor MCP pay-per-call onde cada chamada de ferramenta custa USDC — liquidado instantaneamente na Base.
O que é x402?
x402 é um protocolo de pagamento HTTP que revive o código de status 402 Payment Required, que foi abandonado. O fluxo:
- O cliente solicita um recurso
- O servidor retorna
402com um cabeçalhoPAYMENT-REQUIREDcontendo detalhes de pagamento (preço, carteira, rede) - O cliente assina uma transferência de USDC usando EIP-3009 (sem gás necessário do cliente)
- O cliente tenta novamente com um cabeçalho
PAYMENT-SIGNATURE - O facilitador Coinbase valida e liquida na cadeia
- O servidor retorna o recurso
Sem chaves de API. Sem infraestrutura de cobrança. Sem assinaturas. Apenas HTTP + cripto.
A Pilha
@modelcontextprotocol/sdk — servidor MCP
@x402/core — protocolo cliente x402
@x402/evm — assinatura de pagamento EVM
viem — gerenciamento de carteira/conta
Construindo o Cliente de Pagamento
A chave é conectar corretamente o cliente x402. A API v2 (atual a partir de @x402/core 2.11) se parece com isso:
const { x402Client, x402HTTPClient } = require("@x402/core/client");
const { ExactEvmScheme } = require("@x402/evm/exact/client");
const { toClientEvmSigner } = require("@x402/evm");
const { privateKeyToAccount } = require("viem/accounts");
function buildHttpClient() {
const key = process.env.WALLET_PRIVATE_KEY;
const pk = key.startsWith("0x") ? key : "0x" + key;
const account = privateKeyToAccount(pk);
const signer = toClientEvmSigner(account);
const coreClient = new x402Client().register("eip155:*", new ExactEvmScheme(signer));
return new x402HTTPClient(coreClient);
}
Importante: passe account para toClientEvmSigner, não walletClient. No viem v2, walletClient.address é indefinido — o endereço está em account.address.
Fazendo uma Solicitação Paga
O cliente http não tem um método .fetch() na v2. Você lida com o fluxo 402 manualmente:
async function paidFetch(httpClient, url) {
const res = await fetch(url);
if (res.status !== 402) {
if (!res.ok) throw new Error(`HTTP ${res.status}`);
return res.json();
}
// Extraia os requisitos de pagamento do cabeçalho
let body;
try { body = await res.clone().json(); } catch (_) {}
const paymentRequired = httpClient.getPaymentRequiredResponse(
(name) => res.headers.get(name),A implementação de servidores MCP com cobrança por chamada pode transformar a forma como empresas brasileiras monetizam serviços digitais. O uso de protocolos como x402 pode facilitar a integração de pagamentos em sistemas existentes, aumentando a eficiência e a receita.
Noticias relacionadas

Cadeia de Ação MCP: O Ataque que Suas Permissões Não Conseguem Ver
O artigo discute como ataques em cadeia de ações em servidores MCP podem comprometer contas na nuvem, destacando falhas nas verificações de permissões que permitem a exfiltração de dados.

SQLite Local Supera Documentos em Nuvem para Codificação com IA
O lançamento da versão 1.0.0 do @neuledge/context apresenta um servidor de documentação local para assistentes de codificação em IA, eliminando a necessidade de serviços em nuvem e suas limitações.

smolagents + MCP Bridge: Conecte Qualquer Ferramenta ao Seu Agente
O Model Context Protocol alcançou 97 milhões de instalações. O smolagents + MCPClient permite conectar agentes Python a um ecossistema robusto sem adaptações personalizadas. Este guia ensina a instalação e conexão com servidores locais e remotos.
Gostou do conteudo?
Receba toda semana as principais novidades sobre WebMCP.