# ubrowser
> Control a headless browser with 98% token reduction compared to Playwright MCP and Dev Browser. Uses batch execution, minimal responses, and efficient HTML formatting.
- Author: Lulzx
- Repository: Lulzx/ubrowser
- Version: 20251222111045
- Stars: 0
- Forks: 0
- Last Updated: 2026-02-07
- Source: https://github.com/Lulzx/ubrowser
- Web: https://mule.run/skillshub/@@Lulzx/ubrowser~ubrowser:20251222111045
---
# μ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:
```bash
./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:
```bash
./skills/ubrowser/server.sh --headless &
```
## Key Optimization: Batch Execution
**Always prefer `browser_batch` for multi-step workflows.** This is the key to 98% cost savings.
Instead of:
```
browser_navigate → browser_type → browser_type → browser_click (4 calls, 4 snapshots)
```
Use:
```json
{
"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.
```json
{"url": "https://example.com"}
```
### browser_click
Click element by ref or selector.
```json
{"ref": "e1"}
{"selector": "button.submit"}
```
### browser_type
Type text into input.
```json
{"ref": "e2", "text": "hello@example.com", "clear": true, "pressEnter": true}
```
### browser_select
Select dropdown option.
```json
{"selector": "#country", "label": "United States"}
```
### browser_scroll
Scroll page or element.
```json
{"direction": "down", "amount": 500}
{"toBottom": true}
```
### browser_snapshot
Get interactive elements with refs (e1, e2, e3...).
```json
{"scope": "#main", "format": "full"}
```
### browser_batch (KEY)
Execute multiple actions, snapshot only at end.
```json
{
"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.
```json
{"action": "create", "name": "login"}
{"action": "switch", "name": "dashboard"}
{"action": "list"}
{"action": "close", "name": "login"}
```
### browser_inspect
Inspect specific element.
```json
{"selector": ".form", "includeText": true, "depth": 3}
```
## Element References
Snapshots return elements with short refs:
```
```
Use refs in subsequent commands: `{"ref": "e1", "text": "user@test.com"}`
## Best Practices
1. **Always batch** - Use `browser_batch` for multi-step flows
2. **Request snapshots sparingly** - Default is no snapshot, add `snapshot: {include: true}` only when needed
3. **Scope snapshots** - Use `scope` parameter to limit to relevant DOM region
4. **Use refs** - Short IDs save tokens vs full selectors
5. **Use diff format** - After first snapshot, use `format: "diff"` for changes only
## 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** |