MCP server for Obsidian vault management, providing tools to read, write, create, delete notes, manage folders, handle metadata/frontmatter, and list templates
ObsiMCP has 13 tools with basic schemas and descriptions, but significant quality gaps. Tool names lack consistent verb-noun patterns (e.g., 'CrateANote' is misspelled, 'GetNoteFullPath' mixes get/find semantics). Descriptions are present but often vague, 'GetNoteFullPath' doesn't explain when to use it vs 'ReadNoteByFullPath'. Parameter descriptions exist but lack constraints (no enums, ranges, or format specs). Output schemas are undocumented; tools return free-text JSON or plain text without declared structure. Error handling is minimal, most errors are generic ('Failed to...') with no recovery guidance. No tool annotations (readOnlyHint, destructiveHint, idempotentHint) despite clear risk levels. WriteNoteByFullPath defaults to 'append' mode, which could cause unintended data accumulation if the LLM omits the mode parameter. Security: tools accept full file paths without clear validation of vault boundaries in all cases.
Add frontmatter metadata to an Obsidian note. Will fail if frontmatter already exists.
Create a Note according to the full path. Note that this server only creates a Note and does not write content to it. To write content, you need to call the server that writes content. Note: Before calling this method, if the Note being created is not under the Vault root directory, you need to call other methods to find all directories with the same name as the directory where the Note is located, and return them to the user for selection (if there is only one directory, it can be created directly).
Create a folder in Vault based on the full path to the folder
Delete a Note according to the full path
According to the folder name specified by the user, search for all folders with the same name in Vault for the user to choose
Tool name 'CrateANote' is misspelled (should be 'CreateANote' or 'CreateNote'). Typos in tool names confuse LLMs and break discoverability.
No output schemas documented. Tools return free-text JSON or plain text (e.g., FindAllFolderByName returns JSON with 'message' and 'matches' fields, but this structure is not declared). LLMs cannot plan downstream calls without knowing response structure.
WriteNoteByFullPath defaults 'mode' to 'append' without explicit LLM guidance. If the LLM omits the parameter, content silently accumulates instead of overwriting, violating the principle that defaults must not cause unintended side effects.
Inferred effective spec: <=2025-11-25.
| Scored | Grade | Overall | Spec posture | Rubric |
|---|---|---|---|---|
| 2026-09-23 | D | 54 | <=2025-11-25 | v2 |
Get the frontmatter YAML metadata from a specific Obsidian note
According to the Note file name provided by the user, find all files named with the file and the corresponding path in the Obsidian Note Library for the user to select. -file_name: The note file name specified by the user
Get all Notes and Folders under a Folder (non-recursive)
Extract the 'tags' field from the frontmatter of a markdown note and return as plain text.
List all templates in obsidian template folder.\ it return template's name and description
Move One Note To Target Path
Read content from a obsidian markdown file by fullPath. -file_full_path: Note Full Path
Write content to the Note according to the full path of the Note. The writing method is append or overwrite. The default is append. -file_full_path: The full path to the file to be written -content: What needs to be written -mode: Write mode: append or overwrite. When the user does not explicitly specify to overwrite, append is used by default.
Error messages are generic and non-actionable. Examples: 'Failed to create folder', 'Floder Find Error' (typo), 'Json Marshal Error'. LLMs receive no guidance on what went wrong or how to recover. Should include the invalid value, constraint violated, and next steps.
No tool annotations (readOnlyHint, destructiveHint, idempotentHint) despite clear risk levels. DeleteNote is destructive, ReadNoteByFullPath is read-only, but the schema does not declare this. Agents cannot reason about safety or retry semantics.