Skip to main content
Glama
README.md
<a href="https://browsermcp.io">
  <img src="./.github/images/banner.png" alt="Browser MCP banner">
</a>

<h3 align="center">Browser MCP</h3>

<p align="center">
  Automate your browser with AI.
  <br />
  <a href="https://browsermcp.io"><strong>Website</strong></a> 
  •
  <a href="https://docs.browsermcp.io"><strong>Docs</strong></a>
</p>

## About

Browser MCP is an MCP server + browser extension that allows you to automate your browser using AI applications like VS Code, Claude, Cursor, and Windsurf. Supports both **Chrome** and **Firefox**.

This is a fork of the [original Browser MCP](https://github.com/browsermcp/mcp) with the following changes:

- **Standalone build**: All monorepo dependencies (`@repo/*`, `@r2r/messaging`) replaced with local implementations
- **Extended toolset**: 39 tools (up from 12 core tools) including tab management, JavaScript execution, cookie/storage access, CSS injection, network monitoring, and more
- **Cross-browser extension**: Full-featured extension with all 36 command handlers, compatible with both Chrome (MV3) and Firefox (MV3)
- **WSL support**: Auto-detects WSL IP and writes a config file for the extension to discover the correct WebSocket address
- **Connection resilience**: Speed guidance in tool descriptions, connection error detection with retry hints

## Features

- ⚡ Fast: Automation happens locally on your machine, resulting in better performance without network latency.
- 🔒 Private: Since automation happens locally, your browser activity stays on your device and isn't sent to remote servers.
- 👤 Logged In: Uses your existing browser profile, keeping you logged into all your services.
- 🥷🏼 Stealth: Avoids basic bot detection and CAPTCHAs by using your real browser fingerprint.

## Installation

### Prerequisites

- Node.js >= 18
- Google Chrome, Chromium, or Firefox 113+
- The Browser MCP extension (included in `extension/`)

### From source

```bash
git clone https://github.com/IlGabbia998/browsermcp-mcp.git
cd browsermcp-mcp
npm install
npm run build
```

### Load the extension

#### Chrome

1. Open Chrome and navigate to `chrome://extensions`
2. Enable **Developer mode**
3. Click **Load unpacked** and select the `extension/` folder from this project
4. The extension will show in your toolbar — click it and hit **Reconnect** when the MCP server is running

#### Firefox

Firefox MV3 requires a different `background` entry than Chrome. You must switch the manifest before loading the extension.

Using the helper script (recommended):

```bash
npm run use:firefox
```

Or manually:

1. Copy `extension/manifest.firefox.json` to `extension/manifest.json` (replacing the Chrome one)

Then load it:

2. Open Firefox and navigate to `about:debugging#/runtime/this-firefox`
3. Click **Load Temporary Add-on...**
4. Select `extension/manifest.json` from this project
5. The extension will show in your toolbar — click it and hit **Connect** when the MCP server is running

> **Note:** Chrome and Firefox use different manifest formats for MV3. Use `manifest.json` for Chrome (default) and run `npm run use:firefox` (or copy `manifest.firefox.json`) for Firefox. Firefox temporary add-ons are removed when Firefox is restarted. To restore the Chrome manifest, run `npm run use:chrome`.

### Using in your MCP client

Add the server to your MCP client config. The built entry point is `dist/index.js`.

#### Claude Desktop

Edit `~/Library/Application Support/Claude/claude_desktop_config.json` (macOS) or `%APPDATA%\Claude\claude_desktop_config.json` (Windows):

```json
{
  "mcpServers": {
    "browser": {
      "command": "node",
      "args": ["/absolute/path/to/browsermcp-mcp/dist/index.js"]
    }
  }
}
```

#### opencode

Add to your `opencode.json`:

```json
{
  "mcp": {
    "browser": {
      "type": "local",
      "command": ["node", "/absolute/path/to/browsermcp-mcp/dist/index.js"],
      "enabled": true
    }
  }
}
```

#### Cursor / Windsurf

Add to your MCP settings (`.cursor/mcp.json` or equivalent):

```json
{
  "mcpServers": {
    "browser": {
      "command": "node",
      "args": ["/absolute/path/to/browsermcp-mcp/dist/index.js"]
    }
  }
}
```

### Connect the browser

1. Start the MCP server (via your MCP client or `node dist/index.js`)
2. Open Chrome/Firefox and click the Browser MCP extension icon in the toolbar
3. Click **Reconnect** — the extension auto-discovers the server address
4. The MCP server will detect the connection automatically

## Available Tools (39)

### Core

| Tool | Description |
|------|-------------|
| `browser_navigate` | Navigate to a URL |
| `browser_go_back` | Navigate back |
| `browser_go_forward` | Navigate forward |
| `browser_snapshot` | Capture an accessibility snapshot of the page |
| `browser_click` | Click an element (by ref or description) |
| `browser_hover` | Hover over an element |
| `browser_type` | Type text into an input field |
| `browser_select_option` | Select an option in a dropdown |
| `browser_drag` | Drag from one element to another |
| `browser_press_key` | Press a keyboard key |
| `browser_wait` | Wait for N seconds |
| `browser_screenshot` | Take a screenshot |
| `browser_get_console_logs` | Get browser console logs |

### Navigation & Tabs

| Tool | Description |
|------|-------------|
| `browser_scroll` | Scroll the page (up/down/left/right) |
| `browser_new_tab` | Open a new tab |
| `browser_reload` | Reload the current page |
| `browser_list_tabs` | List all open tabs |
| `browser_close_tab` | Close a tab by ID |
| `browser_switch_tab` | Switch to a tab by ID |

### Page Interaction

| Tool | Description |
|------|-------------|
| `browser_find_text` | Find text content on the page |
| `browser_execute_js` | Execute arbitrary JavaScript |
| `browser_get_links` | Extract all links from the page |
| `browser_get_elements` | Query elements by CSS selector |
| `browser_extract_table` | Extract table data as structured JSON |
| `browser_extract_meta` | Extract page metadata and OpenGraph tags |
| `browser_extract_images` | Extract all images from the page |
| `browser_right_click` | Right-click an element |
| `browser_double_click` | Double-click an element |
| `browser_highlight` | Highlight elements matching a selector |
| `browser_readability` | Extract main article content |
| `browser_wait_for` | Wait for an element to appear |
| `browser_get_computed_style` | Get computed CSS styles for an element |
| `browser_inject_css` | Inject custom CSS into the page |

### Storage & Cookies

| Tool | Description |
|------|-------------|
| `browser_get_cookies` | Get cookies for the current page |
| `browser_set_cookies` | Set a cookie |
| `browser_get_storage` | Read from localStorage or sessionStorage |
| `browser_set_storage` | Write to localStorage or sessionStorage |

### Monitoring

| Tool | Description |
|------|-------------|
| `browser_network_log` | Start/stop/query network request logging |
| `browser_console_log` | Start/stop/query console log interception |

## Usage examples

Ask your AI assistant to do things like:

- "Go to github.com and take a screenshot"
- "Click the login button and fill in my email"
- "Scroll down and click the next page link"
- "Extract all links from this page"
- "Show me the cookies for this site"
- "Run JavaScript to get the page title"
- "Monitor network requests while I navigate"
- "Inject a custom CSS theme on this page"

The AI uses accessibility snapshots to understand the page structure and interact with elements reliably.

## Contributing

This is a standalone build of the Browser MCP server, extracted from the original monorepo. All monorepo dependencies have been replaced with local implementations.

### Project structure

```
src/
  index.ts              # Entry point, tool registration
  server.ts             # MCP server with connection error handling
  context.ts            # WebSocket context management
  ws.ts                 # WebSocket server creation
  lib/
    config/             # App and MCP configuration
    messaging/          # WebSocket message sender
    types/              # Zod schemas for all tools
  tools/
    snapshot.ts         # Core interaction tools (click, type, hover, etc.)
    common.ts           # Navigation tools (navigate, goBack, etc.)
    custom.ts           # Screenshot, console logs
    extended.ts         # All extended tools (26 new tools)
    tool.ts             # Tool type definitions
  utils/
    port.ts             # Port utilities
    aria-snapshot.ts    # Accessibility snapshot capture
extension/
  background.js         # Cross-browser service worker (36 command handlers)
  manifest.json         # Extension manifest (MV3, Chrome + Firefox compatible)
  popup.html            # Extension popup UI
  popup.js              # Popup JavaScript
  icons/                # Extension icons
```

## Credits

Browser MCP was adapted from the [Playwright MCP server](https://github.com/microsoft/playwright-mcp) in order to automate the user's browser rather than creating new browser instances. This allows using the user's existing browser profile to use logged-in sessions and avoid bot detection mechanisms that commonly block automated browser use.

TDQS

B3/5.0

Scored across 39 tools

Disambiguation4/5

Most tools are clearly distinct, but browser_console_log and browser_get_console_logs are easily confused, and browser_wait/browser_wait_for could be ambiguous without reading descriptions. Overall, the purposes are well differentiated.

Naming Consistency4/5

All tools use a consistent browser_ prefix and snake_case naming. However, there is a mix of verb-first (navigate, click) and noun-like (console_log, network_log) patterns, and some tools use 'get_' while others don't, creating minor inconsistency.

Tool Count2/5

With 39 tools, the server exceeds the 25+ threshold for 'too many'. While the breadth reflects a comprehensive browser automation scope, the sheer number makes tool selection heavier and suggests possible consolidation.

Completeness4/5

The tool set covers navigation, interaction, waiting, extraction, cookies/storage, console/network monitoring, and tab management—nearly all core browser automation needs. Minor gaps exist (e.g., no explicit alert/dialog handling or dedicated URL/page title getter), but most can be worked around via execute_js or snapshot.

Maintenance

ActivityStale
ResponsivenessNo issues