| name | browserforce |
| description | Browse the web using the user's real Chrome browser — already logged in, with real cookies and extensions. No headless browser. Uses BrowserForce relay + Playwright API via CLI. |
| read_when | ["Browsing as the user with logged-in sessions","Accessing sites that require authentication","Interacting with the user's real Chrome tabs","Web automation with existing cookies and extensions","Taking screenshots of authenticated pages"] |
| metadata | {"clawdbot":{"emoji":"🔌","requires":{"bins":["node","browserforce"]},"install":[{"kind":"node","package":"browserforce","bins":["browserforce"],"label":"Install BrowserForce CLI"}]}} |
| allowed-tools | Bash(browserforce:*) |
BrowserForce — Your Real Chrome Browser
BrowserForce gives you the user's actual Chrome browser — all their logins,
cookies, and extensions already active. No headless browser, no fresh profiles.
Prerequisites
The user must have:
- BrowserForce Chrome extension installed and connected (green icon)
- The relay auto-starts on first command — no manual step needed
Check with: browserforce status
Use commands first
Session commands share one persistent browser session (including the active tab
and snapshot refs) across CLI calls. The same command language powers the MCP
browserforce tool:
browserforce tabs
browserforce use t2
browserforce open <url> --as docs
browserforce snapshot
browserforce click @e2
browserforce screenshot [n]
browserforce -e "<code>"
Use -e only when the command layer cannot express the task.
Core Workflow: Observe → Act → Observe
browserforce open https://example.com/login
browserforce snapshot
browserforce fill @e3 "user@example.com"
browserforce fill @e4 "hunter2"
browserforce click @e5
browserforce wait url "**/dashboard"
browserforce snapshot
Refs go stale the moment the page changes — always re-snapshot before the next
ref interaction.
Multi-tab work
browserforce open https://docs.example.com --as docs
browserforce open https://app.example.com --as app
browserforce snapshot --tab app
browserforce click @e2 --tab app
browserforce use docs
Target tabs by stable handle (t2) or name — never by list position. Tab
names are unique; pass --replace only when you intentionally want to move a
name to another tab.
Stable handles and names persist for the lifetime of the session; use
browserforce tabs to discover them.
Command reference
browserforce snapshot [--tab docs] [--selector "#main"] [--search "login"] [--interactive]
browserforce hover @e3
browserforce type @e2 "more text"
browserforce press Enter
browserforce wait text "Saved"
browserforce wait url "**/dashboard"
browserforce wait load domcontentloaded
browserforce wait fn "window.ready === true"
browserforce get url|title
browserforce get text|html @e5
browserforce eval --stdin
browserforce rename docs api-docs
browserforce forget api-docs
browserforce run "click @e2 --tab docs"
Refs accept @e1, e1, or ref=e1. Ref/read commands accept --tab <handle|name|text> without changing the active tab. eval uses the same
guarded boundary as MCP exec; it exposes page, context, state, and
snapshot(), and state persists between session commands. Add --json for
machine-readable command results.
Extract data
browserforce get url
browserforce get text @e5
browserforce get html @e5
echo "return await page.title();" | browserforce eval --stdin
One-shot -e (escape hatch)
Each browserforce -e call is independent (state does NOT persist between
-e calls). Do everything in a single snippet:
browserforce -e "
state.page = await context.newPage();
await state.page.goto('https://example.com');
await waitForPageLoad();
return await snapshot();
"
Rules
- snapshot over screenshot — snapshot returns text (fast, cheap); use a
screenshot only for visual layout verification.
- Re-snapshot after every page change — refs go stale immediately.
- Don't navigate existing tabs — open your own via
browserforce open.
- Commands over
-e — reach for raw Playwright only when the command
layer cannot express the task.
- Command errors teach the next step — stale ref → re-snapshot; unknown
tab →
browserforce tabs. Fix and retry.
- Backend fallback is visible —
auto uses real Chrome when the extension
is connected and warns if it falls back to managed Chrome; use --real to
fail instead of falling back.
Troubleshooting
Error Recovery
- "Unknown ref": the page changed —
browserforce snapshot, use the new refs
- "No tab named …":
browserforce tabs, target a listed handle or name
- Connection lost: user must check
browserforce status
- No tabs:
browserforce open https://example.com
- Element not found:
browserforce snapshot --search "button"
Important
This is the user's REAL browser. Be respectful:
- Don't close tabs you didn't open
- Don't navigate tabs you didn't create
- Don't modify browser settings or stored data