Mithwire MCP
Click on "Deploy 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., "@Mithwire MCP open example.com, click the login link, and check console errors"
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.
💡 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 = trueand 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:
⚡ Driverless CDP Engine: Built on Mithwire—speaks raw Chrome DevTools Protocol with no WebDriver or Selenium dependency.
🔧 Dual Engine Modes: Support for both standard
cdpmode (stock Chrome/Chromium) and source-patchedstealthmode (CloakBrowser) for cross-OS environment emulation.🌍 Automatic Proxy & Egress Alignment: Validates proxy connectivity before launching Chromium and optionally aligns timezone, locale, languages, and geolocation to match the proxy region.
👤 Persistent Profiles & State Store: Reusable browser profiles (
profiles/) store cookies, localStorage, proxy bindings, and environment configurations across agent runs.🔒 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 |
| Stock Chrome / Chromium | Fast, reliable CDP | Local workstations, remote Linux servers, E2E testing, fast script prototyping. |
| 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-mcpdirectory 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 --buildEndpoints:
🔌 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 sessionssession_get- Get session status and identity metadatasession_set_fingerprint- Override the active session environment fingerprintsession_rotate_proxy- Rotate the proxy exit IP and optionally re-align locale/timezonesession_state_paths- Show state directory layout (profiles, proxies, cookies)session_set_policy/session_get_policy- Set or read per-session security policysession_set_download_dir- Change the session download directorysession_warmup- Visit initial pages to initialize session statesession_stop- Close a specific sessionsession_stop_all- Terminate all running sessions
session_profile_list/session_profile_get/session_profile_set/session_profile_delete- CRUD for persistent profilessession_profile_regenerate_fingerprint- Regenerate a profile's fingerprint via BrowserForgesession_proxy_list/session_proxy_get/session_proxy_set/session_proxy_delete- Proxy registry CRUD
browser_url- Get the current page URLbrowser_navigate/browser_back/browser_forward/browser_reload- Navigationbrowser_snapshot- Take interactive DOM snapshot with element referencesbrowser_query- Find elements by CSS selector or textbrowser_click/browser_mouse_click/browser_mouse_move/browser_press_hold/browser_type- User interactionsbrowser_scroll- Scroll the page or an elementbrowser_handle_dialog- Accept or dismiss browser dialogsbrowser_set_file_input- Set files on a file input elementbrowser_take_screenshot- Capture page screenshot
browser_tab_list/browser_tab_current- List open tabs or get the active tabbrowser_tab_new/browser_tab_switch/browser_tab_close- Create, switch, or close tabs
browser_wait- Wait for a fixed durationbrowser_wait_for_selector- Wait until a CSS selector appearsbrowser_wait_for_text- Wait until text appears on the pagebrowser_wait_for_url- Wait until the URL matches a patternbrowser_wait_for_function- Wait until a JS expression returns truthybrowser_wait_for_network_idle- Wait until network activity settles
browser_cookies_get/browser_cookies_set/browser_cookies_save/browser_cookies_clearbrowser_storage_get/browser_storage_set/browser_storage_clearbrowser_console_messages- Read captured console log messagesbrowser_network_requests- List captured network requestsbrowser_network_capture_start/browser_network_capture_get/browser_network_capture_stop/browser_network_capture_statusbrowser_downloads- List downloaded files
browser_html- Get the raw HTML of the current page or an elementbrowser_evaluate- Execute arbitrary JavaScript in the page contextsession_trace_start/session_trace_stop/session_trace_get- Record and inspect CDP tracessession_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_startthat 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/SIGINTthe 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. SetMITHWIRE_NO_EXIT_GUARD=1to 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 toolsbrowser_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_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
Scored across 70 tools
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.
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.
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.
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
Related MCP Connectors
Official Browserless MCP server: browser automation, scraping, screenshots and PDFs for AI agents.
Web scraping, browser automation, screenshots and AI data extraction for AI agents via MCP.
Give AI agents a real cloud Chrome: open sessions, navigate, read pages, click, type and screenshot.
Hosted real Google Chrome MCP with per-user persistent state. Navigate, click, type, screenshot.
Related MCP Servers
- FlicenseNot gradedqualityDmaintenanceMCP server that enables AI agents to automate browser testing via Chromium, providing tools for navigation, interaction, and inspection.-
- FlicenseBqualityCmaintenanceUltra-fast browser automation server over Chrome DevTools Protocol (CDP), exposed as MCP, enabling AI agents to control a real Chrome browser with low latency and minimal token usage.212-
- AlicenseAqualityBmaintenanceMCP 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.251Apache 2.0
- FlicenseNot gradedqualityAmaintenanceExposes 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.-