approval-gate-mcp
approval-gate-mcp
長時間実行される自律プロセスの前に人間による承認ゲートを置くMCPサーバーです。さらに、ステータス、ログ、再起動、ホットリロードパラメータ、実行内容のサマリーなど、実際に運用するために必要な運用ツールも備えています。
FastMCP で構築されています。あらゆる MCP クライアントで動作します。
問題
自律的に動作するプロセスは、その行動の1つが重大な結果を招くまでは有用です。通常の選択肢はどちらも不十分です。オフにすれば、うまくいっていたすべてを失います。実行したままにすれば、後で知ることになります。
ゲートは第3の選択肢です。プロセスは無人で動き続けますが、重要とマークしたアクションを実行しようとするときは、実行する代わりに提案を書き出して先に進みます。あなたは、すでに開いている任意のMCPクライアントで、都合の良いときに提案を確認し、承認または拒否します。プロセスは次のサイクルであなたの決定を取得します。
どちらかが他方をブロックすることはありません。間にサービスはありません。契約は2つのJSONファイルです。
process you
| |
|-- writes proposal ----> pending.json
| |
| list_pending_approvals
| approve(0) / reject(1)
| |
|<-- reads on next cycle -- approved.json
|
|-- acts, appends to records.jsonツール
承認ゲート
ツール | 説明 |
| 決定を待つすべての提案とその全フィールド |
| 1つの提案を承認済みファイルに移動する |
| 1つの提案を破棄する |
プロセス制御
ツール | 説明 |
| 実行中かどうか、PID、稼働時間、CPU、メモリ、ディスク、最後のログ行 |
| ログファイルをテールする |
| 開始スクリプトで再起動。SSHセッションが切れても残るようデタッチ |
| 1回限りのチェックのための脱出ハッチ |
レコード
ツール | 説明 |
| 合計、解決済みと未解決の比較、タイプ別の内訳、最近のエントリ |
| より広いテーブルビューと、現在開いているレコードとそのエクスポージャ |
パラメータ — PARAMS_SCHEMA がマニフェストを指している場合にのみ登録されます
ツール | 説明 |
| このデプロイが調整可能と宣言しているものと、現在オーバーライドされているもの |
| マニフェストに対して検証された1つのオーバーライドを書き込む |
| 1つのオーバーライド、またはすべてを削除する |
チェーン — EVM_RPC_URL、WALLET_ADDRESS、TOKEN_CONTRACT がすべて設定されている場合にのみ登録されます
ツール | 説明 |
| 監視アドレスの読み取り専用の ERC-20 およびネイティブ残高。署名は一切行われません |
インストール
git clone https://github.com/WillyV347/approval-gate-mcp
cd approval-gate-mcp
pip install -r requirements.txt
cp .env.example .env # then edit itクライアントに組み込む前に、インスペクタで試してください:
fastmcp dev server.py次に登録します。JSON設定を読み取るクライアントの場合:
{
"mcpServers": {
"approval-gate": {
"command": "python3",
"args": ["/absolute/path/to/approval-gate-mcp/server.py"],
"env": {
"VPS_HOST": "your.host.or.ip",
"VPS_USER": "your-ssh-user",
"PROCESS_DIR": "/srv/my-process",
"PROCESS_MATCH": "my_process.py",
"PARAMS_SCHEMA": "/absolute/path/to/params.schema.json"
}
}
}
}VPS_HOST、VPS_USER、PROCESS_DIR にデフォルト値はありません。 これらがない場合、サーバーは明確なメッセージを表示して終了します。作者が組み込んだホストに黙ってフォールバックする監視ツールはバグです。そのため、このツールは推測することを拒否します。
認証は既存のSSH設定を使用します。サーバーはシステムの ssh バイナリをシェルで呼び出すため、エージェント、ハードウェアキー、エージェントを公開するパスワードマネージャーはすべてそのまま動作します。秘密鍵を直接読み取ることはありません。
プロセスが実装する契約
プロセス側で必要なものは3つです。どれもライブラリは必要ありません。
1. レコード。 JSON配列に追加します。4つのキーが存在する場合は解釈され、それ以外はすべてそのまま引き継がれます:
[
{
"id": "job-1041",
"record_type": "reindex",
"resolved": true,
"outcome": "win",
"cost": 4.25,
"result": 11.80,
"label": "nightly reindex, shard 3"
}
]2. 提案。 承認モードで実行する場合、実行する代わりにここに書き込みます:
{
"proposals": [
{
"id": "job-1042",
"label": "reindex shard 7",
"action": "reindex",
"cost": 6.00,
"created_at": "2026-08-18T22:14:07Z"
}
]
}含めたすべてのフィールドが表示されます。サーバーには提案のスキーマはなく、必要としません。
3. 承認済みファイルをポーリングします。 サイクルごとに approved.json を読み取り、そこにあるものに基づいてアクションを実行し、クリアします。おおよそ次のようになります:
approved = read_json(APPROVED_FILE) or {"proposals": []}
for proposal in approved["proposals"]:
execute(proposal)
write_json(APPROVED_FILE, {"proposals": []})順序はサーバー側で意図的に決められています。決定により、approved.json に書き込む前に提案が pending.json から削除されるため、決定が途中で完了しなかった場合の障害モードは提案のドロップであり、アクションの重複は発生しません。
パラメータ、そしてこのリポジトリにパラメータがない理由
ホットリロードは、サーバーが何を調整可能かを認識している場合にのみ役立ちます。また、あるデプロイのパラメータを共有ツールにハードコーディングすると、単一目的になってしまいます。そのため、マニフェストでパラメータを宣言し、PARAMS_SCHEMA をそこに向けます:
{
"poll_interval_seconds": { "type": "int", "description": "Seconds between work cycles" },
"max_concurrent_jobs": { "type": "int", "description": "Jobs in flight at once" },
"dry_run": { "type": "bool", "description": "Plan work but do not execute" },
"approval_mode": { "type": "bool", "description": "Queue proposals instead of acting" }
}サポートされている型は int、float、bool、str、dict、list です。set_param はこれに対して型を強制して検証し、変換できないものは拒否します。マニフェストがない場合、パラメータツールは単に登録されません。これは、チェックするものがない書き込みパスを公開するよりも優れています。
params.schema.json は gitignore されています。あなたのチューニングはあなたのものだからです。params.schema.example.json が開始点として同梱されています。
プロセスに起動時にオーバーライドファイルを読み込ませ、再起動せずに変更を反映したい場合は毎サイクル読み込ませます:
overrides = read_json(PARAMS_FILE) or {}
poll_interval = overrides.get("poll_interval_seconds", POLL_INTERVAL_DEFAULT)セッション例
> is it running?
Process RUNNING
PID: 31882
Uptime: 14h 22m (51720s)
CPU: 0.6%
Memory: 84.3 MB
Disk: 212M
Last log: 2026-08-18 22:03:11 cycle complete, 2 proposals queued
> anything waiting on me?
2 proposal(s) awaiting approval
--- Proposal #0 ------------------------------
id: job-1042
label: reindex shard 7
action: reindex
cost: 6.00
created_at: 2026-08-18T22:14:07Z
--- Proposal #1 ------------------------------
id: job-1043
label: reindex shard 12
action: reindex
cost: 6.00
created_at: 2026-08-18T22:14:07Z
Use approve(index) or reject(index) to decide.
> approve 0, reject 1
Approved and queued for execution: reindex shard 7
Rejected and removed: reindex shard 12上記の出力はあくまで例です。
安全性に関する注意事項
run_commandはリモートホスト上で任意のシェルを実行します。これは、代替手段が結局ターミナルを開くことになるため存在しますが、ここで最も危険なツールです。すべてを root で実行するのではなく、SSH ユーザーを実際に必要な範囲に制限してください。wallet_balanceは読み取り専用で、キーに触れることはありません。設定しない場合、存在しません。このリポジトリには資格情報を保存するものはありません。RPC URL はパスにプロバイダーキーを含むため、
EVM_RPC_URLは環境変数に保持し、設定ファイルには含めないでください。StrictHostKeyCheckingはaccept-newに設定されています。不明なホストは初回接続時に信頼され、変更されたホストキーは引き続き失敗します。より厳密な動作が必要な場合は、yesに設定し、known_hostsを事前に設定してください。
ライセンス
MIT
This server cannot be installed
Maintenance
Resources
Unclaimed servers have limited discoverability.
Looking for Admin?
If you are the server author, to access and configure the admin panel.
Related MCP Connectors
Control plane for autonomous software labor. Agents claim objectives over MCP with audit trail.
A paid remote MCP for CLI tool MCP, built to return verdicts, receipts, usage logs, and audit-ready
A paid remote MCP for hosted MCP server, built to return verdicts, receipts, usage logs, and audit-r
Latest Blog Posts
- Who's Calling? MCP Hosts Are an Identity Blind Spot (And the Spec Knows It)By Om-Shree-0709 on .mcpAgent IdentityOAuth 2.1
- Your AI Chatbot Just Exposed Your CEO's Salary to an InternBy Om-Shree-0709 on .Agent IdentityMCP SecurityOAuth Delegation
- Why MCP Servers Need Execution Sandboxing (And Why Your Current Stack Isn't Enough)By Om-Shree-0709 on .Agentic AiPrompt InjectionWebAssembly
MCP directory API
We provide all the information about MCP servers via our MCP API.
curl -X GET 'https://glama.ai/api/mcp/v1/servers/WillyV347/approval-gate-mcp'
If you have feedback or need assistance with the MCP directory API, please join our Discord server