MCP Hub
Back to servers

proxy-mcp

An HTTP/HTTPS MITM proxy server that enables capture, modification, and mocking of network traffic across Chrome, CLI tools, Docker containers, and Android devices. It supports advanced capabilities like JA3/JA4 TLS fingerprinting, JA3 spoofing, and upstream proxy chaining.

Updated
Feb 11, 2026

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.

44 tools + 5 resources. Built on mockttp.

Boundaries

  • Only sees traffic configured to route through it (not a network tap or packet sniffer)
  • Spoofs outgoing JA3 only (via CycleTLS), not JA4 (JA4 is capture-only)
  • Can add, overwrite, or delete HTTP headers — does not control header order
  • 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:

CapabilityCDP / Playwrightproxy-mcp
See/modify DOM, run JS in pageYesNo
Read cookies, localStorage, sessionStorageYes (browser cookie jar)No (but sees Cookie/Set-Cookie headers on the wire)
Capture HTTP request/response bodiesYes 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 handlersYes (declarative rules, hot-reload)
Upstream proxy chaining (geo, auth)Single browser via --proxy-serverGlobal + per-host upstreams across all clients (SOCKS4/5, HTTP, HTTPS, PAC)
TLS fingerprint capture (JA3/JA4/JA3S)NoYes
JA3 spoofingNoProxy-side only (CycleTLS re-issues matching requests with spoofed JA3; does not alter the client's TLS handshake)
Intercept non-browser traffic (curl, Python, Android apps)NoYes (interceptors)

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.

Attach Playwright to proxy-launched Chrome:

  1. Call proxy_start
  2. Call interceptor_chrome_launch
  3. Call interceptor_chrome_cdp_info (or read proxy://chrome/targets) to get cdp.httpUrl (Playwright) and cdp.browserWebSocketDebuggerUrl (raw CDP clients)
  4. In Playwright:
    import { chromium } from "playwright";
    const browser = await chromium.connectOverCDP("http://127.0.0.1:<cdp-port>");
    

Setup

npm install
npm run build

Claude Code .mcp.json

{
  "mcpServers": {
    "proxy": {
      "command": "node",
      "args": ["/path/to/proxy-mcp/dist/index.js"]
    }
  }
}

Tools Reference

Lifecycle (4)

ToolDescription
proxy_startStart MITM proxy, auto-generate CA cert
proxy_stopStop proxy (traffic/cert retained)
proxy_statusRunning state, port, rule/traffic counts
proxy_get_ca_certCA certificate PEM + SPKI fingerprint

Upstream Proxy (4)

ToolDescription
proxy_set_upstreamSet global upstream proxy
proxy_clear_upstreamRemove global upstream
proxy_set_host_upstreamPer-host upstream override
proxy_remove_host_upstreamRemove per-host override

Interception Rules (6)

ToolDescription
proxy_add_ruleAdd rule with matcher + handler
proxy_update_ruleModify existing rule
proxy_remove_ruleDelete rule
proxy_list_rulesList all rules by priority
proxy_enable_ruleEnable a disabled rule
proxy_disable_ruleDisable without removing

Traffic Capture (4)

ToolDescription
proxy_list_trafficPaginated traffic list with filters
proxy_get_exchangeFull exchange details by ID
proxy_search_trafficFull-text search across traffic
proxy_clear_trafficClear capture buffer

Modification Shortcuts (3)

ToolDescription
proxy_inject_headersAdd/overwrite/delete headers on matching traffic (set value to null to remove a header)
proxy_rewrite_urlRewrite request URLs
proxy_mock_responseReturn mock response for matched requests

TLS Fingerprinting (6)

ToolDescription
proxy_get_tls_fingerprintsGet JA3/JA4 client fingerprints + JA3S for a single exchange
proxy_list_tls_fingerprintsList unique JA3/JA4 fingerprints across all traffic with counts
proxy_set_ja3_spoofEnable JA3 spoofing via CycleTLS for outgoing requests
proxy_clear_ja3_spoofDisable JA3 spoofing and shut down CycleTLS
proxy_get_tls_configReturn current TLS config (server capture, JA3 spoof state)
proxy_enable_server_tls_captureToggle server-side JA3S capture (monkey-patches tls.connect)

JA3 spoofing works by re-issuing the request from the proxy via CycleTLS with a specified JA3 string. The origin server sees the proxy's spoofed fingerprint, not the original client's. JA4 fingerprints are captured (read-only) but spoofing is not supported.

Interceptors (17)

Interceptors configure targets (browsers, processes, devices, containers) to route their traffic through the proxy automatically.

Discovery (3)

ToolDescription
interceptor_listList all interceptors with availability and active target counts
interceptor_statusDetailed status of a specific interceptor
interceptor_deactivate_allEmergency cleanup: kill all active interceptors across all types

Chrome (3)

ToolDescription
interceptor_chrome_launchLaunch Chrome/Chromium/Brave/Edge with proxy flags and SPKI cert trust
interceptor_chrome_cdp_infoGet CDP endpoints (HTTP + WebSocket) and tab targets for a launched Chrome
interceptor_chrome_closeClose a Chrome instance by target ID

Launches with isolated temp profile, auto-cleaned on close. Supports chrome, chromium, brave, edge.

Terminal / Process (2)

ToolDescription
interceptor_spawnSpawn a command with proxy env vars pre-configured (HTTP_PROXY, SSL certs, etc.)
interceptor_killKill a spawned process and retrieve stdout/stderr

Sets 18+ env vars covering curl, Node.js, Python requests, Deno, Git, npm/yarn.

Android ADB (4)

ToolDescription
interceptor_android_devicesList connected Android devices via ADB
interceptor_android_activateFull interception: inject CA cert, ADB reverse tunnel, optional Wi-Fi proxy
interceptor_android_deactivateRemove ADB tunnel and clear Wi-Fi proxy
interceptor_android_setupQuick setup: push CA cert + ADB reverse tunnel (no Wi-Fi proxy)

Caveats: CA cert injection requires root access. Supports Android 14+ (/apex/com.android.conscrypt/cacerts/). Wi-Fi proxy is opt-in (default off).

Android Frida (3)

ToolDescription
interceptor_frida_appsList running apps on device via Frida
interceptor_frida_attachAttach to app and inject SSL unpinning + proxy redirect scripts
interceptor_frida_detachDetach Frida session from app

Caveats: Requires frida-server running on device. Uses frida-js (pure JS, no native binaries on host). SSL unpinning covers OkHttp, BoringSSL, TrustManager, system TLS — but may not work against QUIC or custom TLS stacks.

Docker (2)

ToolDescription
interceptor_docker_attachInject proxy env vars and CA cert into running container
interceptor_docker_detachRemove proxy config from container

Two modes: exec (live injection, existing processes need restart) and restart (stop + restart container). Uses host.docker.internal for proxy URL.

Resources

URIDescription
proxy://statusProxy running state and config
proxy://ca-certCA certificate PEM
proxy://traffic/summaryTraffic stats: method/status breakdown, top hostnames, TLS fingerprint stats
proxy://interceptorsAll interceptor metadata and activation status
proxy://chrome/targetsCDP endpoints + tab targets for active Chrome instances

Usage Example

# Start the proxy
proxy_start

# Configure device to use proxy (Wi-Fi settings or interceptors)
# Install CA cert on device (proxy_get_ca_cert)

# Or use interceptors to auto-configure targets:
interceptor_chrome_launch                    # Launch Chrome with proxy
interceptor_spawn --command curl --args '["https://example.com"]'  # Spawn proxied process
interceptor_android_activate --serial DEVICE_SERIAL               # Android device

# Set upstream proxy for geolocation
proxy_set_upstream --proxy_url socks5://user:pass@geo-proxy:1080

# Mock an API response
proxy_mock_response --url_pattern "/api/v1/config" --status 200 --body '{"feature": true}'

# Inject auth headers (set value to null to delete a header)
proxy_inject_headers --hostname "api.example.com" --headers '{"Authorization": "Bearer token123"}'

# View captured traffic
proxy_list_traffic --hostname_filter "api.example.com"
proxy_search_traffic --query "error"

# TLS fingerprinting
proxy_list_tls_fingerprints                # See unique JA3/JA4 fingerprints
proxy_set_ja3_spoof --ja3 "771,4865-..."   # Spoof outgoing JA3

Architecture

  • State: ProxyManager singleton manages mockttp server, rules, traffic
  • Rule rebuild: Rules must be set before mockttp start(), so rule changes trigger stop/recreate/restart cycle
  • Traffic capture: on('request') + on('response') events, correlated by request ID
  • Ring buffer: 1000 entries max, body previews capped at 4KB
  • TLS capture: Client JA3/JA4 from mockttp socket metadata; server JA3S via tls.connect monkey-patch
  • Interceptors: Managed by InterceptorManager, each type registers independently

Testing

npm test              # All tests
npm run test:unit     # Unit tests only
npm run test:integration  # Integration tests

Credits

Core Libraries

ProjectRole
mockttpMITM proxy engine, rule system, CA generation
CycleTLSJA3 spoofing via Go TLS subprocess
frida-jsPure-JS Frida client for Android instrumentation
chrome-launcherChrome/Chromium process management
dockerodeDocker API client
@modelcontextprotocol/sdkMCP server framework

Vendored Frida Scripts

All scripts in src/frida-scripts/vendor/ are derived from httptoolkit/frida-interception-and-unpinning (MIT):

  • config-template.js — proxy/cert config injection
  • android-certificate-unpinning.js — TrustManager + OkHttp + BoringSSL hooks
  • android-system-certificate-injection.js — runtime cert injection via KeyStore
  • android-proxy-override.js — ProxySelector monkey-patch
  • native-tls-hook.js — BoringSSL/OpenSSL native hooks
  • native-connect-hook.js — libc connect() redirect

Reviews

No reviews yet

Sign in to write a review