browsercontrol
Click on "Install Server".
Wait a few minutes for the server to deploy. Once ready, it will show a "Started" state.
In the chat, type
@followed by the MCP server name and your instructions, e.g., "@browsercontrolgo to github.com and star the browsercontrol repo"
That's it! The server will respond to your query, and you can continue using it as needed.
Here is a step-by-step guide with screenshots.
The idea
Most browser tools hand a model a DOM tree and hope it writes a working selector. BrowserControl hands it a picture.
Every action returns a fresh screenshot with numbered red boxes drawn over the interactive elements, plus the same list as text. The agent acts by number:
click(5)
type_text(3, "hello world")
upload_file(7, "/path/to/resume.pdf")No selectors to guess, none to break on the next redesign. This is the Set of Marks pattern, used as the primary interface rather than a fallback.
Related MCP server: Helm
Quick start
uv add browsercontrol # or: pip install browsercontrolChromium installs itself on first run. If that fails, run
python -m playwright install chromium once.
Point your client at the browsercontrol command:
{
"mcpServers": {
"browsercontrol": {
"command": "browsercontrol"
}
}
}Client | Location |
Claude Desktop |
|
Claude Code |
|
Cursor | Settings → Model Context Protocol |
Cline | Settings → MCP Servers |
Continue.dev |
|
Zed |
|
No install at all, if you prefer: "command": "uvx", "args": ["browsercontrol"].
Restart the client and ask it for something:
"Open Hacker News and tell me the top story."
Full walkthrough: Getting started.
The one rule
Element numbers expire after every action. The map is rebuilt from scratch on
every click, type, scroll, navigation, and screenshot — element 7 before a
click is rarely element 7 after it.
So an agent should never plan two clicks from one screenshot. It acts, reads the new screenshot, finds the target again, then acts again. Almost every failure worth debugging traces back to this.
Two corollaries:
Only what's in the viewport gets marked. No number usually means "below the fold" — scroll, then look again.
Cross-origin iframes are never marked. Open shadow roots and same-origin frames are traversed and numbered; third-party payment fields and embedded widgets can't be. That's a boundary of the browser, not a bug.
Tools
39 tools across seven categories. Everything that touches the page returns an annotated screenshot plus the element map.
Category | Tools | |
5 |
| |
7 |
| |
3 |
| |
5 |
| |
4 |
| |
11 |
| |
4 |
|
A few behaviours that aren't obvious from the names:
type_textuses Playwright'sfill()— it replaces the field, it doesn't append.clickresolves the topmost element at the mark's centre, so a cookie banner overlapping your target will eat the click. Dismiss overlays first.upload_filegoes throughset_input_files, which works on sites where driving the file picker doesn't.screenshot(annotate=True, full_page=True)returns a clean image — full-page captures can't be marked.get_page_contentreturns Markdown, capped at 30 KB.Recordings are Playwright traces. Open one with
npx playwright show-trace ~/.browsercontrol/recordings/<name>.zip.
Teach your agent to use it well
Connecting the server tells an agent which tools exist. The bundled agent skill tells it how to use them well — that numbers expire, that a banner will swallow a click, that a missing number means scroll.
mkdir -p ~/.claude/skills/browsercontrol
curl -fsSL https://raw.githubusercontent.com/adityasasidhar/browsercontrol/main/skills/browsercontrol/SKILL.md \
-o ~/.claude/skills/browsercontrol/SKILL.mdIt loads only when a task actually involves a browser, so it costs one line of
context the rest of the time. Agents that would rather read the docs directly can
start at llms.txt.
Configuration
Environment variables, read once at startup.
Variable | Default | |
|
|
|
|
| |
|
| |
|
| Navigation timeout, ms |
|
| Profile directory |
| — | Unpacked extension to load at launch |
| — | Chromium binary to drive, when Playwright ships no build for your platform |
| next to the profile | Where traces are saved |
| next to the profile | Where snapshots are saved |
|
|
BROWSER_HEADLESS=false BROWSER_VIEWPORT_WIDTH=390 BROWSER_VIEWPORT_HEIGHT=844 browsercontrolWhy this one
The session is a real Chromium profile (launch_persistent_context), so cookies,
localStorage and logins survive restarts — log in once and your agent stays
logged in. DevTools are first-class: console, network timing, uncaught
exceptions, performance and computed styles are tools, not an afterthought. And
it runs entirely on your machine — no LLM API key, no cloud round-trip, no
per-action cost, nothing leaving the box.
Honest positioning: if you're happy driving the accessibility tree, Playwright MCP is excellent. If you want an LLM planning the interactions for you, look at Stagehand or Browser-Use. BrowserControl's niche is vision-first, fully local browser control with devtools built in. Longer comparison in the docs.
Development
git clone https://github.com/adityasasidhar/browsercontrol
cd browsercontrol
uv sync
uv run playwright install chromium --with-deps
uv run pytest # tests (Playwright is mocked — no real browser)
uv run ruff check . && uv run ruff format . # lint + format
uv run fastmcp dev browsercontrol/server.py # dev server with the MCP inspectorbrowsercontrol/
├── server.py # FastMCP instance, lifespan, tool registration
├── browser.py # BrowserManager: Playwright lifecycle, element detection, SoM rendering
├── config.py # env-var config
└── tools/ # one module per category, each exporting register_*_tools(mcp)CI runs the suite on Ubuntu, Windows and macOS with ruff, mypy --strict,
bandit and pytest.
Contributing
Issues and PRs welcome — see CONTRIBUTING.md. New tools should
come with a test for the happy path and the error path; the existing
tests/test_*.py files show the pattern.
On the list, if you're looking for somewhere to start: Firefox and WebKit support, mobile device presets, network mocking, DOM diffing between snapshots, and accessibility auditing.
License
MIT. Built on FastMCP and Playwright.
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.
Related MCP Servers
- AlicenseAqualityCmaintenanceMCP server for browser automation that lets LLMs interact with web pages through structured accessibility snapshots, bypassing the need for screenshots.Last updated236,111,743Apache 2.0
- Alicense-qualityDmaintenanceSemantic browser automation MCP server that lets AI agents control a browser using natural language, handling navigation, form filling, data extraction, and more without CSS selectors.Last updated4651MIT
- AlicenseAqualityDmaintenanceMCP server that gives AI coding assistants direct access to the browser — navigate, click, fill forms, run JavaScript, take screenshots, and read page content.Last updated112181MIT
- AlicenseAqualityBmaintenanceEnables AI agents to control a browser via MCP with structured perception, verified actions, and self-healing capabilities.Last updated6134541MIT
Related MCP Connectors
Screenshot, diff, audit and sitemap-capture any web page — 5 MCP tools for AI agents.
AI-powered browser automation — navigate, click, fill forms, and extract data from any website.
Live browser debugging for AI assistants — DOM, console, network via MCP.
Latest Blog Posts
- Who's Calling? MCP Hosts Are an Identity Blind Spot (And the Spec Knows It)By Om-Shree-0709 on .mcpAgent IdentityOAuth 2.1
- 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/adityasasidhar/browsercontrol'
If you have feedback or need assistance with the MCP directory API, please join our Discord server