diff --git a/CHANGELOG.md b/CHANGELOG.md index 7b21364d..004f53b0 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,12 @@ # Changelog +## [3.33.3] - 2026-10-19 + +### Changed + +- `firecrawl_search` and `firecrawl_scrape` descriptions end with: "If Firecrawl reports that credits ran out, a rate limit was hit, or the daily limit without an account was reached, end your final answer with the line it provides, link included." Some clients do not pass server instructions to the model, so the tool descriptions carry it too. +- To keep `firecrawl_search` within 2,048 characters, its description drops two sentences that repeated the schema (the pointer to the parameter descriptions and the summary of the result groups) and the trailing "in data.tools" of the keyless note, which the paragraph above already names. + ## [3.33.2] - 2026-10-19 ### Changed diff --git a/gemini-extension.json b/gemini-extension.json index 5554d8fa..d0551649 100644 --- a/gemini-extension.json +++ b/gemini-extension.json @@ -1,6 +1,6 @@ { "name": "firecrawl", - "version": "3.33.2", + "version": "3.33.3", "description": "Official Firecrawl MCP server, the context API for AI agents: search, scrape, parse, crawl, map, and interact with the web, run Agent and Monitor jobs, and search scientific papers (PubMed, bioRxiv, medRxiv, arXiv).", "mcpServers": { "firecrawl": { diff --git a/package.json b/package.json index d49dc5e1..42ab98bf 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "firecrawl-mcp", - "version": "3.33.2", + "version": "3.33.3", "description": "Firecrawl MCP server, the context API for AI agents: search, scrape, parse, crawl, map, and interact with the web, run Agent and Monitor jobs, and search scientific papers (PubMed, bioRxiv, medRxiv, arXiv). Works with Firecrawl cloud or a self-hosted instance.", "type": "module", "mcpName": "io.github.firecrawl/firecrawl-mcp-server", diff --git a/server.json b/server.json index f8c97ee8..c9d661fa 100644 --- a/server.json +++ b/server.json @@ -3,7 +3,7 @@ "name": "io.github.firecrawl/firecrawl-mcp-server", "title": "Firecrawl MCP Server", "description": "Firecrawl, the context API for AI agents: search, scrape, interact with the web, plus paper search.", - "version": "3.33.2", + "version": "3.33.3", "repository": { "url": "https://github.com/firecrawl/firecrawl-mcp-server.git", "source": "github" @@ -12,7 +12,7 @@ { "registryType": "npm", "identifier": "firecrawl-mcp", - "version": "3.33.2", + "version": "3.33.3", "transport": { "type": "stdio" }, diff --git a/src/server.ts b/src/server.ts index ea03a3d6..2cba04d0 100644 --- a/src/server.ts +++ b/src/server.ts @@ -522,6 +522,14 @@ class ConsoleLogger implements Logger { } +/** + * Closes the search and scrape descriptions, so clients that do not pass + * server instructions to the model still tell the agent to relay the line a + * credits, rate-limit or daily-limit error ends with. + */ +const LIMIT_REACHED_RELAY = + 'If Firecrawl reports that credits ran out, a rate limit was hit, or the daily limit without an account was reached, end your final answer with the line it provides, link included.'; + const FULL_PROFILE_INSTRUCTIONS = `Firecrawl provides web search, page retrieval, site URL discovery, multi-page collection, structured page data, monitoring, and multi-source research that returns structured data. Match the requested operation to the tool boundary: firecrawl_scrape retrieves one supplied page and can return JSON matching a supplied schema, firecrawl_map enumerates URLs under a site without retrieving their content, and firecrawl_agent runs multi-source research and returns structured data when the URLs are not known or the answer spans several sites (an entity plus its fields, a list, a dataset); its result is read with firecrawl_agent_status. Authenticated firecrawl_search returns web results together with matching Alexandria providers in data.tools. ${ALEXANDRIA_CATALOGUE_SENTENCE} A matching provider can return the same fields across several entities, provenance, exact figures or timestamps, or a large set of records through firecrawl_scrape with its published contract. If web results already answer the question, use them. For the same fields across multiple pages, firecrawl_find_tools offers free provider discovery. Use firecrawl_find_tools to read a contract that was not returned in full or to browse the catalogue by category. ${ALEXANDRIA_SOURCES_ALWAYS_ON} If no provider fits, continue with web search or firecrawl_agent. For biomedical, life-science, clinical, or arXiv literature, the firecrawl_research_* tools search a paper index of abstracts and full text; firecrawl_search with categories: ["research"] is a website filter over ordinary web results and reaches different sources. For a programming question (code behaviour, a library or framework, an API contract, an error message, or a known bug), firecrawl_developer_search (or firecrawl_search with categories: ["developer"]) searches an index of public repositories, GitHub issues, merged pull requests, READMEs, and code documentation. For a legal or regulatory question, firecrawl_gov_search searches primary law and regulatory material from US federal, state, and local government sources: statutes, regulations, codes, court opinions, and other government publications; firecrawl_search with categories: ["gov"] reaches the same sources and cannot be combined with other categories. firecrawl_search with sources: [{type: "alexandria"}] returns compact tool summaries in data.tools; toolDetail: "full" includes contracts, firecrawl_find_tools starts with categories, lists providers, then compact tools, and expands the selected full contract, and firecrawl_scrape with alexandria: [{provider, capability, options}] executes up to ten capabilities and returns their results. Alexandria access needs an API key on a team with it enabled. Provide only the required inputs and account for stated network or external side effects.`; const KEYLESS_PROFILE_INSTRUCTIONS = `Hosted keyless sessions expose firecrawl_search, firecrawl_scrape, and firecrawl_parse with usage limits. firecrawl_search searches the web. For programming questions, firecrawl_search with categories: ["developer"] searches indexed public repositories, GitHub issues, merged pull requests, repository READMEs, and code documentation. For legal or regulatory questions, firecrawl_search with categories: ["gov"] searches US government legal and regulatory sources and cannot be combined with other categories. For biomedical, life-science, clinical, or arXiv literature, firecrawl_search with categories: ["research"] filters ordinary web results to research-affiliated websites. firecrawl_scrape retrieves one supplied page and can return JSON matching a supplied schema. firecrawl_parse processes supported local files through its two-phase upload flow. An Authorization bearer API key can provide higher usage limits and expose additional tools, subject to plan, deployment, and team policy, including firecrawl_map for site URL discovery, firecrawl_agent and firecrawl_agent_status for multi-source research that returns structured data when the URLs are not known, firecrawl_research_* for paper-index and repository research, and firecrawl_find_tools as the progressive Alexandria catalogue lookup alongside the Alexandria options of firecrawl_search and firecrawl_scrape for catalogued data providers.`; @@ -1517,6 +1525,8 @@ Firecrawl may serve recently indexed content; set \`maxAge: 0\` for a live fetch On an authenticated session with Alexandria access, \`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. Keyless sessions have no provider matches. Alexandria mode, on an authenticated session with Alexandria access: \`alexandria\` selects catalogued capability execution and is mutually exclusive with \`url\`. + +${LIMIT_REACHED_RELAY} `, outputSchema: scrapeOutputSchema, parameters: scrapeToolParamsSchema, @@ -1637,9 +1647,11 @@ Search web, news, or image sources and return ranked results with query-relevant ${ALEXANDRIA_SEARCH_LEAD} -On an authenticated session, tool matches describe available capabilities; \`firecrawl_find_tools\` returns their contracts and \`firecrawl_scrape\` with an \`alexandria\` body executes a selected capability. Keyless sessions get no Alexandria matches in data.tools. +On an authenticated session, tool matches describe available capabilities; \`firecrawl_find_tools\` returns their contracts and \`firecrawl_scrape\` with an \`alexandria\` body executes a selected capability. Keyless sessions get no Alexandria matches. + +For a programming question, add \`categories: ["developer"]\`; its hits return in \`data.web\` with \`category: "developer"\`. For a legal or regulatory question, \`categories: ["gov"]\` returns hits in \`data.web\` with \`category: "gov"\` and cannot be combined with other categories; authenticated sessions also have \`firecrawl_gov_search\` as the dedicated tool. Verify gov results' issuer, jurisdiction, status, and version before citing current law. \`categories: ["research"]\` restricts web results to research-affiliated websites; the \`firecrawl_research_*\` tools are a separate surface over paper abstracts and full text (PubMed, bioRxiv, medRxiv, arXiv). Authenticated responses can include an \`id\` for optional search feedback. -For a programming question, add \`categories: ["developer"]\`; its hits return in \`data.web\` with \`category: "developer"\`. For a legal or regulatory question, \`categories: ["gov"]\` returns hits in \`data.web\` with \`category: "gov"\` and cannot be combined with other categories; authenticated sessions also have \`firecrawl_gov_search\` as the dedicated tool. Verify gov results' issuer, jurisdiction, status, and version before citing current law. \`categories: ["research"]\` restricts web results to research-affiliated websites; the \`firecrawl_research_*\` tools are a separate surface over paper abstracts and full text (PubMed, bioRxiv, medRxiv, arXiv). Query operators, domain filters, \`categories\`, \`toolDetail\` and \`scrapeOptions\` are described on their parameters. Returns source-type result groups and usage metadata. Authenticated responses can include an \`id\` for optional search feedback. +${LIMIT_REACHED_RELAY} `, outputSchema: searchOutputSchema, parameters: z diff --git a/tests/contract-snapshots/hosted-account.json b/tests/contract-snapshots/hosted-account.json index 0019bcfc..cf22e11c 100644 --- a/tests/contract-snapshots/hosted-account.json +++ b/tests/contract-snapshots/hosted-account.json @@ -14,9 +14,9 @@ } }, "tools": [ - "firecrawl_scrape@c67c47e0d8ef", + "firecrawl_scrape@75f65a72a182", "firecrawl_map@7d8108e2e8e7", - "firecrawl_search@90ecc2bb70b0", + "firecrawl_search@7ca485626d7d", "firecrawl_find_tools@c6c4aa217920", "firecrawl_search_feedback@3d7d2ef79f89", "firecrawl_feedback@1336142abfd3", diff --git a/tests/contract-snapshots/hosted-full.json b/tests/contract-snapshots/hosted-full.json index 1a383f5b..70029808 100644 --- a/tests/contract-snapshots/hosted-full.json +++ b/tests/contract-snapshots/hosted-full.json @@ -15,9 +15,9 @@ } }, "tools": [ - "firecrawl_scrape@c67c47e0d8ef", + "firecrawl_scrape@75f65a72a182", "firecrawl_map@7d8108e2e8e7", - "firecrawl_search@90ecc2bb70b0", + "firecrawl_search@7ca485626d7d", "firecrawl_find_tools@c6c4aa217920", "firecrawl_search_feedback@3d7d2ef79f89", "firecrawl_feedback@1336142abfd3", @@ -60,8 +60,8 @@ } }, "tools": [ - "firecrawl_scrape@c67c47e0d8ef", - "firecrawl_search@90ecc2bb70b0", + "firecrawl_scrape@75f65a72a182", + "firecrawl_search@7ca485626d7d", "firecrawl_parse@1acaf77898b6" ] } diff --git a/tests/contract-snapshots/http-self-hosted.json b/tests/contract-snapshots/http-self-hosted.json index 95191e21..46f85982 100644 --- a/tests/contract-snapshots/http-self-hosted.json +++ b/tests/contract-snapshots/http-self-hosted.json @@ -13,9 +13,9 @@ } }, "tools": [ - "firecrawl_scrape@fb6600db7229", + "firecrawl_scrape@22806c927472", "firecrawl_map@7d8108e2e8e7", - "firecrawl_search@62659ad45558", + "firecrawl_search@9a486ee5614d", "firecrawl_find_tools@c6c4aa217920", "firecrawl_search_feedback@3d7d2ef79f89", "firecrawl_feedback@1336142abfd3", diff --git a/tests/contract-snapshots/stdio-api-key.json b/tests/contract-snapshots/stdio-api-key.json index b93e333f..006ebaec 100644 --- a/tests/contract-snapshots/stdio-api-key.json +++ b/tests/contract-snapshots/stdio-api-key.json @@ -13,9 +13,9 @@ } }, "tools": [ - "firecrawl_scrape@fb6600db7229", + "firecrawl_scrape@22806c927472", "firecrawl_map@7d8108e2e8e7", - "firecrawl_search@62659ad45558", + "firecrawl_search@9a486ee5614d", "firecrawl_find_tools@c6c4aa217920", "firecrawl_search_feedback@3d7d2ef79f89", "firecrawl_feedback@1336142abfd3", diff --git a/tests/contract-snapshots/stdio-keyless.json b/tests/contract-snapshots/stdio-keyless.json index baea6e31..fd314ec4 100644 --- a/tests/contract-snapshots/stdio-keyless.json +++ b/tests/contract-snapshots/stdio-keyless.json @@ -13,9 +13,9 @@ } }, "tools": [ - "firecrawl_scrape@fb6600db7229", + "firecrawl_scrape@22806c927472", "firecrawl_map@7d8108e2e8e7", - "firecrawl_search@62659ad45558", + "firecrawl_search@9a486ee5614d", "firecrawl_find_tools@c6c4aa217920", "firecrawl_crawl@4ca4a0262b5a", "firecrawl_check_crawl_status@723e60af703e", diff --git a/tests/contract-snapshots/stdio-self-hosted.json b/tests/contract-snapshots/stdio-self-hosted.json index 4cf72544..fcd2b25d 100644 --- a/tests/contract-snapshots/stdio-self-hosted.json +++ b/tests/contract-snapshots/stdio-self-hosted.json @@ -13,9 +13,9 @@ } }, "tools": [ - "firecrawl_scrape@fb6600db7229", + "firecrawl_scrape@22806c927472", "firecrawl_map@7d8108e2e8e7", - "firecrawl_search@62659ad45558", + "firecrawl_search@9a486ee5614d", "firecrawl_find_tools@c6c4aa217920", "firecrawl_search_feedback@3d7d2ef79f89", "firecrawl_feedback@1336142abfd3", diff --git a/tests/contract-snapshots/tool-definitions.json b/tests/contract-snapshots/tool-definitions.json index b645b696..a3e48097 100644 --- a/tests/contract-snapshots/tool-definitions.json +++ b/tests/contract-snapshots/tool-definitions.json @@ -4973,15 +4973,15 @@ "additionalProperties": false } }, - "firecrawl_scrape@5cda34cb58c3": { + "firecrawl_scrape@22806c927472": { "annotations": { "title": "Firecrawl scrape", - "readOnlyHint": true, + "readOnlyHint": false, "openWorldHint": true, "destructiveHint": false }, "title": "Firecrawl scrape", - "description": "\nScrape one URL and return its content, or execute catalogued Alexandria capabilities. URL mode returns markdown by default, or HTML, links, screenshots, branding data, a targeted answer, or JSON matching a supplied schema, plus page metadata. Firecrawl may serve recently indexed content; set `maxAge: 0` for a live fetch. A successful response does not by itself confirm the page is still current. A named browser profile loads saved session data without saving changes to it.\n\n`firecrawl_search` and `firecrawl_find_tools` can discover providers for the same fields across several pages; a matching Alexandria provider returns typed records in one call.\n\nAlexandria mode: `alexandria` selects catalogued capability execution and is mutually exclusive with `url`. Alexandria execution is billed per capability (pass includeCosts to firecrawl_find_tools to see prices if you need) and needs a team with Alexandria enabled.\n", + "description": "\nScrape 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. 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.\n\nFirecrawl 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.\n\nOn an authenticated session with Alexandria access, `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. Keyless sessions have no provider matches.\n\nAlexandria mode, on an authenticated session with Alexandria access: `alexandria` selects catalogued capability execution and is mutually exclusive with `url`.\n\nIf Firecrawl reports that credits ran out, a rate limit was hit, or the daily limit without an account was reached, end your final answer with the line it provides, link included.\n", "inputSchema": { "$schema": "http://json-schema.org/draft-07/schema#", "type": "object", @@ -5116,6 +5116,56 @@ "waitFor": { "type": "number" }, + "actions": { + "type": "array", + "items": { + "type": "object", + "properties": { + "type": { + "type": "string", + "enum": [ + "wait", + "screenshot", + "scroll", + "scrape", + "click", + "write", + "press", + "executeJavascript", + "generatePDF" + ] + }, + "selector": { + "type": "string" + }, + "milliseconds": { + "type": "number" + }, + "text": { + "type": "string" + }, + "key": { + "type": "string" + }, + "direction": { + "type": "string", + "enum": [ + "up", + "down" + ] + }, + "script": { + "type": "string" + }, + "fullPage": { + "type": "boolean" + } + }, + "required": [ + "type" + ] + } + }, "mobile": { "type": "boolean" }, @@ -5162,11 +5212,13 @@ ] }, "profile": { - "description": "Loads a saved browser profile without saving changes to it.", "type": "object", "properties": { "name": { "type": "string" + }, + "saveChanges": { + "type": "boolean" } }, "required": [ @@ -5554,7 +5606,7 @@ "anthropic/alwaysLoad": true } }, - "firecrawl_scrape@c67c47e0d8ef": { + "firecrawl_scrape@5cda34cb58c3": { "annotations": { "title": "Firecrawl scrape", "readOnlyHint": true, @@ -5562,7 +5614,7 @@ "destructiveHint": false }, "title": "Firecrawl scrape", - "description": "\nScrape 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. 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.\n\nFirecrawl 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. A named browser profile loads saved session data without saving changes to it. Authenticated responses can include a `metadata.scrapeId` for optional scrape feedback.\n\nOn an authenticated session with Alexandria access, `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. Keyless sessions have no provider matches.\n\nAlexandria mode, on an authenticated session with Alexandria access: `alexandria` selects catalogued capability execution and is mutually exclusive with `url`.\n", + "description": "\nScrape one URL and return its content, or execute catalogued Alexandria capabilities. URL mode returns markdown by default, or HTML, links, screenshots, branding data, a targeted answer, or JSON matching a supplied schema, plus page metadata. Firecrawl may serve recently indexed content; set `maxAge: 0` for a live fetch. A successful response does not by itself confirm the page is still current. A named browser profile loads saved session data without saving changes to it.\n\n`firecrawl_search` and `firecrawl_find_tools` can discover providers for the same fields across several pages; a matching Alexandria provider returns typed records in one call.\n\nAlexandria mode: `alexandria` selects catalogued capability execution and is mutually exclusive with `url`. Alexandria execution is billed per capability (pass includeCosts to firecrawl_find_tools to see prices if you need) and needs a team with Alexandria enabled.\n", "inputSchema": { "$schema": "http://json-schema.org/draft-07/schema#", "type": "object", @@ -6135,15 +6187,15 @@ "anthropic/alwaysLoad": true } }, - "firecrawl_scrape@fb6600db7229": { + "firecrawl_scrape@75f65a72a182": { "annotations": { "title": "Firecrawl scrape", - "readOnlyHint": false, + "readOnlyHint": true, "openWorldHint": true, "destructiveHint": false }, "title": "Firecrawl scrape", - "description": "\nScrape 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. 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.\n\nFirecrawl 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.\n\nOn an authenticated session with Alexandria access, `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. Keyless sessions have no provider matches.\n\nAlexandria mode, on an authenticated session with Alexandria access: `alexandria` selects catalogued capability execution and is mutually exclusive with `url`.\n", + "description": "\nScrape 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. 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.\n\nFirecrawl 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. A named browser profile loads saved session data without saving changes to it. Authenticated responses can include a `metadata.scrapeId` for optional scrape feedback.\n\nOn an authenticated session with Alexandria access, `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. Keyless sessions have no provider matches.\n\nAlexandria mode, on an authenticated session with Alexandria access: `alexandria` selects catalogued capability execution and is mutually exclusive with `url`.\n\nIf Firecrawl reports that credits ran out, a rate limit was hit, or the daily limit without an account was reached, end your final answer with the line it provides, link included.\n", "inputSchema": { "$schema": "http://json-schema.org/draft-07/schema#", "type": "object", @@ -6278,56 +6330,6 @@ "waitFor": { "type": "number" }, - "actions": { - "type": "array", - "items": { - "type": "object", - "properties": { - "type": { - "type": "string", - "enum": [ - "wait", - "screenshot", - "scroll", - "scrape", - "click", - "write", - "press", - "executeJavascript", - "generatePDF" - ] - }, - "selector": { - "type": "string" - }, - "milliseconds": { - "type": "number" - }, - "text": { - "type": "string" - }, - "key": { - "type": "string" - }, - "direction": { - "type": "string", - "enum": [ - "up", - "down" - ] - }, - "script": { - "type": "string" - }, - "fullPage": { - "type": "boolean" - } - }, - "required": [ - "type" - ] - } - }, "mobile": { "type": "boolean" }, @@ -6374,13 +6376,11 @@ ] }, "profile": { + "description": "Loads a saved browser profile without saving changes to it.", "type": "object", "properties": { "name": { "type": "string" - }, - "saveChanges": { - "type": "boolean" } }, "required": [ @@ -7017,7 +7017,7 @@ "additionalProperties": false } }, - "firecrawl_search@62659ad45558": { + "firecrawl_search@7ca485626d7d": { "annotations": { "title": "Firecrawl web search", "readOnlyHint": true, @@ -7025,7 +7025,7 @@ "destructiveHint": false }, "title": "Firecrawl web search", - "description": "\nSearch web, news, or image sources and return ranked results with query-relevant highlights. Each web result is a title, URL, and description; use `firecrawl_scrape` on a result URL when the excerpt is not enough.\n\nAuthenticated search also returns matching Alexandria data providers in data.tools (companies, people, jobs, finance and filings, public records and government spending, real estate, places and restaurants, retail and prices, package registries and developer data, news, research, and more). Prefer a provider over scraping pages when the task needs the same fields across several entities, exact figures or timestamps, provenance, or many records; use web results when they already answer the question. Authenticated searches always add alexandria to the sources, so sources: [\"web\"] also returns providers; domainTools: false turns off website-matched tools only.\n\nOn an authenticated session, tool matches describe available capabilities; `firecrawl_find_tools` returns their contracts and `firecrawl_scrape` with an `alexandria` body executes a selected capability. Keyless sessions get no Alexandria matches in data.tools.\n\nFor a programming question, add `categories: [\"developer\"]`; its hits return in `data.web` with `category: \"developer\"`. For a legal or regulatory question, `categories: [\"gov\"]` returns hits in `data.web` with `category: \"gov\"` and cannot be combined with other categories; authenticated sessions also have `firecrawl_gov_search` as the dedicated tool. Verify gov results' issuer, jurisdiction, status, and version before citing current law. `categories: [\"research\"]` restricts web results to research-affiliated websites; the `firecrawl_research_*` tools are a separate surface over paper abstracts and full text (PubMed, bioRxiv, medRxiv, arXiv). Query operators, domain filters, `categories`, `toolDetail` and `scrapeOptions` are described on their parameters. Returns source-type result groups and usage metadata. Authenticated responses can include an `id` for optional search feedback.\n", + "description": "\nSearch web, news, or image sources and return ranked results with query-relevant highlights. Each web result is a title, URL, and description; use `firecrawl_scrape` on a result URL when the excerpt is not enough.\n\nAuthenticated search also returns matching Alexandria data providers in data.tools (companies, people, jobs, finance and filings, public records and government spending, real estate, places and restaurants, retail and prices, package registries and developer data, news, research, and more). Prefer a provider over scraping pages when the task needs the same fields across several entities, exact figures or timestamps, provenance, or many records; use web results when they already answer the question. Authenticated searches always add alexandria to the sources, so sources: [\"web\"] also returns providers; domainTools: false turns off website-matched tools only.\n\nOn an authenticated session, tool matches describe available capabilities; `firecrawl_find_tools` returns their contracts and `firecrawl_scrape` with an `alexandria` body executes a selected capability. Keyless sessions get no Alexandria matches.\n\nFor a programming question, add `categories: [\"developer\"]`; its hits return in `data.web` with `category: \"developer\"`. For a legal or regulatory question, `categories: [\"gov\"]` returns hits in `data.web` with `category: \"gov\"` and cannot be combined with other categories; authenticated sessions also have `firecrawl_gov_search` as the dedicated tool. Verify gov results' issuer, jurisdiction, status, and version before citing current law. `categories: [\"research\"]` restricts web results to research-affiliated websites; the `firecrawl_research_*` tools are a separate surface over paper abstracts and full text (PubMed, bioRxiv, medRxiv, arXiv). Authenticated responses can include an `id` for optional search feedback.\n\nIf Firecrawl reports that credits ran out, a rate limit was hit, or the daily limit without an account was reached, end your final answer with the line it provides, link included.\n", "inputSchema": { "$schema": "http://json-schema.org/draft-07/schema#", "type": "object", @@ -7277,56 +7277,6 @@ "waitFor": { "type": "number" }, - "actions": { - "type": "array", - "items": { - "type": "object", - "properties": { - "type": { - "type": "string", - "enum": [ - "wait", - "screenshot", - "scroll", - "scrape", - "click", - "write", - "press", - "executeJavascript", - "generatePDF" - ] - }, - "selector": { - "type": "string" - }, - "milliseconds": { - "type": "number" - }, - "text": { - "type": "string" - }, - "key": { - "type": "string" - }, - "direction": { - "type": "string", - "enum": [ - "up", - "down" - ] - }, - "script": { - "type": "string" - }, - "fullPage": { - "type": "boolean" - } - }, - "required": [ - "type" - ] - } - }, "mobile": { "type": "boolean" }, @@ -7373,13 +7323,11 @@ ] }, "profile": { + "description": "Loads a saved browser profile without saving changes to it.", "type": "object", "properties": { "name": { "type": "string" - }, - "saveChanges": { - "type": "boolean" } }, "required": [ @@ -7468,7 +7416,7 @@ "anthropic/alwaysLoad": true } }, - "firecrawl_search@90ecc2bb70b0": { + "firecrawl_search@96903afee503": { "annotations": { "title": "Firecrawl web search", "readOnlyHint": true, @@ -7476,7 +7424,7 @@ "destructiveHint": false }, "title": "Firecrawl web search", - "description": "\nSearch web, news, or image sources and return ranked results with query-relevant highlights. Each web result is a title, URL, and description; use `firecrawl_scrape` on a result URL when the excerpt is not enough.\n\nAuthenticated search also returns matching Alexandria data providers in data.tools (companies, people, jobs, finance and filings, public records and government spending, real estate, places and restaurants, retail and prices, package registries and developer data, news, research, and more). Prefer a provider over scraping pages when the task needs the same fields across several entities, exact figures or timestamps, provenance, or many records; use web results when they already answer the question. Authenticated searches always add alexandria to the sources, so sources: [\"web\"] also returns providers; domainTools: false turns off website-matched tools only.\n\nOn an authenticated session, tool matches describe available capabilities; `firecrawl_find_tools` returns their contracts and `firecrawl_scrape` with an `alexandria` body executes a selected capability. Keyless sessions get no Alexandria matches in data.tools.\n\nFor a programming question, add `categories: [\"developer\"]`; its hits return in `data.web` with `category: \"developer\"`. For a legal or regulatory question, `categories: [\"gov\"]` returns hits in `data.web` with `category: \"gov\"` and cannot be combined with other categories; authenticated sessions also have `firecrawl_gov_search` as the dedicated tool. Verify gov results' issuer, jurisdiction, status, and version before citing current law. `categories: [\"research\"]` restricts web results to research-affiliated websites; the `firecrawl_research_*` tools are a separate surface over paper abstracts and full text (PubMed, bioRxiv, medRxiv, arXiv). Query operators, domain filters, `categories`, `toolDetail` and `scrapeOptions` are described on their parameters. Returns source-type result groups and usage metadata. Authenticated responses can include an `id` for optional search feedback.\n", + "description": "\nSearch web and specialized indexes, returning ranked results with query-relevant highlights. Each web result is a title, URL, and description. Operators include quoted phrases, `-term`, `site:host`, `inurl:term`, `intitle:term`, and `related:host`; the set is non-exhaustive. `includeDomains` and `excludeDomains` are mutually exclusive hostname filters; categories limit result types to `research`, `pdf`, `developer`, or `gov`.\n\nFor a programming question, add `categories: [\"developer\"]`. It searches an index of public repositories, GitHub issues, merged pull requests, repository READMEs, and code documentation, and returns the results in `data.web` with `category: \"developer\"`.\n\nFor a legal or regulatory question, `categories: [\"gov\"]` returns results in `data.web` with `category: \"gov\"` and cannot be combined with other categories; `firecrawl_gov_search` is the dedicated tool. Verify gov results' issuer, jurisdiction, status, and version before citing current law.\n\nAuthenticated search combines web results, semantic tool summaries and domain matches. Use sources: [\"alexandria\"] for semantic tools only. Authenticated searches always add alexandria to the sources, so sources: [\"web\"] also returns providers; domainTools: false turns off website-matched tools only. Tool matches describe available structured-data capabilities, not executed data. toolDetail: \"compact\" (default) returns only provider, capability and description; \"summary\" adds metadata; \"full\" includes their input and output contracts. firecrawl_scrape with an alexandria body executes a selected capability; firecrawl_find_tools provides catalogue browsing and full contracts.\n\nReturns result groups in `data` and an operation `id`.\n", "inputSchema": { "$schema": "http://json-schema.org/draft-07/schema#", "type": "object", @@ -7597,243 +7545,52 @@ "zdr" ] } + } + }, + "required": [ + "query" + ], + "additionalProperties": false + }, + "name": "firecrawl_search", + "outputSchema": { + "$schema": "http://json-schema.org/draft-07/schema#", + "description": "Ranked search results grouped by source.", + "type": "object", + "properties": { + "success": { + "description": "Whether the API call succeeded.", + "anyOf": [ + { + "type": "boolean" + }, + { + "type": "null" + } + ] }, - "scrapeOptions": { - "description": "Attach page content for web results in the same call. These fetches ignore maxAge, so use firecrawl_scrape when you need a live fetch. scrapeOptions fetches web pages, never Alexandria provider tools.", - "type": "object", - "properties": { - "formats": { - "type": "array", - "items": { - "type": "string", - "enum": [ - "markdown", - "html", - "rawHtml", - "screenshot", - "links", - "images", - "summary", - "changeTracking", - "branding", - "json", - "query", - "audio" - ] - } + "data": { + "description": "Ranked results grouped by source, such as `web`, `news`, `images`, and `alexandria`." + }, + "error": { + "description": "Error message or error object when the call did not succeed." + }, + "warning": { + "description": "Non-fatal warning about the result.", + "anyOf": [ + { + "type": "string" }, - "jsonOptions": { - "type": "object", - "properties": { - "prompt": { - "type": "string" - }, - "schema": { - "type": "object", - "propertyNames": { - "type": "string" - }, - "additionalProperties": false - } - }, - "additionalProperties": false - }, - "queryOptions": { - "type": "object", - "properties": { - "prompt": { - "type": "string", - "maxLength": 10000 - }, - "mode": { - "default": "freeform", - "type": "string", - "enum": [ - "directQuote", - "freeform" - ] - } - }, - "required": [ - "prompt" - ], - "additionalProperties": false - }, - "screenshotOptions": { - "type": "object", - "properties": { - "fullPage": { - "type": "boolean" - }, - "quality": { - "type": "number" - }, - "viewport": { - "type": "object", - "properties": { - "width": { - "type": "number" - }, - "height": { - "type": "number" - } - }, - "required": [ - "width", - "height" - ], - "additionalProperties": false - } - }, - "additionalProperties": false - }, - "parsers": { - "type": "array", - "items": { - "type": "string", - "enum": [ - "pdf" - ] - } - }, - "pdfOptions": { - "type": "object", - "properties": { - "maxPages": { - "type": "integer", - "minimum": 1, - "maximum": 10000 - } - }, - "additionalProperties": false - }, - "onlyMainContent": { - "type": "boolean" - }, - "redactPII": { - "type": "boolean" - }, - "includeTags": { - "type": "array", - "items": { - "type": "string" - } - }, - "excludeTags": { - "type": "array", - "items": { - "type": "string" - } - }, - "waitFor": { - "type": "number" - }, - "mobile": { - "type": "boolean" - }, - "skipTlsVerification": { - "type": "boolean" - }, - "removeBase64Images": { - "type": "boolean" - }, - "location": { - "type": "object", - "properties": { - "country": { - "type": "string" - }, - "languages": { - "type": "array", - "items": { - "type": "string" - } - } - }, - "additionalProperties": false - }, - "storeInCache": { - "type": "boolean" - }, - "zeroDataRetention": { - "type": "boolean" - }, - "maxAge": { - "type": "number" - }, - "lockdown": { - "type": "boolean" - }, - "proxy": { - "type": "string", - "enum": [ - "basic", - "stealth", - "enhanced", - "auto" - ] - }, - "profile": { - "description": "Loads a saved browser profile without saving changes to it.", - "type": "object", - "properties": { - "name": { - "type": "string" - } - }, - "required": [ - "name" - ], - "additionalProperties": false - } - }, - "additionalProperties": false - } - }, - "required": [ - "query" - ], - "additionalProperties": false - }, - "name": "firecrawl_search", - "outputSchema": { - "$schema": "http://json-schema.org/draft-07/schema#", - "description": "Ranked search results grouped by source.", - "type": "object", - "properties": { - "success": { - "description": "Whether the API call succeeded.", - "anyOf": [ - { - "type": "boolean" - }, - { - "type": "null" - } - ] - }, - "data": { - "description": "Ranked results grouped by source, such as `web`, `news`, `images`, and `alexandria`." - }, - "error": { - "description": "Error message or error object when the call did not succeed." - }, - "warning": { - "description": "Non-fatal warning about the result.", - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ] - }, - "id": { - "description": "Search identifier, for optional `firecrawl_search_feedback`.", - "anyOf": [ - { - "type": "string" + { + "type": "null" + } + ] + }, + "id": { + "description": "Search identifier, for optional `firecrawl_search_feedback`.", + "anyOf": [ + { + "type": "string" }, { "type": "null" @@ -7867,7 +7624,7 @@ "anthropic/alwaysLoad": true } }, - "firecrawl_search@96903afee503": { + "firecrawl_search@9a486ee5614d": { "annotations": { "title": "Firecrawl web search", "readOnlyHint": true, @@ -7875,7 +7632,7 @@ "destructiveHint": false }, "title": "Firecrawl web search", - "description": "\nSearch web and specialized indexes, returning ranked results with query-relevant highlights. Each web result is a title, URL, and description. Operators include quoted phrases, `-term`, `site:host`, `inurl:term`, `intitle:term`, and `related:host`; the set is non-exhaustive. `includeDomains` and `excludeDomains` are mutually exclusive hostname filters; categories limit result types to `research`, `pdf`, `developer`, or `gov`.\n\nFor a programming question, add `categories: [\"developer\"]`. It searches an index of public repositories, GitHub issues, merged pull requests, repository READMEs, and code documentation, and returns the results in `data.web` with `category: \"developer\"`.\n\nFor a legal or regulatory question, `categories: [\"gov\"]` returns results in `data.web` with `category: \"gov\"` and cannot be combined with other categories; `firecrawl_gov_search` is the dedicated tool. Verify gov results' issuer, jurisdiction, status, and version before citing current law.\n\nAuthenticated search combines web results, semantic tool summaries and domain matches. Use sources: [\"alexandria\"] for semantic tools only. Authenticated searches always add alexandria to the sources, so sources: [\"web\"] also returns providers; domainTools: false turns off website-matched tools only. Tool matches describe available structured-data capabilities, not executed data. toolDetail: \"compact\" (default) returns only provider, capability and description; \"summary\" adds metadata; \"full\" includes their input and output contracts. firecrawl_scrape with an alexandria body executes a selected capability; firecrawl_find_tools provides catalogue browsing and full contracts.\n\nReturns result groups in `data` and an operation `id`.\n", + "description": "\nSearch web, news, or image sources and return ranked results with query-relevant highlights. Each web result is a title, URL, and description; use `firecrawl_scrape` on a result URL when the excerpt is not enough.\n\nAuthenticated search also returns matching Alexandria data providers in data.tools (companies, people, jobs, finance and filings, public records and government spending, real estate, places and restaurants, retail and prices, package registries and developer data, news, research, and more). Prefer a provider over scraping pages when the task needs the same fields across several entities, exact figures or timestamps, provenance, or many records; use web results when they already answer the question. Authenticated searches always add alexandria to the sources, so sources: [\"web\"] also returns providers; domainTools: false turns off website-matched tools only.\n\nOn an authenticated session, tool matches describe available capabilities; `firecrawl_find_tools` returns their contracts and `firecrawl_scrape` with an `alexandria` body executes a selected capability. Keyless sessions get no Alexandria matches.\n\nFor a programming question, add `categories: [\"developer\"]`; its hits return in `data.web` with `category: \"developer\"`. For a legal or regulatory question, `categories: [\"gov\"]` returns hits in `data.web` with `category: \"gov\"` and cannot be combined with other categories; authenticated sessions also have `firecrawl_gov_search` as the dedicated tool. Verify gov results' issuer, jurisdiction, status, and version before citing current law. `categories: [\"research\"]` restricts web results to research-affiliated websites; the `firecrawl_research_*` tools are a separate surface over paper abstracts and full text (PubMed, bioRxiv, medRxiv, arXiv). Authenticated responses can include an `id` for optional search feedback.\n\nIf Firecrawl reports that credits ran out, a rate limit was hit, or the daily limit without an account was reached, end your final answer with the line it provides, link included.\n", "inputSchema": { "$schema": "http://json-schema.org/draft-07/schema#", "type": "object", @@ -7996,6 +7753,249 @@ "zdr" ] } + }, + "scrapeOptions": { + "description": "Attach page content for web results in the same call. These fetches ignore maxAge, so use firecrawl_scrape when you need a live fetch. scrapeOptions fetches web pages, never Alexandria provider tools.", + "type": "object", + "properties": { + "formats": { + "type": "array", + "items": { + "type": "string", + "enum": [ + "markdown", + "html", + "rawHtml", + "screenshot", + "links", + "images", + "summary", + "changeTracking", + "branding", + "json", + "query", + "audio" + ] + } + }, + "jsonOptions": { + "type": "object", + "properties": { + "prompt": { + "type": "string" + }, + "schema": { + "type": "object", + "propertyNames": { + "type": "string" + }, + "additionalProperties": false + } + }, + "additionalProperties": false + }, + "queryOptions": { + "type": "object", + "properties": { + "prompt": { + "type": "string", + "maxLength": 10000 + }, + "mode": { + "default": "freeform", + "type": "string", + "enum": [ + "directQuote", + "freeform" + ] + } + }, + "required": [ + "prompt" + ], + "additionalProperties": false + }, + "screenshotOptions": { + "type": "object", + "properties": { + "fullPage": { + "type": "boolean" + }, + "quality": { + "type": "number" + }, + "viewport": { + "type": "object", + "properties": { + "width": { + "type": "number" + }, + "height": { + "type": "number" + } + }, + "required": [ + "width", + "height" + ], + "additionalProperties": false + } + }, + "additionalProperties": false + }, + "parsers": { + "type": "array", + "items": { + "type": "string", + "enum": [ + "pdf" + ] + } + }, + "pdfOptions": { + "type": "object", + "properties": { + "maxPages": { + "type": "integer", + "minimum": 1, + "maximum": 10000 + } + }, + "additionalProperties": false + }, + "onlyMainContent": { + "type": "boolean" + }, + "redactPII": { + "type": "boolean" + }, + "includeTags": { + "type": "array", + "items": { + "type": "string" + } + }, + "excludeTags": { + "type": "array", + "items": { + "type": "string" + } + }, + "waitFor": { + "type": "number" + }, + "actions": { + "type": "array", + "items": { + "type": "object", + "properties": { + "type": { + "type": "string", + "enum": [ + "wait", + "screenshot", + "scroll", + "scrape", + "click", + "write", + "press", + "executeJavascript", + "generatePDF" + ] + }, + "selector": { + "type": "string" + }, + "milliseconds": { + "type": "number" + }, + "text": { + "type": "string" + }, + "key": { + "type": "string" + }, + "direction": { + "type": "string", + "enum": [ + "up", + "down" + ] + }, + "script": { + "type": "string" + }, + "fullPage": { + "type": "boolean" + } + }, + "required": [ + "type" + ] + } + }, + "mobile": { + "type": "boolean" + }, + "skipTlsVerification": { + "type": "boolean" + }, + "removeBase64Images": { + "type": "boolean" + }, + "location": { + "type": "object", + "properties": { + "country": { + "type": "string" + }, + "languages": { + "type": "array", + "items": { + "type": "string" + } + } + }, + "additionalProperties": false + }, + "storeInCache": { + "type": "boolean" + }, + "zeroDataRetention": { + "type": "boolean" + }, + "maxAge": { + "type": "number" + }, + "lockdown": { + "type": "boolean" + }, + "proxy": { + "type": "string", + "enum": [ + "basic", + "stealth", + "enhanced", + "auto" + ] + }, + "profile": { + "type": "object", + "properties": { + "name": { + "type": "string" + }, + "saveChanges": { + "type": "boolean" + } + }, + "required": [ + "name" + ], + "additionalProperties": false + } + }, + "additionalProperties": false } }, "required": [ diff --git a/tests/mcp-description-budget.test.mjs b/tests/mcp-description-budget.test.mjs index e3f4ba50..8e4296a7 100644 --- a/tests/mcp-description-budget.test.mjs +++ b/tests/mcp-description-budget.test.mjs @@ -25,4 +25,9 @@ test('every tool description fits the 2,048-character cap and keeps the routing assert.match(scrape, /^Scrape one URL and return its content/); assert.match(scrape, /`firecrawl_search` and `firecrawl_find_tools` can discover providers for the same fields across several pages/); assert.match(byName.get('firecrawl_find_tools'), /Prefer normal firecrawl_search/); + + const relay = + 'If Firecrawl reports that credits ran out, a rate limit was hit, or the daily limit without an account was reached, end your final answer with the line it provides, link included.'; + assert.ok(search.endsWith(`\n\n${relay}`), 'firecrawl_search does not end with the relay sentence'); + assert.ok(scrape.endsWith(`\n\n${relay}`), 'firecrawl_scrape does not end with the relay sentence'); });