Read-only semantic search MCP server for Obsidian vaults using local Ollama embeddings.
Server has 4 tools with complete input schemas and descriptions. Naming follows verb_noun convention (search_notes, read_note, index_vault, index_status). Descriptions are present (avg 120 chars) but lack actionable context for LLM selection. Parameter descriptions are sparse or missing entirely, e.g., 'query' in search_notes has no description, 'path' in read_note lacks format guidance. Output schemas are undocumented; LLMs cannot predict response structure. Error handling is absent from tool definitions. Security-sensitive parameters (include_sensitive) are exposed as tool inputs rather than server-side gated. No pagination guidance despite search_notes returning up to 30 results.
Return semantic index status, automatic refresh state, and safety settings.
Index or reindex the Obsidian vault into the external semantic index. Does not modify the vault.
Read-only Markdown note reader by vault-relative path and optional line range.
Read-only hybrid semantic/keyword search over the Obsidian vault. Automatically refreshes the index after Markdown changes.
Output schemas completely undocumented. LLMs cannot predict response structure (fields, types, pagination). search_notes returns results but no schema describes result object, score field, or path field format.
Parameter descriptions missing or trivial. 'query' in search_notes has no description. 'path' in read_note lacks format guidance (vault-relative? absolute? with .md extension?). 'mode' enum values lack explanation of when to use each.
Security-sensitive parameter 'include_sensitive' exposed as tool input. Should be server-side gated via environment variable (OBSIDIAN_SEMANTIC_ALLOW_SENSITIVE) with permission checks, not passed by LLM. Agents log all parameters, this leaks security intent.
| Scored | Grade | Overall | Spec posture | Rubric |
|---|---|---|---|---|
| 2026-09-23 | D | 54 | 2026-07-28+ | v2 |
No error handling guidance in tool definitions. LLMs cannot know: is 'vault not found' retryable? Should they call index_vault first? What does a failed search return, empty array or error object?
search_notes accepts up to 30 results but no pagination guidance. If vault has 1000 notes, LLM cannot iterate through results. Missing next_cursor or offset/limit pattern.