OWASP ZAP MCP Server について
OWASP ZAP MCP Serverは、AIエージェントやMCPクライアントからOWASP ZAPを操作し、クロール、認証設定、検出結果やレポートの取得を行えます。ZAPのDockerコンテナ管理にも対応します。
主な機能
- 01OWASP ZAP用の45ツール
- 02スパイダーとアクティブスキャン
- 03アラート確認とスキャンレポート
- 04コンテキストと認証の設定
- 05Dockerコンテナのライフサイクル管理
活用シーン
- 01スキャン前のWebアプリのクロール
- 02ログインが必要な領域のスキャン
- 03リスクレベル別の検出結果確認
- 04HTML、JSON、XMLレポートの生成
MCP 対応
OWASP ZAPのスキャン、設定、レポート、Docker管理機能をMCPクライアント向けのツールとして公開します。
設定
ローカルサーバーの設定はどのクライアントでも共通です。コピーしてクライアントの MCP 設定ファイルに貼り付けてください。
このサーバーのパッケージやリモートエンドポイントはまだ取得できていません。プロジェクトの README の手順に従ってください。
ツール
ローカルサーバーのツールはマシン上で起動して初めて取得できます。メンテナーはまだツール一覧を提供していません。
詳細
dotnet-zap-mcp
OWASP ZAP 用の MCP(Model Context Protocol)サーバーです。AI エージェント(Claude、GitHub Copilot など)が MCP 経由で ZAP の脆弱性スキャンを実行できるようにします。
特長
- OWASP ZAP を操作する 45 個の MCP ツール(スキャン、アラート、スパイダー、Ajax スパイダー、コンテキスト、認証、レポートなど)
- Docker Compose の管理機能を内蔵(ツールを 1 回呼び出すだけで ZAP を起動/停止)
- 設定不要ですぐに利用可能:API キーを自動生成し、Docker アセットを展開
- MCP 対応のあらゆるクライアントで動作(Claude Desktop、VS Code など)
インストール
dotnet tool install -g dotnet-zap-mcp
前提条件
- .NET 10 SDK
docker composeに対応した Docker(Docker Engine または Docker Desktop)(内蔵の ZAP コンテナー管理を使用する場合)
設定
設定不要(推奨)
設定は不要です。エージェントが DockerComposeUp を呼び出すと、次の処理が自動的に実行されます。
- Docker アセットを
~/.zap-mcp/docker/に展開します - ランダムな API キーを生成します
- ZAP コンテナーを
localhost:8090で起動します - ZAP が正常な状態になるまで待機します
データの永続化
ZAP コンテナーでは、2 つの Docker 名前付きボリュームを使用します。
| ボリューム | コンテナーパス | 用途 |
|---|---|---|
zap-home | /home/zap/.ZAP | ZAP の設定、コンテキスト、セッション、スキャンポリシー(再起動後も保持) |
zap-data | /zap/wrk/data | レポート、セッションファイル、コンテキストのインポート/エクスポート用の共有ディレクトリ |
初回起動時には、テンプレートの config.xml が zap-home にコピーされます。2 回目以降の起動では API キーのみが更新され、ZAP を通じて行った変更(コンテキスト、認証設定、スキャンポリシーなど)は保持されます。
zap-data ボリュームには、次のものが含まれます。
reports/— 生成されたスキャンレポートsessions/— 保存された ZAP セッションcontexts/— エクスポートされたコンテキストファイル
Claude Desktop / Claude Code
MCP の設定に追加します。
{
"mcpServers": {
"zap": {
"command": "zap-mcp"
}
}
}
VS Code(Copilot)
.vscode/mcp.json に追加します。
{
"servers": {
"zap": {
"command": "zap-mcp"
}
}
}
既存の ZAP インスタンスを使用する場合
すでに ZAP インスタンスを実行している場合は、環境変数で接続情報を渡します。
{
"mcpServers": {
"zap": {
"command": "zap-mcp",
"env": {
"ZAP_BASE_URL": "http://localhost:8090",
"ZAP_API_KEY": "your-api-key"
}
}
}
}
利用可能なツール
Docker 管理
| ツール | パラメーター | 説明 |
|---|---|---|
DockerComposeUp | — | ZAP コンテナーを起動し、正常な状態になるまで待機します |
DockerComposeDown | — | ZAP コンテナーを停止して削除します |
DockerComposeStatus | — | コンテナーの状態を確認します |
DockerComposeLogs | tail | コンテナーの最近のログを取得します |
ZAP コア
| ツール | パラメーター | 説明 |
|---|---|---|
GetVersion | — | ZAP への接続を確認します |
GetHosts | — | 記録されたホストを一覧表示します |
GetSites | — | 記録されたサイトを一覧表示します |
GetUrls | baseUrl | ベース URL の記録済み URL を一覧表示します |
スパイダー
| ツール | パラメーター | 説明 |
|---|---|---|
StartSpider | url, maxChildren, recurse, subtreeOnly, contextName | ページをクロールして検出するスパイダースキャンを開始します |
GetSpiderStatus | scanId | スパイダーの進行状況を確認します(0~100%) |
GetSpiderResults | scanId | スパイダーが検出した URL を取得します |
StopSpider | scanId | 実行中のスパイダースキャンを停止します |
アクティブスキャン
| ツール | パラメーター | 説明 |
|---|---|---|
StartActiveScan | url, recurse, inScopeOnly, scanPolicyName, contextId | 脆弱性のアクティブスキャンを開始します |
GetActiveScanStatus | scanId | アクティブスキャンの進行状況を確認します(0~100%) |
StopActiveScan | scanId | 実行中のアクティブスキャンを停止します |
パッシブスキャン
| ツール | パラメーター | 説明 |
|---|---|---|
GetPassiveScanStatus | — | パッシブスキャンの進捗を確認します(残りレコード数) |
アラート
| ツール | パラメーター | 説明 |
|---|---|---|
GetAlertsSummary | baseUrl | リスクレベル別のアラート件数 |
GetAlerts | baseUrl, start, count, riskId | ページネーションとリスクフィルターに対応した詳細なアラート一覧 |
レポート
| ツール | パラメーター | 説明 |
|---|---|---|
GetHtmlReport | — | HTML スキャンレポートを生成します |
GetJsonReport | — | JSON スキャンレポートを生成します |
GetXmlReport | — | XML スキャンレポートを生成します |
コンテキスト管理
| ツール | パラメーター | 説明 |
|---|---|---|
GetContextList | — | ZAP で定義されているすべてのコンテキストを一覧表示します |
GetContext | contextName | コンテキストの詳細(スコープパターンなど)を取得します |
CreateContext | contextName | 新しいコンテキストを作成します |
RemoveContext | contextName | コンテキストを削除します |
IncludeInContext | contextName, regex | コンテキストのスコープに URL の包含パターンを追加します |
ExcludeFromContext | contextName, regex | コンテキストのスコープに URL の除外パターンを追加します |
ImportContext | contextFilePath | コンテキストファイルを ZAP にインポートします |
ExportContext | contextName, contextFilePath | コンテキストをファイルにエクスポートします |
認証
| ツール | パラメーター | 説明 |
|---|---|---|
GetAuthenticationMethod | contextId | コンテキストに設定されている認証方式を取得します |
SetAuthenticationMethod | contextId, authMethodName, authMethodConfigParams | 認証方式を設定します(フォームベース、JSON ベース、スクリプトベース、HTTP) |
SetLoggedInIndicator | contextId, loggedInIndicatorRegex | ログイン状態を示す正規表現パターンを設定します |
SetLoggedOutIndicator | contextId, loggedOutIndicatorRegex | ログアウト状態を示す正規表現パターンを設定します |
ユーザー
| ツール | パラメーター | 説明 |
|---|---|---|
GetUsersList | contextId | コンテキストのすべてのユーザーを一覧表示します |
CreateUser | contextId, name | 新しいユーザーを作成します |
RemoveUser | contextId, userId | ユーザーを削除します |
SetAuthenticationCredentials | contextId, userId, authCredentialsConfigParams | ユーザーの認証情報(ユーザー名/パスワード)を設定します |
SetUserEnabled | contextId, userId, enabled | ユーザーを有効または無効にします |
強制ユーザー
| ツール | パラメーター | 説明 |
|---|---|---|
SetForcedUser | contextId, userId | コンテキストの強制ユーザーを設定します |
SetForcedUserModeEnabled | enabled | 強制ユーザーモードを全体的に有効または無効にします |
GetForcedUserStatus | contextId | 強制ユーザーモードの状態と現在の強制ユーザーを取得します |
Ajax スパイダー
| ツール | パラメーター | 説明 |
|---|---|---|
StartAjaxSpider | url, inScope, contextName, subtreeOnly | JavaScript を多用するアプリ向けに Ajax スパイダーを開始します |
StartAjaxSpiderAsUser | contextName, userId, url, subtreeOnly | 特定のユーザーとして Ajax スパイダーを開始します |
GetAjaxSpiderStatus | — | Ajax スパイダーの状態(実行中/停止)を取得します |
GetAjaxSpiderResults | — | Ajax スパイダーの結果の概要を取得します |
StopAjaxSpider | — | Ajax スパイダーを停止します |
一般的なワークフロー
- エージェントが
DockerComposeUpを呼び出して ZAP を起動します - ブラウザー/Playwright が ZAP をプロキシ(
http://127.0.0.1:8090)として使用するよう設定します - プロキシ経由で対象アプリケーションを閲覧します
- エージェントが
StartSpiderを呼び出してアプリケーションをクロールし、その後GetSpiderStatusを呼び出して進行状況を監視します - エージェントが
GetPassiveScanStatusを呼び出し、パッシブスキャンの完了を待ちます - エージェントが主要なページで
StartActiveScanを呼び出し、その後GetActiveScanStatusを呼び出して進行状況を監視します - エージェントが
GetAlertsSummaryとGetAlertsを呼び出して、脆弱性の検出結果を取得します - エージェントが
GetHtmlReportまたはGetJsonReportを呼び出して、スキャンレポートを生成します - 完了したら、エージェントが
DockerComposeDownを呼び出します
注: ZAP の設定(コンテキスト、認証、スキャンポリシー)は
zap-homeDocker ボリュームに保持されます。設定を失うことなく、コンテナーを停止して再起動できます。
試してみる(付属の脆弱性を含むアプリを使用)
このリポジトリには、ZAP のスキャンを試すための、意図的に脆弱性を含めた Web アプリケーションが含まれています。このアプリには一般的な脆弱性(XSS、SQL インジェクション、CSRF、オープンリダイレクト)が含まれているため、ZAP で実際の検出結果を確認できます。
セットアップ
# Start ZAP and the vulnerable target app
docker compose -f tests/docker/docker-compose.test.yml up -d --build
# Wait until both containers are healthy
docker compose -f tests/docker/docker-compose.test.yml ps
次に、この ZAP インスタンスに接続するよう MCP クライアントを設定します。
{
"mcpServers": {
"zap": {
"command": "zap-mcp",
"env": {
"ZAP_BASE_URL": "http://localhost:8090",
"ZAP_API_KEY": "test-api-key-for-ci"
}
}
}
}
脆弱性を含むアプリには、Docker ネットワーク内(ZAP が使用)からは
http://targetで、ホストマシンからはhttp://localhost:8080でアクセスできます。
例 1:クイックスキャン
エージェントへのプロンプト:
http://target をスキャンして脆弱性を調べてください。スパイダークロールを実行し、パッシブスキャンが完了するまで待ってから、アラートの概要を表示し、HTML レポートを生成してください。
想定されるツールの流れ:
GetVersion → Verify ZAP connectivity
StartSpider → url: "http://target"
GetSpiderStatus → Poll until 100%
GetPassiveScanStatus → Poll until 0 records remaining
GetAlertsSummary → baseUrl: "http://target"
GetAlerts → baseUrl: "http://target"
GetHtmlReport → Generate report
ZAP は /search、/login、/users、/about、/contact などのページを検出し、パッシブスキャンではセキュリティヘッダーの欠如や CSRF 脆弱性などが報告されます。
例 2:認証付きスキャン
/admin ページへのアクセスにはログインが必要です(ユーザー名:admin、パスワード:password)。認証付きスキャンを行うと、ZAP から保護されたページにアクセスできるようになります。
エージェントへのプロンプト:
http://target の認証付きスキャンを設定してください。ログインフォームは /login にあり、フィールドは "username" と "password" です(認証情報:admin / password)。ログイン済みを示す表示は "Welcome, admin" です。認証を設定した後、認証済みユーザーとしてサイトをスパイダーでクロールし、アクティブスキャンを実行してください。
想定されるツールの流れ:
CreateContext → contextName: "target-auth"
IncludeInContext → regex: "http://target.*"
SetAuthenticationMethod → contextId, authMethodName: "formBasedAuthentication",
authMethodConfigParams: "loginUrl=http://target/login&loginRequestData=username%3D%7B%25username%25%7D%26password%3D%7B%25password%25%7D"
SetLoggedInIndicator → loggedInIndicatorRegex: "Welcome, admin"
CreateUser → contextId, name: "admin"
SetAuthenticationCredentials → contextId, userId, authCredentialsConfigParams: "username=admin&password=password"
SetUserEnabled → contextId, userId, enabled: true
SetForcedUser → contextId, userId
SetForcedUserModeEnabled → enabled: true
StartSpider → url: "http://target", contextName: "target-auth"
GetSpiderStatus → Poll until 100%
GetPassiveScanStatus → Poll until 0 records remaining
StartActiveScan → url: "http://target"
GetActiveScanStatus → Poll until 100%
GetAlertsSummary → baseUrl: "http://target"
GetAlerts → baseUrl: "http://target"
SetForcedUserModeEnabled → enabled: false
認証を設定すると、ZAP は /admin にアクセスし、ログイン後に表示されるページの脆弱性をテストできます。
例 3:包括的な脆弱性評価
エージェントへのプロンプト:
http://target の包括的な脆弱性評価を実施してください。サイトをクロールし、アクティブスキャンを実行してから、検出されたすべての脆弱性をリスクレベル別に分類し、詳しく説明してください。
想定されるツールの流れ:
StartSpider → url: "http://target", recurse: true
GetSpiderStatus → Poll until 100%
GetSpiderResults → Review discovered URLs
GetPassiveScanStatus → Poll until 0 records remaining
StartActiveScan → url: "http://target", recurse: true
GetActiveScanStatus → Poll until 100%
GetAlertsSummary → baseUrl: "http://target"
GetAlerts → baseUrl: "http://target", riskId: "3" (High)
GetAlerts → baseUrl: "http://target", riskId: "2" (Medium)
GetAlerts → baseUrl: "http://target", riskId: "1" (Low)
GetHtmlReport → Generate final report
アクティブスキャンでは、次のような脆弱性が検出されます。
- 高:SQL インジェクション(
/users?id=)、クロスサイトスクリプティング(/search?q=) - 中:CSRF(
/loginにトークンがない)、オープンリダイレクト(/redirect?url=) - 低/情報:セキュリティヘッダーの欠如、Cookie の問題など
クリーンアップ
docker compose -f tests/docker/docker-compose.test.yml down -v
ライセンス
コメント
AI アプリケーションが外部のツールやデータソースに統一的な方法で接続するためのオープンなプロトコルです。クライアントはモデルとの対話を担い、MCP サーバーはツール・リソース・プロンプトテンプレートを提供します。標準メッセージでやり取りするため、1 つのサーバーを複数のクライアントで再利用できます。