@oomkapwn/enquire-mcp 3.6.1 → 3.6.2
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 +87 -0
- package/README.md +6 -6
- package/assets/social-preview.png +0 -0
- package/dist/bases.d.ts +13 -3
- package/dist/bases.d.ts.map +1 -1
- package/dist/bases.js +64 -9
- package/dist/bases.js.map +1 -1
- package/dist/cli.d.ts.map +1 -1
- package/dist/cli.js +6 -2
- package/dist/cli.js.map +1 -1
- package/dist/doctor.d.ts.map +1 -1
- package/dist/doctor.js +10 -2
- package/dist/doctor.js.map +1 -1
- package/dist/dql.d.ts +67 -0
- package/dist/dql.d.ts.map +1 -1
- package/dist/dql.js +45 -0
- package/dist/dql.js.map +1 -1
- package/dist/embed-db.d.ts +45 -0
- package/dist/embed-db.d.ts.map +1 -1
- package/dist/embed-db.js +31 -0
- package/dist/embed-db.js.map +1 -1
- package/dist/embeddings.d.ts +33 -0
- package/dist/embeddings.d.ts.map +1 -1
- package/dist/embeddings.js +29 -0
- package/dist/embeddings.js.map +1 -1
- package/dist/fts5.d.ts +123 -0
- package/dist/fts5.d.ts.map +1 -1
- package/dist/fts5.js +130 -4
- package/dist/fts5.js.map +1 -1
- package/dist/hnsw.d.ts.map +1 -1
- package/dist/hnsw.js +11 -0
- package/dist/hnsw.js.map +1 -1
- package/dist/index.d.ts +1 -1
- package/dist/index.js +1 -1
- package/dist/parser.d.ts +80 -0
- package/dist/parser.d.ts.map +1 -1
- package/dist/parser.js +48 -0
- package/dist/parser.js.map +1 -1
- package/dist/server.d.ts +34 -0
- package/dist/server.d.ts.map +1 -1
- package/dist/server.js +23 -3
- package/dist/server.js.map +1 -1
- package/dist/tool-registry.js +1 -1
- package/dist/tool-registry.js.map +1 -1
- package/dist/tools/media.d.ts +1 -1
- package/dist/tools/media.js +1 -1
- package/dist/tools/meta.d.ts +2 -2
- package/dist/tools/meta.js +2 -2
- package/dist/tools/search.d.ts +32 -1
- package/dist/tools/search.d.ts.map +1 -1
- package/dist/tools/search.js +51 -4
- package/dist/tools/search.js.map +1 -1
- package/dist/tools/write.d.ts +2 -2
- package/dist/tools/write.js +2 -2
- package/dist/vault.d.ts +179 -0
- package/dist/vault.d.ts.map +1 -1
- package/dist/vault.js +157 -0
- package/dist/vault.js.map +1 -1
- package/docs/COMPARISON.md +5 -5
- package/docs/QUICKSTART.md +2 -2
- package/docs/api.md +11 -11
- package/package.json +2 -2
package/docs/COMPARISON.md
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
# enquire-mcp vs. other Obsidian MCP servers
|
|
2
2
|
|
|
3
|
-
There are several MCP servers for Obsidian vaults, and they make very different trade-offs. This document is a side-by-side feature matrix plus an honest "when to pick which" guide, written by the enquire-mcp maintainer. It is intentionally fair-not-sales: each alternative has scenarios where it is the better pick, and those scenarios are called out below. Numbers and feature claims for enquire-mcp are accurate as of v3.
|
|
3
|
+
There are several MCP servers for Obsidian vaults, and they make very different trade-offs. This document is a side-by-side feature matrix plus an honest "when to pick which" guide, written by the enquire-mcp maintainer. It is intentionally fair-not-sales: each alternative has scenarios where it is the better pick, and those scenarios are called out below. Numbers and feature claims for enquire-mcp are accurate as of v3.6.1 (2026-05-15); claims about the four alternatives are based on their public READMEs as of the same date — please verify against their current state before deciding.
|
|
4
4
|
|
|
5
5
|
## Servers compared
|
|
6
6
|
|
|
@@ -56,7 +56,7 @@ Notes on the matrix:
|
|
|
56
56
|
|
|
57
57
|
- **"Limited" for markus on Obsidian-side operations:** it covers a smaller subset of REST endpoints than cyanheads.
|
|
58
58
|
|
|
59
|
-
- **Tool counts for alternatives** are approximate from public READMEs and may have shifted. enquire-mcp's 44-tool count is exact for v3.
|
|
59
|
+
- **Tool counts for alternatives** are approximate from public READMEs and may have shifted. enquire-mcp's 44-tool count is exact for v3.6.1 and is verified by `tests/docs-consistency.test.ts` against `src/tool-manifest.ts` (machine-readable single source of truth, introduced v3.6.0-rc.2).
|
|
60
60
|
|
|
61
61
|
- **License row** is informational, not a recommendation. MIT and Apache-2.0 are both permissive; pick what your org's policy requires.
|
|
62
62
|
|
|
@@ -233,13 +233,13 @@ This is a rough heuristic, not a verdict. The "when to pick X" sections above ar
|
|
|
233
233
|
|
|
234
234
|
## A note on benchmarks
|
|
235
235
|
|
|
236
|
-
|
|
236
|
+
As of v3.6.0-rc.4, **enquire-mcp ships public, reproducible end-to-end retrieval benchmarks** at [`docs/benchmarks.md`](./benchmarks.md): a 60-query ablation across 7 stack configurations on a deterministic synthetic Obsidian vault. Reproducible with `npm run bench:retrieval` (4-decimal precision across runs). Headline: `rerank-bge` adds **+24.7 MRR / +15.5 NDCG@10** over plain hybrid. The other alternatives in this matrix do not (as of 2026-05-15) ship comparable public benchmarks. If retrieval quality is decisive, **run our `bench:retrieval` against your own vault**, then run any equivalent eval (or hand-eval) the alternatives provide.
|
|
237
237
|
|
|
238
238
|
---
|
|
239
239
|
|
|
240
240
|
## Disclaimer
|
|
241
241
|
|
|
242
|
-
This is a snapshot as of **2026-05-
|
|
242
|
+
This is a snapshot as of **2026-05-15** (v3.6.1). All five servers are actively developed (or in some cases archived) and the feature matrix will drift. Before making a decision:
|
|
243
243
|
|
|
244
244
|
1. Re-read each alternative's current `README.md` — features land between matrix updates.
|
|
245
245
|
2. Run each candidate against a sample of your own vault for an hour. Retrieval quality, in particular, is vault-specific and unreliable to compare from feature lists alone.
|
|
@@ -247,4 +247,4 @@ This is a snapshot as of **2026-05-13**. All five servers are actively developed
|
|
|
247
247
|
|
|
248
248
|
Corrections to this document are welcome — open an issue or PR on [`oomkapwn/enquire-mcp`](https://github.com/oomkapwn/enquire-mcp). Specifically: if a row above understates an alternative's capabilities, that's a bug in this doc and we'd like to fix it.
|
|
249
249
|
|
|
250
|
-
— enquire-mcp maintainer, v3.
|
|
250
|
+
— enquire-mcp maintainer, v3.6.1
|
package/docs/QUICKSTART.md
CHANGED
|
@@ -27,7 +27,7 @@ Verify the install:
|
|
|
27
27
|
enquire-mcp --version
|
|
28
28
|
```
|
|
29
29
|
|
|
30
|
-
Expected output: the current version string (e.g. `3.
|
|
30
|
+
Expected output: the current version string (e.g. `3.6.1`).
|
|
31
31
|
|
|
32
32
|
## Step 2 — Smoke test (30 seconds)
|
|
33
33
|
|
|
@@ -139,7 +139,7 @@ The drop-in hybrid config is in [`examples/claude-desktop-hybrid.json`](../examp
|
|
|
139
139
|
|
|
140
140
|
**`enquire-mcp: command not found`.** The npm global bin directory isn't on your `PATH`. Run `npm config get prefix` to find it, then add `<prefix>/bin` to your `PATH` — or switch to the `npx` form of the Claude Desktop config (see Step 3): `"command": "npx"`, `"args": ["-y", "@oomkapwn/enquire-mcp@latest", "serve", "--vault", "/abs/path"]`.
|
|
141
141
|
|
|
142
|
-
**`ENOENT` or `unsupported engine` on install.** You're on Node <
|
|
142
|
+
**`ENOENT` or `unsupported engine` on install.** You're on Node < 22. Run `node --version` to confirm, then upgrade (e.g. via `nvm install 22 && nvm use 22`). enquire-mcp's CI matrix tests Node 22 + 24 (Node 20 dropped in v3.5.11 — `pdfjs-dist@5.7+` requires `>=22.13`; the package's `engines: >=20` is still honored for non-PDF users on the prebuilt `dist/`).
|
|
143
143
|
|
|
144
144
|
**`Error: vault path does not exist`.** Either the path is wrong, or you used `~` instead of the absolute form. MCP clients don't expand `~` — use `/Users/you/MyVault` on macOS/Linux or `C:\Users\you\MyVault` on Windows. Paths containing spaces are fine as long as the JSON string itself is well-formed; no shell escaping needed inside `claude_desktop_config.json`.
|
|
145
145
|
|
package/docs/api.md
CHANGED
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
# enquire — API
|
|
2
2
|
|
|
3
|
-
**enquire is an MCP server for Obsidian vaults.** 44 MCP tools (33 always-on read + 4 opt-in read + 7 opt-in write); the 4 opt-ins are: 1 via `--persistent-index` (`obsidian_full_text_search`) + 3 via `--diagnostic-search-tools` (the single-ranker `obsidian_search_text` / `obsidian_semantic_search` / `obsidian_embeddings_search` — gated by default in v2.0+ since `obsidian_search` auto-detects + fuses signals). 2 + 1 opt-in MCP resources, 19 MCP prompts. **v3.1.0+ adds `obsidian_hyde_search`** (HyDE-augmented retrieval, Gao et al 2023; agent supplies a synthetic answer, server embeds it for retrieval) plus the `vault_research` (sub-question decomposition) and `vault_synthesis_page` (Karpathy LLM-Wiki synthesis loop) prompts. v2.6.0+ also speaks Streamable HTTP via `serve-http` (bearer auth + rate-limit + CORS). v2.7.0+ indexes PDFs as a separate read tool surface; **v2.8.0+ blends PDF chunks into `obsidian_search` hybrid retrieval** with `--include-pdfs` — every hit carries a `kind: "md" | "pdf"` flag and PDF snippets include `[page: N]` markers for citation. **v2.9.0+ adds BGE cross-encoder reranking** on top of RRF with `--enable-reranker` — typical +5-10 NDCG@10 retrieval-quality boost. **v2.10.0+ adds Tesseract OCR for image-only / scanned PDFs** via `obsidian_ocr_pdf` — completes the PDF retrieval story.
|
|
3
|
+
**enquire is an MCP server for Obsidian vaults.** 44 MCP tools (33 always-on read + 4 opt-in read + 7 opt-in write); the 4 opt-ins are: 1 via `--persistent-index` + `--diagnostic-search-tools` (`obsidian_full_text_search` — needs BOTH flags: persistent-index for the FTS5 index, diagnostic-search-tools to surface it as a single-ranker tool alongside the hybrid default `obsidian_search`) + 3 via `--diagnostic-search-tools` (the single-ranker `obsidian_search_text` / `obsidian_semantic_search` / `obsidian_embeddings_search` — gated by default in v2.0+ since `obsidian_search` auto-detects + fuses signals). 2 + 1 opt-in MCP resources, 19 MCP prompts. **v3.1.0+ adds `obsidian_hyde_search`** (HyDE-augmented retrieval, Gao et al 2023; agent supplies a synthetic answer, server embeds it for retrieval) plus the `vault_research` (sub-question decomposition) and `vault_synthesis_page` (Karpathy LLM-Wiki synthesis loop) prompts. v2.6.0+ also speaks Streamable HTTP via `serve-http` (bearer auth + rate-limit + CORS). v2.7.0+ indexes PDFs as a separate read tool surface; **v2.8.0+ blends PDF chunks into `obsidian_search` hybrid retrieval** with `--include-pdfs` — every hit carries a `kind: "md" | "pdf"` flag and PDF snippets include `[page: N]` markers for citation. **v2.9.0+ adds BGE cross-encoder reranking** on top of RRF with `--enable-reranker` — typical +5-10 NDCG@10 retrieval-quality boost. **v2.10.0+ adds Tesseract OCR for image-only / scanned PDFs** via `obsidian_ocr_pdf` — completes the PDF retrieval story.
|
|
4
4
|
|
|
5
|
-
> **Channels:** stable
|
|
5
|
+
> **Channels:** stable v3.6.x (`@latest` on npm) ships 44 tools including `obsidian_search` (hybrid BM25 + TF-IDF + ML embeddings, RRF-fused) with optional BGE cross-encoder reranking, `obsidian_embeddings_search`, `obsidian_hyde_search`, plus the `install-model` / `build-embeddings` / `clear-embeddings` / `setup` / `doctor` / `eval` / `bench` subcommands. The `@rc` dist-tag carries the most recent release candidate. This document covers the **v3.6.x stable** surface.
|
|
6
6
|
|
|
7
7
|
> Versioned dynamically — see [`CHANGELOG.md`](../CHANGELOG.md) for the current release.
|
|
8
8
|
|
|
@@ -79,7 +79,7 @@ Canonical list of every registered MCP tool. The `Kind` column splits read/write
|
|
|
79
79
|
| `--cache-size <n>` | 1024 | LRU cap for parsed-note cache. |
|
|
80
80
|
| `--persistent-cache` | off | Persist parsed-note cache to disk so cold starts skip re-parsing. **Stores full note bodies — see [Cache & privacy](../README.md#cache--privacy).** |
|
|
81
81
|
| `--cache-file <path>` | auto | Override the persistent-cache file location. Default: `~/Library/Caches/enquire/<vault-hash>.json` (macOS) or `~/.cache/enquire/<vault-hash>.json` (Linux). |
|
|
82
|
-
| `--persistent-index` | off | Maintain a SQLite FTS5 inverted index for sub-100ms BM25-ranked search. Registers
|
|
82
|
+
| `--persistent-index` | off | Maintain a SQLite FTS5 inverted index for sub-100ms BM25-ranked search. Registers the `obsidian://chunk/{n}/{path}` resource; also registers `obsidian_full_text_search` **when combined with `--diagnostic-search-tools`** (since v3.5.9). **Stores chunked note content + tag list + wikilink targets — see [SECURITY.md "Persistent FTS5 index"](../SECURITY.md#persistent-fts5-index-privacy-posture).** |
|
|
83
83
|
| `--tokenize <mode>` | `unicode61` | FTS5 tokenize mode. `unicode61` (default; Latin/Cyrillic, removes diacritics) or `trigram` (CJK / mixed-script, ~2x index size). Changing this triggers an automatic index rebuild. |
|
|
84
84
|
| `--index-file <path>` | auto | Override the FTS5 index file location. Default: `~/Library/Caches/enquire/<vault-hash>.fts5.db` (macOS) or `~/.cache/enquire/<vault-hash>.fts5.db` (Linux). |
|
|
85
85
|
| `--exclude-glob <pattern...>` | none | Repeatable glob pattern(s) — paths matching any pattern are invisible to every tool and refuse direct reads. Privacy filter (denylist). Supports `*` (within-segment), `**` (cross-segment), `?` (single char). Example: `--exclude-glob '02_Personal/**' '*.private.md'`. |
|
|
@@ -111,9 +111,9 @@ Canonical list of every registered MCP tool. The `Kind` column splits read/write
|
|
|
111
111
|
| `clear-cache` | `--vault <path>` `[--cache-file <path>]` | Delete the persistent-cache file for the given vault. Useful for purging stale or sensitive content. Returns 0 even if no cache file exists. |
|
|
112
112
|
| `clear-index` | `--vault <path>` `[--index-file <path>]` | Delete the FTS5 search-index files (`.fts5.db` + WAL/SHM sidecar) for the given vault. Privacy purge for `--persistent-index` users. Returns 0 even if no files exist. |
|
|
113
113
|
| `index` | `--vault <path>` `[--tokenize <mode>]` `[--index-file <path>]` | Cold-build (or refresh) the FTS5 search index for a vault. Useful before first `--persistent-index serve`. Reports `added`/`updated`/`deleted`/`unchanged` chunk counts. |
|
|
114
|
-
| `install-model` (v2.0
|
|
115
|
-
| `build-embeddings` (v2.0
|
|
116
|
-
| `clear-embeddings` (v2.0
|
|
114
|
+
| `install-model` (v2.0+) | `[alias]` (default `multilingual`) | Pre-download an embedding model so the first MCP call doesn't block on a ~120MB HuggingFace download. Aliases: `multilingual` (Xenova/paraphrase-multilingual-MiniLM-L12-v2, 384-dim, 50+ languages, ~120MB) or `bge` (Xenova/bge-small-en-v1.5, 384-dim, English-only, ~33MB). Models cached under `~/.cache/huggingface/transformers.js/` and reused across vaults. Idempotent. |
|
|
115
|
+
| `build-embeddings` (v2.0+) | `--vault <path>` `[--embedding-model <alias>]` `[--embed-file <path>]` `[--exclude-glob <pattern...>]` `[--read-paths <pattern...>]` `[--late-chunk-context <chars>]` `[--quantize-embeddings <mode>]` | Cold-build (or refresh) the persistent embedding index for a vault. Required before `obsidian_embeddings_search` and `obsidian_search` (in hybrid mode) are useful. Same paragraph-level chunking as the FTS5 index — chunk identity matches across BM25 and embeddings. Incremental rebuilds via `source_state` mtime tracking. Reports `added`/`updated`/`deleted`/`unchanged` chunk counts. v2.15.0 `--late-chunk-context <chars>` prepends doc title + breadcrumb + neighbor-chunk tails of N chars before embedding (typical 100-200 for +2-5 NDCG@10). v2.17.0 `--quantize-embeddings <mode>` (`f32` default, `int8` for ~4× smaller BLOBs at ≈1-2% recall cost; mode change triggers a full rebuild). |
|
|
116
|
+
| `clear-embeddings` (v2.0+) | `--vault <path>` `[--embed-file <path>]` | Delete the embedding-index files (`.embed.db` + WAL/SHM sidecar). Idempotent. |
|
|
117
117
|
|
|
118
118
|
## Read tools (always registered)
|
|
119
119
|
|
|
@@ -490,9 +490,9 @@ Pure-JS TF-IDF cosine retrieval. Tokenizes (alphanumeric + hyphen, stop-words fi
|
|
|
490
490
|
|
|
491
491
|
**Performance:** at 10k notes the cold-build is ~5–10s on Apple silicon (similar to FTS5 cold-build). Warm cosine is sub-100ms. For very large vaults, prefer `--persistent-index` + `obsidian_full_text_search` for raw query latency, and use `obsidian_semantic_search` when BM25 misses.
|
|
492
492
|
|
|
493
|
-
**Why not embeddings?** TF-IDF cosine ships zero new deps, runs offline, and meaningfully improves over BM25 alone for the related-term case. For ML embeddings see `obsidian_embeddings_search` and `obsidian_search` (v2.0
|
|
493
|
+
**Why not embeddings?** TF-IDF cosine ships zero new deps, runs offline, and meaningfully improves over BM25 alone for the related-term case. For ML embeddings see `obsidian_embeddings_search` and `obsidian_search` (v2.0+).
|
|
494
494
|
|
|
495
|
-
## `obsidian_embeddings_search` _(v2.0
|
|
495
|
+
## `obsidian_embeddings_search` _(v2.0+ — requires `enquire-mcp install-model` + `enquire-mcp build-embeddings`)_
|
|
496
496
|
|
|
497
497
|
ML-embedding retrieval via [@huggingface/transformers](https://github.com/huggingface/transformers.js) + `paraphrase-multilingual-MiniLM-L12-v2` (default; 384-dim, 50+ languages, runs on CPU). Persistent SQLite vector index next to the FTS5 db. Brute-force cosine top-K (sub-100ms on 50K chunks; HNSW ladder is v2.1 if real users hit that ceiling).
|
|
498
498
|
|
|
@@ -515,7 +515,7 @@ If the index is missing, the tool returns a clean error pointing at `enquire-mcp
|
|
|
515
515
|
|
|
516
516
|
**Caveat — token truncation.** The default multilingual model truncates at 128 tokens. The FTS5 chunker produces ~600-1000-token chunks, so the tail of long paragraphs is not embedded. Use the `bge` model (512-token limit) for longer-context English content, or split notes into shorter paragraphs.
|
|
517
517
|
|
|
518
|
-
## `obsidian_search` _(v2.0
|
|
518
|
+
## `obsidian_search` _(v2.0+ — the default search tool)_
|
|
519
519
|
|
|
520
520
|
**Hybrid retrieval via Reciprocal Rank Fusion (Cormack et al, 2009).** Auto-detects every available retrieval signal — BM25 via FTS5, TF-IDF cosine, ML embeddings — and fuses them with RRF (k=60, equal weights). Gracefully degrades with whatever signals are available:
|
|
521
521
|
|
|
@@ -817,9 +817,9 @@ The note template implements `list`, so MCP clients with a resource browser will
|
|
|
817
817
|
|
|
818
818
|
Every path argument is resolved relative to the vault root and rejected if it escapes the root via `..`. The server never reads outside the vault.
|
|
819
819
|
|
|
820
|
-
## `obsidian_full_text_search` _(opt-in, requires `--persistent-index`)_
|
|
820
|
+
## `obsidian_full_text_search` _(opt-in, requires `--persistent-index` AND `--diagnostic-search-tools`)_
|
|
821
821
|
|
|
822
|
-
BM25-ranked full-text search over a SQLite FTS5 inverted index. Sub-100ms on multi-thousand-note vaults. Only registered when the server is started with `--persistent-index
|
|
822
|
+
BM25-ranked full-text search over a SQLite FTS5 inverted index. Sub-100ms on multi-thousand-note vaults. Only registered when the server is started with BOTH `--persistent-index` (FTS5 index lifecycle) AND `--diagnostic-search-tools` (single-ranker surface — the hybrid `obsidian_search` tool is the recommended default); otherwise use `obsidian_search_text`.
|
|
823
823
|
|
|
824
824
|
| Argument | Type | Notes |
|
|
825
825
|
|----------|-----------------------------------|-----------------------------------------------------------|
|
package/package.json
CHANGED
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
{
|
|
2
2
|
"$schema": "https://json.schemastore.org/package.json",
|
|
3
3
|
"name": "@oomkapwn/enquire-mcp",
|
|
4
|
-
"version": "3.6.
|
|
5
|
-
"description": "The most advanced MCP server for Obsidian vaults. Hybrid retrieval (BM25 + TF-IDF + multilingual ML embeddings, RRF-fused) with BGE cross-encoder reranking, HNSW vector index, int8 quantization, late-chunking, HyDE-augmented retrieval, sub-question decomposition, PDFs (with OCR), Bases (.base query execution, standalone — no Obsidian needed), GraphRAG-light (Louvain wikilink community detection), wikilinks, backlinks, Dataview, frontmatter, canvas. 44 tools, 19 MCP prompts, 5 cross-encoder reranker models,
|
|
4
|
+
"version": "3.6.2",
|
|
5
|
+
"description": "The most advanced MCP server for Obsidian vaults. Hybrid retrieval (BM25 + TF-IDF + multilingual ML embeddings, RRF-fused) with BGE cross-encoder reranking, HNSW vector index, int8 quantization, late-chunking, HyDE-augmented retrieval, sub-question decomposition, PDFs (with OCR), Bases (.base query execution, standalone — no Obsidian needed), GraphRAG-light (Louvain wikilink community detection), wikilinks, backlinks, Dataview, frontmatter, canvas. 44 tools, 19 MCP prompts, 5 cross-encoder reranker models, 753 tests, SLSA-3, semver-bound. Works with Claude Code, Claude Desktop, Cursor, ChatGPT custom GPT, Codex, and any MCP client.",
|
|
6
6
|
"type": "module",
|
|
7
7
|
"bin": {
|
|
8
8
|
"enquire-mcp": "dist/index.js"
|