Monetizza il tuo server MCP in 10 minuti.
Installa @blockchain0x/mcp, e all'interno di uno strumento premium chiama requirePayment quando il chiamante non ha pagato - genera una sfida x402 402 con un URL di checkout ospitato, che restituisci. Una volta che il webhook payment.received conferma il regolamento, segni il chiamante come pagato nel tuo negozio e lo strumento funziona. Gli strumenti gratuiti rimangono gratuiti. Per un server HTTP semplice, l'adattatore x402 lato ricezione fa lo stesso lavoro.
Prima di iniziare.
- Un server MCP funzionante che utilizza l'SDK ufficiale Model Context Protocol in Node o Python. Se non ne hai ancora uno, creane uno con il template upstream prima.
- Un account Blockchain0x e un profilo agente (vedi la guida per aggiungere pagamenti all'agente per la configurazione di 5 minuti).
- Una chiave API (usa
sk_test_per questa guida). - Un piccolo store per ricordare chi ha pagato (una riga di database o una chiave Redis) - il tuo codice possiede questo, aggiornato dal webhook di pagamento.
- Una chiara comprensione di quali strumenti vuoi addebitare e il prezzo per chiamata. Vedi l' voce del glossario degli strumenti MCP a pagamento per i modelli di design.
Installa il pacchetto.
@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/nodeLimita uno strumento con 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 }));Il corpo 402 requirePayment restituisce a un chiamante non pagato:
// 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"
}Conferma il pagamento, poi ricorda chi ha pagato.
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");
});Quanto tempo un pagamento concede accesso è una tua decisione - una singola chiamata, una sessione, un'ora. Imposta una scadenza sulla chiave di stato pagato che corrisponda a come prezzi lo strumento. Abbastanza lungo affinché una sessione normale riutilizzi un pagamento, abbastanza corto affinché l'abuso sia limitato.
Distribuisci e verifica.
Spedisci il server. Gli strumenti gratuiti dovrebbero comunque restituire immediatamente il loro risultato; gli strumenti a pagamento dovrebbero restituire il corpo 402 alla prima chiamata da un nuovo cliente, quindi funzionare una volta che quel chiamante è contrassegnato come pagato. Verifica entrambi i percorsi su una chiave sk_test_ contro Base Sepolia prima di andare in produzione.
Due segnali da monitorare il primo giorno: il conteggio dei 402 restituiti (il tuo top-of-funnel) e il conteggio delle esecuzioni degli strumenti riuscite dopo un 402 (la tua conversione). Se la conversione è molto più bassa del previsto, il prezzo è probabilmente errato. Controlla anche il tasso di accesso del tuo store a pagamento - se è vicino a zero, la tua finestra di accesso è troppo corta e i chiamanti paganti vengono invitati a pagare di nuovo.
Cinque cose che mordono i monetizzatori MCP per la prima volta.
Bloccare gli strumenti gratuiti per errore
È allettante limitare ogni strumento 'giusto per sicurezza'. Non farlo. Il valore intero dei server MCP a pagamento è che gli strumenti gratuiti coesistono con quelli a pagamento sullo stesso server, quindi il cliente può utilizzare gli strumenti di scoperta e metadati gratuiti senza pagare. Genera un 402 solo per gli strumenti che consumano effettivamente risorse premium; lascia il resto come risultati semplici.
requirePayment è un costruttore, non middleware
requirePayment è una funzione pura: la chiami quando uno strumento non è pagato, restituisce { status: 402, body }, e restituisci il corpo. Non avvolge il tuo gestore e non tiene traccia di chi ha pagato. Prende amountUsdc, payTo, hostedUrl e una rete e descrizione opzionali - nient'altro. Se un chiamante ha pagato è un controllo che esegui contro il tuo negozio.
Non esiste una cache di ricevute fornita
Blockchain0x fornisce il costruttore 402 e il webhook di regolamento, non un aiuto per la memorizzazione delle ricevute. Decidi dove vive 'questo chiamante ha pagato' - una riga di database, una chiave Redis, una mappa in memoria per un singolo processo - e la capovolgi quando arriva il webhook payment.received. Questo mantiene la politica (per quanto tempo un pagamento concede accesso) interamente nelle tue mani.
Fidarsi di una ricevuta che il cliente afferma di avere
Non lasciare che il chiamante affermi di aver pagato. La fonte di verità è il webhook payment.received, verificato con webhooks.verify (o l'HMAC documentato) rispetto al tuo segreto del webhook. Contrassegna il pagatore come pagato solo dopo un evento verificato e limita lo strumento a quello stato lato server - mai su qualcosa che il client invia.
Nessuna metrica sulla latenza degli strumenti a pagamento
Mettere un passo di pagamento tra il client e l'esecuzione dello strumento aggiunge il tempo che il chiamante impiega per pagare e risolvere alla prima chiamata, poi quasi zero una volta che li hai contrassegnati come pagati. Strumenta entrambe le diramazioni in modo da poter distinguere 'lo strumento è lento' da 'il pagamento è lento' quando un cliente si lamenta. Senza la metrica diagnoserai erroneamente il collo di bottiglia.
Una volta che il traffico a pagamento è attivo.
Con la monetizzazione in atto, i seguiti più utili sono la gestione affidabile dei webhook (così non perdi eventi di pagamento), i controlli di spesa (così un server MCP che costruisci che paga anche altri agenti rimane limitato) e un flusso testnet-first (così puoi spedire modifiche ai prezzi senza bruciare denaro reale).
I modelli di webhook di cui i programmatori chiedono di più
Imposta controlli di spesa per l'agente che sopravvivono all'iniezione di prompt
Testa i pagamenti degli agenti senza denaro reale
Riferimento completo dell'API su docs.blockchain0x.com. Superficie di prodotto correlata: Integrazione MCP.