两层协议,缺一不可:MCP 让 AI Agent 能发现并按接口调用你的工具(发现层);x402 让 Agent 在拿到数据前先付钱(结算层,Base 主网 USDC)。买家钱包里只需有 USDC,不需要 ETH——gas 由 facilitator 代付(EIP-3009 免 gas 授权)。你不需要注册账号、不需要 API Key、不需要 Coinbase 账户就能收。
python3 -m venv venv && source venv/bin/activate pip install "mcp<2" "x402==2.25.0" web3 httpx
mcp 必须锁 <2:2.x 把 FastMCP 改名 MCPServer,x402 2.25 仍按 1.x 写法,装 2.x 会直接 import 失败。import os
from mcp.server.fastmcp import FastMCP
from x402 import x402ResourceServer
from x402.http import FacilitatorConfig, HTTPFacilitatorClient
from x402.mechanisms.evm.exact import ExactEvmServerScheme
from x402.mcp import create_payment_wrapper
from x402.schemas.config import ResourceConfig
# 1. 链与 facilitator:Base 主网 + PayAI(免注册,支持 x402 v2 主网)
NETWORK = os.environ.get("X402_NETWORK", "eip155:8453")
FACILITATOR_URL = os.environ.get("X402_FACILITATOR",
"https://facilitator.payai.network")
# 2. 收款地址:换成你自己的 Base 主网地址!别抄示例。
PAY_TO = os.environ.get("PAY_TO") or "0x你的收款地址"
# 3. 定价(按次,USD)
PRICE = {"my_data_tool": "$0.05"}
facilitator = HTTPFacilitatorClient(FacilitatorConfig(url=FACILITATOR_URL))
resource_server = x402ResourceServer(facilitator)
resource_server.register(NETWORK, ExactEvmServerScheme())
resource_server.initialize()
mcp = FastMCP("my-data-service")
def paid(tool_name: str):
return create_payment_wrapper(
resource_server,
accepts=resource_server.build_payment_requirements(
ResourceConfig(scheme="exact", pay_to=PAY_TO,
price=PRICE[tool_name], network=NETWORK)),
resource=None,
)
@mcp.tool(name="list_items") # 免费工具:让 Agent 先看见你有货
def list_items() -> str:
return '[{"name": "item-a"}]'
@mcp.tool(name="my_data_tool") # 付费工具
@paid("my_data_tool")
def my_data_tool(item: str) -> str:
return '{"item": "%s", "price": 1.24}' % item
if __name__ == "__main__":
mcp.run(transport="streamable-http", host="127.0.0.1", port=8797)# /etc/systemd/system/x402.service [Unit] Description=My x402 paid MCP server After=network.target [Service] Type=simple WorkingDirectory=/opt/my-x402 Environment=X402_NETWORK=eip155:8453 Environment=X402_FACILITATOR=https://facilitator.payai.network Environment=PORT=8797 ExecStart=/opt/my-x402/venv/bin/python server.py Restart=always RestartSec=5 [Install] WantedBy=multi-user.target # systemctl daemon-reload && systemctl enable --now x402
location ^~ /mcp {
proxy_pass http://127.0.0.1:8797;
proxy_http_version 1.1;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
proxy_buffering off; # streamable-http 走 SSE,必须关缓冲
proxy_cache off;
proxy_read_timeout 300s;
}proxy_buffering off 不能省:streamable-http 是 SSE 流式,开着缓冲会卡住。# 零成本验证(不花真钱):不付款直接调付费工具,应返回 402 支付挑战
curl -s https://你的域名/mcp \
-H "Content-Type: application/json" \
-H "Accept: application/json, text/event-stream" \
-d '{"jsonrpc":"2.0","id":1,"method":"initialize","params":{"protocolVersion":"2025-06-18","capabilities":{},"clientInfo":{"name":"probe","version":"1"}}}'
# 然后在带 session id 的情况下调 tools/call(不带 X-PAYMENT),
# 响应的 accepts 里应看到:network=eip155:8453、asset=0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913、
# payTo=你的地址、amount=50000(=$0.05)# 真钱验证:给测试买家钱包充 USDC,跑客户端,然后查链上 USDC Transfer 事件
# (不要看余额差值,RPC 同步延迟会读出假差额;只信 Transfer 事件)
from web3 import Web3
w3 = Web3(Web3.HTTPProvider("https://base-rpc.publicnode.com")) # mainnet.base.org 会 429
USDC = "0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913"
topic = w3.keccak(text="Transfer(address,address,uint256)").hex()
logs = w3.eth.get_logs({
"fromBlock": w3.eth.block_number - 3000,
"toBlock": "latest",
"address": USDC,
"topics": [topic,
"0x" + "0"*24 + buyer[2:].lower(),
"0x" + "0"*24 + seller[2:].lower()],
})
for lg in logs:
print(int(lg["data"].hex(), 16) / 1e6, "USDC 已到账")| 坑 | 现象 | 解法 |
|---|---|---|
| x402.org facilitator 只支持测试网 | 切主网后付款永远失败 | 换 PayAI / openx402 / CDP |
| Mogami 只有 x402 v1 | 与 x402 2.25 SDK 不兼容 | 换支持 v2 + eip155:8453 的 facilitator |
| mcp 装成 2.x | import 直接失败 | 锁 mcp<2 |
| 链上核验用了测试网 USDC 合约 | 一条 Transfer 都查不到,误判成没付款 | 主网合约 0x833589fC…2913 |
| mainnet.base.org 公共 RPC 限流 | eth_getLogs 返回 429 | 换 base-rpc.publicnode.com |
| 用余额差值验证 | RPC 同步延迟读出假差额 | 只信链上 Transfer 事件 |
| shell 里写含 $ 的价格 | $0 被展开成 bash,JSON 被污染 | 用单引号 heredoc,改完 grep 校验 |
0x230cd9cd33589bcf33cd32e5aa4f9e0c3994a63b0x6274A5e39E84168c5DE57110A6e0ab1FBBE0a89E0x67a0d45f7183032600feb4fa7c53c5348eb84b05fa586927bf3d7d6718faed12(0.01 USDC)、tx 0x5e492eee6572e42d934f7b4082b525036346c5a2761ff534ce16a8bd9c781bc9(0.01 USDC)link.rentgpu/gpu-market必须填你自己的 Base 主网收款地址(PAY_TO)。本页出现的地址是本站的案例地址,仅供核对链上记录参考;照抄会导致别人付的钱进本站钱包。本页不含任何私钥。
收款不需要——PayAI、openx402 等 facilitator 免注册。只有将来把收到的 USDC 换成人民币提现时,才需要走交易所的实名流程。
不需要。x402 使用 EIP-3009 免 gas 授权(transferWithAuthorization),买家钱包里只要有 Base 主网 USDC 即可,gas 由 facilitator 代付。
不付款直接调用付费工具,应返回 402 支付挑战。检查挑战里的 network=eip155:8453、asset=Circle 官方 USDC 合约、payTo=你的地址、amount 正确即可。真钱验证再单独做。
都不能直接用于本教程的主网场景:x402.org 官方仅支持测试网,Mogami 只支持 x402 v1。主网请用 PayAI、openx402(免注册)或 Coinbase CDP(需 API Key)。
x402 全流程部署教程|数据来源:GPU 算力雷达 rentgpu.link(2026-10-27 更新,每小时自动抓取各平台公开定价)|https://rentgpu.link/x402|CC BY 4.0