firefox-devtools-mcp
About
Model Context Protocol server for Firefox DevTools - enables AI assistants to inspect and control Firefox browser through the Remote Debugging Protocol
Details
- Author
- mozilla
- Categories
- Search, Automation, Other, Developer Tools
Jump to
Install and use with Claude Code or Codex (npx)
Recommended: usenpxso you run the latest published version from npm.
claude mcp add firefox-devtools npx @mozilla/firefox-devtools-mcp@latest # Headless + viewport via args claude mcp add firefox-devtools npx @mozilla/firefox-devtools-mcp@latest -- --headless --viewport 1280x720 # Or via environment variables claude mcp add firefox-devtools npx @mozilla/firefox-devtools-mcp@latest \ --env START_URL=https://example.com \ --env FIREFOX_HEADLESS=true
codex mcp add firefox-devtools -- npx @mozilla/firefox-devtools-mcp@latest # Headless + viewport via args codex mcp add firefox-devtools -- \ npx @mozilla/firefox-devtools-mcp@latest -- --headless --viewport 1280x720 # Or via environment variables codex mcp add firefox-devtools \ --env START_URL=https://example.com \ --env FIREFOX_HEADLESS=true \ -- npx @mozilla/firefox-devtools-mcp@latest
{ "mcpServers": { "firefox-devtools": { "command": "npx", "args": ](https://github.com/mozilla/firefox-devtools-mcp/blob/HEAD/SECURITY.md)["-y", "@mozilla/firefox-devtools-mcp@latest", "--headless", "--viewport", "1280x720"], "env": { "START_URL": "about:blank" } } } }
[mcp_servers.firefox-devtools] command = "npx" args = ["-y", "@mozilla/firefox-devtools-mcp@latest", "--headless", "--viewport", "1280x720"] [mcp_servers.firefox-devtools.env] START_URL = "about:blank"
Model Context Protocol server for Firefox DevTools - enables AI assistants to inspect and control Firefox browser through the Remote Debugging Protocol
What can you do with Firefox DevTools MCP?
-
Browser automation— Ask your assistant to launch Firefox, navigate to URLs, and manage tabs using tools likenavigate_page,list_pages, andselect_page.
Interactive page control— Have your assistant take a snapshot of the current page and then click, fill, or hover over elements usingtake_snapshot,click_by_uid, andfill_by_uid.
Network and console inspection— Request details on network requests, downloads, or console messages withlist_network_requests,list_downloads, andlist_console_messages.
Screenshots and page text— Capture full-page screenshots or extract page text withscreenshot_pageandget_page_text, optionally saving large output to disk via thesaveToparameter.
Script execution— Run custom JavaScript in the page context usingevaluate_script, with optional sandboxing and file-based output for bulky results.
Firefox management— Get browser information, restart Firefox, or manage extensions throughget_firefox_info,restart_firefox, andinstall_extension.
Model Context Protocol server for automating Firefox via WebDriver BiDi (through Selenium WebDriver). Works with Claude Code, Claude Desktop, Cursor, Cline and other MCP clients.
Repository:https://github.com/mozilla/firefox-devtools-mcp
Note: This MCP server requires a local Firefox browser installation and cannot run on cloud hosting services like glama.ai. Usenpx @mozilla/firefox-devtools-mcp@latestto run locally, or use Docker with the provided Dockerfile.
Browser MCP servers carry inherent risks. A few key practices:
SeeSECURITY.mdfor a full breakdown of risks and how to report vulnerabilities.
- Node.js ≥ 20.19.0
- Firefox 100+ installed (auto‑detected, or pass--firefox-path)
Install and use with Claude Code or Codex (npx)
Recommended: usenpxso you run the latest published version from npm.
claude mcp add firefox-devtools npx @mozilla/firefox-devtools-mcp@latest # Headless + viewport via args claude mcp add firefox-devtools npx @mozilla/firefox-devtools-mcp@latest -- --headless --viewport 1280x720 # Or via environment variables claude mcp add firefox-devtools npx @mozilla/firefox-devtools-mcp@latest \ --env START_URL=https://example.com \ --env FIREFOX_HEADLESS=true
codex mcp add firefox-devtools -- npx @mozilla/firefox-devtools-mcp@latest # Headless + viewport via args codex mcp add firefox-devtools -- \ npx @mozilla/firefox-devtools-mcp@latest -- --headless --viewport 1280x720 # Or via environment variables codex mcp add firefox-devtools \ --env START_URL=https://example.com \ --env FIREFOX_HEADLESS=true \ -- npx @mozilla/firefox-devtools-mcp@latest
{ "mcpServers": { "firefox-devtools": { "command": "npx", "args": ["-y", "@mozilla/firefox-devtools-mcp@latest", "--headless", "--viewport", "1280x720"], "env": { "START_URL": "about:blank" } } } }
[mcp_servers.firefox-devtools] command = "npx" args = ["-y", "@mozilla/firefox-devtools-mcp@latest", "--headless", "--viewport", "1280x720"] [mcp_servers.firefox-devtools.env] START_URL = "about:blank"
Option C — Helper script (local dev build)
npm run setup # Choose Claude Code; the script saves JSON to the right path
npx @modelcontextprotocol/inspector npx @mozilla/firefox-devtools-mcp@latest --start-url https://example.com --headless
- list_pages,select_page,navigate_page
- take_snapshotthenclick_by_uid/fill_by_uid
- list_network_requests(always‑on capture),get_network_request
- list_downloads(always‑on capture),set_download_behavior
- screenshot_page,list_console_messages
You can pass flags or environment variables (names on the right):
- --firefox-path— absolute path to Firefox binary
- --headless— run without UI (FIREFOX_HEADLESS=true)
- --viewport 1280x720— initial window size
- --profile-path— use a specific Firefox profile
- --firefox-arg— extra Firefox arguments (repeatable)
- --start-url— open this URL on start (START_URL)
- --accept-insecure-certs— ignore TLS errors (ACCEPT_INSECURE_CERTS=true)
- --connect-existing— attach to an already-running Firefox instead of launching a new one (CONNECT_EXISTING=true)
- --marionette-port— Marionette port for connect-existing mode, default 2828 (MARIONETTE_PORT)
- --pref name=value— set Firefox preference at startup viamoz:firefoxOptions(repeatable)
- --tool-preset— select which tool modules to enable:slim,basic(default),developer,mozilla, orall. SeeTool modules and presets. (TOOL_PRESET)
- --tools— explicit list of tool modules to enable, overriding--tool-presetentirely (e.g.--tools pages network script). SeeTool modules and presets.
- --enable-script—deprecated, use--tool-preset developeror--tools ... script debugging.Selects thedevelopertool preset. (ENABLE_SCRIPT=true)
- --enable-privileged-context—deprecated, use--tool-preset mozillaor--tools ... privileged prefs.Selects themozillatool preset. RequiresMOZ_REMOTE_ALLOW_SYSTEM_ACCESS=1(ENABLE_PRIVILEGED_CONTEXT=true)
- --android-device— enable Firefox for Android mode; value is the ADB device serial (e.g.emulator-5554). Runadb devicesto list connected devices. Omit the value or useautoto select the single connected device automatically.
- --android-wipe-app-data— confirm that Android mode wipes all data of the target app. Required together with--android-device. (ANDROID_WIPE_APP_DATA=true)
- --android-package— Android app package name, defaultorg.mozilla.firefox. Other packages:org.mozilla.firefox_betafor Firefox Beta,org.mozilla.fenixfor Firefox Nightly,org.mozilla.fenix.debugfor Firefox Nightly Debug,org.mozilla.geckoview_examplefor geckoview (ANDROID_PACKAGE)
- --unrestricted-save-paths— let thesaveToparameter write anywhere on disk instead of the default roots. SeeSaving bulky output to diskand the security note inSECURITY.md. (UNRESTRICTED_SAVE_PATHS=true)
- --log-file— write MCP server logs to a file instead of stderr. Useful for debugging sessions with MCP clients that hide server output. SetDEBUG=*to also include verbose debug logs. Example:--log-file /tmp/firefox-mcp.log
Tools are grouped into modules. You choose which modules to expose either with a named preset (--tool-preset) or with an explicit list (--tools). When both are given,--toolswins and the preset is ignored.
Modules:pages,snapshot,input,network,console,screenshot,downloads,utilities,management,webextension,profiler,screencast,script,debugging,prefs,privileged.
Presets (each is a superset of the previous):
- slim—pages,snapshot,input,screenshot
- basic(default) —slimplusdownloads,script,utilities,management,webextension,screencast
- developer—basicplusdebugging,network,console,profiler
- mozilla—developerplusprefs,privileged
- all— every module
Note thatbasic, the default, includesscriptand therefore theevaluate_scripttool. SeeSECURITY.mdfor what that means for the attack surface, and use--tool-preset slimor an explicit--toolslist to drop it.
# Use the developer preset (adds network, console, debugging and profiler tools) npx @mozilla/firefox-devtools-mcp --tool-preset developer # Enable only the modules you need npx @mozilla/firefox-devtools-mcp --tools pages network console
Theprefsandprivilegedmodules requireMOZ_REMOTE_ALLOW_SYSTEM_ACCESS=1and are only available in the Mozilla-internal build. The public package skips them even if requested and logs a warning naming the modules it dropped.
- remote.prefs.recommended=false. When Firefox runs in automation, it appliesRecommendedPreferencesthat modify browser behavior for testing. Set remote.prefs.recommended to false to skip those and have a configuration closer to a regular Firefox instance.
- remote.log.level=Trace. Enable verbose WebDriver protocol logs in Firefox. The MCP server will automatically pass the matching log level to geckodriver so both sides log at the same verbosity.
- app.update.disabledForTesting=false. Allow Firefox to automatically download and apply updates. Note that updates may interrupt your session. Requires also setting remote.prefs.recommended=false.
Use--android-deviceto automate Firefox running on an Android device. Requiresadbon your PATH and geckodriver, which is managed automatically.
# List connected devices adb devices # Launch Firefox for Android on the single connected device npx @mozilla/firefox-devtools-mcp --android-device auto --android-wipe-app-data # Target a specific device npx @mozilla/firefox-devtools-mcp --android-device <serial> --android-wipe-app-data # Use Firefox Nightly instead npx @mozilla/firefox-devtools-mcp --android-device <serial> --android-package org.mozilla.fenix --android-wipe-app-data
Port forwarding between the host and device is handled automatically by geckodriver.
# Start Firefox with Marionette and the Remote Agent (BiDi) firefox --marionette --remote-debugging-port # Run the MCP server npx @mozilla/firefox-devtools-mcp --connect-existing --marionette-port 2828
Both flags are required because the MCP uses both WebDriver Classic (--marionette) and WebDriver BiDi (--remote-debugging-port). If Firefox is only started with--marionette, the MCP server fails to connect and asks you to restart Firefox with both flags.
Warning:Do not leave Marionette enabled during normal browsing. It setsnavigator.webdriver = trueand changes other browser fingerprint signals, which can trigger bot detection on sites protected by Cloudflare, Akamai, etc. Only enable Marionette when you need MCP automation, then restart Firefox normally afterward.
- Pages: list/new/navigate/select/close/get_page_text (get_page_text supports optionalsaveTo)
- Snapshot/UID: take/resolve/clear (take supports optionalsaveTo)
- Input: click/hover/fill/drag/upload/form fill
- Network: list/get (ID‑first, filters, always‑on capture; both support optionalsaveTo)
- Downloads: list_downloads/clear_downloads (always‑on capture), set_download_behavior (allow/deny/default)
- Console: list/clear (list supports optionalsaveTo)
- Screenshot: page/by uid (with optionalsaveTofor CLI environments)
- Script: evaluate_script (optionalsandboxfor an isolated realm; optionalsaveTofor bulky results)
- Privileged Context: list/select privileged ("chrome") contexts, evaluate_privileged_script (requiresMOZ_REMOTE_ALLOW_SYSTEM_ACCESS=1)
- WebExtension: install_extension, uninstall_extension, list_extensions (list requiresMOZ_REMOTE_ALLOW_SYSTEM_ACCESS=1)
- Firefox Management: get_firefox_info, get_firefox_output, restart_firefox
- Firefox Preferences: get_firefox_prefs, set_firefox_prefs (requiresMOZ_REMOTE_ALLOW_SYSTEM_ACCESS=1)
- Profiler: profiler_is_active, profiler_start (preset or explicit config), profiler_stop (saves profile to downloads directory)
- Screencast: screencast_start (records the page viewport to a video file in the downloads directory), screencast_stop (requires Firefox 154+)
- Utilities: accept/dismiss dialog, history back/forward, set viewport
Large tool output can consume significant context in CLI clients like Claude Code. Thescreenshot_page,screenshot_by_uid,take_snapshot,list_console_messages,list_network_requests,get_network_request,get_page_text,evaluate_script, andevaluate_privileged_scripttools accept an optionalsaveToparameter that writes the result to a file instead of returning it inline.saveTotakes one of three forms:
- a file path (relative to the current working directory, or absolute within~/.firefox-devtools-mcp; parent directories are created)
- an existing directory (a timestamped file is generated inside it)
- true(a timestamped file is generated under~/.firefox-devtools-mcp/output/)
The response returns the path and byte size. The saved file always holds the full, untruncated data: the inline size safeguards (console message caps, network header truncation, snapshot line caps) never apply to it.
The text-producing tools (everything except the screenshots) also acceptpreview, a number of characters of the saved output to echo back inline as a short excerpt. Screenshots have no preview.
screenshot_page({ saveTo: "page.png" }) take_snapshot({ saveTo: true }) list_network_requests({ urlContains: "api", saveTo: "network.json" }) evaluate_script({ function: "() => performance.getEntries()", saveTo: true, preview: 2000 })
By default, save paths are restricted: relative paths resolve against the current working directory, and absolute paths are only allowed within~/.firefox-devtools-mcp. Paths that escape these locations are rejected. Start the server with--unrestricted-save-pathsto write to arbitrary locations, including absolute paths outside that directory.
Saved files can then be viewed for instance with Claude Code'sReadtool without impacting context size.
npm install npm run build # Run with Inspector against local build npx @modelcontextprotocol/inspector node dist/index.js --headless --viewport 1280x720 # Or run in dev with hot reload npm run inspector:dev
SeeCONTRIBUTING.mdfor more details on local development, testing, and CI.
- Firefox not found: pass--firefox-path "/Applications/Firefox.app/Contents/MacOS/firefox"(macOS) or the correct path on your OS.
- First run is slow: Selenium sets up the BiDi session; subsequent runs are faster.
- Stale UIDs: a UID stays valid until its element is removed or the page navigates; take a fresh snapshot (take_snapshot) when a UID tool reports one is gone.
- Windows 10: Error during discovery for MCP server 'firefox-devtools': MCP error -32000: Connection closed
-
Solution 1Wrap withcmd /c(details):
"mcpServers": { "firefox-devtools": { "command": "cmd", "args": ["/c", "npx", "-y", "@mozilla/firefox-devtools-mcp@latest"] } }
Solution 2Use the absolute path tonpx(adjust extension —.cmd,.bat,.exe, or.ps1— to match your setup):
"mcpServers": { "firefox-devtools": { "command": "C:\\nvm4w\\nodejs\\npx.ps1", "args": ["-y", "@mozilla/firefox-devtools-mcp@latest"] } }
- Pre‑1.0 API: versions start at0.x. Use@latestwith npx for the newest release.
SeeCONTRIBUTING.mdfor how to file issues, run tests, and work on the project locally.
Licensed under either ofMITorApache 2.0at your option.
Search global news using natural language. Webz.io News Search API returns the most relevant articles and content, with filters for source, country, language, date, sentiment, and category.
Live browser debugging for AI assistants — DOM, console, network via MCP.
Debug web applications by connecting to Chrome's developer tools via the Chrome DevTools Protocol.
AppContext gives your AI coding agent instant visual insight into what you're developing, so it can fix issues, refine UI, and accelerate your development workflow in real time.
Official Chrome DevTools MCP server for controlling and inspecting a live Chrome browser from coding agents such as Gemini, Claude, Cursor, and Copilot.
A Playwright-based MCP server that exposes a live browser as a traceable, inspectable, debuggable and controllable execution environment for AI agents.
An MCP server for AI-assisted frontend development using Chrome DevTools. Requires Google Chrome.
Chrome DevTools Session MCP is a paid remote MCP endpoint for AI agent browser DevTools MCP. It exposes structured JSON tools, a public server card, token-based access, usage receipts, and a
About MCP server for native computer use and browser automation.
Browser automation via MCP for Chrome and Firefox
Bring the full power of BrowserStack’s Test Platform to your AI tools, making testing faster and easier for every developer and tester on your team.
Sign in to leave a review
Use Google, GitHub, or an email account so ratings stay tied to real people.
No reviews posted yet.

