Skip to main content
Glama

Pentest MCP

Professional penetration-testing MCP server with modern transport/auth support and expanded recon tooling.

What Changed in 0.9.0

  • Upgraded MCP SDK to @modelcontextprotocol/sdk@^1.26.0

  • Kept MCP Inspector at the latest release (@modelcontextprotocol/inspector@^0.20.0) with bundled launcher

  • Streamable HTTP is now the primary network transport (MCP_TRANSPORT=http)

  • SSE is still available only as a deprecated compatibility mode

  • Added bearer-token auth with OIDC JWKS and introspection support

  • Added first-class tools: subfinderEnum, httpxProbe, ffufScan, nucleiScan, trafficCapture, hydraBruteforce, privEscAudit, extractionSweep

  • Added report-admin tools: listEngagementRecords, getEngagementRecord

  • Added SoW capture flow for reports using MCP elicitation (scopeMode=ask) with safe template fallback

  • Hardened command resolution so web probing uses httpx-toolkit (preferred) or validated ProjectDiscovery httpx, avoiding Python httpx CLI collisions

  • Integrated bundled MCP Inspector launcher (pentest-mcp inspector)

  • Runtime baseline is now Node.js 22.7.5+

  • Added invocation metadata in new tool outputs when auth/session context is available

Related MCP server: NPM Sentinel MCP

Included Tools

  • nmapScan

  • runJohnTheRipper

  • runHashcat

  • gobuster

  • nikto

  • subfinderEnum

  • httpxProbe

  • ffufScan

  • nucleiScan

  • trafficCapture

  • hydraBruteforce

  • privEscAudit

  • extractionSweep

  • generateWordlist

  • listEngagementRecords

  • getEngagementRecord

  • createClientReport

  • cancelScan

Quick Start

Install

npm install -g pentest-mcp

Run locally (stdio)

pentest-mcp

Launch bundled MCP Inspector (no separate install)

pentest-mcp inspector

You can forward Inspector flags directly:

pentest-mcp inspector --help

Run over network (Streamable HTTP)

MCP_TRANSPORT=http MCP_SERVER_HOST=0.0.0.0 MCP_SERVER_PORT=8000 pentest-mcp

Run legacy SSE mode (deprecated)

MCP_TRANSPORT=sse MCP_SERVER_PORT=8001 pentest-mcp

Transport Notes

  • stdio: default for local MCP clients.

  • http: modern network transport. Recommended.

  • sse: compatibility only. Deprecated and will be removed in a future major release.

Inspector Integration

  • pentest-mcp inspector launches the bundled @modelcontextprotocol/inspector CLI.

  • It auto-targets this MCP server over stdio by spawning:

    • node <this-package-entrypoint> stdio

  • You do not need to install Inspector separately.

Auth Configuration (Bearer + OIDC)

Set 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_ENABLED

  • MCP_OAUTH_PROVIDER_URL

  • MCP_OAUTH_SCOPES

Workflow + Reporting

createClientReport now supports SoW handling modes:

  • scopeMode=ask: prompt user via MCP elicitation (recommended)

  • scopeMode=provided: use scopeOfWork value directly

  • scopeMode=template: use built-in generic authorized-testing template

If elicitation is declined/unavailable, the report automatically falls back to the template.

How users provide SoW (right now)

There is no separate file-upload API yet. Current options are:

  1. Ask interactively via MCP user invocation (elicitation)

{ "tool": "createClientReport", "arguments": { "title": "Q1 External Pentest", "assessmentType": "external-network", "scopeMode": "ask" } }
  1. Paste SoW text directly into scopeOfWork

{ "tool": "createClientReport", "arguments": { "title": "Q1 External Pentest", "assessmentType": "external-network", "scopeMode": "provided", "scopeOfWork": "Authorized targets: ...\nOut-of-scope: ...\nTesting window: ...\nRules of engagement: ..." } }
  1. Use template mode when client details should not be shared

{ "tool": "createClientReport", "arguments": { "title": "Q1 External Pentest", "assessmentType": "external-network", "scopeMode": "template" } }

How this cuts admin time

  • Every tool run stores a structured engagement record (recordId=...) with invocation context.

  • Use listEngagementRecords to pull all work artifacts quickly.

  • Generate the report from selected recordIds (or latest records by default) instead of manual copy/paste.

  • Scope notes are attached automatically from one of:

    • user elicitation form (ask)

    • pasted SoW text (provided)

    • safe default template (template)

Roadmap

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)

  • SoW parser that auto-extracts targets, exclusions, test windows, and rules of engagement

  • Evidence auto-linking from tool outputs (recordId) to findings and report sections

  • Finding dedup/merge across overlapping tools (nuclei, nikto, etc.)

  • Auto severity + impact draft text for faster writeups

  • One-click report pack generation (executive summary + technical appendix + remediation table)

  • Retest diff mode (fixed/reopened/new findings between engagements)

  • Ticket export sync (Jira/Linear/GitHub) with status backfill

  • Deliverable QA checks (missing evidence, missing scope fields, weak remediation notes)

Adoption note:

  • Expect strong usage for scopeFilePath and scopeDocument because most teams already maintain SoW in docs/PDF and want to avoid repeated paste-and-reformat steps.

Recon + Exploitation Examples

Subdomain enumeration

{ "tool": "subfinderEnum", "arguments": { "domain": "example.com", "recursive": true, "allSources": true } }

Probe live hosts

{ "tool": "httpxProbe", "arguments": { "targets": ["example.com", "api.example.com"], "includeTitle": true, "includeStatusCode": true } }

Fuzz content paths

{ "tool": "ffufScan", "arguments": { "targetUrl": "https://example.com/FUZZ", "wordlist": "/usr/share/seclists/Discovery/Web-Content/common.txt", "threads": 40 } }

Template scanning

{ "tool": "nucleiScan", "arguments": { "targets": ["https://example.com"], "severities": ["medium", "high", "critical"] } }

Traffic capture (sniffing)

{ "tool": "trafficCapture", "arguments": { "networkInterface": "eth0", "packetCount": 200, "bpfFilter": "tcp port 80" } }

Brute-force checks

{ "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" } }

SQLi extraction sweep

{ "tool": "extractionSweep", "arguments": { "targetUrl": "https://target.local/item.php?id=1", "risk": 2, "level": 3 } }

Docker

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, tcpdump

  • subfinder, httpx + httpx-toolkit alias, nuclei

Required Host Tools (non-Docker runs)

Ensure the binaries are in PATH:

which nmap john hashcat gobuster nikto subfinder httpx-toolkit ffuf nuclei hydra sqlmap tcpdump

If httpx-toolkit is not installed, a validated ProjectDiscovery httpx binary is accepted as fallback.

Security Notice

Authorized use only. Run against systems/networks where you have explicit written permission.

Latest Blog Posts

MCP directory API

We provide all the information about MCP servers via our MCP API.

curl -X GET 'https://glama.ai/api/mcp/v1/servers/DMontgomery40/pentest-mcp'

If you have feedback or need assistance with the MCP directory API, please join our Discord server