neuro-vault-mcp 3.4.0 → 3.5.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/README.md CHANGED
@@ -1,12 +1,14 @@
1
1
  # Neuro Vault MCP
2
2
 
3
- **Semantic vault search and direct vault operations for your Obsidian vault — right inside your AI assistant.**
3
+ > 🧠💾 **Plug your knowledge in like a USB drive.** Your Obsidian vault, available in every AI conversation — search it, query it, write to it. Same vault in Claude Code, Cursor, Windsurf — no copy-paste, no context-switching, no re-indexing.
4
4
 
5
5
  [![npm version](https://img.shields.io/npm/v/neuro-vault-mcp)](https://www.npmjs.com/package/neuro-vault-mcp)
6
6
  [![Node.js](https://img.shields.io/node/v/neuro-vault-mcp)](https://nodejs.org)
7
7
  [![License: ISC](https://img.shields.io/badge/License-ISC-blue.svg)](LICENSE)
8
8
 
9
- > "What did I write about that idea last month?" — and now your assistant can actually answer.
9
+ Your second brain stops being a folder you open between contexts and becomes a first-class participant in every project. Ask, recall, decide, write back — all without leaving the conversation.
10
+
11
+ > _"What did I write about that idea last month?"_ — and now your assistant can actually answer.
10
12
 
11
13
  ---
12
14
 
@@ -22,30 +24,35 @@
22
24
 
23
25
  ---
24
26
 
25
- ## 🏗 How it works
27
+ ## 🧰 Two superpowers, one server
26
28
 
27
- ```mermaid
28
- flowchart LR
29
- You([You]) --> AI[AI assistant]
30
- AI <-->|MCP| NV[Neuro Vault]
31
- NV <--> Vault[(Obsidian vault)]
32
- ```
29
+ Most "vault MCP" servers give you one or the other. Neuro Vault gives you both, and lets your assistant pick the right one per question:
33
30
 
34
- You ask, the assistant calls Neuro Vault, Neuro Vault reads your vault — semantic search uses embeddings already in `.smart-env/`, vault operations go through the `obsidian` CLI. No database, no background processes.
31
+ | | 🔭 **Semantic recall** | 🛠 **Vault operations** |
32
+ | ---------------- | ------------------------------------------------------------------------- | ------------------------------------------------------------------------------ |
33
+ | **What it does** | Finds notes by meaning, not keywords. Surfaces neighbours and duplicates. | Reads, writes, edits notes; manages frontmatter, tags, daily notes. |
34
+ | **Best for** | _"What did I think about X?"_, fuzzy recall, exploratory research. | Structured queries, capturing decisions, updating tasks, batch reads. |
35
+ | **Powered by** | Smart Connections embeddings (already in your vault). | The official Obsidian CLI — Smart Connections, sync, plugins all stay in sync. |
35
36
 
36
- For module wiring and internal data flow, see [docs/architecture/module-structure.md](./docs/architecture/module-structure.md).
37
+ The two work together: semantic search finds the right region of the vault, vault operations let the assistant actually _do something_ with what it found.
37
38
 
38
39
  ---
39
40
 
40
- ## 🧭 Your vault, but queryable
41
+ ## ✨ What it looks like in practice
41
42
 
42
- A plain-text vault is great for humans and rough on agents. Without the right tools, an assistant ends up listing folders, opening dozens of notes, and grepping inside each one just to answer a simple question.
43
+ **Before:** _"Could you check my notes about that LangGraph experiment?"_
44
+ → Assistant lists `Notes/`, opens 12 files, greps for "LangGraph", gives up halfway, you paste the relevant note manually.
43
45
 
44
- Neuro Vault gives your assistant a way to **ask the vault directly** — by tag, by frontmatter property, by folder, by similarity. Things like:
46
+ **After:** _"Could you check my notes about that LangGraph experiment?"_
47
+ → One semantic search, top-3 ranked notes back, follow-up question already grounded in your own writing.
48
+
49
+ A few more questions Neuro Vault makes one-shot:
45
50
 
46
51
  > _"What are my active projects tagged #ai with a deadline this quarter?"_
47
- > _"Show meeting notes from `Work/` from the last two weeks."_
52
+ > _"Show meeting notes from `Work/` from the last two weeks, newest first."_
48
53
  > _"Find notes similar to this one I'm reading."_
54
+ > _"Append today's decision to the daily note."_
55
+ > _"What did past-me write about retrieval policy before I started building it?"_
49
56
 
50
57
  One question, one answer. Your assistant stops being a file browser and starts being an actual second brain.
51
58
 
@@ -53,6 +60,21 @@ One question, one answer. Your assistant stops being a file browser and starts b
53
60
 
54
61
  ---
55
62
 
63
+ ## 🏗 How it works
64
+
65
+ ```mermaid
66
+ flowchart LR
67
+ You([You]) --> AI[AI assistant]
68
+ AI <-->|MCP| NV[Neuro Vault]
69
+ NV <--> Vault[(Obsidian vault)]
70
+ ```
71
+
72
+ You ask, the assistant calls Neuro Vault, Neuro Vault reads your vault — semantic search uses embeddings already in `.smart-env/`, vault operations go through the `obsidian` CLI. No database, no background processes.
73
+
74
+ For module wiring and internal data flow, see [docs/architecture/module-structure.md](./docs/architecture/module-structure.md).
75
+
76
+ ---
77
+
56
78
  ## ⚡ Quickstart
57
79
 
58
80
  ```bash
package/dist/cli.js CHANGED
@@ -14290,6 +14290,18 @@ function describeJsonShape(parsed) {
14290
14290
  if (Array.isArray(parsed)) return "array";
14291
14291
  return typeof parsed;
14292
14292
  }
14293
+ function getUnionOptions(union2) {
14294
+ const def = union2._def;
14295
+ return def.options ?? [];
14296
+ }
14297
+ function isStringArraySchema(schema) {
14298
+ const inner = unwrap(schema);
14299
+ if (!(inner instanceof external_exports.ZodArray)) return false;
14300
+ const def = inner._def;
14301
+ const element = def.element ?? def.type;
14302
+ if (!element) return false;
14303
+ return unwrap(element) instanceof external_exports.ZodString;
14304
+ }
14293
14305
  function coerceFieldValue(schema, value, fieldName = "value") {
14294
14306
  if (value === null || value === void 0) return value;
14295
14307
  const inner = unwrap(schema);
@@ -14338,6 +14350,19 @@ function coerceFieldValue(schema, value, fieldName = "value") {
14338
14350
  }
14339
14351
  return value;
14340
14352
  }
14353
+ if (inner instanceof external_exports.ZodUnion && typeof value === "string") {
14354
+ const options = getUnionOptions(inner);
14355
+ if (options.some(isStringArraySchema)) {
14356
+ try {
14357
+ const parsed = JSON.parse(value);
14358
+ if (Array.isArray(parsed) && parsed.every((x) => typeof x === "string")) {
14359
+ return parsed;
14360
+ }
14361
+ } catch {
14362
+ }
14363
+ }
14364
+ return value;
14365
+ }
14341
14366
  return value;
14342
14367
  }
14343
14368
  function wrapField(field, fieldName) {