NOT for educational purposes: An MCP server for professional penetration testers including STDIO/HTTP/SSE support, nmap, go/dirbuster, nikto, JtR, hashcat, wordlist building, and more.
Professional penetration-testing MCP server with modern transport/auth support and expanded recon tooling.
@modelcontextprotocol/sdk@^1.26.0@modelcontextprotocol/inspector@^0.20.0) with bundled launcherMCP_TRANSPORT=http)subfinderEnum, httpxProbe, ffufScan, nucleiScan, trafficCapture, hydraBruteforce, privEscAudit, extractionSweeplistEngagementRecords, getEngagementRecordscopeMode=ask) with safe template fallbackhttpx-toolkit (preferred) or validated ProjectDiscovery httpx, avoiding Python httpx CLI collisionspentest-mcp inspector)nmapScanrunJohnTheRipperrunHashcatgobusterniktosubfinderEnumhttpxProbeffufScannucleiScantrafficCapturehydraBruteforceprivEscAuditextractionSweepgenerateWordlistlistEngagementRecordsgetEngagementRecordcreateClientReportcancelScannpm install -g pentest-mcp
pentest-mcp
pentest-mcp inspector
You can forward Inspector flags directly:
pentest-mcp inspector --help
MCP_TRANSPORT=http MCP_SERVER_HOST=0.0.0.0 MCP_SERVER_PORT=8000 pentest-mcp
MCP_TRANSPORT=sse MCP_SERVER_PORT=8001 pentest-mcp
stdio: default for local MCP clients.http: modern network transport. Recommended.sse: compatibility only. Deprecated and will be removed in a future major release.pentest-mcp inspector launches the bundled @modelcontextprotocol/inspector CLI.node <this-package-entrypoint> stdioSet these env vars when using MCP_TRANSPORT=http (or sse if needed):
MCP_AUTH_ENABLED=true
MCP_AUTH_MODE=bearer
MCP_AUTH_SCOPES=read,write
MCP_AUTH_AUDIENCE=
MCP_OIDC_ISSUER=https://issuer.example.com
MCP_OIDC_JWKS_URL=https://issuer.example.com/.well-known/jwks.json
# optional alternative/backup validation mode:
MCP_OIDC_INTROSPECTION_URL=https://issuer.example.com/oauth/introspect
MCP_OAUTH_CLIENT_ID=...
MCP_OAUTH_CLIENT_SECRET=...
Legacy aliases are still accepted temporarily:
MCP_OAUTH_ENABLEDMCP_OAUTH_PROVIDER_URLMCP_OAUTH_SCOPEScreateClientReport now supports SoW handling modes:
scopeMode=ask: prompt user via MCP elicitation (recommended)scopeMode=provided: use scopeOfWork value directlyscopeMode=template: use built-in generic authorized-testing templateIf elicitation is declined/unavailable, the report automatically falls back to the template.
There is no separate file-upload API yet. Current options are:
{
"tool": "createClientReport",
"arguments": {
"title": "Q1 External Pentest",
"assessmentType": "external-network",
"scopeMode": "ask"
}
}
scopeOfWork{
"tool": "createClientReport",
"arguments": {
"title": "Q1 External Pentest",
"assessmentType": "external-network",
"scopeMode": "provided",
"scopeOfWork": "Authorized targets: ...\nOut-of-scope: ...\nTesting window: ...\nRules of engagement: ..."
}
}
{
"tool": "createClientReport",
"arguments": {
"title": "Q1 External Pentest",
"assessmentType": "external-network",
"scopeMode": "template"
}
}
recordId=...) with invocation context.listEngagementRecords to pull all work artifacts quickly.recordIds (or latest records by default) instead of manual copy/paste.ask)provided)template)These are planned specifically to reduce pentest admin overhead.
scopeFilePath ingestion (load SoW from a local file path on the MCP host)scopeDocument chunked upload flow (send SoW content directly through MCP for remote clients)recordId) to findings and report sectionsnuclei, nikto, etc.)Adoption note:
scopeFilePath and scopeDocument because most teams already maintain SoW in docs/PDF and want to avoid repeated paste-and-reformat steps.{
"tool": "subfinderEnum",
"arguments": {
"domain": "example.com",
"recursive": true,
"allSources": true
}
}
{
"tool": "httpxProbe",
"arguments": {
"targets": ["example.com", "api.example.com"],
"includeTitle": true,
"includeStatusCode": true
}
}
{
"tool": "ffufScan",
"arguments": {
"targetUrl": "https://example.com/FUZZ",
"wordlist": "/usr/share/seclists/Discovery/Web-Content/common.txt",
"threads": 40
}
}
{
"tool": "nucleiScan",
"arguments": {
"targets": ["https://example.com"],
"severities": ["medium", "high", "critical"]
}
}
{
"tool": "trafficCapture",
"arguments": {
"networkInterface": "eth0",
"packetCount": 200,
"bpfFilter": "tcp port 80"
}
}
{
"tool": "hydraBruteforce",
"arguments": {
"target": "10.10.10.20",
"service": "ssh",
"usernameList": "/usr/share/seclists/Usernames/top-usernames-shortlist.txt",
"passwordList": "/usr/share/seclists/Passwords/Common-Credentials/10k-most-common.txt"
}
}
{
"tool": "extractionSweep",
"arguments": {
"targetUrl": "https://target.local/item.php?id=1",
"risk": 2,
"level": 3
}
}
docker-compose --profile http up
docker-compose --profile stdio up
docker-compose --profile sse up
The Docker image installs:
nmap, john, hashcat, gobuster, nikto, ffuf, hydra, sqlmap, tcpdumpsubfinder, httpx + httpx-toolkit alias, nuclei