neuro-vault-mcp 2.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/README.md CHANGED
@@ -13,8 +13,9 @@
13
13
  ## ✨ Why Neuro Vault?
14
14
 
15
15
  - 🧠 **Semantic search over your existing vault** — reuses [Smart Connections](https://github.com/brianpetro/obsidian-smart-connections) embeddings already in your vault. No re-indexing, no API keys, no extra infrastructure.
16
- - 🎯 **Mode-aware retrieval** — `quick` for direct lookups, `deep` for exploratory questions with block-level results and semantic expansion of related notes.
16
+ - 🎯 **Mode-aware retrieval** — `quick` for direct lookups, `deep` for exploratory questions with block-level results and semantic expansion of related notes. Pass `query: string[]` (up to 8) for synonyms, reformulations, or cross-language pairs — one merged result list with `matched_queries` per entry.
17
17
  - ✍️ **Direct vault operations** — read, create, append, and prepend notes; manage frontmatter properties and inspect tags (including daily notes) straight from your AI assistant via the [Obsidian CLI](https://github.com/AlexMost/obsidian-cli).
18
+ - 🔎 **Structured queries** — one MongoDB-style call (`query_notes`) replaces N+1 chains like "list tags → read each note's property". Ask "active projects with #ai" or "todo tasks created this week" and get a single ranked response.
18
19
  - ⚡ **Zero infrastructure** — local stdio MCP server, in-memory index, no database, no background processes, no watchers.
19
20
  - 🔌 **Drop-in for any MCP client** — Claude Code, Cursor, Windsurf — configuration is a single JSON block.
20
21
 
@@ -70,7 +71,7 @@ User guide lives in [`docs/guide/`](./docs/guide/README.md):
70
71
 
71
72
  - [Installation](./docs/guide/installation.md)
72
73
  - [Semantic Search](./docs/guide/semantic-search.md) — `search_notes`, `get_similar_notes`, `find_duplicates`, `get_stats`
73
- - [Vault Operations](./docs/guide/vault-operations.md) — note CRUD, daily notes, properties, tags
74
+ - [Vault Operations](./docs/guide/vault-operations.md) — note CRUD, daily notes, properties, tags, structured queries (`query_notes`)
74
75
  - [Routing Between Tools](./docs/guide/routing.md)
75
76
  - [Configuration](./docs/guide/configuration.md) — CLI args, troubleshooting, limitations, **migration to 2.0**, development
76
77
 
package/dist/cli.d.ts CHANGED
@@ -2,16 +2,6 @@
2
2
  import { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';
3
3
  import { StdioServerTransport } from '@modelcontextprotocol/sdk/server/stdio.js';
4
4
 
5
- interface RetrievalOutput {
6
- results: SearchResult[];
7
- blockResults?: BlockSearchResult[];
8
- }
9
- interface MultiRetrievalOutput {
10
- results: MultiSearchResult[];
11
- blockResults?: MultiBlockSearchResult[];
12
- truncated: boolean;
13
- }
14
-
15
5
  interface SmartBlock {
16
6
  key: string;
17
7
  heading: string;
@@ -32,6 +22,7 @@ interface BlockSearchResult {
32
22
  interface SearchResult {
33
23
  path: string;
34
24
  similarity: number;
25
+ via_expansion?: true;
35
26
  }
36
27
  interface DuplicatePair {
37
28
  note_a: string;
@@ -61,49 +52,7 @@ interface SearchEngine {
61
52
  threshold: number;
62
53
  }): DuplicatePair[];
63
54
  }
64
- type SearchMode = 'quick' | 'deep';
65
- interface SearchNotesInput {
66
- query: string | string[];
67
- mode?: SearchMode;
68
- limit?: number;
69
- threshold?: number;
70
- }
71
- interface GetSimilarNotesInput {
72
- path: string;
73
- limit?: number;
74
- threshold?: number;
75
- }
76
- interface FindDuplicatesInput {
77
- threshold?: number;
78
- }
79
- interface ToolStats {
80
- totalNotes: number;
81
- totalBlocks: number;
82
- embeddingDimension: number;
83
- modelKey: string;
84
- }
85
55
  type PathExistsCheck = (vaultRelativePath: string) => Promise<boolean>;
86
- interface ToolHandlerDependencies {
87
- loader: {
88
- sources: Map<string, SmartSource>;
89
- };
90
- embeddingProvider: EmbeddingProvider;
91
- searchEngine: SearchEngine;
92
- modelKey: string;
93
- pathExists?: PathExistsCheck;
94
- }
95
- interface ToolHandlers {
96
- searchNotes(input: SearchNotesInput): Promise<RetrievalOutput | MultiRetrievalOutput>;
97
- getSimilarNotes(input: GetSimilarNotesInput): Promise<SearchResult[]>;
98
- findDuplicates(input?: FindDuplicatesInput): Promise<DuplicatePair[]>;
99
- getStats(): Promise<ToolStats>;
100
- }
101
- interface MultiSearchResult extends SearchResult {
102
- matched_queries: string[];
103
- }
104
- interface MultiBlockSearchResult extends BlockSearchResult {
105
- matched_queries: string[];
106
- }
107
56
 
108
57
  interface SmartConnectionsCorpus {
109
58
  sources: Map<string, SmartSource>;
@@ -113,7 +62,6 @@ interface SemanticModuleDeps {
113
62
  loadCorpus?: (smartEnvPath: string, modelKey: string) => Promise<SmartConnectionsCorpus>;
114
63
  embeddingServiceFactory?: (modelId: string) => EmbeddingProvider;
115
64
  searchEngine?: SearchEngine;
116
- toolHandlersFactory?: (deps: ToolHandlerDependencies) => ToolHandlers;
117
65
  pathExists?: PathExistsCheck;
118
66
  }
119
67
 
@@ -175,15 +123,6 @@ interface TagListEntry {
175
123
  name: string;
176
124
  count: number;
177
125
  }
178
- interface GetTagInput {
179
- name: string;
180
- includeFiles?: boolean;
181
- }
182
- interface GetTagResult {
183
- name: string;
184
- count: number;
185
- files?: string[];
186
- }
187
126
  interface VaultProvider {
188
127
  createNote(input: CreateNoteInput): Promise<CreateNoteResult>;
189
128
  editNote(input: EditNoteInput): Promise<void>;
@@ -194,7 +133,6 @@ interface VaultProvider {
194
133
  removeProperty(input: RemovePropertyInput): Promise<void>;
195
134
  listProperties(): Promise<PropertyListEntry[]>;
196
135
  listTags(): Promise<TagListEntry[]>;
197
- getTag(input: GetTagInput): Promise<GetTagResult>;
198
136
  }
199
137
 
200
138
  type ExecFn = (binary: string, args: string[], options: {
@@ -228,8 +166,12 @@ interface ReadNotesInput {
228
166
  paths: string[];
229
167
  fields: ReadNotesField[];
230
168
  }
169
+ interface ScanOptions {
170
+ pathPrefix?: string;
171
+ }
231
172
  interface VaultReader {
232
173
  readNotes(input: ReadNotesInput): Promise<ReadNotesItem[]>;
174
+ scan(opts?: ScanOptions): Promise<string[]>;
233
175
  }
234
176
 
235
177
  interface OperationsModuleDeps {