Blockchain0x через MCP.
Дайте любому хосту MCP - Claude Desktop, Cursor, VS Code - инструменты кошелька агента с одним блоком конфигурации. И когда вы хотите взимать плату за свои собственные инструменты, используйте реальный строитель requirePayment x402.
Сервер @blockchain0x/mcp предоставляет хосту MCP пять инструментов для кошельков агентов: чтение кошелька, список кошельков, проверка транзакции, отправка платежа USDC и расчет счета x402. Запустите его с помощью npx @blockchain0x/mcp (ваш ключ остается на вашем компьютере) или укажите на хостинг URL. Отдельно пакет экспортирует requirePayment, чтобы вы могли установить цену на свои собственные инструменты MCP с помощью вызова x402 402.
Тратить через MCP. Взимать плату через MCP.
Задача первая: позволить агенту ИСПОЛЬЗОВАТЬ кошелек изнутри его хоста. Сервер @blockchain0x/mcp является тонким, безстатусным прокси над @blockchain0x/node SDK. Он предоставляет пять инструментов кошелька для Claude Desktop, Cursor или VS Code, а область, лимит и лимиты на период вашего ключа API применяются сервером точно так же, как для любого другого вызова API. Сервер не хранит ключ и ничего не сохраняет.
Задача вторая: взимать плату с агентов за вызов ВАШИХ инструментов. MCP сделала вызов инструментов без трения, что отлично, пока ваш сервер не потребляет выходные данные, токены и затраты на сторонние API бесплатно. Шаблон 402 Payment Required идеально подходит для этого. requirePayment создает структурированный вызов x402 с размещенным URL для оформления заказа; вы возвращаете его, когда инструмент не оплачен, и позволяете вызову пройти, как только платеж завершится. Клиенты, которые говорят на x402, платят автоматически; остальные показывают URL человеку.
Два способа запустить это. Нет установки для размещенного варианта.
Запустите его локально через stdio с помощью npx (ваш ключ остается на вашем компьютере) или укажите любой хост MCP на размещенном Streamable HTTP URL и передайте ключ в качестве токена Bearer. Оба варианта сразу попадают в конфигурацию MCP хоста. Node 20+ для локального пути.
{ "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 - это ключ sk_test_ тестовой сети или sk_live_ основной сети из вашей панели управления; BLOCKCHAIN0X_API_BASE_URL по умолчанию равен https://api.blockchain0x.com. Сервер пересылает ваш ключ на бэкенд и ничего не хранит, поэтому область и лимиты на этот ключ точно соответствуют тому, что может делать агент. Пять инструментов, которые он предоставляет: get_wallet, list_wallets, get_transaction, send_payment и settle_payment_request.
Запретите инструмент с помощью реального конструктора requirePayment.
requirePayment это чистая функция от @blockchain0x/mcp. Вы вызываете ее, когда инструмент не оплачен, она создает вызов x402 402 (цена, ваш кошелек, URL для оформления заказа), и вы возвращаете это тело в стандартной форме ошибки MCP. Она не оборачивает ваш обработчик и не отслеживает, кто оплатил - эта часть ваша, что делает помощника небольшим и честным.
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) }] }; }, );
Когда агент вызывает search_docs unpaid, он получает тело 402. Клиенты, которые говорят на x402, оплачивают его автоматически; Claude Desktop и Cursor отображают URL оформления для человека. Как только платеж завершится, вы отмечаете, что этот вызывающий оплатил (следующий раздел), и вызов проходит. Предпочитаете обычный HTTP-сервер вместо MCP? Адаптер x402 на стороне получения - createX402Middleware для Express, createX402Plugin для Fastify - выполняет ту же фильтрацию на уровне фреймворка.
Отметьте вызывающего как оплаченного, когда вебхук поступит.
Когда платеж завершается, Blockchain0x отправляет подписанное событие payment.received на ваш URL вебхука. Проверьте его с помощью webhooks.verify из Node SDK, затем запишите, что вызывающий оплатил в любом хранилище, которое вы уже используете. Нет поставляемого кэша квитанций для настройки - вы владеете этой частью, что означает отсутствие неожиданных инфраструктур.
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 выполняет HMAC-SHA256 за постоянное время и возвращает дискриминированный союз, поэтому вы разделяете по result.ok без try/catch. Читайте сырое тело, а не разобранную копию, потому что подпись охватывает точные байты. Доставленные события: payment.received, payment.sent, wallet.deployed и webhook.test; платеж на ваш кошелек - это payment.received. Где вы сохраняете 'этот вызывающий оплатил' - строка в базе данных, ключ Redis, карта в памяти для одного процесса - это ваше решение.
Сервер открыт и stateless. Читайте его.
Сервер MCP и builder requirePayment - это тонкая прослойка поверх Node SDK без базы данных и без volumes, поэтому там почти нечего аудировать - в этом и суть. Нативный MCP OAuth 2.1 запланирован следующим этапом; сначала выходит путь с вставленным ключом, потому что он переиспользует существующую модель доверия API-key.
github.com/tosh-labs/blockchain0x-nodeПолный список tools, scopes и URLs размещенных окружений описан в the docs. Staging и dev hosted endpoints доступны рядом с production для тестирования перед тем, как вы направите туда реальный ключ.
Пять ловушек, специфичных для MCP, которых следует избегать.
Эти данные поступают от операторов, работающих с платными серверами MCP в производстве. Большинство из них связано с архитектурой кэша и конкретным форматом ошибок протокола MCP.
requirePayment это строитель, а не промежуточное ПО
requirePayment это чистая функция: вы вызываете ее, она возвращает { status: 402, body }, и вы возвращаете это тело, когда инструмент не оплачен. Она не оборачивает ваш обработчик, не отслеживает, кто оплатил, и не принимает никаких параметров причины или окна кэша - только amountUsdc, payTo, hostedUrl и необязательные параметры сети и описания. Отслеживание состояния платежа - это ваша работа: строка в вашей базе данных, ключ в вашем собственном Redis, что угодно. Blockchain0x предоставляет создатель вызовов и вебхук для завершения, а не кэш для квитанций.
stdio хранит ваш ключ на вашем компьютере
Запустите сервер с помощью npx и BLOCKCHAIN0X_API_KEY в окружении, и ключ никогда не покинет вашу машину - он читается локально, а не отправляется как сетевой заголовок. Размещенный URL - это противоположная сделка: нулевая установка, но вы вставляете ключ в качестве токена Bearer на mcp.blockchain0x.com. Выберите stdio для собственного компьютера разработчика, размещенный для совместного развертывания.
Поверхности только для панели управления не раскрыты
Сервер - это тонкий, статeless прокси через @blockchain0x/node. Он предоставляет ровно пять инструментов: get_wallet, list_wallets, get_transaction, send_payment, settle_payment_request. Изменения идентичности, CRUD API-ключей и вебхуков, вывод средств и выставление счетов жестко блокируются под аутентификацией API-ключа, и сервер никогда не обращается к ним за пределами SDK. Не ожидайте инструмента для этого - они находятся на панели управления по замыслу.
send_payment идемпотентен и не повторяет
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 на requirePayment является строкой с 6 десятичными знаками
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.