Atlas / MCP servers / jediluke / Firefox Control

Firefox ControlBLOCK

mcp/jediluke/firefox-control

A fully vibe-coded, experimental, MCP server to control firefox

Verdict
BLOCK
Grade
F
Trust score
35 /100
Exposed tools
29 22r · 5w · 2d
Transport
sse · stdio
License
MIT
Stars
30
01

Overview

From the repository's own README, as read at the audited commit. Badges and raw HTML are left out.

Advanced Firefox browser automation with comprehensive debugging capabilities

A powerful Model Context Protocol (MCP) server that provides sophisticated Firefox browser automation through 28 specialized tools. Designed for AI assistants and automation workflows requiring multi-session management, real-time debugging, and comprehensive web interaction capabilities.

🌟 Key Features

Multi-Session Architecture

  • Isolated Browser Sessions: Each session runs in a completely separate context with independent cookies, storage, and debugging
  • Perfect for Multiplayer Testing: Test multiplayer games and multi-user applications seamlessly
  • Concurrent Operations: Manage multiple browser sessions simultaneously from a single interface

Comprehensive Debugging Suite

  • Real-time Console Monitoring: Capture all console output (log, error, warn, info, debug)
  • JavaScript Error Tracking: Monitor unhandled errors with full stack traces
  • Network Activity Monitoring: Track HTTP requests, responses, and timing data
  • WebSocket Traffic Capture: Perfect for Phoenix LiveView and real-time application debugging
  • Performance Metrics: Monitor DOM timing, paint events, and memory usage

Advanced Interaction Capabilities

  • Precise Element Interaction: Click, type, and interact with any web element
  • Keyboard Event Simulation: Send complex key combinations and shortcuts
  • Drag & Drop Operations: Smooth drag operations with customizable timing and steps
  • JavaScript Execution: Run custom JavaScript in browser contexts

🚀 Quick Start

Installation

npm install firefox-mcp-server
npx playwright install firefox

Basic Usage

Add to your MCP client configuration:

{
"mcpServers": {
"firefox": {
"command": "npx",
"args": ["firefox-mcp-server"],
"env": {}
}
}
}

Example: Multi-User Testing

// Launch browser and create isolated
Read from source at commit 6c5dbaacb2b2OBSERVED · 2026-10-08
Advertisement
02

Connect

Built from this server's own package name, version and transport as found in its source — not copied from anyone's documentation, so it cannot drift against a page we do not control. Replace the environment placeholders with a token scoped to the least it needs.

claude-code
claude mcp add firefox-mcp-server --env DOTENV_KEY=${DOTENV_KEY} --env EXPERIMENTAL_ANTHROPIC_API_KEY=${EXPERIMENTAL_ANTHROPIC_API_KEY} --env EXPERIMENTAL_OPENAI_API_KEY=${EXPERIMENTAL_OPENAI_API_KEY} --env LOG_TOKENS=${LOG_TOKENS} -- npx -y [email protected]
claude-desktop
{
  "mcpServers": {
    "firefox-mcp-server": {
      "command": "npx",
      "args": [
        "-y",
        "[email protected]"
      ],
      "env": {
        "DOTENV_KEY": "${DOTENV_KEY}",
        "EXPERIMENTAL_ANTHROPIC_API_KEY": "${EXPERIMENTAL_ANTHROPIC_API_KEY}",
        "EXPERIMENTAL_OPENAI_API_KEY": "${EXPERIMENTAL_OPENAI_API_KEY}",
        "LOG_TOKENS": "${LOG_TOKENS}"
      }
    }
  }
}
03

Exposed tools (29)

22 read · 5 write · 2 destructive. Blast radius: 2 tools can delete or overwrite — an agent that can be talked into calling a tool can be talked into calling this one.

ToolRiskDescription
browser_closereadClose the entire browser instance and clean up all sessions and resources.
browser_launchreadLaunch Firefox browser with multi-session support and comprehensive debugging capabilities. Perfect for testing web applications, multiplayer games, and Phoenix LiveView apps.
debug_activity_allreadGet a comprehensive feed combining console logs, errors, network activity, and WebSocket messages. Perfect for holistic debugging.
debug_buffers_cleardestructiveClear accumulated debug data buffers to free memory and start fresh monitoring.
debug_console_logsreadRetrieve captured browser console messages (log, error, warn, info, debug). Essential for debugging JavaScript applications and monitoring real-time activity.
debug_helpers_injectreadInject custom debugging utilities and helper functions into the page context for enhanced debugging capabilities.
debug_javascript_errorsreadGet JavaScript errors and exceptions with full stack traces. Critical for identifying and debugging client-side issues.
debug_monitoring_startwriteStart or restart comprehensive monitoring for console logs, errors, network activity, and WebSocket messages.
debug_network_activityreadMonitor HTTP requests, responses, and network timing. Perfect for API debugging and performance analysis.
debug_performance_metricsreadGet detailed performance metrics including timing, memory usage, and paint events. Essential for performance optimization.
debug_websocket_messagesreadCapture WebSocket traffic including Phoenix LiveView messages. Ideal for real-time application debugging and multiplayer game development.
element_clickreadClick on any element using CSS selector or exact coordinates. Essential for interacting with buttons, links, and UI elements.
element_dragdestructivePerform drag and drop operations or move sliders/draggable elements with smooth animations and precise control.
element_waitreadWait for specific elements to appear or become visible. Essential for handling dynamic content and loading states.
history_backreadNavigate back in browser history, like clicking the back button.
history_forwardreadNavigate forward in browser history, like clicking the forward button.
html_extractreadExtract HTML content from the page or specific elements. Perfect for content analysis and data scraping.
input_typereadType text into input fields, text areas, or any editable element. Perfect for form filling and text input.
javascript_executewriteExecute custom JavaScript code in the browser context. Powerful for advanced DOM manipulation, data extraction, and custom interactions.
keyboard_presswriteSend keyboard events with support for modifier keys and repetition. Ideal for arrow keys, shortcuts, and special key combinations.
page_navigatereadNavigate to a specific URL in the browser. Works with any web page or web application.
page_reloadreadReload the current page, refreshing all content and JavaScript state.
page_screenshotreadCapture screenshot of the current page or specific elements. Essential for visual verification and documentation.
session_closereadClose a specific browser session and clean up its resources.
session_createwriteCreate a new browser session (tab) with complete isolation - separate cookies, storage, and debugging. Essential for multi-user testing scenarios.
session_listreadList all active browser sessions with their URLs and status. Useful for managing multiple test scenarios.
session_set_activewriteSet which browser session should be the default target for subsequent operations.
text_extractreadExtract visible text content from the page or specific elements. Ideal for reading displayed information and verification.
url_get_currentreadGet the current URL of the active page or specified session.
04

Trust audit

BLOCKgrade F · trust 35/100 Do not install this without reading the findings. The audit found something that could harm you or your machine.

LayerWhat it checksResult
L0Provenance & inventoryWARN
L1Static analysis of the codeFAIL
L2Instruction surface (what it tells the agent)PASS
L3Class-specific surfaceWARN
L4Behavioural (sandbox)SKIPPED

What the source does

Filesystem
declared (16 observation(s))
Network
declared (14 observation(s))
Shell
declared (10 observation(s))
Dependencies
not all pinned
Secrets in source
none-found

Findings (25)

CRITICALObfuscation / stealth · obf.decode_then_exec · CWE-506, CWE-94
node_modules/playwright-core/lib/generated/injectedScriptSource.js:24
atob( ...  eval(
Why it matters. decodes a payload and executes it
CRITICALObfuscation / stealth · obf.decode_then_exec · CWE-506, CWE-94
node_modules/playwright-core/lib/vite/traceViewer/assets/defaultSettingsView-DkkRvn5X.js:120
atob( ... }eval(
Why it matters. decodes a payload and executes it
HIGHCode injection · code.eval_exec · CWE-78, CWE-94, CWE-95
node_modules/depd/index.js:425
var deprecatedfn = new Function('fn', 'log', 'deprecate', 'message', 'site',
Why it matters. evaluates text as code
Fix. remove; use a parser or a dispatch table
HIGHCode injection · code.eval_exec · CWE-78, CWE-94, CWE-95
node_modules/depd/index.js:427
'return function (' + args + ') {' +
Why it matters. evaluates text as code
Fix. remove; use a parser or a dispatch table
HIGHCode injection · code.eval_exec · CWE-78, CWE-94, CWE-95
node_modules/playwright-core/lib/client/locator.js:105
return await this._frame.$$eval(this._selector, pageFunction, arg);
Why it matters. evaluates text as code
Fix. remove; use a parser or a dispatch table
HIGHCode injection · code.eval_exec · CWE-78, CWE-94, CWE-95
node_modules/playwright-core/lib/client/locator.js:277
return await this._frame.$$eval(this._selector, (ee) => ee.map((e) => e.innerText));
Why it matters. evaluates text as code
Fix. remove; use a parser or a dispatch table
HIGHCode injection · code.eval_exec · CWE-78, CWE-94, CWE-95
node_modules/playwright-core/lib/client/locator.js:280
return await this._frame.$$eval(this._selector, (ee) => ee.map((e) => e.textContent || ""));
Why it matters. evaluates text as code
Fix. remove; use a parser or a dispatch table
HIGHNetwork egress · net.tls_off · CWE-200, CWE-319
node_modules/playwright-core/bin/reinstall_chrome_beta_mac.sh:7
curl -o ./googlechromebeta.dmg -k https://dl.google.com/chrome/mac/universal/beta/googlechromebeta.dmg
Why it matters. certificate verification is disabled
Fix. leave verification on
HIGHNetwork egress · net.tls_off · CWE-200, CWE-319
node_modules/playwright-core/bin/reinstall_chrome_stable_mac.sh:7
curl -o ./googlechrome.dmg -k https://dl.google.com/chrome/mac/universal/stable/GGRO/googlechrome.dmg
Why it matters. certificate verification is disabled
Fix. leave verification on
HIGHNetwork egress · net.tls_off · CWE-200, CWE-319
node_modules/playwright-core/lib/server/socksClientCertificatesInterceptor.js:75
rejectUnauthorized: false
Why it matters. certificate verification is disabled
Fix. leave verification on
HIGHSupply chain · supply.typosquat · CWE-829, CWE-1357
node_modules/iconv-lite/package.json
request ~ requests
Why it matters. dependency name one edit from a popular package
Fix. verify the package; likely typosquat
MEDIUMInventory / provenance · inv.symlink · CWE-1104
node_modules/.bin/playwright
node_modules/.bin/playwright
Why it matters. link not followed
MEDIUMInventory / provenance · inv.symlink · CWE-1104
node_modules/.bin/playwright-core
node_modules/.bin/playwright-core
Why it matters. link not followed
MEDIUMNetwork egress · net.beacon_words · CWE-200, CWE-319
node_modules/playwright-core/types/protocol.d.ts:744
export type MixedContentResourceType = "AttributionSrc"|"Audio"|"Beacon"|"CSPReport"|"Download"|"EventSource"|"Favicon"|"Font"|"Form"|"Frame"|"Image"|"Import"|"JSON"|"Manifest"|"Ping"|"PluginData"|"Pl
MEDIUMObfuscation / stealth · obf.zero_width · CWE-506, CWE-94
node_modules/iconv-lite/encodings/sbcs-data-generated.js:100
"chars": "€پ‚ƒ„...†‡ˆ‰ٹ‹Œچژڈگ‘’“”•–—کTMڑ›œں ،¢£¤¥¦§ ̈©ھ«¬® ̄°±23 ́μ¶· ̧1؛»1⁄41⁄23⁄4؟ہءآأؤإئابةتثجحخدذرزسشصض×طظعغـفقكàلâمنهوçèéêëىيîïًٌٍَôُِ÷ّùْûüے"
MEDIUMObfuscation / stealth · obf.zero_width · CWE-506, CWE-94
node_modules/iconv-lite/encodings/sbcs-data-generated.js:373
"chars": "«»...“”�•‘’� กขฃคฅฆงจฉชซฌญฎฏฐฑฒณดตถทธนบปผฝพฟภมยรฤลฦวศษสหฬอฮฯะัาําิีึืฺุู–—฿เแโใไๅๆ็่้๊๋์ํTM๏๐๑๒๓๔๕๖๗๘๙®©����"
MEDIUMObfuscation / stealth · obf.zero_width · CWE-506, CWE-94
node_modules/playwright-core/lib/vite/recorder/assets/codeMirrorModule-DVQi6prl.js:24
outline: none; border-width: 0; outline: none; overflow: hidden; opacity: .05; filter: alpha(opacity=5);`;var v;_&&(v=i.ownerDocument.defaultView.scrollY),r.input.focus(),_&&i.ownerDocument.defaultVie
MEDIUMObfuscation / stealth · obf.zero_width · CWE-506, CWE-94
node_modules/playwright-core/lib/vite/traceViewer/assets/codeMirrorModule-DwAiTpyC.js:24
outline: none; border-width: 0; outline: none; overflow: hidden; opacity: .05; filter: alpha(opacity=5);`;var v;_&&(v=i.ownerDocument.defaultView.scrollY),r.input.focus(),_&&i.ownerDocument.defaultVie
MEDIUMObfuscation / stealth · obf.zero_width · CWE-506, CWE-94
node_modules/zod/dist/cjs/v4/locales/fa.js:92
return `ورودی نامعتبر: میبایست ${issue.expected} میبود، ${(0, exports.parsedType)(issue.input)} دریافت شد`;
MEDIUMFilesystem / path · mcp.destructive_tools · CWE-22, CWE-59
debug_buffers_clear, element_drag
Why it matters. 2 tool(s) can delete or overwrite
Fix. prefer a read-only mode or scoped tokens; the page states the blast radius
LOWInventory / provenance · inv.hidden_file · CWE-1104
node_modules/.package-lock.json
.package-lock.json
Why it matters. hidden member outside the usual dotfiles
Fix. review its purpose
LOWInsecure crypto · crypto.weak_hash · CWE-327, CWE-338
node_modules/playwright-core/lib/server/utils/crypto.js:42
const hash = import_crypto.default.createHash("sha1");
LOWInsecure crypto · crypto.weak_hash · CWE-327, CWE-338
node_modules/playwright-core/lib/server/utils/nodePlatform.js:76
const sha1 = import_crypto.default.createHash("sha1");
LOWInsecure crypto · crypto.weak_hash · CWE-327, CWE-338
node_modules/playwright/lib/common/fixtures.js:170
const hash = import_crypto.default.createHash("sha1");
LOWInsecure crypto · crypto.weak_hash · CWE-327, CWE-338
node_modules/playwright/lib/transform/transform.js:205
const hash = import_crypto.default.createHash("sha1").update(isModule2 ? "esm" : "no_esm").update(content).update(filePath).update(version).update(pluginsPrologue.map((p) => p[0]).join(",")).update(pl

Gates applied: critical_finding, no_behavioural_pass.

Audited 2026-10-08 · audit v0.4.1 · source sha 6c5dbaacb2b2full audit observations/trust-audit/mcp-server/jediluke__firefox-control.json · Report an issue / request a re-scan
05

Audit history

Every audit this server has had. A grade with a past is a grade somebody is still checking.

DateSourceVerdictGradeScoreChange
2026-10-086c5dbaacb2b2BLOCKF35first audit
06

Questions

What is the Firefox Control MCP server?

A fully vibe-coded, experimental, MCP server to control firefox

What tools does Firefox Control expose?

29 in total: 22 read-only, 5 that write, and 2 that can delete or overwrite (debug_buffers_clear, element_drag). Every one is listed on this page with its risk.

Is Firefox Control safe to connect to an agent?

No — not without reading the findings first. The audit graded it F (35/100) and found 11 critical or high issues in the source. Each one is listed on this page with the file and line it is on. Separately from the audit: 2 of its tools can destroy data, so scope the token you give it to what you actually need.

What credentials does Firefox Control need?

It reads DOTENV_KEY, EXPERIMENTAL_ANTHROPIC_API_KEY, EXPERIMENTAL_OPENAI_API_KEY and LOG_TOKENS from the environment. Give it a token scoped to the least it needs — an agent that can be talked into calling a tool can be talked into calling it with your credentials.

How does Firefox Control run?

It speaks sse and stdio, so it runs as a local process your client starts. It is published on npm as firefox-mcp-server at 1.0.0.

How current is this page?

The grade is for one exact copy of the source (6c5dbaacb2b2), read on 2026-10-08. The repository is watched and re-audited when it changes.

Advertisement