
scopeblind-gateway v0.13.1
Ed25519署名付きレシート + AIエージェント向けCedarポリシー。金融マンデートゲート(Legate)、プルーフパック、3件のIEFTインターネットドラフト。npx protect-mcp
protect-mcp
AIエージェントのツール呼び出しに対するフェイルクローズドなCedarポリシーゲートと署名付きレシート。
protect-mcp は、AIエージェントのツール呼び出しの手前に位置するゲートです。各呼び出しを Cedar ポリシー(AWSがIAMで使用しているのと同じ言語)に照らして評価し、ルールに違反するものを実行前にブロックし、すべての決定に対してオフラインで検証可能なEd25519レシートに署名します。ローカルで動作し、あなたの決定に関するテレメトリをどこにも送信せず、MITライセンスです。
なぜ他と違うのか
- デフォルトでフェイルクローズド。 ポリシーエラー、エンジンの欠如、評価の失敗が発生した場合、決定はDENYです。ゲートが暗黙に許可することは決してありません。シャドウロールアウト用のオブザーブモードも存在しますが、そこでもブロックされるはずの呼び出しは
would_deny: trueとしてフラグが立てられるため、失敗が黙って見過ごされることはありません。 - 自らの自制を証明します。
serve --enforceとdoctorは起動時のセルフテストを実行し、既知の禁止アクションが実際に拒否されることを示せない限り、ゲートを有効化することを拒否します。拒否を証明できないゲートは起動しません。 - すべての決定は誰でも検証できるレシートです。 決定はEd25519で署名され、
@veritasacta/verifyを使ってオフラインで検証できます。ベンダーの信頼は不要です。数学は誰が実行するかを気にしません。
クイックスタート: インストールから最初の有用な証明まで```bash
1. Generate an Ed25519 keypair, config template, and sample policy.
npx protect-mcp init
2. Wrap any MCP server in shadow mode. Nothing is blocked yet; calls are logged.
npx protect-mcp wrap -- node your-mcp-server.js
3. Inspect the local-only dashboard: tool inventory, risk, approvals, receipts.
npx protect-mcp dashboard --open
4. Draft a reviewable policy from observed calls.
npx protect-mcp recommend --write
5. When reviewed, restart the wrapper in enforce mode with that policy.
npx protect-mcp --policy protect-mcp.recommended.json --enforce -- node your-mcp-server.js
Claude Desktop の場合は、まずドライランで設定パッチを実行し、その後適用します:```bash
npx protect-mcp wrap --claude-desktop
npx protect-mcp wrap --claude-desktop --write
npx protect-mcp dashboard --open
ダッシュボードは 127.0.0.1 にバインドされ、ローカルのログ/レシートファイルのみを読み取り、何もアップロードしません。ホスト型の ScopeBlind ダッシュボードを明示的に希望する場合にのみ、npx protect-mcp connect を使用してください。
MCP サーバーとしてのゲート
Claude Code フックを配線するのではなく、ゲートをツールとして呼び出したい場合は、MCP サーバーとして実行します:```bash npx protect-mcp mcp
MCPをstdio経由で話し、4つの読み取り専用ツール、つまりループ全体を公開します:
- **`evaluate_action`**: 提案されたツール呼び出しをインラインCedarポリシーに照らして判定し、フェイルクローズドで動作します(ポリシーエラーはすべてDENY)。`{ allowed, decision, reason, policy_digest }` を返します。
- **`sign_decision`**: 判定をEd25519署名付きレシートに変換します(拒否は `gateway_restraint` に署名し、許可は `decision_receipt` に署名します)。レシートとその公開鍵を返します。鍵を指定しない場合は一時的な鍵を生成します。
- **`verify_receipt`**: 署名付きレシートを公開鍵に対してオフラインで検証します。`{ valid, error, type, kid, issuer }` を返します。
- **`self_test`**: 入力を必要とせず、それを証明します。既知の禁止されたアクションが拒否され、次に署名付きレシートがラウンドトリップし、改ざんされたコピーが失敗します。
任意のMCPホストをこれに向けてください。例えばClaude Desktop:```json
{
"mcpServers": {
"protect-mcp": { "command": "npx", "args": ["-y", "protect-mcp", "mcp"] }
}
}
レシートは、ゲートが実行時に署名するものとバイト互換であるため、ここで発行されたレシートは @veritasacta/verify およびブラウザ検証ツールで同様に検証できます。
ローカルアクションダッシュボード
protect-mcp dashboard は、可視性から強制へ移行するためのオペレータービューです:
- ツールインベントリ: 観測されたすべてのツール、呼び出し回数、高/中/低リスク、およびアクティブなポリシーに正確なルール、ワイルドカードフォールバック、またはルールがないかどうか。
- ポリシーカバレッジ:
Require approval、Block、またはObserveのワンクリックローカルポリシー編集。変更を確認した後、ラッパーを再起動してください。 - 正確なアクション承認キュー: 人間が承認、拒否、編集、または引き継ぐ前に、正確なツール、アクション、宛先、編集済みペイロードプレビュー、ペイロードハッシュ、ポリシー根拠、および理由をキャプチャします。
- レシートチェーン: リクエストIDと署名済みレシートハッシュを関連付け、監査レビュアーがどの決定に暗号学的証明があるかを確認できるようにします。
- 監査エクスポート: 署名済みレシートが存在する場合、オフライン検証可能な監査バンドルをダウンロードします。署名されていないローカルログのみが存在する場合、ダッシュボードは署名を先に有効にする必要があることを説明します。
ライブデスクトップフォールバック承認の場合、ラッパーによって出力されたローカルゲートウェイ承認エンドポイントとノンスを使用してダッシュボードを起動します:```bash
npx protect-mcp dashboard --open
--approval-endpoint http://127.0.0.1:9876
--approval-nonce "$PROTECT_MCP_APPROVAL_NONCE"
`Approve` は、これらのフラグが存在する場合、稼働中のローカルゲートウェイに転送します。
`Deny`、`Edit`、`Take over` は承認解決レコードとしてローカルに記録されます。必要に応じて、これらをオペレーター指示として使用し、ツールを再実行してください。
### 有償境界 MVP: データアップロードではなく、ダイジェストのアンカリング
ローカルの自己署名レシートは無料のままで、オフラインで検証可能です。有償境界は、ScopeBlind が生のプロンプト、ツールペイロード、出力、秘密鍵、または生のレシートを受け取ることなく、組織 ID の下で、ある時点でレシートダイジェストを確認したという独立した証拠です。```bash
# Create or refresh a local org identity and public-key directory.
npx protect-mcp registry init --org "Meridian Global Macro" --billing-account acct_meridian
# Local preview: writes a digest registry and shareable static verifier page.
npx protect-mcp registry anchor
# Hosted mode: uploads receipt digests only for independent anchoring.
SCOPEBLIND_TOKEN=... npx protect-mcp registry anchor \
--hosted \
--endpoint https://api.scopeblind.com \
--verifier-base https://legate.scopeblind.com
ローカルプレビューは意図的に local-preview-not-independent とラベル付けされています。
ホストモードはレシートハッシュ、リクエストID、組織の公開鍵、および
課金メタデータのみをアンカーします。生のレシートや機密性の高いコンテキストはアップロードしません。
キラーデモ: シャドウからポリシー、そして証明へ
protect-mcp killer-demo は、完全な3分間のセールス/デモパックを生成します:```bash
npx protect-mcp killer-demo --dir ./scopeblind-demo
モックのファイルシステム、GitHub、メール、PMS アクティビティを作成し、シャドウモードでリスクの高い呼び出しを表示し、ポリシーパックを適用し、機密性の高い PMS 予約に承認を要求し、ゲートウェイ経由で実行し、署名済みレシートを書き込み、元のレシートが検証されることを証明し、改ざんされたレシートが失敗することを証明し、機密性の高いコンテキストを隠しつつ最小限の証明を表示する選択的開示パッケージを作成します。
まず生成された `DEMO-RUNBOOK.md` を開いてください。次に、出力されたダッシュボードコマンドを実行して、顧客に正確な手順を案内してください。
### Selective Disclosure v0
コミットメントモードのレシートは、すべてのフィールドを平文で公開する代わりに `committed_fields_root` を保持できます。後で、保有者は選択したフィールドのみを開示できます:```bash
npx protect-mcp verify-disclosure \
--receipt ./receipts/selective-disclosure.receipt.json \
--disclosure ./receipts/selective-disclosure.tool-only.json
検証器は親レシートハッシュ、Ed25519署名、コミットメントルート、および開示された各フィールドのMerkle証明をチェックする。その後、どのフィールドが開示され、どのコミット済みフィールドが隠されたままかを説明する。これはソルト付きコミットメント開示であり、完全なゼロ知識ではないが、プライバシーに関する主張を具体的なものにする。監査者はツールのペイロード全体や機密のデスクコンテキストを受け取ることなく、選択された事実を検証できる。
レコードに対する主張を証明する(位置非依存のアテステーション)
レコードを明かすことなく、そのレコードに対するCLAIMを証明できる。レコード全体に対する署名済みの位置非依存アテステーションを発行し、決定ごとのカテゴリ(レシートダイジェスト、判定、ケイパビリティタグ)のみを開示し、ツールの入力、出力、データは決して開示しない:```bash
"No action reached the network across the record":
npx protect-mcp claim --no net.egress
other predicates:
--only fs.read,fs.write all actions were confined to these capabilities
--no-verdict blocked no action was blocked
--count blocked how many were blocked
誰でもオフラインで検証でき、カテゴリのみが見え、内容は決して見えない:```bash
npx protect-mcp verify-claim claim-<id>.json
検証者は開示された集合に対してMerkle rootを再計算し、述語を独立に再計算するため、発行者は開示が与えられたもとで主張について嘘をつくことができない。--anchor を追加すると、主張のダイジェストが公開の追記専用ScopeBlind透明性ログに記録されるため、あなたを信頼しない相手方でも、開示された集合が完全であり、密かに切り直されていないことを確認できる(送信されるのはハッシュのみで、レコードはローカルに留まる):```bash
npx protect-mcp claim --no net.egress --anchor
これは説明責任があり、位置に依存しない証明であり、完全なゼロ知識ではありません。それは内容ではなく、形状を明らかにします。
## 60秒で試す(エージェント不要)
[](https://legate.scopeblind.com/record)
[legate.scopeblind.com/record](https://legate.scopeblind.com/record) で2分間の映像を見て、それを自分のコピーに対して再生してください:```bash
npx protect-mcp sample # seed a labeled sample record (8 decisions: 1 blocked, 2 payments)
npx protect-mcp record # open it: signatures verified in your browser
npx protect-mcp claim --payment-under 100 --anchor --output payments-under-100.json
npx protect-mcp verify-claim payments-under-100.json
npx protect-mcp anchor-record
生成された demo-tampered.jsonl をレコードページにドロップすると、署名後の編集が検出されるのを確認できます。sample は既存のレコードには触れないため、空のフォルダで実行してください。実際に使う準備ができたら、以下のゲートを組み込み、同じコマンドを自分のエージェントのレコードに対して実行してください。
Claude Code フック クイックスタート```bash
Generate hook config and a sample Cedar policy.
npx protect-mcp init-hooks
Serve the Claude Code hook gate in enforce mode. It runs a restraint self-test
first and refuses to start if it cannot prove it denies a forbidden vector.
npx protect-mcp serve --enforce --cedar ./cedar
ワンショット評価。PreToolUse フックが呼び出す方法。終了コード 2 は拒否を意味し
(ツールはブロックされる)、終了コード 0 は許可を意味する:```bash
npx protect-mcp evaluate --cedar ./cedar --tool Bash --input '{"command":"rm"}'
echo $? # 2 -> denied, fail-closed
npx protect-mcp evaluate --cedar ./cedar --tool Read --input '{"path":"README.md"}'
echo $? # 0 -> allowed
ポリシーが存在しないかロードできない場合は拒否されます(終了コード 2)。ただし、明示的に
--fail-on-missing-policy false を渡した場合を除きます。
Claude Code フック
protect-mcp init-hooks は .claude/settings.json を自動的に書き込みます。手動で
ゲートを接続する場合、必要な 2 つの動詞は evaluate(PreToolUse、終了コード 2 でブロック)と
sign(PostToolUse、レシートを記録)です。Claude Code
セッションが常にテスト済みのゲートを実行するように、バージョンを固定してください:```json
{
"hooks": {
"PreToolUse": [
{
"matcher": "",
"hooks": [
{
"type": "command",
"command": "npx [email protected] evaluate --cedar ./cedar --tool "$TOOL_NAME" --input "$TOOL_INPUT""
}
]
}
],
"PostToolUse": [
{
"matcher": "",
"hooks": [
{
"type": "command",
"command": "npx [email protected] sign --tool "$TOOL_NAME" --receipts ./receipts --key ./keys/gateway.json"
}
]
}
]
}
}
### ポリシー判定自体に署名する
0.13.0 以降、`sign` はポリシーを評価し、無条件の許可ではなく実際の判定をレシートに記録できます。ポリシーディレクトリと、フックが `evaluate` に渡すのと同じ入力およびコンテキストを渡します:```bash
npx [email protected] sign --cedar ./cedar --tool Bash \
--input '{"command":"rm -rf /"}' --context '{"command_pattern":"rm -rf"}' \
--receipts ./receipts --key ./keys/gateway.json
レシートペイロードはその後、decision(allow または deny)、reason
(cedar_allow または cedar_deny)、および policy_digest(ポリシーセットの acta-policy-digest-v1
ダイジェスト)を保持し、draft-farley-acta-signed-receipts-03 を引用する。この
コマンドは決定とダイジェストを stdout に出力する。deny も署名される。レシートは
決定の記録であり、続行の許可ではないからだ。
2 つの Cedar アクションモデルがサポートされている。ランタイムゲートは
Action::"MCP::Tool::call" を評価し、ツールをリソースとする。これは
cedar/ 内のポリシーが期待するものであり、sign --cedar がデフォルトで使用するものである。
ツールをアクションとして指定するポリシー(action == Action::"Bash")、たとえば
agent-governance-testvectors で公開されている適合性ポリシーは、
--action-model tool を必要とする。evaluate も同じフラグを受け付ける。
evaluate は deny 時に終了コード 2 で終了するため Claude Code はツール呼び出しをブロックし、allow 時は 0 で終了する。
sign はベストエフォートである。キーが設定されていれば Ed25519 署名済みレシートを
追加し、署名者が利用できない場合はツールを失敗させるのではなく、
正直に未署名の行("signed": false)を記録する。
他のエージェント(Codex、Cursor、Gemini、Hermes)で使用する
同じフェイルクローズドゲートは、ツールフックをサポートするあらゆるエージェントでツールフックとして動作する。
--format <host> を追加すると、その動詞はそのホストのフックペイロードを stdin から読み取り、
そのコントラクトに従って deny する:```bash
the PreToolUse / before-tool command for each host
npx -y protect-mcp@latest evaluate --format codex --cedar ./cedar # OpenAI Codex npx -y protect-mcp@latest evaluate --format gemini --cedar ./cedar # Gemini CLI BeforeTool npx -y protect-mcp@latest evaluate --format cursor --cedar ./cedar # Cursor beforeShellExecution npx -y protect-mcp@latest evaluate --format hermes --cedar ./cedar # Hermes pre_tool_call
レシートのために、ポストツールイベントで `sign --format <host>` とペアにします。重要なケースは **Hermes** で、これはフックの終了コードを無視し、stdout から判定を読み取るため、`--format hermes` は exit 2 ではなく `{"decision":"block"}` を介して拒否します(生の exit-2 はそこでサイレントにフェイルオープンします)。`--format` がない場合、動詞は上記の Claude Code セクションとまったく同じように `--tool`/`--input` フラグを読み取ります。
## ポリシーを書く
Cedar ポリシーは `--cedar` で指定したディレクトリに置かれます。`forbid` ルールは拒否し、`permit` ルールは許可します。ツール入力の値とマッチさせるには、`.contains()` イディオムを使用します:```cedar
// Allow read-only tools.
permit(
principal,
action == Action::"MCP::Tool::call",
resource == Tool::"Read"
);
// Deny dangerous shell commands by matching the command against a list.
forbid(
principal,
action == Action::"MCP::Tool::call",
resource == Tool::"Bash"
) when {
["rm", "dd", "mkfs"].contains(context.command)
};
// Block destructive tools outright.
forbid(
principal,
action == Action::"MCP::Tool::call",
resource == Tool::"delete_file"
);
危険: 文字列をリストに対してマッチさせるために
context.command in ["rm", "dd"]と書いてはいけません。inはエンティティ階層のためのものであり、文字列のメンバーシップのためではありません。Cedar はこの式を型エラーとして扱い、forbidルール全体を黙って破棄します。その結果(フェイルオープンなゲートの下では)残存するpermitが有効なままになります。これが以下のアドバイザリの背後にある正確な欠陥です。代わりに[...].contains(context.command)を使用してください。0.7.0 以降、ゲートはそのエラーで許可するのではなく拒否し、出荷されたポリシーにこのパターンが再導入された場合、CI のトリップワイヤーテストがビルドを失敗させます。詳細は GHSA-hm46-7j72-rpv9 を参照してください。
スターターポリシーパック
ほとんどのチームは初日から Cedar をゼロから書くべきではありません。スターターパックをインストールし、シャドウモードで実行し、レシートを検査してから、厳格化または強制適用してください:```bash npx protect-mcp policy-packs list npx protect-mcp policy-packs show secrets-safe npx protect-mcp policy-packs install filesystem-safe --dir ./cedar npx protect-mcp policy-packs install all --dir ./cedar npx protect-mcp serve --cedar ./cedar
組み込みパック:
- `filesystem-safe`: 破壊的なファイル操作とシークレットらしきパスの読み取り。
- `git-safe`: force push、hard reset、破壊的なクリーンアップ、リポジトリ削除。
- `email-safe`: 下書きを許可し、無人送信をブロック。
- `database-safe`: 読み取り指向の DB 姿勢、書き込み/管理 SQL をブロック。
- `cloud-spend-safe`: 明らかなクラウド支出の創出とインフラの破壊。
- `secrets-safe`: 一般的なファイル、env、shell、クラウドのシークレット流出。
- `finance-mandate-safe`: 予約フローにおける制限リストと集中違反。
## レシートを検証する
レシートは署名されており、公開鍵を持つ誰でもオフラインで検証できます。ネットワークも、ベンダーも、ScopeBlind への信頼も不要です:```bash
npx @veritasacta/verify ./receipts/receipts.jsonl --format jsonl
# Exit 0 = valid, non-zero = tampered or malformed
npx protect-mcp bundle --output audit.json は、レシートと公開署名鍵を含む、自己完結型でオフライン検証可能な監査バンドルをエクスポートします。
セキュリティ
protect-mcp 0.7.0 は設計上フェイルクローズします。ポリシー評価エラー、エンジンの欠落、または評価時にエラーとなったポリシーが発生した場合、決定は許可ではなく DENY になります。serve --enforce と doctor は起動時セルフテストを実行し、信頼される前にゲートが既知の禁止ベクターを拒否することを証明し、それができない場合はアームを拒否します。
影響を受けるバージョン: 0.5.x および 0.6.x。 これらの系統はフェイルオープンし(評価エラー時に ALLOW を返す)、ピン留めされたエンジンに対して Cedar を正しく評価しないため、forbid ルールがブロックに失敗する可能性があります。>= 0.7.0 にアップグレードしてください。
詳細と修復: GHSA-hm46-7j72-rpv9。 脆弱性を報告するには、SECURITY.md を参照してください。
コマンド
| コマンド | 説明 |
|---|---|
serve | Claude Code 用の HTTP フックサーバーを起動します(ポート 9377)。--enforce は最初に抑制セルフテストを実行します。--cedar <dir> と --policy <path> はポリシーを選択します。 |
init | Ed25519 鍵ペア(keys/gateway.json)、設定テンプレート、およびサンプルポリシーを生成します。 |
sample | 明確にラベル付けされたサンプルレコード(8 つの決定: 1 つのブロックされた呼び出し、2 つの支払い、kid sample-demo)と改ざんされたコピーをシードし、エージェントを接続する前に record、claim、verify-claim、anchor-record をゼロからリプレイ可能にします。既存のレコードには触れません。--force で上書きします。 |
policy | ターミナルから Cedar ポリシーを表示および変更します: policy list(ツールごとの permit / forbid / default-deny、ゲートがそれを許可または拒否した頻度付き)、policy show、policy allow <tool>、policy deny <tool>、policy path。実行中の serve は変更時にホットリロードします。 |
wrap | 保護された MCP コマンドを出力するか、Claude Desktop MCP サーバーにパッチを適用します。デフォルトはドライランです。Claude Desktop 設定を更新するには --write を使用します。 |
dashboard | 127.0.0.1 上でローカル専用ダッシュボードを起動し、ツールインベントリ、リスク、ポリシーカバレッジ、正確なアクション承認、レシートチェーン、監査エクスポートを表示します。 |
recommend | 観測されたローカル呼び出しからレビュー可能な JSON ポリシーを起草します。デフォルトはドライランです。protect-mcp.recommended.json を作成するには --write を使用します。 |
registry | 組織 ID を作成し、レシートダイジェストをアンカーし、静的検証ページを書き込みます。ホストモードではダイジェストのみをアップロードします。 |
record | レシート上にローカルで検索可能なビューアを開きます(--live はエージェントの実行中にストリームします): Ed25519 署名はブラウザ内でゲートウェイ鍵に対して検証され、ケイパビリティタグ、来歴ツリー、ワンクリック署名付きエクスポートを提供します。すべてローカルで、何もアップロードされません。 |
claim | レコードに対する述語の署名付きで位置に依存しないアテステーションを発行します(--no <cap> には --no payment を含む、--only <c1,c2>、--no-verdict <verdict>、--count <verdict>、--payment-under <cap>)、決定カテゴリのみを開示します。--anchor を追加すると、クレームダイジェストを公開透明性ログに記録します。登録済みの鍵は名前付き組織としてアンカーします。 |
anchor-record | レコードの Merkle ルート + カウント + 時間範囲を公開ログにチェックポイントします(ハートビート対応: 変更がない場合はスキップします)。コミットメントがアンカーされたチェックポイントと一致する後のクレームは、そのチェックポイント時点の完全なレコードに対するものであることが証明可能です。 |
verify-claim | クレームパックをオフラインで検証します: 署名、再計算された Merkle ルート、独立して再計算された述語、および存在する場合はアンカーサイドカー(アンカーされたエンベロープをこの正確なクレームにバインドし、公開ログがそれを保持していることを確認します)。--check-anchor はアンカーを必須にします。--offline はログホップをスキップします。 |
killer-demo | 完全なシャドウモードからポリシー、承認、署名付きレシートまでのデモパックを生成します。 |
verify-disclosure | scopeblind.selective_disclosure.v0 パッケージを検証し、開示されたフィールドと隠されたフィールドを説明します。 |
policy-packs | スターター Cedar ポリシーパックを一覧表示、検査、インストールします。 |
evaluate | 1 つのツール呼び出しを Cedar ポリシーに対して評価します(PreToolUse ゲート)。終了コード 2 = 拒否(フェイルクローズ)、終了コード 0 = 許可。 |
sign | 1 つのツール呼び出しをレシートに署名します(PostToolUse)。ベストエフォート: 鍵がない場合は正直な未署名行を記録します。 |
simulate | 記録された決定ログに対してポリシーをドライランし、何をブロックしたかを確認します。 |
demo | ゲートでラップされた組み込みデモサーバーを起動し、レシートを即座に確認します。 |
doctor | セットアップ(鍵、ポリシー、Cedar エンジン、検証器)をチェックし、抑制セルフテストを実行します。 |
bundle | レシートと公開鍵を含むオフライン検証可能な監査バンドルをエクスポートします。 |
report | 決定ログとレシートからコンプライアンスレポート(Markdown または JSON)を生成します。 |
完全なフラグリファレンスについては npx protect-mcp --help を実行してください。
リンク
- プロトコル(IETF): draft-farley-acta-signed-receipts
- CHANGELOG
- npm
- scopeblind.com
MIT ライセンス。ScopeBlind によって構築されました。