WaveXisMCP
Drive real Chrome/Edge/Firefox browsers from an MCP client for one-off or multi-step LLM automation, with up to 220 tools depending on enabled tiers.
Open/close/manage persistent sessions or run stateless one-shot calls; inspect session/backend info.
Navigate, wait for load/selector/network-idle/URL, go back/forward, reload, stop, and manage tabs/pages.
Capture screenshots (full-page, element, annotated), PDFs, MHTML/text snapshots, and frame sequences.
Scrape multiple URLs, evaluate JavaScript, inspect/modify DOM, iframes, and shadow DOM.
Interact with pages by CSS selector or natural language: click, type, fill forms, select options, hover, drag/drop, tap, upload files, keyboard/mouse control.
Read/set/delete/clear cookies and find elements by text or accessibility snapshot.
Use CDP or BiDi backends with Chrome/Edge/Firefox, stealth mode, custom headers/UA/proxy, existing profiles, or remote browsers.
Enable extra capability tiers for network, storage, emulation, a11y, devtools, vision, video, testing, workflows, data, and experimental features.
Invoke arbitrary wavexis backend methods as an escape hatch; run via stdio/HTTP/Docker with rate limiting and security safeguards.
Offers experimental Bluetooth device emulation and interaction for testing Web Bluetooth API functionality.
Enables cross-browser automation of Firefox via the BiDi protocol, supporting navigation, interaction, and testing.
Integrates Google Lighthouse to run performance, accessibility, and best practice audits on web pages.
Provides experimental support for WebAuthn authentication, allowing testing of passwordless login and credential management.
Click on "Deploy Server".
Wait a few minutes for the server to deploy. Once ready, it will show a "Started" state.
In the chat, type
@followed by the MCP server name and your instructions, e.g., "@WaveXisMCP take a full-page screenshot of the wavexis repo on GitHub"
That's it! The server will respond to your query, and you can continue using it as needed.
Here is a step-by-step guide with screenshots.
MCP server that exposes the wavexis browser automation library to LLMs. 220 tools across 13 capability tiers. No Node.js, no Chromium download — uses your existing Chrome/Edge. 100% Python.
Quick demo
30 seconds to your first screenshot. Add this to your MCP client config (Claude Desktop, Cursor, Windsurf, VS Code):
{
"mcpServers": {
"wavexis": {
"command": "uvx",
"args": ["wavexis-mcp", "--caps", "all"]
}
}
}Then ask your LLM:
"Take a full-page screenshot of https://example.com"
The LLM calls wavexis_screenshot(url="https://example.com", full_page=true) and returns the screenshot. No Node.js, no Chromium download, no setup beyond the config above.
Related MCP server: DrissionPage MCP Server
Why WaveXisMCP?
WaveXisMCP wraps the wavexis browser automation library and exposes it as an MCP server. You don't need Node.js, Playwright, or a separate Chromium download — WaveXisMCP launches your existing Chrome or Edge installation directly.
Key features
220 tools — 3x more than Playwright MCP (21), 2x more than zendriver-mcp (96)
13 capability tiers — enable only what you need via
--caps. Start withcore(72 tools), add tiers as neededChrome + Firefox — CDP for Chrome/Edge, BiDi for Firefox. Both auto-launch their drivers from PATH
No Chromium download — uses your existing browser. ~5MB install vs ~400MB for Playwright MCP
Stealth mode —
stealth=truehidesnavigator.webdriver, fakes plugins/languages/chrome runtimeStructured errors — every error includes a
suggestionfield so the LLM self-corrects without human helpMulti-action YAML — chain navigate → click → fill → screenshot in a single tool call
Raw CDP/BiDi access — escape hatch for any browser feature not covered by a dedicated tool
Lighthouse audits, WebAuthn, Bluetooth, Cast — niche features no other MCP server covers
SSRF protection, path sandboxing, rate limiting — security built in from day one
700+ tests, 90% coverage enforced, E2E with real Chrome — production-ready
How it works
You (natural language)
→ LLM decides which tool to call
→ WaveXisMCP receives the tool call
→ wavexis library executes it via CDP or BiDi
→ Chrome/Edge/Firefox performs the action
← Result returned as JSON (text, base64, file path)
← JSON passed back to LLM
← LLM summarizes the result for youThe LLM never sees the browser directly. It only sees tool definitions (name, description, parameters) and JSON responses. This means any MCP-compatible LLM client works out of the box — no custom integrations needed.
Core concepts
Tool — A single browser operation (screenshot, eval, click, etc.) exposed as an MCP tool that any LLM client can call.
Session — A persistent browser instance. Open a session, chain multiple tool calls, close when done. Avoids the overhead of launching a browser per action.
Stateless mode — Call any tool with a
urlparameter. The browser launches, executes, and closes automatically.Capability tiers — 13 tiers from
core(72 tools) toall(220 tools). Enable only what you need via--caps.Dual backend — CDP (Chromium-native, via cdpwave) and BiDi (W3C cross-browser, via bidiwave) with per-session selection.
Structured errors — Every error includes a
suggestionfield that tells the LLM what to do next, enabling self-correction without human intervention.
Install
pip install wavexis-mcpThe CDP backend (Chromium) is included by default. For the BiDi backend (Firefox):
pip install "wavexis-mcp[bidi]"Or run without installing (recommended):
uvx wavexis-mcpRequirements
Python: 3.11, 3.12, or 3.13
Browser: Google Chrome, Microsoft Edge, or any Chromium/Chrome-based browser
BiDi backend (optional): ChromeDriver/EdgeDriver for Chrome, or geckodriver for Firefox
Quick start
Add to your MCP client config (Claude Desktop, Cursor, Windsurf, VS Code):
{
"mcpServers": {
"wavexis": {
"command": "uvx",
"args": ["wavexis-mcp", "--caps", "all"]
}
}
}Or with pip:
{
"mcpServers": {
"wavexis": {
"command": "wavexis-mcp",
"args": ["--caps", "all"]
}
}
}Stateless mode (one-shot)
Call any tool with a url parameter — the browser launches, executes, and closes automatically:
wavexis_screenshot(url="https://example.com", full_page=true)Session mode (multi-step)
Open a session, chain multiple actions, close when done:
wavexis_session_open(backend="cdp", headless=false)
→ {"session_id": "abc-123"}
wavexis_navigate(session_id="abc-123", url="https://example.com")
wavexis_click(session_id="abc-123", selector="#login")
wavexis_screenshot(session_id="abc-123")
wavexis_session_close(session_id="abc-123")Natural language interaction (M1)
Use wavexis_act to interact with pages using natural language:
wavexis_session_open(backend="cdp")
wavexis_navigate(session_id="abc-123", url="https://example.com")
wavexis_act(session_id="abc-123", instruction="click the login button")
→ {"action": "click", "element": {"ref": "el-3", "role": "button", "name": "Login"}, "status": "ok"}The wavexis_act tool takes an a11y snapshot, matches the instruction to an element using keyword scoring, and executes the detected action (click, type, fill, hover). No external LLM calls — pure heuristic matching.
Capability tiers
Tier | Flag | Tools | Key features |
Core | always on | 72 | Session, navigation, screenshot, PDF, scrape, eval, DOM, input, cookies, tabs, NL interaction, iframe, shadow DOM, events |
Network |
| 20 | Headers, UA, block, throttle, cache, HAR, intercept, mock, modify req/resp, request body, replay HAR, request list |
Storage |
| 18 | localStorage, sessionStorage, cache storage, IndexedDB, state save/restore |
Emulation |
| 9 | Device, viewport, geolocation, timezone, dark mode, locale, CPU, touch, sensors |
A11y |
| 4 | Accessibility tree snapshot, node traversal, axe-core audit |
Interactions |
| 5 | Dialogs, downloads, permissions |
DevTools |
| 31 | Performance, CSS, debugging, overlay, console, security, window mgmt, combined trace, annotated screenshot |
Vision |
| 7 | Coordinate-based mouse (pixel-precise) |
Video |
| 4 | Video recording, chapters, action overlay |
Testing |
| 6 | Assertions, locator generation |
Workflows |
| 6 | Multi-action YAML, raw CDP/BiDi, browser context CRUD |
Data |
| 7 | Codegen, Lighthouse audit, extract, websocket intercept, crawl, visual diff, core web vitals |
Experimental |
| 31 | Service workers, animations, WebAuthn, WebAudio, media, cast, bluetooth, extensions, prefs |
Total |
| 220 |
Default: --caps=core (72 tools). Enable all: --caps=all. Enable specific: --caps=network,storage,emulation.
Tip: Start with
--caps coreand add tiers as needed. Each tier adds tool definitions to the LLM's context, which consumes tokens. For most tasks,core,network,storage(110 tools) is a good balance.
Backends
WaveXisMCP supports two backends with full feature parity:
CDP (cdpwave) — default, Chrome DevTools Protocol. Direct WebSocket to Chrome/Edge. No driver needed. 57 CDP domains. Included by default.
BiDi (bidiwave) — WebDriver BiDi protocol, W3C cross-browser (Firefox, Chrome). Needs chromedriver (Chrome) or geckodriver (Firefox); both are auto-launched from PATH if not already running.
pip install "wavexis-mcp[bidi]"
Select per session:
# CDP (default, Chrome/Edge only)
wavexis_session_open(backend="cdp")
# BiDi with Chrome (auto-launches chromedriver)
wavexis_session_open(backend="bidi", browser="chrome")
# BiDi with Firefox (auto-launches geckodriver)
wavexis_session_open(backend="bidi", browser="firefox")Connect to existing Chrome
Use connect_existing=True to launch Chrome with --remote-debugging-port and connect to it. Useful for reusing a browser profile with logged-in sessions:
# Launch Chrome with debug port and connect via CDP
wavexis_session_open(connect_existing=true)
# Reuse an existing Chrome profile (keeps logins, cookies, extensions)
wavexis_session_open(connect_existing=true, user_data_dir="C:/Users/me/ChromeProfile")Chrome is launched headed (headless is ignored). The browser subprocess is terminated when the session is closed.
Multi-action YAML
Chain multiple actions in a single tool call by passing a YAML string:
wavexis_multi_action(
config="""
actions:
- navigate: https://example.com
- screenshot:
full_page: true
- eval: document.title
- click: "#login"
- type:
selector: "#username"
text: admin@example.com
- screenshot: {}
""",
session_id="abc-123"
)Supported action types: navigate, screenshot, eval, click, type, fill. Set continue_on_error: true to keep executing on failures.
MCP resources & prompts (M3)
Resources (read-only browser state):
wavexis://session/{id}/url— current page URLwavexis://session/{id}/cookies— cookies as JSONwavexis://session/{id}/console— console messageswavexis://session/{id}/tabs— open tabs
Prompts (workflow templates):
scrape_page(url, selector)— scrape and extract contentaudit_page(url)— full a11y + performance auditfill_form(url, fields)— fill a form on a pagedebug_page(url)— debug console, network, performance
HTTP transport
Run WaveXisMCP as an HTTP server for CI/CD, shared instances, or Docker:
# HTTP on localhost
wavexis-mcp --transport http --port 8765
# HTTP with all tiers
wavexis-mcp --transport http --port 8765 --caps all
# HTTP with remote access (use behind a reverse proxy!)
wavexis-mcp --transport http --allow-remote --port 8765Binds to 127.0.0.1 by default. Use --allow-remote for 0.0.0.0.
Rate limiting (M4)
Per-session token bucket rate limiting:
# 10 calls/sec, burst of 5
wavexis-mcp --rate-limit 10 --rate-burst 5When exceeded, the tool returns the standard structured error: {"error": "Rate limit exceeded. Retry after Nms.", "type": "RuntimeError", ...}. Set --rate-limit 0 to disable.
Docker
# Pull and run
docker run -p 8765:8765 ghcr.io/mathiaspaulenko/wavexis-mcp
# Or build locally
docker build -t wavexis-mcp .
docker run -p 8765:8765 wavexis-mcp
# Docker Compose
docker-compose upSee Docker docs for details.
Comparison
Feature | Playwright MCP | WaveXisMCP |
Language | TypeScript | Python |
Node.js required | ✗ | ✓ (no Node.js) |
Downloads Chromium (~200MB) | ✓ | ✗ (uses existing browser) |
Install size | ~400MB | ~5MB |
Cold start | 3.2s | 0.8s |
Total tools | ~21 | 220 |
Capability tiers (opt-in) | ✗ | ✓ (13 tiers) |
Dual protocol (CDP + BiDi) | ✗ | ✓ |
Firefox support | ✓ (basic) | ✓ (BiDi + geckodriver auto-launch) |
Backend selection (per session) | ✗ | ✓ |
Stealth / anti-bot mode | ✗ | ✓ |
Raw CDP/BiDi access | ✗ | ✓ (escape hatch) |
Multi-action YAML batching | ✗ | ✓ |
Video recording | ✗ | ✓ |
Lighthouse audit | ✗ | ✓ |
WebAuthn / Bluetooth / Cast | ✗ | ✓ |
Natural language interaction | ✗ | ✓ ( |
MCP resources & prompts | ✗ | ✓ |
Rate limiting | ✗ | ✓ |
SSRF protection | ✗ | ✓ |
Structured errors with suggestions | ✗ | ✓ |
Note: Playwright MCP supports WebKit (Safari) — WaveXisMCP does not (yet). See the roadmap for planned features.
Documentation
Full documentation, API reference, and examples are hosted at mathiaspaulenko.github.io/wavexis-mcp.
Key sections:
Error handling
All tools return structured error JSON on failure. Every error includes a suggestion field that guides the LLM toward the next action:
{
"error": "Session 'abc-123' not found.",
"tool": "wavexis_navigate",
"type": "SessionNotFoundError",
"message": "Session 'abc-123' not found.",
"suggestion": "Call wavexis_session_open first to create a browser session."
}This enables the LLM to self-correct without human intervention — it reads the suggestion and calls the recommended tool.
Architecture
WaveXisMCP sits at the top of a three-layer ecosystem:
WaveXisMCP (MCP server, 220 tools)
└─ wraps → wavexis (browser automation library)
├─ cdpwave (CDP backend, Chromium-native)
└─ bidiwave (BiDi backend, W3C cross-browser)cdpwave — low-level async Python library for the Chrome DevTools Protocol. Direct WebSocket to Chrome/Edge. No driver binary needed.
bidiwave — low-level async Python library for the WebDriver BiDi protocol (W3C standard). Works with Firefox, Chrome, and Edge.
wavexis — high-level browser automation library that abstracts cdpwave and bidiwave behind a unified
AbstractBackendinterface.WaveXisMCP — MCP server wrapping wavexis. Exposes each backend method as an MCP tool with Pydantic v2 input validation, JSON responses, and capability tier filtering.
See Architecture docs for the full system design, data flow diagrams, and ADRs.
Development
git clone https://github.com/MathiasPaulenko/wavexis-mcp.git
cd wavexis-mcp
pip install -e ".[dev]"
# Run quality checks
ruff check wavexis_mcp tests
ruff format --check
mypy wavexis_mcp
python -m bandit -r wavexis_mcp
# Run tests
pytest tests/unit -vContributing
Contributions are welcome. Please see CONTRIBUTING.md for the development workflow, coding standards, and pull request process. For security issues, see SECURITY.md.
Acknowledgements
WaveXisMCP is built on the wavexis browser automation library and the Model Context Protocol. Thanks to the open-source Python and MCP communities for the tools and standards that make this project possible.
License
MIT
mcp-name: io.github.MathiasPaulenko/wavexis-mcp
Available Tools
72 toolswavexis_actA
Execute a natural language instruction on the current page (M1).
Takes an a11y snapshot, matches the instruction to an element, and performs the detected action (click, type, fill, hover).
Args: input: Act parameters (instruction, session_id, max_retries).
Returns:
JSON string with action, element, score, status.
Inputs: input (required). Returns: result
wavexis_activate_tabAIdempotent
Focus (bring to front) a browser tab by its ID.
Use to switch the active tab before running navigation or interaction tools; use wavexis_list_tabs to obtain tab IDs first.
Side effects: Changes the browser's active tab; subsequent tool calls operate on the newly focused tab. Returns: JSON string with keys: 'status' ('ok'/'error').
Inputs: input (required). Returns: result
wavexis_annotated_screenshotARead-onlyIdempotent
Capture a screenshot with numbered labels overlaid on elements.
Injects overlay divs with labels @e1, @e2, ... on each element matching the provided selectors, captures a screenshot, removes the overlays, and returns the image plus a label-to-selector map.
Use wavexis_screenshot for plain captures, or this tool when
visual element identification is needed for follow-up actions.
Side effects: uses an existing session backend, injects and removes
temporary overlay DOM nodes; writes to output_path when given.
Returns: JSON string with keys: 'status' ('ok'/'error'), 'format'
(str), 'base64' (str) or 'path' (str), 'size_bytes' (int), 'labels'
(dict[str, str]).
Inputs: input (required). Returns: result
wavexis_backA
Navigate backward one step in the browser history.
Use for history navigation instead of wavexis_navigate when the target is the previous page.
Side effects: Changes the active page to the previous history entry; may trigger network requests if that page was not cached. Returns: JSON string with keys: 'status' ('ok'/'error').
Inputs: input (required). Returns: result
wavexis_backendsARead-onlyIdempotent
List installed browser backends and their versions without launching a browser.
Use wavexis_browser_version instead when you need the version of a
specific running session's backend.
Side effects: None; queries the local filesystem only. Returns: JSON string with keys: 'status' ('ok'/'error'), 'backends' (dict), 'available' (list[str]).
Inputs: no named parameters. Returns: result
wavexis_browser_versionARead-onlyIdempotent
Query the active browser's version string via the selected backend.
Use wavexis_backends instead when you need a list of all installed
backends without launching a browser.
Side effects: Acquires (and may launch) a browser backend, then releases it. Returns: JSON string with keys: 'status' ('ok'/'error'), 'version' (str), 'backend' (str).
Inputs: input (required). Returns: result
wavexis_checkADestructiveIdempotent
Check a checkbox or radio button matching a CSS selector.
Use wavexis_uncheck to uncheck a checkbox or wavexis_click for generic element activation.
Side effects: Clicks the target checkbox/radio, toggling its checked state and firing change events. Returns: JSON string with keys: 'status' ('ok'/'error'), 'checked' (bool, the element's checked state after the action). On error also 'error', 'tool', 'type', 'message', 'suggestion' (all str).
Inputs: input (required). Returns: result
wavexis_clickADestructive
Click an element matching a CSS selector.
Use wavexis_double_click for double clicks, wavexis_right_click for context menus, or wavexis_nl_click when you only have a text description.
Side effects: Triggers a click event on the target element, which may submit forms, toggle controls, or navigate the page. Returns: JSON string with keys: 'status' ('ok'/'error'). On error also 'error', 'tool', 'type', 'message', 'suggestion' (all str).
Inputs: input (required). Returns: result
wavexis_close_pageADestructive
Close a browser page/tab by target id, or the current page if omitted.
This tool mirrors Playwright's API for compatibility; use it to free resources. The session itself remains active for other tabs.
Side effects: Closes the specified browser target; destructive and irreversible. Returns: JSON string with keys: 'status' ('ok'/'error'), 'closed' (str).
Inputs: input (required). Returns: result
wavexis_close_tabADestructiveIdempotent
Close a browser tab by its ID.
Use to clean up tabs created with wavexis_new_tab; use wavexis_session_close to terminate the entire session instead.
Side effects: Closes the specified tab and discards its page state. Destructive — unsaved data in that tab is lost. Returns: JSON string with keys: 'status' ('ok'/'error').
Inputs: input (required). Returns: result
wavexis_console_clearADestructiveIdempotent
Clear all buffered console messages for the session.
This tool mirrors Playwright's API for compatibility; use it before capturing a fresh set of console logs to avoid stale entries.
Side effects: Resets the session's in-memory console message buffer. Returns: JSON string with keys: 'status' ('ok'/'error').
Inputs: input (required). Returns: result
wavexis_cookie_getARead-onlyIdempotent
Retrieve a single cookie by name (and optional domain/path) from the browser.
Use wavexis_cookie_list instead when you need multiple cookies or
broad filtering.
Side effects: None; reads cookie state from the browser session. Returns: JSON string with keys: 'status' ('ok'/'error'), 'cookie' (dict|null).
Inputs: input (required). Returns: result
wavexis_cookie_listARead-onlyIdempotent
List browser cookies with optional name, domain, and path filters.
Use wavexis_cookie_get instead when you need a single named cookie.
Side effects: None; reads cookie state from the browser session. Returns: JSON string with keys: 'status' ('ok'/'error'), 'cookies' (list[dict]), 'count' (int).
Inputs: input (required). Returns: result
wavexis_cookies_clearADestructiveIdempotent
Clear all cookies from the browser session.
Use wavexis_cookies_delete to remove a specific cookie, or
wavexis_cookies_get to inspect cookies before clearing.
Side effects: uses an existing session backend, destructively removes all cookies from the browser. Returns: JSON string with keys: 'status' ('ok'/'error').
Inputs: input (required). Returns: result
wavexis_cookies_deleteADestructiveIdempotent
Delete cookies matching a name and domain in the browser.
Use wavexis_cookies_clear to remove all cookies, or
wavexis_cookies_set to add a new cookie.
Side effects: launches/acquires a browser backend, navigates to url
if provided, destructively removes matching cookies from browser state.
Returns: JSON string with keys: 'status' ('ok'/'error').
Inputs: input (required). Returns: result
wavexis_cookies_getARead-onlyIdempotent
Retrieve all cookies for the current page context.
Use wavexis_cookies_set to add a cookie, or
wavexis_cookies_clear to remove all cookies at once.
Side effects: launches/acquires a browser backend, navigates to url
if provided; read-only with respect to browser state.
Returns: JSON string with keys: 'status' ('ok'/'error'), 'cookies'
(list[dict]), 'count' (int).
Inputs: input (required). Returns: result
wavexis_cookies_setA
Set a single cookie in the browser for the current page.
Use wavexis_cookies_get to read cookies, or
wavexis_cookies_delete to remove a specific cookie.
Side effects: launches/acquires a browser backend, navigates to url
if provided, mutates browser cookie state.
Returns: JSON string with keys: 'status' ('ok'/'error').
Inputs: input (required). Returns: result
wavexis_dom_focusAIdempotent
Focus an element matching a CSS selector.
Use wavexis_dom_click instead when the intent is to activate a control rather than focus it.
Side effects: Mutates DOM focus state; may trigger focus event handlers on the element. Returns: JSON string with keys: 'status' ('ok'/'error').
Inputs: input (required). Returns: result
wavexis_dom_getARead-onlyIdempotent
Retrieve the HTML of an element matching a CSS selector.
Use wavexis_dom_query instead when you need element metadata rather than raw HTML.
Side effects: None; read-only. May navigate to url if provided.
Returns: JSON string with keys: 'status' ('ok'/'error'), 'html' (str), 'selector' (str).
Inputs: input (required). Returns: result
wavexis_dom_get_attrARead-onlyIdempotent
Read an attribute value from an element matching a CSS selector.
Use wavexis_dom_set_attr to write an attribute value.
Side effects: None; read-only. Returns: JSON string with keys: 'status' ('ok'/'error'), 'value' (str|None), 'selector' (str), 'name' (str).
Inputs: input (required). Returns: result
wavexis_dom_queryARead-onlyIdempotent
Query elements by CSS selector and return paginated metadata.
Use wavexis_dom_get instead when you only need the raw HTML of a single element.
Side effects: None; read-only. May navigate to url if provided.
Returns: JSON string with keys: 'status' ('ok'/'error'), 'elements' (list[dict]),
'count' (int), 'total' (int).
Inputs: input (required). Returns: result
wavexis_dom_removeADestructiveIdempotent
Remove an element matching a CSS selector from the DOM.
Use wavexis_dom_set_attr to hide an element (e.g. display:none) instead of deleting it.
Side effects: Destructive; permanently removes the matched element from the live DOM. Returns: JSON string with keys: 'status' ('ok'/'error').
Inputs: input (required). Returns: result
wavexis_dom_remove_attrADestructiveIdempotent
Remove an attribute from an element matching a CSS selector.
Use wavexis_dom_set_attr to restore or change an attribute instead of removing it.
Side effects: Mutates the DOM by deleting the attribute from the matched element. Returns: JSON string with keys: 'status' ('ok'/'error').
Inputs: input (required). Returns: result
wavexis_dom_scrollAIdempotent
Scroll to an element or by a pixel offset.
Use wavexis_dom_get to inspect an element's position before scrolling by offset.
Side effects: Changes the page scroll position; may trigger scroll event listeners. Returns: JSON string with keys: 'status' ('ok'/'error').
Inputs: input (required). Returns: result
wavexis_dom_set_attrAIdempotent
Set an attribute on an element matching a CSS selector.
Use wavexis_dom_get_attr to read the current value before setting.
Side effects: Mutates the DOM by writing the attribute on the matched element. Returns: JSON string with keys: 'status' ('ok'/'error').
Inputs: input (required). Returns: result
wavexis_dom_snapshotARead-onlyIdempotent
Capture a full DOM snapshot of the page including iframes and shadow roots.
Use wavexis_dom_query for lightweight element metadata instead of a full snapshot.
Side effects: None; read-only. Returns: JSON string with keys: 'status' ('ok'/'error'), 'snapshot' (dict), 'documents' (int).
Inputs: input (required). Returns: result
wavexis_double_clickADestructive
Double-click an element matching a CSS selector.
Use wavexis_click for single clicks or wavexis_nl_click when you only have a natural language description of the element.
Side effects: Fires two rapid click events on the element, which may open files, edit cells, or trigger application-specific actions. Returns: JSON string with keys: 'status' ('ok'/'error'). On error also 'error', 'tool', 'type', 'message', 'suggestion' (all str).
Inputs: input (required). Returns: result
wavexis_dragADestructive
Drag an element from a source selector to a target selector.
Use wavexis_drop when you need to drop arbitrary MIME data or files onto an element rather than dragging an existing DOM element.
Side effects: Performs a drag-and-drop operation between two elements, firing drag/dragstart/dragend and drop events. Returns: JSON string with keys: 'status' ('ok'/'error'). On error also 'error', 'tool', 'type', 'message', 'suggestion' (all str).
Inputs: input (required). Returns: result
wavexis_dropADestructive
Drop files or MIME-typed data onto an element via drag events.
Use wavexis_set_files for standard <input type="file"> uploads or
wavexis_drag for dragging an existing DOM element to another element.
Side effects: Dispatches dragEnter, dragOver, and drop events with the supplied data and files onto the target element's coordinates. Returns: JSON string with keys: 'status' ('ok'/'error'), 'selector' (str), 'x' (float), 'y' (float), 'data_types' (list[str]), 'files' (list[str]). On error also 'error', 'tool', 'type', 'message', 'suggestion' (all str).
Inputs: input (required). Returns: result
wavexis_evalA
Evaluate a JavaScript expression in the browser context and return the result.
Use wavexis_scrape when the same expression must run across many
pages, or wavexis_act for natural-language interaction instead of
raw JS.
Side effects: launches/acquires a browser backend, navigates to url
if provided, executes arbitrary JS in the page (may trigger network
requests or DOM mutations).
Returns: JSON string with keys: 'status' ('ok'/'error'), 'result'
(Any), 'type' (str).
Inputs: input (required). Returns: result
wavexis_fillADestructive
Fill an input element with a value, replacing existing content.
Use wavexis_type for character-by-character typing with key events, or wavexis_fill_form when filling multiple fields in one call.
Side effects: Clears the target input/textarea and sets its value to the provided string, firing a single input event. Returns: JSON string with keys: 'status' ('ok'/'error'). On error also 'error', 'tool', 'type', 'message', 'suggestion' (all str).
Inputs: input (required). Returns: result
wavexis_fill_formADestructive
Fill multiple form fields in one call (convenience composite tool).
Use wavexis_fill for a single field or wavexis_type when per-keystroke events are required.
Side effects: Clears and sets the value of each field in the provided list, firing input events on every targeted element. Returns: JSON string with keys: 'status' ('ok'/'error'), 'fields_filled' (int, number of fields successfully filled). On error also 'error', 'tool', 'type', 'message', 'suggestion' (all str).
Inputs: input (required). Returns: result
wavexis_findARead-onlyIdempotent
Search the accessibility snapshot for nodes matching text or a regex pattern.
Use wavexis_act instead for natural-language element interaction;
this tool mirrors Playwright's snapshot search for compatibility.
Side effects: None; fetches and searches the a11y tree read-only. Returns: JSON string with keys: 'status' ('ok'/'error'), 'matches' (list[dict]), 'count' (int).
Inputs: input (required). Returns: result
wavexis_find_by_textARead-onlyIdempotent
Find element selector(s) by visible text content without interacting.
Use this to locate elements before calling wavexis_click or wavexis_fill when you know the visible text but not the CSS selector.
Side effects: None — this is a read-only lookup that does not modify the page or interact with any element. Returns: JSON string with keys: 'selector' (str, first match) when all=False, or 'selectors' (list[str]) and 'count' (int) when all=True. On error also 'error', 'tool', 'type', 'message', 'suggestion' (all str).
Inputs: input (required). Returns: result
wavexis_forwardA
Navigate forward one step in the browser history.
Use after wavexis_back to restore a page; use wavexis_navigate for direct URL navigation instead.
Side effects: Changes the active page to the next history entry; may trigger network requests if that page was not cached. Returns: JSON string with keys: 'status' ('ok'/'error').
Inputs: input (required). Returns: result
wavexis_get_configARead-onlyIdempotent
Return wavexis-mcp server configuration and available browser backends.
Use wavexis_backends instead when you only need the backend list;
this tool additionally exposes the server name for introspection.
Side effects: None; queries the local filesystem only. Returns: JSON string with keys: 'status' ('ok'/'error'), 'name' (str), 'available_backends' (list[str]), 'backend_versions' (dict).
Inputs: input (required). Returns: result
wavexis_hoverA
Hover over an element matching a CSS selector.
Use wavexis_click to actually activate an element; hover only moves the cursor without clicking.
Side effects: Moves the mouse cursor over the target element, firing mouseover/mouseenter events that may reveal tooltips or menus. Returns: JSON string with keys: 'status' ('ok'/'error'). On error also 'error', 'tool', 'type', 'message', 'suggestion' (all str).
Inputs: input (required). Returns: result
wavexis_iframe_clickADestructive
Click an element inside an iframe.
Use wavexis_iframe_eval only for custom JS that click/fill cannot express.
Side effects: Triggers click handlers and may navigate or mutate the iframe DOM. Returns: JSON string with keys: 'status' ('ok'/'error').
Inputs: input (required). Returns: result
wavexis_iframe_evalA
Evaluate a JavaScript expression inside an iframe.
Use wavexis_iframe_click or wavexis_iframe_fill for standard interactions instead of raw JS.
Side effects: Arbitrary; executes user-supplied JavaScript within the iframe context. Returns: JSON string with keys: 'status' ('ok'/'error'), 'result' (any).
Inputs: input (required). Returns: result
wavexis_iframe_fillADestructive
Fill an input element inside an iframe with a value.
Use wavexis_iframe_click to submit or activate the field after filling.
Side effects: Mutates the input value within the iframe; may trigger input/change events. Returns: JSON string with keys: 'status' ('ok'/'error').
Inputs: input (required). Returns: result
wavexis_invokeADestructive
Invoke any wavexis backend method by name, the ultimate escape hatch.
Use a dedicated MCP tool (e.g. wavexis_act, wavexis_navigate)
instead when one exists for the desired action; this tool exposes the
full AbstractBackend API (e.g. page_print_to_pdf, perf_trace,
runtime_evaluate, pwa_install) for methods without a wrapper.
Side effects: May launch an ephemeral browser, navigate to a URL, and execute arbitrary backend methods; potentially destructive. Returns: JSON string with keys: 'status' ('ok'/'error'), 'type' (str), and either 'result' (any), 'base64' (str), or 'path' (str) depending on output.
Inputs: input (required). Returns: result
wavexis_key_downA
Dispatch a raw keyDown event to the active page via CDP.
This tool mirrors Playwright's API for compatibility; use
wavexis_press_keys for typing text and wavexis_act for
natural-language interaction.
Side effects: Sends a key-down input event to the browser page. Returns: JSON string with keys: 'status' ('ok'/'error').
Inputs: input (required). Returns: result
wavexis_key_pressA
Press a single keyboard key on the focused element.
Use wavexis_type for typing full strings or wavexis_fill for setting field values without individual key events.
Side effects: Dispatches a keydown/keypress/keyup sequence for the given key on whatever element currently has focus. Returns: JSON string with keys: 'status' ('ok'/'error'). On error also 'error', 'tool', 'type', 'message', 'suggestion' (all str).
Inputs: input (required). Returns: result
wavexis_key_upA
Dispatch a raw keyUp event to the active page via CDP.
This tool mirrors Playwright's API for compatibility; pair with
wavexis_key_down for low-level key control, or use
wavexis_press_keys for simple text entry.
Side effects: Sends a key-up input event to the browser page. Returns: JSON string with keys: 'status' ('ok'/'error').
Inputs: input (required). Returns: result
wavexis_list_tabsARead-onlyIdempotent
List all open browser tabs in the session.
Use to discover tab IDs before calling wavexis_activate_tab or wavexis_close_tab; use wavexis_session_info for session-level metadata instead.
Side effects: None — read-only query of the browser's tab list. Returns: JSON string with keys: 'status' ('ok'/'error'), 'tabs' (list[dict]), 'count' (int).
Inputs: input (required). Returns: result
wavexis_mouse_drag_xyADestructive
Drag the mouse from one screen coordinate to another via CDP mouse events.
This tool mirrors Playwright's API for compatibility; use wavexis_act
instead for natural-language drag interactions.
Side effects: Dispatches mouseMoved, mousePressed, and mouseReleased events to the browser page; may trigger page interactions. Returns: JSON string with keys: 'status' ('ok'/'error').
Inputs: input (required). Returns: result
wavexis_new_tabA
Create a new browser tab, optionally navigating to a URL.
Use to open a parallel page without losing the current tab; use wavexis_navigate to change the current tab's URL instead.
Side effects: Opens a new browser tab; if a URL is provided, issues a network request to it. Returns: JSON string with keys: 'status' ('ok'/'error'), 'tab_id' (str), 'url' (str).
Inputs: input (required). Returns: result
wavexis_nl_clickADestructive
Click an element described in natural language.
Use wavexis_click when you already know the CSS selector, or wavexis_nl_fill to fill a field described in natural language.
Side effects: Locates the best-matching element via text/semantic matching and triggers a click event on it. Returns: JSON string with keys: 'status' ('ok'/'error'). On error also 'error', 'tool', 'type', 'message', 'suggestion' (all str).
Inputs: input (required). Returns: result
wavexis_nl_fillADestructive
Fill an element described in natural language with a value.
Use wavexis_fill when you already know the CSS selector, or wavexis_nl_click to click an element described in natural language.
Side effects: Locates the best-matching element via text/semantic matching, clears it, and sets its value to the provided string. Returns: JSON string with keys: 'status' ('ok'/'error'). On error also 'error', 'tool', 'type', 'message', 'suggestion' (all str).
Inputs: input (required). Returns: result
wavexis_page_pdfARead-onlyIdempotent
Generate a PDF via the low-level Page.printToPDF CDP method.
Offers pixel-level control over paper size, margins, and print
options beyond wavexis_pdf. Use wavexis_pdf for simpler
high-level PDF generation.
Side effects: launches/acquires a browser backend, navigates to url
if provided; writes to output_path when given.
Returns: JSON string with keys: 'status' ('ok'/'error'), 'type'
('pdf'), 'base64' (str) or 'path' (str), 'size_bytes' (int).
Inputs: input (required). Returns: result
wavexis_page_snapshotARead-onlyIdempotent
Capture the page as MHTML or a plain text document.
Use wavexis_scrape for structured data extraction, or this tool
when a full page archive (MHTML) or text dump is required.
Side effects: launches/acquires a browser backend, navigates to url
if provided; writes to output_path when given.
Returns: JSON string with keys: 'status' ('ok'/'error'), 'format'
(str), 'content' (str) or 'path' (str), 'size_bytes' (int).
Inputs: input (required). Returns: result
wavexis_pdfARead-onlyIdempotent
Generate a PDF document from a web page.
Use wavexis_screenshot for image capture, or wavexis_page_pdf
when pixel-level control over paper size and margins is required.
Side effects: launches/acquires a browser backend, navigates to url
if provided, optionally evaluates js; writes to output_path when
given.
Returns: JSON string with keys: 'status' ('ok'/'error'), 'base64'
(str) or 'path' (str), 'size_bytes' (int).
Inputs: input (required). Returns: result
wavexis_press_keysA
Type a sequence of characters at the page level without targeting an element.
Use wavexis_key_down/wavexis_key_up instead for individual
modifier-key control, or wavexis_act for natural-language typing.
Side effects: Dispatches keyDown/keyUp pairs to the browser page; no network requests. Returns: JSON string with keys: 'status' ('ok'/'error'), 'typed' (str).
Inputs: input (required). Returns: result
wavexis_reloadA
Reload the current page, optionally bypassing the cache.
Use to refresh stale content or retry a failed load; use wavexis_navigate to go to a different URL instead.
Side effects: Re-issues network requests for the current page and its resources; discards in-memory page state. Returns: JSON string with keys: 'status' ('ok'/'error').
Inputs: input (required). Returns: result
wavexis_right_clickADestructive
Right-click an element matching a CSS selector.
Use wavexis_click for standard left clicks or wavexis_double_click for double clicks.
Side effects: Fires a contextmenu event on the element, typically opening a context menu in the browser. Returns: JSON string with keys: 'status' ('ok'/'error'). On error also 'error', 'tool', 'type', 'message', 'suggestion' (all str).
Inputs: input (required). Returns: result
wavexis_scrapeARead-onlyIdempotent
Scrape data from multiple URLs by evaluating a JS expression on each.
Use wavexis_eval for single-page evaluation, or wavexis_scrape
when the same expression must run across many pages with pagination.
Side effects: launches/acquires a browser backend, navigates to each
URL in urls sequentially, evaluates expression in every page
context.
Returns: JSON string with keys: 'status' ('ok'/'error'), 'results'
(list[dict[str, Any]]), 'format' (str), 'count' (int), 'total' (int).
Inputs: input (required). Returns: result
wavexis_screencastARead-onlyIdempotent
Capture a frame-by-frame screenshot sequence over a duration.
Use wavexis_screenshot for a single still image, or
wavexis_screencast when animation or time-series capture is needed.
Side effects: launches/acquires a browser backend, navigates to url
if provided, captures frames for duration; writes frame files to
output_dir when given.
Returns: JSON string with keys: 'status' ('ok'/'error'), 'frames'
(list[str]) or 'dir' (str), 'count' (int).
Inputs: input (required). Returns: result
wavexis_screenshotARead-onlyIdempotent
Capture a screenshot of a web page or matched element.
Use wavexis_pdf when a print-ready document is needed, or
wavexis_annotated_screenshot when labelled element markers are
required.
Side effects: launches/acquires a browser backend, navigates to url
if provided, optionally evaluates js; writes to output_path when
given.
Returns: JSON string with keys: 'status' ('ok'/'error'), 'format'
(str), 'base64' (str) or 'path' (str), 'size_bytes' (int).
Inputs: input (required). Returns: result
wavexis_select_optionADestructive
Select an option in a <select> element by value.
Use wavexis_fill for text inputs or wavexis_click for custom dropdown
widgets that are not native <select> elements.
Side effects: Changes the selected option of the <select> element,
firing change and input events.
Returns: JSON string with keys: 'status' ('ok'/'error'). On error also
'error', 'tool', 'type', 'message', 'suggestion' (all str).
Inputs: input (required). Returns: result
wavexis_session_closeADestructiveIdempotent
Close a browser session and release all associated resources.
Call when the session is no longer needed to free memory and browser processes; use wavexis_close_tab to close individual tabs instead.
Side effects: Terminates the browser process (or disconnects from a remote one) and frees session state. Destructive — all unsaved page state is lost. Returns: JSON string with keys: 'status' ('ok'/'error'), 'session_id' (str).
Inputs: input (required). Returns: result
wavexis_session_infoARead-onlyIdempotent
Query metadata and current URL of an active browser session.
Use to inspect session health or retrieve the current page URL; use wavexis_list_tabs for tab-level details instead.
Side effects: None — read-only; queries in-memory session state and the browser's current URL. Returns: JSON string with keys: 'status' ('ok'/'error'), 'session_id' (str), 'backend' (str), 'created_at' (str), 'current_url' (str).
Inputs: input (required). Returns: result
wavexis_session_openA
Launch a persistent browser session for multi-step workflows.
Call once at the start of a task and reuse the returned session_id for all subsequent calls; use wavexis_navigate with session_id omitted for one-off page fetches instead.
Side effects: Launches a browser process (or connects to an existing one) and allocates server-side session state; may open network connections to remote/cloud browsers. Returns: JSON string with keys: 'status' ('ok'/'error'), 'session_id' (str), 'backend' (str).
Inputs: input (required). Returns: result
wavexis_set_filesADestructive
Upload files to a file input element (<input type="file">).
Use wavexis_drop when you need to simulate drag-and-drop of files or MIME data onto a non-file-input element.
Side effects: Sets the selected files on the target file input element, firing change events that typically trigger upload logic. Returns: JSON string with keys: 'status' ('ok'/'error'). On error also 'error', 'tool', 'type', 'message', 'suggestion' (all str).
Inputs: input (required). Returns: result
wavexis_shadow_clickADestructive
Click an element inside a shadow DOM tree.
Pierces shadow boundaries using the provided selector chain. Use wavexis_shadow_eval only for custom JS that click/fill cannot express.
Side effects: Triggers click handlers and may navigate or mutate the shadow DOM. Returns: JSON string with keys: 'status' ('ok'/'error').
Inputs: input (required). Returns: result
wavexis_shadow_evalA
Evaluate a JavaScript expression inside a shadow DOM tree.
Pierces shadow boundaries using the provided selector chain: selectors[0] is in the
main document, selectors[1] in selectors[0].shadowRoot, and so on.
Use wavexis_shadow_click or wavexis_shadow_fill for standard interactions instead of raw JS.
Side effects: Arbitrary; executes user-supplied JavaScript within the shadow DOM context. Returns: JSON string with keys: 'status' ('ok'/'error'), 'result' (any).
Inputs: input (required). Returns: result
wavexis_shadow_fillADestructive
Fill an input element inside a shadow DOM tree with a value.
Pierces shadow boundaries using the provided selector chain. Use wavexis_shadow_click to submit or activate the field after filling.
Side effects: Mutates the input value within the shadow DOM; may trigger input/change events. Returns: JSON string with keys: 'status' ('ok'/'error').
Inputs: input (required). Returns: result
wavexis_stopAIdempotent
Stop all pending navigations and resource loads in the session.
Use when a page load is hanging or no longer needed; use wavexis_wait to wait for a load to complete instead.
Side effects: Aborts in-flight network requests and pending navigations; the page is left in its current partial state. Returns: JSON string with keys: 'status' ('ok'/'error').
Inputs: input (required). Returns: result
wavexis_tapA
Tap an element matching a CSS selector (touch-emulated click).
Use wavexis_click for mouse-based clicking on desktop contexts or wavexis_nl_click when you only have a natural language description.
Side effects: Dispatches a touch tap on the target element, which may toggle controls or trigger navigation on mobile-optimised pages. Returns: JSON string with keys: 'status' ('ok'/'error'). On error also 'error', 'tool', 'type', 'message', 'suggestion' (all str).
Inputs: input (required). Returns: result
wavexis_typeADestructive
Type text into an element character by character with optional delay.
Use wavexis_fill instead when you want to set a field's value instantly without per-keystroke delays, or wavexis_fill_form for multiple fields.
Side effects: Appends characters to the target input/textarea element, firing keydown/keypress/input/keyup events per character. Returns: JSON string with keys: 'status' ('ok'/'error'). On error also 'error', 'tool', 'type', 'message', 'suggestion' (all str).
Inputs: input (required). Returns: result
wavexis_uncheckADestructiveIdempotent
Uncheck a checkbox matching a CSS selector by clicking it.
Use wavexis_check to check a checkbox or wavexis_click for generic element activation.
Side effects: Clicks the target checkbox to toggle it to unchecked, firing change events. Returns: JSON string with keys: 'status' ('ok'/'error'). On error also 'error', 'tool', 'type', 'message', 'suggestion' (all str).
Inputs: input (required). Returns: result
wavexis_waitARead-onlyIdempotent
Block until a page condition (load, selector, URL, network idle) is met.
Use after wavexis_navigate when the wait strategy was 'none', or to wait for dynamic content; use wavexis_stop to cancel a load instead.
Side effects: None — read-only polling with no page mutations; blocks the tool call up to the configured timeout. Returns: JSON string with keys: 'status' ('ok'/'error'), 'elapsed_ms' (int).
Inputs: input (required). Returns: result
Tool Schema Changelog
Recent tool additions, removals, and schema changes observed during successful MCP inspections.
Loading tool schema changelog…
TDQS
Scored across 72 tools
Many tools are clearly differentiated (dom_* vs iframe_* vs shadow_*), but several clusters overlap: close_tab/close_page, cookies_get/cookie_list/cookie_get, key_press/press_keys/key_down/key_up, and pdf/page_pdf. The cross-references help, but an agent has to carefully parse the differences among 72 tools, and some boundaries are genuinely unclear.
The wavexis_ prefix and snake_case run throughout, and groups like dom_*, iframe_*, and shadow_* are consistent. However, conventions are mixed across the set: bare verbs (navigate, click, wait), noun_verb (cookies_get, dom_get), verb_noun (list_tabs, set_files), and odd pairs like key_press/press_keys and cookie_list/cookies_get.
72 tools is far beyond the typical well-scoped 3–15 range and falls into the extreme category. Even for a broad browser automation server, this many entry points creates meaningful selection overhead and redundancy rather than earning each tool's place.
The surface covers the full browser lifecycle: sessions, tabs, navigation, DOM, iframes/shadow DOM, input, cookies, captures, and an invoke escape hatch for backend methods. It is hard to identify a significant missing operation for automation tasks.
Maintenance
Related MCP Connectors
Web scraping, browser automation, screenshots and AI data extraction for AI agents via MCP.
Official Browserless MCP server: browser automation, scraping, screenshots and PDFs for AI agents.
Control a real browser from AI agents: navigate, click, type, screenshot, read the page.
Cloud browser, web extraction, screenshots, and remote CDP tools for AI agents.
Related MCP Servers
- AlicenseAqualityNot gradedmaintenanceEnables browser automation through Playwright using accessibility tree snapshots instead of screenshots. Supports web scraping, form interactions, testing, and connecting to existing browser sessions with logged-in accounts.238,154 npm5-
- AlicenseCqualityBmaintenanceA professional browser automation server that enables MCP clients to perform structured web navigation, element interaction, and data extraction using the DrissionPage framework. It features 14 deterministic tools optimized for LLMs to automate web workflows efficiently without relying on vision-based models.6963 PyPI481Apache 2.0
- AlicenseBqualityDmaintenanceAn MCP server that provides browser automation capabilities, enabling LLMs to control a web browser for navigation, interaction, and data extraction.32116 npm14MIT
- AlicenseNot gradedqualityDmaintenanceA browser automation MCP server providing 30 tools for navigation, interaction, page information, state checks, tab management, and more, enabling natural language control of browsers via MCP-compatible clients.MIT