2026年4月28日

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 支払いに繋いだプロトコル:

  1. エージェントが GET /api/risk-score?address=0xabc を呼ぶ
  2. サーバーは HTTP 402 + 価格 ($0.008 USDC) + asset (USDC on Base) + 受取アドレス + 署名用 nonce を返す
  3. エージェントのウォレットが EIP-3009 transferWithAuthorization をその金額分だけ署名、base64 エンコードして X-PAYMENT ヘッダ付きで再リクエスト
  4. サーバーは署名検証 → ハンドラ実行 → 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 を持つ。それで十分

リンク

© 2026 ChainAnalyzer. All rights reserved.