Skip to main content
Glama

browser-control-daemon

One daemon owns the Browser Control extension's WebSocket port (8089). Every Claude Code session runs a thin stdio MCP shim that talks to the daemon over a private unix socket, and starts the daemon in the background if it isn't running. Sessions are no longer limited by the number of ports the extension is configured for.

claude session 1 ─ shim ─┐
claude session 2 ─ shim ─┼─ unix socket (0600) ─ daemon ─ ws://127.0.0.1:8089 ─ extension
claude session N ─ shim ─┘

Setup

npm run build
claude mcp add browser-control -e EXTENSION_SECRET=<secret from extension options> -- node $PWD/dist/server.js

Extension: configure the single port 8089 (remove the extra ports / pool wrapper).

Related MCP server: firefox-mcp

Notes

  • EXTENSION_SECRET / EXTENSION_PORT are read by the daemon at spawn time. To change them: npm run stop; the next tool call respawns it.

  • Logs: ~/.local/state/browser-control-daemon/daemon.log.

  • Daemon requests use its own UUID correlation ids, so concurrent sessions can't collide.

  • Tools are a copy of upstream mcp-server/server.ts; only the BrowserAPI import differs.

  • Tests: npm test (needs unix-socket creation, so not inside the Claude Code sandbox).

  • Stop the old per-session upstream server / port pool first: the daemon exits if 8089 is taken.

Attribution

src/server.ts and src/common/ are derived from eyalzh/browser-control-mcp (MIT, see LICENSE). Use it with that project's Firefox extension.

Available Tools

9 tools
capture-tab-screenshotA

Capture a screenshot of the visible area of a browser tab, by tab ID. The user must authorize each tab by clicking the extension's toolbar button while that tab is open. If the tab is not authorized, this tool returns an error explaining what to ask the user to do; relay that request to the user and retry afterwards. Authorization ends when the tab navigates or closes. Capturing brings the tab to the foreground momentarily.

Inputs: tabId (required), scale, format, quality.

close-browser-tabsC

Close tabs in the user's browser by tab IDs

Inputs: tabIds (required).

find-highlight-in-browser-tabC

Find and highlight text in a browser tab (use a query phrase that exists in the web content)

Inputs: tabId (required), queryPhrase (required).

get-list-of-open-tabsC

Get the list of open tabs in the user's browser. Use offset and limit parameters for pagination when there are many tabs.

Inputs: limit, offset.

get-recent-browser-historyB

Get the list of recent browser history (to get all, don't use searchQuery)

Inputs: searchQuery.

get-tab-web-contentA

Get the full text content of the webpage and the list of links in the webpage, by tab ID. Use "offset" only for larger documents when the first call was truncated and if you require more content in order to assist the user.

Inputs: tabId (required), offset.

group-browser-tabsC

Organize opened browser tabs in a new tab group

Inputs: tabIds (required), groupColor, groupTitle, isCollapsed.

open-browser-tabB

Open a new tab in the user's browser (useful when the user asks to open a website)

Inputs: url (required).

reorder-browser-tabsC

Change the order of open browser tabs

Inputs: tabOrder (required).

Tool Schema Changelog

Recent tool additions, removals, and schema changes observed during successful MCP inspections.

Loading tool schema changelog…

    TDQS

    A3.5/5.0

    Scored across 9 tools

    Disambiguation5/5

    Each tool has a clearly distinct purpose: tab lifecycle (open, close, reorder, group), tab/history listing, content extraction, highlighting, and screenshots. Overlap is minimal, and even the two read tools (get-tab-web-content vs capture-tab-screenshot) differ by output modality. An agent can reliably select the correct tool.

    Naming Consistency5/5

    All tool names use consistent kebab-case with verb-first phrasing (open-, close-, get-, reorder-, find-, group-, capture-). Resource nouns are predictable (browser-tab, tabs, history, web-content). No mixed conventions or naming outliers.

    Tool Count5/5

    Nine tools is well-scoped for a browser-control server and sits comfortably in the ideal 3-15 range. Each tool maps to a distinct operation, avoiding both bloat and thinness.

    Completeness4/5

    The surface covers core tab management, history, content extraction, highlighting, and screenshots. Minor gaps like navigating an existing tab or refreshing a page are absent, but agents can approximate these via opening a new tab or re-reading content.

    Maintenance

    ActivitySlowing
    ResponsivenessNo recent community issues

    Related MCP Connectors

    Related MCP Servers

    • A
      license
      B
      quality
      C
      maintenance
      Lets Claude Code attach to a running, signed-in Firefox over WebDriver BiDi to control tabs, navigate, screenshot, read pages, click, type, fill forms, evaluate JavaScript, and inspect console/network activity.
      22
      MIT
    • A
      license
      Not graded
      quality
      B
      maintenance
      Enables Claude Code to drive a local Firefox browser: opening and managing tabs, navigating, reading page structure and text, clicking, typing, filling forms, running JavaScript, taking screenshots, and inspecting console messages and network requests. Everything runs over a local Unix socket with no network traffic, and actions are restricted to tabs explicitly placed under Claude's control.
      8 npm
      GPL 3.0
    • A
      license
      Not graded
      quality
      A
      maintenance
      Enables Claude Code to drive a real Firefox browser through a local MCP server using synthetic DOM events for clicks and typing. Supports tab management, navigation, page reading, form interaction, screenshots, and per-site consent with no network port opened.
      4 npm
      1
      MIT