v2.0.0 — True semantic search, multi-vault, block-level retrieval
The headline: search_notes now actually searches by meaning. V2 runs the same embedding model your vault's Smart Connections index used — locally, via transformers.js — to embed your queries. Conceptual queries like "individual freedom and the state" that returned zero results in v1 now resolve to the right notes and the right sections of those notes. Nothing ever leaves your machine.
Added
- True semantic search — query embedding with your vault's own model (~25MB download on first search, cached forever, offline afterward)
- Multi-vault:
SMART_VAULT_PATHaccepts comma-separated paths (aliasSMART_VAULT_PATHS); tools take an optionalvaultparameter; newlist_vaultstool - Block-level retrieval: search matches individual sections and returns content snippets inline — one tool call instead of search-then-read
- Freshness: edits in Obsidian are picked up automatically (throttled incremental reload), no server restart
get_note_content'sinclude_blocksnow actually extracts the named blocks- Explicit
"mode": "keyword-fallback"(+ per-result"match": "keyword"markers) when the embedding model can't load — never a silent downgrade
Fixed
- Path traversal in
get_note_content(reads outside the vault are rejected) - Crash on regex metacharacters in search queries
.ajsondeletion entries (null) are now honored
Removed (breaking)
get_embedding_neighborstool (required hand-typing a 384-number vector)search_notesresponse shape changed (addsvault,scope,block,snippet,mode)
Changed
- Requires Node >= 20; MCP SDK updated to the current 1.x line; real vitest suite (56 CI tests + opt-in live-model tests)
See CHANGELOG.md and the migration notes in the README.