Skip to main content
Glama

Scout

Browser MCP server that connects to your existing browser. Your sessions, passwords, extensions — all preserved. No bot detection because it IS your real browser.

Gives AI agents a visually-grounded, semantically-precise view of any web page through hybrid A11y + Set-of-Marks grounding.

Why Scout?

Most browser automation launches a clean, disposable browser — no cookies, no history, no extensions. Every site detects it as a bot. Scout flips this: it connects to the browser you're already using via Chrome DevTools Protocol (CDP).

  • Connect to your browser — attach to Chrome with --remote-debugging-port, reuse all your logged-in sessions

  • Accessibility tree extraction — scans the DOM for interactive elements, assigns each a stable numeric ID, returns a compact markdown summary

  • Set-of-Marks badges — overlays numbered badges on a compressed screenshot so the agent can see what it's clicking

  • Non-blocking human handoff — agent returns immediately, polls for completion. CAPTCHAs, MFA, SMS codes — you solve them in your own browser

  • State healer — every action captures before/after state, telling the agent what changed

The result: agents reference elements by ID (scout_click(3)), not by CSS selector or pixel coordinate. No hallucination, no token bloat, no bot detection.

Related MCP server: MCP Browser

Quick start

# 1. Start your browser with remote debugging enabled
google-chrome --remote-debugging-port=9222

# 2. Install and run Scout
npm install
SCOUT_MODE=connect SCOUT_CONNECT_URL=http://localhost:9222 npm run dev

Scout auto-discovers your browser and connects. All your open tabs, sessions, and saved passwords are available.

Launch a fresh browser

npm install
npx playwright install chromium
npm run dev

Claude Desktop / Claude Code

Add to your MCP config:

{
  "mcpServers": {
    "scout": {
      "command": "npx",
      "args": ["tsx", "src/index.ts"],
      "cwd": "/path/to/scout",
      "env": {
        "SCOUT_MODE": "connect",
        "SCOUT_CONNECT_URL": "http://localhost:9222"
      }
    }
  }
}

Docker

docker build -t scout .
docker run -it scout

Environment variables

Connection

Variable

Default

Description

SCOUT_MODE

auto

connect (attach to your browser), launch (start fresh), auto (try connect, fallback to launch)

SCOUT_CONNECT_URL

—

Explicit browser debug URL, e.g. http://localhost:9222

Browser

Variable

Default

Description

SCOUT_HEADLESS

false

Run browser in headless mode (only applies to launch mode)

SCOUT_BROWSER

chromium

Browser engine for launch mode (chromium or firefox)

SCOUT_CDP_PORT

9229

Debug port when launching a fresh browser

SCOUT_VIEWPORT_WIDTH

1280

Browser viewport width

SCOUT_VIEWPORT_HEIGHT

800

Browser viewport height

SCOUT_MAX_ELEMENTS

1000

Max elements per snapshot

SCOUT_MAX_TABS

10

Max open tabs

SCOUT_PROFILE_DIR

—

Persistent browser profile path (launch mode only)

SCOUT_LOGIN_ENABLED

false

Enable scout_login tool for automated platform auth

SCOUT_LCP_PORT

—

Enable HTTP dispatch server on this port

Tools (27)

Navigation

Tool

Params

Description

scout_navigate

url

Navigate and return full snapshot

scout_back

—

Browser back

scout_forward

—

Browser forward

scout_refresh

—

Reload current page

Observation

Tool

Params

Description

scout_snapshot

—

Full snapshot: numbered element list + badged screenshot

scout_elements

—

Element list only (faster, no screenshot)

scout_screenshot

—

Plain screenshot without badges

scout_console_logs

clear?

Last 100 browser console logs/errors

Interaction

Tool

Params

Description

scout_click

id

Click element by snapshot ID

scout_type

id, text, clear?

Type into input (React-safe keyboard events)

scout_select

id, value

Select dropdown option

scout_hover

id

Hover over element

scout_press_key

key

Press keyboard key (Enter, Escape, etc.)

scout_drag

sourceId, targetId

Drag one element onto another

scout_scroll

direction, pixels?

Scroll up/down/left/right

Human-in-the-loop

Tool

Params

Description

scout_handoff

instruction, timeout?

Show banner asking user to take manual action. Returns immediately with handoff_id — does NOT block.

scout_handoff_check

handoff_id

Poll whether handoff is completed/expired

scout_handoff_cancel

handoff_id

Cancel handoff and remove banner

Tabs

Tool

Params

Description

scout_tabs

—

List all open tabs

scout_switch_tab

index

Switch active tab

scout_new_tab

url?

Open a new tab

Sessions

Tool

Params

Description

scout_save_session

name

Save cookies + localStorage to ~/.scout-sessions/<name>.json

scout_load_session

name

Restore a saved session (restarts browser context)

scout_list_sessions

—

List saved sessions

Performance

Tool

Params

Description

scout_wait

condition, value?, timeout?

Wait for navigation, network_idle, selector, or timeout

scout_block_resources

types

Block resource types (e.g. ["image", "media"])

Login (opt-in)

Tool

Params

Description

scout_login

platform, username, password

Automated social login with challenge detection. Requires SCOUT_LOGIN_ENABLED=true.

How it works

Typical agentic loop

scout_navigate(url)
  → read numbered element list + badged screenshot
  → scout_click(3)          # healer returns stateChange
  → scout_snapshot()        # re-snapshot after state change
  → scout_type(7, "hello")
  → scout_handoff("Solve the CAPTCHA, then click Done")
  → scout_handoff_check(handoff_id)   # poll until completed

Connection modes

Connect mode (SCOUT_MODE=connect) — attaches to your running browser via CDP. Your open tabs, sessions, and passwords are all available. Start your browser with:

google-chrome --remote-debugging-port=9222

Scout auto-discovers the browser, or set SCOUT_CONNECT_URL=http://localhost:9222 explicitly. The browser stays running independently — Scout just connects to it.

Launch mode (SCOUT_MODE=launch) — starts a fresh Chromium instance. Use SCOUT_PROFILE_DIR for persistent cookies across restarts.

Auto mode (SCOUT_MODE=auto, default) — tries to discover a running browser first. If none found, launches a fresh one. Best of both worlds.

Browser persistence

In connect mode, Scout reconnects to your browser automatically if the MCP process restarts — the browser stays running.

In launch mode, Scout writes the CDP port to ~/.scout-browser.port and reconnects on restart if the browser is still alive.

Non-blocking handoff

Unlike blocking human-in-the-loop approaches, scout_handoff returns immediately with a handoff_id. The agent polls scout_handoff_check on its own schedule. The handoff banner re-injects across page navigations and auto-expires after timeout.

This matters because MCP tool calls often have timeouts (30-60s). A CAPTCHA that takes the user 2 minutes would kill a blocking approach.

HTTP dispatch server (optional)

Set SCOUT_LCP_PORT=8091 to expose an HTTP API alongside the MCP stdio transport. Useful for integrating Scout with non-MCP systems:

GET  /lcp/health              # Server status
POST /lcp/dispatch             # Execute tool operations
GET  /lcp/stream               # SSE event stream

Security: The LCP server has no built-in authentication by default. Set SCOUT_LCP_SECRET to require an X-Scout-Secret header on all mutation endpoints. Do not expose the LCP port on a public network without authentication — it provides full control over the connected browser session.

License

MIT

Available Tools

31 tools
scout_backC

Go back in browser history.

Inputs: no named parameters.

scout_block_resourcesA

Block certain resource types to speed up loading (e.g. image, media, stylesheet, font, script).

Inputs: types (required).

scout_clickA

Click an element by its snapshot ID. Returns healer result describing what changed. If stateChange is 'navigation', element IDs are now stale — call scout_snapshot before using any IDs again. Use force=true to bypass overlay elements (shadow DOM, modals) that intercept clicks.

Inputs: id (required), force.

scout_console_logsB

Get the last 100 browser console logs and errors.

Inputs: clear.

scout_delete_postC

Delete one of your posts on a platform.

Inputs: platform (required), post_id (required).

scout_dragB

Drag one element onto another.

Inputs: sourceId (required), targetId (required).

scout_elementsA

Get the current page's accessibility tree (numbered elements) without taking a screenshot. Faster than scout_snapshot.

Inputs: no named parameters.

scout_evaluateA

Execute JavaScript in the current page and return the result. Use for: reading page state, clicking elements blocked by shadow DOM overlays, interacting with Web Components, or any DOM operation not covered by other tools. The code runs in the page context with full DOM access. Returns the serialized result.

Inputs: code (required).

scout_forwardA

Go forward in browser history.

Inputs: no named parameters.

scout_handoffA

Inject a banner in the live browser asking the user to take a manual action. Returns IMMEDIATELY with a handoff_id — does NOT block. Poll scout_handoff_check(handoff_id) every 5-10 seconds until status is 'completed'. Use for: CAPTCHAs, SMS codes, authenticator app prompts, email verification.

Inputs: instruction (required), timeout.

scout_handoff_cancelA

Cancel a pending handoff and remove the banner from the browser.

Inputs: handoff_id (required).

scout_handoff_checkA

Check whether a pending handoff has been completed by the human. Returns immediately. Call this every 5-10 seconds after scout_handoff until status is 'completed' or 'expired'.

Inputs: handoff_id (required).

scout_hoverB

Hover over an element by its snapshot ID.

Inputs: id (required).

scout_list_sessionsA

List all saved browser sessions.

Inputs: no named parameters.

scout_load_sessionA

Load a saved browser session. This will restart the browser context.

Inputs: name (required).

scout_my_postsC

Get your recent posts on a platform.

Inputs: platform (required), limit.

scout_navigateA

Navigate to a URL. Returns {url, title} by default (lean). Set snapshot=true for full accessibility tree + screenshot (expensive — use only when you need to discover page structure).

Inputs: url (required), snapshot.

scout_new_tabA

Open a new browser tab, optionally navigating to a URL.

Inputs: url.

scout_postA

Compose and publish a post on a social platform (linkedin, x, medium). Uses the platform adapter pattern — handles shadow DOM, selectors, and compose flows automatically. The browser must be logged into the platform.

Inputs: platform (required), text (required), submit.

scout_press_keyB

Press a keyboard key (e.g. Enter, Escape, ArrowDown, Backspace).

Inputs: key (required).

scout_refreshB

Refresh the current page.

Inputs: no named parameters.

scout_save_sessionA

Save the current browser session (cookies, localStorage) to a named file.

Inputs: name (required).

scout_screenshotA

Take a plain screenshot of the current page without element badges.

Inputs: no named parameters.

scout_scrollA

Scroll the page or a specific element (modal, dialog) in a direction. Use element_id to scroll within a container instead of the whole page.

Inputs: direction (required), pixels, element_id.

scout_search_postsC

Search for posts on a platform.

Inputs: platform (required), query (required), limit.

scout_selectB

Select an option from a dropdown/select element by its snapshot ID.

Inputs: id (required), value (required).

scout_snapshotA

Take a snapshot of the current page. Returns accessibility tree (numbered elements). Set lite=true to skip the screenshot (saves ~50K+ tokens). Use full snapshot only when you need to visually see the page.

Inputs: lite.

scout_switch_tabA

Switch to a browser tab by index (from scout_tabs).

Inputs: index (required).

scout_tabsA

List all open browser tabs with their index, URL, title, and which is active.

Inputs: no named parameters.

scout_typeA

Type text into an input element by its snapshot ID. Uses React-safe keyboard events. If stateChange is 'navigation', call scout_snapshot before using any IDs again.

Inputs: id (required), text (required), clear.

scout_waitC

Wait for a page condition.

Inputs: condition (required), value, timeout.

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 31 tools

    Disambiguation4/5

    Tools mostly have distinct purposes, but scout_elements and scout_snapshot overlap in returning accessibility trees. scout_click and scout_type both mention navigation state changes, potentially confusing. Overall, most tools are well-defined.

    Naming Consistency5/5

    All tools follow a consistent scout_verb_noun pattern in snake_case, making them predictable and easy to understand.

    Tool Count3/5

    With 31 tools, the server is quite heavy. While each tool serves a clear purpose, the count is on the high side for typical MCP servers, bordering on excessive.

    Completeness4/5

    The tool set covers browser navigation, interaction, session management, and social platform posting well. Missing are file upload and popup management, but core workflows are fully supported.

    Maintenance

    ActivityNo data
    ResponsivenessOutdated data

    Related MCP Connectors

    Related MCP Servers

    • A
      license
      A
      quality
      D
      maintenance
      MCP server that lets AI assistants browse the web through your real Chrome with your cookies, sessions, and fingerprint, avoiding bot detection and CAPTCHAs. Enables web browsing, content extraction, and multi-step workflows via persistent tabs.
      15
      23 npm
      3
      MIT
    • A
      license
      Not graded
      quality
      D
      maintenance
      An MCP server that enables AI assistants to control a real browser with your existing sessions and extensions, avoiding bot detection and authentication hurdles.
      106
      Apache 2.0
    • A
      license
      A
      quality
      B
      maintenance
      MCP server that lets AI agents drive your real Chromium browser with your existing signed-in sessions, providing visible, local, and inspectable automation for tasks like navigation, clicking, typing, and form filling.
      25
      1
      Apache 2.0