byob is a local MCP server that lets AI coding tools (Claude Code, Cursor, Cline, Windsurf, etc.) directly control your real Chrome — the one where you're already logged into everything.
"read my Twitter timeline and summarize the top 5 posts"
"google 'mcp protocol spec', click the first result, read the page"
"take a screenshot of example.com"
"grab my GitHub session cookie so I can curl with it"
"open my Gmail tab and tell me how many unread"
| WebFetch | Headless Puppeteer | byob | |
|---|---|---|---|
| Sees logged-in pages | ❌ | ✅ already logged in | |
| Passes bot detection | ❌ | ❌ | ✅ real human browser |
| Setup time | 0 | hours | ~5 min |
| Cloud cost | free | $$ | free |
curl -fsSL https://raw.githubusercontent.com/wxtsky/byob/main/install.sh | bashThe script checks prerequisites (Node.js ≥ 20, bun, Chrome), clones the repo, builds everything, and walks you through MCP registration interactively. If bun is not installed, it offers to install it for you.
Set
BYOB_INSTALL_DIRto change the install location (default:~/byob).
Prefer to do it yourself?
Requires Node.js ≥ 20, bun, Chrome, and any MCP-compatible AI tool.
git clone https://github.com/wxtsky/byob
cd byob
bun install
bun run setupbun run setup walks through the install interactively:
- Pick output language (English / 中文)
- Generates a unique extension key for you
- Builds the Chrome extension
- Writes the config that lets Chrome talk to byob
- Prompts you to multi-select your AI tools, then registers each one (CLI tools via their
mcp addcommand, JSON-config tools by writing the config file directly)
After the script finishes, three manual steps remain:
Open chrome://extensions in Chrome.
- Top-right → turn ON Developer mode
- Top-left → click Load unpacked
- Select the folder printed in your terminal, something like:
/your/path/to/byob/packages/extension/output/chrome-mv3
Quit Chrome completely (⌘Q on Mac / close all windows on Windows), then reopen.
Closing a single tab or window is not sufficient — Chrome only reads the Native Messaging config at startup.
The setup script registers your selected tools automatically. The block below is for reference only — use it if you skipped the prompt or want to register a different tool later:
Claude Code
claude mcp add byob -s user -- /path/to/tsx /path/to/byob-mcp.tsTo enable browser_eval, add -e BYOB_ALLOW_EVAL=1 after -s user.
Codex CLI
codex mcp add byob -- /path/to/tsx /path/to/byob-mcp.tsCursor
Add to .cursor/mcp.json (project) or ~/.cursor/mcp.json (global):
{
"mcpServers": {
"byob": {
"command": "/path/to/tsx",
"args": ["/path/to/byob-mcp.ts"]
}
}
}Windsurf
Add to ~/.codeium/windsurf/mcp_config.json (same JSON format as Cursor):
{
"mcpServers": {
"byob": {
"command": "/path/to/tsx",
"args": ["/path/to/byob-mcp.ts"]
}
}
}Cline (VS Code)
Open Cline sidebar → MCP Servers → Configure, then add (same JSON format):
{
"mcpServers": {
"byob": {
"command": "/path/to/tsx",
"args": ["/path/to/byob-mcp.ts"]
}
}
}The actual paths are printed by the setup script. The examples above use shortened paths for readability.
To enablebrowser_eval, add"env": { "BYOB_ALLOW_EVAL": "1" }to the config (or-e BYOB_ALLOW_EVAL=1for CLI tools).
After you finish steps 2 and 3 (load the extension and ⌘Q-restart Chrome), setup auto-detects the bridge coming online and prints ✓ bridge online. The installation is complete — open a new session in your AI tool and try "use byob to read ...".
If you exited setup early with Ctrl+C, or want to check the state later:
bun run doctorbun run doctor prints actionable fixes under every ✗ (e.g. "⌘Q-restart Chrome", "extension ID mismatch", etc.).
| Tool | What it does |
|---|---|
browser_read |
Open a page, scroll through, read all text |
browser_read_markdown |
Same, returns clean markdown (no nav/ads) |
browser_extract_table |
Pull <table> elements as JSON |
browser_get_console_logs |
Snapshot console.log / warn / error |
browser_start_record_network |
Start recording HTTP + WebSocket traffic |
browser_stop_record_network |
Stop recording, export JSON or HAR |
browser_screenshot |
Screenshot → saved to disk |
browser_download_images |
Download all images from a page |
browser_click |
Click a button or link |
browser_type |
Type into an input (optionally press Enter) |
browser_press_key |
Send a keyboard key (Enter, Escape, F5, ArrowDown, ...) |
browser_hover |
Hover the mouse over an element to trigger tooltips/menus |
browser_select |
Choose an option in a native <select> |
browser_scroll |
Scroll to top/bottom, an element, or a Y coordinate |
browser_get_html |
Get raw HTML of an element or the whole page |
browser_get_cookies |
Export cookies for curl / scripts |
browser_navigate |
Open a URL in a new or existing tab |
browser_go_back |
Go back one step in browser history |
browser_go_forward |
Go forward one step in browser history |
browser_wait_for |
Wait for an element to appear |
browser_list_tabs |
List all open tabs |
browser_switch_tab |
Switch to a tab |
browser_close_tab |
Close a tab by tabId |
browser_eval |
Run JavaScript on the page (off by default) |
browser_set_cookies |
Write a cookie via chrome.cookies.set (CHIPS-aware). |
browser_print_pdf |
Save current page as PDF (default ~/.byob/pdfs/). |
browser_get_storage |
Read localStorage / sessionStorage for an origin. |
browser_get_performance |
Page Web Vitals + navigation timing. |
browser_upload_file |
Upload local files to <input type="file">. |
browser_intercept_start |
Start a stateful request-interception session. |
browser_intercept_stop |
Stop a browser_intercept_start session and return hit stats. |
browser_drag |
Drag the mouse from one point to another (linear interpolation). |
browser_emulate_device |
Emulate mobile/tablet viewport / DPR / touch / UA. |
17 of these tools support framePath to reach into nested iframes (including cross-origin).
Full schemas: shared/src/schemas.ts
AI tool → byob-mcp → byob-bridge → Chrome extension → your tab
(stdio) (Unix socket) (Native Messaging) (Chrome DevTools Protocol)
All communication stays local. No data leaves your machine. When Chrome closes, all byob processes exit automatically.
bun run setup # install or re-install
bun run doctor # check what's working
bun run bridges # list running bridge processes
bun run logs # tail the bridge log
bun run unsetup # remove everythingAll run from the byob repo root.
- End-to-end cancellation.
Ctrl+Cpropagates through the entire chain (MCP → bridge → extension → Chrome), cleanly detaching all debug sessions. - DevTools conflict handling. If DevTools is open on a tab,
browser_evalautomatically falls back tochrome.scripting.executeScript. - Sleep/wake recovery. After a laptop sleep cycle, byob resets all debug sessions so the next call starts from a clean state.
browser_evalis off by default — enable withBYOB_ALLOW_EVAL=1. Every call logs + notifies.chrome://,file://, Google/MS/Apple login pages are blocked by default.- Each install gets a unique extension key — no collisions.
- Socket files are
0600, dirs are0700. Other users can't see them. - Zero outbound network traffic. No analytics, no pings, no crash reports.
- Chrome displays a "byob is debugging this browser" banner on active tabs. This is a Chrome security feature and cannot be suppressed.
| Symptom | Cause | Fix |
|---|---|---|
No live bridge |
Chrome not running or extension disabled | Check chrome://extensions |
cdp_attach_failed |
DevTools open on that tab | Close DevTools |
url_forbidden |
URL on the blocklist | See Security section |
extension_not_connected |
Extension lost connection | Reload at chrome://extensions |
| Nothing works after install | Chrome was not fully restarted | Quit Chrome completely (⌘Q) and reopen |
Run bun run doctor for detailed diagnostics on which step failed.
| Platform | Auto | Manual |
|---|---|---|
| macOS | Auto-registers selected MCP tools | Open chrome://extensions and load the unpacked extension |
| Windows | Same + writes Native Messaging host to registry | Same as macOS |
| Linux | Auto-registers selected MCP tools | Same as macOS |
MIT licensed. byob has broad access to your browser — only use it on machines and accounts you own.