Tool Reference
Auto-generated reference for the hosted Shade MCP browser tools.
Tool Reference
This page is generated at build time from the Shade Browser MCP engine source.
Generated tool count: 42
Source: ../shade-browser-mcp/src/shade_browser_mcp/server.py
Navigation
browser_navigate
Navigate to a URL and (by default) surface the Brave window to the foreground.
async def browser_navigate(url: str, slot: int = -1, focus: bool = True) -> str
Parameters
url(str): The URL to navigate toslot(int): CDP slot number 0-19 (default: uses BRAVE_CDP_SLOT env or 0)focus(bool): If True (default), raise the window to the foreground after navigating. Set False when you want a quiet background load - useful in multi-agent flows where you don't want to steal the user's active window.
browser_tabs
List all open browser tabs/pages.
async def browser_tabs(slot: int = -1) -> str
Parameters
slot(int): CDP slot number 0-19
browser_navigate_back
Navigate back in browser history.
async def browser_navigate_back(slot: int = -1) -> str
Parameters
slot(int): CDP slot number 0-19
browser_open_visible
One-shot: claim a slot, launch a VISIBLE Brave window, navigate to URL.
The friction-free entrypoint for AI-driven walkthroughs. Replaces the error-prone three-step ritual of claim_slot -> launch -> navigate, and handles the Plasma+Wayland DISPLAY/XAUTHORITY auto-detection that has historically led to silent invisible-window failures.
async def browser_open_visible(url: str, session_id: str = '', extension_path: str = '', disable_other_extensions: bool = True, profile_mode: str = '') -> str
Parameters
url(str): The URL to open (passed to browser_navigate after launch).session_id(str): Optional human-readable owner tag. Defaults to this MCP process's _own_session_tag() (CLAUDE_SESSION_NAME or pid-<N>), which means subsequent same-process tool calls pass the ownership check without needing to thread session_id through.extension_path(str): Optional unpacked Chrome extension directory.disable_other_extensions(bool): Whether to disable all other extensions when extension_path is provided.profile_mode(str): Optional launcher profile mode: "persistent" or "isolated".
Interaction
browser_execute_steps
Execute a chain of browser actions in one MCP call.
Reduces round-trip token cost vs calling individual tools per step. Dispatches steps sequentially; stops on first error (browsers do not rollback).
v1 supported actions: - {"action": "navigate", "url": "..."} - {"action": "click", "ref": "css-selector"} - {"action": "type", "ref": "css-selector", "text": "..."} - {"action": "snapshot"} - {"action": "wait_for", "selector": "...", "timeout": 30000}
async def browser_execute_steps(steps: list[dict], slot: int = -1) -> str
Parameters
steps(list[dict]): List of step dicts; each has an "action" key + action-specific paramsslot(int): CDP slot number 0-19 (default: uses BRAVE_CDP_SLOT env or 0)
browser_click
Click an element on the page.
async def browser_click(selector: str = '', text: str = '', index: int = 0, slot: int = -1) -> str
Parameters
selector(str): CSS selector to clicktext(str): Find element by visible text content and click itindex(int): If multiple matches, click the Nth one (0-indexed)slot(int): CDP slot number 0-19
browser_type
Type text into an input field.
async def browser_type(selector: str = '', text: str = '', value: str = '', clear_first: bool = True, press_enter: bool = False, slot: int = -1) -> str
Parameters
selector(str): CSS selector of the inputtext(str): Find input by nearby label textvalue(str): The text to typeclear_first(bool): Clear the field before typing (default: True)press_enter(bool): Press Enter after typing (default: False)slot(int): CDP slot number 0-19
browser_press_key
Press a keyboard key or key combination.
async def browser_press_key(key: str, slot: int = -1) -> str
Parameters
key(str): Key to press (e.g., 'Enter', 'Tab', 'Escape', 'Control+a')slot(int): CDP slot number 0-19
browser_wait_for
Wait for an element to reach a specific state.
async def browser_wait_for(selector: str = '', state: str = 'visible', timeout: int = 10000, slot: int = -1) -> str
Parameters
selector(str): CSS selector to wait forstate(str): State to wait for ('visible', 'hidden', 'attached', 'detached')timeout(int): Max wait time in milliseconds (default: 10000)slot(int): CDP slot number 0-19
browser_fill_form
Fill multiple form fields at once.
async def browser_fill_form(fields: str, slot: int = -1) -> str
Parameters
fields(str): JSON string of field mappings, e.g. '{"#email": "user@test.com", "#password": "secret"}'slot(int): CDP slot number 0-19
browser_select_option
Select an option from a <select> dropdown.
async def browser_select_option(selector: str, value: str = '', label: str = '', slot: int = -1) -> str
Parameters
selector(str): CSS selector of the <select> elementvalue(str): Option value attribute to selectlabel(str): Option visible text to select (used if value is empty)slot(int): CDP slot number 0-19
browser_hover
Hover over an element.
async def browser_hover(selector: str, slot: int = -1) -> str
Parameters
selector(str): CSS selector to hover overslot(int): CDP slot number 0-19
Observation
browser_snapshot
Capture the current page's accessibility tree (DOM snapshot).
async def browser_snapshot(slot: int = -1) -> str
Parameters
slot(int): CDP slot number 0-19
browser_take_screenshot
Take a screenshot. Saves to evidence directory if label is provided.
async def browser_take_screenshot(full_page: bool = False, selector: str = '', label: str = '', slot: int = -1) -> str
Parameters
full_page(bool): Capture the full scrollable pageselector(str): CSS selector to screenshot a specific elementlabel(str): Evidence label (saves to engagement evidence directory)slot(int): CDP slot number 0-19
browser_watch_screen
Watch a browser slot over time by capturing a frame every interval.
Periodic-screenshot recorder: a headless-safe analogue of Rosetta's rosetta_record_walkthrough. Captures one PNG frame every interval_seconds for duration_seconds, letting an agent or the harness "watch" what the page does by Reading the returned frame paths in order.
Frames are captured via Playwright page.screenshot() - the SAME path browser_take_screenshot uses - so this works for a headless Brave (no X11/ffmpeg required). Frames are written to a dedicated subdirectory under the engagement evidence dir as ordered PNGs (frame-0001.png, ...).
async def browser_watch_screen(slot: int = -1, duration_seconds: int = 20, interval_seconds: int = 2, label: str = '', url_contains: str = '') -> str
Parameters
slot(int): CDP slot number 0-19 (default: uses BRAVE_CDP_SLOT env or 0).duration_seconds(int): Total wall-clock duration to watch (default 20, capped at 120).interval_seconds(int): Seconds between frames (default 2, min 1).label(str): Evidence subdir name. Sanitised; defaults to a timestampedwatch-<ts>directory when empty.url_contains(str): If set, capture the open tab whose URL contains this substring; otherwise the active tab. Falls back to the active tab if no tab matches.
browser_network_requests
Get recent network requests (useful for debugging API calls).
async def browser_network_requests(url_pattern: str = '', slot: int = -1) -> str
Parameters
url_pattern(str): Filter requests by URL substring (optional)slot(int): CDP slot number 0-19
browser_console_messages
Get recent console messages from the browser.
async def browser_console_messages(slot: int = -1) -> str
Parameters
slot(int): CDP slot number 0-19
browser_leak_check
Check for IP, DNS, and WebRTC leaks. Run after every tunnel assignment.
async def browser_leak_check(slot: int = -1) -> str
Parameters
slot(int): CDP slot number 0-19
Session
browser_load_cookies
Load cookies into the browser. Supports HttpOnly cookies.
async def browser_load_cookies(cookies: str, slot: int = -1) -> str
Parameters
cookies(str): JSON array of cookie objects, e.g.: [{"name": "session", "value": "abc", "domain": ".example.com", "path": "/", "httpOnly": true, "secure": true}]slot(int): CDP slot number 0-19
browser_list_sessions
Inventory saved browser sessions with metadata and hygiene warnings.
async def browser_list_sessions() -> str
browser_import_cookies_from_profile
Import cookies from a LOCALLY-installed browser profile into a slot.
Reads the user's real Brave/Chromium profile Cookies SQLite DB, decrypts each value (cross-store: keyring "Safe Storage" secret OR the basic-store peanuts key, with the Chrome 130+/Brave 142+ 32-byte domain-hash handled), filters by domain, and injects the matching cookies into the given CDP slot via the SAME path as browser_load_cookies (HttpOnly supported). Linux-only for now.
The profile DB is copied (locked while the browser runs) and opened read-only, so the live browser is never touched.
SECURITY: decrypted cookie VALUES are NEVER logged or returned. The result contains only names, domains, and counts.
async def browser_import_cookies_from_profile(domains: str, slot: int = -1, browser: str = 'brave', profile: str = 'Default') -> str
Parameters
domains(str): Substring/host filter. Comma-separated for multiple, e.g."trello.com,atlassian.com". A cookie is kept when any filter is a substring of its host. Required (pass a filter - importing every cookie in a profile is intentionally not the default).slot(int): CDP slot number 0-19 (default per BRAVE_CDP_SLOT).browser(str):"brave"(default),"chrome", or"chromium".profile(str): Profile directory name (default"Default").
browser_save_session
Save browser session (cookies + localStorage) to a file.
async def browser_save_session(name: str, slot: int = -1) -> str
Parameters
name(str): Session name (saved to ~/.cache/shade-sessions/{name}.json)slot(int): CDP slot number 0-19
browser_load_session
Load a saved session into the browser.
async def browser_load_session(name: str, slot: int = -1, drop_cookie_names: str = '') -> str
Parameters
name(str): Session name (loads from ~/.cache/shade-sessions/{name}.json)slot(int): CDP slot number 0-19drop_cookie_names(str): Optional comma-separated cookie names to skip while restoring. Useful for clearance cookies like cf_clearance that are bound to IP/browser fingerprint and can poison an otherwise valid auth session when transplanted.
browser_prepare_chatgpt_session
Prepare and classify a ChatGPT browser session.
This tool verifies readiness instead of assuming loaded cookies are usable. It never attempts to solve or bypass CAPTCHA, Cloudflare, or human checks.
async def browser_prepare_chatgpt_session(session_name: str = '', slot: int = -1, save_session_name: str = '', drop_cookie_names: str = 'cf_clearance', save_verified_session: bool = True) -> str
Parameters
session_name(str): Optional saved session to restore before verification.slot(int): CDP slot number 0-19.save_session_name(str): Optional session name to save after readiness is verified.drop_cookie_names(str): Comma-separated cookie names to skip during restore. Defaults to cf_clearance because Cloudflare clearance is not portable.save_verified_session(bool): Save/update the session only when readiness is ready.
browser_clone_session
Clone a saved session into multiple browser slots.
async def browser_clone_session(name: str, slots: str = '[]') -> str
Parameters
name(str): Session name to cloneslots(str): JSON array of slot numbers, e.g. "[1, 2, 3]"
Slots / Fleet
browser_claim_slot
Claim a free CDP slot via flock-protected cdp_slots.claim_slot().
Safe for concurrent callers - slots.json access is serialized by flock and dead-PID entries are auto-expired on read (no zombie lockout).
async def browser_claim_slot(session_id: str = '', extension_path: str = '', disable_other_extensions: bool = True, profile_mode: str = '') -> str
Parameters
session_id(str): Optional human-readable owner tag. When omitted (or blank / "unknown"), defaults to this MCP server's own identity via_own_session_tag()so that subsequent tool calls from the same process pass ownership validation (#2).extension_path(str): Optional unpacked Chrome extension directory.disable_other_extensions(bool): Whether to disable all other extensions when extension_path is provided.profile_mode(str): Optional launcher profile mode: "persistent" or "isolated".
browser_release_slot
Release a CDP slot - removes the slots.json entry and SIGTERMs Brave.
async def browser_release_slot(slot: int) -> str
Parameters
slot(int): Slot number 0-19 to release.
browser_list_slots
List all CDP slots with validated liveness (dead PIDs already expired).
Returns the parsed slots.json after cdp_slots._validate_slots() has run, so only genuinely-alive slots appear. Empty {slots: {}} if nothing claimed.
async def browser_list_slots() -> str
Stealth
browser_use_tunnel
Launch a browser slot through a Shade VPN tunnel.
async def browser_use_tunnel(tunnel_id: str = '', slot: int = -1) -> str
Parameters
tunnel_id(str): Tunnel name (e.g. 'mvpn_81') or empty for randomslot(int): Specific slot to use, or -1 for auto-assign free slot
browser_use_tor
Launch a browser slot through Tor for .onion browsing.
async def browser_use_tor(slot: int = -1) -> str
Parameters
slot(int): Specific slot to use, or -1 for auto-assign free slot
browser_rotate_ip
Rotate to a new tunnel exit IP. Optionally preserves session state.
async def browser_rotate_ip(slot: int = -1, preserve_session: bool = True) -> str
Parameters
slot(int): CDP slot number currently in usepreserve_session(bool): Save and reload cookies/localStorage across rotation
browser_apply_personality
Apply or regenerate a stealth personality profile for a browser slot.
Each slot has a unique personality (user agent, viewport, timezone, locale, platform, languages) that overrides browser fingerprint properties to avoid detection. Personalities are auto-applied on first connect.
Call with no personality_name to view the current personality. Call with personality_name="regenerate" to randomize a new personality.
async def browser_apply_personality(slot: int = -1, personality_name: str = '') -> str
Parameters
slot(int): CDP slot number 0-19 (default: uses BRAVE_CDP_SLOT env or 0)personality_name(str): "regenerate" to create a new random personality, or empty string to view the current one
Web3
browser_web3_monitor
Install window.ethereum monitoring. Logs all wallet RPC calls.
async def browser_web3_monitor(slot: int = -1) -> str
Parameters
slot(int): CDP slot number 0-19
browser_inject_signer
Inject a minimal EIP-1193 wallet provider. No MetaMask needed.
async def browser_inject_signer(private_key: str, chain_id: int = 1, slot: int = -1) -> str
Parameters
private_key(str): Hex private key (0x...)chain_id(int): Ethereum chain ID (1=mainnet, 137=polygon, etc.)slot(int): CDP slot number 0-19
Advanced / Other
browser_evaluate
Execute JavaScript in the browser and return the result.
async def browser_evaluate(script: str, slot: int = -1) -> str
Parameters
script(str): JavaScript code to executeslot(int): CDP slot number 0-19
browser_resize
Resize the browser viewport.
async def browser_resize(width: int = 1280, height: int = 720, slot: int = -1) -> str
Parameters
width(int): Viewport width in pixels (default: 1280)height(int): Viewport height in pixels (default: 720)slot(int): CDP slot number 0-19
browser_cdp_command
Execute a raw CDP command. For advanced scenarios (WebAuthn, ServiceWorker, Fetch).
async def browser_cdp_command(method: str, params: str = '{}', slot: int = -1) -> str
Parameters
method(str): CDP method (e.g., 'WebAuthn.enable', 'Network.setCookies')params(str): JSON string of CDP parametersslot(int): CDP slot number 0-19
browser_network_intercept
Capture network requests with full request/response bodies.
async def browser_network_intercept(url_pattern: str = '', capture_body: bool = True, slot: int = -1) -> str
Parameters
url_pattern(str): URL substring to filter (empty = capture all)capture_body(bool): Include request/response bodiesslot(int): CDP slot number 0-19
browser_ws_monitor
Install WebSocket monitoring. Logs all WS frames via prototype patching.
async def browser_ws_monitor(slot: int = -1) -> str
Parameters
slot(int): CDP slot number 0-19
browser_webauthn_bypass
Create a virtual WebAuthn authenticator via CDP. Bypasses most WebAuthn.
async def browser_webauthn_bypass(rp_id: str = '', slot: int = -1) -> str
Parameters
rp_id(str): Relying party ID (e.g., 'example.com'). Empty = auto-detect.slot(int): CDP slot number 0-19
browser_passive_recon
Run passive reconnaissance against a domain. Zero trace on target. Queries CT logs, DNS history, cached Shodan data via browser.
async def browser_passive_recon(domain: str, slot: int = -1) -> str
Parameters
domain(str): Target domain (e.g., 'example.com')slot(int): CDP slot number (recommend using a Tor-routed slot)
browser_perf_profile
Run a CDP performance profile for the specified duration.
async def browser_perf_profile(duration: int = 5, slot: int = -1) -> str
Parameters
duration(int): Profiling duration in seconds (default: 5)slot(int): CDP slot number 0-19