nodriver-proxy-mcp
Gives AI agents a browser that bypasses bot detection, a MITM proxy for traffic interception, and a Python sandbox to autonomously write and execute security exploits.
README
<p align="center"> <h1 align="center">nodriver-proxy-mcp</h1> <p align="center"> <strong>Give your AI agent a browser, a proxy, and a Python sandbox.</strong><br/> It navigates like a human, intercepts like Burp, and codes its own exploits on the fly. </p> <p align="center"> <a href="https://python.org"><img src="https://img.shields.io/badge/python-3.10+-3776AB.svg?logo=python&logoColor=white" alt="Python 3.10+"></a> <a href="https://modelcontextprotocol.io"><img src="https://img.shields.io/badge/MCP-Compatible-8A2BE2" alt="MCP"></a> <a href="LICENSE"><img src="https://img.shields.io/badge/License-MIT-yellow.svg" alt="MIT License"></a> </p> </p>
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
推荐服务器
Baidu Map
百度地图核心API现已全面兼容MCP协议,是国内首家兼容MCP协议的地图服务商。
Playwright MCP Server
一个模型上下文协议服务器,它使大型语言模型能够通过结构化的可访问性快照与网页进行交互,而无需视觉模型或屏幕截图。
Magic Component Platform (MCP)
一个由人工智能驱动的工具,可以从自然语言描述生成现代化的用户界面组件,并与流行的集成开发环境(IDE)集成,从而简化用户界面开发流程。
Audiense Insights MCP Server
通过模型上下文协议启用与 Audiense Insights 账户的交互,从而促进营销洞察和受众数据的提取和分析,包括人口统计信息、行为和影响者互动。
VeyraX
一个单一的 MCP 工具,连接你所有喜爱的工具:Gmail、日历以及其他 40 多个工具。
graphlit-mcp-server
模型上下文协议 (MCP) 服务器实现了 MCP 客户端与 Graphlit 服务之间的集成。 除了网络爬取之外,还可以将任何内容(从 Slack 到 Gmail 再到播客订阅源)导入到 Graphlit 项目中,然后从 MCP 客户端检索相关内容。
Kagi MCP Server
一个 MCP 服务器,集成了 Kagi 搜索功能和 Claude AI,使 Claude 能够在回答需要最新信息的问题时执行实时网络搜索。
e2b-mcp-server
使用 MCP 通过 e2b 运行代码。
Neon MCP Server
用于与 Neon 管理 API 和数据库交互的 MCP 服务器
Exa MCP Server
模型上下文协议(MCP)服务器允许像 Claude 这样的 AI 助手使用 Exa AI 搜索 API 进行网络搜索。这种设置允许 AI 模型以安全和受控的方式获取实时的网络信息。