Firefox Devtools MCP vs MCP Browser Kit
A side-by-side look at the Firefox Devtools MCP and MCP Browser Kit MCP servers: transport, auth, tools, quality signals, and the config to install either one in Claude, Cursor, Windsurf or VS Code.
Verdict: choose Firefox Devtools MCP for browser automation work as a local process; choose MCP Browser Kit for browser automation as a local process. You can also run both side by side in one mcpServers block.
Which MCP server should you choose?
Choose Firefox Devtools MCP when
- You need dedicated capabilities in the Browser Automation domain.
- You prefer a local stdio subprocess transport.
- Its auth model fits you: No auth required.
- You want tools like
list_pages, new_page, navigate_page.
Choose MCP Browser Kit when
- You need dedicated capabilities in the Browser Automation domain.
- You prefer a local stdio subprocess transport.
- Its auth model fits you: No auth required.
- You want tools like
captureTab, invokeJsFn, openTab.
Feature & specification comparison
Rows where the two servers differ are marked.
| Spec | ||
|---|---|---|
| Category | Browser Automation | Browser Automation |
| Quality signal | 72/100 · Great | 67/100 · Great |
| Install command | Confirmed | Confirmed |
| Transport | Local subprocess (stdio) | Local subprocess (stdio) |
| Auth | No auth required | No auth required |
| Pricing | Free | Free |
| Required env vars | None listed | None listed |
| Verified owner | Community listing | Community listing |
| GitHub stars | 516 | 55 |
| Directory activity | 7 views 0 installs 0 upvotes | 3 views 0 installs 0 upvotes |
| Tools | 34 | 19 |
| Full listing | View Firefox Devtools MCP | View MCP Browser Kit |
Tools & capabilities
Firefox Devtools MCP tools 34
list_pagesList open tabs (index, title, URL). Selected tab is marked.new_pageOpen new tab at URL. Returns tab index.navigate_pageNavigate selected tab to URL.select_pageSelect active tab by index, URL, or title. Index takes precedence.close_pageClose tab by index.get_page_textGet the visible text of the page (document.body.innerText). Caps at maxLength (default 20000 chars); saveTo saves the full text to a file.take_snapshotCapture DOM snapshot with stable UIDs. A UID stays valid across snapshots until its element is removed or the page navigates. Output caps at maxLines (default 100); scope with selector or dump the full tree with saveTo.resolve_uid_to_selectorResolve UID to CSS selector. Fails if the element is gone.clear_snapshotClear snapshot UIDs. Usually not needed.click_by_uidClick element by UID. Set dblClick for double-click.hover_by_uidHover over element by UID.fill_by_uidFill text input/textarea by UID.- +22 more on the listing page
MCP Browser Kit tools 19
captureTabScreenshot a tab. When: MV2 tabs only; you need pixel coordinates for coordinate tools. How: browserId, windowId, tabId from bk:///context; use returned dimensions to compute x/y. Requires: browserId, windowId, tabId. Returns: value { data (base64 image), width, height, mimeType } — use width/height to scale coordinates. Avoid: calling on manifestVersion 3 — use readable-elements instead.invokeJsFnExecute a JavaScript function body in the page context. When: MV2 only, and only when element/coordinate tools cannot accomplish the task — e.g. setting a native <select> (.value then dispatch change) or a range slider. How: fnBodyCode is the function body only (no function wrapper); use return to send a value back. Example: return document.title; Requires: browserId, windowId, tabId, fnBodyCode. Returns: value.result = whatever you return (must be JSON-serializable). Avoid: on manifestVersion 3; wrapping in function () { ... }.openTabOpen a URL in a new tab. When: navigating to a page not already open. How: browserId and windowId from bk:///context; url must include scheme (https://); after success re-read context for the new tabId and wait for page load. Requires: browserId, windowId, url. Returns: value { browserId, windowId, tabId } — use the returned ids for follow-up calls. Avoid: interacting immediately — tab needs a moment to load.closeTabClose a tab. Irreversible. When: finished with a tab and no further interaction needed. How: browserId, windowId, tabId from bk:///context. Requires: browserId, windowId, tabId. Returns: ok=true once closed. Avoid: closing the tab you still need for further interactions.getSelectionGet the user's current text selection in a tab. When: you need text the user has highlighted on the page. How: browserId, windowId, tabId from bk:///context. Requires: browserId, windowId, tabId. Returns: value.selectedText — empty string when nothing is selected. Avoid: expecting content when nothing is selected.clickOnCoordinatesClick at pixel coordinates inside a tab. When: MV2 fallback when no readablePath is available. How: x/y from a recent captureTab screenshot (same width/height); browserId, windowId, tabId from context. Requires: browserId, windowId, tabId, x, y. Returns: ok=true on success; on ok=false re-capture the tab and recompute x/y. Avoid: on MV3 (no screenshot source); prefer clickOnElement when readablePath exists.fillTextToCoordinatesClick at (x, y) then type text into the focused input. When: MV2 fallback for inputs without a readablePath. How: coordinates from recent captureTab; submit via clickOnCoordinates on submit button or hitEnterOnCoordinates. Requires: browserId, windowId, tabId, x, y, value. Returns: ok=true on success; on ok=false re-capture the tab and recompute x/y. Avoid: on MV3; prefer fillTextToElement when readablePath is available.hitEnterOnCoordinatesClick at (x, y) then press Enter to submit a form. When: MV2 fallback to submit when no submit button readablePath exists. How: coordinates from recent captureTab. Requires: browserId, windowId, tabId, x, y. Returns: ok=true on success; on ok=false re-capture the tab and recompute x/y. Avoid: on MV3; prefer hitEnterOnElement when readablePath is available.clickOnElementClick an element by readablePath. When: primary click method on MV2 and MV3. How: read {tabUri}/readable-elements; filter [path, role, text, value?] tuples by role and text; copy path exactly (e.g. 0.2.1) — not a CSS selector. Custom dropdown/combobox/datepicker: click the trigger to open it, then re-read readable-elements and click the option/day cell. Native <select>: clicking an option can work for listbox selects (multiple or size>1) but single-line dropdowns use a native popup that ignores synthetic clicks — those need invokeJsFn (MV2) or showHumanHint (MV3). Verify by re-reading and escalate. See Complex inputs. Requires: browserId, windowId, tabId, readablePath. Returns: ok=true on success; on ok=false re-read readable-elements and pick a fresh path. Avoid: inventing paths; re-read elements after navigation if click fails.fillTextToElementType text into an <input> or <textarea> by readablePath. When: primary fill method on MV2 and MV3. Also handles native <input> date/time/datetime-local/month/color when value is in the exact format (date YYYY-MM-DD, time HH:MM, datetime-local YYYY-MM-DDTHH:MM, month YYYY-MM, color #rrggbb). How: readablePath from first element of [path, role, text, value?] tuple in readable-elements; submit via clickOnElement on submit button or hitEnterOnElement. Requires: browserId, windowId, tabId, readablePath, value. Returns: ok=true on success; on ok=false re-read readable-elements and pick a fresh path. Avoid: CSS selectors as readablePath; stale paths after DOM changes. Does not work on contenteditable rich-text editors (MV2 invokeJsFn instead), native <select>, or custom popup dropdowns/datepickers — use the strategy ladder under Complex inputs in server instructions.hitEnterOnElementFocus an element by readablePath then press Enter. When: submitting a form when no explicit submit button exists. How: readablePath from readable-elements tuple (dot-separated index like 0.2.1). Requires: browserId, windowId, tabId, readablePath. Returns: ok=true on success; on ok=false re-read readable-elements and pick a fresh path. Avoid: using when a submit button readablePath is available — click it instead.scrollPageScroll the page viewport in a direction. When: target content or elements are off-screen; reveal more of the page before reading or interacting. Works on MV2 and MV3 (no screenshot needed). How: direction is up/down/left/right; optional amount in pixels — omit it to scroll ~one viewport (a page). browserId, windowId, tabId from bk:///context. Requires: browserId, windowId, tabId, direction. Returns: ok=true once scrolled. Already at that edge (nothing to scroll) is still ok=true. Avoid: assuming new elements exist — re-read readable-elements after scrolling, snapshots go stale.- +7 more on the listing page
Ready-to-paste client configs
Paste either block (or both) into your client config, e.g. claude_desktop_config.json or ~/.cursor/mcp.json. We only show a config when the install command is confirmed.
Firefox Devtools MCP
{
"mcpServers": {
"freema-firefox-devtools-mcp": {
"command": "npx",
"args": [
"-y",
"@mozilla/firefox-devtools-mcp@latest"
]
}
}
}
MCP Browser Kit
{
"mcpServers": {
"ndthanhdev-mcp-browser-kit": {
"command": "npx",
"args": [
"-y",
"@mcp-browser-kit/server@latest"
]
}
}
}
Frequently asked questions
Firefox Devtools MCP is categorized under Browser Automation and uses a local stdio subprocess. MCP Browser Kit belongs to Browser Automation and uses a local stdio subprocess. Pick Firefox Devtools MCP for browser automation work and MCP Browser Kit for browser automation.
Copy the mcpServers block from the config section on this page into your client's config (for example claude_desktop_config.json or ~/.cursor/mcp.json), then fully restart the client.
Firefox Devtools MCP is listed as free. Auth: no auth required. MCP Browser Kit is listed as free. Auth: no auth required. If a server needs environment variables such as API keys, define them under the env key in your client's MCP config.
Yes. MCP clients support multiple servers: add freema-firefox-devtools-mcp and ndthanhdev-mcp-browser-kit as separate keys in the same mcpServers object, and your assistant will call tools from either one.
On AllMCPs, Firefox Devtools MCP has a quality signal of 72/100 (Great) with 7 views, 0 installs and 516 GitHub stars. MCP Browser Kit has 67/100 (Great) with 3 views, 0 installs and 55 GitHub stars.