Spec Driven Development
MCP Server that facilitates spec-driven development workflows, not just Vibe Coding.
作者提供的说明(英文原文)
Wallet for AI agents with on-chain spending limits and owner approval over the limit
这三项永远不会合并成一个分数:意见、测量和人气是不同的东西。
我们还没有为它写通俗的介绍。下面是我们从注册中心读取到的事实。
选择你使用的 AI 应用,然后复制设置。
PURSER_RPC_URL, PURSER_ACCOUNT, PURSER_AGENT_PRIVATE_KEY, PURSER_BUNDLER_URL, PURSER_RELAYER_PRIVATE_KEY, PURSER_API_TOKEN标为机密的值是你账户的钥匙。千万不要分享给别人,也不要粘贴到聊天里。
你需要
你用的是哪个应用?
在上方选择你的应用。我们会记住它,下次按钮会显示“安装到 …”。
打开 Claude Desktop → Settings → Developer → Edit Config,把下面的内容粘贴到 claude_desktop_config.json
{
"mcpServers": {
"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": "your-value",
"PURSER_ACCOUNT": "your-value",
"PURSER_AGENT_PRIVATE_KEY": "your-value",
"PURSER_BUNDLER_URL": "your-value",
"PURSER_RELAYER_PRIVATE_KEY": "your-value",
"PURSER_API_TOKEN": "your-value"
}
}
}
}在终端中运行这条命令
claude mcp add purser --env PURSER_RPC_URL=your-value --env PURSER_ACCOUNT=your-value --env PURSER_AGENT_PRIVATE_KEY=your-value --env PURSER_BUNDLER_URL=your-value --env PURSER_RELAYER_PRIVATE_KEY=your-value --env PURSER_API_TOKEN=your-value -- 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运行前请先填写空着的值。
粘贴到项目中的 .cursor/mcp.json,或 ~/.cursor/mcp.json
{
"mcpServers": {
"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": "your-value",
"PURSER_ACCOUNT": "your-value",
"PURSER_AGENT_PRIVATE_KEY": "your-value",
"PURSER_BUNDLER_URL": "your-value",
"PURSER_RELAYER_PRIVATE_KEY": "your-value",
"PURSER_API_TOKEN": "your-value"
}
}
}
}浏览器会先询问是否打开应用,然后应用会显示设置并请你确认。密钥的值会留空,由你自己填写。
粘贴到项目中的 .vscode/mcp.json
{
"servers": {
"purser": {
"type": "stdio",
"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": "your-value",
"PURSER_ACCOUNT": "your-value",
"PURSER_AGENT_PRIVATE_KEY": "your-value",
"PURSER_BUNDLER_URL": "your-value",
"PURSER_RELAYER_PRIVATE_KEY": "your-value",
"PURSER_API_TOKEN": "your-value"
}
}
}
}浏览器会先询问是否打开应用,然后应用会显示设置并请你确认。密钥的值会留空,由你自己填写。
这个服务器在你的电脑上运行,而 ChatGPT 只能连接互联网上的服务器。请选择其他应用。
你的选择通过 Cookie 保存在这台设备上,无需账户。
PURSER_BUNDLER_URL env这些设置是根据作者在注册中心的条目生成的。如果 README 的写法不同,请以 README 为准。
它在你的电脑上运行;安装后,工具列表会显示在你的 AI 应用中。
我们检查的是任何人都能看到的信息;我们没有阅读代码。不适用的检查项不计入总数。 · 检查于 2026年11月7日
注册名称已通过 GitHub 账户 ahmad-codex 验证,该账户拥有此仓库
我们还没有从 GitHub 读取这个仓库
我们还没有从 GitHub 读取这个仓库
它在你的电脑上运行,没有互联网端点
在你的电脑上运行,改用本地设置
它在你的电脑上运行;我们只能读取互联网端点的工具列表
与注册中心里这个分类中所有活跃的服务器比较。只有当发布者拥有该仓库时,星标数才计入。
它在 1 项适用的基础检查中通过了 1 项。我们没有阅读代码。在添加密钥或令牌之前,请先看看这个服务器要求哪些权限,并使用只具备所需权限的密钥。
你需要填写:PURSER_RPC_URL, PURSER_ACCOUNT, PURSER_AGENT_PRIVATE_KEY, PURSER_RELAYER_PRIVATE_KEY, PURSER_API_TOKEN
它在你的电脑上运行。你的 AI 应用会在需要时启动它,数据不会经过作者的服务器(除非它自己调用在线服务)。
GitHub 仓库最后更新于–,最新版本(0.1.2)于5天前进入注册中心。
支持 MCP 的应用,例如 Claude Desktop、Claude Code、Cursor 和 VS Code。你的电脑上还需要有 Docker。
同一分类中有:Spec Driven Development, Remote Desktop Commander, Detailing Manager
同一分类中其他作者的服务器,按星标数排序。
如何看卡片:★ GitHub 星标i三大支柱:评价 · 检查 · 使用情况i更新 = 最新版本发布到注册中心的时间i
MCP Server that facilitates spec-driven development workflows, not just Vibe Coding.
Remote Desktop Commander: use files, terminal and processes on your own computers from any AI app.
Connect your auto detailing studio's tasks, cars, clients and revenue to Claude or ChatGPT.
按原文从作者的仓库复制。PopNx MCP 没有审查或背书其内容。HTML、图片和脚本已被移除。链接会离开本站。
Give an AI agent a wallet without giving it your keys.
Purser is an ERC-4337 smart account where each agent gets its own session key with a policy: which contracts and functions it may call, how much it may spend per payment and per day, and until when. Payments inside the policy go through on their own. Anything over the limits waits for you to approve. An MCP server lets Claude, Cursor or any MCP client use the wallet, and a console shows budgets, spending and pending approvals as they happen.
Agents are starting to pay for things: API credits, compute, data, subscriptions. Today that usually means one of two bad options:
Purser sits in between. The limits live in the contract, so they hold even if the agent, the server it runs on, or its key is compromised. The worst a leaked agent key can do is spend the rest of the current budget at allowed places, and burn some ETH on gas, until you revoke it or freeze the account, which takes one transaction. (A gas budget per key is on the roadmap.)
| Layer | What it shows |
|---|---|
| Smart contracts | ERC-4337 v0.7 account with session keys, allow-lists, per-transaction caps and rolling budgets; owner co-signature for over-limit operations; UUPS upgrades, ERC-1271, CREATE2 factory with the same address on every chain |
| Protocol rules | Validation that follows ERC-7562 (no clock reads), so public bundlers accept it; time-based budgets moved to the execution phase through executeUserOp |
| Testing | 41 unit tests through a real EntryPoint, fuzz tests against a budget model, invariant tests with a stateful handler, gas snapshot, Slither in CI |
| TypeScript SDK | viem client that builds, signs and submits user operations through a bundler or handleOps, decodes policy errors, and indexes events within public RPC log limits |
| AI integration | MCP server (streamable HTTP and stdio) with six tools, model-readable refusals, and a human-in-the-loop approval flow |
| Product | React console with budget meters, live activity, approvals, revoke and a kill switch |
| Delivery | One-command demo image, Docker Compose, CI that plays the full story end to end, testnet deploy script |
flowchart LR
Agent["AI agent (Claude, Cursor, ...)"] -- MCP tools --> Server["Purser server holds the session key only"] Server -- "user operation signed by the session key" --> EP["EntryPoint v0.7"] EP --> Wallet["PurserAccount policy checks"] Wallet --> Targets["Allowed contracts and recipients"] Owner["Owner"] -- "approve, reject, revoke, freeze" --> Console["Console"] Console --> Server
(contract, function) pairs, a per-transaction cap and a per-period budget for each token (ETH or ERC-20), and a validity window.send_eth or call_contract. The server dry-runs the call against the policy, signs a user operation with the session key and submits it.executeUserOp.You need Docker. Nothing to clone, nothing to install:
docker run --rm -it -p 127.0.0.1:8787:8787 ghcr.io/ahmad-codex/purser:demo
The container starts a local chain, deploys the EntryPoint, the factory and a fresh account with a seeded agent, and starts the MCP server and the console. Open http://localhost:8787 and watch: ten seconds later the agent story plays in the terminal while the console updates live.
The agent pays a merchant, pays in a token, buys from a shop contract, tries a payment over the limit (the approval request appears in the console), gets approved, is refused for a recipient that is not on its allow-list, and is stopped by the kill switch. Then the wallet stays up for your own agent. Everything uses Anvil's public development keys and is gone when you press Ctrl+C.
From a clone, docker compose up runs the same stack as separate services, and docker compose run --rm demo plays the story against it.
With the demo running, point any MCP client at http://localhost:8787/mcp:
claude mcp add --transport http purser http://localhost:8787/mcp
Then ask Claude: *"Check the wallet status, then pay the merchant 0.01 ETH for API credits."* Try *"pay the merchant 0.3 ETH"* to see an approval request show up in the console. docs/mcp-clients.md covers Claude Desktop, Cursor and stdio.
| Tool | What it does |
|---|---|
wallet_status | Balances, the agent's remaining budget per token, caps, reset times, expiry, freeze state, pending approvals |
send_eth | Pay ETH to an address or a known name |
send_token | Pay ERC-20 tokens by symbol or address |
call_contract | Call an allowed contract function, optionally with ETH, e.g. buy(uint256) |
get_request | Status of an approval request |
list_requests | Recent approval requests |
Each payment tool returns one of: done (with the transaction hash and the budget left), waiting for the owner (with the request id), or refused (with a reason the model can act on).
| Field | Meaning |
|---|---|
permissions | (target, selector) pairs. 0xffffffff allows any function on a target; 0x00000000 allows plain ETH transfers. The account itself can never be a target. |
limits | Per token (address(0) is ETH): perTx cap and perPeriod budget. ERC-20 transfer, approve and transferFrom from the account count as spending. |
period | Budget window in seconds, for example 86400 for a daily budget. |
validAfter, validUntil | When the key works. Enforced by the EntryPoint through the validation data. |
Granting a key again replaces its whole policy; old permissions do not leak into the new one.
| Contract | Purpose |
|---|---|
PurserAccount | The account: ERC-4337 v0.7, UUPS upgradeable by its owner, ERC-1271, token callbacks |
PurserFactory | CREATE2 factory, so an account's address is known before it is deployed |
Built on the eth-infinitism reference EntryPoint v0.7 and OpenZeppelin 5. The factory deploys through the deterministic CREATE2 proxy, so it has the same address on every chain with the canonical EntryPoint.
Tests. 41 unit tests through a real EntryPoint, fuzz tests that check random payment and time sequences against a model of the budget, and invariant tests (about 16,000 random calls per run) for three properties: an agent never spends more than its budget per period without approval, a revoked key never moves funds again, and the policy never changes behind the owner's back. Slither runs in CI. See docs/security.md for the threat model.
Deployments. See 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
No Foundry installed? contracts/forge.sh forge test runs it from the official Docker image, and scripts/local-up.sh falls back to Docker on its own.
To deploy to Base Sepolia or Sepolia, see docs/deployments.md: one script, and a faucet drip of under 0.01 ETH covers everything.
Early, version 0.1.2. Not audited. Use testnets, and do not put real funds in an account you have not reviewed yourself. What is planned next is in ROADMAP.md, and issues labelled good first issue are a good place to start contributing.
See CONTRIBUTING.md. Security reports go through private advisories, not issues.
MIT