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는 인터넷에 있는 서버에만 연결할 수 있어요. 다른 앱을 고르세요.
선택한 앱은 이 기기의 쿠키에만 저장돼요. 계정은 필요 없어요.
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일 전 레지스트리에 올라왔어요.
Claude Desktop, Claude Code, Cursor, VS Code처럼 MCP를 지원하는 앱에서 쓸 수 있어요. 내 컴퓨터에 Docker도 있어야 해요.
같은 카테고리에는: Spec Driven Development, Remote Desktop Commander, sync. labs
같은 카테고리에서 다른 제작자가 만든 서버예요. 스타 순으로 정렬했어요.
카드 보는 법:★ 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.
Lipsync videos, dub them into other languages, make talking videos and open sync. Studio.
제작자의 저장소에서 쓰인 그대로 가져왔어요. 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