Read-only MCP server for any Obsidian/markdown vault. Index-first retrieval, hard page budget, path sandbox - the retrieval protocol enforced by the server, not requested in prose.
Four well-named, read-only tools with clear descriptions and solid input schemas. Naming follows verb_noun convention (get_index, search_notes, read_note, list_recent). Descriptions are detailed and explain WHEN to use each tool and what it returns. Input schemas use Zod with proper type constraints (min/max for numbers, string length). However, output schemas are not formally documented, responses are free-text wrapped in {content:[{type:'text',text:...}]} with no structured field definitions. Error handling is present but generic (no recovery guidance or error classification). No tool annotations (readOnlyHint, idempotentHint). The hard page budget and path sandboxing are enforced in code, which is good security practice, but not exposed in tool metadata.
Returns index.md, the catalog of every page in the vault (one line each). ALWAYS call this first to locate relevant pages, then read only the 1-2 pages that matter. Does not count against the page budget.
Lists pages modified in the last N days (default 7), newest first. Good for 'what changed lately'. Does not count against the page budget.
Returns the full content of one markdown page by vault-relative path (e.g. wiki/people/sam-okafor.md). Counts against the hard page budget of 5 reads per session - locate pages via get_index or search_notes first, then read only what matters.
Case-insensitive text search across every markdown page. Returns matching pages with line-numbered snippets. Use when the index does not answer 'where does this live'. Does not count against the page budget.
Output schemas not documented. Tools return free-text responses wrapped in {content:[{type:'text',text:...}]} with no structured field definitions. LLMs cannot plan downstream operations or extract specific data fields.
No tool annotations. Tools lack readOnlyHint, idempotentHint, or destructiveHint metadata. LLMs cannot infer safety properties or retry behavior without explicit hints.
Error responses lack recovery guidance. Errors like 'No index.md found' or 'Path escapes the vault' do not suggest next steps (e.g., 'Try search_notes() instead'). Agents cannot self-correct.
| Scored | Grade | Overall | Spec posture | Rubric |
|---|---|---|---|---|
| 2026-09-23 | C | 63 | 2026-07-28+ | v2 |
search_notes returns line-numbered snippets as plain text. No structured array of {file, line_number, snippet} objects. LLMs must parse unstructured output, wasting tokens and risking extraction errors.
read_note truncates large files at 50KB with a bare '[truncated at 50KB]' message. No indication of how much content was dropped or how to retrieve the rest. Agents cannot know if critical info was lost.