The ultimate web-access MCP server: extended Playwright with stealth, free web search, and HTML-to-Markdown conversion
Strong tool coverage (31 tools) with consistent naming (verb_noun pattern: browser_*, fetch_*, search_*). All tools have descriptions (10-300 chars, mostly 50-200 range). Input schemas present and typed for all tools. However, output schemas are undocumented, LLMs cannot predict return structure. Error handling is minimal; tools return plain strings with no recovery guidance. Parameter descriptions are adequate but lack constraint details (ranges, formats, examples). Missing tool annotations (readOnlyHint, destructiveHint). No pagination support documented despite tools returning lists.
Click a page element identified by its ref number from browser_snapshot. Modifiers can include 'Alt', 'Control', 'Meta', 'Shift'.
Configure the browser engine and stealth options. Call before navigating. Engines: - playwright: vanilla Playwright (chromium/firefox/webkit). Set user_agent manually. - camoufox: Firefox stealth with auto-generated fingerprints. Use geoip=True with a proxy. - cloakbrowser: Chromium stealth (passes Cloudflare). Use humanize=True for human-like input. The browser launches automatically on the first navigation. Re-calling this closes the current browser and applies the new config.
Get console messages from the browser. Each level includes more severe levels.
Drag an element and drop it onto another element.
Execute JavaScript on the page and return the result. If ref is provided, the expression receives the element as its first argument (use `element => element.textContent` style arrow functions).
Extract article content from the current page and convert to Markdown. Strips navigation, ads, sidebars, and other clutter. Returns clean Markdown plus metadata (title, author, date) when available.
Output schemas undocumented. Tools return strings but LLMs cannot predict structure (JSON, plain text, base64, etc.). Breaks downstream tool chaining and forces parsing guesses.
No tool annotations (readOnlyHint, destructiveHint, idempotentHint). LLMs cannot distinguish safe reads from destructive writes without explicit hints. browser_click, browser_type, browser_drag, browser_press_key are WRITE but unmarked.
Inferred effective spec: <=2025-11-25.
| Scored | Grade | Overall | Spec posture | Rubric |
|---|---|---|---|---|
| 2026-09-23 | D | 59 | <=2025-11-25 | v2 |
Upload file(s) to a file input element. Paths must be absolute.
Fill multiple form fields at once. fields_json: a JSON array of objects, each with: - ref (int): element ref from browser_snapshot - value (str): value to set - type (str, optional): "textbox" | "checkbox" | "radio" | "combobox" | "slider" (defaults to "textbox") Example: [{"ref": 3, "value": "Alice"}, {"ref": 5, "value": "true", "type": "checkbox"}]
Get the current page as Markdown (full page structure, no content filtering).
Get the full HTML source of the current page. [!] DO NOT use this tool unless you absolutely need the raw HTML. In most cases, using `browser_get_as_markdown` is the right way to go. The output of this tool may be extremely long, use it only when truly required.
Set up a handler for the next browser dialog (alert/confirm/prompt). Call this BEFORE the action that triggers the dialog.
Hover over a page element identified by its ref number.
Navigate the browser to a URL. Launches the browser if not already running.
Go back to the previous page in browser history.
Get the network request log since the page was loaded.
Press a keyboard key (e.g. 'Enter', 'Tab', 'Escape', 'ArrowDown', 'a').
Resize the browser viewport.
Select one or more options in a <select> dropdown by their values.
Get an accessibility snapshot of the current page. Returns a text tree of page elements. Interactive elements are labeled with [ref] numbers that can be used in other browser tools (click, type, etc.). Always call this before interacting with elements.
Manage browser tabs. Actions: - list: show all open tabs - new: open a new tab (optionally navigate to url) - close: close tab at index (default: active tab) - select: switch to tab at index
Take a screenshot of the page or a specific element. Returns a base64-encoded PNG image.
Type text into a page element (appends to existing text). Set submit=True to press Enter after typing. Set slowly=True for human-like speed.
Wait for a condition: a number of seconds, specific text to appear, or a CSS selector.
Extract article content from HTML and convert to Markdown. Strips navigation, ads, sidebars, and other clutter. Returns clean Markdown plus metadata (title, author, date) when available.
Fetch a URL and extract the article to Markdown. Use this tool when accessing news articles, blog-posts or similar content. In other cases it may return empty or partial results. Combines fetch_page + extract_article in one call. Returns clean Markdown with metadata.
Fetch a URL and convert the full HTML to Markdown (as-is, no content filtering). Combines fetch_page + html_to_markdown in one call.
Fetch a URL via HTTP and return the raw HTML. [!] DO NOT use this tool unless you absolutely need the raw HTML. In most cases, using `fetch_as_markdown` is the right way to go. The output of this tool may be extremely long, use it only when truly required. This is a lightweight fetch (no JavaScript rendering). For JS-heavy pages, use browser_navigate + browser_get_html instead.
Convert an HTML string to Markdown as-is (preserves the full page structure). This performs a faithful structural conversion — no content is stripped. Use extract_article instead if you want to pull just the article body.
Search for images. Returns image URLs with metadata (title, source, dimensions).
Search for recent news articles. Args: query: Search query. max_results: Number of results. region: Region code. safesearch: Content filter level. timelimit: Time filter — "d" (day), "w" (week), "m" (month).
Search the web using DDGS (multi-backend metasearch: Bing, Brave, DuckDuckGo, Google, Yahoo, Wikipedia). Args: query: Search query. max_results: Number of results (default 10). region: Region code (default "wt-wt" for worldwide). Examples: "us-en", "uk-en", "de-de". safesearch: Content filter level. backend: Comma-separated engines, or "auto" (Wikipedia-first; can flake on wiki HTTP errors). Default omits Wikipedia-first ordering for reliability. timelimit: Time filter — "d" (day), "w" (week), "m" (month), "y" (year), or None.
Error handling absent. Tools return plain strings with no recovery guidance. 'Invalid ref' or network timeout returns no actionable next step for LLM. No error classification (retryable vs fatal).
Parameter constraints missing. 'ref' is integer but no bounds documented. 'key' in browser_press_key accepts any string, should enumerate valid keys (Enter, Tab, Escape, etc.). 'max_results' in web_search has no min/max.
Pagination not documented. web_search, news_search, image_search return lists but no limit/offset/cursor parameters visible. Large result sets risk context window exhaustion.