💥 The web is hostile to AI Agents. We brought a crowbar. Universal documentation discovery MCP server.
Five tools with complete input schemas and descriptions, but significant gaps in output documentation and error handling. Tool names follow verb_noun pattern (docs.discover, docs.read, docs.search, docs.extract, docs.map) which is good. Descriptions are present (avg ~80 chars) but lack actionable context for LLM selection. No documented output schemas, pagination guidance, or error recovery paths. Parameters are typed and described, but lack constraints (enums, ranges, format specs). All tools are READ_ONLY, reducing risk, but composition and chaining support is unclear.
Find documentation sources for any service, library, or API
Extract structured endpoint information from an OpenAPI, Swagger, or Postman spec
Map the complete documentation structure of any domain
Read any documentation URL and return clean, LLM-ready Markdown
Search for specific topics within a documentation site
No documented output schemas. Tools return results but LLMs cannot plan downstream calls or extract required fields. E.g., docs.discover returns array of {url, title, snippet, type, source} but this is inferred from code, not documented in tool definition.
Parameter constraints missing. 'max_length' in docs.read has no min/max bounds (default 20000 is hardcoded, not declared). 'method' enum in docs.extract is good, but 'tag' and 'search' lack format/length guidance. LLMs may pass invalid values.
No error recovery guidance. discover.tool.ts shows error handling (NO_RESULTS case) with a suggestion, but this is not part of the tool definition schema, LLMs cannot see it. Error responses must be documented in the tool contract.
| Scored | Grade | Overall | Spec posture | Rubric |
|---|---|---|---|---|
| 2026-09-23 | D | 56 | 2026-07-28+ | v2 |
Pagination not addressed. docs.discover and docs.map may return large result sets (10+ results shown in code), but no limit, offset, or cursor parameters. Large unstructured lists waste tokens and degrade LLM reasoning.
Tool composition unclear. docs.discover returns URLs; docs.read accepts URLs. But no documentation states this chaining relationship. LLMs must infer the workflow. Add dependency hints: 'Call docs.discover first to find documentation URLs, then pass them to docs.read.'