Eyebrowse MCP server
io.github.Evil-Bane/eyebrowse·v0.3.10·1 starsStealthy, LLM-drivable browser engine — a Python library + 85-tool MCP server on stealth Chromium.
1 stars30 downloads/wk
Reviews
Write oneNobody has reviewed Eyebrowse yet.
If you have run it, two minutes of your experience saves the next person an afternoon.
Eyebrowse tools (85, 9 write)
write = sends, deletes, buys or postsRead from the package source without running it. The installed server may list more.
browser_block_urlsAbort requests matching glob patterns (e.g. '**/*.png', '**/ads/**'). Useful to save proxy bandwidth or strip trackers/images.
browser_capture_mhtmlSave the full page as a single-file MHTML archive (iframes + shadow DOM + external resources + inline styles) via CDP Page.captureSnapshot — captures the exact page state for debugging/forensics. Chromium only. Returns the saved file path.
browser_cdp_clickClick an element by its [ref=...] using a TRUSTED, cursorless CDP input event.
browser_cdp_sendwrite actionSend a raw Chrome DevTools Protocol command and return its result.
browser_clear_highlightswrite actionRemove all highlight outlines added via browser_highlight.
browser_clickClick an element by its snapshot ref (e.g. 'e12' or 'f1e36' for iframe elements). Returns a fresh snapshot.
browser_close_sessionClose a session and free its browser.
browser_console_messagesReturn console messages collected on the current page (type + text).
browser_cookie_clearwrite actionRemove all cookies in the context.
browser_cookie_deletewrite actionDelete the cookie with the given name.
browser_cookie_getGet a single cookie by name (or null if absent).
browser_cookie_listList cookies in the context (optionally filtered to a url).
browser_cookie_setSet a cookie. Provide either url, or domain+path.
browser_dragDrag one element onto another (by refs). Returns a snapshot.
browser_evaluateEvaluate a JS expression or function in the page and return the result.
browser_extractExtract the current page as clean, token-efficient markdown (no LLM involved).
browser_file_uploadwrite actionSet files on a file <input> by ref (absolute paths). Returns a snapshot.
browser_fill_formFill multiple fields at once. Each field: {ref, value, submit?, clear?}.
browser_findFind VISIBLE interactive elements whose text / placeholder / label / type contains `query` — the escape hatch when browser_snapshot is all 'generic' (no usable [ref=eN]). Returns a list of matches, each with a css selector you act on via the ref slot, e.g. browser_click(ref="css=...") or browser_type(ref="css=...", text=...). Example: browser_find("verification code") -> the OTP input + its css re
browser_generate_locatorReturn a stable CSS selector for an element (by ref) for use in code/tests.
browser_grant_permissionsPre-grant browser permissions so the native prompt never blocks the flow.
browser_handle_dialogAccept or dismiss an open JS dialog (alert/confirm/prompt). prompt_text fills a prompt() before accepting. Dialogs stay open until handled.
browser_har_exportFinalize and return the HAR file path for a recording session.
browser_highlightDraw a magenta outline around an element (by ref) — handy before a screenshot.
browser_hoverHover over an element by ref. Returns a snapshot.
browser_keyboard_typeType text into the currently focused element — no ref needed.
browser_list_sessionsList all open sessions with their current url, tab count, and identity.
browser_localstorage_clearClear all localStorage for the current origin.
browser_localstorage_getGet a localStorage value by key (null if absent).
browser_localstorage_listList all localStorage key/value pairs for the current origin.
browser_localstorage_removewrite actionRemove a localStorage key.
browser_localstorage_setSet a localStorage key to a value.
browser_mock_urlFulfill requests matching a glob pattern with a canned response (response mocking / fault injection). Cleared by browser_unblock_urls.
browser_mouse_clickClick at absolute coordinates (x, y). button: left|right|middle; clicks for multi-click.
browser_mouse_downPress a mouse button down (at the current position).
browser_mouse_dragDrag from (x1, y1) to (x2, y2) with the left button held.
browser_mouse_moveMove the mouse to absolute page coordinates (x, y).
browser_mouse_upRelease a mouse button (at the current position).
browser_mouse_wheelScroll the mouse wheel by (delta_x, delta_y) pixels.
browser_navigateNavigate to a URL. Returns the page's ARIA snapshot (with [ref=...] handles).
browser_navigate_backGo back one entry in history. Returns the new page's ARIA snapshot.
browser_navigate_forwardGo forward one entry in history. Returns the new page's ARIA snapshot.
browser_network_requestGet one request's full detail: request + response headers, and response body (auto-captured for XHR/fetch resource types — body may still be populating for very recent requests). Match by list index or url substring (most recent match).
browser_network_requestsList network requests seen this session (method, url, status, resource_type). Optionally filter by resource_type (e.g. 'xhr', 'fetch', 'document') or url substring. For full details including headers and body, use browser_network_request.
browser_new_identityStart a fresh browser identity in a new session: a novel fingerprint (randomized OS + screen) with isolated storage, optionally paired with a proxy. Proxyless by default; pass proxy_url ('http://user:pass@host:port') or proxy_server[+username/password] to pair an IP. persistent=True mints a reusable profile dir. Returns the new session info.
browser_new_sessionwrite actionCreate a new stealth browser session and make it current. Returns its id.
browser_pdf_saveSave the current page as a PDF file. Chromium only. Returns the saved file path.
browser_press_keyPress a keyboard key (e.g. 'Enter', 'Escape', 'ArrowDown', 'Tab'). Returns a snapshot.
browser_reloadReload the current page. Returns the page's ARIA snapshot.
browser_resizeResize the page viewport (e.g. 1920x1080). Affects layout and screenshot size.
browser_screenshotbrowser_scrollScroll the page by pixels in a direction, or scroll an element into view.
browser_scroll_to_bottomScroll to the very bottom of the page, pausing to let lazy content load.
browser_select_comboboxPick `value` from a CUSTOM / searchable dropdown or combobox (country & country-code pickers, styled listboxes) where browser_select_option times out. Opens the trigger `ref`, types `value` to filter, commits the highlighted option by keyboard (ArrowDown+Enter), then VERIFIES the committed value and falls back to clicking the option by visible text. Filter by the COUNTRY NAME (e.g. 'Germany'), not
browser_select_optionSelect option(s) in a NATIVE <select> by ref (match by value OR visible label). Self- verifies and, on a no-match, returns the available option labels. For a CUSTOM / searchable dropdown (styled div, role=combobox/listbox — most country-code pickers) this will not work — use browser_select_combobox instead. Returns the committed option + a snapshot.
browser_sessionstorage_clearClear all sessionStorage for the current origin.
browser_sessionstorage_getGet a sessionStorage value by key (null if absent).
browser_sessionstorage_listList all sessionStorage key/value pairs for the current origin.
browser_sessionstorage_removewrite actionRemove a sessionStorage key.
browser_sessionstorage_setSet a sessionStorage key to a value.
browser_set_extra_headersSet extra HTTP headers sent with every request in this session.
browser_set_geolocationOverride the geolocation the page reads (note: geoip already aligns geo to the IP).
browser_set_inputSet `value` on a FRAMEWORK-CONTROLLED input (React/Vue) via the native value setter + input/change events. Use this when browser_type / fill silently leaves the field EMPTY (controlled components re-derive value from state and ignore plain typing — e.g. some OTP and masked phone inputs). Returns the resulting value + a snapshot.
browser_set_offlineToggle the context's network offline/online (to test offline behavior).
browser_set_proxyPin a proxy as the default for subsequent sessions/identities. (Proxies are bound at launch, so existing sessions are unaffected.)
browser_snapshotCapture the page's ARIA accessibility tree with [ref=...] handles.
browser_snapshot_frameSnapshot a specific child frame directly. Use when browser_snapshot returns an iframe node with empty/collapsed children — snapshotting the frame is reliable (works for same-origin AND cross-origin frames).
browser_solve_captchaSolve a captcha on the current page and inject the token (no extension).
browser_start_tracingStart a Playwright trace (screenshots + DOM snapshots) for later inspection.
browser_stop_tracingStop tracing and write a trace.zip (open with `playwright show-trace`). Returns the path.
browser_storage_stateSave cookies + localStorage to a JSON file. Reload it later via browser_new_session(storage_state=path). Returns the file path.
browser_switch_to_popupSwitch the active page to the most recently opened popup or new tab.
browser_tabsManage tabs. action: list | new | select | close (index for select/close, url optional for new). Returns the resulting tab list.
browser_totp_generateGenerate a TOTP (time-based one-time password) from a base32 shared secret.
browser_typeType text into a field by ref (top-frame or iframe ref like 'f1e20'). submit=True presses Enter after. Returns a snapshot.
browser_type_otpEnter an OTP/verification `code` into the field at `ref`, handling MULTI-BOX widgets (one <input maxlength=1> per digit that auto-advances) by distributing the digits across the boxes via the React-tracked setter — instead of typing the whole code into box 1 (which lands the digits in the wrong boxes). Works on a single field too. Returns {boxes, value} (read it back) + a snapshot. After this, sti
browser_unblock_urlswrite actionRemove all URL routes added via browser_block_urls or browser_mock_url.
browser_verify_element_hiddenAssert an element (by ref) is hidden/absent. Returns {ok, ...}.
browser_verify_element_visibleAssert an element (by ref) is visible. Returns {ok, ...}.
browser_verify_text_visibleAssert some visible text appears on the page. Returns {ok, ...}.
browser_verify_valueAssert an input/element (by ref) has the expected value. Returns {ok, ...}.
browser_video_pathPath to this session's native video recording (Chromium only).
browser_wait_forWait for a condition then return a fresh snapshot. Pass exactly one condition:
browser_wait_for_downloadWait for a file download to complete and return its saved path.
browser_ws_messagesReturn all WebSocket connections opened this session and their messages.
Public scan report
scanner v0.1.9 · 2026-09-26 · same rubric, same numbers if you re-run it
- Code scan40 source files scanned25/25
- –Live reliabilityno gateway calls yet and no remote to proben/a
- –Tool poisoningtools not inspected (local package is not executed); not countedn/a
- Auth qualitylocal package, no credentials required12/15
- Maintenancelast push 100 days ago8/15
- Maintainer identityregistry namespace matches repository owner; GitHub account older than a year8/10
How Eyebrowse compares
Against every graded Scraping and browsing MCP server, from our own scans and uptime checks. Updated after each scan run.
- Safety score
- 82/100
- higher than 58% of 866 Scraping and browsing servers
- Tools
- 85
- the typical Scraping and browsing server has 6
- Tools that change things
- 11%
- typical: 0%. Fewer write tools means less an agent can break
- GitHub stars
- 1
- more than 50% of 583 Scraping and browsing servers
- Downloads a week
- 30
- more than 10% of 309 Scraping and browsing servers with a package
What its tools let an agent do: 76 read · 9 change
Install Eyebrowse in Claude Code, Cursor or VS Code
claude mcp add eyebrowse -- uvx eyebrowse
What the publisher says
From the Eyebrowse repository's README, as published. We do not edit it. Read it on GitHub
<!-- mcp-name: io.github.Evil-Bane/eyebrowse -->
👁️ 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.
-4285F4.svg)
▶ 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 · Install · Features · Compare · Library · MCP · Proxy & identity · Extraction · Recording · How it works · Caveats · Tools · License
Quickstart
pip install eyebrowse
# The stealth-Chromium binary downloads automatically on first launch — nothing else to run.import asyncio
from eyebrowse import EyeBrowseShortened. The full README is on GitHub.
Nothing above is checked by us. What we check is on the safety report.
Eyebrowse: common questions
- Is Eyebrowse MCP server safe?
- Mostly: it is graded B (82/100). Read the Eyebrowse safety report
- How do I install Eyebrowse?
- It runs on your machine. Copy the Claude Code, Cursor, VS Code or Claude Desktop config from the install section.
- Does Eyebrowse need an API key?
- Not as far as the registry entry and our scan can tell: no credentials are declared or required.
- Is Eyebrowse maintained?
- The last commit was 139 days ago (2026-06-18). The latest release is v0.3.10.
- What can I use instead of Eyebrowse?
- Servers from other publishers that do the same job: Ghostfox MCP server, Stealthy Auto Browse MCP server and SeleniumBase MCP server.
- How does Eyebrowse compare with other Scraping and browsing MCP servers?
- safety score 82/100 (higher than 58% of 866 Scraping and browsing servers); tools 85 (the typical Scraping and browsing server has 6); tools that change things 11% (typical: 0%. Fewer write tools means less an agent can break). Full comparison.
Alternatives to Eyebrowse
Same job from other publishers: the closest match first, then the best rated.
- GhostfoxSelf-hosted stealth browser for AI agents: Firefox engine + Rust MCP runtime.not reviewedGrowingA
- Stealthy Auto BrowseSelf-hosted MCP server for stealth browser automation with human-like OS-level input.not reviewedGrowingA
- SeleniumBase MCPStealthy browser automation, testing, and web-scraping via CDP Mode.not reviewedWidely usedA
- Browser UseBrowser agents and stealth cloud browsers for AI: run web tasks, fill forms, extract data.not reviewedEstablishedA
- CloakBrowser MCPPlaywright MCP-compatible browser automation bridge for CloakBrowser Chromium.not reviewedEstablishedB