MCP server that bridges an LLM client to a persistent Kali Linux VM over SSH, with scope enforcement and structured output. Includes nmap, gobuster, nuclei, and nikto.
Four tools with complete input schemas and descriptions, but significant gaps in output documentation and error guidance. Tool names follow verb_noun pattern (nmap_scan, gobuster_scan, nuclei_scan, nikto_scan) which is good. Descriptions are present (60-90 chars) but lack context on when to use each tool vs. alternatives, prerequisites, or what the structured JSON output contains. Parameters have types and descriptions, but no guidance on output schema structure. Error handling is minimal, no recovery guidance or actionable error messages visible in code. Scope enforcement is well-implemented (audit logging, CIDR matching) but not exposed to LLM as tool annotations or error context.
Run gobuster to enumerate web directories and subdomains on a target. Returns structured JSON with discovered paths and status codes.
Run nikto web server scanner on a target. Returns structured JSON with identified issues and vulnerabilities.
Run nmap on a target host or network. Returns structured JSON with host status and open ports.
Run nuclei vulnerability scanner on a target. Returns structured JSON with detected vulnerabilities and their severity.
Output schemas not documented. Tool descriptions state 'Returns structured JSON' but do not specify field names, types, or structure. LLMs cannot plan downstream operations or extract specific fields without knowing the response schema.
No error recovery guidance. When scope check fails or SSH command errors, the code raises ValueError or returns exit_code but provides no actionable next steps for the LLM. Error messages should guide retry vs. user correction vs. fatal failure.
Tool descriptions lack context on when to use each tool. All four are security scanning tools but descriptions do not explain the distinction: nmap finds open ports, gobuster enumerates web paths, nuclei detects vulnerabilities, nikto audits web servers. LLMs cannot select the right tool without this guidance.
| Scored | Grade | Overall | Spec posture | Rubric |
|---|---|---|---|---|
| 2026-09-23 | D | 58 | 2026-07-28+ | v2 |
No tool annotations (readOnlyHint, idempotentHint). All four tools are read-only reconnaissance operations, but this is not declared in the tool definition. Clients cannot infer safety properties without explicit annotations.
Parameter 'severity' in nuclei_scan and 'port' in nikto_scan are optional but lack guidance on defaults. What happens if severity is omitted? Does nuclei run all templates or skip? If port is omitted, which ports does nikto scan? Undocumented defaults cause LLM confusion.