Browser MCP and chrome-devtools-mcp work; until your agent clicks something with a randomized class name and the whole loop crashes. LumaBrowser is a desktop browser with an MCP server, self-healing selectors, and a local cache of resolved selectors. Connect it to Claude Code, Codex, OpenCode or Cline from Settings, or to any other MCP host with one config block.
Builder hub: Agent quickstart · MCP Connector · Docker · Code Mode · Sub-agents · n8n / Zapier / Make · vs Selenium · vs Puppeteer · vs Playwright · API reference · Every runtime knob
Install, one MCP block, one REST call. Everything else on this page is detail.
# 1. Install and launch (Node 18+), or use the native installer from /download
npx lumabrowser start
# 2. MCP: Settings > Connect your agent (Claude Code, Codex, OpenCode, Cline),
# or Settings > Export MCP Configuration for any other host (needs Node.js)
# 3. REST: open a page, then click with an LLM fallback if the selector is stale
curl -X POST localhost:3000/api/browser/tabs -H 'Content-Type: application/json' -d '{"url":"https://news.ycombinator.com"}'
curl -X POST localhost:3000/api/browser/tabs/0/click -H 'Content-Type: application/json' -d '{"selector":".titleline > a","llmFallback":"Click the first story link"}'
Ports: REST 3000, plus WebDriver 9515 and CDP 9222, which are off by default and turned on in Settings. Headless in Docker: clone the repo and run LUMA_VNC_PASSWORD=change-me docker compose up -d (see Docker). The step-by-step version with config file locations is the agent quickstart.
LumaBrowser ships an MCP server. In Settings, “Connect your agent” writes the entry into Claude Code, Codex, OpenCode and Cline for you. For any other host (Claude Desktop, Cursor, OpenClaw), “Export MCP Configuration” saves luma-mcp-config.json with the block below.
{
"mcpServers": {
"luma-browser": {
"command": "node",
"args": ["<install dir>/resources/app.asar.unpacked/mcp-server.js"],
"env": { "LUMA_API_PORT": "3000" }
}
}
}
Install LumaBrowser. Download from the download page or run npx lumabrowser start.
Connect your host. Use Settings > Connect your agent, or paste the exported block into your host's MCP config. The server runs on Node.js, so Node must be installed, and it starts LumaBrowser if it is not already running.
Restart your MCP host. Your agent now has navigate, click, fill_form, screenshot, get_source, and a dozen other tools, all backed by a real Chromium tab on your machine.
Modern frontends ship CSS-in-JS class names like css-8xk2m9 that change on every build. Most MCP browser tools delegate to Puppeteer or Playwright and crash with element not found. LumaBrowser's selector tools take an optional llmFallback; if the CSS misses, an LLM resolves the description against the live DOM and the call succeeds.
The frontend pushes a new build at 4pm. Class names change. Your agent loop crashes on the first click() and you find out from an alert at 8pm.
click({ selector: ".product-buy-btn" })
→ Error: element not found
Pass an llmFallback alongside your selector. When the CSS misses, an LLM looks at the live DOM, picks the right element by description, and the call returns.
click({
selector: ".product-buy-btn",
llmFallback: "the primary buy button
under the price"
}) → ok
If your agent is reading entire DOM trees to figure out where to click, you're burning tokens on every turn. LumaBrowser tries the cheap paths first: an accessibility match that costs no tokens, then a local cache of selectors the model already resolved. The model is only asked when both miss, and it sees a compact list of up to 80 interactable elements, not the raw HTML.
When the model resolves a description like “the Save button”, LumaBrowser stores the answer locally as a robust selector, keyed by page pattern, action and description. Next time it checks the element is still there (one visible match, same tag, similar text) and replays it with no model call, even if no model is configured. Anything doubtful is a miss and goes back to the model. Entries expire after 30 days.
A focused set of MCP tools, not a 60-tool kitchen sink. Every interaction tool that targets the DOM accepts an llmFallback description.
Open tabs, route them to URLs, wait on a selector or page state, close them when done. The agent gets a real tab list it can reason about, not a single sandboxed page.
Click, type, scroll, send keystrokes, run JS in page context. Selector-based tools fall back to an LLM description if the CSS misses, so a frontend redesign doesn't end the run.
Grab cleaned page text, structured element properties, table rows, or full PNG screenshots. Several formats means the agent picks the cheapest one for the job.
There are a lot of ways to give an agent a browser right now. Here's how the local-desktop-app approach compares to the alternatives engineers usually try first.
| Browser MCP / Claude in Chrome | chrome-devtools-mcp | Browserbase | Browserless | LumaBrowser | |
|---|---|---|---|---|---|
| Where it runs | Chrome / Edge extension | Local Chrome via Puppeteer | Vendor cloud only | Vendor cloud or self-host | Local desktop app |
| MCP host support | Claude Desktop / Code only | Any MCP host | Custom SDK + MCP server | HTTP / WS API, MCP via wrappers | Any MCP host |
| Pricing model | Free, gated to Anthropic | Free, OSS | Free 1 hr, then $20+/mo | Free 1k units, then $25+/mo | Free, no caps |
| Self-healing selectors | No | No (raw Puppeteer) | Stagehand AI actions | No | LLM fallback per call |
| Cached selector resolutions | No | No | Stagehand action caching | No | Local resolution cache |
| Local model support | No (Anthropic only) | Bring your own host | Cloud-only | Cloud-only | LM Studio, WebGPU, OpenAI, Anthropic |
| Where the data lives | Anthropic + your Chrome | Your machine | Their cloud | Their cloud or yours | Your machine |
Pricing as listed by each vendor at time of publication. Cloud headless-browser pricing is metered, Browserbase by browser-hours, Browserless by 30-second “Units”, so cost scales with how often your agent loops. Higher tiers (Browserbase Startup at $99/mo, Browserless Starter at $140/mo annually) raise the included quota and concurrency.
This comparison reflects publicly available pricing and feature information gathered to the best of our knowledge from each vendor's public materials. Vendors update plans frequently and we're a small team; if anything here looks wrong, please email [email protected] with the correction and a source, and we'll update the page.
Bring your own MCP host. Bring your own model.
~/.cursor/mcp.jsonconnectOverCDPhttp://localhost:1234/v1; fully local inferenceLumaBrowser is the local desktop browser your agent already wishes you had wired up. Free to download, plugs into your existing MCP host, runs with the model you're already paying for; or no model at all if you want to drive it from a script.