
Firefox DevTools MCP Server: Browse and Debug Firefox with AI
Lets your AI assistant open, click through, inspect and profile pages in a real Firefox on your computer.
Firefox DevTools MCP is made by Mozilla. It runs on your computer, starts a Firefox window (or attaches to one you started), and gives the assistant tools to open pages, click, type, take screenshots and read the console and network traffic. No account or API key is needed.
You need Firefox 100 or newer and Node.js 20.19 or newer. The default setup includes a tool that runs JavaScript in any page and one that installs extensions, so use a separate Firefox profile and only visit sites you trust.
Good for
- Web developers who want the assistant to read console errors and network calls while they work
- Testers who want multi-step flows and forms checked in Firefox, not only Chrome
- Performance engineers recording Firefox profiles and videos
- People who want an assistant to read pages and fill forms in Firefox
Works in
12 should work
Tap an app to see how to set it up and any known problems.
Supports local MCP servers.
Supports local MCP servers.
Supports local MCP servers.
Supports local MCP servers.
Supports local MCP servers.
Supports local MCP servers.
Supports local MCP servers.
Supports local MCP servers.
Supports local MCP servers.
Supports local MCP servers.
Supports local MCP servers.
Supports local MCP servers.
Client does not support this transport.
Client does not support this transport.
Install Firefox DevTools MCP
Claude Code
- 1
Copy this prompt.
Add the Firefox DevTools MCP server to Claude Code. Run this command: claude mcp add firefox-devtools -- npx -y @mozilla/firefox-devtools-mcp Then check that it loaded and tell me if I need to sign in or restart.
- 2
Paste it into Claude Code. It shows the change and asks before running it.
Requires Node.js, Firefox 100 or newer installed, Node.js 20.19 or newer.
Firefox 100 or newer must be installed (auto-detected, or add the firefox-path option). Add --tool-preset slim to the arguments to drop the JavaScript tool, or --tool-preset developer for the network, console, profiler and debugger tools. Mozilla advises a dedicated Firefox profile.
Built from the package data we hold. Not yet tested by us.
Tools
Lists the open Firefox tabs
Returns each open tab with its number, title and address, and marks the one the assistant is working in.
Try: “What tabs are open in Firefox right now?”
Read ·
list_pagesOpens a new tab at an address
Opens a tab at the URL you give and returns its tab number. You can choose whether it waits for nothing, for the page structure, or for the full load.
Try: “Open https://example.com in a new tab”
Write ·
new_pageSends the current tab to an address
Loads a new URL in the tab the assistant is working in, with the same choice of how long to wait.
Try: “Go to https://example.com/pricing”
Write ·
navigate_pageSwitches to another tab
Picks the active tab by number, or by part of its address or title. The number wins if you give both.
Try: “Switch to the tab with GitHub in the title”
Write ·
select_pageCloses a tab
Closes the tab with the number you give.
Try: “Close tab 2”
Delete ·
close_pageReads the visible text of a page
Returns the page text as the browser shows it, cut off at 20,000 characters unless you ask for a file. It can save the full text to a file.
Try: “Get the text of this page and save it to a file”
Write ·
get_page_textCaptures a page outline with element IDs
Builds a short outline of the page where each element gets an ID that stays valid until the element goes away. Click and fill tools use those IDs. It can write the full outline to a file.
Try: “Take a snapshot of the checkout form”
Write ·
take_snapshotTurns an element ID into a CSS selector
Looks up an ID from a snapshot and returns the CSS selector for that element. It fails if the element is gone.
Try: “Give me a CSS selector for the Submit button”
Read ·
resolve_uid_to_selectorForgets the saved element IDs
Clears the element IDs from earlier snapshots. The README says it is usually not needed.
Try: “Clear the snapshot IDs”
Write ·
clear_snapshotClicks an element
Clicks the element with the given ID. Turn on double-click to click twice.
Try: “Click the Sign in button”
Write ·
click_by_uidMoves the pointer over an element
Hovers over the element with the given ID, for menus and tooltips.
Try: “Hover over the Products menu”
Write ·
hover_by_uidFills in a text field
Puts text into the input or text area with the given ID.
Try: “Fill the email field with test@example.com”
Write ·
fill_by_uidDrags one element onto another
Sends HTML5 drag events from one element to another, for drag-and-drop interfaces.
Try: “Drag the first card onto the Done column”
Write ·
drag_by_uid_to_uidFills several fields at once
Takes a list of element ID and value pairs and fills them all in one call.
Try: “Fill the name, email and phone fields in the signup form”
Write ·
fill_form_by_uidAttaches a local file to a file input
Sets a file input to a path on your computer, so the page can upload it when the form is sent.
Try: “Upload ./resume.pdf to the file input”
Write ·
upload_file_by_uidPresses a key or shortcut
Presses one key, with optional modifiers such as ctrl+shift+t, to submit, dismiss or trigger a shortcut. Typing text goes through the fill tool instead.
Try: “Press Escape to close the dialog”
Write ·
press_keyTypes text key by key
Types into the focused element one key at a time and can press a key such as Enter afterwards. It suits autocomplete fields and rich text editors that ignore a plain fill.
Try: “Type "laptop" in the search box and press Enter”
Write ·
type_textLists the requests the page made
Lists captured network requests with filters for address, method, status, type and time, and can save every match to a file as JSON. Each result gets an ID for the detail tool.
Try: “Show failed API requests from the last minute”
Write ·
list_network_requestsShows one request in detail
Returns headers and the response body for one request, and the request body when there is one. Long text bodies are cut and binary bodies are summarized. It can save the full record to a file.
Try: “Show the response body for request 12”
Write ·
get_network_requestTurns the browser cache off or on
Switches between normal caching and bypassing the cache, for the current tab or the whole browser, so a changed file is not hidden by an old copy.
Try: “Bypass the cache and reload the page”
Write ·
set_network_cacheLists console messages
Returns browser console messages filtered by level, time, text or source, and can save all matches to a file.
Try: “Show console errors since the page loaded”
Write ·
list_console_messagesEmpties the console log
Clears the console messages the server has collected.
Try: “Clear the console messages”
Write ·
clear_console_messagesTakes a screenshot of the page
Captures the visible area, or the whole scrollable page, as a PNG. It can save the image to a file instead of returning it.
Try: “Take a full-page screenshot”
Write ·
screenshot_pageTakes a screenshot of one element
Captures a single element, by ID from a snapshot, as a PNG. It can save the image to a file.
Try: “Screenshot just the pricing table”
Write ·
screenshot_by_uidSaves the page as a PDF
Prints the current page to a PDF using its print styles and returns the file path. Files go under ~/.firefox-devtools-mcp/output by default.
Try: “Print this page to PDF in landscape”
Write ·
print_pageLists downloads since startup
Shows downloads the server has seen, with status and saved file path, and can filter by status or address.
Try: “What has been downloaded so far?”
Read ·
list_downloadsClears the download list
Empties the server's record of tracked downloads.
Try: “Clear the downloads list”
Write ·
clear_downloadsAllows, blocks or resets downloads
Lets downloads save to a folder you name, cancels them, or goes back to the browser default, without the save dialog. The folder is created if missing.
Try: “Allow downloads into ./downloads”
Write ·
set_download_behaviorAccepts a browser dialog
Clicks OK on an alert, confirm or prompt dialog, and can enter text for a prompt.
Try: “Accept the confirm dialog”
Write ·
accept_dialogDismisses a browser dialog
Closes a dialog with the cancel action.
Try: “Dismiss the dialog”
Write ·
dismiss_dialogGoes back or forward
Moves the tab one step back or forward in history. Saved element IDs go stale after this.
Try: “Go back one page”
Write ·
navigate_historyResizes the page area
Sets the viewport width and height in pixels for the current tab, to test responsive layouts.
Try: “Set the viewport to 390 by 844”
Write ·
set_viewport_sizeReads Firefox's own log output
Returns recent stdout and stderr from the Firefox process, including crash and warning lines, with line count, text filter and time window options.
Try: “Show the last 50 Firefox log lines containing "error"”
Files ·
get_firefox_outputShows how Firefox was started
Returns the Firefox binary path, environment variables and the output file location for the running instance.
Try: “Which Firefox binary is the server using?”
Read ·
get_firefox_infoEnds the browser session
Closes Firefox if the server started it. If the server attached to your existing Firefox, it just lets go and leaves the browser running.
Try: “Close the Firefox session”
Delete ·
close_firefox_sessionInstalls a Firefox extension
Installs an extension from a .xpi or .zip file, base64 data or an unpacked folder using WebDriver BiDi. The install is temporary unless you ask for a permanent one, which needs a signed extension.
Try: “Install the extension from ./my-addon as a temporary add-on”
Write ·
install_extensionRemoves a Firefox extension
Uninstalls an extension by its ID, which comes from the install tool.
Try: “Uninstall addon@example.com”
Delete ·
uninstall_extensionChecks whether the profiler is recording
Reports whether the Firefox profiler is running right now.
Try: “Is the profiler recording?”
Read ·
profiler_is_activeStarts the Firefox profiler
Starts recording a performance profile, from a named preset such as web-developer or networking or from entries, interval, features and threads you give it.
Try: “Start the web-developer profiler preset”
Write ·
profiler_startStops the profiler and saves the profile
Ends the recording and saves the profile file in the downloads folder, then returns its path. A discard option throws the recording away.
Try: “Stop the profiler and save the profile”
Write ·
profiler_stopStarts recording a video of the page
Records the page viewport to a video file (WebM by default) in the downloads folder and returns an ID for stopping it. It needs Firefox 154 or newer.
Try: “Record a screencast of this checkout flow”
Write ·
screencast_startStops a screen recording
Finishes a running recording and returns the path of the video file.
Try: “Stop the screencast”
Write ·
screencast_stopRuns JavaScript in the page
Runs a JavaScript function you supply in the page and returns the result. It can run on any site you opened and can save its output to a file.
Try: “Run a function that returns document.title”
Runs code ·
evaluate_scriptTurns on the JavaScript debugger
Switches on the debugger for the current page. It must run before logpoints work and needs Firefox 153 or newer.
Try: “Enable the debugger for this page”
Write ·
enable_debuggerLists the page's JavaScript files
Returns every script file loaded in the page. The debugger must be enabled first.
Try: “List the scripts this page loaded”
Read ·
list_scriptsReads a script file's source
Fetches the source of a loaded JavaScript file by address. The debugger must be enabled first.
Try: “Show the source of app.js”
Read ·
get_script_sourceLogs an expression at a code line
Adds a logpoint at a script URL and line. Each time that line runs, the expression is evaluated and stored without pausing the page.
Try: “Set a logpoint on line 42 of app.js that logs the cart total”
Write ·
set_logpointRemoves a logpoint
Deletes a logpoint you set earlier, by its ID.
Try: “Remove logpoint 1”
Delete ·
remove_logpointReads what a logpoint collected
Returns the values a logpoint stored since it was set.
Try: “What did logpoint 1 record?”
Read ·
get_logpoint_results
Read from the source code
Permissions
high risk · 5 things to watch
High risk
By default the assistant can run JavaScript on any page you open and install extensions, so a hostile web page could steer it into acting inside your browser session. Use a dedicated Firefox profile and the slim tool preset when you do not need scripting.
What it can do
- Read your data
- Create and change things
- Delete things
- Read-only mode
Watch out for
It can run any JavaScript in the pages you open
The default tool preset includes evaluate_script, so a page that manipulates the assistant could read page data or act as you on that site. Start the server with the slim preset to remove it; slim still has click, fill, file upload and tab-closing tools. github.com
Pointed at your normal profile, it can use your logins
The connect-existing option attaches to a running Firefox with your cookies and sessions. Run the server with its own Firefox profile instead. github.com
It can install and remove Firefox extensions
install_extension and uninstall_extension are part of the default preset. Leave out the management modules with an explicit tools list if you do not want this. github.com
It writes files to your disk
Screenshots, PDFs, profiles, recordings and the saveTo option write under ~/.firefox-devtools-mcp/output by default. The unrestricted-save-paths flag lets the assistant write anywhere, so leave it off. github.com
Android mode wipes the app's data
The Android option runs a data clear on the target Firefox app before each session, which removes tabs, history, bookmarks and passwords. Use a Firefox build set aside for automation. github.com
Security advisories
No published security advisories as of Nov 1, 2026.
Technical details
| Talks to | Sites you open in Firefox. The server itself needs no account or API key. |
|---|---|
| Sign-in and keys | No credentials. The server uses whatever the Firefox profile it controls is signed in to. |
Questions
Is it official?
Yes. It is made by Mozilla, the maker of Firefox, and is published from the mozilla GitHub organisation as the @mozilla/firefox-devtools-mcp package.
Which AI apps does it work with?
The README names Claude Code, Claude Desktop, Cursor, Cline and Codex, and says other MCP clients work too. It runs on your computer, so it does not work as a ChatGPT or claude.ai web connector.
Does it need an API key?
No. You need Node.js 20.19 or newer and Firefox 100 or newer installed on the same computer. There is no sign-in.
How many tools do I get?
The default preset (basic) turns on 35 of the 49 tools. The developer preset adds network, console, profiler and debugger tools to reach 49. Mozilla-only tools in other presets are left out of the public package.
Can I make it safer?
Yes. Use a separate Firefox profile and pick the slim preset to drop the JavaScript tool, extension install and downloads. Slim still lets the assistant click, type, upload a file you name and close tabs. There is no read-only mode.
Can it use my already open Firefox with my logins?
Yes, with the connect-existing option, after you start Firefox with Marionette and remote debugging turned on. Mozilla advises a dedicated profile instead, because the assistant would see your cookies and sessions.
Does it run headless?
Yes. Add the headless option or set the FIREFOX_HEADLESS variable to true to run Firefox without a window.
Can it test Firefox for Android?
Yes, with the Android option and adb on your path. It wipes the target app's data at the start of every session, so use a build kept for testing.
Information
updated Nov 2, 2026
- Publisher
- Official
- Package
@mozilla/firefox-devtools-mcp- Registry
- npm
- Transport
- stdio
- Version
- 0.10.7
- License
- MIT OR Apache-2.0
- Last commit
- Oct 30, 2026
- Listed in
- Official MCP registry
Sources
Docs, issue trackers and discussions this page is built from. Issues, quotes and findings above link to their own source.
Show all 3Hide
- github.com · github.com
- github.com · github.com
- github.com · github.com