# ποΈ EyeBrowse
### A stealthy, LLM-drivable browser engine β one codebase, two faces.
A **Python library** *and* an **MCP server** for driving a real, hard-to-detect browser, so
legitimate automation isn't false-flagged or IP-banned by Cloudflare, DataDome, Akamai, or
PerimeterX. Built on **CloakBrowser** β a stealth **Chromium** (Chrome/146) that's a Playwright
drop-in β so EyeBrowse gets the full **Chrome DevTools Protocol**: trusted cursorless clicks,
deep network inspection, MHTML, PDF, and native video.
[](https://github.com/Evil-Bane/eyebrowse/actions/workflows/ci.yml)
[](https://pypi.org/project/eyebrowse/)
[](https://www.python.org/)
[](LICENSE)
[](docs/TOOLS.md)
[-4285F4.svg)](https://pypi.org/project/cloakbrowser/)
[](https://github.com/astral-sh/ruff)
[](CONTRIBUTING.md)

βΆ Full-quality MP4: docs/demo.mp4 β an AI agent drives EyeBrowse over MCP: clears a Cloudflare check, then reads real docs (asyncio Β· httpx Β· MDN).
---
## Why EyeBrowse?
- π₯· **Stealth by default** β engine-level fingerprint spoofing (`geoip` + `humanize` on out of the box, novel fingerprint per launch); `navigator.webdriver` masked; viewport auto-sized to the spoofed screen. No `puppeteer-extra` band-aids β the anti-detection is *compiled into the browser*.
- π€ **Built for LLMs** β pages are read as an **ARIA tree with `[ref=β¦]` handles**; the model acts by ref (`click`/`type`/`hover`), not by brittle CSS or raw pixels. Cross-origin iframes, shadow DOM, popups β handled.
- β‘ **Chrome DevTools Protocol** β **trusted, cursorless clicks** by node ref (`Input.dispatchMouseEvent`), raw `Network`/`Performance`/`Emulation` access, **MHTML** snapshots, **PDF** export, and **native video** β all reachable as tools.
- π§° **Library *and* MCP from one codebase** β a clean Python API (`EyeBrowse` + `Session`), mirrored 1:1 by a thin **MCP server** (**85 `browser_*` tools**) for Claude Code and any MCP client.
- πͺ **Never boxed in** β the curated high-level API doesn't hide Playwright: reach `session.page` / `.context` / `.browser` for anything it doesn't wrap.
- π **Batteries included** β multi-session, proxy + identity rotation, API-mode captcha solvers, native video, full **HAR** capture, and clean-markdown extraction.
> **Scope.** EyeBrowse is a low-level browser *engine* β it holds **no workflow logic**.
> Consumers decide *what* to do; the engine provides *what's possible*.
## Contents
[Quickstart](#quickstart) Β· [Install](#install) Β· [Features](#features) Β· [Compare](#how-eyebrowse-compares) Β· [Library](#use-as-a-library) Β· [MCP](#use-over-mcp) Β· [Proxy & identity](#proxy--identity-optional) Β· [Extraction](#extraction) Β· [Recording](#recording) Β· [How it works](#how-it-works) Β· [Caveats](#caveats) Β· [Tools](docs/TOOLS.md) Β· [License](#license)
## Quickstart
```bash
pip install eyebrowse
# The stealth-Chromium binary downloads automatically on first launch β nothing else to run.
```
```python
import asyncio
from eyebrowse import EyeBrowse
async def main():
eb = EyeBrowse() # stealth defaults: geoip Β· humanize
async with eb.session() as s:
await s.navigate("https://example.com")
print(await s.snapshot()) # ARIA tree with [ref=...] handles
await s.click("e6") # act on a ref from the snapshot
await eb.aclose()
asyncio.run(main())
```
β¦or wire it into **Claude Code** (or any MCP client) β see [Use over MCP](#use-over-mcp).
## Install
**From PyPI**
```bash
pip install eyebrowse # or: uv pip install eyebrowse
# CloakBrowser fetches its Chromium binary lazily on first launch β nothing to run.
pip install "eyebrowse[extract]" # optional: + Crawl4AI markdown extraction (heavier)
```
**From source (development)**
```bash
git clone https://github.com/Evil-Bane/eyebrowse && cd eyebrowse
uv sync # core engine (add --extra extract for Crawl4AI)
cp .env.example .env # only if you use a proxy / captcha keys
```
Python 3.12 (pinned `<3.13`). Engine: `cloakbrowser>=0.3` (stealth Chromium, Chrome/146), on
`playwright 1.60` and `mcp 1.27`.
## Features
| | |
|---|---|
| π₯· **Stealth** | CloakBrowser's patched-Chromium fingerprint spoofing (novel `--fingerprint` per launch); `geoip` + `humanize` by default; `webdriver` masked; viewport matched to the spoofed screen. |
| π€ **LLM interaction** | `aria_snapshot(mode="ai")` β ARIA tree + `[ref]` handles; click / type / hover / select / drag / file-upload / dialogs / keyboard; coordinate mouse too. |
| β‘ **CDP** | **trusted cursorless click** by ref, raw CDP (`Network` / `Performance` / `Emulation`), **MHTML** capture, **PDF** export. |
| πͺ **Frames & DOM** | cross-origin iframe routing by ref, shadow-DOM piercing, popup/new-tab switching, `evaluate` inside any frame. |
| π **Multi-session** | independent stealth sessions, each with its own context / identity / proxy. |
| π **Network** | inspect requests/responses (incl. XHR/fetch bodies & WebSocket frames), block URLs, mock responses, go offline, full **HAR** export. |
| πΎ **State** | cookies, localStorage & sessionStorage (CRUD), `storage_state` save/reload. |
| πͺͺ **Identity rotation** | fresh fingerprint + isolated profile + paired proxy; pluggable residential `ProxyProvider`. |
| π§© **Captcha** | pluggable **API-mode** solvers (CapSolver / 2Captcha / CapMonster / NextCaptcha) + TOTP β no browser extension. |
| π **Extraction** | Crawl4AI `raw:` feed β clean, token-efficient **markdown** (no LLM, no API keys). |
| π₯ **Capture** | screenshots, Playwright tracing, and **native video** (`.webm`). |
| β
**Verify & debug** | assertions, element highlighting, locator generation, geolocation/header emulation. |
Full per-tool reference: **[docs/TOOLS.md](docs/TOOLS.md)** (85 tools across 18 groups).
## How EyeBrowse compares
| | EyeBrowse | Playwright MCP | browser-use | playwright-stealth |
| :------------------------------------------------ | :----------------: | :-----------------: | :----------------: | :----------------: |
| Anti-detection **compiled into the browser** | β
| β | β | β οΈ JS patches |
| LLM-native ARIA **`[ref]`** interaction model | β
| β
| β
| β |
| Ships an **MCP server** | β
(85 tools) | β
| β οΈ partial | β |
| One codebase: Python **library *and* MCP** | β
| MCP-only | lib-only | lib-only |
| Full **CDP** (trusted clicks Β· network Β· MHTML Β· PDF Β· video) | β
| β οΈ partial | β | β οΈ partial |
| **Captcha** (API-mode) + TOTP | β
| β | β | β |
| **Proxy + identity rotation** built in | β
| β | β οΈ partial | β |
| Cross-origin iframes Β· shadow DOM Β· popups | β
| β
| β οΈ partial | n/a |