@oomkapwn/enquire-mcp 3.3.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/CHANGELOG.md +186 -0
- package/README.md +5 -4
- package/dist/bases.d.ts.map +1 -1
- package/dist/bases.js +51 -3
- package/dist/bases.js.map +1 -1
- package/dist/communities.d.ts +49 -0
- package/dist/communities.d.ts.map +1 -0
- package/dist/communities.js +253 -0
- package/dist/communities.js.map +1 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +50 -2
- package/dist/index.js.map +1 -1
- package/package.json +6 -2
|
@@ -0,0 +1,253 @@
|
|
|
1
|
+
// v3.4.0 — Wikilink community detection (GraphRAG-light).
|
|
2
|
+
//
|
|
3
|
+
// Builds an undirected graph from the vault's wikilinks (edge for every
|
|
4
|
+
// resolved [[link]]) and partitions notes into communities via greedy
|
|
5
|
+
// modularity optimization (single-phase Louvain). The result lets agents
|
|
6
|
+
// reason about which notes form coherent topics without relying on
|
|
7
|
+
// embeddings — pure structural signal.
|
|
8
|
+
//
|
|
9
|
+
// Why "GraphRAG-light"?
|
|
10
|
+
// - Microsoft GraphRAG runs Leiden/Louvain on entity graphs +
|
|
11
|
+
// LLM-summarizes communities bottom-up.
|
|
12
|
+
// - We have wikilinks (a structural graph) + run modularity-based
|
|
13
|
+
// community detection. We do NOT call an LLM (server stays
|
|
14
|
+
// LLM-free); the calling agent can summarize communities itself.
|
|
15
|
+
// - Result: structural communities surfaced as a retrieval primitive.
|
|
16
|
+
//
|
|
17
|
+
// Algorithm:
|
|
18
|
+
// 1. Build weighted undirected adjacency from wikilinks. Bidirectional
|
|
19
|
+
// links count as a heavier edge (weight 2). Self-links ignored.
|
|
20
|
+
// 2. Initial partition: each node in its own community.
|
|
21
|
+
// 3. Greedy pass: for each node, evaluate moving it to each neighbor's
|
|
22
|
+
// community. Pick the move with max ΔQ (modularity gain). Repeat
|
|
23
|
+
// the pass until no node changes community in a full sweep.
|
|
24
|
+
// 4. Return community ID per node + community → member-list inverted
|
|
25
|
+
// mapping + global modularity score.
|
|
26
|
+
//
|
|
27
|
+
// Single-phase (no super-node aggregation). Good enough for vaults up
|
|
28
|
+
// to ~50K notes; full multi-phase Louvain is a future optimization.
|
|
29
|
+
import * as path from "node:path";
|
|
30
|
+
import { extractWikilinks } from "./parser.js";
|
|
31
|
+
/**
|
|
32
|
+
* Build the undirected wikilink graph from the vault. Each edge = a
|
|
33
|
+
* resolved wikilink (we ignore broken ones — they wouldn't be part of
|
|
34
|
+
* the graph anyway). Bidirectional links contribute weight 2 (one per
|
|
35
|
+
* direction); unidirectional contribute weight 1.
|
|
36
|
+
*
|
|
37
|
+
* Resolution: we use case-insensitive basename match (matches the
|
|
38
|
+
* existing tools' behavior). A wikilink `[[Foo]]` resolves to a note
|
|
39
|
+
* named `Foo.md` if exactly one such note exists; otherwise to the
|
|
40
|
+
* first match by walk order.
|
|
41
|
+
*/
|
|
42
|
+
export async function buildWikilinkGraph(vault) {
|
|
43
|
+
await vault.ensureExists();
|
|
44
|
+
const all = await vault.listFilesByExtension(".md");
|
|
45
|
+
// Build a basename index for resolving wikilinks.
|
|
46
|
+
const byBasename = new Map();
|
|
47
|
+
for (const e of all) {
|
|
48
|
+
const base = e.basename.replace(/\.md$/i, "").toLowerCase();
|
|
49
|
+
if (!byBasename.has(base))
|
|
50
|
+
byBasename.set(base, e.relPath.replace(/\\/g, "/"));
|
|
51
|
+
}
|
|
52
|
+
const adj = new Map();
|
|
53
|
+
const allPaths = all.map((e) => e.relPath.replace(/\\/g, "/"));
|
|
54
|
+
for (const p of allPaths)
|
|
55
|
+
adj.set(p, new Map());
|
|
56
|
+
for (const e of all) {
|
|
57
|
+
const fromPath = e.relPath.replace(/\\/g, "/");
|
|
58
|
+
let body;
|
|
59
|
+
try {
|
|
60
|
+
body = await vault.readFile(e.absPath);
|
|
61
|
+
}
|
|
62
|
+
catch {
|
|
63
|
+
continue;
|
|
64
|
+
}
|
|
65
|
+
const links = extractWikilinks(body);
|
|
66
|
+
for (const link of links) {
|
|
67
|
+
// Normalize: strip section/block, take just the target part.
|
|
68
|
+
const target = link.target.split(/[#^]/)[0]?.trim();
|
|
69
|
+
if (!target)
|
|
70
|
+
continue;
|
|
71
|
+
// Resolution: try basename match, then path match.
|
|
72
|
+
const lookupKey = path.basename(target).replace(/\.md$/i, "").toLowerCase();
|
|
73
|
+
let toPath = byBasename.get(lookupKey);
|
|
74
|
+
if (!toPath) {
|
|
75
|
+
// Try direct path match.
|
|
76
|
+
const candidate = target.endsWith(".md") ? target : `${target}.md`;
|
|
77
|
+
if (adj.has(candidate.replace(/\\/g, "/")))
|
|
78
|
+
toPath = candidate.replace(/\\/g, "/");
|
|
79
|
+
}
|
|
80
|
+
if (!toPath || toPath === fromPath)
|
|
81
|
+
continue;
|
|
82
|
+
// Add edge in BOTH directions (undirected, weight 1 per direction).
|
|
83
|
+
// Bidirectional links naturally accumulate weight 2 because we'll
|
|
84
|
+
// see the link from both sides.
|
|
85
|
+
const fromMap = adj.get(fromPath);
|
|
86
|
+
const toMap = adj.get(toPath);
|
|
87
|
+
if (!fromMap || !toMap)
|
|
88
|
+
continue;
|
|
89
|
+
fromMap.set(toPath, (fromMap.get(toPath) ?? 0) + 1);
|
|
90
|
+
toMap.set(fromPath, (toMap.get(fromPath) ?? 0) + 1);
|
|
91
|
+
}
|
|
92
|
+
}
|
|
93
|
+
// Compute total weight (2m) + degree per node.
|
|
94
|
+
let total = 0;
|
|
95
|
+
const degree = new Map();
|
|
96
|
+
for (const [n, neighbors] of adj.entries()) {
|
|
97
|
+
let d = 0;
|
|
98
|
+
for (const w of neighbors.values())
|
|
99
|
+
d += w;
|
|
100
|
+
degree.set(n, d);
|
|
101
|
+
total += d;
|
|
102
|
+
}
|
|
103
|
+
return { nodes: allPaths, adjacency: adj, totalWeight2m: total, degree };
|
|
104
|
+
}
|
|
105
|
+
/**
|
|
106
|
+
* Greedy modularity-based community detection. Single-phase Louvain.
|
|
107
|
+
*
|
|
108
|
+
* Returns the partition + modularity + community summary.
|
|
109
|
+
*/
|
|
110
|
+
export function detectCommunities(graph) {
|
|
111
|
+
const { nodes, adjacency, totalWeight2m: m2, degree } = graph;
|
|
112
|
+
// Initial partition: each node in its own community.
|
|
113
|
+
const community = new Map();
|
|
114
|
+
for (const [i, n] of nodes.entries())
|
|
115
|
+
community.set(n, i);
|
|
116
|
+
// Pre-compute total weight per community (Σ_tot in Louvain notation).
|
|
117
|
+
const sigmaTot = new Map();
|
|
118
|
+
for (const [n, c] of community.entries()) {
|
|
119
|
+
sigmaTot.set(c, (sigmaTot.get(c) ?? 0) + (degree.get(n) ?? 0));
|
|
120
|
+
}
|
|
121
|
+
// Edge case: no edges (every node isolated). Each node is its own
|
|
122
|
+
// community; modularity = 0 by convention.
|
|
123
|
+
if (m2 === 0) {
|
|
124
|
+
return finalize(graph, community, 0, 0);
|
|
125
|
+
}
|
|
126
|
+
let iterations = 0;
|
|
127
|
+
const MAX_PASSES = 50;
|
|
128
|
+
let changed = true;
|
|
129
|
+
while (changed && iterations < MAX_PASSES) {
|
|
130
|
+
changed = false;
|
|
131
|
+
iterations++;
|
|
132
|
+
for (const node of nodes) {
|
|
133
|
+
const cur = community.get(node) ?? -1;
|
|
134
|
+
const ki = degree.get(node) ?? 0;
|
|
135
|
+
// Compute weight from `node` to each neighboring community.
|
|
136
|
+
const wToCommunity = new Map();
|
|
137
|
+
for (const [neighbor, w] of adjacency.get(node) ?? []) {
|
|
138
|
+
const cn = community.get(neighbor);
|
|
139
|
+
if (cn === undefined)
|
|
140
|
+
continue;
|
|
141
|
+
wToCommunity.set(cn, (wToCommunity.get(cn) ?? 0) + w);
|
|
142
|
+
}
|
|
143
|
+
// Remove `node` from its current community before evaluating.
|
|
144
|
+
sigmaTot.set(cur, (sigmaTot.get(cur) ?? 0) - ki);
|
|
145
|
+
const wToCur = wToCommunity.get(cur) ?? 0;
|
|
146
|
+
// Evaluate ΔQ for moving to each candidate community.
|
|
147
|
+
// Louvain ΔQ formula (simplified, single-phase):
|
|
148
|
+
// ΔQ(node → C) = (k_i,C - σ_tot(C) * k_i / m) / m
|
|
149
|
+
// where k_i,C = sum of weights from node to nodes in C
|
|
150
|
+
// and σ_tot(C) = sum of degrees of nodes in C (after removing node).
|
|
151
|
+
// We pick the C with max ΔQ; if max ΔQ <= ΔQ(stay) then keep stay.
|
|
152
|
+
let bestCommunity = cur;
|
|
153
|
+
let bestGain = (wToCur - ((sigmaTot.get(cur) ?? 0) * ki) / m2) / m2;
|
|
154
|
+
for (const [cand, kIc] of wToCommunity.entries()) {
|
|
155
|
+
if (cand === cur)
|
|
156
|
+
continue;
|
|
157
|
+
const sigC = sigmaTot.get(cand) ?? 0;
|
|
158
|
+
const gain = (kIc - (sigC * ki) / m2) / m2;
|
|
159
|
+
if (gain > bestGain) {
|
|
160
|
+
bestGain = gain;
|
|
161
|
+
bestCommunity = cand;
|
|
162
|
+
}
|
|
163
|
+
}
|
|
164
|
+
// Apply the move.
|
|
165
|
+
sigmaTot.set(bestCommunity, (sigmaTot.get(bestCommunity) ?? 0) + ki);
|
|
166
|
+
if (bestCommunity !== cur) {
|
|
167
|
+
community.set(node, bestCommunity);
|
|
168
|
+
changed = true;
|
|
169
|
+
}
|
|
170
|
+
}
|
|
171
|
+
}
|
|
172
|
+
const Q = computeModularity(graph, community);
|
|
173
|
+
return finalize(graph, community, Q, iterations);
|
|
174
|
+
}
|
|
175
|
+
function computeModularity(graph, community) {
|
|
176
|
+
const { adjacency, totalWeight2m: m2, degree } = graph;
|
|
177
|
+
if (m2 === 0)
|
|
178
|
+
return 0;
|
|
179
|
+
let Q = 0;
|
|
180
|
+
for (const [i, neighbors] of adjacency.entries()) {
|
|
181
|
+
const ci = community.get(i);
|
|
182
|
+
const ki = degree.get(i) ?? 0;
|
|
183
|
+
for (const [j, w] of neighbors) {
|
|
184
|
+
const cj = community.get(j);
|
|
185
|
+
if (ci !== cj)
|
|
186
|
+
continue;
|
|
187
|
+
const kj = degree.get(j) ?? 0;
|
|
188
|
+
Q += w - (ki * kj) / m2;
|
|
189
|
+
}
|
|
190
|
+
}
|
|
191
|
+
return Q / m2;
|
|
192
|
+
}
|
|
193
|
+
function finalize(graph, community, modularity, iterations) {
|
|
194
|
+
// Renumber communities to dense 0..N-1 IDs.
|
|
195
|
+
const remap = new Map();
|
|
196
|
+
const buckets = new Map();
|
|
197
|
+
for (const [n, c] of community.entries()) {
|
|
198
|
+
let nc = remap.get(c);
|
|
199
|
+
if (nc === undefined) {
|
|
200
|
+
nc = remap.size;
|
|
201
|
+
remap.set(c, nc);
|
|
202
|
+
}
|
|
203
|
+
if (!buckets.has(nc))
|
|
204
|
+
buckets.set(nc, []);
|
|
205
|
+
buckets.get(nc)?.push(n);
|
|
206
|
+
}
|
|
207
|
+
// Build membership map with the remapped IDs.
|
|
208
|
+
const membership = new Map();
|
|
209
|
+
for (const [n, c] of community.entries()) {
|
|
210
|
+
const nc = remap.get(c) ?? 0;
|
|
211
|
+
membership.set(n, nc);
|
|
212
|
+
}
|
|
213
|
+
// Sort each community's members by in-community degree descending.
|
|
214
|
+
const communities = [...buckets.entries()]
|
|
215
|
+
.map(([id, members]) => {
|
|
216
|
+
const sorted = sortMembersByCentrality(members, graph, membership);
|
|
217
|
+
return {
|
|
218
|
+
id,
|
|
219
|
+
size: members.length,
|
|
220
|
+
members: sorted,
|
|
221
|
+
representative: sorted[0] ?? ""
|
|
222
|
+
};
|
|
223
|
+
})
|
|
224
|
+
.sort((a, b) => b.size - a.size);
|
|
225
|
+
return {
|
|
226
|
+
community_count: communities.length,
|
|
227
|
+
modularity: Math.round(modularity * 10000) / 10000,
|
|
228
|
+
iterations,
|
|
229
|
+
communities,
|
|
230
|
+
membership
|
|
231
|
+
};
|
|
232
|
+
}
|
|
233
|
+
function sortMembersByCentrality(members, graph, membership) {
|
|
234
|
+
// In-community degree per member.
|
|
235
|
+
const inDeg = new Map();
|
|
236
|
+
for (const m of members) {
|
|
237
|
+
let d = 0;
|
|
238
|
+
const myComm = membership.get(m);
|
|
239
|
+
for (const [n, w] of graph.adjacency.get(m) ?? []) {
|
|
240
|
+
if (membership.get(n) === myComm)
|
|
241
|
+
d += w;
|
|
242
|
+
}
|
|
243
|
+
inDeg.set(m, d);
|
|
244
|
+
}
|
|
245
|
+
return [...members].sort((a, b) => {
|
|
246
|
+
const da = inDeg.get(a) ?? 0;
|
|
247
|
+
const db = inDeg.get(b) ?? 0;
|
|
248
|
+
if (da !== db)
|
|
249
|
+
return db - da;
|
|
250
|
+
return a.localeCompare(b);
|
|
251
|
+
});
|
|
252
|
+
}
|
|
253
|
+
//# sourceMappingURL=communities.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"communities.js","sourceRoot":"","sources":["../src/communities.ts"],"names":[],"mappings":"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"}
|
package/dist/index.d.ts.map
CHANGED
|
@@ -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":";AAIA,OAAO,EAAE,SAAS,EAAoB,MAAM,yCAAyC,CAAC;AAMtF,OAAO,EAAkC,QAAQ,EAAE,MAAM,WAAW,CAAC;AAyCrE,OAAO,EAAE,KAAK,EAAE,MAAM,YAAY,CAAC;AACnC,OAAO,EAAE,YAAY,EAAE,MAAM,cAAc,CAAC;AAW5C,MAAM,WAAW,YAAY;IAC3B,KAAK,EAAE,MAAM,CAAC;IACd,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,eAAe,CAAC,EAAE,OAAO,CAAC;IAC1B,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,eAAe,CAAC,EAAE,OAAO,CAAC;IAC1B,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,QAAQ,CAAC,EAAE,WAAW,GAAG,SAAS,CAAC;IACnC,WAAW,CAAC,EAAE,MAAM,EAAE,CAAC;IACvB,SAAS,CAAC,EAAE,MAAM,EAAE,CAAC;IACrB,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,aAAa,CAAC,EAAE,MAAM,EAAE,CAAC;IACzB,YAAY,CAAC,EAAE,MAAM,EAAE,CAAC;IACxB,qBAAqB,CAAC,EAAE,OAAO,CAAC;IAChC;;mCAE+B;IAC/B,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB;8EAC0E;IAC1E,cAAc,CAAC,EAAE,OAAO,CAAC;IACzB,qEAAqE;IACrE,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,qEAAqE;IACrE,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB;;;+BAG2B;IAC3B,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,+DAA+D;IAC/D,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,kFAAkF;IAClF,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B;;iFAE6E;IAC7E,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB;;;;;;;uDAOmD;IACnD,kBAAkB,CAAC,EAAE,KAAK,GAAG,MAAM,CAAC;CACrC;AAkBD,iBAAe,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC,CAqqBnC;AAED;;;;;;;;;;GAUG;AACH,MAAM,WAAW,UAAU;IACzB,KAAK,EAAE,KAAK,CAAC;IACb,QAAQ,EAAE,QAAQ,GAAG,IAAI,CAAC;IAC1B,OAAO,EAAE,YAAY,GAAG,IAAI,CAAC;IAC7B,aAAa,EAAE,GAAG,CAAC,MAAM,CAAC,CAAC;IAC3B,YAAY,EAAE,GAAG,CAAC,MAAM,CAAC,CAAC;IAC1B,cAAc,EAAE;QAAE,OAAO,EAAE,OAAO,CAAA;KAAE,CAAC;IACrC;;;;OAIG;IACH,WAAW,EAAE;QACX,sBAAsB;QACtB,KAAK,EAAE,OAAO,WAAW,EAAE,SAAS,CAAC;QACrC,oEAAoE;QACpE,UAAU,EAAE,GAAG,CACb,MAAM,EACN;YACE,QAAQ,EAAE,MAAM,CAAC;YACjB,WAAW,EAAE,MAAM,CAAC;YACpB,UAAU,EAAE,MAAM,CAAC;YACnB,QAAQ,EAAE,MAAM,CAAC;YACjB,YAAY,EAAE,MAAM,CAAC;YACrB,IAAI,EAAE,IAAI,GAAG,KAAK,CAAC;SACpB,CACF,CAAC;QACF,kFAAkF;QAClF,EAAE,CAAC,EAAE,MAAM,CAAC;KACb,GAAG,IAAI,CAAC;CACV;AAED;;;;;GAKG;AACH,wBAAsB,iBAAiB,CAAC,IAAI,EAAE,YAAY,GAAG,OAAO,CAAC,UAAU,CAAC,CA4M/E;AAED;;;;GAIG;AACH,wBAAgB,cAAc,CAAC,IAAI,EAAE,UAAU,EAAE,IAAI,EAAE,YAAY,GAAG,SAAS,CAqG9E;AAED,iBAAe,WAAW,CAAC,IAAI,EAAE,YAAY,GAAG,OAAO,CAAC,IAAI,CAAC,CAoD5D;AAED;;;;GAIG;AACH,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,UAAU,GAAG,MAAM,CAY1D;AAED;;;;;;;;;;;;;;;;;GAiBG;AACH,wBAAgB,cAAc,CAC5B,MAAM,EAAE,aAAa,CAAC;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,UAAU,CAAC,EAAE,MAAM,CAAA;CAAE,CAAC,EAC5D,CAAC,EAAE,MAAM,EACT,IAAI,EAAE;IAAE,QAAQ,CAAC,EAAE,MAAM,CAAC;IAAC,YAAY,EAAE,MAAM,CAAA;CAAE,GAChD,MAAM,CAwBR;AAgxED,iBAAS,gBAAgB,CAAC,GAAG,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,MAAM,CAM3D;AAED;;;;;GAKG;AACH,iBAAS,qBAAqB,CAAC,GAAG,EAAE,MAAM,GAAG,SAAS,GAAG,KAAK,GAAG,MAAM,GAAG,SAAS,CASlF;AAsCD,OAAO,EAAE,IAAI,EAAE,gBAAgB,EAAE,qBAAqB,EAAE,WAAW,EAAE,CAAC"}
|
package/dist/index.js
CHANGED
|
@@ -12,7 +12,7 @@ import { chunkContent, defaultIndexFile, FtsIndex } from "./fts5.js";
|
|
|
12
12
|
import { appendToNote, archiveNote, chatThreadAppend, chatThreadRead, contextPack, createNote, dataviewQuery, embeddingsSearch, findPath, findSimilar, frontmatterGet, frontmatterSearch, frontmatterSet, getBacklinks, getNoteNeighbors, getOpenQuestions, getOutboundLinks, getRecentEdits, getUnresolvedWikilinks, getVaultStats, lintWiki, listCanvases, listNotes, listPdfs, listTags, ocrPdf, openInUi, paperAudit, readCanvas, readNote, readPdf, renameNote, replaceInNotes, resolveWikilink, searchHybrid, searchText, semanticSearch, validateNoteProposal } from "./tools.js";
|
|
13
13
|
import { Vault } from "./vault.js";
|
|
14
14
|
import { VaultWatcher } from "./watcher.js";
|
|
15
|
-
const VERSION = "3.
|
|
15
|
+
const VERSION = "3.5.0";
|
|
16
16
|
/** Default location for the persistent embedding index, alongside .fts5.db. */
|
|
17
17
|
function embedDbPath(vaultRoot) {
|
|
18
18
|
// Match the FTS5 location convention by stripping the .fts5.db extension
|
|
@@ -1548,6 +1548,54 @@ hnswContext = null) {
|
|
|
1548
1548
|
limit: z.number().int().positive().max(500).optional().describe("Max canvases to return (default 100)")
|
|
1549
1549
|
}
|
|
1550
1550
|
}, async (args) => textResult(await listCanvases(vault, args)));
|
|
1551
|
+
// v3.4.0 — Wikilink community detection (GraphRAG-light). Builds an
|
|
1552
|
+
// undirected graph from the vault's wikilinks and partitions notes
|
|
1553
|
+
// into structural communities via greedy modularity optimization
|
|
1554
|
+
// (single-phase Louvain). Pure structural signal — no embeddings,
|
|
1555
|
+
// no LLM calls. The agent can summarize communities itself with the
|
|
1556
|
+
// member list this tool returns.
|
|
1557
|
+
server.registerTool("obsidian_get_communities", {
|
|
1558
|
+
title: "Detect wikilink-graph communities (GraphRAG-light)",
|
|
1559
|
+
description: "v3.4.0 — Computes structural communities over the vault's wikilink graph via greedy modularity optimization (single-phase Louvain). Returns `community_count`, `modularity` (∈ [-0.5, 1] — higher = stronger structure), `iterations` until convergence, `communities[]` (each with id/size/sorted-members/representative — the highest-in-community-degree note), and `membership` (path → id). Pure structural — no embeddings consulted. Server stays LLM-free; the agent can summarize a community by reading its representative + sample members. Computation is O(passes × edges); typical 8K-note vault completes in <500ms. The result is NOT cached — call once per session and reuse. First MCP server with native vault community detection.",
|
|
1560
|
+
annotations: { ...READ_ONLY, title: "Get communities" },
|
|
1561
|
+
inputSchema: {
|
|
1562
|
+
min_size: z
|
|
1563
|
+
.number()
|
|
1564
|
+
.int()
|
|
1565
|
+
.nonnegative()
|
|
1566
|
+
.max(1000)
|
|
1567
|
+
.optional()
|
|
1568
|
+
.describe("Drop communities with fewer than N members from the response (default 1 — keep singletons). Useful for filtering dust."),
|
|
1569
|
+
limit: z
|
|
1570
|
+
.number()
|
|
1571
|
+
.int()
|
|
1572
|
+
.positive()
|
|
1573
|
+
.max(500)
|
|
1574
|
+
.optional()
|
|
1575
|
+
.describe("Max communities to return (default 50, sorted by size descending)")
|
|
1576
|
+
}
|
|
1577
|
+
}, async (args) => {
|
|
1578
|
+
const { buildWikilinkGraph, detectCommunities } = await import("./communities.js");
|
|
1579
|
+
const graph = await buildWikilinkGraph(vault);
|
|
1580
|
+
const result = detectCommunities(graph);
|
|
1581
|
+
const minSize = args.min_size ?? 1;
|
|
1582
|
+
const limit = args.limit ?? 50;
|
|
1583
|
+
const filtered = result.communities.filter((c) => c.size >= minSize).slice(0, limit);
|
|
1584
|
+
const keptIds = new Set(filtered.map((c) => c.id));
|
|
1585
|
+
const membershipObj = {};
|
|
1586
|
+
for (const [k, v] of result.membership.entries()) {
|
|
1587
|
+
if (keptIds.has(v))
|
|
1588
|
+
membershipObj[k] = v;
|
|
1589
|
+
}
|
|
1590
|
+
return textResult({
|
|
1591
|
+
community_count: result.community_count,
|
|
1592
|
+
modularity: result.modularity,
|
|
1593
|
+
iterations: result.iterations,
|
|
1594
|
+
node_count: result.membership.size,
|
|
1595
|
+
communities: filtered,
|
|
1596
|
+
membership: membershipObj
|
|
1597
|
+
});
|
|
1598
|
+
});
|
|
1551
1599
|
// v3.2.0 — Obsidian Bases (`.base`) support. Bases are Obsidian's
|
|
1552
1600
|
// first-class structured-data primitive (GA mid-2026): YAML files
|
|
1553
1601
|
// defining filters/views/formulas over the vault's notes. We expose
|
|
@@ -1580,7 +1628,7 @@ hnswContext = null) {
|
|
|
1580
1628
|
});
|
|
1581
1629
|
server.registerTool("obsidian_query_base", {
|
|
1582
1630
|
title: "Execute an Obsidian Base — return matching notes",
|
|
1583
|
-
description: 'v3.2.0 — Runs a `.base` file\'s filter against the vault\'s markdown notes, returning matching paths + the frontmatter values that contributed to the match.
|
|
1631
|
+
description: 'v3.2.0 (extended in v3.5.0) — Runs a `.base` file\'s filter against the vault\'s markdown notes, returning matching paths + the frontmatter values that contributed to the match. Supported DSL: `tag == "x"`, `taggedWith(file.file, "x")`, `linksTo(file.file, "Target")` (v3.5.0 — outbound wikilink check, basename-resolved, case-insensitive), `path startsWith "X"` / `path contains "X"` / `file.path startsWith "X"` (v3.5.0 — `file.` prefix accepted), `file.name == "X"` / `file.name != "X"` (v3.5.0 — basename equality, .md stripped), `<frontmatter_key> == <value>`, `<key> != <value>`, `<key> contains "<substr>"`, plus `and` / `or` / `not` combinators. Anything else (formula evaluation, date arithmetic, summaries) is treated as `true` (most permissive) and returned in `unevaluated_predicates`. Pair with `obsidian_search` for retrieval-quality search; this is for explicit saved queries.',
|
|
1584
1632
|
annotations: { ...READ_ONLY, title: "Query base" },
|
|
1585
1633
|
inputSchema: {
|
|
1586
1634
|
path: z.string().describe("Vault-relative path of the .base file"),
|