MCP Hub
Back to servers

MCP Camoufox

A stealth browser MCP server with 69 tools for undetectable web automation. It bypasses bot detection systems like Cloudflare while providing full browser control for tasks like form filling, data scraping, and session management.

glama
Stars
2
Updated
Apr 16, 2026
Validated
Apr 18, 2026
Camoufox

MCP Camoufox

npm version npm downloads License: MIT Node.js

The most feature-rich stealth browser MCP server. 79 tools for full browser control powered by Camoufox — a Firefox fork with C++ level anti-detection that bypasses Cloudflare, bot detection, and anti-automation.

One command. No Python. No manual setup. Everything auto-installs.

claude mcp add camoufox -- npx -y mcp-camoufox@latest

What Can It Do?

  • Login to Google, ChatGPT, GitHub — without getting blocked
  • Fill forms, click buttons, type text, upload files
  • Manage cookies, localStorage, sessions across visits
  • Take screenshots, export PDFs, capture network traffic
  • Work with multiple tabs, iframes, dialogs
  • Execute JavaScript, inspect elements, scroll pages
  • Scrape structured data (job listings, products) with auto-detected selectors
  • All while being undetectable by anti-bot systems

Comparison

MCP ServerToolsStealthnpx InstallPersistent Session
Chrome DevTools MCP30+NoBuilt-inYes
whit3rabbit/camoufox-mcp1YesYesNo
redf0x1/camofox-mcp45YesNo (clone)Yes
Sekinal/camoufox-mcp49YesNo (clone)Yes
Playwright CLI60+NoYesYes
mcp-camoufox79YesYesYes

Setup

Claude Code

Global (available in all projects):

claude mcp add camoufox --scope user -- npx -y mcp-camoufox@latest

Project only (current project):

claude mcp add camoufox -- npx -y mcp-camoufox@latest
Claude Desktop

Global — add to config file:

  • macOS: ~/Library/Application Support/Claude/claude_desktop_config.json
  • Windows: %APPDATA%\Claude\claude_desktop_config.json
  • Linux: ~/.config/Claude/claude_desktop_config.json
{
  "mcpServers": {
    "camoufox": {
      "command": "npx",
      "args": ["-y", "mcp-camoufox@latest"]
    }
  }
}

Claude Desktop is always global — no project-level config.

Cursor

Global — Preferences > Features > MCP, or ~/.cursor/mcp.json:

Project.cursor/mcp.json in project root:

{
  "mcpServers": {
    "camoufox": {
      "command": "npx",
      "args": ["-y", "mcp-camoufox@latest"]
    }
  }
}
Windsurf

Global~/.windsurf/mcp.json:

Project.windsurf/mcp.json in project root:

{
  "servers": {
    "camoufox": {
      "command": "npx",
      "args": ["-y", "mcp-camoufox@latest"]
    }
  }
}
VS Code (Continue / Cline / Kilo Code)

Global — VS Code settings or ~/.continue/config.json:

Project.vscode/mcp.json in project root:

{
  "mcpServers": {
    "camoufox": {
      "command": "npx",
      "args": ["-y", "mcp-camoufox@latest"]
    }
  }
}
Factory (Droid)

Global~/.factory/mcp.json:

Project.factory/mcp.json in project root:

{
  "mcpServers": {
    "camoufox": {
      "type": "stdio",
      "command": "npx",
      "args": ["-y", "mcp-camoufox@latest"],
      "disabled": false
    }
  }
}

Or via CLI:

droid mcp add camoufox "npx -y mcp-camoufox@latest"
OpenCode

Global~/.config/opencode/opencode.json:

Projectopencode.json in project root:

{
  "mcp": {
    "camoufox": {
      "type": "local",
      "command": ["npx", "-y", "mcp-camoufox@latest"],
      "enabled": true
    }
  }
}

Note: OpenCode uses "type": "local" (not "stdio") and command as a single array.

Trae (ByteDance)

Global~/.trae/mcp.json:

Project.trae/mcp.json in project root:

{
  "mcpServers": [
    {
      "name": "camoufox",
      "command": ["npx", "-y", "mcp-camoufox@latest"]
    }
  ]
}

Note: Trae uses an array format for mcpServers, not an object.

Antigravity (Google)

Global~/.gemini/antigravity/mcp_config.json:

{
  "mcpServers": {
    "camoufox": {
      "command": "npx",
      "args": ["-y", "mcp-camoufox@latest"]
    }
  }
}

Or via UI: Agent Panel > ... > MCP Servers > Manage MCP Servers > View raw config.

Antigravity is global only — no project-level MCP config.

Requirements

RequirementVersionCheck
Node.js18+node --version

That's all. Camoufox browser binary (~80MB) downloads automatically on first launch.

All 79 Tools

Browser Lifecycle (2)

ToolDescription
browser_launchLaunch stealth browser. Options: url, headless, humanize, geoip, locale, width, height
browser_closeClose browser. Cookies preserved in profile.

Navigation (4)

ToolDescription
navigateGo to URL. Options: wait_until (domcontentloaded/load/networkidle), timeout
go_backBack in history
go_forwardForward in history
reloadReload page

DOM & Content (6)

ToolDescription
browser_snapshotGet interactive elements with ref IDs. Call after every navigation.
screenshotCapture viewport or full page. Options: name, full_page
get_textText from page or selector (max 5000 chars)
get_htmlHTML from page or selector (max 10000 chars)
get_urlCurrent URL + title
save_pdfExport page as PDF

Element Interaction (9)

ToolDescription
clickClick by ref ID. Auto JS-fallback for overlays. Options: button, dblclick
click_textClick by visible text. Options: exact
click_roleClick by ARIA role + name
hoverHover over element
fillFill input/textarea (clears first)
select_optionSelect from dropdown
check / uncheckToggle checkbox/radio
upload_fileUpload file to input

Keyboard (2)

ToolDescription
type_textType char by char. Options: delay. For OTP, masked inputs, date pickers.
press_keyKey or combo: Enter, Escape, Tab, Control+a, Meta+c

Mouse XY (3)

ToolDescription
mouse_click_xyClick at exact coordinates
mouse_moveMove cursor to coordinates
drag_and_dropDrag between two elements

Wait (4)

ToolDescription
wait_forWait for selector or text (visible/hidden/attached/detached)
wait_for_navigationWait for page load
wait_for_urlWait for URL pattern match
wait_for_responseWait for network response pattern

Tabs (4)

ToolDescription
tab_listList all tabs
tab_newOpen new tab
tab_selectSwitch tab
tab_closeClose tab

Cookies (3)

ToolDescription
cookie_listList cookies. Options: domain filter
cookie_setSet cookie
cookie_deleteDelete by name/domain. Empty = clear all.

Local Storage (3)

ToolDescription
localstorage_getGet all or specific key
localstorage_setSet key-value
localstorage_clearClear all

Session Storage (2)

ToolDescription
sessionstorage_getGet all or specific key
sessionstorage_setSet key-value

JavaScript (2)

ToolDescription
evaluateRun JS in page context
inject_init_scriptInject script that runs on every page load

Element Inspection (4)

ToolDescription
inspect_elementFull element info: tag, attributes, box, styles
get_attributeGet specific attribute
query_selector_allQuery multiple elements by CSS selector
get_linksGet all links with URL + text. Options: filter

Frames (2)

ToolDescription
list_framesList all frames/iframes
frame_evaluateRun JS inside a frame

Batch Operations (3)

ToolDescription
batch_actionsMultiple actions in one call (click, fill, type, press, wait)
fill_formFill multiple fields + optional submit
navigate_and_snapshotNavigate + snapshot in one call

Viewport (2)

ToolDescription
get_viewport_sizeGet width x height
set_viewport_sizeSet dimensions

Scroll (1)

ToolDescription
scrollScroll up/down/left/right by pixel amount

Dialog (1)

ToolDescription
dialog_handlePre-set accept/dismiss for next alert/confirm/prompt

Accessibility (1)

ToolDescription
accessibility_snapshotAccessibility tree for LLM understanding

Console & Network (4)

ToolDescription
console_start / console_getCapture and retrieve browser console messages
network_start / network_getCapture and retrieve network requests

Compound (reduce round-trips) (4)

ToolDescription
wait_and_snapshotWait for selector/text + return snapshot in one call
back_and_snapshotNavigate back + return snapshot
reload_and_snapshotReload page + return snapshot
click_and_snapshotClick + wait + return snapshot. Perfect for buttons that trigger navigation.

Smart Selectors (skip snapshot) (3)

ToolDescription
find_by_textFind element by visible text, returns ref. Skip browser_snapshot when you know exact text.
find_by_labelFind input by label text, returns ref.
find_by_placeholderFind input by placeholder, returns ref.

Session Portability (2)

ToolDescription
cookie_exportExport all cookies as JSON (for transfer)
cookie_importImport cookies from JSON (restore session)

Scraping & Extraction (4)

ToolDescription
detect_content_patternAuto-detect repeated content (cards, listings) and suggest CSS selectors. Run this before extract_structured.
extract_structuredExtract data from repeated elements as clean JSON. Auto-deduplicates, filters empties, direct_text_only prevents field mixing.
extract_tableExtract HTML table as JSON array with auto-detected headers
scrape_pageSmart scraper: auto-extract main content (strips nav/footer), links, meta, headings. Smart truncation at paragraph boundary.

Debug (4)

ToolDescription
server_statusHealth check: browser status, tabs, URL
get_page_errorsJS errors from page
export_harExport network traffic as HAR file
page_statsElement count, page size, load metrics + extraction strategy recommendation

Examples

Login to a website

browser_launch(url="https://accounts.google.com", headless=false)
browser_snapshot()                              # see email input
fill(ref="e1", value="user@gmail.com")          # fill email
click(ref="e4")                                 # click Next
wait_for(selector='input[type="password"]')     # wait for password page
browser_snapshot()
fill(ref="e2", value="mypassword")              # fill password
click(ref="e4")                                 # click Next

Fill a form in one call

fill_form(
  fields=[
    {ref: "e3", value: "John Doe"},
    {ref: "e5", value: "john@example.com"},
    {ref: "e7", value: "Hello world"}
  ],
  submit_ref="e10"
)

Batch multiple actions

batch_actions(actions=[
  {type: "click", ref: "e5"},
  {type: "wait", timeout: 1000},
  {type: "fill", ref: "e8", value: "search query"},
  {type: "press", key: "Enter"}
])

Search Google

browser_launch(url="https://google.com")
browser_snapshot()
click(ref="e5")                               # search box
type_text(text="mcp-camoufox npm")
press_key(key="Enter")

Multi-tab research

browser_launch(url="https://github.com")
tab_new(url="https://stackoverflow.com")
tab_list()
tab_select(index=0)

Wait for API response

click(ref="e10")
wait_for_response(url_pattern="/api/data")
browser_snapshot()

Inspect elements

inspect_element(ref="e5")
get_links(filter="github.com")
query_selector_all(selector=".product-card")

Work with iframes

list_frames()
frame_evaluate(frame_index=1, expression="document.title")

Scrape job listings (structured)

browser_launch(url="https://glints.com/id/opportunities/jobs/explore")
detect_content_pattern()                      # auto-suggest selectors
extract_structured(
  container_selector=".job-card",             # from detect_content_pattern
  fields=[
    {name: "title", selector: "h3"},
    {name: "company", selector: ".company-name"},
    {name: "location", selector: ".location"},
    {name: "url", selector: "a", attribute: "href"}
  ]
)

Scrape page content (smart)

scrape_page(only_main_content=true, max_text_length=8000)
# Returns: title, url, meta, text (truncated at paragraph boundary),
#          links, headings, truncated flag, total_text_length

Manage storage

localstorage_get()
localstorage_set(key="token", value="abc123")
cookie_list(domain="example.com")

How It Works

AI Agent (Claude, Cursor, Windsurf, VS Code)
    |
    |  MCP Protocol (stdio JSON-RPC)
    v
mcp-camoufox (Node.js)
    |
    |  Playwright API (Juggler protocol, NOT CDP)
    v
Camoufox (Patched Firefox binary)
    |
    |  C++ anti-fingerprint patches
    v
Website (Cloudflare, bot detection — bypassed)

Why stealth works

  • Juggler protocol instead of CDP — sites detecting Chrome DevTools Protocol cannot detect Camoufox
  • C++ level patches — fingerprint spoofing at browser engine level, not JavaScript injection
  • GeoIP auto-detection — timezone, locale, geolocation match your real IP
  • Human-like behavior — optional humanize mode for realistic mouse movements

Why sessions persist

Browser profile stored at ~/.camoufox-mcp/profile/. Cookies, localStorage, IndexedDB survive across sessions. Login once, stay logged in.

Why refs work better

browser_snapshot tags elements with data-mcp-ref attributes. This is:

  • More token-efficient than sending full HTML
  • More reliable than CSS selectors that break when sites update
  • Clickable via click(ref="e5") — no selector gymnastics

Data Storage

PathContents
~/.camoufox-mcp/profile/Browser profile (cookies, localStorage, cache)
~/.camoufox-mcp/screenshots/Screenshots, PDFs, HAR exports

Reset everything: rm -rf ~/.camoufox-mcp/

Troubleshooting

ProblemFix
"Browser not running"Call browser_launch first
Click blocked by overlayAuto JS-fallback handles it. Or press_key("Escape") first.
Stale refs after navigationCall browser_snapshot again — refs regenerate each time
Window too largebrowser_launch(width=1024, height=768)
First launch slowDownloading Camoufox binary (~80MB). Happens once.
Huge snapshot outputNormal for big pages. Use get_text or evaluate instead.
iframe not accessibleUse list_frames + frame_evaluate
CAPTCHA appearsCannot auto-solve. Use headless=false and solve manually.

License

MIT


Built by RobithYusuf

Reviews

No reviews yet

Sign in to write a review