PyreCrawl
PyreCrawl is an MCP server that gives AI agents web browsing, scraping, search, and research capabilities in one self-hosted tool.
Scrape single URLs into LLM-ready markdown, with auto-escalation from fast HTTP to stealth Chromium to deep processing
Extract structured data from pages using CSS-based JSON schemas
Crawl websites: map internal links, multi-page BFS crawl with path filters, depth limits, and scoped selectors
Batch-scrape many URLs in parallel with deduplication and caching
Search the web via DuckDuckGo without API keys
Search academic papers on arXiv and Crossref, with PDF URLs that can be fed into the document tool
Run deep research: search, scrape top sources, and return evidence with numbered citations (no LLM synthesis)
Extract text from PDF, DOCX, and PPTX URLs
Monitor pages for content changes with persistent snapshots and unified diffs
Drive persistent browser sessions for login walls and multi-step flows, including clicks, fills, key presses, JS evaluation, screenshots, and cookie access
Inspect or clear the HTTP response cache
Check server health and engine availability
Provides academic paper search via arXiv (and Crossref), returning metadata and PDF URLs that can be fed into the document tool for conversion to markdown.
Enables scraping of Cloudflare-protected and Turnstile-challenged pages using a stealth browser.
Provides web search through DuckDuckGo's HTML interface without an API key, returning search results that can be used for further research and scraping.
Supports local LLM backends such as Ollama for deep processing and extraction without relying on hosted AI services.
๐ฅ PyreCrawl โ Web Browsing Superpowers for Your AI Agent
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 |
| Single URL โ LLM-ready markdown |
| Scrape + structured extraction (JsonCss schema) |
| Enumerate all internal URLs |
| Multi-page crawl with path filters + true BFS depth |
| PDF/DOCX/PPTX โ markdown (no browser, optional |
| Web search via DuckDuckGo HTML (no API key) |
| Academic search via arXiv + Crossref (no API key) โ feed |
| Many URLs in ONE call โ parallel, deduped, cache-aware |
| Search โ evidence pack with [n] citations (no LLM synthesis โ your agent does that) |
| Change detection with persisted snapshots + unified diff |
| Persistent browser session (cookies kept) โ login walls, multi-step flows, screenshots |
| Inspect/clear/enable/disable the HTTP response cache |
| 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 |
| off |
|
|
| Cache entry lifetime in seconds |
|
| Where monitor snapshots persist |
| off |
|
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"Then run PyreCrawl directly โ no venv, no pip install, no Python download:
uvx pyrecrawl@latestOr via uv tool install (persistent, recommended for regular use)
uv tool install pyrecrawlOr via pipx (alternative)
pipx install pyrecrawlOr via pip into a venv
pip install pyrecrawl2. One-time browser engines
pyrecrawl setupThis 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-runSupported 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 |
| Fetch a single URL โ markdown (auto-escalates past Cloudflare) |
| Scrape + structured extraction via CSS schema โ JSON |
| Enumerate all internal URLs from a root |
| Multi-page crawl: discover + scrape in bulk |
| Fetch many URLs in one parallel call |
| Web search via DuckDuckGo with anti-bot bypass |
| Academic paper search (arXiv / Crossref) |
| Search + scrape + citations in one call โ primary research tool |
| Extract text from PDF/DOCX/PPTX URLs |
| Track a URL for content changes over time |
| Persistent browser session for login walls |
| Inspect or clear the response cache |
| 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" |
|
"Research Rust memory safety vulnerabilities" |
|
"Deep research on AI regulation worldwide" |
|
"Extract all product names and prices from this page" |
|
"Crawl https://docs.example.com and give me an overview" |
|
"Monitor this page for price changes" |
|
"Find papers about transformer attention" |
|
"What's the current cache hit rate?" |
|
๐ง 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 |
| "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.mdWithout 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.jsonmacOS:
~/Library/Application Support/Claude/claude_desktop_config.jsonWindows:
%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.yamlWindows:
%LocalAppData%\hermes\config.yaml
mcp_servers:
pyrecrawl:
command: uvx
args:
- --from
- pyrecrawl
- pyrecrawl
- serve
enabled: trueWindows note:
uvxmust be on PATH. If not, use the full path touvx.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 | โ | โ
| โ |
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 bytimeout). 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 inmeta.js_result. Errors are captured inmeta.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 ( |
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 installRun 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.ZGitHub 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 versionTo upgrade:
pyrecrawl update # runs: uv tool upgrade pyrecrawlGet notified of new releases: click Watch โ Releases only at the GitHub repo to receive email notifications when a new version is published.
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 ( | 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 toolsbatch_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
searchA
Web 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.
Inputs: query (required), limit, prefer. 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
Scored across 13 tools
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.
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.
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.
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
Related MCP Connectors
Web scraping, extraction and search for AI agents. Hosted MCP with workspace API keys.
Web scraping, browser automation, screenshots and AI data extraction for AI agents via MCP.
Firecrawl, the context API for AI agents: search, scrape, interact with the web, plus paper search.
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
- AlicenseNot gradedqualityCmaintenanceWeb 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.8MIT
- AlicenseNot gradedqualityDmaintenanceMulti-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 npm1MIT
- AlicenseAqualityAmaintenanceWeb 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.81,250AGPL 3.0
- AlicenseNot gradedqualityDmaintenance14 web scrapers as MCP tools for AI agents: Reddit, Amazon, Google Maps, Yelp, YouTube, Indeed & more.50 npm4MIT