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.
README
<div align="center">
<img src="https://i.imgur.com/enUBkXt.png" alt="Camoufox" width="280">
MCP Camoufox
</div>
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 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 |
| mcp-camoufox | 79 | Yes | Yes | Yes |
Setup
<details> <summary><b>Claude Code</b></summary>
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
</details>
<details> <summary><b>Claude Desktop</b></summary>
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. </details>
<details> <summary><b>Cursor</b></summary>
Global — Preferences > Features > MCP, or ~/.cursor/mcp.json:
Project — .cursor/mcp.json in project root:
{
"mcpServers": {
"camoufox": {
"command": "npx",
"args": ["-y", "mcp-camoufox@latest"]
}
}
}
</details>
<details> <summary><b>Windsurf</b></summary>
Global — ~/.windsurf/mcp.json:
Project — .windsurf/mcp.json in project root:
{
"servers": {
"camoufox": {
"command": "npx",
"args": ["-y", "mcp-camoufox@latest"]
}
}
}
</details>
<details> <summary><b>VS Code (Continue / Cline / Kilo Code)</b></summary>
Global — VS Code settings or ~/.continue/config.json:
Project — .vscode/mcp.json in project root:
{
"mcpServers": {
"camoufox": {
"command": "npx",
"args": ["-y", "mcp-camoufox@latest"]
}
}
}
</details>
<details> <summary><b>Factory (Droid)</b></summary>
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"
</details>
<details> <summary><b>OpenCode</b></summary>
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. </details>
<details> <summary><b>Trae (ByteDance)</b></summary>
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. </details>
<details> <summary><b>Antigravity (Google)</b></summary>
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. </details>
Requirements
| Requirement | Version | Check |
|---|---|---|
| Node.js | 18+ | node --version |
That's all. Camoufox browser binary (~80MB) downloads automatically on first launch.
All 79 Tools
Browser Lifecycle (2)
| Tool | Description |
|---|---|
browser_launch |
Launch stealth browser. Options: url, headless, humanize, geoip, locale, width, height |
browser_close |
Close browser. Cookies preserved in profile. |
Navigation (4)
| Tool | Description |
|---|---|
navigate |
Go to URL. Options: wait_until (domcontentloaded/load/networkidle), timeout |
go_back |
Back in history |
go_forward |
Forward in history |
reload |
Reload page |
DOM & Content (6)
| Tool | Description |
|---|---|
browser_snapshot |
Get interactive elements with ref IDs. Call after every navigation. |
screenshot |
Capture viewport or full page. Options: name, full_page |
get_text |
Text from page or selector (max 5000 chars) |
get_html |
HTML from page or selector (max 10000 chars) |
get_url |
Current URL + title |
save_pdf |
Export page as PDF |
Element Interaction (9)
| Tool | Description |
|---|---|
click |
Click by ref ID. Auto JS-fallback for overlays. Options: button, dblclick |
click_text |
Click by visible text. Options: exact |
click_role |
Click by ARIA role + name |
hover |
Hover over element |
fill |
Fill input/textarea (clears first) |
select_option |
Select from dropdown |
check / uncheck |
Toggle checkbox/radio |
upload_file |
Upload file to input |
Keyboard (2)
| Tool | Description |
|---|---|
type_text |
Type char by char. Options: delay. For OTP, masked inputs, date pickers. |
press_key |
Key or combo: Enter, Escape, Tab, Control+a, Meta+c |
Mouse XY (3)
| Tool | Description |
|---|---|
mouse_click_xy |
Click at exact coordinates |
mouse_move |
Move cursor to coordinates |
drag_and_drop |
Drag between two elements |
Wait (4)
| Tool | Description |
|---|---|
wait_for |
Wait for selector or text (visible/hidden/attached/detached) |
wait_for_navigation |
Wait for page load |
wait_for_url |
Wait for URL pattern match |
wait_for_response |
Wait for network response pattern |
Tabs (4)
| Tool | Description |
|---|---|
tab_list |
List all tabs |
tab_new |
Open new tab |
tab_select |
Switch tab |
tab_close |
Close tab |
Cookies (3)
| Tool | Description |
|---|---|
cookie_list |
List cookies. Options: domain filter |
cookie_set |
Set cookie |
cookie_delete |
Delete by name/domain. Empty = clear all. |
Local Storage (3)
| Tool | Description |
|---|---|
localstorage_get |
Get all or specific key |
localstorage_set |
Set key-value |
localstorage_clear |
Clear all |
Session Storage (2)
| Tool | Description |
|---|---|
sessionstorage_get |
Get all or specific key |
sessionstorage_set |
Set key-value |
JavaScript (2)
| Tool | Description |
|---|---|
evaluate |
Run JS in page context |
inject_init_script |
Inject script that runs on every page load |
Element Inspection (4)
| Tool | Description |
|---|---|
inspect_element |
Full element info: tag, attributes, box, styles |
get_attribute |
Get specific attribute |
query_selector_all |
Query multiple elements by CSS selector |
get_links |
Get all links with URL + text. Options: filter |
Frames (2)
| Tool | Description |
|---|---|
list_frames |
List all frames/iframes |
frame_evaluate |
Run JS inside a frame |
Batch Operations (3)
| Tool | Description |
|---|---|
batch_actions |
Multiple actions in one call (click, fill, type, press, wait) |
fill_form |
Fill multiple fields + optional submit |
navigate_and_snapshot |
Navigate + snapshot in one call |
Viewport (2)
| Tool | Description |
|---|---|
get_viewport_size |
Get width x height |
set_viewport_size |
Set dimensions |
Scroll (1)
| Tool | Description |
|---|---|
scroll |
Scroll up/down/left/right by pixel amount |
Dialog (1)
| Tool | Description |
|---|---|
dialog_handle |
Pre-set accept/dismiss for next alert/confirm/prompt |
Accessibility (1)
| Tool | Description |
|---|---|
accessibility_snapshot |
Accessibility tree for LLM understanding |
Console & Network (4)
| Tool | Description |
|---|---|
console_start / console_get |
Capture and retrieve browser console messages |
network_start / network_get |
Capture and retrieve network requests |
Compound (reduce round-trips) (4)
| Tool | Description |
|---|---|
wait_and_snapshot |
Wait for selector/text + return snapshot in one call |
back_and_snapshot |
Navigate back + return snapshot |
reload_and_snapshot |
Reload page + return snapshot |
click_and_snapshot |
Click + wait + return snapshot. Perfect for buttons that trigger navigation. |
Smart Selectors (skip snapshot) (3)
| Tool | Description |
|---|---|
find_by_text |
Find element by visible text, returns ref. Skip browser_snapshot when you know exact text. |
find_by_label |
Find input by label text, returns ref. |
find_by_placeholder |
Find input by placeholder, returns ref. |
Session Portability (2)
| Tool | Description |
|---|---|
cookie_export |
Export all cookies as JSON (for transfer) |
cookie_import |
Import cookies from JSON (restore session) |
Scraping & Extraction (4)
| Tool | Description |
|---|---|
detect_content_pattern |
Auto-detect repeated content (cards, listings) and suggest CSS selectors. Run this before extract_structured. |
extract_structured |
Extract data from repeated elements as clean JSON. Auto-deduplicates, filters empties, direct_text_only prevents field mixing. |
extract_table |
Extract HTML table as JSON array with auto-detected headers |
scrape_page |
Smart scraper: auto-extract main content (strips nav/footer), links, meta, headings. Smart truncation at paragraph boundary. |
Debug (4)
| Tool | Description |
|---|---|
server_status |
Health check: browser status, tabs, URL |
get_page_errors |
JS errors from page |
export_har |
Export network traffic as HAR file |
page_stats |
Element 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
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 |
|---|---|
~/.camoufox-mcp/profile/ |
Browser profile (cookies, localStorage, cache) |
~/.camoufox-mcp/screenshots/ |
Screenshots, PDFs, HAR exports |
Reset everything: rm -rf ~/.camoufox-mcp/
Troubleshooting
| Problem | Fix |
|---|---|
| "Browser not running" | Call browser_launch first |
| Click blocked by overlay | Auto JS-fallback handles it. Or press_key("Escape") first. |
| Stale refs after navigation | Call browser_snapshot again — refs regenerate each time |
| Window too large | browser_launch(width=1024, height=768) |
| First launch slow | Downloading Camoufox binary (~80MB). Happens once. |
| Huge snapshot output | Normal for big pages. Use get_text or evaluate instead. |
| iframe not accessible | Use list_frames + frame_evaluate |
| CAPTCHA appears | Cannot auto-solve. Use headless=false and solve manually. |
License
MIT
Built by RobithYusuf
推荐服务器
Baidu Map
百度地图核心API现已全面兼容MCP协议,是国内首家兼容MCP协议的地图服务商。
Playwright MCP Server
一个模型上下文协议服务器,它使大型语言模型能够通过结构化的可访问性快照与网页进行交互,而无需视觉模型或屏幕截图。
Magic Component Platform (MCP)
一个由人工智能驱动的工具,可以从自然语言描述生成现代化的用户界面组件,并与流行的集成开发环境(IDE)集成,从而简化用户界面开发流程。
Audiense Insights MCP Server
通过模型上下文协议启用与 Audiense Insights 账户的交互,从而促进营销洞察和受众数据的提取和分析,包括人口统计信息、行为和影响者互动。
VeyraX
一个单一的 MCP 工具,连接你所有喜爱的工具:Gmail、日历以及其他 40 多个工具。
graphlit-mcp-server
模型上下文协议 (MCP) 服务器实现了 MCP 客户端与 Graphlit 服务之间的集成。 除了网络爬取之外,还可以将任何内容(从 Slack 到 Gmail 再到播客订阅源)导入到 Graphlit 项目中,然后从 MCP 客户端检索相关内容。
Kagi MCP Server
一个 MCP 服务器,集成了 Kagi 搜索功能和 Claude AI,使 Claude 能够在回答需要最新信息的问题时执行实时网络搜索。
e2b-mcp-server
使用 MCP 通过 e2b 运行代码。
Neon MCP Server
用于与 Neon 管理 API 和数据库交互的 MCP 服务器
Exa MCP Server
模型上下文协议(MCP)服务器允许像 Claude 这样的 AI 助手使用 Exa AI 搜索 API 进行网络搜索。这种设置允许 AI 模型以安全和受控的方式获取实时的网络信息。