Firecrawl MCP Multiple Keys
Search GitHub issues, pull requests, and readmes through the Firecrawl API.
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 MCP Multiple Keyssearch for recent developments in quantum computing"
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 MCP Multiple Keys
A Firecrawl MCP server with built-in support for multiple API keys. It exposes Firecrawl's web search, scraping, crawling, extraction, browser interaction, monitoring, and research tools to OpenCode and other MCP clients.
This fork is useful when you want one local Firecrawl MCP server that rotates across a pool of API keys instead of configuring several separate MCP server entries.
Highlights
Local
stdioMCP server by defaultOptional Streamable HTTP transport for hosted or local HTTP usage
Multi-key rotation with
FIRECRAWL_API_KEYSSingle-key fallback with
FIRECRAWL_API_KEYProcess-local round-robin key selection
Retry/failover across pooled keys for retryable Firecrawl errors where safe
Firecrawl cloud and self-hosted API support
TypeScript source bundled with
tsup
Related MCP server: WebSearch
Requirements
Node.js 22 or newer
pnpm
One or more Firecrawl API keys
OpenCode or another MCP-compatible client
Install
git clone https://github.com/AdvaitR7/firecrawl-mcp-multiple-keys.git
cd firecrawl-mcp-multiple-keys
pnpm install
pnpm run buildThe build creates dist/index.js. MCP clients should run that file with Node.
Configure API Keys
For multiple keys, set FIRECRAWL_API_KEYS as a comma-separated or whitespace-separated list:
FIRECRAWL_API_KEYS=firecrawl_key_1,firecrawl_key_2For a single key, set FIRECRAWL_API_KEY:
FIRECRAWL_API_KEY=firecrawl_key_1FIRECRAWL_API_KEYS takes precedence over FIRECRAWL_API_KEY unless FIRECRAWL_OAUTH_TOKEN is set.
Key Rotation Behavior
At startup, the server loads FIRECRAWL_API_KEYS into a process-local key pool. Each request that uses the pool starts with the next key in sequence.
request 1 -> key 1
request 2 -> key 2
request 3 -> key 1
request 4 -> key 2For retryable failures such as 429, 5xx, timeout, or network errors, supported read-style operations can try remaining keys in the current cycle. Mutating operations are more conservative to avoid duplicate jobs.
Header credentials and FIRECRAWL_OAUTH_TOKEN bypass the environment key pool.
OpenCode Setup
Build the project first:
pnpm install
pnpm run buildAdd a local MCP entry to your OpenCode config. Use an absolute path to dist/index.js.
Multi-key configuration:
{
"mcp": {
"firecrawl": {
"type": "local",
"command": ["node", "/absolute/path/to/firecrawl-mcp-multiple-keys/dist/index.js"],
"enabled": true,
"timeout": 30000,
"environment": {
"FIRECRAWL_API_KEYS": "firecrawl_key_1,firecrawl_key_2"
}
}
}
}Single-key configuration:
{
"mcp": {
"firecrawl": {
"type": "local",
"command": ["node", "/absolute/path/to/firecrawl-mcp-multiple-keys/dist/index.js"],
"enabled": true,
"timeout": 30000,
"environment": {
"FIRECRAWL_API_KEY": "firecrawl_key_1"
}
}
}
}Restart OpenCode after changing MCP configuration.
Environment Variables
Variable | Required | Description |
| No | Comma- or whitespace-separated API keys for round-robin rotation |
| No | Single Firecrawl API key fallback |
| No | Static Firecrawl OAuth access token for stdio usage |
| No | Custom Firecrawl API URL for self-hosted instances |
| No | Set to |
| No | Set to |
| No | Set to |
| No | HTTP transport port, default |
| No | HTTP transport host, default |
Transport Modes
By default, the server starts on stdio:
FIRECRAWL_API_KEYS=firecrawl_key_1,firecrawl_key_2 node dist/index.jsFor local Streamable HTTP transport:
HTTP_STREAMABLE_SERVER=true FIRECRAWL_API_KEY=firecrawl_key_1 node dist/index.jsDirect terminal execution of the stdio server will wait for MCP protocol input. For normal usage, run it through OpenCode or another MCP client.
Tools
Core Firecrawl Tools
Tool | Description |
| Scrape a single URL with markdown, JSON, HTML, screenshots, or other formats |
| Discover URLs on a website |
| Search the web, news, images, GitHub, research, or PDFs |
| Send feedback for a previous Firecrawl search result |
| Send generic endpoint feedback for scrape, parse, map, or search jobs |
| Crawl multiple pages from a site or section |
| Check an existing crawl job status |
| Extract structured data from one or more URLs |
| Start an autonomous web research agent job |
| Poll an agent job until completion |
| Interact with a web page in a browser session |
| Stop an interaction session |
| Parse uploaded or local documents, including PDFs |
Monitor Tools
Tool | Description |
| Create a recurring monitor for pages or searches |
| List monitors |
| Get one monitor by ID |
| Update monitor settings |
| Delete a monitor |
| Trigger a monitor check immediately |
| List historical monitor checks |
| Inspect one monitor check and its page diffs |
Research Tools
Tool | Description |
| Search research papers by topic |
| Fetch metadata for one paper |
| Expand from seed papers through citation graph similarity |
| Read relevant full-text passages for one paper |
| Search GitHub issues, pull requests, and readmes |
Development
Install dependencies:
pnpm installBuild:
pnpm run buildTest:
pnpm testLint:
pnpm run lintFormat:
pnpm run formatRun the compiled stdio server:
FIRECRAWL_API_KEYS=firecrawl_key_1,firecrawl_key_2 pnpm startSecurity
Never put real Firecrawl API keys in source files, README examples, screenshots, issues, or commits. Keep keys in your MCP client environment config, shell environment, or a local .env file that is not committed.
If a key is exposed, revoke it in Firecrawl and create a replacement key.
License
MIT
Available Tools
26 toolsfirecrawl_agentA
Autonomous web research agent. This is a separate AI agent layer that independently browses the internet, searches for information, navigates through pages, and extracts structured data based on your query. You describe what you need, and the agent figures out where to find it.
How it works: The agent performs web searches, follows links, reads pages, and gathers data autonomously. This runs asynchronously - it returns a job ID immediately, and you poll firecrawl_agent_status to check when complete and retrieve results.
IMPORTANT - Async workflow with patient polling:
Call
firecrawl_agentwith your prompt/schema → returns job ID immediatelyPoll
firecrawl_agent_statuswith the job ID to check progressKeep polling for at least 2-3 minutes - agent research typically takes 1-5 minutes for complex queries
Poll every 15-30 seconds until status is "completed" or "failed"
Do NOT give up after just a few polling attempts - the agent needs time to research
Expected wait times:
Simple queries with provided URLs: 30 seconds - 1 minute
Complex research across multiple sites: 2-5 minutes
Deep research tasks: 5+ minutes
Best for: Complex research tasks where you don't know the exact URLs; multi-source data gathering; finding information scattered across the web; extracting data from JavaScript-heavy SPAs that fail with regular scrape. Not recommended for:
Single-page extraction when you have a URL (use firecrawl_scrape, faster and cheaper)
Web search (use firecrawl_search first)
Interactive page tasks like clicking, filling forms, login, or navigating JS-heavy SPAs (use firecrawl_scrape + firecrawl_interact)
Extracting specific data from a known page (use firecrawl_scrape with JSON format)
Arguments:
prompt: Natural language description of the data you want (required, max 10,000 characters)
urls: Optional array of URLs to focus the agent on specific pages
schema: Optional JSON schema for structured output
Prompt Example: "Find the founders of Firecrawl and their backgrounds" Usage Example (start agent, then poll patiently for results):
{
"name": "firecrawl_agent",
"arguments": {
"prompt": "Find the top 5 AI startups founded in 2024 and their funding amounts",
"schema": {
"type": "object",
"properties": {
"startups": {
"type": "array",
"items": {
"type": "object",
"properties": {
"name": { "type": "string" },
"funding": { "type": "string" },
"founded": { "type": "string" }
}
}
}
}
}
}
}Then poll with firecrawl_agent_status every 15-30 seconds for at least 2-3 minutes.
Usage Example (with URLs - agent focuses on specific pages):
{
"name": "firecrawl_agent",
"arguments": {
"urls": ["https://docs.firecrawl.dev", "https://firecrawl.dev/pricing"],
"prompt": "Compare the features and pricing information from these pages"
}
}Returns: Job ID for status checking. Use firecrawl_agent_status to poll for results.
| Name | Required | Description | Default |
|---|---|---|---|
| urls | No | ||
| prompt | Yes | ||
| schema | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Describes async behavior, polling workflow, and expected wait times. Annotations provide readOnlyHint=false and openWorldHint=true; description adds context on how the agent navigates and extracts data without contradiction.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Description is verbose but well-structured with sections (How it works, Important, etc.). Every sentence adds value; could be slightly trimmed but remains clear.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Covers async workflow, polling, when to use, examples, and return value. References sibling status tool. Complete for a complex async tool without output schema.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Despite 0% schema coverage, the description explains each parameter: prompt (natural language, max length), urls (optional focus), schema (structured output). Provides examples and usage.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states 'Autonomous web research agent' and explains it browses the internet to find and extract structured data. It distinguishes from siblings like firecrawl_scrape (single page extraction) and firecrawl_search (web search).
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly recommends for complex research tasks and multi-source data gathering. Lists not-recommended scenarios with alternative tools (firecrawl_scrape, firecrawl_search, firecrawl_interact).
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
firecrawl_agent_statusARead-only
Check the status of an agent job and retrieve results when complete. Use this to poll for results after starting an agent with firecrawl_agent.
IMPORTANT - Be patient with polling:
Poll every 15-30 seconds
Keep polling for at least 2-3 minutes before considering the request failed
Complex research can take 5+ minutes - do not give up early
Only stop polling when status is "completed" or "failed"
Usage Example:
{
"name": "firecrawl_agent_status",
"arguments": {
"id": "550e8400-e29b-41d4-a716-446655440000"
}
}Possible statuses:
processing: Agent is still researching - keep polling, do not give up
completed: Research finished - response includes the extracted data
failed: An error occurred (only stop polling on this status)
Returns: Status, progress, and results (if completed) of the agent job.
| Name | Required | Description | Default |
|---|---|---|---|
| id | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations declare readOnlyHint=true, destructiveHint=false, openWorldHint=false, which the description does not contradict. The description adds critical behavioral context: polling behavior, expected duration, and when to stop polling. It also describes return values (status, progress, results). This goes beyond annotations to fully inform the agent.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is well-structured: first sentence states the purpose, then polling guidance in bullet points, a code example, status list, and return summary. It is front-loaded with essential information and each sentence adds value. No unnecessary verbosity.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The tool has one parameter and no output schema. The description explains the statuses and that results are returned when completed. However, it does not detail the structure of the result data (e.g., fields or format). Since there is no output schema, more detail on the return format would be beneficial, but the description is still sufficient for an agent to use the tool correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The input schema has one parameter 'id' (string, required) with no description (0% coverage). The description compensates by including a usage example showing a UUID and stating it is the agent job ID. However, it does not explicitly define the parameter format or constraints beyond the example. Still, the meaning is clear enough for correct invocation.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states it checks the status of an agent job and retrieves results when complete. It distinguishes from sibling tools like firecrawl_agent (which starts the agent) and firecrawl_check_crawl_status (different job type). The verb 'Check' and resource 'status of an agent job' are specific.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicit guidance on when to use: 'after starting an agent with firecrawl_agent'. Provides specific polling intervals (15-30 seconds), patience advice (2-3 minutes minimum), and conditions to stop polling (completed or failed). Lists possible statuses with interpretations. This is exemplary usage guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
firecrawl_check_crawl_statusBRead-only
Check the status of a crawl job.
Usage Example:
{
"name": "firecrawl_check_crawl_status",
"arguments": {
"id": "550e8400-e29b-41d4-a716-446655440000"
}
}Returns: Status and progress of the crawl job, including results if available.
| Name | Required | Description | Default |
|---|---|---|---|
| id | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true and destructiveHint=false. The description adds that it returns status/progress and results, but does not discuss error handling, rate limits, or behavior for invalid IDs.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is short and front-loaded with the purpose. The usage example and return note are useful but add length. Could be slightly more concise, but overall efficient.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Missing context about how to obtain the crawl job ID, possible status values, and error scenarios. For a tool with 1 parameter and no output schema, it should explain these details for reliable agent use.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Only parameter 'id' has no description in schema (0% coverage). The description does not explain what 'id' refers to (the crawl job ID) or how to obtain it. The usage example shows a UUID but provides no context.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Clearly states 'Check the status of a crawl job' with a specific verb and resource. Distinguishes from siblings like firecrawl_crawl (starts a crawl) and firecrawl_agent_status (checks agent status).
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
No explicit when-to-use or when-not-to-use guidance. Does not mention that it should be used after starting a crawl with firecrawl_crawl or differentiate from other status tools like firecrawl_agent_status.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
firecrawl_crawlA
Starts a crawl job on a website, polls until it reaches a terminal state, and returns the final crawl status/data.
Best for: Extracting content from multiple related pages, when you need comprehensive coverage. Not recommended for: Extracting content from a single page (use scrape); when token limits are a concern (use map + scrape for tighter control); when you need fast results (crawling can be slow). Warning: Crawl responses can be very large and may exceed token limits. Limit the crawl depth and number of pages, or use map + scrape for tighter control. Common mistakes: Setting limit or maxDiscoveryDepth too high (causes token overflow) or too low (causes missing pages); using crawl for a single page (use scrape instead). Using a /* wildcard is not recommended. Prompt Example: "Get all blog posts from the first two levels of example.com/blog." Usage Example:
{
"name": "firecrawl_crawl",
"arguments": {
"url": "https://example.com/blog/*",
"maxDiscoveryDepth": 5,
"limit": 20,
"allowExternalLinks": false,
"deduplicateSimilarURLs": true,
"sitemap": "include"
}
}Returns: Final crawl status and data after internal polling, including the crawl id. Use firecrawl_check_crawl_status only when you need to re-check an existing crawl ID later.
| Name | Required | Description | Default |
|---|---|---|---|
| url | Yes | ||
| delay | No | ||
| limit | No | ||
| prompt | No | ||
| sitemap | No | ||
| webhook | No | ||
| excludePaths | No | ||
| includePaths | No | ||
| scrapeOptions | No | ||
| maxConcurrency | No | ||
| webhookHeaders | No | ||
| allowSubdomains | No | ||
| crawlEntireDomain | No | ||
| maxDiscoveryDepth | No | ||
| allowExternalLinks | No | ||
| ignoreQueryParameters | No | ||
| deduplicateSimilarURLs | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations provide readOnlyHint=false and destructiveHint=false, but description adds key behavioral context: polling until terminal state, large response warnings, token limit concerns, and relationship to check_crawl_status. However, details on failure behavior or polling mechanism are missing.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Well-structured with clear sections (Best for, Not recommended, etc.) and front-loaded main action. Slightly verbose with example and prompts, but mostly efficient. Could reduce repetition of token limit warnings.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a complex tool with 17 parameters and nested objects, the description provides high-level guidance and distinguishes from siblings, but lacks detailed parameter descriptions. No output schema; return type is vaguely described as 'final crawl status/data'. Adequate but not complete.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, and the description only mentions a few parameters in the usage example and common mistakes (limit, maxDiscoveryDepth, url). Most parameters (e.g., delay, webhook, scrapeOptions) are not explained, leaving agents to rely solely on schema names.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool starts a crawl job, polls until terminal state, and returns status/data. It specifically distinguishes from siblings like firecrawl_scrape (single page) and firecrawl_map, making the purpose unambiguous.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly lists best use cases (multiple related pages), not recommended cases (single page, token concerns, speed), and provides alternatives (scrape, map + scrape). Includes common mistakes and a prompt example, offering comprehensive guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
firecrawl_extractARead-only
Extract structured information from web pages using LLM capabilities. Supports both cloud AI and self-hosted LLM extraction.
Best for: Extracting specific structured data like prices, names, details from web pages. Not recommended for: When you need the full content of a page (use scrape); when you're not looking for specific structured data. Arguments:
urls: Array of URLs to extract information from
prompt: Custom prompt for the LLM extraction
schema: JSON schema for structured data extraction
allowExternalLinks: Allow extraction from external links
enableWebSearch: Enable web search for additional context
includeSubdomains: Include subdomains in extraction Prompt Example: "Extract the product name, price, and description from these product pages." Usage Example:
{
"name": "firecrawl_extract",
"arguments": {
"urls": ["https://example.com/page1", "https://example.com/page2"],
"prompt": "Extract product information including name, price, and description",
"schema": {
"type": "object",
"properties": {
"name": { "type": "string" },
"price": { "type": "number" },
"description": { "type": "string" }
},
"required": ["name", "price"]
},
"allowExternalLinks": false,
"enableWebSearch": false,
"includeSubdomains": false
}
}Returns: Extracted structured data as defined by your schema.
| Name | Required | Description | Default |
|---|---|---|---|
| urls | Yes | ||
| prompt | No | ||
| schema | No | ||
| enableWebSearch | No | ||
| includeSubdomains | No | ||
| allowExternalLinks | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true and openWorldHint=true, so safety profile is covered. Description adds LLM method support (cloud/self-hosted) but no additional behavioral traits like rate limits, error handling, or authorization needs.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Well-structured with clear sections: purpose, best/not recommended, argument list, prompt example, usage example, return description. No fluff; every sentence adds value.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Covers purpose, usage, all parameters with examples. Lacks details on error handling or authentication, but given annotations cover safety and output depends on user-provided schema, it is reasonably complete.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, so description must compensate. It provides argument descriptions, a prompt example, and a full usage example with schema. While terse, it adds meaning beyond bare parameter names.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Clearly states the verb (Extract), resource (structured information from web pages), and method (using LLM capabilities). Explicitly distinguishes from sibling tools like scrape and crawl with 'Not recommended for' sections.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly states when to use ('Best for: extracting specific structured data') and when not to use ('Not recommended for: full content, use scrape'). Provides clear alternatives and context.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
firecrawl_feedbackA
Send structured feedback for a completed Firecrawl v2 job. Use this for endpoint-level feedback on scrape, parse, map, or search jobs when the job result was useful, partially useful, or failed to meet expectations.
For search-result quality specifically, prefer firecrawl_search_feedback when available because it has search-focused guidance. This generic tool posts to /v2/feedback and accepts endpoint-wide signals:
endpoint — one of
search,scrape,parse, ormap.jobId — the id returned by that endpoint.
rating — overall result quality:
good,partial, orbad.issues — stable lowercase issue codes such as
missing_markdown,bad_pdf_parse, orwrong_links.tags — optional lowercase tags for grouping feedback.
note — short human-readable context. Do not include huge page contents or raw scrape results.
url, pageNumbers, and metadata — small contextual fields that identify what the feedback refers to.
Do not store multi-MB outputs in feedback. Use concise notes, issue codes, URLs, and page numbers.
Returns: { success, feedbackId, creditsRefunded, creditsRefundedToday?, dailyRefundCap?, dailyCapReached?, alreadySubmitted?, warning? } JSON.
| Name | Required | Description | Default |
|---|---|---|---|
| url | No | ||
| note | No | ||
| tags | No | ||
| jobId | Yes | ||
| issues | No | ||
| rating | Yes | ||
| endpoint | Yes | ||
| metadata | No | ||
| pageNumbers | No | ||
| missingContent | No | ||
| valuableSources | No | ||
| querySuggestions | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations (`readOnlyHint: false`, `destructiveHint: false`) indicate a write operation, and the description confirms it sends feedback. It warns against storing large outputs and describes the return format including credits refunded. Slightly more context could be given about side effects like credit deduction, but overall good.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is well-structured with a clear purpose first, then parameter explanations, and return format. It is somewhat lengthy but each sentence adds value. Could be slightly more concise by consolidating repeated guidance.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the tool has 12 parameters, nested objects, no output schema, and no schema descriptions, the description covers the purpose, usage context, all parameter meanings, return value structure, and constraints. It is fully complete for an AI agent to use correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
With 0% schema description coverage, the description fully compensates by providing detailed semantics for each parameter: endpoint enum, jobId format, rating enum, issues tags, note, url, pageNumbers, metadata, and even undocumented parameters like missingContent, valuableSources, querySuggestions. It explains constraints (e.g., 'Do not include huge page contents').
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states it is for sending structured feedback on completed Firecrawl v2 jobs, specifically for endpoint-level feedback on scrape, parse, map, or search. It distinguishes from the sibling `firecrawl_search_feedback` by noting that tool has search-focused guidance.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly tells when to use this tool vs. alternatives: 'For search-result quality specifically, prefer `firecrawl_search_feedback` when available because it has search-focused guidance.' Also specifies that it accepts endpoint-wide signals for specific endpoints.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
firecrawl_interactA
Interact with a page in a live browser session: click buttons, fill forms, extract dynamic content, or navigate deeper.
Best for: Multi-step workflows on a single page — searching a site, clicking through results, filling forms, extracting data that requires interaction. Two ways to target a page:
Pass a
urlto interact directly. The session is opened for you in one call (use this for a fresh page).Pass a
scrapeIdfrom a previous firecrawl_scrape to reuse that already-loaded page (cheaper when you just scraped it).
Arguments:
url: Page to interact with; opens a session for you (use this OR scrapeId)
scrapeId: Scrape job ID from a previous scrape, found in its metadata (use this OR url)
prompt: Natural language instruction describing the action to take (use this OR code)
code: Code to execute in the browser session (use this OR prompt)
language: "bash", "python", or "node" (optional, defaults to "node", only used with code)
timeout: Interact execution timeout in seconds, 1-300 (optional, defaults to 30)
scrapeOptions: Optional scrape controls used only with url mode, such as waitFor, maxAge, proxy, or zeroDataRetention
Usage Example (prompt, direct via url):
{
"name": "firecrawl_interact",
"arguments": {
"url": "https://example.com/products",
"prompt": "Click on the first product and tell me its price"
}
}Usage Example (code):
{
"name": "firecrawl_interact",
"arguments": {
"scrapeId": "scrape-id-from-previous-scrape",
"code": "agent-browser click @e5",
"language": "bash"
}
}Returns: Execution result including output, stdout, stderr, exit code, and live view URLs.
| Name | Required | Description | Default |
|---|---|---|---|
| url | No | ||
| code | No | ||
| prompt | No | ||
| timeout | No | ||
| language | No | ||
| scrapeId | No | ||
| scrapeOptions | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description mentions opening a live session, reuse option, and return types (output, stdout, stderr, exit code, live view URLs). Annotations indicate readOnlyHint=false and openWorldHint=true, and the description aligns with this. It adds context about cost savings when reusing scrapeId. However, it does not disclose session lifecycle or cleanup details.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is organized with clear sections and bullet-like arguments, making it easy to scan. It is somewhat lengthy but every sentence adds value. The front-loading of purpose and best-for is effective. Examples are useful.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the complexity (7 params, nested scrapeOptions, no output schema), the description covers core functionality well but omits details on error handling, session persistence, and the exact structure of the return object beyond a brief mention. The sibling tool 'firecrawl_interact_stop' suggests a stop capability not referenced here.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
With 0% schema description coverage, the description compensates well by explaining each parameter's purpose and constraints (e.g., url vs scrapeId mutual exclusivity, prompt vs code alternatives, timeout range, language defaults). It also gives examples. However, scrapeOptions is only partially described with examples, not fully covering all nested properties.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states it interacts with a page in a live browser session using verbs like click, fill, extract. It distinguishes from siblings by specifically mentioning reuse of scrapeId from previous scrape, which is a key differentiator from tools like firecrawl_scrape.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description explicitly labels 'Best for: Multi-step workflows' and explains two targeting methods (url vs scrapeId). However, it does not explicitly contrast with similar sibling tools like firecrawl_agent or firecrawl_scrape, leaving some ambiguity for the agent to infer.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
firecrawl_interact_stopADestructive
Stop an interact session for a scraped page. Call this when you are done interacting to free resources.
Usage Example:
{
"name": "firecrawl_interact_stop",
"arguments": {
"scrapeId": "scrape-id-here"
}
}Returns: Success confirmation.
| Name | Required | Description | Default |
|---|---|---|---|
| scrapeId | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations include destructiveHint: true, and the description mentions 'free resources', which aligns. However, description adds minimal extra detail beyond the annotation hint.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Very concise, includes a usage example and return info. No unnecessary words.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Adequate for a simple stop tool, but no output schema and minimal return info (just 'Success confirmation'). Could mention error cases.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The parameter 'scrapeId' is not explained beyond its name, and schema description coverage is 0%. The description lacks any additional context about the parameter's purpose or format.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the verb 'stop' and the resource 'interact session', and it distinguishes from sibling tools like firecrawl_interact which starts a session.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Provides explicit when-to-use advice ('Call this when you are done interacting to free resources'), but does not elaborate on scenarios where it should not be used or mention alternatives.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
firecrawl_mapARead-only
Map a website to discover all indexed URLs on the site.
Best for: Discovering URLs on a website before deciding what to scrape; finding specific sections or pages within a large site; locating the correct page when scrape returns empty or incomplete results. Not recommended for: When you already know which specific URL you need (use scrape); when you need the content of the pages (use scrape after mapping). Common mistakes: Using crawl to discover URLs instead of map; jumping straight to firecrawl_agent when scrape fails instead of using map first to find the right page.
IMPORTANT - Use map before agent: If firecrawl_scrape returns empty, minimal, or irrelevant content, use firecrawl_map with the search parameter to find the specific page URL containing your target content. This is faster and cheaper than using firecrawl_agent. Only use the agent as a last resort after map+scrape fails.
Prompt Example: "Find the webhook documentation page on this API docs site." Usage Example (discover all URLs):
{
"name": "firecrawl_map",
"arguments": {
"url": "https://example.com"
}
}Usage Example (search for specific content - RECOMMENDED when scrape fails):
{
"name": "firecrawl_map",
"arguments": {
"url": "https://docs.example.com/api",
"search": "webhook events"
}
}Returns: Array of URLs found on the site, filtered by search query if provided.
| Name | Required | Description | Default |
|---|---|---|---|
| url | Yes | ||
| limit | No | ||
| search | No | ||
| sitemap | No | ||
| includeSubdomains | No | ||
| ignoreQueryParameters | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already indicate readOnlyHint=true. Description further clarifies the tool discovers URLs, uses the 'search' parameter for filtering, and returns an array of URLs. No contradictions.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Well-structured with clear sections, examples, and formatting. At moderate length, every section adds value. Minor redundancy in 'IMPORTANT' section could be condensed.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
No output schema, but description states returns 'Array of URLs'. Covers key usage scenarios and examples. However, missing parameter details slightly reduces completeness for a 6-parameter tool.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 0%, so description must compensate. It explains the 'url' and 'search' parameters via examples and description, but does not detail 'limit', 'sitemap', 'includeSubdomains', or 'ignoreQueryParameters', leaving gaps.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool maps a website to discover URLs, and distinguishes it from siblings like scrape, crawl, and agent through explicit comparisons and usage guidance.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Provides explicit 'Best for', 'Not recommended for', 'Common mistakes' sections, and specific workflow guidance to use map before agent when scrape fails.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
firecrawl_monitor_checkARead-only
Get a single check with page-level diff results. Filter pageStatus to surface only the pages that changed (or were new, removed, etc.).
Each entry in data.pages[] has url, status (same | new | changed | removed | error), optional judgment when goal-based judging ran, and — when changed — a diff and possibly a snapshot. The shape of diff depends on the monitor's formats configuration:
Markdown mode (default).
diff.textis the unified markdown diff;diff.jsonis a parse-diff AST ({ files: [...] }). Nosnapshot.JSON mode (
changeTrackingwithmodes: ["json"]).diff.jsonis a per-field map keyed by JSON path into the extraction, e.g.plans[0].price, with each value being{ previous, current }.snapshot.jsonis the full current extraction. Nodiff.text.Mixed mode (
modes: ["json", "git-diff"]). Bothdiff.text(markdown sidecar) ANDdiff.json(per-field map) are present, plussnapshot.json.
Example JSON-mode response pages[] entry:
{
"url": "https://example.com/pricing",
"status": "changed",
"diff": {
"json": {
"plans[0].price": { "previous": "$19/mo", "current": "$24/mo" },
"plans[1].features[2]": { "previous": "10 GB storage", "current": "25 GB storage" }
}
},
"snapshot": { "json": { "plans": [/* current full extraction matching the monitor's schema */] } },
"judgment": {
"meaningful": true,
"confidence": "high",
"reason": "The pricing changed, which matches the monitor goal.",
"meaningfulChanges": [
{
"type": "changed",
"before": "$19/mo",
"after": "$24/mo",
"reason": "The tracked plan price changed."
}
]
}
}When summarizing a check for the user, prefer diff.json paths (e.g. "plans[0].price changed from $19/mo to $24/mo") over re-printing the markdown diff — it's more concise and grounded in the schema fields they asked for.
When judgment is present, use it to decide what to surface. judgment.meaningful: false means the change was classified as noise for the monitor's goal. When judgment.meaningfulChanges is present, prefer those goal-relevant changes over raw diff hunks; each item includes type, before, after, and reason.
The endpoint paginates via a top-level next URL; this tool returns one page at a time. Increase limit (max 100) to fetch fewer pages.
Usage Example:
{
"name": "firecrawl_monitor_check",
"arguments": {
"id": "mon_abc123",
"checkId": "chk_xyz",
"pageStatus": "changed"
}
}| Name | Required | Description | Default |
|---|---|---|---|
| id | Yes | ||
| skip | No | ||
| limit | No | ||
| checkId | Yes | ||
| pageStatus | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already state readOnlyHint=true and destructiveHint=false. Description adds extensive behavioral details: pagination via next URL, limit max 100, response shape for different formats, and when judgment is present. No contradictions.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Description is long but well-structured with subheadings and a usage example. Front-loaded with purpose. Slightly verbose but earns its length through detail.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
No output schema exists, so description fully explains return values with rich examples for markdown, JSON, and mixed modes. Covers pagination, filter, and judgment. Complete for a single check retrieval tool.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema has 0% description coverage, so description carries full burden. It explains pageStatus enum values, limit's role in pagination, and implies id/checkId as identifiers. 'skip' is not explained but compensated by pagination guidance.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Description opens with 'Get a single check with page-level diff results,' clearly stating the verb and resource. It distinguishes from siblings like firecrawl_monitor_checks (which lists checks) by specifying depth and diff details.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Provides explicit filter guidance ('Filter pageStatus to surface only pages that changed'), example usage, and pagination advice. Does not explicitly contrast with all alternatives but context implies single vs list difference.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
firecrawl_monitor_checksARead-only
List historical checks for a monitor.
Usage Example:
{ "name": "firecrawl_monitor_checks", "arguments": { "id": "mon_abc123", "limit": 10, "status": "completed" } }| Name | Required | Description | Default |
|---|---|---|---|
| id | Yes | ||
| limit | No | ||
| offset | No | ||
| status | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already indicate readOnlyHint=true and destructiveHint=false. The description adds 'historical checks,' implying non-real-time data but does not disclose pagination behavior, error handling, or rate limits. It adds minimal behavioral context beyond the annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is concise with a single sentence and a usage example. It is front-loaded and efficient, though the example could be formatted as a bullet list for clarity. No redundant information.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The description covers the basic purpose but lacks details on ordering, offset/limit behavior, and the meaning of 'historical checks.' With no output schema and 4 parameters, it is adequate but not fully informative for an agent to use confidently.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, so the description must compensate. However, it only provides a usage example showing id, limit, and status, without explaining offset or parameter meanings. The schema provides enum values and constraints, but the description adds no new semantic value.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states 'List historical checks for a monitor,' specifying the verb 'list' and the resource 'checks' in the context of a monitor. This distinguishes it from siblings like firecrawl_monitor_check (single check) and firecrawl_monitor_list (list monitors).
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description does not explicitly state when to use this tool versus alternatives like firecrawl_monitor_check or firecrawl_monitor_list. The usage example implies typical parameters but no guidance on context or exclusions.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
firecrawl_monitor_createA
Create a Firecrawl monitor — a recurring scrape, crawl, or search that diffs each result against the last retained snapshot.
Prefer the simple path: pass page or pages plus goal to monitor specific URLs, OR pass queries plus goal to monitor web search results for new/changed hits. The tool will create the monitor with a 30-minute schedule and meaningful-change judging enabled by the API. Use body only for advanced requests such as crawl targets, JSON change tracking, custom retention, or manual judgeEnabled control.
Meaningful-change judge: set goal to a plain-language description of what the user actually cares about. judgeEnabled defaults to true when goal is set, so providing goal is enough. Page webhooks expose isMeaningful and judgment on monitor.page events.
Simple fields:
page: one page URL to monitor.pages: multiple page URLs to monitor.queries: one or more search queries (1-12) to monitor instead of fixed URLs. Each check runs the searches and diffs the result set, so you get alerted when new or changed results appear. Mutually exclusive withpage/pagesin the simple path.searchWindow: optional recency window for search targets — one of5m,15m,1h,6h,24h,7d(default24h).maxResults: optional max results per search, 1-50 (default 10).includeDomains/excludeDomains: optional domain allow/deny lists for search targets.goal: plain-English instruction for what changes matter. Required for the simple path (and always required whenqueriesare set — web monitors must have a goal).scheduleText: optional natural-language schedule, defaultevery 30 minutes.email: optional email recipient for summaries.webhookUrl: optional webhook URL. Configuresmonitor.pageandmonitor.check.completed.
Search-mode example:
{
"name": "firecrawl_monitor_create",
"arguments": {
"queries": ["new LLM release", "frontier model launch"],
"goal": "Notify me about major new LLM model releases.",
"searchWindow": "24h",
"maxResults": 10
}
}Goal guidance:
Expand the user's one-line monitoring intent into a concise 2-3 sentence monitor goal.
State what should trigger an alert, restate any scope the user gave, and include intent-specific exclusions only when obvious from the user's request.
Generic noise such as whitespace, formatting-only changes, request IDs, tracking params, generic metadata, and unrelated page chrome is already handled by the judge; do not repeat it in every goal.
If the user is vague, keep the goal broad rather than guessing exclusions. If the user asks for broad monitoring or "any change", preserve that and do not add exclusions that hide changes.
If the user says they do not care about something, include that explicitly. It is okay to ask whether they want to ignore specific noise when it is likely to matter.
Do not invent page-specific sections, thresholds, entities, or business rules unless the user mentioned them.
Query guidance (web monitors): queries control recall (what search retrieves) and goal controls precision (which results alert) — tune both.
Write keywords, not sentences:
OpenAI new model release, nottell me when OpenAI releases a new model.Quote multi-word entities (
"Llama 4"); group synonyms withOR(launch OR release OR announcement).Keep each query tight (~2-6 terms). One broad query usually beats several narrow ones — extra queries split the
maxResultsbudget. Use one query per distinct entity; do not emit one per facet of a single subject.Keep
site:operators out of queries — useincludeDomains/excludeDomains.A healthy web monitor mostly returns
new: 0and alerts only on genuinely new, on-goal results. Manyignoredresults ⇒ queries too broad (tighten them); nothing for long stretches ⇒ queries too narrow or window too tight (broaden); dismissed alerts ⇒ goal too broad (add an intent-specific Ignore). Aim for high precision with enough recall.
Full body requests require: name, schedule (with cron or text), and targets (one or more { type: 'scrape', urls: [...] }, { type: 'crawl', url: '...' }, or { type: 'search', queries: [...], searchWindow?, maxResults?, includeDomains?, excludeDomains? }). Optional: goal (required when any search target is present), judgeEnabled, webhook, notification, retentionDays.
Markdown-mode (default): Each check produces a unified text diff of the page's markdown. No extra configuration needed.
{
"name": "firecrawl_monitor_create",
"arguments": {
"page": "https://example.com/blog",
"goal": "Alert when a new blog post is published or an existing headline changes.",
"email": "alerts@example.com"
}
}Multiple pages:
{
"name": "firecrawl_monitor_create",
"arguments": {
"pages": ["https://example.com/pricing", "https://example.com/changelog"],
"goal": "Alert when pricing, packaging, or launch messaging changes.",
"webhookUrl": "https://example.com/webhooks/firecrawl"
}
}JSON-mode change tracking: To detect changes in specific structured fields (price, headline, in-stock flag, list items) instead of the whole page, add a changeTracking format with modes: ["json"] and a JSON schema to the target's scrapeOptions.formats. The check response will then carry a per-field diff (keyed by JSON path, e.g. plans[0].price) and a snapshot.json with the full current extraction. See firecrawl_monitor_check for the response shape.
{
"name": "firecrawl_monitor_create",
"arguments": {
"body": {
"name": "Pricing watch",
"schedule": { "text": "hourly", "timezone": "UTC" },
"goal": "Alert when a pricing tier, price, billing period, limit, or headline feature changes. Ignore unrelated marketing copy unless it changes the pricing offer.",
"targets": [{
"type": "scrape",
"urls": ["https://example.com/pricing"],
"scrapeOptions": {
"formats": [{
"type": "changeTracking",
"modes": ["json"],
"prompt": "Extract pricing tiers and headline features for each plan.",
"schema": {
"type": "object",
"properties": {
"plans": {
"type": "array",
"items": {
"type": "object",
"properties": {
"name": { "type": "string" },
"price": { "type": "string" },
"features": { "type": "array", "items": { "type": "string" } }
}
}
}
}
}
}]
}
}]
}
}
}Mixed mode (JSON + git-diff): Use modes: ["json", "git-diff"] to get both per-field diffs and a markdown sidecar. The page is marked changed whenever either surface changed.
| Name | Required | Description | Default |
|---|---|---|---|
| body | No | ||
| goal | No | ||
| name | No | ||
| page | No | ||
| No | |||
| pages | No | ||
| queries | No | ||
| timezone | No | ||
| maxResults | No | ||
| webhookUrl | No | ||
| includeDiffs | No | ||
| scheduleText | No | ||
| searchWindow | No | ||
| excludeDomains | No | ||
| includeDomains | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Discloses that the tool creates a monitor with a 30-minute schedule, meaningful-change judging, and diff-based detection. Describes webhook events and snapshot behavior. Annotations already indicate non-read-only and non-destructive, and the description adds specific behavioral details without contradiction.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is lengthy but well-structured with sections, headings, and multiple examples. Every sentence adds value, though it could be slightly trimmed for brevity without losing clarity. Given the tool's complexity, the length is acceptable.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Despite no output schema, the description covers all key aspects: creation, scheduling, diffing, webhook events, goal tuning, and advanced body requests. It provides comprehensive guidance for both simple and complex use cases, making the tool fully understandable.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, but the description extensively explains parameters like page, pages, queries, goal, searchWindow, maxResults, includeDomains, excludeDomains, scheduleText, email, webhookUrl, and body. However, some parameters like timezone and includeDiffs are only briefly mentioned, leaving minor gaps.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states it creates a Firecrawl monitor for recurring scrape, crawl, or search with diffs. It distinguishes from sibling tools like firecrawl_monitor_list, firecrawl_monitor_delete, etc., by focusing on creation and setup.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Provides explicit guidance on when to use simple path (page/pages + goal or queries + goal) vs body for advanced requests. Includes examples and caveats (e.g., mutually exclusive fields). Clearly differentiates from other monitor tools.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
firecrawl_monitor_deleteADestructive
Permanently delete a monitor and stop its schedule. This cannot be undone.
Usage Example:
{ "name": "firecrawl_monitor_delete", "arguments": { "id": "mon_abc123" } }| Name | Required | Description | Default |
|---|---|---|---|
| id | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already set destructiveHint=true, so the description reinforces permanence and adds 'stop its schedule' context. No contradictions. However, it does not disclose what happens to related data (e.g., checks).
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two sentences plus a usage example. No redundant text; every sentence adds value. Front-loaded with the purpose and permanence.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the tool's simplicity (one required parameter, no output schema) and annotations covering destructiveness, the description is complete. It explains the action, permanence, and provides an example.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema has one parameter 'id' with no description (0% coverage). Description only shows it in an example without explaining its format or how to obtain it. Does not add meaningful semantics beyond the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Description clearly states 'permanently delete a monitor and stop its schedule', specifying the verb (delete) and resource (monitor). It distinguishes from sibling tools like create, update, get, and list.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Description includes a warning that deletion cannot be undone, but provides no guidance on when to use this tool versus alternatives (e.g., update to disable, or list to find monitors). No explicit when/when-not or alternative tool names.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
firecrawl_monitor_getARead-only
Get a single monitor by ID.
Usage Example:
{ "name": "firecrawl_monitor_get", "arguments": { "id": "mon_abc123" } }| Name | Required | Description | Default |
|---|---|---|---|
| id | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description aligns with annotations (readOnlyHint: true, destructiveHint: false) but adds no additional behavioral details such as rate limits, authorization, or return format.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is concise: one sentence plus a usage example. No wasted words, well-structured for quick parsing.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple get operation with one parameter, the description is adequate but lacks return value details (e.g., what fields the monitor contains). No output schema increases the need for such information.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
With 0% schema description coverage, the description only says 'by ID' and provides an example value. It does not explain what the ID represents or constraints beyond being a string.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description 'Get a single monitor by ID' clearly states the verb (Get), resource (monitor), and method (by ID), distinguishing it from sibling tools like list, create, delete.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description includes a usage example showing the required 'id' parameter, implying use when you have a specific monitor ID. However, it doesn't explicitly state when not to use or mention alternatives.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
firecrawl_monitor_listCRead-only
List all Firecrawl monitors for the authenticated account.
Usage Example:
{ "name": "firecrawl_monitor_list", "arguments": { "limit": 20 } }| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | ||
| offset | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true and destructiveHint=false, so the safety profile is clear. The description confirms a read operation but adds no additional behavioral context (e.g., pagination, data freshness). No contradiction with annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is very short (one line plus example) and to the point, but the example is valuable. Could be more efficient if parameter details were in the schema.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a list tool with two optional parameters and no output schema, the description is incomplete. It omits pagination details, default ordering, and what the response contains. The usage example partially compensates but isn't sufficient.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 0%, and the description does not explain the 'limit' and 'offset' parameters beyond the example. The agent gains no understanding of their meaning or constraints from the description.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the action ('list') and resource ('monitors'), and implies scope ('all'). It differentiates from sibling tools like firecrawl_monitor_get by implying a list operation, but does not explicitly distinguish from similar verbs (e.g., firecrawl_monitor_check).
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides a usage example but no guidance on when to use this tool versus alternatives such as firecrawl_monitor_get or firecrawl_monitor_create. There is no mention of prerequisites or context.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
firecrawl_monitor_runB
Trigger a monitor check immediately, outside its normal schedule. Returns the queued check.
Usage Example:
{ "name": "firecrawl_monitor_run", "arguments": { "id": "mon_abc123" } }| Name | Required | Description | Default |
|---|---|---|---|
| id | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations indicate non-readOnly (mutation) and non-destructive. The description adds that it returns the queued check. However, there is no mention of permissions, rate limits, or other side effects beyond the normal schedule alteration.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is two succinct sentences plus a JSON usage example. Every element serves a purpose, and the key information is front-loaded.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
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 covers the purpose and return. However, missing parameter explanation and lack of error/disclaimer info leave it slightly incomplete.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The single required parameter 'id' has no description in the schema (0% coverage). The description does not explain its meaning; only the usage example shows a hypothetical value ('mon_abc123'). This leaves semantic ambiguity.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool triggers a monitor check immediately outside its normal schedule. It uses specific verb and resource ('firecrawl_monitor_run'), but does not explicitly differentiate from sibling tools like firecrawl_monitor_check.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description implies usage for forcing an immediate check, but provides no when-not-to-use guidance or alternatives. Context from sibling names might suggest firecrawl_monitor_check for checking status, but this is not explicit.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
firecrawl_monitor_updateADestructive
Update a monitor. Pass any subset of fields to patch: name, status ("active" | "paused"), schedule, targets, goal, judgeEnabled, webhook, notification, retentionDays.
Usage Example:
{
"name": "firecrawl_monitor_update",
"arguments": {
"id": "mon_abc123",
"body": { "status": "paused" }
}
}| Name | Required | Description | Default |
|---|---|---|---|
| id | Yes | ||
| body | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already mark the tool as destructive (mutating). The description adds context by listing the specific fields that can be patched and noting the partial update behavior. No contradiction with annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is concise: two sentences plus a code block. Every sentence adds value. The usage example is appropriately placed and helpful.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple update tool with 2 parameters and no output schema, the description is fairly complete. It explains the body parameter well and gives an example. However, it could mention that the monitor ID must exist and what the response looks like (though no output schema is defined).
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 0%, so the description carries the full burden. It explicitly lists the allowed fields for the `body` parameter (name, status, schedule, etc.) and provides a usage example showing how to pass id and body. This adds essential meaning beyond the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states 'Update a monitor' with a specific verb and resource. It distinguishes from sibling tools like create, delete, get, and list by being the update operation. The list of patchable fields further clarifies scope.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description implies usage when modifying an existing monitor. The usage example provides concrete guidance. However, it does not explicitly state when not to use it (e.g., for creating or deleting) or mention prerequisites like needing the monitor ID to be valid.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
firecrawl_parseARead-only
Parse a file using Firecrawl's /v2/parse endpoint.
In local/non-cloud MCP mode, this tool reads filePath from the MCP server filesystem and posts multipart data to the configured self-hosted FIRECRAWL_API_URL, preserving the existing direct-read behavior.
In hosted CLOUD_SERVICE mode, this tool is a two-call flow because hosted MCP cannot read your local filesystem:
Call with filePath, contentType, parse options, and optional declaredSizeBytes. The hosted server mints a short-lived upload URL and returns a safe local curl PUT command plus nextToolCall.
Run the returned curl command locally, then call firecrawl_parse again with uploadRef and the desired parse options. The hosted server calls /v2/parse server-side with your session credential.
Best for: Extracting content from a local document (PDF, Word, Excel, HTML, etc.); pulling structured data out of a file with JSON format; converting binary documents into markdown for downstream reasoning. Not recommended for: Remote URLs (use firecrawl_scrape); multiple files at once (call parse multiple times); documents that require interactive actions, screenshots, or change tracking — those aren't supported by the parse endpoint. Common mistakes: In hosted mode, do not pass both filePath and uploadRef. Phase 1 uses filePath only to generate upload instructions; phase 2 uses uploadRef only to parse server-side.
Supported file types: .html, .htm, .xhtml, .pdf, .docx, .doc, .odt, .rtf, .xlsx, .xls
Unsupported options: actions, screenshot/branding/changeTracking formats, waitFor > 0, location, mobile, proxy values other than "auto" or "basic".
Privacy: Set redactPII: true to return content with personally identifiable information redacted.
CRITICAL - Format Selection (same rules as firecrawl_scrape): When the user asks for SPECIFIC data points from a document, you MUST use JSON format with a schema. Only use markdown when the user needs the ENTIRE document content.
Handling PDFs:
Add "parsers": ["pdf"] (optionally with pdfOptions.maxPages) when parsing a PDF so the PDF engine is invoked explicitly. For very long documents, cap maxPages to keep the response within token limits.
Hosted phase 1 example:
{
"name": "firecrawl_parse",
"arguments": {
"filePath": "/absolute/path/to/document.pdf",
"contentType": "application/pdf",
"formats": ["markdown"],
"parsers": ["pdf"],
"zeroDataRetention": true
}
}Hosted phase 2 example:
{
"name": "firecrawl_parse",
"arguments": {
"uploadRef": "upload-ref-from-phase-1",
"formats": ["markdown"],
"parsers": ["pdf"],
"zeroDataRetention": true
}
}Returns: Phase 1 hosted upload instructions or a parsed document with markdown, html, links, summary, json, or query results depending on the requested formats.
| Name | Required | Description | Default |
|---|---|---|---|
| proxy | No | ||
| maxAge | No | ||
| formats | No | ||
| parsers | No | ||
| filePath | Yes | ||
| redactPII | No | ||
| pdfOptions | No | ||
| contentType | No | ||
| excludeTags | No | ||
| includeTags | No | ||
| jsonOptions | No | ||
| queryOptions | No | ||
| storeInCache | No | ||
| onlyMainContent | No | ||
| zeroDataRetention | No | ||
| removeBase64Images | No | ||
| skipTlsVerification | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description explains the two operating modes (local vs. hosted), the two-call flow in hosted mode, privacy via redactPII, and unsupported options. Annotations already indicate readOnlyHint=true, and the description adds significant behavioral context without contradiction.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is long but well-structured with sections for modes, best use, common mistakes, supported types, and examples. It is front-loaded with the main purpose, and each section provides relevant information without unnecessary repetition. Could be slightly more concise but is effectively organized.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the tool's complexity (17 parameters, no output schema, two modes), the description is remarkably complete. It covers usage guidelines, edge cases (hosted mode), common mistakes, supported file types, privacy, and provides detailed examples. The only gap is some less common parameters are not explained, but the core functionality is fully addressed.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Although schema description coverage is 0%, the description adds semantic meaning for many key parameters (filePath, contentType, formats, parsers, redactPII, pdfOptions, jsonOptions, queryOptions) and explains their roles in context. Some parameters (proxy, maxAge, excludeTags, etc.) are not covered, but the most critical ones are well-described.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states it parses a file using Firecrawl's /v2/parse endpoint and distinguishes it from sibling tools like firecrawl_scrape (for remote URLs). It specifies the tool is for local documents and structured data extraction, making its purpose unambiguous.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description explicitly provides when to use (local documents) and when not to (remote URLs, multiple files, interactive actions), including alternatives (firecrawl_scrape for URLs). It also covers common mistakes (e.g., mixing filePath and uploadRef) and provides usage examples for both local and hosted modes.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
firecrawl_research_inspect_paperARead-only
Fetch canonical metadata for one paper by primaryId or canonical paperId. Use this after search/related results when you need the full title, abstract, authors, categories, source ids, and dates rendered as markdown.
| Name | Required | Description | Default |
|---|---|---|---|
| paperId | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, destructiveHint=false, and openWorldHint=true, so the description's safety profile is established. The description adds value by specifying the output is rendered as markdown and listing the fields included (title, abstract, authors, etc.) – beyond what annotations provide. No contradiction.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two sentences, no wasted words. The first sentence states the core function, and the second provides usage guidance. Front-loaded and efficient.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the tool's low complexity (1 parameter, no output schema, no nested objects), the description is complete. It specifies the input, the use case, and the output format (markdown with listed fields). Siblings like read_paper exist, so the description correctly positions inspect_paper as a metadata-fetching step.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
With 0% schema description coverage, the description bears full burden. It clarifies the paperId parameter can be a primaryId or canonical paperId, which adds meaning beyond the basic string validation. It also describes what the output contains, effectively compensating for the lack of schema documentation.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool fetches canonical metadata for a paper by primaryId or paperId, distinguishing it from siblings like firecrawl_research_read_paper (likely full content) and firecrawl_research_related_papers. The verb 'fetch' and resource 'paper metadata' is specific.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides explicit usage context: 'Use this after search/related results when you need the full title, abstract, authors, categories, source ids, and dates rendered as markdown.' It tells the agent when to use the tool and what to expect, but does not mention when not to use it or list alternatives beyond the implied search/related context.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
firecrawl_research_read_paperARead-only
Read the most relevant in-body (full-text) passages of ONE specific paper for a question. Use this to VERIFY whether a candidate actually satisfies a constraint before you include or reject it (e.g. 'does this paper actually use technique X / report a score on benchmark Y'). Returns the best-matching passages, or a notice if the paper's full text is unavailable.
| Name | Required | Description | Default |
|---|---|---|---|
| k | No | ||
| paperId | Yes | ||
| question | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already indicate readOnlyHint=true and destructiveHint=false. The description adds context: it reads in-body passages, returns best-matching passages, and handles unavailability. This complements the annotations without contradiction.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is two sentences long, with the action front-loaded. Every sentence adds value: the first states the core function, the second provides purpose and expected outcomes. No redundant or vague phrasing.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The tool has three parameters, no output schema, and no enums. The description covers main behavior and one parameter (question) but omits details on 'k' and output format. With no output schema, it should at least describe the structure of returned passages. It is adequate but not fully complete.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, so the description must compensate. It explains 'question' as a relevance driver but does not define 'paperId' or 'k.' The meaning of 'k' as the number of passages is missing, leaving ambiguity. This is a significant gap for a three-parameter tool.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the verb 'Read' and the resource 'most relevant in-body passages of ONE specific paper for a question.' It also specifies the use case: verifying whether a candidate satisfies a constraint. This distinguishes it from sibling tools like 'firecrawl_research_search_papers' that search multiple papers.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description explicitly says 'Use this to VERIFY whether a candidate actually satisfies a constraint before you include or reject it,' providing a clear when-to-use directive. It does not explicitly mention when not to use or compare with alternatives like 'firecrawl_research_inspect_paper,' but the positive guidance is strong and sufficient.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
firecrawl_research_search_githubARead-only
Search GitHub issue/PR history and repository readmes. Returns ranked matches with repo, url, a short snippet, and (when available) the full matched content in markdown.
| Name | Required | Description | Default |
|---|---|---|---|
| k | No | ||
| query | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, destructiveHint=false, and openWorldHint=true. The description adds value by detailing the return format: 'ranked matches with repo, url, a short snippet, and (when available) the full matched content in markdown.' This goes beyond annotations and helps the agent understand what to expect.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two concise sentences with clear front-loading of purpose. Every word adds value; no fluff.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema and 0% parameter coverage, the description provides minimal but functional context: it states the search scope and return fields. However, it omits parameter details and edge cases (e.g., rate limits, authentication). Adequate for a simple tool but could be more complete.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema has 2 parameters with 0% description coverage. The description only implicitly covers 'query' by stating what is searched. The 'k' parameter (number of results) is not mentioned, leaving the agent without semantic guidance for that parameter.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool searches 'GitHub issue/PR history and repository readmes,' specifying both the resource and action. This distinguishes it from sibling tools like firecrawl_search (general web search) and firecrawl_research_search_papers (academic papers).
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
No guidance is provided on when to use this tool versus alternatives (e.g., firecrawl_search), nor any conditions for use or exclusions. The agent must infer usage from the name and description alone.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
firecrawl_research_search_papersARead-only
Primary entry point for finding research papers by topic across AI/ML, computer science, math, physics, biomedical, life sciences, and clinical literature. Semantic (HyDE) search over indexed paper metadata and abstracts; returns ranked papers with paper id, title, authors, and abstract. The query should be a natural-language research topic or question. Run SEVERAL distinct framings of the question (sibling domains, rival methods, dataset or benchmark names, conditions, populations, interventions, or outcomes) rather than one query — recall improves markedly with diverse framings.
| Name | Required | Description | Default |
|---|---|---|---|
| k | No | ||
| to | No | ||
| from | No | ||
| query | Yes | ||
| authors | No | ||
| categories | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description complements the annotations (readOnlyHint, openWorldHint) by explaining the semantic search behavior and the benefit of diverse query framings. It does not contradict annotations. While rate limits or other behaviors are not mentioned, the description adds useful context beyond the structured fields.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is very concise at two sentences. The first sentence immediately conveys the purpose and scope, and the second provides actionable usage advice. Every sentence adds value with no wasted words.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
While the description explains the core functionality, it lacks detail on parameters other than 'query' and does not describe the output schema (which is absent). For a tool with 6 parameters and no schema descriptions, more information about filtering (by date, authors, categories) would improve completeness.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The input schema has 0% description coverage, meaning no parameter descriptions are provided. The tool description only explains the 'query' parameter (natural-language topic) but does not clarify the purpose of `k`, `to`, `from`, `authors`, or `categories`. This leaves the agent guessing about the other five parameters.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool's purpose as the primary entry point for finding research papers by topic across multiple fields. It specifies the search method (semantic HyDE search), the return fields (paper id, title, authors, abstract), and the query type (natural-language). This distinguishes it from sibling tools like general web search (firecrawl_search) and other research tools.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description explicitly advises when to use this tool (for research paper search) and provides concrete guidance to run several distinct framings of the question for better recall. It does not explicitly state when not to use it, but the context implies it is for paper discovery, not other types of searches.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
firecrawl_scrapeA
Scrape content from a single URL with advanced options. This is the most powerful, fastest and most reliable scraper tool, if available you should always default to using this tool for any web scraping needs.
Best for: Single page content extraction, when you know exactly which page contains the information. Not recommended for: Multiple pages (call scrape multiple times or use crawl), unknown page location (use search). Common mistakes: Using markdown format when extracting specific data points (use JSON instead). Other Features: Use 'branding' format to extract brand identity (colors, fonts, typography, spacing, UI components) for design analysis or style replication.
CRITICAL - Format Selection (you MUST follow this): When the user asks for SPECIFIC data points, you MUST use JSON format with a schema. Only use markdown when the user needs the ENTIRE page content.
Use JSON format when user asks for:
Parameters, fields, or specifications (e.g., "get the header parameters", "what are the required fields")
Prices, numbers, or structured data (e.g., "extract the pricing", "get the product details")
API details, endpoints, or technical specs (e.g., "find the authentication endpoint")
Lists of items or properties (e.g., "list the features", "get all the options")
Any specific piece of information from a page
Use markdown format ONLY when:
User wants to read/summarize an entire article or blog post
User needs to see all content on a page without specific extraction
User explicitly asks for the full page content
Handling JavaScript-rendered pages (SPAs): If JSON extraction returns empty, minimal, or just navigation content, the page is likely JavaScript-rendered or the content is on a different URL. Try these steps IN ORDER:
Add waitFor parameter: Set
waitFor: 5000towaitFor: 10000to allow JavaScript to render before extractionTry a different URL: If the URL has a hash fragment (#section), try the base URL or look for a direct page URL
Use firecrawl_map to find the correct page: Large documentation sites or SPAs often spread content across multiple URLs. Use
firecrawl_mapwith asearchparameter to discover the specific page containing your target content, then scrape that URL directly. Example: If scraping "https://docs.example.com/reference" fails to find webhook parameters, usefirecrawl_mapwith{"url": "https://docs.example.com/reference", "search": "webhook"}to find URLs like "/reference/webhook-events", then scrape that specific page.Use firecrawl_agent: As a last resort for heavily dynamic pages where map+scrape still fails, use the agent which can autonomously navigate and research
Usage Example (JSON format - REQUIRED for specific data extraction):
{
"name": "firecrawl_scrape",
"arguments": {
"url": "https://example.com/api-docs",
"formats": ["json"],
"jsonOptions": {
"prompt": "Extract the header parameters for the authentication endpoint",
"schema": {
"type": "object",
"properties": {
"parameters": {
"type": "array",
"items": {
"type": "object",
"properties": {
"name": { "type": "string" },
"type": { "type": "string" },
"required": { "type": "boolean" },
"description": { "type": "string" }
}
}
}
}
}
}
}
}Prefer markdown format by default. You can read and reason over the full page content directly — no need for an intermediate query step. Use markdown for questions about page content, factual lookups, and any task where you need to understand the page.
Use JSON format when user needs:
Structured data with specific fields (extract all products with name, price, description)
Data in a specific schema for downstream processing
Use query format only when:
The page is extremely long and you need a single targeted answer without processing the full content
You want a quick factual answer and don't need to retain the page content
Set
queryOptions.modeto"directQuote"when you need verbatim page text; otherwise it defaults to"freeform"
Usage Example (markdown format - default for most tasks):
{
"name": "firecrawl_scrape",
"arguments": {
"url": "https://example.com/article",
"formats": ["markdown"],
"onlyMainContent": true
}
}Usage Example (branding format - extract brand identity):
{
"name": "firecrawl_scrape",
"arguments": {
"url": "https://example.com",
"formats": ["branding"]
}
}Branding format: Extracts comprehensive brand identity (colors, fonts, typography, spacing, logo, UI components) for design analysis or style replication.
Performance: Add maxAge parameter for 500% faster scrapes using cached data.
Lockdown mode: Set lockdown: true to serve the request only from the existing index/cache without any outbound network request. For air-gapped or compliance-constrained use where the request URL itself is considered sensitive. Errors on cache miss. Billed at 5 credits.
Privacy: Set redactPII: true to return content with personally identifiable information redacted.
Returns: JSON structured data, markdown, branding profile, or other formats as specified.
| Name | Required | Description | Default |
|---|---|---|---|
| url | Yes | ||
| proxy | No | ||
| maxAge | No | ||
| mobile | No | ||
| actions | No | ||
| formats | No | ||
| parsers | No | ||
| profile | No | ||
| waitFor | No | ||
| location | No | ||
| lockdown | No | ||
| redactPII | No | ||
| pdfOptions | No | ||
| excludeTags | No | ||
| includeTags | No | ||
| jsonOptions | No | ||
| queryOptions | No | ||
| storeInCache | No | ||
| onlyMainContent | No | ||
| screenshotOptions | No | ||
| zeroDataRetention | No | ||
| removeBase64Images | No | ||
| skipTlsVerification | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description discloses behavioral traits such as JavaScript rendering handling, caching (maxAge), privacy (redactPII), lockdown mode, and branding extraction. Annotations (readOnlyHint=false, destructiveHint=false) are not contradicted; the description adds rich context beyond them.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is lengthy but well-structured with headings, bullet points, and examples. It front-loads essential information. While slightly verbose, the depth is justified by the tool's complexity (23 parameters, many nuanced choices).
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the tool's complexity (23 parameters, 1 required, no output schema, nested objects), the description is highly complete. It covers JavaScript rendering troubleshooting, format selection rules, performance, privacy, lockdown, branding, and provides step-by-step troubleshooting.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
With 0% schema description coverage, the description compensates by explaining key parameters like formats, jsonOptions, queryOptions, waitFor, maxAge, lockdown, redactPII, and provides usage examples. It adds significant meaning beyond the schema's property names.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states it scrapes content from a single URL with advanced options. It distinguishes from siblings like firecrawl_crawl (multiple pages), firecrawl_search (unknown location), and firecrawl_map, making its purpose specific and unambiguous.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides explicit when-to-use and when-not-to-use guidance, including format selection (JSON vs markdown), alternatives like firecrawl_map and firecrawl_agent for JavaScript-rendered pages, and performance tips (maxAge). It covers common mistakes and best practices comprehensively.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
firecrawl_searchARead-only
Search the web and optionally extract content from search results. This is the most powerful web search tool available, and if available you should always default to using this tool for any web search needs.
The query also supports search operators, that you can use if needed to refine the search:
Operator | Functionality | Examples |
| Non-fuzzy matches a string of text |
|
| Excludes certain keywords or negates other operators |
|
| Only returns results from a specified website |
|
| Only returns results that include a word in the URL |
|
| Only returns results that include multiple words in the URL |
|
| Only returns results that include a word in the title of the page |
|
| Only returns results that include multiple words in the title of the page |
|
| Only returns results that are related to a specific domain |
|
| Only returns images with exact dimensions |
|
| Only returns images larger than specified dimensions |
|
Best for: Finding specific information across multiple websites, when you don't know which website has the information; when you need the most relevant content for a query.
Not recommended for: When you need to search the filesystem. When you already know which website to scrape (use scrape); when you need comprehensive coverage of a single website (use map or crawl.
Common mistakes: Using crawl or map for open-ended questions (use search instead).
Prompt Example: "Find the latest research papers on AI published in 2023."
Sources: web, images, news, default to web unless needed images or news.
Categories: Optional filter to limit result types: github (GitHub repositories, code, issues, and docs), research (academic and research sources), pdf (PDF results). Example: categories: ["github", "research"].
Domain filters: Use includeDomains to restrict results to specific domains, or excludeDomains to remove domains. Do not use both in the same request. Domains must be hostnames only, without protocol or path.
Scrape Options: Only use scrapeOptions when you think it is absolutely necessary. When you do so default to a lower limit to avoid timeouts, 5 or lower.
Optimal Workflow: Search first using firecrawl_search without formats, then after fetching the results, use the scrape tool to get the content of the relevantpage(s) that you want to scrape
After the search: Once you have processed the results (or decided they were not useful), call firecrawl_search_feedback with the id from this response. The first feedback per search refunds 1 credit and helps Firecrawl improve search quality.
Usage Example without formats (Preferred):
{
"name": "firecrawl_search",
"arguments": {
"query": "top AI companies",
"limit": 5,
"includeDomains": ["example.com"],
"sources": [
{ "type": "web" }
]
}
}Usage Example with formats:
{
"name": "firecrawl_search",
"arguments": {
"query": "latest AI research papers 2023",
"limit": 5,
"categories": ["github", "research"],
"lang": "en",
"country": "us",
"sources": [
{ "type": "web" },
{ "type": "images" },
{ "type": "news" }
],
"scrapeOptions": {
"formats": ["markdown"],
"onlyMainContent": true
}
}
}Returns: A JSON envelope of the form { success, data: { web?, images?, news? }, id, creditsUsed }. Each result array contains the search results (with optional scraped content). Pass the top-level id to firecrawl_search_feedback after you've used the results.
| Name | Required | Description | Default |
|---|---|---|---|
| tbs | No | ||
| limit | No | ||
| query | Yes | ||
| filter | No | ||
| sources | No | ||
| location | No | ||
| categories | No | ||
| enterprise | No | ||
| scrapeOptions | No | ||
| excludeDomains | No | ||
| includeDomains | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations indicate readOnlyHint=true, openWorldHint=true, and destructiveHint=false, which are consistent with the description. The description adds valuable behavioral context, such as the feedback mechanism, scrape options, and the fact that it returns a JSON envelope with an 'id' for feedback. It does not contradict annotations but provides additional nuance.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is lengthy but well-structured with sections, a table, and code examples. The most critical information (purpose, when to use) appears early. Some repetition exists (e.g., search operators are listed twice), but overall every section adds value. It could be more concise, but structure aids readability.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the tool's complexity (11 params, nested objects, no output schema), the description covers core functionality, return format, workflow, and differentiation from siblings. It explains the feedback mechanism and scrape options. Some less common parameters (tbs, filter) are omitted, but the description is sufficient for typical use cases.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
With 0% schema description coverage, the description compensates by explaining many parameters: query (implicit), limit, sources, categories, includeDomains, excludeDomains, and scrapeOptions with nested fields. Usage examples illustrate typical parameter combinations. However, a few parameters (tbs, filter, location, enterprise) are not explained, leaving gaps.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool's purpose: 'Search the web and optionally extract content from search results.' It emphasizes it as the primary web search tool and distinguishes it from siblings by specifying when to use alternative tools like scrape, map, or crawl. It also provides search operators and examples, leaving no ambiguity about the tool's function.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description includes explicit sections: 'Best for,' 'Not recommended for,' and 'Common mistakes,' which clearly guide when to use this tool versus alternatives. It also provides a prompt example and a detailed 'Optimal Workflow' section, making it easy for the agent to decide when and how to invoke the tool.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
firecrawl_search_feedbackA
Send structured feedback on a previous firecrawl_search result. Call this immediately after a search where you used the results so we can improve search quality and refund 1 credit (search costs 2).
Pass the searchId returned by firecrawl_search (the id field on the response) and tell us:
rating — overall result quality:
good,partial, orbad.valuableSources — which result URLs were actually useful, and a short reason why.
missingContent — the most important field. An ARRAY of specific pieces of content you expected to find but didn't. One entry per missing piece, each with a short
topicand an optional longerdescription. Examples:{"topic":"enterprise pricing","description":"no pricing tier table for the Enterprise plan was returned"},{"topic":"API rate limits"},{"topic":"comparison vs competitors"}. Be specific — these aggregate across teams and tell us what to index next. Do not pack multiple topics into one entry.querySuggestions — how the query or response shape could be improved (e.g. "would have liked official docs first", "should boost github.com").
Substantive-feedback requirement (zero-effort feedback is rejected with HTTP 400):
good— must include at least onevaluableSourcesentrypartial— must includevaluableSourcesor at least onemissingContententrybad— must include at least onemissingContententry orquerySuggestions
Time window: Feedback must be submitted within ~2 minutes of the search. Beyond that, the call returns HTTP 409 with feedbackErrorCode: "FEEDBACK_WINDOW_EXPIRED" — do not retry, just move on. Same goes for any 4xx response: do not retry-loop.
Behaviors:
Idempotent per
searchId. Re-submitting for the same id returnsalreadySubmitted: truewithcreditsRefunded: 0.Refund only applies to billable searches; preview teams are blocked.
Failed searches cannot receive feedback (the search itself already returned an error you can act on).
Daily refund cap (per team, per UTC day, default 100 credits). Once a team's
creditsRefundedTodayreachesdailyRefundCap, the response returnsdailyCapReached: truewithcreditsRefunded: 0. The feedback is still recorded for search-quality improvement — only the credit refund is gated. Stop calling this tool for the rest of the UTC day when you seedailyCapReached: true.
When to call: Right after processing a search result. If the result didn't help, send rating bad with a clear missingContent — that is just as valuable as a good rating.
Usage Example (good rating with valuable sources + missing content):
{
"name": "firecrawl_search_feedback",
"arguments": {
"searchId": "0193f6c5-1234-7890-abcd-1234567890ab",
"rating": "good",
"valuableSources": [
{ "url": "https://docs.firecrawl.dev/features/search", "reason": "Most up-to-date description of /search." }
],
"missingContent": [
{ "topic": "Pricing for the search endpoint", "description": "No pricing tier table for /search specifically." },
{ "topic": "Rate limits", "description": "Per-team RPS for /search not documented." }
],
"querySuggestions": "Boost docs.firecrawl.dev for queries that mention 'firecrawl'"
}
}Usage Example (bad rating, what was missing):
{
"name": "firecrawl_search_feedback",
"arguments": {
"searchId": "0193f6c5-1234-7890-abcd-1234567890ab",
"rating": "bad",
"missingContent": [
{ "topic": "Recent benchmarks", "description": "All results were >12 months old." },
{ "topic": "Comparison vs Algolia" }
]
}
}Returns: { success, feedbackId, creditsRefunded, creditsRefundedToday, dailyRefundCap, dailyCapReached?, alreadySubmitted?, warning? } JSON.
| Name | Required | Description | Default |
|---|---|---|---|
| rating | Yes | ||
| searchId | Yes | ||
| missingContent | No | ||
| valuableSources | No | ||
| querySuggestions | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Extensively covers behavioral details: idempotency per searchId, refund conditions, daily cap, time window with specific HTTP errors, and restrictions. These go far beyond the annotations (readOnlyHint false, destructiveHint false, openWorldHint true) to fully inform the agent.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is well-structured with sections, headings, and examples, making it easy to parse. It could be slightly more concise by trimming some redundant explanations, but overall it's clear and front-loaded.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the complex input schema and no output schema, the description provides complete context: return value format, error handling (time window, cap, idempotency), and edge cases. No gaps remain for an agent to operate correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
With schema coverage at 0%, the description fully compensates by explaining each parameter in detail, including constraints (e.g., maxItems, length limits) and inter-field dependencies (e.g., rating requirements for valuableSources and missingContent). Examples further clarify usage.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool sends structured feedback on a previous firecrawl_search result, specifying the action, resource, and context. It distinguishes from other sibling tools like firecrawl_feedback by focusing on search results.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Provides explicit usage guidance: call immediately after a search, within a 2-minute window, and details per-rating requirements. Also explains when not to call (e.g., after cap reached, failed searches) and non-retry behavior for 4xx errors.
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.
26 tool updates
v3.22.3- First observed
firecrawl_agent - First observed
firecrawl_agent_status - First observed
firecrawl_check_crawl_status - First observed
firecrawl_crawl - First observed
firecrawl_extract - First observed
firecrawl_feedback - First observed
firecrawl_interact - First observed
firecrawl_interact_stop - First observed
firecrawl_map - First observed
firecrawl_monitor_check - First observed
firecrawl_monitor_checks - First observed
firecrawl_monitor_create - First observed
firecrawl_monitor_delete - First observed
firecrawl_monitor_get - First observed
firecrawl_monitor_list - First observed
firecrawl_monitor_run - First observed
firecrawl_monitor_update - First observed
firecrawl_parse - First observed
firecrawl_research_inspect_paper - First observed
firecrawl_research_read_paper - First observed
firecrawl_research_related_papers - First observed
firecrawl_research_search_github - First observed
firecrawl_research_search_papers - First observed
firecrawl_scrape - First observed
firecrawl_search - First observed
firecrawl_search_feedback
TDQS
Scored across 26 tools
Tool purposes are mostly distinct, but some overlap exists between scrape/extract/parse and search/agent. Detailed descriptions help differentiate, but agents may occasionally misselect between search and agent for similar queries.
All tools follow the firecrawl_verb_noun pattern consistently. No mixed casing or irregular naming. The prefix is uniform and the verb+noun structure makes the purpose clear.
26 tools is high for a single server. While each tool has a unique role, the research-related tools (5 for papers/GitHub) and monitoring CRUD (7 tools) could be consolidated. The count feels slightly bloated for the core purpose of web scraping.
The tool surface covers a comprehensive range: scraping, crawling, mapping, search, extraction, monitoring, interaction, and feedback. Minor gaps exist (e.g., no batch operations or site structure analysis), but core workflows are well-supported.
Maintenance
Related MCP Connectors
Firecrawl MCP — wraps the Firecrawl API (firecrawl.dev) for web
One MCP for the Web. Easily search, crawl, navigate, and extract websites without getting blocked.…
The Fireflies MCP Server enables AI tools to connect directly to meeting data from Fireflies.ai, providing access to meeting transcripts, summaries, action items, and insights without switching platforms. It includes capabilities for querying cross-meeting data for analysis (such as sales insights or product feedback), and a separate Documentation MCP Server that allows searching the Fireflies knowledge base for API references, guides, and code examples.
Free remote MCP server for fetching public web pages through a rotating proxy pool.
Related MCP Servers
- AlicenseCqualityDmaintenanceA server that provides web scraping and intelligent content searching capabilities using the Firecrawl API, enabling AI agents to extract structured data from websites and perform content searches.53MIT
- FlicenseCqualityCmaintenanceBuilt as a Model Context Protocol (MCP) server that provides advanced web search, content extraction, web crawling, and scraping capabilities using the Firecrawl API.41-
- AlicenseAqualityDmaintenanceA Model Context Protocol server that enables web scraping, crawling, and content extraction capabilities through integration with Firecrawl.830,339 npm2MIT
- FlicenseAqualityDmaintenanceA 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.3-