← Andreax Blog

Cómo construir un MCP server con pagos x402

Tools used: inferencia-llm · ocr · traducir

MCP (Model Context Protocol) le da a un agente de IA una forma estándar de descubrir y llamar tools. Pero MCP por sí solo no dice nada sobre cómo cobrar por esas tools — la mayoría de los servidores MCP son gratis o requieren una API key fija. x402 resuelve eso: convierte el código HTTP 402 Payment Required (que existe desde HTTP/1.1 pero casi nadie usa) en un protocolo de pago real, por llamada, sin cuentas ni API keys.

La idea central es simple: cuando un agente llama una tool sin pagar, el servidor responde 402 con un `PaymentRequirements` — cuánto cuesta, en qué red, a qué dirección, y qué esquema de pago acepta. El agente firma una autorización EIP-3009 (`transferWithAuthorization`) con su wallet, la manda de vuelta en la cabecera `X-PAYMENT`, y el servidor la verifica y liquida on-chain antes de ejecutar la tool de verdad.

Un reto 402 típico se ve así (formato x402 v2):

{
  "x402Version": 2,
  "accepts": [{
    "scheme": "exact",
    "network": "eip155:8453",
    "amount": "20000",
    "asset": "0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913",
    "payTo": "0xTU_WALLET",
    "maxTimeoutSeconds": 60
  }]
}

`amount` está en unidades atómicas de USDC (6 decimales — 20000 = $0.02). `network` usa el formato CAIP-2 (`eip155:8453` es Base mainnet, `eip155:84532` es Base Sepolia testnet). `asset` es el contrato del token — para USDC nativo en Base, siempre `0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913`.

Lo que hace gasless este esquema para el que paga es EIP-3009: en vez de que el pagador mande su propia transacción (y pague gas), firma un mensaje EIP-712 fuera de la cadena autorizando una transferencia específica (monto, destinatario, ventana de validez, nonce). Quien SÍ manda la transacción — y paga el gas — es el servidor (el 'facilitador'). El pagador nunca necesita ETH, solo USDC.

Del lado del servidor, verificar la firma es puro trabajo criptográfico local, sin tocar la blockchain:

from eth_account import Account

def verify_eip3009(typed_data, signature, expected_from):
    encoded = Account._sign_hash  # (ilustrativo) encode_typed_data + recover_message
    recovered = Account.recover_message(encoded, signature=signature)
    return recovered.lower() == expected_from.lower()

Si la firma es válida, el servidor SÍ tiene que tocar la blockchain: transmitir la transferencia (`transferWithAuthorization` en el contrato USDC) y esperar la confirmación (en Base, 1-2 bloques, unos 2 segundos) antes de liberar el resultado de la tool. Ahí es donde el servidor paga el gas — necesita ETH nativo de la red en su propia wallet, aparte de la wallet que recibe los pagos en USDC.

Podés delegar esa verificación/liquidación a un facilitador externo (por ejemplo el de Coinbase CDP) o implementarlo vos mismo — 'ser tu propio facilitador' evita depender de un tercero (con sus propias restricciones geográficas, límites de tasa, o tiempos de caída) a cambio de correr tu propio nodo/RPC y mantener una wallet fondeada con ETH para gas.

Del lado del cliente (el agente que llama la tool), el flujo es: llamar sin pagar, recibir el 402, parsear `accepts[0]`, firmar EIP-3009 localmente con la private key del agente, reintentar con `X-PAYMENT`. Los SDKs de Andreax (`andreax-sdk` en Python, `@andreax/sdk` en JS, `andreax-langchain-autopay` para agentes LangChain) implementan este flujo completo, incluyendo topes de gasto (`per_call_cap_usd`, `daily_cap_usd`) para que un agente autónomo nunca gaste de más por un bug o una tool mal configurada.

El resultado: un servidor MCP donde cada tool cobra exactamente lo que vale, sin fricción de cuentas ni suscripciones, y un agente que paga solo por lo que usa — de verdad pago por uso, no una API key con un límite mensual arbitrario.


Try any tool with 100 free calls per wallet — browse the catalog · publish your own.