proxy-mcp
proxy-mcp is an MCP server that runs an explicit HTTP/HTTPS MITM proxy (L7). It captures requests/responses, lets you modify traffic in-flight (headers/bodies/mock/forward/drop), supports upstream proxy chaining, and records TLS fingerprints for connections to the proxy (JA3/JA4) plus optional upstream server JA3S. It also ships "interceptors" to route Chrome, CLI tools, Docker containers, and Android devices/apps through the proxy.
81 tools + 8 resources + 4 resource templates. Built on mockttp.
Boundaries
- Only sees traffic configured to route through it (not a network tap or packet sniffer)
- Spoofs outgoing JA3 + HTTP/2 fingerprint + header order (via impit — native Rust TLS impersonation), not JA4 (JA4 is capture-only)
- Can add, overwrite, or delete HTTP headers; outgoing header order can be controlled via fingerprint spoofing
- Returns its own CA certificate — does not expose upstream server certificate chains
Pairs well with CDP/Playwright
Use CDP/Playwright for browser internals (DOM, JS execution, localStorage, cookie jar), and proxy-mcp for wire-level capture/manipulation + replay. They complement each other:
| Capability | CDP / Playwright | proxy-mcp |
|---|---|---|
| See/modify DOM, run JS in page | Yes | No |
| Read cookies, localStorage, sessionStorage | Yes (browser internals) | Yes for proxy-launched Chrome via DevTools Bridge list/get tools; for any client, sees Cookie/Set-Cookie headers on the wire |
| Capture HTTP request/response bodies | Yes for browser requests (protocol/size/streaming caveats) | Body previews only (4 KB cap, 1000-entry ring buffer) |
| Modify requests in-flight (headers, body, mock, drop) | Via route/intercept handlers | Yes (declarative rules, hot-reload) |
| Upstream proxy chaining (geo, auth) | Single browser via --proxy-server |
Global + per-host upstreams across all clients (SOCKS4/5, HTTP, HTTPS, PAC) |
| TLS fingerprint capture (JA3/JA4/JA3S) | No | Yes |
| JA3 + HTTP/2 fingerprint spoofing | No | Proxy-side only (impit re-issues matching requests with spoofed TLS 1.3, HTTP/2 frames, and header order; does not alter the client's TLS handshake) |
| Intercept non-browser traffic (curl, Python, Android apps) | No | Yes (interceptors) |
| Human-like mouse/keyboard/scroll input | Via Playwright page.mouse/page.keyboard (instant, detectable timing) |
Yes — CDP humanizer with Bezier curves, Fitts's law, WPM typing, eased scrolling |
A typical combo: launch Chrome via interceptor_chrome_launch (routes through proxy automatically), drive pages with Playwright/CDP, and use proxy-mcp to capture the wire traffic, inject headers, or spoof JA3 — all in the same session. For behavioral realism, use humanizer_* tools instead of Playwright's instant page.click()/page.type() — they dispatch human-like CDP Input.* events with natural timing curves.
Attach Playwright to proxy-launched Chrome:
- Call
proxy_start - Call
interceptor_chrome_launch - Read
proxy://chrome/primary(or callinterceptor_chrome_cdp_info) to getcdp.httpUrl(Playwright) andcdp.browserWebSocketDebuggerUrl(raw CDP clients) - In Playwright:
import { chromium } from "playwright"; const browser = await chromium.connectOverCDP("http://127.0.0.1:<cdp-port>");
Proxy-safe built-in CDP flow (single-instance safe):
- Call
proxy_start - Call
interceptor_chrome_launch - Call
interceptor_chrome_devtools_attachwith thattarget_id - Call
interceptor_chrome_devtools_navigatewithdevtools_session_id - Call
proxy_search_traffic --query "<hostname>"to confirm capture
Human-like input flow (bypasses bot detection):
- Call
proxy_start - Optionally enable fingerprint spoofing:
proxy_set_fingerprint_spoof --preset chrome_136 - Call
interceptor_chrome_launch --url "https://example.com"(stealth mode auto-enabled when spoofing) - Use
humanizer_move/humanizer_click/humanizer_type/humanizer_scrollwith thetarget_id - Use
humanizer_idlebetween actions to maintain natural presence
HTTP Proxy Configuration
1) Start proxy and get endpoint
proxy_start
Use the returned port and endpoint http://127.0.0.1:.
2) Browser setup (recommended: interceptor)
Use the Chrome interceptor so proxy flags and cert trust are configured automatically:
interceptor_chrome_launch --url "https://example.com"
Then bind DevTools safely to that same target:
interceptor_chrome_devtools_attach --target_id "chrome_"
interceptor_chrome_devtools_navigate --devtools_session_id "devtools_<id>" --url "https://apify.com"
3) Browser setup (manual fallback)
If launching Chrome manually, pass proxy flag yourself:
google-chrome --proxy-server="http://127.0.0.1:"
4) CLI/process setup
Route any process through proxy-mcp by setting proxy env vars:
export HTTP_PR
Tools 5
proxy_startStarts the HTTP/HTTPS MITM proxy server.interceptor_chrome_launchLaunches a Chrome instance automatically routed through the proxy.proxy_search_trafficSearches captured traffic logs for a specific hostname or query.proxy_set_fingerprint_spoofSets a preset for TLS fingerprint spoofing.humanizer_clickPerforms a human-like click action on a target.