Vault as MCP
Provides MCP tools to read, search, create, update, rename, and delete notes in an Obsidian vault, enabling external LLM tools to access and manipulate vault content.
Click on "Install Server".
Wait a few minutes for the server to deploy. Once ready, it will show a "Started" state.
In the chat, type
@followed by the MCP server name and your instructions, e.g., "@Vault as MCPFind notes tagged 'project-alpha' and list them."
That's it! The server will respond to your query, and you can continue using it as needed.
Here is a step-by-step guide with screenshots.
Vault as MCP
An Obsidian plugin that runs an MCP (Model Context Protocol) server, enabling external LLM tools to access your vault. Supports HTTP transport natively (Open WebUI, remote LLMs). An optional bridge script provides a bridge from HTTP to stdio (Claude Desktop).
Important Notes
Network Use: This plugin runs a local HTTP server on your machine. It does not connect to external services.
Privacy: No telemetry or data collection. All data stays on your machine.
Desktop Only: This plugin requires a desktop environment and will not work on mobile devices.
Features
HTTP-based MCP server: Runs a Fastify server implementing the MCP protocol
Status Bar Indicator: Shows server status (stopped/running/error) with click-to-toggle functionality
Configurable Settings: Adjust server port, auto-start behavior, and log level
CORS Support: Enables access from remote machines via Tailscale or local network
MCP Tools:
read_note- Read note content by path; optionally expand embedded contentread_multiple_notes- Read multiple notes in a single requestsearch_notes- Find notes by folder, tag(s), frontmatter, text, or recencyget_linked_notes- Get outgoing links from a notelist_notes- List notes and subfolders in a directorycreate_note- Create notes from templates or with direct contentappend_to_note- Append content to an existing noteupdate_note- Update an existing note by replacing its entire contentdelete_note- Delete a note (moves to system trash)rename_note- Rename or move a note, updating all vault linksget_current_date- Get the current date for date-based operationsread_periodic_note- Get path and content (if it exists) for periodic notes (daily/weekly/monthly/quarterly/yearly)list_templates- List available templates and templating plugins
Related MCP server: obsidian-local-mcp
Installation
Manual Installation
Download the latest release from GitHub
Extract the files to your vault's
.obsidian/plugins/vault-as-mcp/directoryReload Obsidian
Enable "Vault as MCP" in Settings → Community Plugins
Install with BRAT
Assuming you have the BRAT plugin installed and enabled:
Open BRAT plugin settings
Click 'Add beta plugin'
Use
https://github.com/ebullient/obsidian-vault-mcpas the URL, select the latest version and installEnable "Vault as MCP", either as part of installing via BRAT, or in Settings → Community Plugins
Usage
Starting the Server
The plugin provides three ways to control the server:
Status Bar: Click the status indicator in the bottom-right to toggle the server on/off
Commands: Use the command palette to:
Start MCP server
Stop MCP server
Restart MCP server
Auto-start: Enable in settings to automatically start the server when Obsidian loads
Configuration
Open Settings → Vault as MCP:
Server Port: Port number for the MCP server (default: 8765)
Bearer Token: Optional authentication token for secure access
Auto-start Server: Automatically start when Obsidian loads
Debug: Enable debug messages
Authentication
Bearer token authentication is optional but recommended for security, especially when accessing your vault over a network.
To enable authentication:
Open Settings → Vault as MCP
Click "Generate" to create a secure random token (or enter your own)
Copy the token for use in client configuration
Save settings and restart the server if it's running
To disable authentication:
Open Settings → Vault as MCP
Click "Clear" to remove the token
Save settings and restart the server if it's running
Connecting from Open WebUI
In Open WebUI's MCP configuration, add a new server: http://localhost:8765/mcp
If Open WebUI is running on a remote machine (e.g., via Tailscale): http://<your-machine-ip>:8765/mcp
With authentication enabled, add the bearer token from your MCP server configuration in Open WebUI using the Authorization header:
Authorization: Bearer <your-token-here>Connecting with Claude Code
claude mcp add -t http -s local Obsidian http://localhost:8765/mcp -H "Authorization: Bearer <token>"Notes:
Make sure your port matches what you've configured in plugin settings
Enable authentication and use the bearer token from plugin settings
Claude Desktop
Claude Desktop uses stdio transport for MCP servers, so you'll need the
mcp-bridge.js script to bridge stdio to HTTP.
Requirements:
Node.js 18+ (for native fetch support)
"Vault as MCP" plugin enabled with the server running in Obsidian
Setup a stdio bridge (alternative to http):
Download
mcp-bridge.jsfrom the latest GitHub release and save it somewhere accessible (e.g.,~/.obsidian/scripts/mcp-bridge.js). Source is in thebridgebranch.Find your Claude Desktop config file:
macOS:
~/Library/Application Support/Claude/claude_desktop_config.jsonWindows:
%APPDATA%\Claude\claude_desktop_config.jsonLinux:
~/.config/claude/claude_desktop_config.json
Add the MCP server configuration:
{ "mcpServers": { "obsidian-vault": { "command": "node", "args": ["/absolute/path/to/mcp-bridge.js"], "env": { "VAULT_MCP_URL": "http://localhost:8765/mcp" } } } }With authentication enabled, add the
VAULT_MCP_TOKENenvironment variable:{ "mcpServers": { "obsidian-vault": { "command": "node", "args": ["/absolute/path/to/mcp-bridge.js"], "env": { "VAULT_MCP_URL": "http://localhost:8765/mcp", "VAULT_MCP_TOKEN": "your-token-here" } } } }Important: Replace
/absolute/path/to/mcp-bridge.jswith the actual path where you saved the bridge scriptRestart Claude Desktop
Testing:
The bridge logs to stderr, so you can see its activity in Claude Desktop's logs
In Claude, you should see the vault's MCP tools available
Try asking Claude to "read my note at path Daily Notes/today.md"
Troubleshooting:
Verify the plugin server is running (check Obsidian status bar)
Check the path to
mcp-bridge.jsis correct and absoluteEnsure Node.js 18+ is installed:
node --versionLook for bridge errors in Claude Desktop's logs
MCP Tools Reference
read_note
Read note content by path. Returns raw markdown by default. Pass includeEmbeds: true only
when embedded content was explicitly requested — embed expansion is expensive.
Parameters:
path(string, required): Path to the note (e.g.,"folder/note.md")sections(string[], optional): Return only these sections by heading text (case-insensitive, includes subheadings)includeEmbeds(boolean, optional): Expand![[embed]]blocks inline (up to 2 levels deep). Default:falseincludeLinks(boolean, optional): Also expand regular[[links]]inline. Only relevant whenincludeEmbedsistrue. Default:falseexcludePatterns(string[], optional): Regex patterns to skip certain embeds. Only relevant whenincludeEmbedsistrue
Example (plain read):
{
"name": "read_note",
"arguments": {
"path": "Daily Notes/2025-01-15.md"
}
}Example (with embedded content expanded):
{
"name": "read_note",
"arguments": {
"path": "Projects/overview.md",
"includeEmbeds": true
}
}search_notes
Find notes across the vault by folder, tag(s), frontmatter, modification time, or text content.
All parameters are optional and combine with AND logic, except tags[] which is OR within
the tag dimension. Use list_notes when folder structure (subfolder names) matters.
Parameters:
folder(string, optional): Restrict to notes under this folder path (recursive)tag(string, optional): Single tag filter, combined with AND logic alongside other paramstags(string[], optional): Return notes that have ANY of these tags (OR logic); cannot be combined withtagtext(string, optional): Words must all appear (any order); quote phrases:meeting "action items"mtime(object, optional): Filter by modification time —beforeand/orafter; each accepts an ISO date ("2026-04-25") or relative days ("7d"= 7 days ago)frontmatter(object, optional): Filter by frontmatter key/value, e.g.{"type": "quest"}sort(string, optional):"alpha"(default) or"recent"(newest modified first)limit(number, optional): Max results; only applied whensortis"recent"(default: 20, max: 50)
Example (tag + folder AND filter):
{
"name": "search_notes",
"arguments": {
"tag": "project",
"folder": "quests"
}
}Example (OR across multiple tags):
{
"name": "search_notes",
"arguments": {
"tags": ["tech/ai", "tech/mcp"]
}
}Example (recently modified):
{
"name": "search_notes",
"arguments": {
"folder": "chronicles",
"sort": "recent",
"limit": 10
}
}get_linked_notes
Get all notes linked from a specific note (outgoing links).
Parameters:
path(string, required): Path to the note
Example:
{
"name": "get_linked_notes",
"arguments": {
"path": "Projects/Main.md"
}
}create_note
Create a new note or binary file. Can create from a template or with direct content. Automatically creates parent folders if needed.
Parameters:
path(string, required): Path for the new file (e.g.,"folder/note.md"or"assets/diagram.png"). The.mdextension is added automatically for text notes.content(string, optional): The file content. For text notes, this is markdown. For binary files, this must be base64-encoded data. Not required iftemplateis specified.template(string, optional): Path to a template file (e.g.,"templates/daily.md"). Requires Core Templates or Templater plugin. If specified,contentis ignored.binary(boolean, optional): Set totruefor binary files (images, PDFs). Default:false.
Example (text note):
{
"name": "create_note",
"arguments": {
"path": "Projects/new-idea.md",
"content": "# New Idea\n\nThis is my new note content."
}
}Example (binary file):
{
"name": "create_note",
"arguments": {
"path": "assets/diagram.png",
"content": "iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAADUlEQVR42mNk+M9QDwADhgGAWjR9awAAAABJRU5ErkJggg==",
"binary": true
}
}Example (from template):
{
"name": "create_note",
"arguments": {
"path": "Daily Notes/2025-01-19.md",
"template": "templates/daily.md"
}
}Notes:
Fails with an error if the file already exists
Parent folders are created automatically
Returns the created file's path
Binary files support: PNG, JPG, PDF, and other formats via base64 encoding
Template support requires Templater or Core Templates plugin
Templater provides full template processing (dates, prompts, dynamic content)
Core Templates processes basic date variables and template content
append_to_note
Append content to an existing note. Can append to the end of the file or after a specific heading.
Parameters:
path(string, required): Path to the note (e.g.,"folder/note.md")content(string, required): The content to appendheading(string, optional): Heading to append after (e.g.,"## Tasks"). If not specified, appends to end of file.separator(string, optional): Separator between existing and new content. Default:"\n"(single newline)
Example (append to end of file):
{
"name": "append_to_note",
"arguments": {
"path": "Daily Notes/2025-01-18.md",
"content": "## Meeting Notes\n\n- Discussed project timeline"
}
}Example (append after heading):
{
"name": "append_to_note",
"arguments": {
"path": "Projects/roadmap.md",
"content": "- [ ] Implement new feature",
"heading": "## Q1 Tasks"
}
}Example with custom separator:
{
"name": "append_to_note",
"arguments": {
"path": "Projects/tasks.md",
"content": "- [ ] New task",
"separator": "\n\n"
}
}Notes:
Fails with an error if the note does not exist
Fails with an error if the specified heading is not found
Heading must match exactly (including
##markers)Content is appended at the end of the heading's section
Use
create_notefirst if the note might not existReturns the note's path
update_note
Update an existing note by replacing its entire content. This is useful when you need to make extensive changes to a note.
Parameters:
path(string, required): Path to the note (e.g.,"folder/note.md")content(string, required): The new content that will replace the entire file
Example:
{
"name": "update_note",
"arguments": {
"path": "Projects/roadmap.md",
"content": "# Updated Roadmap\n\n## Q1 2025\n\n- [x] Feature A\n- [ ] Feature B"
}
}Notes:
Fails with an error if the note does not exist
Replaces the entire file content (not a partial update)
Typical workflow: use
read_notefirst, modify content, thenupdate_noteReturns the note's path
delete_note
Delete a note by moving it to the system trash. This is safer than permanent deletion as files can be recovered.
Parameters:
path(string, required): Path to the note to delete (e.g.,"folder/note.md")
Example:
{
"name": "delete_note",
"arguments": {
"path": "Archive/old-note.md"
}
}Notes:
Fails with an error if the note does not exist
File is moved to system trash (not permanently deleted)
File can be recovered from trash if deleted by mistake
Returns the path of the deleted note
read_periodic_note
Get the file path for a periodic note based on configured settings, and return its content if the file exists. Supports daily, weekly, monthly, quarterly, and yearly notes. Checks for the Periodic Notes plugin first, then falls back to the core Daily Notes plugin for daily notes.
Parameters:
period(string, required): The period type - one of:"daily","weekly","monthly","quarterly","yearly"date(string, optional): Date in ISO format (e.g.,"2025-01-18"). Defaults to current date.
Returns: path always; content only if the note file exists.
Example (daily note):
{
"name": "read_periodic_note",
"arguments": {
"period": "daily",
"date": "2025-01-18"
}
}Example (weekly note for current week):
{
"name": "read_periodic_note",
"arguments": {
"period": "weekly"
}
}Example (monthly note):
{
"name": "read_periodic_note",
"arguments": {
"period": "monthly",
"date": "2025-01-01"
}
}Notes:
For non-daily periods (weekly, monthly, quarterly, yearly), requires the Periodic Notes community plugin to be installed and configured
For daily notes, falls back to core Daily Notes plugin if Periodic Notes is not available
Returns path based on user's configured format and folder settings in their plugin
Fails if the required plugin is not installed or the period type is not enabled
Path format depends on user's settings (e.g.,
"Daily Notes/2025-01-18.md"or"Weekly/2025-W03.md")If the note file does not yet exist, only
pathis returned (nocontentfield)
list_templates
List available note templates and which templating plugins are enabled. Useful for discovering what templates exist before creating notes.
Parameters:
None
Example:
{
"name": "list_templates",
"arguments": {}
}Returns:
{
"templates_folder": "templates",
"templates": [
"templates/daily.md",
"templates/meeting.md",
"templates/project.md"
],
"core_templates_enabled": true,
"templater_enabled": true
}Notes:
Returns the configured templates folder path
Lists all
.mdfiles in the templates folder (recursively)Indicates which template plugins are enabled (Core Templates, Templater)
Templates folder location comes from plugin settings
If neither plugin is enabled,
templatesarray will still list files in the default templates folder
Development
See CONTRIBUTING.md for development setup, build commands, and architecture details. AI assistants should also review CLAUDE.md for working guidelines.
License
MIT
Author
This server cannot be installed
Maintenance
Resources
Unclaimed servers have limited discoverability.
Looking for Admin?
If you are the server author, to access and configure the admin panel.
Latest Blog Posts
- Your AI Chatbot Just Exposed Your CEO's Salary to an InternBy Om-Shree-0709 on .Agent IdentityMCP SecurityOAuth Delegation
- Why MCP Servers Need Execution Sandboxing (And Why Your Current Stack Isn't Enough)By Om-Shree-0709 on .Agentic AiPrompt InjectionWebAssembly
MCP directory API
We provide all the information about MCP servers via our MCP API.
curl -X GET 'https://glama.ai/api/mcp/v1/servers/ebullient/obsidian-vault-mcp'
If you have feedback or need assistance with the MCP directory API, please join our Discord server