ObsidianMCP
Exposes a read-only Obsidian vault to MCP clients over Streamable HTTP. Lists the accessible vault tree with frontmatter summaries, reads full note content (with symlink-escape guards), performs case-insensitive full-text search ranked with snippets, and resolves Obsidian wiki-links and backlinks across the shared note set. Access is governed by a default-deny sharing rules file editable through an operator web panel, so only explicitly shared paths are exposed.
Click on "Deploy 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., "@ObsidianMCPsearch my shared notes for "onboarding checklist" and summarize the matches"
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.
ObsidianMCP
Read-only MCP server that exposes an Obsidian vault to LLM clients over Streamable HTTP.
Status: v1 feature-complete. All four MCP tools are implemented, all routed through the sharing filter:
list_tree(accessible tree, each file annotated with a summary read from its YAML frontmattersummary),read_note(full note content, with a filesystem-level guard against symlink escapes/aliasing),search_notes(case-insensitive full-text search over shared.mdnotes, ranked snippets), andresolve_links(Obsidian wiki-links and backlinks over the accessible note set only). The operator web panel (/panel) edits which paths are shared.
Settings
All configuration lives in one settings.json — there are no environment
variables. Copy the template and edit it:
cp settings.example.json settings.json{
"apiToken": "your-mcp-bearer-token",
"port": 3000,
"vaultPath": "/abs/path/to/vault",
"sharingConfigPath": "/abs/path/to/sharing.json",
"panelPassword": "your-panel-password"
}Field | Required | Default | Purpose |
| yes | — | Bearer token for |
| no |
| HTTP port |
| no* | — | Vault root (read-only, absolute); *required for the vault-reading tools |
| yes | — | Shared-paths config file (absolute; see below) |
| no | — | Enables the |
vaultPath and sharingConfigPath must be absolute paths (relative values are
rejected), so there is no base-directory ambiguity. settings.json holds secrets
and is gitignored.
Related MCP server: obsidian-mcp
Run (local)
npm install
npm run build
node dist/index.js # reads ./settings.json
node dist/index.js /path/to/settings.json # or an explicit path
# or, without building: npm run devGET /healthz— health check (no auth)POST /mcp— MCP endpoint (requiresAuthorization: Bearer <apiToken>)GET /panel— operator panel (only whenpanelPasswordis set; password login)
Run (Docker)
Create settings.json (with in-container paths "vaultPath": "/vault" and
"sharingConfigPath": "/config/sharing.json"), then:
VAULT_PATH=/abs/path/to/vault docker compose up --buildVAULT_PATH here is only the Docker bind-mount source for the host vault; the
vault is mounted read-only, settings.json read-only, and the sharing config
writable so the panel can edit it.
For a remote deployment via Portainer (GHCR image + bind-mounted config over a
private network), see deploy/README.md and
deploy/portainer-stack.yml.
Sharing config
Which vault paths are exposed is controlled by a JSON file (default ./sharing.json),
read fresh on every request. It is a single ordered list of rules:
{
"rules": [
{ "path": "Projects", "share": true },
{ "path": "Projects/secret.md", "share": false }
]
}pathis a vault-relative POSIX path — a folder (shared recursively) or a single file.For any path, the longest (most specific) matching rule wins, so a folder can be shared while a descendant is denied, and vice versa.
Default-deny: a path with no matching rule is not shared.
{ "rules": [] }shares nothing.Dotfiles/dotfolders (e.g.
.obsidian) and symbolic links are always excluded, regardless of rules.
The vault is never written to; this file is the only knob.
Operator panel
Set PANEL_PASSWORD and open GET /panel. After a password login it shows the
full vault tree with a checkbox per file (folders toggle their descendants). Save
rewrites sharing.json as one share: true rule per checked file — so a newly
added note stays private until you check it (default-deny). Changes take effect on
the next MCP request; no restart. The panel writes only sharing.json, never
the vault. In Docker the config is mounted writable while the vault stays
read-only; the panel is not mounted unless PANEL_PASSWORD is set.
This server cannot be deployed
Maintenance
Related MCP Connectors
Agent-native MCP server over the public saagarpatel.dev corpus. Read-only, stateless.
Serve a folder of Markdown notes as an MCP server: hybrid search, reading, and sourced answers.
Search your AI chat history (ChatGPT, Claude, Codex) from any MCP client. Remote, private, read-only
Related MCP Servers
- AlicenseCqualityDmaintenanceRead-only MCP server for querying a running Obsidian vault from agentic runtimes, exposing safe Obsidian CLI commands.551MIT
- FlicenseNot gradedqualityBmaintenanceMCP server that exposes an Obsidian vault (search, read, create, and update notes) via Streamable HTTP.-
- FlicenseCqualityCmaintenanceMCP server to query and modify an Obsidian vault or any folder of markdown files. It provides search, tag filtering, backlinks, and CRUD operations on notes, with path traversal protection.11-
- AlicenseAqualityBmaintenanceAn MCP server for a plain-markdown LLM wiki vault with YAML frontmatter and Obsidian-style wiki-links, enabling headless full-text search, note reading, backlink discovery, and safe append/create-only writing with path traversal protection and an immutable raw/ directory.5MIT