MCP Firecrawl
README.md
# MCP Firecrawl
[](https://nodejs.org)
[](https://www.typescriptlang.org)
[](https://modelcontextprotocol.io)
[](https://www.firecrawl.dev)
[](https://opensource.org/licenses/MIT)
A production-ready **Model Context Protocol (MCP)** server that integrates with the **Firecrawl API** to give AI assistants the power to **scrape**, **crawl**, and **search** the web.
> Works with **Claude Desktop**, **Cursor**, **VS Code (Cline/Roo Code)**, **Continue**, **OpenAI Agents SDK**, and any other MCP-compatible AI tool.
---
## Features
| Tool | Description | Input |
|------|-------------|-------|
| `scrape_url` | Scrape any webpage → returns clean Markdown content + metadata | `{ "url": "https://..." }` |
| `crawl_website` | Crawl multiple pages (up to 100) from a website | `{ "url": "https://...", "limit": 10 }` |
| `search_web` | Search the web using Firecrawl's search engine | `{ "query": "latest AI news" }` |
---
## Quick Start
```bash
# 1. Clone
git clone https://github.com/YOUR_USERNAME/MCP.git
cd MCP
# 2. Install
npm install
# 3. Configure
cp .env.example .env
# Edit .env → add your Firecrawl API key:
# FIRECRAWL_API_KEY=fc-your-key-here
# 4. Build & Run
npm run build
npm start
```
✅ Server is now running on **stdio** (default mode).
---
## Usage
### Command Line Test
```bash
# List available tools
node test-mcp.mjs tools
# Scrape a website
node test-mcp.mjs scrape https://example.com
# Search the web
node test-mcp.mjs search "latest TypeScript news"
```
### With OpenAI Agents SDK (TypeScript)
```typescript
import { Agent, run, MCPServerStdio } from "@openai/agents";
const mcp = new MCPServerStdio({
name: "Firecrawl",
fullCommand: "node dist/server.js",
env: { FIRECRAWL_API_KEY: "fc-..." },
});
await mcp.connect();
const agent = new Agent({
name: "Web Assistant",
instructions: "Use tools to scrape, crawl, and search the web.",
mcpServers: [mcp],
});
const result = await run(agent, "Scrape https://example.com");
console.log(result.finalOutput);
await mcp.close();
```
---
## Integration with AI Tools
### Claude Desktop
Add to `%APPDATA%\Claude\claude_desktop_config.json`:
```json
{
"mcpServers": {
"firecrawl": {
"command": "node",
"args": ["C:/path/to/MCP/dist/server.js"],
"env": {
"FIRECRAWL_API_KEY": "fc-..."
}
}
}
}
```
### Cursor
Settings → Features → MCP → Add Server:
```
Name: firecrawl
Type: command
Command: node "C:/path/to/MCP/dist/server.js"
Environment: FIRECRAWL_API_KEY=fc-...
```
### VS Code + Cline / Roo Code
File: `.vscode/cline_mcp_settings.json`
```json
{
"mcpServers": {
"firecrawl": {
"command": "node",
"args": ["C:/path/to/MCP/dist/server.js"],
"env": { "FIRECRAWL_API_KEY": "fc-..." },
"disabled": false,
"autoApprove": []
}
}
}
```
### Continue (VS Code / JetBrains)
File: `~/.continue/config.json`
```json
{
"experimental": {
"mcpServers": {
"firecrawl": {
"command": "node",
"args": ["C:/path/to/MCP/dist/server.js"],
"env": { "FIRECRAWL_API_KEY": "fc-..." }
}
}
}
}
```
### opencode
File: `./opencode.json`
```json
{
"mcp": {
"firecrawl": {
"type": "local",
"command": ["node", "MCP/dist/server.js"],
"enabled": true,
"env": { "FIRECRAWL_API_KEY": "fc-..." }
}
}
}
```
---
## HTTP Mode (Streamable HTTP)
Can't use stdio? Run the server as an HTTP endpoint instead:
```bash
npm run start:http
# Listening on http://127.0.0.1:3001/mcp
```
Then connect any MCP client to that URL.
---
## Project Structure
```
MCP/
├── src/
│ ├── server.ts # Entry point (stdio + HTTP modes)
│ ├── tools/
│ │ ├── scrape.ts # scrape_url tool
│ │ ├── crawl.ts # crawl_website tool
│ │ └── search.ts # search_web tool
│ ├── services/
│ │ └── firecrawl.ts # FirecrawlApp API wrapper
│ └── types/
│ └── index.ts # TypeScript interfaces
├── test-mcp.mjs # CLI test utility
├── .env.example # Environment template
├── package.json
├── tsconfig.json
└── README.md
```
---
## Environment Variables
| Variable | Required | Default | Description |
|----------|----------|---------|-------------|
| `FIRECRAWL_API_KEY` | ✅ Yes | — | Your [Firecrawl](https://www.firecrawl.dev) API key |
| `HTTP_HOST` | ❌ No | `127.0.0.1` | HTTP bind address (HTTP mode only) |
| `HTTP_PORT` | ❌ No | `3001` | HTTP port (HTTP mode only) |
---
## NPM Scripts
| Script | Description |
|--------|-------------|
| `npm run build` | Compile TypeScript → `dist/` |
| `npm start` | Run in stdio mode |
| `npm run start:http` | Run in HTTP mode |
| `npm run dev` | Run with hot-reload (stdio) |
| `npm run dev:http` | Run with hot-reload (HTTP) |
| `npm run clean` | Delete `dist/` |
---
## Tech Stack
- **Runtime:** Node.js 18+
- **Language:** TypeScript
- **MCP SDK:** `@modelcontextprotocol/sdk`
- **Scraping Engine:** `firecrawl` SDK
- **Validation:** `zod`
- **Config:** `dotenv`
---
## Requirements
- Node.js 18 or higher
- A [Firecrawl API key](https://www.firecrawl.dev) (free tier available)
---
## License
MIT
TDQS
A3.8/5.0
Scored across 3 tools
Disambiguation5/5
Each tool targets a distinct action: crawling multiple pages, scraping a single page, and searching the web. There is no overlap in purpose.
Naming Consistency5/5
All tool names follow a consistent verb_noun pattern using snake_case: crawl_website, scrape_url, search_web.
Tool Count4/5
3 tools is slightly lean but covers the core web extraction tasks. More tools could be added (e.g., for authentication), but the set is scoped appropriately.
Completeness4/5
The tools cover the primary operations: crawling, scraping, and searching. Minor gaps exist (e.g., no tool for custom headers), but the surface is functional for typical use cases.
Maintenance
ActivityInactive
ResponsivenessNo issues