MCP server that exposes MkDocs documentation as tools and resources, allowing AI agents to query documentation programmatically
Four tools with clear verb-noun naming (list_pages, get_page, search_docs, get_full_docs) and reasonable descriptions (80-180 chars). All tools are READ_ONLY and well-scoped. However, input schemas lack explicit type declarations in the visible code, parameters are documented in docstrings but not formally registered with JSON Schema. Output schemas are undocumented; search_docs and list_pages return dicts but structure is inferred from code, not declared. Error handling is basic (returns error dicts for missing locales) but lacks recovery guidance. No parameter validation constraints (enums, ranges) visible. Locale parameter appears in all tools but lacks enum constraint despite known valid values.
Get the complete documentation as a single text. Returns all pages concatenated with section headings. Useful when you need comprehensive context about the entire site.
Get a documentation page as clean markdown.
List all documentation pages grouped by section. Use this to discover what documentation is available before reading specific pages. Returns section names, page titles, paths, and descriptions.
Search across all documentation pages. Performs keyword search and returns matching pages with snippets.
Input schemas lack formal JSON Schema type declarations. Parameters documented in docstrings but not registered with explicit 'type' and 'required' fields in FastMCP @mcp.tool() decorator.
Output schemas undocumented. search_docs and list_pages return dicts with nested structures (sections, results) but no formal schema declaration. LLMs cannot plan downstream operations without knowing response structure.
Locale parameter appears in all tools but lacks enum constraint. Code shows available_locales is known at server creation time, but LLM receives no guidance on valid values, must infer from error messages.
| Scored | Grade | Overall | Spec posture | Rubric |
|---|---|---|---|---|
| 2026-09-23 | D | 53 | 2026-07-28+ | v2 |
Error handling returns bare error dicts without recovery guidance. 'Locale not found' error includes available_locales list, but get_page 404 only suggests fuzzy matches, no actionable next step for LLM.
search_docs returns results array but no pagination support (limit, offset, total_count). Large documentation sites could return hundreds of matches, exhausting context window.