Browser-MCP Navigator
Browser-MCP (Browser-MCP Navigator)
Ultra-fast browser automation server over Chrome DevTools Protocol (CDP), exposed as a Model Context Protocol (MCP) server.
No screenshots. No Playwright relay. Direct CDP WebSocket — 20–50× fewer tokens, ~10ms per action.
Note: The core Python package is named
browser_mcpinternally.
What it does
Controls a real Chrome browser from any AI agent that supports MCP. The agent receives a compact accessibility-tree snapshot with @eN references after every action — no pixels, no heavy HTML blobs.
Agent ──MCP──► Browser-MCP Server ──CDP──► ChromeRelated MCP server: Scout
Quick Start — Docker (Recommended)
git clone https://github.com/ingjohnfigueroablanco/browser-MCP.git
cd browser-MCP
cp .env.example .env # optionally set MCP_API_KEY
docker compose up -dServer ready at http://localhost:3067/sse.
Quick Start — Local (No Docker)
git clone https://github.com/ingjohnfigueroablanco/browser-MCP.git
cd browser-MCP
python -m venv .venv
source .venv/bin/activate # Windows: .venv\Scripts\activate
pip install -e .
python -m browser_mcp # stdio modeConnecting from Claude Code
Option A — Local subprocess / stdio
Add to your project's .mcp.json:
{
"mcpServers": {
"browser-mcp": {
"command": "python",
"args": ["-m", "browser_mcp"]
}
}
}Option B — Docker / SSE
{
"mcpServers": {
"browser-mcp": {
"type": "sse",
"url": "http://localhost:3067/sse",
"headers": { "X-API-Key": "your-key" }
}
}
}Connecting from other agents / frameworks
Python agent (mcp SDK)
from mcp import ClientSession
from mcp.client.sse import sse_client
async with sse_client("http://localhost:3067/sse",
headers={"X-API-Key": "your-key"}) as (read, write):
async with ClientSession(read, write) as session:
await session.initialize()
result = await session.call_tool("navigate", {"url": "https://example.com"})
print(result.content[0].text)Testing Localhost Apps (Docker)
The browser runs inside the container. localhost inside Docker ≠ your dev machine.
Approach | How |
Docker Desktop | Use |
ngrok |
|
Local mode | (stdio) Chrome runs on your machine — |
Available Tools
Tool | Description |
| Launch / reconnect Chrome |
| Close Chrome |
| Go to URL, wait for load / networkidle |
| Accessibility tree as compact text with |
| Human-like click by coordinates |
|
|
| Clear + type text in an input |
| Key press (Enter, Tab, Escape, ArrowDown…) |
| Select native |
| Mouse hover (menus, tooltips) |
| React/Vue/Angular-safe input setter via native JS |
| Scroll page or element into view |
| Run any JavaScript — drag, events, async fetch, bulk loops |
| Bulk operations — run a JS snippet once per item |
| Raw CDP protocol — file upload, device emulation, network intercept |
| innerText of element or full page |
| Wait until text appears on page |
| JS console logs |
| Network requests / responses |
| PNG base64 (escape hatch) |
| Current URL + title |
Performance & Bulk Operations
The bottleneck is LLM round-trips, not the browser
Each tool call costs one full LLM inference + HTTP round-trip. The browser executes CDP in ~10ms.
Pattern | Tool calls | Typical wall time |
20 × (click + fill + click) | 60 | ~10 min |
1 × js_eval_loop with 20 items | 1 | ~15 sec |
Rule: for N > 5 repetitions, use js_eval_loop
# GOOD — 1 tool call for 20 users
js_eval_loop(
items=users,
script="""
document.querySelector('.agregar').click();
await new Promise(r => setTimeout(r, 400));
// ... fill logic ...
document.querySelector('.crear').click();
return item.user;
""",
delay_ms=300,
)Environment Variables
Variable | Default | Description |
|
|
|
|
| SSE bind address |
|
| SSE port |
| (empty) | API key header; empty = no auth |
| auto | Explicit path to chrome.exe |
| (empty) | Extra Chrome flags |
|
|
|
|
|
|
Architecture
mcp/ FastMCP server + tool definitions
browser/ BrowserManager — lifecycle, navigate, snapshot, waits
snapshot/ AX tree → compact text with @eN refs (no screenshots)
actions/ mouse, keyboard, forms (ref → coordinates)
cdp/ Raw CDP WebSocket connection + event buffers
chrome/ Chrome launcher, port scan, reattachWhy it's faster than Playwright:
No Node.js relay — Python speaks CDP directly.
Chrome stays alive between calls (daemon) — 0 ms startup per tool call.
Snapshot = compact AX text, not full YAML or heavy screenshots.
@eNrefs = stablebackendNodeId— no DOM re-query per action.
This server cannot be installed
Maintenance
Resources
Unclaimed servers have limited discoverability.
Looking for Admin?
If you are the server author, to access and configure the admin panel.
Latest Blog Posts
- Your AI Chatbot Just Exposed Your CEO's Salary to an InternBy Om-Shree-0709 on .Agent IdentityMCP SecurityOAuth Delegation
- Why MCP Servers Need Execution Sandboxing (And Why Your Current Stack Isn't Enough)By Om-Shree-0709 on .Agentic AiPrompt InjectionWebAssembly
MCP directory API
We provide all the information about MCP servers via our MCP API.
curl -X GET 'https://glama.ai/api/mcp/v1/servers/ingjohnfigueroablanco/browser-MCP'
If you have feedback or need assistance with the MCP directory API, please join our Discord server