Firecrawl MCP Server
Firecrawl MCP Server lets MCP clients search, scrape, crawl, parse, automate, monitor, and research web content and documents, with structured extraction and account/feedback utilities.
Scrape a URL to markdown, HTML, links, screenshots, branding, or schema-based JSON; also execute Alexandria provider capabilities.
Map a website’s indexed URLs and crawl sites with scoped limits and crawl-status checks.
Search the web, news, and images with highlights/domain filters and optional same-call page scraping.
Discover Alexandria data-provider tools and contracts with
firecrawl_find_tools.Parse PDFs, Office/OpenDocument, RTF, and HTML files, including hosted upload flow.
Run asynchronous multi-source research agents and poll their results.
Drive live browser sessions: navigate, click, type, fill/submit forms, or run code.
Create and manage recurring page/crawl/search monitors with diffs, webhooks/email, and check history.
Search scientific papers and read related/full-text passages; search developer-index and US government/legal sources.
Check current or historical Firecrawl credit usage and submit search or endpoint feedback.
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 Serverscrape the latest AI news from TechCrunch"
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 Server
A Model Context Protocol (MCP) server that brings Firecrawl, the context API for AI agents, to MCP-compatible clients: search, scrape, and interact with the live web and get back clean Markdown or structured data.
Big thanks to @vrknetha, @knacklabs for the initial implementation!
Features
Search the web, optionally with full page content for each result
Search indexes for developer sources (GitHub issues, merged pull requests, READMEs, and docs), US government sources, and scientific papers (PubMed, bioRxiv, medRxiv, arXiv)
Scrape any URL into clean Markdown or structured JSON
Parse PDFs and documents
Crawl a site for content from many pages, or map it to discover its URLs
Interact with pages in a real browser: click, type, fill forms, and navigate dynamic pages
Run Agent jobs for multi-source research that returns structured data
Monitor pages and get notified when their content changes
Check current and historical Firecrawl credit usage
Automatic retries and rate limiting
Cloud and self-hosted support
SSE support
Play around with our MCP Server on MCP.so's playground or on Klavis AI.
Related MCP server: Firecrawl MCP Server
When to Use This Server
Use
firecrawl_scrapewhen you have a known URL and want its content as markdown or as JSON matching a schema you supply.Use
firecrawl_mapwhen you need to discover URLs on a site without fetching their content.Use
firecrawl_crawlwhen you need content from many pages under a site; setlimit,includePaths/excludePaths, ormaxDiscoveryDepthto bound it.Use
firecrawl_searchwhen you're starting from a query rather than a URL and want ranked web results. Results carry excerpts; fetch full pages withfirecrawl_scrapeon the URLs you need.scrapeOptionsfetches every result's page in the same call and bills each as a scrape, so keep it for the full text of a few results (the search-only endpoint never fetches content).Use
firecrawl_interactwhen a page needs a click, type, or navigate action before you can read it: pass aurlfor a fresh page or ascrapeIdto continue on one you already scraped.Use the
firecrawl_monitor_*tools when the same page needs to be checked on a recurring schedule with diffs and change alerts, rather than fetched once.Use
firecrawl_credit_usageto check credits left or what credits were spent on, by month or day, optionally broken down by endpoint or API key.Consider something else when you need to hold a browser session open across many of your own steps with your own retry and termination logic: each
firecrawl_interactcall runs onepromptorcodeturn to completion and returns control. The session can persist across calls viascrapeIdand ends withfirecrawl_interact_stop, but you cannot drive it interactively step-by-step from the client side within a single call.
This server lists 29 tools when the full profile registers with default settings (feedback tools included, not running in local-keyless mode). Setting FIRECRAWL_NO_SEARCH_FEEDBACK=1 and/or FIRECRAWL_NO_ENDPOINT_FEEDBACK=1 removes the corresponding feedback tools and reduces this count, as does local keyless startup. For clients with a tool-slot limit: the hosted keyless endpoint (https://mcp.firecrawl.dev/v2/mcp, no API key) exposes only 3 (firecrawl_scrape, firecrawl_search, firecrawl_parse), and the dedicated search-only endpoint (https://mcp.firecrawl.dev/v2/mcp-search) exposes a fixed set of 11 tools (search, developer, government, and research search, Alexandria catalogue lookup and execution, and people and company search and enrichment).
Installation
Hosted MCP (keyless free tier)
Connect to the remote hosted server with no setup:
https://mcp.firecrawl.dev/v2/mcpOn the keyless free tier, scrape, search, and parse work without an API key (rate-limited). Other tools such as crawl, map, and agent still need a key.
Prefer OAuth or an API key whenever the human can sign up. It unlocks the full tool set and higher limits.
For an interactive account connection, configure your MCP client to use this server URL. This is an MCP endpoint, not a browser page; use the client's account-connection flow and do not add a second Firecrawl server entry when reconnecting:
https://mcp.firecrawl.dev/v2/mcp-oauthFor an API-key connection (for example, an unattended integration), keep the server URL as:
https://mcp.firecrawl.dev/v2/mcpThen configure the client's secure header or secret setting with:
Authorization: Bearer <FIRECRAWL_API_KEY>Never put an API key in the server URL. Never put an API key in an agent chat. Configure it directly in the client or secret manager. See the hosted MCP setup guide and the agent onboarding guide for client-specific instructions.
Naming your integration
An integration that connects over HTTP can name itself with an X-Firecrawl-Origin header, for example X-Firecrawl-Origin: my-agent. The server reports it to Firecrawl as the request origin mcp-my-agent@<server version>, in place of the client name or User-Agent it would otherwise report. Use letters, digits and dashes: each run of other characters becomes one dash, leading and trailing dashes are dropped, and the name is cut at 48 characters. Tool results are unaffected; only the origin sent to the Firecrawl API (and passed to an embedder's beforeKeylessRequest) changes.
Search-only endpoint
A fixed-scope search surface is also hosted at:
https://mcp.firecrawl.dev/v2/mcp-searchIt exposes a fixed set of eleven tools: firecrawl_search, firecrawl_developer_search, firecrawl_gov_search, the four firecrawl_research_* tools, the two Alexandria tools firecrawl_find_tools and firecrawl_scrape, and the enrich tools people_company_search and people_company_enrich. Its firecrawl_search fetches no page content.
Running with npx
env FIRECRAWL_API_KEY=fc-YOUR_API_KEY npx -y firecrawl-mcpManual Installation
npm install -g firecrawl-mcpRunning on Cursor
Configuring Cursor 🖥️ Note: Requires Cursor version 0.45.6+ For the most up-to-date configuration instructions, please refer to the official Cursor documentation on configuring MCP servers: Cursor MCP Server Configuration Guide
To configure Firecrawl MCP in Cursor v0.48.6
Open Cursor Settings
Go to Features > MCP Servers
Click "+ Add new global MCP server"
Enter the following code:
{ "mcpServers": { "firecrawl-mcp": { "command": "npx", "args": ["-y", "firecrawl-mcp"], "env": { "FIRECRAWL_API_KEY": "YOUR-API-KEY" } } } }
To configure Firecrawl MCP in Cursor v0.45.6
Open Cursor Settings
Go to Features > MCP Servers
Click "+ Add New MCP Server"
Enter the following:
Name: "firecrawl-mcp" (or your preferred name)
Type: "command"
Command:
env FIRECRAWL_API_KEY=your-api-key npx -y firecrawl-mcp
If you are using Windows and are running into issues, try
cmd /c "set FIRECRAWL_API_KEY=your-api-key && npx -y firecrawl-mcp"
Replace your-api-key with your Firecrawl API key. If you don't have one yet, you can create an account and get it from https://www.firecrawl.dev/app/api-keys
After adding, refresh the MCP server list to see the new tools. The Composer Agent will automatically use Firecrawl MCP when appropriate, but you can explicitly request it by describing what you need from the web. Access the Composer via Command+L (Mac), select "Agent" next to the submit button, and enter your query.
Running on Windsurf
Add this to your ./codeium/windsurf/model_config.json:
{
"mcpServers": {
"mcp-server-firecrawl": {
"command": "npx",
"args": ["-y", "firecrawl-mcp"],
"env": {
"FIRECRAWL_API_KEY": "YOUR_API_KEY"
}
}
}
}Running with Streamable HTTP Local Mode
To run the server using Streamable HTTP locally instead of the default stdio transport:
env HTTP_STREAMABLE_SERVER=true FIRECRAWL_API_KEY=fc-YOUR_API_KEY npx -y firecrawl-mcpUse the url: http://localhost:3000/mcp
In this mode the server only answers requests addressed to localhost, 127.0.0.1 or [::1] (on any port), plus the address in HOST when it isn't 0.0.0.0 or ::. A request whose Host header names another host, or whose Origin header names another site, gets 403, and CORS headers echo an allowed origin instead of *. GET and HEAD requests to /health are answered whatever the host, so health checks keep working, and the server logs a line naming FIRECRAWL_MCP_ALLOWED_HOSTS for every request it refuses. This stops web pages you visit from calling the local server through DNS rebinding or cross-origin requests and using its FIRECRAWL_API_KEY.
To reach the server under another name or address, such as a hostname behind a reverse proxy or a LAN IP, list it in FIRECRAWL_MCP_ALLOWED_HOSTS (comma-separated; ports are ignored). The same list decides which browser origins may call the server. A reverse proxy on the same machine can keep the default bind address:
env HTTP_STREAMABLE_SERVER=true FIRECRAWL_API_KEY=fc-YOUR_API_KEY \
FIRECRAWL_MCP_ALLOWED_HOSTS=mcp.home.lan npx -y firecrawl-mcpClients on other machines also need the server to listen on a non-loopback address, so set HOST too. Every client that can reach the port is then served with the server's FIRECRAWL_API_KEY, so do this only on a network you trust:
env HTTP_STREAMABLE_SERVER=true FIRECRAWL_API_KEY=fc-YOUR_API_KEY HOST=0.0.0.0 \
FIRECRAWL_MCP_ALLOWED_HOSTS=192.168.1.20 npx -y firecrawl-mcpFIRECRAWL_MCP_ALLOWED_HOSTS=* turns the check off and restores the wildcard CORS header. Only do that when something in front of the server checks hosts and origins itself.
Running with Docker
The ghcr.io/firecrawl/firecrawl-mcp-server image runs the same server as npx -y firecrawl-mcp. Every build from main is tagged latest, v<package version> and sha-<commit sha>. v<package version> moves to the newest build of that version, so pin sha-<commit sha> (or a digest) when you need a fixed image.
stdio (the default), for MCP clients that launch the server as a command:
docker run -i --rm -e FIRECRAWL_API_KEY=fc-YOUR_API_KEY ghcr.io/firecrawl/firecrawl-mcp-server:latest{
"mcpServers": {
"firecrawl-mcp": {
"command": "docker",
"args": ["run", "-i", "--rm", "-e", "FIRECRAWL_API_KEY", "ghcr.io/firecrawl/firecrawl-mcp-server:latest"],
"env": {
"FIRECRAWL_API_KEY": "YOUR_API_KEY"
}
}
}
}Streamable HTTP, served at http://localhost:3000/mcp:
docker run --rm -p 127.0.0.1:3000:3000 \
-e HTTP_STREAMABLE_SERVER=true \
-e FIRECRAWL_API_KEY=fc-YOUR_API_KEY \
ghcr.io/firecrawl/firecrawl-mcp-server:latestThe image sets HOST=0.0.0.0 and PORT=3000; override PORT (and the -p mapping) to listen elsewhere. The server uses the container's FIRECRAWL_API_KEY for requests that don't send their own credential, so the example publishes the port on 127.0.0.1 only; don't expose it more widely unless clients must supply their own key. Set FIRECRAWL_API_URL to use a self-hosted Firecrawl API. The container runs as the unprivileged node user. The server answers only localhost, 127.0.0.1 and [::1] in the Host and Origin headers, so the -p 127.0.0.1:3000:3000 mapping works as is; to reach it under another name, set -e FIRECRAWL_MCP_ALLOWED_HOSTS=<host> (see Streamable HTTP local mode).
Running on VS Code
For one-click installation, click one of the install buttons below...
For manual installation, add the following JSON block to your User Settings (JSON) file in VS Code. You can do this by pressing Ctrl + Shift + P and typing Preferences: Open User Settings (JSON).
{
"mcp": {
"inputs": [
{
"type": "promptString",
"id": "apiKey",
"description": "Firecrawl API Key",
"password": true
}
],
"servers": {
"firecrawl": {
"command": "npx",
"args": ["-y", "firecrawl-mcp"],
"env": {
"FIRECRAWL_API_KEY": "${input:apiKey}"
}
}
}
}
}Optionally, you can add it to a file called .vscode/mcp.json in your workspace. This will allow you to share the configuration with others:
{
"inputs": [
{
"type": "promptString",
"id": "apiKey",
"description": "Firecrawl API Key",
"password": true
}
],
"servers": {
"firecrawl": {
"command": "npx",
"args": ["-y", "firecrawl-mcp"],
"env": {
"FIRECRAWL_API_KEY": "${input:apiKey}"
}
}
}
}Configuration
Environment Variables
Required for Cloud API
FIRECRAWL_API_KEY: Your Firecrawl API keyRequired when using cloud API (default)
Optional when using self-hosted instance with
FIRECRAWL_API_URL
FIRECRAWL_API_URL(Optional): Custom API endpoint for self-hosted instancesExample:
https://firecrawl.your-domain.comIf not provided, the cloud API will be used (requires API key)
FIRECRAWL_INTEGRATION(Optional): Integration tag for apps that launch this server, such as an editor extensionSent as the
integrationfield of scrape, batch scrape, crawl, map, search, extract, agent, parse, interact and feedback requestsUse a value that starts with
_, for example_zed
Local HTTP mode
FIRECRAWL_MCP_ALLOWED_HOSTS(Optional): Extra host names or addresses the server answers withHTTP_STREAMABLE_SERVER=trueorSSE_LOCAL=true, comma-separatedlocalhost,127.0.0.1,[::1]and a non-wildcardHOSTare always allowed; ports are ignoredRequests whose
HostorOriginheader names any other host get403, exceptGETandHEADrequests to/health*turns the check off; not used withCLOUD_SERVICE=true, which answers every host
MCP OAuth (Bearer access tokens)
Firecrawl issues OAuth access tokens (fco_…) via the authorization server on firecrawl.dev. This MCP server forwards whichever credential it resolves to the Firecrawl API as Authorization: Bearer ….
HTTP stream transports (
CLOUD_SERVICE=true,HTTP_STREAMABLE_SERVER=true, orSSE_LOCAL=true): Clients should sendAuthorization: Bearer <fco_access_token>on MCP requests. An OAuth bearer token takes precedence overx-firecrawl-api-key/x-api-keywhen both are present.stdio: Use
FIRECRAWL_OAUTH_TOKENfor a static access token, or keep usingFIRECRAWL_API_KEYfor an API key.
Use access tokens (fco_…) only. Refresh tokens (fcr_…) must be exchanged at the token endpoint, not passed to the scrape/search API.
CLOUD_SERVICE=true
CLOUD_SERVICE=true serves the tools over streamable HTTP on PORT (default 3000, bound to 0.0.0.0) with stricter defaults: every request must carry a credential (an API key or an OAuth access token), scrape is read-only (see the scrape tool below), and firecrawl_parse accepts uploads only.
FASTMCP_ENDPOINT selects the tool surface: /v2/mcp (default) for the full tool set, /v2/mcp-oauth for the account surface, or /v2/mcp-search for the search-only tools (this also requires FIRECRAWL_MCP_SEARCH_OAUTH_ONLY=true). With the full surface, a search-only instance also starts on port 3001; set FIRECRAWL_MCP_SEARCH_ENABLED=false to turn it off.
Configuration Examples
For cloud API usage:
export FIRECRAWL_API_KEY=your-api-keyFor self-hosted instance:
# Required for self-hosted
export FIRECRAWL_API_URL=https://firecrawl.your-domain.com
# Optional authentication for self-hosted
export FIRECRAWL_API_KEY=your-api-key # If your instance requires authUsage with Claude Desktop
Add this to your claude_desktop_config.json:
{
"mcpServers": {
"mcp-server-firecrawl": {
"command": "npx",
"args": ["-y", "firecrawl-mcp"],
"env": {
"FIRECRAWL_API_KEY": "YOUR_API_KEY_HERE"
}
}
}
}How to Choose a Tool
Use this guide to select the right tool for your task:
If you know the exact URL you want: use scrape (with JSON format for structured data)
If you have multiple known URLs: call scrape for each URL. If you specifically need one bulk API operation, use the Firecrawl API batch endpoint outside MCP.
If you need to discover URLs on a site: use map
If you want to search the web for info: use search
If you have a programming question (a library, an API contract, an error message, a known bug): use developer search
If you have a legal or regulatory question (a statute, regulation, code, court opinion, or other US government publication): use the Firecrawl Government Index
If you need scientific papers (biomedical, life-science, clinical, or arXiv literature): use research tools, which search paper abstracts and full text.
searchwithcategories: ["research"]is a different thing: a website filter over ordinary web results.If you need multi-source research that returns structured data, do not know the URLs, or the answer spans several sites (an entity plus its fields, a list, a dataset): use agent
If you want to analyze a whole site or section: use crawl (with limits!)
If you need interactive browser automation (click, type, navigate): use interact with a URL for a fresh page, or scrape + interact when you already scraped the page or need tighter scrape control
If you need data from a catalogued provider (Alexandria): search with
sources: ["alexandria"], inspect the selected contract with find_tools, and execute it with scrapealexandria
Quick Reference Table
Tool | Best for | Returns |
scrape | Single page content | JSON (preferred) or markdown |
interact | Interact with a URL or scraped page | Execution result + scrapeId for URL mode |
map | Discovering URLs on a site | URL[] |
crawl | Multi-page extraction (with limits) | final crawl status/data after internal polling |
parse | Files and hosted upload refs | markdown, JSON, or document output |
search | Web search for info | results[] |
find_tools | Alexandria catalogue browsing and URL lookup | providers, tool contracts and nextTool navigation |
developer | Programming questions over developer sources | results[] with passages |
gov | US primary law and regulatory material | results[] with snippets |
agent | Multi-source research, unknown or many sites | JSON (structured data) |
monitor | Recurring page checks | monitor/check metadata and diffs |
research | Paper research (developer for repositories) | research results |
Format Selection Guide
When using scrape, choose the right format:
JSON format (recommended for most cases): Use when you need specific data from a page. Define a schema based on what you need to extract. This keeps responses small and avoids context window overflow.
Markdown format (use sparingly): Only when you genuinely need the full page content, such as reading an entire article for summarization or analyzing page structure.
Available Tools
1. Scrape Tool (firecrawl_scrape)
Scrape content from a single URL with advanced options.
Best for:
Single page content extraction, when you know exactly which page contains the information.
Not recommended for:
Extracting content from multiple pages (use repeated scrape calls for known URLs, or map + scrape to discover URLs first, or crawl for full page content)
When you're unsure which page contains the information (use search)
Common mistakes:
Passing a list of URLs to one scrape call. Call scrape once per URL in MCP. If you specifically need one bulk API operation, use the Firecrawl API batch endpoint outside MCP.
Using markdown format by default (use JSON format to extract only what you need).
Choosing the right format:
JSON format (preferred): For most use cases, use JSON format with a schema to extract only the specific data needed. This keeps responses focused and prevents context window overflow.
Markdown format: Only when the task genuinely requires full page content (e.g., summarizing an entire article, analyzing page structure).
Prompt Example:
"Get the product details from https://example.com/product."
Usage Example (JSON format - preferred):
{
"name": "firecrawl_scrape",
"arguments": {
"url": "https://example.com/product",
"formats": [
{
"type": "json",
"prompt": "Extract the product information",
"schema": {
"type": "object",
"properties": {
"name": { "type": "string" },
"price": { "type": "number" },
"description": { "type": "string" }
},
"required": ["name", "price"]
}
}
]
}
}Usage Example (markdown format - when full content needed):
{
"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.
Privacy: Set redactPII: true to return content with personally identifiable information redacted.
With CLOUD_SERVICE=true: scrape is read-only. It takes no browser actions and cannot accept provider terms. A named profile loads saved browser state without saving changes to it, and the full endpoint's firecrawl_search treats scrapeOptions.profile the same way. To save browser state to a profile, open the page with firecrawl_interact (see below). An organization admin accepts terms in the dashboard.
Returns:
JSON structured data, markdown, branding profile, or other formats as specified.
2. Map Tool (firecrawl_map)
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 of a website
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
Prompt Example:
"List all URLs on example.com."
Usage Example:
{
"name": "firecrawl_map",
"arguments": {
"url": "https://example.com"
}
}Returns:
Array of URLs found on the site
3. Search Tool (firecrawl_search)
Search the web and optionally extract content from search results.
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 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)
Usage Example:
{
"name": "firecrawl_search",
"arguments": {
"query": "remote work stipend policies at tech companies",
"highlights": true,
"limit": 5,
"lang": "en",
"country": "us"
}
}To get the full text of a few results in the same call, add "scrapeOptions": { "formats": ["markdown"], "onlyMainContent": true }. Each fetched result is billed as a scrape, so for most questions use the excerpts and firecrawl_scrape only the URLs you need.
Set highlights to true to request query-relevant highlights or false to keep the original search snippets. Omit it to use the API's default behavior.
Add "sources": ["alexandria"] for semantic tool discovery in data.tools, optionally mixed with web/news/images. A query is required. Use firecrawl_find_tools for contextual lookup and progressive disclosure; see Alexandria Tools.
For scientific papers, see Research Tools: they search paper abstracts and full text, while categories: ["research"] here filters ordinary web results to research-affiliated websites.
Returns:
Search results grouped by source (
data.web,data.images,data.news), with optional scraped content, plus anidfield. Every result carries asourceand a 1-indexedposition, numbered from 1 within its own group — copy the pair straight intofirecrawl_search_feedback'svaluableResultsrather than counting array elements. Pass thatidtofirecrawl_search_feedbackafter you've used the results to refund 1 credit (search costs 2) and improve search quality.
Prompt Example:
"Compare remote work stipend policies across tech companies."
3b. Search Feedback Tool (firecrawl_search_feedback)
Sends structured feedback on a previous firecrawl_search result. The first feedback per search id refunds 1 credit and improves Firecrawl's search quality. Idempotent per search id.
Call this after every search you actually use (or that didn't help). Bad/partial feedback with missingContent is just as valuable as good feedback.
Opt out: set FIRECRAWL_NO_SEARCH_FEEDBACK=1 (or FIRECRAWL_DISABLE_SEARCH_FEEDBACK=1) in the environment when starting the MCP server. The firecrawl_search_feedback tool will not be registered, so agents can't call it. Team admins can also disable feedback server-side; in that case the tool is registered but always returns feedbackErrorCode: "TEAM_OPTED_OUT".
Most important field: missingContent. It's an array of specific pieces of content the agent expected to find but did not. One entry per missing topic; these aggregate across teams and tell us what to index next. For useful results, use valuableResults with the source/position pair stamped on each result — results are grouped and each group is numbered from 1 independently, so both are required. List every useful result (unlisted results are treated as not useful), and reserve valuableSources for useful URLs that were not among the returned results.
Daily refund cap (per team, per UTC day, default 100 credits). Once a team's creditsRefundedToday reaches dailyRefundCap, further submissions still record feedback but no longer refund credits. The response sets dailyCapReached: true. Agents should stop calling this tool for the rest of the UTC day when they see that flag.
Usage Example:
{
"name": "firecrawl_search_feedback",
"arguments": {
"searchId": "0193f6c5-1234-7890-abcd-1234567890ab",
"rating": "good",
"valuableResults": [
{ "source": "web", "position": 1 },
{ "source": "web", "position": 3 },
{ "source": "news", "position": 2, "reason": "Broke the pricing change." }
],
"valuableSources": [
{
"url": "https://docs.firecrawl.dev/pricing",
"reason": "Not in the results; found via a result's pricing link. Answered the question."
}
],
"missingContent": [
{
"topic": "Pricing for the search endpoint",
"description": "No pricing tier table for /search specifically."
},
{ "topic": "Per-team rate limits" }
],
"querySuggestions": "Boost docs.firecrawl.dev for queries that mention 'firecrawl'"
}
}Returns:
{ success, feedbackId, creditsRefunded, alreadySubmitted? }JSON.
3c. Generic Feedback Tool (firecrawl_feedback)
Sends structured feedback for a completed v2 endpoint job through /v2/feedback.
Use this for endpoint-level feedback on scrape, parse, map, or search
jobs. For search-result quality specifically, prefer
firecrawl_search_feedback because it includes search-specific guidance.
Keep feedback concise: use issue codes, tags, short notes, URLs, page numbers, and small metadata objects. Do not include raw scrape/parse outputs.
Opt out: set FIRECRAWL_NO_ENDPOINT_FEEDBACK=1 (or FIRECRAWL_DISABLE_ENDPOINT_FEEDBACK=1) in the environment when starting the MCP server. The firecrawl_feedback tool will not be registered, so agents cannot call it.
Usage Example:
{
"name": "firecrawl_feedback",
"arguments": {
"endpoint": "scrape",
"jobId": "0193f6c5-1234-7890-abcd-1234567890ab",
"rating": "partial",
"issues": ["missing_markdown"],
"tags": ["docs"],
"note": "The pricing table was missing from the markdown output.",
"url": "https://example.com/pricing",
"pageNumbers": [1],
"metadata": {
"format": "markdown"
}
}
}Returns:
{ success, feedbackId, creditsRefunded, creditsRefundedToday?, dailyRefundCap?, dailyCapReached?, websiteCapReached?, alreadySubmitted?, warning? }JSON.
4. Crawl Tool (firecrawl_crawl)
Starts a crawl job, 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)
Using crawl for a single page (use scrape instead)
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": 2,
"limit": 100,
"allowExternalLinks": false,
"deduplicateSimilarURLs": true
}
}Returns:
Final crawl status and data after internal polling, including
id,status,completed,total,creditsUsed,expiresAt,next, anddata. Use the returnedidwithfirecrawl_check_crawl_statusif you need to re-check the job later.
5. Check Crawl Status (firecrawl_check_crawl_status)
Check the status and results of an existing crawl job by ID.
{
"name": "firecrawl_check_crawl_status",
"arguments": {
"id": "550e8400-e29b-41d4-a716-446655440000"
}
}Returns:
Response includes the status of the crawl job:
6. Parse Tool (firecrawl_parse)
Parse local files or hosted upload references with Firecrawl's /v2/parse endpoint.
Best for: PDFs, Word documents, spreadsheets, HTML files, and other documents that need markdown or structured JSON output. The hosted endpoint uses a two-step upload flow; local direct file reads require a self-hosted FIRECRAWL_API_URL.
Not recommended for: Remote URLs (use scrape), multiple files in one call (call parse once per file), or browser-only actions such as screenshots and clicks.
Hosted endpoint: it cannot read your filesystem. Call firecrawl_parse with filePath to receive a short-lived upload command and nextToolCall, upload the file locally, then call firecrawl_parse again with the returned uploadRef. The upload step requires Firecrawl auth or the keyless tier. In local npx firecrawl-mcp mode, direct file parsing currently requires FIRECRAWL_API_URL pointing to a self-hosted Firecrawl API; a plain cloud API-key-only local server cannot read and upload files through this tool.
Usage Example:
{
"name": "firecrawl_parse",
"arguments": {
"filePath": "/absolute/path/to/document.pdf",
"formats": ["markdown"],
"parsers": ["pdf"],
"zeroDataRetention": true
}
}Returns: Parsed document content or hosted upload instructions with a nextToolCall.
7. Structured data with Scrape JSON
For structured data from a known page, call firecrawl_scrape once per URL with formats: ["json"]. Put the extraction prompt and JSON schema in jsonOptions.
{
"name": "firecrawl_scrape",
"arguments": {
"url": "https://example.com/product",
"formats": ["json"],
"jsonOptions": {
"prompt": "Extract the product name, price, and description.",
"schema": {
"type": "object",
"properties": {
"name": { "type": "string" },
"price": { "type": "number" },
"description": { "type": "string" }
},
"required": ["name", "price"]
}
}
}
}When the URLs are not known or the data spans several sites, use firecrawl_agent for multi-source research.
8. Agent Tool (firecrawl_agent)
Autonomous web research agent that returns structured data when you do not know the URLs or the answer spans several sites. Describe the fields you need, optionally pass a JSON schema and seed URLs, and the agent searches, navigates, reads pages, and returns JSON assembled across sources. Use it for an entity plus its fields, for lists and datasets, and for pages that need navigation to reach the data. For one known URL use firecrawl_scrape with JSON format instead.
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.
Async workflow:
Call
firecrawl_agentwith your prompt/schema → returns job IDDo other work while the agent researches (can take minutes for complex queries)
Poll
firecrawl_agent_statuswith the job ID to check progressWhen status is "completed", the response includes the extracted data
Best for:
Complex research tasks where you don't know the exact URLs
Multi-source data gathering
Finding information scattered across the web
Tasks where you can do other work while waiting for results
Not recommended for:
Simple single-page scraping where you know the URL (use scrape with JSON format - faster and cheaper)
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 pagesschema: Optional JSON schema for structured outputeffort: Optional."low","medium"or"high"reasoning budget for the agent task.maxCredits: Optional positive integer. Spending limit in credits for this run. The API defaults to 2,500 when omitted, and caps a free request at 2,500.strictConstrainToURLs: Optional boolean. Iftrue, the agent only visits the URLs inurls.threadId: Optional. Continue an existing thread: thethreadIdfrom an earlierfirecrawl_agentorfirecrawl_agent_statusresult. Omit to start a new thread. On a follow-up, omittedmode,urls,schemaandexchangesettings carry over from the previous turn.mode: Optional."extract"(default) returns the complete structured result every turn."chat"lets a follow-up that asks for no new data get a short reply inmessageinstead of a re-run;exchange.requireApprovalneeds it.exchange: Optional. Alexandria provider settings for this turn, forwarded as-is toPOST /v2/agent:enabled,toolkits(up to 5 provider slugs),maxCalls(1 to 30),requireApproval(paid calls end the turn with apendingApproval; needsmode: "chat"on the same call, even on a follow-up)onTermsRequired: what to do when an Alexandria provider the agent would use needs data terms your team has not accepted. Gated providers are never called in any mode. Omitted on a follow-up keeps the previous turn's value."skip"(default): answer with accepted providers only.exchange.skippedProviderson the status result lists the gated providers that would have helped."ask": the same, plus a termspendingApprovalandexchange.requiresActionwith the approval ID and provider requirements. Read terms withterms/show; an organization admin accepts them in the Firecrawl dashboard.
approve:{ approvalId, callIds?, always? }answers yes to thependingApprovalthe previous turn ended on.callIdsandalwaysapply to paid-call approvals only.decline:{ approvalId }answers no. A declined terms offer keeps those providers out of the rest of the thread.approveanddeclineneedthreadId, and only one of them can be sent.
Provider terms (ask mode): there is no auto-accept mode. When a turn ends on a terms offer, the status result carries pendingApproval (kind: "terms") and exchange.requiresAction with the approvalId and provider requirements. Any terms/accept descriptor in that API payload is unavailable through MCP. To use the provider:
Show the user the terms (
terms/showthroughfirecrawl_scrapewithalexandria).Direct an organization admin to accept the terms at the provider's URL, or data sources settings. A data request is not consent.
Wait for the admin to confirm acceptance in the dashboard.
Continue the same thread: call
firecrawl_agentwith the samethreadIdandexchange.approve: { "approvalId": "..." }. This resumes research and does not accept terms.
If the user says no, call firecrawl_agent with the same threadId and exchange.decline: { "approvalId": "..." } instead.
Prompt Example:
"Find the founders of Firecrawl and their backgrounds"
Usage Example (start agent, then poll 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 using the returned job ID.
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"
}
}Usage Example (follow-up on the same thread):
{
"name": "firecrawl_agent",
"arguments": {
"prompt": "Only keep the startups based in Europe",
"threadId": "0199a1b2-0000-7000-8000-000000000031"
}
}Usage Example (continue the thread after an admin confirmed dashboard acceptance):
{
"name": "firecrawl_agent",
"arguments": {
"prompt": "The admin confirmed acceptance of the Apollo terms in the dashboard. Continue.",
"threadId": "0199a1b2-0000-7000-8000-000000000031",
"exchange": { "approve": { "approvalId": "0199a1b2-0000-7000-8000-000000000033" } }
}
}Returns:
Job ID for status checking, plus
threadIdandthreadTurn. Usefirecrawl_agent_statusto poll for results.
9. Check Agent Status (firecrawl_agent_status)
Check the status of an agent job and retrieve results when complete. Use this to poll for results after starting an agent.
Polling pattern: Agent research can take minutes for complex queries. Poll this endpoint periodically (e.g., every 10-30 seconds) until status is "completed" or "failed".
{
"name": "firecrawl_agent_status",
"arguments": {
"id": "550e8400-e29b-41d4-a716-446655440000"
}
}Possible statuses:
processing: Agent is still researching - check back latercompleted: Research finished - response includes the extracted datafailed: An error occurred
10. Interact Tool (firecrawl_interact)
Interact with a fresh URL or with a page that was already opened by firecrawl_scrape.
Best for: Clicking, typing, navigating, and extracting state from dynamic pages without restoring the deprecated browser tools.
Usage options:
Pass
urlto scrape and open a page for interaction in one MCP call.Pass
scrapeIdto continue interacting with an existing scraped page.To save browser state (cookies, localStorage) to a named profile, pass
urlwithscrapeOptions: { "profile": { "name": "my-profile", "saveChanges": true } }. The state is saved whenfirecrawl_interact_stopends the session.Pass exactly one of
urlorscrapeId, plus eitherpromptorcode.
Usage Example:
{
"name": "firecrawl_interact",
"arguments": {
"url": "https://example.com",
"prompt": "Click the pricing link and summarize the visible plans"
}
}Returns: Interaction result and, for URL mode, the derived scrapeId for follow-up or cleanup.
11. Stop Interact Tool (firecrawl_interact_stop)
Stop an interact session for a scraped page when you are done interacting.
{
"name": "firecrawl_interact_stop",
"arguments": {
"scrapeId": "scrape-id-here"
}
}12. Research Tools (firecrawl_research_*)
Search and inspect papers through the research MCP tools. For GitHub repositories, issues, and pull requests, use firecrawl_developer_search.
Covers: paper abstracts and full text across biomedical, life-science, and clinical literature (PubMed, bioRxiv, medRxiv) alongside arXiv and other scientific sources.
Available research tools:
firecrawl_research_search_papers: search paper metadata and abstracts with a natural-language query, with optional author, category, and date filters.firecrawl_research_inspect_paper: retrieve canonical metadata for one paper ID (arXiv, PMC, PMID, or DOI).firecrawl_research_related_papers: expand from one or more anchor papers through the citation graph.firecrawl_research_read_paper: read full-text passages from a specific paper.
Best for: Literature review, paper lookup, and repository discovery workflows where the agent needs a focused research surface instead of general web search.
firecrawl_search with categories: ["research"] is a different surface: it filters ordinary web results to research-affiliated websites and returns page snippets, not paper records. Use these tools when the question is about the literature itself, and pass several distinct framings of the same question, since they surface different papers than a single query does.
13. Monitor Tools (firecrawl_monitor_*)
Create and manage recurring page monitors. Monitors run scheduled scrapes or crawls, diff each result against the last retained snapshot, and can notify by webhook or email.
Best for:
Watching one page or a few pages over time
Alerting on meaningful changes using a plain-English goal
Tracking check history and page-level diffs
Recommended create pattern:
Use page or pages plus goal. The MCP server builds the monitor request with a 30-minute schedule and the API enables meaningful-change judging automatically.
Meaningful-change judging runs automatically when goal is set. Page webhooks expose isMeaningful and judgment on monitor.page events.
Write goals as concise 2-3 sentence monitor instructions. Say what should trigger an alert, preserve any scope the user gave, and include intent-specific exclusions only when obvious from the 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, so do not repeat it in every goal. If the user is vague, keep the goal broad; if they ask for broad monitoring or "any change", preserve that. If the user says they do not care about something, include that explicitly.
{
"name": "firecrawl_monitor_create",
"arguments": {
"page": "https://example.com/pricing",
"goal": "Alert when pricing, packaging, or launch messaging changes."
}
}Multiple pages with webhooks:
{
"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"
}
}Advanced create requests:
Pass body when you need crawl targets, JSON change tracking, custom retention, or explicit judgeEnabled control.
{
"name": "firecrawl_monitor_create",
"arguments": {
"body": {
"name": "Docs monitor",
"schedule": { "text": "hourly", "timezone": "UTC" },
"goal": "Alert when docs pages add, remove, or materially change API behavior.",
"targets": [{ "type": "crawl", "url": "https://example.com/docs" }]
}
}
}Other monitor tools:
firecrawl_monitor_list: list monitors.firecrawl_monitor_get: get one monitor.firecrawl_monitor_update: update fields includinggoal,judgeEnabled,webhook, andnotification.firecrawl_monitor_run: trigger a check now.firecrawl_monitor_delete: delete a monitor (destructive; only call when the user intends to remove it).firecrawl_monitor_checks: list checks, optionally filtered by status.firecrawl_monitor_check: get page-level results, includingdiff,snapshot,judgment.meaningful, andjudgment.meaningfulChanges.
14. Developer Search Tool (firecrawl_developer_search)
Search an index built for coding agents. The index covers GitHub issues, merged pull requests, repository READMEs, and code documentation.
Best for: A programming question: code behaviour, a library or framework, an API contract, an error message, or a known bug.
Arguments:
{
"name": "firecrawl_developer_search",
"arguments": {
"query": "how do I configure retries",
"k": 10,
"skills": "only"
}
}query(required): the developer question or search phrase.k: number of ranked results. The default is 10 and the maximum is 100.skills: set to"only"to search agent-skill files alone.
Returns: Ranked results. Each result carries an ID, a source type (issue, pull_request, readme, or doc), a URL, a title, and the matched passages in markdown.
firecrawl_search with categories: ["developer"] searches the same index beside the web results. Use this tool instead when you want the matched passages, the skills filter, or no web results in the response. The search-only endpoint exposes both tools, and the same choice applies there.
14b. Government Index Search Tool (firecrawl_gov_search)
Search primary law and regulatory material from US federal, state, and local government sources: statutes, regulations, codes, court opinions, and other government publications.
Best for: A legal or regulatory question that needs the governing text or an official government source.
Arguments:
{
"name": "firecrawl_gov_search",
"arguments": {
"query": "excessive force claims against police officers",
"k": 10,
"courtType": "federal-appellate",
"cites": "42 U.S.C. § 1983"
}
}query(required): the legal or regulatory question or search phrase.k: number of ranked results. The default is 10 and the maximum is 100.jurisdiction: keep only pages of one jurisdiction:"us"for federal, or"us-"plus a two-letter state or territory code, such as"us-ca"or"us-dc".court: keep only pages labeled for one court, by CourtListener court id, such as"scotus","ca9"or"nysd".courtType: keep only pages from one type of court:federal-supreme,federal-appellate,federal-district,federal-bankruptcy,federal-special,military,state-supreme,state-appellate,state-trial,state-specialorstate-attorney-general.cites: keep only pages that cite one law or case, as a printed citation such as"42 U.S.C. § 1983"or"5 U.S. 137", or a citation id such as"us:usc:42:1983".domain: keep only pages from one site, such as"irs.gov".
The filters are optional and combine: a result must match every filter set. Filters keep only pages the index has labeled, so a filtered search can leave out relevant pages, and no results does not mean none exist. Court labels are most complete for federal courts and case-law collections.
Returns: Ranked results. Each result carries a position, a title, a URL, and the matched snippet. The search-only endpoint exposes this tool too.
firecrawl_search with categories: ["gov"] searches the same sources and returns the hits in data.web with category: "gov". The gov category does not take these filters and cannot be combined with other categories.
15. Alexandria Tools
Firecrawl Alexandria is a catalogue of data providers reachable through the Firecrawl API with a Firecrawl API key on a team with Alexandria access. Keyless sessions (hosted or local) get Alexandria requires an API key on a team with Alexandria access; Alexandria discovery tools are not listed for hosted keyless sessions.
Semantic discovery (firecrawl_search):
{
"name": "firecrawl_search",
"arguments": {
"query": "podcast conversations about AI agents",
"sources": ["web", "alexandria"],
"domainTools": true,
"limit": 2
}
}data.tools defaults to compact suggestions with provider, capability, and
description. Set toolDetail: "summary" for metadata and navigation, or
toolDetail: "full" for contracts including inputs, response fields and examples. domainTools: true adds contextual matches to
query mentions and result URLs in that same array. Check warning for unavailable
discovery. Search requires a query and does not accept catalogue traversal filters.
This discovery works on both the full and search-only MCP surfaces.
Progressive disclosure (firecrawl_find_tools):
{
"name": "firecrawl_find_tools",
"arguments": {
"providers": ["particle"],
"capabilities": ["podcasts/episodes/search"],
"expand": ["options", "response", "examples"],
"limit": 2
}
}Start with no arguments for categories, then progressively narrow the catalogue:
Arguments | Result |
| Categories and short descriptions |
| Providers in that category |
| Compact tool names and descriptions |
| Complete selected inputs, constraints, response, and examples |
No group hop is required. Explicit level supports categories, providers,
groups, or tools; explicit expand selects contract sections. expand: []
keeps results compact even when selecting a capability. For broad full contracts,
explicitly request level: "tools" and expand: ["options", "response", "examples"].
URLs provide contextual discovery without fetching the page. Tool results omit
per-capability credit prices unless includeCosts: true is set; follow-up
nextTool arguments keep it.
Results are in data.alexandria[0].data. Follow an item's nextTool by calling
its name with its arguments; the page's nextTool advances pagination.
Existing next objects remain Alexandria discovery calls usable through
firecrawl_scrape. Discovery costs zero credits and never executes the
provider tools. Read the selected full contract before execution.
These controls require the matching Alexandria API deployment.
Execute (firecrawl_scrape with alexandria): pass alexandria instead of url (exactly one of the two; requestId and timeout may also be supplied). A single call or an array of up to ten calls is accepted.
{
"name": "firecrawl_scrape",
"arguments": {
"alexandria": [
{
"provider": "fred",
"capability": "series/observations",
"options": { "series_id": "CPIAUCSL" }
}
]
}
}Returns: { success, scrape_id, requestId, data: { alexandria: [...], creditsCost } }. Each item is either a result (provider, capability, data, records, upstreamStatus) or an error with a code; the batch never fails as a whole for a provider error and data.creditsCost is the total charged for the request. Alexandria error bodies (403 without Alexandria access, and 402/409 billing statuses) are relayed in-band with their code.
Execution generates one x-request-id and returns it on success or failure. Retry
the identical payload with that requestId; do not create a new ID after an
uncertain outcome. Available credits are checked by the API.
An Alexandria provider whose terms the team has not accepted fails before anything runs with HTTP 403 and this body:
{
"success": false,
"code": "THIRD_PARTY_DATA_TERMS_REQUIRED",
"error": "An organization admin must accept the benzinga provider's terms (version 2026-09-12-placeholder) before this request can run. Accept them at https://www.firecrawl.dev/app/alexandria/benzinga",
"requiresAction": {
"type": "accept_terms",
"terms": "benzinga",
"version": "2026-09-12-placeholder",
"url": "https://www.firecrawl.dev/app/alexandria/benzinga"
}
}The tool result relays it as an error with structuredContent carrying code,
status: 403, requestId, the requiresAction object unchanged, and
next_actions (human_action_required then retry_same_request). Accepting
terms is a legal act, so an organization admin accepts them in the Firecrawl dashboard, not
through MCP. Use the returned nextTool call to read the agreement through firecrawl_scrape
with alexandria: [{provider: "firecrawl", capability: "terms/show", options: {provider: "<provider>"}}],
sent separately from provider execution, and present it to the user. An organization admin then
accepts it at requiresAction.url, or at https://www.firecrawl.dev/app/settings?tab=data-sources.
firecrawl_scrape refuses every other terms/* capability, so it makes no account changes. A request
for data is not consent, and no automatic acceptance or uncertain retries occur.
No credits are charged for the blocked retrieval. After the admin confirms acceptance, call the same
tool again with the identical payload and requestId.
15b. Enrich Tools
People and company search and enrichment over Alexandria's B2B data providers (Apollo, FullEnrich, People Data Labs and Data Legion). Both tools are listed wherever the server has a credential: they are not listed in local keyless mode or to keyless sessions. The search-only endpoint includes them too. They need a Firecrawl credential (an API key or OAuth access) on a team with Alexandria access.
Tool | Use it for | Providers |
| Finding people ( | apollo, fullenrich, people_data_labs |
| Resolving known people to profiles and work history, or known companies to firmographics. With | fullenrich, apollo, people_data_labs, datalegion |
No parameter is shared between providers. Each provider block takes that provider's own parameters under its own names (Apollo's person_titles, FullEnrich's current_position_titles, a People Data Labs sql query or Elasticsearch query), so a filter a provider lacks is simply absent from its block. A provider runs only when the call includes its block; a call with no provider block (and, for people_company_search, no firecrawl_search block) fails with no_provider and the blocks the tool takes.
people_company_search takes entity, and each provider block then takes that provider's search filters for people or for companies. An optional firecrawl_search block runs a Firecrawl web search beside the providers, with firecrawl_search's query parameters but no page fetching, and reports its results in its own providers entry. people_company_enrich takes, in each provider block, exactly one of people or companies: that provider's own list of inputs, 1 to 50 per call, and the same kind in every block. Adding contact_fields (work_email, personal_email, mobile) to a people enrichment runs the contact providers on the same people instead of the profile lookup; People Data Labs has no contact lookup and reports skipped.
{
"name": "people_company_enrich",
"arguments": {
"fullenrich": { "companies": [{ "domain": "example.com" }] },
"datalegion": { "companies": [{ "domain": "example.com" }, { "name": "Example Labs" }] }
}
}{
"name": "people_company_enrich",
"arguments": {
"contact_fields": ["work_email"],
"fullenrich": { "people": [{ "person_name": "Jane Doe", "company_domain": "example.com" }] },
"apollo": { "people": [{ "name": "Jane Doe", "domain": "example.com" }] }
}
}Enabled providers run in parallel, and nothing is merged. The response has one providers entry per provider with its status, records returned, credits and its own results; people_company_enrich results carry input_index into that provider's input list, and unmatched lists the inputs it missed. A failed provider has a note, and retryable: true when the provider may succeed on a later try. With contact_fields, an Apollo or Data Legion match (charged per match) that lacks a requested field lists it in missing; FullEnrich charges and returns only the values it finds, and a FullEnrich contact still running upstream is listed under pending (with a next_tool to read it later when one is available) instead of under unmatched. credits_total sums the charges. Tool descriptions list each provider's credit price.
Both tools take max_credits (default 1000). Before any provider runs, the call's most possible cost is estimated from those prices as if every record were found; a call whose estimate is higher fails with max_credits_exceeded and the estimate per provider, and a call that runs reports credits_estimate and max_credits. Both tools also accept, and drop, the conversationId and objective fields agents carry between Firecrawl tools, and repair common near-miss shapes before validating: a single item where a list is expected, plain strings for FullEnrich {"value"} filters, "51-200" for FullEnrich ranges, and a provider block sent as a one-item list or under an extra key. An argument that still fails names the field, the fields its block takes, and an example call.
16. Credit Usage Tool
The tool requires an authenticated Firecrawl account and is read-only.
firecrawl_credit_usagedefaults to{ "view": "current" }and returnsremainingCredits,planCredits,billingPeriodStart, andbillingPeriodEnd. Remaining credits can exceed plan credits when the team has top-ups or grants.Pass
{ "view": "historical" }for calendar-month periods containingstartDate,endDate, andcreditsUsed. Passing{ "byApiKey": true }also selects the historical view and splits periods by API key; each row then includesapiKey. Passing{ "byEndpoint": true }instead splits periods by the endpoint that used the credits (scrape, search, crawl, map, agent, ...); each row then includesendpoint. Pass{ "bin": "day" }for one period per UTC day instead of per calendar month. Do not combinebyApiKeywithbyEndpoint, or any of these with{ "view": "current" }. The latest period'sendDatecan be null. If the Firecrawl API does not offer the endpoint split or daily periods yet, the result carries anoticeand monthly figures.
Programmatic use (unstable)
The package also exposes a library entry point for embedding the server in another runtime. It is unstable: the API, its options and its types may change in any release, including minor and patch releases, so pin an exact version.
npm install --save-exact firecrawl-mcp zodThe example defines tool parameters with zod, so the embedding project installs it as its own dependency.
import { createFirecrawlMcpServer } from 'firecrawl-mcp/server';
import { z } from 'zod';
const server = createFirecrawlMcpServer({
transport: 'httpStream',
apiKey: process.env.FIRECRAWL_API_KEY,
unstable_hooks: {
registerExtraTools: (registrar) => {
registrar.addTool({
name: 'my_tool',
description: 'An extra tool served next to the Firecrawl tools.',
parameters: z.object({ text: z.string() }),
execute: async ({ text }) => text,
});
},
},
});
await server.start({
transportType: 'httpStream',
httpStream: { port: 3000, host: '127.0.0.1', endpoint: '/mcp', stateless: true },
});
// MCP endpoint: http://127.0.0.1:3000/mcpSet host explicitly. Without it the server listens on localhost, which Node binds to a single address (often only ::1), so requests to 127.0.0.1 are refused. Use 0.0.0.0 or :: to accept connections from other machines only behind network access controls or an unstable_hooks.authenticate check: without one, every caller that can reach the port is served with the configured apiKey.
The library doesn't check Host or Origin unless asked, and its CORS headers allow any origin. A server reachable from a browser on the same machine should pass httpStream.allowedHosts (for example ['localhost', '127.0.0.1', '[::1]']): requests whose Host or Origin header names another host then get 403 (except GET and HEAD on the health path), and CORS headers echo the allowed origin. The command line sets this list in local HTTP mode.
Options mirror the CLI's environment variables: apiUrl, apiKey, transport, logging, safeMode, fileAccess (local or upload), requireCredential, searchFeedback and endpointFeedback. unstable_hooks accepts:
Hook | Purpose |
| Resolve the session for a request; throw a |
| Decorate every registered tool. |
| Observe the start and outcome of each tool call. |
| Server instructions, or a function choosing from the defaults. |
| Add tools after the built-in ones. |
| Credential and extra headers for each Firecrawl API request. |
| Refuse a keyless request by throwing. |
| Leave built-in tools out of the instance. |
| Add HTTP routes. |
| Serve OAuth protected-resource metadata. |
The server is built on the official MCP TypeScript SDK (@modelcontextprotocol/server). Use the types exported from firecrawl-mcp/server (Session, ToolDefinition, ToolRegistrar, FirecrawlMcpServerHooks and others) rather than the SDK's own.
The entry point also exports the helpers the built-in tools use, such as recoveryPayload, normalizeHeader, requestOrigin, isRuntimeUserAgent, initializeClientSlug, searchToolBaseFields, searchOutputSchema and structuredCompact, so extra tools and hooks can match the built-in behaviour. They are unstable as well.
Logging System
The server includes comprehensive logging:
Operation status and progress
Performance metrics
Rate limit tracking
Error conditions
Example log messages:
[INFO] Firecrawl MCP Server initialized successfully
[INFO] Starting scrape for URL: https://example.com
[ERROR] Rate limit exceededError Handling
The server provides robust error handling:
API rate-limit errors surfaced to the MCP client
Detailed error messages
Network resilience
Example error response:
{
"content": [
{
"type": "text",
"text": "Error: Rate limit exceeded"
}
],
"isError": true
}Development
# Install dependencies
npm install
# Build
npm run build
# Run tests
npm testContributing
Fork the repository
Create your feature branch
Run tests:
npm testSubmit a pull request
Thanks to contributors
Thanks to @vrknetha, @cawstudios for the initial implementation!
Thanks to MCP.so and Klavis AI for hosting and @gstarwd, @xiangkaiz and @zihaolin96 for integrating our server.
License
MIT License - see LICENSE file for details
Structured data and large results
Authenticated search defaults to web results, semantic Alexandria tools, and domain matches. Start with the actual question. Use firecrawl_find_tools for direct semantic tool lookup, selected contracts, or progressive browsing: categories → providers → compact tools → selected contract. Execute tools through firecrawl_scrape; ordinary URL scraping and search never automatically execute provider tools.
For selected contracts, prefer expand: ["options", "response"] and request examples only if the input shape is unclear. Inspect related capabilities together and reuse the returned contracts.
For a potentially large workflow result, supply and preserve a top-level requestId before execution. That ID remains available even if the client rejects the response. Regular URL scrapes use the returned scrape ID instead.
For a large retained workflow or regular scrape result, call firecrawl_scrape with:
{
"alexandria": {
"provider": "firecrawl",
"capability": "bash",
"options": {
"requestId": "<source-request-or-scrape-id>",
"command": "ls -lh"
}
}
}Read stdout, stderr, exitCode, and workspaceId in data.alexandria[0].data. Continue with options: {workspaceId, command} to inspect response.json using jq, or document.md using bounded text commands for regular scrapes. Keep output selective. Source loading must be a standalone call; its nested source ID differs from the top-level execution request ID. Workspaces expire after five idle minutes, and not every result is retained (including ZDR and API-provider workflow payloads). Search IDs are not supported.
For workflow sources, response.json preserves the API envelope: select .data.alexandria[].data, then the selected contract’s response.key when nonempty. Combine related counts and projections in one Bash command when that shape is known, rather than repeatedly inspecting keys.
Successful Alexandria execution responses above 20,000 estimated tokens (serialized UTF-8 bytes divided by four) return a small handoff after remote Bash confirms the complete batch is accessible. Follow nextTool to inspect the retained data. This adds one Bash call and starts a workspace with a five-minute idle TTL. The full payload is preserved. If confirmation fails, the original response stays inline. Search, ordinary URL scrape, error responses and Firecrawl utility calls are unchanged. This delivery budget does not measure the client’s remaining context; no process-local result cache is added. When local filesystem tools are available, saving CLI output and reading selected sections is another option.
The CLI discovery sequence maps to these MCP calls:
Intent | Tool | Arguments |
Web + semantic + domain tools |
|
|
Semantic tools only |
|
|
Categories |
|
|
Providers in a category |
|
|
Compact provider tools |
|
|
Selected contract |
|
|
Execute |
|
|
Find Tools and execution are available on both the full surface and the search surface. Reuse a complete contract from search when present rather than making another discovery call. Follow returned nextTool navigation only when more results are needed.
Alexandria session feedback
The existing firecrawl_feedback tool accepts endpoint: "alexandria":
{
"endpoint": "alexandria",
"rating": "partial",
"requestedWebsite": {
"url": "https://example.com",
"requestedFunctionality": "Find records and download their attachments"
},
"objective": "Compare contract requirements across agencies before bidding",
"rationale": "Found summaries but could not retrieve attachments"
}The optional objective is the underlying goal of the session: what the agent or its user was ultimately trying to accomplish, beyond the single website in requestedWebsite.
This uses authenticated POST /v2/feedback, without a job ID. It must arrive within 20 minutes of the team's most recent Alexandria search, discovery, or execution; later feedback is rejected with FEEDBACK_WINDOW_EXPIRED. Eligible feedback can refund 1 credit, subject to daily caps of 10 credits per website and 100 credits per team (UTC day). Past either cap, feedback is still recorded with no refund, and the response sets websiteCapReached or dailyCapReached. Optional providerFeedback and capabilityFeedback arrays describe coverage gaps and execution issues; the tool schema lists supported issue values. A new_capability_request requires requestedFunctionality; missing_capability (the provider exists but lacks the capability) does not. Existing feedback opt-out and authentication controls apply.
Per-call feedback tokens
Alexandria provider call results can carry a feedbackToken so ratings are attributed to the calls they are about. The server keeps each token per MCP session (keyed by the Mcp-Session-Id and the caller's credential, or by the credential alone when the client sends no session id; at most 20 tokens, dropped after 24 hours) and shows the agent a short feedbackRef such as c3 in its place, so long tokens never reach the model. firecrawl_feedback sends the session's tokens with every Alexandria rating, so the overall rating covers every retained tokenized call in the session, and accepts an optional callRatings array to rate individual calls by their ref:
{
"endpoint": "alexandria",
"rating": "partial",
"requestedWebsite": { "url": "https://example.com", "requestedFunctionality": "Find records" },
"rationale": "The search call worked, the detail call failed",
"callRatings": [
{ "ref": "c1", "rating": "good" },
{ "ref": "c2", "rating": "bad" }
]
}Refs that are unknown or expired are ignored, and the result says so in note. A successful submission clears the tokens it sent, so the next rating covers only new calls. Results that carry no token (for example under zero data retention) keep working as before.
Eligible Alexandria execution and discovery results include a feedbackTool pointer with the tool name and a skeleton of the arguments. The pointer is omitted for Firecrawl-internal calls such as bash and when firecrawl_feedback is not registered (FIRECRAWL_NO_ENDPOINT_FEEDBACK or keyless startup).
Available Tools
28 toolsfirecrawl_agentFirecrawl agentA
Run web research that returns structured data when the URLs are not known or the answer spans several sites. Describe the fields you need in prompt, optionally pass a JSON schema and seed urls, and the research agent searches, navigates, reads pages, and returns JSON assembled across sources. Use it to research an entity plus its fields (founders, pricing, contact details), to build lists and datasets (companies, people, products, jobs, papers), and for pages that need navigation or interaction to reach the data. Optional effort sets the reasoning budget, maxCredits caps spend, and strictConstrainToURLs keeps the agent to the supplied urls.
This call returns only a job ID, not the research result. Read the job with firecrawl_agent_status until it reaches completed or failed; a typical research run takes one to three minutes. For one known URL use firecrawl_scrape (with formats: ["json"] for structured output); for a plain lookup that a results page answers, use firecrawl_search.
The job also returns a threadId. To continue that thread, pass it with a follow-up prompt; omitted mode, urls, schema and exchange settings carry over from the previous turn.
The agent only calls Alexandria providers whose terms the team has accepted. exchange.skippedProviders lists gated providers. With exchange.onTermsRequired "ask", a terms pendingApproval and exchange.requiresAction carry the approvalId and provider requirements. Read terms/show through firecrawl_scrape. An organization admin must accept terms in the Firecrawl dashboard at the provider URL or https://www.firecrawl.dev/app/settings?tab=data-sources. Ignore any terms/accept call in the API response. Only after the admin confirms acceptance, resume with the same threadId and exchange.approve: {approvalId}; this does not accept terms. To decline, use exchange.decline: {approvalId}. Never infer acceptance from a data request.
| Name | Required | Description | Default |
|---|---|---|---|
| mode | No | "extract" (default) returns the complete structured result every turn. "chat" lets a follow-up that asks no new data get a short reply in message instead of a re-run; required for exchange.requireApproval. Omitted on a follow-up keeps the previous turn's mode. | |
| urls | No | ||
| effort | No | Reasoning budget for the agent task. | |
| prompt | Yes | ||
| schema | No | ||
| exchange | No | Alexandria provider settings for this turn, forwarded as the request's exchange object. | |
| threadId | No | Continue this thread: the threadId from an earlier firecrawl_agent or firecrawl_agent_status result. Omit to start a new thread. | |
| maxCredits | No | Spending limit in credits for this run. Defaults to 2500 on the API. | |
| strictConstrainToURLs | No | If true, agent will only visit URLs provided in the urls array. |
Output Schema
| Name | Required | Description |
|---|---|---|
| id | No | Agent job identifier, for `firecrawl_agent_status`. |
| error | No | Error message or error object when the call did not succeed. |
| status | No | Job state at submission time. |
| success | No | Whether the API call succeeded. |
| threadId | No | Research thread this job belongs to. |
| threadTurn | No | Turn number of this job within its thread. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations declare only readOnlyHint=false, openWorldHint=true, idempotentHint=false and destructiveHint=false, so the description carries real weight and does: it discloses that this call returns only a job ID, that the agent must poll firecrawl_agent_status until completed/failed, and that a run typically takes one to three minutes. It adds cost semantics (maxCredits caps spend), thread continuation with inherited settings, and the full gated-provider/terms approval path including skippedProviders and approve/decline — none of which is inferable from 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?
Well front-loaded: purpose and the sibling routing come first, then the async/thread mechanics, then terms handling. The terms paragraph is dense and partially restates schema descriptions for exchange.approve and onTermsRequired, and the dashboard URL is verbose, but given a 9-parameter async tool with nested exchange objects most of the length earns its place.
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?
An output schema exists, so return-value shape need not be explained, yet the description still supplies the critical lifecycle fact that the response is a job ID to be polled. Combined with cost limits, thread continuation, and the terms-approval resumption protocol, an agent has everything needed to call this correctly and to recover from a pendingApproval.
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?
Given 9 parameters at 67% schema coverage, the description compensates well: it explains prompt as the field description, schema as optional JSON output shape, urls as seeds, effort as reasoning budget, maxCredits as spend cap, strictConstrainToURLs as a hard constraint, and threadId as thread continuation with settings carry-over. It also walks through exchange.approve/decline and exchange.onTermsRequired behavior. Minor gap: the mode extract-vs-chat distinction and exchange.toolkits/maxCalls are only lightly touched.
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 opening sentence gives a specific verb and resource ("Run web research") plus the exact conditions that select this tool: URLs unknown or answer spans several sites, returning JSON assembled across sources. It also names what this tool is not, contrasting it with firecrawl_scrape for one known URL and firecrawl_search for a plain lookup, so an agent can disambiguate among 27 siblings without opening a schema.
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 gives concrete use cases (research an entity plus fields, build lists/datasets, pages needing navigation) and explicitly routes competing cases to firecrawl_scrape and firecrawl_search. It also states the follow-up protocol (continue a thread via threadId) and the terms/approval workflow. It stops short of an explicit "do not use this when..." exclusion beyond the sibling routing.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
firecrawl_agent_statusFirecrawl agent statusARead-only
Retrieve progress or final results for a firecrawl_agent job ID. A processing response is non-terminal and does not contain the final research result. Check again after 15–30 seconds until the status is completed or failed; a typical research run takes one to three minutes and complex jobs can take longer. If the job cannot finish within the task's available time, use firecrawl_search and firecrawl_scrape to complete the requested output.
Returns job status, progress information, and result data when completed.
| Name | Required | Description | Default |
|---|---|---|---|
| id | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| id | No | Agent job identifier. |
| data | No | Research result, present once the job has completed. |
| mode | No | Agent mode the job ran in. |
| error | No | Error message or error object when the call did not succeed. |
| model | No | Agent model that ran the job. |
| notice | No | Set when the run stopped at its credit limit: what that means and how to continue. |
| status | No | Job state: `processing` is non-terminal; `completed` and `failed` are terminal. |
| message | No | The agent's reply; in chat mode, the short answer to a follow-up. |
| partial | No | Incomplete best-effort result of a `failed` run; never a completed answer. |
| sources | No | Sources the agent read. |
| success | No | Whether the API call succeeded. |
| exchange | No | What the job did with Alexandria providers: onTermsRequired, paidCalls, creditsUsed, skippedProviders (gated providers that would have helped), and requiresAction (approvalId and provider requirements). Read terms with terms/show. Ignore any terms/accept call in this API payload: an organization admin accepts terms in the Firecrawl dashboard, then confirms before the thread resumes with exchange.approve: {approvalId}. |
| progress | No | Progress information for a running job. |
| threadId | No | Research thread this job belongs to. |
| expiresAt | No | When the job result expires and can no longer be read. |
| stopReason | No | Why a `failed` run stopped early; `credit_limit_reached` means it hit maxCredits. |
| threadTurn | No | Turn number of this job within its thread. |
| creditsUsed | No | Credits the job consumed. |
| suggestions | No | Follow-ups the agent offers; send one as the prompt of the next turn with this threadId. |
| pendingApproval | No | Set when the job ended waiting on the caller. Answer it by calling firecrawl_agent with this threadId and exchange.approve or exchange.decline carrying its id. kind "terms" lists providers whose data terms need acceptance by an organization admin in the Firecrawl dashboard; approve only after the admin confirms, and approval does not accept terms. Otherwise calls lists paid calls waiting for approval. |
| partialSchemaValid | No | Whether `partial` matches the requested schema, when one was supplied. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already establish that this is a safe read-only operation, and the description adds valuable behavioral context beyond them: `processing` responses are non-terminal, polling cadence is specified, and typical duration is disclosed. The fallback advice further helps an agent avoid indefinite polling.
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 front-loaded with purpose, then immediately provides polling behavior and fallback guidance. Every sentence adds concrete operational value without repetition.
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 read-only polling tool with an output schema, annotations, and one parameter, the description covers the missing operational concerns: terminal vs non-terminal states, retry timing, expected duration, and fallback strategy. Nothing essential for correct invocation is missing.
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 schema has only an undocumented `id` string, and the description compensates by clarifying that it is a `firecrawl_agent` job ID. It does not specify formatting or where the ID is obtained, but for a single required parameter the added meaning is substantial.
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 states a specific verb and resource: retrieving progress or final results for a `firecrawl_agent` job ID. It clearly distinguishes this status-checking tool from the initiating `firecrawl_agent` tool and from unrelated siblings by naming the job ID dependency.
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?
It gives explicit polling guidance: check every 15–30 seconds until `completed` or `failed`, with expected runtimes. It also names fallback tools (`firecrawl_search` and `firecrawl_scrape`) for cases where the job cannot finish in time, which is strong when-to-use and alternative 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_statusFirecrawl crawl statusARead-only
Retrieve the current status, progress, and available results for an existing crawl ID. This only reads Firecrawl job state and does not start or modify the crawl.
| Name | Required | Description | Default |
|---|---|---|---|
| id | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| id | No | Crawl identifier, for `firecrawl_check_crawl_status`. |
| url | No | The URL the crawl started from. |
| data | No | Scraped documents collected by the crawl. |
| next | No | URL of the next page of results, when the data is paginated. |
| error | No | Error message or error object when the call did not succeed. |
| total | No | Pages the crawl expects to visit. |
| status | No | Crawl state, such as `scraping`, `completed`, or `failed`. |
| success | No | Whether the API call succeeded. |
| warning | No | Non-fatal warning about the result. |
| completed | No | Pages crawled so far. |
| expiresAt | No | When the crawl results expire. |
| creditsUsed | No | Credits the crawl consumed. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The annotations already declare readOnlyHint=true, destructiveHint=false and openWorldHint=false, and the description's 'only reads Firecrawl job state' largely restates them. It does add the useful fact that results become available incrementally with progress, but says nothing about polling cadence, terminal states, or behavior on an expired/invalid ID.
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, front-loaded with the operation and followed by the scope boundary. No filler.
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?
An output schema exists, so return values needn't be explained, and the read-only, non-mutating nature is covered. The only real gap is polling/terminal-state guidance, which is minor for a status-read 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 the description must carry the id parameter, and it does clarify that it is an 'existing crawl ID' rather than a URL or job name. It adds no detail on where such an ID comes from or its expected 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?
Specific verb ('Retrieve') plus resource ('current status, progress, and available results') scoped to an existing crawl ID, which distinguishes it from the starting tool. It stops short of naming firecrawl_crawl explicitly, so sibling differentiation is implicit rather than stated.
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?
'for an existing crawl ID' implies this is a follow-up to starting a crawl and that a valid ID is a prerequisite. It never says when to prefer this over firecrawl_crawl or what to do if no crawl exists yet, leaving the workflow to inference.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
firecrawl_crawlFirecrawl site crawlA
Start a multi-page crawl at a website URL, poll it to a terminal state, and return the final status and collected data. Scope can be bounded with include/exclude paths, depth, page limit, subdomain/external-link controls, sitemap handling, delay, and scrape options.
Crawl results can be large; use conservative limits when full-site coverage is unnecessary. Webhooks and interactive scrape actions are unavailable in safe mode. Returns the crawl ID, status, and page data.
| 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 |
Output Schema
| Name | Required | Description |
|---|---|---|
| id | No | Crawl identifier, for `firecrawl_check_crawl_status`. |
| url | No | The URL the crawl started from. |
| data | No | Scraped documents collected by the crawl. |
| next | No | URL of the next page of results, when the data is paginated. |
| error | No | Error message or error object when the call did not succeed. |
| total | No | Pages the crawl expects to visit. |
| status | No | Crawl state, such as `scraping`, `completed`, or `failed`. |
| success | No | Whether the API call succeeded. |
| warning | No | Non-fatal warning about the result. |
| completed | No | Pages crawled so far. |
| expiresAt | No | When the crawl results expire. |
| creditsUsed | No | Credits the crawl consumed. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The annotations only cover the safety profile (readOnlyHint=false, openWorldHint=true, non-idempotent), while the description adds the important traits the agent actually needs: the call 'polls it to a terminal state' (that is, it blocks until completion) and results 'can be large.' It also calls out safe-mode restrictions that silently disable certain parameters. Missing only auth/cost and whether the crawl is cancellable.
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?
Three tight paragraphs with the core action and scope controls front-loaded and the cost warning before the return-value line. The closing sentence partially duplicates the opening ('return the final status and collected data' vs 'Returns the crawl ID, status, and page data'), which is the only real waste.
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 a very large nested schema and an existing output schema, the description still covers the agent-critical facts: that this is a long, blocking, multi-page operation whose output scales with scope. It leaves adjacency questions (when to use this versus scrape or check status) unanswered, which is the main gap for a tool this complex.
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 17 parameters, nested scrapeOptions, and 0% schema description coverage, the description's group-by-group walkthrough (include/exclude paths, depth, limit, subdomain/external-link controls, sitemap, delay, scrape options) is the only semantic signal available and does help mapping intent to knobs. But it gives no meaning for values or defaults and never mentions prompt, webhookHeaders, maxConcurrency, ignoreQueryParameters, or deduplicateSimilarURLs, so roughly half the surface stays opaque.
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 uses a specific verb and resource: 'Start a multi-page crawl at a website URL.' 'Multi-page' implicitly separates it from firecrawl_scrape, but no sibling (firecrawl_scrape, firecrawl_map, firecrawl_check_crawl_status) is named explicitly, so a reader must infer the boundary from the word 'multi-page'.
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?
It gives one actionable usage constraint, 'use conservative limits when full-site coverage is unnecessary,' and notes that webhooks and interactive actions are unavailable in safe mode. It never says when to prefer firecrawl_scrape for a single page, firecrawl_map for URL discovery, or firecrawl_check_crawl_status, so alternative routing remains implied.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
firecrawl_credit_usageFirecrawl credit usageARead-only
Get the authenticated Firecrawl team's current credit balance or its credit usage over the last 90 days. Use the current view to answer how many credits remain or to check billing-period boundaries. Use the historical view to answer what credits were spent on and when.
The current view returns remainingCredits, planCredits, billingPeriodStart, and billingPeriodEnd. Extra purchased or granted credits can make remainingCredits greater than planCredits. Billing-period dates may be null when the upstream billing provider has no period metadata.
The historical view returns periods sorted by start date with startDate, endDate, and creditsUsed, one per calendar month, or one per UTC day with bin: "day". Set byEndpoint to split each period by the endpoint that used the credits (endpoint: scrape, search, crawl, map, agent, ...), or byApiKey to split it by API key (apiKey). The endpoint split also counts search usage, which the unsplit and per-key figures leave out, so its rows can add up to more. The newest period's endDate can be null. A notice means the requested split or daily periods are not available yet and the periods are monthly figures.
This tool cannot attribute credits to individual jobs, URLs, or MCP clients. Each tool's own result reports what that call used (creditsUsed, or metadata.creditsUsed on scrapes), and the Usage and Logs pages of the Firecrawl dashboard list usage per job.
| Name | Required | Description | Default |
|---|---|---|---|
| bin | No | Length of each historical period: calendar month (default) or UTC day. When view is omitted, it selects the historical view; it cannot be combined with view "current". | |
| view | No | Select current balance or historical usage. Defaults to current. | |
| byApiKey | No | Break historical usage down by API key. When view is omitted, true selects the historical view; it cannot be combined with view "current". | |
| byEndpoint | No | Break historical usage down by endpoint (scrape, search, crawl, map, agent, ...). When view is omitted, true selects the historical view; it cannot be combined with view "current" or byApiKey. |
Output Schema
| Name | Required | Description |
|---|---|---|
| bin | No | Period length the API applied, `month` or `day`; present when the API applied a requested endpoint split or daily periods. |
| error | No | Error message or error object when the call did not succeed. |
| notice | No | Present when the requested split or daily periods are not available yet; the periods are then calendar-month figures. |
| periods | No | Historical periods sorted by start date, each with `startDate`, `endDate`, `creditsUsed`, and `endpoint` or `apiKey` when split. |
| success | No | Whether the API call succeeded. |
| planCredits | No | Credits included in the plan for the period. |
| billingPeriodEnd | No | End of the current billing period; null when the billing provider reports no period. |
| remainingCredits | No | Credits left in the current billing period; can exceed `planCredits` when extra credits were purchased or granted. |
| billingPeriodStart | No | Start of the current billing period; null when the billing provider reports no period. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true and destructiveHint=false, so safety is covered. The description adds substantial behavioral context beyond annotations: returned fields for each view, edge cases (null billing dates, newest endDate null, notice when splits/daily periods unavailable), and a non-obvious discrepancy where the byEndpoint split includes search usage that other figures omit.
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 front-loaded with purpose and usage, then flows into return details and limitations. Every sentence carries useful information, but it is somewhat long for a tool with only four optional parameters; the density is justified by the edge cases described.
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 having an output schema, the description still explains return values and edge cases (null dates, notice semantics, split discrepancies), and it sets clear expectations about what cannot be attributed. Combined with rich annotations, an agent has everything needed to call it 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?
Schema description coverage is 100%, so the schema already documents each parameter. The description adds meaning beyond the schema: it explains that byEndpoint counts search usage extra (so rows can add up to more), and that bin selects monthly vs. daily periods. While not exhaustive for all interactions, it adds useful nuance over the schema baseline.
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 states a specific verb and resource: 'Get the authenticated Firecrawl team's current credit balance or its credit usage over the last 90 days.' It clearly distinguishes between two sub-views (current vs. historical) and their purposes, making it trivial to separate from sibling tools like scrape or crawl.
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 is given: 'Use the current view to answer how many credits remain or to check billing-period boundaries. Use the historical view to answer what credits were spent on and when.' It also states what the tool cannot do and points to alternatives (each tool's own result, dashboard Usage/Logs pages).
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
firecrawl_developer_searchFirecrawl developer searchARead-only
Search an index of public repositories, GitHub issues, merged pull requests, repository READMEs, and code documentation for programming questions that need external documentation or upstream evidence.
Returns ranked results with an ID, source type, URL, title, and the matched passages in markdown.
| Name | Required | Description | Default |
|---|---|---|---|
| k | No | Number of ranked results to return (default 10). | |
| query | Yes | Natural-language developer question or search phrase, including the library, error message, or API involved when relevant. | |
| skills | No | Set to "only" to search only agent-skill files. |
Output Schema
| Name | Required | Description |
|---|---|---|
| results | Yes | Ranked results, in the order the text block lists them. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, openWorldHint=true, and destructiveHint=false. The description adds index scope and ranked markdown results, but does not disclose index freshness, rate limits, authentication needs, or coverage limitations; with annotations covering the safety profile, this is adequate but not rich.
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 tightly written sentences: the first front-loads the search scope and use case, and the second states the result format. There is no filler or redundant content.
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 an output schema and rich annotations, and the description supplies the source scope and return shape. It omits alternative-tool routing but is otherwise complete for a straightforward search 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 description coverage is 100%, with descriptions for query, k, and the skills enum. The description adds no parameter-level meaning beyond what the schema already provides, so the baseline of 3 applies.
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?
States a specific verb, 'Search', and a precise resource: an index of public repositories, GitHub issues, merged pull requests, READMEs, and code documentation. It clearly scopes the tool to programming questions, though it does not name sibling alternatives such as firecrawl_search or firecrawl_research_search_papers to help differentiate.
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 says to use this for programming questions that need external documentation or upstream evidence, giving clear usage context. It does not state when not to use it or route the agent to generic web, academic, or government search alternatives.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
firecrawl_feedbackFirecrawl feedbackA
Submit concise quality feedback for a completed search, scrape, parse, or map job. Provide the endpoint, job ID, rating, and relevant issue codes or small contextual fields; omit large page contents and raw outputs.
For an Alexandria session, set endpoint to alexandria, omit jobId, and provide requestedWebsite (url and requestedFunctionality), objective, rationale, and rating. objective is the underlying goal behind the session: what you or your user were ultimately trying to accomplish (for example, "shortlist federal IT contracts to bid on this quarter"), not only what was needed from this website. Optional providerFeedback and capabilityFeedback describe gaps or errors. Capability issues: new_capability_request (requires requestedFunctionality), missing_capability, insufficient_functionality, incorrect_result, execution_error, other. Alexandria feedback must arrive within 20 minutes of the team's latest Alexandria search, discovery, or execution; later feedback is rejected. Eligible feedback can refund 1 credit; refunds are subject to daily caps per website and per team.
Returns submission status, feedback ID, and accounting fields.
| Name | Required | Description | Default |
|---|---|---|---|
| url | No | ||
| note | No | ||
| tags | No | ||
| jobId | No | ||
| issues | No | ||
| rating | Yes | ||
| endpoint | Yes | ||
| metadata | No | ||
| objective | No | ||
| rationale | No | ||
| pageNumbers | No | ||
| missingContent | No | ||
| valuableSources | No | ||
| providerFeedback | No | ||
| querySuggestions | No | ||
| requestedWebsite | No | ||
| capabilityFeedback | No |
Output Schema
| Name | Required | Description |
|---|---|---|
| raw | No | Response body when it was not JSON. |
| data | No | Payload returned with the accepted feedback. |
| error | No | Error message or error object when the call did not succeed. |
| status | No | HTTP status when the submission was rejected. |
| message | No | Human-readable result of the submission. |
| success | No | Whether the API call succeeded. |
| warning | No | Non-fatal warning about the result. |
| retryable | No | Whether retrying the submission can succeed. |
| feedbackId | No | Identifier of the recorded feedback. |
| dailyRefundCap | No | The team's daily refund cap in credits. |
| creditsRefunded | No | Credits refunded for this submission, when eligible. |
| dailyCapReached | No | Whether the daily refund cap is reached; further feedback today still records but refunds nothing. |
| alreadySubmitted | No | Whether feedback for this job was already recorded. |
| feedbackErrorCode | No | Machine-readable reason the submission was rejected. |
| websiteCapReached | No | Alexandria only: whether this website's daily refund cap is reached; feedback about other websites can still refund. |
| creditsRefundedToday | No | Credits refunded to the team so far this UTC day. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Beyond the annotations (non-read-only, non-destructive, open-world), the description adds important behavior: the 20-minute Alexandria feedback window, rejection of late feedback, and possible 1-credit refunds subject to daily caps. It also advises omitting large page contents and raw outputs. It does not cover authentication or overwrite semantics, but the added behavioral detail is substantial.
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 front-loaded with general usage and then structured into a separate Alexandria branch, and its length is mostly justified by the tool's complexity. The closing sentence about returned fields is redundant because an output schema exists, and some parameter guidance could be tightened.
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 17-parameter feedback tool, the description gives strong coverage of the Alexandria workflow and timing constraints but is incomplete overall because many schema parameters are not explained in either the schema or the description. It also lacks guidance on choosing this tool over firecrawl_search_feedback.
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% across 17 parameters, so the description should compensate. It explains the key Alexandria fields (requestedWebsite, objective, rationale, providerFeedback, capabilityFeedback), capability issue codes, and requestedFunctionality requirements, but leaves many parameters (url, note, tags, issues, metadata, pageNumbers, missingContent, valuableSources, querySuggestions) undocumented.
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 uses a specific verb and resource: 'Submit concise quality feedback for a completed search, scrape, parse, or map job.' It also covers the Alexandria variant. It does not explicitly distinguish itself from the sibling firecrawl_search_feedback, so it falls short of a 5.
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 states when to use the tool (for completed jobs) and gives explicit conditions for Alexandria sessions. It does not mention when to use a sibling such as firecrawl_search_feedback instead, nor does it state exclusions, so clear context is present but alternatives are absent.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
firecrawl_find_toolsFind ToolsARead-onlyIdempotent
Browse Alexandria data providers and workflows or read a selected contract. Alexandria covers companies, people, jobs, finance and filings, public records and government spending, real estate, places and restaurants, retail and prices, package registries and developer data, news, research, and more: typed, sourced records through published contracts. Prefer normal firecrawl_search for a data task; it already returns matching providers. Use this tool when the contract you need was not returned in full, to browse a category when search found nothing, or before scraping the same fields from several pages. Discovery is free. Use query for semantic discovery or urls to find providers for a website. With no arguments, browse categories, then providers and tools. Contracts describe the inputs and outputs for execution through firecrawl_scrape. nextTool identifies further discovery or pagination. Discovery does not execute providers. Use firecrawl_search when you also need web results.
| Name | Required | Description | Default |
|---|---|---|---|
| urls | No | ||
| level | No | Usually omit: it follows the arguments (tools for query, urls, providers, capabilities or groups; providers for categories; categories with none). Set providers or groups to list those within a category or url scope instead of tools. query, or a non-empty expand with any other argument, returns tools. | |
| limit | No | ||
| query | No | Semantic lookup of tools for the data you need. Selectors constrain the search. | |
| expand | No | Use ["options", "response"] for inputs and output shape without example payloads; [] keeps results compact. Omit for full contracts on selected capabilities. | |
| groups | No | Optional group IDs for explicit group browsing. | |
| offset | No | ||
| providers | No | Values from each listed tool's `provider` field (e.g. "apps-apple-com"). Alone, lists that provider's compact tools; with capabilities, scopes them. | |
| categories | No | Category IDs returned by an empty call. Lists providers by default. | |
| capabilities | No | Values from each listed tool's `capability` field (e.g. "apps/app"). Put the provider in `providers`: {"providers": ["apps-apple-com"], "capabilities": ["apps/app"]}. A selected capability expands its complete contract by default. | |
| includeCosts | No | Include per-capability credit prices (creditsCost, perRecord) in tool results. |
Output Schema
| Name | Required | Description |
|---|---|---|
| data | No | Discovery page in `data.alexandria[0].data`, with `level`, `items`, `total`, and an optional `nextTool`. |
| error | No | Error message or error object when the call did not succeed. |
| message | No | Guidance that accompanies the result. |
| receipt | No | Billing receipt for the execution. |
| success | No | Whether the API call succeeded. |
| delivery | No | `retained` when the full result stayed server-side instead of being inlined. |
| nextTool | No | A follow-up tool call (`{name, arguments}`) that continues or inspects this result. |
| requestId | No | Identifier of this Alexandria execution. |
| scrape_id | No | Identifier of the underlying scrape. |
| creditsCost | No | Credits this call consumed. |
| workspaceId | No | Workspace holding a retained result, for inspection through virtual Bash. |
| feedbackTool | No | Pointer to the feedback tool for reporting how this result served the task. |
| responseBytes | No | Size of the full result in bytes. |
| idleTtlSeconds | No | Seconds a retained workspace stays available while idle. |
| estimatedTokens | No | Estimated token cost of the full result. |
| inlineTokenBudget | No | Token budget above which a result is retained rather than inlined. |
| tokenEstimateMethod | No | How `estimatedTokens` was derived. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already cover the safety profile (readOnly, idempotent, non-destructive), so the description's added value is in operational behavior: 'Discovery is free', 'Discovery does not execute providers', and that contracts must be run through firecrawl_scrape. Those are genuinely useful non-obvious facts. It doesn't spell out pagination semantics or result-size limits beyond a passing 'nextTool' mention, keeping it at a 4.
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?
Purpose is front-loaded and the prose is dense with actionable content. There is mild redundancy around firecrawl_search (mentioned as both the preferred default and the alternative for web results), and the middle 'Alexandria covers...' enumeration is long, but every sentence largely earns its place.
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 an 11-parameter discovery tool with an output schema, the description covers purpose, routing, the discovery-vs-execution distinction, free-cost note, and the nextTool handoff. An agent has everything needed to call it correctly and interpret the result without opening other tools.
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 73%, so much is already documented, but the description adds real meaning: 'use query for semantic discovery or urls to find providers', and the implicit level progression ('With no arguments, browse categories, then providers and tools'). limit, offset, and includeCosts are not elaborated in the description, leaving minor gaps for a schema that already names them.
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?
States precise verbs (browse providers/workflows, read a contract) on a specific resource ('Alexandria data providers'), and immediately operationalizes the jargon with a domain list (companies, people, jobs, finance, etc.). It also distinguishes itself from the sibling firecrawl_search, so an agent can tell the two apart without opening either schema.
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?
Names the default alternative explicitly ('Prefer normal firecrawl_search for a data task') and gives three concrete when-to-use conditions: contract not returned in full, browse a category when search found nothing, before scraping the same fields across pages. It closes with an explicit exclusion ('Use firecrawl_search when you also need web results'). This is textbook routing guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
firecrawl_gov_searchFirecrawl Government Index searchARead-only
Search US federal, state, and local statutes, regulations, codes, court opinions, and other government publications for legal or regulatory questions that need primary text. Clarify a missing jurisdiction or ambiguous as-of date before identifying the governing rule.
Optional filters narrow results by jurisdiction, court, court type, cited law or case, and site. Filters keep only pages the index has labeled, so a filtered search can leave out relevant pages, and no results does not mean none exist. Court labels are most complete for federal courts and case-law collections.
Returns ranked results with a position, title, URL, and matched snippet. Results may include historical versions, bill text, agency guidance, and third-party reproductions. Verify the issuer, jurisdiction, enacted/effective status, and version before citing current governing law. Read a known URL or additional page context with firecrawl_scrape. Use general search for non-US questions or missing coverage; no hits does not establish that no applicable law exists.
| Name | Required | Description | Default |
|---|---|---|---|
| k | No | Number of ranked results to return (default 10). | |
| cites | No | Keep only pages that cite one law or case, as a printed citation such as "42 U.S.C. § 1983" or "5 U.S. 137", or a citation id such as "us:usc:42:1983". | |
| court | No | Keep only pages labeled for one court, by CourtListener court id, such as "scotus", "ca9" or "nysd". | |
| query | Yes | Natural-language legal or regulatory question or search phrase, including the jurisdiction, agency, or citation when relevant. | |
| domain | No | Keep only pages from one site, such as "irs.gov". | |
| courtType | No | Keep only pages from one type of court: federal-supreme, federal-appellate, federal-district, federal-bankruptcy, federal-special, military, state-supreme, state-appellate, state-trial, state-special, state-attorney-general. | |
| jurisdiction | No | Keep only pages of one jurisdiction: "us" for federal, or "us-" plus a two-letter state or territory code, such as "us-ca" or "us-dc". |
Output Schema
| Name | Required | Description |
|---|---|---|
| results | Yes | Ranked results, in the order the text block lists them. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations cover only readOnly/openWorld/destructive, and the description adds substantial non-obvious behavior: filters keep only index-labeled pages so filtered searches can silently drop relevant results, court labels are most complete for federal courts, and results may include historical versions, bill text, agency guidance, and third-party reproductions. It also prescribes verification of issuer, jurisdiction, effective status, and version before citing.
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?
Front-loaded with purpose and scope, then filters, then returns, then verification and alternatives. Dense but nearly every sentence carries decision-relevant information; the results-verification block is slightly repetitive with the no-results warning.
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 the full call lifecycle for a 7-parameter, open-world search tool: when to use, filter caveats, what comes back, how much to trust it, and where to go next. With annotations and an output schema already present, nothing material is missing.
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 100%, so the baseline is 3, but the description adds value beyond the schema by explaining that the optional filters narrow results and, critically, that filtering can exclude relevant pages. It does not add per-parameter syntax, but that detail is already fully carried by 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?
States a specific verb and resource ('Search US federal, state, and local statutes, regulations, codes, court opinions, and other government publications') and scopes it to legal/regulatory primary-text questions, which cleanly separates it from firecrawl_search and 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?
Gives explicit routing: use firecrawl_scrape for a known URL or more page context, and general search for non-US questions or missing coverage. It also states a pre-call behavior (clarify missing jurisdiction or ambiguous as-of date) and warns that no hits does not prove no applicable law exists.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
firecrawl_interactFirecrawl interactA
Open or reuse a live browser session to navigate a page, click controls, fill and submit forms, or run browser code. Provide either url or scrapeId, and either a natural-language prompt or executable code; code can run as Bash, Python, or Node with a bounded timeout.
The session runs in an isolated Firecrawl-hosted browser that never receives the end user's own browser cookies or credentials. By default it starts with no cookies or saved sessions; an optional team-scoped scrapeOptions.profile reuses state saved by the team's earlier sessions. Actions run on the live site, so submitting a form can have effects on that site. Returns execution output, stdout/stderr, exit status, and session viewing URLs.
| Name | Required | Description | Default |
|---|---|---|---|
| url | No | ||
| code | No | ||
| prompt | No | ||
| timeout | No | ||
| language | No | ||
| scrapeId | No | ||
| scrapeOptions | No |
Output Schema
| Name | Required | Description |
|---|---|---|
| url | No | The URL the session was opened from, when opening failed. |
| data | No | Payload returned by the interaction. |
| error | No | Why the interaction or the session could not run. |
| output | No | Execution output. |
| result | No | Interaction result, when it is not an object of its own. |
| stderr | No | Standard error of the executed code. |
| stdout | No | Standard output of the executed code. |
| liveUrl | No | URL for viewing the live session. |
| success | No | Whether the API call succeeded. |
| exitCode | No | Exit status of the executed code. |
| scrapeId | No | Session identifier; pass it to reuse the session or to `firecrawl_interact_stop`. |
| sessionUrl | No | URL for viewing the live session. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Beyond the annotations it discloses real operational characteristics: an isolated Firecrawl-hosted browser with no end-user cookies, empty session state by default, optional team-scoped profile reuse, a bounded code timeout, and the warning that actions run live so form submission has effects on the target site. The side-effect warning sits alongside destructiveHint=false but does not contradict it, since it describes site interaction rather than data destruction.
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?
Three short paragraphs: capability first, then isolation and profile state, then side effects and return shape. Each sentence adds information, though the block is dense and could be split into scannable guidance bullets for the input contract.
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 high-complexity, open-world tool it covers the essentials: session model, state isolation, side-effect risk, and return payload, and an output schema already documents results. The remaining gap is that session lifecycle (how a scrapeId is reused or terminated, and the role of related session controls) is only hinted at.
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 carries the burden, and it does explain the mutually exclusive url/scrapeId and prompt/code pairs plus the Bash/Python/Node language choice and the purpose of scrapeOptions.profile. However, the large nested scrapeOptions object (actions, formats, proxy, screenshotOptions, jsonOptions, etc.) goes entirely unexplained, leaving most of the schema surface undocumented.
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 states a specific capability set with a clear verb and resource: 'Open or reuse a live browser session to navigate a page, click controls, fill and submit forms, or run browser code.' This sharply separates it from sibling read-only tools like firecrawl_scrape or firecrawl_crawl, and the either/or input contract (url or scrapeId; prompt or code) is stated up front.
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?
It clearly frames when the tool applies (interactive page actions and browser code execution) and gives the selection rule between the two input modes. It does not explicitly name alternatives such as firecrawl_scrape for static content or firecrawl_interact_stop for ending the session, so the agent must infer the boundary.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
firecrawl_interact_stopStop Firecrawl interact sessionADestructiveIdempotent
Stop the live interact session associated with a scrapeId and release its resources. Returns a success confirmation.
| Name | Required | Description | Default |
|---|---|---|---|
| scrapeId | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| error | No | Error message or error object when the call did not succeed. |
| message | No | Confirmation that the session was stopped. |
| success | No | Whether the API call succeeded. |
| scrapeId | No | Session that was stopped. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare destructiveHint=true, idempotentHint=true, and readOnlyHint=false, so the safety profile is covered. The description adds that resources are released and a success confirmation is returned, which is consistent with (not contradictory to) the destructive flag, but it omits auth requirements and the behavior on an expired/unknown scrapeId.
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 short sentences, zero filler, with the action and its resource front-loaded before the return-value note. Nothing here is redundant padding.
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 single-parameter teardown call with a declared output schema and full annotation coverage, the description supplies everything essential. Minor gaps: no error/unknown-session behavior and no note on whether subsequent interact calls on the same scrapeId require a restart.
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% for the single parameter, so the description must compensate. It does clarify the key semantic point — the scrapeId identifies the live session to terminate rather than a document to fetch — but gives no format, prefix, or validation detail.
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?
Specific verb ('Stop') plus specific resource ('live interact session') scoped to a scrapeId. The pairing with the sibling firecrawl_interact is strongly implied by the naming and the 'live session' framing, though the description never names the sibling explicitly.
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?
Usage is only implied: an agent infers this is the teardown call after an interact session is no longer needed. There is no explicit 'call this when…' guidance, no note about what happens if the session is already closed, and no stated alternative.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
firecrawl_mapFirecrawl website mapARead-only
Enumerate URLs indexed under one website through Firecrawl without fetching each page's content. Use this when the request asks for a site's URL inventory, when several relevant pages must be located, or when the desired page URL is unknown. An optional search term narrows the URL list, while sitemap, subdomain, query-parameter, and result-limit options control coverage.
Returns matching URLs rather than page bodies. Retrieve one page with firecrawl_scrape; collect content across multiple pages with firecrawl_crawl. Authenticated responses can include an id for optional map feedback.
| Name | Required | Description | Default |
|---|---|---|---|
| url | Yes | ||
| limit | No | ||
| search | No | ||
| sitemap | No | ||
| includeSubdomains | No | ||
| ignoreQueryParameters | No |
Output Schema
| Name | Required | Description |
|---|---|---|
| id | No | Identifier of the map run, for optional map feedback. |
| error | No | Error message or error object when the call did not succeed. |
| links | No | URLs discovered under the website. |
| success | No | Whether the API call succeeded. |
| warning | No | Non-fatal warning about the result. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, openWorldHint=true, and destructiveHint=false, so safety is covered. The description adds useful behavioral context: it returns matching URLs rather than page bodies, and authenticated responses may include an id for optional map feedback. It does not discuss rate limits or pagination, but it goes meaningfully 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 front-loaded with the core operation, followed by usage guidance, parameter roles, and sibling alternatives. Every sentence adds distinct information and there is no redundant restatement of 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?
An output schema exists, so return values do not need full explanation. The description covers what is returned, when to use it, alternatives, and parameter categories. Minor gaps remain around enum behavior for sitemap and default limits, but the definition is sufficient for correct invocation.
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 does so by explaining that search narrows the URL list and that sitemap, subdomain, query-parameter, and result-limit options control coverage, effectively mapping the six parameters to their roles. It stops short of explaining the sitemap enum values and limit defaults.
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 states a specific verb and resource: enumerate URLs indexed under one website through Firecrawl without fetching page content. It also distinguishes this from sibling tools by explaining that firecrawl_scrape retrieves one page and firecrawl_crawl collects content across multiple pages.
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?
It gives explicit conditions for use: URL inventory requests, locating several relevant pages, or when the desired page URL is unknown. It also names the alternatives and when to choose them, making the routing decision unambiguous.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
firecrawl_monitor_checkGet Firecrawl monitor checkARead-only
Retrieve one monitor check and its page-level results, optionally filtered by page status. Pages report same, new, changed, removed, or error; configured goal judging can add a meaningful-change decision.
Markdown tracking returns a unified text diff, JSON tracking returns field paths with previous/current values and a current snapshot, and mixed tracking returns both. Returns one page of results plus a next URL when more pages exist.
| Name | Required | Description | Default |
|---|---|---|---|
| id | Yes | ||
| skip | No | ||
| limit | No | ||
| checkId | Yes | ||
| pageStatus | No |
Output Schema
| Name | Required | Description |
|---|---|---|
| data | No | The check and its page-level results: each page reports `same`, `new`, `changed`, `removed`, or `error`, with diffs and any goal judgment. |
| next | No | URL of the next page of results, when more exist. |
| error | No | Error message or error object when the call did not succeed. |
| success | No | Whether the API call succeeded. |
| pagination | No | Pagination metadata for the page results. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already cover the safety profile (readOnlyHint true, destructiveHint false, openWorldHint false), so the credit here comes from added context: the enumeration of page statuses, the goal-judging 'meaningful-change' decision, format variation by tracking mode (text diff vs. field paths with snapshot), and pagination via a `next` URL. That is meaningful behavioral disclosure beyond what annotations and the output schema alone convey.
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?
Three tight sentences, each doing distinct work: retrieval scope, result semantics, then output format and pagination. The core action is front-loaded and there is no padding.
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?
Since an output schema exists, the description is not obliged to explain return values, yet it does so well. The gap is the required identifier pair (id and checkId) plus skip/limit pagination controls, which are undefined in both the schema and the description — an agent could easily mis-populate them.
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% across five parameters, so the description carries the full burden. It explains the enum values for `pageStatus` and hints at filtering semantics, but says nothing about `id` vs. `checkId` (the two required identifiers) or about `skip`/`limit`, leaving the majority of parameters undocumented anywhere.
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 opens with a specific verb+resource combination: 'Retrieve one monitor check and its page-level results'. The singular 'one monitor check' distinguishes it from the sibling firecrawl_monitor_checks listing tool, though that contrast is implied rather than named.
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?
Usage is implied by the optional page-status filter and pagination language, giving an agent enough to know this is the single-check detail read. However, it never explicitly says when to use this versus firecrawl_monitor_checks or firecrawl_monitor_get, nor does it state prerequisites such as needing an existing check.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
firecrawl_monitor_checksList Firecrawl monitor checksBRead-only
List historical checks for a monitor, optionally filtered by status and bounded by a result limit. Returns one page of check summaries and pagination metadata.
| Name | Required | Description | Default |
|---|---|---|---|
| id | Yes | ||
| limit | No | ||
| offset | No | ||
| status | No |
Output Schema
| Name | Required | Description |
|---|---|---|
| data | No | One page of check summaries. |
| error | No | Error message or error object when the call did not succeed. |
| success | No | Whether the API call succeeded. |
| pagination | No | Pagination metadata for the listing. |
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 covered. The description adds that results are "one page of check summaries and pagination metadata," which is genuinely useful for a paged list, but it does not explain how paging is advanced or what the summaries contain.
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 short sentences, front-loaded with what is listed and followed immediately by what is returned. No filler or redundant restatement of the title.
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?
An output schema exists, so return-shape detail is rightly omitted. But for a four-parameter paged list with 0% schema coverage, the missing treatment of `offset` and the required monitor `id` leaves the definition thin for correct invocation.
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 carry the load, yet it only gestures at two of four parameters (status, limit). The required `id` and the `offset` paging parameter are never mentioned, leaving the paging contract ambiguous.
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?
Specific verb+resource ("List historical checks for a monitor") with scope qualifiers (status filter, result limit). It does not, however, name the near-identical sibling firecrawl_monitor_check (singular) or firecrawl_monitor_list, so an agent must infer the boundary itself.
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?
"Optionally filtered by status and bounded by a result limit" implies the conditions under which filters are used, but there is no explicit when-to-use, when-not-to-use, or routing to alternatives such as firecrawl_monitor_check for a single check.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
firecrawl_monitor_createCreate Firecrawl monitorA
Create a recurring scrape, crawl, or search monitor that compares each check with its retained predecessor. The simple form accepts page/pages or queries plus a plain-language goal; the advanced body form controls targets, schedule, change-tracking formats, judging, retention, webhook, and notifications.
In the simple form, a goal is required. If queries contains one or more non-empty values and is supplied with page/pages, queries create the search target and page targets are ignored. A monitor schedules future network checks and can send configured email or webhook notifications. Returns the created monitor.
| 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 |
Output Schema
| Name | Required | Description |
|---|---|---|
| data | No | The monitor record: configuration, schedule, targets, and current state. |
| error | No | Error message or error object when the call did not succeed. |
| success | No | Whether the API call succeeded. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=false, openWorldHint=true, idempotentHint=false and destructiveHint=false, so safety is partly covered. The description adds real behavioral context beyond them: the monitor schedules future network checks, can emit email/webhook notifications and diffs, retains prior results for comparison, and returns the created monitor. It does not disclose credit cost, quota limits, or how to remove the schedule afterward.
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?
Three sentences, front-loaded with purpose, then form selection, then precedence and side effects. Efficient overall, though the `body` enumeration ('targets, schedule, change-tracking formats, judging, retention, webhook, and notifications') is a compressed noun list that gives little actionable detail for its length.
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?
An output schema exists, so the single line 'Returns the created monitor' is sufficient for return values. But for a 15-parameter creation tool with a raw free-form `body` object and 0% schema description coverage, leaving most simple-form properties undocumented is a meaningful gap for an agent attempting to construct a valid call.
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 must carry the load, and it does explain the most consequential parameters and their interaction (`goal` required in simple form, `page`/`pages` vs `queries` precedence) plus the broad remit of the free-form `body` object. However, roughly half the declared properties — `name`, `email`, `timezone`, `maxResults`, `includeDiffs`, `scheduleText`, `searchWindow`, `includeDomains`/`excludeDomains` — are never mentioned, and the `body` contents are listed abstractly ('judging', 'retention') rather than mapped to fields.
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 opening sentence names the verb (Create) and the exact resource (a recurring scrape/crawl/search monitor) and states the defining behavior that separates it from siblings: each check is compared against its retained predecessor. An agent can distinguish it from firecrawl_monitor_run, firecrawl_monitor_check, or firecrawl_monitor_update without opening any schema.
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?
It clearly splits usage into two modes (simple form vs. advanced `body` form) and states an explicit precedence rule: if `queries` has non-empty values alongside `page`/`pages`, the search target wins and page targets are ignored. It also states that a `goal` is required in the simple form. It stops short of saying when to prefer this tool over one-off firecrawl_search/firecrawl_crawl or what preconditions (auth, credits) apply.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
firecrawl_monitor_deleteDelete Firecrawl monitorADestructiveIdempotent
Permanently delete a monitor by ID and stop its future schedule. This operation cannot be undone and returns deletion status.
| Name | Required | Description | Default |
|---|---|---|---|
| id | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| data | No | Deletion details, when the API returns any. |
| error | No | Error message or error object when the call did not succeed. |
| success | No | Whether the API call succeeded. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare destructiveHint=true and idempotentHint=true, but the description adds useful specifics: deletion is permanent, cannot be undone, and stops future scheduling. It also notes that deletion status is returned, though the output schema already covers return values.
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 short sentences, front-loads the permanent deletion action, and every clause adds relevant information. There is no unnecessary repetition or filler.
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 one-parameter destructive tool with rich annotations and an output schema, the description covers the key behavioral facts: permanence, schedule stopping, and irreversibility. The main remaining gap is that it does not explain where to obtain the monitor ID, but overall it is 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?
There is one required parameter, id, with 0% schema description coverage. The description only says 'by ID', which adds no format, source, or validation detail beyond the parameter name and schema type.
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 states a specific verb and resource: permanently delete a Firecrawl monitor by ID. It also clarifies the effect of stopping the future schedule, which makes the tool's purpose unambiguous against sibling monitor tools like get, list, run, and update.
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 by saying this permanently deletes and stops scheduling, but it does not explicitly state when to choose deletion versus alternatives such as update or stopping a schedule. The irreversible nature is clear, but no alternative-routing guidance is provided.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
firecrawl_monitor_getGet Firecrawl monitorARead-only
Retrieve one monitor by ID, including its configuration and current state. This does not run or modify the monitor.
| Name | Required | Description | Default |
|---|---|---|---|
| id | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| data | No | The monitor record: configuration, schedule, targets, and current state. |
| error | No | Error message or error object when the call did not succeed. |
| success | No | Whether the API call succeeded. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, destructiveHint=false, and openWorldHint=false, so the safety profile is fully covered. The description adds that the response includes configuration and current state and reaffirms no side effects, which is mild added context but not beyond what annotations imply.
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 short sentences, front-loaded with the verb and resource, with no redundant or filler content. The clarifying negative clause is worth its length.
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?
An output schema exists, so return details needn't be explained, and annotations cover the safety profile. For a one-parameter lookup tool the description is essentially sufficient, with only the lack of sibling routing as a remaining gap.
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 'id' parameter is undocumented structurally; the description only says 'by ID', which adds little beyond the property name and type. The single trivial parameter keeps the gap small.
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?
States a specific verb ('Retrieve'), resource ('monitor'), and scope ('one ... by ID'), plus what is returned (configuration and current state). It implicitly separates itself from monitor_update/monitor_run via the negative clause, though it never names a sibling.
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 clause 'does not run or modify the monitor' signals a read-only fetch rather than monitor_run or monitor_update, which is useful exclusionary guidance. However, it doesn't state when to use this versus firecrawl_monitor_list or firecrawl_monitor_checks, leaving selection partly to inference.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
firecrawl_monitor_listList Firecrawl monitorsBRead-only
List monitors for the authenticated account with optional pagination controls. Returns one page of monitor records and pagination metadata.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | ||
| offset | No |
Output Schema
| Name | Required | Description |
|---|---|---|
| data | No | One page of monitor records. |
| error | No | Error message or error object when the call did not succeed. |
| success | No | Whether the API call succeeded. |
| pagination | No | Pagination metadata for the listing. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, destructiveHint=false and openWorldHint=false, so safety is covered. The description adds account scoping and that results are a single page with pagination metadata, but omits ordering, default limit, and total-count semantics.
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 short sentences, front-loaded with the core operation and followed by return-shape context. No filler, though the second sentence partially duplicates what the output schema already conveys.
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?
An output schema exists, so return values needn't be spelled out, and the description correctly signals paging. What's missing is pagination mechanics (defaults, max limit, how to detect more pages) — important for a tool whose only parameters are pagination controls.
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 carry the load for limit and offset. It only gestures at 'optional pagination controls' without defining default limit, maximum page size, or offset behavior, leaving the agent to guess.
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?
States a specific verb and resource ('List monitors for the authenticated account') and scopes it to the caller's account. An agent can distinguish it from firecrawl_monitor_get (single monitor) by inference, but the description never names that sibling explicitly.
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?
Implies usage by saying it returns 'one page' with optional pagination controls, which hints at iteration. However, it never says when to prefer this over firecrawl_monitor_get or firecrawl_monitor_checks, and gives no guidance on default page size or how to paginate further.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
firecrawl_monitor_runRun Firecrawl monitor nowA
Queue an immediate check for a monitor outside its normal schedule. This starts network work for the monitor's configured targets and returns the queued check.
| Name | Required | Description | Default |
|---|---|---|---|
| id | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| data | No | The queued check. |
| error | No | Error message or error object when the call did not succeed. |
| success | No | Whether the API call succeeded. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations declare readOnlyHint=false, openWorldHint=true, idempotentHint=false, and destructiveHint=false, so the initial bar is low. The description adds two valuable facts beyond the annotations: the call 'starts network work for the monitor's configured targets' (explaining why it is not read-only and why it is not idempotent) and that it 'returns the queued check', making the asynchronous queue semantics explicit. It does not mention credit cost, which is the main remaining gap.
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 tight sentences: the action statement is front-loaded and the network/return behavior follows. Every sentence adds distinct information, with no filler.
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 an output schema present, the description does not need to enumerate return values, and it correctly summarizes the key behavior (returns the queued check, triggers network work). For a mutation-style, open-world, non-idempotent tool, the one remaining gap is the lack of parameter clarification and any credit/cost note.
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?
There is one required parameter with 0% schema description coverage, so the description must carry the meaning. It implies the parameter identifies a monitor ('for a monitor'), but never states 'the monitor ID', leaving open whether the id refers to a monitor, a check, or a target. Since there is only one obvious parameter, the inference is easy, but the description forgoes valuable disambiguation.
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 gives a specific verb and resource: 'Queue an immediate check for a monitor', and adds the scope qualifier 'outside its normal schedule', which distinguishes it from the scheduled-monitor siblings (firecrawl_monitor_checks / firecrawl_monitor_check). It does not name a sibling explicitly, so it falls short of a 5.
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?
'Queue an immediate check ... outside its normal schedule' tells the agent clearly when to reach for this tool: when an out-of-band run is wanted rather than waiting for the schedule. There are no explicit exclusions or named alternatives (e.g., 'do not use to read past results — use firecrawl_monitor_checks'), which keeps it at 4.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
firecrawl_monitor_updateUpdate Firecrawl monitorADestructiveIdempotent
Patch an existing monitor by ID. The body can change its name, active/paused status, schedule, targets, goal, judging, webhook, notifications, or retention; these changes affect future scheduled checks.
Returns the updated monitor.
| Name | Required | Description | Default |
|---|---|---|---|
| id | Yes | ||
| body | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| data | No | The monitor record: configuration, schedule, targets, and current state. |
| error | No | Error message or error object when the call did not succeed. |
| success | No | Whether the API call succeeded. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare destructiveHint=true, idempotentHint=true and readOnlyHint=false, so the safety profile is covered. The description adds genuine context beyond them: the effect is scoped forward ("these changes affect future scheduled checks") and the call returns the updated monitor. It still does not say what a destructive patch can overwrite or remove, e.g. whether omitted fields are left intact or whether the targets array is replaced wholesale.
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 tight sentences plus a one-line return note, with the core action front-loaded and the field enumeration kept compact. No filler or repetition of the title.
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?
An output schema exists, so omitting return-value detail is appropriate, and the annotation set covers safety. Given the nested, wholly undocumented body object, the description is close to complete but leaves the partial-vs-replace question and sibling routing unaddressed.
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 body is a free-form object with additionalProperties=true, so the schema alone tells an agent nothing. The description partially compensates by naming the categories of fields the body accepts, but gives no formats, no indication of which keys are required or partial-update semantics, and no explanation of the id beyond "by ID".
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?
"Patch an existing monitor by ID" gives a specific verb and resource, and enumerates the mutable surface (name, status, schedule, targets, goal, judging, webhook, notifications, retention). It is clearly distinguishable from monitor_create/monitor_delete/monitor_get, though it never names those siblings explicitly.
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?
Usage is implied by "patch an existing monitor" and by the note that changes affect future scheduled checks, which hints this is a configuration change rather than an immediate run. There is no explicit routing guidance such as "use firecrawl_monitor_run for an immediate check" or "call firecrawl_monitor_get first to read current settings."
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
firecrawl_parseFirecrawl file parsingARead-only
Parse one supported document into markdown, HTML, links, summary, targeted answers, or JSON matching a schema. Supported inputs include common HTML, PDF, Word, RTF, OpenDocument, and spreadsheet files; PDF parsing can be bounded with pdfOptions.maxPages.
Local MCP reads filePath from the server filesystem. Hosted MCP uses two calls: first provide filePath to receive upload instructions, upload locally, then call again with the returned uploadRef; do not send both fields together. Remote web URLs belong in firecrawl_scrape.
Set redactPII to request redaction of personally identifiable information in the returned content. zeroDataRetention requires an eligible authenticated account; omit it for anonymous keyless use. Returns upload instructions for hosted phase one or parsed document content for the final call. Authenticated final responses can include a data.metadata.scrapeId for optional parse feedback.
| Name | Required | Description | Default |
|---|---|---|---|
| proxy | No | ||
| maxAge | No | Ignored: parse never reuses or stores indexed content. | |
| formats | No | ||
| parsers | No | ||
| filePath | Yes | Absolute or relative path to a local file to parse. Supported: .html, .htm, .pdf, .docx, .doc, .odt, .rtf, .xlsx, .xls | |
| redactPII | No | ||
| pdfOptions | No | ||
| contentType | No | Optional MIME type override. If omitted, the server infers the file kind from the extension. | |
| excludeTags | No | ||
| includeTags | No | ||
| jsonOptions | No | ||
| queryOptions | No | ||
| storeInCache | No | ||
| onlyMainContent | No | ||
| zeroDataRetention | No | ||
| removeBase64Images | No | ||
| skipTlsVerification | No |
Output Schema
| Name | Required | Description |
|---|---|---|
| raw | No | Response body when it was not JSON. |
| data | No | Parsed document content; can include `data.metadata.scrapeId` for parse feedback. |
| mode | No | Which phase of the hosted flow produced this response. |
| error | No | Error message or error object when the call did not succeed. |
| notes | No | Hosted phase one: constraints on completing the upload flow. |
| upload | No | Hosted phase one: how to upload the local file. |
| message | No | Guidance for the next call. |
| success | No | Whether the API call succeeded. |
| warning | No | Non-fatal warning about the result. |
| nextToolCall | No | Hosted phase one: the second `firecrawl_parse` call to make once the upload succeeds, as `{name, arguments}`. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Beyond the annotations (which only declare read-only, non-destructive, closed-world), it discloses the hosted two-phase protocol, that phase one returns upload instructions rather than content, that `zeroDataRetention` requires an eligible authenticated account and must be omitted for keyless use, PII redaction behavior, and the optional `data.metadata.scrapeId` for feedback. That is substantial context an agent could not infer from annotations alone.
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?
Front-loaded with the core action and output modes, then organized into input types, local-vs-hosted protocol, and option notes. Dense but each sentence carries operational content; the hosted-flow paragraph is the longest and could be tightened, but nothing is filler.
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?
Return values are covered by the output schema and the description usefully notes phase-one vs final responses, so that burden is met. However, for a 17-parameter tool with nested objects, the vast majority of options are unexplained, and the `uploadRef` instruction is not representable in the published schema — a gap an agent will hit on the hosted path.
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 17 parameters and only 18% schema description coverage, the description must carry most of the semantic load, yet it explains only `filePath`, `pdfOptions.maxPages`, `redactPII`, and `zeroDataRetention`. Formats, `parsers`, `jsonOptions`/`queryOptions`, `includeTags`/`excludeTags`, `onlyMainContent`, `storeInCache`, `proxy`, `maxAge`, and `contentType` are left undefined. Worse, the description instructs sending `uploadRef`, which does not exist in the schema (which is `additionalProperties: false` and requires `filePath`), creating ambiguity about how the second hosted call is actually formed.
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?
States a specific verb and resource ('Parse one supported document') plus the concrete output modes (markdown, HTML, links, summary, targeted answers, schema JSON) and the accepted input families. It also explicitly separates itself from `firecrawl_scrape` for remote web URLs, so an agent can route without opening either schema.
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?
Gives explicit when/when-not: local MCP reads `filePath` from the server filesystem, hosted MCP requires two calls (filePath → upload → uploadRef), never both fields together, and remote URLs belong to `firecrawl_scrape`. This is a genuine decision procedure, not implied usage.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
firecrawl_research_inspect_paperFirecrawl inspect research paperARead-only
Retrieve canonical metadata for one paper ID, such as an arXiv, PMC, PMID, or DOI identifier. Returns the title, abstract, authors, categories, source IDs, and dates as markdown.
| Name | Required | Description | Default |
|---|---|---|---|
| paperId | Yes | Canonical paperId or primaryId such as `arxiv:1706.03762`, `pmcid:PMC12530322`, `pmid:40953549`, or `doi:10.1016/j.neunet.2025.108095`. |
Output Schema
| Name | Required | Description |
|---|---|---|
| paper | No | Canonical metadata for the requested paper, absent when it was not found. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, openWorldHint=true and destructiveHint=false, so the safety profile is covered. The description adds that the payload is canonical metadata returned as markdown, which is useful, but says nothing about behavior for unknown/unresolvable IDs or any upstream rate limits.
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, front-loaded with the action and scope, then the return shape. No filler or redundant 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?
For a single-parameter read-only tool with an output schema, the description covers the essentials; return fields needn't be detailed. Minor gap: no note on what happens when the ID cannot be resolved or whether prefixed forms are mandatory.
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 100% and the single parameter already lists concrete example identifiers with prefixes. The description's 'one paper ID, such as an arXiv, PMC, PMID, or DOI identifier' restates that without adding format or canonicalization rules, so baseline 3 applies.
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 gives a specific verb and resource: 'Retrieve canonical metadata for one paper ID', and enumerates accepted identifier families (arXiv, PMC, PMID, DOI). The implied contrast with firecrawl_research_read_paper (metadata vs. full text) is inferable but not spelled out by name.
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?
Usage is only implied: 'for one paper ID' suggests calling it when an identifier is already known. There is no explicit when-not, no statement that firecrawl_research_search_papers should be used first to obtain an ID, and no mention of firecrawl_research_read_paper as the alternative for full content.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
firecrawl_research_read_paperFirecrawl read research paperARead-only
Retrieve in-body passages from one paper that are relevant to a specific question. Full text is available only for indexed papers; k controls the number of passages.
Returns matching passages or a notice when full text is unavailable.
| Name | Required | Description | Default |
|---|---|---|---|
| k | No | Number of passages to return (default 4). | |
| paperId | Yes | Canonical paperId or primaryId such as `arxiv:1706.03762`, `pmcid:PMC12530322`, `pmid:40953549`, or `doi:10.1016/j.neunet.2025.108095`. | |
| question | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| passages | Yes | In-body passages relevant to the question; empty when no full text is indexed. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnly and non-destructive, and the description goes beyond them by disclosing the indexing precondition and the failure mode ('a notice when full text is unavailable'). It does not cover rate limits or what an empty/low-relevance result looks like, but the fallback disclosure is the substantive addition an agent 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?
Two short sentences, front-loaded with the core action and scope. The second sentence slightly overlaps the first by restating the return of matching passages, but there is no filler.
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?
An output schema exists, so return values need not be spelled out. However, for a retrieval tool gated on an 'indexed papers' precondition, the description never tells the agent how to establish index status or what to do otherwise — a meaningful gap given the research_* sibling set.
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 67% with well-documented paperId (formats) and k (range, default 4); only `question` lacks a schema description. The description's 'relevant to a specific question' and 'k controls the number of passages' largely restate the schema rather than adding format or quality guidance for the question phrasing.
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?
States a specific verb and resource: retrieve in-body passages from one paper, targeted at a question. That distinguishes it from the metadata-oriented siblings (research_inspect_paper, research_search_papers), though it never names those siblings explicitly, leaving the agent to infer the boundary from tool names.
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?
Adds one real usage condition — full text is available only for indexed papers — but does not say how to check whether a paper is indexed, nor when to prefer inspect_paper or search_papers instead. Usage is implied by the name and sentence, not routed.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
firecrawl_research_search_papersFirecrawl research paper searchARead-only
Search paper metadata and abstracts with a natural-language query across the indexed corpus, which spans biomedical, life-science, and clinical literature (PubMed, bioRxiv, medRxiv) alongside arXiv and other scientific sources. Optional author, category, date, and sort options constrain or reorder results.
Several distinct framings of the same question surface different papers than a single query does.
Returns ranked papers with canonical IDs, titles, authors, and abstracts.
| Name | Required | Description | Default |
|---|---|---|---|
| k | No | Number of ranked papers to return (default 40). | |
| to | No | Inclusive upper bound on created/updated date (`YYYY-MM-DD`). | |
| from | No | Inclusive lower bound on created/updated date (`YYYY-MM-DD`). | |
| sort | No | `relevance` (default) or `date_desc`, which returns the newest of the most relevant matches, newest first by created date. It does not list every paper in a date range; add `from` (and `to`) for that. | |
| query | Yes | Natural-language research topic or question, including methods, systems, conditions, populations, interventions, or outcomes when relevant. | |
| authors | No | Author substring filter(s); ALL must match (case-insensitive). | |
| categories | No | Paper category filter(s) (e.g. `cs.LG`); ALL provided values must match. |
Output Schema
| Name | Required | Description |
|---|---|---|
| results | Yes | Ranked papers, in the order the text block lists them. |
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 safety profile is covered and the description is not obligated to restate it. It adds real behavioral context beyond that: the indexed corpus's domain coverage, the fact that results are relevance-ranked, and the non-obvious ranking insight that rephrasing a question changes which papers surface. The final sentence mostly restates the output schema, which is the only wasted signal.
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?
Three sentences, front-loaded with corpus scope, then filtering, then returns — a sensible order with no filler. The only redundancy is the closing sentence about return fields, which an output schema already provides, though it is brief enough not to be costly.
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 7 fully described parameters, an output schema and safety annotations, the description supplies the missing piece an agent needs — what corpus is being searched and how results are ranked. Minor gaps remain: no mention of result caps or pagination behavior across calls, and no explicit pointer to the companion research tools for reading or expanding a found paper.
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 100%, so every parameter (including k's default of 40, the from/to date format, and sort's semantics) is already fully documented in the schema. The description only summarizes that author, category, date and sort options 'constrain or reorder results', adding no syntax, format or default details beyond the structured fields. Baseline 3 applies where the schema carries the load.
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 opens with a specific verb+resource ('Search paper metadata and abstracts') and immediately enumerates the corpus (PubMed, bioRxiv, medRxiv, arXiv, other scientific sources), which implicitly separates it from the generalist siblings firecrawl_search, firecrawl_developer_search and firecrawl_gov_search. It also states the result shape (ranked papers with canonical IDs, titles, authors, abstracts). It stops short of naming any sibling explicitly, so an agent must infer the routing.
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?
There is one genuinely useful usage cue — 'Several distinct framings of the same question surface different papers than a single query does' advises on query strategy — plus a note that filters 'constrain or reorder results'. But there is no explicit statement of when to choose this over firecrawl_search or when to follow up with firecrawl_research_read_paper / firecrawl_research_related_papers, so routing is left to inference.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
firecrawl_scrapeFirecrawl scrapeA
Scrape one URL and return its content: markdown by default, or HTML, links, screenshots, branding data, a targeted answer, or JSON matching a supplied schema. Use it when the request identifies a page and needs its content or defined fields: the user gives a URL or names a page or PDF and wants it read or summarized, or wants prices, specs, contact details or a table from it. Use firecrawl_search when additional web sources are needed; on an authenticated session, firecrawl_map lists a site's URLs and firecrawl_crawl collects a set of pages.
Firecrawl may serve recently indexed content; set maxAge: 0 for a live fetch or a smaller maxAge to bound staleness. A successful response does not by itself confirm the page is still current. Browser actions can change the live page when interactive actions are enabled. Authenticated responses can include a metadata.scrapeId for optional scrape feedback.
On an authenticated session, firecrawl_search and firecrawl_find_tools can discover providers for the same fields across several pages; a matching provider returns typed records in one call.
With alexandria in place of url, the tool runs catalogued provider capabilities instead of fetching a page. Some providers require accepted terms; when a response reports a terms requirement, direct the user to the Firecrawl dashboard URL in that response.
| Name | Required | Description | Default |
|---|---|---|---|
| url | No | ||
| proxy | No | ||
| maxAge | No | ||
| mobile | No | ||
| actions | No | ||
| formats | No | ||
| parsers | No | ||
| profile | No | ||
| timeout | No | Execution timeout in milliseconds. | |
| waitFor | No | ||
| location | No | ||
| lockdown | No | ||
| redactPII | No | ||
| requestId | No | Idempotency key bound to one Alexandria execution payload. Generated when omitted and returned with the result. | |
| alexandria | No | Catalogued Alexandria capability invocation, mutually exclusive with url. One {provider, capability, options} object or an array of 1-10, with contracts available through firecrawl_search or firecrawl_find_tools. Each call may include version to pin a published workflow; omitting it uses latest. Only requestId and timeout are supported alongside alexandria. The selected contract marks required inputs and any requiresOneOf groups (at least one member per group); it may include example.request/example.response and a key field under response (which may differ from records). Where pagination is declared, its fields govern paging with the same filters; catalogue next is separate from provider pagination. Returns per-capability results in data.alexandria with data, records, or an error with a code; individual capabilities can fail even when the outer response succeeds. Some providers require accepted terms; when a response reports a terms requirement, direct the user to the Firecrawl dashboard URL in that response. | |
| pdfOptions | No | ||
| toolDetail | No | URL mode only: domain discovery detail, summary by default; compact returns provider/capability/description, full includes contracts. Ignored with alexandria. | |
| domainTools | No | URL mode only: include domain-matched Alexandria tools for the page in tools on the returned document. Ignored with alexandria. | |
| excludeTags | No | ||
| includeTags | No | ||
| jsonOptions | No | ||
| queryOptions | No | ||
| storeInCache | No | ||
| onlyMainContent | No | ||
| screenshotOptions | No | ||
| zeroDataRetention | No | ||
| removeBase64Images | No | ||
| skipTlsVerification | No |
Output Schema
| Name | Required | Description |
|---|---|---|
| data | No | Alexandria mode: per-capability results in `data.alexandria`, each with `data`, `records`, or an `error`. |
| html | No | Processed HTML of the page. |
| json | No | Structured data matching the requested JSON schema or prompt. |
| menu | No | Menu data extracted from the page. |
| audio | No | Audio extracted from the page. |
| error | No | Error message or error object when the call did not succeed. |
| links | No | Links found on the page. |
| pages | No | Physical PDF pages, when `parsers[].pages` is set. |
| tools | No | Domain-matched Alexandria tools for the page, when `domainTools` is set. |
| video | No | Video extracted from the page. |
| answer | No | Targeted answer to the question that was asked of the page. |
| blocks | No | Typed PDF layout blocks, when `parsers[].blocks` is set. |
| images | No | Images found on the page. |
| actions | No | Results of the browser actions that ran during the scrape. |
| message | No | Guidance that accompanies the result. |
| product | No | Product data extracted from the page. |
| rawHtml | No | Unprocessed HTML of the page. |
| receipt | No | Billing receipt for the execution. |
| success | No | Whether the API call succeeded. |
| summary | No | Summary of the page content. |
| warning | No | Non-fatal warning about the result. |
| branding | No | Branding data extracted from the page. |
| delivery | No | `retained` when the full result stayed server-side instead of being inlined. |
| markdown | No | Page content as markdown. |
| metadata | No | Page metadata; authenticated responses can include `metadata.scrapeId` for scrape feedback. |
| nextTool | No | A follow-up tool call (`{name, arguments}`) that continues or inspects this result. |
| requestId | No | Identifier of this Alexandria execution. |
| scrape_id | No | Identifier of the underlying scrape. |
| attributes | No | Values collected by the requested attribute selectors. |
| highlights | No | Highlighted passages from the page. |
| screenshot | No | Screenshot of the page. |
| creditsCost | No | Credits this call consumed. |
| workspaceId | No | Workspace holding a retained result, for inspection through virtual Bash. |
| feedbackTool | No | Pointer to the feedback tool for reporting how this result served the task. |
| responseBytes | No | Size of the full result in bytes. |
| changeTracking | No | Change-tracking comparison against the previous scrape. |
| idleTtlSeconds | No | Seconds a retained workspace stays available while idle. |
| estimatedTokens | No | Estimated token cost of the full result. |
| inlineTokenBudget | No | Token budget above which a result is retained rather than inlined. |
| tokenEstimateMethod | No | How `estimatedTokens` was derived. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Beyond the annotations, it discloses non-obvious behavior: content may be recently indexed rather than live (with `maxAge: 0` as the escape hatch), success does not prove currency, interactive browser actions can mutate the live page, and alexandria calls can partially fail per-capability even when the outer response succeeds. It also flags the terms-acceptance flow and the `metadata.scrapeId` feedback hook. Nothing here contradicts readOnlyHint=false, openWorldHint=true, destructiveHint=false.
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 core routing and format information is front-loaded and wastes nothing, but the paragraph block grows to five paragraphs and the terms-requirement sentence is duplicated almost verbatim from the `alexandria` schema description. The section on provider discovery across `firecrawl_search`/`firecrawl_find_tools` sits awkwardly between behavioral caveats and mode switching.
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?
An output schema exists, so return values need not be explained, and the dual url/alexandria mode, staleness model, and terms flow are all covered. What is missing is scale-appropriate: for a 28-parameter tool at 18% schema coverage, most optional knobs still have no explanation anywhere, which is the main gap for an agent deciding how to configure a call.
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 only 18% across 28 parameters, so the description carries most of the burden and mostly does not. It explains `maxAge`, sketches `formats`, gestures at `actions`, and covers `alexandria`/`requestId`/`timeout`, but leaves `proxy`, `profile`, `location`, `lockdown`, `redactPII`, `storeInCache`, `onlyMainContent`, `includeTags`/`excludeTags`, `zeroDataRetention`, `waitFor`, `mobile`, `parsers`, and the `jsonOptions`/`queryOptions`/`screenshotOptions` sub-objects undocumented in either place.
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 opening sentence names a specific verb and resource ('Scrape one URL and return its content') and enumerates the concrete output shapes (markdown default, HTML, links, screenshots, branding, targeted answer, schema-matched JSON). It then distinguishes itself from three siblings by name and condition, so an agent can route without opening any schema.
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?
It gives explicit selection criteria: use it when the request identifies a page ('the user gives a URL or names a page or PDF and wants it read or summarized, or wants prices, specs, contact details or a table from it'), and names `firecrawl_search`, `firecrawl_map` and `firecrawl_crawl` with the situations that select them. The alexandria paragraph adds a second routing condition (catalogued provider capability instead of a page fetch).
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
firecrawl_searchFirecrawl web searchARead-only
Search web, news, or image sources and return ranked results with query-relevant highlights. Use it for current information, or to list businesses, people, products, jobs or events with websites, prices or contacts. Each web result is a title, URL, and description; use firecrawl_scrape on a result URL when the excerpt is not enough.
Authenticated search also returns matching Alexandria data providers in data.tools (companies, people, jobs, finance and filings, public records and government spending, real estate, places and restaurants, retail and prices, package registries and developer data, news, research, and more). Prefer a provider over scraping pages when the task needs the same fields across several entities, exact figures or timestamps, provenance, or many records; use web results when they already answer the question. Authenticated searches always add alexandria to the sources, so sources: ["web"] also returns providers; domainTools: false turns off website-matched tools only.
On an authenticated session, tool matches describe available capabilities; firecrawl_find_tools returns their contracts and firecrawl_scrape with an alexandria body executes a selected capability. Keyless sessions get no Alexandria matches in data.tools.
For a programming question, add categories: ["developer"]; its hits return in data.web with category: "developer". For a legal or regulatory question, categories: ["gov"] returns hits in data.web with category: "gov" and cannot be combined with other categories; authenticated sessions also have firecrawl_gov_search as the dedicated tool. Verify gov results' issuer, jurisdiction, status, and version before citing current law. categories: ["research"] restricts web results to research-affiliated websites; the firecrawl_research_* tools are a separate surface over paper abstracts and full text (PubMed, bioRxiv, medRxiv, arXiv). Returns source-type result groups and usage metadata. Authenticated responses can include an id for optional search feedback.
| Name | Required | Description | Default |
|---|---|---|---|
| tbs | No | ||
| limit | No | ||
| query | Yes | Query for web and semantic tool discovery. Operators include quoted phrases, `-term`, `site:host`, `inurl:term`, `intitle:term`, and `related:host`; the set is non-exhaustive. Catalogue browsing is available through firecrawl_find_tools. | |
| filter | No | ||
| sources | No | Search sources; authenticated sessions default to web + alexandria, keyless sessions to web only. Authenticated searches always add alexandria to the sources, so sources: ["web"] also returns providers; domainTools: false turns off website-matched tools only. enterprise zdr or anon searches do not add it. Use ["alexandria"] alone for provider discovery without web results. | |
| location | No | ||
| categories | No | Limit results to specific source types. `research` restricts ordinary web results to research-affiliated websites and returns page snippets, which is separate from the `firecrawl_research_*` tools that search paper abstracts and full text across biomedical (PubMed, bioRxiv, medRxiv) and arXiv literature; `pdf` searches PDF results; `developer` searches an index built for coding agents over public repositories, GitHub issues, merged pull requests, repository READMEs, and code documentation; `gov` searches the Government Index of US federal, state, and local legal and regulatory sources, the index behind firecrawl_gov_search, and cannot be combined with other categories; gov hits can include historical versions, bill text, agency guidance, and third-party reproductions, so verify the issuer, jurisdiction, enacted/effective status, and version before citing current governing law, clarify a missing jurisdiction or ambiguous as-of date, and use general search for non-US questions or missing coverage (no hits does not establish that no applicable law exists). `developer` and `gov` return hits in `data.web` with `category` set to their name; the other categories also filter `data.web`. | |
| enterprise | No | ||
| highlights | No | Return query-relevant page excerpts for web and news results when available (default). Highlights appear in web `description` and news `snippet`; otherwise, original snippets are returned. Set to false to keep the original search snippets. | |
| toolDetail | No | Compact by default. Compact returns only provider, capability and description; full includes contracts. Inspect selected compact tools with firecrawl_find_tools providers and capabilities. | |
| domainTools | No | Include domain-matched tools for result URLs. Defaults to true when Alexandria is combined with web, news or images; semantic-only search leaves domain matching off. | |
| scrapeOptions | No | Fetches the full page of every web result in the same call, and each fetched result is billed as a scrape. Leave it unset unless the task needs the full text of a few results: highlights usually answer, and firecrawl_scrape can fetch only the URLs you need. These fetches ignore maxAge, so use firecrawl_scrape for a live fetch. scrapeOptions fetches web pages, never Alexandria provider tools. | |
| excludeDomains | No | Hostnames to leave out of results. Mutually exclusive with includeDomains. | |
| includeDomains | No | Hostnames to restrict results to. Mutually exclusive with excludeDomains. |
Output Schema
| Name | Required | Description |
|---|---|---|
| id | No | Search identifier, for optional `firecrawl_search_feedback`. |
| data | No | Ranked results grouped by source, such as `web`, `news`, `images`, and `alexandria`. Each result carries its `source` and a 1-indexed `position` within that group; pass those pairs to `firecrawl_search_feedback`. |
| error | No | Error message or error object when the call did not succeed. |
| tools | No | Domain-matched Alexandria tools for the results. |
| success | No | Whether the API call succeeded. |
| warning | No | Non-fatal warning about the result. |
| nextTool | No | A follow-up tool call that continues this search. |
| creditsUsed | No | Credits this search consumed. |
| feedbackTool | No | Pointer to the feedback tool for this search. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare read-only and open-world, and the description adds real behavior beyond them: keyless sessions get no Alexandria matches, authenticated searches always inject the alexandria source, domainTools:false disables only website-matched tools, and gov hits may include historical bills that need issuer/status verification. It also warns that scrapeOptions bills each fetched result as a scrape, which is a cost consequence not visible in annotations. Some of this duplicates parameter descriptions in the schema rather than adding fresh context, keeping it below a 5.
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 lead sentence is well front-loaded and the paragraphs are thematically grouped, but at eight paragraphs for a search tool it is bloated and several statements repeat schema text verbatim. Sentences such as the sources/alexandria clause are dense and contain near-duplicate phrasing ('Authenticated searches always add alexandria... domainTools: false turns off website-matched tools only' appears twice across description and 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 14-parameter tool with nested objects, the description covers the genuinely confusing parts: auth-dependent defaults, the alexandria/web interaction, category exclusivity, and the follow-up path through firecrawl_find_tools and firecrawl_scrape. An output schema exists and the description still briefly flags the response grouping ('source-type result groups and usage metadata', optional search id), so nothing critical is missing, though undocumented params like location and tbs leave minor gaps.
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 64%, and the description's parameter content largely restates what the schema already documents (sources, categories, toolDetail, domainTools, highlights). It does add relational meaning the schema lacks — that sources:['web'] still returns providers, that developer/gov hits land in data.web with a category field, and that developer hits are indexed over issues/PRs/READMEs — but parameters like tbs, filter, limit, and location get no treatment anywhere, so the coverage gap is only partially closed.
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?
First sentence states a specific verb and resource ('Search web, news, or image sources') and the return shape ('ranked results with query-relevant highlights'). It also names the concrete use cases (current information, listing businesses/people/products) and distinguishes itself from firecrawl_scrape early, so an agent can pick it out of a crowded sibling list without opening the schema.
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 repeatedly routes between alternatives with explicit conditions: use firecrawl_scrape when the excerpt is not enough, prefer an Alexandria provider when the task needs the same fields across entities or exact figures, add categories:['developer'] for programming questions, use firecrawl_gov_search for legal work on authenticated sessions, and treat firecrawl_research_* as a separate surface. It even states exclusions ('gov' cannot be combined with other categories, non-US questions should use general search).
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
firecrawl_search_feedbackFirecrawl search feedbackA
Records schema-validated quality feedback for a prior firecrawl_search UUID searchId. A good rating requires a valuable result or a valuable source, partial either of those or at least one missingContent entry, and bad at least one missingContent entry or a query suggestion; caps are 50 valuableResults, 50 valuableSources, and 20 missingContent entries.
Eligibility is limited to successful searches within the feedback age window. The record is idempotent per search ID. Eligible first feedback for a search can refund 1 credit; refunds are subject to the team's daily cap. The response reports whether a refund was applied, along with submission and daily-cap status.
Mark useful returned results in valuableResults as {"source", "position"} copied off the result. Groups are numbered from 1 independently, so {"source":"web","position":1} and {"source":"news","position":1} are different results. Be exhaustive — results you do not list are treated as not useful. Reserve valuableSources for useful URLs that were NOT among the returned results; never report one result in both fields.
| Name | Required | Description | Default |
|---|---|---|---|
| rating | Yes | ||
| searchId | Yes | ||
| missingContent | No | Array of specific pieces of content the agent expected to find but did not. One entry per distinct topic. Each entry has a short `topic` and optional longer `description`. | |
| valuableResults | No | Every result that was actually useful, copied from the `source` and `position` stamped on each result. Each group is numbered from 1 independently, so the source is required — `{"source":"web","position":1}` and `{"source":"news","position":1}` are different results. Be exhaustive — unlisted results are treated as not useful. Do not also list the same results in valuableSources. | |
| valuableSources | No | ||
| querySuggestions | No |
Output Schema
| Name | Required | Description |
|---|---|---|
| raw | No | Response body when it was not JSON. |
| data | No | Payload returned with the accepted feedback. |
| error | No | Error message or error object when the call did not succeed. |
| status | No | HTTP status when the submission was rejected. |
| message | No | Human-readable result of the submission. |
| success | No | Whether the API call succeeded. |
| warning | No | Non-fatal warning about the result. |
| retryable | No | Whether retrying the submission can succeed. |
| feedbackId | No | Identifier of the recorded feedback. |
| dailyRefundCap | No | The team's daily refund cap in credits. |
| creditsRefunded | No | Credits refunded for this submission, when eligible. |
| dailyCapReached | No | Whether the daily refund cap is reached; further feedback today still records but refunds nothing. |
| alreadySubmitted | No | Whether feedback for this job was already recorded. |
| feedbackErrorCode | No | Machine-readable reason the submission was rejected. |
| websiteCapReached | No | Alexandria only: whether this website's daily refund cap is reached; feedback about other websites can still refund. |
| creditsRefundedToday | No | Credits refunded to the team so far this UTC day. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Goes well beyond the annotations by disclosing idempotency, credit-refund eligibility with a daily team cap, and what the response reports (refund applied, submission and daily-cap status). It also warns of a consequential side effect of the data model — unlisted results are treated as not useful — which an agent could not infer from `destructiveHint: false` alone.
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?
Three dense paragraphs, front-loaded with purpose and eligibility before the field mechanics. Some material (the source/position grouping explanation) duplicates the schema's own `valuableResults` description, which is mild redundancy rather than bloat.
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 6-parameter tool with an output schema, the description covers eligibility, rating validity, caps, refund behavior, and the two main array fields. The unused `querySuggestions` parameter and the `reason` sub-fields remain undocumented, a modest gap given the tool's complexity.
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 only 33% schema description coverage, the description compensates well: it explains the `{source, position}` pairing for `valuableResults`, the independent numbering per source group, and the rule that `valuableSources` is reserved for URLs not among returned results. It leaves `querySuggestions` and the `reason` fields unexplained, so coverage is strong but not complete.
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?
States a specific verb and resource — records schema-validated quality feedback — and ties it to a prior `firecrawl_search` UUID `searchId`, which separates it from the generic `firecrawl_feedback` sibling. An agent can identify the operation and its input source without opening the schema.
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 preconditions (must follow a successful search, within the feedback age window, idempotent per search ID) and defines the criteria that make a `good`, `partial`, or `bad` rating valid. It does not explicitly route against the sibling `firecrawl_feedback` tool, so the alternative-selection guidance is implied rather than stated.
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.
12 tool updates
v3.36.1- Changed
firecrawl_agent1 field changed- changed
Input schema / properties / schema / additionalPropertiesPrevious value: -{}New value: +true
- Changed
firecrawl_crawl1 field changed- changed
Input schema / properties / scrapeOptions / properties / jsonOptions / properties / schema / additionalPropertiesPrevious value: -{}New value: +true
- Changed
firecrawl_feedback1 field changed- changed
Input schema / properties / metadata / additionalPropertiesPrevious value: -{}New value: +true
- Changed
firecrawl_interact1 field changed- changed
Input schema / properties / scrapeOptions / properties / jsonOptions / properties / schema / additionalPropertiesPrevious value: -{}New value: +true
- Changed
firecrawl_monitor_create1 field changed- changed
Input schema / properties / body / additionalPropertiesPrevious value: -{}New value: +true
- Changed
firecrawl_monitor_update1 field changed- changed
Input schema / properties / body / additionalPropertiesPrevious value: -{}New value: +true
- Changed
firecrawl_parse1 field changed- changed
Input schema / properties / jsonOptions / properties / schema / additionalPropertiesPrevious value: -{}New value: +true
- Changed
firecrawl_research_inspect_paper3 fields changed- changed
Output schema / properties / paper / properties / authors / descriptionPrevious value: -"Authors, as a comma-joined string or as `{name, affiliation}` entries."New value: +"Authors, as a list of names or a comma-joined string." - changed
Output schema / properties / paper / properties / createdDate / descriptionPrevious value: -"Date the paper was first indexed or published."New value: +"Date the paper was first indexed or published (`YYYY-MM-DD`)." - changed
Output schema / properties / paper / properties / updateDate / descriptionPrevious value: -"Date the paper was last updated."New value: +"Date the paper was last updated (`YYYY-MM-DD`)."
- Changed
firecrawl_research_related_papers3 fields changed- changed
Output schema / properties / results / items / properties / authors / descriptionPrevious value: -"Authors, as a comma-joined string or as `{name, affiliation}` entries."New value: +"Authors, as a list of names or a comma-joined string." - changed
Output schema / properties / results / items / properties / createdDate / descriptionPrevious value: -"Date the paper was first indexed or published."New value: +"Date the paper was first indexed or published (`YYYY-MM-DD`)." - changed
Output schema / properties / results / items / properties / updateDate / descriptionPrevious value: -"Date the paper was last updated."New value: +"Date the paper was last updated (`YYYY-MM-DD`)."
- Changed
firecrawl_research_search_papers4 fields changed- added
Input schema / properties / sortAdded value: +{ + "description": "`relevance` (default) or `date_desc`, which returns the newest of the most relevant matches, newest first by created date. It does not list every paper in a date range; add `from` (and `to`) for that.", + "enum": [ + "relevance", + "date_desc" + ], + "type": "string" +} - changed
Output schema / properties / results / items / properties / authors / descriptionPrevious value: -"Authors, as a comma-joined string or as `{name, affiliation}` entries."New value: +"Authors, as a list of names or a comma-joined string." - changed
Output schema / properties / results / items / properties / createdDate / descriptionPrevious value: -"Date the paper was first indexed or published."New value: +"Date the paper was first indexed or published (`YYYY-MM-DD`)." - changed
Output schema / properties / results / items / properties / updateDate / descriptionPrevious value: -"Date the paper was last updated."New value: +"Date the paper was last updated (`YYYY-MM-DD`)."
- Changed
firecrawl_scrape2 fields changed- changed
Input schema / properties / alexandria / anyOfPrevious value: -[ - { - "properties": { - "capability": { - "description": "Capability address as returned by search or discover, e.g. \"series/observations\".", - "minLength": 1, - "type": "string" - }, - "options": { - "additionalProperties": {}, - "description": "Capability options as declared by its contract.", - "propertyNames": { - "type": "string" - }, - "type": "object" - }, - "provider": { - "description": "Provider slug, e.g. \"fred\".", - "minLength": 1, - "type": "string" - }, - "version": { - "description": "Optional published workflow version. Omit to use the latest version.", - "maxLength": 128, - "minLength": 1, - "type": "string" - } - }, - "required": [ - "provider", - "capability" - ], - "type": "object" - }, - { - "items": { - "properties": { - "capability": { - "description": "Capability address as returned by search or discover, e.g. \"series/observations\".", - "minLength": 1, - "type": "string" - }, - "options": { - "additionalProperties": {}, - "description": "Capability options as declared by its contract.", - "propertyNames": { - "type": "string" - }, - "type": "object" - }, - "provider": { - "description": "Provider slug, e.g. \"fred\".", - "minLength": 1, - "type": "string" - }, - "version": { - "description": "Optional published workflow version. Omit to use the latest version.", - "maxLength": 128, - "minLength": 1, - "type": "string" - } - }, - "required": [ - "provider", - "capability" - ], - "type": "object" - }, - "maxItems": 10, - "minItems": 1, - "type": "array" - } -]New value: +[ + { + "properties": { + "capability": { + "description": "Capability address as returned by search or discover, e.g. \"series/observations\".", + "minLength": 1, + "type": "string" + }, + "options": { + "additionalProperties": true, + "description": "Capability options as declared by its contract.", + "propertyNames": { + "type": "string" + }, + "type": "object" + }, + "provider": { + "description": "Provider slug, e.g. \"fred\".", + "minLength": 1, + "type": "string" + }, + "version": { + "description": "Optional published workflow version. Omit to use the latest version.", + "maxLength": 128, + "minLength": 1, + "type": "string" + } + }, + "required": [ + "provider", + "capability" + ], + "type": "object" + }, + { + "items": { + "properties": { + "capability": { + "description": "Capability address as returned by search or discover, e.g. \"series/observations\".", + "minLength": 1, + "type": "string" + }, + "options": { + "additionalProperties": true, + "description": "Capability options as declared by its contract.", + "propertyNames": { + "type": "string" + }, + "type": "object" + }, + "provider": { + "description": "Provider slug, e.g. \"fred\".", + "minLength": 1, + "type": "string" + }, + "version": { + "description": "Optional published workflow version. Omit to use the latest version.", + "maxLength": 128, + "minLength": 1, + "type": "string" + } + }, + "required": [ + "provider", + "capability" + ], + "type": "object" + }, + "maxItems": 10, + "minItems": 1, + "type": "array" + } +] - changed
Input schema / properties / jsonOptions / properties / schema / additionalPropertiesPrevious value: -{}New value: +true
- Changed
firecrawl_search1 field changed- changed
Input schema / properties / scrapeOptions / properties / jsonOptions / properties / schema / additionalPropertiesPrevious value: -{}New value: +true
30 tool updates
v1.0.2- Changed
firecrawl_agent8 fields changed- changed
Input schema / $schemaPrevious value: -"https://json-schema.org/draft/2020-12/schema"New value: +"http://json-schema.org/draft-07/schema#" - added
Input schema / properties / effortAdded value: +{ + "description": "Reasoning budget for the agent task.", + "enum": [ + "low", + "medium", + "high" + ], + "type": "string" +} - added
Input schema / properties / exchangeAdded value: +{ + "additionalProperties": false, + "description": "Alexandria provider settings for this turn, forwarded as the request's exchange object.", + "properties": { + "approve": { + "additionalProperties": false, + "description": "Answer yes to the pendingApproval the previous turn of this thread ended on (its id, also exchange.requiresAction.approvalId). Needs threadId. For a terms offer, send it only after an organization admin confirms acceptance in the Firecrawl dashboard; this does not accept terms. callIds and always are ignored on terms offers. For paid calls, callIds picks a subset (default all) and always stops asking for the rest of the thread.", + "properties": { + "always": { + "type": "boolean" + }, + "approvalId": { + "format": "uuid", + "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$", + "type": "string" + }, + "callIds": { + "items": { + "type": "string" + }, + "type": "array" + } + }, + "required": [ + "approvalId" + ], + "type": "object" + }, + "decline": { + "additionalProperties": false, + "description": "Answer no to that pendingApproval. Needs threadId. A declined terms offer keeps those providers out of the rest of the thread.", + "properties": { + "approvalId": { + "format": "uuid", + "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$", + "type": "string" + } + }, + "required": [ + "approvalId" + ], + "type": "object" + }, + "enabled": { + "description": "Let the agent call Alexandria providers. On by default.", + "type": "boolean" + }, + "maxCalls": { + "description": "Most provider calls the agent may make in this turn.", + "maximum": 30, + "minimum": 1, + "type": "integer" + }, + "onTermsRequired": { + "description": "What to do when a provider the agent would use needs data terms the team has not accepted. Gated providers are never called. \"skip\" (default): answer with accepted providers and list the rest in exchange.skippedProviders. \"ask\": the same, plus a terms pendingApproval and exchange.requiresAction. Read terms with terms/show; an organization admin accepts them in the Firecrawl dashboard. There is no auto-accept. Omitted on a follow-up keeps the previous turn's value.", + "enum": [ + "skip", + "ask" + ], + "type": "string" + }, + "requireApproval": { + "description": "End the turn with a paid-call pendingApproval before any paid provider call. Requires mode \"chat\" on the same request, even on a follow-up.", + "type": "boolean" + }, + "toolkits": { + "description": "Pin up to 5 providers the agent may use, by slug. Omitted means the whole catalog.", + "items": { + "type": "string" + }, + "maxItems": 5, + "type": "array" + } + }, + "type": "object" +} - added
Input schema / properties / maxCreditsAdded value: +{ + "description": "Spending limit in credits for this run. Defaults to 2500 on the API.", + "exclusiveMinimum": 0, + "maximum": 9007199254740991, + "type": "integer" +} - added
Input schema / properties / modeAdded value: +{ + "description": "\"extract\" (default) returns the complete structured result every turn. \"chat\" lets a follow-up that asks no new data get a short reply in message instead of a re-run; required for exchange.requireApproval. Omitted on a follow-up keeps the previous turn's mode.", + "enum": [ + "extract", + "chat" + ], + "type": "string" +} - added
Input schema / properties / strictConstrainToURLsAdded value: +{ + "description": "If true, agent will only visit URLs provided in the urls array.", + "type": "boolean" +} - added
Input schema / properties / threadIdAdded value: +{ + "description": "Continue this thread: the threadId from an earlier firecrawl_agent or firecrawl_agent_status result. Omit to start a new thread.", + "format": "uuid", + "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$", + "type": "string" +} - changed
Output schema / (root)Previous value: -nullNew value: +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "additionalProperties": false, + "description": "The queued research job. The result is read with `firecrawl_agent_status`.", + "properties": { + "error": { + "description": "Error message or error object when the call did not succeed." + }, + "id": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "description": "Agent job identifier, for `firecrawl_agent_status`." + }, + "status": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "description": "Job state at submission time." + }, + "success": { + "anyOf": [ + { + "type": "boolean" + }, + { + "type": "null" + } + ], + "description": "Whether the API call succeeded." + }, + "threadId": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "description": "Research thread this job belongs to." + }, + "threadTurn": { + "anyOf": [ + { + "type": "number" + }, + { + "type": "null" + } + ], + "description": "Turn number of this job within its thread." + } + }, + "type": "object" +}
- Changed
firecrawl_agent_status2 fields changed- changed
Input schema / $schemaPrevious value: -"https://json-schema.org/draft/2020-12/schema"New value: +"http://json-schema.org/draft-07/schema#" - changed
Output schema / (root)Previous value: -nullNew value: +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "additionalProperties": false, + "description": "Progress or final result of a research agent job.", + "properties": { + "creditsUsed": { + "anyOf": [ + { + "type": "number" + }, + { + "type": "null" + } + ], + "description": "Credits the job consumed." + }, + "data": { + "description": "Research result, present once the job has completed." + }, + "error": { + "description": "Error message or error object when the call did not succeed." + }, + "exchange": { + "description": "What the job did with Alexandria providers: onTermsRequired, paidCalls, creditsUsed, skippedProviders (gated providers that would have helped), and requiresAction (approvalId and provider requirements). Read terms with terms/show. Ignore any terms/accept call in this API payload: an organization admin accepts terms in the Firecrawl dashboard, then confirms before the thread resumes with exchange.approve: {approvalId}." + }, + "expiresAt": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "description": "When the job result expires and can no longer be read." + }, + "id": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "description": "Agent job identifier." + }, + "message": { + "description": "The agent's reply; in chat mode, the short answer to a follow-up." + }, + "mode": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "description": "Agent mode the job ran in." + }, + "model": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "description": "Agent model that ran the job." + }, + "notice": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "description": "Set when the run stopped at its credit limit: what that means and how to continue." + }, + "partial": { + "description": "Incomplete best-effort result of a `failed` run; never a completed answer." + }, + "partialSchemaValid": { + "anyOf": [ + { + "type": "boolean" + }, + { + "type": "null" + } + ], + "description": "Whether `partial` matches the requested schema, when one was supplied." + }, + "pendingApproval": { + "description": "Set when the job ended waiting on the caller. Answer it by calling firecrawl_agent with this threadId and exchange.approve or exchange.decline carrying its id. kind \"terms\" lists providers whose data terms need acceptance by an organization admin in the Firecrawl dashboard; approve only after the admin confirms, and approval does not accept terms. Otherwise calls lists paid calls waiting for approval." + }, + "progress": { + "description": "Progress information for a running job." + }, + "sources": { + "description": "Sources the agent read." + }, + "status": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "description": "Job state: `processing` is non-terminal; `completed` and `failed` are terminal." + }, + "stopReason": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "description": "Why a `failed` run stopped early; `credit_limit_reached` means it hit maxCredits." + }, + "success": { + "anyOf": [ + { + "type": "boolean" + }, + { + "type": "null" + } + ], + "description": "Whether the API call succeeded." + }, + "suggestions": { + "description": "Follow-ups the agent offers; send one as the prompt of the next turn with this threadId." + }, + "threadId": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "description": "Research thread this job belongs to." + }, + "threadTurn": { + "anyOf": [ + { + "type": "number" + }, + { + "type": "null" + } + ], + "description": "Turn number of this job within its thread." + } + }, + "type": "object" +}
- Changed
firecrawl_check_crawl_status2 fields changed- changed
Input schema / $schemaPrevious value: -"https://json-schema.org/draft/2020-12/schema"New value: +"http://json-schema.org/draft-07/schema#" - changed
Output schema / (root)Previous value: -nullNew value: +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "additionalProperties": false, + "description": "Crawl job state and the documents collected so far.", + "properties": { + "completed": { + "anyOf": [ + { + "type": "number" + }, + { + "type": "null" + } + ], + "description": "Pages crawled so far." + }, + "creditsUsed": { + "anyOf": [ + { + "type": "number" + }, + { + "type": "null" + } + ], + "description": "Credits the crawl consumed." + }, + "data": { + "description": "Scraped documents collected by the crawl." + }, + "error": { + "description": "Error message or error object when the call did not succeed." + }, + "expiresAt": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "description": "When the crawl results expire." + }, + "id": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "description": "Crawl identifier, for `firecrawl_check_crawl_status`." + }, + "next": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "description": "URL of the next page of results, when the data is paginated." + }, + "status": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "description": "Crawl state, such as `scraping`, `completed`, or `failed`." + }, + "success": { + "anyOf": [ + { + "type": "boolean" + }, + { + "type": "null" + } + ], + "description": "Whether the API call succeeded." + }, + "total": { + "anyOf": [ + { + "type": "number" + }, + { + "type": "null" + } + ], + "description": "Pages the crawl expects to visit." + }, + "url": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "description": "The URL the crawl started from." + }, + "warning": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "description": "Non-fatal warning about the result." + } + }, + "type": "object" +}
- Changed
firecrawl_crawl5 fields changed- changed
Input schema / $schemaPrevious value: -"https://json-schema.org/draft/2020-12/schema"New value: +"http://json-schema.org/draft-07/schema#" - removed
Input schema / properties / scrapeOptions / properties / actions / items / additionalPropertiesRemoved value: -false - changed
Input schema / properties / scrapeOptions / properties / formats / items / enumPrevious value: -[ - "markdown", - "html", - "rawHtml", - "screenshot", - "links", - "summary", - "changeTracking", - "branding", - "json", - "query", - "audio" -]New value: +[ + "markdown", + "html", + "rawHtml", + "screenshot", + "links", + "images", + "summary", + "changeTracking", + "branding", + "json", + "query", + "audio" +] - changed
Input schema / properties / scrapeOptions / properties / queryOptions / requiredPrevious value: -[ - "prompt", - "mode" -]New value: +[ + "prompt" +] - changed
Output schema / (root)Previous value: -nullNew value: +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "additionalProperties": false, + "description": "Crawl job state and the documents collected so far.", + "properties": { + "completed": { + "anyOf": [ + { + "type": "number" + }, + { + "type": "null" + } + ], + "description": "Pages crawled so far." + }, + "creditsUsed": { + "anyOf": [ + { + "type": "number" + }, + { + "type": "null" + } + ], + "description": "Credits the crawl consumed." + }, + "data": { + "description": "Scraped documents collected by the crawl." + }, + "error": { + "description": "Error message or error object when the call did not succeed." + }, + "expiresAt": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "description": "When the crawl results expire." + }, + "id": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "description": "Crawl identifier, for `firecrawl_check_crawl_status`." + }, + "next": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "description": "URL of the next page of results, when the data is paginated." + }, + "status": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "description": "Crawl state, such as `scraping`, `completed`, or `failed`." + }, + "success": { + "anyOf": [ + { + "type": "boolean" + }, + { + "type": "null" + } + ], + "description": "Whether the API call succeeded." + }, + "total": { + "anyOf": [ + { + "type": "number" + }, + { + "type": "null" + } + ], + "description": "Pages the crawl expects to visit." + }, + "url": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "description": "The URL the crawl started from." + }, + "warning": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "description": "Non-fatal warning about the result." + } + }, + "type": "object" +}
- Added
firecrawl_credit_usage - Added
firecrawl_developer_search - Removed
firecrawl_extract - Changed
firecrawl_feedback11 fields changed- changed
Input schema / $schemaPrevious value: -"https://json-schema.org/draft/2020-12/schema"New value: +"http://json-schema.org/draft-07/schema#" - added
Input schema / properties / capabilityFeedbackAdded value: +{ + "items": { + "additionalProperties": false, + "properties": { + "issue": { + "enum": [ + "new_capability_request", + "missing_capability", + "insufficient_functionality", + "incorrect_result", + "execution_error", + "other" + ], + "type": "string" + }, + "name": { + "maxLength": 200, + "minLength": 1, + "type": "string" + }, + "provider": { + "maxLength": 200, + "minLength": 1, + "type": "string" + }, + "requestedFunctionality": { + "maxLength": 2000, + "minLength": 1, + "type": "string" + }, + "why": { + "maxLength": 2000, + "minLength": 1, + "type": "string" + } + }, + "required": [ + "name", + "provider", + "issue", + "why" + ], + "type": "object" + }, + "maxItems": 20, + "type": "array" +} - changed
Input schema / properties / endpoint / enumPrevious value: -[ - "search", - "scrape", - "parse", - "map" -]New value: +[ + "search", + "scrape", + "parse", + "map", + "alexandria" +] - removed
Input schema / properties / missingContent / items / additionalPropertiesRemoved value: -false - added
Input schema / properties / objectiveAdded value: +{ + "maxLength": 2000, + "minLength": 1, + "type": "string" +} - added
Input schema / properties / providerFeedbackAdded value: +{ + "items": { + "additionalProperties": false, + "properties": { + "issue": { + "enum": [ + "missing_provider", + "insufficient_coverage", + "provider_unavailable", + "other" + ], + "type": "string" + }, + "name": { + "maxLength": 200, + "minLength": 1, + "type": "string" + }, + "why": { + "maxLength": 2000, + "minLength": 1, + "type": "string" + } + }, + "required": [ + "name", + "issue", + "why" + ], + "type": "object" + }, + "maxItems": 20, + "type": "array" +} - added
Input schema / properties / rationaleAdded value: +{ + "maxLength": 2000, + "minLength": 1, + "type": "string" +} - added
Input schema / properties / requestedWebsiteAdded value: +{ + "additionalProperties": false, + "properties": { + "requestedFunctionality": { + "maxLength": 2000, + "minLength": 1, + "type": "string" + }, + "url": { + "format": "uri", + "maxLength": 2048, + "type": "string" + } + }, + "required": [ + "url", + "requestedFunctionality" + ], + "type": "object" +} - removed
Input schema / properties / valuableSources / items / additionalPropertiesRemoved value: -false - changed
Input schema / requiredPrevious value: -[ - "endpoint", - "jobId", - "rating" -]New value: +[ + "endpoint", + "rating" +] - changed
Output schema / (root)Previous value: -nullNew value: +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "additionalProperties": false, + "description": "Result of submitting feedback.", + "properties": { + "alreadySubmitted": { + "anyOf": [ + { + "type": "boolean" + }, + { + "type": "null" + } + ], + "description": "Whether feedback for this job was already recorded." + }, + "creditsRefunded": { + "anyOf": [ + { + "type": "number" + }, + { + "type": "null" + } + ], + "description": "Credits refunded for this submission, when eligible." + }, + "creditsRefundedToday": { + "anyOf": [ + { + "type": "number" + }, + { + "type": "null" + } + ], + "description": "Credits refunded to the team so far this UTC day." + }, + "dailyCapReached": { + "anyOf": [ + { + "type": "boolean" + }, + { + "type": "null" + } + ], + "description": "Whether the daily refund cap is reached; further feedback today still records but refunds nothing." + }, + "dailyRefundCap": { + "anyOf": [ + { + "type": "number" + }, + { + "type": "null" + } + ], + "description": "The team's daily refund cap in credits." + }, + "data": { + "description": "Payload returned with the accepted feedback." + }, + "error": { + "description": "Error message or error object when the call did not succeed." + }, + "feedbackErrorCode": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "description": "Machine-readable reason the submission was rejected." + }, + "feedbackId": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "description": "Identifier of the recorded feedback." + }, + "message": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "description": "Human-readable result of the submission." + }, + "raw": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "description": "Response body when it was not JSON." + }, + "retryable": { + "anyOf": [ + { + "type": "boolean" + }, + { + "type": "null" + } + ], + "description": "Whether retrying the submission can succeed." + }, + "status": { + "anyOf": [ + { + "type": "number" + }, + { + "type": "null" + } + ], + "description": "HTTP status when the submission was rejected." + }, + "success": { + "anyOf": [ + { + "type": "boolean" + }, + { + "type": "null" + } + ], + "description": "Whether the API call succeeded." + }, + "warning": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "description": "Non-fatal warning about the result." + }, + "websiteCapReached": { + "anyOf": [ + { + "type": "boolean" + }, + { + "type": "null" + } + ], + "description": "Alexandria only: whether this website's daily refund cap is reached; feedback about other websites can still refund." + } + }, + "type": "object" +}
- Added
firecrawl_find_tools - Added
firecrawl_gov_search - Changed
firecrawl_interact5 fields changed- changed
Input schema / $schemaPrevious value: -"https://json-schema.org/draft/2020-12/schema"New value: +"http://json-schema.org/draft-07/schema#" - removed
Input schema / properties / scrapeOptions / properties / actions / items / additionalPropertiesRemoved value: -false - changed
Input schema / properties / scrapeOptions / properties / formats / items / enumPrevious value: -[ - "markdown", - "html", - "rawHtml", - "screenshot", - "links", - "summary", - "changeTracking", - "branding", - "json", - "query", - "audio" -]New value: +[ + "markdown", + "html", + "rawHtml", + "screenshot", + "links", + "images", + "summary", + "changeTracking", + "branding", + "json", + "query", + "audio" +] - changed
Input schema / properties / scrapeOptions / properties / queryOptions / requiredPrevious value: -[ - "prompt", - "mode" -]New value: +[ + "prompt" +] - changed
Output schema / (root)Previous value: -nullNew value: +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "additionalProperties": false, + "description": "Result of a browser interaction, with the session identifier to continue or stop it.", + "properties": { + "data": { + "description": "Payload returned by the interaction." + }, + "error": { + "description": "Why the interaction or the session could not run." + }, + "exitCode": { + "anyOf": [ + { + "type": "number" + }, + { + "type": "null" + } + ], + "description": "Exit status of the executed code." + }, + "liveUrl": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "description": "URL for viewing the live session." + }, + "output": { + "description": "Execution output." + }, + "result": { + "description": "Interaction result, when it is not an object of its own." + }, + "scrapeId": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "description": "Session identifier; pass it to reuse the session or to `firecrawl_interact_stop`." + }, + "sessionUrl": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "description": "URL for viewing the live session." + }, + "stderr": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "description": "Standard error of the executed code." + }, + "stdout": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "description": "Standard output of the executed code." + }, + "success": { + "anyOf": [ + { + "type": "boolean" + }, + { + "type": "null" + } + ], + "description": "Whether the API call succeeded." + }, + "url": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "description": "The URL the session was opened from, when opening failed." + } + }, + "type": "object" +}
- Changed
firecrawl_interact_stop2 fields changed- changed
Input schema / $schemaPrevious value: -"https://json-schema.org/draft/2020-12/schema"New value: +"http://json-schema.org/draft-07/schema#" - changed
Output schema / (root)Previous value: -nullNew value: +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "additionalProperties": false, + "description": "Confirmation that the interact session was stopped.", + "properties": { + "error": { + "description": "Error message or error object when the call did not succeed." + }, + "message": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "description": "Confirmation that the session was stopped." + }, + "scrapeId": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "description": "Session that was stopped." + }, + "success": { + "anyOf": [ + { + "type": "boolean" + }, + { + "type": "null" + } + ], + "description": "Whether the API call succeeded." + } + }, + "type": "object" +}
- Changed
firecrawl_map2 fields changed- changed
Input schema / $schemaPrevious value: -"https://json-schema.org/draft/2020-12/schema"New value: +"http://json-schema.org/draft-07/schema#" - changed
Output schema / (root)Previous value: -nullNew value: +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "additionalProperties": false, + "description": "URLs indexed under the requested website.", + "properties": { + "error": { + "description": "Error message or error object when the call did not succeed." + }, + "id": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "description": "Identifier of the map run, for optional map feedback." + }, + "links": { + "description": "URLs discovered under the website." + }, + "success": { + "anyOf": [ + { + "type": "boolean" + }, + { + "type": "null" + } + ], + "description": "Whether the API call succeeded." + }, + "warning": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "description": "Non-fatal warning about the result." + } + }, + "type": "object" +}
- Changed
firecrawl_monitor_check2 fields changed- changed
Input schema / $schemaPrevious value: -"https://json-schema.org/draft/2020-12/schema"New value: +"http://json-schema.org/draft-07/schema#" - changed
Output schema / (root)Previous value: -nullNew value: +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "additionalProperties": false, + "description": "One monitor check with its page-level diff results.", + "properties": { + "data": { + "description": "The check and its page-level results: each page reports `same`, `new`, `changed`, `removed`, or `error`, with diffs and any goal judgment." + }, + "error": { + "description": "Error message or error object when the call did not succeed." + }, + "next": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "description": "URL of the next page of results, when more exist." + }, + "pagination": { + "description": "Pagination metadata for the page results." + }, + "success": { + "anyOf": [ + { + "type": "boolean" + }, + { + "type": "null" + } + ], + "description": "Whether the API call succeeded." + } + }, + "type": "object" +}
- Changed
firecrawl_monitor_checks2 fields changed- changed
Input schema / $schemaPrevious value: -"https://json-schema.org/draft/2020-12/schema"New value: +"http://json-schema.org/draft-07/schema#" - changed
Output schema / (root)Previous value: -nullNew value: +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "additionalProperties": false, + "description": "One page of historical checks for the monitor.", + "properties": { + "data": { + "description": "One page of check summaries." + }, + "error": { + "description": "Error message or error object when the call did not succeed." + }, + "pagination": { + "description": "Pagination metadata for the listing." + }, + "success": { + "anyOf": [ + { + "type": "boolean" + }, + { + "type": "null" + } + ], + "description": "Whether the API call succeeded." + } + }, + "type": "object" +}
- Changed
firecrawl_monitor_create2 fields changed- changed
Input schema / $schemaPrevious value: -"https://json-schema.org/draft/2020-12/schema"New value: +"http://json-schema.org/draft-07/schema#" - changed
Output schema / (root)Previous value: -nullNew value: +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "additionalProperties": false, + "description": "One monitor record.", + "properties": { + "data": { + "description": "The monitor record: configuration, schedule, targets, and current state." + }, + "error": { + "description": "Error message or error object when the call did not succeed." + }, + "success": { + "anyOf": [ + { + "type": "boolean" + }, + { + "type": "null" + } + ], + "description": "Whether the API call succeeded." + } + }, + "type": "object" +}
- Changed
firecrawl_monitor_delete2 fields changed- changed
Input schema / $schemaPrevious value: -"https://json-schema.org/draft/2020-12/schema"New value: +"http://json-schema.org/draft-07/schema#" - changed
Output schema / (root)Previous value: -nullNew value: +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "additionalProperties": false, + "description": "Deletion status for the monitor.", + "properties": { + "data": { + "description": "Deletion details, when the API returns any." + }, + "error": { + "description": "Error message or error object when the call did not succeed." + }, + "success": { + "anyOf": [ + { + "type": "boolean" + }, + { + "type": "null" + } + ], + "description": "Whether the API call succeeded." + } + }, + "type": "object" +}
- Changed
firecrawl_monitor_get2 fields changed- changed
Input schema / $schemaPrevious value: -"https://json-schema.org/draft/2020-12/schema"New value: +"http://json-schema.org/draft-07/schema#" - changed
Output schema / (root)Previous value: -nullNew value: +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "additionalProperties": false, + "description": "One monitor record.", + "properties": { + "data": { + "description": "The monitor record: configuration, schedule, targets, and current state." + }, + "error": { + "description": "Error message or error object when the call did not succeed." + }, + "success": { + "anyOf": [ + { + "type": "boolean" + }, + { + "type": "null" + } + ], + "description": "Whether the API call succeeded." + } + }, + "type": "object" +}
- Changed
firecrawl_monitor_list2 fields changed- changed
Input schema / $schemaPrevious value: -"https://json-schema.org/draft/2020-12/schema"New value: +"http://json-schema.org/draft-07/schema#" - changed
Output schema / (root)Previous value: -nullNew value: +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "additionalProperties": false, + "description": "One page of monitors for the authenticated account.", + "properties": { + "data": { + "description": "One page of monitor records." + }, + "error": { + "description": "Error message or error object when the call did not succeed." + }, + "pagination": { + "description": "Pagination metadata for the listing." + }, + "success": { + "anyOf": [ + { + "type": "boolean" + }, + { + "type": "null" + } + ], + "description": "Whether the API call succeeded." + } + }, + "type": "object" +}
- Changed
firecrawl_monitor_run2 fields changed- changed
Input schema / $schemaPrevious value: -"https://json-schema.org/draft/2020-12/schema"New value: +"http://json-schema.org/draft-07/schema#" - changed
Output schema / (root)Previous value: -nullNew value: +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "additionalProperties": false, + "description": "The check queued outside the monitor schedule.", + "properties": { + "data": { + "description": "The queued check." + }, + "error": { + "description": "Error message or error object when the call did not succeed." + }, + "success": { + "anyOf": [ + { + "type": "boolean" + }, + { + "type": "null" + } + ], + "description": "Whether the API call succeeded." + } + }, + "type": "object" +}
- Changed
firecrawl_monitor_update2 fields changed- changed
Input schema / $schemaPrevious value: -"https://json-schema.org/draft/2020-12/schema"New value: +"http://json-schema.org/draft-07/schema#" - changed
Output schema / (root)Previous value: -nullNew value: +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "additionalProperties": false, + "description": "One monitor record.", + "properties": { + "data": { + "description": "The monitor record: configuration, schedule, targets, and current state." + }, + "error": { + "description": "Error message or error object when the call did not succeed." + }, + "success": { + "anyOf": [ + { + "type": "boolean" + }, + { + "type": "null" + } + ], + "description": "Whether the API call succeeded." + } + }, + "type": "object" +}
- Changed
firecrawl_parse4 fields changed- changed
Input schema / $schemaPrevious value: -"https://json-schema.org/draft/2020-12/schema"New value: +"http://json-schema.org/draft-07/schema#" - added
Input schema / properties / maxAge / descriptionAdded value: +"Ignored: parse never reuses or stores indexed content." - changed
Input schema / properties / queryOptions / requiredPrevious value: -[ - "prompt", - "mode" -]New value: +[ + "prompt" +] - changed
Output schema / (root)Previous value: -nullNew value: +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "additionalProperties": false, + "description": "Parsed document content, or the upload instructions for the hosted two-call flow.", + "properties": { + "data": { + "description": "Parsed document content; can include `data.metadata.scrapeId` for parse feedback." + }, + "error": { + "description": "Error message or error object when the call did not succeed." + }, + "message": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "description": "Guidance for the next call." + }, + "mode": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "description": "Which phase of the hosted flow produced this response." + }, + "nextToolCall": { + "description": "Hosted phase one: the second `firecrawl_parse` call to make once the upload succeeds, as `{name, arguments}`." + }, + "notes": { + "anyOf": [ + { + "items": { + "type": "string" + }, + "type": "array" + }, + { + "type": "null" + } + ], + "description": "Hosted phase one: constraints on completing the upload flow." + }, + "raw": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "description": "Response body when it was not JSON." + }, + "success": { + "anyOf": [ + { + "type": "boolean" + }, + { + "type": "null" + } + ], + "description": "Whether the API call succeeded." + }, + "upload": { + "additionalProperties": false, + "description": "Hosted phase one: how to upload the local file.", + "properties": { + "command": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "description": "Local command that performs the upload. It carries no Firecrawl API key." + }, + "expiresAt": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "description": "When the upload URL expires." + }, + "fields": { + "description": "Form fields the upload request must send, for a POST upload." + }, + "headers": { + "description": "Headers the upload request must send." + }, + "maxSizeBytes": { + "anyOf": [ + { + "type": "number" + }, + { + "type": "null" + } + ], + "description": "Largest file the upload URL accepts." + }, + "method": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "description": "HTTP method for the upload." + }, + "uploadRef": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "description": "Reference to pass back on the second call." + }, + "uploadUrl": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "description": "URL to upload the local file to." + } + }, + "type": "object" + }, + "warning": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "description": "Non-fatal warning about the result." + } + }, + "type": "object" +}
- Changed
firecrawl_research_inspect_paper2 fields changed- changed
Input schema / $schemaPrevious value: -"https://json-schema.org/draft/2020-12/schema"New value: +"http://json-schema.org/draft-07/schema#" - changed
Output schema / (root)Previous value: -nullNew value: +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "additionalProperties": false, + "description": "Canonical metadata for one paper.", + "properties": { + "paper": { + "additionalProperties": false, + "description": "Canonical metadata for the requested paper, absent when it was not found.", + "properties": { + "abstract": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "description": "Paper abstract." + }, + "authors": { + "description": "Authors, as a comma-joined string or as `{name, affiliation}` entries." + }, + "categories": { + "anyOf": [ + { + "items": { + "type": "string" + }, + "type": "array" + }, + { + "type": "null" + } + ], + "description": "Paper categories, such as `cs.LG`." + }, + "createdDate": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "description": "Date the paper was first indexed or published." + }, + "ids": { + "description": "Source identifiers by namespace, such as `arxiv`, `doi`, or `pmid`." + }, + "paperId": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "description": "Canonical paper identifier." + }, + "primaryId": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "description": "Display identifier, ordered for citation and fetch use." + }, + "title": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "description": "Paper title." + }, + "updateDate": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "description": "Date the paper was last updated." + } + }, + "type": "object" + } + }, + "type": "object" +}
- Changed
firecrawl_research_read_paper2 fields changed- changed
Input schema / $schemaPrevious value: -"https://json-schema.org/draft/2020-12/schema"New value: +"http://json-schema.org/draft-07/schema#" - changed
Output schema / (root)Previous value: -nullNew value: +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "additionalProperties": false, + "description": "Full-text passages from one paper.", + "properties": { + "passages": { + "description": "In-body passages relevant to the question; empty when no full text is indexed.", + "items": { + "additionalProperties": {}, + "properties": { + "text": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "description": "Passage text." + } + }, + "type": "object" + }, + "type": "array" + } + }, + "required": [ + "passages" + ], + "type": "object" +}
- Changed
firecrawl_research_related_papers2 fields changed- changed
Input schema / $schemaPrevious value: -"https://json-schema.org/draft/2020-12/schema"New value: +"http://json-schema.org/draft-07/schema#" - changed
Output schema / (root)Previous value: -nullNew value: +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "additionalProperties": false, + "description": "Ranked citation-graph candidates and the size of the evaluated pool.", + "properties": { + "note": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "description": "Note about how the candidates were produced." + }, + "poolSize": { + "description": "Number of candidates evaluated before ranking.", + "type": "number" + }, + "results": { + "description": "Ranked citation-graph candidates.", + "items": { + "additionalProperties": {}, + "properties": { + "abstract": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "description": "Paper abstract." + }, + "authors": { + "description": "Authors, as a comma-joined string or as `{name, affiliation}` entries." + }, + "categories": { + "anyOf": [ + { + "items": { + "type": "string" + }, + "type": "array" + }, + { + "type": "null" + } + ], + "description": "Paper categories, such as `cs.LG`." + }, + "createdDate": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "description": "Date the paper was first indexed or published." + }, + "ids": { + "description": "Source identifiers by namespace, such as `arxiv`, `doi`, or `pmid`." + }, + "paperId": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "description": "Canonical paper identifier." + }, + "primaryId": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "description": "Display identifier, ordered for citation and fetch use." + }, + "title": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "description": "Paper title." + }, + "updateDate": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "description": "Date the paper was last updated." + } + }, + "type": "object" + }, + "type": "array" + } + }, + "required": [ + "results", + "poolSize" + ], + "type": "object" +}
- Removed
firecrawl_research_search_github - Changed
firecrawl_research_search_papers2 fields changed- changed
Input schema / $schemaPrevious value: -"https://json-schema.org/draft/2020-12/schema"New value: +"http://json-schema.org/draft-07/schema#" - changed
Output schema / (root)Previous value: -nullNew value: +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "additionalProperties": false, + "description": "Ranked papers with canonical IDs, titles, authors, and abstracts.", + "properties": { + "results": { + "description": "Ranked papers, in the order the text block lists them.", + "items": { + "additionalProperties": {}, + "properties": { + "abstract": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "description": "Paper abstract." + }, + "authors": { + "description": "Authors, as a comma-joined string or as `{name, affiliation}` entries." + }, + "categories": { + "anyOf": [ + { + "items": { + "type": "string" + }, + "type": "array" + }, + { + "type": "null" + } + ], + "description": "Paper categories, such as `cs.LG`." + }, + "createdDate": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "description": "Date the paper was first indexed or published." + }, + "ids": { + "description": "Source identifiers by namespace, such as `arxiv`, `doi`, or `pmid`." + }, + "paperId": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "description": "Canonical paper identifier." + }, + "primaryId": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "description": "Display identifier, ordered for citation and fetch use." + }, + "title": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "description": "Paper title." + }, + "updateDate": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "description": "Date the paper was last updated." + } + }, + "type": "object" + }, + "type": "array" + } + }, + "required": [ + "results" + ], + "type": "object" +}
- Changed
firecrawl_scrape11 fields changed- changed
Input schema / $schemaPrevious value: -"https://json-schema.org/draft/2020-12/schema"New value: +"http://json-schema.org/draft-07/schema#" - removed
Input schema / properties / actions / items / additionalPropertiesRemoved value: -false - added
Input schema / properties / alexandriaAdded value: +{ + "anyOf": [ + { + "properties": { + "capability": { + "description": "Capability address as returned by search or discover, e.g. \"series/observations\".", + "minLength": 1, + "type": "string" + }, + "options": { + "additionalProperties": {}, + "description": "Capability options as declared by its contract.", + "propertyNames": { + "type": "string" + }, + "type": "object" + }, + "provider": { + "description": "Provider slug, e.g. \"fred\".", + "minLength": 1, + "type": "string" + }, + "version": { + "description": "Optional published workflow version. Omit to use the latest version.", + "maxLength": 128, + "minLength": 1, + "type": "string" + } + }, + "required": [ + "provider", + "capability" + ], + "type": "object" + }, + { + "items": { + "properties": { + "capability": { + "description": "Capability address as returned by search or discover, e.g. \"series/observations\".", + "minLength": 1, + "type": "string" + }, + "options": { + "additionalProperties": {}, + "description": "Capability options as declared by its contract.", + "propertyNames": { + "type": "string" + }, + "type": "object" + }, + "provider": { + "description": "Provider slug, e.g. \"fred\".", + "minLength": 1, + "type": "string" + }, + "version": { + "description": "Optional published workflow version. Omit to use the latest version.", + "maxLength": 128, + "minLength": 1, + "type": "string" + } + }, + "required": [ + "provider", + "capability" + ], + "type": "object" + }, + "maxItems": 10, + "minItems": 1, + "type": "array" + } + ], + "description": "Catalogued Alexandria capability invocation, mutually exclusive with url. One {provider, capability, options} object or an array of 1-10, with contracts available through firecrawl_search or firecrawl_find_tools. Each call may include version to pin a published workflow; omitting it uses latest. Only requestId and timeout are supported alongside alexandria. The selected contract marks required inputs and any requiresOneOf groups (at least one member per group); it may include example.request/example.response and a key field under response (which may differ from records). Where pagination is declared, its fields govern paging with the same filters; catalogue next is separate from provider pagination. Returns per-capability results in data.alexandria with data, records, or an error with a code; individual capabilities can fail even when the outer response succeeds. Some providers require accepted terms; when a response reports a terms requirement, direct the user to the Firecrawl dashboard URL in that response." +} - added
Input schema / properties / domainToolsAdded value: +{ + "description": "URL mode only: include domain-matched Alexandria tools for the page in tools on the returned document. Ignored with alexandria.", + "type": "boolean" +} - changed
Input schema / properties / formats / items / enumPrevious value: -[ - "markdown", - "html", - "rawHtml", - "screenshot", - "links", - "summary", - "changeTracking", - "branding", - "json", - "query", - "audio" -]New value: +[ + "markdown", + "html", + "rawHtml", + "screenshot", + "links", + "images", + "summary", + "changeTracking", + "branding", + "json", + "query", + "audio" +] - changed
Input schema / properties / queryOptions / requiredPrevious value: -[ - "prompt", - "mode" -]New value: +[ + "prompt" +] - added
Input schema / properties / requestIdAdded value: +{ + "description": "Idempotency key bound to one Alexandria execution payload. Generated when omitted and returned with the result.", + "pattern": "^[A-Za-z0-9._:-]{1,128}$", + "type": "string" +} - added
Input schema / properties / timeoutAdded value: +{ + "description": "Execution timeout in milliseconds.", + "exclusiveMinimum": 0, + "maximum": 9007199254740991, + "type": "integer" +} - added
Input schema / properties / toolDetailAdded value: +{ + "description": "URL mode only: domain discovery detail, summary by default; compact returns provider/capability/description, full includes contracts. Ignored with alexandria.", + "enum": [ + "compact", + "summary", + "full" + ], + "type": "string" +} - removed
Input schema / requiredRemoved value: -[ - "url" -] - changed
Output schema / (root)Previous value: -nullNew value: +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "additionalProperties": false, + "description": "A scraped document, or the Alexandria execution envelope when `alexandria` was passed.", + "properties": { + "actions": { + "description": "Results of the browser actions that ran during the scrape." + }, + "answer": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "description": "Targeted answer to the question that was asked of the page." + }, + "attributes": { + "description": "Values collected by the requested attribute selectors." + }, + "audio": { + "description": "Audio extracted from the page." + }, + "blocks": { + "description": "Typed PDF layout blocks, when `parsers[].blocks` is set." + }, + "branding": { + "description": "Branding data extracted from the page." + }, + "changeTracking": { + "description": "Change-tracking comparison against the previous scrape." + }, + "creditsCost": { + "anyOf": [ + { + "type": "number" + }, + { + "type": "null" + } + ], + "description": "Credits this call consumed." + }, + "data": { + "description": "Alexandria mode: per-capability results in `data.alexandria`, each with `data`, `records`, or an `error`." + }, + "delivery": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "description": "`retained` when the full result stayed server-side instead of being inlined." + }, + "error": { + "description": "Error message or error object when the call did not succeed." + }, + "estimatedTokens": { + "anyOf": [ + { + "type": "number" + }, + { + "type": "null" + } + ], + "description": "Estimated token cost of the full result." + }, + "feedbackTool": { + "description": "Pointer to the feedback tool for reporting how this result served the task." + }, + "highlights": { + "description": "Highlighted passages from the page." + }, + "html": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "description": "Processed HTML of the page." + }, + "idleTtlSeconds": { + "anyOf": [ + { + "type": "number" + }, + { + "type": "null" + } + ], + "description": "Seconds a retained workspace stays available while idle." + }, + "images": { + "description": "Images found on the page." + }, + "inlineTokenBudget": { + "anyOf": [ + { + "type": "number" + }, + { + "type": "null" + } + ], + "description": "Token budget above which a result is retained rather than inlined." + }, + "json": { + "description": "Structured data matching the requested JSON schema or prompt." + }, + "links": { + "description": "Links found on the page." + }, + "markdown": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "description": "Page content as markdown." + }, + "menu": { + "description": "Menu data extracted from the page." + }, + "message": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "description": "Guidance that accompanies the result." + }, + "metadata": { + "description": "Page metadata; authenticated responses can include `metadata.scrapeId` for scrape feedback." + }, + "nextTool": { + "description": "A follow-up tool call (`{name, arguments}`) that continues or inspects this result." + }, + "pages": { + "description": "Physical PDF pages, when `parsers[].pages` is set." + }, + "product": { + "description": "Product data extracted from the page." + }, + "rawHtml": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "description": "Unprocessed HTML of the page." + }, + "receipt": { + "description": "Billing receipt for the execution." + }, + "requestId": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "description": "Identifier of this Alexandria execution." + }, + "responseBytes": { + "anyOf": [ + { + "type": "number" + }, + { + "type": "null" + } + ], + "description": "Size of the full result in bytes." + }, + "scrape_id": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "description": "Identifier of the underlying scrape." + }, + "screenshot": { + "description": "Screenshot of the page." + }, + "success": { + "anyOf": [ + { + "type": "boolean" + }, + { + "type": "null" + } + ], + "description": "Whether the API call succeeded." + }, + "summary": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "description": "Summary of the page content." + }, + "tokenEstimateMethod": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "description": "How `estimatedTokens` was derived." + }, + "tools": { + "description": "Domain-matched Alexandria tools for the page, when `domainTools` is set." + }, + "video": { + "description": "Video extracted from the page." + }, + "warning": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "description": "Non-fatal warning about the result." + }, + "workspaceId": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "description": "Workspace holding a retained result, for inspection through virtual Bash." + } + }, + "type": "object" +}
- Changed
firecrawl_search23 fields changed- changed
Input schema / $schemaPrevious value: -"https://json-schema.org/draft/2020-12/schema"New value: +"http://json-schema.org/draft-07/schema#" - changed
Input schema / properties / categories / descriptionPrevious value: -"Limit results to specific source types. `github` searches GitHub repositories, code, issues, and docs; `research` searches academic and research sources; `pdf` searches PDF results."New value: +"Limit results to specific source types. `research` restricts ordinary web results to research-affiliated websites and returns page snippets, which is separate from the `firecrawl_research_*` tools that search paper abstracts and full text across biomedical (PubMed, bioRxiv, medRxiv) and arXiv literature; `pdf` searches PDF results; `developer` searches an index built for coding agents over public repositories, GitHub issues, merged pull requests, repository READMEs, and code documentation; `gov` searches the Government Index of US federal, state, and local legal and regulatory sources, the index behind firecrawl_gov_search, and cannot be combined with other categories; gov hits can include historical versions, bill text, agency guidance, and third-party reproductions, so verify the issuer, jurisdiction, enacted/effective status, and version before citing current governing law, clarify a missing jurisdiction or ambiguous as-of date, and use general search for non-US questions or missing coverage (no hits does not establish that no applicable law exists). `developer` and `gov` return hits in `data.web` with `category` set to their name; the other categories also filter `data.web`." - changed
Input schema / properties / categories / items / enumPrevious value: -[ - "github", - "research", - "pdf" -]New value: +[ + "research", + "pdf", + "developer", + "gov" +] - added
Input schema / properties / domainToolsAdded value: +{ + "description": "Include domain-matched tools for result URLs. Defaults to true when Alexandria is combined with web, news or images; semantic-only search leaves domain matching off.", + "type": "boolean" +} - added
Input schema / properties / excludeDomains / descriptionAdded value: +"Hostnames to leave out of results. Mutually exclusive with includeDomains." - added
Input schema / properties / highlightsAdded value: +{ + "description": "Return query-relevant page excerpts for web and news results when available (default). Highlights appear in web `description` and news `snippet`; otherwise, original snippets are returned. Set to false to keep the original search snippets.", + "type": "boolean" +} - added
Input schema / properties / includeDomains / descriptionAdded value: +"Hostnames to restrict results to. Mutually exclusive with excludeDomains." - added
Input schema / properties / limit / maximumAdded value: +100 - added
Input schema / properties / limit / minimumAdded value: +1 - changed
Input schema / properties / limit / typePrevious value: -"number"New value: +"integer" - added
Input schema / properties / query / descriptionAdded value: +"Query for web and semantic tool discovery. Operators include quoted phrases, `-term`, `site:host`, `inurl:term`, `intitle:term`, and `related:host`; the set is non-exhaustive. Catalogue browsing is available through firecrawl_find_tools." - added
Input schema / properties / scrapeOptions / descriptionAdded value: +"Fetches the full page of every web result in the same call, and each fetched result is billed as a scrape. Leave it unset unless the task needs the full text of a few results: highlights usually answer, and firecrawl_scrape can fetch only the URLs you need. These fetches ignore maxAge, so use firecrawl_scrape for a live fetch. scrapeOptions fetches web pages, never Alexandria provider tools." - removed
Input schema / properties / scrapeOptions / properties / actions / items / additionalPropertiesRemoved value: -false - changed
Input schema / properties / scrapeOptions / properties / formats / items / enumPrevious value: -[ - "markdown", - "html", - "rawHtml", - "screenshot", - "links", - "summary", - "changeTracking", - "branding", - "json", - "query", - "audio" -]New value: +[ + "markdown", + "html", + "rawHtml", + "screenshot", + "links", + "images", + "summary", + "changeTracking", + "branding", + "json", + "query", + "audio" +] - changed
Input schema / properties / scrapeOptions / properties / queryOptions / requiredPrevious value: -[ - "prompt", - "mode" -]New value: +[ + "prompt" +] - added
Input schema / properties / sources / descriptionAdded value: +"Search sources; authenticated sessions default to web + alexandria, keyless sessions to web only. Authenticated searches always add alexandria to the sources, so sources: [\"web\"] also returns providers; domainTools: false turns off website-matched tools only. enterprise zdr or anon searches do not add it. Use [\"alexandria\"] alone for provider discovery without web results." - removed
Input schema / properties / sources / items / additionalPropertiesRemoved value: -false - added
Input schema / properties / sources / items / anyOfAdded value: +[ + { + "enum": [ + "web", + "images", + "news", + "alexandria", + "exchange" + ], + "type": "string" + }, + { + "additionalProperties": false, + "properties": { + "type": { + "enum": [ + "web", + "images", + "news", + "alexandria", + "exchange" + ], + "type": "string" + } + }, + "required": [ + "type" + ], + "type": "object" + } +] - removed
Input schema / properties / sources / items / propertiesRemoved value: -{ - "type": { - "enum": [ - "web", - "images", - "news" - ], - "type": "string" - } -} - removed
Input schema / properties / sources / items / requiredRemoved value: -[ - "type" -] - removed
Input schema / properties / sources / items / typeRemoved value: -"object" - added
Input schema / properties / toolDetailAdded value: +{ + "description": "Compact by default. Compact returns only provider, capability and description; full includes contracts. Inspect selected compact tools with firecrawl_find_tools providers and capabilities.", + "enum": [ + "compact", + "summary", + "full" + ], + "type": "string" +} - changed
Output schema / (root)Previous value: -nullNew value: +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "additionalProperties": false, + "description": "Ranked search results grouped by source.", + "properties": { + "creditsUsed": { + "anyOf": [ + { + "type": "number" + }, + { + "type": "null" + } + ], + "description": "Credits this search consumed." + }, + "data": { + "description": "Ranked results grouped by source, such as `web`, `news`, `images`, and `alexandria`. Each result carries its `source` and a 1-indexed `position` within that group; pass those pairs to `firecrawl_search_feedback`." + }, + "error": { + "description": "Error message or error object when the call did not succeed." + }, + "feedbackTool": { + "description": "Pointer to the feedback tool for this search." + }, + "id": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "description": "Search identifier, for optional `firecrawl_search_feedback`." + }, + "nextTool": { + "description": "A follow-up tool call that continues this search." + }, + "success": { + "anyOf": [ + { + "type": "boolean" + }, + { + "type": "null" + } + ], + "description": "Whether the API call succeeded." + }, + "tools": { + "description": "Domain-matched Alexandria tools for the results." + }, + "warning": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "description": "Non-fatal warning about the result." + } + }, + "type": "object" +}
- Changed
firecrawl_search_feedback5 fields changed- changed
Input schema / $schemaPrevious value: -"https://json-schema.org/draft/2020-12/schema"New value: +"http://json-schema.org/draft-07/schema#" - removed
Input schema / properties / missingContent / items / additionalPropertiesRemoved value: -false - added
Input schema / properties / valuableResultsAdded value: +{ + "description": "Every result that was actually useful, copied from the `source` and `position` stamped on each result. Each group is numbered from 1 independently, so the source is required — `{\"source\":\"web\",\"position\":1}` and `{\"source\":\"news\",\"position\":1}` are different results. Be exhaustive — unlisted results are treated as not useful. Do not also list the same results in valuableSources.", + "items": { + "properties": { + "position": { + "exclusiveMinimum": 0, + "maximum": 9007199254740991, + "type": "integer" + }, + "reason": { + "maxLength": 1000, + "type": "string" + }, + "source": { + "enum": [ + "web", + "images", + "news" + ], + "type": "string" + } + }, + "required": [ + "source", + "position" + ], + "type": "object" + }, + "maxItems": 50, + "type": "array" +} - removed
Input schema / properties / valuableSources / items / additionalPropertiesRemoved value: -false - changed
Output schema / (root)Previous value: -nullNew value: +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "additionalProperties": false, + "description": "Result of submitting feedback.", + "properties": { + "alreadySubmitted": { + "anyOf": [ + { + "type": "boolean" + }, + { + "type": "null" + } + ], + "description": "Whether feedback for this job was already recorded." + }, + "creditsRefunded": { + "anyOf": [ + { + "type": "number" + }, + { + "type": "null" + } + ], + "description": "Credits refunded for this submission, when eligible." + }, + "creditsRefundedToday": { + "anyOf": [ + { + "type": "number" + }, + { + "type": "null" + } + ], + "description": "Credits refunded to the team so far this UTC day." + }, + "dailyCapReached": { + "anyOf": [ + { + "type": "boolean" + }, + { + "type": "null" + } + ], + "description": "Whether the daily refund cap is reached; further feedback today still records but refunds nothing." + }, + "dailyRefundCap": { + "anyOf": [ + { + "type": "number" + }, + { + "type": "null" + } + ], + "description": "The team's daily refund cap in credits." + }, + "data": { + "description": "Payload returned with the accepted feedback." + }, + "error": { + "description": "Error message or error object when the call did not succeed." + }, + "feedbackErrorCode": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "description": "Machine-readable reason the submission was rejected." + }, + "feedbackId": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "description": "Identifier of the recorded feedback." + }, + "message": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "description": "Human-readable result of the submission." + }, + "raw": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "description": "Response body when it was not JSON." + }, + "retryable": { + "anyOf": [ + { + "type": "boolean" + }, + { + "type": "null" + } + ], + "description": "Whether retrying the submission can succeed." + }, + "status": { + "anyOf": [ + { + "type": "number" + }, + { + "type": "null" + } + ], + "description": "HTTP status when the submission was rejected." + }, + "success": { + "anyOf": [ + { + "type": "boolean" + }, + { + "type": "null" + } + ], + "description": "Whether the API call succeeded." + }, + "warning": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "description": "Non-fatal warning about the result." + }, + "websiteCapReached": { + "anyOf": [ + { + "type": "boolean" + }, + { + "type": "null" + } + ], + "description": "Alexandria only: whether this website's daily refund cap is reached; feedback about other websites can still refund." + } + }, + "type": "object" +}
26 tool updates
v1.0.1- 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 28 tools
Core scrape/crawl/map/agent/monitor operations are distinct, but search is split across firecrawl_search, firecrawl_developer_search, firecrawl_gov_search, and firecrawl_research_search_papers, while feedback is split between firecrawl_feedback and firecrawl_search_feedback. The descriptions clarify use cases, but an agent must still choose among overlapping search and feedback entry points.
All tools use the firecrawl_ prefix and snake_case, giving a predictable overall surface. Minor inconsistencies remain in compound ordering and status naming, such as firecrawl_check_crawl_status versus firecrawl_agent_status and firecrawl_monitor_checks versus firecrawl_monitor_check.
At 28 tools the set is heavy for an MCP surface, even for a broad web-data platform. Monitor CRUD, feedback variants, research tools, and specialized searches add many operations that could be consolidated or grouped to improve selection.
The set covers the full lifecycle for its apparent domain: scrape, crawl, map, search, agent research, browser interaction, document parsing, status checks, monitor CRUD/run/checks, research paper tools, feedback, and credit usage. Only minor gaps like job cancellation exist, and agents can work around them.
Maintenance
Related MCP Connectors
One MCP server for all web data. Scrape, search, crawl, and AI research in one install.
Scrape, crawl, and search the web via Firecrawl’s official hosted MCP.
Web scraping MCP server — scrape, extract structured data, screenshot any site with anti-bot bypass.
Hosted Web Crawler MCP server for Claude, ChatGPT and Cursor, with each action switched per account.
Related MCP Servers
- 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-
- AlicenseBqualityDmaintenanceA Model Context Protocol server that enables AI assistants to perform advanced web scraping, crawling, searching, and data extraction through the Firecrawl API.9168,149 npmMIT
- FlicenseBqualityDmaintenanceAn MCP Server for Web scraping and Crawling, built using Crawl4AI224-
- AlicenseAqualityDmaintenanceA Model Context Protocol server that enables web scraping, crawling, and content extraction capabilities through integration with Firecrawl.8168,149 npm2MIT