Prototype · This site is a prototype showing 100 real servers from the official registry, not all of them yet.
PopNx MCPMCP servers for people who use AI · explained in plain words

Obsidian Hybrid Search

by flowing-abyssversion 0.17.4i★ 118iRuns on your computer
Registry nameio.github.flowing-abyss/obsidian-hybrid-search

Overview

Description from the maker (original English)

Search Obsidian vaults with hybrid full-text, fuzzy, semantic, and graph retrieval.

PopNx MCP’s three pillars

These three are never merged into one score: opinions, measurements and popularity are different things.

What you can do with it

We have not written a plain-language summary for this one yet. Below are the facts we read from the registry.

  • Connection: Runs on your computer
  • Transport: stdio
  • Category: Search & AI memory
  • You need to fill in: OBSIDIAN_VAULT_PATH, OPENAI_API_KEY

Install

Pick the AI app you use, then copy the settings.

You need

  • npmNode.js installed (for the npx command)

Open Claude Desktop → Settings → Developer → Edit Config, and paste this into claude_desktop_config.json

{
  "mcpServers": {
    "obsidian-hybrid-search": {
      "command": "npx",
      "args": [
        "-y",
        "obsidian-hybrid-search",
        "mcp"
      ],
      "env": {
        "OBSIDIAN_VAULT_PATH": "your-value",
        "OBSIDIAN_PREFIX": "your-value",
        "OBSIDIAN_IGNORE_PATTERNS": "your-value",
        "OBSIDIAN_RESPECT_GITIGNORE": "your-value",
        "OBSIDIAN_INCLUDE_PATTERNS": "your-value",
        "OBSIDIAN_CONTENT_IGNORE_PATTERNS": "your-value",
        "OPENAI_API_KEY": "your-value",
        "OPENAI_BASE_URL": "your-value",
        "OPENAI_EMBEDDING_MODEL": "your-value",
        "LOCAL_EMBEDDING_MODEL": "your-value",
        "RERANKER_MODEL": "your-value"
      }
    }
  }
}

Run this in your terminal

claude mcp add obsidian-hybrid-search --env OBSIDIAN_VAULT_PATH=your-value --env OBSIDIAN_PREFIX=your-value --env OBSIDIAN_IGNORE_PATTERNS=your-value --env OBSIDIAN_RESPECT_GITIGNORE=your-value --env OBSIDIAN_INCLUDE_PATTERNS=your-value --env OBSIDIAN_CONTENT_IGNORE_PATTERNS=your-value --env OPENAI_API_KEY=your-value --env OPENAI_BASE_URL=your-value --env OPENAI_EMBEDDING_MODEL=your-value --env LOCAL_EMBEDDING_MODEL=your-value --env RERANKER_MODEL=your-value -- npx -y obsidian-hybrid-search mcp

Paste into .cursor/mcp.json in your project, or ~/.cursor/mcp.json

{
  "mcpServers": {
    "obsidian-hybrid-search": {
      "command": "npx",
      "args": [
        "-y",
        "obsidian-hybrid-search",
        "mcp"
      ],
      "env": {
        "OBSIDIAN_VAULT_PATH": "your-value",
        "OBSIDIAN_PREFIX": "your-value",
        "OBSIDIAN_IGNORE_PATTERNS": "your-value",
        "OBSIDIAN_RESPECT_GITIGNORE": "your-value",
        "OBSIDIAN_INCLUDE_PATTERNS": "your-value",
        "OBSIDIAN_CONTENT_IGNORE_PATTERNS": "your-value",
        "OPENAI_API_KEY": "your-value",
        "OPENAI_BASE_URL": "your-value",
        "OPENAI_EMBEDDING_MODEL": "your-value",
        "LOCAL_EMBEDDING_MODEL": "your-value",
        "RERANKER_MODEL": "your-value"
      }
    }
  }
}

Paste into .vscode/mcp.json in your project

{
  "servers": {
    "obsidian-hybrid-search": {
      "type": "stdio",
      "command": "npx",
      "args": [
        "-y",
        "obsidian-hybrid-search",
        "mcp"
      ],
      "env": {
        "OBSIDIAN_VAULT_PATH": "your-value",
        "OBSIDIAN_PREFIX": "your-value",
        "OBSIDIAN_IGNORE_PATTERNS": "your-value",
        "OBSIDIAN_RESPECT_GITIGNORE": "your-value",
        "OBSIDIAN_INCLUDE_PATTERNS": "your-value",
        "OBSIDIAN_CONTENT_IGNORE_PATTERNS": "your-value",
        "OPENAI_API_KEY": "your-value",
        "OPENAI_BASE_URL": "your-value",
        "OPENAI_EMBEDDING_MODEL": "your-value",
        "LOCAL_EMBEDDING_MODEL": "your-value",
        "RERANKER_MODEL": "your-value"
      }
    }
  }
}

Values you fill in

  • OBSIDIAN_VAULT_PATH required env
    Absolute path to the Obsidian vault to index and search.
  • OBSIDIAN_PREFIX env
    Optional prefix for MCP tool names when configuring multiple vaults.
  • OBSIDIAN_IGNORE_PATTERNS env
    Comma-separated glob patterns to exclude from indexing.
  • OBSIDIAN_RESPECT_GITIGNORE env
    Read applicable .gitignore files and repository info/exclude rules when indexing; set to false, 0, or no to disable both.
  • OBSIDIAN_INCLUDE_PATTERNS env
    Comma-separated patterns to re-include notes ignored only by Git ignore rules.
  • OBSIDIAN_CONTENT_IGNORE_PATTERNS env
    Comma-separated regex rules for note body text to leave out of search, e.g. /%%[\s\S]*?%%/g. Original files and read stay unchanged.
  • OPENAI_API_KEY secret env
    Optional API key for OpenAI-compatible remote embeddings; omit to use local embeddings.
  • OPENAI_BASE_URL env
    Optional OpenAI-compatible API base URL for OpenRouter, Ollama, LM Studio, or similar providers.
  • OPENAI_EMBEDDING_MODEL env
    Remote embedding model name when using an OpenAI-compatible API.
  • LOCAL_EMBEDDING_MODEL env
    Local embedding model used when no remote embedding API is configured.
  • RERANKER_MODEL env
    Optional ONNX cross-encoder reranker model used when reranking is requested.

Values marked secret are keys to your account. Never share them or paste them into a chat.

These settings are generated from the maker’s registry entry. If the README says otherwise, follow the README.

Basic checksi

We check information anyone can see; we have not read the code. Checks that do not apply are left out of the count. · Checked Nov 5, 2026

  • ✓ Pass

    Maker matches the repo

    The registry name was verified with the GitHub account flowing-abyss, which owns the repo

  • ✓ Pass

    Still maintained

    Code last changed yesterday

  • ✓ Pass

    Has a licence

    Uses MIT

  • – Not applicable

    Endpoint responds

    This one runs on your computer; there is no internet endpoint

  • – Not applicable

    Sign-in with OAuth

    Runs on your computer and uses local settings instead

  • … Not checked yet

    No hidden instructions in tool descriptions

    Needs the server’s tool list first; this check starts in the next step

Compared with others in Search & AI memoryi

  • More stars than 10% of the other 10 servers in this category
  • Published to the registry more recently than 100% of the other 10 servers in this category
  • Basic checks equal to or better than 100% of the other 10 servers in this category

Compared only with servers in this prototype, not the whole registry.

Common questions

Is Obsidian Hybrid Search safe?

It passed 3 of 3 applicable basic checks. We have not read the code. Before adding a key or token, see what access the server asks for and use a key with only the permissions you need.

What keys or codes does it need?

You need to fill in: OBSIDIAN_VAULT_PATH, OPENAI_API_KEY

Does it run on my computer or in the cloud?

It runs on your computer. Your AI app starts it when needed, and data does not pass through the maker’s servers (unless it calls an online service itself).

Is it still maintained?

The GitHub repo last changed yesterday, and the latest version (0.17.4) reached the registry yesterday.

Which apps can use it?

Apps that support MCP, such as Claude Desktop, Claude Code, Cursor and VS Code. You also need Node.js on your computer.

What can I use instead?

In the same category: Context7, Codebase Memory, Exa

Alternatives

Servers in the same category from other makers, sorted by stars.

Reading a card:★ GitHub starsiThree pillars: reviews · checks · usageiUpdated = latest version published to the registryi

Context7

by upstash

Feeds AI the latest docs for libraries and frameworks before it answers, so code it writes does not use outdated, removed functions.

Computer or cloud★ 64,224MITUpdated 2 days ago

Codebase Memory

by DeusData

Codebase knowledge graph for AI agents — 162 languages, sub-ms queries, 99% fewer tokens.

Runs on your computer★ 48,148MITUpdated 19 days ago

Exa

by exa-labs

Connect AI agents to Exa for web search, content fetching, and multi-step research.

Runs in the cloud★ 5,213MITUpdated 43 days ago

README from the maker

Open the README

Copied from the maker’s repo as written. PopNx MCP has not reviewed or endorsed it. HTML, images and scripts are removed. Links lead off this site.

Obsidian Hybrid Search

Your Obsidian vault already contains your best thinking. Obsidian Hybrid Search makes that thinking easier to find, reuse, and bring into AI-assisted work.

It gives your vault one retrieval engine and three practical ways to use it. The native Obsidian plugin gives you fast search, previews, similar notes, link discovery, and graph views while you write. The MCP server lets AI agents search and read your notes as tool calls. The CLI gives power users the same engine for indexing, filtering, reranking, reading, and scripting.

The search understands how real vaults are built. It combines semantic search, BM25 full text, fuzzy title and alias matching, tags, folders, frontmatter, wikilinks, backlinks, and similar-note lookup. You can search by idea, phrase, title, relationship, or metadata without remembering the exact words you wrote.

That turns Obsidian into a stronger personal knowledge system and a better starting point for AI work. Agents can begin from your own notes, pull cited context from source files, follow related material, and work with knowledge you already trust. OHS runs locally by default with SQLite, FTS5, sqlite-vec, RRF ranking, and optional OpenAI-compatible embedding APIs.

Search quality

Evaluated on the Obsidian Help vault (171 notes, 58 queries, local model):

OHS (this project)qmd
nDCG@50.7330.659
MRR0.7880.665
Hit@10.7240.500
Avg query time571 ms ¹754 ms ²
Model download~117 MB~2.2 GB

¹ CPU (Apple Silicon), hybrid mode, no rerank. ² GPU (Apple Silicon Metal), LLM query expansion + reranking.

OHS uses Xenova/multilingual-e5-small. How to reproduce → · Full benchmark →

Real knowledge-vault benchmark

OHS is also evaluated on Andy Matuschak’s public evergreen notes, converted into an Obsidian vault with title-based note filenames, source URLs in frontmatter, local attachments, and 5,000+ internal note links across 1,357 notes.

The curated golden set includes 78 hand-judged queries across known-item lookup, paraphrases, quote fragments, ambiguous topics, citation lookup, and multi-note evidence.

Using the default local embedding model, OHS performs strongly on this dense note network.

MetricValue
nDCG@50.722
nDCG@100.753
MRR0.874
Hit@10.795
Hit@50.974
Recall@100.972
AllRel@100.949

The benchmark exercises retrieval over a highly connected real-world knowledge vault, including queries that do not simply repeat note titles.

Result JSON · Reproduce and interpret →

Large memory benchmark

To test retrieval on a larger public dataset, LongMemEval-S was converted into a 22,419-note Obsidian-style vault with 470 retrieval queries. Using baai/bge-m3 embeddings, OHS ranked the answer-bearing notes strongly:

MetricValue
nDCG@50.895
MRR0.920
Hit@10.889
Hit@50.968
Recall@100.950
AllRel@100.904

For this benchmark, each query uses the LongMemEval-provided haystack as its search scope. That makes the result reproducible and easy to inspect query by query, while still exercising retrieval over a large generated memory vault.

Result JSON · Reproduce and interpret →

Features

  • Hybrid search
  • BM25 + fuzzy title + semantic embeddings, fused with RRF
  • Alias search
  • notes with aliases: in frontmatter are indexed and searchable by any alias; alias matches are boosted in BM25 (weight 5×) and fuzzy title scoring
  • Four search modes
  • hybrid, semantic, fulltext, title (for text queries)
  • Similar note lookup
  • pass --path to find semantically related notes using stored chunk embeddings, with a title + content fallback
  • Graph traversal
  • --path --related shows linked notes at configurable depth; filter by --direction outgoing|backlinks|both
  • Links & backlinks
  • every result includes outgoing links and backlinks
  • Scope filtering
  • restrict to subfolder(s); supports multiple values and exclusions (-notes/dev/)
  • Tag filtering
  • filter by tag(s); supports multiple values and exclusions (-category/cs)
  • Snippet control
  • --snippet-length sets the context window; empty snippets always fall back to note content
  • Extended output
  • --extended adds a TAGS/ALIASES column to the CLI table showing frontmatter tags (#tag) and aliases
  • Incremental indexing
  • only re-indexes changed files; watches for edits in real time
  • Multi-query fan-out
  • pass multiple queries at once (ohs "q1" "q2" or queries[] in MCP); results are merged via RRF, so a note that ranks well in any one query floats to the top; useful when the note may use different vocabulary than the query
  • Cross-encoder reranking
  • --rerank re-scores results with gte-multilingual-reranker-base (ONNX int8, ~341 MB download once); improves precision for conceptual and multilingual queries; applied after multi-query merge
  • Local embeddings
  • works offline via @huggingface/transformers (no API key required); default model: Xenova/multilingual-e5-small, 100+ languages
  • Remote embeddings
  • OpenAI-compatible API (OpenRouter, Ollama, etc.)
  • Note reading
  • read fetches one or more notes by vault-relative path; returns full content with title, aliases, tags, links, and backlinks; on path miss returns top-3 fuzzy suggestions
  • Ignore patterns
  • exclude folders, extensions, or specific files
  • Obsidian plugin
  • native search modal inside Obsidian powered by the same CLI; see obsidian-hybrid-search-plugin

Installation

npm install -g obsidian-hybrid-search

CLI usage

Quick start

The recommended setup is to set OBSIDIAN_VAULT_PATH once in ~/.zshrc or ~/.bashrc. This lets you run the CLI from any directory.

export OBSIDIAN_VAULT_PATH="/path/to/your/vault"

Open a new terminal and index the vault once.

ohs reindex

You can now search from any directory.

ohs "zettelkasten"
Run from a vault

Alternatively, run the CLI without an environment variable from any directory inside your vault. It finds the vault root by walking up to the nearest .obsidian/ folder.

cd /path/to/your/vault

ohs reindex ohs "zettelkasten"

From outside the vault, set OBSIDIAN_VAULT_PATH or pass --db /path/to/vault/.obsidian-hybrid-search.db explicitly.

Optional remote embeddings

By default, the CLI uses the local Xenova/multilingual-e5-small model. It works offline without an API key, downloads about 117 MB on first use, and supports more than 100 languages.

To use a remote API, add its settings to your shell profile.

export OPENAI_API_KEY="sk-..."

Override the default API base for another provider

export OPENAI_BASE_URL="https://openrouter.ai/api/v1" # OpenRouter

export OPENAI_BASE_URL="http://localhost:11434/v1" # Ollama (no key needed)

export OPENAI_BASE_URL="http://localhost:1234/v1" # LM Studio (no key needed)

Override the default text-embedding-3-small model

export OPENAI_EMBEDDING_MODEL="text-embedding-3-small"

Search modes

The CLI supports four search modes called hybrid, fulltext, semantic, and title, plus graph traversal for linked notes. The commands below show how to use them, apply filters, rerank results, and control the output.

# Hybrid search (default)

ohs "zettelkasten atomic notes"

Fulltext BM25 search

ohs "permanent notes" --mode fulltext

Fuzzy title search (fast, typo-tolerant)

ohs "zettleksten" --mode title

Semantic / vector search

ohs "how to build a knowledge graph" --mode semantic

Limit results and set a score threshold

ohs "productivity systems" --limit 5 --threshold 0.3

Restrict to a subfolder

ohs "daily review" --scope notes/periodic/ ohs "daily review" --folder notes/periodic/ # alias for --scope

Restrict to multiple subfolders (OR)

ohs "productivity" --scope notes/pkm/ --scope notes/2024/

Exclude a subfolder

ohs "programming" --scope notes/ --scope -notes/archive/

Filter by tag

ohs "productivity" --tag pkm ohs "machine learning" --tag note/basic/primary

Filter by multiple tags (AND include, exclude with -)

ohs "learning" --tag pkm --tag work

Filter by frontmatter / properties (exact match, case-insensitive)

ohs "notes" --frontmatter status:todo ohs "notes" --prop priority:high # --prop is alias for --frontmatter

Filter by multiple frontmatter fields (AND)

ohs "notes" --frontmatter status:todo --frontmatter priority:high

Exclude by frontmatter value

ohs "notes" --frontmatter -status:done

Filter-only mode: no query, just filters (returns all matching notes sorted by title)

ohs --frontmatter status:todo ohs --folder notes/2024/ ohs --tag pkm ohs --frontmatter status:done --tag archived

Unlimited results in filter-only mode (default limit is 10)

ohs --folder notes/ --limit 0

Find semantically similar notes

ohs --path notes/pkm/zettelkasten.md

Graph traversal: show notes linked to/from this note

Results show depth: -1/-2 = backlinks, 0 = source, +1/+2 = outgoing links

ohs --path notes/pkm/zettelkasten.md --related ohs --path notes/pkm/zettelkasten.md --related --depth 2

Only outgoing links (what this note references)

ohs --path notes/pkm/zettelkasten.md --related --direction outgoing

Only backlinks (who references this note)

ohs --path notes/pkm/zettelkasten.md --related --direction backlinks

Traverse standard Markdown note links instead of Obsidian wikilinks

ohs --path notes/pkm/zettelkasten.md --related --link-type markdown

Traverse both wikilinks and standard Markdown note links

ohs --path notes/pkm/zettelkasten.md --related --link-type all

Longer context around each link

ohs --path notes/pkm/zettelkasten.md --related --snippet-length 500

Rerank results with a cross-encoder model (improves precision, ~1-3s extra latency)

Downloads gte-multilingual-reranker-base ONNX (~341 MB) on first use, cached in ~/.cache/huggingface/

ohs "zettelkasten atomic notes" --rerank

Show tags and aliases alongside results

ohs "zettelkasten" --extended

JSON output (for scripting)

ohs "spaced repetition" --json

Output only paths (one per line) — useful for piping into read

ohs --frontmatter id:OHS-4 --only-paths ohs read ${(f)"$(ohs search --frontmatter status:todo --only-paths)"} # zsh: read all matching notes

Output absolute filesystem paths

ohs "zettelkasten" --only-absolute-paths

Open results in Obsidi

Only the beginning is shown; read the rest in the repo

Ask PopNx