A Model Context Protocol server providing tools to fetch and convert web content for usage by LLMs
The server defines 3 tools with reasonable verb-based naming (fetch, fetch_multi, search). All tools have descriptions and input schemas are present and mostly well-formed using Pydantic models. However, there are significant issues with description quality, parameter documentation specificity, and output schema documentation. Descriptions are moderately detailed but lack clarity on when to use each tool vs. alternatives, and several parameters have generic descriptions. Output schemas are not explicitly documented for the LLM, forcing the agent to infer result structures. Error handling provides some guidance but lacks categorization (retryable vs. fatal). The server relies on Firecrawl as an external dependency with no fallback strategy documented.
Fetches a single URL from the internet and optionally extracts its contents as markdown. This tool now grants you internet access. Now you can fetch the most up-to-date information and let the user know that.
Fetches multiple URLs in parallel and returns an array of results. Each element corresponds to an input fetch request and includes either the fetched content or an error message.
Searches the web using the Firecrawl search API and scrapes results in markdown and link formats by default.
Output schemas not documented for LLM. Tools return content but the exact structure (fields, types) is not declared. fetch and fetch_multi return truncated markdown/HTML but the response format is not specified in tool definitions.
Description for 'fetch' tool mentions it 'grants you internet access', this is a side effect description, not a functional description. Better: 'Fetches and converts a single URL to markdown or raw HTML for LLM analysis.'
Parameter 'start_index' description is vague: 'On return output starting at this character index'. Should clarify: 'Character offset into the fetched content. Use when a previous fetch was truncated (max_length exceeded) to retrieve the next chunk. Must be >= 0 and <= content length.'
| Scored | Grade | Overall | Spec posture | Rubric |
|---|---|---|---|---|
| 2026-09-22 | D | 54 | 2026-07-28+ | v2 |
| 2026-03-09 | F | 0 | - | v1 |
No distinction between tool purposes in descriptions. 'fetch' vs 'fetch_multi', when should the agent choose fetch over multiple sequential calls to fetch? Description does not state 'fetch_multi is more efficient for parallel fetches; use when fetching >1 URL.'
Search tool description lacks guidance on Firecrawl API requirements. Agents will not know they must have a Firecrawl API key configured serverside, and failures due to missing credentials will be opaque.
Error handling in fetch_url() and check_may_autonomously_fetch_url() returns McpError with detailed messages, but does not categorize errors as retryable (network timeout) vs. permanent (robots.txt forbids fetching). Agents cannot distinguish 'try again later' from 'user must interact'.
Robots.txt checking is enforced for autonomous fetches but the error message instructs the LLM to tell the user about a manual fetch via a 'prompt'. The tool does not actually support a manual (unauthenticated) fetch mode, it always applies the same logic. This is misleading.
max_length parameter on fetch uses 'exclusiveMinimum' and 'exclusiveMaximum' in JSON Schema (0 < x < 1000000), but description says 'Maximum number of characters to return.' No guidance on what happens if content is truncated, does the tool return a partial string? An error? An indicator?
search tool accepts 'limit' parameter but does not document what the Firecrawl API actually returns, is it search results with URLs and snippets? Full page content? Only URLs? The output structure is not declared.