# Firefox DevTools MCP (npm · @mozilla/firefox-devtools-mcp)

Control and debug Firefox: navigate, fill forms, inspect network and console, profile.

- Trust score: 80/100 (high trust)
- Registry status: active
- Liveness: live
- Owner verified: no
- Last scored: 2026-09-24

## Components

- npm · `@mozilla/firefox-devtools-mcp`: 80/100 (this document), [markdown](https://verifymcp.io/servers/mozilla-firefox-devtools-mcp/mozilla-firefox-devtools-mcp.md), [page](https://verifymcp.io/servers/mozilla-firefox-devtools-mcp/mozilla-firefox-devtools-mcp)

## Channel facts

- Registry: `npm`
- Package: `@mozilla/firefox-devtools-mcp`
- Version: `0.10.4`
- Transport: `stdio`

## Trust breakdown

How this component scores in each security and reliability category. Every signal is checked automatically from public evidence about the published package, including repeated runs of it in an isolated sandbox, and we only credit what we can confirm. Scores are 0–100 per category. Scoring method: https://verifymcp.io/docs/scoring (what has changed: https://verifymcp.io/docs/scoring/changelog)

Scored 2026-09-24.

- **Supply Chain Security**: 98/100
  - No malware found by supply-chain analysis.
  - No known CVEs affecting this package version or its production dependencies.
  - No install/post-install scripts declared.
  - 47 of 143 dependencies flagged as unhealthy.
- **Provenance & Transparency**: 100/100
  - Source repository is publicly reachable at the declared URL.
  - Cryptographically verified build provenance (signed, bound to mozilla/firefox-devtools-mcp).
  - Clear OSI-approved license (MIT OR Apache-2.0).
  - Actively maintained (last published 1 days ago).
  - Publishes a security disclosure policy (SECURITY.md).
- **Schema Quality & AI Usability**: 80/100
  - AI-judged instruction clarity (excellent).
  - Tool/resource definitions use about 4551 tokens (~94/item across 48 items; 48 tools + 0 resources), lean.
  - Usage-examples check failed: none of the tools include examples.
- **Stability & Change Management**: 0/100
  - Stability not yet verified: not enough scan history yet (needs a 30-day window).
- **Tool Coverage**: 100/100
  - 100% of tools have a non-trivial description (not blank, and not just the tool's name).
  - 100% of tool parameters carry a description.
- **Tool Safety**: 75/100
  - No prompt-injection markers were found in the server instructions, tool names or descriptions we captured.
  - 0 of 2 tool(s) whose name or description implies an irreversible operation declare an MCP destructiveHint annotation; "uninstall_extension" implies "uninstall" and declares no destructiveHint at all, which the MCP spec reads as destructive by default.
  - An AI judge read all 49 captured unit(s) of tool text and found none that tries to manipulate the model reading it.
- **Capabilities**: 100/100
  - Implements a supported MCP spec version (2025-11-25); the latest is 2026-07-28.

**Unverified: 1 category.** A category scored 0 because we could not verify it: a data source with nothing on this package, evidence we could not reach, or a check we could not run. We only credit what we can confirm.

## Install

### How do I install the Firefox DevTools MCP server?

Firefox DevTools MCP runs locally as an npm package, launched with npx -y @mozilla/firefox-devtools-mcp. Ready-made configuration for Claude, Cursor, VS Code, Codex and 5 more is on this page, copied from each client's own documentation.

### Claude

```bash
claude mcp add mozilla-firefox-devtools-mcp -- npx -y @mozilla/firefox-devtools-mcp
```

### Cursor

```json
{
  "mcpServers": {
    "mozilla-firefox-devtools-mcp": {
      "command": "npx",
      "args": [
        "-y",
        "@mozilla/firefox-devtools-mcp"
      ]
    }
  }
}
```

### VS Code

```json
{
  "servers": {
    "mozilla-firefox-devtools-mcp": {
      "command": "npx",
      "args": [
        "-y",
        "@mozilla/firefox-devtools-mcp"
      ]
    }
  }
}
```

### Codex

```bash
codex mcp add mozilla-firefox-devtools-mcp -- npx -y @mozilla/firefox-devtools-mcp
```

### opencode

```json
{
  "$schema": "https://opencode.ai/config.json",
  "mcp": {
    "mozilla-firefox-devtools-mcp": {
      "type": "local",
      "command": [
        "npx",
        "-y",
        "@mozilla/firefox-devtools-mcp"
      ],
      "enabled": true
    }
  }
}
```

### OpenClaw

```bash
openclaw mcp add mozilla-firefox-devtools-mcp --command npx --arg -y --arg @mozilla/firefox-devtools-mcp
```

### Hermes

```yaml
mcp_servers:
  mozilla-firefox-devtools-mcp:
    command: "npx"
    args: ["-y", "@mozilla/firefox-devtools-mcp"]
```

### Netclaw

```json
{
  "McpServers": {
    "mozilla-firefox-devtools-mcp": {
      "Transport": "stdio",
      "Command": "npx",
      "Arguments": [
        "-y",
        "@mozilla/firefox-devtools-mcp"
      ]
    }
  }
}
```

### Vellum

```bash
assistant mcp add mozilla-firefox-devtools-mcp -t stdio -c npx -a -y @mozilla/firefox-devtools-mcp
```

### Other

```json
{
  "mcpServers": {
    "mozilla-firefox-devtools-mcp": {
      "command": "npx",
      "args": [
        "-y",
        "@mozilla/firefox-devtools-mcp"
      ]
    }
  }
}
```

## Changelog

Every change recorded for this component, newest first. Days that predate change tracking, or that we cannot explain, say so: "we were watching and nothing happened" and "we were not watching" are different claims.

### 2026-09-22 (score 80)

First indexed and scored.

## MCP tools (48)

### `list_pages` (~23 tokens)

List open tabs (index, title, URL). Selected tab is marked.

### `new_page` (~108 tokens)

Open new tab at URL. Returns tab index.

Input parameters:

- `url` (string, required): Target URL
- `wait` (string): When to return: 'none' (navigation started), 'interactive' (DOMContentLoaded), 'complete' (load event fired, including subresources). Omit for the default: 'interactive' for http/https/data/blob/file…

### `navigate_page` (~104 tokens)

Navigate selected tab to URL.

Input parameters:

- `url` (string, required): Target URL
- `wait` (string): When to return: 'none' (navigation started), 'interactive' (DOMContentLoaded), 'complete' (load event fired, including subresources). Omit for the default: 'interactive' for http/https/data/blob/file…

### `select_page` (~65 tokens)

Select active tab by index, URL, or title. Index takes precedence.

Input parameters:

- `pageIdx` (number): Tab index (0-based, most reliable)
- `title` (string): Title substring (case-insensitive)
- `url` (string): URL substring (case-insensitive)

### `close_page` (~25 tokens)

Close tab by index.

Input parameters:

- `pageIdx` (number, required): Tab index to close

### `get_page_text` (~163 tokens)

Get the visible text of the page (document.body.innerText). Caps at maxLength (default 20000 chars); saveTo saves the full text to a file.

Input parameters:

- `maxLength` (number): Max characters to return inline (default: 20000). Ignored when saveTo is used.
- `preview` (number): Number of characters of the saved text to return inline as a preview when saveTo is used. Omit for no preview.
- `saveTo` (boolean|string): Save the full untruncated text to a file instead of returning it inline. Pass a file path, an existing directory (generated file inside), or true (generated file under ~/.firefox-devtools-mcp/output/…

### `take_snapshot` (~256 tokens)

Capture 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.

Input parameters:

- `includeAll` (boolean): Include all visible elements without relevance filtering. Useful for Vue/Livewire apps (default: false)
- `includeAttributes` (boolean): Include ARIA attributes (default: false)
- `includeText` (boolean): Include text (default: true)
- `maxDepth` (number): Max tree depth
- `maxLines` (number): Max lines (default: 100)
- `preview` (number): Number of characters of the saved output to return inline as a preview when saveTo is used. Omit for no preview.
- `saveTo` (boolean|string): Save the complete snapshot text to a file (ignores maxLines) instead of returning it inline. Pass a file path, an existing directory (generated file inside), or true (generated file under ~/.firefox-…
- `selector` (string): CSS selector to scope snapshot to specific element (e.g., "#app")

### `resolve_uid_to_selector` (~34 tokens)

Resolve UID to CSS selector. Fails if the element is gone.

Input parameters:

- `uid` (string, required): UID from snapshot

### `clear_snapshot` (~17 tokens)

Clear snapshot UIDs. Usually not needed.

### `click_by_uid` (~46 tokens)

Click element by UID. Set dblClick for double-click.

Input parameters:

- `dblClick` (boolean): Double-click (default: false)
- `uid` (string, required): Element UID from snapshot

### `hover_by_uid` (~26 tokens)

Hover over element by UID.

Input parameters:

- `uid` (string, required): Element UID from snapshot

### `fill_by_uid` (~39 tokens)

Fill text input/textarea by UID.

Input parameters:

- `uid` (string, required): Input element UID from snapshot
- `value` (string, required): Text to fill

### `drag_by_uid_to_uid` (~43 tokens)

Drag element to another (HTML5 drag events).

Input parameters:

- `fromUid` (string, required): Source element UID
- `toUid` (string, required): Target element UID

### `fill_form_by_uid` (~32 tokens)

Fill multiple form fields at once.

Input parameters:

- `elements` (array, required): Array of {uid, value} pairs

### `upload_file_by_uid` (~41 tokens)

Upload file to file input by UID.

Input parameters:

- `filePath` (string, required): Local file path
- `uid` (string, required): File input UID from snapshot

### `press_key` (~212 tokens)

Press a single key, optionally with modifiers, to submit, dismiss, navigate or trigger a shortcut. Not for entering text: use fill_by_uid instead.

Input parameters:

- `key` (string, required): One key, optionally preceded by "+"-separated modifiers, such as "Escape", "Enter" or "ctrl+shift+t". Modifiers: ctrl, alt, shift, meta. Named keys: Enter, Return, NumpadEnter, Tab, Backspace, Delete…
- `uid` (string): Focusable element UID from snapshot to focus before pressing (default: the already focused element)

### `type_text` (~123 tokens)

Type text key by key into the focused element, optionally followed by a key such as Enter. Use fill_by_uid to set the value of a known input; use this for elements that only react to real typing, such as autocomplete fields and rich text editors.

Input parameters:

- `submitKey` (string): Key to press after the text, such as "Enter" or "Tab". Same syntax as press_key.
- `text` (string, required): Text to type
- `uid` (string): Focusable element UID from snapshot to focus before typing (default: the already focused element)

### `list_network_requests` (~317 tokens)

List network requests, returning IDs for get_network_request. Filter by url/method/status; caps at limit (default 50); saveTo saves all matches to a file.

Input parameters:

- `detail` (string): Detail level (default: summary)
- `format` (string): Output format (default: text)
- `isXHR` (boolean): XHR/fetch only
- `limit` (number): Max requests (default: 50)
- `method` (string): HTTP method filter
- `preview` (number): Number of characters of the saved output to return inline as a preview when saveTo is used. Omit for no preview.
- `resourceType` (string): Resource type filter
- `saveTo` (boolean|string): Save matching requests to a file as JSON instead of returning them inline. Saves full untruncated headers by default; pass detail=summary or min for a lean form, or an explicit limit to cap how many…
- `sinceMs` (number): Only last N ms
- `sortBy` (string): Sort field (default: timestamp)
- `status` (number): Exact status code
- `statusMax` (number): Max status code
- `statusMin` (number): Min status code
- `urlContains` (string): URL filter (case-insensitive)

### `get_network_request` (~191 tokens)

Get request details by ID, including the response body (and request body when present). Large text bodies are truncated inline; binary bodies are summarized. URL lookup as fallback.

Input parameters:

- `format` (string): Output format (default: text)
- `id` (string): Request ID from list_network_requests
- `preview` (number): Number of characters of the saved output to return inline as a preview when saveTo is used. Omit for no preview.
- `saveTo` (boolean|string): Save the request details with full untruncated headers and bodies to a file as JSON instead of returning them inline (binary bodies are stored base64-encoded). Pass a file path, an existing directory…
- `url` (string): URL fallback (may match multiple)

### `set_network_cache` (~118 tokens)

Control the HTTP cache. Use behavior='bypass' so every request goes to the network — useful for performance measurement and for verifying a change that a cached asset would otherwise hide. Applies to the currently selected tab unless scope='global'. Persists until set back to 'default' or Firefox shuts down.

Input parameters:

- `behavior` (string, required): 'bypass' to skip the cache, 'default' to restore normal caching
- `scope` (string): 'tab' (default) applies to the selected tab; 'global' applies browser-wide

### `list_console_messages` (~228 tokens)

List console messages, filterable by level, time, text, source. Caps at limit (default 50); saveTo saves all matches to a file.

Input parameters:

- `format` (string): Output format (default: text)
- `level` (string): Filter by level
- `limit` (number): Max messages (default: 50)
- `preview` (number): Number of characters of the saved output to return inline as a preview when saveTo is used. Omit for no preview.
- `saveTo` (boolean|string): Save matching messages to a file in full (untruncated) instead of returning them inline. Saves all matching messages by default; pass an explicit limit to cap how many are saved. Pass a file path, an…
- `sinceMs` (number): Only last N ms
- `source` (string): Filter by source
- `textContains` (string): Text filter (case-insensitive)

### `clear_console_messages` (~14 tokens)

Clear collected console messages.

### `screenshot_page` (~107 tokens)

Capture viewport screenshot as base64 PNG. Set fullPage for the whole scrollable document.

Input parameters:

- `fullPage` (boolean): Capture the whole scrollable document (default: false)
- `saveTo` (boolean|string): Save the screenshot to a file instead of returning it as image data in the response. Pass a file path, an existing directory (generated file inside), or true (generated file under ~/.firefox-devtools…

### `screenshot_by_uid` (~93 tokens)

Capture element screenshot by UID as base64 PNG.

Input parameters:

- `saveTo` (boolean|string): Save the screenshot to a file instead of returning it as image data in the response. Pass a file path, an existing directory (generated file inside), or true (generated file under ~/.firefox-devtools…
- `uid` (string, required): Element UID from snapshot

### `list_downloads` (~73 tokens)

List downloads tracked since startup, including status and saved file path.

Input parameters:

- `format` (string): Output format (default: text)
- `limit` (number): Max downloads (default: 50)
- `status` (string): Filter by status
- `urlContains` (string): URL filter (case-insensitive)

### `clear_downloads` (~15 tokens)

Clear the tracked downloads buffer.

### `set_download_behavior` (~130 tokens)

Control how downloads are handled: allow (save to a destination folder), deny (cancel), or reset to default. Avoids the native save-file dialog. Requires a recent Firefox.

Input parameters:

- `behavior` (string, required): 'allowed' saves downloads to `downloadFolder`, 'denied' cancels them, 'default' resets to the browser default
- `downloadFolder` (string): Path to the folder where downloads should be stored, created if missing. Only used for behavior='allowed', where it defaults to ~/.firefox-devtools-mcp/output/downloads. Relative paths resolve agains…

### `accept_dialog` (~30 tokens)

Accept browser dialog. Provide promptText for prompts.

Input parameters:

- `promptText` (string): Text for prompt dialogs

### `dismiss_dialog` (~13 tokens)

Dismiss browser dialog.

### `navigate_history` (~29 tokens)

Navigate history back/forward. UIDs become stale.

Input parameters:

- `direction` (string, required): back or forward

### `set_viewport_size` (~36 tokens)

Set viewport dimensions in pixels.

Input parameters:

- `height` (number, required): Height in pixels
- `width` (number, required): Width in pixels

### `get_firefox_output` (~102 tokens)

Retrieve Firefox output (stdout/stderr including MOZ_LOG, warnings, crashes, stack traces). Returns recent output from the capture file. Use filters to focus on specific content.

Input parameters:

- `grep` (string): Filter log lines containing this string (case-insensitive)
- `lines` (number): Number of recent log lines to return (default: 100, max: 10000)
- `since` (number): Only show logs written in the last N seconds

### `get_firefox_info` (~31 tokens)

Get information about the current Firefox instance configuration, including binary path, environment variables, and output file location.

### `close_firefox_session` (~60 tokens)

Ends the browser session. If the server connected to your existing Firefox, this releases the connection and leaves Firefox running. If the server started Firefox itself, this closes it. Call this when the browser task is complete and no further browser interaction is expected.

### `install_extension` (~137 tokens)

Install a Firefox extension using WebDriver BiDi webExtension.install command. Supports installing from archive (.xpi/.zip), base64-encoded data, or unpacked directory.

Input parameters:

- `path` (string): File path (for archivePath or path types)
- `permanent` (boolean): Firefox-specific: Install permanently (requires signed extension). Default: false (temporary install)
- `type` (string, required): Extension data type: "archivePath" for .xpi/.zip, "base64" for encoded data, "path" for unpacked directory
- `value` (string): Base64-encoded extension data (for base64 type)

### `uninstall_extension` (~55 tokens)

Uninstall a Firefox extension using WebDriver BiDi webExtension.uninstall command. Requires the extension ID returned by install_extension or obtained from list_extensions.

Input parameters:

- `id` (string, required): Extension ID (e.g., "addon@example.com")

### `profiler_is_active` (~18 tokens)

Check whether the Firefox profiler is currently recording.

### `profiler_start` (~191 tokens)

Start the Firefox profiler. Provide either a preset name or explicit recording options (entries, interval, features, threads). Cannot combine both. Valid presets: web-developer, firefox-platform, graphics, media, ml, networking, power, debug.

Input parameters:

- `activeContext` (string): Id of the top-level navigable to mark as the active tab in the profile. Does not restrict profiling to that tab.
- `entries` (integer): Number of entries to keep in the sampling buffer. Required when no preset is given.
- `features` (array): Profiler features to enable. Required when no preset is given.
- `interval` (number): Sampling interval in milliseconds. Required when no preset is given.
- `preset` (string): Profiler preset name. Cannot be combined with entries, interval, features, or threads.
- `threads` (array): Thread names to profile. Required when no preset is given.

### `profiler_stop` (~67 tokens)

Stop the Firefox profiler and save the recorded profile to a file in the downloads directory. Returns the path to the saved file, or null when nothing was saved.

Input parameters:

- `discard` (boolean): If true, stop the profiler and discard the recording instead of saving it to disk. Defaults to false.

### `screencast_start` (~160 tokens)

Start recording a screencast (video) of the current page viewport, saving the output to a file in the downloads directory. Returns a screencast id to pass to screencast_stop. Multiple recordings can run at once.

Input parameters:

- `context` (string): Id of the top-level browsing context to record. Defaults to the currently selected page.
- `frameRate` (integer): Target frame rate of the recording, in frames per second.
- `height` (integer): Height of the recorded video in pixels. Defaults to the viewport height.
- `mimeType` (string): MIME type of the output file. Defaults to "video/webm".
- `width` (integer): Width of the recorded video in pixels. Defaults to the viewport width.

### `screencast_stop` (~71 tokens)

Stop an in-progress screencast recording started with screencast_start and finalize the video file. Returns the path to the saved file.

Input parameters:

- `screencast` (string): Id of the screencast to stop, as returned by screencast_start. Optional when exactly one recording is active.

### `evaluate_script` (~275 tokens)

Run a JS function in the page and return its result. Prefer this for targeted reads (a value, text, computed style, whether an element exists) instead of a full take_snapshot. Use the UID interaction tools for clicking, typing, and filling.

Input parameters:

- `args` (array): UIDs to pass as function arguments
- `function` (string, required): JS function string, e.g. () => document.title
- `preview` (number): Number of characters of the saved result to return inline as a preview when saveTo is used. Omit for no preview.
- `sandbox` (string): Evaluate in an isolated sandbox realm with this name instead of the page realm. The sandbox shares the page DOM and keeps the native built-ins even where the page overrode them. Page-defined globals…
- `saveTo` (boolean|string): Save the result to a file as JSON instead of returning it inline. Pass a file path, an existing directory (generated file inside), or true (generated file under ~/.firefox-devtools-mcp/output/). Rela…
- `timeout` (number): Timeout in ms (default: 5000)

### `enable_debugger` (~31 tokens)

Enable the JS debugger for the current page. Required before set_logpoint works. Requires Firefox 153+.

### `list_scripts` (~28 tokens)

List all JavaScript files currently loaded in the page. Requires enable_debugger to have been called.

### `get_script_source` (~46 tokens)

Get the source code of a JavaScript file loaded in the page. Requires enable_debugger to have been called.

Input parameters:

- `scriptUrl` (string, required): URL of the script to retrieve.

### `set_logpoint` (~98 tokens)

Set a logpoint at a specific location. When execution reaches that line, the expression is evaluated and the result is stored without pausing. Use get_logpoint_results to retrieve collected values. Requires enable_debugger to have been called.

Input parameters:

- `expression` (string, required): JavaScript expression to evaluate each time the logpoint is hit.
- `line` (number, required): Line number (1-based).
- `url` (string, required): URL of the script.

### `remove_logpoint` (~32 tokens)

Remove a previously set logpoint.

Input parameters:

- `logpoint` (string, required): Logpoint id returned by set_logpoint.

### `get_logpoint_results` (~39 tokens)

Get the results collected by a logpoint since it was set.

Input parameters:

- `logpoint` (string, required): Logpoint id returned by set_logpoint.

## Diagnostics

Captured diagnostic sections: Provenance, Dependencies. The full working is on the page: https://verifymcp.io/servers/mozilla-firefox-devtools-mcp/mozilla-firefox-devtools-mcp#diagnostics

## Score history

- 2026-09-24: 80
- 2026-09-23: 80
- 2026-09-22: 80

## Common questions

### What is the Firefox DevTools MCP server?

Firefox DevTools MCP is listed in the public MCP registry as io.github.mozilla/firefox-devtools-mcp. Control and debug Firefox: navigate, fill forms, inspect network and console, profile. This page covers its npm package (@mozilla/firefox-devtools-mcp).

### Is the Firefox DevTools MCP server safe to use?

Firefox DevTools MCP scores 80 out of 100 on VerifyMCP. We found no known CVEs affecting it as of 24 September 2026. It declares no install or post-install scripts. Its build provenance is signed and verified. That is a record of what we were able to check automatically, not an endorsement. The category breakdown on this page shows every signal behind the number, including the ones we could not confirm.

### What tools does the Firefox DevTools MCP server expose?

Firefox DevTools MCP exposes 48 tools: list_pages, new_page, navigate_page, select_page, close_page, and 43 more. Their descriptions and schemas cost roughly 4,192 tokens of context every time the server is loaded.

### Is the Firefox DevTools MCP server still maintained?

Firefox DevTools MCP is still listed as active in the MCP registry. We last reached this channel on 24 September 2026. Those dates come from our own scans of the registry and the channel itself, not from anything the publisher announced.

### What licence is the Firefox DevTools MCP server under?

Firefox DevTools MCP declares the MIT OR Apache-2.0 licence, which is OSI-approved. That covers the source only, and says nothing about the cost of any service it calls.

## Links

- npm package: https://www.npmjs.com/package/@mozilla/firefox-devtools-mcp
- Socket report: https://socket.dev/npm/package/@mozilla/firefox-devtools-mcp
- Repository: https://github.com/mozilla/firefox-devtools-mcp
- Changelog RSS feed: https://verifymcp.io/servers/mozilla-firefox-devtools-mcp/mozilla-firefox-devtools-mcp.xml
- Changelog JSON feed: https://verifymcp.io/servers/mozilla-firefox-devtools-mcp/mozilla-firefox-devtools-mcp.json
- HTML version of this page: https://verifymcp.io/servers/mozilla-firefox-devtools-mcp/mozilla-firefox-devtools-mcp
