MCP server that exposes Obsidian vault operations (read/write notes, search, canvas management, pane control) as tools for Claude Code plugin
Strong tool set with clear naming (verb_noun pattern) and comprehensive descriptions (avg 180 chars). All 17 tools have explicit schemas with typed parameters. However, output schemas are not documented, LLMs cannot predict response structure for chaining. Parameter descriptions are solid but lack format constraints (e.g., max_results capped at 50 is stated in description but not enforced via schema). Error handling is minimal, no recovery guidance or actionable error messages visible. Security: no secrets exposed as params (good), but no permission gates or audit trail patterns evident.
Create a new Obsidian Canvas file: a spatial board of cards ('nodes') connected by arrows ('edges') on an infinite 2D surface. Fails if the file already exists; use update_canvas to replace an existing one.
Create a new note in the vault. Fails if the note already exists.
Get the vault-relative path and full content of the note currently open in Obsidian.
Find all notes in the vault that link to a given note (its backlinks). Use this to understand what references a note before renaming, deleting, or restructuring it.
List all notes and unresolved link targets that a given note links to. Resolved links point to existing notes; unresolved links reference note titles that don't exist yet.
List notes and subfolders at a path in the vault. Omit directory or pass '' for the vault root.
Output schemas not documented. LLMs cannot predict response structure (fields, types, pagination) for downstream tool chaining. E.g., search_vault returns 'up to 20 matches' but response format is invisible.
No error handling guidance. Tools lack recovery hints (e.g., 'Note not found. Try search_vault() first'). LLMs cannot self-correct on failures.
Numeric constraints stated in descriptions but not enforced in schema. E.g., search_note_content 'max 50' is text-only; should be maxItems/maximum in JSON Schema.
| Scored | Grade | Overall | Spec posture | Rubric |
|---|---|---|---|---|
| 2026-09-23 | C | 65 | 2026-07-28+ | v2 |
List all panes currently open in the Obsidian workspace, with each pane's id, note title, rough screen position (e.g. 'top-left', 'bottom'), and whether it's the active pane. Use this before open_note with pane_id to target a specific pane, or to answer questions about what's currently open.
List all tags used across the vault (from frontmatter and inline #tags), with the number of notes each tag appears in, sorted by frequency (most-used first). Optionally scope to a directory.
Open a note and scroll the editor to a specific heading within it.
Open a note in the Obsidian workspace so the user can see it. Reuses the active pane by default.
Read the full markdown content of a note in the Obsidian vault.
Search the full text content of all notes in the vault for a query string (case-insensitive). Returns matching notes with surrounding line context so you can decide which notes to read in full. Use this when you need to find notes by what they contain rather than what they are named.
Search for notes whose filename or vault-relative path contains the query string (case-insensitive). Returns up to 20 matches.
Show a transient notice/toast message in the Obsidian UI, visible to the user.
Split the active pane and optionally open a note in the new split. Useful for showing two notes side by side.
Replace the entire nodes/edges structure of an existing canvas file. Fails if the canvas doesn't exist; use create_canvas for a new one. Same nodes/edges shape as create_canvas.
Replace the entire content of an existing note.
Destructive operations (create_note, update_note, delete implied) lack confirmation or dry-run support. Agents can overwrite notes without safeguards.
No tool annotations (readOnlyHint, destructiveHint, idempotentHint). Clients cannot infer safety properties without reading descriptions.