Browser automation for Claude Code that runs on Firefox — for systems where Chrome is unavailable, unwelcome, or policy-prohibited.
The only Firefox-native MCP server for Claude Code. Navigate, automate, screenshot, and extract data on any system that runs Firefox — no Chrome dependency, no Google infrastructure.
Anthropic's official browser tool requires Chrome. If you're on a system where Chrome is not available — or not acceptable — Claudezilla gives Claude Code the same browser automation capabilities through Firefox.
- Linux-native — Works with the Firefox that ships on Debian, Fedora, RHEL, Ubuntu, and every major distro. No Google repository required.
- Zero telemetry — All communication runs through a local Unix socket. No data leaves your machine. No Google account, no Chrome sync, no phone-home.
- Hardened environments — Built for Tails, Whonix, Qubes OS, air-gapped networks, and enterprise Linux where package policy prohibits Chrome.
- Multi-agent safe — 12-tab shared pool with 128-bit agent IDs, ownership tracking, and screenshot mutex. Multiple Claude sessions coexist safely.
- Full feature parity — Click, type, scroll, screenshot, evaluate JS, access DevTools console and network. Same capabilities, different browser.
Install from Firefox Add-ons
git clone https://github.com/boot-industries/claudezilla.git
cd claudezilla
# macOS
./install/install-macos.sh
# Linux
./install/install-linux.shThe installer automatically:
- Installs the native messaging host
- Runs
npm installfor MCP dependencies - Registers the MCP server with Claude Code (
claude mcp add --scope user) - Allows the Claudezilla tools in
~/.claude/settings.json(firefox_evaluateis excluded by default — see below)
No manual config required — restart Claude Code and you're ready.
firefox_evaluate is deliberately not in the allow-list: it runs JavaScript in the page, so it stays behind the extension's own opt-in (Claudezilla popup → Settings → Allow JavaScript evaluation). To let Claude Code call it, add "mcp__claudezilla__firefox_evaluate" to permissions.allow in ~/.claude/settings.json once you have enabled that toggle.
| Variable | Scope | Purpose |
|---|---|---|
CLAUDEZILLA_IPC_DIR |
POSIX only | Directory that holds the IPC socket, auth token and debug log. Set it to run two browsers side by side (for example a visible profile and a headless profile) without the most recently started one taking over the other's socket. |
CLAUDEZILLA_AUTOSTART_CMD |
all platforms | Command that starts the browser when the host is not running. Never run through a shell. |
CLAUDEZILLA_AUTOSTART_WAIT_MS |
all platforms | How long to wait for the host to bind its socket after a start (default 45000). |
CLAUDEZILLA_AUTOSTART_RETRY_COOLDOWN_MS |
all platforms | How long to wait before retrying a failed start (default 60000). |
CLAUDEZILLA_IPC_DIR in detail:
- POSIX only (macOS/Linux). On Windows the host uses a fixed named pipe (
\\.\pipe\claudezilla) and a%LOCALAPPDATA%token path, so the variable is ignored there. - The directory is created with mode
0700when missing, and an existing directory is tightened to0700. - Both processes need the same value. The native messaging host is launched by Firefox and inherits the browser's environment; the MCP server resolves the socket path from its own environment at startup. Export the variable before launching Firefox and before starting Claude Code.
- Restart the MCP server after changing it — the path is resolved once at module load.
- An invalid value (path traversal, null byte) is ignored with a warning and the default location is used.
# browser (and the native host it launches)
CLAUDEZILLA_IPC_DIR=/run/user/1000/claudezilla-bg firefox --no-remote --profile ~/profiles/headless
# MCP server that drives that browser
CLAUDEZILLA_IPC_DIR=/run/user/1000/claudezilla-bg claudeCLAUDEZILLA_AUTOSTART_CMD in detail:
- Never a shell. The value is an argv vector, executed with
execFile(..., { shell: false }). A JSON array is the exact form:A plain string is split on whitespace and is not interpreted by a shell:CLAUDEZILLA_AUTOSTART_CMD='["systemctl","--user","start","claudezilla-background"]'CLAUDEZILLA_AUTOSTART_CMD='systemctl --user start claudezilla-background' - The browser is started only when the host is not reachable. The check is a connection attempt, not a file check, so it also works on Windows, where the host socket is a named pipe rather than a file.
- Concurrent calls share a single launch, and a failed start is not retried for
CLAUDEZILLA_AUTOSTART_RETRY_COOLDOWN_MS— a browser that cannot start does not turn every tool call into another process. - The start command must publish the host socket and auth token where the MCP server looks for them. When the browser and the MCP server are different processes, give both the same
CLAUDEZILLA_IPC_DIR.
| Capability | Description |
|---|---|
| Browse | Open URLs, navigate pages, manage tabs |
| Read | Extract text, get page structure, accessibility tree |
| Interact | Click buttons, fill forms, press keys, scroll |
| Screenshot | Capture pages (JPEG, configurable quality) |
| Consent | Auto-dismiss cookie/GDPR consent dialogs |
| Wait | Handle SPAs and dynamic content |
| Focus Loops | Persistent iterative tasks until completion |
Claudezilla is free and open source. You can support its development with a one-time donation or monthly sponsorship:
- Click the ☕ Buy Me a Coffee button on the welcome page after first install
- Or use the ☕ Support this project link in the extension popup
- Donations are processed securely through Stripe
See STRIPE_SETUP.md for deployment and configuration details.
Once connected, Claude can use commands like:
Claude, open https://example.com and take a screenshot
Claude, fill in the search box with "Firefox automation" and click submit
Claude, get all the links on this page
firefox_create_window— Open URL in browserfirefox_navigate— Navigate current tab to a URLfirefox_get_content— Read page text (50K char limit)firefox_click— Click element by CSS selectorfirefox_type— Type into input fieldfirefox_press_key— Keyboard events (Enter, Tab, shortcuts)firefox_screenshot— Capture viewport (supports annotated mode)firefox_get_tabs/firefox_close_tab— Manage tabsfirefox_list_all_tabs— List all open tabs, including ones not yet under Claudezilla's controlfirefox_attach_tab/firefox_detach_tab— Attach to (or release) a tab the user already has open, driving it in place instead of opening a new one
firefox_activate— Load tool categories on demand (lazy loading saves ~6K tokens)firefox_set_config— Set domain allowlist, consent auto-dismiss, and session configfirefox_set_private_mode— Toggle private/regular browsingfirefox_handle_consent— Dismiss cookie/GDPR consent dialogs
firefox_start_loop— Start persistent iteration with prompt and max iterationsfirefox_stop_loop— Stop active loop manuallyfirefox_loop_status— Check iteration count and state
firefox_get_page_state— Structured data (headings, links, buttons, diff support)firefox_get_accessibility_snapshot— Semantic tree (screen reader view)firefox_get_element_info— Element attributes and stylesfirefox_wait_for— Wait for element, text, or URL patternfirefox_scroll— Scroll to element or position
firefox_diagnose— Check connection health, socket status, and troubleshoot issues
- Firefox 91+
- Node.js 18+
- Claude Code CLI
Claudezilla is designed with security in mind:
- Command whitelist — Only predefined actions allowed
- Local only — Communication via Unix socket (no network exposure)
- Tab isolation — Each Claude session owns its tabs
- URL validation — Blocks dangerous schemes (
javascript:,data:) - Supply chain hardened —
ignore-scripts=true, pinned dependencies, pnpm strict isolation, SHA-pinned CI actions, timing-safe auth
Works in both regular and private Firefox windows. Tab navigation respects ownership — Claude can only navigate tabs it created.
See SECURITY.md for the full security model.
Claude Code ←→ MCP Server ←→ Unix Socket ←→ Native Host ←→ Firefox Extension
The extension uses Firefox's Native Messaging to communicate with a local Node.js process, which exposes tools via the Model Context Protocol.
Issues and PRs welcome. See CLAUDE.md for development notes.
MIT
Author: Chris Lyons — boot.industries