Skip to main content
Glama
chrome-agent-mcp

chrome-agent-mcp

by otaviosenne

chrome-agent-mcp

Full Chrome control for AI agents via the Model Context Protocol

npm License: MIT Node.js

Give Claude (or any MCP client) full control over your browser: navigate pages, click elements, fill forms, inspect DevTools — with parallel tab execution, session isolation per agent, and a real-time dashboard.


What it does

Each Claude session gets its own Chrome tab group — so multiple agents can run in parallel without stepping on each other. A companion Chrome extension shows a live dashboard: active tabs, event log, and screenshots in real time.

Claude session A  →  tab group "Pinguim"  (blue)
Claude session B  →  tab group "Fenix"   (red)
Claude session C  →  tab group "Girafa"  (yellow)

Every tool call is wrapped with resilient execution:

  • 20 s primary timeout

  • 2× parallel retries on timeout (10 s each)

  • Automatic fallback to a new Chrome group if all retries fail


Related MCP server: OpenChrome

Requirements

  • Node.js ≥ 18

  • Google Chrome with remote debugging enabled


Installation

1. Enable Chrome remote debugging

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

To make it permanent, add the flag to your Chrome launcher or .desktop file.

2. Install the MCP server

# Run directly (no install)
npx chrome-agent-mcp

# Or install globally
npm install -g chrome-agent-mcp

3. Configure your MCP client

Claude Desktop (~/Library/Application Support/Claude/claude_desktop_config.json):

{
  "mcpServers": {
    "chrome-agent-mcp": {
      "command": "npx",
      "args": ["chrome-agent-mcp"],
      "env": { "CHROME_DEBUG_PORT": "9222" }
    }
  }
}

Claude Code (.claude/settings.json):

{
  "mcpServers": {
    "chrome-agent-mcp": {
      "command": "node",
      "args": ["/path/to/chrome-agent-mcp/dist/index.js"],
      "env": { "CHROME_DEBUG_PORT": "9222" }
    }
  }
}

4. Install the companion extension (optional but recommended)

  1. Open chrome://extensions/

  2. Enable Developer mode

  3. Click Load unpacked → select the extension/ folder

The extension adds a popup dashboard showing which tabs are active, what the agent is doing, and captured screenshots — all updating in real time.


Available Tools

Navigation

Tool

Description

browser_navigate

Navigate to a URL

browser_navigate_back

Go back in browser history

browser_navigate_forward

Go forward in browser history

browser_reload

Reload the current tab

Interaction

Tool

Description

browser_click

Click an element by accessibility ref

browser_type

Type text into a focused element

browser_hover

Hover over an element

browser_press_key

Press a keyboard key or shortcut

browser_scroll

Scroll the page or an element

browser_select_option

Select a <select> dropdown option

browser_fill_form

Fill multiple form fields at once

browser_wait_for

Wait for an element or condition

Page Inspection

Tool

Description

browser_snapshot

Get the accessibility tree of the page

browser_take_screenshot

Capture a full-page screenshot

browser_evaluate

Execute JavaScript and return the result

Tab Management

Tool

Description

browser_tabs

Open, close, switch, list, and mark tabs done

DevTools

Tool

Description

devtools_console

Read and clear browser console logs

devtools_network

Inspect network requests and responses

devtools_elements

Inspect and query DOM elements

devtools_storage

Read cookies, localStorage, sessionStorage

Browser Management

Tool

Description

chrome_windows

List all open Chrome windows

chrome_focus

Focus a specific window

chrome_extensions

List installed Chrome extensions

session_sync

Sync session state with the extension dashboard


Architecture

src/
├── index.ts              MCP server + request dispatch
├── types.ts              Shared type definitions
├── core/                 Infrastructure layer
│   ├── connection.ts     Chrome CDP connection lifecycle
│   ├── bridge.ts         Extension event bridge
│   ├── favicon.ts        Tab favicon animation manager
│   ├── resilience.ts     Timeout / retry / fallback execution
│   └── groups/           Tab group isolation
│       ├── manager.ts    Orchestrator (public API)
│       ├── state.ts      File-based state persistence
│       └── chrome-api.ts Chrome Extension API bridge
├── tools/                MCP tool implementations
│   ├── tabs.ts
│   ├── navigation.ts
│   ├── browser.ts
│   ├── media.ts          screenshot · snapshot · evaluate
│   ├── session.ts
│   ├── interaction/      click · type · hover · scroll · form · wait
│   └── devtools/         console · network · elements · storage
└── utils/                Pure utility functions
    ├── accessibility.ts  AX tree formatter
    ├── description.ts    Tab action labels
    └── identity.ts       Animal names + Chrome group colors

Engineering rules: every file ≤ 300 lines · every directory ≤ 7 items · SOLID principles throughout.


Configuration

Variable

Default

Description

CHROME_DEBUG_PORT

9222

Chrome remote debugging port


Development

# Install dependencies
npm install

# Build TypeScript
npm run build

# Watch mode
npm run dev

# Run tests
npm test

# Coverage report (target: 80%)
npm run coverage

License

MIT © Otavio Senne

Available Tools

24 tools
browser_clickA

Click on an element using its ref from browser_snapshot. Supports targeting a specific tab via tabId.

Inputs: ref (required), tabId, agentId, element, +1 more.

browser_evaluateA

Evaluate JavaScript in a page context. IMPORTANT: top-level const/let/var declarations persist across calls — always wrap multi-statement code in an IIFE: (() => { const x = ...; return x; })(). Never use bare 'return' at top level. Max timeout: 10s — avoid setTimeout > 10000ms. Supports targeting a specific tab via tabId.

Inputs: expression (required), tabId, agentId.

browser_fill_formC

Fill multiple form fields at once. Supports targeting a specific tab via tabId.

Inputs: fields (required), tabId, agentId.

browser_hoverB

Hover the mouse over an element. Supports targeting a specific tab via tabId.

Inputs: ref (required), tabId, agentId, element.

browser_navigateB

Navigate to a URL in the specified tab (or active tab)

Inputs: url (required), tabId, agentId.

browser_navigate_backB

Go back in history for the specified tab

Inputs: tabId, agentId.

browser_navigate_forwardB

Go forward in history for the specified tab

Inputs: tabId, agentId.

browser_press_keyB

Press a keyboard key in the specified tab.

Inputs: key (required), tabId, agentId.

browser_reloadA

Reload the page in the specified tab

Inputs: tabId, agentId.

browser_scrollB

Scroll the page or a specific element. Supports targeting a specific tab via tabId.

Inputs: direction (required), ref, tabId, amount, +1 more.

browser_select_optionB

Select an option in a element. Supports targeting a specific tab via tabId.

Inputs: ref (required), value (required), tabId, agentId, +1 more.

browser_snapshotA

Capture accessibility snapshot of a page. Returns the page structure with element refs for interaction. Use instead of screenshots to find elements to click/type. IMPORTANT: refs go stale after any DOM change or navigation — always re-snapshot before clicking if the page may have changed. Supports targeting a specific tab via tabId.

Inputs: tabId, agentId.

browser_tabsA

List, create, close, or switch browser tabs. Returns tabId for each tab — pass tabId to other tools to target a specific tab without switching.

Inputs: action (required), url, index, tabId, +1 more.

browser_take_screenshotA

Take a screenshot of a page. Use browser_snapshot to find interactable elements instead. Supports targeting a specific tab via tabId.

Inputs: tabId, agentId, fullPage.

browser_typeB

Type text into an input element. Supports targeting a specific tab via tabId.

Inputs: ref (required), text (required), tabId, submit, +2 more.

browser_wait_forA

Wait for text to appear on the page or wait a fixed duration. Max 10s per call — call multiple times for longer waits. If a previous attempt failed, do NOT increase wait time blindly; try a different action instead. Supports targeting a specific tab via tabId.

Inputs: text, time, tabId, agentId.

chrome_extensionsA

List installed Chrome extensions.

Inputs: no named parameters.

chrome_focusA

Bring a specific Chrome tab into focus (activate it in the browser UI).

Inputs: tabId (required).

chrome_windowsC

Manage Chrome browser windows. List all windows with their tabs, or focus a specific window. Each window groups multiple tabs.

Inputs: action (required).

devtools_consoleA

Inspect the browser console for a tab. Start monitoring to capture future logs, then list or clear them. Equivalent to the DevTools Console panel.

Inputs: action (required), level, limit, tabId, +1 more.

devtools_elementsA

Inspect DOM elements and computed CSS styles for a tab. Equivalent to the DevTools Elements panel.

Inputs: selector (required), tabId, agentId, includeStyles.

devtools_networkA

Inspect network requests for a tab. Start monitoring to capture future requests, then list or clear them. Equivalent to the DevTools Network panel.

Inputs: action (required), limit, tabId, filter, +2 more.

devtools_storageB

Read or write browser storage for a tab: localStorage, sessionStorage, or cookies. Equivalent to DevTools Application > Storage panel.

Inputs: action (required), storageType (required), key, tabId, +2 more.

session_syncA

Sync Claude session name/color with Chrome tab group. 'rename': renames BOTH the Claude chat AND Chrome group automatically. 'color': maps a Claude Code color to Chrome group color and returns the /color command. 'detect': reads current Chrome group state and returns matching /rename + /color commands.

Inputs: action (required), claudeColor, description.

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

    Disambiguation4/5

    Most tools are clearly distinct action primitives (click, type, scroll, navigate, etc.), but there is overlap among browser_tabs, chrome_windows, and chrome_focus around tab/window switching. browser_snapshot and devtools_elements both expose page structure, though one is interaction-oriented and the other is inspection-oriented.

    Naming Consistency4/5

    The tool names mostly follow a clear browser_<verb>, devtools_<panel>, or chrome_<noun> pattern, which makes the set predictable. browser_tabs is a noun-based multi-action tool rather than a verb-noun name, and session_sync breaks the prefix convention.

    Tool Count3/5

    24 tools covers a broad browser-automation surface, but it is on the heavy end and includes very granular actions like navigate_back and navigate_forward that could have been combined. The count is justified by the inclusion of devtools and window management, yet it feels more like a toolkit than a focused MCP server.

    Completeness4/5

    The server covers core browser workflows well: tab lifecycle, navigation, page interaction, devtools inspection, storage, and window management. Minor gaps exist such as advanced network interception and drag-and-drop, but these can often be worked around with browser_evaluate.

    Maintenance

    ActivityInactive
    ResponsivenessNo recent community issues

    Related MCP Connectors

    Related MCP Servers

    • A
      license
      B
      quality
      D
      maintenance
      Enables AI agents to directly control your real Chrome browser with full context including login sessions, cookies, and open tabs. It provides tools for page scanning, JavaScript execution, CDP control, screenshots, and physical mouse/keyboard input for authentic browser automation.
      20
      244
      MIT
    • A
      license
      Not graded
      quality
      D
      maintenance
      Enables AI assistants to control a Chrome browser through natural language, supporting navigation, interaction, tab management, and data extraction.
      MIT