MCP server that provides web scraping, searching, and crawling capabilities via the Firecrawl API
Three tools with complete input schemas and descriptions, but descriptions are generic and lack LLM-optimized guidance. All parameters have types and descriptions, meeting baseline requirements. However, output schemas are undocumented (no return type structure specified), and error handling lacks recovery guidance. Tool names follow verb_noun convention (firecrawl_search, firecrawl_scrape, firecrawl_crawl) but are somewhat generic. No tool annotations (readOnlyHint, destructiveHint) despite all being read-only operations. Descriptions average ~120 chars, within acceptable range but lack context on when to use each tool vs. alternatives.
Crawls a website starting from the given URL using Firecrawl and returns the crawl results.
Scrapes a web page using Firecrawl and returns the content in the specified formats.
Searches Firecrawl using the provided query and returns a list of search results.
Output schemas undocumented. Tools return dict/List[dict] with no field documentation. LLMs cannot plan downstream operations or extract required fields without trial-and-error.
Error handling lacks recovery guidance. Exceptions raise generic 'Firecrawl X failed: {e}' messages without actionable next steps. LLM cannot determine if error is retryable, user-fixable, or fatal.
No tool annotations despite all tools being read-only. Missing readOnlyHint annotation prevents LLM from optimizing retry logic and understanding safety properties.
Inferred effective spec: <=2025-11-25.
| Scored | Grade | Overall | Spec posture | Rubric |
|---|---|---|---|---|
| 2026-09-23 | C | 60 | <=2025-11-25 | v2 |
Descriptions lack differentiation. All three tools have similar generic descriptions without explaining when to use search vs. scrape vs. crawl. LLM must infer intent from names alone.
No pagination support. firecrawl_search returns all results up to limit without cursor/offset. Large result sets could exhaust context window.