Firefox ControlBLOCK
A fully vibe-coded, experimental, MCP server to control firefox
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
6c5dbaacb2b2OBSERVED · 2026-10-08Connect
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 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]{
"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}"
}
}
}
}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.
| Tool | Risk | Description |
|---|---|---|
browser_close | read | Close the entire browser instance and clean up all sessions and resources. |
browser_launch | read | Launch Firefox browser with multi-session support and comprehensive debugging capabilities. Perfect for testing web applications, multiplayer games, and Phoenix LiveView apps. |
debug_activity_all | read | Get a comprehensive feed combining console logs, errors, network activity, and WebSocket messages. Perfect for holistic debugging. |
debug_buffers_clear | destructive | Clear accumulated debug data buffers to free memory and start fresh monitoring. |
debug_console_logs | read | Retrieve captured browser console messages (log, error, warn, info, debug). Essential for debugging JavaScript applications and monitoring real-time activity. |
debug_helpers_inject | read | Inject custom debugging utilities and helper functions into the page context for enhanced debugging capabilities. |
debug_javascript_errors | read | Get JavaScript errors and exceptions with full stack traces. Critical for identifying and debugging client-side issues. |
debug_monitoring_start | write | Start or restart comprehensive monitoring for console logs, errors, network activity, and WebSocket messages. |
debug_network_activity | read | Monitor HTTP requests, responses, and network timing. Perfect for API debugging and performance analysis. |
debug_performance_metrics | read | Get detailed performance metrics including timing, memory usage, and paint events. Essential for performance optimization. |
debug_websocket_messages | read | Capture WebSocket traffic including Phoenix LiveView messages. Ideal for real-time application debugging and multiplayer game development. |
element_click | read | Click on any element using CSS selector or exact coordinates. Essential for interacting with buttons, links, and UI elements. |
element_drag | destructive | Perform drag and drop operations or move sliders/draggable elements with smooth animations and precise control. |
element_wait | read | Wait for specific elements to appear or become visible. Essential for handling dynamic content and loading states. |
history_back | read | Navigate back in browser history, like clicking the back button. |
history_forward | read | Navigate forward in browser history, like clicking the forward button. |
html_extract | read | Extract HTML content from the page or specific elements. Perfect for content analysis and data scraping. |
input_type | read | Type text into input fields, text areas, or any editable element. Perfect for form filling and text input. |
javascript_execute | write | Execute custom JavaScript code in the browser context. Powerful for advanced DOM manipulation, data extraction, and custom interactions. |
keyboard_press | write | Send keyboard events with support for modifier keys and repetition. Ideal for arrow keys, shortcuts, and special key combinations. |
page_navigate | read | Navigate to a specific URL in the browser. Works with any web page or web application. |
page_reload | read | Reload the current page, refreshing all content and JavaScript state. |
page_screenshot | read | Capture screenshot of the current page or specific elements. Essential for visual verification and documentation. |
session_close | read | Close a specific browser session and clean up its resources. |
session_create | write | Create a new browser session (tab) with complete isolation - separate cookies, storage, and debugging. Essential for multi-user testing scenarios. |
session_list | read | List all active browser sessions with their URLs and status. Useful for managing multiple test scenarios. |
session_set_active | write | Set which browser session should be the default target for subsequent operations. |
text_extract | read | Extract visible text content from the page or specific elements. Ideal for reading displayed information and verification. |
url_get_current | read | Get the current URL of the active page or specified session. |
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.
| Layer | What it checks | Result |
|---|---|---|
| L0 | Provenance & inventory | WARN |
| L1 | Static analysis of the code | FAIL |
| L2 | Instruction surface (what it tells the agent) | PASS |
| L3 | Class-specific surface | WARN |
| L4 | Behavioural (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)
atob( ... eval(
atob( ... }eval(
var deprecatedfn = new Function('fn', 'log', 'deprecate', 'message', 'site','return function (' + args + ') {' +return await this._frame.$$eval(this._selector, pageFunction, arg);
return await this._frame.$$eval(this._selector, (ee) => ee.map((e) => e.innerText));
return await this._frame.$$eval(this._selector, (ee) => ee.map((e) => e.textContent || ""));
curl -o ./googlechromebeta.dmg -k https://dl.google.com/chrome/mac/universal/beta/googlechromebeta.dmg
curl -o ./googlechrome.dmg -k https://dl.google.com/chrome/mac/universal/stable/GGRO/googlechrome.dmg
rejectUnauthorized: false
request ~ requests
node_modules/.bin/playwright
node_modules/.bin/playwright-core
export type MixedContentResourceType = "AttributionSrc"|"Audio"|"Beacon"|"CSPReport"|"Download"|"EventSource"|"Favicon"|"Font"|"Form"|"Frame"|"Image"|"Import"|"JSON"|"Manifest"|"Ping"|"PluginData"|"Pl
"chars": "€پ‚ƒ„...†‡ˆ‰ٹ‹Œچژڈگ‘’“”•–—کTMڑ›œں ،¢£¤¥¦§ ̈©ھ«¬® ̄°±23 ́μ¶· ̧1؛»1⁄41⁄23⁄4؟ہءآأؤإئابةتثجحخدذرزسشصض×طظعغـفقكàلâمنهوçèéêëىيîïًٌٍَôُِ÷ّùْûüے"
"chars": "«»...“”�•‘’� กขฃคฅฆงจฉชซฌญฎฏฐฑฒณดตถทธนบปผฝพฟภมยรฤลฦวศษสหฬอฮฯะัาําิีึืฺุู–—฿เแโใไๅๆ็่้๊๋์ํTM๏๐๑๒๓๔๕๖๗๘๙®©����"
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
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
return `ورودی نامعتبر: میبایست ${issue.expected} میبود، ${(0, exports.parsedType)(issue.input)} دریافت شد`;debug_buffers_clear, element_drag
.package-lock.json
const hash = import_crypto.default.createHash("sha1");const sha1 = import_crypto.default.createHash("sha1");const hash = import_crypto.default.createHash("sha1");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(plGates applied: critical_finding, no_behavioural_pass.
6c5dbaacb2b2full audit observations/trust-audit/mcp-server/jediluke__firefox-control.json · Report an issue / request a re-scanAudit history
Every audit this server has had. A grade with a past is a grade somebody is still checking.
| Date | Source | Verdict | Grade | Score | Change |
|---|---|---|---|---|---|
| 2026-10-08 | 6c5dbaacb2b2 | BLOCK | F | 35 | first audit |
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.