{"name":"io.github.Evil-Bane/eyebrowse","slug":"evil-bane-eyebrowse","title":null,"description":"Stealthy, LLM-drivable browser engine — a Python library + 85-tool MCP server on stealth Chromium.","url":"https://mcp.market/server/evil-bane-eyebrowse","rating":null,"grade":"B","score":82,"certified":false,"status":"active","category":"scraping","tags":["scraping","ai"],"presence":{"score":16,"stars":1,"forks":0,"downloads_week":30,"last_push_at":"2026-06-18T19:37:27.000Z","license":"MIT"},"uptime":null,"claimed":false,"transport":"pypi","callable_via_gateway":false,"default_price_micros":0,"repository":"https://github.com/Evil-Bane/eyebrowse","website":null,"version":"0.3.10","remotes":[],"packages":[{"registryType":"pypi","registryBaseUrl":"https://pypi.org","identifier":"eyebrowse","version":"0.3.10","runtimeHint":"uvx","transport":{"type":"stdio"}}],"tools":[{"name":"browser_block_urls","description":"Abort requests matching glob patterns (e.g. '**/*.png', '**/ads/**'). Useful to save proxy bandwidth or strip trackers/images.","write_action":false,"price_micros":0,"input_schema":null},{"name":"browser_capture_mhtml","description":"Save 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.","write_action":false,"price_micros":0,"input_schema":null},{"name":"browser_cdp_click","description":"Click an element by its [ref=...] using a TRUSTED, cursorless CDP input event.","write_action":false,"price_micros":0,"input_schema":null},{"name":"browser_cdp_send","description":"Send a raw Chrome DevTools Protocol command and return its result.","write_action":true,"price_micros":0,"input_schema":null},{"name":"browser_clear_highlights","description":"Remove all highlight outlines added via browser_highlight.","write_action":true,"price_micros":0,"input_schema":null},{"name":"browser_click","description":"Click an element by its snapshot ref (e.g. 'e12' or 'f1e36' for iframe elements). Returns a fresh snapshot.","write_action":false,"price_micros":0,"input_schema":null},{"name":"browser_close_session","description":"Close a session and free its browser.","write_action":false,"price_micros":0,"input_schema":null},{"name":"browser_console_messages","description":"Return console messages collected on the current page (type + text).","write_action":false,"price_micros":0,"input_schema":null},{"name":"browser_cookie_clear","description":"Remove all cookies in the context.","write_action":true,"price_micros":0,"input_schema":null},{"name":"browser_cookie_delete","description":"Delete the cookie with the given name.","write_action":true,"price_micros":0,"input_schema":null},{"name":"browser_cookie_get","description":"Get a single cookie by name (or null if absent).","write_action":false,"price_micros":0,"input_schema":null},{"name":"browser_cookie_list","description":"List cookies in the context (optionally filtered to a url).","write_action":false,"price_micros":0,"input_schema":null},{"name":"browser_cookie_set","description":"Set a cookie. Provide either url, or domain+path.","write_action":false,"price_micros":0,"input_schema":null},{"name":"browser_drag","description":"Drag one element onto another (by refs). Returns a snapshot.","write_action":false,"price_micros":0,"input_schema":null},{"name":"browser_evaluate","description":"Evaluate a JS expression or function in the page and return the result.","write_action":false,"price_micros":0,"input_schema":null},{"name":"browser_extract","description":"Extract the current page as clean, token-efficient markdown (no LLM involved).","write_action":false,"price_micros":0,"input_schema":null},{"name":"browser_file_upload","description":"Set files on a file <input> by ref (absolute paths). Returns a snapshot.","write_action":true,"price_micros":0,"input_schema":null},{"name":"browser_fill_form","description":"Fill multiple fields at once. Each field: {ref, value, submit?, clear?}.","write_action":false,"price_micros":0,"input_schema":null},{"name":"browser_find","description":"Find 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","write_action":false,"price_micros":0,"input_schema":null},{"name":"browser_generate_locator","description":"Return a stable CSS selector for an element (by ref) for use in code/tests.","write_action":false,"price_micros":0,"input_schema":null},{"name":"browser_grant_permissions","description":"Pre-grant browser permissions so the native prompt never blocks the flow.","write_action":false,"price_micros":0,"input_schema":null},{"name":"browser_handle_dialog","description":"Accept or dismiss an open JS dialog (alert/confirm/prompt). prompt_text fills a prompt() before accepting. Dialogs stay open until handled.","write_action":false,"price_micros":0,"input_schema":null},{"name":"browser_har_export","description":"Finalize and return the HAR file path for a recording session.","write_action":false,"price_micros":0,"input_schema":null},{"name":"browser_highlight","description":"Draw a magenta outline around an element (by ref) — handy before a screenshot.","write_action":false,"price_micros":0,"input_schema":null},{"name":"browser_hover","description":"Hover over an element by ref. Returns a snapshot.","write_action":false,"price_micros":0,"input_schema":null},{"name":"browser_keyboard_type","description":"Type text into the currently focused element — no ref needed.","write_action":false,"price_micros":0,"input_schema":null},{"name":"browser_list_sessions","description":"List all open sessions with their current url, tab count, and identity.","write_action":false,"price_micros":0,"input_schema":null},{"name":"browser_localstorage_clear","description":"Clear all localStorage for the current origin.","write_action":false,"price_micros":0,"input_schema":null},{"name":"browser_localstorage_get","description":"Get a localStorage value by key (null if absent).","write_action":false,"price_micros":0,"input_schema":null},{"name":"browser_localstorage_list","description":"List all localStorage key/value pairs for the current origin.","write_action":false,"price_micros":0,"input_schema":null},{"name":"browser_localstorage_remove","description":"Remove a localStorage key.","write_action":true,"price_micros":0,"input_schema":null},{"name":"browser_localstorage_set","description":"Set a localStorage key to a value.","write_action":false,"price_micros":0,"input_schema":null},{"name":"browser_mock_url","description":"Fulfill requests matching a glob pattern with a canned response (response mocking / fault injection). Cleared by browser_unblock_urls.","write_action":false,"price_micros":0,"input_schema":null},{"name":"browser_mouse_click","description":"Click at absolute coordinates (x, y). button: left|right|middle; clicks for multi-click.","write_action":false,"price_micros":0,"input_schema":null},{"name":"browser_mouse_down","description":"Press a mouse button down (at the current position).","write_action":false,"price_micros":0,"input_schema":null},{"name":"browser_mouse_drag","description":"Drag from (x1, y1) to (x2, y2) with the left button held.","write_action":false,"price_micros":0,"input_schema":null},{"name":"browser_mouse_move","description":"Move the mouse to absolute page coordinates (x, y).","write_action":false,"price_micros":0,"input_schema":null},{"name":"browser_mouse_up","description":"Release a mouse button (at the current position).","write_action":false,"price_micros":0,"input_schema":null},{"name":"browser_mouse_wheel","description":"Scroll the mouse wheel by (delta_x, delta_y) pixels.","write_action":false,"price_micros":0,"input_schema":null},{"name":"browser_navigate","description":"Navigate to a URL. Returns the page's ARIA snapshot (with [ref=...] handles).","write_action":false,"price_micros":0,"input_schema":null},{"name":"browser_navigate_back","description":"Go back one entry in history. Returns the new page's ARIA snapshot.","write_action":false,"price_micros":0,"input_schema":null},{"name":"browser_navigate_forward","description":"Go forward one entry in history. Returns the new page's ARIA snapshot.","write_action":false,"price_micros":0,"input_schema":null},{"name":"browser_network_request","description":"Get 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).","write_action":false,"price_micros":0,"input_schema":null},{"name":"browser_network_requests","description":"List 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.","write_action":false,"price_micros":0,"input_schema":null},{"name":"browser_new_identity","description":"Start 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.","write_action":false,"price_micros":0,"input_schema":null},{"name":"browser_new_session","description":"Create a new stealth browser session and make it current. Returns its id.","write_action":true,"price_micros":0,"input_schema":null},{"name":"browser_pdf_save","description":"Save the current page as a PDF file. Chromium only. Returns the saved file path.","write_action":false,"price_micros":0,"input_schema":null},{"name":"browser_press_key","description":"Press a keyboard key (e.g. 'Enter', 'Escape', 'ArrowDown', 'Tab'). Returns a snapshot.","write_action":false,"price_micros":0,"input_schema":null},{"name":"browser_reload","description":"Reload the current page. Returns the page's ARIA snapshot.","write_action":false,"price_micros":0,"input_schema":null},{"name":"browser_resize","description":"Resize the page viewport (e.g. 1920x1080). Affects layout and screenshot size.","write_action":false,"price_micros":0,"input_schema":null},{"name":"browser_screenshot","description":"","write_action":false,"price_micros":0,"input_schema":null},{"name":"browser_scroll","description":"Scroll the page by pixels in a direction, or scroll an element into view.","write_action":false,"price_micros":0,"input_schema":null},{"name":"browser_scroll_to_bottom","description":"Scroll to the very bottom of the page, pausing to let lazy content load.","write_action":false,"price_micros":0,"input_schema":null},{"name":"browser_select_combobox","description":"Pick `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","write_action":false,"price_micros":0,"input_schema":null},{"name":"browser_select_option","description":"Select 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.","write_action":false,"price_micros":0,"input_schema":null},{"name":"browser_sessionstorage_clear","description":"Clear all sessionStorage for the current origin.","write_action":false,"price_micros":0,"input_schema":null},{"name":"browser_sessionstorage_get","description":"Get a sessionStorage value by key (null if absent).","write_action":false,"price_micros":0,"input_schema":null},{"name":"browser_sessionstorage_list","description":"List all sessionStorage key/value pairs for the current origin.","write_action":false,"price_micros":0,"input_schema":null},{"name":"browser_sessionstorage_remove","description":"Remove a sessionStorage key.","write_action":true,"price_micros":0,"input_schema":null},{"name":"browser_sessionstorage_set","description":"Set a sessionStorage key to a value.","write_action":false,"price_micros":0,"input_schema":null},{"name":"browser_set_extra_headers","description":"Set extra HTTP headers sent with every request in this session.","write_action":false,"price_micros":0,"input_schema":null},{"name":"browser_set_geolocation","description":"Override the geolocation the page reads (note: geoip already aligns geo to the IP).","write_action":false,"price_micros":0,"input_schema":null},{"name":"browser_set_input","description":"Set `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.","write_action":false,"price_micros":0,"input_schema":null},{"name":"browser_set_offline","description":"Toggle the context's network offline/online (to test offline behavior).","write_action":false,"price_micros":0,"input_schema":null},{"name":"browser_set_proxy","description":"Pin a proxy as the default for subsequent sessions/identities. (Proxies are bound at launch, so existing sessions are unaffected.)","write_action":false,"price_micros":0,"input_schema":null},{"name":"browser_snapshot","description":"Capture the page's ARIA accessibility tree with [ref=...] handles.","write_action":false,"price_micros":0,"input_schema":null},{"name":"browser_snapshot_frame","description":"Snapshot 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).","write_action":false,"price_micros":0,"input_schema":null},{"name":"browser_solve_captcha","description":"Solve a captcha on the current page and inject the token (no extension).","write_action":false,"price_micros":0,"input_schema":null},{"name":"browser_start_tracing","description":"Start a Playwright trace (screenshots + DOM snapshots) for later inspection.","write_action":false,"price_micros":0,"input_schema":null},{"name":"browser_stop_tracing","description":"Stop tracing and write a trace.zip (open with `playwright show-trace`). Returns the path.","write_action":false,"price_micros":0,"input_schema":null},{"name":"browser_storage_state","description":"Save cookies + localStorage to a JSON file. Reload it later via browser_new_session(storage_state=path). Returns the file path.","write_action":false,"price_micros":0,"input_schema":null},{"name":"browser_switch_to_popup","description":"Switch the active page to the most recently opened popup or new tab.","write_action":false,"price_micros":0,"input_schema":null},{"name":"browser_tabs","description":"Manage tabs. action: list | new | select | close (index for select/close, url optional for new). Returns the resulting tab list.","write_action":false,"price_micros":0,"input_schema":null},{"name":"browser_totp_generate","description":"Generate a TOTP (time-based one-time password) from a base32 shared secret.","write_action":false,"price_micros":0,"input_schema":null},{"name":"browser_type","description":"Type text into a field by ref (top-frame or iframe ref like 'f1e20'). submit=True presses Enter after. Returns a snapshot.","write_action":false,"price_micros":0,"input_schema":null},{"name":"browser_type_otp","description":"Enter 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","write_action":false,"price_micros":0,"input_schema":null},{"name":"browser_unblock_urls","description":"Remove all URL routes added via browser_block_urls or browser_mock_url.","write_action":true,"price_micros":0,"input_schema":null},{"name":"browser_verify_element_hidden","description":"Assert an element (by ref) is hidden/absent. Returns {ok, ...}.","write_action":false,"price_micros":0,"input_schema":null},{"name":"browser_verify_element_visible","description":"Assert an element (by ref) is visible. Returns {ok, ...}.","write_action":false,"price_micros":0,"input_schema":null},{"name":"browser_verify_text_visible","description":"Assert some visible text appears on the page. Returns {ok, ...}.","write_action":false,"price_micros":0,"input_schema":null},{"name":"browser_verify_value","description":"Assert an input/element (by ref) has the expected value. Returns {ok, ...}.","write_action":false,"price_micros":0,"input_schema":null},{"name":"browser_video_path","description":"Path to this session's native video recording (Chromium only).","write_action":false,"price_micros":0,"input_schema":null},{"name":"browser_wait_for","description":"Wait for a condition then return a fresh snapshot. Pass exactly one condition:","write_action":false,"price_micros":0,"input_schema":null},{"name":"browser_wait_for_download","description":"Wait for a file download to complete and return its saved path.","write_action":false,"price_micros":0,"input_schema":null},{"name":"browser_ws_messages","description":"Return all WebSocket connections opened this session and their messages.","write_action":false,"price_micros":0,"input_schema":null}],"scan":{"score":82,"grade":"B","scanned_at":"2026-09-26T21:22:02.357Z","report":{"scannerVersion":"0.1.9","scannedAt":"2026-09-26T21:22:02.350Z","components":{"code":{"score":25,"max":25,"notes":["40 source files scanned"]},"reliability":{"score":-1,"max":20,"notes":["no gateway calls yet and no remote to probe"]},"poisoning":{"score":-1,"max":15,"notes":["tools not inspected (local package is not executed); not counted"]},"auth":{"score":12,"max":15,"notes":["local package, no credentials required"]},"maintenance":{"score":8,"max":15,"notes":["last push 100 days ago"]},"identity":{"score":8,"max":10,"notes":["registry namespace matches repository owner","GitHub account older than a year"]}},"findings":[],"inputs":{"packages":[{"registryType":"pypi","identifier":"eyebrowse","version":"0.3.10","found":true,"weeklyDownloads":30,"license":"MIT","dependencyCount":8,"publishedAt":"2026-06-18T19:37:54.540664Z","repositoryUrl":"https://github.com/Evil-Bane/eyebrowse"}],"repo":{"found":true,"owner":"Evil-Bane","repo":"eyebrowse","archived":false,"pushedAt":"2026-06-18T19:37:27Z","stars":1,"forks":0,"openIssues":0,"ownerType":"User","ownerAvatarUrl":"https://avatars.githubusercontent.com/u/72240505?v=4","ownerCreatedAt":"2020-10-02T03:20:33Z","license":"MIT"},"icon":{"url":null,"source":"none"},"presence":{"stars":1,"forks":0,"downloadsWeek":30,"license":"MIT","lastPushAt":"2026-06-18T19:37:27.000Z","score":16}}}},"grade_history":[],"reviews":[]}