Firecrawl MCP — wraps the Firecrawl API (firecrawl.dev) for web scraping / crawling / search optimized for LLM consumption.
Three tools with complete input schemas and descriptions, but significant gaps in output documentation and error handling. Tool names are action-oriented (scrape, map, search) and descriptions are adequate (50-80 chars). All parameters have type definitions and descriptions. However, output schemas are not formally documented, only inferred from code comments. Error handling returns raw API errors without recovery guidance. The _apiKey parameter violates secret-injection pattern by exposing it as a tool parameter, though the dual-key model mitigates risk by allowing omission.
Discover all URLs on a website
Scrape a single URL into clean markdown (JS-rendered, main content only)
Web search with optional page content
Output schemas not formally documented. Code returns structured objects (url, markdown, title, description, truncated for scrape; url, count, links for map; query, results for search) but no JSON Schema definition provided to LLMs. LLMs cannot plan downstream tool calls or validate response structure.
_apiKey exposed as tool parameter violates secret-injection pattern. Although optional and mitigated by server-side injection, credentials should never appear in tool definitions. Traces and logs will capture API keys if users pass them explicitly.
Error responses lack recovery guidance. When firecrawlPost returns {error, message}, the tool returns this raw. LLMs receive no actionable next steps, e.g., 'API key invalid. Provide a valid Firecrawl key or use the shared Pipeworx key.' or 'Rate limit exceeded. Retry in 60 seconds.'
| Scored | Grade | Overall | Spec posture | Rubric |
|---|---|---|---|---|
| 2026-09-23 | C | 63 | 2026-07-28+ | v2 |
No pagination support for map and search results. map() returns all links up to limit (max 5000); search() returns up to 20 results. No next_cursor, offset, or page parameters. Large result sets risk context window exhaustion.
scrape() truncates markdown at 100KB without clear guidance. Description does not mention truncation behavior or how to handle truncated content. LLMs may not realize content is incomplete.