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.
- Upstream: https://github.com/browser-use/browser-harness
- Install doc this setup follows: https://github.com/browser-use/browser-harness/blob/main/install.md
- Author: Browser Use · License: MIT
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.json | details pane | actually connects |
|---|---|---|
"mcpServers": "./mcp.json" | 0 | yes <- used here |
"mcpServers": ["./mcp.json"] | 0 | yes |
"mcpServers": { ...inline... } | 0 | yes |
no field, .mcp.json at the root | 1 | yes |
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.