| name | browser-automation |
| description | Automates browser interactions for web testing, form filling, screenshots, and data extraction. Use when user needs to navigate websites, interact with web pages, fill forms, take screenshots, or extract information. |
| requires | {"bins":["z-agent-browser"]} |
Browser Automation with z-agent-browser
BEFORE YOU START - Mode Selection
STOP. Ask the user which mode to use before executing any browser commands.
| Mode | Best For | Requires |
|---|
| Native (default) | General automation, scraping, testing | Nothing extra |
| Native + Stealth | Sites with bot detection (Cloudflare, etc.) | Nothing extra |
| CDP (Real Chrome) | Saved passwords, CAPTCHA, 2FA, Google/Gmail | Chrome running with --remote-debugging-port=9222 |
| Playwright MCP | Control user's existing Chrome tabs | Extension from GitHub + token |
Ask the user:
"I can automate browsers in a few ways:
- Headless - Fast, invisible automation (default)
- Headed - Visible browser window (for debugging or manual steps)
- Stealth - Bypasses bot detection (for protected sites)
- Real Chrome (CDP) - Uses your actual Chrome with saved passwords
- Playwright MCP - Controls your existing Chrome tabs (experimental)
Which mode should I use? (or describe what you're trying to do and I'll recommend one)"
Quick Decision Guide
Need saved passwords or 2FA? → CDP Mode (Real Chrome)
Site blocks automation? → Native + Stealth
Google/Gmail? → CDP for login, then Stealth
Just testing/scraping? → Native (default)
Want to watch it run? → Native + Headed
Control existing Chrome tabs? → Playwright MCP
Mode Setup Commands
z-agent-browser start
z-agent-browser start --headed
z-agent-browser start --stealth
z-agent-browser connect 9222
z-agent-browser open <url>
Core Workflow
- Navigate:
z-agent-browser open <url>
- Snapshot:
z-agent-browser snapshot -i (returns refs like @e1, @e2)
- Interact using refs from snapshot
- Re-snapshot after navigation or DOM changes
Token Efficiency: eval vs snapshot
Use snapshot -i for navigation (finding what to click):
z-agent-browser snapshot -i
Use eval for data extraction (getting information):
z-agent-browser eval "document.querySelectorAll('.item').length"
z-agent-browser eval "[...document.querySelectorAll('a')].map(a => a.href)"
| Task | Best Tool | Tokens |
|---|
| Find button to click | snapshot -i | ~200-500 |
| Count items on page | eval | ~10 |
| Extract all links/data | eval | ~50-100 |
| Fill a form | snapshot -i + refs | ~200-500 |
Rule: Need to CLICK? → snapshot. Need to READ/EXTRACT? → eval.
Commands
Browser Lifecycle
z-agent-browser start
z-agent-browser start --headed
z-agent-browser start --stealth
z-agent-browser status
z-agent-browser stop
z-agent-browser connect 9222
Navigation
z-agent-browser open <url>
z-agent-browser back
z-agent-browser forward
z-agent-browser reload
z-agent-browser close
Snapshot (page analysis)
z-agent-browser snapshot
z-agent-browser snapshot -i
z-agent-browser snapshot -c
z-agent-browser snapshot -d 3
z-agent-browser snapshot -s "#main"
Interactions (use @refs from snapshot)
z-agent-browser click @e1
z-agent-browser dblclick @e1
z-agent-browser fill @e2 "text"
z-agent-browser type @e2 "text"
z-agent-browser press Enter
z-agent-browser press Control+a
z-agent-browser hover @e1
z-agent-browser check @e1
z-agent-browser uncheck @e1
z-agent-browser select @e1 "value"
z-agent-browser scroll down 500
z-agent-browser scrollintoview @e1
z-agent-browser drag @e1 @e2
z-agent-browser upload @e1 file.pdf
Get Information
z-agent-browser get text @e1
z-agent-browser get html @e1
z-agent-browser get value @e1
z-agent-browser get attr @e1 href
z-agent-browser get title
z-agent-browser get url
z-agent-browser get count ".item"
Check State
z-agent-browser is visible @e1
z-agent-browser is enabled @e1
z-agent-browser is checked @e1
Screenshots & PDF
z-agent-browser screenshot
z-agent-browser screenshot path.png
z-agent-browser screenshot --full
z-agent-browser pdf output.pdf
State Persistence
z-agent-browser state save auth.json
z-agent-browser state load auth.json
Video Recording
z-agent-browser record start demo.webm
z-agent-browser record stop
z-agent-browser record restart take2.webm
Wait
z-agent-browser wait @e1
z-agent-browser wait 2000
z-agent-browser wait --text "Success"
z-agent-browser wait --url "**/dashboard"
z-agent-browser wait --load networkidle
JavaScript
z-agent-browser eval "document.title"
z-agent-browser eval "[...document.querySelectorAll('a')].map(a => a.href)"
Browser Settings
z-agent-browser set viewport 1920 1080
z-agent-browser set device "iPhone 14"
z-agent-browser set headers '{"X-Key":"v"}'
Tabs
z-agent-browser tab
z-agent-browser tab new [url]
z-agent-browser tab 2
z-agent-browser tab close
Debug
z-agent-browser console
z-agent-browser errors
z-agent-browser highlight @e1
Login Persistence
Use state save/load to persist login sessions:
z-agent-browser start --headed
z-agent-browser open "https://github.com"
z-agent-browser state save ~/.z-agent-browser/github.json
z-agent-browser stop
z-agent-browser start
z-agent-browser state load ~/.z-agent-browser/github.json
z-agent-browser open "https://github.com"
CDP Mode (Real Chrome)
For CAPTCHA, 2FA, or using saved passwords.
Note: Chrome 136+ blocks CDP on default profile. You must use --user-data-dir.
First-time setup (copy your Chrome profile):
mkdir -p ~/.z-agent-browser
cp -R "$HOME/Library/Application Support/Google/Chrome" ~/.z-agent-browser/chrome-profile
cp -R ~/.config/google-chrome ~/.z-agent-browser/chrome-profile
Launch and connect:
pkill -9 "Google Chrome"
"/Applications/Google Chrome.app/Contents/MacOS/Google Chrome" \
--remote-debugging-port=9222 \
--user-data-dir="$HOME/.z-agent-browser/chrome-profile" &
z-agent-browser connect 9222
z-agent-browser open "https://github.com"
Gmail/Google (Hybrid Workflow)
Google blocks Chromium automation. Use real Chrome for login, then stealth for automation.
Prerequisite: Complete "CDP Mode" first-time setup above (copy Chrome profile).
pkill -9 "Google Chrome"
"/Applications/Google Chrome.app/Contents/MacOS/Google Chrome" \
--remote-debugging-port=9222 \
--user-data-dir="$HOME/.z-agent-browser/chrome-profile" &
z-agent-browser connect 9222
z-agent-browser open "https://mail.google.com"
z-agent-browser state save ~/.z-agent-browser/gmail-state.json
z-agent-browser close && pkill -9 "Google Chrome"
z-agent-browser start --stealth
z-agent-browser state load ~/.z-agent-browser/gmail-state.json
z-agent-browser open "https://mail.google.com"
Important Notes
- Always use
snapshot -i to reduce output size
- Use refs (@e1, @e2) from snapshot, not CSS selectors
- Re-snapshot after navigation - refs change when page changes
- Save state after login -
state save persists sessions
- For Google/Gmail - use hybrid CDP workflow, not direct login
- Use
eval for extraction - much more token efficient than parsing snapshots