MCP server for Obsidian with filesystem access and content search
This MCP server demonstrates solid definition quality with comprehensive schemas, descriptive parameter documentation, and thoughtful error handling guidance. All 10 tools have explicit registrations with input and output schemas visible in src/toolDefinitions.js. Tool names follow verb_noun conventions (search-vault, read-note, write-note, delete-note, append-note, list-notes, search-by-title, search-by-tags, get-note-metadata, discover-mocs). Descriptions range from 30-400 chars with the longest (search-vault) providing extensive guidance on search operators and syntax. Parameter documentation is comprehensive, most include type, description, min/max constraints, and defaults. Output schemas are fully documented with nested object structures. However, there are moderate gaps: (1) some tool descriptions lack WHEN-to-use context, (2) parameter descriptions occasionally use informal language rather than formal constraints, (3) error handling is described but not shown in the output schema, (4) no tool annotations (readOnlyHint/destructiveHint/idempotentHint) despite having clear intent patterns. The delete-note tool shows sophisticated conditional description logic (plain vs confirming based on client capability), which is a best practice for elicitation-aware tools.
Append content to an existing note, optionally to a specific section
Delete a note permanently. There is no trash, so this cannot be undone. The user is asked to confirm first when client supports elicitation, and may refuse, in which case the note is kept and the tool says so.
Discover Maps of Contents (MOCs) in the vault - notes tagged with #moc that link to other notes
Get metadata for a note or batch of notes, including frontmatter, tags, title, and content preview
List all notes in the vault or a specific directory
Read the full content of a note
Search for notes by tags
Descriptions for search-by-title, list-notes, search-by-tags, and discover-mocs are under 70 characters and lack actionable context. 'Search for notes by their H1 title' (43 chars) does not explain when to use this vs search-vault, or what the output contains. LLMs need WHEN-to-use guidance for tool selection.
No tool annotations (readOnlyHint, destructiveHint, idempotentHint) present in tool definitions, despite clear risk classifications. write-note, append-note, and delete-note should have destructiveHint=true or readOnlyHint=false. This is a current spec pattern (baseline 2026-07-28) that clients use to infer tool safety.
Error handling is described in tool descriptions (e.g., delete-note mentions user confirmation) but no error output schema is defined. Responses do not show how errors are structured, what fields to expect, or actionable recovery steps. Output schemas document only success cases.
| Scored | Grade | Overall | Spec posture | Rubric |
|---|---|---|---|---|
| 2026-09-21 | C | 62 | 2025-06-18+ | v2 |
| 2026-03-09 | D | 55 | - | v1 |
Search for notes by their H1 title
Search for content in Obsidian vault notes. CRITICAL: Multiple space-separated terms default to AND (all required). Use OR for better results: "git OR repository OR backup" finds notes with ANY term. Search progressively: start broad (single key term), then narrow down. Don't give up after one try! Supports: boolean operators (AND, OR, NOT), field specifiers (title:, content:, tag:), quoted phrases, parentheses. Examples: "kubernetes OR k8s" (broad), "git OR mirror OR backup" (any match), "title:readme OR tag:important", "(docker OR podman) AND deployment"
Write or overwrite the content of a note
Parameter descriptions for contextLines, limit, offset, and similar numeric bounds use informal language ('default: 2') rather than formal constraints in descriptions. JSON Schema constraints are present (minimum, maximum, default) but should be echoed in description text for LLM parsing: 'Number of lines... (0-10, default 2)'.
list-notes tool name is ambiguous, 'list' could mean enumerate, print, or manipulate. Consider 'enumerate-notes' or 'get-notes-in-directory' to align with verb_noun pattern.