OWASP ZAP を AI エージェントから操作できる MCP サーバー dotnet-zap-mcp を作って、NuGet に公開しました。
dotnet tool install -g dotnet-zap-mcp
できること
Claude や GitHub Copilot などの AI エージェントに自然言語で指示するだけで、OWASP ZAP を使った Web アプリの脆弱性スキャンを実行できます。スパイダークロール、パッシブ / アクティブスキャン、認証済みスキャン、レポート生成まで、エージェントが状況に応じて必要なツールを呼び出します。
なぜ作ったか
ZAP 自体は非常に強力なツールですが、「使いこなすには操作を覚える必要がある」「開発フローに組み込むにはひと手間かかる」というハードルがありました。
MCP を使って ZAP を AI エージェントから操作するアプローチはすでに海外でいくつか実装されていますが、.NET エコシステム向けのものはありませんでした。dotnet-zap-mcp が目指したのは、開発者がすぐに試せることと、ZAP の知識がなくても開発サイクルに組み込めることです。もちろん.NET開発者でなくても簡単に導入、利用可能です。
-
dotnet tool installの 1 コマンドで導入完了 - ZAP コンテナの起動・停止もエージェントが自動で行う
- 設定ファイルへの追記だけで Claude Desktop / VS Code Copilot から使える
この記事でやること
- セットアップ
- 基本スキャン — 内蔵の脆弱アプリで動作を確認する
- 認証スキャン — ログインが必要なページも診断する
- 開発サイクルへの組み込み方
セットアップ
前提条件
- .NET 10 SDK
- Docker(Docker Engine または Docker Desktop)
インストール
dotnet tool install -g dotnet-zap-mcp
AI クライアントへの設定追加
Claude Desktop の場合、claude_desktop_config.json に追記します。
{
"mcpServers": {
"zap": {
"command": "zap-mcp"
}
}
}
VS Code(GitHub Copilot) の場合、.vscode/mcp.json に追記します。
{
"servers": {
"zap": {
"command": "zap-mcp"
}
}
}
設定を追加したらクライアントを再起動します。これだけです。ZAP のインストールや API キーの設定は不要です。エージェントが初めてスキャンを実行するとき、ZAP コンテナの起動から自動で行います。
補足: すでに ZAP を別途起動している場合は、環境変数
ZAP_BASE_URLとZAP_API_KEYを指定することで既存のインスタンスに接続することもできます。
基本スキャン
まず動作を確認するために、リポジトリに内蔵されている脆弱なサンプルアプリを使います。XSS・SQL インジェクション・CSRF・オープンリダイレクトといった一般的な脆弱性を意図的に含んだアプリです。
テスト環境の起動
docker compose -f tests/docker/docker-compose.test.yml up -d --build
起動後、http://localhost:8080 からアプリにアクセスできます(ZAP からはコンテナ内ホスト名 http://target でアクセスします)。
エージェントへの指示
AI クライアントのチャットに次のように入力します。
http://target をスキャンしてください。
スパイダーでクロールし、パッシブスキャンが完了したら
アラートのサマリーを表示して、HTML レポートを生成してください。
エージェントは以下の順にツールを呼び出します。
DockerComposeUp → ZAP コンテナを起動
GetVersion → ZAP への接続を確認
StartSpider → クロール開始(url: "http://target")
GetSpiderStatus → 完了まで進捗を監視
GetPassiveScanStatus → パッシブスキャン完了まで待機
GetAlertsSummary → リスクレベル別のアラート数を取得
GetAlerts → アラートの詳細一覧を取得
GetHtmlReport → HTML レポートを生成
スキャンが完了すると、ZAP は /search・/login・/users などのページを発見し、セキュリティヘッダーの欠落や CSRF トークンの未検証といった問題をパッシブスキャンで報告します。
認証スキャン
基本スキャンでは、ログインが必要なページには到達できません。/admin のように認証が必要なページも診断するには、ZAP に認証情報を設定する必要があります。通常これはかなり手間のかかる作業ですが、dotnet-zap-mcp ではエージェントへの指示だけで完結します。
エージェントへの指示
http://target の認証スキャンを設定してください。
ログインフォームは /login にあり、
フィールドは username と password です(認証情報: admin / password)。
ログイン成功の判定には "Welcome, admin" という文字列を使ってください。
認証設定が完了したら、認証済みユーザーでスパイダーを実行し、
アクティブスキャンまで行ってください。
エージェントは以下の順にツールを呼び出します。
CreateContext → "target-auth" コンテキストを作成
IncludeInContext → スコープに "http://target.*" を追加
SetAuthenticationMethod → フォーム認証を設定
(loginUrl, loginRequestData を指定)
SetLoggedInIndicator → ログイン判定パターンを設定
CreateUser → ユーザー "admin" を作成
SetAuthenticationCredentials → 認証情報(admin / password)を設定
SetUserEnabled → ユーザーを有効化
SetForcedUser → 強制ユーザーに設定
SetForcedUserModeEnabled → 強制ユーザーモードを有効化
StartSpider → 認証済みでクロール開始
GetSpiderStatus → 完了まで進捗を監視
GetPassiveScanStatus → パッシブスキャン完了まで待機
StartActiveScan → アクティブスキャン開始
GetActiveScanStatus → 完了まで進捗を監視
GetAlertsSummary → アラートのサマリーを取得
GetAlerts → アラートの詳細一覧を取得
SetForcedUserModeEnabled → 強制ユーザーモードを無効化
認証設定が完了すると ZAP は /admin にもアクセスできるようになり、ログイン後のページに潜む脆弱性も検出できます。これだけの設定を自然言語の指示だけで行えるのが、AI エージェントと組み合わせることの大きなメリットです。
開発サイクルへの組み込み方
dotnet-zap-mcp の使い方として、特別な「セキュリティ診断のフェーズ」を設ける必要はありません。すでに行っているテスト作業の延長として、自然に組み込めます。
パターン1: E2E テストとスキャンを同時に行う
E2E テストのブラウザプロキシを ZAP に向けることで、テストの実行とパッシブスキャンを同時に行えます。テストがアプリを操作するたびに ZAP がリクエスト/レスポンスを記録・分析するため、スパイダーでクロールするよりも実際のユーザー操作に即したスキャン結果が得られます。
Playwright を使っている場合、起動オプションにプロキシ設定を追加するだけです。
const browser = await chromium.launch({
proxy: { server: 'http://127.0.0.1:8090' }
});
さらに、Playwright MCP を併用すると E2E テスト自体もエージェントに任せられます。dotnet-zap-mcp と Playwright MCP を両方設定しておけば、次のような指示だけでテストとスキャンを一気に回せます。
http://localhost:5000 に対して、ログイン・商品一覧の閲覧・カートへの追加・
チェックアウトの一連の操作を Playwright で実行してください。
その間、ZAP のプロキシ(http://127.0.0.1:8090)を通すように設定し、
操作が完了したらパッシブスキャンの結果とアラートを教えてください。
テスト・スキャン・結果確認が同じエージェントセッションで完結します。
パターン2: PR を出す前のセルフチェックとして使う
実装が一段落したタイミングで、レビュー依頼の前にスキャンを一度かけます。
今回追加した /api/users エンドポイントをスキャンして、
気になる点があれば修正案と一緒に教えてください。
アラートの内容とコードが同じセッションに揃っているため、エージェントにそのまま修正案を聞けます。指摘を受けてコードを直し、もう一度スキャンして確認する、という反復が同一チャット内で回せます。
パターン3: 新しい認証フローを実装したときに確認する
ログイン機能や権限制御を新たに追加したタイミングで、認証スキャンを実行します。前述の認証スキャン設定を一度行えば、ZAP の Docker ボリュームにコンテキスト情報が保持されるため、次回以降は「スキャンして」と指示するだけで認証済みの状態から再開できます。
意識しておきたいこと
AI エージェントがスキャンを自動で進めてくれますが、検出結果の最終的な判断は人が行う必要があります。「このアラートは今回の変更と無関係」「誤検知の可能性がある」といった判断はエージェントに委ねきらず、レポートに目を通す習慣をセットで持つことをおすすめします。
完全な自動化というよりも、ZAP を使うための操作コストをゼロに近づけることで、「やろうと思えばいつでもできる」状態を作るのが dotnet-zap-mcp の狙いです。
注意事項
- dotnet-zap-mcp はローカルの開発環境での利用を想定しているため、トランスポートは stdio のみをサポートしています。
- ZAP のアクティブスキャンは対象アプリに実際にリクエストを送信します。必ず自分が管理するアプリのみを対象にしてください。
まとめ
ZAP の操作知識がなくても、AI エージェントへの自然言語の指示だけで脆弱性スキャンを回せる環境を、dotnet tool install の 1 コマンドで用意できます。
セキュリティ診断を特別なフェーズとして切り出すのではなく、コーディング・テスト・修正という普段の開発リズムの中に溶け込ませる。そのための小さな入口として、試してみてもらえると嬉しいです。