Markdown for the web. HTML for humans, Markdown for agents. MCP server for full-text search and documentation page retrieval.
mkdnsite provides 4 well-named, read-only documentation tools with clear descriptions and basic Zod schemas. All tools follow verb_noun naming (search_docs, get_page, list_pages, get_nav). Descriptions are concise (10-60 chars) and state what each tool does. However, schemas lack depth: parameters have minimal constraints, output schemas are undocumented (tools return JSON.stringify'd text rather than structured objects), and error handling is minimal. The search_docs tool accepts a limit parameter with proper min/max constraints (1-50), but other tools have empty input schemas. No tool annotations (readOnlyHint, idempotentHint) are present. Output is returned as plain text JSON strings rather than structured MCP response objects, forcing LLMs to parse unstructured content.
Get the documentation navigation tree
Retrieve the full markdown content of a documentation page by slug
List all available documentation pages
Full-text search across all documentation pages
Output schemas undocumented. Tools return JSON.stringify'd text in a single 'text' field rather than structured objects with typed fields. LLMs must parse unstructured strings, wasting tokens and increasing hallucination risk.
Empty input schemas for list_pages and get_nav. While these tools legitimately take no parameters, the schema should be explicitly documented (e.g., 'This tool takes no parameters'). Current empty {} leaves ambiguity.
No tool annotations. Tools lack readOnlyHint, idempotentHint, or destructiveHint. All four tools are read-only and idempotent, annotating them would help agents reason about safety and retry logic.
| Scored | Grade | Overall | Spec posture | Rubric |
|---|---|---|---|---|
| 2026-09-23 | C | 63 | 2026-07-28+ | v2 |
Minimal error handling. get_page returns isError=true with plain text on 404, but other tools have no error paths. No guidance on recovery (e.g., 'Try list_pages() to see available slugs').
search_docs limit parameter lacks default value documentation. Description says 'default 10' but Zod schema uses .optional() without explicit default. LLMs may not infer the fallback behavior.