Skip to main content
Glama
Firecrawl MCP Server

Firecrawl MCP Server

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_scrape when you have a known URL and want its content as markdown or as JSON matching a schema you supply.

  • Use firecrawl_map when you need to discover URLs on a site without fetching their content.

  • Use firecrawl_crawl when you need content from many pages under a site; set limit, includePaths/excludePaths, or maxDiscoveryDepth to bound it.

  • Use firecrawl_search when you're starting from a query rather than a URL and want ranked web results. Results carry excerpts; fetch full pages with firecrawl_scrape on the URLs you need. scrapeOptions fetches 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_interact when a page needs a click, type, or navigate action before you can read it: pass a url for a fresh page or a scrapeId to 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_usage to 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_interact call runs one prompt or code turn to completion and returns control. The session can persist across calls via scrapeId and ends with firecrawl_interact_stop, but you cannot drive it interactively step-by-step from the client side within a single call.

This server lists 27 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 9 tools (search, developer, government, and research search, plus Alexandria catalogue lookup and execution).

Installation

Hosted MCP (keyless free tier)

Connect to the remote hosted server with no setup:

https://mcp.firecrawl.dev/v2/mcp

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

For an API-key connection (for example, an unattended integration), keep the server URL as:

https://mcp.firecrawl.dev/v2/mcp

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

It exposes a fixed set of nine tools: firecrawl_search, firecrawl_developer_search, firecrawl_gov_search, the four firecrawl_research_* tools, and the two Alexandria tools firecrawl_find_tools and firecrawl_scrape. Its firecrawl_search fetches no page content.

Running with npx

env FIRECRAWL_API_KEY=fc-YOUR_API_KEY npx -y firecrawl-mcp

Manual Installation

npm install -g firecrawl-mcp

Running 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

  1. Open Cursor Settings

  2. Go to Features > MCP Servers

  3. Click "+ Add new global MCP server"

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

  1. Open Cursor Settings

  2. Go to Features > MCP Servers

  3. Click "+ Add New MCP Server"

  4. 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-mcp

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

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

FIRECRAWL_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:latest

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

Install with NPX in VS Code Install with NPX in VS Code Insiders

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 key

    • Required 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 instances

    • Example: https://firecrawl.your-domain.com

    • If 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 extension

    • Sent as the integration field of scrape, batch scrape, crawl, map, search, extract, agent, parse, interact and feedback requests

    • Use a value that starts with _, for example _zed

Local HTTP mode

  • FIRECRAWL_MCP_ALLOWED_HOSTS (Optional): Extra host names or addresses the server answers with HTTP_STREAMABLE_SERVER=true or SSE_LOCAL=true, comma-separated

    • localhost, 127.0.0.1, [::1] and a non-wildcard HOST are always allowed; ports are ignored

    • Requests whose Host or Origin header names any other host get 403, except GET and HEAD requests to /health

    • * turns the check off; not used with CLOUD_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, or SSE_LOCAL=true): Clients should send Authorization: Bearer <fco_access_token> on MCP requests. An OAuth bearer token takes precedence over x-firecrawl-api-key / x-api-key when both are present.

  • stdio: Use FIRECRAWL_OAUTH_TOKEN for a static access token, or keep using FIRECRAWL_API_KEY for 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-key

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

Usage 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. search with categories: ["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 scrape alexandria

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 an id field. Every result carries a source and a 1-indexed position, numbered from 1 within its own group — copy the pair straight into firecrawl_search_feedback's valuableResults rather than counting array elements. Pass that id to firecrawl_search_feedback after 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, and data. Use the returned id with firecrawl_check_crawl_status if 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:

  1. Call firecrawl_agent with your prompt/schema → returns job ID

  2. Do other work while the agent researches (can take minutes for complex queries)

  3. Poll firecrawl_agent_status with the job ID to check progress

  4. When 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 pages

  • schema: Optional JSON schema for structured output

  • effort: 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. If true, the agent only visits the URLs in urls.

  • threadId: Optional. Continue an existing thread: the threadId from an earlier firecrawl_agent or firecrawl_agent_status result. Omit to start a new thread. On a follow-up, omitted mode, urls, schema and exchange settings 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 in message instead of a re-run; exchange.requireApproval needs it.

  • exchange: Optional. Alexandria provider settings for this turn, forwarded as-is to POST /v2/agent:

    • enabled, toolkits (up to 5 provider slugs), maxCalls (1 to 30), requireApproval (paid calls end the turn with a pendingApproval; needs mode: "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.skippedProviders on the status result lists the gated providers that would have helped.

      • "ask": the same, plus a terms pendingApproval and exchange.requiresAction with the approval ID and provider requirements. Read terms with terms/show; an organization admin accepts them in the Firecrawl dashboard.

    • approve: { approvalId, callIds?, always? } answers yes to the pendingApproval the previous turn ended on. callIds and always apply to paid-call approvals only.

    • decline: { approvalId } answers no. A declined terms offer keeps those providers out of the rest of the thread.

    • approve and decline need threadId, 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:

  1. Show the user the terms (terms/show through firecrawl_scrape with alexandria).

  2. Direct an organization admin to accept the terms at the provider's URL, or data sources settings. A data request is not consent.

  3. Wait for the admin to confirm acceptance in the dashboard.

  4. Continue the same thread: call firecrawl_agent with the same threadId and exchange.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 threadId and threadTurn. Use firecrawl_agent_status to 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 later

  • completed: Research finished - response includes the extracted data

  • failed: 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 url to scrape and open a page for interaction in one MCP call.

  • Pass scrapeId to continue interacting with an existing scraped page.

  • To save browser state (cookies, localStorage) to a named profile, pass url with scrapeOptions: { "profile": { "name": "my-profile", "saveChanges": true } }. The state is saved when firecrawl_interact_stop ends the session.

  • Pass exactly one of url or scrapeId, plus either prompt or code.

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 including goal, judgeEnabled, webhook, and notification.

  • 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, including diff, snapshot, judgment.meaningful, and judgment.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-special or state-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

{"categories":["podcasts"]}

Providers in that category

{"categories":["podcasts"],"providers":["particle"]}

Compact tool names and descriptions

{"providers":["particle"],"capabilities":["podcasts/episodes/search"]}

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.

16. Credit Usage Tool

The tool requires an authenticated Firecrawl account and is read-only.

  • firecrawl_credit_usage defaults to { "view": "current" } and returns remainingCredits, planCredits, billingPeriodStart, and billingPeriodEnd. Remaining credits can exceed plan credits when the team has top-ups or grants.

  • Pass { "view": "historical" } for calendar-month periods containing startDate, endDate, and creditsUsed. Passing { "byApiKey": true } also selects the historical view and splits periods by API key; each row then includes apiKey. Passing { "byEndpoint": true } instead splits periods by the endpoint that used the credits (scrape, search, crawl, map, agent, ...); each row then includes endpoint. Pass { "bin": "day" } for one period per UTC day instead of per calendar month. Do not combine byApiKey with byEndpoint, or any of these with { "view": "current" }. The latest period's endDate can be null. If the Firecrawl API does not offer the endpoint split or daily periods yet, the result carries a notice and 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 zod

The 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/mcp

Set 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

authenticate(request)

Resolve the session for a request; throw a Response to reject it.

wrapTool(tool)

Decorate every registered tool.

onToolResult(event)

Observe the start and outcome of each tool call.

instructions

Server instructions, or a function choosing from the defaults.

registerExtraTools(registrar, context)

Add tools after the built-in ones.

outboundRequest(session)

Credential and extra headers for each Firecrawl API request.

beforeKeylessRequest(session, origin)

Refuse a keyless request by throwing.

toolFilter(name)

Leave built-in tools out of the instance.

configureHttp(app)

Add HTTP routes.

oauth.protectedResource

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 exceeded

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

Contributing

  1. Fork the repository

  2. Create your feature branch

  3. Run tests: npm test

  4. Submit 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

firecrawl_search

{"query":"<user question>"}

Semantic tools only

firecrawl_search

{"query":"<user question>","sources":["alexandria"]}

Categories

firecrawl_find_tools

{}

Providers in a category

firecrawl_find_tools

{"categories":["<category-id>"]}

Compact provider tools

firecrawl_find_tools

{"providers":["<provider-id>"]}

Selected contract

firecrawl_find_tools

{"providers":["<provider-id>"],"capabilities":["<capability-id>"]}

Execute

firecrawl_scrape

{"alexandria":{"provider":"<provider-id>","capability":"<capability-id>","options":{"<required-field>":"<value>"}}}

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.

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 tools
firecrawl_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.

NameRequiredDescriptionDefault
modeNo"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.
urlsNo
effortNoReasoning budget for the agent task.
promptYes
schemaNo
exchangeNoAlexandria provider settings for this turn, forwarded as the request's exchange object.
threadIdNoContinue this thread: the threadId from an earlier firecrawl_agent or firecrawl_agent_status result. Omit to start a new thread.
maxCreditsNoSpending limit in credits for this run. Defaults to 2500 on the API.
strictConstrainToURLsNoIf true, agent will only visit URLs provided in the urls array.

Output Schema

NameRequiredDescription
idNoAgent job identifier, for `firecrawl_agent_status`.
errorNoError message or error object when the call did not succeed.
statusNoJob state at submission time.
successNoWhether the API call succeeded.
threadIdNoResearch thread this job belongs to.
threadTurnNoTurn number of this job within its thread.

TDQS

A4.6/5.0
Behavior5/5

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.

Conciseness4/5

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.

Completeness5/5

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.

Parameters4/5

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.

Purpose5/5

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.

Usage Guidelines4/5

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 statusA
Read-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.

NameRequiredDescriptionDefault
idYes

Output Schema

NameRequiredDescription
idNoAgent job identifier.
dataNoResearch result, present once the job has completed.
modeNoAgent mode the job ran in.
errorNoError message or error object when the call did not succeed.
modelNoAgent model that ran the job.
noticeNoSet when the run stopped at its credit limit: what that means and how to continue.
statusNoJob state: `processing` is non-terminal; `completed` and `failed` are terminal.
messageNoThe agent's reply; in chat mode, the short answer to a follow-up.
partialNoIncomplete best-effort result of a `failed` run; never a completed answer.
sourcesNoSources the agent read.
successNoWhether the API call succeeded.
exchangeNoWhat 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}.
progressNoProgress information for a running job.
threadIdNoResearch thread this job belongs to.
expiresAtNoWhen the job result expires and can no longer be read.
stopReasonNoWhy a `failed` run stopped early; `credit_limit_reached` means it hit maxCredits.
threadTurnNoTurn number of this job within its thread.
creditsUsedNoCredits the job consumed.
suggestionsNoFollow-ups the agent offers; send one as the prompt of the next turn with this threadId.
pendingApprovalNoSet 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.
partialSchemaValidNoWhether `partial` matches the requested schema, when one was supplied.

TDQS

A4.9/5.0
Behavior5/5

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.

Conciseness5/5

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.

Completeness5/5

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.

Parameters4/5

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.

Purpose5/5

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.

Usage Guidelines5/5

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 statusA
Read-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.

NameRequiredDescriptionDefault
idYes

Output Schema

NameRequiredDescription
idNoCrawl identifier, for `firecrawl_check_crawl_status`.
urlNoThe URL the crawl started from.
dataNoScraped documents collected by the crawl.
nextNoURL of the next page of results, when the data is paginated.
errorNoError message or error object when the call did not succeed.
totalNoPages the crawl expects to visit.
statusNoCrawl state, such as `scraping`, `completed`, or `failed`.
successNoWhether the API call succeeded.
warningNoNon-fatal warning about the result.
completedNoPages crawled so far.
expiresAtNoWhen the crawl results expire.
creditsUsedNoCredits the crawl consumed.

TDQS

A3.6/5.0
Behavior3/5

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.

Conciseness5/5

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.

Completeness4/5

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.

Parameters3/5

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.

Purpose4/5

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.

Usage Guidelines3/5

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.

NameRequiredDescriptionDefault
urlYes
delayNo
limitNo
promptNo
sitemapNo
webhookNo
excludePathsNo
includePathsNo
scrapeOptionsNo
maxConcurrencyNo
webhookHeadersNo
allowSubdomainsNo
crawlEntireDomainNo
maxDiscoveryDepthNo
allowExternalLinksNo
ignoreQueryParametersNo
deduplicateSimilarURLsNo

Output Schema

NameRequiredDescription
idNoCrawl identifier, for `firecrawl_check_crawl_status`.
urlNoThe URL the crawl started from.
dataNoScraped documents collected by the crawl.
nextNoURL of the next page of results, when the data is paginated.
errorNoError message or error object when the call did not succeed.
totalNoPages the crawl expects to visit.
statusNoCrawl state, such as `scraping`, `completed`, or `failed`.
successNoWhether the API call succeeded.
warningNoNon-fatal warning about the result.
completedNoPages crawled so far.
expiresAtNoWhen the crawl results expire.
creditsUsedNoCredits the crawl consumed.

TDQS

A3.7/5.0
Behavior4/5

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.

Conciseness4/5

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.

Completeness4/5

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.

Parameters3/5

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.

Purpose4/5

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.

Usage Guidelines3/5

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 usageA
Read-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.

NameRequiredDescriptionDefault
binNoLength 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".
viewNoSelect current balance or historical usage. Defaults to current.
byApiKeyNoBreak historical usage down by API key. When view is omitted, true selects the historical view; it cannot be combined with view "current".
byEndpointNoBreak 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

NameRequiredDescription
binNoPeriod length the API applied, `month` or `day`; present when the API applied a requested endpoint split or daily periods.
errorNoError message or error object when the call did not succeed.
noticeNoPresent when the requested split or daily periods are not available yet; the periods are then calendar-month figures.
periodsNoHistorical periods sorted by start date, each with `startDate`, `endDate`, `creditsUsed`, and `endpoint` or `apiKey` when split.
successNoWhether the API call succeeded.
planCreditsNoCredits included in the plan for the period.
billingPeriodEndNoEnd of the current billing period; null when the billing provider reports no period.
remainingCreditsNoCredits left in the current billing period; can exceed `planCredits` when extra credits were purchased or granted.
billingPeriodStartNoStart of the current billing period; null when the billing provider reports no period.

TDQS

A4.8/5.0
Behavior5/5

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.

Conciseness4/5

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.

Completeness5/5

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.

Parameters4/5

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

Schema description coverage is 100%, so the schema already 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.

Purpose5/5

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.

Usage Guidelines5/5

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

NameRequiredDescriptionDefault
urlNo
noteNo
tagsNo
jobIdNo
issuesNo
ratingYes
endpointYes
metadataNo
objectiveNo
rationaleNo
pageNumbersNo
missingContentNo
valuableSourcesNo
providerFeedbackNo
querySuggestionsNo
requestedWebsiteNo
capabilityFeedbackNo

Output Schema

NameRequiredDescription
rawNoResponse body when it was not JSON.
dataNoPayload returned with the accepted feedback.
errorNoError message or error object when the call did not succeed.
statusNoHTTP status when the submission was rejected.
messageNoHuman-readable result of the submission.
successNoWhether the API call succeeded.
warningNoNon-fatal warning about the result.
retryableNoWhether retrying the submission can succeed.
feedbackIdNoIdentifier of the recorded feedback.
dailyRefundCapNoThe team's daily refund cap in credits.
creditsRefundedNoCredits refunded for this submission, when eligible.
dailyCapReachedNoWhether the daily refund cap is reached; further feedback today still records but refunds nothing.
alreadySubmittedNoWhether feedback for this job was already recorded.
feedbackErrorCodeNoMachine-readable reason the submission was rejected.
websiteCapReachedNoAlexandria only: whether this website's daily refund cap is reached; feedback about other websites can still refund.
creditsRefundedTodayNoCredits refunded to the team so far this UTC day.

TDQS

A3.8/5.0
Behavior4/5

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.

Conciseness4/5

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.

Completeness3/5

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.

Parameters3/5

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.

Purpose4/5

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.

Usage Guidelines4/5

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 ToolsA
Read-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.

NameRequiredDescriptionDefault
urlsNo
levelNoUsually 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.
limitNo
queryNoSemantic lookup of tools for the data you need. Selectors constrain the search.
expandNoUse ["options", "response"] for inputs and output shape without example payloads; [] keeps results compact. Omit for full contracts on selected capabilities.
groupsNoOptional group IDs for explicit group browsing.
offsetNo
providersNoValues from each listed tool's `provider` field (e.g. "apps-apple-com"). Alone, lists that provider's compact tools; with capabilities, scopes them.
categoriesNoCategory IDs returned by an empty call. Lists providers by default.
capabilitiesNoValues 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.
includeCostsNoInclude per-capability credit prices (creditsCost, perRecord) in tool results.

Output Schema

NameRequiredDescription
dataNoDiscovery page in `data.alexandria[0].data`, with `level`, `items`, `total`, and an optional `nextTool`.
errorNoError message or error object when the call did not succeed.
messageNoGuidance that accompanies the result.
receiptNoBilling receipt for the execution.
successNoWhether the API call succeeded.
deliveryNo`retained` when the full result stayed server-side instead of being inlined.
nextToolNoA follow-up tool call (`{name, arguments}`) that continues or inspects this result.
requestIdNoIdentifier of this Alexandria execution.
scrape_idNoIdentifier of the underlying scrape.
creditsCostNoCredits this call consumed.
workspaceIdNoWorkspace holding a retained result, for inspection through virtual Bash.
feedbackToolNoPointer to the feedback tool for reporting how this result served the task.
responseBytesNoSize of the full result in bytes.
idleTtlSecondsNoSeconds a retained workspace stays available while idle.
estimatedTokensNoEstimated token cost of the full result.
inlineTokenBudgetNoToken budget above which a result is retained rather than inlined.
tokenEstimateMethodNoHow `estimatedTokens` was derived.

TDQS

A4.6/5.0
Behavior4/5

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.

Conciseness4/5

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.

Completeness5/5

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.

Parameters4/5

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.

Purpose5/5

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.

Usage Guidelines5/5

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

NameRequiredDescriptionDefault
urlNo
codeNo
promptNo
timeoutNo
languageNo
scrapeIdNo
scrapeOptionsNo

Output Schema

NameRequiredDescription
urlNoThe URL the session was opened from, when opening failed.
dataNoPayload returned by the interaction.
errorNoWhy the interaction or the session could not run.
outputNoExecution output.
resultNoInteraction result, when it is not an object of its own.
stderrNoStandard error of the executed code.
stdoutNoStandard output of the executed code.
liveUrlNoURL for viewing the live session.
successNoWhether the API call succeeded.
exitCodeNoExit status of the executed code.
scrapeIdNoSession identifier; pass it to reuse the session or to `firecrawl_interact_stop`.
sessionUrlNoURL for viewing the live session.

TDQS

A4.1/5.0
Behavior4/5

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.

Conciseness4/5

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.

Completeness4/5

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.

Parameters3/5

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.

Purpose5/5

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.

Usage Guidelines4/5

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

Stop the live interact session associated with a scrapeId and release its resources. Returns a success confirmation.

NameRequiredDescriptionDefault
scrapeIdYes

Output Schema

NameRequiredDescription
errorNoError message or error object when the call did not succeed.
messageNoConfirmation that the session was stopped.
successNoWhether the API call succeeded.
scrapeIdNoSession that was stopped.

TDQS

A3.6/5.0
Behavior3/5

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.

Conciseness5/5

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.

Completeness4/5

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.

Parameters3/5

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.

Purpose4/5

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.

Usage Guidelines3/5

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 mapA
Read-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.

NameRequiredDescriptionDefault
urlYes
limitNo
searchNo
sitemapNo
includeSubdomainsNo
ignoreQueryParametersNo

Output Schema

NameRequiredDescription
idNoIdentifier of the map run, for optional map feedback.
errorNoError message or error object when the call did not succeed.
linksNoURLs discovered under the website.
successNoWhether the API call succeeded.
warningNoNon-fatal warning about the result.

TDQS

A4.6/5.0
Behavior4/5

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.

Conciseness5/5

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.

Completeness4/5

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.

Parameters4/5

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.

Purpose5/5

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.

Usage Guidelines5/5

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 checkA
Read-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.

NameRequiredDescriptionDefault
idYes
skipNo
limitNo
checkIdYes
pageStatusNo

Output Schema

NameRequiredDescription
dataNoThe check and its page-level results: each page reports `same`, `new`, `changed`, `removed`, or `error`, with diffs and any goal judgment.
nextNoURL of the next page of results, when more exist.
errorNoError message or error object when the call did not succeed.
successNoWhether the API call succeeded.
paginationNoPagination metadata for the page results.

TDQS

A3.5/5.0
Behavior4/5

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.

Conciseness5/5

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.

Completeness3/5

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.

Parameters2/5

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.

Purpose4/5

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.

Usage Guidelines3/5

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 checksB
Read-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.

NameRequiredDescriptionDefault
idYes
limitNo
offsetNo
statusNo

Output Schema

NameRequiredDescription
dataNoOne page of check summaries.
errorNoError message or error object when the call did not succeed.
successNoWhether the API call succeeded.
paginationNoPagination metadata for the listing.

TDQS

B3.3/5.0
Behavior3/5

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.

Conciseness5/5

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.

Completeness3/5

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.

Parameters2/5

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.

Purpose4/5

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.

Usage Guidelines3/5

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.

NameRequiredDescriptionDefault
bodyNo
goalNo
nameNo
pageNo
emailNo
pagesNo
queriesNo
timezoneNo
maxResultsNo
webhookUrlNo
includeDiffsNo
scheduleTextNo
searchWindowNo
excludeDomainsNo
includeDomainsNo

Output Schema

NameRequiredDescription
dataNoThe monitor record: configuration, schedule, targets, and current state.
errorNoError message or error object when the call did not succeed.
successNoWhether the API call succeeded.

TDQS

A4/5.0
Behavior4/5

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.

Conciseness4/5

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.

Completeness3/5

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.

Parameters3/5

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.

Purpose5/5

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.

Usage Guidelines4/5

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

Permanently delete a monitor by ID and stop its future schedule. This operation cannot be undone and returns deletion status.

NameRequiredDescriptionDefault
idYes

Output Schema

NameRequiredDescription
dataNoDeletion details, when the API returns any.
errorNoError message or error object when the call did not succeed.
successNoWhether the API call succeeded.

TDQS

A3.9/5.0
Behavior4/5

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.

Conciseness5/5

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.

Completeness4/5

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.

Parameters2/5

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.

Purpose5/5

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.

Usage Guidelines3/5

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 monitorA
Read-only

Retrieve one monitor by ID, including its configuration and current state. This does not run or modify the monitor.

NameRequiredDescriptionDefault
idYes

Output Schema

NameRequiredDescription
dataNoThe monitor record: configuration, schedule, targets, and current state.
errorNoError message or error object when the call did not succeed.
successNoWhether the API call succeeded.

TDQS

A3.6/5.0
Behavior3/5

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.

Conciseness5/5

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.

Completeness4/5

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.

Parameters3/5

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.

Purpose4/5

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.

Usage Guidelines3/5

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 monitorsB
Read-only

List monitors for the authenticated account with optional pagination controls. Returns one page of monitor records and pagination metadata.

NameRequiredDescriptionDefault
limitNo
offsetNo

Output Schema

NameRequiredDescription
dataNoOne page of monitor records.
errorNoError message or error object when the call did not succeed.
successNoWhether the API call succeeded.
paginationNoPagination metadata for the listing.

TDQS

B3.4/5.0
Behavior3/5

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.

Conciseness4/5

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.

Completeness3/5

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.

Parameters3/5

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.

Purpose4/5

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.

Usage Guidelines3/5

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.

NameRequiredDescriptionDefault
idYes

Output Schema

NameRequiredDescription
dataNoThe queued check.
errorNoError message or error object when the call did not succeed.
successNoWhether the API call succeeded.

TDQS

A4/5.0
Behavior4/5

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.

Conciseness5/5

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.

Completeness4/5

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.

Parameters3/5

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.

Purpose4/5

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.

Usage Guidelines4/5

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

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.

NameRequiredDescriptionDefault
idYes
bodyYes

Output Schema

NameRequiredDescription
dataNoThe monitor record: configuration, schedule, targets, and current state.
errorNoError message or error object when the call did not succeed.
successNoWhether the API call succeeded.

TDQS

A3.8/5.0
Behavior4/5

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.

Conciseness5/5

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.

Completeness4/5

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.

Parameters3/5

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.

Purpose4/5

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.

Usage Guidelines3/5

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 parsingA
Read-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.

NameRequiredDescriptionDefault
proxyNo
maxAgeNoIgnored: parse never reuses or stores indexed content.
formatsNo
parsersNo
filePathYesAbsolute or relative path to a local file to parse. Supported: .html, .htm, .pdf, .docx, .doc, .odt, .rtf, .xlsx, .xls
redactPIINo
pdfOptionsNo
contentTypeNoOptional MIME type override. If omitted, the server infers the file kind from the extension.
excludeTagsNo
includeTagsNo
jsonOptionsNo
queryOptionsNo
storeInCacheNo
onlyMainContentNo
zeroDataRetentionNo
removeBase64ImagesNo
skipTlsVerificationNo

Output Schema

NameRequiredDescription
rawNoResponse body when it was not JSON.
dataNoParsed document content; can include `data.metadata.scrapeId` for parse feedback.
modeNoWhich phase of the hosted flow produced this response.
errorNoError message or error object when the call did not succeed.
notesNoHosted phase one: constraints on completing the upload flow.
uploadNoHosted phase one: how to upload the local file.
messageNoGuidance for the next call.
successNoWhether the API call succeeded.
warningNoNon-fatal warning about the result.
nextToolCallNoHosted phase one: the second `firecrawl_parse` call to make once the upload succeeds, as `{name, arguments}`.

TDQS

A4.3/5.0
Behavior5/5

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.

Conciseness4/5

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.

Completeness3/5

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.

Parameters2/5

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.

Purpose5/5

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.

Usage Guidelines5/5

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 paperA
Read-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.

NameRequiredDescriptionDefault
paperIdYesCanonical paperId or primaryId such as `arxiv:1706.03762`, `pmcid:PMC12530322`, `pmid:40953549`, or `doi:10.1016/j.neunet.2025.108095`.

Output Schema

NameRequiredDescription
paperNoCanonical metadata for the requested paper, absent when it was not found.

TDQS

A3.6/5.0
Behavior3/5

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.

Conciseness5/5

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.

Completeness4/5

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.

Parameters3/5

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.

Purpose4/5

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.

Usage Guidelines3/5

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 paperA
Read-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.

NameRequiredDescriptionDefault
kNoNumber of passages to return (default 4).
paperIdYesCanonical paperId or primaryId such as `arxiv:1706.03762`, `pmcid:PMC12530322`, `pmid:40953549`, or `doi:10.1016/j.neunet.2025.108095`.
questionYes

Output Schema

NameRequiredDescription
passagesYesIn-body passages relevant to the question; empty when no full text is indexed.

TDQS

A3.6/5.0
Behavior4/5

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.

Conciseness4/5

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.

Completeness3/5

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.

Parameters3/5

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.

Purpose4/5

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.

Usage Guidelines3/5

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 searchA
Read-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.

NameRequiredDescriptionDefault
kNoNumber of ranked papers to return (default 40).
toNoInclusive upper bound on created/updated date (`YYYY-MM-DD`).
fromNoInclusive lower bound on created/updated date (`YYYY-MM-DD`).
sortNo`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.
queryYesNatural-language research topic or question, including methods, systems, conditions, populations, interventions, or outcomes when relevant.
authorsNoAuthor substring filter(s); ALL must match (case-insensitive).
categoriesNoPaper category filter(s) (e.g. `cs.LG`); ALL provided values must match.

Output Schema

NameRequiredDescription
resultsYesRanked papers, in the order the text block lists them.

TDQS

A3.7/5.0
Behavior4/5

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.

Conciseness4/5

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.

Completeness4/5

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.

Parameters3/5

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.

Purpose4/5

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.

Usage Guidelines3/5

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.

NameRequiredDescriptionDefault
urlNo
proxyNo
maxAgeNo
mobileNo
actionsNo
formatsNo
parsersNo
profileNo
timeoutNoExecution timeout in milliseconds.
waitForNo
locationNo
lockdownNo
redactPIINo
requestIdNoIdempotency key bound to one Alexandria execution payload. Generated when omitted and returned with the result.
alexandriaNoCatalogued 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.
pdfOptionsNo
toolDetailNoURL mode only: domain discovery detail, summary by default; compact returns provider/capability/description, full includes contracts. Ignored with alexandria.
domainToolsNoURL mode only: include domain-matched Alexandria tools for the page in tools on the returned document. Ignored with alexandria.
excludeTagsNo
includeTagsNo
jsonOptionsNo
queryOptionsNo
storeInCacheNo
onlyMainContentNo
screenshotOptionsNo
zeroDataRetentionNo
removeBase64ImagesNo
skipTlsVerificationNo

Output Schema

NameRequiredDescription
dataNoAlexandria mode: per-capability results in `data.alexandria`, each with `data`, `records`, or an `error`.
htmlNoProcessed HTML of the page.
jsonNoStructured data matching the requested JSON schema or prompt.
menuNoMenu data extracted from the page.
audioNoAudio extracted from the page.
errorNoError message or error object when the call did not succeed.
linksNoLinks found on the page.
pagesNoPhysical PDF pages, when `parsers[].pages` is set.
toolsNoDomain-matched Alexandria tools for the page, when `domainTools` is set.
videoNoVideo extracted from the page.
answerNoTargeted answer to the question that was asked of the page.
blocksNoTyped PDF layout blocks, when `parsers[].blocks` is set.
imagesNoImages found on the page.
actionsNoResults of the browser actions that ran during the scrape.
messageNoGuidance that accompanies the result.
productNoProduct data extracted from the page.
rawHtmlNoUnprocessed HTML of the page.
receiptNoBilling receipt for the execution.
successNoWhether the API call succeeded.
summaryNoSummary of the page content.
warningNoNon-fatal warning about the result.
brandingNoBranding data extracted from the page.
deliveryNo`retained` when the full result stayed server-side instead of being inlined.
markdownNoPage content as markdown.
metadataNoPage metadata; authenticated responses can include `metadata.scrapeId` for scrape feedback.
nextToolNoA follow-up tool call (`{name, arguments}`) that continues or inspects this result.
requestIdNoIdentifier of this Alexandria execution.
scrape_idNoIdentifier of the underlying scrape.
attributesNoValues collected by the requested attribute selectors.
highlightsNoHighlighted passages from the page.
screenshotNoScreenshot of the page.
creditsCostNoCredits this call consumed.
workspaceIdNoWorkspace holding a retained result, for inspection through virtual Bash.
feedbackToolNoPointer to the feedback tool for reporting how this result served the task.
responseBytesNoSize of the full result in bytes.
changeTrackingNoChange-tracking comparison against the previous scrape.
idleTtlSecondsNoSeconds a retained workspace stays available while idle.
estimatedTokensNoEstimated token cost of the full result.
inlineTokenBudgetNoToken budget above which a result is retained rather than inlined.
tokenEstimateMethodNoHow `estimatedTokens` was derived.

TDQS

A4.3/5.0
Behavior5/5

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.

Conciseness3/5

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.

Completeness4/5

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.

Parameters2/5

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.

Purpose5/5

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.

Usage Guidelines5/5

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

NameRequiredDescriptionDefault
ratingYes
searchIdYes
missingContentNoArray 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`.
valuableResultsNoEvery 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.
valuableSourcesNo
querySuggestionsNo

Output Schema

NameRequiredDescription
rawNoResponse body when it was not JSON.
dataNoPayload returned with the accepted feedback.
errorNoError message or error object when the call did not succeed.
statusNoHTTP status when the submission was rejected.
messageNoHuman-readable result of the submission.
successNoWhether the API call succeeded.
warningNoNon-fatal warning about the result.
retryableNoWhether retrying the submission can succeed.
feedbackIdNoIdentifier of the recorded feedback.
dailyRefundCapNoThe team's daily refund cap in credits.
creditsRefundedNoCredits refunded for this submission, when eligible.
dailyCapReachedNoWhether the daily refund cap is reached; further feedback today still records but refunds nothing.
alreadySubmittedNoWhether feedback for this job was already recorded.
feedbackErrorCodeNoMachine-readable reason the submission was rejected.
websiteCapReachedNoAlexandria only: whether this website's daily refund cap is reached; feedback about other websites can still refund.
creditsRefundedTodayNoCredits refunded to the team so far this UTC day.

TDQS

A4.5/5.0
Behavior5/5

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.

Conciseness4/5

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.

Completeness4/5

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.

Parameters4/5

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.

Purpose5/5

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.

Usage Guidelines4/5

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.

  1. 12 tool updatesv3.36.1
    • Changedfirecrawl_agent1 field changed
      • changedInput schema / properties / schema / additionalProperties
        Previous value: -{}New value: +true
    • Changedfirecrawl_crawl1 field changed
      • changedInput schema / properties / scrapeOptions / properties / jsonOptions / properties / schema / additionalProperties
        Previous value: -{}New value: +true
    • Changedfirecrawl_feedback1 field changed
      • changedInput schema / properties / metadata / additionalProperties
        Previous value: -{}New value: +true
    • Changedfirecrawl_interact1 field changed
      • changedInput schema / properties / scrapeOptions / properties / jsonOptions / properties / schema / additionalProperties
        Previous value: -{}New value: +true
    • Changedfirecrawl_monitor_create1 field changed
      • changedInput schema / properties / body / additionalProperties
        Previous value: -{}New value: +true
    • Changedfirecrawl_monitor_update1 field changed
      • changedInput schema / properties / body / additionalProperties
        Previous value: -{}New value: +true
    • Changedfirecrawl_parse1 field changed
      • changedInput schema / properties / jsonOptions / properties / schema / additionalProperties
        Previous value: -{}New value: +true
    • Changedfirecrawl_research_inspect_paper3 fields changed
      • changedOutput schema / properties / paper / properties / authors / description
        Previous 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."
      • changedOutput schema / properties / paper / properties / createdDate / description
        Previous value: -"Date the paper was first indexed or published."New value: +"Date the paper was first indexed or published (`YYYY-MM-DD`)."
      • changedOutput schema / properties / paper / properties / updateDate / description
        Previous value: -"Date the paper was last updated."New value: +"Date the paper was last updated (`YYYY-MM-DD`)."
    • Changedfirecrawl_research_related_papers3 fields changed
      • changedOutput schema / properties / results / items / properties / authors / description
        Previous 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."
      • changedOutput schema / properties / results / items / properties / createdDate / description
        Previous value: -"Date the paper was first indexed or published."New value: +"Date the paper was first indexed or published (`YYYY-MM-DD`)."
      • changedOutput schema / properties / results / items / properties / updateDate / description
        Previous value: -"Date the paper was last updated."New value: +"Date the paper was last updated (`YYYY-MM-DD`)."
    • Changedfirecrawl_research_search_papers4 fields changed
      • addedInput schema / properties / sort
        Added 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"
        +}
      • changedOutput schema / properties / results / items / properties / authors / description
        Previous 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."
      • changedOutput schema / properties / results / items / properties / createdDate / description
        Previous value: -"Date the paper was first indexed or published."New value: +"Date the paper was first indexed or published (`YYYY-MM-DD`)."
      • changedOutput schema / properties / results / items / properties / updateDate / description
        Previous value: -"Date the paper was last updated."New value: +"Date the paper was last updated (`YYYY-MM-DD`)."
    • Changedfirecrawl_scrape2 fields changed
      • changedInput schema / properties / alexandria / anyOf
        Previous 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"
        +  }
        +]
      • changedInput schema / properties / jsonOptions / properties / schema / additionalProperties
        Previous value: -{}New value: +true
    • Changedfirecrawl_search1 field changed
      • changedInput schema / properties / scrapeOptions / properties / jsonOptions / properties / schema / additionalProperties
        Previous value: -{}New value: +true
  2. 30 tool updatesv1.0.2
    • Changedfirecrawl_agent8 fields changed
      • changedInput schema / $schema
        Previous value: -"https://json-schema.org/draft/2020-12/schema"New value: +"http://json-schema.org/draft-07/schema#"
      • addedInput schema / properties / effort
        Added value: +{
        +  "description": "Reasoning budget for the agent task.",
        +  "enum": [
        +    "low",
        +    "medium",
        +    "high"
        +  ],
        +  "type": "string"
        +}
      • addedInput schema / properties / exchange
        Added 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"
        +}
      • addedInput schema / properties / maxCredits
        Added value: +{
        +  "description": "Spending limit in credits for this run. Defaults to 2500 on the API.",
        +  "exclusiveMinimum": 0,
        +  "maximum": 9007199254740991,
        +  "type": "integer"
        +}
      • addedInput schema / properties / mode
        Added 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"
        +}
      • addedInput schema / properties / strictConstrainToURLs
        Added value: +{
        +  "description": "If true, agent will only visit URLs provided in the urls array.",
        +  "type": "boolean"
        +}
      • addedInput schema / properties / threadId
        Added 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"
        +}
      • changedOutput 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"
        +}
    • Changedfirecrawl_agent_status2 fields changed
      • changedInput schema / $schema
        Previous value: -"https://json-schema.org/draft/2020-12/schema"New value: +"http://json-schema.org/draft-07/schema#"
      • changedOutput 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"
        +}
    • Changedfirecrawl_check_crawl_status2 fields changed
      • changedInput schema / $schema
        Previous value: -"https://json-schema.org/draft/2020-12/schema"New value: +"http://json-schema.org/draft-07/schema#"
      • changedOutput 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"
        +}
    • Changedfirecrawl_crawl5 fields changed
      • changedInput schema / $schema
        Previous value: -"https://json-schema.org/draft/2020-12/schema"New value: +"http://json-schema.org/draft-07/schema#"
      • removedInput schema / properties / scrapeOptions / properties / actions / items / additionalProperties
        Removed value: -false
      • changedInput schema / properties / scrapeOptions / properties / formats / items / enum
        Previous 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"
        +]
      • changedInput schema / properties / scrapeOptions / properties / queryOptions / required
        Previous value: -[
        -  "prompt",
        -  "mode"
        -]New value: +[
        +  "prompt"
        +]
      • changedOutput 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"
        +}
    • Addedfirecrawl_credit_usage
    • Addedfirecrawl_developer_search
    • Removedfirecrawl_extract
    • Changedfirecrawl_feedback11 fields changed
      • changedInput schema / $schema
        Previous value: -"https://json-schema.org/draft/2020-12/schema"New value: +"http://json-schema.org/draft-07/schema#"
      • addedInput schema / properties / capabilityFeedback
        Added 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"
        +}
      • changedInput schema / properties / endpoint / enum
        Previous value: -[
        -  "search",
        -  "scrape",
        -  "parse",
        -  "map"
        -]New value: +[
        +  "search",
        +  "scrape",
        +  "parse",
        +  "map",
        +  "alexandria"
        +]
      • removedInput schema / properties / missingContent / items / additionalProperties
        Removed value: -false
      • addedInput schema / properties / objective
        Added value: +{
        +  "maxLength": 2000,
        +  "minLength": 1,
        +  "type": "string"
        +}
      • addedInput schema / properties / providerFeedback
        Added 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"
        +}
      • addedInput schema / properties / rationale
        Added value: +{
        +  "maxLength": 2000,
        +  "minLength": 1,
        +  "type": "string"
        +}
      • addedInput schema / properties / requestedWebsite
        Added value: +{
        +  "additionalProperties": false,
        +  "properties": {
        +    "requestedFunctionality": {
        +      "maxLength": 2000,
        +      "minLength": 1,
        +      "type": "string"
        +    },
        +    "url": {
        +      "format": "uri",
        +      "maxLength": 2048,
        +      "type": "string"
        +    }
        +  },
        +  "required": [
        +    "url",
        +    "requestedFunctionality"
        +  ],
        +  "type": "object"
        +}
      • removedInput schema / properties / valuableSources / items / additionalProperties
        Removed value: -false
      • changedInput schema / required
        Previous value: -[
        -  "endpoint",
        -  "jobId",
        -  "rating"
        -]New value: +[
        +  "endpoint",
        +  "rating"
        +]
      • changedOutput 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"
        +}
    • Addedfirecrawl_find_tools
    • Addedfirecrawl_gov_search
    • Changedfirecrawl_interact5 fields changed
      • changedInput schema / $schema
        Previous value: -"https://json-schema.org/draft/2020-12/schema"New value: +"http://json-schema.org/draft-07/schema#"
      • removedInput schema / properties / scrapeOptions / properties / actions / items / additionalProperties
        Removed value: -false
      • changedInput schema / properties / scrapeOptions / properties / formats / items / enum
        Previous 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"
        +]
      • changedInput schema / properties / scrapeOptions / properties / queryOptions / required
        Previous value: -[
        -  "prompt",
        -  "mode"
        -]New value: +[
        +  "prompt"
        +]
      • changedOutput 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"
        +}
    • Changedfirecrawl_interact_stop2 fields changed
      • changedInput schema / $schema
        Previous value: -"https://json-schema.org/draft/2020-12/schema"New value: +"http://json-schema.org/draft-07/schema#"
      • changedOutput 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"
        +}
    • Changedfirecrawl_map2 fields changed
      • changedInput schema / $schema
        Previous value: -"https://json-schema.org/draft/2020-12/schema"New value: +"http://json-schema.org/draft-07/schema#"
      • changedOutput 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"
        +}
    • Changedfirecrawl_monitor_check2 fields changed
      • changedInput schema / $schema
        Previous value: -"https://json-schema.org/draft/2020-12/schema"New value: +"http://json-schema.org/draft-07/schema#"
      • changedOutput 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"
        +}
    • Changedfirecrawl_monitor_checks2 fields changed
      • changedInput schema / $schema
        Previous value: -"https://json-schema.org/draft/2020-12/schema"New value: +"http://json-schema.org/draft-07/schema#"
      • changedOutput 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"
        +}
    • Changedfirecrawl_monitor_create2 fields changed
      • changedInput schema / $schema
        Previous value: -"https://json-schema.org/draft/2020-12/schema"New value: +"http://json-schema.org/draft-07/schema#"
      • changedOutput 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"
        +}
    • Changedfirecrawl_monitor_delete2 fields changed
      • changedInput schema / $schema
        Previous value: -"https://json-schema.org/draft/2020-12/schema"New value: +"http://json-schema.org/draft-07/schema#"
      • changedOutput 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"
        +}
    • Changedfirecrawl_monitor_get2 fields changed
      • changedInput schema / $schema
        Previous value: -"https://json-schema.org/draft/2020-12/schema"New value: +"http://json-schema.org/draft-07/schema#"
      • changedOutput 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"
        +}
    • Changedfirecrawl_monitor_list2 fields changed
      • changedInput schema / $schema
        Previous value: -"https://json-schema.org/draft/2020-12/schema"New value: +"http://json-schema.org/draft-07/schema#"
      • changedOutput 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"
        +}
    • Changedfirecrawl_monitor_run2 fields changed
      • changedInput schema / $schema
        Previous value: -"https://json-schema.org/draft/2020-12/schema"New value: +"http://json-schema.org/draft-07/schema#"
      • changedOutput 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"
        +}
    • Changedfirecrawl_monitor_update2 fields changed
      • changedInput schema / $schema
        Previous value: -"https://json-schema.org/draft/2020-12/schema"New value: +"http://json-schema.org/draft-07/schema#"
      • changedOutput 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"
        +}
    • Changedfirecrawl_parse4 fields changed
      • changedInput schema / $schema
        Previous value: -"https://json-schema.org/draft/2020-12/schema"New value: +"http://json-schema.org/draft-07/schema#"
      • addedInput schema / properties / maxAge / description
        Added value: +"Ignored: parse never reuses or stores indexed content."
      • changedInput schema / properties / queryOptions / required
        Previous value: -[
        -  "prompt",
        -  "mode"
        -]New value: +[
        +  "prompt"
        +]
      • changedOutput 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"
        +}
    • Changedfirecrawl_research_inspect_paper2 fields changed
      • changedInput schema / $schema
        Previous value: -"https://json-schema.org/draft/2020-12/schema"New value: +"http://json-schema.org/draft-07/schema#"
      • changedOutput 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"
        +}
    • Changedfirecrawl_research_read_paper2 fields changed
      • changedInput schema / $schema
        Previous value: -"https://json-schema.org/draft/2020-12/schema"New value: +"http://json-schema.org/draft-07/schema#"
      • changedOutput 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"
        +}
    • Changedfirecrawl_research_related_papers2 fields changed
      • changedInput schema / $schema
        Previous value: -"https://json-schema.org/draft/2020-12/schema"New value: +"http://json-schema.org/draft-07/schema#"
      • changedOutput 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"
        +}
    • Removedfirecrawl_research_search_github
    • Changedfirecrawl_research_search_papers2 fields changed
      • changedInput schema / $schema
        Previous value: -"https://json-schema.org/draft/2020-12/schema"New value: +"http://json-schema.org/draft-07/schema#"
      • changedOutput 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"
        +}
    • Changedfirecrawl_scrape11 fields changed
      • changedInput schema / $schema
        Previous value: -"https://json-schema.org/draft/2020-12/schema"New value: +"http://json-schema.org/draft-07/schema#"
      • removedInput schema / properties / actions / items / additionalProperties
        Removed value: -false
      • addedInput schema / properties / alexandria
        Added 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."
        +}
      • addedInput schema / properties / domainTools
        Added value: +{
        +  "description": "URL mode only: include domain-matched Alexandria tools for the page in tools on the returned document. Ignored with alexandria.",
        +  "type": "boolean"
        +}
      • changedInput schema / properties / formats / items / enum
        Previous 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"
        +]
      • changedInput schema / properties / queryOptions / required
        Previous value: -[
        -  "prompt",
        -  "mode"
        -]New value: +[
        +  "prompt"
        +]
      • addedInput schema / properties / requestId
        Added 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"
        +}
      • addedInput schema / properties / timeout
        Added value: +{
        +  "description": "Execution timeout in milliseconds.",
        +  "exclusiveMinimum": 0,
        +  "maximum": 9007199254740991,
        +  "type": "integer"
        +}
      • addedInput schema / properties / toolDetail
        Added 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"
        +}
      • removedInput schema / required
        Removed value: -[
        -  "url"
        -]
      • changedOutput 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"
        +}
    • Changedfirecrawl_search23 fields changed
      • changedInput schema / $schema
        Previous value: -"https://json-schema.org/draft/2020-12/schema"New value: +"http://json-schema.org/draft-07/schema#"
      • changedInput schema / properties / categories / description
        Previous 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`."
      • changedInput schema / properties / categories / items / enum
        Previous value: -[
        -  "github",
        -  "research",
        -  "pdf"
        -]New value: +[
        +  "research",
        +  "pdf",
        +  "developer",
        +  "gov"
        +]
      • addedInput schema / properties / domainTools
        Added 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"
        +}
      • addedInput schema / properties / excludeDomains / description
        Added value: +"Hostnames to leave out of results. Mutually exclusive with includeDomains."
      • addedInput schema / properties / highlights
        Added 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"
        +}
      • addedInput schema / properties / includeDomains / description
        Added value: +"Hostnames to restrict results to. Mutually exclusive with excludeDomains."
      • addedInput schema / properties / limit / maximum
        Added value: +100
      • addedInput schema / properties / limit / minimum
        Added value: +1
      • changedInput schema / properties / limit / type
        Previous value: -"number"New value: +"integer"
      • addedInput schema / properties / query / description
        Added 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."
      • addedInput schema / properties / scrapeOptions / description
        Added 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."
      • removedInput schema / properties / scrapeOptions / properties / actions / items / additionalProperties
        Removed value: -false
      • changedInput schema / properties / scrapeOptions / properties / formats / items / enum
        Previous 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"
        +]
      • changedInput schema / properties / scrapeOptions / properties / queryOptions / required
        Previous value: -[
        -  "prompt",
        -  "mode"
        -]New value: +[
        +  "prompt"
        +]
      • addedInput schema / properties / sources / description
        Added 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."
      • removedInput schema / properties / sources / items / additionalProperties
        Removed value: -false
      • addedInput schema / properties / sources / items / anyOf
        Added 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"
        +  }
        +]
      • removedInput schema / properties / sources / items / properties
        Removed value: -{
        -  "type": {
        -    "enum": [
        -      "web",
        -      "images",
        -      "news"
        -    ],
        -    "type": "string"
        -  }
        -}
      • removedInput schema / properties / sources / items / required
        Removed value: -[
        -  "type"
        -]
      • removedInput schema / properties / sources / items / type
        Removed value: -"object"
      • addedInput schema / properties / toolDetail
        Added 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"
        +}
      • changedOutput 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"
        +}
    • Changedfirecrawl_search_feedback5 fields changed
      • changedInput schema / $schema
        Previous value: -"https://json-schema.org/draft/2020-12/schema"New value: +"http://json-schema.org/draft-07/schema#"
      • removedInput schema / properties / missingContent / items / additionalProperties
        Removed value: -false
      • addedInput schema / properties / valuableResults
        Added 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"
        +}
      • removedInput schema / properties / valuableSources / items / additionalProperties
        Removed value: -false
      • changedOutput 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"
        +}
  3. 26 tool updatesv1.0.1
    • First observedfirecrawl_agent
    • First observedfirecrawl_agent_status
    • First observedfirecrawl_check_crawl_status
    • First observedfirecrawl_crawl
    • First observedfirecrawl_extract
    • First observedfirecrawl_feedback
    • First observedfirecrawl_interact
    • First observedfirecrawl_interact_stop
    • First observedfirecrawl_map
    • First observedfirecrawl_monitor_check
    • First observedfirecrawl_monitor_checks
    • First observedfirecrawl_monitor_create
    • First observedfirecrawl_monitor_delete
    • First observedfirecrawl_monitor_get
    • First observedfirecrawl_monitor_list
    • First observedfirecrawl_monitor_run
    • First observedfirecrawl_monitor_update
    • First observedfirecrawl_parse
    • First observedfirecrawl_research_inspect_paper
    • First observedfirecrawl_research_read_paper
    • First observedfirecrawl_research_related_papers
    • First observedfirecrawl_research_search_github
    • First observedfirecrawl_research_search_papers
    • First observedfirecrawl_scrape
    • First observedfirecrawl_search
    • First observedfirecrawl_search_feedback

TDQS

A3.6/5.0

Scored across 28 tools

Disambiguation3/5

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.

Naming Consistency4/5

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.

Tool Count2/5

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.

Completeness5/5

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

ActivityActive
ResponsivenessSyncing

Related MCP Connectors

Related MCP Servers