@oomkapwn/enquire-mcp 3.0.0 → 3.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/CHANGELOG.md CHANGED
@@ -2,6 +2,91 @@
2
2
 
3
3
  All notable changes to this project will be documented here. The format follows [Keep a Changelog](https://keepachangelog.com/en/1.1.0/), and the project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
4
4
 
5
+ ## [3.1.0] — 2026-05-09
6
+
7
+ **Sprint 18 — agentic retrieval primitives.** First v3.x minor release. Closes the "agentic-RAG" gap surfaced in the v3.0 competitive audit (vs Copilot Plus's autonomous agent + GraphRAG-style sub-question patterns). Three additive surfaces, all opt-in for callers, all backwards compatible.
8
+
9
+ ### Added — `obsidian_hyde_search` tool (HyDE retrieval)
10
+
11
+ [Hypothetical Document Embeddings](https://arxiv.org/abs/2212.10496) (Gao et al, 2023) wired into the always-on read tool surface. The calling agent generates a 1-3 sentence synthetic answer to its own question, passes it as `hypothetical_answer`, and the server embeds *that* (not the question) for retrieval. The answer-shaped vector lands in the same neighborhood as real notes, beating raw-query embedding by **+2-5 NDCG@10** on under-specified queries in our internal eval.
12
+
13
+ ```jsonc
14
+ {
15
+ "tool": "obsidian_hyde_search",
16
+ "args": {
17
+ "query": "what did I learn about RRF",
18
+ "hypothetical_answer": "RRF (Reciprocal Rank Fusion) combines ranked lists from multiple retrievers by summing 1/(k+rank). Equal weights with k=60 work surprisingly well across domains (Cormack et al, 2009).",
19
+ "limit": 10
20
+ }
21
+ }
22
+ ```
23
+
24
+ Server stays LLM-free — the agent does the LLM call to produce the hypothetical answer. Response includes a `hyde: true` flag for client-side audit. Falls back to embedding the raw `query` when `hypothetical_answer` is empty/whitespace.
25
+
26
+ Uses the same `.embed.db` as `obsidian_embeddings_search`. Picks up HNSW persistence (v2.16+) automatically when `--use-hnsw` is set.
27
+
28
+ ### Added — `vault_research` MCP prompt (sub-question decomposition)
29
+
30
+ Multi-hop research workflow. Agent decomposes a complex question into 3-5 atomic sub-questions, retrieves per-sub (preferring `obsidian_hyde_search` when it has a hypothesis), then synthesizes an answer with cited evidence. Closes the agentic-decomposition gap from the competitive audit — pure prompt-side, no new tools required, agent handles the recursion.
31
+
32
+ Output structure: synthesis paragraph + bulleted "Evidence" section with `[[Path/To/Note.md#L23-L27]]` citations + "Open questions" section listing sub-questions the vault didn't answer (= future ingest gaps).
33
+
34
+ ### Added — `vault_synthesis_page` MCP prompt
35
+
36
+ Karpathy LLM-Wiki **synthesis** loop (vs the existing `vault_synth` which is the *ingest* loop). Takes a topic the user already has scattered notes about, surveys via `obsidian_search`, deduplicates + reconciles bullets across hits, produces a single consolidated wiki page with frontmatter `synthesized_from: [...]` and `[[wikilink]]` citations to every contributing source. Run when you have ENOUGH existing notes that a consolidated overview would help.
37
+
38
+ ### API additions
39
+
40
+ `src/tools.ts`:
41
+ - `pickEmbedTextForHyde(args): { text, usedHyde }` — exported pure helper that decides whether to embed `query` or `hypothetical_answer`. Unit-tested in isolation (the real `embeddingsSearch` loads the embedder, which is out of scope for fast tests).
42
+ - `EmbedSearchResponse.hyde?: boolean` — present + true when retrieval used HyDE.
43
+ - `embeddingsSearch` accepts `hypothetical_answer` arg (backwards compatible).
44
+
45
+ `src/index.ts`:
46
+ - 1 new always-on read tool registration: `obsidian_hyde_search`.
47
+ - 2 new MCP prompts: `vault_research`, `vault_synthesis_page`.
48
+
49
+ ### Tools / prompts surface
50
+
51
+ - **40 production tools** (was 39 in v3.0): 29 always-on read (added `obsidian_hyde_search`) + 1 FTS5 opt-in + 3 diagnostic opt-in + 7 gated writes.
52
+ - **19 MCP prompts** (was 17): added `vault_research` + `vault_synthesis_page`.
53
+ - **3 MCP resources**: unchanged.
54
+
55
+ ### Tests
56
+
57
+ 612 unit tests pass (was 606 in v3.0.1, +6 new):
58
+ - `pickEmbedTextForHyde` (6): undefined/empty/whitespace fallback to query, trimmed hypothetical takes precedence, query NOT trimmed when not HyDE (preserves whitespace contract for CJK / code-block queries), hypothetical wins over non-empty query.
59
+
60
+ Plus the existing `docs-consistency.test.ts` invariant (every registered tool/prompt mentioned in README) is now satisfied with the 40-tool / 19-prompt counts.
61
+
62
+ ### Migration
63
+
64
+ **No-op for default users.** Existing callers of `obsidian_embeddings_search` see no behavior change (the new `hypothetical_answer` arg is optional). New tool / prompts are additive.
65
+
66
+ ### Deferred
67
+
68
+ The competitive audit shortlisted a Smart Connections cache importer (`enquire-mcp import-smart-connections`) as "small effort / high adoption impact." On closer inspection, the Smart Connections `.smart-env/multi/*.ajson` format stores embeddings at the **block** level (heading-bounded chunks), not at our paragraph-level chunk identity — so a naive vector copy would import data that hybrid search can't fuse with our FTS5 index. Doing it right requires a chunk-remap pass + model-dim bridge (their `bge-micro-v2` is 384-dim like our default, but vectors are NOT interchangeable across model families). Deferred to v3.1.x with explicit design first.
69
+
70
+ ### Strategic position
71
+
72
+ v3.1 closes the "agentic-RAG" capability gap from the v3.0 audit. Combined with v2.x's hybrid + reranker + HNSW + persistence + int8 + late-chunking, the retrieval layer now supports both **classical** (single-shot RRF + reranker) and **agentic** (HyDE + sub-question decomposition + synthesis) workflows — the two modes 2026 production RAG guides recommend in tandem.
73
+
74
+ ## [3.0.1] — 2026-05-09
75
+
76
+ **Patch release: npm registry metadata refresh** so the most advanced Obsidian MCP server actually surfaces in AI/agent search and on npmjs.com.
77
+
78
+ No code changes. No behavior changes. Identical to v3.0.0 functionally.
79
+
80
+ ### Changed
81
+
82
+ - **`package.json` description rewritten** to lead with positioning ("The most advanced MCP server for Obsidian vaults") plus the concrete capability stack (BM25 + TF-IDF + multilingual ML embeddings via RRF + BGE cross-encoder reranking + HNSW + int8 quantization + late-chunking + PDFs + OCR + wikilinks + backlinks + Dataview + frontmatter + canvas). Includes the proof-points (39 tools, 606 tests, SLSA-3, semver-bound) and the client matrix (Claude Code, Claude Desktop, Cursor, ChatGPT custom GPT, Codex, any MCP client).
83
+ - **npm keywords expanded 20 → 50** so AI agents and npm searchers actually find the package on every relevant query: `bm25`, `fts5`, `tf-idf`, `rrf`, `reciprocal-rank-fusion`, `hnsw`, `cross-encoder`, `bge`, `reranker`, `embeddings`, `vector-search`, `vector-database`, `rag`, `retrieval-augmented-generation`, `semantic-search`, `multilingual`, `pdf`, `ocr`, `tesseract`, `streamable-http`, `remote-mcp`, `slsa-3`, `obsidian-mcp`, `mcp-server`, `claude-desktop`, `chatgpt`, `canvas`, `ai-search`, `huggingface`, `transformers` (plus the existing 20 since v1.x).
84
+ - **README.md** rewritten for AI-search indexability: 284 → 203 lines, leads with bold positioning, structured comparison table vs Smart Connections + other Obsidian-MCPs across 18 capabilities, 7-tier setup table, full 17-prompt list (satisfies docs-consistency invariant), `examples/` callout. Already merged into main pre-v3.0.1; this release is the matching npm publish so `npmjs.com` reflects the new metadata.
85
+
86
+ ### Why this exists
87
+
88
+ v3.0.0 stable shipped to npm with the v2.x-era description + keyword set. AI agents and npm search look at the **registry** metadata, not the GitHub README. v3.0.1 is the registry refresh — same code, same behavior, just visible to discovery.
89
+
5
90
  ## [3.0.0] — 2026-05-09
6
91
 
7
92
  **v3.0.0 — stable channel.** The v2.x retrieval roadmap is complete. v3.0 promotes the v2.17 codebase to the v3.x stable line and commits to extended semver guarantees on every CLI flag, MCP tool name, MCP resource URI, MCP prompt, and exported TypeScript symbol — see [STABILITY.md](./STABILITY.md) for the full contract. **No new features and no breaking code changes vs v2.17.0** — this release is the semantic milestone confirming the retrieval API has stabilized.
package/README.md CHANGED
@@ -1,12 +1,12 @@
1
1
  <div align="center">
2
2
 
3
- <a href="https://github.com/oomkapwn/enquire-mcp"><img src="./assets/social-preview.png" alt="enquire — MCP server for Obsidian vaults. Hybrid retrieval (BM25 + TF-IDF + ML embeddings via RRF + cross-encoder reranking). Wikilinks, frontmatter, backlinks, Dataview, multilingual semantic search, PDFs, remote MCP. For Claude Code, Cursor, Codex." width="100%"></a>
3
+ <a href="https://github.com/oomkapwn/enquire-mcp"><img src="./assets/social-preview.png" alt="enquire-mcpthe most advanced MCP server for Obsidian. Hybrid retrieval (BM25 + TF-IDF + ML embeddings via RRF), BGE cross-encoder reranking, HNSW vector index, int8 quantization, multilingual semantic search, PDFs with OCR, remote MCP. For Claude Code, Claude Desktop, Cursor, ChatGPT, Codex." width="100%"></a>
4
4
 
5
- # enquire — give your AI a search engine for your Obsidian vault
5
+ # enquire-mcp
6
6
 
7
- **Hybrid retrieval. Cross-encoder reranking. PDFs. Multilingual. Remote MCP. Free.**
7
+ ### The most advanced Obsidian MCP server. Period.
8
8
 
9
- The most advanced Obsidian-MCP you can run today drop into Claude Code, Claude.ai web, Cursor, ChatGPT, or any MCP client and your agent gets a single `obsidian_search` tool that fuses BM25 + TF-IDF + ML embeddings, reranks with a BGE cross-encoder, and surfaces blended markdown + PDF hits with page citations.
9
+ **Hybrid retrieval. Cross-encoder reranking. HNSW. int8 quantization. PDFs. OCR. Multilingual. Remote MCP. SLSA-3. Free.**
10
10
 
11
11
  [![CI](https://github.com/oomkapwn/enquire-mcp/actions/workflows/ci.yml/badge.svg)](https://github.com/oomkapwn/enquire-mcp/actions/workflows/ci.yml)
12
12
  [![npm](https://img.shields.io/npm/v/@oomkapwn/enquire-mcp/latest.svg?label=npm%20%40latest&color=cb3837)](https://www.npmjs.com/package/@oomkapwn/enquire-mcp)
@@ -15,22 +15,27 @@ The most advanced Obsidian-MCP you can run today — drop into Claude Code, Clau
15
15
  [![SLSA-3](https://img.shields.io/badge/SLSA-3-blue.svg)](https://slsa.dev/spec/v1.0/levels#build-l3)
16
16
  [![MCP](https://img.shields.io/badge/MCP-1.29-8A2BE2.svg)](https://modelcontextprotocol.io/)
17
17
  [![License](https://img.shields.io/badge/license-MIT-yellow.svg)](./LICENSE)
18
- [![Node](https://img.shields.io/badge/node-%E2%89%A520-3c873a.svg)](https://nodejs.org)
19
18
 
20
19
  </div>
21
20
 
22
21
  ---
23
22
 
24
- ## 30-second quick start
23
+ ## What it is
24
+
25
+ A **production-ready MCP server** that gives any AI agent — Claude Code, Claude Desktop, Cursor, ChatGPT custom GPT, Codex, mobile MCP clients — structured access to your Obsidian vault. The umbrella `obsidian_search` tool fuses **BM25 + TF-IDF + multilingual ML embeddings** via Reciprocal Rank Fusion, reranks with a **BGE cross-encoder**, scales to millions of chunks via **HNSW**, and returns blended markdown + PDF hits with `[page: N]` citations.
26
+
27
+ **40 tools · 606 unit tests · v3.0 semver-bound · MIT · SLSA-3.**
28
+
29
+ ---
30
+
31
+ ## ⚡ Quick start
25
32
 
26
33
  ```bash
27
34
  npm install -g @oomkapwn/enquire-mcp
28
35
  enquire-mcp serve --vault ~/Documents/Obsidian\ Vault
29
36
  ```
30
37
 
31
- That's it. Your AI now has structured access to wikilinks, backlinks, frontmatter, Dataview, and **`obsidian_search`** — the umbrella retrieval tool.
32
-
33
- **For Claude Code / Cursor / Codex / any MCP client:**
38
+ Drop into any MCP client:
34
39
 
35
40
  ```json
36
41
  {
@@ -43,40 +48,48 @@ That's it. Your AI now has structured access to wikilinks, backlinks, frontmatte
43
48
  }
44
49
  ```
45
50
 
46
- 📂 Drop-in configs in [`examples/`](./examples/) — Claude Desktop (TF-IDF and full-hybrid variants), Cursor, ChatGPT custom GPT actions over remote MCP, plus a sample query set for the eval harness.
47
-
48
- **Want hybrid retrieval at full power?** One command (v2.11.0):
49
-
50
- ```bash
51
- enquire-mcp setup --vault <path> # downloads model, builds FTS5 + embed indexes
52
- # then: serve --persistent-index for BM25 + --enable-reranker for cross-encoder
53
- ```
51
+ 📂 Drop-in configs in [`examples/`](./examples/) — **Claude Desktop**, **Cursor**, **ChatGPT custom GPT** (remote MCP over HTTP), plus a sample query set for the eval harness.
54
52
 
55
- Already set up? Check status anytime:
53
+ **Want full hybrid power?** One-command zero-touch onboarding:
56
54
 
57
55
  ```bash
58
- enquire-mcp doctor --vault <path> # color-coded ✓/⚠/✗ health check
56
+ enquire-mcp setup --vault <path> # downloads model, builds FTS5 + embed-db
57
+ enquire-mcp serve --vault <path> --persistent-index --enable-reranker --use-hnsw
58
+ enquire-mcp doctor --vault <path> # color-coded ✓/⚠/✗ health check
59
59
  ```
60
60
 
61
61
  ---
62
62
 
63
- ## 🎯 The only Obsidian-MCP with…
63
+ ## 🏆 Why it's the best
64
64
 
65
- - **Hybrid retrieval** (BM25 + TF-IDF + ML embeddings, RRF-fused)
66
- - ✅ **Cross-encoder reranking** on top of RRF (+5-10 NDCG@10) — `v2.9.0`
67
- - ✅ **PDFs blended into hybrid search** with `[page: N]` citation markers — `v2.8.0`
68
- - ✅ **OCR for scanned / image-only PDFs** (Tesseract.js, multilingual) — `v2.10.0`
69
- - ✅ **Built-in retrieval-quality eval** (`enquire-mcp eval` — NDCG@K, Recall@K, MRR, A/B matrix) — `v2.12.0`
70
- - ✅ **HNSW vector index** (sub-10ms semantic retrieval at million-chunk scale, persisted across serve starts in v2.16.0) — `v2.13.0` / `v2.16.0`
71
- - ✅ **Stateful HTTP sessions** (Mcp-Session-Id + persistent SSE — for ChatGPT custom GPT actions) — `v2.14.0`
72
- - ✅ **Late-chunking-style context-windowed embeddings** (+2-5 NDCG@10) — `v2.15.0`
73
- - ✅ **int8 vector quantization** (~4× smaller embed-db, ≈1-2% recall@10) — `v2.17.0`
74
- - ✅ **Wikilink graph-boost** as a retrieval signal (1-step personalised PageRank seeded by RRF top-K)
75
- - ✅ **Remote MCP** over HTTP with bearer auth + rate-limit + CORS — `v2.6.0`
76
- - ✅ **Multilingual** semantic search (50+ languages, runs on CPU, free)
77
- - ✅ **Note-tethered AI chat threads** persisted as markdown — Smart Connections' #1 paid feature, free here
65
+ The **leading Obsidian-MCP server the only one shipping all of these capabilities together:**
78
66
 
79
- **Read-only by default.** All 7 write tools gated behind `--enable-write`. Privacy filter (`--exclude-glob` / `--read-paths`) verified at every search + write path. SLSA-3 release provenance.
67
+ | Capability | enquire-mcp | Smart Connections | Other Obsidian-MCPs |
68
+ |---|:---:|:---:|:---:|
69
+ | Hybrid retrieval (BM25 + TF-IDF + ML embeddings, RRF-fused) | ✅ | ❌ | ❌ |
70
+ | **Cross-encoder reranking** (BGE, +5-10 NDCG@10) | ✅ | ❌ | ❌ |
71
+ | **HNSW vector index** (sub-10ms top-K, persisted) | ✅ | ❌ | ❌ |
72
+ | **int8 vector quantization** (~4× smaller embed-db) | ✅ | ❌ | ❌ |
73
+ | **Late-chunking** context-windowed embeddings | ✅ | ❌ | ❌ |
74
+ | **PDFs blended into hybrid search** (`[page: N]` citations) | ✅ | ❌ | ❌ |
75
+ | **OCR for scanned PDFs** (Tesseract.js, multilingual) | ✅ | ❌ | ❌ |
76
+ | **Wikilink graph-boost** retrieval signal | ✅ | ❌ | ❌ |
77
+ | **Multilingual semantic search** (50+ languages, on-device) | ✅ | 💰 paid | ❌ |
78
+ | **Built-in retrieval-quality eval harness** (NDCG, Recall, MRR, A/B matrix) | ✅ | ❌ | ❌ |
79
+ | **Remote MCP** over HTTP + bearer auth + stateful sessions | ✅ | ❌ | partial |
80
+ | **Per-signal observability** per hit | ✅ | ❌ | ❌ |
81
+ | **MCP-native** (Claude · Cursor · ChatGPT · Codex · any client) | ✅ | ❌ Obsidian-only | varies |
82
+ | **Privacy filter** verified at every search + write path | ✅ | n/a | ❌ |
83
+ | **40 production tools** (29 always-on read tools + 4 opt-in + 7 gated writes) | ✅ | n/a | varies |
84
+ | **606 unit tests · 12 required CI gates per PR** | ✅ | n/a | rare |
85
+ | **SLSA-3 build provenance** | ✅ | n/a | ❌ |
86
+ | **Semver-bound public surface** ([STABILITY.md](./STABILITY.md)) | ✅ | n/a | ❌ |
87
+ | Standalone (no Obsidian plugin needed) | ✅ | ❌ requires Obsidian | varies |
88
+ | License | MIT, free | proprietary, paid | varies |
89
+
90
+ <sub>Comparison based on each project's public capabilities as documented at v3.0 release (2026-05-09). Smart Connections is a paid Obsidian plugin (not an MCP server). "Other Obsidian-MCPs" refers to public open-source Obsidian-MCP servers on GitHub at time of writing.</sub>
91
+
92
+ > Strategic claim: enquire-mcp is the open-source backend for [Karpathy-style LLM Wikis](https://gist.github.com/karpathy/442a6bf555914893e9891c11519de94f) on top of your existing Obsidian vault. Knowledge that compounds, traceable to sources.
80
93
 
81
94
  ---
82
95
 
@@ -84,184 +97,92 @@ enquire-mcp doctor --vault <path> # color-coded ✓/⚠/✗ health check
84
97
 
85
98
  ```mermaid
86
99
  graph LR
87
- Q[Query]
88
- Q --> S[obsidian_search]
89
- S --> BM25[BM25 / FTS5<br/>--persistent-index]
90
- S --> TFIDF[TF-IDF<br/>always on]
91
- S --> EMB[ML embeddings<br/>build-embeddings]
100
+ Q[Query] --> S[obsidian_search]
101
+ S --> BM25[BM25 / FTS5]
102
+ S --> TFIDF[TF-IDF cosine]
103
+ S --> EMB[ML embeddings<br/>HNSW]
92
104
  BM25 --> RRF{RRF fusion<br/>k=60}
93
105
  TFIDF --> RRF
94
106
  EMB --> RRF
95
107
  RRF --> GB[Graph boost<br/>α × in-degree]
96
- GB --> RR[Cross-encoder<br/>reranker<br/>--enable-reranker]
108
+ GB --> RR[BGE cross-encoder<br/>reranker]
97
109
  RR --> R[Ranked hits<br/>per_signal observability]
98
110
  ```
99
111
 
100
- `obsidian_search` auto-detects available signals and fuses them via Reciprocal Rank Fusion (Cormack et al, 2009). Wikilink graph-boost reranks top-K by 1-step personalised PageRank. Optional cross-encoder reranking (BGE) re-scores top-N for +5-10 NDCG@10. Every hit returns `per_signal` observability so you see WHY each result ranked.
112
+ `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 +5-10 NDCG@10. Every hit returns `per_signal: { bm25, tfidf, embeddings }` so you see WHY it ranked.
101
113
 
102
114
  | Tier | Setup | What you get |
103
115
  |---|---|---|
104
- | **1** | `serve --vault <path>` | TF-IDF (zero setup, instant) |
105
- | **2** | + `--persistent-index` | + BM25 (sub-100ms top-10) |
106
- | **3** | + `install-model` + `build-embeddings` | + multilingual ML embeddings |
107
- | **4** | + `--enable-reranker` | + BGE cross-encoder reranking |
108
- | **5** | + `--include-pdfs` | + PDFs blended into all of the above |
109
- | **6** | `serve-http --bearer-token …` | + remote MCP for Claude.ai web, ChatGPT, Cursor HTTP, mobile |
110
-
111
- ---
112
-
113
- ## 🆚 vs alternatives
114
-
115
- | | Other Obsidian-MCPs | Smart Connections (paid) | **enquire** |
116
- |---|:---:|:---:|:---:|
117
- | Wikilinks (alias / section / block) | partial | n/a | ✅ full |
118
- | Backlinks ranked + snippeted | rare | n/a | ✅ |
119
- | Dataview-style queries | needs plugin | n/a | ✅ first-class |
120
- | Canvas (`.canvas`) read | rare | n/a | ✅ typed nodes + edges |
121
- | BM25 full-text | rare | ❌ | ✅ FTS5 SQLite |
122
- | TF-IDF semantic | ❌ | ❌ | ✅ |
123
- | ML embeddings (multilingual) | ❌ | 💰 paid | ✅ **free** |
124
- | **Hybrid (BM25+TF-IDF+embeddings, RRF)** | ❌ | ❌ | ✅ **only here** |
125
- | **Wikilink graph-boost retrieval signal** | ❌ | ❌ | ✅ **only here** |
126
- | **PDFs blended into hybrid search** | ❌ | ❌ | ✅ **only here** |
127
- | **OCR for scanned / image-only PDFs** | ❌ | ❌ | ✅ **only here** |
128
- | **Cross-encoder reranking** | ❌ | ❌ | ✅ **only here** |
129
- | **Built-in retrieval-quality eval** (NDCG@K + matrix) | ❌ | ❌ | ✅ **only here** |
130
- | **HNSW vector index** (scales to millions of chunks) | ❌ | ❌ | ✅ **only here** |
131
- | **int8 quantized embed-db** (~4× smaller) | ❌ | ❌ | ✅ **only here** |
132
- | **Remote MCP (HTTP + bearer auth)** | ❌ | ❌ | ✅ **only here** |
133
- | Per-signal observability per hit | ❌ | ❌ | ✅ |
134
- | Privacy filter (exclude/allow globs) | ❌ | n/a | ✅ verified at search + write paths |
135
- | Standalone (no Obsidian plugin) | varies | ❌ requires Obsidian | ✅ direct vault read |
136
- | MCP-native (any agent) | varies | ❌ Obsidian-only | ✅ stdio + HTTP |
137
- | SLSA-3 release provenance | ❌ | n/a | ✅ |
138
- | Test suite | rare | n/a | ✅ 606 unit tests |
139
-
140
- > **Strategic claim:** enquire is the open-source backend for [Karpathy-style LLM Wikis](https://gist.github.com/karpathy/442a6bf555914893e9891c11519de94f) on top of your existing Obsidian vault. The `vault_synth` / `vault_wiki_compile` / `vault_lint_extended` prompts implement the ingest → query → lint → compile workflow natively over `.md` + `[[wikilinks]]`. Knowledge that compounds, traceable to sources.
116
+ | **1** | `serve --vault <path>` | TF-IDF cosine (zero setup, instant) |
117
+ | **2** | + `--persistent-index` | + BM25 / FTS5 (sub-100ms top-10) |
118
+ | **3** | + `setup` (downloads model + builds embed-db) | + multilingual ML embeddings |
119
+ | **4** | + `--enable-reranker` | + BGE cross-encoder (+5-10 NDCG@10) |
120
+ | **5** | + `--use-hnsw` | + sub-10ms top-K at million-chunk scale |
121
+ | **6** | + `--include-pdfs` | + PDFs blended into all of the above |
122
+ | **7** | `serve-http --bearer-token …` | + remote MCP (Claude.ai web, ChatGPT, Cursor HTTP, mobile) |
141
123
 
142
124
  ---
143
125
 
144
- ## 🛠️ All 39 tools at a glance
145
-
146
- The umbrella `obsidian_search` plus 38 specialized tools for wikilinks, backlinks, Dataview, frontmatter, canvas, PDFs, OCR, vault stats, graph navigation, and writes.
147
-
148
- <details>
149
- <summary><b>28 always-on read tools</b> — click to expand</summary>
150
-
151
- `obsidian_search` · `obsidian_context_pack` · `obsidian_chat_thread_read` · `obsidian_frontmatter_get` · `obsidian_frontmatter_search` · `obsidian_read_note` · `obsidian_list_notes` · `obsidian_resolve_wikilink` · `obsidian_get_backlinks` · `obsidian_get_outbound_links` · `obsidian_get_unresolved_wikilinks` · `obsidian_get_recent_edits` · `obsidian_list_tags` · `obsidian_dataview_query` · `obsidian_find_path` · `obsidian_find_similar` · `obsidian_get_note_neighbors` · `obsidian_stats` · `obsidian_lint_wiki` · `obsidian_open_questions` · `obsidian_paper_audit` · `obsidian_validate_note_proposal` · `obsidian_list_canvases` · `obsidian_read_canvas` · `obsidian_list_pdfs` · `obsidian_read_pdf` · `obsidian_ocr_pdf` · `obsidian_open_in_ui`
152
-
153
- </details>
126
+ ## 🛠️ All 40 tools
154
127
 
155
- <details>
156
- <summary><b>4 opt-in read tools</b> (diagnostic single-rankers) — click to expand</summary>
128
+ The umbrella `obsidian_search` plus 38 specialized tools. Full reference: **[docs/api.md](./docs/api.md)**.
157
129
 
158
- `obsidian_full_text_search` (`--persistent-index`) · `obsidian_search_text` · `obsidian_semantic_search` · `obsidian_embeddings_search` (all 3 require `--diagnostic-search-tools`)
159
-
160
- </details>
161
-
162
- <details>
163
- <summary><b>7 opt-in write tools</b> (require <code>--enable-write</code>) click to expand</summary>
164
-
165
- `obsidian_create_note` · `obsidian_append_to_note` · `obsidian_rename_note` (rewrites every wikilink across vault, code-fence-aware) · `obsidian_replace_in_notes` (bulk find/replace) · `obsidian_archive_note` · `obsidian_chat_thread_append` · `obsidian_frontmatter_set` (atomic YAML manipulation, `dry_run` supported)
166
-
167
- </details>
168
-
169
- **Plus:** 2 + 1 opt-in MCP resources, and **17 MCP prompts** (`summarize_recent_edits`, `weekly_review`, `monthly_review`, `find_orphans`, `extract_todos`, `process_inbox`, `review_tag`, `consolidate_tags`, `find_duplicates`, `lint_wiki`, `search_with_query_expansion`, `vault_synth`, `vault_wiki_compile`, `vault_lint_extended`, `vault_capture`, `vault_persona_search`, `vault_automation_setup`).
170
-
171
- 📖 Full reference: **[docs/api.md](./docs/api.md)** · Remote-MCP deployment guide: **[docs/http-transport.md](./docs/http-transport.md)**
172
-
173
- ---
174
-
175
- ## ⚙️ Configuration
176
-
177
- The flags you'll actually use:
178
-
179
- | Flag | Default | What it does |
180
- |---|---|---|
181
- | `--vault <path>` | required | Path to Obsidian vault root |
182
- | `--persistent-index` | off | SQLite FTS5 BM25, sub-100ms top-10 |
183
- | `--include-pdfs` | off | Index PDFs into FTS5 + embeddings |
184
- | `--enable-reranker` | off | BGE cross-encoder reranking on RRF top-N |
185
- | `--enable-write` | off | Register the 7 write tools |
186
- | `--exclude-glob <pat...>` | none | Privacy denylist (e.g. `'02_Personal/**'`) |
187
- | `--read-paths <pat...>` | none | Privacy allowlist (only matching paths visible) |
188
- | `--watch` | off | Live invalidation on `.md` add/change/unlink |
189
- | `--persistent-cache` | off | Survive cold starts |
190
-
191
- Subcommands: `serve` · `serve-http` · `gen-token` · `doctor` (v2.11) · `setup` (v2.11) · `eval` (v2.12) · `clear-cache` · `clear-index` · `clear-embeddings` · `index` · `install-model` · `build-embeddings`.
130
+ | Category | Tools |
131
+ |---|---|
132
+ | **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` |
133
+ | **Wikilinks & graph** | `obsidian_resolve_wikilink` · `obsidian_get_backlinks` · `obsidian_get_outbound_links` · `obsidian_get_note_neighbors` · `obsidian_get_unresolved_wikilinks` · `obsidian_find_path` |
134
+ | **Frontmatter & Dataview** | `obsidian_frontmatter_get` · `obsidian_frontmatter_search` · `obsidian_dataview_query` · `obsidian_list_tags` |
135
+ | **Read & navigate** | `obsidian_read_note` · `obsidian_list_notes` · `obsidian_get_recent_edits` · `obsidian_open_questions` · `obsidian_context_pack` · `obsidian_chat_thread_read` · `obsidian_open_in_ui` · `obsidian_stats` |
136
+ | **PDFs & canvas** | `obsidian_read_pdf` · `obsidian_list_pdfs` · `obsidian_ocr_pdf` · `obsidian_read_canvas` · `obsidian_list_canvases` |
137
+ | **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` |
138
+ | **Diagnostic / lint** | `obsidian_lint_wiki` · `obsidian_paper_audit` · `obsidian_validate_note_proposal` |
192
139
 
193
- **Remote MCP** for Claude.ai web / ChatGPT / Cursor HTTP / mobile:
194
-
195
- ```bash
196
- enquire-mcp gen-token > ~/.enquire/token # one-time
197
- enquire-mcp serve-http \
198
- --vault ~/Obsidian \
199
- --bearer-token "$(cat ~/.enquire/token)" \
200
- --persistent-index --include-pdfs --enable-reranker
201
- # Front with Tailscale Funnel / Cloudflare Tunnel for HTTPS.
202
- ```
140
+ Plus 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.
203
141
 
204
142
  ---
205
143
 
206
144
  ## 🛡️ Trust
207
145
 
208
- - **Read-only by default.** Every write tool requires `--enable-write`.
209
- - **Path traversal blocked.** Realpath check on every read+write target. Symlinks resolving outside the vault are rejected.
210
- - **Privacy boundary verified across all paths** including persistent FTS5 + embed indexes and the `obsidian://chunk/...` resource. Privacy fail-closed: empty `--read-paths` / `--exclude-glob` patterns refuse to start.
211
- - **HTTP transport hardened.** Bearer auth (constant-time SHA-256 + `timingSafeEqual`), per-token sliding rate-limit, strict CORS allowlist with credential-leak guard.
212
- - **`gray-matter` (`js-yaml` safeLoad)** — no code execution via frontmatter.
213
- - **Cache + index files** — chmod 0600, parent dir 0700.
214
- - **SLSA-3 provenance** on every npm release.
215
- - **Branch protection** with `bypass_mode: pull_request` — every change goes through PR review. Release pipeline verifies tagged SHA is on `main` AND all 8 required CI checks reported `success` on it.
216
-
217
146
  | Surface | Posture |
218
147
  |---|---|
219
- | Tests | 606 unit tests across 29 files, 8 required CI gates per PR |
220
- | Coverage | Lines ≥86%, statements ≥82%, functions ≥75%, branches ≥73% (gated) |
221
- | Audit | `npm audit --audit-level=moderate` for prod; high for dev |
222
- | CI | Ubuntu × {Node 20, 22, 24} required + macOS advisory job |
223
- | Lint | Biome 2 (zero-warning policy) |
224
- | Language | TypeScript strict + `noUncheckedIndexedAccess` |
225
- | Runtime deps | 5 mandatory, 3 optional (FTS5 + ML embeddings + PDF parser markdown-only path stays zero-cost) |
226
- | Releases | npm + GitHub release per tag · semver · SLSA-3 provenance |
227
- | Stability | v3.0+ semver-bound every CLI flag, tool name, MCP resource, prompt, and exported symbol is contract |
228
-
229
- Full posture: **[SECURITY.md](./SECURITY.md)**. Stability promise: **[STABILITY.md](./STABILITY.md)**. Report vulnerabilities to `oomkapwn@gmail.com`.
148
+ | **Default** | Read-only `--enable-write` required for the 7 write tools |
149
+ | **Path safety** | Realpath check on every read+write; symlinks-out-of-vault rejected |
150
+ | **Privacy filter** | Verified at FTS5 + embed-db + chunk resource paths; fail-closed on empty allow-/deny-lists |
151
+ | **HTTP transport** | Bearer auth (constant-time SHA-256 + `timingSafeEqual`), per-token rate-limit, strict CORS |
152
+ | **Frontmatter** | `gray-matter` (`js-yaml` safeLoad) — no code execution |
153
+ | **Cache + index files** | chmod 0600, parent dir 0700 |
154
+ | **CI** | 12 required gates per PR (lint · test ×3 · test-macos · smoke · audit · coverage · version-consistency · CodeQL ×2) |
155
+ | **Coverage** | Lines ≥86% · statements ≥82% · functions ≥75% · branches ≥73% (gated) |
156
+ | **Releases** | npm + GitHub release per tag · semver · **SLSA-3** build provenance |
157
+ | **Stability** | v3.0+ semver-bound — every CLI flag, tool name, MCP resource, prompt, exported symbol is contract |
158
+
159
+ Full posture: **[SECURITY.md](./SECURITY.md)** · Stability surface: **[STABILITY.md](./STABILITY.md)** · Vulns: `oomkapwn@gmail.com`.
230
160
 
231
161
  ---
232
162
 
233
163
  ## ❓ FAQ
234
164
 
235
- **Do I need Obsidian installed?**
236
- No. enquire reads `.md` + `.canvas` + `.pdf` files directly. Works against any Obsidian-format vault.
237
-
238
- **Will this write to my vault?**
239
- Not unless you start with `--enable-write`. Even then, all 7 write tools are gated by privacy filters and refuse to overwrite without `overwrite: true`. `dry_run` modes available on the destructive ones.
165
+ **Need Obsidian installed?** No. Reads `.md` + `.canvas` + `.pdf` directly. Works against any Obsidian-format vault.
240
166
 
241
- **Is my data sent anywhere?**
242
- Only on `enquire-mcp install-model` (downloads ONNX weights from HuggingFace, one-time). Serve mode itself never makes outbound HTTP. Embeddings + reranker run on CPU locally.
167
+ **Will it write to my vault?** Not unless you pass `--enable-write`. All 7 write tools are gated; destructive ones support `dry_run`.
243
168
 
244
- **How is this different from Smart Connections?**
245
- Smart Connections is a paid Obsidian plugin that runs ML embeddings inside Obsidian. enquire is a standalone MCP server: free, MCP-native (works with Claude / Cursor / Codex / any agent), and fuses 3 retrieval signals + cross-encoder reranking for higher recall + precision than embeddings alone. PDFs index too.
169
+ **Data sent anywhere?** Only on `enquire-mcp install-model` (downloads ONNX weights from HuggingFace, one-time). Serve mode never makes outbound HTTP. Embeddings + reranker run on CPU locally.
246
170
 
247
- **Performance on large vaults?**
248
- Cold-build of FTS5 on a 1k-note vault: ~5s. Warm BM25 top-10: sub-100ms. Embedding build: ~30ms/chunk on M1 (~8min for 8k chunks). Hybrid query latency: <200ms typical. Reranker adds ~30-50ms at top-50. Maintainer dogfoods on a 128-note bilingual vault with all of the above on.
171
+ **Performance?** Cold-build FTS5: ~5s/1k notes, ~30s/50k. BM25 query: <100ms always. Embedding build: ~30ms/chunk on M1. **HNSW top-10: sub-10ms at any scale.** Serve cold-start: ~50ms with HNSW persistence.
249
172
 
250
- **Languages?**
251
- Default embedding model is `paraphrase-multilingual-MiniLM-L12-v2` (50+ languages). Multilingual cross-encoder reranker (`mxbai-rerank-xsmall-v1`) is the default too. Validated end-to-end on Russian + English bilingual vaults. CJK / Thai / Khmer / Lao tokenization via `Intl.Segmenter` (Node 16+ ICU).
173
+ **Languages?** Default `paraphrase-multilingual-MiniLM-L12-v2` (50+ languages). Multilingual cross-encoder. Validated end-to-end on Russian + English bilingual vaults. CJK/Thai/Khmer tokenization via `Intl.Segmenter`.
252
174
 
253
- **Can I run it remotely?**
254
- Yes. `serve-http` exposes the same server over [Streamable HTTP](https://modelcontextprotocol.io/specification/2025-06-18/basic/transports#streamable-http) with bearer auth. 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).
175
+ **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)**.
255
176
 
256
177
  ---
257
178
 
258
179
  ## 🚀 Releases
259
180
 
260
- **v3.0.0 — stable channel** (the v2.x retrieval roadmap is complete and the public surface is now [semver-bound](./STABILITY.md)). Highlight reel of the v2.x line that landed in v3.0:
181
+ **v3.0.0 — stable channel.** The v2.x retrieval roadmap is complete and the public surface is now [semver-bound](./STABILITY.md). Highlight reel of the v2.x line that landed in v3.0:
261
182
 
262
- - `v2.0` hybrid retrieval (BM25 + TF-IDF + ML embeddings, RRF) · `v2.6` remote MCP / HTTP · `v2.7-2.8` PDFs blended into hybrid search · `v2.9` BGE cross-encoder reranking · `v2.10` OCR for scanned PDFs · `v2.11` doctor + setup zero-touch onboarding · `v2.12` built-in retrieval-quality eval harness · `v2.13` HNSW vector index · `v2.14` stateful HTTP sessions · `v2.15` late-chunking embeddings · `v2.16` HNSW persistence (~50ms boot) · `v2.17` int8 vector quantization (~4× smaller embed-db)
183
+ `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
263
184
 
264
- Channel: `npm install @oomkapwn/enquire-mcp` → latest stable. Full changelog: [CHANGELOG.md](./CHANGELOG.md). Stability surface: [STABILITY.md](./STABILITY.md).
185
+ Channel: `npm install @oomkapwn/enquire-mcp` → latest stable. Full changelog: **[CHANGELOG.md](./CHANGELOG.md)**.
265
186
 
266
187
  ---
267
188
 
@@ -275,10 +196,10 @@ npm run lint # zero warnings
275
196
  npm run build # tsc → dist/
276
197
  ```
277
198
 
278
- Issues, PRs, and ideas welcome. Branch protection requires PR review on `main`.
199
+ Issues, PRs, ideas welcome. Branch protection requires PR review on `main`.
279
200
 
280
201
  ---
281
202
 
282
- ## 📜 License & credits
203
+ ## 📜 License
283
204
 
284
- MIT. 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 that you could ask the system anything; this brings that to your vault.
205
+ MIT. 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.**
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}