Graph-native MCP server for reading, navigating, and safely editing Obsidian vaults.
io.github.junnnnnw00/obsidian-everywhere MCP Server
Graph-native MCP server for reading, navigating, and safely editing Obsidian vaults. This server exposes functionality focused on working with Obsidian vault contents through an MCP interface, supporting operations such as retrieving information, moving through vault data structures, and performing controlled edits.
π οΈ Key Features
Read Obsidian vault content
Navigate vault data
Safely edit vault data
π Use Cases
Integrate Obsidian vault reading into developer workflows
Programmatically browse and locate notes within a vault
Apply safe automated updates to vault content
β‘ Developer Benefits
MCP-based access to Obsidian vaults from tools and apps
Structured βgraph-nativeβ approach for exploring vault relationships
β οΈ Limitations
Limited details provided about specific tools, authentication, or supported edit operations
Your Obsidian vault, as a graph, in Codex, ChatGPT, Claude, and other MCP clients.
Codex CLI Β· ChatGPT Desktop (Codex) Β· Claude Code/Desktop Β· remote clients β one server, every surface.
This is a graph server, not a markdown file server. Your AI client shouldn't see
your vault as "a folder of .md files" β it should see notes and links as a
graph: backlink traversal, n-hop neighborhoods, and topic-centered context
bundles are first-class tools, not an afterthought bolted onto a file
reader. Unresolved links stay in the graph (that's a real signal about your
vault, same as it is in Obsidian itself), and every response is structured
for what an LLM actually needs β explicit link relationships, not just raw
text.
π οΈ 36 graph-native MCP tools β graph navigation, structured/paginated reads, safe lifecycle and partial edits, rollback-capable bulk cleanup, regex/listing, Base checks, and persisted Obsidian settings.
π Three ways to connect β stdio for local MCP clients (including
Codex CLI, ChatGPT Desktop, and Claude), Streamable HTTP with a static
bearer token for private remote clients, and Streamable HTTP with OAuth
2.1 (PKCE + Dynamic Client Registration) for public connectors.
π§ Local semantic search β semantic_search and get_related's
method: "semantic" run a small multilingual embedding model
(multilingual-e5-small) entirely on your machine β no API key, cloud
account, or Ollama process to run. Downloads once (~120MB, cached under
~/.obsidian-everywhere/), then works fully offline.
Full tool list
Read
Tool
What it does
vault_overview
Note counts, top tags, PageRank hub notes, recently modified β a starting orientation
search_notes
Full-text search with tag/folder filters (with a trigram fallback for CJK substring matches unicode61 alone would miss β see DECISIONS.md D9), each result annotated with link counts and tags
semantic_search
Meaning-based search via local embeddings (multilingual-e5-small, no external service) β finds conceptually related notes that don't share the query's exact words
read_note
Structured content/frontmatter/links/tags plus line pagination; optional heading-scoped read
list_notes
Explicit folder-aware note listing with pagination; optionally projects named frontmatter fields (e.g. status, project) per note
list_folder
Immediate child folders, notes, and attachments
regex_search
JavaScript-regex search with file, line, and excerpt
get_backlinks
Every note linking to a given note, with the linking sentence
get_neighborhood
Explicit n-hop node/edge list around a note (links treated as undirected)
get_context_bundle
The killer feature. Center note + prioritized 1-hop neighbors packed into a token budget
list_tags
Full nested tag hierarchy with counts
get_notes_by_tag
Notes carrying a given tag (nested-aware)
find_orphans
Notes with no incoming or outgoing links
find_unresolved
Links that don't resolve to any note, grouped by target
find_path
Shortest connection path between two notes, with a one-line summary per hop
get_related
Similar notes that aren't directly linked yet β Jaccard over shared tags/neighbors by default, or method: "semantic" for embedding similarity
get_hotkeys / get_obsidian_settings
Persisted hotkey command IDs, Templates folder, and core-plugin settings
validate_base
Static YAML/shape validation for .base files or fenced Base blocks
Write
Tool
What it does
create_note
Create a new note (with frontmatter); reindexed immediately β the next tool call already sees it
apply_template
Create a note from a template, substituting {{date}}/{{time}}/{{title}} (Obsidian's core Templates variables)
append_to_note
Append to a note, optionally under a specific heading; fails closed if the heading isn't found
move_note / rename_note / delete_note
Lifecycle operations with inbound-link rewriting, backlink guardrails, and recoverable trash
Same, across every note in a folder (or the whole vault); dry-run first with rollback
add_tags / remove_tags
Add or remove frontmatter tags on one note
rename_tag
Rename a tag vault-wide across frontmatter and inline #tag text, dry-run first with rollback
bulk_replace / rollback_bulk_edit
Dry-run-first folder/regex replacement with snapshots and rollback
set_hotkey / set_templates_folder
Update persisted Obsidian settings (vault reload may be required)
Write tools are on by default for stdio and the
bearer-token HTTP transport, and off by default for the public OAuth
connector transport (opt in with OAUTH_ENABLE_WRITE_TOOLS=true) β see
Configuration and DECISIONS.md D15.
Try it without your vault
Run the built-in demo first. It creates a temporary sample vault, shows graph
orientation and unresolved-link discovery, previews a safe bulk edit, and then
removes the sample. It never reads or changes your own notes.
When you are ready to connect a real vault, generate copyable configuration for
Codex, ChatGPT Desktop, Claude Code, and Claude Desktop:
bash
npx -y obsidian-everywhere init /absolute/path/to/your/vault
npx -y obsidian-everywhere doctor /absolute/path/to/your/vault
init only prints configurationβit never edits global client settings.
doctor checks Node.js, permissions, Obsidian metadata, SQLite, parsing, and the
graph engine without printing note content. Add --share to redact the vault
path before pasting diagnostics into an issue.
Why Obsidian Everywhere?
There are several good Obsidian MCPs. Pick the architecture that matches how
you work rather than assuming one server wins every category.
Fast npx, focused LLM context, graph navigation, safe vault cleanup
Rich app-driven CRUD and Omnisearch
Direct control of a running Obsidian app
Maximum breadth, multi-vault and advanced analysis
Comparison checked against each project's published documentation on
2026-07-20. A blank or narrower cell means βnot documented there,β not that a
project can never support it. If you need active-file state or command-palette
execution, choose a plugin-backed server. If you want a headless, one-command
graph server with token-budgeted context and guarded cleanup, that is the niche
Obsidian Everywhere is designed for.
Everything runs locally by default. There is no account, API key, hosted vault,
or telemetry requirement.
See docs/architecture.md for how it's built and
docs/deploy.md for the full deployment topology
(LaunchAgent, Docker, Cloudflare Tunnel).
Where does this actually run?
The obsidian-everywhere process needs direct filesystem access to your
vault's .md files (to parse them, watch for changes, etc.) β so it
must always run on the machine where your vault physically lives
("the vault machine": your laptop, most likely). It does not matter which
client machine you're working from β the server always runs on the vault
machine; only the client connection method changes.
Where you use the MCP client
What you need
The same machine as the vault
stdio. Nothing else β Codex, ChatGPT Desktop, Claude Code/Desktop, or another local client spawns the server directly.
A different machine you control (a lab/work server, another laptop, an SSH box)
Bearer-token HTTP + a private network between the two machines (we recommend Tailscale).
claude.ai (web app or mobile app)
OAuth HTTP + a public HTTPS URL (via Cloudflare Tunnel). claude.ai runs in Anthropic's cloud, not your network, so it can't reach Tailscale or localhost β it needs a real public address.
You can run more than one of these at once (e.g. stdio on your laptop
and bearer-token HTTP for your work server) β they're independent
processes that all index the same vault.
Quickstart
The fastest install needs no clone or build step. Run this on the vault
machine (wherever your .md files live):
MCP clients normally launch this command for you using one of the
configurations below.
Not sure whether the path and runtime are ready? Run the privacy-safe diagnostic:
bash
npx -y obsidian-everywhere doctor /absolute/path/to/your/vault
Option A β Codex CLI and ChatGPT Desktop, same machine as the vault (stdio)
Codex CLI, the Codex IDE extension, and ChatGPT Desktop's Codex experience
share the same MCP configuration (official MCP documentation).
Add the server once:
Then restart ChatGPT Desktop (or the IDE extension). In ChatGPT Desktop you
can also add it through Settings β MCP servers β Add server, choose
STDIO, and enter the same command and arguments. Type /mcp in Codex to
confirm that the server and its 36 tools are connected.
For a project-scoped configuration instead, add this to a trusted project's
.codex/config.toml; use ~/.codex/config.toml to make it available globally:
Use an absolute vault path. GUI apps may not inherit the same PATH as your
terminal; if npx is not found, replace command with the absolute result
of command -v npx.
Option Aβ² β Claude Code, same machine as the vault (stdio)
Still on the vault machine:
bash
claude mcp add obsidian-everywhere -- npx -y obsidian-everywhere /path/to/your/vault
Or with environment variables instead of a positional arg:
bash
OBSIDIAN_VAULT_PATH=/path/to/your/vault claude mcp add obsidian-everywhere -- npx -y obsidian-everywhere
Option Aβ³ β Claude Desktop, same machine as the vault
Add to claude_desktop_config.json on the vault machine:
Option B β Codex, ChatGPT Desktop, or Claude on a different machine
Step 1 β set up a private network between the two machines, if you
don't have one already. Easiest option is Tailscale:
bash
# on BOTH the vault machine and the MCP client machine
curl -fsSL https://tailscale.com/install.sh | sh # or: brew install tailscale (macOS)
tailscale up # opens a browser to log in / join your "tailnet"
tailscale status # confirm both machines can see each other
Note the vault machine's Tailscale hostname/IP from tailscale status
(something like my-macbook.tailnet-name.ts.net or 100.x.y.z).
Step 2 β start the server, on the vault machine:
Keep this token β you'll need it in step 3. (To keep this running
persistently instead of in a foreground terminal, see the LaunchAgent
setup in docs/deploy.md,
or run it in Docker via docker-compose.yml if the vault machine is a server.)
Step 3 β connect from the other machine (the lab server, etc.), using
the vault machine's Tailscale address from step 1. For Codex (and the shared
ChatGPT Desktop configuration), keep the token in an environment variable:
Ensure ChatGPT Desktop is launched with that environment variable available,
then restart it. Alternatively, use Settings β MCP servers to add the
Streamable HTTP URL and bearer credential if your app version exposes those
fields.
For Claude Code:
bash
claude mcp add --transport http obsidian-everywhere \
http://<vault-machine-tailscale-name>:3737/mcp \
--header "Authorization: Bearer <the token from step 2>"
The second machine now has access to the vault indexed on the first. Full
walkthrough (Docker, LaunchAgent):
docs/deploy.md.
Option C β claude.ai web/mobile app (custom connector, OAuth)
This needs a public HTTPS endpoint β claude.ai's servers can't reach your
Tailscale network or localhost. See
docs/deploy.md
for the full Cloudflare Tunnel walkthrough (including the no-domain-needed
Quick Tunnel option for testing). Once your server is reachable at
https://your-domain:
claude.ai auto-discovers the OAuth flow and shows this server's sign-in
page β enter the OAUTH_LOGIN_SECRET you configured.
You only need this if you actually want claude.ai's web/mobile apps to
read your vault. If you only ever use Claude Code (locally or from
another machine), skip this entirely β Option A/B already fully covers
that with no Cloudflare/OAuth involved.
Configuration
Env var
Used by
Meaning
OBSIDIAN_VAULT_PATH
all
Vault path (or pass as a positional CLI arg)
OBSIDIAN_EVERYWHERE_DB
all
SQLite index path override. Defaults are transport-specific: index-stdio.db, index-http.db, or index-oauth.db under <vault>/.obsidian-everywhere/.
OBSIDIAN_EVERYWHERE_TOKEN
http-cli.js
Static bearer token
PORT
http-cli.js, oauth-http-cli.js
HTTP port (defaults 3737 / 3738)
OAUTH_ISSUER_URL
oauth-http-cli.js
Public HTTPS origin (e.g. your Cloudflare Tunnel hostname)
OAUTH_LOGIN_SECRET
oauth-http-cli.js
Single-user login secret
OBSIDIAN_EVERYWHERE_READONLY
cli.js, http-cli.js
Set to true to disable all write tools (default: write tools on)
OAUTH_ENABLE_WRITE_TOOLS
oauth-http-cli.js
Set to true to enable all write tools on the public connector (default: off)
Development
bash
npm run dev:stdio # tsx, no build step
npm run dev:http
npm run dev:oauth-http
npm test# vitest, runs against fixtures/test-vault
npm run typecheck
npm run lint
npm run format:check
fixtures/test-vault/ is a 30+ note fixture vault exercising every link
and parsing edge case the parser needs to handle (piped aliases, heading
and block links, embeds, frontmatter-embedded wikilinks, nested tags,
duplicate filenames across folders, unresolved links, code-block
exclusion, and Korean filenames/tags/wikilinks). It's what every test in
src/**/*.test.ts runs against.
Project status
v0.2: full graph engine, all three transports (stdio,
bearer-token HTTP, OAuth HTTP), 31 MCP tools including safe partial/bulk writes, and
client setup for Codex, ChatGPT Desktop, and Claude. Browser/account steps
such as registering a public connector and provisioning a Cloudflare Tunnel
remain manual β see docs/deploy.md. Tested against both the fixture vault
and a real 58-note personal vault with Korean content.
Contributing
Bug reports, feature requests, and PRs are welcome β see
CONTRIBUTING.md for dev setup, testing conventions,
and how the fixture vault relates to the test suite. Security issues:
please see SECURITY.md rather than opening a public issue.