Unified MCP Server for Web Security — 39 tools for autonomous pentesting
Project description
nodriver-proxy-mcp
Give your AI agent a browser, a proxy, and a Python sandbox.
It navigates like a human, intercepts like Burp, and codes its own exploits on the fly.
Why this exists
Existing security MCP servers give the AI read-only access to traffic or just wrap CLI tools. This one gives full, autonomous control: the agent opens a browser that bypasses bot detection, captures every request through a MITM proxy, and when the built-in tools aren't enough, it writes and runs its own Python to chain everything together.
"Scan target.com for IDOR vulnerabilities"
1. Agent starts proxy + browser
2. Navigates to login page, types credentials, clicks submit
3. Captures the auth flow, extracts the JWT
4. Replays API requests with different user IDs
5. Writes a Python script to automate the full IDOR check
6. Reports which endpoints are vulnerable
No human touches the keyboard. The agent does it all through 39 MCP tools.
Why pentesters should care
What can it do that Burp / ZAP can't?
| Burp Suite / ZAP | nodriver-proxy-mcp | |
|---|---|---|
| Who drives? | You click manually | AI does everything autonomously |
| Bot detection | Blocked by Cloudflare, DataDome, etc. | Bypasses automatically (nodriver) |
| Scripting | Write extensions / macros yourself | AI writes Python scripts on the fly, with access to all 38 tools via SDK |
| Client-side data | Not visible | Reads localStorage, sessionStorage, JS console, DOM hidden inputs |
| Can they work together? | — | Yes — chain through Burp with upstream="localhost:8080" |
What can it do that other security MCP servers can't?
Most security MCP servers just wrap curl or read-only traffic viewers. This one has:
- Real mitmproxy — full traffic recording, replay, fuzzing, interception rules, session variables. Not a simplified HTTP client.
- Two ways to modify traffic — browser-level (instant, CDP Fetch) or proxy-level (system-wide, all HTTP clients). Other MCPs offer neither.
- Code-mode with SDK — the AI writes a Python script that runs in a sandbox, calling 29 tools in loops with
asyncio. Race conditions, blind SQLi, and brute-force that would take thousands of MCP round-trips finish in seconds.
What it's great at
| Use case | How the agent handles it |
|---|---|
| IDOR | Opens two browser sessions (victim + attacker), extracts tokens, replays requests swapping user IDs in a loop |
| XSS | Types payloads into inputs, clicks submit, checks if alert() dialog fires. Inspects DOM for injection points. |
| Auth bypass | Scans traffic to detect JWT / API key / session cookie patterns, extracts tokens, replays with modifications |
| API testing | Captures all API calls, searches by keyword/status, replays with regex replacement, fuzzes with anomaly detection |
| Race conditions | Code-mode sends 50+ concurrent requests via asyncio.gather() with precise timing |
| Blind SQLi | Code-mode runs binary search extraction — hundreds of conditional requests with logic between each one |
| CSP bypass | Intercepts responses at browser level, strips or modifies Content-Security-Policy header before Chrome enforces it |
Architecture
Overall system
graph TB
Agent["🤖 AI Agent<br/>(Claude, Cursor, etc.)"]
subgraph MCP["MCP Server Process"]
direction LR
PT["Proxy Tools<br/>18 tools"]
BT["Browser Tools<br/>20 tools"]
CT["Code-mode<br/>1 tool"]
end
subgraph Proxy["mitmproxy :8082"]
Addon["Addon Script<br/>record + intercept"]
DB[("SQLite<br/>traffic.db")]
Addon -->|write| DB
end
subgraph BrowserSession["BrowserDaemon (per session)"]
Chrome["Chrome<br/>nodriver (anti-bot)"]
Fetch["CDP Fetch<br/>intercept hooks"]
Chrome --- Fetch
end
subgraph Sandbox["Code-mode Sandbox"]
Script["AI-generated<br/>Python script"]
SDK["NdpSDK<br/>29 methods"]
Script --> SDK
end
Target[("🎯 Target")]
Agent <-->|"stdio JSON-RPC"| MCP
PT --> Proxy
BT -->|"TCP IPC<br/>JSON-RPC"| BrowserSession
CT -->|"subprocess<br/>fork+exec"| Sandbox
Chrome -->|"all traffic routed"| Proxy
Proxy <-->|"HTTP/S"| Target
SDK -.->|"direct read/write"| DB
SDK -.->|"TCP IPC"| BrowserSession
Two interception layers
graph LR
subgraph Layer1["Layer 1 — CDP Fetch (instant)"]
direction LR
C1["Chrome"] -->|"request"| F1["Fetch API<br/>inject header / block"]
F1 -->|"modified"| P1["→ mitmproxy"]
P2["mitmproxy →"] -->|"response"| F2["Fetch API<br/>replace body / block"]
F2 -->|"modified"| C2["→ Chrome"]
end
subgraph Layer2["Layer 2 — mitmproxy (system-wide)"]
direction LR
Any["Any HTTP client"] --> M1["mitmproxy<br/>inject header / replace body / block"]
M1 --> T2["→ Target"]
end
style Layer1 fill:#1a1a2e,stroke:#3fb950,color:#e6edf3
style Layer2 fill:#1a1a2e,stroke:#58a6ff,color:#e6edf3
CDP Fetch = browser-only, instant, per-session. mitmproxy rules = all traffic, ~5s cache delay, system-wide.
Process lifecycle
| Process | Parent | IPC method | Auto-cleanup |
|---|---|---|---|
| mitmproxy | MCP server | SQLite (shared file) | Watchdog thread kills on parent death; stderr drain prevents pipe hang |
| BrowserDaemon | MCP server | TCP JSON-RPC (dynamic port) | Parent PID watch → IPC close → SIGTERM → SIGKILL |
| Chrome | BrowserDaemon | CDP (Chrome DevTools Protocol) | browser.stop() on daemon exit |
| Code-mode script | MCP server | Env vars (ports, sessions) | Job Object / killpg; 256MB RAM, 60s CPU |
NdpSDK — Code-mode Python SDK
NdpSDK is a Python wrapper that exposes the same 38 tools (proxy + browser) as async methods, designed for use inside execute_security_code. When the AI needs loops, concurrency, or multi-step logic that would be impractical as individual MCP calls, it writes a script using NdpSDK instead.
from nodriver_proxy_mcp.sdk import NdpSDK
import asyncio
async def main():
sdk = NdpSDK() # auto-discovers running proxy + browser sessions
flows = await sdk.get_traffic_summary(limit=20)
await sdk.browser_go("https://target.com/admin")
# Loops — this is why NdpSDK exists
for uid in range(1, 100):
resp = await sdk.replay_flow(
flow_id,
replacements=[{"regex": r"/users/\d+", "replacement": f"/users/{uid}"}]
)
if resp["status_code"] == 200:
print(f"IDOR: /users/{uid}")
asyncio.run(main())
Quick start
1. Install
pip install nodriver-proxy-mcp
Or from source:
git clone https://github.com/BobongKu/nodriver-proxy-mcp.git
cd nodriver-proxy-mcp
pip install .
2. Add to your AI agent
MCP clients (mcp_config.json):
{
"mcpServers": {
"nodriver-proxy-mcp": {
"command": "nodriver-proxy-mcp"
}
}
}
3. Use it
Just tell your AI agent what to do. The tools are self-descriptive — the agent picks the right ones automatically.
All 39 tools
Proxy (18)
| Tool | Purpose |
|---|---|
manage_proxy |
Start/stop mitmproxy. Chain to Burp via upstream. GUI via ui=True. |
proxy_status |
Check running state, port, PID |
set_scope |
Limit recording to specific domains |
get_traffic_summary |
Paginated flow list with IDs, URLs, methods, status codes |
inspect_flow |
Full request/response details — headers, body, metadata |
search_traffic |
Filter by keyword, domain, method, status code |
extract_from_flow |
Pull values via JSONPath, regex, or CSS selectors |
extract_session_variable |
Save a value for {{placeholder}} reuse in replay |
list_session_variables |
Show all extracted variables |
generate_curl |
Export a flow as a copy-paste curl command |
replay_flow |
Resend with regex replacements + {{var}} substitution (like Burp Repeater) |
send_raw_request |
Craft arbitrary HTTP requests from raw text (SSRF-protected) |
add_interception_rule |
Live proxy traffic manipulation: inject headers, replace body, block |
list_interception_rules |
Show active proxy rules |
remove_interception_rule |
Delete a proxy rule by ID |
detect_auth_pattern |
Auto-detect JWT, Bearer, API key, session cookie, CSRF, OAuth2 |
fuzz_endpoint |
Concurrent fuzzing with baseline anomaly detection |
clear_traffic |
Wipe the traffic database |
Browser (20)
| Tool | Purpose |
|---|---|
browser_open / browser_close |
Launch or kill a Chrome session (anti-bot bypass, headless by default) |
browser_list_sessions |
Active sessions with PID, ports, uptime |
browser_list_tabs |
Tabs in a session |
browser_go / browser_back |
Navigate, wait for page load, SPA support via wait_for |
browser_click |
Click by CSS selector or visible text. Returns JS alert dialogs (XSS detection). |
browser_type |
Type into inputs — login forms, search boxes, payload injection |
browser_get_dom |
Security-focused DOM: forms, scripts, iframes, comments, event handlers, data-* attributes |
browser_get_text |
Text content from any CSS selector |
browser_get_storage |
Dump localStorage + sessionStorage (invisible to proxy) |
browser_get_console |
JS console output — stack traces, debug URLs, CSP violations |
browser_screenshot |
Capture page as PNG — bot challenges, evidence, state verification |
browser_set_cookie |
Set cookies via CDP (supports httpOnly — unlike document.cookie) |
browser_js |
Execute arbitrary JavaScript in page context |
browser_wait |
Wait for element/text to appear (SPA/AJAX support) |
browser_intercept_request |
CDP Fetch: inject headers, block outgoing requests (instant) |
browser_intercept_response |
CDP Fetch: replace response body, block responses (instant) |
browser_intercept_disable |
Turn off all CDP Fetch interception |
browser_list_intercept_rules |
Show active CDP Fetch rules |
Code-mode (1)
| Tool | Purpose |
|---|---|
execute_security_code |
Run AI-generated Python with NdpSDK — programmatic access to all 38 other tools. Sandboxed. |
Burp Suite integration
Use upstream to chain mitmproxy through Burp for manual analysis alongside AI automation:
manage_proxy(action="start", upstream="localhost:8080")
Traffic flows: Chrome --> mitmproxy (:8082) --> Burp Suite (:8080) --> Target
Both tools see the same traffic. The AI automates; you analyze in Burp when you need to.
Workflow — IDOR sweep with code-mode
sequenceDiagram
participant Agent as AI Agent
participant MCP as MCP Server
participant Proxy as mitmproxy
participant Browser as Chrome (nodriver)
participant Code as Code-mode (NdpSDK)
participant Target as Target
Note over Agent,Target: Phase 1 - Setup
Agent->>MCP: manage_proxy(start)
MCP->>Proxy: launch :8082
Agent->>MCP: browser_open(proxy_port=8082)
MCP->>Browser: launch Chrome via proxy
Note over Agent,Target: Phase 2 - Recon
Agent->>MCP: browser_go(target.com)
Browser->>Proxy: all traffic captured
Proxy->>Target: GET /login, /api/*, /mypage...
Target-->>Browser: responses
Agent->>MCP: get_traffic_summary()
MCP-->>Agent: 47 flows captured
Agent->>MCP: detect_auth_pattern()
MCP-->>Agent: Bearer token detected
Note over Agent,Target: Phase 3 - Attack Surface Mapping
Agent->>MCP: search_traffic("/api/")
MCP-->>Agent: /api/users/me, /api/orders/1042, /api/profile/317
Agent->>MCP: extract_session_variable(token)
MCP-->>Agent: saved as my_token
Note right of Agent: Found 3 endpoints with ID params
Note over Agent,Target: Phase 4 - Code-mode IDOR Sweep
Agent->>MCP: execute_security_code(script)
MCP->>Code: fork + sandbox
loop every endpoint x ID 1~100
Code->>Target: GET /api/users/[id] + my_token
Target-->>Code: 200 with other user data / 403
Code->>Target: GET /api/orders/[id] + my_token
Target-->>Code: 200 with other order data / 403
Code->>Target: GET /api/profile/[id] + my_token
Target-->>Code: 200 with other profile / 403
end
Code-->>MCP: results summary
MCP-->>Agent: /api/users: 100/100 accessible, /api/orders: 38/100, /api/profile: 0/100
Troubleshooting
| Problem | Fix |
|---|---|
| Browser won't launch | Install Chrome/Chromium. nodriver requires a real Chrome binary. |
| SSL certificate errors | Trust the mitmproxy CA: ~/.mitmproxy/mitmproxy-ca-cert.pem |
| Port already in use | manage_proxy(port=XXXX) — or restart, orphaned processes are auto-killed |
| Tools not showing | Restart your Claude Code / Cursor session to reload the MCP server |
uvx doesn't work |
Don't use uvx. Clone the repo and use uv run --directory instead. |
License
MIT
Project details
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file nodriver_proxy_mcp-1.0.1.tar.gz.
File metadata
- Download URL: nodriver_proxy_mcp-1.0.1.tar.gz
- Upload date:
- Size: 204.1 kB
- Tags: Source
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.2.0 CPython/3.13.5
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
3613bdad348d7bef8c24941c4f5d847b89c6db9b9d83684ae9b19a60df499617
|
|
| MD5 |
22d186867f4c8eff9e1f2b0721c45111
|
|
| BLAKE2b-256 |
3cd48f1ad5c905d2cc70b3bfaaf1682ead915e9c2ffec8b7926745924126426b
|
File details
Details for the file nodriver_proxy_mcp-1.0.1-py3-none-any.whl.
File metadata
- Download URL: nodriver_proxy_mcp-1.0.1-py3-none-any.whl
- Upload date:
- Size: 65.3 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.2.0 CPython/3.13.5
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
5e50f1c35022af696e9f25752fefd8f02b1c32901f6dee06842c72c76ae3891b
|
|
| MD5 |
7c1798d4f784f2fe975430f90e0b5f09
|
|
| BLAKE2b-256 |
8231938761acc402c19dda3d30c9aad0a6a75bd58db36063e7051582226a44f9
|