mcpField
P
Purser

Purser

ローカル
github.com金融データ23 日前に更新

Purser について

PurserはERC-4337スマートアカウントのウォレットで、AIエージェントごとにポリシーで制限されたセッションキーを発行します。通常の支払いは自動実行し、上限超過の申請は所有者が確認できます。コンソールで利用状況の監視やアクセス取り消しも行えます。

主な機能

  1. 01コントラクトと関数の許可リスト付きセッションキー
  2. 02支払いごとの上限と期間予算
  3. 03上限超過時の所有者承認
  4. 04支出、承認、取り消しを管理するコンソール
  5. 05アカウントの凍結とエージェントキーの取り消し

活用シーン

  1. 01予算内でAPIクレジットをエージェントに支払わせる
  2. 02高額な支払いに所有者の承認を求める
  3. 03エージェントの操作を指定コントラクトと関数に限定

MCP 対応

PurserのMCPサーバーは、ウォレット状況、ETH・トークンの支払い、コントラクト呼び出し、承認申請のツールをMCPクライアントに提供します。ストリーミング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 エージェントにウォレットを使わせます。

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
  1. オーナーは、ポリシーを設定したセッションキーをエージェントに付与します。ポリシーには、(contract, function) ペアの許可リスト、トランザクションごとの上限、トークン(ETH または ERC-20)ごとの期間予算、有効期間が含まれます。
  2. エージェントは send_eth や call_contract などの MCP ツールを呼び出します。サーバーはポリシーに照らして呼び出しをドライランし、セッションキーでユーザーオペレーションに署名して送信します。
  3. アカウントは検証中に署名、有効期間、許可リスト、トランザクションごとの上限を確認するため、許可されていない操作は費用が発生する前に失敗します。予算の確認にはブロック時間が必要ですが、ERC-4337 では検証中にブロック時間を参照できないため、executeUserOp で適用されます。
  4. 上限を超えた場合、サーバーは承認リクエストに変換します。オーナーが承認すると、操作にはセッション署名とオーナーの署名の両方が含まれ、エージェントの予算を使わずに実行されます。承認で増やせるのは金額だけで、対象範囲は変わりません。許可リストは引き続き適用されます。
  5. オーナーはいつでもキーを取り消すか、アカウント全体を凍結できます。同じバンドル内で先に取り消しや凍結が行われた場合、後続のエージェント操作も停止します。

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、トークンコールバック
PurserFactoryCREATE2 ファクトリー。アカウントをデプロイする前にアドレスがわかります

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 をご覧ください。セキュリティに関する報告は、課題ではなく非公開のアドバイザリーからお送りください。

ライセンス

MIT

コメント

MCP は初めてですか?

プロトコルの概要から最初のサーバーの導入まで、よくある疑問にまとめて答えます。

AI アプリケーションが外部のツールやデータソースに統一的な方法で接続するためのオープンなプロトコルです。クライアントはモデルとの対話を担い、MCP サーバーはツール・リソース・プロンプトテンプレートを提供します。標準メッセージでやり取りするため、1 つのサーバーを複数のクライアントで再利用できます。