Skip to main content
Glama

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 frontmatter summary), read_note (full note content, with a filesystem-level guard against symlink escapes/aliasing), search_notes (case-insensitive full-text search over shared .md notes, ranked snippets), and resolve_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

apiToken

yes

—

Bearer token for /mcp

port

no

3000

HTTP port

vaultPath

no*

—

Vault root (read-only, absolute); *required for the vault-reading tools

sharingConfigPath

yes

—

Shared-paths config file (absolute; see below)

panelPassword

no

—

Enables the /panel operator UI; unset ⇒ panel disabled

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 dev
  • GET /healthz — health check (no auth)

  • POST /mcp — MCP endpoint (requires Authorization: Bearer <apiToken>)

  • GET /panel — operator panel (only when panelPassword is 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 --build

VAULT_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 }
  ]
}
  • path is 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.

Related MCP Connectors

Related MCP Servers

  • F
    license
    C
    quality
    C
    maintenance
    MCP 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
    -
  • A
    license
    A
    quality
    B
    maintenance
    An 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.
    5
    MIT