{"_id":"@mozilla/firefox-devtools-mcp","_rev":"2-bd39fc8c96b206cc72122052ebe2bf2a","name":"@mozilla/firefox-devtools-mcp","dist-tags":{"latest":"0.9.4"},"versions":{"0.9.3":{"name":"@mozilla/firefox-devtools-mcp","version":"0.9.3","keywords":["mcp","mcp-server","model-context-protocol","firefox","firefox-devtools","browser-automation","webdriver-bidi","selenium","devtools","browser-testing","web-automation","claude","claude-ai","ai-agent","llm"],"author":{"name":"Mozilla"},"license":"MIT OR Apache-2.0","_id":"@mozilla/firefox-devtools-mcp@0.9.3","maintainers":[{"name":"mozilla-npm","email":"npm-owners@mozilla.com"},{"name":"mythmon","email":"mythmon@gmail.com"},{"name":"jkratzer","email":"jkratzer@mozilla.com"},{"name":"factorui.npm","email":"factorui.npm@mozilla.com"},{"name":"project-nimbus-publishing","email":"project-nimbus-publishing@mozilla.com"},{"name":"gijs","email":"gijskruitbosch@gmail.com"},{"name":"brizental","email":"brizental@mozilla.com"},{"name":"aplacitelli","email":"aplacitelli@mozilla.com"},{"name":"mozrhelmer","email":"rhelmer@mozilla.com"},{"name":"knowtheory","email":"ted@knowtheory.net"},{"name":"nbaumgardner","email":"niklasbaumgardner@gmail.com"},{"name":"tigleym","email":"tigleym@gmail.com"},{"name":"eemeli","email":"eemeli@gmail.com"},{"name":"jdescottes-mozilla-npm","email":"jdescottes+npm@mozilla.com"},{"name":"ahanot","email":"ahanot+npm@mozilla.com"},{"name":"mlifshin","email":"mlifshin+npm@mozilla.com"},{"name":"llisi-moz","email":"llisi+npm@mozilla.com"},{"name":"jdarcangelo-mozilla","email":"jdarcangelo+npm@mozilla.com"},{"name":"nchevobbe","email":"nchevobbe+npm@mozilla.com"}],"homepage":"https://github.com/mozilla/firefox-devtools-mcp#readme","bugs":{"url":"https://github.com/mozilla/firefox-devtools-mcp/issues"},"bin":{"firefox-devtools-mcp":"dist/index.js"},"dist":{"shasum":"e70fac23f2e2f0cfd8438a052bf6fe64aa25b374","tarball":"https://registry.npmjs.org/@mozilla/firefox-devtools-mcp/-/firefox-devtools-mcp-0.9.3.tgz","fileCount":31,"integrity":"sha512-U8c72DOuJ3agD84NiZRnQN8kx/1HBcTu+22HLjAPahfpuNR+57ocs+3TZDlzVuDQnc/2rhvzuVtEoj0QrK/Xig==","signatures":[{"sig":"MEQCIE2V+a65ShhB5fR2r222oUzmbzOkuCPJVntoFgBcPGvoAiB+eeR1oPcwv9WoFNLDQQMKYH+7OHKMLee3UPCRdKshSw==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":1320857},"main":"dist/index.js","type":"module","types":"dist/index.d.ts","engines":{"node":">=20.19.0"},"gitHead":"8e08f5cef6a518888867844baa98d616dbb7c7e5","scripts":{"dev":"tsx watch src/index.moz.ts","lint":"eslint src --ext .ts","test":"vitest","build":"tsup","check":"npm run lint:fix && npm run typecheck","clean":"rm -rf dist","setup":"node scripts/setup-mcp-config.js","start":"node dist/index.js","format":"prettier --write \"src/**/*.ts\" \"tests/**/*.ts\"","test:ui":"vitest --ui","lint:fix":"eslint src --ext .ts --fix","test:run":"vitest run","build:all":"npm run build && npm run build:moz","build:moz":"node scripts/generate-moz-package.mjs && tsup --config tsup.config.moz.ts","check:all":"npm run check && npm run test:run && npm run build","inspector":"npx @modelcontextprotocol/inspector node dist/index.js","test:unit":"vitest run --exclude 'tests/integration/**'","typecheck":"tsc --noEmit","test:input":"node scripts/test-input-tools.js","test:tools":"node scripts/test-bidi-devtools.js","test:watch":"vitest watch","test:dialog":"node scripts/test-dialog.js","test:mozlog":"node scripts/test-mozlog.js","format:check":"prettier --check \"src/**/*.ts\" \"tests/**/*.ts\"","test:console":"node scripts/test-console.js","inspector:dev":"NODE_ENV=development npx @modelcontextprotocol/inspector npx tsx src/index.moz.ts","test:coverage":"vitest run --coverage","prepublishOnly":"npm run clean && npm run build","test:lifecycle":"node scripts/test-lifecycle-hooks.js","test:navigation":"node scripts/test-navigation.js","test:privileged":"node scripts/test-privileged-context.js","test:screenshot":"node scripts/test-screenshot.js","test:firefox-temp":"node scripts/test-firefox-temp.js","test:integration:win":"node scripts/run-integration-tests-windows.mjs"},"_npmUser":{"name":"jdescottes-mozilla-npm","email":"jdescottes+npm@mozilla.com"},"repository":{"url":"git+https://github.com/mozilla/firefox-devtools-mcp.git","type":"git"},"_npmVersion":"10.8.1","description":"Model Context Protocol (MCP) server for Firefox DevTools automation","directories":{},"_nodeVersion":"22.3.0","dependencies":{"ws":"8.18.3","yargs":"17.7.2","geckodriver":"6.0.2","selenium-webdriver":"4.36.0","@modelcontextprotocol/sdk":"1.29.0"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"tsx":"4.21.0","tsup":"8.5.0","jsdom":"28.1.0","dotenv":"17.2.1","eslint":"8.57.1","vitest":"3.1.4","prettier":"3.5.3","@types/ws":"8.18.1","@vitest/ui":"3.1.4","typescript":"5.3.3","@types/node":"24.1.0","@types/jsdom":"28.0.0","@types/yargs":"17.0.32","@vitest/coverage-v8":"3.1.4","eslint-config-prettier":"10.1.5","eslint-plugin-prettier":"5.4.0","@types/selenium-webdriver":"4.35.1","@typescript-eslint/parser":"8.58.0","@typescript-eslint/eslint-plugin":"8.58.0"},"_npmOperationalInternal":{"tmp":"tmp/firefox-devtools-mcp_0.9.3_1778155138796_0.6054979448714042","host":"s3://npm-registry-packages-npm-production"}},"0.9.4":{"name":"@mozilla/firefox-devtools-mcp","version":"0.9.4","description":"Model Context Protocol (MCP) server for Firefox DevTools automation","author":{"name":"Mozilla"},"license":"MIT OR Apache-2.0","type":"module","main":"dist/index.js","types":"dist/index.d.ts","bin":{"firefox-devtools-mcp":"dist/index.js"},"scripts":{"dev":"tsx watch src/index.moz.ts","build":"tsup","build:moz":"node scripts/generate-moz-package.mjs && tsup --config tsup.config.moz.ts","build:all":"npm run build && npm run build:moz","start":"node dist/index.js","setup":"node scripts/setup-mcp-config.js","clean":"rm -rf dist","typecheck":"tsc --noEmit","lint":"eslint src --ext .ts","lint:fix":"eslint src --ext .ts --fix","format":"prettier --write \"src/**/*.ts\" \"tests/**/*.ts\"","format:check":"prettier --check \"src/**/*.ts\" \"tests/**/*.ts\"","check":"npm run lint:fix && npm run typecheck","check:all":"npm run check && npm run test:run && npm run build","prepublishOnly":"npm run clean && npm run build","inspector":"npx @modelcontextprotocol/inspector node dist/index.js","inspector:dev":"NODE_ENV=development npx @modelcontextprotocol/inspector npx tsx src/index.moz.ts","test":"vitest","test:run":"vitest run","test:unit":"vitest run --exclude 'tests/integration/**'","test:coverage":"vitest run --coverage","test:watch":"vitest watch","test:ui":"vitest --ui","test:tools":"node scripts/test-bidi-devtools.js","test:console":"node scripts/test-console.js","test:dialog":"node scripts/test-dialog.js","test:firefox-temp":"node scripts/test-firefox-temp.js","test:input":"node scripts/test-input-tools.js","test:lifecycle":"node scripts/test-lifecycle-hooks.js","test:mozlog":"node scripts/test-mozlog.js","test:navigation":"node scripts/test-navigation.js","test:privileged":"node scripts/test-privileged-context.js","test:screenshot":"node scripts/test-screenshot.js","test:integration:win":"node scripts/run-integration-tests-windows.mjs"},"keywords":["mcp","mcp-server","model-context-protocol","firefox","firefox-devtools","browser-automation","webdriver-bidi","selenium","devtools","browser-testing","web-automation","claude","claude-ai","ai-agent","llm"],"engines":{"node":">=20.19.0"},"dependencies":{"@modelcontextprotocol/sdk":"1.29.0","geckodriver":"6.0.2","selenium-webdriver":"4.36.0","ws":"8.18.3","yargs":"17.7.2"},"devDependencies":{"@types/jsdom":"28.0.0","@types/node":"24.1.0","@types/selenium-webdriver":"4.35.1","@types/ws":"8.18.1","@types/yargs":"17.0.32","@typescript-eslint/eslint-plugin":"8.58.0","@typescript-eslint/parser":"8.58.0","@vitest/coverage-v8":"3.1.4","@vitest/ui":"3.1.4","dotenv":"17.2.1","eslint":"8.57.1","eslint-config-prettier":"10.1.5","eslint-plugin-prettier":"5.4.0","jsdom":"28.1.0","prettier":"3.5.3","tsup":"8.5.0","tsx":"4.21.0","typescript":"5.3.3","vitest":"3.1.4"},"repository":{"type":"git","url":"git+https://github.com/mozilla/firefox-devtools-mcp.git"},"bugs":{"url":"https://github.com/mozilla/firefox-devtools-mcp/issues"},"homepage":"https://github.com/mozilla/firefox-devtools-mcp#readme","publishConfig":{"access":"public"},"_id":"@mozilla/firefox-devtools-mcp@0.9.4","gitHead":"55368a5c35d8b8ab88010505433db11b7f3612de","_nodeVersion":"22.3.0","_npmVersion":"10.8.1","dist":{"integrity":"sha512-wGP/+S9as51e07ZeJh3vP3Hhpe15AL72kQ44EGoA002cJeZHDBznauX5mhTlEAZjnE3JMwxTO1stQNZc60eD8A==","shasum":"1ff9b5ddc506fae2af8fc3ed3c104e9ef24b5a41","tarball":"https://registry.npmjs.org/@mozilla/firefox-devtools-mcp/-/firefox-devtools-mcp-0.9.4.tgz","fileCount":31,"unpackedSize":1324745,"signatures":[{"keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U","sig":"MEUCIQCucCCHruIhlZIZaZtU7ALe5ttskg9xjRhxjpPaHHhTSQIgGhnxY344yHjGmPZVq21l/xpBs8tw0R3DNEvaTXRPVkU="}]},"_npmUser":{"name":"jdescottes-mozilla-npm","email":"jdescottes+npm@mozilla.com"},"directories":{},"maintainers":[{"name":"mozilla-npm","email":"npm-owners@mozilla.com"},{"name":"mythmon","email":"mythmon@gmail.com"},{"name":"jkratzer","email":"jkratzer@mozilla.com"},{"name":"factorui.npm","email":"factorui.npm@mozilla.com"},{"name":"project-nimbus-publishing","email":"project-nimbus-publishing@mozilla.com"},{"name":"gijs","email":"gijskruitbosch@gmail.com"},{"name":"brizental","email":"brizental@mozilla.com"},{"name":"aplacitelli","email":"aplacitelli@mozilla.com"},{"name":"mozrhelmer","email":"rhelmer@mozilla.com"},{"name":"knowtheory","email":"ted@knowtheory.net"},{"name":"nbaumgardner","email":"niklasbaumgardner@gmail.com"},{"name":"tigleym","email":"tigleym@gmail.com"},{"name":"eemeli","email":"eemeli@gmail.com"},{"name":"jdescottes-mozilla-npm","email":"jdescottes+npm@mozilla.com"},{"name":"ahanot","email":"ahanot+npm@mozilla.com"},{"name":"mlifshin","email":"mlifshin+npm@mozilla.com"},{"name":"llisi-moz","email":"llisi+npm@mozilla.com"},{"name":"jdarcangelo-mozilla","email":"jdarcangelo+npm@mozilla.com"},{"name":"nchevobbe","email":"nchevobbe+npm@mozilla.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages-npm-production","tmp":"tmp/firefox-devtools-mcp_0.9.4_1780589259639_0.12572690268094444"},"_hasShrinkwrap":false}},"time":{"created":"2026-05-07T11:58:58.684Z","modified":"2026-06-04T16:07:40.173Z","0.9.3":"2026-05-07T11:58:58.967Z","0.9.4":"2026-06-04T16:07:39.841Z"},"bugs":{"url":"https://github.com/mozilla/firefox-devtools-mcp/issues"},"author":{"name":"Mozilla"},"license":"MIT OR Apache-2.0","homepage":"https://github.com/mozilla/firefox-devtools-mcp#readme","keywords":["mcp","mcp-server","model-context-protocol","firefox","firefox-devtools","browser-automation","webdriver-bidi","selenium","devtools","browser-testing","web-automation","claude","claude-ai","ai-agent","llm"],"repository":{"type":"git","url":"git+https://github.com/mozilla/firefox-devtools-mcp.git"},"description":"Model Context Protocol (MCP) server for Firefox DevTools automation","maintainers":[{"name":"mozilla-npm","email":"npm-owners@mozilla.com"},{"name":"mythmon","email":"mythmon@gmail.com"},{"name":"jkratzer","email":"jkratzer@mozilla.com"},{"name":"factorui.npm","email":"factorui.npm@mozilla.com"},{"name":"project-nimbus-publishing","email":"project-nimbus-publishing@mozilla.com"},{"name":"gijs","email":"gijskruitbosch@gmail.com"},{"name":"brizental","email":"brizental@mozilla.com"},{"name":"aplacitelli","email":"aplacitelli@mozilla.com"},{"name":"mozrhelmer","email":"rhelmer@mozilla.com"},{"name":"knowtheory","email":"ted@knowtheory.net"},{"name":"nbaumgardner","email":"niklasbaumgardner@gmail.com"},{"name":"tigleym","email":"tigleym@gmail.com"},{"name":"eemeli","email":"eemeli@gmail.com"},{"name":"jdescottes-mozilla-npm","email":"jdescottes+npm@mozilla.com"},{"name":"ahanot","email":"ahanot+npm@mozilla.com"},{"name":"mlifshin","email":"mlifshin+npm@mozilla.com"},{"name":"llisi-moz","email":"llisi+npm@mozilla.com"},{"name":"jdarcangelo-mozilla","email":"jdarcangelo+npm@mozilla.com"},{"name":"nchevobbe","email":"nchevobbe+npm@mozilla.com"}],"readme":"# Firefox DevTools MCP\n\n[![npm version](https://badge.fury.io/js/firefox-devtools-mcp.svg)](https://www.npmjs.com/package/firefox-devtools-mcp)\n[![CI](https://github.com/mozilla/firefox-devtools-mcp/workflows/CI/badge.svg)](https://github.com/mozilla/firefox-devtools-mcp/actions/workflows/ci.yml)\n[![codecov](https://codecov.io/gh/mozilla/firefox-devtools-mcp/branch/main/graph/badge.svg)](https://codecov.io/gh/mozilla/firefox-devtools-mcp)\n[![License: MIT](https://img.shields.io/badge/License-MIT-yellow.svg)](LICENSE-MIT) [![License: Apache 2.0](https://img.shields.io/badge/License-Apache%202.0-blue.svg)](LICENSE-APACHE)\n\n<a href=\"https://glama.ai/mcp/servers/@mozilla/firefox-devtools-mcp\"><img src=\"https://glama.ai/mcp/servers/@mozilla/firefox-devtools-mcp/badge\" height=\"223\" alt=\"Glama\"></a>\n\nModel Context Protocol server for automating Firefox via WebDriver BiDi (through Selenium WebDriver). Works with Claude Code, Claude Desktop, Cursor, Cline and other MCP clients.\n\nRepository: https://github.com/mozilla/firefox-devtools-mcp\n\n> **Note**: This MCP server requires a local Firefox browser installation and cannot run on cloud hosting services like glama.ai. Use `npx firefox-devtools-mcp@latest` to run locally, or use Docker with the provided Dockerfile.\n\n## Security\n\nBrowser MCP servers carry inherent risks. A few key practices:\n\n- **Use a dedicated Firefox profile.** Never run the server against your regular profile — the agent has access to whatever the browser can reach, including cookies and saved sessions.\n- **Be cautious about which sites you visit.** Pages can return content designed to manipulate the agent (prompt injection). Stick to sites you control or trust.\n- **Avoid enabling extra flags unless needed.** `--enable-script` and `--enable-privileged-context` significantly expand what the agent can do.\n\nSee [SECURITY.md](SECURITY.md) for a full breakdown of risks and how to report vulnerabilities.\n\n## Requirements\n\n- Node.js ≥ 20.19.0\n- Firefox 100+ installed (auto‑detected, or pass `--firefox-path`)\n\n## Install and use with Claude Code (npx)\n\nRecommended: use npx so you always run the latest published version from npm.\n\nOption A — Claude Code CLI\n\n```bash\nclaude mcp add firefox-devtools npx firefox-devtools-mcp@latest\n```\n\nPass options either as args or env vars. Examples:\n\n```bash\n# Headless + viewport via args\nclaude mcp add firefox-devtools npx firefox-devtools-mcp@latest -- --headless --viewport 1280x720\n\n# Or via environment variables\nclaude mcp add firefox-devtools npx firefox-devtools-mcp@latest \\\n  --env START_URL=https://example.com \\\n  --env FIREFOX_HEADLESS=true\n```\n\nOption B — Edit Claude Code settings JSON\n\nAdd to your Claude Code config file:\n\n- macOS: `~/Library/Application Support/Claude/Code/mcp_settings.json`\n- Linux: `~/.config/claude/code/mcp_settings.json`\n- Windows: `%APPDATA%\\Claude\\Code\\mcp_settings.json`\n\n```json\n{\n  \"mcpServers\": {\n    \"firefox-devtools\": {\n      \"command\": \"npx\",\n      \"args\": [\"-y\", \"firefox-devtools-mcp@latest\", \"--headless\", \"--viewport\", \"1280x720\"],\n      \"env\": {\n        \"START_URL\": \"about:home\"\n      }\n    }\n  }\n}\n```\n\nOption C — Helper script (local dev build)\n\n```bash\nnpm run setup\n# Choose Claude Code; the script saves JSON to the right path\n```\n\n## Try it with MCP Inspector\n\n```bash\nnpx @modelcontextprotocol/inspector npx firefox-devtools-mcp@latest --start-url https://example.com --headless\n```\n\nThen call tools like:\n\n- `list_pages`, `select_page`, `navigate_page`\n- `take_snapshot` then `click_by_uid` / `fill_by_uid`\n- `list_network_requests` (always‑on capture), `get_network_request`\n- `screenshot_page`, `list_console_messages`\n\n## CLI options\n\nYou can pass flags or environment variables (names on the right):\n\n- `--firefox-path` — absolute path to Firefox binary\n- `--headless` — run without UI (`FIREFOX_HEADLESS=true`)\n- `--viewport 1280x720` — initial window size\n- `--profile-path` — use a specific Firefox profile\n- `--firefox-arg` — extra Firefox arguments (repeatable)\n- `--start-url` — open this URL on start (`START_URL`)\n- `--accept-insecure-certs` — ignore TLS errors (`ACCEPT_INSECURE_CERTS=true`)\n- `--connect-existing` — attach to an already-running Firefox instead of launching a new one (`CONNECT_EXISTING=true`)\n- `--marionette-port` — Marionette port for connect-existing mode, default 2828 (`MARIONETTE_PORT`)\n- `--pref name=value` — set Firefox preference at startup via `moz:firefoxOptions` (repeatable)\n- `--enable-script` — enable the `evaluate_script` tool, which executes arbitrary JavaScript in the page context (`ENABLE_SCRIPT=true`)\n- `--enable-privileged-context` — enable privileged context tools: list/select privileged contexts, evaluate privileged scripts, get/set Firefox prefs, and list extensions. Requires `MOZ_REMOTE_ALLOW_SYSTEM_ACCESS=1` (`ENABLE_PRIVILEGED_CONTEXT=true`)\n- `--android-device` — enable Firefox for Android mode; value is the ADB device serial (e.g. `emulator-5554`). Run `adb devices` to list connected devices. Omit the value or use `auto` to select the single connected device automatically.\n- `--android-package` — Android app package name, default `org.mozilla.firefox`. Other packages: `org.mozilla.firefox_beta` for Firefox Beta, `org.mozilla.fenix` for Firefox Nightly, `org.mozilla.fenix.debug` for Firefox Nightly Debug, `org.mozilla.geckoview_example` for geckoview (`ANDROID_PACKAGE`)\n\n> **Note on `--pref`:** When Firefox runs in automation, it applies [RecommendedPreferences](https://searchfox.org/firefox-main/source/remote/shared/RecommendedPreferences.sys.mjs) that modify browser behavior for testing. The `--pref` option allows overriding these defaults when needed.\n\n### Firefox for Android\n\nUse `--android-device` to automate Firefox running on an Android device. Requires `adb` on your PATH and geckodriver, which is managed automatically.\n\n```bash\n# List connected devices\nadb devices\n\n# Launch Firefox for Android on the single connected device\nnpx firefox-devtools-mcp --android-device auto\n\n# Target a specific device\nnpx firefox-devtools-mcp --android-device <serial>\n\n# Use Firefox Nightly instead\nnpx firefox-devtools-mcp --android-device <serial> --android-package org.mozilla.fenix\n```\n\nPort forwarding between the host and device is handled automatically by geckodriver.\n\n### Connect to existing Firefox\n\nUse `--connect-existing` to automate your real browsing session — with cookies, logins, and open tabs intact:\n\n```bash\n# Start Firefox with Marionette enabled\nfirefox --marionette\n\n# Run the MCP server\nnpx firefox-devtools-mcp --connect-existing --marionette-port 2828\n```\n\nOr set `marionette.enabled` to `true` in `about:config` (or `user.js`) to enable Marionette on every launch.\n\nBiDi-dependent features (console events, network events) are not available in connect-existing mode; all other features work normally.\n\n> **Warning:** Do not leave Marionette enabled during normal browsing. It sets\n> `navigator.webdriver = true` and changes other browser fingerprint signals,\n> which can trigger bot detection on sites protected by Cloudflare, Akamai, etc.\n> Only enable Marionette when you need MCP automation, then restart Firefox\n> normally afterward.\n\n## Tool overview\n\n- Pages: list/new/navigate/select/close\n- Snapshot/UID: take/resolve/clear\n- Input: click/hover/fill/drag/upload/form fill\n- Network: list/get (ID‑first, filters, always‑on capture)\n- Console: list/clear\n- Screenshot: page/by uid (with optional `saveTo` for CLI environments)\n- Script: evaluate_script\n- Privileged Context: list/select privileged (\"chrome\") contexts, evaluate_privileged_script (requires `MOZ_REMOTE_ALLOW_SYSTEM_ACCESS=1`)\n- WebExtension: install_extension, uninstall_extension, list_extensions (list requires `MOZ_REMOTE_ALLOW_SYSTEM_ACCESS=1`)\n- Firefox Management: get_firefox_info, get_firefox_output, restart_firefox, set_firefox_prefs, get_firefox_prefs\n- Utilities: accept/dismiss dialog, history back/forward, set viewport\n\n### Screenshot optimization for Claude Code\n\nWhen using screenshots in Claude Code CLI, the base64 image data can consume significant context.\nUse the `saveTo` parameter to save screenshots to disk instead:\n\n```\nscreenshot_page({ saveTo: \"/tmp/page.png\" })\nscreenshot_by_uid({ uid: \"abc123\", saveTo: \"/tmp/element.png\" })\n```\n\nThe file can then be viewed with Claude Code's `Read` tool without impacting context size.\n\n## Local development\n\n```bash\nnpm install\nnpm run build\n\n# Run with Inspector against local build\nnpx @modelcontextprotocol/inspector node dist/index.js --headless --viewport 1280x720\n\n# Or run in dev with hot reload\nnpm run inspector:dev\n```\n\nSee [CONTRIBUTING.md](CONTRIBUTING.md) for more details on local development, testing, and CI.\n\n## Troubleshooting\n\n- Firefox not found: pass `--firefox-path \"/Applications/Firefox.app/Contents/MacOS/firefox\"` (macOS) or the correct path on your OS.\n- First run is slow: Selenium sets up the BiDi session; subsequent runs are faster.\n- Stale UIDs after navigation: take a fresh snapshot (`take_snapshot`) before using UID tools.\n- Windows 10: Error during discovery for MCP server 'firefox-devtools': MCP error -32000: Connection closed\n  - **Solution 1** Wrap with `cmd /c` ([details](https://github.com/modelcontextprotocol/servers/issues/1082#issuecomment-2791786310)):\n\n    ```json\n    \"mcpServers\": {\n      \"firefox-devtools\": {\n        \"command\": \"cmd\",\n        \"args\": [\"/c\", \"npx\", \"-y\", \"firefox-devtools-mcp@latest\"]\n      }\n    }\n    ```\n\n  - **Solution 2** Use the absolute path to `npx` (adjust extension — `.cmd`, `.bat`, `.exe`, or `.ps1` — to match your setup):\n\n    ```json\n    \"mcpServers\": {\n      \"firefox-devtools\": {\n        \"command\": \"C:\\\\nvm4w\\\\nodejs\\\\npx.ps1\",\n        \"args\": [\"-y\", \"firefox-devtools-mcp@latest\"]\n      }\n    }\n    ```\n\n## Versioning\n\n- Pre‑1.0 API: versions start at `0.x`. Use `@latest` with npx for the newest release.\n\n## Contributing\n\nSee [CONTRIBUTING.md](CONTRIBUTING.md) for how to file issues, run tests, and work on the project locally.\n\n## Author\n\nMaintained by [Mozilla](https://www.mozilla.org).\n\n## License\n\nLicensed under either of [MIT](LICENSE-MIT) or [Apache 2.0](LICENSE-APACHE) at your option.\n","readmeFilename":"README.md"}