MCP server: One MCP server.

Ghostfox

@autokerenRun by its publisher: served from their own domain, namespace checked by the registry.MCP server · External

Self-hosted stealth browser for AI agents: Firefox engine + Rust MCP runtime.

Browser automationv0.9.2MITC++
Freeno charge per call

Runs on your machine from its package; the steps are below.

Ghostfox demo: android persona + detection panel
From the README

What it does

  1. Reads
  2. Writes
  3. High impact

At most: moves money, runs code or commands, deletes data, or sends messages for you.

What it costs

Free

Odel charges nothing per call. The publisher may charge for its own service.

Runs locally over stdio

This server isn't hosted — your MCP client launches it from a package registry. Use one of the commands below, or drop the config into your client (e.g. Claude Desktop).

PyPIghostfoxv0.9.2

Run

uvx ghostfox

MCP client config

{
  "mcpServers": {
    "ghostfox": {
      "command": "uvx",
      "args": [
        "ghostfox"
      ]
    }
  }
}
npmghostfoxv0.9.2

Run

npx -y ghostfox

MCP client config

{
  "mcpServers": {
    "ghostfox": {
      "command": "npx",
      "args": [
        "-y",
        "ghostfox"
      ]
    }
  }
}
README11 min read
Ghostfox

Ghostfox

The agent-native stealth browser you can own.

GitHub stars npm downloads PyPI downloads CI MCP Registry Sponsor

Self-hosted · Open source · MCP-first · Engine-level anti-detect

License License Engine MCP Registry PyPI npm Docker ghostfox MCP server – quality and maintenance score on Glama ghostfox MCP server – quality score on Glama CI Release Stars

Ghostfox demo: android persona + detection panel

Watch the full demo · Docs site


AI agents get blocked. Headless Chrome triggers Cloudflare 403s on ~20% of the web, and hosted "stealth browsers" route your agent's cookies, identities and sessions through someone else's cloud.

Ghostfox is the alternative: a complete browser stack you run yourself — a fingerprint-coherent stealth engine plus a Rust MCP runtime, in one repo.

Firefox (MPL-2.0)
  └─ Camoufox (anti-detect patches, by daijro)
       └─ Ghostfox engine          engine/   — spoofing at the C++ level
            └─ Ghostfox runtime     runtime/  — Rust: sessions, identities, MCP
GhostfoxHosted stealth (Browserbase etc.)playwright-mcpAnti-detect suites (Multilogin etc.)
Self-hosted✓✗✓partially
Open source✓✗✓✗
MCP-native✓✓✓✗
Engine-level anti-detect✓ (C++/Firefox)vendor partnerships✗✓ (closed)
Coherent identities + auditor✓✗✗partial
Runtime languageRust—Node—

The moat — why this isn't just another wrapper.

  1. We own the engine. The anti-detect lives in C++ patches inside our own Firefox fork — not in injected JS that detectors can read. Upstream Camoufox has signaled partially-closed patches ahead; wrappers inherit that risk, a fork that owns its engine doesn't.
  2. A living proof corpus. Every claim here has a receipt: bilibili icon-click ×6, hCaptcha on production signups, TikTok OAuth+OTP live, 500/500 identity audits, Docker E2E. Features get copied in a week — verified history can't be.
  3. Agent-native ergonomics. 43 coherent MCP tools, fire-then-verify receipts, evidence recording, and a playbook (AGENTS.md) distilled from real runs. Agents (and their prompts) build habits on this surface — switching costs are real.
  4. Canonical distribution. PyPI, npm, GHCR and the official MCP Registry under one name, with the docs, benchmarks and changelogs to back it. Forks will exist; the verified trunk is here.

Captcha suite — 8 families, solved on-device (v0.6.7+). The runtime ships native MCP solvers with local models — no paid captcha farms, no cloud, no browser rent:

FamilyNative toolHow
GeeTest slide / v4 radarpage_geetest_slidebg-vs-fullbg diff + largest-blob gap detection
GeeTest icon-click (文字点选)page_geetest_clickcustom-trained YOLOv8s + siamese similarity (rten, CPU)
Rotatepage_captcha_rotate24-angle sweep + programmatic verdict
Normal OCRpage_captcha_ocrported ddddocr (CRNN+LSTM, onnxruntime)
hCaptchapage_hcaptchalayout router + 553-model QIN2DIM zoo + optional vision-model ensemble
Cloudflare Turnstile / TikTokcaptcha_solve + behavioral recipesproven playbooks in AGENTS.md §6b–6e

E2E-verified against production sites (not vendor demos): bilibili icon-click ×6 "Verification Succeeded", hCaptcha on real signups (dashboard.hcaptcha.com, dosya.co), TikTok OAuth+OTP live session.

Debug cortex — page tools that tell you WHY (v0.7). Agents stop guessing when a page misbehaves:

  • page_console — every console.log/warn/error since load
  • page_errors — uncaught JS exceptions with stack traces
  • page_network_start/read/body — request/response capture with body fetch

That's the DevTools trio, exposed over MCP.

Multi-model vision (optional). page_vision + page_ocr + page_match_image + page_pixels + page_contrast — wire any vision-capable model (Cloudflare Workers AI, GLM, Qwen, ...) as cross-checks for grid puzzles and layout questions. Keys are optional; the native solvers above run fully local.

Native-sourced observation — page_a11y {"native": true} reads the engine's OWN accessibility tree (Gecko's DocAccessible walk — the ariaSnapshot plumbing), so page scripts cannot tamper with what you see: shadow DOM, iframes and ARIA semantics handled by Gecko itself, richer states (focused/required/checked/expanded/disabled/level). Native refs are observation handles; acting goes through role+name anchors or the JS-walk source.

Eyes for agents — page_a11y. One call returns every visible interactive element with a stable ref, semantic role, accessible name, live value — piercing shadow DOM and same-origin iframes, so web-component UIs (Reddit, modern frameworks) are fully visible. The snapshot also reports login_state (logged-in / logged-out / unknown), page URL and title — agents check session health before acting, not after failing.

Agents act by ref: page_click_ref e38, page_type_ref e21 "text" — no CSS selectors needed. Rich editors (Lexical, Draft, ProseMirror) are handled via editor-native input paths with fire-then-verify receipts. page_wait_for replaces manual sleeps. page_read_ref gives full untruncated values. page_upload_file bypasses native file pickers.

Android personas too — session_create {"platform": "android"} gives portrait screens, Adreno/Mali GPUs, Android font stacks and Firefox-on-Android UAs, all audited like desktop identities (500/500 coherent, see runtime/docs).

One identity, no contradictions. Identities are generated from coherent device presets (platform, screen, GPU, fonts that actually ship together), injected at the engine level, and audited before use — a spoofed browser's worst enemy is itself saying "4 cores on a MacBook".

Quickstart

Pick a distribution:

bash
# Python (Linux x86_64)
pip install ghostfox
python -c "import ghostfox; ghostfox.install_engine(); ghostfox.install_runtime()"

# npm / any MCP host
npm install -g ghostfox        # or: npx ghostfox install
{
  "mcpServers": {
    "ghostfox": { "command": "npx", "args": ["-y", "ghostfox", "mcp"] }
  }
}

# Docker (engine + MCP runtime, ubuntu:24.04 base)
docker run -i --rm ghcr.io/autokeren/ghostfox:v0.7.2
# or one-line install of the binary stack:
curl -fsSL https://raw.githubusercontent.com/autokeren/ghostfox/main/install.sh | bash

Also listed on the official MCP Registry (io.github.autokeren/ghostfox) — one-click add in registry-aware clients.

From source:

bash
# 1) Get the engine (prebuilt) and unpack it somewhere, e.g. /opt
unzip ghostfox-<ver>-lin.x86_64.zip -d /opt/ghostfox

# 2) Build the runtime
git clone https://github.com/autokeren/ghostfox.git
cd ghostfox/runtime
cargo build --release
json
{
  "mcpServers": {
    "ghostfox": {
      "command": "/path/to/ghostfox/runtime/target/release/ghostfox-mcp",
      "env": { "GHOSTFOX_HOME": "/opt/ghostfox" }
    }
  }
}

Then the agent can: session_create → page_open → page_a11y → act by ref.

Portable sessions. session_create accepts profile_dir for persistent profiles: cookies, storage and the identity TOML live together in one place, so a login survives restarts. Migrating a session from another Camoufox-lineage browser? Copy the cookies and match the identity to the origin device (platform, timezone, locale, screen) — a session that suddenly changes identity looks like an impossible login and anti-fraud systems revoke it. Proven flow, see AGENTS.md §8.

Full tool surface (70 tools) — two tiers, one binary:

  • core (default): 26 curated tools — the golden loop (read → act → verify) plus debugging essentials, zero overlapping variants. This is what agents and registry inspectors see out of the box: an efficient, disambiguated surface (each tool's description says when to prefer it).
  • full: all 70 tools — captcha families, pixel/vision tiers, network interception, WebSocket capture/inject/block, identity morph, chrome-mode, Android. Run the server with GHOSTFOX_TOOLSET=full.

The server also publishes instructions (a decision tree agents read before choosing tools) — the disambiguation layer for both tiers.

CategoryTools
Sessionsession_create · session_pages · session_me
Seepage_a11y (semantic + login_state + shadow DOM/iframe) · page_extract (typed, token-efficient a11y filters) · page_snapshot · page_screenshot · page_read_ref (full value) · page_diff (observeDiff: what changed since the last snapshot) · page_mutations (M3: unhookable DOM-change whispers) · page_a11y_events (M3: the a11y tree as a stream — focus/text/state/live-region events, the incremental diff)
Waitpage_wait_for (poll until visible) · page_dismiss_modal · page_wait_stable (render-settled) · page_wait_visual (M3.5: refresh-driver visual stability — the sleep killer)
Actpage_click_ref · page_click_native (trusted a11y-bounds click: scroll-first, DOM-proof coordinates) · page_click_at (raw trusted coords — no a11y resolution) · page_type_ref · page_click · page_type · page_fill · page_press · page_drag · page_move_to · page_upload_file · page_init_script · page_a11y_set_text (AT-native text input — the Flutter route)
Captchacaptcha_solve · page_geetest_slide · page_geetest_click · page_captcha_rotate · page_captcha_ocr · page_hcaptcha · page_captcha_vision (host-VLM reader for warped text captchas)
Network brokerpage_network_intercept (hold every request) · page_network_resume (modify url/method/headers/postData) · page_network_abort (block) · page_network_fulfill (mock the response)
Debugpage_console · page_errors · page_network_start · page_network_read (per-request DNS/TLS/TTFB timing) · page_network_body · page_frame_stats (M3.5: jank detector — frame-cadence stats) · page_timing_report (M3.5: nav-timing + paint) · page_ws_frames (M3: the WebSocket stream — sockets + frames both directions) · page_ws_send (M3: WS injection — client→server message) · page_ws_block (M3: WS blocking — drop frames both directions) · page_ui_audit (M5: visual QA of the rendered UI)
Visionpage_vision · page_ocr · page_match_image · page_pixels (compositor pixels — region/semantic/ref, no toDataURL) · page_contrast
Inspectpage_eval · page_open · page_comment
Identityidentity_generate · identity_audit · identity_morph (stop→relaunch→swap identity without losing the session)
Body sensepage_proprio (M4: honest body state — focus, selection/caret, scrollers) · page_cookie_events (M4: cookie/session heartbeat — auth-cookie deletion = earliest session-death signal) · session_vitals (M4.5: per-process CPU/memory)
Recipesrecipe_record · recipe_save · recipe_list · recipe_replay (deterministic replay, semantic anchors, strict/lenient escalation)
Evidence & safetysession_evidence · confirm_action

Every mutation returns a receipt — page_fill reports landed_chars, while type_ref fire-then-verifies async editors, so a silent page swap can't eat an edit unnoticed. Sessions can also run headful ({"headful": true}) when humans want to watch the agent work.

Every run records evidence. Each session writes an append-only event log (events.jsonl), full page snapshots and the identity it used under ~/.ghostfox/recordings/ — fetch it any time with session_evidence.

E2E without emulators: Flutter web + any web app

Android E2E normally means emulators, Appium and a farm of devices. Ghostfox takes the web route: build the Flutter app for the web (flutter build web — same Dart codebase) and drive it with the same senses used against hostile sites:

  • Semantics tree, read natively — Flutter's a11y nodes (roles, labels, bounds) land in page_a11y(native=true) once semantics are enabled (one line in the app: SemanticsBinding.instance.ensureSemantics()).
  • Native clicks — page_click_native fires the Flutter buttons at their trusted a11y coordinates (verified: submit triggers, status renders).
  • Receipts + page_diff + page_mutations + page_wait_stable — the same Act→Observe→Compare evidence loop, no polling guesswork.
  • Visual QA — page_ui_audit judges the rendered UI.

Honest scope: logic/flow/UI = fully covered; final visual parity with real devices (Impeller rendering) and platform channels (sensors, camera) still need a device or emulator pass.

Sponsor

Ghostfox is independent and self-funded. If it saves your team from captcha walls or vibe-code UI bugs, help keep the house open:

Companies: sponsorship + early access to the hosted Visual QA service is open — sponsor the repo or open an issue with the title sponsorship.

Or install in one command (Linux x86_64):

bash
curl -fsSL https://raw.githubusercontent.com/autokeren/ghostfox/main/install.sh | bash

From source end-to-end (build the engine yourself): see engine/README.md — make dir && make build.

Repository layout

runtime/   Rust: ghostfox-{core,fingerprint,mcp,eval}     (MIT OR Apache-2.0)
engine/    Browser fork: patches, branding, build system    (MPL-2.0)
AGENTS.md  The agent playbook — how AI agents drive Ghostfox like a human
SKILL.md   The compact agent skill — the golden loop + tool map at a glance
docs/JOURNEY.md  The dev-log, todo list and the road ahead (the five senses)

Two directories, two licenses, one product. The runtime speaks Juggler natively — no Node, no Python at runtime.

Using Ghostfox with an AI agent (opencode, Codex, Cursor, Claude Code, ...)? Read AGENTS.md first — it's the distilled playbook from real agent runs: the READ → REASON → DECIDE → ACT loop, self-health (rate limits, drafts, notifications), rich-editor typing, and every known wall with its proven solution.

Why own the engine?

  • Anti-detect that survives inspection. Spoofing happens inside the engine (navigator, screen, WebGL, fonts, WebRTC, timezone, audio) — not in injected JS that detectors can read.
  • No cloud dependency. Your agent's identities and cookies never touch a third-party host.
  • Upstream insurance. engine/ tracks daijro/camoufox as upstream; Ghostfox applies its own branding and can rebase whenever it wants — including if upstream patches go closed-source.

Status

v0.7 — alpha. Verified: identity coherence (500/500), full MCP round-trip E2E (create → open → fill → submit), 8 captcha families E2E on production sites (bilibili, hCaptcha-protected signups, TikTok), debug cortex (console/errors/network), Docker image E2E (session → open → snapshot inside a container), portable sessions across Camoufox-lineage browsers. Distributed via PyPI, npm, Docker (GHCR) and the official MCP Registry. Known limits are tracked in the changelogs under runtime/ and engine/.

Do not use against targets you don't have permission to test. This is a testing / research tool.

Credits

Ghostfox stands on the shoulders of giants — Camoufox (daijro) for the anti-detect patch stack, Mozilla Firefox for the engine, LibreWolf for the patch tooling lineage, and Playwright for the Juggler protocol.

License

Similar modules

Browse Browser automation