mcpField
P
Purser

Purser

本地服务
github.com金融数据23 天前更新

关于 Purser

Purser 是 ERC-4337 智能账户钱包,为每个 AI Agent 配置受策略限制的会话密钥。所有者可自动放行常规付款、审核超限请求,并在控制台监控或撤销访问权限。

主要功能

  1. 01带合约和函数允许列表的会话密钥
  2. 02单笔上限和滚动代币预算
  3. 03超限付款需所有者批准
  4. 04控制台查看支出、审批和撤销
  5. 05冻结账户或撤销 Agent 密钥

适用场景

  1. 01让 Agent 在预算内支付 API 额度费用
  2. 02对异常大额付款要求所有者批准
  3. 03将 Agent 限定在指定合约和函数范围内

MCP 相关

Purser 的 MCP 服务向 MCP 客户端提供钱包状态、ETH 和代币支付、合约调用及审批请求工具,并支持流式 HTTP 和 stdio。

配置

本地服务的配置在各客户端中通用,复制后粘贴到客户端的 MCP 配置文件即可。

mcp.json · 通用配置
{
"mcpServers": {
"ahmad-codex-purser": {
"command": "docker",
"args": [
"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.2"
],
"env": {
"PURSER_RPC_URL": "<PURSER_RPC_URL>",
"PURSER_ACCOUNT": "<PURSER_ACCOUNT>",
"PURSER_AGENT_PRIVATE_KEY": "<PURSER_AGENT_PRIVATE_KEY>",
"PURSER_BUNDLER_URL": "<PURSER_BUNDLER_URL>",
"PURSER_RELAYER_PRIVATE_KEY": "<PURSER_RELAYER_PRIVATE_KEY>",
"PURSER_API_TOKEN": "<PURSER_API_TOKEN>"
}
}
}
}
启动命令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.2
需要配置的环境变量
PURSER_RPC_URLJSON-RPC URL of the chain the account is on
PURSER_ACCOUNTAddress of the Purser smart account
PURSER_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+)。各客户端的配置文件位置不同,请参考客户端文档。

安装包
ocighcr.io/ahmad-codex/purser:0.1.2

工具

还没有获取到工具列表

本地服务需要在你的电脑上运行后才能读取工具,维护者暂未提供工具列表。

详细介绍

Purser

ci License: MIT Solidity 0.8.28 ERC-4337 v0.7 MCP

让 AI Agent 使用钱包,而无需交出密钥。

Purser 是一个 ERC-4337 智能账户,每个 Agent 都有自己的会话密钥和对应策略:它可以调用哪些合约和函数、每笔付款和每天最多可花多少,以及策略何时到期。符合策略的付款会自动执行。超过限额的付款则会等待你批准。MCP 服务让 Claude、Cursor 或任何 MCP 客户端都能使用该钱包,控制台则会实时显示预算、支出和待审批事项。

Agent 在预算内付款,超出限额后由所有者在控制台批准;未知收款人遭拒,紧急开关将账户冻结

为什么需要 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
  1. 所有者根据一项策略向 Agent 授予会话密钥:允许的 (contract, function) 对列表、每笔交易上限、每种代币(ETH 或 ERC-20)的每周期预算,以及有效期。
  2. Agent 调用 send_eth 或 call_contract 等 MCP 工具。服务端会根据策略模拟调用、使用会话密钥签署用户操作,并提交该操作。
  3. 账户会在验证期间检查签名、有效期、允许列表和每笔交易上限,因此不允许的操作会在产生任何费用前失败。预算需要区块时间,而 ERC-4337 禁止在验证期间使用区块时间,因此预算会在 executeUserOp 中强制执行。
  4. 超出限额?服务端会将其转为审批请求。所有者批准后,该操作会同时携带会话签名和所有者签名,并且不会占用 Agent 的预算。审批只会提高金额,不会扩大范围:仍须遵守允许列表。
  5. 所有者可随时撤销密钥或冻结整个账户。同一交易包中较早执行的撤销或冻结,仍会阻止之后执行的 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 和代币回调
PurserFactoryCREATE2 工厂,因此账户在部署前即可确定地址

基于 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。安全报告请通过 私密安全公告提交,不要通过问题报告提交。

许可证

MIT

评论

支持 Markdown

第一次接触 MCP?

从协议是什么,到在客户端里装上第一个服务,这几条回答覆盖了大多数入门问题。

一个开放协议,规定了 AI 应用如何以统一方式连接外部工具与数据源。客户端负责与模型对话,MCP 服务负责提供工具、资源和提示模板,两者通过标准消息通信,同一个服务可以被不同客户端复用。