---
title: "MCPサーバーにx402決済を追加する方法:エージェント決済のビルダーガイド"
description: "MCPサーバーをx402でゲートし、呼び出しごとにUSDCを計測し、エージェントに支払い用のウォレットを与え、AP2、MPP、ACPがどこに位置づけられるかを見る。実行可能なコード付き。"
---

# MCPサーバーにx402決済を追加する方法:エージェント決済のビルダーガイド

<ImageBlock
  src="https://media.alchemy.com/x402-payments-1.png"
  alt="x402決済の追加"
  width={3840}
  height={1800}
  priority
/>

ほとんどのAPIは、まずサインアップさせることで課金する仕組みになっている。アカウントを作成し、キーを取得し、後で請求される。[x402](https://docs.x402.org/core-concepts/http-402)はそれらすべてを省略する。サーバーはリクエストごとに課金でき、サインアップもキーもインボイスも不要だ。そしてすでに本番環境で稼働している。[Coinbaseは2025年5月にこれを出荷し](https://www.coinbase.com/developer-platform/discover/launches/x402)、[CloudflareはそれをAgents SDKに組み込み](https://developers.cloudflare.com/agents/tools/payments/x402/charge-for-mcp-tools/)、[我々のエージェントゲートウェイ](/docs/x402-payments)はRPCとデータアクセスに対してエージェントに課金するためにこれを使っている。

このガイドは、その取引のどちら側を構築する人にも向けている。呼び出しごとに課金したいMCPサーバーやAPI、あるいはそれに支払う必要のあるエージェントだ。リクエストとレスポンスのループを説明し、その後、ツール呼び出しへの課金、呼び出しごとのUSDCでの計測と決済、支払いに使うウォレットをエージェントに与える方法、そしてAP2のような他の支払いプロトコルがどこに当てはまるかについて、実際のコードを示す。

## x402は実際に何をするのか

[HTTP 402 Payment Required](https://developer.mozilla.org/en-US/docs/Web/HTTP/Status/402)は1990年代からHTTP仕様に存在していたが、実装されたことはなかった。[x402](https://docs.x402.org/core-concepts/http-402)は、ついにそれを使用するプロトコルだ。

- サーバーは未払いのリクエストに対して、ステータス402と機械可読な価格で応答する
- クライアントは署名済みの支払いを添付して再試行する
- サーバーは検証し、決済し、同じやり取りの中でリソースを返す

セッションも、保存されたカードも、ダッシュボードもなく、ウォレット自体がアカウントとなる。[x402 v2](https://docs.x402.org/core-concepts/http-402)では、関連情報はHTTPヘッダーに格納される。

<EmbeddedTable
  table={{
    columns: [
      { key: "header", width: 200, title: "Header", dataType: "object" },
      { key: "direction", width: 180, title: "Direction", dataType: "object" },
      { key: "carries", width: 320, title: "Carries", dataType: "object" },
    ],
    data: [
      {
        header: {
          title: "<p><code>PAYMENT-REQUIRED</code></p>",
          tooltip: "",
          icon: "",
        },
        direction: { title: "<p>Server to client</p>", tooltip: "", icon: "" },
        carries: {
          title:
            "<p>Price, destination address, network, and accepted payment schemes, base64-encoded</p>",
          tooltip: "",
          icon: "",
        },
        id: 0,
      },
      {
        header: {
          title: "<p><code>PAYMENT-SIGNATURE</code></p>",
          tooltip: "",
          icon: "",
        },
        direction: { title: "<p>Client to server</p>", tooltip: "", icon: "" },
        carries: {
          title: "<p>The signed payment payload, base64-encoded</p>",
          tooltip: "",
          icon: "",
        },
        id: 1,
      },
      {
        header: {
          title: "<p><code>PAYMENT-RESPONSE</code></p>",
          tooltip: "",
          icon: "",
        },
        direction: { title: "<p>Server to client</p>", tooltip: "", icon: "" },
        carries: {
          title: "<p>The settlement result, base64-encoded</p>",
          tooltip: "",
          icon: "",
        },
        id: 2,
      },
    ],
  }}
/>

この3つのヘッダーは変わらない。変わるのは、`PAYMENT-REQUIRED`が運ぶJSON内の`scheme`フィールドであり、これはこの特定の呼び出しがどの課金モデルを使っているかをクライアントに伝える。どのスキームでも、検証と資金移動を行うのは同じサードパーティ、すなわち[facilitator](https://docs.x402.org/core-concepts/facilitator)だ。これはクライアントの署名済み支払いを検証し、オンチェーンの決済を提出するサービスであり、これによって売り手側も買い手側もどちらも自分で行う必要がなくなる。スキームごとに異なるのは、facilitatorが何を確認し、いつ決済するかだけだ。

ほとんどの呼び出しは`exact`を使う。価格は固定でありあらかじめ分かっているため、クライアントはその正確な金額に対して署名し、その正確な金額で決済される。ペイロードは以下のようになり、重要なフィールドのみを抜粋している。`amount`は10,000アトミック単位であり、$0.01 USDCに相当する。

<CodeSnippet
  language="json"
  code={`{
  "accepts": [{
    "scheme": "exact",
    "amount": "10000",
    "asset": "0x036C...F7e",
    "payTo": "0x2096...87C"
  }]
}`}
/>

一部の呼び出しは、作業が完了して初めて分かる可変の金額がかかる。たとえば、生成されたトークン数に応じて課金されるLLM出力などだ。そのような場合、サーバーは`upto`を使う。ペイロードはほぼ同一に見えるが、`amount`は今度は価格ではなく、クライアントが同意する上限を意味する。ここではその上限は$5.00だ。

<CodeSnippet
  language="json"
  code={`{
  "accepts": [{
    "scheme": "upto",
    "amount": "5000000",
    "asset": "0x036C...F7e",
    "payTo": "0x2096...87C"
  }]
}`}
/>

クライアントはその上限に対して一度だけ署名する。サーバーが作業を終えた後、facilitatorは実際の金額(たとえば実際の使用量として$1.20)で決済し、資金を移動する前に、それが署名された上限以下であることを確認する。クライアントが二度署名することはない。決済ステップでのみ実際の数値が埋められる。

3つ目のスキーム、`batch-settlement`は、呼び出しごとにガス代を支払うとその呼び出し自体よりコストがかかってしまうような、高頻度かつサブセントの課金向けだ。[x402スキーム](https://docs.x402.org/core-concepts/network-and-token-support)では、買い手はエスクローコントラクトに一度だけ入金し、リクエストごとにオフチェーンのバウチャーに署名し、売り手はそれをバッチでオンチェーン償還する。[Circle Gateway](https://developers.circle.com/gateway/nanopayments)は同様のナノペイメントのパターンを同じ用途に使っている。

facilitatorはそれ自体で資金を保持することはなく、署名済みの指示を確認して実行するだけだ。[x402.orgは無料の公開facilitatorを運用しており](https://docs.x402.org/core-concepts/facilitator)、開発およびテストネット専用だ。[CoinbaseのCDPはコンプライアンス審査付きのホスト型本番facilitatorを運用している](https://docs.cdp.coinbase.com/x402/core-concepts/how-it-works)。コードをどちらかに向けて設定できる。

## x402のリクエストとレスポンスのループはどう動くのか

このハンドシェイクは9つのステップからなる。

1. クライアントは支払いなしでリソースをリクエストする。
2. サーバーは価格、宛先アドレス、受け入れる支払いスキームを添えて`402 Payment Required`で応答する。
3. クライアントは受け入れられているスキームのうちの1つに対して支払いに署名し、署名を添付してリクエストを再試行する。
4. サーバーはfacilitatorに対し、署名済みの支払いが宣言された要件を満たしているか検証を依頼する。
5. facilitatorは検証結果を返す。
6. サーバーは作業を実行する(クエリを実行する、モデルを呼び出す、レポートを生成する)。
7. サーバーはfacilitatorに支払いのオンチェーン決済を依頼する。
8. facilitatorは決済結果を返す。
9. サーバーはリソースを、決済レシートとともに返す。

HTTP上では、このループはHTTPヘッダー(`PAYMENT-REQUIRED`、`PAYMENT-SIGNATURE`、`PAYMENT-RESPONSE`)を介して実行される。[MCP](https://github.com/x402-foundation/x402/blob/main/specs/transports-v2/mcp.md)上では、同じ9つのステップがJSON上で実行される。

- 支払いなしの呼び出しは、`isError: true`と`PaymentRequired`のペイロードを持つ結果を返す(`PAYMENT-REQUIRED`と同等)
- クライアントは`_meta["x402/payment"]`に署名済みの支払いを添付して同じ呼び出しを再試行する(`PAYMENT-SIGNATURE`と同等)
- サーバーは`_meta["x402/payment-response"]`に決済情報を添えた実際の結果を返す(`PAYMENT-RESPONSE`と同等)

## MCPサーバーにx402の支払いを追加するにはどうすればいいのか

この例は、よくある実際のユースケースを反映している。有料と無料のツールが混在するMCPサーバーで、たとえば無料の基本検索は提供しつつ、詳細な生成レポートには課金するリサーチやデータサーバーだ。

この例では、`generate_report`は呼び出しごとに$0.01かかり、`ping`は無料のままとなる。これはオープンな[x402 Foundation SDKs](https://github.com/x402-foundation/x402)(facilitatorに依存しないため、無料の公開facilitatorに対して開始し、後で商用のものに切り替えることができる)の上に構築されており、支払いを受け取るアドレスとして[Wallet APIs](/docs/wallets/quickstart)のスマートアカウントを使用している。

まず、支払いを受け取るウォレットをプロビジョニングする。`@alchemy/wallet-apis`([v5](/docs/wallets/quickstart))は、サーバー上で秘密鍵に触れることなくスマートアカウントアドレスを提供する。

<CodeSnippet
  language="tsx"
  code={`// wallet.ts
import { createServerSigner } from "@account-kit/signer";
import { createSmartWalletClient, alchemyWalletTransport } from "@alchemy/wallet-apis";
import { baseSepolia } from "viem/chains";

const signer = await createServerSigner({
  auth: { accessKey: process.env.ALCHEMY_ACCESS_KEY! },
  connection: { apiKey: process.env.ALCHEMY_API_KEY! },
});

const walletClient = createSmartWalletClient({
  transport: alchemyWalletTransport({ apiKey: process.env.ALCHEMY_API_KEY! }),
  chain: baseSepolia,
  signer,
});

export const receiverAccount = await walletClient.requestAccount();
// receiverAccount.address is the payTo address for every quote you issue below`}
/>

次に、そのアドレスをx402で保護されたMCPツールに組み込む。[`@x402/core`](https://github.com/x402-foundation/x402)は支払い要件を構築・検証し、`@x402/evm`はEVMチェーン向けの`exact`スキームを実装し、[`@x402/mcp`](https://github.com/x402-foundation/x402/blob/main/specs/transports-v2/mcp.md)はツールハンドラをラップして、プレーンな関数を有料の関数に変える。

<CodeSnippet
  language="tsx"
  code={`// server.ts
import { createServer } from "node:http";
import { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
import { StreamableHTTPServerTransport } from "@modelcontextprotocol/sdk/server/streamableHttp.js";
import { x402ResourceServer } from "@x402/core/server";
import { HTTPFacilitatorClient } from "@x402/core/facilitator";
import { createPaymentWrapper } from "@x402/mcp";
import { ExactEvmScheme } from "@x402/evm/exact/server";
import { z } from "zod";
import { receiverAccount } from "./wallet";

// Base Sepolia for testing; swap to eip155:8453 for Base mainnet
const NETWORK = "eip155:84532";

// Start against the free public facilitator, then swap the url for a
// commercial facilitator (compliance screening, higher throughput, an
// SLA) for production.
const facilitator = new HTTPFacilitatorClient({
  url: "https://x402.org/facilitator",
});

const resourceServer = new x402ResourceServer(facilitator);
resourceServer.register(NETWORK, new ExactEvmScheme());
await resourceServer.initialize();

const accepts = await resourceServer.buildPaymentRequirements({
  scheme: "exact",
  network: NETWORK,
  payTo: receiverAccount.address,
  price: "$0.01",
});

const paid = createPaymentWrapper(resourceServer, { accepts });

const server = new McpServer({
  name: "paid-report-server",
  version: "1.0.0",
});

server.tool(
  "generate_report",
  "Generate a research report on a topic. Costs $0.01 in USDC.",
  { topic: z.string() },
  paid(async ({ topic }) => ({
    content: [
      {
        type: "text",
        text: "Report on " + topic + ": trending up, no anomalies.",
      },
    ],
  })),
);

server.tool("ping", "Free health check", {}, async () => ({
  content: [{ type: "text", text: "pong" }],
}));

const transport = new StreamableHTTPServerTransport({
  sessionIdGenerator: undefined,
});
await server.connect(transport);

createServer((req, res) => {
  const path = new URL(req.url ?? "/", "http://localhost").pathname;
  if (path === "/mcp") {
    void transport.handleRequest(req, res);
    return;
  }
  res.writeHead(404).end();
}).listen(3000);`}
/>

`server.connect(transport)`はプロトコルをトランスポートに接続するだけだ。実際にポート3000を開き、`/mcp`を`transport.handleRequest(...)`に転送するのはNode HTTPリスナーであり、これが以下のクライアントが呼び出すエンドポイントとなる。

`paid(...)`でラップしなかったものはすべて無料のままなので、同じサーバー上で有料と無料のツールを混在させることができる。まずは支払いを添付せずに`curl`や任意のMCPクライアントでテストしてほしい。レポートの代わりに支払いが必要である旨の結果が返るはずであり、これによって、有料クライアントを組み込む前にゲートが正しく機能していることを確認できる。

facilitatorとの関係を自分で構築したくない、かつ他の新興のエージェント支払いプロトコルも1つに絞らずx402と合わせて受け入れたい場合、[AgentPay](/agentpay)がまさにそのためのものだ。既存のエンドポイントに向けるだけで、x402、ACP、MPP、AP2にまたがるプロトコル変換を1つの統合で処理できる。

## エージェントごとに呼び出しを計測し課金するにはどうすればいいのか

呼び出しごとの単一の均一価格が基本ケースだ。本番のサーバーでは、誰がいくら支払ったかを追跡する必要もあり、資金が実際に移動した唯一の証明としてfacilitatorの決済レポートだけに頼るべきではない。検証のために、以下を記録しておく。

- 価格の形態。均一の呼び出しごとの価格には、上記のパターンである`exact`を使う。呼び出しによってコストが変わる場合(長いレポートは短いものよりトークンが多くかかる)で、上限をあらかじめ承認しつつ実際の使用量で決済したい場合は`upto`を使う。呼び出しが頻繁かつ安価で、それぞれをオンチェーンで個別に決済するとその呼び出し自体よりコストがかかってしまう場合は`batch-settlement`を使う。
- 帰属と台帳管理。クライアントが署名する支払いペイロードには、支払い元のアドレスが含まれる。呼び出しが決済されるたびに、それをツール名、価格、決済結果と紐づけて記録すれば、エージェントごとの使用量台帳が自然と手に入る。

<CodeSnippet
  language="tsx"
  code={`const paid = createPaymentWrapper(resourceServer, {
  accepts,
  hooks: {
    onAfterSettlement: async ({ toolName, settlement }) => {
      await usageLedger.record({
        payer: settlement.payer,
        tool: toolName,
        amountUsd: 0.01,
        txHash: settlement.transaction,
        settledAt: new Date(),
      });
    },
  },
});`}
/>

決済レスポンスを唯一のシグナルとして信頼するだけで終わらせてはいけない。facilitatorが`settled: true`を報告している一方でリクエストが依然として非200を返す、あるいはその逆のこともあり得る。収益として計上する前に両方を確認すべきだ。定期的な照合パスとして、[我々のTransfers API](/docs/data/transfers-api/transfers-endpoints/alchemy-get-asset-transfers)を使えば、実際に受信アドレスに何が届いたかを独立して確認できる。これにより、facilitatorの決済レポートとオンチェーンの実態が一致しないという稀なケースを検知できる。

<CodeSnippet
  language="tsx"
  code={`const res = await fetch("https://base-sepolia.g.alchemy.com/v2/" + apiKey, {
  method: "POST",
  headers: { "Content-Type": "application/json" },
  body: JSON.stringify({
    jsonrpc: "2.0",
    method: "alchemy_getAssetTransfers",
    params: [{
      toAddress: receiverAccount.address,
      category: ["erc20"],
      contractAddresses: [USDC_ADDRESS],
      withMetadata: true,
    }],
    id: 1,
  }),
});
const { result } = await res.json();
// result.transfers is the ground truth for what actually arrived onchain,
// independent of what any single facilitator reported settling`}
/>

## エージェントに支払い用のUSDCウォレットを持たせるにはどうすればいいのか

有料エンドポイント(自分のものでも他人のものでも)に支払う必要のあるエージェントには、資金の入ったウォレットと、402に遭遇した際に支払いに署名できるコード(またはCLI)が必要だ。

人間が操作する、あるいはローカルでテストするエージェントの場合、最も速い方法は[Alchemy CLI](/docs/alchemy-cli)だ。これは、エージェントが秘密鍵に一切触れることなく使用できる、スコープの限定されたウォレットセッションを作成する。

<CodeSnippet
  language="bash"
  code={`npm i -g "@alchemy/cli@latest"
alchemy auth
alchemy wallet connect --mode session --instance-name "my-agent"

# decode a quote without paying anything, useful for a first look at an unfamiliar endpoint
alchemy x402 request "https://api.example.com/report" --estimate

# pay it for real, with a hard spend cap; required for any non-interactive run
alchemy --json --no-interactive x402 request "https://api.example.com/report" --max-payment 0.01`}
/>

`--max-payment`は、CLIが支払う最大額を設定し、サーバーが返してくる何であれ、この数値をそれ以上に押し上げることはできない。承認する人間が誰もいない状態でこのコマンドを実行し(`--no-interactive`)、`--max-payment`を設定し忘れた場合、CLIは支払うのではなく単に停止する。なぜなら、402レスポンス内の価格は自分が制御していないサーバーから来るものであり、まず自分の上限がそれをチェックしない限り、何もそれを支払うべきではないからだ。コマンドの全体像については、[x402 payments CLIドキュメント](/docs/x402-payments)を参照してほしい。

各セッションを人間が承認することなく支払う必要のある、完全に自律的なバックエンドエージェントの場合は、`fetch`(またはMCPクライアント)を、署名者に裏付けられた支払いハンドラでラップする。エージェントが有料のHTTPエンドポイントを呼び出す場合は、[`@x402/fetch`](https://github.com/x402-foundation/x402)を使う。

<CodeSnippet
  language="tsx"
  code={`import { x402Client } from "@x402/core/client";
import { wrapFetchWithPayment } from "@x402/fetch";
import { registerExactEvmScheme } from "@x402/evm/exact/client";
import { privateKeyToAccount } from "viem/accounts";

const signer = privateKeyToAccount(process.env.AGENT_WALLET_KEY as \`0x\${string}\`);
const client = new x402Client();
registerExactEvmScheme(client, { signer });

const fetchWithPayment = wrapFetchWithPayment(fetch, client);
const response = await fetchWithPayment("https://api.example.com/report");`}
/>

エージェントがプレーンなHTTPエンドポイントではなく、MCPサーバー上の有料ツールを呼び出す場合は、`fetch`ではなく、同じ方法でMCPクライアントをラップする。[CDPはMCPの買い手向けに同じパターンを文書化している](https://docs.cdp.coinbase.com/x402/buyer/mcp-payments)。

<CodeSnippet
  language="tsx"
  code={`import { Client } from "@modelcontextprotocol/sdk/client/index.js";
import { StreamableHTTPClientTransport } from "@modelcontextprotocol/sdk/client/streamableHttp.js";
import { x402Client } from "@x402/core/client";
import { wrapMCPClientWithPayment } from "@x402/mcp";
import { registerExactEvmScheme } from "@x402/evm/exact/client";
import { privateKeyToAccount } from "viem/accounts";

const signer = privateKeyToAccount(
  process.env.AGENT_WALLET_KEY as \`0x\${string}\`,
);
const paymentClient = new x402Client();
registerExactEvmScheme(paymentClient, { signer });

const mcp = wrapMCPClientWithPayment(
  new Client(
    { name: "my-agent", version: "1.0.0" },
    { capabilities: {} },
  ),
  paymentClient,
  { autoPayment: true },
);

await mcp.connect(
  new StreamableHTTPClientTransport(
    new URL("http://localhost:3000/mcp"),
  ),
);

const report = await mcp.callTool({
  name: "generate_report",
  arguments: { topic: "USDC on Base" },
});`}
/>

環境変数に生の秘密鍵を置くことは、テストネットでの最初のテストであれば問題ないかもしれないが、本番環境では受け入れられない。本番のエージェントには、同じ署名者インターフェースの背後に、[Wallet APIs](/docs/wallets/quickstart)のスマートアカウントか[Agent Walletセッション](/docs/agent-wallets)を置くべきであり、そうすればエージェントは、自分では一度も秘密鍵を保持することなく、設定したルールの下で署名できる。

## ガスをエージェントに保有させずにUSDCで決済するにはどうすればいいのか

すべてのオンチェーントランザクションにはガスが必要だ。ETHのようなネイティブトークンで、トランザクションを送信する側が保有し、ネットワークにそれを処理させるための対価として支払う。これはAPI呼び出しごとに支払うエージェントにとっては問題だ。エージェントは$0.01の支払いのたびに立ち止まってガストークンを取得するわけにはいかないし、念のためにそれを備蓄しておくのは自動化フローの意味を失わせてしまう。

USDCの決済は[EIP-3009](https://eips.ethereum.org/EIPS/eip-3009)(`transferWithAuthorization`)によってこれを回避する。これにより、エージェントは自分でトランザクションを提出したりガストークンを保有したりすることなく、送金に署名できるようになる。エージェントは署名するだけであり、そのトランザクションをオンチェーンで提出しガスを支払うのはfacilitatorだ。`exact`と`upto`の決済は通常、USDCにはEIP-3009を、EIP-3009に対応していない他のERC-20には[Permit2](https://docs.uniswap.org/contracts/v4/deployments)を使う。`batch-settlement`では依然としてエージェントがリクエストごとに署名するが、売り手は各呼び出しを個別に決済するのではなく、後でバッチをオンチェーンで償還する。[Circle Gateway](https://developers.circle.com/gateway/nanopayments)は、その同じ高頻度のケースに対して関連するナノペイメントのパターンを使用している。USDCがドル建てであることも、これに加えて物事をシンプルに保っている。どちら側も$0.01の課金で為替レートの計算をする必要がない。

これで支払い自体はカバーされる。受信アドレスが単なる外部所有ウォレットである場合、話はそれで終わりだ。デプロイのステップを挟むことなく、単にUSDCを受け取るだけだ。このガイドで先に構築したもののようなスマートアカウントの場合、x402のフロー外の別の2つの場面で依然としてガスに触れることになる。1つは資金を初めて受け取った時にオンチェーンでデプロイする際、もう1つは集まったUSDCをトレジャリーウォレットに送り出す際だ。我々の[Gas Manager](/gasless-transactions)はこれら2つの場面でガスをスポンサーできる。いずれにせよ、それはx402の支払いの決済自体には関与しない。facilitatorがすでにそれをカバーしているためだ。

Baseは、ほとんどのツールにおけるデフォルトのネットワークだ。それは元々のリファレンスfacilitatorが稼働しており、既存のx402統合のほとんどがすでにそこにあるためだが、[x402 v2](https://docs.x402.org/core-concepts/network-and-token-support)はBase専用ではない。任意のEVMチェーン(Ethereumメインネットや Polygonを含む)に加え、Solana、TON、Algorand、Stellar、Aptos、Hedera、Keeta、NEAR、Concordium、XRPLもカバーしており、facilitatorがサポートを追加するにつれて対応チェーンはさらに増える見込みだ。「EthereumでUSDC払い」が具体的に自分のケースで機能するかどうかは、プロトコル自体ではなく、選んだfacilitatorがそのネットワークを実装しているかどうかに依存する。

## x402はエージェント支払いスタック全体の中でどこに位置するのか

x402は、急速に動いているこの分野の1つのプロトコルであり、唯一のものではない。

- [StripeとTempoが構築したMPP](https://stripe.com/blog/machine-payments-protocol)は、同じ402パターンのバージョンでありながら、ステーブルコインに縛られていない。売り手は同じフローの下でカードまたはステーブルコインを受け入れることができる(また、MPPはx402の`exact`フローと後方互換性があるため、一方向けに構築されたクライアントは通常、もう一方向けに構築されたサーバーと通信できる)。
- [OpenAIとStripeのACP](https://openai.com/index/buy-it-in-chatgpt/)は異なる領域をカバーしている。リクエストごとのAPI支払いではなく、AI主導のショッピングにおけるチェックアウトだ。
- [GoogleのAP2](https://cloud.google.com/blog/products/ai-machine-learning/announcing-agents-to-payments-ap2-protocol)は、まったく異なる問題をカバーしている。支払い方法がカードであれ、銀行振込であれ、ステーブルコインであれ、署名済みのCheckoutおよびPaymentマンデートを使って、ユーザーがエージェントに支払いを許可したことを証明することだ。AP2は競合する決済レールではない。AP2フローがステーブルコインで決済する必要がある場合、Googleが Coinbase、Ethereum Foundation、MetaMaskと共に構築した[A2A x402拡張機能](https://github.com/google-agentic-commerce/a2a-x402)を通じてそれを行うため、x402はその代替ではなく、その下にある暗号資産のレールとなっている。

<EmbeddedTable
  table={{
    columns: [
      { key: "protocol", width: 100, title: "Protocol", dataType: "object" },
      { key: "steward", width: 180, title: "Steward", dataType: "object" },
      { key: "type", width: 180, title: "Payment type", dataType: "object" },
      { key: "job", width: 240, title: "Primary job", dataType: "object" },
      { key: "settles", width: 180, title: "Settles per request?", dataType: "object" },
    ],
    data: [
      {
        protocol: { title: "<p>x402</p>", tooltip: "", icon: "" },
        steward: {
          title: "<p>x402 Foundation (originally Coinbase)</p>",
          tooltip: "",
          icon: "",
        },
        type: { title: "<p>Onchain stablecoins</p>", tooltip: "", icon: "" },
        job: {
          title: "<p>Pay per API call, tool call, or piece of content over HTTP or MCP</p>",
          tooltip: "",
          icon: "",
        },
        settles: { title: "<p>Yes</p>", tooltip: "", icon: "" },
        id: 0,
      },
      {
        protocol: { title: "<p>MPP</p>", tooltip: "", icon: "" },
        steward: { title: "<p>Stripe and Tempo</p>", tooltip: "", icon: "" },
        type: {
          title: "<p>Cards or stablecoins, same flow</p>",
          tooltip: "",
          icon: "",
        },
        job: {
          title: "<p>Pay per request, payment-method-agnostic</p>",
          tooltip: "",
          icon: "",
        },
        settles: { title: "<p>Yes</p>", tooltip: "", icon: "" },
        id: 1,
      },
      {
        protocol: { title: "<p>ACP</p>", tooltip: "", icon: "" },
        steward: { title: "<p>OpenAI and Stripe</p>", tooltip: "", icon: "" },
        type: {
          title: "<p>Cards (via Stripe checkout)</p>",
          tooltip: "",
          icon: "",
        },
        job: {
          title: "<p>Agent-driven shopping checkout, not per-request API payment</p>",
          tooltip: "",
          icon: "",
        },
        settles: { title: "<p>No, one checkout per purchase</p>", tooltip: "", icon: "" },
        id: 2,
      },
      {
        protocol: { title: "<p>AP2</p>", tooltip: "", icon: "" },
        steward: {
          title: "<p>Google, with industry partners</p>",
          tooltip: "",
          icon: "",
        },
        type: {
          title: "<p>Payment-agnostic: cards, bank transfers, stablecoins</p>",
          tooltip: "",
          icon: "",
        },
        job: {
          title:
            "<p>Prove a user authorized an agent to spend; settles through x402 or a card/bank rail underneath</p>",
          tooltip: "",
          icon: "",
        },
        settles: {
          title: "<p>No, authorizes a rail rather than settling itself</p>",
          tooltip: "",
          icon: "",
        },
        id: 3,
      },
    ],
  }}
/>

プロトコルの状況が進化する中、[AgentPay](/agentpay)は、マーチャントが一度の統合ですべてに対応できるよう支援する、プロトコルに依存しないプロキシとして存在している。

特定の構築においてx402とMPPのどちらを選ぶか検討している場合は、[x402とMPPの比較](/overviews/x402-vs-mpp-comparing-agent-payment-protocols)を参照してほしい。インフラプロバイダーを選ぶ場合は、Alchemy、CoinbaseのDeveloper Platform、Circle、Crossmint、Privy、Turnkeyを対象とした[ウォレット、ガス、データレイヤーの比較](/overviews/best-infrastructure-for-agentic-payments)を参照してほしい。

## 避けるべきよくある間違い

- 自分で確認していない見積もりに署名しないこと。402レスポンスは、自分が制御していないサーバーから送られてきた単なる数字だ。署名する前に、ネットワーク、資産、金額を確認すること。それは[Alchemy CLI](/docs/x402-payments)が署名する前にローカルで見積もりを確認するのと同じ考え方だ。
- 200レスポンスを支払いの証明として扱ったり、facilitatorの`settled: true`を唯一必要な証明として扱ったりしないこと。決済レシート自体を確認し、上記で示したように[我々のTransfers API](/docs/data/transfers-api/transfers-endpoints/alchemy-get-asset-transfers)を使って定期的にオンチェーンの実態と照合すること。
- 自律的なエージェントにおいて支出上限の設定を省略しないこと。`--max-payment`に相当するものが何であれ、それを目的を達成できる最小の値に設定すること。それが、エージェントと、過大な見積もりを返してくるサーバーとの間に立つ唯一のものだからだ。
- 署名の検証、トランザクションの審査、規模を伴うオンチェーンでの決済提出が実際に自分のプロダクトでない限り、自分でfacilitatorを構築しないこと。[ホスト型のものを利用し](https://docs.x402.org/core-concepts/facilitator)、そのエンジニアリング時間を実際のサービスに費やすこと。
- 「x402をサポートしている」ことが「すべてのネットワークとスキームをサポートしている」ことを意味すると想定しないこと。導入前に、どのスキーム(`exact`、`upto`、`batch-settlement`)、どのチェーンを、自分が使う特定のfacilitatorと相手が実際に実装しているかを確認すること。[ネットワークとトークンのサポートページ](https://docs.x402.org/core-concepts/network-and-token-support)が正式な情報源だ。

## よくある質問

### MCPサーバーにx402の支払いを追加するにはどうすればいいのか

課金したいツールハンドラを、x402 Foundationの[`@x402/mcp`](https://github.com/x402-foundation/x402/blob/main/specs/transports-v2/mcp.md)パッケージが提供する支払いラッパーでラップする。裏側には、facilitatorに登録されており、どのウォレットアドレスが支払いを受け取るべきかを把握しているサーバーが必要だ。完全な動作例は上記の通りであり、サーバー上の他のものは、それもラップしない限り無料のままとなる。

### AIエージェントがx402を使ってステーブルコインでAPIに支払うには、どんなインフラが必要か

3つの要素がある。USDCを保有し署名できるウォレット、[x402ハンドシェイク](https://docs.x402.org/core-concepts/http-402)を話せる署名済み支払いライブラリまたはCLI、そして売り手側で検証と決済を行う[facilitator](https://docs.x402.org/core-concepts/facilitator)だ。自分でブロックチェーンノードを運用したりガストークンを保有したりする必要はない。決済のガスはfacilitatorがカバーする。

### AIエージェントにEthereum上でUSDC支払いを送信させるには、どうするのが最善か

エージェントに直接署名できるウォレットを与えること。[Alchemy Agent Wallet](/docs/agent-wallets)のようなスコープの限定されたセッションでも、[我々のWallet APIs](/docs/wallets/quickstart)を通じたプログラム制御のスマートアカウントでもよい。そしてそれを`@x402/fetch`や[Alchemy CLI](/docs/x402-payments)の`x402 request`コマンドのようなx402クライアントライブラリと組み合わせる。まず、対象のfacilitatorが実際にその特定のネットワークをサポートしているかを確認すること。x402 v2は[Ethereumをカバーしている](https://docs.x402.org/core-concepts/network-and-token-support)が、対応範囲はプロトコル自体ではなくfacilitator次第だ。

### AIエージェントにオンチェーン支払い用のUSDCウォレットを持たせるにはどうすればいいのか

テストや人間監視下のエージェントの場合、`alchemy wallet connect --mode session`([Alchemy CLI](/docs/alchemy-cli)の一部)は、秘密鍵をエージェントに一切露出させることなく、スコープの限定された取り消し可能なウォレットセッションを数分で作成する。完全に自律的なバックエンドエージェントの場合は、[`@alchemy/wallet-apis`](/docs/wallets/quickstart)を通じてスマートアカウントを、またはCDPが管理するウォレットをプロビジョニングし、その署名者をx402クライアントライブラリに渡す。

### エージェントはx402を使ってどのようにAPIアクセスに対して支払うのか

エージェントはAPIを呼び出し、[価格と宛先アドレスを伴う402](https://docs.x402.org/core-concepts/http-402)を受け取り、サーバーが受け入れるスキームに対して支払いに署名し、署名済みの支払いを添付して同じリクエストを再試行する。サーバーはfacilitatorを通じて検証と決済を行い、同じラウンドトリップの中でリソースを返す。

### 暗号資産での支払いを使ってAIエージェントのAPI使用量を計測し課金するにはどうすればいいのか

呼び出しごとの均一な価格には`exact`スキームを使い、使用量によってコストが変わる場合は`upto`を使う。そして、それぞれの決済済みの支払いから支払い元のアドレスを記録し、それが支払われたツールやエンドポイントと紐づける。単一の決済レポートを信頼するのではなく、その台帳を定期的にオンチェーンの送金履歴と照合すること。たとえば[我々のTransfers API](/docs/data/transfers-api/transfers-endpoints/alchemy-get-asset-transfers)を使うとよい。

### エージェント型の暗号資産決済とオンチェーンコマースに最適なインフラは何か

それは、ウォレットのカストディ、支払いレール、ガス、オンチェーンデータといったスタックのどれだけを1つのプロバイダーから求めるか、それとも複数から組み合わせるかによる。まさにそのスタックに対するAlchemy、CoinbaseのDeveloper Platform、Circle、Crossmint、Privy、Turnkeyの全体比較は、[インフラ比較ページ](/overviews/best-infrastructure-for-agentic-payments)に掲載されている。

### AP2とは何で、x402とどう関係するのか

[AP2](https://cloud.google.com/blog/products/ai-machine-learning/announcing-agents-to-payments-ap2-protocol)は、署名済みのCheckoutおよびPaymentマンデートを使って、ユーザーがエージェントに支払いを許可したことを証明するための、Googleの支払い方法に依存しないフレームワークだ。x402を置き換えるのではなく、その上に位置する。AP2フローがステーブルコインで決済する必要がある場合、Googleが Coinbase、Ethereum Foundation、MetaMaskと共に構築した[A2A x402拡張機能](https://github.com/google-agentic-commerce/a2a-x402)を通じてそれを行う。

### エージェント型コマースとは何で、どんなインフラが必要か

エージェント型コマースとは、AIエージェントが人間がチェックアウトをクリックすることなく、商品、サービス、API アクセスを発見し、支払い、支払いを受け取ることだ。これには、資金の入ったウォレット、リクエストごとに価値を移動させる[x402](https://docs.x402.org/core-concepts/http-402)や[MPP](https://stripe.com/blog/machine-payments-protocol)のような支払いレール、エージェントがネイティブトークンを必要としないためのガスの取り扱い、そしてエージェントが何に支払うかを判断し、それが届いたことを確認するのに十分なオンチェーンまたはカタログのデータが必要だ。

### エージェントがペイウォール付きのオンチェーンサービスにアクセスできるよう、x402支払いプロトコルを実装するにはどうすればいいのか

クライアント側では、x402クライアントライブラリ([`@x402/fetch`](https://github.com/x402-foundation/x402)、`@x402/axios`、または[MCPクライアントラッパー](https://docs.cdp.coinbase.com/x402/buyer/mcp-payments))をインストールし、ウォレット署名者と共に支払いスキームを登録し、それで既存のHTTPクライアントやMCPクライアントをラップする。そうすれば、402への支払いはそこから自動的に行われるようになる。上記の買い手側のコードは、HTTPとMCPの両方のケースをカバーしている。

### AIエージェントはどのようにオンチェーンで支払いを受け取るのか

他のx402の売り手と同じ仕組みだ。エージェントが運営するサービスは、自身のエンドポイントやMCPツールを[x402](https://docs.x402.org/core-concepts/http-402)で価格付けし、自身または運用者が管理するウォレットに支払いを受け取り、このガイドで先に構築したMCPサーバーとまったく同様に、facilitatorを通じて決済する。支払いを受け取ることと支払うことは、リクエストの反対側から見た同じプロトコルだ。

## 有料のMCPツールの構築を始める

[Alchemy CLI](/docs/alchemy-cli)を使ってエージェントにスコープの限定されたウォレットを与え、x402でツールをゲートし、[我々のTransfers API](/docs/data/transfers-api/transfers-endpoints/alchemy-get-asset-transfers)で決済を確認する。あるいは、facilitatorの配線を省略して、[AgentPay](/agentpay)を通じてエージェントの支払いを受け入れることもできる。より広範なスタック(カストディ、レール、ガス、データ)については、[エージェント型決済のための最適なインフラ](/overviews/best-infrastructure-for-agentic-payments)から始めてほしい。
