obsidian-mcp-server
Read, search and edit notes, headings, tags and frontmatter in an Obsidian vault
Local stdio server for reading, searching and editing notes in an Obsidian vault on disk
By Mauricio Wolff (individual) TypeScript Local · stdio ProductivityKnowledge and memory
82 popularity score ★ 1.7k ↓ 27k/wk
Opens the app, which asks before it adds the server. Then replace each <NAME> in its settings with your value.
claude mcp add mcpvault -- npx -y @bitbonsai/mcpvault@latest '<VAULT_PATH>'{
"mcpServers": {
"mcpvault": {
"command": "npx",
"args": [
"-y",
"@bitbonsai/mcpvault@latest",
"<VAULT_PATH>"
]
}
}
}{
"mcpServers": {
"mcpvault": {
"command": "npx",
"args": [
"-y",
"@bitbonsai/mcpvault@latest",
"<VAULT_PATH>"
]
}
}
}{
"servers": {
"mcpvault": {
"type": "stdio",
"command": "npx",
"args": [
"-y",
"@bitbonsai/mcpvault@latest",
"<VAULT_PATH>"
]
}
}
}[mcp_servers.mcpvault]
command = "npx"
args = ["-y", "@bitbonsai/mcpvault@latest", "<VAULT_PATH>"]gemini mcp add --scope user mcpvault npx -- -y @bitbonsai/mcpvault@latest '<VAULT_PATH>'MCPVault is started by an MCP client as a local process and pointed at one Obsidian vault folder. It works on the Markdown files directly, so Obsidian itself does not have to be open and no Obsidian plugin is installed. Note tools handle .md, .markdown, .txt, .base and .canvas files; listing and move_file also see other files such as images and PDFs.
It has 18 tools: reading whole notes, line ranges or just a heading outline; writing, patching, appending or prepending; moving, renaming and deleting; reading and merging YAML frontmatter; adding and removing tags; a vault-wide tag list; vault statistics; resolving [[wiki links]]; and a keyword search ranked with BM25. Frontmatter edits keep the formatting of fields that were not changed.
Two launch options follow the vault path. --read-only (since 0.15.0) hides the 7 tools that change the vault and refuses them if called, leaving 11 read tools. --exclude <subtree> (since 0.17.0, repeatable, also --exclude=<subtree>) hides a vault-relative folder from search_notes and list_directory; a per-call excludePaths on search_notes adds to it. The read and write tools can still open excluded files, so it is a tidiness filter, not an access control, and list_directory called on an excluded folder returns an error rather than an empty list (src/createServer.ts). The server does not read Obsidian's own excluded-files setting.
The code sets caps the README examples do not spell out: search_notes returns 5 results unless limit is given and never more than 20, get_vault_stats lists 5 recent files by default and at most 20, and read_multiple_notes takes up to 10 paths (src/createServer.ts). Any argument that is not one of the two options is joined into the vault path, so a mistyped flag becomes part of the path rather than an error (src/cli.ts). Note tools have refused dotfiles such as .env since 0.14.1, and unresolved symlinks have failed closed since 0.17.1 (CHANGELOG.md).
| Runtime | Node.js 22.12+ |
|---|---|
| Runs on | macOS, Windows, Linux |
| Also |
|
Node.js 22.12.0 or later, which also supplies npx. Since 0.18.0 Node 20 is no longer supported; anyone who must stay on Node 20 can pin @bitbonsai/mcpvault@0.17.3, the last release that runs there. An MCP client that can launch local stdio servers. No account, API key or running Obsidian app is needed. Add --read-only or --exclude <subtree> to the args after the vault path to use those options.
Search is plain keyword matching with BM25 ranking, not semantic search; it returns 5 results by default and at most 20. Batch reads stop at 10 notes. delete_note deletes permanently unless trashMode is set to local or system. move_file moves single files, not folders. Dotfiles, .obsidian, .git, node_modules and .trash are hidden from every tool. If no vault path is passed, the server uses the directory the client starts it in. One vault per server entry; several vaults need several entries. The README's own snippets omit -y for npx; the command here adds it so npx does not stop to ask before installing.
Suits someone who keeps notes in Obsidian, or any Markdown folder, and wants an assistant to read, search and tidy them locally without installing an Obsidian plugin or keeping the app open. With --read-only it fits sensitive vaults where the assistant should only look; --exclude keeps archives out of search results but does not wall them off. Pick something else if you need semantic or embedding search, access to a vault on another machine or a sync service, or control of the Obsidian app itself (commands, plugins, the open editor), which this server does not touch.
11 only read, 5 change things, 2 can delete or overwrite. A ? marks an optional parameter.
read_notepath: stringprettyPrint?: booleanwrite_note deletespath: stringcontent: stringfrontmatter?: objectmode?: enumpatch_note changespath: stringoldString: stringnewString: stringreplaceAll?: booleanlist_directorypath?: stringprettyPrint?: booleandelete_note deletespath: stringconfirmPath: stringtrashMode?: enumsearch_notesquery: stringlimit?: numbersearchContent?: booleansearchFrontmatter?: booleancaseSensitive?: booleanpathPrefix?: stringexcludePaths?: arrayprettyPrint?: booleanmove_note changesoldPath: stringnewPath: stringoverwrite?: booleanmove_file changesoldPath: stringnewPath: stringconfirmOldPath: stringconfirmNewPath: stringoverwrite?: booleanread_multiple_notespaths: arrayincludeContent?: booleanincludeFrontmatter?: booleanprettyPrint?: booleanupdate_frontmatter changespath: stringfrontmatter: objectmerge?: booleanget_notes_infopaths: arrayprettyPrint?: booleanget_frontmatterpath: stringprettyPrint?: booleanmanage_tags changespath: stringoperation: enumtags?: arrayget_vault_statsrecentCount?: numberprettyPrint?: booleanlist_all_tagsprettyPrint?: booleanwiki_linkdocument: stringprettyPrint?: booleanget_note_outlinepath: stringprettyPrint?: booleanread_note_linespath: stringstartLine: numberendLine: numberprettyPrint?: boolean