A Model Context Protocol (MCP) server for Obsidian vault management via SSE transport
The Obsidian MCP Server demonstrates solid definition quality with comprehensive tool coverage (31 tools). All tools have clear, action-verb naming conventions (read-, create-, edit-, delete-, move-, list-, search-, etc.) that align with agentic patterns. Descriptions are present and contextual, averaging ~100-150 chars per tool, which is within the 10-1024 char baseline. Parameter schemas are well-structured with JSON Schema types and descriptions. However, there are notable gaps: (1) output schemas are not documented, the code shows tool definitions but response structures are inferred from implementation rather than explicitly declared in schemas; (2) error handling is present but lacks explicit recovery guidance in descriptions; (3) some parameters lack constraints (e.g., maxResults in search-vault, contextLines in search-vault, level in list-headings have no min/max bounds). Most tools follow single-responsibility principle well, with clear composition chains (e.g., search-vault → read-note → edit-note). Tool names like 'read-multiple-notes' and 'get-notes-info' show thoughtful optimization for batch operations. Security is adequate: no credentials exposed as parameters, file operations use path validation. The avg per-tool definition quality is approximately 70-74, pulling the overall score to 72.
Add tags to a note. By default adds to YAML frontmatter tags array (creates if missing). Use location='inline' for #tag syntax at end of file.
Append content to the end of a file
Append content to a specific section (under a heading) in a note
Find notes that are missing required tags. Useful for vault compliance and quality checks.
Create a new directory
Create a new note
Output schemas not explicitly documented. Tool definitions show input schemas but response structures are inferred from handler code rather than declared in tool registration. Makes it unclear to LLMs what fields will be returned, hindering composition planning.
Numeric parameters lack explicit min/max bounds. search-vault has maxResults (no limit stated), contextLines (no min/max), list-headings has level (1-6 hinted in description but not in schema constraints). Unbounded parameters invite LLMs to pass absurd values.
Error handling descriptions are sparse. Tools like create-note, edit-note, move-note state what they do but don't explain recovery steps on failure (e.g., 'If path doesn't exist, call list-vault first'). Descriptions lack actionable recovery guidance.
| Scored | Grade | Overall | Spec posture | Rubric |
|---|---|---|---|---|
| 2026-09-22 | C | 69 | 2026-07-28+ | v2 |
| 2026-03-09 | D | 58 | - | v1 |
Delete a directory. By default only deletes empty directories. Use recursive=true to delete non-empty directories.
Delete a note. Requires confirm parameter matching the filename for safety.
Create a copy of an existing note with a new name/path. The original note is preserved.
Edit an existing note
Find all broken links (links to non-existent notes) in the vault or directory.
Find all notes that have a specific tag (inline or in frontmatter).
Find and replace text in a note or recursively in a directory. Supports regex patterns and dry-run mode for preview.
Find all notes that link to a specific note (backlinks/references).
Get the YAML frontmatter from a note as structured JSON. Returns the parsed frontmatter object and the raw YAML string.
Get file info (size, dates, frontmatter presence) for one or more notes without reading full content. Efficient for scanning/auditing large vaults.
Insert content before or after a text marker (e.g., a comment or specific line)
List all headings in a note with their levels and line numbers
List all tags in the vault (or directory) with usage counts. Finds both inline #tags and frontmatter tags.
List all files in the vault
Move a note to a different location
Read multiple notes in a single request. Much more efficient than multiple read-note calls. Supports frontmatterOnly option for token-efficient auditing.
Read the contents of a note. Use frontmatterOnly=true to get just the YAML frontmatter as JSON (saves tokens on large files).
Read content of a specific section (under a heading) from a note
Remove tags from a note. By default removes from both frontmatter and inline locations.
Rename or move a directory and all its contents to a new location
Replace the content of a section (under a heading) with new content
Find all notes in a directory that do NOT have a specific tag.
Search vault for files and content matching a query. Supports content search, filename search, regex patterns, and context extraction.
Update specific fields in a note's YAML frontmatter without touching the content. Merges updates with existing frontmatter. Set a field to null to remove it.
Write content to a note with multiple modes: overwrite (replace all), append (add to end), or prepend (add to beginning). Creates the file if it doesn't exist (for overwrite mode).
Some tool descriptions are minimal (<60 chars). create-note ('Create a new note'), edit-note ('Edit an existing note'), create-directory ('Create a new directory'), and move-note ('Move a note to a different location') lack context on when to use them vs alternatives and what the return structure includes.
No confirmation mechanism for destructive operations. delete-note includes a 'confirm' parameter for safety, which is good, but delete-directory lacks equivalent protection. Agents could recursively delete vault contents without explicit confirmation.