Skip to main content
Glama
mustafamemon265789-cloud

MCP Firecrawl

MCP Firecrawl

Node.js TypeScript MCP Firecrawl License: 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" }


Related MCP server: WebSearch

Quick Start

# 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

# 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)

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:

{
  "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

{
  "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

{
  "experimental": {
    "mcpServers": {
      "firecrawl": {
        "command": "node",
        "args": ["C:/path/to/MCP/dist/server.js"],
        "env": { "FIRECRAWL_API_KEY": "fc-..." }
      }
    }
  }
}

opencode

File: ./opencode.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:

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 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


License

MIT

Available Tools

3 tools
crawl_websiteA

Crawl multiple pages from a website and return extracted markdown content

ParametersJSON Schema
NameRequiredDescriptionDefault
urlYesThe starting URL to crawl
limitNoMaximum number of pages to crawl (1–100)

TDQS

A3.5/5.0
Behavior2/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

No annotations are provided, and the description does not disclose key behavioral traits such as rate limits, robots.txt compliance, domain restrictions, or how links are followed. The agent lacks critical information about safety and limitations.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is a single clear sentence with no filler. It is front-loaded with the core action. However, it could be slightly more structured by separating purpose and output format.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness2/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

The description lacks completeness for a crawling tool: no mention of scope (e.g., same domain only), depth, handling of dynamic content, or output format details. No output schema exacerbates the gap, and the description fails to provide necessary behavioral context.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, so the schema already explains the parameters. The description adds general context (multiple pages, markdown output) but does not provide additional parameter-specific semantics beyond what the schema offers.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

Description clearly states the tool crawls multiple pages and returns markdown content. It uses a specific verb (crawl) and resource (website), and implicitly distinguishes from siblings: scrape_url (single page) and search_web (search, not crawl).

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description implies when to use: for crawling multiple pages from a website. It does not explicitly exclude single-page use or name alternatives, but the context is clear enough for an agent to infer.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

scrape_urlA

Scrape a single webpage and return clean markdown content with metadata

ParametersJSON Schema
NameRequiredDescriptionDefault
urlYesThe URL of the webpage to scrape

TDQS

A3.5/5.0
Behavior2/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

No annotations provided, so description must disclose behavior. It specifies output format but lacks details on rate limits, authentication, error handling, or limitations (e.g., JavaScript rendering). Agent has limited insight into operational constraints.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Single sentence, concise and front-loaded with action. No wasted words. Could benefit from slight elaboration on metadata but remains efficient.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given simple tool (1 param, no output schema, no nested objects), description adequately covers purpose and output. Slight gap on metadata content but not critical for selection.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema has 100% coverage for the single parameter url, already described as 'The URL of the webpage to scrape'. Description adds no additional meaning beyond the schema, earning baseline 3.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

Description clearly states verb 'scrape', resource 'single webpage', and output 'clean markdown content with metadata'. This distinguishes from sibling tools: crawl_website (multiple pages) and search_web (search results).

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Implied usage for single-page scraping but no explicit when to use or alternatives provided. Does not reference sibling tools or specify when to choose this over crawl_website or search_web.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

search_webB

Search the web using Firecrawl and return relevant results with content summaries

ParametersJSON Schema
NameRequiredDescriptionDefault
queryYesThe search query

TDQS

B3.4/5.0
Behavior2/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description carries the full burden but only says 'search the web' and 'return relevant results with content summaries'. It does not disclose potential rate limits, query length constraints (though in schema), or whether the tool is read-only.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Single sentence that is front-loaded with the key action ('Search the web'). No extraneous words.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a simple tool with one parameter and no output schema, the description is fairly complete. It mentions the return format (content summaries), which is helpful. However, it could briefly note that results are limited to snippets.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100% with the parameter 'query' described as 'The search query'. The description repeats the verb but adds no extra semantic detail beyond what the schema already provides, keeping the score at baseline 3.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the tool searches the web using Firecrawl and returns results with summaries. This distinguishes it from siblings crawl_website and scrape_url, which focus on specific sites or URLs.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

No guidance on when to use this tool versus its siblings. For example, it does not specify that this is for broad web searches whereas crawl_website is for crawling a specific domain.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

Tool Schema Changelog

Recent tool additions, removals, and schema changes observed during successful MCP inspections. Dates show when Glama detected each change.

  1. 3 tool updatesv1.0.0
    • First observedcrawl_website
    • First observedscrape_url
    • First observedsearch_web

TDQS

A3.8/5.0
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

ActivityStale
ResponsivenessNo issues

Resources

Unclaimed servers have limited discoverability.

Looking for Admin?

If you are the server author, to access and configure the admin panel.

Related MCP Connectors

Related MCP Servers

Latest Blog Posts

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/mustafamemon265789-cloud/MCP'

If you have feedback or need assistance with the MCP directory API, please join our Discord server