Skip to main content

browser-agent

PyPI CI Release Python 3.12+ License: MIT

🔗 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 when idle — browser-agent doctor reports what it actually costs).

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

No systemd (container, WSL, a supervisor of your own)? The same install works — --no-unit skips the unit file and you run the daemon yourself:

uv tool install browser-agent-server
sudo browser-agent setup --no-apt --no-unit         # chrome only; deps already in the image
browser-agent doctor                                # self-check
browser-agent serve &                               # foreground/background under your supervisor

Use it three ways:

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

Driving a live session over SSH needs no bridge — every action the daemon implements is a subcommand:

browser-agent goto "https://example.com"                # navigate the session
browser-agent screenshot /tmp/page.png                  # capture the X11 window
browser-agent html                                      # read the page back
browser-agent move 640 360 && browser-agent click 640 360
browser-agent type "hello" --submit                     # then press Return
browser-agent key Page_Down
browser-agent scroll --clicks 5 --direction down
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; a human-scale pause between press and release
Cloudflare Turnstile Detects the interstitial, locates the checkbox via the DOM and clicks it with the real X11 mouse
RAM discipline one renderer, a bounded JS heap, the tab reset after each fetch, and auto-hibernation after an idle period — see the env table for the timeout and browser-agent doctor for what it costs
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)
Vision agent /agent runs a screenshot→decision→X11 loop; Gemini access goes through the central gemini-router proxy (GEMINI_ROUTER_URL/GEMINI_ROUTER_TOKEN) — the daemon holds no keys. Every run leaves a full artifact directory (run_dir in the response): the exact screenshots, raw model exchanges, decisions, untruncated final text

Docs

For AI agents

Install one-liner: uv tool install browser-agent-server && sudo browser-agent setup --with-chrome && browser-agent doctor No-systemd host (container/WSL): uv tool install browser-agent-server && sudo browser-agent setup --no-apt --no-unit && browser-agent serve & Self-check: browser-agent doctor --json (exit 0 = host ready; every failed check carries a fix command you can run). Companion MCP for agent hosts: vernikr/browser-agent-mcp. SSH-only agent, no bridge: the CLI drives the whole session — goto, move, click, type, key, scroll, screenshot, html, stop. Every one is a subcommand, so nothing needs the MCP layer to be installed.

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.2.1

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.2.1
File Size Uploaded
browser_agent_server-1.2.1.tar.gz 218.2 kB Details

Built distribution (wheel)

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

Total release size: 272.1 kB

Release files / browser_agent_server-1.2.1.tar.gz

Download URL browser_agent_server-1.2.1.tar.gz
Size 218.2 kB
Tags Source
SHA-256 checksum
How to use checksums
f9b6a5b90093ec034e2bc434eb328c9954811034bd2c03c0cdfff2b78b92dbd1
BLAKE2b-256 checksum
How to use checksums
92b4b8b374a941173aaacf5449cb2ac8321ddfd92b7687e1152a4593bf9e4d09
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via twine/7.0.0 CPython/3.13.16

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

Download URL browser_agent_server-1.2.1-py3-none-any.whl
Size 53.9 kB
Tags Python 3
SHA-256 checksum
How to use checksums
0fd07c9ec4f37c3af16e4baa00eb1af66b3cb1a5bc7fb52a47f031d29dd02e84
BLAKE2b-256 checksum
How to use checksums
8d260237cb147aa3d35cf38ef695ddafd33cfccfdde800a964f555680a821069
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via twine/7.0.0 CPython/3.13.16

Release history Release notifications | RSS feed

1.5.1

2 release files

1.5.0

2 release files

1.4.0

2 release files

1.3.0

2 release files

1.2.3

2 release files

1.2.2

2 release files

This release

1.2.1 This release

2 release files

1.2.0

2 release files

1.1.2

2 release files

1.1.1

2 release files

1.1.0

2 release files

1.0.23

2 release files

1.0.22

2 release files

1.0.21

2 release files

1.0.20

2 release files

1.0.19

2 release files

1.0.18

2 release files

1.0.17

2 release files

1.0.16

2 release files

1.0.15

2 release files

1.0.14

2 release files

1.0.13

2 release files

1.0.12

2 release files

1.0.11

2 release files

1.0.10

2 release files

1.0.9

2 release files

1.0.8

2 release files

1.0.7

2 release files

1.0.6

2 release files

1.0.5

2 release files

1.0.4

2 release files

1.0.3

2 release files

1.0.2

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