Перейти к основному содержимому
УзнатьРуководстваМонетизируйте свой сервер MCP
РУКОВОДСТВО

Монетизируйте свой сервер MCP за 10 минут.

10 минут
КРАТКИЙ ОТВЕТ

Установите @blockchain0x/mcp, и внутри премиум-инструмента вызовите requirePayment, когда вызывающий не оплатил - он создает вызов x402 402 с размещенным URL для оформления заказа, который вы возвращаете. Как только вебхук payment.received подтверждает расчет, вы отмечаете вызывающего как оплаченного в своем собственном хранилище, и инструмент запускается. Бесплатные инструменты остаются бесплатными. Для простого HTTP-сервера адаптер x402 на стороне получения выполняет ту же работу.

ПРЕДВАРИТЕЛЬНЫЕ УСЛОВИЯ

Перед тем как начать.

  • Работающий сервер MCP, использующий официальный Протокол контекста модели SDK на Node или Python. Если у вас его еще нет, сначала создайте его с помощью шаблона upstream.
  • Учетная запись Blockchain0x и профиль агента (см. добавить-платежи-к-агенту для настройки за 5 минут).
  • Ключ API (используйте sk_test_ для этого руководства).
  • Небольшой магазин для запоминания, кто оплатил (строка базы данных или ключ Redis) - ваш код владеет этим, обновляется вебхуком платежа.
  • Ясное понимание того, за какие инструменты вы хотите взимать плату и цена за вызов. Смотрите глоссарий платных инструментов MCP для шаблонов дизайна.
ШАГ 1 ИЗ 4

Установите пакет.

@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
ШАГ 2 ИЗ 4

Ограничьте инструмент с помощью 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.

Инструмент MCP (TypeScript)
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) }] };
  },
);
Обычный HTTP сервер (приемная сторона x402)
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"
}
ШАГ 3 ИЗ 4

Подтвердите платеж, затем запомните, кто оплатил.

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.

Обработчик вебхуков (TypeScript)
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");
});

Как долго платеж предоставляет доступ - это ваше решение - один вызов, сессия, час. Установите срок действия ключа состояния оплаты, который соответствует тому, как вы оцениваете инструмент. Достаточно долго, чтобы обычная сессия повторно использовала один платеж, и достаточно коротко, чтобы злоупотребление было ограничено.

ШАГ 4 ИЗ 4

Разверните и проверьте.

Отгрузите сервер. Бесплатные инструменты должны по-прежнему немедленно возвращать свои результаты; ограниченные инструменты должны возвращать тело 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.

Последний обзор: 2026-05-15. Опубликовано под CC BY 4.0.

Взимайте плату за вызов инструмента.

Возврат 402, установите свою цену, прием USDC. Бесплатно для начала.