Obsidian MCP Server
Provides tools for searching, reading, editing, and managing Markdown notes in an Obsidian vault or any folder of .md files.
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., "@Obsidian MCP Serversearch for notes containing 'machine learning'"
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.
Obsidian MCP Server
A remote MCP server that exposes a folder of Markdown notes — an Obsidian vault, or just a plain folder of .md files — to LLM clients like Claude and ChatGPT. It talks Streamable HTTP, operates directly on the filesystem, and has no dependency on the Obsidian app itself.
MCP client --HTTP--> server.mjs (127.0.0.1:MCP_PORT) --node:fs--> VAULT_ROOTThe server only binds to 127.0.0.1. It does not do TLS termination, authentication, or expose itself to the network — that's a separate concern, left to whatever you put in front of it (see Exposing it remotely).
What it can do
Tool | Scope |
| Full-text search across the vault (or a folder), with context, folder scoping, case sensitivity, and per-file match counts |
| List files/folders at a path |
| Read any note; |
| Batch-read up to 20 notes in one call; a missing note errors per-path, not the whole batch |
| List the most recently modified notes, newest first |
| Folder tree overview, to orient without many list calls |
| Structured metadata search: filter by folder, tags, frontmatter fields, or modified date |
| All tags in use (frontmatter + inline |
| Checkbox inventory ( |
| Outgoing links + backlinks for a note, resolved the way Obsidian resolves |
| Create a note in |
| Append to a note in |
| Append to today's (or a given date's) daily note, creating it if absent |
| Save a standardized capture (conversation, excerpt, decision, todo, etc.) into |
| Edit an existing note anywhere in the vault — full replace, exact-string replace, or insert under a heading — fails if the note doesn't exist |
| Move/rename a note anywhere in the vault, rewriting every other note's |
| Soft-delete a note into |
Most of the metadata tools (query_notes, list_tags, list_tasks, get_backlinks) ride on one internal vault index that walks the vault once and caches parsed frontmatter/tags/headings/links/tasks per file, keyed by (path, mtime), so repeat calls only re-parse notes that actually changed.
Related MCP server: Obsidian MCP Server
Write model
New notes can only be created inside
Inbox/(configurable). The one exception isobsidian_append_daily_note, which may create today's daily note outsideInbox/because that path is fully deterministic and the write is append-only.Editing, moving/renaming, and deleting existing notes is allowed anywhere in the vault.
Delete is soft:
obsidian_delete_notemoves the file into.trash/instead of unlinking it, so it's always recoverable by hand..trash/is excluded from every listing/search tool.Move is wikilink-safe:
obsidian_move_noterewrites every other note's[[wikilink]]/![[embed]]that resolves to the moved note (bare filename if that's still unique, otherwise the full path), preserving aliases and#headinganchors.Path safety: every tool resolves paths through one canonical helper that rejects absolute paths,
..traversal, and symlinks pointing outsideVAULT_ROOT.Writes are atomic: temp file + rename in the same directory, so a client watching the folder (Obsidian, a sync client) never sees a partial write.
Configuration
Copy .env.example to .env and fill in:
Variable | Default | Meaning |
| — (required) | Absolute path to the vault folder. |
|
| Port the server listens on (loopback only). |
|
| Where new-note creation is confined to. |
|
| Whether |
|
| Whether to embed the raw capture payload as a JSON block in the Markdown. |
|
|
|
| — | Fallback for |
Running it
npm install
cp .env.example .env # set VAULT_ROOT
node server.mjscurl -s http://127.0.0.1:3001/health # {"ok":true}That's the whole server: one Node process, no database, no build step. npm run start does the same thing.
Exposing it remotely
Claude web/mobile and ChatGPT connect to MCP servers over the network, not over stdio like Claude Desktop — so using this from those clients means putting a real HTTPS URL with authentication in front of 127.0.0.1:MCP_PORT. This server has no authentication of its own; that's intentionally left to whatever sits in front of it. /mcp should be behind that auth layer; /health is safe to leave open, it returns nothing but {"ok":true}.
Once the client can reach the URL, add it as a custom connector (Claude) or a developer-mode connector (ChatGPT — standard ChatGPT connectors only invoke tools literally named search/fetch and won't show any actions here, since this server intentionally doesn't add those aliases).
A note on cloud-synced vaults
If VAULT_ROOT lives on a cloud-synced drive (iCloud Drive, Dropbox, OneDrive, etc.), a file can be an evicted placeholder that isn't actually on disk yet. readFileSync on one either blocks while it downloads or errors. The search/read tools handle this per-file — an unreadable note is reported individually rather than failing the whole call — but if it becomes a real problem, opening the file once in the desktop app (or your sync client's "keep local copy" option) forces it to materialize.
Development
The server is split into server.mjs (tool registration + Streamable HTTP transport) and lib/:
lib/config.mjs— env loading and validated config constantslib/vault-fs.mjs—resolveInVault, atomic writes, vault walking, ignore ruleslib/markdown.mjs— frontmatter/heading/task/wikilink/tag parsing (fence-aware)lib/vault-index.mjs— the cached vault-wide index and link resolution/backlink graphlib/daily-notes.mjs— reads.obsidian/daily-notes.json, Moment-token date formattinglib/capture.mjs— theobsidian_capture_inboxpayload normalizer and Markdown renderer
scripts/smoke-test.mjs drives the MCP surface end-to-end (initialize → tools/list → tools/call) against a scratch vault, without needing a real client:
VAULT_ROOT=/tmp/fake-vault node server.mjs &
node scripts/smoke-test.mjsIt exercises every tool above, including path-traversal rejection, wikilink rewriting on move, and dangling-backlink reporting on delete.
License
MIT — see LICENSE.
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/jamessturges/obsidian-mcp-server'
If you have feedback or need assistance with the MCP directory API, please join our Discord server