MCP server for fetching web URLs with token estimation, smart caching, and intelligent routing. Built for AI agents.
AgentFetch provides a focused web-fetching toolkit with generally strong descriptions and clear composition. All four tools have detailed, LLM-optimized docstrings explaining WHEN to use them and WHEN NOT to use them. Parameter schemas are present and mostly well-documented. However, there are notable gaps: (1) output schemas are described only in prose within docstrings, not as explicit JSON Schema definitions visible to the MCP client; (2) error handling guidance is minimal, tools return dicts but error cases lack structured recovery hints; (3) no input validation constraints (enums, ranges, patterns) are declared in parameter definitions; (4) the tools exhibit good composition (each has one clear concern) and good naming (verb-noun: fetch_url, estimate_tokens, search_and_fetch), but output field naming consistency could be stronger. The tool descriptions are 150 - 400 chars, which is excellent by the 194-char baseline. All parameters have descriptions, which is rare and positive. The 'format' parameter in fetch_url accepts free-form strings instead of an enum, and 'num_results' in search_and_fetch lacks explicit min/max constraints in the schema definition (though they're stated in the description).
Estimate token count of a URL's content WITHOUT fetching the body.
Fetch up to 20 URLs concurrently. Each result is the same shape as fetch_url.
Fetch any URL and return clean, LLM-ready Markdown with token count, metadata, and 6h caching.
Web search + fetch top results in one call.
Output schemas are described only in prose/docstrings, not as explicit JSON Schema definitions in the MCP tool registration. The MCP client cannot introspect the response structure programmatically. LLMs must infer output field names from narrative descriptions, increasing hallucination risk.
The 'format' parameter in fetch_url accepts free-form strings ('markdown', 'text', 'json') but is not declared as an enum in the input schema. This invites LLMs to hallucinate unsupported formats. The constraint is only in the description text.
The 'num_results' parameter in search_and_fetch states 'default 3' and '(1 - 10, default 3)' in the description, but the schema definition does not include minimum/maximum constraints or an enum. Numeric bounds should be enforced in the schema, not just documented in prose.
Inferred effective spec: <=2025-11-25.
| Scored | Grade | Overall | Spec posture | Rubric |
|---|---|---|---|---|
| 2026-09-22 | C | 60 | <=2025-11-25 | v2 |
Error handling is minimal. Tools return dicts with 'success' and 'error' fields, but error responses lack recovery guidance. For example, a failed fetch should suggest 'Try estimate_tokens first' or 'Try search_and_fetch to find alternative URLs', not just return error=true.
The fetch_url tool description promises automatic routing (Trafilatura → Jina → FireCrawl → PDF) but the 'fetch_info' return field only includes 'fetcher_used'. If routing fails, there is no 'tried_routes' or fallback guidance to help the LLM understand what happened and whether to retry.