Skip to main content

browser-agent

🔗 Companion project: @vernikr/browser-agent-mcp — the MCP server that exposes this daemon to LLM agents (Claude Code, Cursor, Freebuff…). The two projects are developed together and speak the HTTP contract in docs/api.md.

Real headful Chrome on Xvfb with a hardware-level X11 mouse. One localhost daemon gives any project, script, or AI agent on a Linux box a genuine desktop browser: steered over real XTEST input events on randomized Bézier paths, with zero-leak CDP (no Runtime.enable), Cloudflare Turnstile auto-solve, and RAM discipline for tiny VPSes (auto-hibernates to ~12 MB idle).

Why not Playwright/CDP directly: mainstream automation stacks call Runtime.enable / Debugger.enable on connect — the primary headless-detection vector. This daemon's CDP client refuses those methods by construction and reads the DOM via DOM.getOuterHTML; all mouse/keyboard input goes through the X server, so clicks are isTrusted: true hardware events.

Install & provision (server, Ubuntu 24.04)

curl -LsSf https://astral.sh/uv/install.sh | sh     # if uv is missing
uv tool install browser-agent-server
sudo browser-agent setup --with-chrome              # apt deps + google-chrome-stable + systemd unit
sudo browser-agent doctor                           # self-check

Use it three ways:

browser-agent fetch "https://example.com" --text        # CLI
curl -s 127.0.0.1:8765/status                           # HTTP API (any language)
from browser_agent import BrowserClient                 # Python SDK

client = BrowserClient()
page = client.fetch("https://example.com")
print(page["title"], len(page["text"]))

Connect from your workstation (agents)

Point the MCP bridge at this daemon — details and ready-made agent configs live in the companion repo:

pnpm dlx @vernikr/browser-agent-mcp init --client claude-code

What you get

Capability Detail
Real Chrome, never headless google-chrome-stable headed on on-demand Xvfb (1280×720x24) + openbox
Stealth CDP Hand-rolled RFC-6455 client; Runtime.enable/Console.enable/Debugger.enable refused by construction
Human-like input X11 XTEST mouse on randomized cubic Bézier curves with ease-in/out pacing and Gaussian micro-jitter; human hold delays 55–125 ms
Cloudflare Turnstile Detects the interstitial, locates the checkbox via the DOM and clicks it with the real X11 mouse
RAM discipline --renderer-process-limit=1, JS heap capped at 256 MB, tab reset after each fetch, auto-hibernation after idle (default 60 s) ⇒ ~12 MB resting
One at a time Global mutex: 1 tab across all callers
Interfaces CLI browser-agent, HTTP API 127.0.0.1:8765, Python SDK browser_agent.BrowserClient
Live view browser-agent vnc start + SSH-forwarded VNC
Optional WARP route Auto-retry blocked pages through a local SOCKS5 proxy (127.0.0.1:40000)

Docs

For AI agents

Install one-liner: uv tool install browser-agent-server && sudo browser-agent setup --with-chrome && browser-agent doctor Self-check: browser-agent doctor --json (exit 0 = host ready). Companion MCP for agent hosts: vernikr/browser-agent-mcp.

Platform support

Linux/X11 only (Xvfb, XTEST). Works great on a 1 vCPU / 1 GB RAM VPS. macOS/Windows workstations should run the MCP bridge and talk to a Linux host running this daemon.

License

MIT — see LICENSE.

Metadata

Release files for browser-agent-server 1.0.2

For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.

Source distribution (sdist)

Source distribution for browser-agent-server 1.0.2
File Size Uploaded
browser_agent_server-1.0.2.tar.gz 77.2 kB Details

Built distribution (wheel)

Table of built distributions (wheels) for browser-agent-server 1.0.2
File Interpreter ABI Platform
browser_agent_server-1.0.2-py3-none-any.whl Python 3 none any Details

Total release size: 106.0 kB

Release files / browser_agent_server-1.0.2.tar.gz

Download URL browser_agent_server-1.0.2.tar.gz
Size 77.2 kB
Tags Source
SHA-256 checksum
How to use checksums
9b7b06924de63ff59e54d6d889683f3748cc4067a4323187885824d809b26cbd
BLAKE2b-256 checksum
How to use checksums
85f9fc7a12ac34d75123604c1f9a7c2696ee704d54e66964d410d5fdb9a4a825
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.14

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on Oct 10, 2026.

Transparency log

Release files / browser_agent_server-1.0.2-py3-none-any.whl

Download URL browser_agent_server-1.0.2-py3-none-any.whl
Size 28.8 kB
Tags Python 3
SHA-256 checksum
How to use checksums
b51e05e039c5b9da9798c1c28de89b7614a21c37593b6dd147bb45a51f0f6b7e
BLAKE2b-256 checksum
How to use checksums
a8dee2008d3ce1a7f981a1905e26f17f31f72ad3e05121e09342e8dbfabf96c7
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.14

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on Oct 10, 2026.

Transparency log

Release history Release notifications | RSS feed

1.0.4

2 release files

1.0.3

2 release files

This release

1.0.2 This release

2 release files

1.0.1

2 release files

1.0.0

2 release files

Anthropic, PBC Visionary sponsor Bloomberg Visionary sponsor Hudson River Trading Visionary sponsor Meta Visionary sponsor NVIDIA Visionary sponsor Microsoft Sustainability sponsor Depot Continuous Integration AWS Cloud computing and Security Sponsor Datadog Monitoring Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page