MCP server for local-first, version-aware library documentation via ContextQMD
ContextQMD MCP has 6 tools with complete input schemas and descriptions. Naming follows verb_noun convention (search_docs, install_docs, get_doc, list_installed, remove_docs). Descriptions are present and substantive (100-200 chars typical). However, parameter descriptions lack detail on constraints, formats, and valid ranges. Output schemas are not documented in the visible code. Error handling returns structured error objects but lacks recovery guidance. No tool annotations (readOnlyHint/destructiveHint) despite clear risk profiles. The server is well-structured but falls short of production-grade polish.
Retrieve a specific documentation page with optional line-range extraction and context expansion
Install or update documentation for a library from the registry or local sources
List all installed library documentation with versions and metadata
Remove installed documentation for a library version
Search documentation across installed libraries using full-text search, vector search, or hybrid search modes
Search for available libraries in the ContextQMD registry
Output schemas not documented. Tools return ToolResult with content array and optional structuredContent, but LLMs cannot see what fields structuredContent contains for each tool. This forces LLMs to guess at response structure and risks parsing errors.
Parameter descriptions lack constraint details. 'max_results' has no min/max bounds; 'mode' enum is documented but no guidance on when to use each mode; 'from_line' and 'max_lines' lack range constraints. LLMs cannot validate inputs without explicit bounds.
No tool annotations despite clear risk profiles. install_docs and remove_docs are WRITE/DESTRUCTIVE but lack readOnlyHint/destructiveHint annotations. This prevents agents from understanding which tools are safe to retry and which have irreversible side effects.
| Scored | Grade | Overall | Spec posture | Rubric |
|---|---|---|---|---|
| 2026-09-23 | C | 67 | 2025-06-18+ | v2 |
Error responses lack recovery guidance. errorResult() returns error code and details but does not suggest next steps. E.g., 'Library not found' should suggest 'Try search_libraries() to find available libraries.'
get_doc has overlapping parameters (doc_path vs page_uid, from_line/max_lines vs around_line). Descriptions do not clarify mutual exclusivity or precedence. LLMs may pass conflicting parameters.