searchLABSCO SUMMARY
Retrieval quality is measured, and the numbers are published.
Most vault-search tools ask you to take their ranking on faith. This one publishes benchmarks with the method attached: on the Obsidian Help vault it reports nDCG@5 of 0.733 against 0.659 for the tool it compares itself with, and on a 22,419-note vault built from LongMemEval-S it reports nDCG@5 of 0.895 — with the result JSON and reproduction instructions in the repository. Retrieval on a personal vault is exactly the kind of thing that feels fine and quietly misses, so a checkable number is worth more here than a feature list.
What it is
One retrieval engine over an Obsidian vault, reachable three ways: a native Obsidian plugin, a CLI, and this MCP server. It fuses semantic embeddings with BM25 full-text, fuzzy title and alias matching, tags, folders, frontmatter, wikilinks and backlinks using RRF, so you can find a note by idea, phrase, title, metadata or relationship rather than by remembering your own wording.
What you get
search— text search inhybrid,semantic,fulltextortitlemode, or similarity from apath; addrelated: trueto walk the link graph; passqueries[]for multi-query fan-out merged by RRF, plusscope,tag,limit,threshold,depth,direction,snippet_lengthandrerankread— fetch one or more notes by vault-relative path, returning full content with title, aliases, tags, links and backlinks; a path miss returnsfound: falseand the three closest fuzzy suggestions instead of an errorreindex— reindex the vault or a single filestatus— total notes, indexed count and last indexed time- Aliases from frontmatter are indexed and boosted, so a note can be found under any of its names
- Incremental indexing that only reprocesses changed files and watches for edits as you write
- Local embeddings by default via
@huggingface/transformers— no API key, offline, 100+ languages — with an OpenAI-compatible API as the alternative for OpenRouter, Ollama or LM Studio - Optional cross-encoder reranking with
bge-reranker-v2-m3, applied after the multi-query merge OBSIDIAN_PREFIXto prefix every tool name, so several vaults can be connected at once without collisions- A shared HTTP mode —
ohs serve, default127.0.0.1:3939— when several clients should use one long-lived index
Requirements
OBSIDIAN_VAULT_PATH pointing at the vault is the one required setting; everything else has a default. Run it through npx -y -p obsidian-hybrid-search@latest obsidian-hybrid-search-mcp — the package is obsidian-hybrid-search. The default local model downloads about 117 MB on first run and the optional reranker about 570 MB. OBSIDIAN_IGNORE_PATTERNS defaults to .obsidian/,templates/,*.canvas, .gitignore is respected unless you turn OBSIDIAN_RESPECT_GITIGNORE off, and OBSIDIAN_INCLUDE_PATTERNS puts back notes excluded only by that. Remote embeddings use OPENAI_API_KEY, OPENAI_BASE_URL and OPENAI_EMBEDDING_MODEL. HTTP mode is stateless and does not provide SSE streams or server-initiated notifications; bind beyond localhost and you must list every hostname clients will use.
Setup effort
One command — npm install -g obsidian-hybrid-search
USE CASES
Finding the note when you have forgotten your own wording
Search in hybrid mode so meaning, exact phrases, titles and aliases all count toward the ranking.
Pulling your own prior thinking into a conversation
Search the vault, then read the matching notes in full — content, tags, links and backlinks, cited from the source file.
Following the graph rather than the words
Give a note's path with related: true and a direction, and walk outgoing links or backlinks to a chosen depth.
Searching several vaults from one client
Run an instance per vault with distinct OBSIDIAN_PREFIX values so the tool names do not collide.
4 tools
Listed in project docs. Your client may show a different list.
readreindexstatusBEFORE YOU INSTALL
What to know first
Tools you get
4 tools named in the project's documentation.
INSTALLATION
Connect your client
Server setup
npm install -g obsidian-hybrid-searchMCP Clients
Any MCP client — local HTTP
Start the shared HTTP server in a terminal and leave it running:
OBSIDIAN_VAULT_PATH="<YOUR_OBSIDIAN_VAULT_PATH>" ohs serveThen point the client at it:
{
"mcpServers": {
"obsidian-hybrid-search": {
"url": "http://127.0.0.1:3939/mcp"
}
}
}Any MCP client
{
"mcpServers": {
"obsidian-hybrid-search": {
"command": "npx",
"args": [
"-y",
"-p",
"obsidian-hybrid-search@latest",
"obsidian-hybrid-search-mcp"
],
"env": {
"OBSIDIAN_VAULT_PATH": "<YOUR_OBSIDIAN_VAULT_PATH>"
}
}
}
}