Kiếm tiền từ máy chủ MCP của bạn trong 10 phút.
Cài đặt @blockchain0x/mcp, và bên trong một công cụ cao cấp gọi requirePayment khi người gọi chưa thanh toán - nó tạo ra một thách thức x402 402 với một URL thanh toán được lưu trữ, mà bạn trả lại. Khi webhook payment.received xác nhận việc thanh toán, bạn đánh dấu người gọi đã thanh toán trong cửa hàng của riêng bạn và công cụ chạy. Các công cụ miễn phí vẫn miễn phí. Đối với một máy chủ HTTP đơn giản, bộ chuyển đổi x402 phía nhận thực hiện cùng một công việc.
Trước khi bạn bắt đầu.
- Một máy chủ MCP hoạt động sử dụng SDK Giao thức Ngữ cảnh Mô hình chính thức trong Node hoặc Python. Nếu bạn chưa có, hãy tạo một cái với mẫu upstream trước.
- Một tài khoản Blockchain0x và một hồ sơ đại lý (xem hướng dẫn thêm thanh toán cho đại lý để biết cách thiết lập trong 5 phút).
- Một khóa API (sử dụng
sk_test_cho hướng dẫn này). - Một cửa hàng nhỏ để nhớ ai đã thanh toán (một hàng cơ sở dữ liệu hoặc một khóa Redis) - mã của bạn sở hữu điều này, được cập nhật bởi webhook thanh toán.
- Có một cảm nhận rõ ràng về các công cụ mà bạn muốn tính phí và giá mỗi lần gọi. Xem mục từ điển công cụ MCP trả phí để biết các mẫu thiết kế.
Cài đặt gói.
@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/nodeBảo vệ một công cụ bằng 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 }));Thân 402 requirePayment trả về cho người gọi chưa thanh toán:
// 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"
}Xác nhận thanh toán, sau đó nhớ ai đã thanh toán.
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");
});Thời gian mà một khoản thanh toán cấp quyền truy cập là quyết định của bạn - một cuộc gọi đơn lẻ, một phiên, một giờ. Đặt thời hạn cho khóa trạng thái đã thanh toán phù hợp với cách bạn định giá công cụ. Đủ lâu để một phiên bình thường tái sử dụng một khoản thanh toán, đủ ngắn để ngăn chặn lạm dụng.
Triển khai và xác thực.
Gửi máy chủ. Các công cụ miễn phí vẫn nên trả về kết quả ngay lập tức; các công cụ có giới hạn nên trả về thân 402 trong cuộc gọi đầu tiên từ một khách hàng mới, sau đó chạy khi người gọi đó được đánh dấu là đã thanh toán. Xác minh cả hai đường dẫn trên khóa sk_test_ với Base Sepolia trước khi đi vào hoạt động.
Hai tín hiệu cần theo dõi vào ngày đầu tiên: số lượng 402s trả về (đầu phễu của bạn) và số lượng chạy công cụ thành công sau một 402 (tỷ lệ chuyển đổi của bạn). Nếu tỷ lệ chuyển đổi thấp hơn nhiều so với mong đợi, giá có thể sai. Cũng theo dõi tỷ lệ truy cập của cửa hàng trạng thái đã trả tiền của bạn - nếu gần bằng không, cửa sổ truy cập của bạn quá ngắn và những người gọi trả tiền đang được yêu cầu trả tiền lại.
Năm điều khiến những người kiếm tiền từ MCP lần đầu gặp khó khăn.
Cổng các công cụ miễn phí một cách tình cờ
Thật hấp dẫn khi hạn chế mọi công cụ 'chỉ trong trường hợp'. Đừng làm vậy. Giá trị toàn bộ của các máy chủ MCP trả phí là các công cụ miễn phí cùng tồn tại với các công cụ trả phí trên cùng một máy chủ, vì vậy khách hàng có thể sử dụng các công cụ khám phá và siêu dữ liệu miễn phí mà không phải trả tiền. Chỉ tạo một 402 cho các công cụ thực sự tiêu thụ tài nguyên cao cấp; để lại phần còn lại như là kết quả thông thường.
requirePayment là một trình xây dựng, không phải middleware
requirePayment là một hàm thuần túy: bạn gọi nó khi một công cụ chưa được thanh toán, nó trả về { status: 402, body }, và bạn trả lại thân đó. Nó không bọc bộ xử lý của bạn và không theo dõi ai đã thanh toán. Nó nhận amountUsdc, payTo, hostedUrl, và một mạng lưới và mô tả tùy chọn - không có gì khác. Việc một người gọi đã thanh toán hay không là một kiểm tra bạn thực hiện đối với cửa hàng của riêng bạn.
Không có bộ nhớ đệm biên lai nào được gửi
Blockchain0x cung cấp bộ xây dựng 402 và webhook thanh toán, không phải là một trợ giúp lưu trữ biên nhận. Bạn quyết định nơi 'người gọi này đã thanh toán' sống - một hàng cơ sở dữ liệu, một khóa Redis, một bản đồ trong bộ nhớ cho một quy trình đơn - và bạn lật nó khi webhook payment.received đến. Điều đó giữ chính sách (thời gian nào một khoản thanh toán cấp quyền truy cập) hoàn toàn trong tay bạn.
Tin tưởng vào một biên lai mà khách hàng tuyên bố có
Đừng để người gọi xác nhận rằng họ đã thanh toán. Nguồn thông tin chính xác là webhook payment.received, được xác minh với webhooks.verify (hoặc HMAC đã được tài liệu hóa) so với bí mật webhook của bạn. Đánh dấu người trả tiền đã thanh toán chỉ sau một sự kiện đã được xác minh, và kiểm soát công cụ dựa trên trạng thái phía máy chủ đó - không bao giờ dựa trên điều gì mà khách hàng gửi.
Không có chỉ số về độ trễ công cụ trả phí
Đặt một bước thanh toán giữa khách hàng và việc thực thi công cụ sẽ thêm thời gian mà người gọi cần để thanh toán và giải quyết trong cuộc gọi đầu tiên, sau đó gần như không có thời gian một khi bạn đã đánh dấu họ là đã thanh toán. Thiết bị cả hai nhánh để bạn có thể phân biệt 'công cụ chậm' với 'thanh toán chậm' khi một khách hàng phàn nàn. Nếu không có chỉ số, bạn sẽ chẩn đoán sai nút thắt.
Khi lưu lượng thanh toán bắt đầu chảy.
Khi đã có cơ chế kiếm tiền, các bước tiếp theo hữu ích nhất là xử lý webhook đáng tin cậy (để không bỏ lỡ sự kiện thanh toán), kiểm soát chi tiêu (để một MCP server bạn xây dựng mà cũng thanh toán cho các agent khác vẫn nằm trong giới hạn), và quy trình ưu tiên testnet (để bạn có thể triển khai thay đổi giá mà không tốn tiền thật).
Các mẫu webhook mà các nhà phát triển thường hỏi nhất
Thiết lập các kiểm soát chi tiêu của agent mà vẫn tồn tại sau khi bị tiêm nhắc
Thử nghiệm thanh toán đại lý mà không cần tiền thật
Tài liệu API đầy đủ tại docs.blockchain0x.com. Bề mặt sản phẩm liên quan: Tích hợp MCP.