Read-only semantic search MCP server for Obsidian vaults using local Ollama embeddings.
Copy the AI prompt to install this server into Claude Code, Cursor, or another agent β or use 1-click editor setup below.
We haven't yet run this listing's install command through our automated sandbox check. This isn't a red flag β we're steadily working through the catalog.
π‘ Paste into ~/Library/Application Support/Claude/claude_desktop_config.json (macOS) or %APPDATA%\Claude\claude_desktop_config.json (Windows)
Inspect callable tools, capabilities, and parameters exposed to AI agents by Obsidian Semantic Search.
index_statusReturns index metadata and safety settings.
index_vaultBuilds or updates the external SQLite index.
search_notesSearches notes with hybrid semantic and keyword ranking.
read_noteReads a note or line range by vault-relative path.
Read-only semantic retrieval for agents that need to find the right Obsidian note without write access.
νκ΅μ΄ Β· Quick Start Β· Why This Exists Β· How It Works
Your Obsidian vault is useful only if your agent can find the right note.
Keyword search misses context. Full write-capable Obsidian MCP servers expose more power than a retrieval agent needs. Obsidian plugins are great inside Obsidian, but they are not always the right boundary for Codex, Claude Desktop, Cursor, or any other MCP client.
This project is the narrow version:
No note writes. No cloud embeddings by default. No Obsidian plugin runtime. No sync service.
Status:
0.3.1early preview. The server is usable today, but ranking behavior and tool schemas may change before1.0.
| Need | What this server does |
|---|---|
| Find the note an agent should read | Hybrid semantic + keyword search over Markdown notes |
| Keep the vault safe | Exposes search/read/index/status only; no write, patch, move, rename, or delete tools |
| Stay local-first | Uses Ollama embeddings and stores the index on your machine |
| Make results agent-friendly | Returns file-level matches with headings, snippets, and line ranges |
| Avoid plugin state | Reads the vault directly from the filesystem; Obsidian does not need to be running |
Example result shape:
Requirements:
>= 24Install the embedding model:
Print setup guidance:
Add this to ~/.codex/config.toml:
Restart Codex, then run:
Add the server at user scope so the personal vault path stays out of project .mcp.json files:
Start a new Claude Code session and run /mcp to confirm the server is connected. On native Windows, use -- cmd /c npx -y @dalecb/obsidian-semantic-mcp after the environment flags.
See Anthropic's Claude Code MCP documentation for scope and command details.
In Claude Desktop, open Settings β Developer β Edit Config. This opens ~/Library/Application Support/Claude/claude_desktop_config.json on macOS or %APPDATA%\Claude\claude_desktop_config.json on Windows. Merge the following server into mcpServers:
Fully quit and restart Claude Desktop. Cursor and other JSON-style stdio MCP clients can use the same mcpServers entry. On Windows, if npx is not found, use "command": "cmd" and prepend "/c", "npx" to args.
See the official local MCP server guide for Claude Desktop configuration and logs.
This isn't aiming to be the most powerful Obsidian automation server. It aims to be the safest retrieval tool you can hand an agent.
Here's how it stacks up against the two tools it usually comes down to β a full-permission Obsidian MCP server (Local REST API based) and GBrain (a broader knowledge-compilation platform):
| This project | Full-permission Obsidian MCP | GBrain | |
|---|---|---|---|
| Access model | Read-only: search / read / index | Read + write + edit + delete | Read + write; compiles notes into its own model |
| Touches your vault | Never | Yes | Yes β restructures content |
| Obsidian must run | No β reads files directly | Yes β needs the REST API plugin | No |
| Required local runtime | Node.js + Ollama | Obsidian + plugin | Standalone platform |
| Embeddings & data | Local Ollama by default; remote URL is configurable | Local API; embeddings vary by setup | Built-in pipeline; optional sync |
| Storage | One SQLite file you can delete and rebuild | Plugin-managed | Its own store / migration |
| Best for | A small read-only retrieval boundary for agents | Full vault automation and editing | Building a compiled knowledge base across sources |
That trade is on purpose: give up writing, editing, and running inside Obsidian, and you get fewer moving parts and a smaller blast radius in return.
Use this if your agent should answer:
Do not use this if you want an Obsidian UI plugin, automatic note generation, or write-capable vault automation.
index_statusReturns index metadata and safety settings.
index_vaultBuilds or updates the external SQLite index.
Specific files:
search_notesSearches notes with hybrid semantic and keyword ranking.
Modes:
hybrid: semantic vector + SQLite FTS5 + metadata boostssemantic: vector-first searchkeyword: FTS5 keyword search without embedding the queryread_noteReads a note or line range by vault-relative path.
Default storage:
The vault remains the source of truth. The SQLite database is a derived index and can be deleted/rebuilt.
The server reads your vault and never writes to it. Three layers decide what an agent can see.
1. Always denied (system / tooling). Never indexed, no override:
.obsidian/, .smart-env/, .claude/, .codex-*/.)node_modules, cache, logs2. Sensitive β denied by default, unlockable. Stays blocked even when a tool call passes include_sensitive: true, unless the server is started with OBSIDIAN_SEMANTIC_ALLOW_SENSITIVE=true. Defaults to 08_PersonalInfo/. Override the list with OBSIDIAN_SEMANTIC_SENSITIVE_PATHS (comma- or newline-separated folders):
3. Your own excludes β always denied. Folders you never want indexed, searched, or read. No unlock flag:
Which one do you want?
OBSIDIAN_SEMANTIC_EXCLUDEOBSIDIAN_SEMANTIC_SENSITIVE_PATHS + OBSIDIAN_SEMANTIC_ALLOW_SENSITIVEAdditional guards:
realpath.
search_notesandread_noteenforce the current exclusion settings on every call. With automatic indexing enabled, the next search also removes excluded stale rows from the index. Confirm the active lists withindex_status.
The local index stores snippets and embedding vectors. Treat it as a derived copy of your vault. See PRIVACY.md.
The default is action-driven, not timer-based:
search_notes after server start.search_notes after a Markdown create, update, delete, or rename event.search_notes after the embedding model or index format changes; this triggers a full rebuild.index_vault call.The filesystem watcher only marks the index dirty. Indexing runs once, immediately before the next search, and concurrent searches share that work. If recursive watching is unavailable, the server falls back to an incremental scan before every search.
Disable automatic indexing with:
Then call index_vault { "mode": "incremental" } yourself. The legacy OBSIDIAN_SEMANTIC_STARTUP_INDEX=true remains supported, but is not the default because it does work even when no search follows.
Create a JSON file containing queries and expected paths to compare keyword, semantic, and hybrid modes under the same conditions:
The command reports Recall@K and MRR. Avoid adding ranking complexity or embedding cost unless hybrid search measurably beats the keyword baseline.
Refresh the index with search_notes or index_vault before evaluating.
Before publishing:
Confirm the package does not include data/, *.sqlite, or private vault files.
MIT
Showcase your server listing on GitHub or your project documentation. Embed this dynamic SVG badge to highlight official listing status and live engagement.
[](https://allmcps.com/mcp/obsidian-semantic-search)<a href="https://allmcps.com/mcp/obsidian-semantic-search"><img src="https://allmcps.com/api/badge/obsidian-semantic-search?style=directory" alt="Obsidian Semantic Search on AllMCPs" /></a>