Two spots in README.md on main describe behavior that the current code does not implement. Both were hit while setting up the hosted endpoint, and both cost some debugging time, so filing them together.
Verified against https://mcp.firecrawl.dev/v2/mcp on 2026-08-06, which reports serverInfo: {"name":"firecrawl-fastmcp","version":"3.23.3"} — the same version as package.json on main, so this is not a stale deployment.
1. Keyless tool list says interact, but the endpoint serves parse
README:
On the keyless free tier, scrape, search, and interact work without an API key (rate-limited).
Actual tools/list on the keyless endpoint returns three tools:
firecrawl_scrape
firecrawl_search
firecrawl_parse
The server's own initialize instructions agree with the wire behavior and not with the README:
Without authentication, this endpoint exposes Search, Scrape, and Parse with usage limits.
This looks like the README simply wasn't updated when parse gained keyless support — the CHANGELOG entry for firecrawl_parse on the hosted server notes "the flow also works on the keyless remote URL".
2. formats does not accept the documented object form
The README's preferred scrape example passes an object inside formats:
{
"name": "firecrawl_scrape",
"arguments": {
"url": "https://example.com/product",
"formats": [
{
"type": "json",
"prompt": "Extract the product information",
"schema": { "...": "..." }
}
]
}
}
That request is rejected:
MCP error -32602: Tool 'firecrawl_scrape' parameter validation failed: formats.0:
Invalid option: expected one of "markdown"|"html"|"rawHtml"|"screenshot"|"links"|
"summary"|"changeTracking"|"branding"|"json"|"query"|"audio".
src/index.ts confirms formats is an enum of plain strings, and that the object form is built internally from a sibling jsonOptions argument:
if (fmt === 'json') {
const jsonOpts = args.jsonOptions as Record<string, unknown> | undefined;
result.push({ type: 'json', ...jsonOpts });
So the shape that actually works is:
{
"name": "firecrawl_scrape",
"arguments": {
"url": "https://example.com/product",
"formats": ["json"],
"jsonOptions": {
"prompt": "Extract the product information",
"schema": { "...": "..." }
}
}
}
Confirmed working against the keyless endpoint.
The same object-in-formats pattern appears in several other README examples (the branding example, the firecrawl_search scrapeOptions block), so a fix probably wants a sweep rather than a single edit.
Worth noting this one is the more expensive of the two: the README presents the JSON format as the recommended default to avoid context overflow, so it is the first thing a new user copies, and the -32602 message does not hint that jsonOptions is where those fields belong.
Suggested fix
- Change the keyless sentence to
scrape, search, and parse, and drop interact from that list (it stays in the key-required set alongside crawl, map, agent, extract).
- Rewrite the
formats examples to the formats: ["json"] + jsonOptions shape.
Happy to open a PR for the README if that's useful.
Two spots in
README.mdonmaindescribe behavior that the current code does not implement. Both were hit while setting up the hosted endpoint, and both cost some debugging time, so filing them together.Verified against
https://mcp.firecrawl.dev/v2/mcpon 2026-08-06, which reportsserverInfo: {"name":"firecrawl-fastmcp","version":"3.23.3"}— the same version aspackage.jsononmain, so this is not a stale deployment.1. Keyless tool list says
interact, but the endpoint servesparseREADME:
Actual
tools/liston the keyless endpoint returns three tools:The server's own
initializeinstructions agree with the wire behavior and not with the README:This looks like the README simply wasn't updated when parse gained keyless support — the CHANGELOG entry for
firecrawl_parseon the hosted server notes "the flow also works on the keyless remote URL".2.
formatsdoes not accept the documented object formThe README's preferred scrape example passes an object inside
formats:{ "name": "firecrawl_scrape", "arguments": { "url": "https://example.com/product", "formats": [ { "type": "json", "prompt": "Extract the product information", "schema": { "...": "..." } } ] } }That request is rejected:
src/index.tsconfirmsformatsis an enum of plain strings, and that the object form is built internally from a siblingjsonOptionsargument:So the shape that actually works is:
{ "name": "firecrawl_scrape", "arguments": { "url": "https://example.com/product", "formats": ["json"], "jsonOptions": { "prompt": "Extract the product information", "schema": { "...": "..." } } } }Confirmed working against the keyless endpoint.
The same object-in-
formatspattern appears in several other README examples (the branding example, thefirecrawl_searchscrapeOptionsblock), so a fix probably wants a sweep rather than a single edit.Worth noting this one is the more expensive of the two: the README presents the JSON format as the recommended default to avoid context overflow, so it is the first thing a new user copies, and the
-32602message does not hint thatjsonOptionsis where those fields belong.Suggested fix
scrape,search, andparse, and dropinteractfrom that list (it stays in the key-required set alongsidecrawl,map,agent,extract).formatsexamples to theformats: ["json"] + jsonOptionsshape.Happy to open a PR for the README if that's useful.