OWASP ZAP MCP Server

io.github.pierre3Published by GitHub account pierre3v1.1.0Updated Oct 25, 2026

MCP server for OWASP ZAP vulnerability scanning with Docker management

Overview

AI-generated overview

MCP server that lets an AI assistant drive OWASP ZAP vulnerability scans, including spidering, active scans, alerts and reports, with built-in Docker management

What you can do
Start, stop, check status and read logs of a ZAP container through Docker Compose tools, or connect to an existing ZAP instance by URL and API key. Crawl targets with the standard and Ajax spiders, including as a specific logged-in user, and monitor scan progress. Run active and passive scans and stop them when needed. Read alerts by risk level with pagination and generate HTML, JSON or XML reports. Manage contexts, authentication methods, users, credentials and forced-user mode for authenticated scans.
When to use it
Useful when you want an assistant to run web application security scans against sites you are authorized to test, from a quick passive check to an authenticated active scan with a written report. It suits developers and testers who already use OWASP ZAP and want the scan workflow driven from a chat client.
Requirements
Runs locally as a .NET tool, so the .NET 10 SDK is required. Docker with docker compose support is needed for the built-in ZAP container management; otherwise point it at an existing ZAP instance with the ZAP_BASE_URL and ZAP_API_KEY environment variables. The API key is auto-generated when the container is started through the tool.
Before you install
Active scans send real attack traffic to the target, so only scan systems you own or have written permission to test. The server can start and remove Docker containers and delete contexts and users. Authenticated scans require storing target usernames and passwords through the credential tools, and the ZAP API key is a secret. The README includes an intentionally vulnerable app for practice; do not expose it.

Installation

In SourceWeft

  1. Open OWASP ZAP MCP Server in the dashboard and add it to a workspace.
  2. Enable the server for the chats that should use its tools.

Desktop only via STDIO. STDIO servers start a local process, so they need the SourceWeft desktop host.

Other MCP clients

Follow the launch instructions in the repository.

README

dotnet-zap-mcp

[NuGet] [NuGet Downloads] [Release]

MCP (Model Context Protocol) server for OWASP ZAP. Enables AI agents (Claude, GitHub Copilot, etc.) to drive ZAP vulnerability scanning via MCP.

Features

  • 45 MCP tools for controlling OWASP ZAP (scanning, alerts, spider, ajax spider, context, authentication, reports, etc.)
  • Built-in Docker Compose management (start/stop ZAP with a single tool call)
  • Zero-config setup: auto-generates API keys and extracts Docker assets
  • Works with any MCP-compatible client (Claude Desktop, VS Code, etc.)

Installation

bash
dotnet tool install -g dotnet-zap-mcp

Prerequisites

  • .NET 10 SDK
  • Docker (Docker Engine or Docker Desktop) with docker compose support (for built-in ZAP container management)

Configuration

Zero-config (recommended)

No configuration needed. The agent calls DockerComposeUp which automatically:

  1. Extracts Docker assets to ~/.zap-mcp/docker/
  2. Generates a random API key
  3. Starts the ZAP container on localhost:8090
  4. Waits for ZAP to become healthy
Data persistence

The ZAP container uses two Docker named volumes:

VolumeContainer PathPurpose
zap-home/home/zap/.ZAPZAP settings, contexts, sessions, scan policies (persisted across restarts)
zap-data/zap/wrk/dataShared directory for reports, session files, and context import/export

On the first launch, the template config.xml is copied into zap-home. On subsequent launches, only the API key is updated — any changes made through ZAP (contexts, authentication settings, scan policies, etc.) are preserved.

The zap-data volume contains:

  • reports/ — generated scan reports
  • sessions/ — saved ZAP sessions
  • contexts/ — exported context files

Claude Desktop / Claude Code

Add to your MCP configuration:

json
{  "mcpServers": {    "zap": {      "command": "zap-mcp"    }  }}

VS Code (Copilot)

Add to .vscode/mcp.json:

json
{  "servers": {    "zap": {      "command": "zap-mcp"    }  }}

With existing ZAP instance

If you already have a ZAP instance running, pass connection details via environment variables:

json
{  "mcpServers": {    "zap": {      "command": "zap-mcp",      "env": {        "ZAP_BASE_URL": "http://localhost:8090",        "ZAP_API_KEY": "your-api-key"      }    }  }}

Available Tools

Docker Management

ToolParametersDescription
DockerComposeUp—Start the ZAP container and wait for healthy
DockerComposeDown—Stop and remove the ZAP container
DockerComposeStatus—Check container status
DockerComposeLogstailGet recent container logs

ZAP Core

ToolParametersDescription
GetVersion—Verify ZAP connectivity
GetHosts—List recorded hosts
GetSites—List recorded sites
GetUrlsbaseUrlList recorded URLs for a base URL

Spider

ToolParametersDescription
StartSpiderurl, maxChildren, recurse, subtreeOnly, contextNameStart a spider scan to crawl and discover pages
GetSpiderStatusscanIdCheck spider progress (0-100%)
GetSpiderResultsscanIdGet URLs discovered by spider
StopSpiderscanIdStop a running spider scan

Active Scan

ToolParametersDescription
StartActiveScanurl, recurse, inScopeOnly, scanPolicyName, contextIdStart an active vulnerability scan
GetActiveScanStatusscanIdCheck active scan progress (0-100%)
StopActiveScanscanIdStop a running active scan

Passive Scan

ToolParametersDescription
GetPassiveScanStatus—Check passive scan progress (records remaining)

Alerts

ToolParametersDescription
GetAlertsSummarybaseUrlAlert counts by risk level
GetAlertsbaseUrl, start, count, riskIdDetailed alert list with pagination and risk filter

Reports

ToolParametersDescription
GetHtmlReport—Generate HTML scan report
GetJsonReport—Generate JSON scan report
GetXmlReport—Generate XML scan report

Context Management

ToolParametersDescription
GetContextList—List all contexts defined in ZAP
GetContextcontextNameGet context details (scope patterns, etc.)
CreateContextcontextNameCreate a new context
RemoveContextcontextNameDelete a context
IncludeInContextcontextName, regexAdd URL include pattern to context scope
ExcludeFromContextcontextName, regexAdd URL exclude pattern to context scope
ImportContextcontextFilePathImport a context file into ZAP
ExportContextcontextName, contextFilePathExport a context to file

Authentication

ToolParametersDescription
GetAuthenticationMethodcontextIdGet the authentication method configured for a context
SetAuthenticationMethodcontextId, authMethodName, authMethodConfigParamsSet authentication method (form-based, JSON-based, script-based, HTTP)
SetLoggedInIndicatorcontextId, loggedInIndicatorRegexSet regex pattern indicating logged-in state
SetLoggedOutIndicatorcontextId, loggedOutIndicatorRegexSet regex pattern indicating logged-out state

Users

ToolParametersDescription
GetUsersListcontextIdList all users for a context
CreateUsercontextId, nameCreate a new user
RemoveUsercontextId, userIdRemove a user
SetAuthenticationCredentialscontextId, userId, authCredentialsConfigParamsSet user credentials (username/password)
SetUserEnabledcontextId, userId, enabledEnable or disable a user

Forced User

ToolParametersDescription
SetForcedUsercontextId, userIdSet the forced user for a context
SetForcedUserModeEnabledenabledEnable or disable forced user mode globally
GetForcedUserStatuscontextIdGet forced user mode status and current forced user

Ajax Spider

ToolParametersDescription
StartAjaxSpiderurl, inScope, contextName, subtreeOnlyStart the Ajax Spider for JavaScript-heavy apps
StartAjaxSpiderAsUsercontextName, userId, url, subtreeOnlyStart the Ajax Spider as a specific user
GetAjaxSpiderStatus—Get Ajax Spider status (running/stopped)
GetAjaxSpiderResults—Get Ajax Spider results summary
StopAjaxSpider—Stop the Ajax Spider

Typical Workflow

  1. Agent calls DockerComposeUp to start ZAP
  2. Configure browser/Playwright to use ZAP as proxy (http://127.0.0.1:8090)
  3. Browse the target application through the proxy
  4. Agent calls StartSpider to crawl the application, then GetSpiderStatus to monitor progress
  5. Agent calls GetPassiveScanStatus to wait for passive scan completion
  6. Agent calls StartActiveScan on key pages, then GetActiveScanStatus to monitor progress
  7. Agent calls GetAlertsSummary and GetAlerts to retrieve vulnerability findings
  8. Agent calls GetHtmlReport or GetJsonReport to generate a scan report
  9. Agent calls DockerComposeDown when done

Note: ZAP settings (contexts, authentication, scan policies) are persisted in the zap-home Docker volume. You can stop and restart the container without losing configuration.

Try It Out (with the included vulnerable app)

This repository includes an intentionally vulnerable web application for trying out ZAP scanning. The app contains common vulnerabilities (XSS, SQL Injection, CSRF, Open Redirect) so ZAP can detect real findings.

Setup

bash
# Start ZAP and the vulnerable target appdocker compose -f tests/docker/docker-compose.test.yml up -d --build
# Wait until both containers are healthydocker compose -f tests/docker/docker-compose.test.yml ps

Then configure your MCP client to connect to this ZAP instance:

json
{  "mcpServers": {    "zap": {      "command": "zap-mcp",      "env": {        "ZAP_BASE_URL": "http://localhost:8090",        "ZAP_API_KEY": "test-api-key-for-ci"      }    }  }}

The vulnerable app is accessible at http://target from within the Docker network (used by ZAP), and at http://localhost:8080 from your host machine.

Example 1: Quick Scan

Prompt to agent:

Scan http://target for vulnerabilities. Run a spider crawl, wait for the passive scan to finish, then show me the alert summary and generate an HTML report.

Expected tool flow:

GetVersion          → Verify ZAP connectivityStartSpider         → url: "http://target"GetSpiderStatus     → Poll until 100%GetPassiveScanStatus → Poll until 0 records remainingGetAlertsSummary    → baseUrl: "http://target"GetAlerts           → baseUrl: "http://target"GetHtmlReport       → Generate report

ZAP will discover pages like /search, /login, /users, /about, /contact, and the passive scan will report issues such as missing security headers and CSRF vulnerabilities.

Example 2: Authenticated Scan

The /admin page requires login (username: admin, password: password). An authenticated scan lets ZAP access protected pages.

Prompt to agent:

Set up an authenticated scan for http://target. The login form is at /login with fields "username" and "password" (credentials: admin / password). The logged-in indicator is "Welcome, admin". After configuring authentication, spider the site as the authenticated user and run an active scan.

Expected tool flow:

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: trueSetForcedUser                   → contextId, userIdSetForcedUserModeEnabled        → enabled: trueStartSpider                     → url: "http://target", contextName: "target-auth"GetSpiderStatus                 → Poll until 100%GetPassiveScanStatus            → Poll until 0 records remainingStartActiveScan                 → url: "http://target"GetActiveScanStatus             → Poll until 100%GetAlertsSummary                → baseUrl: "http://target"GetAlerts                       → baseUrl: "http://target"SetForcedUserModeEnabled        → enabled: false

With authentication configured, ZAP can access /admin and test for vulnerabilities behind the login.

Example 3: Full Vulnerability Assessment

Prompt to agent:

Perform a full vulnerability assessment of http://target. Crawl the site, run an active scan, then give me a detailed breakdown of all discovered vulnerabilities grouped by risk level.

Expected tool flow:

StartSpider          → url: "http://target", recurse: trueGetSpiderStatus      → Poll until 100%GetSpiderResults     → Review discovered URLsGetPassiveScanStatus → Poll until 0 records remainingStartActiveScan      → url: "http://target", recurse: trueGetActiveScanStatus  → 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

The active scan will detect vulnerabilities including:

  • High: SQL Injection (/users?id=), Cross Site Scripting (/search?q=)
  • Medium: CSRF (missing tokens on /login), Open Redirect (/redirect?url=)
  • Low/Informational: Missing security headers, cookie issues, etc.

Cleanup

bash
docker compose -f tests/docker/docker-compose.test.yml down -v

License

MIT

Source: README.md at commit e9c2b67

Tools

0
SourceWeft has not started this package in its sandbox yet, so its tools are not known.

Version history

1
  1. v1.1.0LatestSep 16, 2026

Score

50% of the applicable checks met

How complete this listing is, computed from the registry entry, the endpoint and public sources. Not a rating of the server and not a statement that it is safe or working today: reachability is a dated check, and no installs or reviews go into the score.

  • Reached in the last 30 days25 pts

    Keep the endpoint answering the MCP handshake; SourceWeft probes it every 30 days.

  • Auth declared10 pts

    Declare the credential headers in the registry entry, or keep the endpoint answering the probe so its auth can be classified.

  • Tools listed15 pts

    Answer tools/list without a credential, or ship a package that starts in a sandbox without one.

  • DescriptionRequired15 pts
  • Logo10 pts
  • Documentation15 pts
  • License10 pts