@agenthand/obo
v0.2.4
Published
Control your real Chrome browser via CLI. Let AI agents use your logged-in sessions, cookies, and extensions.
Readme
@agenthand/obo
Control your real Chrome browser via CLI. Let AI agents use your logged-in sessions, cookies, and extensions.
Unlike headless browsers, OBO operates your actual Chrome with all your logins intact.
Quick Start
# Start the server
npx @agenthand/obo
# In another terminal
obo tabs # List open tabs
obo snapshot <tabId> -i # Get interactive elements
obo click <tabId> @e1 # Click an element
obo type <tabId> @e2 "hi" # Type into a field
obo extract <tabId> --format md # Extract page content as markdownRequirements
- Chrome with the Open Browser Operator extension installed
- Node.js 18+
Commands
| Command | Description |
|---------|-------------|
| obo status | Check connection status |
| obo tabs | List open tabs |
| obo new [url] | Open a new tab |
| obo close <tabId> | Close a tab |
| obo attach <tabId> | Activate a tab |
| obo snapshot <tabId> [-i] | Get accessibility tree (-i: interactive only) |
| obo screenshot <tabId> [-o file] | Take a screenshot |
| obo open <tabId> <url> | Navigate to URL |
| obo click <tabId> <ref\|x> [y] | Click element or coordinates |
| obo type <tabId> <ref> "text" | Type into an element |
| obo scroll <tabId> [--dy N] | Scroll the page |
| obo wait <tabId> [--load\|--idle] | Wait for load/network idle |
| obo extract <tabId> [--format json\|md] | Extract normalized page content |
| obo eval <tabId> "expr" | Evaluate JavaScript |
Recommended Workflow
obo tabs
obo snapshot <tabId> -i
# interact: click/type/scroll
obo snapshot <tabId> -iElement refs (@e1, @e2, ...) are snapshot-scoped. Re-snapshot after interactions or navigation.
Each snapshot includes snapshotId for traceability.
Error Handling
Most failures return:
{ "error": "...", "code": "..." }Handle by code:
EXTENSION_NOT_CONNECTED: ensure extension/server are running, then retry.TAB_ID_REQUIRED/TAB_NOT_FOUND: refresh tab list and retry with valid tabId.TARGET_REQUIRED: take a fresh snapshot and use a new@e*.REQUEST_TIMEOUT: retry with a narrower step.INTERNAL_ERROR: stop and inspect route/payload.
Full table: docs/ERROR_CODES.md in the repository.
Claude Code Skill
npx skills add agenthand/oboLicense
MIT
