Provides access to Kali Linux security testing tools through a containerized environment. Includes network scanning, web vulnerability assessment, technology fingerprinting, and custom command execution.
This Kali Linux MCP server has significant quality gaps across naming, descriptions, and schema completeness. While tool names generally follow verb patterns (nmap_scan, nikto_scan, whatweb_scan), the descriptions lack depth and fail to properly document output schemas. Parameter descriptions are present but often generic. Most critically, there are no explicit input schema definitions visible in the code, parameters are inferred from function signatures rather than formally declared JSON Schemas. Error handling exists but is minimal, and there is no guidance for LLM recovery from failures. The server is STDIO-only, which further limits its production readiness.
Check if the container is running with necessary privileges for security tools. Returns: Privilege information
List security tools available in this Kali Linux container. Returns: List of installed Kali Linux tools
Scan web server with Nikto vulnerability scanner. Args: target: Target hostname or IP address port: Port number (default: 80) ssl: Use SSL/TLS (default: False) Returns: Nikto scan results IMPORTANT: Only scan web servers you own or have permission to test!
Perform network scanning with nmap. Args: target: Target IP address or hostname (e.g., '192.168.1.1' or 'example.com') scan_type: Type of scan - 'basic', 'quick', 'full', 'version', 'os' ports: Specific ports to scan (e.g., '22,80,443' or '1-1000'). Leave empty for default. Returns: Scan results from nmap IMPORTANT: Only scan systems you own or have permission to test!
Run a custom command in the Kali Linux container. Args: command: Shell command to execute (e.g., 'ls -la /tmp') timeout: Command timeout in seconds (default: 300) Returns: Command output WARNING: Be careful with this tool - it executes arbitrary commands!
No formal JSON Schema definitions visible in code. Input schemas are inferred from function parameters (e.g., @mcp.tool() decorators) rather than explicitly declared with proper JSON Schema. This makes it impossible for clients to validate inputs before calling and leaves LLMs without machine-readable constraint documentation.
Output schemas not documented. Tools return string responses (formatted text output) with no structured schema declaration. LLMs cannot predict output fields or chain results to downstream tools. Example: nmap_scan() returns a formatted string with scan results, but no schema declares what fields exist or how to parse the output.
Inferred effective spec: <=2025-11-25.
| Scored | Grade | Overall | Spec posture | Rubric |
|---|---|---|---|---|
| 2026-09-22 | F | 40 | <=2025-11-25 | v2 |
| 2026-03-09 | F | 0 | - | v1 |
Simple TCP port scanner that doesn't require special privileges. Args: target: Target IP address or hostname ports: Comma-separated list of ports (default: common ports) Returns: List of open ports
Identify web technologies with WhatWeb. Args: target: Target URL (e.g., 'http://example.com') aggression: Scan aggression level 1-4 (default: 1, passive) Returns: Web technology fingerprinting results
Descriptions lack actionable detail. Tool descriptions state WHAT is done but not WHEN to use it or WHY over alternatives. Example: 'Perform network scanning with nmap' is generic, it doesn't explain when to choose nmap_scan vs simple_port_scan, what target formats are accepted, or what 'basic' vs 'full' scan actually reveals. Descriptions should be 50-200 chars and include selection criteria.
Parameter constraints not formally specified. Enumerated values (scan_type: 'basic', 'quick', 'full', 'version', 'os') are documented in description text but not declared as JSON Schema enums. LLMs may hallucinate invalid values like 'aggressive' or 'stealth'. Port ranges like '22,80,443' or '1-1000' lack format patterns or validation guidance.
Insufficient error handling and recovery guidance. Error responses are unstructured strings with no categorization (retryable vs user-fixable vs fatal). Example: run_custom_command() returns 'Command timed out after 300 seconds' with no suggestion to retry with a longer timeout or break the command into smaller steps. No actionable error messages for LLM recovery.
Destructive operations lack confirmation patterns. run_custom_command() accepts arbitrary shell commands with a timeout but no dry-run, preview, or confirmation step. An LLM could execute 'rm -rf /' without any guard. While this is mitigated by running in a container, the tool definition itself should include confirmation semantics.
No permission declarations or scope hints. Tools do not declare what permissions they require (read:network, write:filesystem, execute:arbitrary) or what blast radius they have. An agent with access to run_custom_command() can execute any command in the container, no least-privilege model.
Tool naming ambiguity between nmap_scan and simple_port_scan. Both perform port scanning but with different capabilities and privileges. The distinction ('simple' = no root required vs 'nmap' = full service detection) is buried in descriptions. LLMs may pick the wrong tool. Consider 'nmap_service_scan' and 'tcp_port_check' for clearer semantics.
Missing parameter validation hints. The 'target' parameter in nmap_scan, nikto_scan, and whatweb_scan accepts 'IP address or hostname' but provides no format validation (CIDR notation, IP ranges, IPv6). The 'ports' parameter accepts '22,80,443' or '1-1000' but no regex or range constraints are specified. LLMs need explicit formats to avoid malformed input.