Blazing-fast local MCP server for Obsidian vault operations via stdio
vaultforge demonstrates solid tool design with 23 well-named, action-verb-prefixed tools (vault_status, read_note, write_note, etc.). All tools have descriptions (avg ~120 chars, within 10-1024 baseline). Input schemas are present and typed for all tools. However, output schemas are NOT documented, tools return JSON but the response structure is not formally specified. Error handling is present but generic ('ERROR: File not found') without recovery guidance. Parameter descriptions are adequate but lack format constraints (e.g., no regex patterns, min/max for numeric params). Destructive operations (delete_note, delete_folder) lack dry-run confirmation patterns. No tool annotations (readOnlyHint, destructiveHint) despite clear risk classifications in metadata.
Append content to an existing note or create it if it doesn't exist. Perfect for daily notes, inbox capture, and incremental logging.
Find all notes that link to a given note. Returns incoming wikilinks and their contexts.
Rename multiple files at once using patterns or explicit mappings. Supports regex-based transformations.
Create an Obsidian Canvas (.canvas) file with automatic layout. Provide nodes (label + type + content) and edges (from/to labels). The tool handles all positioning, IDs, and geometry via dagre DAG layout. Supports text, file, link, and group node types. Layout direction: TB (top-bottom), LR (left-right), BT, RL.
Modify an existing canvas: add/remove/update nodes and edges. New nodes are positioned relative to existing ones (near + position). Nodes are matched by label (fuzzy matching). Removing a node cascade-deletes all its connected edges.
Read an Obsidian Canvas and return its semantic structure. Returns node labels, types, and connections (not raw coordinates). Use format='summary' for overview or format='full' for positions. Labels can be used with canvas_patch to modify the canvas.
Output schemas not documented. Tools return JSON (e.g., vault_status returns {vaultPath, totalFiles, extensions, topExtensions}) but response structure is not formally specified in tool definitions. LLMs cannot plan downstream calls without knowing what fields to expect.
Destructive operations lack dry-run or confirmation patterns. delete_note, delete_folder, edit_regex, batch_rename support dry_run=true but do not enforce confirmation before permanent deletion. Agents can accidentally destroy data.
Tool annotations missing. No readOnlyHint, destructiveHint, or idempotentHint annotations despite clear risk classifications (READ_ONLY, WRITE, DESTRUCTIVE). MCP spec 2026-07-28 supports tool annotations; their absence prevents clients from applying safety policies.
| Scored | Grade | Overall | Spec posture | Rubric |
|---|---|---|---|---|
| 2026-09-23 | C | 64 | 2026-07-28+ | v2 |
Re-layout an existing canvas using dagre DAG layout. Repositions all nodes while preserving structure and connections.
Delete an entire folder and all its contents. Moves to .trash by default for safety.
Delete a note from the vault. Moves to .trash by default for safety. With cleanup_empty_parents, removes empty parent directories after deletion.
In-place edit: find and replace a unique string in a note. The old_str must appear exactly once. Atomic read-modify-write.
Find and replace using regular expressions across one or more notes. Supports multiline patterns and capture groups.
Read, write, and update YAML frontmatter in notes. Supports nested fields and type coercion.
List files and directories in a vault path. Supports recursive search, glob patterns, and sorting.
Remove all empty directories from the vault (recursively). Skips protected directories like .obsidian.
Read a note from the vault. Supports fuzzy path resolution: exact path, stem name, or partial path. Returns file content and metadata.
Force re-index of the vault search index. Call after bulk file operations or if search results seem stale. Index is cached at .vaultforge/search-index.json.
Fast full-text search across vault file paths (not content). Returns matching files sorted by relevance.
Semantic full-text search using BM25 ranking. Searches note content and returns ranked results with snippets.
Update wikilinks in notes when files are moved or renamed. Automatically fixes broken references.
Get vault index stats: total files, directories, file type breakdown, and index health.
Get AI-powered suggestions for vault improvements: missing links, orphaned notes, organizational opportunities.
Analyze vault structure and suggest organizational themes (folder patterns, naming conventions, content clusters).
Create or overwrite a note. Creates parent directories automatically. Use for new files or full replacements.
Error messages lack recovery guidance. Errors like 'ERROR: File not found: 01-Daily/2025-03-04' do not suggest next steps (e.g., 'Try search_vault() to find the note' or 'Available notes: ...'). LLMs cannot self-correct without actionable guidance.
Parameter constraints not formalized. Numeric params (limit, depth, nodesep, ranksep) lack min/max bounds. String params (pattern, query) lack length limits or regex patterns. Descriptions mention constraints informally ('Maximum results to return') but JSON Schema does not enforce them.