AgentGuard について
AgentGuardは、オンチェーンの支出ルールに従うボールトを通じて、AIエージェントがNEARの支払いを申請するMCPサーバーです。支払い制御、アドレス確認、ポリシーやテキスト検査で検出した取引の所有者レビューに対応します。
主な機能
- 01ボールト経由でNEARの支払いを申請
- 02オンチェーンの上限と承認ルールを適用
- 03リスク要因に基づくアドレス確認
- 04支払い状況と履歴の確認
- 05支払いテキストのプロンプトインジェクション検査
- 06ボールト経由でSentinelチェックを購入
活用シーン
- 01エージェントによる許可済み宛先への支払い
- 02ポリシーに該当する支払いに所有者承認を要求
- 03送金前に受取アドレスを確認
- 04支払いテキストの検出時に申請を保留
MCP 対応
ボールト決済、アドレス確認、残高、ポリシー、支払い状況と履歴などのツールを公開し、オプションでSentinelチェックにも対応します。エージェントのキーは支払いを申請でき、支出ルールはボールトのコントラクトが適用します。
設定
ローカルサーバーの設定はどのクライアントでも共通です。コピーしてクライアントの MCP 設定ファイルに貼り付けてください。
npx -y @zaxcoraider/agentguard-mcpAGENTGUARD_VAULTYour AgentGuard vault account, e.g. my-agent.agentguard.testnetNEAR_NETWORKtestnet (default) or mainnetAGENTGUARD_AGENT_KEYシークレットThe agent's ed25519 function-call key; without it the server is read-onlyAGENTGUARD_KEY_FILEシークレットPath to a key file to read instead of AGENTGUARD_AGENT_KEYNEAR_RPC_URLOverride the NEAR RPC endpointSENTINEL_URLWhere to buy Sentinel's paid checkローカルサーバーにはマシン上の実行環境(Node.js 18 以上など)が必要です。設定ファイルの場所はクライアントごとに異なります。
ツール
ローカルサーバーのツールはマシン上で起動して初めて取得できます。メンテナーはまだツール一覧を提供していません。
詳細
AgentGuard MCP サーバー
あらゆる MCP エージェント(Claude Code、Claude Desktop、Codex など)が、AgentGuard vault を通じて NEAR で支払えるようにします。エージェントが保持するのは、vault に支払いを依頼するためのファンクションコールキーだけです。vault コントラクトがオンチェーンで判断し、paid、pending(人間の所有者の承認待ち)、または blocked を返します。プロンプトインジェクションを受けたエージェントが何を依頼しても、コントラクトが許可しなければ支払いは実行されません。
ツール
| ツール | 機能 |
|---|---|
agentguard_pay | vault に recipient へ amount_near を支払うよう依頼します。paid/pending/blocked、理由、トランザクションへのリンクを返します。請求書/メール/ページを source_text として渡してください。プロンプトインジェクションの手口が含まれている場合、vault に支払いを保留して所有者の確認を求めるよう依頼します(flagged_for_review)。 |
agentguard_check_address | 「このアドレスに安全に支払えますか?」共有詐欺レジストリ、アカウントの存在、コントラクトかどうか、許可リストへの登録状況、類似名を確認します。また、source_text が指定されている場合は、支払いを求めるテキストをスキャンしてプロンプトインジェクションを検出します。allow/warn/block と理由を返します。 |
agentguard_balance | 残高、利用可能額、過去24時間の支出額、支払い済み/ブロック済み/保留中の件数 |
agentguard_policy | 1回あたりの支払い上限、24時間の上限、承認基準額、許可リスト、レジストリ、ロック状態 |
agentguard_payment_status | 1件の支払いの状態(例:所有者が承認したかどうか) |
agentguard_history | ブロックされたものを含む、最近の支払いリクエスト |
agentguard_sentinel_check | HTTP 402 を通じて Sentinel の有料チェックを購入します。お使いの vault を通じて料金を支払い(お使いのルールが適用されます。max_price_near を超えることはありません。デフォルトは 0.02)、X-PAYMENT を付けて再試行し、チェック結果とトランザクションを返します。SENTINEL_URL を設定してください。 |
セットアップ
cd packages/mcp
npm install
npm run build
設定(環境変数):
| 変数 | デフォルト | 意味 |
|---|---|---|
AGENTGUARD_VAULT | (必須) | お使いの vault。例:demo2.agentguard.testnet |
NEAR_NETWORK | testnet | testnet または mainnet |
AGENTGUARD_AGENT_KEY | ファイルから読み込み | エージェントの ed25519:... ファンクションコールキー |
AGENTGUARD_KEY_FILE | ~/.near-credentials/<network>/<vault>.json | 上の変数が設定されていない場合にキーを読み込む場所(scripts/gen-agent-key.mjs によって作成されます) |
NEAR_RPC_URL | FastNEAR のパブリック RPC | RPC エンドポイントを上書きします |
SENTINEL_URL | https://sentinel.agentguard.app | agentguard_sentinel_check がチェックを購入する接続先(ローカルの Sentinel を使う場合は http://localhost:3000 を設定します) |
キーがなくても、サーバーは読み取り専用で動作します。
Claude Code
claude mcp add agentguard -e AGENTGUARD_VAULT=demo2.agentguard.testnet -- npx -y @zaxcoraider/agentguard-mcp
npm では @zaxcoraider/agentguard-mcp として公開されています。クローンから実行する場合は、代わりに -- node /absolute/path/to/packages/mcp/dist/index.js を使います。
続いて Claude に次のように依頼します。「agentguard-evil.testnet に安全に支払えるか確認してから、コーヒー代として agentguard-shop.testnet に 0.05 NEAR を支払ってください。」
任意の MCP クライアント(JSON 設定)
{
"mcpServers": {
"agentguard": {
"command": "npx",
"args": ["-y", "@zaxcoraider/agentguard-mcp"],
"env": { "AGENTGUARD_VAULT": "demo2.agentguard.testnet", "NEAR_NETWORK": "testnet" }
}
}
}
自分の vault を取得する(testnet、約2分)
near CLI と testnet アカウント(YOU.testnet)が必要です。以下の手順はすべて testnet で実行済みです(vault は guide-test.agentguard.testnet。docs/TESTNET-RESULTS.md §9 を参照)。
1. vault を作成します。 factory を使います。1 NEAR が vault に入ります(所有権はそのままです)。vault はフルアクセスキーなしで作成されます。
near contract call-function as-transaction agentguard.testnet create_vault json-args '{
"name": "my-agent",
"policy": {"max_per_payment": "500000000000000000000000", "daily_limit": "1000000000000000000000000",
"approval_threshold": "200000000000000000000000", "unknown_recipient": "require_approval",
"pending_ttl_ns": "86400000000000"},
"allowlist": ["agentguard-shop.testnet"]
}' prepaid-gas '100 Tgas' attached-deposit '1 NEAR' sign-as YOU.testnet network-config testnet sign-with-keychain send
これにより、1回あたり最大 0.5 NEAR、1日あたり 1 NEAR となり、0.2 NEAR を超える支払いには承認が必要で、見知らぬ相手への支払いは承認待ちになります(額は yoctoNEAR 単位です。1 NEAR = 10^24)。
2. エージェントのキーを作成します。 ~/.near-credentials/testnet/my-agent.agentguard.testnet.json に保存され、表示されるのは公開鍵だけです。
node scripts/gen-agent-key.mjs my-agent.agentguard.testnet # from the repo root
3. そのキーを vault に登録します。 呼び出せるのは request_payment だけです。
near contract call-function as-transaction my-agent.agentguard.testnet add_agent \
json-args '{"public_key": "ed25519:<printed key>", "label": "my-agent"}' \
prepaid-gas '30 Tgas' attached-deposit '1 yoctoNEAR' sign-as YOU.testnet network-config testnet sign-with-keychain send
4. MCP サーバーに vault を指定します(AGENTGUARD_VAULT=my-agent.agentguard.testnet。セットアップを参照)。その後、エージェントに支払いを依頼します。テスト実行の結果:
agentguard_pay agentguard-shop.testnet 0.1 -> paid
agentguard_pay agentguard-user.testnet 0.1 -> pending, unknown_recipient (approve or deny it as the owner)
所有者として 1 yoctoNEAR を添付した場合は、approve {"id": "1"}/deny {"id": "1"}、add_to_allowlist、set_policy、withdraw、set_paused、lock_rules を実行できます(lock_rules は一方向の操作です。実行すると、あなたを含めて誰も vault の制限を緩和できなくなります)。contracts/vault を参照してください。
エージェントなしで試す
npm test # 24 unit tests: scoring, lookalikes, prompt-injection scan, NEAR amount math, HTTP 402 payment checks
npx tsx scripts/live-demo.ts # starts the server over stdio and calls every tool on testnet
live-demo.tsで支払いを行うには、demo2.agentguard.testnetのエージェントキーが必要です。エージェントキーがない場合でも読み取り専用ツールは動作しますが、agentguard_payはキーがないことを示すエラーを返します。
想定される結果(2026-11-03に記録):
agentguard_check_address agentguard-evil.testnet -> block: flagged in the shared AgentGuard registry: ...
agentguard_check_address agentguard-sh0p.testnet -> block: does not exist; looks like trusted account agentguard-shop.testnet
agentguard_pay agentguard-shop.testnet 0.05 -> paid
agentguard_pay agentguard-evil.testnet 0.2 -> blocked, recipient_flagged
agentguard_pay agentguard-shop.testnet 5 -> blocked, over_per_payment_limit
エージェントにできないこと
キーはNEAR自体によって、ボールト上のrequest_paymentに制限されています。NEARの送金、オーナーメソッド(withdraw、set_policy、approve、…)の呼び出し、デポジットの添付、他のコントラクトの呼び出し、キーの追加、コードのデプロイ、アカウントの削除はできません。テストネットでの証明:scripts/prove-agent-key.sh(12/12が拒否)と、リポジトリのルートにあるdocs/TESTNET-RESULTS.mdをご覧ください。
agentguard_check_addressはエージェントへの助言です。エージェントがどう判断するかにかかわらず、重要なルールはボールトコントラクトで適用されます。
プロンプトインジェクションのスキャン(src/inject.ts)
支払いを依頼したテキスト(source_text)をagentguard_payまたはagentguard_check_addressに渡します。モデルを使わずに、既知の手口をスキャンします:
| 判定 | 重大度 |
|---|---|
不可視文字:ゼロ幅文字、方向制御文字、Unicodeの「タグ」文字(隠しテキストをデコードし、hidden_textとして返します) | 悪意あり |
| 「以前の指示を無視して」「新しい指示:」「あなたは今から…」 | 悪意あり |
| 「オーナーには伝えないで」「承認なしで」「上限/許可リストを回避して」 | 悪意あり |
偽のロールマーカー:<system>、[SYSTEM]、<|im_start|> | 悪意あり |
| AIに向けたテキスト(「あなたがAIアシスタントなら…」)、隠しHTML/CSS、「支払い先アドレスが変更されました」、テキスト内の他のNEARアカウント、長いエンコード済みデータ | 不審 |
動作:check_addressは悪意ありをblockに、不審をwarnにします。agentguard_pay(メモもスキャンします)は、検出したものをすべてforce_review付きでボールトに送るため、コントラクトは支払わずにオーナーのために支払いを保留します。スキャンによって制限が緩和されることはありません。これはヒューリスティックであり、回避される可能性があります。スキャンで問題が検出されなくても安全の証明にはならず、最終的にはボールトのルールが判断します。実行例:TESTNET-RESULTS §14(scripts/injection-demo.mts:同じ店舗、同種の金額で、問題のない請求書は支払われ、細工された請求書は保留されます)。
コメント
AI アプリケーションが外部のツールやデータソースに統一的な方法で接続するためのオープンなプロトコルです。クライアントはモデルとの対話を担い、MCP サーバーはツール・リソース・プロンプトテンプレートを提供します。標準メッセージでやり取りするため、1 つのサーバーを複数のクライアントで再利用できます。