| name | agent-browser |
| description | Fast browser automation CLI for AI agents. **ALWAYS use instead of Playwright MCP tools** for web testing, screenshots, form filling, and UI verification. Use when user says "open in browser", "check the site", "take a screenshot", "fill the form", "test the UI", or any browser interaction. Also use as a fallback when a task requires visual browser interaction that CLIs and APIs cannot handle (e.g., OAuth flows, complex dashboards, visual verification). |
agent-browser CLI Reference
When to Use This Skill
Prefer programmatic tools first (CLIs, APIs, MCP servers). Use agent-browser when:
- The task requires a visual browser (OAuth login, dashboards, visual verification)
- No CLI/API alternative exists for the interaction
- The user explicitly asks to "open", "browse", "check the site", or "take a screenshot"
- You need to fill forms, click through UIs, or test web interfaces
Do NOT use Playwright MCP tools. If browser automation is needed, always use agent-browser CLI instead.
Session Hygiene (REQUIRED — prevents leaked browsers)
agent-browser runs a persistent per-session daemon that owns a real "Chrome for
Testing" browser. That daemon outlives the CLI — the browser keeps running (and,
if left on an auto-refreshing page, keeps re-rendering and pegging a CPU core) until
something closes it. On shared fleet/worker hosts a leaked browser starves the box
(CTL-1500). So treat every session as something you must open with a name and
always close:
- REQUIRED: always pass
--session <name>. Pick a short task-specific name
(e.g. ctl-1500-verify, gh-review). Never rely on the implicit default
session — a shared default collides across concurrent workers and is the hardest
leak to attribute and clean up.
- REQUIRED: always
close when done. End every task with
agent-browser --session <name> close. Do it in the same turn you finish the
browser work — do not leave a session open "in case". If you took a wrong turn,
close before starting over.
- BANNED: unnamed / shared-
default sessions. Every open must carry an
explicit --session. An un-named session on a worker host is a leak waiting to
happen.
- BANNED: abandoned open-loops. Never write retry/wait loops that call
agent-browser ... open (e.g. until agent-browser --session s open <url>; do sleep …; done) without a guaranteed matching close. Each failed open can
spawn/adopt a browser; a loop that exits without closing strands them. If you must
poll, open once, then use wait/reload, and close in a trap/finally.
- On a worker/CI host, prefer the shortest-lived session possible and close it
immediately; a phase worker that exits without closing relies on the host reaper
(orphan-sweep vector 5) to clean up, which is a backstop, not a substitute.
Starting a Browser Session
ALWAYS use --headed and a named session. Headed mode shows a visible browser window so the user can watch. Sessions preserve browser state so they survive accidental closes and can be resumed. Always close the session when the task is done (see Session Hygiene above).
agent-browser --headed --session my-task open https://example.com
agent-browser --headed --session my-task snapshot -i -c
Pick a short descriptive session name for the task (e.g., v0-chat, gh-review, test-login). Use the same --headed --session <name> flags on every command.
Authentication Flow
If a site requires login, you MUST use --headed so the user can see and interact with the browser window.
- Open the login page in headed mode with a named session:
agent-browser --headed --session my-task open https://example.com/login
- Tell the user: "A browser window opened. Please log in, then let me know when you're ready."
- Wait for the user to confirm they've logged in. Do NOT proceed until they say so.
- Then continue:
agent-browser --headed --session my-task snapshot -i -c
- Optionally save the authenticated state for reuse:
agent-browser --headed --session my-task state save ./auth-state.json
Sessions persist across commands — once logged in, the session stays active for all subsequent commands. If the browser is closed accidentally, re-open with the same --session name to resume.
Global Flags
These flags apply to ALL commands and should appear before the command name:
--headed
--session <name>
--profile <path>
--state <path>
--headers <json>
--proxy <url>
--ignore-https-errors
--device <name>
--json
--debug
--config <path>
Environment variables (alternative to flags):
AGENT_BROWSER_HEADED=1
AGENT_BROWSER_SESSION=<name>
AGENT_BROWSER_PROFILE=<path>
Quick Reference
agent-browser --headed --session s open <url>
agent-browser --headed --session s back
agent-browser --headed --session s reload
agent-browser --headed --session s snapshot -i -c
agent-browser --headed --session s click @e2
agent-browser --headed --session s fill @e3 "text"
agent-browser --headed --session s type @e3 "text"
agent-browser --headed --session s press Enter
agent-browser --headed --session s screenshot
agent-browser --headed --session s screenshot -f
agent-browser --headed --session s screenshot file.png
agent-browser --headed --session s get text @e1
agent-browser --headed --session s get url
agent-browser --headed --session s get title
agent-browser session list
agent-browser --headed --session s close
Efficiency Tips
- Use
-i -c flags on snapshot to get only interactive elements in compact form
- Chain commands with
&& for quick workflows
- Use @refs directly from snapshots — no CSS selectors needed
- Sessions persist — browser state maintained across commands
- ALWAYS pass
--headed — default is headless, user needs to see the browser
All Commands
Navigation
agent-browser open <url>
agent-browser back
agent-browser forward
agent-browser reload
agent-browser close
Interaction
agent-browser click <sel>
agent-browser dblclick <sel>
agent-browser focus <sel>
agent-browser type <sel> <text>
agent-browser fill <sel> <text>
agent-browser press <key>
agent-browser hover <sel>
agent-browser select <sel> <val>
agent-browser check <sel>
agent-browser uncheck <sel>
agent-browser scroll <dir> [px]
agent-browser scrollintoview <sel>
agent-browser drag <src> <tgt>
agent-browser upload <sel> <files>
Snapshot (AI-Optimized)
agent-browser snapshot
agent-browser snapshot -i
agent-browser snapshot -i -c
agent-browser snapshot -C
agent-browser snapshot -d <n>
agent-browser snapshot -s "<css>"
agent-browser snapshot --json
Screenshots
agent-browser screenshot [path]
agent-browser screenshot -f
agent-browser screenshot --annotate
agent-browser pdf <path>
Information
agent-browser get text <sel>
agent-browser get html <sel>
agent-browser get value <sel>
agent-browser get attr <sel> <attr># Get attribute
agent-browser get title
agent-browser get url
agent-browser get count <sel>
agent-browser get box <sel>
agent-browser get styles <sel>
State Checks
agent-browser is visible <sel>
agent-browser is enabled <sel>
agent-browser is checked <sel>
Wait
agent-browser wait <selector>
agent-browser wait <ms>
agent-browser wait --text "text"
agent-browser wait --url "pattern"
agent-browser wait --load networkidle
agent-browser wait --fn "condition"
agent-browser wait --download [path]
State Management (Auth Persistence)
agent-browser state save <path>
agent-browser state load <path>
agent-browser state list
agent-browser state show <file>
agent-browser state clear [name]
agent-browser state clear --all
Saved Auth Flows
agent-browser auth save <name>
agent-browser auth save <name> \
--url <url> \
--username <user> \
--password <pass> \
--username-selector <sel> \
--password-selector <sel> \
--submit-selector <sel>
agent-browser auth login <name>
agent-browser auth list
agent-browser auth show <name>
agent-browser auth delete <name>
Cookies & Storage
agent-browser cookies
agent-browser cookies set <n> <v>
agent-browser cookies clear
agent-browser storage local
agent-browser storage local <key>
agent-browser storage local set <k> <v>
agent-browser storage local clear
agent-browser storage session
Tabs
agent-browser tab
agent-browser tab new [url]
agent-browser tab <n>
agent-browser tab close [n]
Frames
agent-browser frame <sel>
agent-browser frame main
JavaScript
agent-browser eval '<expression>'
agent-browser eval --stdin
Console & Errors
agent-browser console
agent-browser console --clear
agent-browser errors
Dialogs
agent-browser dialog accept [text]
agent-browser dialog dismiss
Settings
agent-browser set viewport <w> <h>
agent-browser set device <name>
agent-browser set media [dark|light]
agent-browser set geo <lat> <lng>
agent-browser set offline [on|off]
agent-browser set headers <json>
agent-browser set credentials <u> <p>
Network
agent-browser network requests
agent-browser network requests --filter api
agent-browser network requests --clear
agent-browser network route <url> --abort
agent-browser network route <url> --body <json>
agent-browser network unroute [url]
Semantic Locators
agent-browser find role <role> <action>
agent-browser find text <text> <action>
agent-browser find label <label> <action>
agent-browser find placeholder <ph> <action>
agent-browser find alt <text> <action>
agent-browser find testid <id> <action>
agent-browser find nth <n> <sel> <action>
Debug & Recording
agent-browser trace start [path]
agent-browser trace stop [path]
agent-browser record start <path>
agent-browser record stop
agent-browser highlight <sel>
agent-browser connect <port|url>
Important Rules
- Always use
--headed on every command — default is headless, user needs to see the browser
- Always use
--session <name> on every command — preserves state, enables recovery
- For authenticated sites, use
--headed and ask the user to log in manually
- Use snapshot -i -c for AI-efficient page state
- Use @refs from snapshots for interactions, not CSS selectors
- agent-browser, NOT Playwright MCP — always prefer the CLI
- ALWAYS close when done (REQUIRED):
agent-browser --session <name> close. The daemon + browser outlive the CLI and leak a CPU-pegging browser on shared hosts if left open (CTL-1500). Never leave a session open; never use unnamed/shared-default sessions or abandoned until … open loops. See Session Hygiene above.