Purser について
PurserはERC-4337スマートアカウントのウォレットで、AIエージェントごとにポリシーで制限されたセッションキーを発行します。通常の支払いは自動実行し、上限超過の申請は所有者が確認できます。コンソールで利用状況の監視やアクセス取り消しも行えます。
主な機能
- 01コントラクトと関数の許可リスト付きセッションキー
- 02支払いごとの上限と期間予算
- 03上限超過時の所有者承認
- 04支出、承認、取り消しを管理するコンソール
- 05アカウントの凍結とエージェントキーの取り消し
活用シーン
- 01予算内でAPIクレジットをエージェントに支払わせる
- 02高額な支払いに所有者の承認を求める
- 03エージェントの操作を指定コントラクトと関数に限定
MCP 対応
PurserのMCPサーバーは、ウォレット状況、ETH・トークンの支払い、コントラクト呼び出し、承認申請のツールをMCPクライアントに提供します。ストリーミング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 エージェントにウォレットを使わせます。
Purser は ERC-4337 スマートアカウントで、各エージェントにポリシー付きの専用セッションキーを割り当てます。ポリシーでは、呼び出し可能なコントラクトと関数、支払いごとおよび1日あたりの支出上限、有効期限を指定します。ポリシーの範囲内の支払いは自動的に実行されます。上限を超える支払いは、あなたの承認を待ちます。MCP サーバーを使えば、Claude、Cursor、または任意の MCP クライアントからウォレットを利用でき、コンソールでは予算、支出、保留中の承認をリアルタイムで確認できます。

その理由
エージェントが API クレジット、コンピューティング、データ、サブスクリプションなどの支払いを始めています。現状では、通常、次のいずれかのよくない選択肢になります。
- エージェントに秘密鍵を渡す。 プロンプトインジェクションやバグが一度でもあれば、ウォレットの中身が空になる可能性があります。
- 支払いをすべて手動で承認する。 安全ですが、それではエージェントを使う意味がありません。
Purser はその中間に位置します。上限はコントラクト内にあるため、エージェントや実行サーバー、あるいはそのキーが侵害されても有効です。漏えいしたエージェントキーでできる最悪のことは、許可された宛先で現在の予算の残額を使い切り、ガス代として ETH を消費することです。キーを失効させるか、1回のトランザクションでアカウントを凍結するまで、それ以上のことはできません。(キーごとのガス予算はロードマップに記載されています。)
内容
| レイヤー | 内容 |
|---|---|
| スマートコントラクト | セッションキー、許可リスト、トランザクションごとの上限、ローリング予算を備えた ERC-4337 v0.7 アカウント。上限超過操作にはオーナーの共同署名が必要です。UUPS アップグレード、ERC-1271、全チェーンで同じアドレスになる CREATE2 ファクトリー |
| プロトコルルール | ERC-7562 に準拠した検証(時刻の読み取りなし)により、パブリックバンドラーで受け入れられます。時間ベースの予算処理は executeUserOp を通じて実行フェーズに移されています |
| テスト | 実際の EntryPoint を使用した単体テスト41件、予算モデルに対するファズテスト、ステートフルハンドラーによる不変条件テスト、ガススナップショット、CI での Slither |
| TypeScript SDK | バンドラーまたは handleOps を通じてユーザーオペレーションを構築、署名、送信する viem クライアント。ポリシーエラーのデコードや、パブリック RPC のログ上限内でのイベントインデックス作成にも対応 |
| AI 統合 | 6つのツール、モデルが読み取れる拒否理由、人間参加型の承認フローを備えた MCP サーバー(ストリーミング可能な HTTP と stdio) |
| 製品 | 予算メーター、リアルタイムのアクティビティ、承認、失効、キルスイッチを備えた React コンソール |
| デリバリー | 1コマンドで起動できるデモイメージ、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
- オーナーは、ポリシーを設定したセッションキーをエージェントに付与します。ポリシーには、
(contract, function)ペアの許可リスト、トランザクションごとの上限、トークン(ETH または ERC-20)ごとの期間予算、有効期間が含まれます。 - エージェントは
send_ethやcall_contractなどの MCP ツールを呼び出します。サーバーはポリシーに照らして呼び出しをドライランし、セッションキーでユーザーオペレーションに署名して送信します。 - アカウントは検証中に署名、有効期間、許可リスト、トランザクションごとの上限を確認するため、許可されていない操作は費用が発生する前に失敗します。予算の確認にはブロック時間が必要ですが、ERC-4337 では検証中にブロック時間を参照できないため、
executeUserOpで適用されます。 - 上限を超えた場合、サーバーは承認リクエストに変換します。オーナーが承認すると、操作にはセッション署名とオーナーの署名の両方が含まれ、エージェントの予算を使わずに実行されます。承認で増やせるのは金額だけで、対象範囲は変わりません。許可リストは引き続き適用されます。
- オーナーはいつでもキーを取り消すか、アカウント全体を凍結できます。同じバンドル内で先に取り消しや凍結が行われた場合、後続のエージェント操作も停止します。
1つのコマンドで試す
Docker が必要です。クローンもインストールも不要です。
docker run --rm -it -p 127.0.0.1:8787:8787 ghcr.io/ahmad-codex/purser:demo
コンテナはローカルチェーンを起動し、EntryPoint、ファクトリー、エージェントが登録済みの新しいアカウントをデプロイしてから、MCP サーバーとコンソールを起動します。http://localhost:8787 を開いて動作を確認してください。10 秒後、ターミナルでエージェントのデモが始まり、コンソールもリアルタイムで更新されます。
エージェントは加盟店への支払い、トークンでの支払い、ショップコントラクトでの購入を行い、上限を超える支払いを試みます(承認リクエストがコンソールに表示されます)。承認されると、許可リストにない受取人への支払いは拒否され、キルスイッチによって停止されます。その後もウォレットは起動したままなので、自分のエージェントで使えます。すべて Anvil の公開開発用キーを使用し、Ctrl+C を押すとすべて消去されます。
クローンした場合は、docker compose up で同じ構成を個別のサービスとして起動でき、docker compose run --rm demo でその構成に対してデモを実行できます。
自分のエージェントを接続する
デモの実行中に、任意の MCP クライアントを http://localhost:8787/mcp に接続します。
claude mcp add --transport http purser http://localhost:8787/mcp
次に Claude に「ウォレットの状態を確認してから、API クレジットの代金として加盟店に 0.01 ETH を支払って」と依頼します。「加盟店に 0.3 ETH を支払って」と試すと、承認リクエストがコンソールに表示されます。 docs/mcp-clients.md では、Claude Desktop、Cursor、stdio について説明しています。
MCP ツール
| ツール | 機能 |
|---|---|
wallet_status | 残高、トークンごとのエージェントの残り予算、上限、リセット時刻、有効期限、凍結状態、保留中の承認 |
send_eth | アドレスまたは既知の名前宛てに ETH を支払う |
send_token | シンボルまたはアドレスを指定して ERC-20 トークンを支払う |
call_contract | 許可されたコントラクト関数を呼び出す。必要に応じて ETH を添付できます(例:buy(uint256)) |
get_request | 承認リクエストの状態 |
list_requests | 最近の承認リクエスト |
各支払いツールは、次のいずれかを返します。完了(トランザクションハッシュと残り予算を含む)、オーナーの応答待ち(リクエスト ID を含む)、または拒否(モデルが対応できる理由を含む)。
ポリシー
| フィールド | 意味 |
|---|---|
permissions | (target, selector) のペアです。0xffffffff は対象のすべての関数を許可し、0x00000000 は通常の ETH 送金を許可します。アカウント自体を対象にすることはできません。 |
limits | トークンごと(ETH は address(0)):perTx は上限、perPeriod は期間予算です。アカウントからの ERC-20 の transfer、approve、transferFrom は支出として計上されます。 |
period | 予算の適用期間を秒数で指定します。たとえば、86400 は1日分の予算です。 |
validAfter, validUntil | キーの有効期間です。EntryPoint が検証データを通じて適用します。 |
キーを再度付与すると、ポリシー全体が置き換わります。以前の権限が新しいポリシーに引き継がれることはありません。
コントラクト
| コントラクト | 目的 |
|---|---|
PurserAccount | アカウント:ERC-4337 v0.7、所有者がアップグレード可能な UUPS、ERC-1271、トークンコールバック |
PurserFactory | CREATE2 ファクトリー。アカウントをデプロイする前にアドレスがわかります |
eth-infinitism のリファレンス EntryPoint v0.7 と OpenZeppelin 5 をベースにしています。ファクトリーは決定論的な CREATE2 プロキシを介してデプロイするため、正規の EntryPoint があるすべてのチェーンで同じアドレスになります。
テスト。 実際の EntryPoint を使った 41 件の単体テスト、予算のモデルとランダムな支払い・時間シーケンスを照合するファズテスト、および 3 つの特性を検証する不変条件テスト(実行ごとに約 16,000 回のランダムな呼び出し)を実施しています。3 つの特性とは、承認なしにエージェントが期間ごとの予算を超えて支出しないこと、取り消されたキーが再び資金を移動できないこと、ポリシーが所有者に知られずに変更されないことです。Slither は CI で実行されます。脅威モデルについては 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 をご覧ください。スクリプト 1 つで済み、蛇口から 0.01 ETH 未満を受け取ればすべてをまかなえます。
ステータス
初期段階のバージョン 0.1.2 です。監査は受けていません。テストネットで使用し、ご自身で確認していないアカウントには実際の資金を入れないでください。今後の予定は ROADMAP.md に記載されています。また、good first issue ラベルの付いた課題は、貢献を始めるのに適しています。
貢献
CONTRIBUTING.md をご覧ください。セキュリティに関する報告は、課題ではなく非公開のアドバイザリーからお送りください。
ライセンス
コメント
AI アプリケーションが外部のツールやデータソースに統一的な方法で接続するためのオープンなプロトコルです。クライアントはモデルとの対話を担い、MCP サーバーはツール・リソース・プロンプトテンプレートを提供します。標準メッセージでやり取りするため、1 つのサーバーを複数のクライアントで再利用できます。