HumanProxy exposes a standard SOCKS5 proxy. Anything that speaks SOCKS5 — Playwright, Puppeteer, Selenium, Chrome, curl, an LLM browser-agent — routes through your connected exit device with no code changes beyond a proxy setting.
device-id and access-token come from your dashboard — hit “Route an agent” on a device and create a connection. Username = device id, password = access token. Use socks5h/--socks5-hostname so DNS resolves at the exit, not locally.
The model only decides what to do; a runtime you control does the actual browsing and HTTP calls. That runtime is what you point at HumanProxy — so its requests leave from your device's residential IP.
export HTTPS_PROXY=socks5h://…. No extra tooling.socks5h://… directly.The friendliest path: add HumanProxy as an MCP connector and your assistant gets four tools — fetch_url (fast HTTP; supports format:text for clean reading), browse (real headless Chrome that runs JavaScript, for SPAs & JS bot-checks), browse_interactive (a visible browser that pauses so you can solve a CAPTCHA / log in, then hands the page back), and exit_ip — all through your residential exit, no proxy setup in your code. (browse* need Chrome installed.)
Download humanproxy-mcp:
macOS (Apple Silicon) ·
macOS (Intel) ·
Windows ·
Linux.
On macOS/Linux: chmod +x humanproxy-mcp-* (macOS also xattr -dr com.apple.quarantine …). Then in Claude Desktop's claude_desktop_config.json:
{
"mcpServers": {
"humanproxy": {
"command": "/path/to/humanproxy-mcp",
"env": { "HUMANPROXY_PROXY": "socks5h://<device-id>:<access-token>@195.201.197.248:1080" }
}
}
}
Cursor uses .cursor/mcp.json (same shape). Claude Code: claude mcp add humanproxy -e HUMANPROXY_PROXY=… -- /path/to/humanproxy-mcp. Copy the connection string from the app or dashboard (“Route an agent”), then ask your assistant “use exit_ip to check my IP.”
# DNS resolved at the exit (socks5-hostname), returns the exit's residential IP
curl --socks5-hostname "$DEVICE:$TOKEN@socks.humanproxy.teoremas.dev:1080" https://api.ipify.org
Most agentic browser stacks (browser-use, LangChain/LlamaIndex browser tools, custom Playwright agents) launch Chromium under the hood — set the proxy there and every agent action egresses through the exit.
from playwright.sync_api import sync_playwright
with sync_playwright() as p:
browser = p.chromium.launch(proxy={
"server": "socks5://socks.humanproxy.teoremas.dev:1080",
"username": "<device-id>",
"password": "<access-token>",
})
page = browser.new_page()
page.goto("https://example.com") # comes from the exit's IP
const browser = await chromium.launch({ proxy: {
server: 'socks5://socks.humanproxy.teoremas.dev:1080',
username: '<device-id>', password: '<access-token>',
}});
// Puppeteer takes proxy auth via page.authenticate()
const browser = await puppeteer.launch({
args: ['--proxy-server=socks5://socks.humanproxy.teoremas.dev:1080'],
});
const page = await browser.newPage();
await page.authenticate({ username: '<device-id>', password: '<access-token>' });
# SOCKS5 with auth is easiest via a small local forwarder, or Chrome flags:
opts.add_argument("--proxy-server=socks5://socks.humanproxy.teoremas.dev:1080")
# Chrome ignores inline SOCKS creds; run one authless local hop with e.g.
# `gost -L socks5://:1081 -F socks5://DEVICE:[email protected]:1080`
# then point Chrome at socks5://127.0.0.1:1081
chromium --proxy-server="socks5://socks.humanproxy.teoremas.dev:1080"
Chrome doesn't accept inline SOCKS credentials; put an authless local forwarder in front (see the Selenium note) or use Playwright/Puppeteer which pass auth for you.
import requests
proxies = { "http": p, "https": p } if (p := "socks5h://<device-id>:<access-token>@socks.humanproxy.teoremas.dev:1080") else {}
requests.get("https://api.ipify.org", proxies=proxies) # pip install requests[socks]
Our own agent browser takes a per-profile SOCKS — set the same endpoint as the profile proxy and it egresses through your exit automatically.
your-relay:1080.