Монетизируйте свой сервер MCP за 10 минут.
Установите @blockchain0x/mcp, и внутри премиум-инструмента вызовите requirePayment, когда вызывающий не оплатил - он создает вызов x402 402 с размещенным URL для оформления заказа, который вы возвращаете. Как только вебхук payment.received подтверждает расчет, вы отмечаете вызывающего как оплаченного в своем собственном хранилище, и инструмент запускается. Бесплатные инструменты остаются бесплатными. Для простого HTTP-сервера адаптер x402 на стороне получения выполняет ту же работу.
Перед тем как начать.
- Работающий сервер MCP, использующий официальный Протокол контекста модели SDK на Node или Python. Если у вас его еще нет, сначала создайте его с помощью шаблона upstream.
- Учетная запись Blockchain0x и профиль агента (см. добавить-платежи-к-агенту для настройки за 5 минут).
- Ключ API (используйте
sk_test_для этого руководства). - Небольшой магазин для запоминания, кто оплатил (строка базы данных или ключ Redis) - ваш код владеет этим, обновляется вебхуком платежа.
- Ясное понимание того, за какие инструменты вы хотите взимать плату и цена за вызов. Смотрите глоссарий платных инструментов MCP для шаблонов дизайна.
Установите пакет.
@blockchain0x/mcp exports requirePayment, a pure function that mints an x402 402 challenge for a tool. It is npm (TypeScript) only. If you run a plain HTTP server instead of an MCP one, install the receive-side x402 adapter and gate routes with it.
# Gate your own MCP tools with the requirePayment 402 builder:
npm install @blockchain0x/mcp
# Or gate a plain HTTP server with the receive-side x402 adapter + SDK:
npm install @blockchain0x/x402 @blockchain0x/nodeОграничьте инструмент с помощью requirePayment.
Inside the tool, check your own paid-state for the caller. If they have not paid, call requirePayment and return the resulting 402 body; if they have, run the work. requirePayment is a pure builder - it does not wrap the handler and does not track payment, so the gating policy stays in your code.
import { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
import { requirePayment } from "@blockchain0x/mcp";
import { z } from "zod";
const server = new McpServer({ name: "premium-data-mcp", version: "1.0.0" });
server.tool(
"get_quote_realtime",
"Real-time quote (paid)",
{ ticker: z.string() },
async ({ ticker }, extra) => {
if (!hasPaid(extra)) {
// Pure function: mint an x402 402 challenge and hand the body back.
const { body } = requirePayment({
amountUsdc: "0.005",
payTo: "0xYourWallet",
hostedUrl: "https://pay.blockchain0x.com/checkout/abc",
});
return { content: [{ type: "text", text: JSON.stringify(body) }], isError: true };
}
const quote = await fetchLiveQuote(ticker);
return { content: [{ type: "text", text: JSON.stringify(quote) }] };
},
);import express from "express";
import { createX402Middleware } from "@blockchain0x/x402/server/express";
import { createClient } from "@blockchain0x/node";
const sdk = createClient({ apiKey: process.env.BLOCKCHAIN0X_API_KEY! });
const app = express();
// Not an MCP server? Gate a plain HTTP route the same way. The middleware
// answers unpaid requests with a 402 and lets paid ones through.
// Configure the price and recipient per the x402 docs.
app.use("/quote", createX402Middleware({ sdk }));Тело 402 requirePayment возвращается неплательщику:
// requirePayment returns { status: 402, body }. The body an unpaid caller sees:
{
"error": "payment_required",
"amountUsdc": "0.005",
"payTo": "0xYourWallet",
"hostedUrl": "https://pay.blockchain0x.com/checkout/abc",
"network": "mainnet"
}Подтвердите платеж, затем запомните, кто оплатил.
When a caller pays the checkout, Blockchain0x POSTs a signed payment.received event to your webhook. Verify it with webhooks.verify from @blockchain0x/node, then write the paid state to a store you control - a database row, a Redis key, your call. That store is what the tool checks in Step 2. There is no shipped receipt cache; you own where paid-state lives and how long it lasts.
import express from "express";
import { webhooks } from "@blockchain0x/node";
const app = express();
app.use(express.raw({ type: "application/json" }));
app.post("/webhooks/payment", (req, res) => {
const result = webhooks.verify({
headers: req.headers,
rawBody: req.body, // RAW bytes
secret: process.env.BLOCKCHAIN0X_WEBHOOK_SECRET!,
});
if (!result.ok) return res.status(400).json({ code: result.code });
if (result.eventType === "payment.received") {
// Remember the payer however you like - a DB row, a Redis key, your call.
markPaid(result.eventId);
}
res.status(200).send("ok");
});Как долго платеж предоставляет доступ - это ваше решение - один вызов, сессия, час. Установите срок действия ключа состояния оплаты, который соответствует тому, как вы оцениваете инструмент. Достаточно долго, чтобы обычная сессия повторно использовала один платеж, и достаточно коротко, чтобы злоупотребление было ограничено.
Разверните и проверьте.
Отгрузите сервер. Бесплатные инструменты должны по-прежнему немедленно возвращать свои результаты; ограниченные инструменты должны возвращать тело 402 при первом вызове от нового клиента, а затем работать, как только этот клиент будет отмечен как оплаченный. Проверьте оба пути с помощью ключа sk_test_ на Base Sepolia перед запуском в живую.
Два сигнала, на которые стоит обратить внимание в первый день: количество возвращенных 402 (ваш верхний уровень воронки) и количество успешных запусков инструмента после 402 (ваша конверсия). Если конверсия значительно ниже ожидаемой, цена, вероятно, неверна. Также следите за коэффициентом попаданий вашего хранилища платного состояния - если он близок к нулю, ваше окно доступа слишком короткое, и платящие вызывающие снова просят заплатить.
Пять вещей, которые подводят монетизаторов MCP с первого раза.
Случайное ограничение бесплатных инструментов
Соблазнительно ограничить каждый инструмент 'на всякий случай'. Не делайте этого. Вся ценность платных серверов MCP заключается в том, что бесплатные инструменты сосуществуют с платными на одном сервере, поэтому клиент может использовать бесплатные инструменты для поиска и метаданных без оплаты. Создайте 402 только для инструментов, которые действительно потребляют премиум-ресурсы; оставьте остальные как обычные результаты.
requirePayment это строитель, а не промежуточное ПО
requirePayment это чистая функция: вы вызываете ее, когда инструмент не оплачен, она возвращает { status: 402, body }, и вы возвращаете тело. Она не оборачивает ваш обработчик и не отслеживает, кто оплатил. Она принимает amountUsdc, payTo, hostedUrl и необязательные параметры сети и описания - ничего больше. Проверка, оплатил ли вызывающий, - это проверка, которую вы выполняете против своего собственного хранилища.
Нет поставленного кэша квитанций.
Blockchain0x поставляет 402 builder и settlement webhook, а не помощника для хранения квитанций. Вы решаете, где находится 'этот вызывающий оплатил' - строка базы данных, ключ Redis, карта в памяти для одного процесса - и вы переключаете это, когда приходит webhook payment.received. Это полностью держит политику (насколько долго оплата предоставляет доступ) в ваших руках.
Доверие к квитанции, которую клиент утверждает, что имеет.
Не позволяйте вызывающему утверждать, что он оплатил. Источник правды - это webhook payment.received, проверенный с помощью webhooks.verify (или задокументированного HMAC) по сравнению с вашим секретом webhook. Отметьте плательщика как оплатившего только после подтвержденного события и ограничьте доступ к инструменту на этом состоянии на стороне сервера - никогда не на чем-то, что отправляет клиент.
Нет метрик по задержке платных инструментов
Добавление шага оплаты между клиентом и выполнением инструмента увеличивает время, необходимое вызывающему для оплаты и урегулирования на первом вызове, затем близко к нулю, как только вы отметите их как оплаченные. Инструментируйте обе ветви, чтобы вы могли отличить 'инструмент медленный' от 'оплата медленная', когда клиент жалуется. Без метрики вы неправильно диагностируете узкое место.
Как только оплаченный трафик начнет поступать.
С внедрением монетизации наиболее полезные последующие действия - это надежная обработка вебхуков (чтобы вы не пропустили события платежей), контроль расходов (чтобы сервер MCP, который вы строите и который также оплачивает других агентов, оставался ограниченным) и поток с приоритетом тестовой сети (чтобы вы могли вносить изменения в ценообразование без потери реальных денег).
Шаблоны вебхуков, о которых разработчики спрашивают чаще всего
Настройте контроль расходов агента, который переживет инъекцию подсказок
Тестируйте платежи агентов без реальных денег
Полная справка по API на docs.blockchain0x.com. Связанная продуктовая поверхность: интеграция MCP.