PyreCrawl vs Exa MCP Server

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

PyreCrawl logoPyreCrawlSearch & Data Extraction · Local subprocess (stdio)One tool for AI agents to scrape, crawl, extract, map, and search the web. Self-hosted, no API keys.61GoodAuth: no auth requiredExa MCP Server logoExa MCP ServerSearch & Data Extraction · Local subprocess (stdio)A Model Context Protocol (MCP) server lets AI assistants like Claude use the Exa AI Search API for web searches. This setup allows AI models to get real-time web information in a safe and controlled way.73GreatAuth: no auth required

Verdict: choose PyreCrawl for search & data extraction work as a local process; choose Exa MCP Server 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?

PyreCrawl logoChoose PyreCrawl 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 have the keys it needs: PYRECRAWL_CACHE, PYRECRAWL_CACHE_TTL, PYRECRAWL_MONITOR_DIR, PYRECRAWL_NO_TELEMETRY, DO_NOT_TRACK.
  • You want tools like scrape, extract, map_site.
Explore PyreCrawl

Exa MCP Server logoChoose Exa MCP Server 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 web_search_exa, web_fetch_exa.
Explore Exa MCP Server

Feature & specification comparison

Rows where the two servers differ are marked.

SpecPyreCrawl logoPyreCrawlExa MCP Server logoExa MCP Server
CategorySearch & Data ExtractionSearch & Data Extraction
Quality signal61/100 · Good73/100 · Great
Install commandConfirmedConfirmed
TransportLocal subprocess (stdio)Local subprocess (stdio)
AuthNo auth requiredNo auth required
PricingFreeFree
Required env varsPYRECRAWL_CACHEPYRECRAWL_CACHE_TTLPYRECRAWL_MONITOR_DIRPYRECRAWL_NO_TELEMETRYDO_NOT_TRACKNone listed
Verified ownerCommunity listingCommunity listing
GitHub stars225,161
Directory activity 6 views 0 installs 0 upvotes 11 views 0 installs 0 upvotes
Tools132

Tools & capabilities

PyreCrawl tools 13

  • scrapeScrape a single URL → LLM-ready markdown. Use this when the user shares a URL and wants its content (read, analyze, summarize, extract). Auto-escalates through fast→stealth→llm when blocked. Args: url: Target URL (http/https). prefer: "auto" | "fast" | "stealth" | "llm". auto = fast first, escalate to stealth on block/short page. fast = cheap HTTP only (no JS). stealth = real Chromium + Cloudflare solver. llm = full Crawl4AI browser + BM25 fit-markdown. timeout: per-attempt timeout in seconds. include_html: include raw HTML in the response (large; off by default). js: (stealth only) JS expression evaluated against the live page after it settles. The value comes back in ``meta.js_result``. Use for data that lives in DOM *properties* (e.g. an input's ``.value``) rather than in serialized HTML. wait_for: (stealth only) JS predicate expression polled until truthy (bounded by ``timeout``). Use to wait for content that arrives asynchronously after ``network_idle``. Returns: {url, final_url, status, markdown, title, method, elapsed_ms, meta} or {error, url, method} on failure.
  • extractScrape + structured extraction using a CSS-based JSON schema. Use when the user wants structured data (tables, lists, product info) extracted from a page. Define a CSS schema to target specific elements. The schema is a JsonCssExtractionStrategy schema: { "name": "PageItems", "baseSelector": "div.item", "fields": [{"name": "title", "selector": "h2", "type": "text"}, ...] } Returns parsed JSON in `data`.
  • map_siteEnumerate all internal URLs reachable from `root`. Use when the user wants to map a site's structure or find all pages before crawling. Often paired with `crawl` or `batch_scrape`. Args: root: Website root (e.g. "https://example.com/docs"). include_pattern: Optional regex; only URLs matching are returned. limit: Hard cap on returned URLs.
  • crawlMulti-page crawl: discover URLs on `root`, then scrape each. Use this when the user wants to crawl an entire site section or docs, or needs multiple pages scraped in bulk. For single pages use `scrape`; for research questions use `deep_research`. Args: root: start URL. max_pages: hard cap on pages scraped. css_selector: scope each page's html/markdown to the matched element (non-llm: lxml re-scope of the fetched HTML; llm: native crawl4ai css_selector). prefer: "auto" | "fast" | "stealth" | "llm" (llm = Crawl4AI BFS deep-crawl). include_paths: regex — keep only URLs matching (matched against full URL). exclude_paths: regex — drop URLs matching (e.g. `/tag/|/page/\d+`). max_depth: 0 = flat harvest from the root page's links (default); >0 = true BFS up to that link depth, honoring the filters. Returns: {root, pages: [{url, markdown, title, ...}], count, discovered, elapsed_ms} or {error, root} on failure.
  • documentExtract text from a PDF/DOCX/PPTX URL → markdown (no browser). Use when the user shares a link to a document (PDF, Word, PowerPoint) and wants its text content. Also useful after `search_papers` to get full text from a paper's pdf_url. Content-type sniffed and routed to pypdf / python-docx / python-pptx. Optional deps — install with `pip install 'pyrecrawl[docs]'`.
  • searchWeb search via DuckDuckGo HTML (no API key required). Use this for targeted searches where you need anti-bot bypass (Cloudflare protection on DDG). For simple searches, the built-in web_search may suffice. For research questions, prefer `deep_research` (search + scrape + citations). Returns [{url, title, snippet}, ...]. The smart ladder bypasses DDG's bot detection if needed. Returns: {query, results: [{url, title, snippet}], count} or {error, query} on failure.
  • batch_scrapeScrape MANY URLs in ONE call (parallel, deduped, cache-aware). Use when the user provides multiple URLs or you have a list of pages to fetch. More efficient than calling `scrape` N times. Args: urls: Target URLs (deduped automatically; empties dropped). prefer: "auto" | "fast" | "stealth" | "llm". timeout: per-URL timeout in seconds. max_concurrency: parallel workers (default 4). include_html: include raw HTML per result (large; off by default). Returns {requested, unique, succeeded, failed, results[]}. Per-URL failures are isolated — other URLs still succeed. Returns: {requested, unique, succeeded, failed, results: [{url, markdown, ...}]}
  • deep_researchSearch the web, then pull the top sources as EVIDENCE (no LLM synthesis). PRIMARY RESEARCH TOOL — use when the user asks to research, investigate, deep-dive, fact-check, or learn about a topic. Returns a ``citations`` list with stable [n] numbers and an ``evidence`` list of per-source markdown — the agent does the synthesis from evidence. Multi-pass mode: set iterations=2-3 to auto-run additional searches with refined queries (alternatives, criticism, latest developments) and append deduplicated evidence. Each pass adds up to ``scrape_top`` new sources. Args: query: search string. limit: how many search results to fetch. scrape_top: how many of those to actually fetch content from. prefer: "auto" | "fast" | "stealth" | "llm". iterations: 1 (default, single pass), 2-3 (multi-pass with refined queries targeting evidence gaps). Each pass searches from a different angle and deduplicates by URL. Returns: {query, iterations_run, queries: [str], hits: [{url, title, snippet}], citations: [{url, title}], evidence: [{url, title, markdown}], scraped, used_engines, elapsed_ms} or {error, query, hint} on failure.
  • monitorTrack a URL over time and report meaningful content changes. Use when the user wants to watch a page for updates (price changes, new blog posts, status updates). Ask me to 'set up monitoring for <url>' for a guided setup playbook. Args: url: target URL. action: "check" | "history" | "forget". prefer: ladder preference, same as ``scrape``. css_selector: scope the diff to one element (so banner / nav changes don't trigger false positives). Snapshots persist under ``PYRECRAWL_MONITOR_DIR`` (default ``~/.pyrecrawl/monitors/``). ``check`` returns ``status`` of ``new`` | ``unchanged`` | ``changed`` | ``error`` and a unified diff when the page changed. Returns: {url, status: "new"|"unchanged"|"changed"|"error", diff?: str, snapshot_chars?: int, elapsed_ms?: int}
  • search_papersSearch academic papers via arXiv or Crossref — no API keys. Args: query: free-text search, e.g. "transformer attention scaling laws". limit: max results (1-25 arXiv / 1-20 crossref). source: "arxiv" (CS/physics/math preprints, default) or "crossref" (all fields, DOI-backed). category: optional arXiv category filter, e.g. "cs.LG", "cs.CV". Returns papers with id/url/pdf_url/title/authors/summary/published. Feed pdf_url into the `document` tool to extract full text. Returns: {query, source, papers: [{title, authors, abstract, url, pdf_url?, ...}]} or {error, query} on failure.
  • cacheInspect the response cache: stats, clear, enable, or disable. Use this to check cache hit rates before large batch jobs, or to clear stale cached responses when a site's content has changed. Args: action: "stats" (default) | "clear" | "disable" | "enable".
  • healthVerify PyreCrawl is working: engine versions, dependencies, update status. Use this at the start of a session or before a large scraping job to confirm all engines are installed and up to date.
  • +1 more on the listing page

Exa MCP Server tools 2

  • web_search_exaSearch the web for any topic and get clean, ready-to-use content. Best for: Finding current information, news, facts, people, companies, or answering questions about any topic. Returns: Clean text content from top search results. Query tips: describe the ideal page, not keywords. "blog post comparing React and Vue performance" not "React vs Vue". Use category:people / category:company to search through Linkedin profiles / companies respectively. If highlights are insufficient, follow up with web_fetch_exa on the best URLs.
  • web_fetch_exaRead a webpage's full content as clean markdown. Use after web_search_exa when highlights are insufficient or to read any URL. Best for: Extracting full content from known URLs. Batch multiple URLs in one call. Returns: Clean text content and metadata from the page(s).

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.

PyreCrawl

mcpServers (Claude Desktop / Cursor)
{
  "mcpServers": {
    "pyrecrawl": {
      "command": "uvx",
      "args": [
        "pyrecrawl@latest"
      ],
      "env": {
        "PYRECRAWL_CACHE": "YOUR_PYRECRAWL_CACHE_HERE",
        "PYRECRAWL_CACHE_TTL": "YOUR_PYRECRAWL_CACHE_TTL_HERE",
        "PYRECRAWL_MONITOR_DIR": "YOUR_PYRECRAWL_MONITOR_DIR_HERE",
        "PYRECRAWL_NO_TELEMETRY": "YOUR_PYRECRAWL_NO_TELEMETRY_HERE",
        "DO_NOT_TRACK": "YOUR_DO_NOT_TRACK_HERE"
      }
    }
  }
}

Exa MCP Server

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

Frequently asked questions

PyreCrawl is categorized under Search & Data Extraction and uses a local stdio subprocess. Exa MCP Server belongs to Search & Data Extraction and uses a local stdio subprocess. Pick PyreCrawl for search & data extraction work and Exa MCP Server 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.

PyreCrawl is listed as free. Auth: no auth required. Exa MCP Server is listed as free. Auth: no auth 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 pyrecrawl and exa-labs-exa-mcp-server as separate keys in the same mcpServers object, and your assistant will call tools from either one.

On AllMCPs, PyreCrawl has a quality signal of 61/100 (Good) with 6 views, 0 installs and 22 GitHub stars. Exa MCP Server has 73/100 (Great) with 11 views, 0 installs and 5,161 GitHub stars.