MCP server that lets AI assistants search and read any Fumadocs documentation site.
Strong tool definitions with consistent naming (verb_noun pattern), comprehensive parameter schemas using Zod, and clear descriptions. All 6 tools follow the get_/search_/list_ verb convention. Input schemas are well-structured with type constraints (min/max length, integer validation, positive numbers). However, output schemas are not formally documented, responses are text-based without structured field definitions. Error handling is present but generic. No tool annotations (readOnlyHint, destructiveHint, idempotentHint) despite all tools being read-only. Parameter descriptions are solid (72-char baseline met), but output documentation is missing.
Return the frontmatter / metadata of a page as JSON.
Fetch a documentation page as Markdown. Very large pages are truncated (with a notice); use get_section or get_toc to retrieve the rest in parts. Pass either a URL path (e.g. "/docs/getting-started"), an absolute URL on the same site, or a slug relative to the docs prefix.
Return only the markdown of one section of a page, identified by its heading anchor slug (lowercased, hyphenated). Use get_toc first to find available anchors.
List the headings of a page with their depth and anchor slug.
List all known documentation pages, optionally filtered by URL path prefix.
Full-text search across the Fumadocs site. Returns ranked hits with URL, title, description and a matching excerpt.
Output schemas not documented. Tools return text results without formal field definitions. LLMs cannot plan downstream operations or extract structured data reliably.
No tool annotations despite all tools being read-only. Missing readOnlyHint declarations prevent clients from optimizing caching and safety policies.
Error handling returns generic error messages without recovery guidance. 'search_docs' catches errors but does not tell LLM what to do next or classify error type.
Inferred effective spec: <=2025-11-25.
| Scored | Grade | Overall | Spec posture | Rubric |
|---|---|---|---|---|
| 2026-09-23 | C | 66 | <=2025-11-25 | v2 |
get_page truncates large pages (60KB limit) but does not document the truncation behavior in the description. LLMs may not realize content is incomplete.
list_pages defaults to 1000 results when limit is omitted. Description does not clarify this default, risking large responses that blow context windows.