Skip to main content
Glama
octobrowser-mcp

octobrowser-mcp

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.

CI Python 3.10+ MCP Typed Ruff License: MIT

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-After on HTTP 429.

Related MCP server: Multilogin Browser MCP

How it fits together

Module

Role

relay.py

The MCP server — exposes the 37 tools, wires config, dispatches to the conduits and the helmsman.

conduits.py

LocalConduit (port 58888) + CloudConduit (token) — HTTP to Octo, with 429 back-off and WS rehoming.

helmsman.py

Helmsman — takes the helm of the running browser over CDP via Playwright.

60-second start

Install from source

git clone https://github.com/eforus-overseer/octobrowser-mcp.git
cd octobrowser-mcp
pip install -e .
playwright install chromium

Requires 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-mcp

Prefer 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

OCTO_HOST

Host running Octo Browser (remote/Docker)

optional

localhost

OCTO_PORT

Local API port

optional

58888

OCTO_USERNAME

Account email for auto sign-in

optional — cloud only

—

OCTO_PASSWORD

Account password for auto sign-in

optional — cloud only

—

OCTO_API_TOKEN

Cloud API token (search, tags, proxies)

optional — cloud only

—

OCTO_API_URL

Cloud API base — point at a mirror if the main host is fenced off

optional

https://app.octobrowser.net/api/v2/automation

OCTO_LOG_LEVEL

DEBUG / INFO / WARNING / … (logs go to stderr)

optional

WARNING

The tool belt (37 tools)

Tool

What it does

octo_health_check

Confirm the Octo API is up; report version

octo_list_profiles

List running profiles with their ws_endpoints

octo_start_profile

Launch by UUID → returns ws_endpoint; accepts a profile password

octo_stop_profile

Halt a profile gracefully, or force it

octo_start_one_time_profile

Spin up a throwaway profile (OS-selectable), auto-removed on halt

Tool

What it does

octo_find_profile_by_name

Resolve a profile by title (prefix match)

octo_start_profile_by_name

Find by title and launch in one shot

octo_search_profiles

Search by title/tags/status, with sort + pagination

octo_get_profile

Full profile: fingerprint, proxy, extensions, tags

Tool

What it does

octo_get_extensions

List team extensions (name, version, UUID)

octo_delete_extensions

Remove team extensions by UUID

octo_get_tags

List profile tags (name, color, UUID)

octo_get_proxies

List saved proxies (type, host, port, UUID)

Tool

What it does

browser_connect

Take the helm of a running profile over its CDP ws_endpoint

browser_disconnect

Let go of the browser (profile keeps running)

browser_navigate

Go to a URL (load / domcontentloaded / networkidle / commit)

browser_get_url

Read the current URL

browser_go_back · browser_go_forward · browser_reload

History + refresh

Tool

What it does

browser_click

Click by selector or (x, y); right/double-click supported

browser_type

Fill an element, or tap out keystrokes with a delay

browser_press_key

Press a key (Enter, Tab, ArrowDown, …)

browser_scroll

Scroll the page or a specific element

browser_hover · browser_select

Hover; pick a <select> option

browser_screenshot

PNG of the page or one element

browser_get_text · browser_get_html · browser_get_attribute

Pull text, HTML, attributes

browser_query_selector_all

Enumerate matches with tag/text/class/bounds

browser_wait_for_selector

Wait for a state (visible/hidden/attached/detached)

browser_evaluate

Run arbitrary JS, get the result

Tool

What it does

browser_list_tabs · browser_switch_tab · browser_new_tab · browser_close_tab

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-mcp

Only 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 octo_start_profile with a UUID.

"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 octo_search_profiles.

WebSocket won't connect

Check OCTO_HOST and that the CDP ports are reachable.

"Browser not connected"

Call browser_connect with the ws_endpoint from the launch step.

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, offline

The 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.


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 cover for octobrowser-mcp

Pixel-art adaptation of OpenMoji octopus by OpenMoji contributors, licensed CC BY-SA 4.0. Source: OpenMoji.

Available Tools

37 tools
browser_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_navigateC

Navigate to a URL.

Inputs: url (required), wait_until. 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

    B3.4/5.0

    Scored across 37 tools

    Disambiguation4/5

    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.

    Naming Consistency4/5

    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.

    Tool Count2/5

    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.

    Completeness3/5

    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

    ActivityMaintained
    ResponsivenessNo recent community issues

    Related MCP Connectors

    Related MCP Servers

    • A
      license
      B
      quality
      D
      maintenance
      Controls Octo Browser antidetect profiles and automates browser tasks through natural language, enabling profile lifecycle management, web scraping, and full browser automation via CDP.
      37
      MIT
    • F
      license
      Not graded
      quality
      C
      maintenance
      Enables 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.
      -
    • A
      license
      Not graded
      quality
      A
      maintenance
      Enables 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 npm
      MIT