firecrawl-lite-mcp-server
Firecrawl Lite MCP Server lets AI agents scrape web pages locally, turning URLs into clean Markdown or screenshots, with optional LLM-powered structured extraction, over both MCP and a Firecrawl-compatible API.
Web scraping:
scrape_pageconverts a single URL into clean Markdown, rendering JavaScript and waiting for the page to settle.Batch scraping:
batch_scrapeprocesses up to 10 URLs with polite random delays between requests.Screenshots:
screenshotcaptures a page as a base64 PNG, with configurable viewport size and full-page option.LLM extraction:
extract_datapulls structured information (e.g., price, release date) into JSON using your own OpenAI-compatible model.Schema-based extraction:
extract_with_schemareturns data matching a JSON Schema you provide.Firecrawl-compatible API:
POST /v2/scrapelets existing Firecrawl SDKs and agents use the server as a drop-in self-hosted scraper; search endpoints return a clear 501.Local-first: one Node.js process with stealth-patched headless Chrome; no cloud, no Firecrawl account, and no API keys required for scraping.
Flexible deployment: works as an MCP stdio server via
npx, as a remote MCP HTTP/SSE server, or as a Dockerized HTTP service with health checks.Configurable scraping: options for user-agent rotation, viewport, delays, settle time, link stripping, output character limits, retries, and proxy support.
Optional LLM tools: only needed for
extract_*; bring your own model provider (OpenAI, Anthropic, xAI, OpenRouter, Ollama, etc.).
Click on "Deploy Server".
Wait a few minutes for the server to deploy. Once ready, it will show a "Started" state.
In the chat, type
@followed by the MCP server name and your instructions, e.g., "@firecrawl-lite-mcp-server Extract all job listings from https://jobs.example.com"
That's it! The server will respond to your query, and you can continue using it as needed.
Here is a step-by-step guide with screenshots.
Firecrawl Lite MCP Server
Web scraping for AI agents, minus the infrastructure. One process. Your machine. No scraping cloud in the loop.
Your agent needs to read web pages. Firecrawl is great at that, but self-hosting it means Redis, a Playwright service, API workers, and a weekend. Firecrawl Lite is the other option: a single Node.js process with headless Chrome (stealth-patched) that turns URLs into clean Markdown, and speaks the two protocols agents actually use:
MCP — for Claude Desktop, Claude Code, Cursor, and anything else that talks Model Context Protocol.
Firecrawl-compatible REST API — for any agent or harness that already speaks the Firecrawl SDK. Point
FIRECRAWL_API_URLat it and it quietly impersonates a self-hosted Firecrawl (scrape only — no crawl or search).
Nothing leaves your box except the page requests themselves. No Firecrawl account. No API keys required at all unless you want the optional LLM-powered extraction tools — and for those, you bring your own model.
60-second start
As an MCP server (Claude Code shown; Claude Desktop and Cursor configs are below):
claude mcp add firecrawl-lite npx -- -y firecrawl-lite-mcp-serverAs a Firecrawl-compatible API (for agents, scripts, anything HTTP):
docker run -d -p 3000:3000 ariangibson/firecrawl-lite-mcp-server:latest
curl -X POST localhost:3000/v2/scrape -H 'Content-Type: application/json' -d '{"url":"https://example.com"}'That's a working scraper. Everything below is optional.
Related MCP server: Web Scraper MCP
What you get
Tool | Does | Needs an LLM? |
| URL → clean Markdown. Renders JS, waits for the DOM to settle, strips the junk. | No |
| Same, for up to 10 URLs, with polite delays between them. | No |
| URL → PNG (base64). Viewport or full page. | No |
| "Get me the price and the release date" → JSON, via your LLM. | Yes |
| Same, but you hand it a JSON Schema and get exactly that shape back. | Yes |
The Firecrawl-compatible API exposes scrape_page as POST /v2/scrape. See the API section for the exact contract.
Hook it up
MCP clients
The env block is only needed for the extract_* tools; leave it out otherwise.
macOS: ~/Library/Application Support/Claude/claude_desktop_config.json · Windows: %APPDATA%\Claude\claude_desktop_config.json
{
"mcpServers": {
"firecrawl-lite": {
"command": "npx",
"args": ["-y", "firecrawl-lite-mcp-server"],
"env": {
"LLM_API_KEY": "sk-...",
"LLM_PROVIDER_BASE_URL": "https://api.openai.com/v1",
"LLM_MODEL": "gpt-5.5"
}
}
}
}claude mcp add firecrawl-lite \
--env LLM_API_KEY=your_key \
--env LLM_PROVIDER_BASE_URL=https://api.openai.com/v1 \
--env LLM_MODEL=gpt-5.5 \
-- npx -y firecrawl-lite-mcp-serverDrop the --env lines if you don't need the LLM tools. For a remote instance: claude mcp add -t http firecrawl-lite http://your-server:3000/mcp.
The env block is only needed for the extract_* tools; leave it out otherwise.
{
"mcpServers": {
"firecrawl-lite": {
"command": "npx",
"args": ["-y", "firecrawl-lite-mcp-server"],
"env": {
"LLM_API_KEY": "sk-...",
"LLM_PROVIDER_BASE_URL": "https://api.openai.com/v1",
"LLM_MODEL": "gpt-5.5"
}
}
}
}Agents that speak Firecrawl
Any framework with a "self-hosted Firecrawl" option works unchanged — set its Firecrawl URL to your Firecrawl Lite instance. The server implements the scrape endpoint the SDKs call; search returns a clear 501 because this is a renderer, not a search engine, so pair it with whatever search provider your agent supports.
Hermes uses Firecrawl for web_extract and lets you split search and extract across providers.
# ~/.hermes/.env
FIRECRAWL_API_URL=http://your-server:3000
# FIRECRAWL_API_KEY=... only if you set one on the server# ~/.hermes/config.yaml
web:
search_backend: ddgs # DuckDuckGo, no key. Or searxng, brave-free, ...
extract_backend: firecrawl # → Firecrawl LiteHermes's native web_extract now renders through your local browser. It also supports MCP servers if you want screenshot and extract_with_schema too.
from firecrawl import Firecrawl
fc = Firecrawl(api_key="unused", api_url="http://your-server:3000")
doc = fc.scrape("https://example.com", formats=["markdown"])
print(doc.markdown)The JS SDK works the same way with apiUrl.
Configuration
Everything is an environment variable, and everything has a default. Full annotated list in .env.example.
Endpoints
Running via npx with nothing set = MCP over stdio. Enable any of these and it becomes an HTTP server on PORT (default 3000) instead. The Docker image turns on /mcp and the Firecrawl API out of the box.
Variable | |
|
|
| Optional. If set, that API requires |
|
|
|
|
/health is always there when HTTP is on. Without Docker: ENABLE_FIRECRAWL_API=true npx -y firecrawl-lite-mcp-server.
LLM (only for extract_*)
Variable | |
| Any OpenAI-compatible base URL; the server calls |
| Model name |
| Your key |
| Optional tuning, passed straight through. Defaults |
# OpenAI
LLM_PROVIDER_BASE_URL=https://api.openai.com/v1 LLM_MODEL=gpt-5.5
# Anthropic
LLM_PROVIDER_BASE_URL=https://api.anthropic.com/v1 LLM_MODEL=claude-haiku-4-5
# xAI
LLM_PROVIDER_BASE_URL=https://api.x.ai/v1 LLM_MODEL=grok-4
# OpenRouter
LLM_PROVIDER_BASE_URL=https://openrouter.ai/api/v1 LLM_MODEL=openai/gpt-5.5
# Ollama (local)
LLM_PROVIDER_BASE_URL=http://localhost:11434/v1 LLM_MODEL=llama3.3Scraping behaviour
Variable | Default | |
| a current Chrome UA | One string, or a JSON array to rotate through (keep it on one line) |
|
| |
|
| Random pause before navigating (ms) |
|
| Random pause between batch URLs (ms) |
|
| How long to wait for a page to stop changing. Raise it for sites that inject content on a slow |
|
| Replace |
|
| Hard cap on Markdown/text output, ending in a |
|
| Attempts per scrape, each advancing the proxy / UA rotation |
Proxy
PROXY_SERVER_URL=http://proxy.example.com:10001-10010 # a port range = automatic rotation
PROXY_SERVER_USERNAME=...
PROXY_SERVER_PASSWORD=...
PROXY_LLM_API=false # proxies are for target sites; LLM calls go direct unless you say otherwiseDeploying
docker run -d -p 3000:3000 \
-e LLM_API_KEY=... -e LLM_PROVIDER_BASE_URL=... -e LLM_MODEL=... \
ariangibson/firecrawl-lite-mcp-server:latestOr use the bundled docker-compose.yml with a .env file. It uses a wget health check on purpose: the Alpine image has no curl, and a curl check will restart-loop the container (see Troubleshooting).
Images are multi-arch (amd64 / arm64), published to ariangibson/firecrawl-lite-mcp-server on Docker Hub and ghcr.io/ariangibson/firecrawl-lite-mcp-server. Tags: latest moves on every push to main; stable only moves on releases — track stable in production (it pairs well with Watchtower for hands-off updates); version tags (1.5.0, 1.5, 1) pin exactly.
Remote MCP clients: Claude Code → claude mcp add -t http firecrawl-lite http://your-server:3000/mcp. Claude Desktop → Settings → Connectors with an HTTPS URL, or mcp-proxy http://your-server:3000/sse if you don't have a certificate (needs ENABLE_SSE_ENDPOINT=true).
Firecrawl-compatible API
Implements the slice of the Firecrawl v2 API that SDK clients use for extraction.
Endpoint | |
| Request: |
|
|
formats defaults to ["markdown"] and accepts both "markdown" and { "type": "markdown" }; screenshot is accepted but ignored. Two extensions beyond stock Firecrawl: stripLinkUrls (boolean) and maxChars (number) override the SCRAPE_STRIP_LINK_URLS / SCRAPE_MAX_CHARS defaults per request — and when link URLs are stripped, links is always included so nothing is lost. With FIRECRAWL_API_KEY set, both endpoints return 401 before anything else. Crawl, map, batch jobs, and the other async endpoints aren't implemented.
Troubleshooting
Could not find Chrome — the npx postinstall step downloads Chrome the first time; if it's missing: npx puppeteer browsers install chrome. Corrupted? rm -rf ~/.cache/puppeteer and run it again.
Scraping works, extract_* doesn't — it's the LLM call. The server logs the provider's status and response body to stderr. 401 = bad key. 400 = wrong model name or a tuning param the model rejects. 429 = you're being rate limited.
Container restart-loops with SIGTERM right after "listening on port 3000" — a curl health check is failing because the image has no curl. Use wget --spider http://localhost:3000/health (the bundled compose file already does).
Agent says Firecrawl isn't configured / extract fails — curl http://your-server:3000/health should show endpoints.firecrawlApi = "enabled". If you set FIRECRAWL_API_KEY on the server, the agent needs the same value. Search failing is expected unless the agent has a separate search provider.
Under the hood
For the curious or the contributing: config.ts parses every env var once into a typed object; browser.ts owns one stealth browser session (launch flags, proxy, UA, navigation, cleanup, retries); scraper.ts puts rotation, retries, and scroll/settle heuristics behind two methods, scrape and screenshot; htmlToMarkdown.ts does the cleaning and conversion; index.ts is just MCP tool definitions, LLM extraction, and transports. The browser and clock are injected, so the whole scrape pipeline is tested through a stub browser — npm test needs no Chrome and no network.
npm install && npm run build && npm testReleases: bump version, git tag vX.Y.Z, push the tag. CI publishes to npm (with provenance) and Docker Hub / GHCR.
Credits
Inspired by the Firecrawl team and their official MCP server. This is an independent, deliberately small take on the same idea. If you want the managed, enterprise-grade version with crawling, search, and a team behind it, that's firecrawl.com.
License
MIT — see LICENSE.
Available Tools
5 toolsbatch_scrapeA
Scrape multiple URLs in a single request
Inputs: urls (required), onlyMainContent.
extract_dataB
Extract structured data from webpages using LLM
Inputs: urls (required), prompt (required).
extract_with_schemaC
Extract structured data using a JSON schema
Inputs: urls (required), schema (required), prompt.
scrape_pageA
Extract content from a single webpage
Inputs: url (required), onlyMainContent.
screenshotB
Take a screenshot of a webpage using stealth browser
Inputs: url (required), width, height, fullPage.
Tool Schema Changelog
Recent tool additions, removals, and schema changes observed during successful MCP inspections.
Loading tool schema changelog…
TDQS
Scored across 5 tools
Most tools have clearly distinct purposes: scraping, batch scraping, LLM extraction, schema-based extraction, and screenshots. The only potential confusion is between extract_data and extract_with_schema, but their descriptions make the distinction clear.
All names use lowercase with underscores and mostly follow a verb-first pattern (scrape_page, batch_scrape, extract_data, extract_with_schema). 'screenshot' breaks the verb_noun pattern but is still a familiar, predictable command.
Five tools is well-scoped for a 'lite' server: it covers single scraping, batch scraping, two flavors of structured extraction, and screenshots. Each tool earns its place without redundancy or bloat.
The core web data collection lifecycle is covered: raw content extraction, batch processing, structured extraction, and visual capture. Missing crawls or search features, but those are likely intentionally excluded from a lite server.
Maintenance
Related MCP Connectors
Web scraping, browser automation, screenshots and AI data extraction for AI agents via MCP.
Web scraping, search, crawling, structured extraction and research for AI agents.
A real browser for your agent: screenshots, page checks, Markdown and PDFs.
Cloud browser, web extraction, screenshots, and remote CDP tools for AI agents.
Related MCP Servers
- AlicenseNot gradedqualityDmaintenanceEnables browser automation, web content extraction, and LLM-powered data transformation using Playwright. Supports session management, authentication flows, and works with local LLMs (Ollama, JAN AI) or external providers to clean and structure extracted web data.37 npm6MIT
- AlicenseAqualityBmaintenanceProvides an LLM client with self-hosted web scraping capabilities including scraping, crawling, mapping, searching, structured data extraction, browser interaction, and deep research, without reliance on paid proxy or CAPTCHA services.4GPL 3.0

Spicrawl MCP Serverofficial
AlicenseAqualityBmaintenanceEnables AI agents in Claude Code, Claude Desktop, Cursor, VS Code, Windsurf, Gemini CLI and Codex to scrape web pages into Markdown, text, HTML, JSON or PDF, extract structured data with selectors or autoparse, capture screenshots and PDFs the model can see, drive pages with typed browser actions, keep logged-in persistent browser sessions, and batch-scrape thousands of URLs as async jobs. It also exposes usage, request-log and documentation tools so agents can check costs, diagnose failures and look up parameters without leaving the chat.25Apache 2.0- AlicenseNot gradedqualityBmaintenanceEnables AI agents to read any web page — including pages behind a signed-in session, localhost, and JavaScript-heavy sites — as clean, focus-ranked, token-budgeted markdown using a real browser running locally, with no cloud relay or API key. Also supports structured extraction, link listing, screenshots, and policy-gated interaction.20 npm1MIT