Skip to main content
Glama

💡 What is Mithwire MCP?

mithwire is a driverless CDP browser automation engine for Python. Mithwire MCP is the Model Context Protocol server that exposes Mithwire's browser control, DOM inspection, and environment-emulation capabilities directly to AI clients such as Claude, Cursor, and autonomous coding agents.

Instead of manually writing fragile browser-automation glue code, you can connect the MCP server to an AI agent to build, execute, test, and debug web workflows interactively.

Your AI agent can invoke structured MCP tools (session_start, browser_navigate, browser_click, browser_snapshot, browser_network_requests) to explore pages, verify UI flows, capture console and network logs, and inspect DOM state in real time.


Related MCP server: Browser-MCP Navigator

🛠️ Built for Developing & Debugging Automations

Mithwire MCP was designed as an interactive development and QA harness for AI agents and developers:

  • 🤖 Autonomous Workflow Authoring: Give your AI agent a high-level goal ("Verify the checkout flow and capture any network errors"). The agent uses MCP tools to navigate, inspect selectors, verify state, and iterate until the test passes.

  • 🔍 Live Inspection & Diagnostics: Agents can capture interactive DOM snapshots, monitor JavaScript console errors, record full CDP network traces, and inspect storage/cookies at any point during execution.

  • 🖥️ Visual VNC Debugging: Pre-packaged with an embedded noVNC web viewer (http://localhost:6080/vnc.html). Watch your AI agent interact with the browser live in your desktop browser.

  • 🧪 E2E & Localization Testing: Prototype and debug end-to-end browser tests across timezones, locales, and proxy egress locations.


💥 Why Driverless CDP Matters for AI Agents

When AI agents run browser workflows using legacy WebDriver stacks or stateless fetchers, several common failure modes arise:

  • ❌ WebDriver Artifacts & Drift: Standard WebDriver binaries inject navigator.webdriver = true and driver globals, and document-level JS shims fail to propagate to Web Workers and HTTP Client Hints.

  • ❌ Proxy & Locale Mismatches: Testing through regional proxies without aligning timezone, locale, and WebRTC settings causes inconsistent localization state.

  • ❌ State Loss Across Turns: AI agents frequently lose cookies, session state, or local storage between execution turns or subagent invocations.


🛡️ The Mithwire MCP Architecture

Mithwire MCP addresses these challenges natively for AI agent workflows:

  1. ⚡ Driverless CDP Engine: Built on Mithwire—speaks raw Chrome DevTools Protocol with no WebDriver or Selenium dependency.

  2. 🔧 Dual Engine Modes: Support for both standard cdp mode (stock Chrome/Chromium) and source-patched stealth mode (CloakBrowser) for cross-OS environment emulation.

  3. 🌍 Automatic Proxy & Egress Alignment: Validates proxy connectivity before launching Chromium and optionally aligns timezone, locale, languages, and geolocation to match the proxy region.

  4. 👤 Persistent Profiles & State Store: Reusable browser profiles (profiles/) store cookies, localStorage, proxy bindings, and environment configurations across agent runs.

  5. 🔒 WebRTC Leak Protection: Configurable STUN/UDP candidate filtering to prevent host interface leaks during proxied testing.


⚡ Engine Modes & Capabilities

Configure execution engines on a per-session or per-profile basis:

Engine Mode

Binary

Capabilities

Best Suited For

cdp (Default)

Stock Chrome / Chromium

Fast, reliable CDP Emulation overrides for timezone, locale, geo, UA, platform, and device metrics.

Local workstations, remote Linux servers, E2E testing, fast script prototyping.

stealth

CloakBrowser

C++ source-level configuration for Canvas, WebGL GPU strings, AudioContext, native fonts, and viewport geometry.

Cross-OS environment emulation on Linux servers and browser-fingerprint consistency research.


✨ Key Features & Capabilities

  • 🤖 Complete Agent Toolset: Full toolsuite covering navigation, DOM querying, clicking, typing, scrolling, screenshots, network capture, and JS evaluation.

  • 🗂️ Centralized State Store: Default ~/.mithwire-mcp directory manages persistent profiles, proxy registries, and cookie import/export files.

  • 🛰️ Proxy Registry & Alignment: Store proxy configurations once and reference them by name, with optional pre-flight connectivity and locale alignment.

  • 🐳 Docker-Ready with Visual Debugging: Pre-configured Docker container with Xvfb, Chromium, and noVNC web viewer (http://localhost:6080/vnc.html).


🚀 Installation

# Standard install (CDP mode)
pip install mithwire-mcp

# With source-patched Chromium support (CloakBrowser)
pip install "mithwire-mcp[stealth]"

💻 MCP Client Configuration

Add Mithwire MCP to your MCP client config (e.g. Cursor, Claude Desktop):

{
  "mcpServers": {
    "mithwire-mcp": {
      "command": "mithwire-mcp",
      "args": ["--transport", "stdio"]
    }
  }
}

🐳 Running in Docker (With Visual VNC Debugging)

For isolated execution or local visual observation:

# Pull public Docker image
docker pull ghcr.io/elendil-tech/mithwire-mcp:latest

# Run local dev container with noVNC enabled
docker compose -f docker-compose.dev.yml up -d --build

Endpoints:

  • 🔌 MCP Server (Streamable HTTP): http://localhost:7867

  • 🖥️ noVNC Visual Viewer: http://localhost:6080/vnc.html


🧰 Available MCP Tools Reference

  • session_start - Launch a new browser session (ephemeral or persistent profile)

  • session_list - List active browser sessions

  • session_get - Get session status and identity metadata

  • session_set_fingerprint - Override the active session environment fingerprint

  • session_rotate_proxy - Rotate the proxy exit IP and optionally re-align locale/timezone

  • session_state_paths - Show state directory layout (profiles, proxies, cookies)

  • session_set_policy / session_get_policy - Set or read per-session security policy

  • session_set_download_dir - Change the session download directory

  • session_warmup - Visit initial pages to initialize session state

  • session_stop - Close a specific session

  • session_stop_all - Terminate all running sessions

  • session_profile_list / session_profile_get / session_profile_set / session_profile_delete - CRUD for persistent profiles

  • session_profile_regenerate_fingerprint - Regenerate a profile's fingerprint via BrowserForge

  • session_proxy_list / session_proxy_get / session_proxy_set / session_proxy_delete - Proxy registry CRUD

  • browser_url - Get the current page URL

  • browser_navigate / browser_back / browser_forward / browser_reload - Navigation

  • browser_snapshot - Take interactive DOM snapshot with element references

  • browser_query - Find elements by CSS selector or text

  • browser_click / browser_mouse_click / browser_mouse_move / browser_press_hold / browser_type - User interactions

  • browser_scroll - Scroll the page or an element

  • browser_handle_dialog - Accept or dismiss browser dialogs

  • browser_set_file_input - Set files on a file input element

  • browser_take_screenshot - Capture page screenshot

  • browser_tab_list / browser_tab_current - List open tabs or get the active tab

  • browser_tab_new / browser_tab_switch / browser_tab_close - Create, switch, or close tabs

  • browser_wait - Wait for a fixed duration

  • browser_wait_for_selector - Wait until a CSS selector appears

  • browser_wait_for_text - Wait until text appears on the page

  • browser_wait_for_url - Wait until the URL matches a pattern

  • browser_wait_for_function - Wait until a JS expression returns truthy

  • browser_wait_for_network_idle - Wait until network activity settles

  • browser_cookies_get / browser_cookies_set / browser_cookies_save / browser_cookies_clear

  • browser_storage_get / browser_storage_set / browser_storage_clear

  • browser_console_messages - Read captured console log messages

  • browser_network_requests - List captured network requests

  • browser_network_capture_start / browser_network_capture_get / browser_network_capture_stop / browser_network_capture_status

  • browser_downloads - List downloaded files

  • browser_html - Get the raw HTML of the current page or an element

  • browser_evaluate - Execute arbitrary JavaScript in the page context

  • session_trace_start / session_trace_stop / session_trace_get - Record and inspect CDP traces

  • session_trace_export / session_trace_replay - Export or replay recorded traces


🧹 Deterministic Process Lifecycle (No Orphaned Chrome)

Every session owns the Chrome process it launched, and the server guarantees none outlives it:

  • A session_start that fails, times out, or is cancelled by the client tears down its half-started browser.

  • session_stop, session_stop_all, and server shutdown close browsers concurrently and delete their temporary profiles.

  • On SIGTERM/SIGHUP/SIGINT the server stops every browser immediately and exits cleanly.

  • If the server itself is killed outright (SIGKILL, OOM, a crash), a lightweight watchdog process from the engine terminates its launched browsers and removes their temporary profiles. Set MITHWIRE_NO_EXIT_GUARD=1 to disable it.

scripts/smoke_process_lifecycle.py verifies all of these guarantees against a real stdio server and a local Chrome instance in CI.


⚖️ Dual-Use & Responsible Use Notice

Mithwire MCP is a dual-use browser automation and debugging bridge intended for interactive software testing, QA validation, browser-fingerprint research, and authorized AI agent workflows.

  • Authorized Use Only: Users are responsible for complying with applicable laws and the Terms of Service of any websites or systems accessed through this MCP server.

  • No Unlawful Circumvention or Abuse: This software must not be used for unauthorized access, credential stuffing, spam, coordinated inauthentic activity, or disrupting third-party services.

  • Security & Abuse Contact: To report a security vulnerability or a third-party abuse inquiry, please see SECURITY.md.


📜 License

Distributed under the MIT License. Powered by mithwire (AGPL-3.0).

Available Tools

70 tools
browser_backC

Navigate one step back in browser history.

Inputs: session_id (required), wait_seconds. Returns: object

browser_clickC

Click the first matching selector.

Inputs: selector (required), session_id (required), wait_seconds. Returns: object

browser_console_messagesC

Read captured in-page console messages.

Inputs: session_id (required), clear, limit. Returns: object

browser_cookies_clearC

Clear cookies (all or by domain).

Inputs: session_id (required), domain. Returns: object

browser_cookies_getC

Get all cookies visible to current browser context.

Inputs: session_id (required), domain, timeout_seconds. Returns: object

browser_cookies_saveC

Save current cookies to a JSON file.

Inputs: session_id (required), output_path (required), domain, wrap_object, +2 more. Returns: object

browser_cookies_setC

Set cookies into current browser context.

Inputs: cookies (required), session_id (required), fallback_domain. Returns: object

browser_downloadsC

Read captured download metadata.

Inputs: session_id (required), clear, limit. Returns: object

browser_evaluateC

Evaluate JavaScript in current page.

Inputs: script (required), session_id (required). Returns: object

browser_forwardC

Navigate one step forward in browser history.

Inputs: session_id (required), wait_seconds. Returns: object

browser_handle_dialogC

Set how the next JavaScript dialog should be handled.

Inputs: session_id (required), once, accept, prompt_text. Returns: object

browser_htmlC

Return current page HTML (optionally truncated).

Inputs: session_id (required), max_chars. Returns: object

browser_mouse_clickA

Native CDP coordinate click at viewport pixel position (x, y). Unlike browser_click (which uses a CSS selector and JS el.click()), this dispatches Input.dispatchMouseEvent through the browser's input pipeline, producing isTrusted events. Use when you need to click by coordinates — e.g. inside iframes or at positions obtained from screenshots/evaluation.

Inputs: x (required), y (required), session_id (required), button, +1 more. Returns: object

browser_mouse_moveB

Move the mouse cursor to viewport pixel position (x, y) via intermediate mouseMoved CDP events. Useful for creating cursor movement trails before a click or for hover interactions.

Inputs: x (required), y (required), session_id (required), steps. Returns: object

browser_navigateC

Navigate to a URL.

Inputs: url (required), session_id (required), wait_seconds. Returns: object

browser_network_capture_getC

Read CDP-level network capture rows.

Inputs: session_id (required), clear, limit, only_failures. Returns: object

browser_network_capture_startC

Start CDP-level network capture.

Inputs: session_id (required), url_regex, max_entries, include_headers, +1 more. Returns: object

browser_network_capture_statusC

Get CDP-level network capture status.

Inputs: session_id (required). Returns: object

browser_network_capture_stopC

Stop CDP-level network capture.

Inputs: session_id (required), clear. Returns: object

browser_network_requestsC

Read captured fetch/xhr request metadata.

Inputs: session_id (required), clear, limit. Returns: object

browser_press_holdA

Sustained mouse press at viewport pixel (x, y) for a given duration. Dispatches mousePressed, emits tiny mouseMoved jitter while holding, then mouseReleased. Use for press-and-hold verification challenges or long-press interactions.

Inputs: x (required), y (required), session_id (required), duration_ms, +1 more. Returns: object

browser_queryC

Query DOM elements by CSS selector.

Inputs: selector (required), session_id (required), limit. Returns: object

browser_reloadC

Reload the current page.

Inputs: session_id (required), ignore_cache, wait_seconds. Returns: object

browser_scrollC

Scroll page, to top, to bottom, or to selector.

Inputs: session_id (required), to_top, delta_y, selector, +2 more. Returns: object

browser_set_file_inputC

Attach local files to a file input selector.

Inputs: selector (required), file_paths (required), session_id (required), wait_seconds. Returns: object

browser_snapshotC

Return a compact snapshot of interactive elements on the page.

Inputs: session_id (required), limit. Returns: object

browser_solve_cloudflareB

Detect and solve a Cloudflare Turnstile challenge by clicking the verification checkbox.

Inputs: session_id (required), max_retries, timeout_seconds. Returns: object

browser_storage_clearC

Clear local/session storage.

Inputs: session_id (required), kind. Returns: object

browser_storage_getC

Get local/session storage values.

Inputs: session_id (required), kind. Returns: object

browser_storage_setC

Set local/session storage key/value entries.

Inputs: kind (required), entries (required), session_id (required), clear_first. Returns: object

browser_tab_closeC

Close a tab by tab_id or index.

Inputs: session_id (required), index, tab_id, switch_to. Returns: object

browser_tab_currentC

Get the active tab summary.

Inputs: session_id (required). Returns: object

browser_tab_listB

List open tabs and the active tab.

Inputs: session_id (required). Returns: object

browser_tab_newC

Open a new tab and optionally switch to it.

Inputs: session_id (required), url, switch, wait_seconds. Returns: object

browser_tab_switchC

Switch active tab by tab_id or index.

Inputs: session_id (required), index, tab_id, wait_seconds. Returns: object

browser_take_screenshotC

Capture a screenshot to disk.

Inputs: session_id (required), output_path (required), full_page, image_format. Returns: object

browser_typeC

Type text into an input selector.

Inputs: text (required), selector (required), session_id (required), clear, +2 more. Returns: object

browser_urlC

Get current URL and page title.

Inputs: session_id (required). Returns: object

browser_waitC

Wait for a number of seconds.

Inputs: session_id (required), seconds. Returns: object

browser_wait_for_functionC

Wait for a JavaScript expression to become truthy.

Inputs: script (required), session_id (required), timeout_seconds, poll_interval_seconds. Returns: object

browser_wait_for_network_idleC

Wait until in-page network activity is idle.

Inputs: session_id (required), idle_ms, max_inflight, timeout_seconds, +1 more. Returns: object

browser_wait_for_selectorC

Wait until selector appears or timeout.

Inputs: selector (required), session_id (required), timeout_seconds. Returns: object

browser_wait_for_textC

Wait until text appears in a selector.

Inputs: text (required), session_id (required), selector, case_sensitive, +2 more. Returns: object

browser_wait_for_urlC

Wait for URL substring or regex match.

Inputs: session_id (required), url_regex, url_contains, timeout_seconds, +1 more. Returns: object

session_getC

Get one session summary.

Inputs: session_id (required). Returns: object

session_get_policyC

Get runtime policy for one session.

Inputs: session_id (required). Returns: object

session_listB

List active browser sessions.

Inputs: no named parameters. Returns: object

session_profile_deleteC

Delete profile metadata or entire profile directory.

Inputs: profile (required), delete_user_data_dir. Returns: object

session_profile_getB

Get one saved profile by name or account alias.

Inputs: profile (required). Returns: object

session_profile_listB

List saved browser profiles.

Inputs: no named parameters. Returns: object

session_profile_regenerate_fingerprintB

Regenerate and persist a new fingerprint for a profile using BrowserForge's Bayesian network. The new fingerprint replaces the profile's stored identity; subsequent launches will use it. Optional os ('windows', 'macos', 'linux') and browser (default 'chrome') control the generated identity's platform family.

Inputs: profile (required), os, browser. Returns: object

session_profile_setB

Create or update a saved profile. launch_options (optional) is a dict of per-profile launch settings keyed by the same fields session_start accepts (headless, start_url, browser_args, sandbox, fingerprint, proxy, proxy_ref, cookie_file, cookie_fallback_domain, webrtc_leak_protection, browser_executable_path, user_data_dir, engine). fingerprint (optional dict) is the profile's persisted browser identity — generated automatically on first launch if not set, but can be set/overridden here. It takes precedence over launch_options fingerprint fields in the merge chain. proxy_ref (optional string) binds a proxy registry entry to the profile as its default proxy. Overrides any proxy_ref in launch_options. warming_status (optional) is 'none', 'partial', or 'warm'.

Inputs: profile (required), proxy_ref, description, fingerprint, +3 more. Returns: object

session_proxy_deleteC

Delete a proxy registry entry by name.

Inputs: proxy_name (required). Returns: object

session_proxy_getC

Get one proxy registry entry by name.

Inputs: proxy_name (required). Returns: object

session_proxy_listB

List saved proxy registry entries.

Inputs: no named parameters. Returns: object

session_proxy_setA

Create or update a proxy registry entry. values accepts either discrete fields ({scheme, host, port, username, password, rotation_url, tags}) or a single server URL ({server: 'http://user:pw@host:port', rotation_url, tags}). The persisted form is always discrete fields; server is decomposed at write. Profiles and session_start reference the entry by name via the proxy_ref field.

Inputs: proxy_name (required), merge, values. Returns: object

session_rotate_proxyA

Rotate the upstream exit IP for a session whose proxy was launched with a rotation_url. Hits the provider's rotation endpoint, waits a short settle window for the new IP to take over, re-probes through the proxy to confirm the new egress, and (by default) re-aligns the browser identity — timezone, locale, languages, geolocation — to the new egress. Caller-pinned fingerprint fields from session_start or session_set_fingerprint continue to win over the proxy-derived defaults, just like at launch. Returns old + new egress summaries, the (redacted) rotation endpoint, the rotation response payload, and whether the exit IP actually changed. Fails if the session has no proxy or its proxy has no rotation_url.

Inputs: session_id (required), settle_seconds, realign_identity, probe_timeout_seconds. Returns: object

session_set_download_dirC

Set default download directory for one session.

Inputs: session_id (required), download_dir (required). Returns: object

session_set_fingerprintA

Apply identity/anti-detect overrides to a live session via engine-level CDP where possible (propagates to workers and HTTP headers). Accepts any of: timezone_id, locale, languages (list or comma string), accept_language, latitude/longitude/geo_accuracy, user_agent, platform, hardware_concurrency, device_memory (GB), screen {width,height,device_scale_factor,mobile,max_touch_points}, webgl_vendor, webgl_renderer. Note: navigator.languages is best pinned at launch (--lang) since workers can't be rewritten at runtime; reload the page after this call so new-document JS overrides (deviceMemory, WebGL) take effect everywhere.

Inputs: session_id (required), fingerprint (required). Returns: object

session_set_policyC

Set runtime policy for one session.

Inputs: session_id (required), read_only, allow_evaluate, allowed_domains, +1 more. Returns: object

session_startA

Launch a new, isolated browser. By default it is ephemeral (no saved state) and headful. Pass profile= to launch a persistent managed profile whose cookies/storage survive across runs. Optional: headless, proxy, proxy_ref, start_url, cookie_file (one-shot cookie injection). engine selects the browser engine: 'cdp' (default) uses the system Chrome with Mithwire CDP/JS patches; 'stealth' uses a CloakBrowser binary with C++ source-level fingerprint patches for zero-lie stealth (requires pip install mithwire-mcp[stealth]). On unsupported platforms, 'stealth' falls back to 'cdp' with a warning. proxy accepts 'http://host:port', 'http://user:pass@host:port', the provider 'scheme:host:port:user:pass' form, or socks5://host:port (authenticated SOCKS not wired yet; use the HTTP endpoint). It can ALSO be a dict {server, username?, password?, rotation_url?} where rotation_url is an optional provider endpoint that rotates the upstream exit IP when hit. proxy_ref is the alternate form: a name pointing at an entry in the proxy registry (see session_proxy_set). The two are mutually exclusive per session — a literal proxy spec wins over a registry reference. When a proxy is set, the session is REFUSED if the proxy fails a pre-launch reachability + credentials probe (no half-launched browser, no fallback to the host's direct connection). On success, the browser identity defaults to the proxy egress (timezone, locale/languages, Accept-Language, geolocation) so the two never disagree; any field set in fingerprint={...} or in the profile's launch_options wins over the proxy default. Pass fingerprint={...} to override any identity field explicitly (timezone_id, languages, latitude/longitude, user_agent, platform, hardware_concurrency, device_memory, screen, webgl_vendor/webgl_renderer); see session_set_fingerprint. webrtc_leak_protection controls the WebRTC IP-leak guard: 'auto' (default; filters public ICE candidates when proxied so the real IP can't leak via STUN), 'filter' (always filter), 'disable' (remove RTCPeerConnection), or 'off'. skip_probe (default false): skip the pre-launch proxy health check entirely. Useful when the proxy has already been verified externally or when the proxy does not support the HTTPS CONNECT tunnel used by the default probe. Identity defaults (timezone, locale) will be derived via an in-browser lookup after launch. probe_timeout (seconds): override the default 8-second proxy probe timeout. Raise for slow residential/mobile proxies; the probe includes an automatic plain-HTTP fallback for proxies that fail the primary HTTPS/CONNECT path.

Inputs: proxy, engine, profile, sandbox, +12 more. Returns: object

session_state_pathsB

Get centralized directories used for profiles, proxies, and cookies.

Inputs: no named parameters. Returns: object

session_stopC

Stop one session by id.

Inputs: session_id (required). Returns: object

session_stop_allB

Stop all active sessions.

Inputs: no named parameters. Returns: object

session_trace_exportC

Export recorded trace to a JSON file.

Inputs: session_id (required), output_path (required). Returns: object

session_trace_getC

Read recorded session trace events.

Inputs: session_id (required), limit, offset. Returns: object

session_trace_replayC

Replay a trace file against a session.

Inputs: trace_path (required), dry_run, session_id, stop_on_error. Returns: object

session_trace_startC

Start recording session action trace.

Inputs: session_id (required), trace_id, capture_html_on_error, capture_screenshot_on_error. Returns: object

session_trace_stopC

Stop recording session action trace.

Inputs: session_id (required). Returns: object

session_warmupA

Warm a browser session by visiting sites to accumulate realistic browsing state (cookies, localStorage, history). A fresh profile with no history is a strong bot signal; this tool builds a natural footprint. Uses a curated site list by default; pass sites= to override. geo_region filters the built-in list to a country code (e.g. "US", "GB", "DE") plus global sites.

Inputs: session_id (required), sites, visits, max_dwell, +2 more. Returns: object

Tool Schema Changelog

Recent tool additions, removals, and schema changes observed during successful MCP inspections.

Loading tool schema changelog…

    TDQS

    C2.7/5.0

    Scored across 70 tools

    Disambiguation4/5

    Most tools have clearly distinct purposes, and descriptions explicitly differentiate potentially overlapping pairs. Some ambiguity exists among the many browser_wait_for_* variants and between browser_network_requests and the browser_network_capture_* group, but the boundaries are generally recoverable from the descriptions.

    Naming Consistency4/5

    The set follows a consistent snake_case prefix+action convention (browser_, session_, session_trace_, browser_network_capture_, etc.). Minor deviations are noun-only names like browser_url, browser_html, and browser_snapshot, but overall the pattern is predictable.

    Tool Count1/5

    With 70 tools, the server far exceeds the typical 3-15 scoped range and lands in the rubric's 50+ extreme-mismatch category. Many fine-grained operations could be consolidated, making the surface unnecessarily heavy for an agent to select from reliably.

    Completeness4/5

    The surface covers the full lifecycle for sessions, profiles, proxies, traces, cookies, storage, network capture, and core browser interactions. Only minor gaps exist, such as dedicated select/dropdown or drag-and-drop helpers, which can largely be worked around with existing tools.

    Maintenance

    ActivityMaintained
    ResponsivenessOutdated data

    Related MCP Connectors

    Related MCP Servers

    • A
      license
      A
      quality
      B
      maintenance
      MCP server that lets AI agents drive your real Chromium browser with your existing signed-in sessions, providing visible, local, and inspectable automation for tasks like navigation, clicking, typing, and form filling.
      25
      1
      Apache 2.0
    • F
      license
      Not graded
      quality
      A
      maintenance
      Exposes a local MCP endpoint that lets AI agents and human operators drive isolated Chromium profiles — each with its own cookies, fingerprint, and proxy — through tools for navigation, clicking, typing, extraction, screenshots, JS evaluation, tabs, and cookie management. Persistent per-profile session state keeps logins and context alive across launches and across AI sessions, so agents can complete real authenticated workflows.
      -