crw-mcp
The crw-mcp server provides web scraping and crawling capabilities for AI agents via MCP tools:
crw_scrape: Scrape a single URL and return content as markdown, HTML, or links. Supports filtering by CSS selectors (include/exclude), extracting only main content, and LLM-based structured data extraction using a JSON schema.crw_crawl: Start an async breadth-first crawl of a website with configurable depth and page limits, and optional structured data extraction per page. Returns a job ID for polling.crw_check_crawl_status: Poll the status of an async crawl job and retrieve its results using the job ID.crw_map: Discover all URLs on a website by crawling it and/or reading itssitemap.xml.
Additional capabilities include automatic JavaScript/SPA rendering via headless browsers (LightPanda or Chrome), and web search with full page content retrieval (cloud only).
Quickstart — your first scrape in 30 seconds
Get a free API key → fastcrw.com/register — 500 free credits (1 credit ≈ 1 page), no card.
export CRW_API_KEY="crw_live_..."# cURL — works anywhere, no SDK
curl -X POST https://api.fastcrw.com/v1/scrape \
-H "Authorization: Bearer $CRW_API_KEY" -H "Content-Type: application/json" \
-d '{"url":"https://example.com","formats":["markdown"]}'pip install crwfrom crw import CrwClient
crw = CrwClient() # reads CRW_API_KEY from your env
page = crw.scrape("https://example.com",
formats=["markdown"])
print(page["markdown"])npm install crw-sdkimport { CrwClient } from "crw-sdk";
const crw = new CrwClient(); // reads CRW_API_KEY from your env
const page = await crw.scrape("https://example.com",
{ formats: ["markdown"] });
console.log(page.markdown);In both SDKs page is a plain object (markdown, metadata, contentType, …), so page["markdown"] / page.markdown is clean content:
# Example Domain
This domain is for use in documentation examples without needing permission. Avoid use in operations.
[Learn more](https://iana.org/domains/example)Over cURL you get the same fields wrapped in {"success": true, "data": { … }}.
Prefer no SDK? Every example works over plain HTTP against https://api.fastcrw.com.
That first scrape spent 1 of your 500 free credits — see plans → when you need more.
Got one page? Crawl the whole site: crw.crawl("https://docs.example.com") returns every page — then search, map, and extract in Core operations. Full docs: Quickstart → · API reference →
Related MCP server: webpeel
Why fastCRW?
Most accurate — the highest truth-recall (how much of the real page content it captures): 63.7% on 819 labeled URLs in Firecrawl's public dataset, vs Firecrawl 56.0% and Crawl4AI 60.0% — and it recovers 34 pages both miss.
Fast median, tunable latency — the fastest median latency (p50 1914 ms — a statistical tie with Crawl4AI's 1916 ms, ahead of Firecrawl's 2305 ms). Recall mode maximizes accuracy; fast mode delivers a low p90 (4348 ms) for latency-sensitive workloads. One config toggle — pick accuracy or latency.
Lighter — one static binary, ~50 MB RAM idle. No Redis, no Node, no Chromium heap in the request path — it runs on a $5 VPS.
Search, map, and crawl run on the same engine — built-in web search (a free self-hostable search backend), so there's no separate search vendor and no per-query search-API bill. See the full benchmark →
Open source (AGPL-3.0), passing OpenSSF Best Practices, and published on PyPI · npm · crates.io · Homebrew · APT — with a benchmark you can rerun yourself, not marketing math.
What you get
Any URL → LLM-ready output. Clean markdown, HTML, links, or schema-validated JSON — no HTML soup, no boilerplate.
One API, six operations.
searchthe web andscrapea page, ormap/crawl/extract/monitora whole site — see below.Drop-in Firecrawl compatibility. Migrate existing Firecrawl code by changing one base URL.
Managed or self-hosted, same API. No exit cost — develop against the free open-source binary, ship to the cloud, or the reverse. Nothing changes but the base URL.
Use it in your AI agent (MCP)
fastCRW ships a built-in MCP server, so any MCP host can search/scrape/crawl with no glue code.
# Claude Code — managed
claude mcp add crw \
-e CRW_API_URL=https://api.fastcrw.com -e CRW_API_KEY=$CRW_API_KEY \
-- npx -y crw-mcp
# Claude Code — embedded (no server, no key — runs the engine locally, on your machine)
claude mcp add crw -- npx -y crw-mcpPer-client recipes (Cursor, Windsurf, Cline, Continue.dev, Codex, Gemini CLI): docs.fastcrw.com/mcp-clients/
Agent Skills
Reusable instruction packs that teach coding agents when and how to use each verb. Install all 13 into every detected agent with one command:
npx skills add us/crw # all skills, every detected agent
npx skills add us/crw@crw-scrape # just one
npx skills add -g us/crw # global (user-level)crw (hub) · crw-search · crw-scrape · crw-map · crw-crawl · crw-parse ·
crw-extract · crw-watch · crw-research · crw-dynamic-search (biggest token-saver) ·
crw-best-practices · crw-migrate · crw-self-host. Full catalog: skills/.
Core operations
Verb | Endpoint | Does |
Search |
| Web search (own search backend), optionally scrape each result |
Scrape |
| One URL → markdown / HTML / links / schema JSON |
Map |
| Discover every URL on a site, fast |
Crawl |
| Async crawl of a whole site (returns a job id you poll) |
Extract |
| Structured fields from a JSON Schema |
Monitor |
| Diff a page vs a snapshot — the change-tracking building block behind scheduled monitoring |
SDK return shapes: scrape / extract → one object · map → list of URLs · crawl → list of result objects · search → list, or a dict grouped by source when sources=[...] is set.
Full reference: docs.fastcrw.com/#rest-api.
SDKs & integrations
pip install crw # Python package: crw
npm install crw-sdk # Node / TypeScript package: crw-sdk (not crw)from crw import CrwClient
client = CrwClient() # reads CRW_API_KEY; set CRW_LOCAL=1 for local embedded mode
client.scrape("https://example.com", formats=["markdown", "links"])
# .search() .map() .crawl() .extract() — one method per operation in the table aboveimport { CrwClient } from "crw-sdk";
const crw = new CrwClient(); // reads CRW_API_KEY; new CrwClient({ apiUrl }) for self-host
await crw.scrape("https://example.com", { formats: ["markdown", "links"] });
// .search() .map() .crawl() .extract() — same methods, all typedThe TypeScript client is typed and zero-dependency; its cloud path is pure fetch, so it runs
on Node 18+, Bun, Deno, and edge runtimes. The Python client is synchronous — wrap long calls
like crawl() / extract() in asyncio.to_thread inside async code. Both client SDKs (crw,
crw-sdk) are MIT-licensed — installing them imposes nothing on your code; AGPL-3.0 covers only the engine.
LangChain and CrewAI integrations ship in the package:
from crw.integrations.langchain import CrwLoader # pip install crw[langchain]
from crw.integrations.crewai import CrwScrapeWebsiteTool # pip install crw[crewai]All integrations → · SDK examples →
Managed cloud vs self-host
Same binary, same API in both modes — switch anytime by changing the base URL. Most teams run on the managed cloud: it scales with your traffic, rotates proxies, and stays patched, so you ship features instead of operating a scraper.
Managed — | Self-host | |
Best for | Shipping fast at any scale, with zero infrastructure to run | Data-residency, air-gapped, or compliance-bound deployments |
Scale | Grows with you — 500 free credits to millions of pages/month, higher concurrency per tier, no capacity planning | You size, scale, and monitor the machines yourself |
Proxies & rendering | Managed global proxy network + rendering, rotated for you to get through blocked pages | Bring your own proxy pool and browser tier |
Ops & reliability | Fully managed — dashboard, usage metering, API keys, monitored infra; nothing to patch or babysit | You run, patch, upgrade, and monitor it |
Start | Sign up — 500 free credits, no card |
|
Cost | Free tier, then plans from $11/mo — pricing | $0 license — you pay for the infra and your team's time |
License | You call an API — no copyleft on your code | AGPL-3.0 — copyleft if you bundle the engine or run a modified public service |
Self-host in one command
docker run -p 3000:3000 ghcr.io/us/crw
curl http://localhost:3000/v1/scrape \
-H "Content-Type: application/json" \
-d '{"url":"https://example.com"}'Or install the CLI and scrape straight from your shell:
brew install us/crw/crw # macOS & Linux
curl -fsSL https://apt.fastcrw.com/setup.sh | sudo sh # Debian & Ubuntu
curl -fsSL https://fastcrw.com/install | sh # any platform, no package manager
crw scrape https://example.comPrefer Cargo, Docker Compose with a stealth tier, or building from source? All install paths and production hardening: docs.fastcrw.com/installation/ · self-hosting guide →
Why it's fast (built in Rust)
You don't need Rust to use fastCRW — it's why the numbers below are what they are. The engine is a single static binary: no Redis, no Node runtime, no Python venv, no headless-browser sidecar parked in the request path. Cold start is sub-second and idle RAM sits around ~50 MB, so one process saturates a $5 VPS instead of a multi-container stack. An agent that fires N scrapes per task pays the network floor N times — fastCRW strips process-spawn, JIT-warmup, and browser-navigation overhead out of every one.
Benchmark
The numbers above come from Firecrawl's own public 1,000-URL dataset, run identically across all three tools with the same matcher — a fairness control, not a looser number. Reproducible, not marketing math. Full table, methodology, and the repro harness: BENCHMARKS.md · fastcrw.com/benchmarks.
Migrating from Firecrawl
New projects use native /v1. Existing Firecrawl v2 SDK code works against the
/firecrawl/v2/* compatibility layer — often just a base-URL swap (point your existing
Firecrawl client at api.fastcrw.com, the address it sends requests to):
from firecrawl import FirecrawlApp
app = FirecrawlApp(api_url="https://api.fastcrw.com", api_key="YOUR_CRW_API_KEY")Compatibility reduces migration work, not every behavioral difference — check request
bodies, response fields, and unsupported features before moving production traffic.
Field-by-field diff: COMPATIBILITY-firecrawl.md.
Security
SSRF protection (blocks loopback, private IPs, cloud metadata, non-HTTP schemes), optional constant-time Bearer auth, RFC 9309 robots.txt, token-bucket rate limiting, and resource caps (1 MB body, depth 10, 1,000 pages). Hardening guide →
Contributing
Issues and PRs welcome. make hooks installs the pre-commit hook; make check runs the same
checks as CI. Setup, architecture, and crate layout: CONTRIBUTING.md.
License
Open source under AGPL-3.0. Calling the API over the network — managed or self-hosted — imposes nothing on your own code. AGPL only applies if you bundle the engine's code directly inside your own app (not just call its API) or run a modified copy as a public service; for those cases the managed offering at fastcrw.com includes a commercial carve-out, and standalone commercial licenses are available — hello@fastcrw.com.
Links
Docs · API reference · MCP setup · Benchmarks · Pricing · Changelog · Discord · X
It is the sole responsibility of end users to respect websites' policies when
scraping. By default, fastCRW respects robots.txt directives.
Maintenance
Appeared in Searches
Latest Blog Posts
- Your AI Chatbot Just Exposed Your CEO's Salary to an InternBy Om-Shree-0709 on .Agent IdentityMCP SecurityOAuth Delegation
- Why MCP Servers Need Execution Sandboxing (And Why Your Current Stack Isn't Enough)By Om-Shree-0709 on .Agentic AiPrompt InjectionWebAssembly
MCP directory API
We provide all the information about MCP servers via our MCP API.
curl -X GET 'https://glama.ai/api/mcp/v1/servers/us/crw'
If you have feedback or need assistance with the MCP directory API, please join our Discord server