git clone https://github.com/Lulzx/ubrowser
T=$(mktemp -d) && git clone --depth=1 https://github.com/Lulzx/ubrowser "$T" && mkdir -p ~/.claude/skills && cp -r "$T/skills/ubrowser" ~/.claude/skills/lulzx-ubrowser-ubrowser && rm -rf "$T"
skills/ubrowser/SKILL.mdμBrowser
Control a headless browser with 98% token reduction compared to Playwright MCP and Dev Browser. Uses batch execution, minimal responses, and efficient HTML formatting.
Setup
Start the ubrowser server before using browser tools:
./skills/ubrowser/server.sh &
Wait for "μBrowser MCP server started" message. First run installs dependencies and downloads Playwright Chromium.
Use
--headless flag for headless mode:
./skills/ubrowser/server.sh --headless &
Key Optimization: Batch Execution
Always prefer
for multi-step workflows. This is the key to 98% cost savings.browser_batch
Instead of:
browser_navigate → browser_type → browser_type → browser_click (4 calls, 4 snapshots)
Use:
{ "tool": "browser_batch", "steps": [ {"tool": "navigate", "args": {"url": "/login"}}, {"tool": "type", "args": {"selector": "#email", "text": "user@test.com"}}, {"tool": "type", "args": {"selector": "#password", "text": "secret"}}, {"tool": "click", "args": {"selector": "button[type=submit]"}} ], "snapshot": {"when": "final"} }
Result: 1 call, 1 snapshot = 80%+ token reduction
Available Tools
browser_navigate
Navigate to a URL.
{"url": "https://example.com"}
browser_click
Click element by ref or selector.
{"ref": "e1"} {"selector": "button.submit"}
browser_type
Type text into input.
{"ref": "e2", "text": "hello@example.com", "clear": true, "pressEnter": true}
browser_select
Select dropdown option.
{"selector": "#country", "label": "United States"}
browser_scroll
Scroll page or element.
{"direction": "down", "amount": 500} {"toBottom": true}
browser_snapshot
Get interactive elements with refs (e1, e2, e3...).
{"scope": "#main", "format": "full"}
browser_batch (KEY)
Execute multiple actions, snapshot only at end.
{ "steps": [ {"tool": "navigate", "args": {"url": "/search"}}, {"tool": "type", "args": {"selector": "input[name=q]", "text": "query"}}, {"tool": "click", "args": {"selector": "button[type=submit]"}} ], "snapshot": {"when": "final", "scope": ".results"} }
browser_pages
Manage multiple browser pages.
{"action": "create", "name": "login"} {"action": "switch", "name": "dashboard"} {"action": "list"} {"action": "close", "name": "login"}
browser_inspect
Inspect specific element.
{"selector": ".form", "includeText": true, "depth": 3}
Element References
Snapshots return elements with short refs:
<input id="e1" type="email" placeholder="Email"> <input id="e2" type="password"> <button id="e3">Sign In</button>
Use refs in subsequent commands:
{"ref": "e1", "text": "user@test.com"}
Best Practices
- Always batch - Use
for multi-step flowsbrowser_batch - Request snapshots sparingly - Default is no snapshot, add
only when neededsnapshot: {include: true} - Scope snapshots - Use
parameter to limit to relevant DOM regionscope - Use refs - Short IDs save tokens vs full selectors
- Use diff format - After first snapshot, use
for changes onlyformat: "diff"
Cost Comparison (Opus 4.5)
| Approach | Per Task | Monthly (3000) |
|---|---|---|
| Playwright MCP | $3.28 | $9,827 |
| μBrowser | $0.01 | $45 |
| Savings | $3.26 | $9,782 |