Browser-MCP Navigator
Fast-Browser-MCP (Fast-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
fast_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──► Fast-Browser-MCP Server ──CDP──► ChromeRelated MCP server: Scout
Quick Start — Docker (Recommended)
git clone https://github.com/ingjohnfigueroablanco/Fast-browser-MCP.git
cd Fast-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/Fast-browser-MCP.git
cd Fast-browser-MCP
python -m venv .venv
source .venv/bin/activate # Windows: .venv\Scripts\activate
pip install -e .
python -m fast_browser_mcp # stdio modeConnecting from Claude Code
Option A — Local subprocess / stdio
Add to your project's .mcp.json:
{
"mcpServers": {
"fast-browser-mcp": {
"command": "python",
"args": ["-m", "fast_browser_mcp"]
}
}
}Option B — Docker / SSE
{
"mcpServers": {
"fast-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.
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/Fast-browser-MCP'
If you have feedback or need assistance with the MCP directory API, please join our Discord server