That is the difference from the usual stealth plugin approach, and it is why the CDP surface stays available. Two caveats the project states outright and you should plan around: exporting a HAR closes the session, because Playwright only flushes the buffer on context close — save the storage state first and reopen from it — and a reputation-scored captcha keys off IP as much as fingerprint, so a clean browser on a flagged address still fails. The library and the tool surface are the same codebase, so anything you script by hand is reachable from the model too.
A browser engine built to be driven by a model. Pages are read as an accessibility tree with `[ref=…]` handles, so the model acts on a ref rather than on a brittle selector or a pixel coordinate. It runs on CloakBrowser, a stealth Chromium that is a Playwright drop-in, which is what makes the full DevTools surface — trusted clicks, network bodies, MHTML, PDF, native video — reachable as tools.
- Sessions with their own identity, storage and optional proxy, plus HAR recording and native video capture — `browser_new_session`, `browser_list_sessions`, `browser_close_session`, `browser_video_path`
- Navigation and tabs, including switching to a popup after an OAuth flow — `browser_navigate`, `browser_navigate_back`, `browser_reload`, `browser_tabs`, `browser_switch_to_popup`
- Reading a page as an accessibility tree with refs, including a child frame directly when the parent collapses it, plus screenshots, console messages and downloads — `browser_snapshot`, `browser_snapshot_frame`, `browser_screenshot`, `browser_console_messages`, `browser_wait_for_download`
- Acting by ref: click, type, fill a whole form, hover, select, press a key, drag, upload files, handle a JS dialog, wait on a condition, evaluate JS in any frame, and scroll to trigger lazy loading — `browser_click`, `browser_type`, `browser_fill_form`, `browser_press_key`, `browser_wait_for`, `browser_evaluate`, `browser_scroll_to_bottom`
- Network inspection and control: requests listed and one opened in full with headers and body, WebSocket frames read, URLs blocked or mocked, and the context taken offline — `browser_network_requests`, `browser_network_request`, `browser_ws_messages`, `browser_block_urls`, `browser_mock_url`, `browser_set_offline`
- State you can carry between sessions — cookies, localStorage and sessionStorage read and written, and the whole storage state saved to a file and reloaded — `browser_cookie_set`, `browser_localstorage_get`, `browser_storage_state`, `browser_har_export`
- A fresh fingerprint with isolated storage and an optional paired proxy — `browser_new_identity`, `browser_set_proxy`
- CDP extras on Chromium: a trusted cursorless click by ref that passes checks which flag DOM clicks, raw CDP commands, a single-file MHTML archive and a PDF — `browser_cdp_click`, `browser_cdp_send`, `browser_capture_mhtml`, `browser_pdf_save`
- Captcha solving through a configured provider and TOTP codes for two-factor logins — `browser_solve_captcha`, `browser_totp_generate`
- The page extracted as clean markdown with no model in the loop — `browser_extract`
Python 3.12 and `pip install eyebrowse`; the stealth Chromium binary downloads itself on first launch, so there is nothing else to run. The package is `eyebrowse` (0.3.10) and provides the `eyebrowse-mcp` command — add it to a client with `claude mcp add eyebrowse -- eyebrowse-mcp`. It runs proxyless by default; a proxy is opt-in per session or set as a default through the `EYEBROWSE_PROXY_*` variables. Captcha solving needs an API key for whichever provider you configure. Markdown extraction is an optional heavier install, `pip install "eyebrowse[extract]"`.
One command — pip install eyebrowse
