Skip to content

posquit0/browser-harness

v0.1.13MIT

Direct browser control via CDP. Drives the user's real Chrome (or a Browser Use cloud browser) with coordinate clicks, screenshots, and Python helpers — no selector hunting. Requires the browser-harness CLI, installed here through mise.

browser-harness

Drive a real Chrome over CDP from an agent: clicks, typing, navigation, logged-in sessions, JS-rendered and bot-protected pages.

Origin

Repackaged in the Agent Plugins 1.0 layout so several agents share one copy.

How this differs from upstream's install doc

install.md installs the CLI with uv tool install and writes the skill into one agent's directory. Here the CLI is a pinned entry in the global mise config (pypi:browser-harness, which mise resolves through uv), and the skill is shared by every client via symlinks.

Layout

browser-harness/
├── plugin.json                 # Agent Plugins 1.0  -> Cursor, Codex, Kiro
├── mcp.json                    # browser-harness-mcp (needs the [mcp] extra)
├── .claude-plugin/plugin.json  # Claude Code; points mcpServers at ./mcp.json
└── skills/browser-harness/
    └── SKILL.md                # GENERATED, not in the chezmoi source

One mcp.json serves every client. Cursor, Codex and Kiro read it because the Agent Plugins spec puts it there; Claude Code reads it because .claude-plugin/plugin.json sets "mcpServers": "./mcp.json".

Do not trust claude plugin details here — it counts only servers declared at the default .mcp.json location. Measured on 2.1.272, pane count vs. servers that actually connect (claude mcp list):

.claude-plugin/plugin.jsondetails paneactually connects
"mcpServers": "./mcp.json"0yes <- used here
"mcpServers": ["./mcp.json"]0yes
"mcpServers": { ...inline... }0yes
no field, .mcp.json at the root1yes

Every documented form works at runtime. Verify with claude mcp list, which shows plugin:browser-harness:browser-harness ... Connected.

browser-harness-mcp is invoked by bare name, resolved through the mise shims on PATH, matching how playwright-mcp is already configured here. A client launched without mise on PATH will not find it.

SKILL.md is produced by browser-harness skill, so it always matches the installed CLI. It is regenerated by .chezmoiscripts/darwin/run_onchange_after_02_generate_browser_harness_skill.sh.tmpl whenever the pinned version in the global mise config changes.

Not managed here

Recording consent (browser-harness recordings), telemetry, auth and cloud daemons are runtime state owned by the CLI. See upstream install.md.