Hybrid search (BM25 + TF-IDF + embeddings, RRF-fused)
obsidian_searchRetrieve relevant vault content by fusing full-text, semantic, and graph signals into one ranked list, with per-result explanation and granularity control.
Instructions
The default search tool for v2.0. Auto-detects every available retrieval signal — BM25 via FTS5 (if --persistent-index), TF-IDF cosine (always), and ML embeddings (if enquire-mcp build-embeddings ran) — and fuses them with Reciprocal Rank Fusion (Cormack et al, 2009) for higher recall and better paraphrase / synonym matching than any single ranker. Equal weights, k=60. Gracefully degrades: with only TF-IDF available it produces TF-IDF-style ranking; with BM25+TF-IDF it does keyword-augmented retrieval; with all 3 it matches Smart Connections-quality retrieval — free / offline / open-source. Returns per-signal observability (per_signal: { bm25, tfidf, embeddings }) so you can see WHY each hit ranked. v2.8.0: when --include-pdfs was passed to serve (or enquire-mcp index --include-pdfs ran), PDF chunks are blended into results — each hit carries a kind: "md" | "pdf" flag and PDF chunks include [page: N] markers in snippets so agents can cite the right page. Use this instead of the individual _search_text / _full_text_search / _semantic_search / _embeddings_search tools unless you specifically need single-ranker output for diagnostics. v3.10 (forgetting-aware): every hit also carries age_days (whole days since the note was last edited, from its live mtime) and a stale boolean (true past ~1 year) — use these to flag a recalled fact as possibly out-of-date instead of stating it as current. Ranking stays relevance-driven by default; if the server was started with --recency-weight, fresher notes are blended upward.
Input Schema
| Name | Required | Description | Default |
|---|---|---|---|
| query | Yes | Free-form query — multi-word natural language is the sweet spot | |
| folder | No | Restrict to a subfolder (vault-relative) | |
| limit | No | Max hits (default 10) | |
| min_signals | No | Filter: only return hits that appeared in at least this many ranker signals. Default 1 (any). Set to 2+ for high-precision multi-ranker consensus. | |
| embedding_model | No | Override the embedding model alias (default 'multilingual'). Only consulted if a .embed.db exists. | |
| granularity | No | v2.2.0: 'note' (default) returns one hit per note (best chunk wins). 'block' keeps each chunk as a distinct hit — useful when one note covers a topic in multiple paragraphs and you want the LLM to see all of them. | |
| graph_boost | No | v2.3.0: post-RRF wikilink graph-boost — rerank top-K by counting how many OTHER top-K hits link to each one. Default ON. Set false to disable for diagnostic comparison. The 'only enquire-mcp does this' feature: generic vector stores can't do this without an Obsidian-aware layer. | |
| filter_frontmatter | No | v3.10: optional YAML-frontmatter filter — a {key: value} map. A hit is kept only if its note's frontmatter satisfies EVERY pair (AND across keys). Per key: strings match case-insensitively, an array frontmatter value matches by membership (e.g. {tags: 'project'} matches `tags: [project, x]`), and the filter value may itself be an array for OR ({type: ['meeting','decision']}). Notes with no frontmatter or missing a filtered key are excluded. Omit for no filtering (default). Filters the fused candidate pool, so a strict filter can return fewer than `limit` hits. |