关于 Purser
Purser 是 ERC-4337 智能账户钱包,为每个 AI Agent 配置受策略限制的会话密钥。所有者可自动放行常规付款、审核超限请求,并在控制台监控或撤销访问权限。
主要功能
- 01带合约和函数允许列表的会话密钥
- 02单笔上限和滚动代币预算
- 03超限付款需所有者批准
- 04控制台查看支出、审批和撤销
- 05冻结账户或撤销 Agent 密钥
适用场景
- 01让 Agent 在预算内支付 API 额度费用
- 02对异常大额付款要求所有者批准
- 03将 Agent 限定在指定合约和函数范围内
MCP 相关
Purser 的 MCP 服务向 MCP 客户端提供钱包状态、ETH 和代币支付、合约调用及审批请求工具,并支持流式 HTTP 和 stdio。
配置
本地服务的配置在各客户端中通用,复制后粘贴到客户端的 MCP 配置文件即可。
docker run -i --rm -e PURSER_RPC_URL -e PURSER_ACCOUNT -e PURSER_AGENT_PRIVATE_KEY -e PURSER_BUNDLER_URL -e PURSER_RELAYER_PRIVATE_KEY -e PURSER_API_TOKEN ghcr.io/ahmad-codex/purser:0.1.2PURSER_RPC_URLJSON-RPC URL of the chain the account is onPURSER_ACCOUNTAddress of the Purser smart accountPURSER_AGENT_PRIVATE_KEY密钥The agent's session key. The server never needs the owner key.PURSER_BUNDLER_URLERC-4337 bundler URL. Without one, the relayer key submits handleOps itself.PURSER_RELAYER_PRIVATE_KEY密钥Pays for handleOps when there is no bundler. Defaults to the agent key.PURSER_API_TOKEN密钥Bearer token for the approvals API and console本地服务需要在你的电脑上安装运行环境(如 Node.js 18+)。各客户端的配置文件位置不同,请参考客户端文档。
ghcr.io/ahmad-codex/purser:0.1.2Streamable HTTP工具
本地服务需要在你的电脑上运行后才能读取工具,维护者暂未提供工具列表。
详细介绍
Purser
让 AI Agent 使用钱包,而无需交出密钥。
Purser 是一个 ERC-4337 智能账户,每个 Agent 都有自己的会话密钥和对应策略:它可以调用哪些合约和函数、每笔付款和每天最多可花多少,以及策略何时到期。符合策略的付款会自动执行。超过限额的付款则会等待你批准。MCP 服务让 Claude、Cursor 或任何 MCP 客户端都能使用该钱包,控制台则会实时显示预算、支出和待审批事项。

为什么需要 Purser
Agent 已开始为各种服务付费:API 额度、算力、数据和订阅。目前通常只有两种糟糕的选择:
- 把私钥交给 Agent。 一个提示词注入或程序错误就可能让钱包被掏空。
- 手动批准每笔付款。 这样虽然安全,却失去了使用 Agent 的意义。
Purser 介于两者之间。限额写在合约中,因此即使 Agent、运行它的服务或其密钥遭到入侵,限额依然有效。泄露的 Agent 密钥最多只能在允许的地点花掉当前剩余预算,并消耗一些 ETH 支付 Gas;直到你撤销密钥或冻结账户为止,而这只需一笔交易。(每个密钥的 Gas 预算已列入路线图。)
包含内容
| 层级 | 内容 |
|---|---|
| 智能合约 | ERC-4337 v0.7 账户,支持会话密钥、允许列表、单笔交易上限和滚动预算;超限操作需所有者共同签名;支持 UUPS 升级、ERC-1271,以及可在所有链上生成相同地址的 CREATE2 工厂 |
| 协议规则 | 验证逻辑遵循 ERC-7562(不读取时钟),因此公共 Bundler 会接受;基于时间的预算通过 executeUserOp 移至执行阶段 |
| 测试 | 通过真实 EntryPoint 执行的 41 项单元测试;针对预算模型的模糊测试;使用有状态处理程序的状态不变量测试;Gas 快照;在 CI 中运行 Slither |
| TypeScript SDK | 基于 viem 的客户端,可通过 Bundler 或 handleOps 构建、签名并提交用户操作,解码策略错误,并在公共 RPC 日志限制内索引事件 |
| AI 集成 | MCP 服务(流式 HTTP 和 stdio),包含六种工具、模型可读的拒绝原因,以及人工审批流程 |
| 产品 | React 控制台,提供预算仪表盘、实时动态、审批、撤销和紧急开关 |
| 交付 | 一键式演示镜像、Docker Compose、端到端演示完整流程的 CI、测试网部署脚本 |
工作原理
flowchart LR
Agent["AI agent<br/>(Claude, Cursor, ...)"] -- MCP tools --> Server["Purser server<br/>holds the session key only"]
Server -- "user operation<br/>signed by the session key" --> EP["EntryPoint v0.7"]
EP --> Wallet["PurserAccount<br/>policy checks"]
Wallet --> Targets["Allowed contracts<br/>and recipients"]
Owner["Owner"] -- "approve, reject, revoke, freeze" --> Console["Console"]
Console --> Server
- 所有者根据一项策略向 Agent 授予会话密钥:允许的
(contract, function)对列表、每笔交易上限、每种代币(ETH 或 ERC-20)的每周期预算,以及有效期。 - Agent 调用
send_eth或call_contract等 MCP 工具。服务端会根据策略模拟调用、使用会话密钥签署用户操作,并提交该操作。 - 账户会在验证期间检查签名、有效期、允许列表和每笔交易上限,因此不允许的操作会在产生任何费用前失败。预算需要区块时间,而 ERC-4337 禁止在验证期间使用区块时间,因此预算会在
executeUserOp中强制执行。 - 超出限额?服务端会将其转为审批请求。所有者批准后,该操作会同时携带会话签名和所有者签名,并且不会占用 Agent 的预算。审批只会提高金额,不会扩大范围:仍须遵守允许列表。
- 所有者可随时撤销密钥或冻结整个账户。同一交易包中较早执行的撤销或冻结,仍会阻止之后执行的 Agent 操作。
一条命令即可试用
你需要 Docker。无需克隆,也无需安装:
docker run --rm -it -p 127.0.0.1:8787:8787 ghcr.io/ahmad-codex/purser:demo
容器会启动本地区块链,部署 EntryPoint、工厂合约和一个已为 Agent 注入初始配置的新账户,并启动 MCP 服务和控制台。打开 http://localhost:8787 并观看:十秒后,Agent 的演示会在终端中播放,控制台也会实时更新。
Agent 会向商家付款、使用代币付款、从商店合约购买商品、尝试超限付款(审批请求会显示在控制台中)、获得批准、因收款方不在允许列表中而遭拒,并最终被紧急开关停止。随后,钱包会继续运行,供你自己的 Agent 使用。所有操作均使用 Anvil 的公开开发密钥,按下 Ctrl+C 后所有内容都会清除。
克隆项目后,运行 docker compose up 可通过独立服务启动相同的服务栈;运行
docker compose run --rm demo 可在该服务栈上播放演示。
连接你自己的 Agent
演示运行时,将任意 MCP 客户端指向 http://localhost:8787/mcp:
claude mcp add --transport http purser http://localhost:8787/mcp
然后向 Claude 提问:"Check the wallet status, then pay the merchant 0.01 ETH for API credits." 试试 "pay the merchant 0.3 ETH",即可看到控制台中出现审批请求。 docs/mcp-clients.md 介绍了 Claude Desktop、Cursor 和 stdio。
MCP 工具
| 工具 | 功能 |
|---|---|
wallet_status | 余额、Agent 每种代币的剩余预算、上限、重置时间、到期时间、冻结状态、待处理审批 |
send_eth | 向某个地址或已知名称支付 ETH |
send_token | 按符号或地址支付 ERC-20 代币 |
call_contract | 调用允许的合约函数,可选择附带 ETH,例如 buy(uint256) |
get_request | 查看审批请求状态 |
list_requests | 查看近期审批请求 |
每种付款工具都会返回以下结果之一:已完成(包含交易哈希和剩余预算)、等待所有者处理(包含请求 ID),或已拒绝(附带模型可据此采取行动的原因)。
策略
| 字段 | 含义 |
|---|---|
permissions | (target, selector) 对。0xffffffff 允许调用目标上的任意函数;0x00000000 允许普通 ETH 转账。账户本身不能作为目标。 |
limits | 每种代币(address(0) 表示 ETH)的 perTx 上限和 perPeriod 预算。账户发起的 ERC-20 transfer、approve 和 transferFrom 都计为支出。 |
period | 预算周期,单位为秒,例如 86400 表示每日预算。 |
validAfter、validUntil | 密钥的生效时间和失效时间。EntryPoint 会通过验证数据强制执行。 |
再次授予密钥会替换其整套策略;旧权限不会延续到新策略中。
合约
| 合约 | 用途 |
|---|---|
PurserAccount | 账户:ERC-4337 v0.7,由其所有者通过 UUPS 升级,支持 ERC-1271 和代币回调 |
PurserFactory | CREATE2 工厂,因此账户在部署前即可确定地址 |
基于 eth-infinitism 参考 EntryPoint v0.7 和 OpenZeppelin 5 构建。工厂通过确定性 CREATE2 代理部署,因此在使用规范 EntryPoint 的每条链上,账户地址都相同。
测试。 通过真实 EntryPoint 运行了 41 项单元测试;模糊测试会将随机付款和时间序列与预算模型进行比对;不变量测试(每次运行约 16,000 次随机调用)验证以下三项属性:未经批准,Agent 在每个周期内的支出不会超过其预算;密钥撤销后不会再转移资金;策略不会在所有者不知情的情况下发生变化。CI 中会运行 Slither。威胁模型请参阅 docs/security.md。
部署。 请参阅 docs/deployments.md。
仓库布局
contracts/ Foundry project: PurserAccount, factory, tests, deploy and demo scripts
packages/sdk/ TypeScript client on viem: build, sign and send user operations, read state
packages/server/ MCP server (HTTP and stdio), approvals API, serves the console
apps/console/ React console for the owner
scripts/ local-up.sh, deploy-testnet.sh, demo.ts, demo-entrypoint.sh
Dockerfile.demo all-in-one demo image (chain, contracts, server, console)
docs/ architecture, security, MCP clients, deployments
开发
npm install
cd contracts && forge test # unit, fuzz and invariant tests
cd .. && npm test # TypeScript unit tests
./scripts/local-up.sh # Anvil + deploy + demo account, writes .env.local
npm run build -w @purser/console
npm run server # console and MCP on http://localhost:8787
npm run demo # the end-to-end story; CI runs it too
尚未安装 Foundry?contracts/forge.sh forge test 会通过官方 Docker 镜像运行测试,而 scripts/local-up.sh 会自动回退到 Docker。
要部署到 Base Sepolia 或 Sepolia,请参阅 docs/deployments.md:只需运行一个脚本,水龙头提供的不到 0.01 ETH 就足以完成所有操作。
状态
早期版本,版本号为 0.1.2。尚未经过审计。请使用测试网,不要将真实资金存入未经自己审查的账户。后续计划请参阅 ROADMAP.md,标记为 good first issue 的问题是参与贡献的不错起点。
贡献
请参阅 CONTRIBUTING.md。安全报告请通过 私密安全公告提交,不要通过问题报告提交。
许可证
评论
一个开放协议,规定了 AI 应用如何以统一方式连接外部工具与数据源。客户端负责与模型对话,MCP 服务负责提供工具、资源和提示模板,两者通过标准消息通信,同一个服务可以被不同客户端复用。