MCP 上の Blockchain0x。
任意のMCPホスト - Claude Desktop、Cursor、VS Code - にエージェントウォレットツールを1つの設定ブロックで提供します。そして、自分のツールに対して料金を請求したい場合は、実際のrequirePayment x402ビルダーを使用します。
@blockchain0x/mcpサーバーはMCPホストに5つのエージェントウォレットツールを提供します:ウォレットを読み取る、ウォレットをリストする、トランザクションを確認する、USDC支払いを送信する、x402請求書を決済する。npx @blockchain0x/mcpで実行するか(あなたのキーはあなたのマシンに留まります)、ホストされたURLを指します。別途、パッケージはrequirePaymentをエクスポートしているため、x402 402チャレンジで自分のMCPツールに価格を設定できます。
MCPを通じて支出します。MCPを通じて請求します。
仕事1: エージェントがホスト内からウォレットを使用できるようにします。@blockchain0x/mcpサーバーは、@blockchain0x/node SDKの薄いステートレスプロキシです。Claude Desktop、Cursor、またはVS Codeに5つのウォレットツールを公開し、あなたのAPIキーのスコープ、手当、期間ごとの上限は、他のAPI呼び出しと同様にバックエンドによって強制されます。サーバーはキーを保持せず、何も保存しません。
仕事2: エージェントにあなたのツールを呼び出すために料金を請求します。MCPはツールの呼び出しを摩擦のないものにしましたが、あなたのサーバーがエグレス、トークン、サードパーティAPIコストを無料で消費している場合は素晴らしいことです。402 Payment Requiredパターンはここにぴったりです。requirePaymentは、ホストされたチェックアウトURLを持つ構造化されたx402チャレンジを生成します; ツールが未払いのときにそれを返し、支払いが決済されると呼び出しを通過させます。x402を話すクライアントは自動的に支払いを行い、残りはURLを人間に表示します。
実行する方法は2つあります。ホストされたものにはインストールは不要です。
npxを使用してローカルでstdio経由で実行する(あなたのキーはあなたのマシンに留まります)、または任意のMCPホストをホストされたストリーミング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にデフォルト設定されています。サーバーはあなたのキーをバックエンドに転送し、何も保存しないため、そのキーのスコープと上限はエージェントができることと正確に一致します。それが公開する5つのツール: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を表示します。支払いが決済されると、その呼び出し元を支払い済みとしてマークし(次のセクション)、呼び出しが通過します。MCPサーバーよりもプレーンHTTPサーバーを好みますか?受信側のx402アダプター - Express用のcreateX402Middleware、Fastify用のcreateX402Plugin - はフレームワーク層で同じゲーティングを行います。
Webhookが到着したときに呼び出し元を支払い済みとしてマークします。
支払いが決済されると、Blockchain0xはあなたのWebhook URLに署名されたpayment.receivedイベントをPOSTします。Node SDKのwebhooks.verifyで検証し、その後、呼び出し元があなたの運営するストアで支払い済みであることを記録します。構成するための出荷されたレシートキャッシュはありません - あなたがその部分を所有しているため、驚くべきインフラはありません。
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を実行し、識別されたユニオンを返します。したがって、try/catchなしでresult.okに分岐します。生のボディを読み取り、解析されたコピーではなく、署名は正確なバイトをカバーします。出荷されたイベントはpayment.received、payment.sent、wallet.deployed、webhook.testです。ウォレットへの支払いはpayment.receivedです。'この呼び出し元が支払った'を永続化する場所 - データベースの行、Redisのキー、単一プロセスのメモリ内マップ - はあなたの判断です。
サーバーはオープンでステートレスです。読んでください。
MCP サーバーと requirePayment ビルダーは、データベースもボリュームも持たない Node SDK の薄いパススルーなので、監査すべきものはほとんどありません - それが狙いです。MCP ネイティブの OAuth 2.1 は将来の対応予定です。まずは貼り付けキー方式を出荷します。既存の API key 信頼モデルをそのまま再利用できるためです。
github.com/tosh-labs/blockchain0x-node全ツール一覧、スコープ、hosted environment の URL は the docs に記載されています。production と並んで staging と dev の hosted endpoint があり、本番 key を向ける前にテストできます。
MCPに特有の避けるべき5つの罠。
これらは、実稼働中の有料MCPサーバーを運営しているオペレーターからのものです。ほとんどはキャッシュアーキテクチャとMCPプロトコルの特定のエラーフォーマットに関連しています。
requirePaymentはビルダーであり、ミドルウェアではありません
requirePaymentは純粋な関数です:呼び出すと{ status: 402, body }を返し、ツールが未払いのときにそのボディを返します。ハンドラーをラップせず、誰が支払ったかを追跡せず、理由やキャッシュウィンドウオプションを取らず - ただamountUsdc、payTo、hostedUrl、およびオプションのネットワークと説明を受け取ります。支払い状態の追跡はあなたの仕事です:データベースの行、あなた自身のRedisのキー、何でも合うものです。Blockchain0xはチャレンジビルダーと決済Webhookを提供しますが、レシートキャッシュは提供しません。
stdioはあなたのキーをあなたのマシンに保持します
npxを使用してサーバーを実行し、環境にBLOCKCHAIN0X_API_KEYを設定すると、キーは決してあなたのボックスを離れません - ローカルで読み取られ、ネットワークヘッダーとして送信されません。ホストされたURLは逆の取引です: インストール不要ですが、キーをBearerトークンとしてmcp.blockchain0x.comに貼り付けます。開発者自身のマシンにはstdioを選択し、共有デプロイメントにはホストされたものを選択します。
ダッシュボード専用の表面は公開されていません
サーバーは@blockchain0x/nodeの薄い、ステートレスなプロキシです。正確に5つのツールを提供します:get_wallet、list_wallets、get_transaction、send_payment、settle_payment_request。アイデンティティの変更、APIキーおよびWebhookのCRUD、引き出し、請求は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".
requirePaymentのamountUsdcは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.