Saltar al contenido principal
INTEGRACIÓN MCP

Blockchain0x sobre MCP.

Dale a cualquier anfitrión MCP - Claude Desktop, Cursor, VS Code - herramientas de billetera de agente con un bloque de configuración. Y cuando quieras cobrar por tus propias herramientas, usa el verdadero constructor requirePayment x402.

RESPUESTA CORTA

El servidor @blockchain0x/mcp proporciona a un anfitrión MCP cinco herramientas de billetera de agente: leer una billetera, listar billeteras, verificar una transacción, enviar un pago USDC y liquidar una factura x402. Ejecútalo con npx @blockchain0x/mcp (tu clave permanece en tu máquina) o apunta a la URL alojada. Por separado, el paquete exporta requirePayment para que puedas poner un precio en tus propias herramientas MCP con un desafío x402 402.

DOS TRABAJOS, UN PAQUETE

Gasta a través de MCP. Cobra a través de MCP.

Trabajo uno: permite que un agente USE una billetera desde dentro de su anfitrión. El servidor @blockchain0x/mcp es un proxy delgado y sin estado sobre el SDK @blockchain0x/node. Expone cinco herramientas de billetera a Claude Desktop, Cursor o VS Code, y el alcance, la asignación y los límites por período de tu clave API son aplicados por el backend exactamente como para cualquier otra llamada de API. El servidor no tiene clave y no almacena nada.

Trabajo dos: cobra a los agentes por llamar a TUS herramientas. MCP hizo que la invocación de herramientas fuera sin fricciones, lo cual es genial hasta que tu servidor esté consumiendo egresos, tokens y costos de API de terceros de forma gratuita. El patrón 402 Payment Required encaja exactamente aquí. requirePayment crea un desafío x402 estructurado con una URL de pago alojada; lo devuelves cuando una herramienta no está pagada y dejas pasar la llamada una vez que se liquida el pago. Los clientes que hablan x402 pagan automáticamente; el resto muestra la URL a un humano.

EJECUTAR EL SERVIDOR

Dos formas de ejecutarlo. Sin instalación para el alojado.

Ejecutalo localmente a través de stdio con npx (tu clave permanece en tu máquina), o apunta cualquier host MCP a la URL HTTP Streamable alojada y pasa la clave como un token Bearer. Ambos se integran directamente en la configuración MCP del host. Node 20+ para la ruta 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"
      }
    }
  }
}
ALBERGADO - HTTP TRANSMISIBLE
{
  "mcpServers": {
    "blockchain0x": {
      "url": "https://mcp.blockchain0x.com/mcp",
      "headers": { "Authorization": "Bearer sk_live_..." }
    }
  }
}

BLOCKCHAIN0X_API_KEY es una clave sk_test_ testnet o sk_live_ mainnet de tu panel; BLOCKCHAIN0X_API_BASE_URL predetermina a https://api.blockchain0x.com. El servidor reenvía tu clave al backend y no almacena nada, por lo que el alcance y los límites de esa clave son exactamente lo que el agente puede hacer. Las cinco herramientas que expone: get_wallet, list_wallets, get_transaction, send_payment y settle_payment_request.

PRECIO TUS PROPIAS HERRAMIENTAS

Controla una herramienta con el verdadero constructor requirePayment.

requirePayment es una función pura de @blockchain0x/mcp. La llama cuando una herramienta no está pagada, genera un desafío x402 402 (precio, su billetera, una URL de pago alojada) y le entrega ese cuerpo de vuelta en la forma de error estándar de MCP. No envuelve su controlador y no rastrea quién pagó - esa parte es suya, lo que mantiene al ayudante pequeño y 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) }] };
  },
);

Cuando el agente llama a search_docs unpaid, recibe el cuerpo 402. Los clientes que hablan x402 lo pagan automáticamente; Claude Desktop y Cursor muestran la URL de pago para un humano. Una vez que el pago se liquida, marcas que ese llamador pagó (sección siguiente) y la llamada se realiza. ¿Prefieres un servidor HTTP simple en lugar de uno MCP? El adaptador x402 del lado de recepción - createX402Middleware para Express, createX402Plugin para Fastify - realiza el mismo control en la capa del framework.

CONFIRMAR EL PAGO

Marca al llamador como pagado cuando el webhook llegue.

Cuando un pago se liquida, Blockchain0x envía un evento firmado payment.received a tu URL de webhook. Verifícalo con webhooks.verify del SDK de Node, luego registra que el llamador pagó en cualquier tienda que ya tengas. No hay caché de recibos enviado para configurar - tú posees esa parte, lo que significa que no hay infraestructura sorpresa.

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 realiza HMAC-SHA256 en tiempo constante y devuelve una unión discriminada, por lo que usted se ramifica en result.ok sin try/catch. Lea el cuerpo sin procesar, no una copia analizada, porque la firma cubre los bytes exactos. Los eventos enviados son payment.received, payment.sent, wallet.deployed y webhook.test; un pago a su billetera es payment.received. Donde persista 'este llamador pagó' - una fila de base de datos, una clave de Redis, un mapa en memoria para un solo proceso - es su decisión.

CÓDIGO Y DOCUMENTOS

El servidor es abierto y sin estado. Léelo.

El servidor MCP y el constructor requirePayment son un paso delgado sobre el SDK de Node sin base de datos y sin volúmenes, por lo que no hay mucho que auditar - que es el punto. El OAuth 2.1 nativo de MCP es un seguimiento planeado; el camino de clave pegada se envía primero porque reutiliza el modelo de confianza de clave API existente.

github.com/tosh-labs/blockchain0x-node

La lista completa de herramientas, alcances y las URL de entornos alojados están documentadas en la documentación. Los puntos finales de staging y dev existen junto a producción para pruebas antes de que apuntes una clave real a ello.

ERRORES COMUNES

Cinco trampas específicas de MCP a evitar.

Estos provienen de operadores que ejecutan servidores MCP pagos en producción. La mayoría se relacionan con la arquitectura de caché y el formato de error específico del protocolo MCP.

PITFALL 1

requirePayment es un constructor, no middleware

requirePayment es una función pura: la llama, devuelve { status: 402, body }, y le entrega ese cuerpo de vuelta cuando una herramienta no está pagada. No envuelve su controlador, no rastrea quién pagó, y no toma opciones de razón o ventana de caché - solo amountUsdc, payTo, hostedUrl y una red y descripción opcionales. Rastrear el estado de pago es su trabajo: una fila en su base de datos, una clave en su propio Redis, lo que sea adecuado. Blockchain0x envía el constructor de desafíos y el webhook de liquidación, no una caché de recibos.

PITFALL 2

stdio mantiene su clave en su máquina

Ejecuta el servidor con npx y BLOCKCHAIN0X_API_KEY en el entorno, y la clave nunca sale de tu caja - se lee localmente, no se envía como un encabezado de red. La URL alojada es el comercio opuesto: cero instalación, pero pegas la clave como un token Bearer a mcp.blockchain0x.com. Elige stdio para la máquina propia de un desarrollador, alojado para un despliegue compartido.

PITFALL 3

Las superficies solo del panel no están expuestas

El servidor es un proxy delgado y sin estado sobre @blockchain0x/node. Supervisa exactamente cinco herramientas: get_wallet, list_wallets, get_transaction, send_payment, settle_payment_request. Los cambios de identidad, CRUD de clave API y webhook, retiros y facturación están bloqueados bajo la autenticación de clave API y el servidor nunca llega más allá del SDK a ellos. No esperes una herramienta para esos - viven en el panel por diseño.

PITFALL 4

send_payment es idempotente y no reintenta

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 en requirePayment es una cadena de 6 decimales

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.

PREGUNTAS FRECUENTES

Tres preguntas específicas de MCP.

¿Funciona esto con Claude Desktop, Cursor y VS Code directamente?

Sí. Son hosts MCP estándar. Agrega el servidor blockchain0x a la configuración MCP del host - el bloque stdio (npx + tu clave en env) o el bloque alojado (la URL mcp.blockchain0x.com + una clave Bearer) - y las cinco herramientas de billetera aparecen para el agente. Desde allí, el agente puede leer una billetera, verificar una transacción, enviar un pago USDC o liquidar una factura x402, todo dentro del alcance, la asignación y los límites que ya impone tu clave API.

¿Qué puede hacer realmente el agente una vez que el servidor está conectado?

Cinco cosas, coincidiendo con las cinco herramientas: get_wallet y list_wallets leen metadatos de billetera, get_transaction consulta el estado y el hash de una transacción, send_payment realiza un pago saliente en USDC, y settle_payment_request liquida una factura x402 con prueba en la cadena. Esa es toda la superficie. El servidor es un proxy sin estado: no tiene clave, no almacena nada y no puede acceder a las operaciones solo del panel, por lo que un agente no puede rotar claves, cambiar identidad o retirar a través de él.

¿Cómo cobro a los agentes por llamar a mis PROPIAS herramientas MCP?

Usa el verdadero helper requirePayment exportado por @blockchain0x/mcp. Llama a requirePayment({ amountUsdc, payTo, hostedUrl }) dentro de tu herramienta cuando el llamador no ha pagado, y devuelve el cuerpo 402 resultante - es compatible con @blockchain0x/x402. Tú rastreas quién ha pagado (un webhook en payment.received más tu propia tienda), y dejas pasar la llamada una vez que lo han hecho. Para un servidor HTTP simple en lugar de uno MCP, el adaptador x402 del lado de recepción (createX402Middleware para Express, createX402Plugin para Fastify) hace el mismo trabajo en la capa del marco.

Dale a tu agente una billetera a través de MCP.

Un bloque de configuración para conectar las herramientas de billetera. El verdadero constructor de requirePayment cuando deseas cobrar por el tuyo. Gratis para comenzar.