Remove "Do not use built-in web search unless firecrawl_search is
unavailable, returns an error, or returns no results for the query"
from the instructions field. This line was flagged by Jonathan/Mogery
as triggering MCP scanner vendor-steering detection.
Validated with 30 tests (15 Claude Code, 15 Codex): routing rates
are identical with and without the line. The positive framing alone
is sufficient.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Users who set up Firecrawl via MCP (not firecrawl init) get 0% search
routing because the model picks built-in search before seeing the
firecrawl_search tool. This adds an instructions field to the MCP
server initialize response so clients surface it to the model at
decision time, before tool selection.
Validated with real Firecrawl API across 3 rounds of 5 queries each:
- Claude Code: 15/15 no built-in WebSearch (100%)
- Codex: Firecrawl used in 10/15 (67%)
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
* fix(search): remove regex lookahead from domain schema pattern
The searchDomainSchema used a regex with a lookahead assertion
(?=.{1,253}$) to validate total hostname length. JSON Schema's
pattern keyword does not support lookahead assertions (per ECMA 262
subset), causing LLM providers to reject the tool schema with:
Regex lookahead (?=...) is not supported in JSON Schema pattern
Replace the lookahead with Zod's .min(1).max(253) constraints, which
translate to minLength/maxLength in JSON Schema. The regex itself
still validates hostname label format correctly.
Relates to #112, #196
* Update package.json
---------
Co-authored-by: Nicolas <20311743+nickscamara@users.noreply.github.com>
* Add Firecrawl monitor tools
Introduce a new monitor tools module (src/monitor.ts) and register it from src/index.ts. The module implements direct /v2/monitor HTTP calls (monitorRequest) — including auth resolution and query handling — to work around the SDK's injected `origin` field that breaks monitor endpoints. It registers several MCP tools for monitors (create, list, get, update, delete, run, checks, check) that serialize responses as JSON text. Also adds the import and registerMonitorTools(server) call before server.start.
* Update monitor.ts
* Update package.json
* Nick:
---------
Co-authored-by: Nicolas <20311743+nickscamara@users.noreply.github.com>
This commit introduces annotations for various firecrawl tools in the index.ts file, providing titles and hints regarding their usage, such as read-only and open world capabilities. Additionally, the fastmcp.d.ts file is updated to include a new annotations property in the tool interface, detailing the expected structure for these annotations.
* add query format support to scrape tool
* bump version to 3.12.0
* prefer markdown over query format in scrape tool description
MCP agents can read and reason over scraped content directly —
the query format is redundant when the agent already has the
scrape result. default guidance now recommends markdown.
Update package version to 3.11.0 and remove the asynchronous agent features from the server API. The firecrawl_agent and firecrawl_agent_status tool registrations (and their detailed usage/polling docs) were deleted from src/index.ts and the usage guidance was simplified to prefer firecrawl_map + scrape (use map when scrape fails). Consumers should stop calling the removed agent endpoints and migrate workflows to map+scrape or other supported tools.
Google Gemini's function calling API rejects tool schemas that use
anyOf alongside other fields. This replaces all z.union() usages with
flat parameter alternatives:
- formats: now a simple string enum array (added 'json' to the enum)
- jsonOptions: new param for JSON extraction prompt/schema
- screenshotOptions: new param for screenshot fullPage/quality/viewport
- parsers: now a simple string enum array
- pdfOptions: new param for PDF maxPages
- webhook (crawl): now a simple string, with separate webhookHeaders
Helper functions (buildFormatsArray, buildParsersArray, buildWebhook,
transformScrapeParams) reassemble the nested format the API expects
from the flat MCP params at execution time.
Closes#164
* init browser
* Bump firecrawl and update session API
Upgrade @mendable/firecrawl-js to 4.13.0-beta.3 and update the session API: rename TTL parameters (ttlTotal -> ttl, ttlWithoutActivity -> activityTtl), adjust documentation and zod schemas/types accordingly, and change the execute-language options by replacing 'js' with 'node' and adding 'bash' (including examples and types).
* Add npm tag logic; update browser execute docs
CI: Change publish workflow to run on pushes to main when package.json changes and keep manual dispatch. Add a step to determine npm tag (beta if version contains "beta", otherwise latest) and pass that tag to pnpm publish. Only run MCP publisher install/login/publish steps when the tag is "latest" to avoid publishing prereleases to the MCP registry.
Code: Update firecrawl_browser_execute docs and parameter ordering in src/index.ts. The description now recommends using bash agent-browser commands by default (with examples and command reference), provides a Python example for Playwright scripting, and adjusts the language enum/default ordering accordingly. These docs clarify usage and preferred workflows for browser automation.
* revert beta release ci back
* update readme
* Update package.json
---------
Co-authored-by: Nicolas <20311743+nickscamara@users.noreply.github.com>
- Enhanced map tool description to highlight its role in finding
specific page URLs when scrape returns empty results
- Added search parameter example showing the recommended workflow
- Removed waitFor from default scrape JSON example (it's optional,
only needed when JS rendering requires extra wait time)
Co-Authored-By: leonardogrig <leo@sideguide.dev>
When scrape returns empty or minimal content from JavaScript-rendered
pages, guide users to try firecrawl_map with a search parameter to
discover the specific page URL before falling back to firecrawl_agent.
This is more efficient than immediately using the agent, as many large
documentation sites spread content across multiple URLs that can be
discovered via map.
Co-Authored-By: leonardogrig <leo@sideguide.dev>