Skip to main content
Glama

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

Related MCP server: conduit-mcp

ツール

承認ゲート

ツール

説明

list_pending_approvals

決定を待つすべての提案とその全フィールド

approve(index)

1つの提案を承認済みファイルに移動する

reject(index)

1つの提案を破棄する

プロセス制御

ツール

説明

process_status

実行中かどうか、PID、稼働時間、CPU、メモリ、ディスク、最後のログ行

process_logs(lines)

ログファイルをテールする

restart_process

開始スクリプトで再起動。SSHセッションが切れても残るようデタッチ

run_command(cmd)

1回限りのチェックのための脱出ハッチ

レコード

ツール

説明

record_summary(n)

合計、解決済みと未解決の比較、タイプ別の内訳、最近のエントリ

record_dashboard

より広いテーブルビューと、現在開いているレコードとそのエクスポージャ

パラメータ — PARAMS_SCHEMA がマニフェストを指している場合にのみ登録されます

ツール

説明

list_params

このデプロイが調整可能と宣言しているものと、現在オーバーライドされているもの

set_param(name, value)

マニフェストに対して検証された1つのオーバーライドを書き込む

clear_param(name)

1つのオーバーライド、またはすべてを削除する

チェーン — EVM_RPC_URL、WALLET_ADDRESS、TOKEN_CONTRACT がすべて設定されている場合にのみ登録されます

ツール

説明

wallet_balance

監視アドレスの読み取り専用の 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

Related MCP Connectors

Related MCP Servers

  • F
    license
    Not graded
    quality
    D
    maintenance
    MCP server that enforces governance on agentic decisions with auditable evidence records, providing tools for understanding, calibrating confidence, and navigating handoffs based on policy.
    -
  • A
    license
    Not graded
    quality
    C
    maintenance
    A governance-layer MCP server that gates AI writes to systems of record, requiring human signatures and providing a tamper-evident audit trail. It offers read, propose, approve, commit, and audit tools, with demo and Xero backends.
    69 npm
    MIT
  • A
    license
    Not graded
    quality
    C
    maintenance
    MCP server that provides human-in-the-loop approval for risky AI agent actions, with durable state and audit logs.
    MIT
  • A
    license
    Not graded
    quality
    A
    maintenance
    MCP server that adds a trust layer to AI agent memory, enforcing independent review and tamper-evident audit chains for any memory store. It provides tools to search, get, propose, and promote memories under governance rules.
    37 PyPI
    MIT