MCP server giving AI agents structured, addressable access to a local markdown vault (Obsidian, Foam, plain folder).
Strong foundation with well-structured tools and clear naming conventions. All 7 tools follow verb_noun pattern (get_*, search). Descriptions are present and substantive (avg ~120 chars), exceeding the 10-char minimum. Input schemas are properly typed with JSON Schema. However, parameter descriptions are sparse or missing in several tools (e.g., 'scope' in search lacks detail on structure; 'filter' lacks format guidance). Output schemas are not documented in the visible code. Error handling guidance is absent, tools do not indicate what to do on failure or how to recover. No tool annotations (readOnlyHint, etc.) despite all being read-only operations.
Get the heading outline and structure of a specific markdown file.
Get a specific fragment (file preamble, heading section, or entire file) by path and optional anchor.
Get outgoing wikilinks and markdown links from a file or specific heading, with resolution and backlink information.
Get frontmatter metadata and tags for a specific file.
Get server identity, vault configuration, index state, algorithm IDs, and tool/resource capabilities for AI agent self-verification.
Get the hierarchical tree structure of the vault with file metadata and token counts.
Full-text search across the vault with BM25 ranking and optional filtering.
Parameter descriptions incomplete: 'scope' in search tool lacks structure documentation; 'filter' lacks format/syntax guidance. LLMs cannot infer valid filter expressions without explicit examples or grammar.
Output schemas not documented in visible code. LLMs need to know what fields search(), get_vault_tree(), and get_server_info() return to plan downstream operations and extract relevant data.
No error handling guidance. Tools do not indicate what to do on failure (e.g., file not found, search timeout, index degraded). Error responses should guide recovery: 'File not found. Call get_vault_tree() to list available files.'
| Scored | Grade | Overall | Spec posture | Rubric |
|---|---|---|---|---|
| 2026-09-23 | C | 68 | 2025-06-18+ | v2 |
No tool annotations despite all tools being read-only. Adding readOnlyHint=true to all 7 tools signals to agents that these operations are safe to retry and have no side effects.
Parameter 'heading' in get_fragment and get_links lacks clarity on format. Is it a heading string, a heading path (e.g., 'Section > Subsection'), or an anchor ID? Ambiguity forces LLM guessing.