An MCP server that provides web scraping and search capabilities via Firecrawl API, deployed as a Cloudflare Worker with Durable Objects
Two tools with basic schemas and descriptions, but significant gaps in parameter documentation and output structure. firecrawl_scrape has a well-defined input schema with enum constraints for formats, but lacks output schema documentation. firecrawl_search has minimal parameter description and no documented output structure. Neither tool includes error recovery guidance or actionable error messages. Naming is verb-noun compliant but descriptions are generic (194 chars baseline; these average ~120 chars). No tool annotations (readOnlyHint, destructiveHint, idempotentHint) despite both being read-only operations.
Scrapes a URL and returns content in specified formats (markdown, html, rawHtml, links, screenshot, screenshot@fullPage, json, changeTracking)
Searches using Firecrawl and returns search results as JSON
Output schemas not documented. firecrawl_scrape returns { content: [...] } but structure of content items and possible fields are not formally specified. firecrawl_search returns JSON but no schema provided for the data array structure.
firecrawl_search parameter 'query' has minimal description ('The search query'). No guidance on format, length limits, or expected behavior. Baseline: 72 chars per param; this is 17 chars.
No error recovery guidance. Both tools throw generic errors ('Firecrawl scrape failed', 'Failed to execute Firecrawl search') without actionable next steps. LLM cannot determine if error is retryable, user-fixable, or fatal.
No tool annotations. Both tools are read-only (safe to retry) but lack readOnlyHint annotation. This forces LLMs to reason about idempotency without explicit guidance.
| Scored | Grade | Overall | Spec posture | Rubric |
|---|---|---|---|---|
| 2026-09-23 | F | 49 | 2026-07-28+ | v2 |
firecrawl_scrape formats parameter is optional but no default behavior documented. Code defaults to ['markdown'] but description does not state this. LLM cannot predict behavior when formats is omitted.