mcp-zen
Allows remote control of a Firefox (or Zen) browser, enabling navigation, clicking, form filling, screenshots, and JavaScript execution via a WebSocket connection to a browser extension.
Click on "Deploy Server".
Wait a few minutes for the server to deploy. Once ready, it will show a "Started" state.
In the chat, type
@followed by the MCP server name and your instructions, e.g., "@mcp-zenlist all open tabs"
That's it! The server will respond to your query, and you can continue using it as needed.
Here is a step-by-step guide with screenshots.
mcp-zen
A persistent MCP HTTP server paired with a Zen/Firefox extension that lets any MCP client remote-control your already-running browser.
The public tool surface is zen_browser_*: one prefix for core browsing,
frames, and additive media/locate tools. Schemas were captured from
agent-browser 0.36.0 (pinned
in common/agent-browser/) then renamed. The backend is your attached
Firefox/Zen window, not a managed Chromium process. See
docs/parity.md.
The server is one long-lived process. The extension's WebSocket stays up independently of short-lived MCP client sessions.
Setup
1. Load the extension in Zen
npm install && npm run buildZen:
about:debugging→ This Firefox → Load Temporary Add-on →firefox-extension/manifest.jsonOptions page: Enable browser automation (
<all_urls>). Optional: Enable isolated sessions (Firefox containers for namedsessions).Temporary add-ons unload on browser restart unless you install permanently.
2. Ports (optional)
cd mcp-server
cp .env.example .envMCP_HTTP_PORT(default8791) — MCP clientsEXTENSION_PORT(default8765) — extension WebSocketMCP_SCREENSHOT_DIR— screenshot files (server filesystem)
Localhost only. The extension origin is required on the WebSocket; browser
origins are rejected on /mcp.
3. Run
bin/ is gitignored. Create the wrapper once per checkout:
mkdir -p bin
cat > bin/mcp-zen <<'EOF'
#!/usr/bin/env bash
set -euo pipefail
SCRIPT_DIR="$(cd "$(dirname "$(readlink -f "${BASH_SOURCE[0]}")")" && pwd)"
exec node "$SCRIPT_DIR/../mcp-server/server.js" "$@"
EOF
chmod +x bin/mcp-zen
ln -sf "$(pwd)/bin/mcp-zen" ~/.local/bin/mcp-zen
mcp-zenPoint an MCP client at http://localhost:8791/mcp.
node mcpcall.mjs zen_browser_tab_list '{}'
node mcpcall.mjs zen_browser_open '{"url":"https://example.com"}'
node mcpcall.mjs zen_browser_snapshot '{}'
node mcpcall.mjs zen_browser_click '{"selector":"@e1"}'Related MCP server: gecko-mcp
Tools
Default profile is agent-browser core (29 tools). Every tool accepts the
upstream common options; unsupported ones (allowedDomains, restore*,
extraArgs, caCert, …) return UNSUPPORTED_CAPABILITY instead of being
ignored.
Tool | Notes |
|
|
| Navigate bound tab; no browser launch flags |
| Live tab HTML; |
| A11y-style tree + |
|
|
|
|
| Chords like |
|
|
|
|
| Required |
|
|
| Path + image content; |
| Requires |
| Bound tab |
| Page-realm JS |
|
|
| |
| Owned tabs/containers only — not your browser |
| Iframes (Stripe/PayPal/3DS) |
| Click/fill by role, text, label, testid, … |
| Substring, glob, or |
| |
| |
|
|
| |
| Synthetic touch |
|
|
Reliable targeting
Use
@eNfrom snapshots; bareeNis also accepted. Repeated snapshots retain refs for the same connected DOM node. Removed/replaced nodes, navigation, or evicted refs require a fresh snapshot; refs never automatically retarget.Selectors use standard CSS (first match),
xpath=..., or snapshot refs—not Playwright:has-text()/:text(). Scope to the intended post/player rather than using a page-wide[role=slider](which can also match volume).zen_browser_finddefaults to click. Useaction: "text"to read without activating the match. Snapshot queries do not click.evalmay be blocked by a site's CSP. Ordinary DOM tools still work.Hover is synthetic and may not reveal CSS-only controls. A click response confirms dispatch, not application success: verify playback/seek state.
MCP clients must forward screenshot image content, not just its filesystem path. An image placeholder is not visual evidence.
Additive
zen_*tools (locate, reveal, click_at, set_range, media_*) are Firefox capabilities, not agent-browser. Preferzen_browser_media_*on CSP-strict video pages instead ofeval.zen_browser_locatenever clicks;zen_browser_findstill defaults to click.
Omit session to use the default binding (a personal tab). Named
session/namespace values use Firefox containers once that permission is
granted.
Development
Plain ES modules, Node 22+. No TypeScript.
npm testAdapter tests use a mock extension.
DOM tests use Chromium (
CHROMIUM_PATH, default/usr/bin/chromium).Live tests use a disposable Zen/Firefox profile (
FIREFOX_PATH) and never attach to your daily browser.node scripts/capture-agent-browser.jsregenerates pinned schemas from a built agent-browser binary.
Project layout
common/agent-browser/ pinned upstream MCP schemas + provenance
mcp-server/ HTTP MCP server, adapter, read pipeline
firefox-extension/ background client + in-page runtime
docs/parity.md core vs remaining 156-tool surface
test/ schema, adapter, DOM, live Firefox
mcpcall.mjs one-shot Streamable HTTP clientLicense
MIT — see LICENSE.
Pinned agent-browser schema JSON is copied from an Apache-2.0 project; see
common/agent-browser/LICENSE.
This server cannot be deployed
Maintenance
Related MCP Connectors
Stealth web browser for agents: search, fetch, click, download and type in persistent MCP sessions.
Hosted real Google Chrome MCP with per-user persistent state. Navigate, click, type, screenshot.
Access Kernel's cloud-based browsers and app actions via MCP (remote HTTP + OAuth).
Browser MCP for logged-in tasks. Uses your Chrome — credentials stay local. Zero-token replay.
Related MCP Servers
- FlicenseCqualityDmaintenanceEnables browser automation, including navigation, form filling, login with CAPTCHA handling, and element manipulation, using a Chrome-based MCP server.364-
- AlicenseAqualityCmaintenanceDrive Firefox-based browsers (Floorp, LibreWolf, Zen, Waterfox, Mullvad, Firefox) from any MCP client — read pages, screenshot, click, fill forms and manage tabs in your real session, over Marionette/WebDriver. OS input & JS eval locked by default.4143 npm2MIT
- FlicenseNot gradedqualityDmaintenanceEnables MCP clients to control a real local browser window for web automation tasks such as clicking, typing, scrolling, and taking screenshots.9 npm-
- AlicenseNot gradedqualityAmaintenanceEnables MCP-capable CLIs to operate real, already-logged-in Firefox tabs via a WebExtension and native messaging, without simulated input. Supports navigation, clicking, typing, reading, screenshots, and console/network capture with policy gating and frame awareness.MIT