From fastCRW
Switches existing Firecrawl SDK code (Python, JS, REST, MCP) to point at fastCRW with a one-line base URL change. Covers drop-in endpoints and gaps.
How this skill is triggered — by the user, by Claude, or both
Slash command
/crw:crw-migrateThis skill is limited to the following tools:
The summary Claude sees in its skill listing — used to decide when to auto-load this skill
Switch in one line. The v2 API is a drop-in for the official `firecrawl-py` v4 SDK
Switch in one line. The v2 API is a drop-in for the official firecrawl-py v4 SDK
and firecrawl-js — swap the base URL and keep your code.
firecrawl-mcp-server entry in your MCP config.Managed fastCRW:
from firecrawl import FirecrawlApp
app = FirecrawlApp(
api_url="https://api.fastcrw.com",
api_key="crw_live_..."
)
Self-hosted fastCRW (default port 3000, no auth):
app = FirecrawlApp(
api_url="http://localhost:3000",
api_key="any" # self-host ignores the key when auth is not configured
)
import FirecrawlApp from "@mendable/firecrawl-js";
const app = new FirecrawlApp({
apiUrl: "https://api.fastcrw.com", // or "http://localhost:3000"
apiKey: "crw_live_...",
});
Replace https://api.firecrawl.dev with https://api.fastcrw.com (or your
self-hosted http://localhost:3000). Auth header stays the same:
Authorization: Bearer <key>.
# Before
curl -X POST https://api.firecrawl.dev/v1/scrape \
-H "Authorization: Bearer fc-..." \
-H "Content-Type: application/json" \
-d '{"url":"https://example.com","formats":["markdown"]}'
# After — change exactly two things: host + key
curl -X POST https://api.fastcrw.com/v1/scrape \
-H "Authorization: Bearer crw_live_..." \
-H "Content-Type: application/json" \
-d '{"url":"https://example.com","formats":["markdown"]}'
| Endpoint | Notes |
|---|---|
POST /v1/scrape | Full markdown/html/links/json formats, onlyMainContent, waitFor, renderJs, includeTags/excludeTags |
POST /v1/crawl + GET /v1/crawl/:id + DELETE /v1/crawl/:id | Async BFS crawl, polling shape matches |
POST /v1/map | URL discovery |
POST /v1/search | SearXNG-backed instead of Fire-engine; same response shape |
POST /v2/scrape | v2 surface with parsers field for PDFs |
POST /v2/crawl + GET /v2/crawl/active | v2 crawl |
POST /v2/map | v2 map |
POST /v2/search | v2 search |
POST /v2/batch/scrape | Batch scrape |
POST /v2/parse | PDF → markdown (see gaps below) |
| Firecrawl feature | fastCRW equivalent | Action |
|---|---|---|
POST /v1/extract (standalone LLM extraction route) | No standalone /v1/extract. Use POST /v1/scrape with formats: ["json"] + a jsonSchema field. | Change call site (single-URL). |
POST /v1/extract multi-URL batch | Not supported. | Loop over URLs, call /v1/scrape per URL, or use /v1/crawl. |
POST /v1/deep-research | Not implemented — cloud-only Firecrawl feature. | No equivalent. |
POST /v1/agent (Spark models) | Not implemented. | No equivalent. |
/v2/parse — DOCX/XLSX/RTF/ODT | PDF only. fastCRW uses pdf-inspector (no OCR). | Keep Firecrawl for non-PDF docs, or convert to PDF first. |
parsers: [{mode: "ocr"}] | Accepted for wire-compat; degrades to text-layer extraction with a pdf_ocr_unsupported warning (no OCR engine). | If OCR is required, keep Firecrawl. |
MCP tool names firecrawl_* | fastCRW MCP uses crw_* (see below). | Update MCP config. |
| Fire-engine anti-bot | Not available. fastCRW uses LightPanda → Chrome stealth ladder. | For heavy Cloudflare sites, test coverage; consider proxy pool. |
jsonSchema aliasFirecrawl's /v1/extract uses extract.schema. fastCRW's /v1/scrape accepts
both the jsonSchema top-level field and the extract.schema alias for
closer Firecrawl parity:
{
"url": "https://example.com",
"formats": ["json"],
"jsonSchema": {
"type": "object",
"properties": { "title": { "type": "string" } }
}
}
Requires [extraction.llm] configured in config.toml (or
CRW_EXTRACTION__LLM__API_KEY env var). See crw-self-host.
Firecrawl MCP uses firecrawl-mcp-server; fastCRW's MCP server is crw-mcp.
Tool names change from firecrawl_* to crw_*:
| Firecrawl MCP tool | fastCRW MCP tool |
|---|---|
firecrawl_scrape | crw_scrape |
firecrawl_crawl | crw_crawl |
firecrawl_check_crawl_status | crw_check_crawl_status |
firecrawl_map | crw_map |
firecrawl_search | crw_search |
firecrawl_extract | crw_scrape with formats=["json"] + jsonSchema |
| — | crw_parse_file (PDF upload; no Firecrawl MCP equivalent) |
~/.claude/claude_desktop_config.json (or settings){
"mcpServers": {
"crw": {
"command": "npx",
"args": ["crw-mcp"],
"env": {
"CRW_API_URL": "https://api.fastcrw.com",
"CRW_API_KEY": "crw_live_..."
}
}
}
}
For self-hosted (no auth, no env needed):
{
"mcpServers": {
"crw": {
"command": "npx",
"args": ["crw-mcp"]
}
}
}
Embedded mode (npx crw-mcp with no CRW_API_URL) runs the engine in-process
— zero server to stand up, ~6 MB RAM.
Run these after pointing at fastCRW. Each should return "success": true:
# 1. Health check (no auth)
curl http://localhost:3000/health
# → {"status":"ok",...}
# 2. Basic scrape
curl -X POST "$CRW_API_URL/v1/scrape" \
-H "Authorization: Bearer $CRW_API_KEY" \
-H "Content-Type: application/json" \
-d '{"url":"https://example.com","formats":["markdown"]}' | jq .success
# → true
# 3. Map (URL discovery)
curl -X POST "$CRW_API_URL/v1/map" \
-H "Authorization: Bearer $CRW_API_KEY" \
-H "Content-Type: application/json" \
-d '{"url":"https://example.com"}' | jq '.data | length'
# → N (should be > 0)
# 4. Search (requires SearXNG — managed always works; self-host needs sidecar)
curl -X POST "$CRW_API_URL/v1/search" \
-H "Authorization: Bearer $CRW_API_KEY" \
-H "Content-Type: application/json" \
-d '{"query":"fastCRW scraper","limit":3}' | jq .success
# → true
# 5. Structured extraction (requires [extraction.llm] configured)
curl -X POST "$CRW_API_URL/v1/scrape" \
-H "Authorization: Bearer $CRW_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"url":"https://example.com",
"formats":["json"],
"jsonSchema":{"type":"object","properties":{"title":{"type":"string"}}}
}' | jq '.data.json'
Compare the data.markdown / data.metadata shape from your existing
Firecrawl responses — the field names on the overlap surface (title,
description, sourceURL, statusCode) match. A few metadata sub-fields
diverge; inspect with jq .data.metadata if your code reads specific keys.
npx claudepluginhub us/crwUpgrades @mendable/firecrawl-js SDK and migrates from v0/v1 to v2 API, fixing crawlUrl, scrapeUrl, async methods, and extract schemas.
Reference for building production-ready crw integrations: verb selection, CLI/MCP/REST call surfaces, post-filtering, context-window hygiene, Hybrid RAG patterns, and operational pitfalls.
Wires Firecrawl credentials into `.env`, guides SDK installation, and runs browser auth flow for app integration.