AI代理支付工具

通过Model Context Protocol为AI代理提供支付服务的MCP服务器,支持多种支付工具和治理功能。

  • by RBKunnela
  • TypeScript
  • 本地部署
  • 更新于
在 GitHub 查看 RBKunnela/paybot-mcp

使用说明

支付机器人mcp

MCP服务器 PayBot --通过模型上下文协议为AI代理提供支付工具。

安装

npm install paybot-mcp paybot-sdk

获取API密钥

PAYBOT_API_KEY 如果没有它,每个工具调用都会以401失败。获得钥匙的最快方法是 PayBotClient.signup() 呼叫(来自 paybot-sdk)反对主持人 https://api.paybotcore.com:

node -e "import('paybot-sdk').then(async ({ PayBotClient }) => {
  const a = await PayBotClient.signup('you@example.com', 'a-strong-password', { botId: 'my-agent' });
  console.log(a.apiKey); // pb_live_... — printed ONLY once, save it now
})"

此单个调用注册您的操作员帐户,创建API密钥, 并注册bot (botId).将打印好的钥匙放入 PAYBOT_API_KEY 在下面的MCP配置中,并重用与相同的bot id PAYBOT_BOT_ID.

笔记:

  • 钥匙已打印 仅一次 --安全存放;以后无法检索。
  • 因为 signup() 已注册您的机器人,呼叫 paybot_register 具有相同bot id的工具返回 409 ALREADY_EXISTS.使用 paybot_register 仅供 额外的 机器人。
  • 完整的身份验证流(登录、额外的API密钥、自托管协助器):请参阅 paybot sdk自述→ 获取API密钥.

使用Claude Desktop

增添 claude_desktop_config.json:

{
  "mcpServers": {
    "paybot": {
      "command": "npx",
      "args": ["paybot-mcp"],
      "env": {
        "PAYBOT_API_KEY": "pb_...",
        "PAYBOT_FACILITATOR_URL": "https://api.paybotcore.com",
        "PAYBOT_BOT_ID": "my-agent"
      }
    }
  }
}

使用Claude代码

{
  "mcpServers": {
    "paybot": {
      "command": "npx",
      "args": ["paybot-mcp"],
      "env": {
        "PAYBOT_API_KEY": "pb_...",
        "PAYBOT_BOT_ID": "my-agent"
      }
    }
  }
}

环境变量

变量 描述 默认值
PAYBOT_API_KEY PayBot API密钥(请参阅 获取API密钥) (必填)
PAYBOT_FACILITATOR_URL 主持人服务器URL https://api.paybotcore.com
PAYBOT_BOT_ID 默认机器人标识符 mcp-agent
PAYBOT_WALLET_KEY 用于真实支付的钱包私钥 (可选)
PAYBOT_ENABLE_DEMO_TOOLS 注册受管理的模拟演示工具(delete_database, annotate_record).必须完全正确 true. false 关

如果 PAYBOT_API_KEY 如果未设置或为空,服务器仍会启动(因此MCP握手成功),但会在启动时向stderr打印警告,并且每次工具调用都会失败并出现身份验证错误,直到配置密钥为止。省略 PAYBOT_WALLET_KEY 将底层SDK保持在模拟模式(无链上结算)。

可用工具

工具 说明
paybot_pay 付款(默认为USDC;支持备用令牌+幂等性)
paybot_balance 检查信任级别、支出限制和剩余预算
paybot_history 查看最近的付款历史记录和审计事件
paybot_register 向主持人注册一个新的机器人程序(可选幂等性密钥)
paybot_list_networks_and_tokens 发现支持的网络和令牌(离线,无API密钥)
paybot_health_extended 延长主持人健康状况(状态/版本/正常运行时间+额外)
paybot_set_spending_limit 设置每笔交易/每日/每小时的限额和收件人分配列表
paybot_commission_inspect 检查佣金摘要和可过滤的分类账
paybot_pool_create 创建一个具有可选共享资金的进程内机器人池
paybot_pool_allocate 将机器人添加到池中,可以选择通过国库支付
paybot_pool_revoke 从池中删除机器人
paybot_pool_status 报告资金池和每个机器人的支出计数器

paybot_pay

参数 类型 注释
amount string 美元金额(例如。, "0.05")
recipient string 收件人钱包地址(0x...)
resource string 您所支付内容的URL或描述
botId? string 机器人标识符(默认为env)
network? string 网络CAIP-2 ID(默认值:Base Sepolia)
token? string 令牌自动收报机(默认值 USDC);例如。 USDC, EURC, DAI
idempotencyKey? string 使用相同键重复调用将返回缓存结果

薪酬平衡

参数 类型 注释
botId? string 机器人标识符(默认为env)

paybot_历史

参数 类型 注释
botId? string 机器人标识符(默认为env)
limit? number 要返回的最大事件数(默认值:10)

paybot_register

参数 类型 注释
botId string 唯一机器人标识符
trustLevel? number 初始信任级别0-5(默认值:1)
idempotencyKey? string 使用相同键重复注册返回缓存结果

paybot_list_networks_and_tokes

只读发现。不需要API密钥,并且不进行任何网络调用。表面 只有 公共 开放核心注册表——运营商专用主网地址为 从未显示(例如,EURC仅宣传其Base Sepolia测试网部署)。

没有参数。

paybot_健康_扩展

参数 类型 注释
botId? string 机器人标识符(默认为env)

退货 status, version, uptime, timestamp,加上任何额外的字段 主持人报告。

paybot_set_spending_limit

收紧代理人自身的限制。主持人强制执行操作员上限 并可能拒绝政策之外的放松尝试。

参数 类型 注释
botId? string 机器人标识符(默认为env)
maxTransactionUsd? number 每笔交易的最高美元
maxDailySpendUsd? number 每天最大美元支出
maxTransactionsPerHour? number 每小时最大交易量
allowedRecipients? string[] 收件人地址允许列表

paybot_任务_检查

参数 类型 注释
botId? string 机器人标识符(默认为env)
status? enum 按以下条件筛选分类账 pending
startDate? string 分类账开始日期(ISO 8601)
endDate? string 分类账结束日期(ISO 8601)
limit? number 最大分类账条目数(默认值:50)
offset? number 分类账分页偏移

paybot_pool_create

为此MCP会话创建进程内机器人池。财务会计是 记忆中;主持人仍然是权威的极限。

参数 类型 注释
poolId string 此池的标识符(用于分配/撤销/状态)
sharedDailyLimitUsd? number 所有机器人的可选共享每日支出上限

paybot_pool_allocate

参数 类型 注释
poolId string 池标识符
botId string 要添加到池中的机器人标识符
trustLevel? number 初始信任级别0-5
pay? object 可选 { amount, recipient, resource, network?, token? } 以机器人身份付款

paybot_pool_revoke

参数 类型 注释
poolId string 池标识符
botId string 要删除的机器人标识符

paybot_pool_status

参数 类型 注释
poolId string 池标识符

受控工具(之前决定/之后证明)

PayBot MCP可以包装 任何 工具——不仅仅是支付——所以这是一个危险的决定 在运行之前通过策略,一个不可逆的呼叫会暂停一个指定的人的呼叫 批准,每个结果都会在核心中留下明显的、可重放的痕迹 审计链。这是MCP工具调用的终止开关+黑匣子记录器。

运作原理

registerGovernedTool(server, def, client, opts) 是一个高级注册商。 每个包裹呼叫:

  1. 构建一个 行动意图 — verb =工具名称, target_ref 一 注册商在args上提供提取器(不透明、从不原始PII), params_hash =参数的规范(密钥排序)JSON的SHA-256, actor.subject_ref =配置的机器人id, channel: 'mcp';
  2. 调用核心 POST /actions/govern;
  3. 根据判决采取行动:
    • 允许 → 运行该工具,并附加 executed: params_hash=…, result_hash=… 到输出,以便跟踪绑定意图→ 执行;
    • 否认 → does 不 奔跑;返回闸门原因;
    • 待定 → (默认值 block 模式)民意调查 GET /approvals/:id 与后退 直至批准/拒绝/过期或 approvalTimeoutMs (默认120秒);上 批准它 重新验证 params_hash 与 需要获得批准 动作造型 在执行之前(TOCTU+交叉路线防御),然后运行 一次。 (return 模式交还 approval_id 相反。)

通过ACTION途径批准——强制执行,而不仅仅是建议。 暂停的动作 通过批准/拒绝 POST /actions/approvals/:id/approve (或 .../deny) — 不 付款 /approvals/:id/approve 路由,其授权路径尝试 和解。审批行是 共享A5a商店,所以支付路线 approve仍然将其翻转为 APPROVED因此,拦截器确实如此 不 信任一个赤裸裸的 decision === 'APPROVED'.付款审批流程始终运行 结算并撰写 state (SETTLE_FAILED / RESUME_CONTEXT_UNAVAILABLE 对于一个动作);行动路线永远不会确定,并写“否” stateThe 拦截器执行 仅 当已批准的行 无结算 state --礼物 state 被视为付款途径索赔和通话 失败关闭 WRONG_APPROVAL_ROUTE (处理程序从不运行)。这将关闭 交叉路线危险,即一个人批准他们认为是付款的东西会 否则,授权代理人采取不可逆转的行动。

成本和寿命

治理增加 每个受管呼叫一次网络往返 (/actions/govern). A. pending 行动中 block 模式仅在以下情况下保持打开状态 stdio会话 生命 --MCP stdio服务器是单会话,因此结束的会话会丢弃一个 阻塞等待。操作员从第二个终端(卷曲/仪表板)获得批准, 就像HITL支付演示一样。

安全属性

  • 失败关闭。 如果治理无法实现(网络错误、超时、5xx、, 畸形身体)不可逆或未知的动作 拒绝 (GOVERNANCE_UNREACHABLE)——一个遥不可及的州长从不默默地允许。 A. reversible 工具可设置 failOpen: true (仅演示方便;忽略 不可逆动词)。
  • 风险等级由注册商(操作员代码)设置,而不是由模型设置。 一 代理不能自行声明其破坏性工具“可逆”
  • 没有原始参数离开进程。 只有 params_hash 以及提取器 target_ref 被送到核心;原始参数(连接字符串、PII)保持不变 当地。
  • 没有旁路。 治理在注册时应用。注册的服务器 原始工具不受定义的约束——我们控制包装的东西,并制造 没有人声称拦截一切。

演示工具(默认关闭)

集 PAYBOT_ENABLE_DEMO_TOOLS=true 注册两个 嘲笑 受管工具:

工具 风险等级 效果
delete_database 不可逆 模拟 --什么也不碰;暂停等待人工批准,然后返回一个标记的模拟确认
annotate_record 可逆 模拟 --证明允许路径;直接流过

已发布的MCP服务器不得发布 delete_database 每个人的工具 代理,因此除非明确标记,否则这些将保持关闭状态 true.

看 docs/runbooks/governed-action-demo.md 对于精确录制的演示脚本(government→ 待定→ 批准→ 模拟执行→ 可重放的审计证明)。

程序化使用

import { createMcpServer } from 'paybot-mcp/server';
import { StdioServerTransport } from '@modelcontextprotocol/sdk/server/stdio.js';

const server = createMcpServer();
const transport = new StdioServerTransport();
await server.connect(transport);

许可证

Apache 2.0