Keel について
Keelは、許可を得たセキュリティテスト向けのMCP制御レイヤーです。スキャナーの検出結果を統合し、通信量を制限して検証できます。セマンティック重複排除、ホスト単位のレート制限、読み取り専用の検証フローを備えます。
主な機能
- 01重複する検出結果のセマンティック統合
- 02ホスト単位のリクエストレート制限
- 03スキャンの段階的なスケジュール
- 04悪用可能性と不足証拠の評価
- 05GET専用フローによる安全な検証
活用シーン
- 01複数スキャナーの重複検出結果の整理
- 02範囲と通信量を制限したホストスキャン
- 03テスト用アカウントとカナリアによる問題の検証
MCP 対応
Keelは、テスト範囲の登録、スキャンのスケジュール、検出結果の照会、読み取り専用の検証フローを行う13個のMCPツールを提供します。スキャナーの出力をセマンティックカードにまとめ、再現用のcurlコマンドを生成します。
設定
ローカルサーバーの設定はどのクライアントでも共通です。コピーしてクライアントの MCP 設定ファイルに貼り付けてください。
ツール
13掲載時のツール一覧 · 2 週間前に更新
| パラメーター | 型 | 必須 | 説明 |
|---|---|---|---|
| scope_hosts | array | はい | |
| engagement_id | string | はい | |
| exclude_hosts | any | いいえ | |
| allow_safe_proof | boolean | いいえ | |
| max_wave_seconds | integer | いいえ | |
| tester_account_a | string | いいえ | |
| tester_account_b | string | いいえ | |
| max_wave_attempts | integer | いいえ | |
| max_wave_requests | integer | いいえ | |
| max_parallel_hosts | integer | いいえ | |
| max_proof_requests | integer | いいえ | |
| max_response_bytes | integer | いいえ | |
| operator_confirmed | boolean | いいえ | |
| nuclei_template_ids | any | いいえ | |
| requests_per_second | number | いいえ | |
| max_engagement_requests | integer | いいえ |
詳細
Keel
スキャナーのノイズを、ハンター品質の非破壊な証拠に変える MCP コントロールプレーン
13 個の MCP ツール。セマンティック重複排除。ホストごとのレート制限。対象に損害を与えず、ハンターが何をできるかを示す安全な証明。
Keel を選ぶ理由 · インストール · クライアント · 証明 · ツール
エージェントに 150 個のツールを渡すのは簡単です。難しいのは、ツール間の重複排除、悪用可能な問題とノイズの見分け、そして対象に過剰な負荷をかけないことです。Keel は、この 3 つを担うコントロールプレーンです。
AI クライアントは httpx、nuclei、シェルではなく、Keel と通信します。Keel は一度に 1 つのウェーブを作成し、スコープとレート制限を適用し、スキャナーの検出結果をセマンティックカードに統合して、テスター所有のデータに対して GET のみのプレイブックを実行します。プレイブックが proven を返すと、ハンターがたどれる curl リプレイを取得できます。それでも、書き込み、シェル、ペイロードの大量送信は行いません。
テストを許可されたプログラムで使用してください。
Keel を選ぶ理由
| 難しい問題 | スキャナーの出力で起きること | Keel の動作 |
|---|---|---|
| ツール間の重複排除 | 1 行につき Nuclei テンプレート ID が 1 つ。同じ IDOR が 5 回表示される | 脆弱性クラス、正規化されたルート、メソッド、パラメーターからセマンティックキーを作成します。UUID/id/16 進数のトークンをまとめます。互換性のある観測結果を統合します。 |
| 悪用可能な問題とノイズの見分け | 深刻度が高い =「すぐに出荷」 | カードは observed → hypothesis → corroborated → proven/refuted の順に進みます。情報提供やハードニングに関する結果は非表示になります。型付きの悪用可能性評価で、不足している証拠とネガティブコントロールを明示します。 |
| 対象に過剰な負荷をかけないこと | すべてのテンプレートを一度に実行し、429 で再試行する | ホストごとにアクティブなウェーブは 1 つだけです。トークンバケット、Nuclei の並列実行数 1、OAST なし、リダイレクトなし、署名なしのテンプレートなし、dos/fuzz/bruteforce/intrusive タグなし。HTTP 429 が発生するとクールダウンに入ります。 |
巨大なツールボックスをシェル経由で実行するラッパーには、このレイヤーがありません。Keel はスケジューラー、アダプター、証明ブローカーにこのレイヤーを備えています。
アーキテクチャ
flowchart TD
A[AI coding client] -->|stdio MCP| B[Keel]
B --> C[Scope and rate gate]
C --> W[Background job and wave scheduler]
W --> H[httpx: one target]
W --> N[nuclei: HTTP templates, bounded]
C --> P[Proof broker: GET only]
P --> T[Tester-owned resource]
H --> S[Semantic card store]
N --> S
P --> S
S --> Q[Triage and evidence states]
- テストを許可されたホスト名を指定して
begin_engagementを実行します。 draft_wavesが、到達可能性の確認とテンプレートのマイクロウェーブを提案します。この時点ではトラフィックは発生しません。execute_waveはジョブをすぐに返します。wave_statusをポーリングしてください。cancel_waveはスキャナーを停止します。query_cardsはハンターに関連するカードを返します。assess_exploitabilityは、何を証明すればよいかを示します。draft_proofの後にexecute_proofを実行すると、テスターのデータに対して GET のみのプレイブックを実行します。provenは不変条件が維持されたことを意味します。protectedは制御が機能したことを意味します。
インストール
macOS(Homebrew)。pipx は別のツールなので、先にインストールしてください。Apple の /usr/bin/python3 は 3.9 であることが多く、Keel をインストールできません。
brew install pipx [email protected]
pipx ensurepath
# open a new terminal, then:
pipx install keel-pentest
keel-pentest setup
keel-pentest doctor
マシンに python3.12 がすでにあり、Homebrew pipx を使いたくない場合:
python3.12 -m pip install --user pipx
python3.12 -m pipx ensurepath
python3.12 -m pipx install keel-pentest
setup は ProjectDiscovery の httpx と nuclei を ~/.keel/bin にダウンロードします。Keel は、GUI クライアントの PATH が最小限でも、そこにあるツールを見つけます。最初のスキャンに追加の KEEL_HTTPX_BIN は必要ありません。
次に、MCP クライアントで keel-pentest 実行ファイルを指定します。
claude mcp add --scope user --transport stdio keel -- keel-pentest
codex mcp add keel -- keel-pentest
hermes mcp add keel --command keel-pentest
OpenCode:「"command": ["keel-pentest"]」。
Python 3.10 以降。pip install keel は実行しないでください。別のプロジェクトです。OS に関する注意事項と pip/venv については、INSTALL.md をご覧ください。クライアントの形式については、clients/README.md をご覧ください。
必要に応じて後から、スコープ、テンプレート ID、証明対象を固定するチーム用マニフェストに KEEL_APPROVAL_FILE を設定できます。デフォルトモードでは自己申告で承認します。begin_engagement が承認にあたります。レート制限、ホストごとに1ウェーブ、署名済みテンプレート、サニタイズ済み証拠は引き続き適用されます。
影響を証明できる、安全な検証
スキャナーの出力は仮説です。Keel は使い捨てのテスターアカウントと一意のカナリアを使って、それを証明(または反証)します。すべてのプレイブックは GET のみを使用し、予算が設定されており、curl で再現する手順を返します。再現手順は報告書の成果物です。「これが修正されていなければ、一般的なアカウントを持つハンターはこれを実行できます」。
| プレイブック | 証明する内容 | 損害を与えない方法 |
|---|---|---|
cross_account_read | IDOR/BOLA | テスター A が自身のカナリアを読み込み、テスター B が同じ A 所有の URL に GET リクエストを送信します。同一のカナリアと 2xx が確認されると proven です。401/403/404、またはカナリアを含まない 2xx は protected(反証済み)です。 |
reflected_marker | 反射型 XSS/HTML インジェクション | 無害な <keel> プローブと一意のマーカーを挿入します。エスケープされずに反射されると proven です。HTML エンコードされて反射されると protected です。制御用 GET の応答に、あらかじめプローブが含まれていてはいけません。 |
open_redirect_canary | オープンリダイレクト | リダイレクトパラメーターの転送先を https://keel-proof.invalid/<marker> に設定します。Location のホストがそのカナリアになっている 3xx は proven です。 |
unauth_access_probe | authZ の欠如 | テスター A によるベースラインではカナリアが確認でき、同じ URL に認証情報なしでアクセスした場合には確認できてはいけません。認証なしで 2xx とカナリアが確認されると proven です。 |
own_session_marker | 到達可能性のみ | A が自身のカナリアを読み込みます。これは corroborated となり、脆弱性の証明にはなりません。 |
execute_proof は、ステータスコード、カナリアの真偽値、切り詰めフラグ、ハッシュ、ハンターへの影響を説明するテキスト、再現スクリプトを保存します。応答本文やシークレットは保存しません。
cross_account_read/unauth_access_probe の前に、テスターが所有するオブジェクトにシークレットではないカナリアを設定してください。反射型 XSS とオープンリダイレクトでは、マーカーが自動的に挿入されます。
MCP ツール
| ツール | 役割 |
|---|---|
begin_engagement | スコープとトラフィック上限を登録します |
draft_waves | 到達可能性とテンプレートのマイクロウェーブを提案します。トラフィックは発生しません |
execute_wave | バックグラウンドジョブを1つキューに追加します |
wave_status | 段階、進捗、結果を表示します。job_id を省略すると一覧表示します |
cancel_wave | キューに追加済み、または実行中のスキャナーを停止します |
query_cards | 優先度付けされた意味的なカードを返します |
second_look | 起点となった Nuclei テンプレートのみを再実行します |
assess_exploitability | 影響候補、不足している証拠、ネガティブコントロール、プレイブックを評価します |
state_impact | ハンターの仮説を記録します |
draft_proof | 許可リストに基づく証明プランを作成します。トラフィックは発生しません |
execute_proof | GET のみを使用するプレイブックを実行します |
engagement_health | クールダウン、予算、保留中のウェーブを確認します |
engagement_audit | アプリケーションイベントを追記のみで記録します |
begin_engagement には、engagement_id と scope_hosts(target.example などのホスト名のみ)が必要です。デフォルトは、3 req/s、同時に1ホスト、1ウェーブあたり120秒/120リクエストです。allow_safe_proof=true にすると証明が有効になります。テスターの認証情報は「名前」のみを渡し、シークレットは KEEL_CREDENTIALS_FILE に保存してください。
プロンプトの例
Use only Keel MCP tools. Do not shell out to httpx, nuclei, curl, or exploit tools.
1. begin_engagement for bb-2026-01 with scope_hosts ["target.example"], 3 req/s.
Set allow_safe_proof true if I will run proofs.
2. draft_waves for https://target.example.
3. execute_wave for each wave. Poll wave_status until completed, retryable_failed,
terminal_failed, or cancelled.
4. query_cards (include_noise false), then assess_exploitability on candidates.
5. For a card with a safe playbook, draft_proof then execute_proof using tester
credential names and the canary I planted. Treat protected as refuted.
6. Summarize duplicates, evidence state, hunter_impact, and the repro_script.
Claim exploitable only when Keel reports proven.
トラフィック制御
- draft、admit、ingest、proof における正確なスコープと除外項目
- ホストごとに一度に1つのウェーブを実行し、同一ホストのジョブは待機します
- グローバルおよびホストごとのトークンバケットを共有します
- リクエスト予約を永続化します。リトライでは新たな予約を消費します
- Nuclei:署名済みHTTPテンプレートを使用し、OAST、リダイレクト、リトライを無効にして、dos/fuzz/bruteforce/intrusive を除外します
- 空のスキャナー設定を分離し、プロキシとProjectDiscovery-cloudの環境変数を削除します
- HTTP 429が発生するとウェーブを停止し、Retry-Afterに従います
- レスポンスの読み取りを制限し、生のボディを含めずに証拠を保存します
トラブルシューティング
keel-pentest doctor
keel-pentest setup # if doctor reports missing httpx/nuclei
クライアントの再起動後にbegin_engagementを実行すると、SQLiteのエンゲージメントが復元されます。スコープを変更した場合は、新しいengagement_idを使用してください。
proof にはallow_safe_proof=trueが必要です。また、セッションプレイブックでは、tester-aなどの名前をAuthorizationまたはCookieに対応付けるKEEL_CREDENTIALS_FILEが必要です。
ライセンス
MIT。Copyright (c) 2026 Lutfi Z.P.
PyPI:keel-pentest。MCP Registry:io.github.lutfizp/keel。ソース:github.com/lutfizp/keel。
コメント
AI アプリケーションが外部のツールやデータソースに統一的な方法で接続するためのオープンなプロトコルです。クライアントはモデルとの対話を担い、MCP サーバーはツール・リソース・プロンプトテンプレートを提供します。標準メッセージでやり取りするため、1 つのサーバーを複数のクライアントで再利用できます。