octobrowser-mcp
This MCP server lets an AI assistant manage Octo Browser antidetect profiles and automate a running browser over CDP.
Check Octo API health and list running profiles.
Launch/stop profiles by UUID, create temporary one-time profiles, and recover if a profile is already running.
With a cloud API token: find/start profiles by title, search by tags/status/title, fetch full profile data, list/delete extensions, list tags and proxies.
Connect/disconnect to a profile browser over CDP and control navigation, history, and reload.
Interact with pages: click, type, press keys, scroll, hover, select dropdowns, and wait for selectors.
Extract data: screenshots, text, HTML, attributes, selector matches, and arbitrary JavaScript results.
Manage tabs: list, switch, open new tabs, and close the current tab.
Click on "Deploy Server".
Wait a few minutes for the server to deploy. Once ready, it will show a "Started" state.
In the chat, type
@followed by the MCP server name and your instructions, e.g., "@octobrowser-mcp Start profile 5249_US, open google.com, and grab a screenshot."
That's it! The server will respond to your query, and you can continue using it as needed.
Here is a step-by-step guide with screenshots.
Hand your AI assistant the wheel of Octo Browser — antidetect profiles, driven in plain language.
Unofficial, community-built · not affiliated with or endorsed by Octo Browser. “Octo Browser” and its logo are trademarks of their respective owner.
What it does · How it fits together · 60-second start · Configuration · The tool belt · In practice · Troubleshooting
What it does
Driving fleets of antidetect profiles by hand is a grind. OctoBrowser-MCP puts an MCP relay between your AI assistant (Claude Code, Cursor, …) and Octo Browser, so a sentence does the work of a dozen clicks:
"Start profile
5249_US, open google.com, and grab a screenshot."
The assistant finds the profile, launches it through Octo's local API, latches onto the running browser over CDP, navigates, and hands back the picture — no scripts, no dashboards.
What you get:
🐙 Whole profile lifecycle — launch, halt, look up and manage profiles across Octo's local and cloud APIs.
🎛️ Real browser steering — navigate, click, type, scroll, screenshot, evaluate JS, all over Playwright/CDP.
⚡ Throwaway profiles — spin up one-time profiles that vanish on halt; perfect for scraping.
🗂️ Multi-tab command — open, switch and close tabs on demand.
🌐 Remote & Docker aware — WebSocket endpoints get rehomed to your configured host automatically.
🛡️ Polite under throttle — bounded retries that honour
Retry-Afteron HTTP 429.
Related MCP server: Multilogin Browser MCP
How it fits together
Module | Role |
| The MCP server — exposes the 37 tools, wires config, dispatches to the conduits and the helmsman. |
|
|
|
|
60-second start
Install from source
git clone https://github.com/eforus-overseer/octobrowser-mcp.git
cd octobrowser-mcp
pip install -e .
playwright install chromiumRequires Python 3.10+, Octo Browser running (download), and the Playwright Chromium build.
Register with Claude Code
# Local API only — launch/halt profiles by UUID. No email, password or token needed.
claude mcp add octobrowser-mcp -- octobrowser-mcp
# Full setup — all three creds are OPTIONAL; add them only for cloud search by name, tags, proxies
claude mcp add octobrowser-mcp \
-e OCTO_USERNAME="you@email.com" \ # optional — only for cloud auto sign-in
-e OCTO_PASSWORD="your_password" \ # optional — only for cloud auto sign-in
-e OCTO_API_TOKEN="your_api_token" \ # optional — only for cloud calls
-- octobrowser-mcpPrefer editing config by hand? Drop this into .claude/settings.json. The entire env block is optional — omit it for local-only use, or include only the fields you need:
{
"mcpServers": {
"octobrowser-mcp": {
"command": "octobrowser-mcp",
"env": {
"OCTO_USERNAME": "you@email.com", // optional — cloud auto sign-in only
"OCTO_PASSWORD": "your_password", // optional — cloud auto sign-in only
"OCTO_API_TOKEN": "your_api_token" // optional — cloud calls only
}
}
}
}The env keys above are shown for completeness — none are required. With no credentials at all, you still get the full local profile lifecycle and browser steering; the cloud-only tools simply stay dormant.
Restart the client and ask: "Check if Octo Browser is running" — it will reach for octo_health_check.
Where's the API token? Octo Browser app → Settings → API. It's only needed for cloud calls (search by name, tags, proxies, extensions), and those need an active subscription. Local launch/halt works without it.
Configuration
Everything is environment-driven:
Everything below is optional — the server runs with zero configuration against your local Octo Browser.
Variable | What it sets | Required? | Default |
| Host running Octo Browser (remote/Docker) | optional |
|
| Local API port | optional |
|
| Account email for auto sign-in | optional — cloud only | — |
| Account password for auto sign-in | optional — cloud only | — |
| Cloud API token (search, tags, proxies) | optional — cloud only | — |
| Cloud API base — point at a mirror if the main host is fenced off | optional |
|
|
| optional |
|
The tool belt (37 tools)
Tool | What it does |
| Confirm the Octo API is up; report version |
| List running profiles with their ws_endpoints |
| Launch by UUID → returns |
| Halt a profile gracefully, or force it |
| Spin up a throwaway profile (OS-selectable), auto-removed on halt |
Tool | What it does |
| Resolve a profile by title (prefix match) |
| Find by title and launch in one shot |
| Search by title/tags/status, with sort + pagination |
| Full profile: fingerprint, proxy, extensions, tags |
Tool | What it does |
| List team extensions (name, version, UUID) |
| Remove team extensions by UUID |
| List profile tags (name, color, UUID) |
| List saved proxies (type, host, port, UUID) |
Tool | What it does |
| Take the helm of a running profile over its CDP ws_endpoint |
| Let go of the browser (profile keeps running) |
| Go to a URL ( |
| Read the current URL |
| History + refresh |
Tool | What it does |
| Click by selector or (x, y); right/double-click supported |
| Fill an element, or tap out keystrokes with a delay |
| Press a key ( |
| Scroll the page or a specific element |
| Hover; pick a |
| PNG of the page or one element |
| Pull text, HTML, attributes |
| Enumerate matches with tag/text/class/bounds |
| Wait for a state (visible/hidden/attached/detached) |
| Run arbitrary JS, get the result |
Tool | What it does |
| Full tab control |
In practice
Launch by name and automate
You: Start profile "work_US" and check my IP on whatismyipaddress.com
→ octo_start_profile_by_name(name="work_US") ws://localhost:52341/…
→ browser_connect(ws_endpoint="ws://localhost:52341/…")
→ browser_navigate(url="https://whatismyipaddress.com")
→ browser_screenshot()
Your IP resolves to a US location, matching the profile's proxy.Scrape with a throwaway profile
You: Spin up a temp profile and read the title of news.ycombinator.com
→ octo_start_one_time_profile(os="win") uuid: tmp-456, ws://…
→ browser_connect(ws_endpoint="ws://…")
→ browser_navigate(url="https://news.ycombinator.com")
→ browser_evaluate(script="document.title") "Hacker News"
→ octo_stop_profile(uuid="tmp-456") profile gone
The title is "Hacker News".Round up a tagged fleet
You: List every profile tagged "ads"
→ octo_search_profiles(tags=["ads"], limit=50)
12 profiles: ads_US_01, ads_UK_02, …Running it elsewhere
Octo on another box? Set OCTO_HOST:
claude mcp add octobrowser-mcp \
-e OCTO_HOST="192.168.1.100" \
-e OCTO_USERNAME="you@email.com" \ # optional — only for cloud auto sign-in
-e OCTO_PASSWORD="your_password" \ # optional — only for cloud auto sign-in
-- octobrowser-mcpOnly OCTO_HOST matters here — the email and password are optional and drop out entirely if you're not using the cloud API.
ws://127.0.0.1 and ws://localhost endpoints are rehomed to your host automatically, so CDP connects across the network. You'll need port 58888 and the per-profile CDP debug ports reachable — an SSH tunnel is the safe way to expose them.
When things go sideways
Symptom | Fix |
"Octo Browser API is unavailable" | Start the Octo app — the local API rides along with it. |
"OCTO_API_TOKEN is not set" | Add a token, or stick to |
"Cloud API access denied: No active subscription" | Cloud calls need an active subscription; local launch/halt doesn't. |
"Throttle not cleared after 5 retries" | Limits are team-wide (50–200 RPM by plan). Slow down or upgrade. |
"No profile titled …" | Titles are case-sensitive, matched from the start. Browse with |
WebSocket won't connect | Check |
"Browser not connected" | Call |
Flip OCTO_LOG_LEVEL=DEBUG to watch every API request on stderr.
Hacking on it
uv sync --extra dev # or: python -m venv .venv && pip install -e ".[dev]"
uv run ruff check src/ tests/ # lint (incl. flake8-bandit security rules)
uv run ruff format src/ tests/ # format
uv run mypy src/ tests/ # strict typing
uv run pytest # fast, offlineThe suite feeds every Octo response through httpx.MockTransport and drives the MCP surface in-process — no running Octo Browser and no network needed. CI runs the same four gates on Python 3.10 and 3.13.
Resilience by design
A key design principle: when a launch fails, the server doesn't give up. Instead, it re-checks the running profiles on the host — the profile may have started anyway, or it may be running from a prior attempt. This recovery path keeps the tool reliable under transient network hiccups or API quirks.
Under the hood
MCP SDK 2.x — tool schemas generated straight from the Python signatures
Playwright — CDP browser steering
httpx — async client for both Octo APIs
Hatchling — build backend
Credits & license
Released under the MIT License — see LICENSE. OctoBrowser-MCP began as a rework of the MIT-licensed original octo-mcp groundwork; that copyright notice is preserved in LICENSE per the terms.
This is an independent, unofficial project — not affiliated with, sponsored by, or endorsed by Octo Browser. The Octo Browser name and logo (in assets/, from the official brand kit) are trademarks of their respective owner, used here unmodified only to identify the software this server drives.
Links
Octo Browser — antidetect browser for multi-accounting
Octo Browser API reference — the Postman collection this client targets
Model Context Protocol — the open AI-tooling protocol
Explore this project
Project page & walkthrough — Try an interactive explanation and inspect the original source and results. Browser teaching examples are distinguished from trained models.
Project visual

Pixel-art adaptation of OpenMoji octopus by OpenMoji contributors, licensed CC BY-SA 4.0. Source: OpenMoji.
Available Tools
37 toolsbrowser_clickA
Click an element by CSS selector, or click at (x, y) coordinates.
Inputs: x, y, button, selector, +1 more. Returns: result
browser_close_tabA
Close the current tab.
Inputs: no named parameters. Returns: result
browser_connectA
Connect to a running Octo Browser profile over CDP. Call after octo_start_profile.
Inputs: ws_endpoint (required). Returns: result
browser_disconnectA
Disconnect from the browser (does not stop the Octo profile).
Inputs: no named parameters. Returns: result
browser_evaluateA
Run JavaScript on the page and return the result.
Inputs: script (required). Returns: result
browser_get_attributeB
Get an attribute value from an element.
Inputs: selector (required), attribute (required). Returns: result
browser_get_htmlA
Get the HTML of the page or of an element.
Inputs: outer, selector. Returns: result
browser_get_textB
Get the text content of an element.
Inputs: selector (required). Returns: result
browser_get_urlA
Get the current page URL.
Inputs: no named parameters. Returns: result
browser_go_backA
Go back in browser history.
Inputs: no named parameters. Returns: result
browser_go_forwardB
Go forward in browser history.
Inputs: no named parameters. Returns: result
browser_hoverA
Hover over an element (useful for dropdowns and tooltips).
Inputs: selector (required). Returns: result
browser_list_tabsA
List the open tabs with title, URL and active flag.
Inputs: no named parameters. Returns: result
browser_new_tabA
Open a new tab, optionally navigating to a URL.
Inputs: url. Returns: result
browser_press_keyB
Press a keyboard key (Enter, Tab, Escape, ArrowDown, ...).
Inputs: key (required). Returns: result
browser_query_selector_allC
Find all elements matching a selector and return their metadata.
Inputs: selector (required). Returns: result
browser_reloadA
Reload the current page.
Inputs: no named parameters. Returns: result
browser_screenshotA
Take a screenshot of the page or of a single element. Returns a PNG.
Inputs: selector, full_page.
browser_scrollA
Scroll the page, or a specific element when a selector is given.
Inputs: amount, selector, direction. Returns: result
browser_selectB
Select an option in a dropdown.
Inputs: value (required), selector (required). Returns: result
browser_switch_tabC
Switch to a tab by index.
Inputs: index (required). Returns: result
browser_typeA
Type text.
With a selector the value is filled instantly; without one the text is typed key by key into the focused element.
Inputs: text (required), delay, selector. Returns: result
browser_wait_for_selectorB
Wait for an element to reach a given state.
Inputs: selector (required), state, timeout. Returns: result
octo_delete_extensionsA
Delete team extensions by UUID.
Extensions in use by a running profile come back once that profile stops.
Inputs: uuids (required). Returns: result
octo_find_profile_by_nameA
Find a profile by title. The API matches from the beginning of the title.
Requires OCTO_API_TOKEN.
Inputs: name (required), exact_match. Returns: result
octo_get_extensionsA
List the team's browser extensions with name, version and UUID.
Inputs: no named parameters. Returns: result
octo_get_profileA
Get full profile data by UUID: fingerprint, proxy, extensions, description, tags.
Inputs: uuid (required). Returns: result
octo_get_proxiesA
List all saved proxies with type, host, port and UUID.
Inputs: no named parameters. Returns: result
octo_get_tagsA
List all profile tags with name, color and UUID.
Inputs: no named parameters. Returns: result
octo_health_checkA
Check that the Octo Browser API is reachable. Call this first to verify the app is running.
Inputs: no named parameters. Returns: result
octo_list_profilesA
List the profiles currently running on this machine, with UUID, title and ws_endpoint.
Inputs: no named parameters. Returns: result
octo_search_profilesB
Search profiles by title prefix or tags. Several tags mean AND. Requires OCTO_API_TOKEN.
Inputs: tags, limit, search, status, +1 more. Returns: result
octo_start_one_time_profileA
Create and start a one-time (temporary) profile.
It is removed once stopped and starts faster than a regular profile, which suits scraping.
Inputs: os, headless. Returns: result
octo_start_profileA
Start a profile by UUID and return the ws_endpoint for the CDP connection.
If the profile is already running, its current data is returned instead.
Inputs: uuid (required), headless, password. Returns: result
octo_start_profile_by_nameA
Find a profile by title and start it (find + start in one call). Requires OCTO_API_TOKEN.
Inputs: name (required), headless, password. Returns: result
octo_stop_profileA
Stop a running Octo Browser profile by UUID.
Inputs: uuid (required), force. Returns: result
Tool Schema Changelog
Recent tool additions, removals, and schema changes observed during successful MCP inspections.
Loading tool schema changelog…
TDQS
Scored across 37 tools
Most tools are clearly separated by resource and action, and the octo_/browser_ prefixes help organize the set. The only real confusion risk is among find_profile_by_name, search_profiles, and start_profile_by_name, though their descriptions do distinguish them.
The set mostly follows a verb_noun pattern with octo_ for profile management and browser_ for page automation. Minor deviations like octo_health_check and the overloaded behavior of browser_type keep it from being perfectly consistent.
37 tools is well beyond the typical well-scoped range and exceeds the 25+ threshold, making the surface heavy to reason about. The count is somewhat justified by combining profile management with browser automation, but as a single server it feels overgrown.
Browser automation is well covered with navigation, interaction, extraction, waiting, tabs, and JavaScript evaluation. Profile management, however, lacks create/update/delete for persistent profiles, and extensions/proxies/tags only support read or delete operations, leaving notable gaps.
Maintenance
Related MCP Connectors
Web scraping, browser automation, screenshots and AI data extraction for AI agents via MCP.
Browz hosted MCP (free public beta): let an AI app drive your own Browz browser profiles from anywhere. Connect https://mcp.gobrowz.com/mcp and sign in with your Browz account (OAuth) or an agent token. Each call is relayed to the Browz app on your computer, which must be online with Remote control on and have a hardware security chip (Mac Secure Enclave or TPM 2.0). 17 tools: profiles, tabs, navigate, snapshot, act, wait, screenshot. Cookies, downloads and stored sign-ins stay on your computer.
Control a real browser from AI agents: navigate, click, type, screenshot, read the page.
Live browser debugging for AI assistants — DOM, console, network via MCP.
Related MCP Servers
- AlicenseBqualityDmaintenanceControls Octo Browser antidetect profiles and automates browser tasks through natural language, enabling profile lifecycle management, web scraping, and full browser automation via CDP.37MIT
- FlicenseNot gradedqualityCmaintenanceEnables AI agents to control Multilogin X anti-detect browser profiles via a streamable HTTP MCP interface. Supports profile management, session handling, and a broad catalog of browser actions such as navigation, clicking, typing, screenshots, and more.-
- AlicenseNot gradedqualityCmaintenanceEnables AI agents to control a real browser via MCP tools for web navigation, interaction, page inspection, tabs, forms, files, sessions, and browser automation.MIT
- AlicenseNot gradedqualityAmaintenanceEnables MCP-compatible AI agents to navigate, interact with, and automate websites through an anti-detection browser backend, offering 47 tools for tabs, navigation, interaction, observation, search, downloads, sessions, profile reuse, and batch workflows.899 npmMIT