camoufox-versatile-mcp
Server Configuration
Describes the environment variables required to run the server.
| Name | Required | Description | Default |
|---|---|---|---|
No arguments | |||
Capabilities
Features and capabilities supported by this server
| Capability | Details |
|---|---|
| tools | {
"listChanged": false
} |
| prompts | {
"listChanged": false
} |
| resources | {
"subscribe": false,
"listChanged": false
} |
| experimental | {} |
Tools
Functions exposed to the LLM to take actions
| Name | Description |
|---|---|
| launch_browserA | Launch the Camoufox anti-detection browser. The trio of |
| close_browserA | Close the Camoufox browser and release all resources. |
| navigateA | Navigate to a URL, with optional hook pre-injection and captcha challenge auto-solve. Args:
url: Target URL.
wait_until: "load", "domcontentloaded", or "networkidle".
pre_inject_hooks: Hook preset names to register before navigation.
collect_response_chain: Record responses for final_status resolution.
clear_network_capture: Clear stale network buffer before navigating.
auto_solve_challenge: After the page loads, run auto_solve_captcha if a
captcha challenge is detected. Built-in alternative to the
project's test.py flow.
captcha_type: Captcha provider (default "cloudflare"). Future-proof:
new providers supported by Returns: dict with url, title, initial_status, final_status, redirect_chain, hooks_injected, reloaded, challenge (detection + solve result when auto_solve_challenge=True), warnings. |
| reloadA | Reload the current page, preserving any init scripts. |
| take_screenshotC | Take a screenshot of the current page or a specific element. |
| take_snapshotB | Get the accessibility tree of the current page (token-efficient). |
| clickC | Click on a page element. |
| type_textC | Type text into an input field with realistic keystroke delays. |
| wait_forC | Wait for an element to appear or a network request matching a URL pattern. |
| get_page_infoA | Get current page URL, title, and viewport size. |
| reset_browser_stateC | Reset MCP-side browser residual state without closing the browser. |
| scriptsD | Script inspection. |
| search_codeC | Search keyword in loaded scripts. |
| evaluate_jsC | Execute an arbitrary JavaScript expression in the page context and return the result. |
| hook_functionD | Hook or trace a function. |
| inject_hook_presetC | Inject a pre-built hook template for common reverse engineering tasks. |
| remove_hooksC | Remove installed hooks and restore original objects. |
| get_console_logsC | Get console output collected from the page. |
| network_captureD | Unified network capture control. |
| list_network_requestsC | List captured network requests with optional filters. |
| get_network_requestC | Get full details of a specific captured network request. |
| get_request_initiatorC | Get the JS call stack that initiated a network request. |
| intercept_requestD | Intercept network requests matching a pattern. |
| cookiesD | Cookie management. |
| get_storageC | Get the contents of localStorage or sessionStorage. |
| export_stateC | Export the complete browser state to a JSON file. |
| import_stateC | Import browser state from a JSON file by creating a new context. |
| hook_jsvmp_interpreterC | Install a JSVMP runtime probe. |
| compare_envC | Collect browser environment fingerprint data for comparison with Node.js/jsdom. |
| instrumentationD | – |
| check_environmentB | One-stop self-check of MCP environment, dependencies, and browser state. |
| verify_signer_offlineA | Verify a signing function against known samples (offline, no browser needed). Args: signer_code: JavaScript code that exports a signing function. Must be a function expression or arrow function: e.g. "(s) => mySign(s)" samples: List of samples, each with expected request/response pairs: [{"id": "r1", "input": {...}, "expected": {"X-Bogus": "..."}}] Returns: dict with overall passed/failed, per-sample results, and first mismatch. |
| trace_property_accessC | Engine-level DOM property access tracing (JSVMP-undetectable). |
| list_trace_filesC | List all trace files on disk. |
| query_trace_fileC | Query a specific historical trace file. |
| auto_solve_captchaA | Auto-detect and solve a captcha challenge on the current page. Wraps Args:
captcha_type: Captcha provider, e.g. "cloudflare". The library is
future-proof; new providers (hcaptcha, recaptcha, ...) will be
supported as Returns: dict with detected, challenge_type_used, solved, attempts, verified, final_url, error (if any). |
| detect_captchaA | Detect whether a captcha challenge is currently shown. Lightweight probe: returns detection flags without attempting to solve anything. Useful when you want to decide whether to call auto_solve_captcha. Args: captcha_type: Captcha provider to probe, e.g. "cloudflare". Returns: dict with provider-specific detection flags and the current URL. For "cloudflare" today: {turnstile: bool, interstitial: bool}. Other providers will report under their own keys. |
| detect_vmpA | Detect what kind of JavaScript VM Protection the page is running. Returns a structured report with This is purely read-only: no hooks are installed, no scripts are rewritten. |
| trace_vmp_for_signA | Install a signature-safe tap and record what the VMP reads. Args: properties: list of property names to watch on navigator/screen/history/ location prototypes. If empty, uses a default high-signal set. trigger_js: optional JS expression to evaluate AFTER the tap is installed, to actually invoke the VMP (e.g. "sign(payload)"). max_entries: cap on the recorded log. track_calls: also instrument Date.now / etc. clear_log: clear any previous tap log first. wait_ms: extra delay after trigger_js before reading the log. Returns: dict with the tap summary, count of recorded reads, and a condensed view of the VMP's reads (prop -> latest value preview). |
| get_tap_logC | Read what was recorded by trace_vmp_for_sign. |
| disassemble_wasmA | Disassemble a WebAssembly binary to text (wat) + summarize imports/exports. Args:
wasm_source:
- if source_kind=='base64': base64-encoded wasm bytes
- if source_kind=='hex': hex-encoded wasm bytes
- if source_kind=='url': a URL to fetch the wasm from (uses the
active page so cookies / headers apply)
source_kind: see above.
generate_wat: if True, run wabt to produce WAT. Falls back to exports
+ imports only when wabt is unavailable.
auto_install_wabt: if True and wabt is missing, attempt Returns: dict with imports, exports, optional wat text, and entry-function candidates (for replay_vmp_offline). |
| capture_worker_jsA | Patch the page's Worker constructor and record every Worker created. Use this when VMP bytecode is delivered via a Web Worker (e.g. the page
does Returns: dict with workers[] (id, url, source_preview if blob:), events[]. |
| capture_ws_payloadsA | Patch the page's WebSocket constructor and record every connection's send/recv. Use this when VMP fetches its bytecode over WebSocket (e.g. an onmessage pushes an opaque blob that is then assembled into a Worker or eval'd). Args: duration_ms: how long to keep the patch alive after install. url_filter: if set, only record connections whose URL contains this string. max_events: ring buffer cap. Returns: dict with connections[] (url, sent[], received[]), events[]. |
| auto_suggest_missing_propsA | Given a trace log (or just an error string), guess which props a Node-side VMP replay is missing. This combines two signals:
Args: trace_log: the entries returned by trace_vmp_for_sign/get_tap_log (optional). If absent, only the curated list is returned. failed_replay_error: the error string from a previous failed replay_vmp_offline call (e.g. "ReferenceError: navigator is not defined"). Used to extract additional hints. supplied_env: dict of props you've already fed to replay. We won't suggest these. Returns:
dict with |
| replay_vmp_offlineA | Run captured VMP code in headless Node and call the entry function. Useful for verifying you've correctly extracted the signing algorithm: call the VMP's signing function with the inputs a real request would use, and check that the output matches what the browser actually sent. Args: vmp_code: The JavaScript source that defines the VMP / sign function. entry: The name of the function exported on global that we should call. input: A dict to pass to the entry function. Will be JSON-serialized and re-parsed inside the Node sandbox. timeout_ms: VM timeout. JS that runs longer triggers a V8 timeout error. expected_sign: optional reference sign captured from the browser. When set and auto_diff is True, the response includes a structured diff (match / common_prefix_len / first_diff_idx). auto_diff: if True and expected_sign is set, compute a structured diff. supplied_env: optional dict merged into the sandbox before the VMP code runs. Use this to feed navigator.userAgent, screen.width, Date.now(), document.cookie etc. (see auto_suggest_missing_props). Returns: dict with status, output, elapsed_ms, optional diff, and optional suggestion hint when outputs don't match. |
Prompts
Interactive templates invoked by user choice
| Name | Description |
|---|---|
No prompts | |
Resources
Contextual data attached and managed by the client
| Name | Description |
|---|---|
No resources | |
Latest Blog Posts
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/usernamexiaozhang/camoufox-versatile-mcp'
If you have feedback or need assistance with the MCP directory API, please join our Discord server