Skip to main content
Glama

๐Ÿ”ฅ PyreCrawl โ€” Web Browsing Superpowers for Your AI Agent

License: MIT MCP Python 3.10+ PyPI GitHub stars Downloads / 30d Active users / 30d

One command gives any AI agent the whole web. Scrape, extract, crawl, map, and search โ€” self-hosted, no API keys, no rate limits, no subscription.

PyreCrawl speaks MCP (Model Context Protocol), the standard tool interface for Claude, Cursor, VS Code, Codex, OpenCode, Hermes, and any MCP-compatible agent.

A smart auto-fallback ladder always picks the cheapest method that succeeds:

fast HTTP
    โ”‚  (403/503/Cloudflare challenge or empty body)
    โ–ผ
stealth browser (real Chromium + Cloudflare solver)
    โ”‚  (still blocked, or the page needs full JS rendering)
    โ–ผ
deep processing (LLM-ready markdown, citations, structured extraction)

โšก Tools exposed

Tool

What it does

scrape(url, prefer="auto")

Single URL โ†’ LLM-ready markdown

extract(url, schema)

Scrape + structured extraction (JsonCss schema)

map_site(root, include_pattern=None, limit=200)

Enumerate all internal URLs

crawl(root, max_pages=5, prefer="auto", include_paths=None, exclude_paths=None, max_depth=0)

Multi-page crawl with path filters + true BFS depth

document(url)

PDF/DOCX/PPTX โ†’ markdown (no browser, optional [docs] extras)

search(query, limit=10)

Web search via DuckDuckGo HTML (no API key)

search_papers(query, limit=8, source="arxiv", category=None)

Academic search via arXiv + Crossref (no API key) โ€” feed pdf_url into document

batch_scrape(urls[], ...)

Many URLs in ONE call โ€” parallel, deduped, cache-aware

deep_research(query, limit=5, scrape_top=3)

Search โ†’ evidence pack with [n] citations (no LLM synthesis โ€” your agent does that)

monitor(url, action, css_selector=None)

Change detection with persisted snapshots + unified diff

session(session, action, ...)

Persistent browser session (cookies kept) โ€” login walls, multi-step flows, screenshots

cache(action)

Inspect/clear/enable/disable the HTTP response cache

health()

Versions + import sanity check

MCP Resources (read-only state without a tool call): pyrecrawl://cache/stats ยท pyrecrawl://sessions ยท pyrecrawl://monitors

MCP Prompts (ready-made playbooks): research(topic) ยท rag_ingest(site) ยท watch_page(url)

Env flags

Variable

Default

Effect

PYRECRAWL_CACHE

off

1 = in-memory LRU (128 pages), or a directory path (reserved for disk mode)

PYRECRAWL_CACHE_TTL

900

Cache entry lifetime in seconds

PYRECRAWL_MONITOR_DIR

~/.pyrecrawl/monitors

Where monitor snapshots persist

PYRECRAWL_NO_TELEMETRY

off

1 = disable the anonymous startup ping (also honors DO_NOT_TRACK=1)

prefer options: "auto" (default ladder) ยท "fast" (HTTP only) ยท "stealth" (CF bypass) ยท "llm" (deep processing).


Related MCP server: mcp-services

๐Ÿš€ Install & Use (one-liner)

1. Install

UV (recommended โ€” one command, zero Python setup)

UV is a fast Python package manager that handles Python itself โ€” no need to install Python separately. Get it once:

# macOS / Linux
curl -LsSf https://astral.sh/uv/install.sh | sh

# Windows (PowerShell)
powershell -ExecutionPolicy ByPass -c "irm https://astral.sh/uv/install.ps1 | iex"

Learn more about UV โ†’

Then run PyreCrawl directly โ€” no venv, no pip install, no Python download:

uvx pyrecrawl@latest
uv tool install pyrecrawl

Or via pipx (alternative)

pipx install pyrecrawl

Or via pip into a venv

pip install pyrecrawl

2. One-time browser engines

pyrecrawl setup

This installs Chromium + stealth browser engines (~2 min, one-time).

3. Register with your AI agent

# Auto-detect installed agents and write their MCP configs
pyrecrawl install

# Or target specific agents
pyrecrawl install claude-desktop cursor

# Dry-run to preview what would change
pyrecrawl install --dry-run

Supported agents: claude-desktop, claude-code, cursor, vscode, codex, opencode, hermes.

4. Start chatting

After installing + registering, restart your agent (or start a new session). Then ask:

"Scrape https://example.com and summarize it."

Available tools:

Tool

What it does

scrape

Fetch a single URL โ†’ markdown (auto-escalates past Cloudflare)

extract

Scrape + structured extraction via CSS schema โ†’ JSON

map_site

Enumerate all internal URLs from a root

crawl

Multi-page crawl: discover + scrape in bulk

batch_scrape

Fetch many URLs in one parallel call

search

Web search via DuckDuckGo with anti-bot bypass

search_papers

Academic paper search (arXiv / Crossref)

deep_research

Search + scrape + citations in one call โ€” primary research tool

document

Extract text from PDF/DOCX/PPTX URLs

monitor

Track a URL for content changes over time

session

Persistent browser session for login walls

cache

Inspect or clear the response cache

health

Verify engine availability + version

Plus 3 guided prompts: research, rag_ingest, watch_page.

Quick examples

Ask your agent naturally โ€” no special syntax needed:

You say

Agent uses

"Scrape https://example.com and summarize it"

scrape โ†’ returns markdown โ†’ agent summarizes

"Research Rust memory safety vulnerabilities"

deep_research โ†’ search + scrape + citations

"Deep research on AI regulation worldwide"

deep_research(iterations=3) โ†’ multi-pass with refined queries

"Extract all product names and prices from this page"

extract โ†’ CSS schema โ†’ structured JSON

"Crawl https://docs.example.com and give me an overview"

crawl โ†’ multi-page โ†’ summary

"Monitor this page for price changes"

monitor โ†’ baseline snapshot โ†’ periodic diff

"Find papers about transformer attention"

search_papers โ†’ arXiv results

"What's the current cache hit rate?"

cache โ†’ stats


๐Ÿง  Skills โ€” Maximize Your Agent's Research Quality

PyreCrawl tools give your agent hands (scrape, crawl, search). But the agent still needs a brain โ€” instructions on when to use which tool, how to chain research passes, and what anti-hallucination rules to follow.

That's what PyreCrawl Skills provides.

MCP Tools (this repo)

Skills (pyrecrawl-skills)

Role

Execute web operations

Tell the agent how to use them

Analogy

Hands

Brain

Example

deep_research(query, iterations=3)

"Run 3 passes, check gaps after each, cite everything"

Required?

Yes (the engine)

Optional (but recommended for research quality)

Quick setup:

# 1. Install the tools (you already have this)
uvx pyrecrawl@latest

# 2. Add the research skill to your project
git clone https://github.com/SanggonBoy/pyrecrawl-skills.git /tmp/pyrecrawl-skills
cp /tmp/pyrecrawl-skills/pyrecrawl-research/SKILL.md ./CLAUDE.md  # or .cursorrules / AGENTS.md

Without skills: Your agent has powerful tools but improvises usage. With skills: Your agent follows a proven research protocol with anti-hallucination guardrails.


๐Ÿ“š Manual config (if pyrecrawl install doesn't match your setup)

Claude Desktop

Config file

  • Linux: ~/.config/Claude/claude_desktop_config.json

  • macOS: ~/Library/Application Support/Claude/claude_desktop_config.json

  • Windows: %AppData%\Claude\claude_desktop_config.json

{
  "mcpServers": {
    "pyrecrawl": {
      "command": "uvx",
      "args": ["--from", "pyrecrawl", "pyrecrawl", "serve"]
    }
  }
}

Claude Code

Config file: project-scoped .mcp.json

{
  "mcpServers": {
    "pyrecrawl": {
      "command": "uvx",
      "args": ["--from", "pyrecrawl", "pyrecrawl", "serve"]
    }
  }
}

Cursor

Config file: ~/.cursor/mcp.json

{
  "mcpServers": {
    "pyrecrawl": {
      "command": "uvx",
      "args": ["--from", "pyrecrawl", "pyrecrawl", "serve"]
    }
  }
}

VS Code / Copilot

Config file: .vscode/mcp.json (project-scoped)

{
  "servers": {
    "pyrecrawl": {
      "command": "uvx",
      "args": ["--from", "pyrecrawl", "pyrecrawl", "serve"],
      "type": "stdio"
    }
  }
}

Codex CLI

Config file: ~/.codex/config.toml

[mcp_servers.pyrecrawl]
command = "uvx"
args = ["--from", "pyrecrawl", "pyrecrawl", "serve"]

OpenCode

Config file: ~/.config/opencode/opencode.json

{
  "mcp": {
    "pyrecrawl": {
      "type": "local",
      "command": ["uvx", "--from", "pyrecrawl", "pyrecrawl", "serve"],
      "enabled": true
    }
  }
}

Hermes

Config file

  • Linux/macOS: ~/.hermes/config.yaml

  • Windows: %LocalAppData%\hermes\config.yaml

mcp_servers:
  pyrecrawl:
    command: uvx
    args:
      - --from
      - pyrecrawl
      - pyrecrawl
      - serve
    enabled: true

Windows note: uvx must be on PATH. If not, use the full path to uvx.exe (e.g. C:\Users\<you>\AppData\Local\hermes\bin\uvx.exe).


๐Ÿง  How the ladder chooses

PyreCrawl runs each request through three tiers, stopping at the first one that returns a complete, LLM-ready result:

Concern

Fast tier

Stealth tier

Deep tier

Static HTML page

โœ… ~200ms

โ€”

โ€”

Cloudflare-protected

โŒ

โœ… Turnstile solver

โ€”

JS-heavy SPA

โŒ

โœ… real Chromium

โ€”

Live DOM data (input .value, JS state)

โŒ

โœ… js param

โ€”

LLM-ready markdown + citations

โ€”

โ€”

โœ… BM25, fit-markdown

Structured extraction (CSS schema)

โ€”

โ€”

โœ…

Deep crawl (BFS/DFS/BestFirst)

โ€”

โ€”

โœ… adaptive

The agent never has to pick. prefer="auto" does it every call.

Live DOM data with js and wait_for

Some sites keep the data you want in a DOM property (e.g. an <input>'s .value) that JS writes after an XHR โ€” it never appears in the serialized HTML. The scrape tool accepts two stealth-tier params for exactly this:

{
  "url": "https://temp-mail.org/id",
  "prefer": "stealth",
  "wait_for": "document.getElementById('mail').value.includes('@')",
  "js": "document.getElementById('mail').value"
}
  • wait_for โ€” a JS predicate expression polled until truthy (bounded by timeout). Use it instead of guessing a sleep for anything that arrives asynchronously.

  • js โ€” a JS expression evaluated once the page settles; the value comes back in meta.js_result. Errors are captured in meta.js_error (the page result is still returned, never a crash).


๐Ÿ“Š Compared to Firecrawl (hosted)

Firecrawl

PyreCrawl

Cost

Free 1k/mo, then $16โ€“333/mo

Free, self-hosted

Local LLM support

โŒ

โœ… Ollama / any LLM

Cloudflare bypass

โœ… (Fire-Engine, paid)

โœ… (free, built-in)

Markdown + BM25

โœ…

โœ…

Self-host

โŒ

โœ…

Academic paper search

โŒ

โœ… arXiv + Crossref (search_papers)

Hosted search API

โœ… /search

โš ๏ธ DuckDuckGo HTML + arXiv/Crossref (no key)


๐Ÿ”ง Development

git clone https://github.com/SanggonBoy/PyreCrawl.git
cd PyreCrawl
uv venv --python 3.12 .venv
source .venv/Scripts/activate  # Windows; or .venv/bin/activate on macOS/Linux
uv pip install -e ".[dev]"
python -m playwright install chromium
scrapling install

Run tests

python scripts/selfcheck.py        # real-network smoke test (13 tools + engines)
python scripts/probe_stdio.py      # stdio JSON-RPC probe
python scripts/test_ladder_bug.py  # SPA-shell ladder escalation regression
python scripts/test_js_eval.py     # stealth js/wait_for params regression
python scripts/test_scope_selector.py  # crawl css_selector/max_depth wiring
python scripts/test_link_harvest.py    # map/BFS link purity regression

๐Ÿ“ฆ Publish

Maintainers only:

git tag vX.Y.Z
git push origin vX.Y.Z

GitHub Actions builds + uploads to PyPI via trusted publishing.


๐Ÿ”” Stay up to date

PyreCrawl checks PyPI on every startup and reports the latest version โ€” your MCP agent sees this automatically via the health() tool response and can notify you inline.

To check manually:

pyrecrawl version

To upgrade:

pyrecrawl update   # runs: uv tool upgrade pyrecrawl

Get notified of new releases: click Watch โ†’ Releases only at the GitHub repo to receive email notifications when a new version is published.


NOTE

PyreCrawl sendsone anonymous usage ping per 24 h at server startup โ€” see Privacy for exactly what's sent and how to opt out.

๐Ÿ”’ Privacy โ€” anonymous usage ping

PyreCrawl phones home once per 24 h with a tiny anonymous ping when the MCP server starts, so we can count real users (DAU/MAU) instead of raw downloads.

Sent (4 fields, ~100 bytes)

Never sent

Hashed machine id (SHA-256 of hostname+MAC โ€” not reversible)

Your IP (not stored)

PyreCrawl version

Any URL you scrape

Python version

Any page content or search queries

OS family (windows / linux / darwin)

Anything else

Client code: src/pyrecrawl/telemetry.py (~90 lines, stdlib only) ยท Collector: workers/telemetry/ โ€” a self-hostable Cloudflare Worker + D1, no third-party analytics service.

Opt out any time:

export PYRECRAWL_NO_TELEMETRY=1   # or the industry-standard DO_NOT_TRACK=1

๐Ÿ“œ Uninstall

# Remove from all agent configs
pyrecrawl uninstall

# Remove the package
uv tool uninstall pyrecrawl

๐Ÿ›ก๏ธ License

MIT โ€” see LICENSE.

Available Tools

13 tools
batch_scrapeA

Scrape 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, ...}]}

Inputs: urls (required), prefer, timeout, include_html, +1 more. Returns: object

cacheA

Inspect 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".

Inputs: action. Returns: object

crawlA

Multi-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.

Inputs: root (required), prefer, max_depth, max_pages, +3 more. Returns: object

deep_researchA

Search 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.

Inputs: query (required), limit, prefer, iterations, +1 more. Returns: object

documentA

Extract 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]'.

Inputs: url (required), timeout, max_pages. Returns: object

extractA

Scrape + 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.

Inputs: url (required), schema (required), prefer. Returns: object

healthA

Verify 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.

Inputs: no named parameters. Returns: object

map_siteA

Enumerate 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.

Inputs: root (required), limit, include_pattern. Returns: object

monitorA

Track 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 ' 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}

Inputs: url (required), action, prefer, css_selector. Returns: object

scrapeA

Scrape 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.

Inputs: url (required), js, prefer, timeout, +2 more. Returns: object

search_papersA

Search 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.

Inputs: query (required), limit, source, category. Returns: object

sessionA

Drive a persistent browser session โ€” cookies & JS state kept across calls.

Use for login walls and multi-step flows the one-shot ladder can't handle (e.g. user needs to log in first, then scrape a protected page). For simple pages use scrape; for research use deep_research.

One-shot scrape has no session memory; here each action runs against the same live page.

Args: session: named session; reuse the same name to keep state. action: "open" (url) โ€” navigate, returns url/title/status "click" (selector) โ€” click an element "fill" (selector, text) โ€” type into an input "type" (key) โ€” press a key, e.g. "Enter" "eval" (js) โ€” run a JS expression, returns value "wait" (selector?) โ€” wait for selector or sleep timeout_ms "content" โ€” url/title/visible text of current page "screenshot" (full_page?) โ€” returns png_base64 "cookies" โ€” list session cookies "close" โ€” destroy the session "list" โ€” show live sessions Returns {session, action, ...result, elapsed_ms}; errors as {error}.

Inputs: js, key, url, text, +6 more. Returns: object

Tool Schema Changelog

Recent tool additions, removals, and schema changes observed during successful MCP inspections.

Loading tool schema changelogโ€ฆ

    TDQS

    A4.4/5.0

    Scored across 13 tools

    Disambiguation5/5

    Each tool has a clearly distinct trigger: single-page scrape, structured extraction, bulk scrape, site crawl, document parsing, web search, deep research, academic search, monitoring, sessions, and cache/health maintenance. Even though several tools fetch pages, their arguments and return shapes make the intended use obvious.

    Naming Consistency4/5

    Names are all lowercase and action-oriented, but the convention is mixed: single-word verbs (scrape, crawl, search), verb_noun compounds (map_site, search_papers), and modifier compounds (batch_scrape, deep_research), plus noun-style tools like health and session. This is readable and mostly predictable, but not a uniform pattern.

    Tool Count5/5

    13 tools is well within the ideal range for a scraping and research suite. Each tool covers a distinct operation, and the utility tools (cache, health) support the workflow without feeling like filler.

    Completeness5/5

    The surface covers the full scraping/research workflow: single and batch scraping, crawling, structured extraction, document parsing, search, deep research, academic papers, monitoring, sessions, and cache/health management. There are no obvious dead ends โ€” monitors can be forgotten, sessions can be closed, and cache can be cleared or disabled.

    Maintenance

    ActivityNo data
    ResponsivenessOutdated data

    Related MCP Connectors

    • Web scraping, extraction and search for AI agents. Hosted MCP with workspace API keys.

      https://mcp.deepsfetch.com/mcp
    • Web scraping, browser automation, screenshots and AI data extraction for AI agents via MCP.

      https://app.irmu.com/mcp
    • Firecrawl, the context API for AI agents: search, scrape, interact with the web, plus paper search.

      https://mcp.firecrawl.dev/v2/mcp
    • Your agent needs the open web โ€” searched by more than one engine, and read as clean markdown rather than raw HTML. **What you can ask for** โ€ข "Search this question with two providers and tell me where they disagree." โ€ข "Scrape these 40 URLs into markdown, in one batch." โ€ข "Crawl this documentation site and give me every page." โ€ข "Do deep research on this topic and cite the sources." โ€ข "Find the academic papers behind this claim." **How to use it** Point any MCP client at https://mcp.aisa.one/search/mcp and sign in with OAuth โ€” there is no key to create or paste. 30 tools across several independent providers: Tavily and Exa search, answers, contents and agent runs; Firecrawl scrape, batch scrape, crawl, map and search; Perplexity Sonar, Sonar Pro, reasoning and deep research; Oxylabs AI search and LLM jobs; OpenAI and Anthropic web search; and scholarly search. **Why this rather than the source** Several independent indexes behind one account, because one engine's blind spot is not visible from inside it. **It is also a door to the rest** The same login reaches 26 sources and 580+ operations. Find the page here, then ask the same agent who links to it or how much traffic it gets โ€” without adding a second server. **What it costs** Finding and inspecting an operation is free. Running one is billed per call at API prices, with no seat and no monthly minimum, and every call takes max_price_usd so an agent cannot overspend by accident. **Where else it reaches** https://mcp.aisa.one/seo-serp/mcp for the Google results page itself, https://mcp.aisa.one/seo-serp-other-engines/mcp for Bing, Baidu and Naver.

    Related MCP Servers

    • A
      license
      Not graded
      quality
      C
      maintenance
      Web scraping MCP server for Al agents. 6 tools: extract clean text/markdown from any URL, structured scraping with CSS selectors, full-page screenshots via Playwright, link extraction with regex filtering, metadata extraction (OG tags, Twitter cards), and Google search. Free tier: 50 requests/IP/day.
      8
      MIT
    • A
      license
      Not graded
      quality
      D
      maintenance
      Multi-tool MCP server for AI agents with 29 tools across web scraping, SEO analysis, screenshot and PDF generation, domain intelligence, content extraction, multi-chain EVM blockchain queries, and security toolkit. Free tier available with no auth required.
      50 npm
      1
      MIT
    • A
      license
      A
      quality
      A
      maintenance
      Web scraping, crawling, and structured data extraction for AI agents. 5 tools: scrape (clean markdown from any URL), crawl (entire sites), map (discover URLs), extract (structured JSON), and search. 833ms avg latency, single binary, self-hostable.
      8
      1,250
      AGPL 3.0