03 · Agent 购买
怎么让 Agent 真的付钱给你
一次付费调用的完整链路,以及我们线上端点的真实返回值。
调用时序
1
Agent 调用工具 → 服务端返回 402 支付挑战
挑战里包含:scheme、network、资产合约、金额、收款地址、超时时间。
2
客户端用 EIP-3009 授权签名(transferWithAuthorization)
买家钱包只需要 USDC,gas 由 facilitator 代付。整个过程不需要 ETH。
3
带支付凭证重放请求 → 服务端 verify
facilitator 校验签名与金额;通过后才执行工具逻辑。
4
交付数据 → settle 上链
只有在数据成功返回后才结算。失败返回 isError 时不收费。
真实返回:我们对 gpu_price 发起未付款调用的响应
{"x402Version": 2,
"accepts": [{"scheme": "exact",
"network": "eip155:8453",
"asset": "0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913",
"amount": "50000",
"payTo": "0x230cd9cd33589bcf33cd32e5aa4f9e0c3994a63b",
"maxTimeoutSeconds": 300,
"extra": {"name": "USD Coin", "version": "2"}}],
"error": "Payment Required",
"resource": {"url": "mcp://tool/gpu_price", "description": "Tool: gpu_price"}}
怎么读这段:amount: 50000 是 USDC 的 6 位小数单位,即 0.05 USDC;
network: eip155:8453 是 Base 主网;asset 是 Circle 官方 USDC 合约。
不花一分钱,只要这四个字段全对,就说明链路配置正确。
客户端接入(Python)
pip install "mcp<2" "x402==2.25.0" web3
from mcp import ClientSession
from mcp.client.streamable_http import streamablehttp_client
from x402.mcp import create_payment_hook
from eth_account import Account
account = Account.from_key("你的私钥") # 只需有 Base 主网 USDC
MCP_URL = "https://rentgpu.link/mcp"
async with streamablehttp_client(MCP_URL) as (r, w, _):
async with ClientSession(r, w, hooks=[create_payment_hook(account)]) as s:
await s.initialize()
# 免费:先看有哪些卡型
print(await s.call_tool("list_gpu_models", {}))
# 付费 $0.05:查 H100 当前行情
print(await s.call_tool("gpu_price", {"gpu": "H100"}))
两个必须注意的点:① 自写客户端时要把
params["_meta"] 原样透传给服务端,否则支付中间件拿不到上下文;
② 本地有代理时,客户端要设 NO_PROXY=127.0.0.1,localhost,否则请求会被代理拦截。
结算与收款
真实验证案例(可在 basescan.org 核对):2026-10-26 完成两笔主网付费,各 0.01 USDC ——
0x67a0d45f7183032600feb4fa7c53c5348eb84b05fa586927bf3d7d6718faed12、
0x5e492eee6572e42d934f7b4082b525036346c5a2761ff534ce16a8bd9c781bc9;
收款地址 0x230cd9cd33589bcf33cd32e5aa4f9e0c3994a63b。
这两个地址是本站公开案例,你自己部署时必须换成你自己的收款地址。