AI エージェントが自律支払いする MCP サーバーを作った (Claude → MCP → x402 USDC)
MCP サーバーのデフォルト モデルは「ツール公開 + 呼び出し側を信頼」です。ローカル SQLite を叩くツールならそれで OK ですが、有料データを叩く瞬間に 誰か が上流に支払う必要が出ます。我々は 3 番目の道を選びました — MCP 設定に静的 API キーを焼き込まず、MCP ツール側で x402 を喋らせる。Claude (またはあらゆる MCP 対応エージェント) が 1 コール毎に $0.008 USDC を Base 上で署名支払い。アカウント不要。キー不要。エージェントは欲しいものを正確に得て、上流は支払いを受け、人間は loop の外。
ハイライト
- 静的 API キー不要 — ユーザーはウォレット (USDC float on Base) を 1 つ用意するだけ
- 1 コール = 1 USDC 支払い — エージェントが自律的に署名、人間の介在ゼロ
- 支払いプランビング不可視 — LLM は
scan_addressを呼んで JSON を受け取るだけ - 自然な予算境界 — ウォレット残高が尽きたら自然に止まる
ほとんどの MCP サーバーが課金できない理由
Claude Desktop に MCP サーバーを入れると見慣れた設定があります — 静的 API キー、レート制限、月初に発見する billing。エージェントが 1 セッションで 50 回ツールを呼んでも誰も気付かない。これは「本当に無料のツール」(Postgres, ファイルシステム, GitHub) には機能しますが、1 コール毎にコストがかかる上流をラップするツールには機能しません。
我々が欲しかったのは 「エージェントが呼んだ分だけ、その瞬間に、リアルマネーで払う」世界です。
x402 を 4 行で説明
x402 は HTTP 402 ステータス コードを stablecoin 支払いに繋いだプロトコル:
- エージェントが
GET /api/risk-score?address=0xabcを呼ぶ - サーバーは
HTTP 402+ 価格 ($0.008 USDC) + asset (USDC on Base) + 受取アドレス + 署名用 nonce を返す - エージェントのウォレットが EIP-3009
transferWithAuthorizationをその金額分だけ署名、base64 エンコードしてX-PAYMENTヘッダ付きで再リクエスト - サーバーは署名検証 → ハンドラ実行 → Coinbase CDP facilitator 経由で USDC を on-chain settle →
X-PAYMENT-RESPONSE(オンチェーン領収書) 付きでレスポンス
プロトコル自体はサブセカンド。Base 上の on-chain settle は数秒。エージェント視点では「402 が返ってきた → 支払って再試行 → 200 OK」だけ。
MCP × x402 が自然にハマる理由
MCP (Model Context Protocol) は LLM にツールを公開する標準。ツールに schema, name, callable が付与され、モデルが呼び出しタイミングを判断します。実行パスは:
LLM
├─→ MCP client
│ └─→ MCP server (chainanalyzer-mcp)
│ ├─→ HTTP GET /api/risk-score ← 402 + price
│ ├─→ wallet.sign(EIP-3009) ← per-call payment
│ ├─→ HTTP GET /api/risk-score ← retry with X-PAYMENT
│ │ [verify → handler → settle]
│ └─→ 200 OK + risk JSON
└─← result returned to LLM x402 は「MCP サーバーがハンドラを実行する」内側に収まります。MCP ツール実装は上流 (我々) に HTTP 呼び出しをする → 402 が返る → MCP サーバーはユーザー所有のウォレット鍵にアクセスがある → 支払い署名 → リプレイ → データ取得 → LLM に返す。LLM は支払いプランビングを見ません。
ユーザー側の準備は API キー版より少ない: 我々への登録不要。ウォレット = アカウント。
MCP サーバー側で何が変わったか
我々の @chainanalyzer/mcp-server は以前 API キーが必要でした。新版 (paid mode) はユーザーのウォレットを使います:
{
"mcpServers": {
"chainanalyzer": {
"command": "npx",
"args": ["-y", "@chainanalyzer/mcp-server"],
"env": {
"CHAINANALYZER_X402_PRIVATE_KEY": "0x...",
"CHAINANALYZER_X402_NETWORK": "base"
}
}
}
} 秘密鍵 = ユーザーの支払いウォレット (Base 上に USDC を保持)。MCP サーバーは内部で x402-fetch を使って 402 ハンドリングを処理:
import { wrapFetchWithPayment } from "x402-fetch"
import { createWalletClient, http, privateKeyToAccount } from "viem"
import { base } from "viem/chains"
const account = privateKeyToAccount(process.env.CHAINANALYZER_X402_PRIVATE_KEY)
const wallet = createWalletClient({ account, chain: base, transport: http() })
const fetch402 = wrapFetchWithPayment(fetch, wallet)
// Inside the MCP tool handler:
const res = await fetch402(
`https://chain-analyzer.com/api/v1/x402/address/${addr}/risk-score?chain=${chain}`,
{ method: "POST" }
)
return await res.json() // automatically retried with payment LLM 視点では、ツールはデータを返した (= 支払い済) か、「ウォレット残高不足」エラーを返した (= 残高切れ) のどちらか。後者は自然な予算シグナルになり、Claude が「スキャン予算が尽きました」と能動的にユーザーに伝えます。
ハマった点
1. MCP は stdio JSON、HTTP リクエストはそのモデルに合わない
MCP の通信は stdio。発信 HTTP リクエストが stdio フレーミングを破壊しないよう、別の HTTP クライアントを使い、MCP に返す前に明示的に JSON シリアライズが必要。
2. EIP-3009 の validAfter / validBefore が現実のクロックずれを許容する必要
Facilitator はネットワーク時刻と大きく drift したタイムスタンプを reject します。ノートPC が起動直後で NTP 未補正のとき、署名が全部 reject されます。validAfter に 60 秒、validBefore に 5 分のバッファを入れて回避。
3. Self-payment ガード
ユーザーが payTo と署名鍵を同じアドレスに設定すると、毎回 self-loop transfer になり facilitator は reject。クライアント側で即時 throw するガードを追加。
4. 小残高 UX
$5 USDC float = 625 コール ($0.008 each)。Claude セッションには十分ですが、バッチ スクリーニング (数百アドレス) では枯渇します。chainanalyzer.check_my_balance ツールを追加して、モデルがバッチ前に残高を確認できるように。
ユーザーが負担するコスト
- ウォレット セットアップ: 無料 (Base 互換ウォレット任意)
- 初期入金: $5 USDC on Base + 数十セントの ETH (ガス代、L2 なので激安)
- 1 コール毎: $0.008 USDC + ガス代は facilitator 持ち、ユーザー負担はゼロ
- サブスク無し / 月額最小なし
比較のため: 我々の最安 Pro プランは $19.99/月。~2,500 スキャン/月以下なら x402 が完全に安い。それ以上なら Pro が安く、AI Analysis も使い放題。エージェント workload には x402 が明白な選択。エージェントはクレジットカードを持たない。SaaS にサインアップしない。エージェントは ウォレットを持つ。
使ってみる
npx -y @chainanalyzer/mcp-server 上記のウォレット env vars を設定済みで実行。詳細は chainanalyzer-mcp GitHub repo の README (90 秒セットアップ動画付き)。
上流の x402 エンドポイント セットは姉妹記事で: Coinbase x402 Bazaar に AML API を出した話。
クリプトを超えた意味
パターン — MCP ツールが x402 課金 HTTP API をラップ、エージェントがウォレットを持つ、コール毎にリアルマネー — は「エージェントが買いたいもの」全般に通用します。画像生成。航空券価格。アドレス リスク データ。翻訳。
AI エージェントの自律性は現在「経済」がボトルネック: ブラウズ・推論・計画はできても、トランザクションができない。MCP + x402 はこれを「エージェントが個人クレジットカードを持つ必要なく、ユーザーが渡す必要もない」形で閉じます。エージェントはウォレットを持つ。ウォレットは USDC を持つ。それで十分。