关于 agentic-payments
面向在 Stellar 上构建 Agent 支付流程的开发者,介绍 x402 与 MPP 两种协议的选择和实施路径。内容覆盖按请求支付、会话支付、API 发现及测试网准备。
主要功能
- 01比较 x402 与 MPP 模式
- 02配置按请求或会话支付
- 03发布付费 API 的发现文档
- 04准备测试网账户与 USDC
- 05区分 USDC 资产与 SAC 地址
适用场景
- 01为 Agent 接入付费 API
- 02以 x402 出售 API 并由客户端付款
- 03使用 MPP 为高频请求结算
- 04在测试网上搭建付款与收款账户
安装
复制下面的命令,在终端中运行。
npx skills add https:/ / github.com/ stellar/ stellar-dev-skill --skill agentic-payments安装后在 Claude Code 中输入/agentic-payments确认已加载。
附带文件mpp.mdx402.md
详细介绍
Agentic Payments:x402 + MPP
Stellar 上面向 AI Agent 和机器间支付的两种互补协议。根据双方的依赖关系以及 Agent 付款的频率进行选择。
快速决策
| x402 | MPP Charge | MPP Session | |
|---|---|---|---|
| 每次请求都进行链上交易? | 是(通过 facilitator) | 是(SAC) | 否(链下提交) |
| 需要 facilitator? | 是——托管的或自建的(选项) | 否 | 否 |
| 客户端需要 XLM? | 否(费用由他人赞助) | 可选(feePayer) | 是 |
| 设置复杂度 | 低 | 低 | 中(需先部署合约) |
| 最适合 | 最快上手、客户端免手续费 | 无第三方依赖 | 高频 Agent |
- 销售 API,希望客户端不需要 XLM → x402.md 中的 x402 卖方
- 通过 Agent 调用 x402 API → x402.md 中的 x402 买方
- 销售 API,不依赖 facilitator → mpp.md 中的 Charge 模式
- Agent 在每个会话中发出许多请求 → mpp.md 中的 Session 模式
- 已销售 API,现在希望 Agent 能找到它 → mpp.md 中的 发现
- 不确定 → x402(上手门槛最低)
默认情况下,所有协议都使用 USDC(SEP-41 SAC);CAIP-2 网络 ID 为 stellar:testnet / stellar:pubnet。
阅读与任务匹配的文件
本文包含决策表、共享的测试网账户设置,以及 USDC 地址参考。协议指南位于同目录下:
| 任务 | 文件 |
|---|---|
| 通过 facilitator 销售付费 API(客户端无需 XLM),构建 x402 买方 Agent | x402.md |
| 无 facilitator 的逐请求支付(Charge),或基于通道的会话(Session) | mpp.md |
| 发布 OpenAPI 发现文档,让 Agent 找到你的付费 API | 发现 |
| 创建/充值测试网账户、添加 USDC 信任线、获取测试网 USDC | 测试网设置(下文) |
| 不同位置应使用哪个 USDC 地址(经典发行方与 SAC) | 两个 USDC 地址(下文) |
相关技能
- 协议调用的 SAC →
../smart-contracts/SKILL.md - USDC 和其他经典资产 →
../assets/SKILL.md - 买方客户端中的钱包和签名 →
../dapp/SKILL.md - RPC 模拟 / 提交模式 →
../data/SKILL.md - SEP-41(代币接口)及相关标准 →
../standards/SKILL.md
测试网设置(共享)
两种协议都需要相同的基本设置:一个客户端/付款方账户(从 USDC 余额中签名并付款)和一个服务端/收款方账户。两者都需要 USDC 信任线。
这项共享设置中的一个步骤只能在网页上完成(需要验证码),无法通过脚本执行:Circle USDC 水龙头。其余步骤均可自动完成——x402.md 提供了一个 setup.js,可执行步骤 1–3 并写入初始 .env。(除这项设置外,x402.md 配置的 OZ Channels facilitator 还有自己的网页专用密钥生成器。每个 facilitator 都会设置自己的身份验证要求——x402.org 不需要身份验证——而 MPP 完全不需要第三方。)
-
生成两个密钥对
node -e "const { Keypair } = require('@stellar/stellar-sdk'); for (const n of ['RECIPIENT','PAYER']) { const k = Keypair.random(); console.log(n, k.publicKey(), k.secret()); }" -
使用测试网 XLM 为两个账户充值(friendbot)
curl "https://friendbot.stellar.org?addr=RECIPIENT_G..." curl "https://friendbot.stellar.org?addr=PAYER_G..." -
为两个账户都添加 USDC 信任线——打开 Stellar Lab,为每个
G...添加 USDC 信任线,或针对每个密钥对通过 SDK 执行:import * as StellarSdk from "@stellar/stellar-sdk"; const horizon = new StellarSdk.Horizon.Server("https://horizon-testnet.stellar.org"); // Circle's classic USDC issuer on Stellar testnet const USDC_ISSUER = "GBBD47IF6LWK7P7MDEVSCWR7DPUWV3NY3DTQEVFL4NAT4AQH3ZLLFLA5"; async function addTrustline(secret) { const kp = StellarSdk.Keypair.fromSecret(secret); const acc = await horizon.loadAccount(kp.publicKey()); const tx = new StellarSdk.TransactionBuilder(acc, { fee: StellarSdk.BASE_FEE, networkPassphrase: StellarSdk.Networks.TESTNET, }) .addOperation(StellarSdk.Operation.changeTrust({ asset: new StellarSdk.Asset("USDC", USDC_ISSUER), })) .setTimeout(60) .build(); tx.sign(kp); return horizon.submitTransaction(tx); } // Repeat for both the recipient secret and the payer secret. await addTrustline(process.env.RECIPIENT_SECRET); await addTrustline(process.env.PAYER_SECRET);如果收款方没有信任线,SAC
transfer将无法完成转账,请求会因op_no_trust而失败。 -
为付款方充值测试网 USDC——打开 Circle 测试网水龙头,选择 Stellar 测试网,粘贴付款方的
G...。需要网页验证码;没有 API。
两个 USDC 地址(不要混淆)
Stellar 上的 USDC 有两个地址,用于不同场景。把它们混淆是常见的问题。
| 地址 | 格式 | 用途 |
|---|---|---|
| 经典资产发行方 | G...(32 字节 ed25519 公钥) | 经典 USDC 资产的 issuer;添加信任线时使用(new Asset("USDC", G...)) |
| SAC(Stellar Asset Contract) | C...(32 字节合约地址) | 协议调用 transfer 的合约;用于付款要求 |
尽可能使用导出的常量,而不是硬编码:
import { USDC_TESTNET_ADDRESS, USDC_PUBNET_ADDRESS } from "@x402/stellar";
// USDC_TESTNET_ADDRESS = "CBIELTK6YBZJU5UP2WWQEUCYKLPU6AUNZ2BQ4WWFEIE3USCIHMXQDAMA"
// USDC_PUBNET_ADDRESS = "CCW67TSZV3SSS2HXMBQ5JFGCKJNXKZM7UQUWUZPUTHXSTZLEO7SJMI75"
x402 的 payTo 路由配置和 MPP 的 recipient 始终是经典账户(G...)。SAC 地址只会出现在配置指定结算资产的地方(x402 的自定义 asset 价格配置、MPP 的 currency)。