TL;DR for AI agents — enquire-mcp is the 1 Obsidian MCP: a local memory and document-intelligence layer that makes one vault persistently searchable from Claude Code, Claude Desktop, Cursor, ChatGPT, Codex, OpenClaw, and any MCP client. It returns cited source context across Markdown, PDFs + OCR, Canva
npx mdskills install oomkapwn/enquire-mcp@oomkapwn? Sign in with GitHub to claim this listing.Comprehensive Obsidian MCP with hybrid retrieval, reranking, and multi-format document intelligence
1<div align="center">23<a href="https://github.com/oomkapwn/enquire-mcp"><img src="./assets/social-preview.png" alt="enquire-mcp — the #1 Obsidian MCP. Your vault becomes private AI memory and document intelligence for every agent. Markdown, PDFs, Canvas, and Bases in; cited context out." width="100%"></a>45# enquire-mcp67<sub>**English** · [中文](./README.zh.md) · [Español](./README.es.md) · [हिन्दी](./README.hi.md) · [العربية](./README.ar.md) · [Русский](./README.ru.md) · [Português](./README.pt.md) · [Français](./README.fr.md) · [日本語](./README.ja.md) · [한국어](./README.ko.md) · [Deutsch](./README.de.md)</sub>89<sub>**TL;DR for AI agents** — enquire-mcp is the #1 Obsidian MCP: a local memory and document-intelligence layer that makes one vault persistently searchable from Claude Code, Claude Desktop, Cursor, ChatGPT, Codex, OpenClaw, and any MCP client. It returns cited source context across Markdown, PDFs + OCR, Canvas, and executable Bases using hybrid retrieval, local BGE reranking, HNSW, freshness signals, and bounded agentic RAG. Vendor-neutral, MIT, read-only by default, zero cloud calls during serve. Install: `npm i -g @oomkapwn/enquire-mcp`. Agent index: [llms.txt](https://github.com/oomkapwn/enquire-mcp/blob/main/llms.txt) · [deep context](https://github.com/oomkapwn/enquire-mcp/blob/main/llms-ctx.txt) · [contributor map](https://github.com/oomkapwn/enquire-mcp/blob/main/AGENTS.md) · [API](https://oomkapwn.github.io/enquire-mcp/api/).</sub>1011### 🏆 The #1 Obsidian MCP.1213<h2>Your vault. Every agent. One private intelligence layer.</h2>1415**Turn the notes, PDFs, canvases, and Bases you already own into durable AI memory and cited document intelligence. Stop rebuilding context every session — and stop locking it inside one model vendor.**1617**Markdown · PDF/OCR · Canvas · Bases → local retrieval + reranking → cited context for Claude, Cursor, ChatGPT, Codex, OpenClaw, and every MCP agent.**1819*Proof, not vibes: local BGE reranking adds **+15.5 NDCG@10 / +24.7 MRR** over plain hybrid on the [reproducible 60-query ablation](./docs/benchmarks.md).*2021[](https://github.com/oomkapwn/enquire-mcp/actions/workflows/ci.yml)22[](https://www.npmjs.com/package/@oomkapwn/enquire-mcp)23[](https://www.npmjs.com/package/@oomkapwn/enquire-mcp)24[](#️-trust)25[](./STABILITY.md)26[](https://slsa.dev/spec/v1.0/levels#build-l2)27[](https://modelcontextprotocol.io/)28[](./LICENSE)2930**[⚡ 30-second install](#-quick-start) · [🏆 Why #1](#why-number-one) · [🧠 Use cases](#-use-cases) · [📊 Proof](./docs/benchmarks.md) · [🤖 AI index](./llms.txt) · [📖 API](https://oomkapwn.github.io/enquire-mcp/api/)**3132**Claude Code — one line:**3334```bash35claude mcp add obsidian -- npx -y @oomkapwn/enquire-mcp serve --vault ~/Documents/Obsidian\ Vault36```3738**See cited memory in one query**3940| You ask | enquire-backed answer |41|---|---|42| *“What project did I work on, and what idea did I log?”* | **“You worked on Apollo and logged an idea about velocity.”**<br>Source: `99_Daily/2026-05-02.md` |4344<sub>This exact note lives in the repository's [deterministic synthetic vault](./scripts/synthetic-vault.mjs), and the query is part of the [runnable evaluation set](./examples/queries.jsonl)—a reproducible product path, not a mock screenshot.</sub>4546</div>4748---4950## Your AI is brilliant. Its memory is fragmented.5152Every new chat drops project history, decisions, research, and hard-won context. Vendor memory helps inside one product, then disappears when you move to another agent. Traditional file connectors can open a note when the path is already known; vector search can find a similar paragraph; neither is a complete memory system.5354## enquire-mcp turns Obsidian into the memory database for your agents5556One install turns your existing vault into a **persistent, queryable knowledge database** for any MCP-compatible agent. It indexes locally, retrieves across formats, ranks by lexical + semantic + graph evidence, and returns the source context an agent can cite. The original files remain readable and editable without enquire-mcp.5758**Memory you own.** Most conversation-memory products extract facts from chats into a separate store. enquire-mcp starts from the knowledge you deliberately kept: Markdown, frontmatter, wikilinks, PDFs, Canvas, and Bases. Recall is grounded in source material rather than a hidden paraphrase.5960**Document intelligence without a data migration.** PDFs enter the same local search path as notes and return page citations. OCR can recover scanned pages. Canvas becomes a typed graph. Bases becomes an executable query surface instead of an opaque attachment.6162**Freshness, not timeless recall.** Every search hit can carry `age_days` and `stale`; optional recency weighting helps agents prefer newer knowledge and re-check old facts instead of confidently repeating them.6364> **What makes enquire-mcp different**:65> 1. **Vendor-neutral.** Your memory lives in `.md` files. Switch from Claude to Cursor — your memory comes with you.66> 2. **Full-stack local retrieval.** Hybrid BM25 + TF-IDF + multilingual embeddings fused via RRF, with an optional BGE cross-encoder reranker and per-signal scores; HNSW + int8 quantization scale the dense path.67> 3. **Zero cloud calls during serve.** The q8 embedding model runs **on your machine** and indexes the markdown **you** wrote — that's why it's a one-time local download (~118 MB), not a cloud API key. Grounded + private isn't free, and we don't pretend it is: your vault content never leaves your machine, air-gap-safe by default ([enforced](./SECURITY.md), not aspirational).68> 4. **Freshness-aware recall.** Every hit reports how old the note is; opt-in recency re-ranking lets an agent prefer fresh knowledge and flag stale facts for re-verification — the forgetting-aware frontier, built on the `mtime` your files already have.6970**46 tools · 19 MCP prompts · 1795 unit tests · 50+ languages · v3.11.x stable · semver-bound · MIT · npm build provenance (SLSA L2).**7172---7374<a id="why-number-one"></a>7576## 🏆 Why enquire-mcp is the complete Obsidian intelligence stack7778Most alternatives solve one layer: an in-app similarity panel, a capable search engine, or MCP file access. enquire-mcp combines the full local retrieval ladder, agent orchestration, rich-document coverage, freshness, safety, and release discipline in one package.7980| Complete leadership standard | **enquire-mcp** | Smart Connections | Obsidian Hybrid Search | Typical file-wrapper MCP |81|---|:---:|:---:|:---:|:---:|82| **MCP-native memory shared by every agent** | ✅ | ✕ | ✅ | ✅ |83| **BM25 + TF-IDF + ML + RRF + BGE + HNSW/int8** | ✅ | ✕ | ✕ | ✕ |84| **HyDE + bounded multi-query + context packs** | ✅ | ✕ | ✕ | ✕ |85| **Freshness metadata + optional recency ranking** | ✅ | ✕ | ✕ | ✕ |86| **Markdown + PDF/OCR + Canvas + executable Bases** | ✅ | ✕ | ✕ | ✕ |87| **PDF page citations inside unified retrieval** | ✅ | ✕ | ✕ | ✕ |88| **Per-signal scores + stage-by-stage explanations** | ✅ | ✕ | ✕ | ✕ |89| **One-generation live scan → FTS → ML → HNSW + quarantine** | ✅ | ✕ | ✕ | ✕ |90| **Read-only default + explicit write gate + privacy filters** | ✅ | ✕ | ✕ | ✕ |91| **46 tools + 19 workflows + semver-bound MCP contract** | ✅ | ✕ | ✕ | ✕ |92| **1795 tests + 9 release gates + signed npm provenance** | ✅ | ✕ | ✕ | ✕ |9394<sub>✅ = the complete row is built in. ✕ = the complete combination was not documented on the reviewed public product surface; a project may implement part of the row or add it later. Review date: 2026-07-25. Exact source snapshots and row-by-row boundaries: [competitive evidence](./docs/COMPARISON.md#dated-competitive-evidence).</sub>9596**That is the TOP-1 thesis:** one source of truth, one local intelligence layer, every agent — without reducing your knowledge to a cloud memory blob.9798> enquire-mcp is the open-source backend for [Karpathy-style LLM Wikis](https://gist.github.com/karpathy/442a6bf555914893e9891c11519de94f) on top of the Obsidian vault you already own: knowledge that compounds, with every answer traceable to source.99100---101102## ⚡ Quick start103104```bash105npm install -g @oomkapwn/enquire-mcp106enquire-mcp serve --vault ~/Documents/Obsidian\ Vault107```108109Drop into any MCP client:110111```json112{113 "mcpServers": {114 "obsidian": {115 "command": "npx",116 "args": ["-y", "@oomkapwn/enquire-mcp", "serve", "--vault", "/path/to/vault"]117 }118 }119}120```121122📂 Config templates and recipes in [`examples/`](./examples/) — **Claude Desktop**, **Cursor**, **ChatGPT custom GPT** (remote MCP over HTTP), plus a sample query set for the eval harness.123124**Don't want to hand-assemble config?** Let the CLI print the exact snippet for *your* vault + client (non-destructive — it writes nothing). *Since v3.11.6:*125126```bash127enquire-mcp configure --vault <path> # prints config for every client128enquire-mcp configure --vault <path> --client cursor # just one (claude-code|cursor|vscode|codex|windsurf|claude-desktop|http)129```130131The output is honest about each client's install boundary: **VS Code gets its official review-and-install URI**, Claude Code and Codex get copy-and-run commands, and clients whose one-click flow only accepts Marketplace/Registry entries are labeled **copy-only** with the exact fallback config. The generated vault path and physical package entrypoint remain visible for review before anything is saved.132133**Want full hybrid power?** Complete the hybrid preflight, then serve:134135```bash136npm install -g @oomkapwn/enquire-mcp@3.12.0-rc.27 # exact prerelease package137enquire-mcp --version138# recommended: preview first, then explicitly apply the same package-coherent plan139enquire-mcp first-run --tier hybrid --client claude-desktop --vault <path>140enquire-mcp first-run --tier hybrid --client claude-desktop --vault <path> --apply141# manual equivalent below: choose this instead of first-run --apply, not in addition142enquire-mcp setup --vault <path> # caches embedder; builds FTS5 + embed-db143enquire-mcp install-model rerank-bge # caches the offline reranker144enquire-mcp doctor --tier hybrid --vault <path> # structural/runtime readiness145enquire-mcp configure --tier hybrid --client claude-desktop --vault <path>146enquire-mcp serve --vault <path> --persistent-index --enable-reranker --use-hnsw147```148149---150151## 🤖 Set up in your AI agent — copy-paste prompts152153Every connection now receives configuration-aware `initialize.instructions`: the recommended recall workflow, citation and freshness semantics, active write posture, and the rule that retrieved vault content is data rather than instructions. Clients that surface MCP server instructions can use that contract automatically. The copy-paste prompts below remain useful as an explicit user preference or for hosts that do not expose server instructions.154155<details>156<summary><b>Claude Code (terminal)</b> — add MCP server + first prompt</summary>157158```bash159# Add the MCP server to your Claude Code config (one time)160claude mcp add obsidian -- npx -y @oomkapwn/enquire-mcp serve --vault ~/Documents/Obsidian\ Vault161```162163Then in any Claude Code session:164165> You now have `obsidian_*` tools that search and read my Obsidian vault — my long-term memory. Before answering questions about projects, decisions, people, or technical context, call `obsidian_search` with the relevant terms. Cite each fact with the source note (and `[page: N]` for PDFs). If you don't find a relevant note, say so — don't guess.166167</details>168169<details>170<summary><b>Claude Desktop</b> — config file + first prompt</summary>171172Prefer the ready-to-paste output of `enquire-mcp configure --tier hybrid --client claude-desktop --vault <path>`. [`examples/claude-desktop-hybrid.json`](./examples/claude-desktop-hybrid.json) is only a template; if used manually, replace both the executable and vault placeholders. Restart Claude Desktop, then:173174> You have my Obsidian vault wired up as searchable memory via `obsidian_*` tools. Always check `obsidian_search` first when I ask about anything in my notes — meeting context, research, decisions, journal entries. Quote the source note path on every fact.175176</details>177178<details>179<summary><b>Cursor</b> — MCP stdio config + agent rule</summary>180181Run `enquire-mcp configure --client cursor --vault <path>` for the exact copy-only block, or drop [`examples/cursor-mcp.json`](./examples/cursor-mcp.json) at `~/.cursor/mcp.json` and edit the vault path. Cursor's public one-click route is Marketplace-only, so enquire never prints an unverified vault-bearing `cursor://` link. In your `.cursorrules` file or chat:182183> Before suggesting code that touches a topic I might have notes on (architecture decisions, API contracts, vendor evaluations), call `obsidian_search` first. Treat my Obsidian vault as authoritative context.184185</details>186187<details>188<summary><b>VS Code</b> — generated review-and-install URI + JSON fallback</summary>189190```bash191enquire-mcp configure --client vscode --vault <path>192```193194Open the generated `vscode:mcp/install?...` URI. VS Code decodes the exact server name, command, arguments, and vault path into a native review prompt; approve only after checking them. The same output includes the `.vscode/mcp.json` block as a transparent copy-only fallback.195196</details>197198<details>199<summary><b>ChatGPT custom GPT</b> — remote MCP over HTTP</summary>200201Follow [`examples/chatgpt-actions.md`](./examples/chatgpt-actions.md) to expose `serve-http` via a tunnel with bearer auth. In your custom GPT's instructions:202203> You have read access to my Obsidian vault via the `obsidian_*` tool family. Search before answering anything that might be in my notes; cite the source filepath on every claim.204205</details>206207<details>208<summary><b>Codex</b> — generated CLI install + TOML fallback</summary>209210```bash211enquire-mcp configure --client codex --vault <path>212```213214Copy and run the generated `codex mcp add ... -- ...` command. The same output retains the equivalent `[mcp_servers."obsidian"]` TOML block so the installed command and durable config are both inspectable.215216</details>217218<details>219<summary><b>OpenClaw / any other MCP client</b></summary>220221Same `npx -y @oomkapwn/enquire-mcp serve --vault <path>` command works for any MCP-compatible client. See the client's own MCP-config docs for where to drop the server entry, then use any of the prompts above.222223</details>224225**Reusable agent rule** (drop into any `AGENTS.md` / `CLAUDE.md` / `.cursorrules` so the agent knows *when* to reach for the vault):226227> When my question touches my own notes, decisions, projects, people, or research, **search my Obsidian vault first** via the `obsidian_*` tools (start with `obsidian_search`) and cite the source note on every fact. Prefer enquire for *conceptual / cross-language / "what did I say about X"* recall; use plain `grep` / `ripgrep` for exact literal strings. If nothing relevant comes back, say so — don't guess.228229### Example queries that work well230231- *"Find every note where I discussed pricing strategy, summarize the evolution."* — RRF fusion + reranker handles "evolution" semantically232- *"What was my decision on PostgreSQL vs MongoDB? Cite the daily note."* — wikilink graph-boost surfaces the central decision doc233- *"Анализируй мои заметки о RAG за последние 3 месяца"* — multilingual embeddings + frontmatter date filter234- *"What pages of the LLaMA-3 paper PDF talk about scaling?"* — PDFs blended into search with `[page: N]` citations235- *"Show me topical communities in my research vault — what themes have I been exploring?"* — `obsidian_get_communities` (GraphRAG-light)236237---238239## 🧠 Use cases240241**1 — Long-term memory for AI agents.** Drop your Obsidian vault into any MCP-compatible agent (Claude Code, Claude Desktop, Cursor, ChatGPT, Codex, OpenClaw). The agent now has durable, semantic recall over every meeting note, journal entry, research log, and decision doc you've ever written — across sessions, models, and providers. Your knowledge isn't locked into one vendor's memory layer; it lives in plain markdown you own and can migrate freely.242243**2 — Personal knowledge base / second brain.** Hybrid retrieval surfaces the right note for *any* phrasing, in any of 50+ languages. Ask in English about a Russian-language journal entry from 2 years ago, get the right hit. Wikilink graph-boost reranks notes that sit at the centre of your knowledge graph. GraphRAG-light surfaces topical communities — discover connections you forgot you made. PDFs blend into search with `[page: N]` citations so research papers and meeting transcripts become first-class memory.244245**3 — Agentic RAG / context engineering.** `obsidian_search` exposes per-signal scores so the agent sees *why* each hit ranked. HyDE pre-rewrites vague queries into rich hypothetical answers before retrieval. Sub-question decomposition handles multi-hop questions ("how did our pricing strategy evolve and what was the customer reaction?") by breaking them into independent sub-queries, fusing results. The built-in eval harness (NDCG / Recall / MRR) lets you measure retrieval quality on your own queries instead of trusting vendor benchmarks.246247---248249## ✅ Built for serious local knowledge workflows250251Choose enquire-mcp when you want:252253- **Your Obsidian vault to remain the source of truth** instead of copying knowledge into another proprietary store.254- **One memory layer across many AI agents** so switching models never means starting over.255- **Conceptual and multilingual recall** that survives different wording, not only exact string matches.256- **Cited, inspectable answers** with note paths, PDF pages, signal scores, and freshness metadata.257- **Local-first privacy** with read-only defaults, explicit write gates, and zero cloud calls during serve.258- **A complete retrieval backend** spanning hybrid search, reranking, graph context, agentic expansion, rich Obsidian formats, and remote MCP.259260**Clear scope:** enquire-mcp is a headless MCP server / CLI for Markdown, Canvas, Bases, and PDF knowledge. Use exact-search tools alongside it for literal tokens; use the built-in HTTP transport when agents need remote access.261262---263264## 📖 Product site & API reference265266The **[product front door](https://oomkapwn.github.io/enquire-mcp/)** explains the cited-memory outcome, proof, client paths, and AI-readable resources. The complete auto-generated **[API reference](https://oomkapwn.github.io/enquire-mcp/api/)** documents every tool, prompt, and exported helper with full TSDoc (`@param` / `@returns` / `@example`). Both are rebuilt from source on every push to `main` via [`publish-docs.yml`](https://github.com/oomkapwn/enquire-mcp/blob/main/.github/workflows/publish-docs.yml); historical deep TypeDoc URLs remain valid.267268---269270## 🏗️ How retrieval works271272```mermaid273graph LR274 Q[Query] --> S[obsidian_search]275 S --> BM25[BM25 / FTS5]276 S --> TFIDF[TF-IDF cosine]277 S --> EMB[ML embeddings<br/>HNSW]278 BM25 --> RRF{RRF fusion<br/>k=60}279 TFIDF --> RRF280 EMB --> RRF281 RRF --> GB[Graph boost<br/>α × in-degree]282 GB --> RR[BGE cross-encoder<br/>reranker]283 RR --> R[Ranked hits<br/>per_signal observability]284```285286`obsidian_search` auto-detects available signals and gracefully degrades. Wikilink graph-boost reranks top-K via 1-step personalised PageRank. Optional cross-encoder reranking re-scores top-N for +15.5 NDCG@10 measured. Every hit returns `per_signal: { bm25, tfidf, embeddings }` so you see WHY it ranked.287288| Tier | Setup | What you get |289|---|---|---|290| **1** | `serve --vault <path>` | TF-IDF cosine (zero setup, instant) |291| **2** | + `--persistent-index` | + BM25 / FTS5 (indexed lexical retrieval) |292| **3** | + `setup` (downloads model + builds embed-db) | + multilingual ML embeddings |293| **4** | + `--enable-reranker` | + BGE cross-encoder (+15.5 NDCG@10 measured) |294| **5** | + `--use-hnsw` | + approximate nearest-neighbor retrieval with persisted HNSW |295| **6** | + `--include-pdfs` | + PDFs blended into all of the above |296| **7** | `serve-http --bearer-token …` | + remote MCP (Claude.ai web, ChatGPT, Cursor HTTP, mobile) |297298---299300## 🛠️ All 46 tools30130246 production tools total: 34 always-on read tools (incl. the umbrella `obsidian_search`) + 4 opt-in read + 7 gated writes + 1 closed-loop feedback. Full reference: **[docs/api.md](./docs/api.md)**.303304| Category | Tools |305|---|---|306| **Search & retrieval** | `obsidian_search` (umbrella, RRF-fused) · `obsidian_hyde_search` (HyDE-augmented, v3.1.0) · `obsidian_search_text` · `obsidian_full_text_search` · `obsidian_semantic_search` · `obsidian_embeddings_search` · `obsidian_find_similar` |307| **Wikilinks & graph** | `obsidian_resolve_wikilink` · `obsidian_get_backlinks` · `obsidian_get_outbound_links` · `obsidian_get_note_neighbors` · `obsidian_get_unresolved_wikilinks` · `obsidian_find_path` · `obsidian_get_communities` (v3.4.0, GraphRAG-light) |308| **Frontmatter & Dataview** | `obsidian_frontmatter_get` · `obsidian_frontmatter_search` · `obsidian_dataview_query` · `obsidian_list_tags` |309| **Read & navigate** | `obsidian_read_note` · `obsidian_list_notes` · `obsidian_get_recent_edits` · `obsidian_stale_notes` · `obsidian_open_questions` · `obsidian_context_pack` · `obsidian_chat_thread_read` · `obsidian_open_in_ui` · `obsidian_stats` |310| **PDFs, Canvas & Bases** | `obsidian_read_pdf` · `obsidian_list_pdfs` · `obsidian_ocr_pdf` · `obsidian_read_canvas` · `obsidian_list_canvases` · `obsidian_list_bases` (v3.2.0) · `obsidian_read_base` (v3.2.0) · `obsidian_query_base` (v3.2.0) |311| **Writes** (gated by `--enable-write`) | `obsidian_create_note` · `obsidian_append_to_note` · `obsidian_rename_note` · `obsidian_replace_in_notes` · `obsidian_archive_note` · `obsidian_frontmatter_set` · `obsidian_chat_thread_append` |312| **Diagnostic / lint** | `obsidian_lint_wiki` · `obsidian_paper_audit` · `obsidian_validate_note_proposal` |313| **Feedback** (opt-in via `--feedback-weight`) | `obsidian_mark_useful` (closed-loop: record which recalled notes helped; boosts them in future search) |314315Plus 3 MCP resources (`obsidian://vault/info`, `obsidian://note/{path}`, `obsidian://chunk/{n}/{path}`) and 19 **MCP prompts** (`summarize_recent_edits` · `review_tag` · `find_orphans` · `weekly_review` · `extract_todos` · `process_inbox` · `consolidate_tags` · `find_duplicates` · `lint_wiki` · `monthly_review` · `search_with_query_expansion` · `vault_synth` · `vault_wiki_compile` · `vault_lint_extended` · `vault_capture` · `vault_persona_search` · `vault_automation_setup` · `vault_research` · `vault_synthesis_page`) for common vault workflows.316317---318319## 🛡️ Trust320321| Surface | Posture |322|---|---|323| **Default** | Read-only — `--enable-write` required for the 7 write tools |324| **Least privilege** | `--disabled-tools` / `--enabled-tools` expose a minimal surface (e.g. a read-only research agent gets only `obsidian_search` + `obsidian_read_note`) |325| **Path safety** | Realpath check on every read+write; symlinks-out-of-vault rejected |326| **Privacy filter** | Verified at FTS5 + embed-db + chunk resource paths; fail-closed on empty allow-/deny-lists |327| **HTTP transport** | Bearer auth (constant-time SHA-256 + `timingSafeEqual`), per-token rate-limit, strict CORS |328| **Frontmatter** | `js-yaml@5` `load` (YAML 1.2 core schema, safe-by-default) — no code execution |329| **Cache + index files** | chmod 0600, parent dir 0700 |330| **Watcher consistency** | Final-state startup activation waits for late sinks; each ordinary live Markdown/PDF attempt stages FTS5 + embeddings from one captured/revalidated path generation, retries one drift once, commits without yielding, and quarantines an uncertain semantic route instead of serving mixed state. Within the configured inventory bound, the v3.12 RC also discovers and independently refreshes every admitted hardlink path without folding case or Unicode identities; above it, live events reconcile only the exact/previously-known group and say so explicitly |331| **1795 tests · 9 release-required CI checks · 7 branch-protected** | Current verified release posture; the operational breakdown is pinned below. |332| **CI** | `release.yml` directly enumerates **9 release gate contexts**, all run on every PR: `lint`, `test (22)`, `test (24)`, `smoke`, `audit`, `coverage`, `version-consistency`, `docs`, and `oia`. The pinned `test-windows` hostile-filesystem and startup-interlock job is an additional named check-run enforced transitively as a blocking prerequisite of `smoke`, rather than a tenth gate directly listed by the release workflow. Branch protection currently enforces **7** contexts; `docs` and `oia` are release-required but unprotected (live-verified 2026-07-23). `test-macos` is the only `continue-on-error` advisory job. `docker` can fail the CI workflow but is unprotected; CodeQL runs two separate unprotected analyses via [GitHub default setup](https://docs.github.com/code-security/code-scanning/automatically-scanning-your-code-for-vulnerabilities-and-errors/configuring-default-setup-for-code-scanning). Before npm publish, `release.yml` re-verifies all 9 directly listed gates on the tagged SHA. |333| **Coverage** | Lines ≥86% · statements ≥82% · functions ≥75% · branches ≥74% (gated) |334| **Releases** | npm + GitHub release per tag · semver · **signed build provenance** (npm + Sigstore, SLSA Build L2; L3 generator on the roadmap) |335| **Stability** | v3.0+ semver-bound — every CLI flag, tool name, MCP resource, prompt, exported symbol is contract |336337Full posture: **[SECURITY.md](./SECURITY.md)** · Stability surface: **[STABILITY.md](./STABILITY.md)** · Vulns: `oomkapwn@gmail.com`.338339---340341## ❓ FAQ342343**Need Obsidian installed?** No. Reads `.md` + `.canvas` + `.pdf` directly. Works against any Obsidian-format vault.344345**Will it write to my vault?** Not unless you pass `--enable-write`. All 7 write tools are gated; destructive ones support `dry_run`.346347**Data sent anywhere?** Outbound downloads occur only on explicit acquisition commands: `enquire-mcp setup`, `enquire-mcp build-embeddings`, and `enquire-mcp install-model` may fetch ONNX weights from HuggingFace; `enquire-mcp install-ocr-lang` fetches a Tesseract language pack. Serve mode never makes outbound HTTP ([enforced](./SECURITY.md), not aspirational). Embeddings + reranker run on CPU locally.348349**Performance?** It depends on vault size, hardware, model, and enabled retrieval layers. The public evidence includes a production report of **50–100ms BM25 top-10 at 1,771 chunks / 368 files** plus a reproducible synthetic benchmark showing **37–103×** FTS5 speedup over linear scan at 100–1,000 notes. Run the built-in eval and benchmark commands on your vault before setting a latency SLO; see [benchmarks](./docs/benchmarks.md) and the [FTS5 implementation note](./docs/api.md#obsidian_full_text_search).350351**Languages?** The default embedder is `paraphrase-multilingual-MiniLM-L12-v2` (50+ languages), validated end-to-end on Russian + English bilingual vaults. The default cross-encoder reranker is `rerank-bge` (English-only; the only catalog alias verified end-to-end); multilingual reranker aliases currently fail their transformers.js tokenizer compatibility check. CJK/Thai/Khmer tokenization uses `Intl.Segmenter`.352353**Run remotely?** Yes — `serve-http` exposes the same server over [Streamable HTTP](https://modelcontextprotocol.io/specification/2025-06-18/basic/transports#streamable-http). Front with Tailscale Funnel or Cloudflare Tunnel for HTTPS. Works with claude.ai web, ChatGPT custom GPT, Cursor HTTP mode, mobile MCP clients. See **[docs/http-transport.md](./docs/http-transport.md)**.354355---356357## 🚀 Releases358359**v3.0.0 — stable channel.** The v2.x retrieval roadmap is complete and the public surface is now [semver-bound](./STABILITY.md). Highlight reel:360361`v2.0` hybrid retrieval (BM25+TF-IDF+embeddings via RRF) · `v2.6` remote MCP · `v2.7-2.8` PDFs blended · `v2.9` BGE reranker · `v2.10` OCR · `v2.11` doctor + setup · `v2.12` eval harness · `v2.13` HNSW · `v2.14` stateful sessions · `v2.15` late-chunking · `v2.16` HNSW persistence · `v2.17` int8 quantization · `v3.8.0` stable · `v3.8.7` HTTP transport hardening · **`v3.9.0` stable**: OCR'd PDF watcher embed-sync, HNSW in-memory live update on file changes, R-10 adaptive HNSW refill (closes the >66% excluded under-return). · **`v3.10` stable**: forgetting-aware freshness — `age_days` + `stale` flag + opt-in `--recency-weight` re-ranking + frontmatter-aware `obsidian_search`.362363Channel: `npm install @oomkapwn/enquire-mcp` → latest stable (`@latest` = v3.11.x). Pre-release: `npm install @oomkapwn/enquire-mcp@rc` (the latest release candidate — see [CHANGELOG.md](./CHANGELOG.md)). Full changelog: **[CHANGELOG.md](./CHANGELOG.md)** · Forward plan: **[ROADMAP.md](https://github.com/oomkapwn/enquire-mcp/blob/main/ROADMAP.md)**.364365---366367## 🤝 Contributing368369```bash370git clone https://github.com/oomkapwn/enquire-mcp.git371cd enquire-mcp && npm install372npm test # full suite (1795 tests)373npm run lint # zero warnings374npm run build # tsc → dist/375```376377Issues, PRs, ideas welcome. For setup questions, bug reports, and private security routing, see [SUPPORT.md](./SUPPORT.md).378379---380381## 📜 License382383MIT. Built by [Alex (@OomkaBear)](https://github.com/oomkapwn). Named after [Tim Berners-Lee's 1980 prototype of the WWW](https://en.wikipedia.org/wiki/ENQUIRE) — the original hypertext system, before the web. The original spec was: you could ask the system anything. **enquire-mcp brings that to your vault.**384
Full transparency — inspect the skill content before installing.