Repository navigation
v1.4.0 — vulnerator-mcp MCP front door
vulnerator-ai 1.4.0 — MCP front door
This release adds vulnerator-mcp, a thin MCP server that wraps Hermes' :8642 runs API so any MCP client (Claude Code, Kiro, Cursor, BugTraceAI, …) can trigger, observe, steer and stop an OODA pentest as MCP tools. It wraps — it does not replace — the HTTP API, and exposes only the runs lifecycle so the client stays a trigger/observer, never the brain. It also ships an install.sh easy installer that reduces first-run setup to a single input (your OpenRouter key).
Added
vulnerator-mcpMCP front door (up by default). Thin FastMCP wrapper (docker/mcp/) over the:8642runs API. Five tools (start_pentest,get_run_status,stream_run_events,steer_run,stop_run) +health(). Never exposes/v1/chat/completionsor rawkali_run.- Stateless & version-tolerant: the run object and events are forwarded opaquely; terminality is derived from the run booleans (
completed/interrupted), never from thestatusstring; the upstream version is read fromGET /healthand reported verbatim. stream_run_eventsuses the eventseqas a portable cursor (batched pages withnext_cursor/done), plus MCP progress notifications over streamable-HTTP.- Up by default as a 4th container in
docker-compose.yml(plaindocker compose up). Internal docker network only — host publication is opt-in viaVULNERATOR_MCP_HOST_PORT. - Fail-closed inbound auth: streamable-HTTP refuses to start without
VULNERATOR_MCP_INBOUND_TOKEN(separate secret fromHERMES_API_SERVER_KEY);/healthzis the one exact-match carve-out. The local stdio mode (recommended for Claude Code / Kiro) needs no token and no port. - Advisory
scopeargument folded into the prompt (the MCP layer enforces no scope; the v1.3.0 Kali-layer scope-guard remains the opt-in deterministic gate).
- Stateless & version-tolerant: the run object and events are forwarded opaquely; terminality is derived from the run booleans (
install.sheasy installer. One input — yourOPENROUTER_API_KEY— and the installer checks prerequisites (docker,docker composev2,openssl), auto-generates the two secret tokens (HERMES_API_SERVER_KEY,VULNERATOR_MCP_INBOUND_TOKEN) as separate 32-byte hex values, writes the.envfrom the template (keeping every other default and the comments), and brings the default stack up (no Juice Shop lab). Flags:--with-juice-shop,--no-up,--force. The manualcp .env.example .envpath still works.- README "Let an AI assistant set it up for you" block. A copy-paste prompt you hand to an LLM coding assistant (Claude Code / Kiro / Cursor) with shell access, so it runs
install.shand wires up thevulnerator-mcpstdio server end to end — you only supply the OpenRouter key when asked.
Changed
- README trimmed to a short Quick Start; long-form detail split into
docs/. The README now leads with the./install.shQuick Start (plus a collapsed manual fallback) and a documentation index. The detail moved into new topic docs:docs/configuration.md(every.envvariable, AWS credentials, local Ollama inference),docs/usage.md(driving a pentest via TUI / MCP client / raw HTTP, the Juice Shop lab, clean restarts), anddocs/security.md(the no-guardrails model, the opt-in scope-guard, the MCP inbound token). Documentation only; no behavior changed. pentest-reportnow emits the report in English, aligned with the public docs, plus a redacted English sample deliverable (docs/example-report.md) and its findings store (docs/example-findings.jsonl).
Fixed
- Kali image clean-build crash. The v1.3.0
scope_guard.pywas imported bykali_mcp_server.pybut neverCOPY-ed into the image, so a cleandocker compose up --buildcrashed the kali container withModuleNotFoundError: No module named 'scope_guard'. The Dockerfile now copies it; the kali container builds and reaches a healthy state.
Verified
End-to-end against a live hermes-agent 0.22.0 stack: MCP client → vulnerator-mcp (stdio) → :8642, full health → start_pentest → stream_run_events (cursor) → steer/stop → get_run_status round-trip, plus the 4-container default stack building and starting cleanly with the kali fix. The install.sh .env generation was dry-run verified (three keys correct, the two tokens distinct 32-byte hex, every other variable left as the template).
