Firecrawl web scraping bridge plugin for Orchestra MCP
The server provides 5 tools with mostly complete JSON schemas and descriptions. However, descriptions are terse (averaging ~60 chars, well below the 194-char baseline), parameter descriptions are minimal or missing, and output schemas are undocumented. All tool names follow verb_noun convention (scrape_url, crawl_site, get_crawl_status, search_web, map_site), which is positive. Tool definitions are explicitly registered with schemas in internal/plugin.go, so they are not inferred. The HTTP client is properly abstracted (client/client.go), secret handling is correct (FIRECRAWL_API_KEY via env), and composition is reasonable (stateless tools, no state management). Key gap: output documentation, callers cannot predict response structure, and chaining opportunities are not clear.
Start crawling a website (async). Returns a crawl ID to check status
Check the status of a crawl job and retrieve results when complete
Map all URLs on a website to discover its structure
Scrape a single URL and return its content as Markdown
Search the web and return results with content via Firecrawl
Tool descriptions are terse (30 - 60 chars), well below production baseline of 194 chars. Descriptions lack WHEN to use, dependencies, and usage hints.
Output schemas are not documented. Callers (LLM agents) cannot predict response structure, field names, or types. This blocks effective tool composition and forces agents to reason about unknown response shapes.
Parameter descriptions are minimal or generic. E.g., 'formats' in scrape_url lists examples ('markdown, html, rawHtml, links, screenshot') instead of using an enum constraint. Enums are machine-parseable; examples encourage LLMs to hallucinate unlisted values.
| Scored | Grade | Overall | Spec posture | Rubric |
|---|---|---|---|---|
| 2026-09-22 | D | 56 | 2026-07-28+ | v2 |
| 2026-03-09 | D | 59 | - | v1 |
No error handling or recovery guidance documented. Tools call external Firecrawl API, timeout, rate limit, and network errors are inevitable. No tool description hints at error cases or recovery (e.g., 'If crawl fails, check API key with test_connection').
get_crawl_status accepts only crawl_id but does not document what fields the response contains. If crawl_id is the only required param, agents cannot determine downstream tool eligibility (e.g., do they get URLs to feed into scrape_url?).
search_web and crawl_site accept numeric 'limit' but no bounds are documented. Agents could pass limit=10000, overwhelming the Firecrawl API or exhausting context. No minimum/maximum guidance.