MCP Camoufox
Bypasses Cloudflare's anti-bot detection systems to access websites protected by Cloudflare security measures.
Provides browser automation capabilities using a stealth-modified Firefox fork with C++ level anti-detection features.
Enables automated login and interaction with GitHub while avoiding bot detection and blocking.
Allows automated login and interaction with Google services while bypassing anti-bot detection systems.
Provides image hosting integration through the README's use of Imgur for hosting the project logo.
Enables JavaScript execution within browser pages for dynamic content interaction and automation.
Runs as a Node.js application with version 18+ requirement for server execution.
Distributed as an npm package with installation via npx for easy deployment.
Click on "Install 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 Camoufoxscrape job listings from LinkedIn for software engineer roles in San Francisco"
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 Camoufox
The most feature-rich stealth browser MCP server. 127 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@latestWhat 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
Related MCP server: CloakMCP
Comparison
MCP Server | Tools | Stealth | npx Install | Persistent Session |
Chrome DevTools MCP | 30+ | No | Built-in | Yes |
whit3rabbit/camoufox-mcp | 1 | Yes | Yes | No |
redf0x1/camofox-mcp | 45 | Yes | No (clone) | Yes |
Sekinal/camoufox-mcp | 49 | Yes | No (clone) | Yes |
Playwright CLI | 60+ | No | Yes | Yes |
127 | Yes | Yes | Yes |
Proven on Real Sites
Site | Challenge | Result |
| Cloudflare Turnstile widget | ✅ "Success!" via |
| Firefox fingerprint tests | ✅ All green (proof) |
| WebDriver/UA/CDP/Navigator | ✅ All categories "Normal" (proof) |
🎯 Cloudflare Turnstile → Success via click_turnstile()
click_turnstile() auto-detects the widget via 6 selector fallback (iframe[src*=challenges.cloudflare.com], [data-sitekey], .cf-turnstile, …), computes checkbox position (offset_x=30 from widget left), and clicks with a 3-step Bezier-like approach — combined with Camoufox's native humanize + disable_coop for cross-origin iframe click.
Scope: works on Interactive Turnstile (visible iframe widget). Managed Challenge interstitials ("Just a moment...") render the widget in shadow DOM — not supported here; use sister project mcp-stealth-chrome (Chrome+CDP) for those. Real-world bypass success also depends on IP reputation and browser fingerprint — code alone doesn't guarantee it.
🧪 bot.sannysoft.com → Firefox Fingerprint Pass
User Agent reports Firefox/135.0, WebDriver missing, WebDriver Advanced passed, Permissions prompt, Plugins length 5 passed, Languages en-US,en, WebGL Intel HD Graphics — all green. ("Chrome: missing" is expected — Camoufox spoofs Firefox, not Chrome.)
🔍 browserscan.net/bot-detection → All Categories Normal
WebDriver, User-Agent, CDP, Navigator — every detection category returns "Normal". Camoufox's C++-level Firefox patches leave zero automation signals.
Setup
Global (available in all projects):
claude mcp add camoufox --scope user -- npx -y mcp-camoufox@latestProject only (current project):
claude mcp add camoufox -- npx -y mcp-camoufox@latestGlobal — add to config file:
macOS:
~/Library/Application Support/Claude/claude_desktop_config.jsonWindows:
%APPDATA%\Claude\claude_desktop_config.jsonLinux:
~/.config/Claude/claude_desktop_config.json
{
"mcpServers": {
"camoufox": {
"command": "npx",
"args": ["-y", "mcp-camoufox@latest"]
}
}
}Claude Desktop is always global — no project-level config.
Global — Preferences > Features > MCP, or ~/.cursor/mcp.json:
Project — .cursor/mcp.json in project root:
{
"mcpServers": {
"camoufox": {
"command": "npx",
"args": ["-y", "mcp-camoufox@latest"]
}
}
}Global — ~/.windsurf/mcp.json:
Project — .windsurf/mcp.json in project root:
{
"servers": {
"camoufox": {
"command": "npx",
"args": ["-y", "mcp-camoufox@latest"]
}
}
}Global — VS Code settings or ~/.continue/config.json:
Project — .vscode/mcp.json in project root:
{
"mcpServers": {
"camoufox": {
"command": "npx",
"args": ["-y", "mcp-camoufox@latest"]
}
}
}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"Global — ~/.config/opencode/opencode.json:
Project — opencode.json in project root:
{
"mcp": {
"camoufox": {
"type": "local",
"command": ["npx", "-y", "mcp-camoufox@latest"],
"enabled": true
}
}
}Note: OpenCode uses
"type": "local"(not"stdio") andcommandas a single array.
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.
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
Requirement | Version | Check |
Node.js | 18+ |
|
That's all. Camoufox browser binary (~80MB) downloads automatically on first launch.
All 127 Tools
Browser Lifecycle (4)
Tool | Description |
| Launch stealth browser. Options: |
| Close browser. Reports exactly what survived — e.g. "3 persisted, 1 session-only (dropped)" — so a lost login is never a mystery. Temp profile removed if |
| Wipe the persistent profile at |
| Escape hatch when the browser is wedged and |
Navigation (4)
Tool | Description |
| Go to URL. Options: |
| Back in history |
| Forward in history |
| Reload page |
DOM & Content (7)
Tool | Description |
| Get interactive elements with ref IDs. Call after every navigation. On large pages narrow with |
| Capture viewport, full page, or one element ( |
| Text from page or selector (max 5000 chars) |
| HTML from page or selector (max 10000 chars) |
| Current URL + title |
| ⚠️ Not available on Camoufox — Playwright implements PDF generation only for headless Chromium, and Camoufox is Firefox. Returns a clear error; use |
| Grep the current page's visible text with surrounding context — costs nothing next to a snapshot or screenshot |
Element Interaction (12)
Tool | Description |
| Click by ref ID. Options: |
| Click by visible text. Refuses to guess: several matches → fails with a numbered candidate list (tag, text, ancestor path, ref). Narrow with |
| Click by ARIA role + name. Same |
| Hover over element |
| Fill input/textarea — always replaces the old value ( |
| Select from dropdown |
| Toggle checkbox/radio |
| Upload file to input |
| Click at an x%/y% position inside an element — wide labels whose real checkbox sits at the left edge, sliders, split buttons |
| Click a corner (close/X, delete, dismiss controls live there, not in the centre) |
| Fill via a real clipboard paste (Ctrl/Cmd+V) so frameworks that only listen for |
Keyboard (2)
Tool | Description |
| Type char by char. Options: |
| Key or combo: |
Mouse XY (4)
Tool | Description |
| Click at exact coordinates. Optional |
| Move cursor to coordinates. Optional |
| Auto-find + humanized click on Cloudflare Turnstile widget. Params: |
| Drag between two elements |
Wait (7)
Tool | Description |
| Wait for selector or text (visible/hidden/attached/detached) |
| Wait for page load |
| Wait for URL pattern match. Wrap in |
| Wait for network response pattern |
| Wait until the page actually CHANGES and report what changed (url/title/DOM size/text) — the honest replacement for a fixed sleep after a click |
| Block until the page ISSUES a matching request — confirms an action really fired its API call |
| Race several conditions ( |
Tabs (4)
Tool | Description |
| List all tabs. Pages the site opens itself ( |
| Open new tab |
| Switch tab by |
| Close tab by |
Cookies (3)
Tool | Description |
| List cookies. Options: |
| Set cookie with |
| Delete by name/domain. Empty = clear all. |
Local Storage (3)
Tool | Description |
| Get all or specific key |
| Set key-value |
| Clear all |
Session Storage (3)
Tool | Description |
| Get all or specific key |
| Set key-value |
| Clear all sessionStorage for the origin (parity with |
JavaScript (2)
Tool | Description |
| Run JS in page context |
| Inject script that runs on every page load |
Element Inspection (5)
Tool | Description |
| Full element info: tag, attributes, box, styles |
| Get specific attribute |
| Query multiple elements by CSS selector |
| Get all links with URL + text. Options: |
| Whole-form analysis in one call: label, type, value, required/pattern/length, validation state, and the JS framework each field is bound to |
Frames (2)
Tool | Description |
| List all frames/iframes |
| Run JS inside a frame |
Batch Operations (6)
Tool | Description |
| Multiple actions in one call (click, fill, type, press, wait) |
| Fill multiple fields + optional submit |
| Composite login for email→password forms (Google/Microsoft/generic). Auto email→Next→password→submit, optional TOTP 2FA ( |
| Navigate + snapshot in one call |
| Fill fields by label text (fuzzy) instead of refs — no snapshot needed; optional |
| Run a list of tool calls in sequence; resumable via |
Viewport (2)
Tool | Description |
| Get width x height |
| Set dimensions |
Scroll (2)
Tool | Description |
| Scroll up/down/left/right by pixel amount |
| Scroll a specific element into view ( |
Dialog (2)
Tool | Description |
| Pre-set accept/dismiss for the next alert/confirm/prompt on any open tab (first dialog wins, then disarms) |
| PERSISTENT handler — stays armed across every dialog and every tab, including popups. |
Accessibility (1)
Tool | Description |
| Accessibility tree for LLM understanding |
Console & Network (5)
Tool | Description |
| Capture and retrieve browser console messages. Capture spans all tabs and follows newly opened tabs/popups (re-calling |
| Capture network requests across all tabs (follows tab switches + popups). |
| Full request + response (headers + text body) for one captured request by |
Compound (reduce round-trips) (4)
Tool | Description |
| Wait for selector/text + return snapshot in one call |
| Navigate back + return snapshot |
| Reload page + return snapshot |
| Click + wait + return snapshot. Perfect for buttons that trigger navigation. |
Smart Selectors (skip snapshot) (3)
Tool | Description |
| Find by visible text — returns every match with a ref, ancestor path and total, so you can see whether the one you'd click is the one you mean. Supports |
| Find input by label text, returns ref (lists all candidates if several match). Supports |
| Find input by placeholder, returns ref (lists all candidates if several match). Supports |
Session Portability (7)
Tool | Description |
| Export all cookies as JSON (for transfer) |
| Import cookies from JSON (restore session) |
| Write all cookies to a JSON file (Playwright format) |
| Load cookies from a JSON file (Playwright format) |
| Save cookies + localStorage + sessionStorage to JSON file. Reload to skip login/CF. |
| Restore session from JSON (cookies + storage). Use |
| Convenience: save current session to |
Humanize / Anti-Bot (5)
Tool | Description |
| 3-step Bezier mouse approach + small jitter before click. Scrolls the target into view first (a real mouse click can't reach an off-screen element). Use for CF/DataDome pages. |
| Gaussian-distributed keystroke delays (mean 80ms, sigma 30ms). Mimics human rhythm. |
| Random mouse movements over duration — builds mouse history before action. |
| Capture human mouse path then replay (anti-bot gold). |
Session Warmup & Detection (2)
Tool | Description |
| Visit Google/Wikipedia (random) before targeting protected site. Helps IP scoring. |
| Heuristic detection of CF/DataDome/Akamai/PerimeterX/Imperva/reCAPTCHA/hCaptcha. |
Assertions (4)
Tool | Description |
| PASS/FAIL — element exists and is visible |
| PASS/FAIL — text substring on page |
| PASS/FAIL — URL matches pattern (substring or regex) |
| Hit-test without clicking: would a real click land? Names the element that would intercept it |
Workflow Helpers (3)
Tool | Description |
| Click + wait for navigation/selector atomically (fewer roundtrips) |
| Wait until there are zero in-flight requests for |
| Compact LLM-friendly summary (title, h1, buttons, links, forms) + |
Scraping & Extraction (4)
Tool | Description |
| Auto-detect repeated content (cards, listings) and suggest CSS selectors. Run this before |
| Extract data from repeated elements as clean JSON. Auto-deduplicates, filters empties, |
| Extract HTML table as JSON array with auto-detected headers |
| Smart scraper: auto-extract main content (strips nav/footer), links, meta, headings. Smart truncation at paragraph boundary. |
Browserless HTTP (4)
The browser is the expensive path. impit (already shipped with camoufox-js) speaks a real Firefox TLS/HTTP2 fingerprint, so these tools fetch without launching anything — and the fingerprint matches the browser this server actually drives. Verified against a Cloudflare-protected site that these tools cleared without opening a browser at all.
No
web_search/deep_researchhere by design: scraping a SERP without an API key returns confidently wrong results for whole classes of query (Bing answers any "how does …" question with dictionary pages) and one major engine is TLS-blocked by some ISPs. A search tool that fails silently is worse than none — use your client's own search (WebSearch/Exa/Tavily) and feed the URLs toscrape_markdown.
Tool | Description |
| HTTP with a real Firefox TLS fingerprint, reusing the live browser's cookies by default — log in with the browser, then hit the site's API cheaply |
| Show which browser cookies would be sent to a URL (verify session sharing before relying on it) |
| One URL → clean LLM-ready markdown (headings/links/lists kept, nav/footer/scripts stripped). Browserless by default, |
| Tries HTTP first, escalates to the stealth browser only when the response looks anti-bot blocked. The efficiency core |
Storage Inspection (4)
Tool | Description |
| Capture cookies + localStorage + sessionStorage into a named slot |
| Diff current state against that slot — the fastest way to find which key holds a session token |
| List IndexedDB databases for the origin (where many SPAs hide auth state) |
| Delete an IndexedDB database by name |
Debug (5)
Tool | Description |
| Health check: browser status, tabs, URL |
| Uncaught JS errors + unhandled promise rejections, captured by a hook installed at |
| Export captured traffic as a valid HAR 1.2 file (opens in DevTools). Needs |
| Element count, page size, load metrics + extraction strategy recommendation |
| TTFB, DOMContentLoaded, load, FCP, LCP + the 5 slowest resources (CLS is unavailable — Firefox has no layout-shift API) |
Site Automation (2)
Tool | Description |
| End-to-end image generation/edit on chatgpt.com in one call: fresh chat → optional reference-image upload → prompt → wait for the finished image → save PNG to |
| Many images in parallel (one tab per job, submit-all-then-collect). |
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 NextFill 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_lengthManage 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
humanizemode 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
Path | Contents |
| Browser profile (cookies, localStorage, cache) |
| Screenshots, PDFs, HAR exports |
Reset everything: rm -rf ~/.camoufox-mcp/ — or call the reset_profile tool (browser must be closed first).
Switching between accounts on the same domain
The default profile persists across browser_close calls, so the next login on the same domain inherits cookies + session — sometimes redirecting to the wrong account. Two options:
browser_launch(fresh_profile=true)— uses a temp profile dir that's removed onbrowser_close. Best for one-off logins.reset_profile(browser must be closed) — wipes the shared profile entirely.
Troubleshooting
Problem | Fix |
"Browser not running" | Call |
Click blocked by overlay | A synthetic pointer-event fallback fires and the response warns you ( |
Clicked the wrong "Cancel"/"Save" |
|
Click on a Radix/Headless UI/MUI option did nothing | The real click was blocked and the old fallback used a bare |
Login gone after |
|
Stale refs after navigation | Call |
Window too large |
|
First launch slow | Downloading Camoufox binary (~80MB). Happens once. |
Huge snapshot output | Normal for big pages. Use |
iframe not accessible | Use |
CAPTCHA appears | Cannot auto-solve. Use |
Login lands on wrong account | Profile carry-over. Use |
Need a PDF |
|
Field value looks concatenated | Fixed — |
| Fixed — it now scrolls the element into view and errors if the element is outside the viewport. |
MCP server silently dies | If you ran |
License
MIT
Built by RobithYusuf
This server cannot be installed
Maintenance
Resources
Unclaimed servers have limited discoverability.
Looking for Admin?
If you are the server author, to access and configure the admin panel.
Related MCP Servers
- AlicenseNot gradedqualityCmaintenanceAn MCP server for stealth browser automation that uses human-like interaction patterns to bypass bot detection via the Chrome DevTools Protocol. It enables users to navigate, interact with elements, and capture data from websites using undetectable behaviors like Bezier mouse movements and Gaussian typing delays.1801MIT
- AlicenseAqualityDmaintenanceAn MCP server that provides LLMs with stealth browser automation capabilities via CloakBrowser to bypass bot detection services like Cloudflare and reCAPTCHA. It supports full page interaction, content extraction, and human-like behavior through 30 specialized tools.2012Apache 2.0
- -licenseNot gradedqualityNot gradedmaintenanceUndetectable browser automation server for MCP-compatible AI agents, offering 225 tools across 32 sections to navigate, extract, clone pages, and bypass antibot systems like Cloudflare.1
- AlicenseAqualityFmaintenanceA stealth browser automation MCP server that wraps CloakBrowser's patched Chromium to bypass bot detection, providing 22 tools for web navigation, interaction, and session management.241MIT
Related MCP Connectors
Stealth web browser for agents: search, fetch, click and type through persistent sessions over MCP.
Stealth scraping & search. Bypasses Cloudflare, DataDome & LinkedIn via Cyborg HITL approach.
Browser MCP for logged-in tasks. Uses your Chrome — credentials stay local. Zero-token replay.
Latest Blog Posts
- Who's Calling? MCP Hosts Are an Identity Blind Spot (And the Spec Knows It)By Om-Shree-0709 on .mcpAgent IdentityOAuth 2.1
- Your AI Chatbot Just Exposed Your CEO's Salary to an InternBy Om-Shree-0709 on .Agent IdentityMCP SecurityOAuth Delegation
- Why MCP Servers Need Execution Sandboxing (And Why Your Current Stack Isn't Enough)By Om-Shree-0709 on .Agentic AiPrompt InjectionWebAssembly
MCP directory API
We provide all the information about MCP servers via our MCP API.
curl -X GET 'https://glama.ai/api/mcp/v1/servers/RobithYusuf/mcp-camoufox'
If you have feedback or need assistance with the MCP directory API, please join our Discord server