Webclaw vs Zenrows MCP

A side-by-side look at the Webclaw and Zenrows MCP MCP servers: transport, auth, tools, quality signals, and the config to install either one in Claude, Cursor, Windsurf or VS Code.

Webclaw logoWebclawSearch & Data Extraction · Local subprocess (stdio)Web content extraction for AI agents. 10 tools: scrape, crawl, map, batch, extract, summarize, diff, brand, search, research. TLS fingerprinting bypasses anti-bot without a browser. 67% fewer tokens than raw HTML. npx create-webclaw auto-configures Claude, Cursor, Windsurf, Codex, OpenCode.67GreatAuth: no auth requiredZenrows MCP logoZenrows MCPSearch & Data Extraction · Local subprocess (stdio)ZenRows MCP server — Universal Scraper API for AI coding assistants67GreatAuth: api key required

Verdict: choose Webclaw for search & data extraction work as a local process; choose Zenrows MCP for search & data extraction as a local process. You can also run both side by side in one mcpServers block.

Which MCP server should you choose?

Webclaw logoChoose Webclaw when

  • You need dedicated capabilities in the Search & Data Extraction domain.
  • You prefer a local stdio subprocess transport.
  • Its auth model fits you: No auth required.
  • You want tools like scrape, select, screenshot.
Explore Webclaw

Zenrows MCP logoChoose Zenrows MCP when

  • You need dedicated capabilities in the Search & Data Extraction domain.
  • You prefer a local stdio subprocess transport.
  • Its auth model fits you: API key required.
  • You want tools like scrape, extract, batch_create.
Explore Zenrows MCP

Feature & specification comparison

Rows where the two servers differ are marked.

SpecWebclaw logoWebclawZenrows MCP logoZenrows MCP
CategorySearch & Data ExtractionSearch & Data Extraction
Quality signal67/100 · Great67/100 · Great
Install commandConfirmedConfirmed
TransportLocal subprocess (stdio)Local subprocess (stdio)
AuthNo auth requiredAPI key required
PricingFreeFreemium
Required env varsNone listedNone listed
Verified ownerCommunity listingCommunity listing
GitHub stars2,38620
Directory activity 13 views 2 installs 0 upvotes 2 views 0 installs 0 upvotes
Tools1252

Tools & capabilities

Webclaw tools 12

  • scrapeExtract one URL as markdown, text, JSON, LLM format, or HTML
  • selectPick values or records from a page with CSS selectors or XPath, its data tables, elements found by text, or every element like an example, as JSON
  • screenshotCapture a page's viewport or the whole page as PNG or JPEG, print it to PDF, or save it as one MHTML file
  • crawlFollow same-origin links and extract discovered pages, most relevant first with a `query
  • mapDiscover URLs from sitemaps, a short crawl and the Common Crawl index without extracting every page
  • batchScrape multiple URLs in parallel
  • extractConvert page content into structured data
  • summarizeSummarize a page
  • diffCompare page content snapshots
  • brandExtract colors, fonts, logos, and metadata
  • searchSearch the web and scrape results
  • researchMulti-source research workflow

Zenrows MCP tools 52

  • scrapeScrape any webpage and return its content using Zenrows (Fetch). Returns full-page content (markdown/HTML/PDF/screenshot). For structured JSON fields (products, articles, listings), the extract tool returns parsed fields instead of a full page body. By default the request uses automatic mode (mode=auto): Zenrows adds JS rendering or premium proxies per page only when a plain request does not return the page, and charges only for the configuration that succeeds. Pass just the URL. Set js_render or premium_proxy only to force a fixed configuration. Doing so switches off automatic mode, and every request is billed at that configuration's cost (premium_proxy with js_render is 25x a basic request). Examples: Default: { url: "https://example.com" } Geo: { url: "https://example.com", proxy_country: "US" } Forced: { url: "https://spa.com", js_render: true }
  • extractExtract structured data from a webpage via Zenrows. Returns JSON fields (products, articles, listings) rather than a full page body. Modes: - auto (default): extract=auto, site-tailored Extract (currently free, billing may apply later). Works on any domain Zenrows has prepared, with any API key; falls back to autoparse when the domain isn't prepared yet (REQS007) - autoparse: general-purpose structured JSON on any domain - css: css_extractor with an explicit selector map Requests use automatic mode (mode=auto) by default: Zenrows enables JS rendering and premium proxies only when the site needs them, and charges only for the configuration that succeeds. Pass just the URL. Set js_render or premium_proxy only to force a fixed configuration; that turns automatic mode off and bills every request at that configuration's cost. Check "empty" in the result: true means no field came back with a value. "noDataExtracted": true means Extract processed the page and found nothing to extract (not charged); retrying the same request returns the same answer. Full-page markdown, HTML and screenshots come from scrape.
  • batch_createSubmit a cloud Batch job that fans out many URLs asynchronously (Zenrows Batch API). NOT the same as browser_batch — this hits https://async.api.zenrows.com/v1 with X-API-Key. Suited to large URL lists; scrape and extract handle single pages. Tasks use automatic mode (mode=auto) by default: Zenrows enables JS rendering and premium proxies only on the pages that need them, and charges only for the configuration that succeeds. Pass just the URLs. Set js_render or premium_proxy (job-level or in a task's zenrows_params) only to force a fixed configuration; that turns automatic mode off for the affected tasks and bills them at that configuration's cost. Returns job_id + latest_run.status/stats. batch_status and batch_wait report progress; batch_results lists the results. If you get BATCH_ACCESS_DENIED, Batch is not enabled for this account or API key.
  • batch_statusGet status and stats for a Zenrows Batch job (latest_run.status + latest_run.stats).
  • batch_resultsList result rows for a Batch job (cursor-paginated server-side; returns the full list). Each row may include task_id, external_id, status, and a short-lived result_url for the body. Download result_url soon — presigned links expire.
  • batch_cancelStop an in-flight Batch job run (POST /jobs/:id/stop).
  • batch_waitPoll batch_status until the job reaches a terminal state (completed, failed, stopped, or deleted). A run that hits an API key credit cap ends as failed with failure_reason api_key_cap_reached.
  • crawl_createStart a crawl from one URL (Zenrows Crawl API). Crawl follows the links in each page's HTML up to depth hops (no depth limit when depth is omitted), keeps the URLs that match include_patterns / exclude_patterns, and stays on the start URL's registrable domain (subdomains count). Use crawl when you have one start page (a listing, category, blog index) and need the URLs behind it, optionally with each page's HTML. For a single page, use scrape. Each page fetched is billed as one scrape on this account; max_pages bounds the cost (default 100), max_items bounds how many URLs are kept (default 100). Without depth, the crawl keeps following links until max_pages or max_items stops it or nothing is left to open, so set max_pages to what you are willing to spend. The start page itself is never a result, but its fetch is billed: a crawl whose include_patterns / exclude_patterns match nothing still costs that one scrape. Set output_format "html" to also store each kept URL's page, then read it with crawl_content. Returns crawl_id, status and the crawl (with coverage) at once; the crawl runs asynchronously. Call crawl_wait, then crawl_results. Set idempotency_key to make a retry safe: the same key returns the crawl the first request created instead of starting another. CRAWL_NOT_ENABLED: Crawl is not enabled for this account; do not retry. CRAWL_TOO_MANY_CRAWLS: the account has reached its limit of active jobs (3 by default), shared with its Batch jobs; retry after retry_after seconds.
  • crawl_getGet a crawl and one page of the URLs it kept: crawl_id, status (running, completed, stopped, failed), the crawl (with coverage: pages_fetched, pages_failed, items_found), results and next_cursor. completed with stop_reason max_items / max_pages means a limit ended it; failed carries error.code and error.detail. Pass next_cursor as cursor for the next page; while the crawl runs, next_cursor is never null. To read many pages at once, use crawl_results.
  • crawl_resultsList the URLs a crawl kept, in the order it kept them, following the API's pages up to limit. Each result has url and, when the crawl has output_format, content_status (pending, fetched, failed) and, once fetched, content_url: pass it to crawl_content as content. While the crawl runs the list is partial (partial=true): call again later with the returned next_cursor to get only the URLs kept since. A stopped crawl can still add URLs from pages fetched before the stop for up to 10 minutes, so next_cursor stays set during that window: call again later. next_cursor is null once the crawl ended and every URL was read.
  • crawl_contentRead the stored HTML of one URL a crawl kept. Works only for crawls created with output_format "html", and only for results whose content_status is fetched. Pass crawl_id and content_id: a content id, or content_url from a crawl_results row. Returns raw HTML, cut to max_chars (default 20000); a final note says when it was cut. For a markdown version of a page, use scrape on its URL instead.
  • crawl_listList this account's crawls, newest first, with status and coverage (no results). Pass next_cursor as cursor for the next page; next_cursor is absent on the last page.
  • +40 more on the listing page

Ready-to-paste client configs

Paste either block (or both) into your client config, e.g. claude_desktop_config.json or ~/.cursor/mcp.json. We only show a config when the install command is confirmed.

Webclaw

mcpServers (Claude Desktop / Cursor)
{
  "mcpServers": {
    "0xmassi-webclaw": {
      "command": "npx",
      "args": [
        "-y",
        "create-webclaw"
      ]
    }
  }
}

Zenrows MCP

mcpServers (Claude Desktop / Cursor)
{
  "mcpServers": {
    "zenrows-mcp": {
      "command": "npx",
      "args": [
        "-y",
        "@zenrows/mcp"
      ]
    }
  }
}

Frequently asked questions

Webclaw is categorized under Search & Data Extraction and uses a local stdio subprocess. Zenrows MCP belongs to Search & Data Extraction and uses a local stdio subprocess. Pick Webclaw for search & data extraction work and Zenrows MCP for search & data extraction.

Copy the mcpServers block from the config section on this page into your client's config (for example claude_desktop_config.json or ~/.cursor/mcp.json), then fully restart the client.

Webclaw is listed as free. Auth: no auth required. Zenrows MCP is listed as freemium — a free tier with paid plans. Auth: api key required. If a server needs environment variables such as API keys, define them under the env key in your client's MCP config.

Yes. MCP clients support multiple servers: add 0xmassi-webclaw and zenrows-mcp as separate keys in the same mcpServers object, and your assistant will call tools from either one.

On AllMCPs, Webclaw has a quality signal of 67/100 (Great) with 13 views, 2 installs and 2,386 GitHub stars. Zenrows MCP has 67/100 (Great) with 2 views, 0 installs and 20 GitHub stars.