MCP server for maintaining a markdown knowledge base: classify plans, archive completed docs to .archiveMD/, restore anything archived by mistake, and compact noisy files. Never deletes.
Strong tool naming (verb_noun pattern), comprehensive descriptions (avg 180 chars), and well-structured schemas with enums. All 6 tools have clear input schemas with typed parameters and descriptions. Error handling is present but minimal, no recovery guidance or actionable error messages. Output schemas are not documented. Tool composition is excellent: each tool has a single responsibility, and chaining is supported via path parameters. Security is strong: no credentials exposed, read-only operations clearly marked, and a compile-time check enforces no-delete guarantee.
Classify markdown files as ACTIVE, COMPLETED, STALE, or UNKNOWN from frontmatter, status lines, checklist state, supersede links, and last-touched date. Each result carries a confidence and the list of signals behind it. Absence of evidence yields UNKNOWN, never COMPLETED; conflicting evidence yields low confidence. Only COMPLETED files become archive_candidates — age alone lands a file in stale_review for a human to judge, since stable reference docs are old precisely because they are correct. Read-only: this never archives anything.
move explicit paths into .archiveMD/, never deleting
return a compacted version without writing it
list markdown files with size and last-touched date
move files back out of .archiveMD/ to where they came from
write a change and report a diff summary
Output schemas not documented. Tool descriptions state what is returned (e.g., 'list of files', 'classified results', 'diff summary') but do not specify field names, types, or structure. LLMs cannot plan downstream operations without knowing response shape.
Error handling lacks recovery guidance. Tools return errors but do not tell the LLM what to do next (e.g., 'File not found. Check root_path is absolute and path_prefix is repo-relative.'). Agents cannot self-correct.
md_analyze_plans: 'stale_days' parameter lacks bounds. Description says 'Defaults to 180' but does not specify min/max. Unbounded numbers let LLMs pass absurd values (e.g., 999999 days).
| Scored | Grade | Overall | Spec posture | Rubric |
|---|---|---|---|---|
| 2026-09-23 | C | 64 | 2025-06-18+ | v2 |
md_compact_file: 'keep_entries' parameter lacks bounds. Description says 'Defaults to 5' but does not specify min/max. Unbounded numeric parameters invite invalid LLM inputs.
md_compact_file: 'max_tokens' parameter description says 'reported but not enforced.' This signals the parameter is advisory, not binding. Clarify whether LLMs should rely on it or treat it as informational only.