ebullient3k downloadsMCP server connecting Open WebUI, Claude Desktop, and other LLMs to your vault.
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.
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.obsidian/plugins/vault-as-mcp/ directoryAssuming you have the BRAT plugin installed and enabled:
https://github.com/ebullient/obsidian-vault-mcp as the URL, select the latest version and installThe plugin provides three ways to control the server:
Open Settings → Vault as MCP:
Bearer token authentication is optional but recommended for security, especially when accessing your vault over a network.
To enable authentication:
To disable authentication:
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>
claude mcp add -t http -s local Obsidian http://localhost:8765/mcp -H "Authorization: Bearer <token>"
Notes:
Claude Desktop uses stdio transport for MCP servers, so you'll need the
mcp-bridge.js script to bridge stdio to HTTP.
Requirements:
Setup a stdio bridge (alternative to http):
Download mcp-bridge.js from the latest GitHub
release
and save it somewhere accessible (e.g.,
~/.obsidian/scripts/mcp-bridge.js). Source is in the bridge branch.
Find your Claude Desktop config file:
~/Library/Application Support/Claude/claude_desktop_config.json%APPDATA%\Claude\claude_desktop_config.json~/.config/claude/claude_desktop_config.jsonAdd 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_TOKEN environment
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.js with the actual
path where you saved the bridge script
Restart Claude Desktop
Testing:
Troubleshooting:
mcp-bridge.js is correct and absolutenode --versionRead 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 when includeEmbeds is true. Default: falseexcludePatterns (string[], optional): Regex patterns to skip certain embeds. Only relevant when includeEmbeds is trueExample (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
}
}
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 with tagtext (string, optional): Words must all appear (any order); quote phrases: meeting "action items"mtime (object, optional): Filter by modification time — before and/or after; 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 when sort is "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 all notes linked from a specific note (outgoing links).
Parameters:
path (string, required): Path to the noteExample:
{
"name": "get_linked_notes",
"arguments": {
"path": "Projects/Main.md"
}
}
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 .md extension 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 if template is specified.template (string, optional): Path to a template file (e.g., "templates/daily.md"). Requires Core Templates or Templater plugin. If specified, content is ignored.binary (boolean, optional): Set to true for 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:
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:
## markers)create_note first if the note might not existUpdate 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 fileExample:
{
"name": "update_note",
"arguments": {
"path": "Projects/roadmap.md",
"content": "# Updated Roadmap\n\n## Q1 2025\n\n- [x] Feature A\n- [ ] Feature B"
}
}
Notes:
read_note first, modify content, then update_noteDelete 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:
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:
"Daily Notes/2025-01-18.md" or "Weekly/2025-W03.md")path is returned (no content field)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:
.md files in the templates folder (recursively)templates array will still list files in the default templates folderSee CONTRIBUTING.md for development setup, build commands, and architecture details. AI assistants should also review CLAUDE.md for working guidelines.
MIT