Local MCP search layer for Markdown knowledge bases and Obsidian vaults
Vault-search-mcp demonstrates solid tool design with 17 well-named, action-verb tools covering CRUD, search, and graph operations. All tools have descriptions (avg ~120 chars) and input schemas with typed parameters. However, output schemas are not explicitly documented in the source code, parameter descriptions lack depth (many are single-phrase), and error handling is minimal. No tool annotations (readOnlyHint/destructiveHint) despite clear risk classifications. Naming is consistent (verb_noun pattern) and parameter types are present, but descriptions often omit usage context, constraints, and recovery guidance. The server follows basic patterns but lacks the LLM-optimization depth expected of A-grade tools.
Append content to an existing Markdown note. Only .md is supported.
Create a Markdown note and fail if it already exists. Only .md is supported.
Detect clusters of densely connected notes. Uses connected components to find isolated knowledge groups.
Return Markdown note metadata without the body. Returns parsed frontmatter, extracted tags, and file metadata for .md.
Export link-graph data for visualization. The node-and-edge format can feed D3.js, Obsidian Graph, or Gephi.
List vault notes with filters and pagination. Lists .md, .pdf, and .canvas. Only .md can be read with read_note. For PDF and Canvas files, use search_vault.
Output schemas not documented. Tool descriptions state what is returned (e.g., 'Dictionary with content, frontmatter, body, tags...') but no formal JSON Schema is visible in source. LLMs cannot reliably extract fields or plan downstream calls without explicit output structure.
Parameter descriptions lack depth and constraints. Most params have single-phrase descriptions (e.g., 'vault-relative path', 'number of results') without format, range, or usage context. LLMs cannot infer valid ranges, formats, or when to use optional params.
Inferred effective spec: <=2025-11-25.
| Scored | Grade | Overall | Spec posture | Rubric |
|---|---|---|---|---|
| 2026-09-23 | C | 68 | <=2025-11-25 | v2 |
Read a complete Markdown note with parsed frontmatter. Only .md is supported. Use search_vault for PDF or Canvas content.
Reindex one note incrementally.
Rebuild the complete vault index. Use this after broad reorganizations or when the rebuildable index must be recreated.
Search semantically within one vault folder. Descendant folders are included by the search backend.
Search vault notes semantically with cross-encoder reranking. Flow: query embedding, vector retrieval, then cross-encoder reranking.
Combine semantic and keyword search. This can recover exact technical terms, names, and acronyms alongside semantically related content.
Suggest links for a note based on semantic similarity. Finds similar notes that are not already linked.
Return measured operation and subsystem statistics. Includes observed p50/p95 latency, cache counters, catalog totals, and vector-index statistics.
Update or merge frontmatter metadata on a Markdown note.
Return search-index statistics.
Overwrite or create a Markdown note from complete content. Use this when the caller already has the complete .md content.
No tool annotations despite clear risk classifications. Tools marked WRITE (create_note, write_note, append_note, update_frontmatter, reindex_vault, reindex_note) lack destructiveHint annotation. READ_ONLY tools lack readOnlyHint. Agents cannot distinguish safe from risky operations without explicit hints.
Error handling minimal. public_error() wrapper exists but source shows only generic fallback ('The note does not exist or the path is invalid'). No recovery guidance, no actionable error messages, no categorization (retryable vs fatal). Agents cannot self-correct on failures.
Pagination present but incomplete. list_notes accepts limit/offset but no total_count or next_cursor returned. search_* tools accept top_k but no indication of result completeness. Large result sets risk context window exhaustion without clear pagination signals.