obsidian-mcp-pro 1.0.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.
Files changed (43) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +198 -0
  3. package/build/config.d.ts +4 -0
  4. package/build/config.d.ts.map +1 -0
  5. package/build/config.js +147 -0
  6. package/build/config.js.map +1 -0
  7. package/build/index.d.ts +3 -0
  8. package/build/index.d.ts.map +1 -0
  9. package/build/index.js +135 -0
  10. package/build/index.js.map +1 -0
  11. package/build/lib/markdown.d.ts +43 -0
  12. package/build/lib/markdown.d.ts.map +1 -0
  13. package/build/lib/markdown.js +206 -0
  14. package/build/lib/markdown.js.map +1 -0
  15. package/build/lib/vault.d.ts +22 -0
  16. package/build/lib/vault.d.ts.map +1 -0
  17. package/build/lib/vault.js +182 -0
  18. package/build/lib/vault.js.map +1 -0
  19. package/build/tools/canvas.d.ts +3 -0
  20. package/build/tools/canvas.d.ts.map +1 -0
  21. package/build/tools/canvas.js +172 -0
  22. package/build/tools/canvas.js.map +1 -0
  23. package/build/tools/links.d.ts +3 -0
  24. package/build/tools/links.d.ts.map +1 -0
  25. package/build/tools/links.js +550 -0
  26. package/build/tools/links.js.map +1 -0
  27. package/build/tools/read.d.ts +3 -0
  28. package/build/tools/read.d.ts.map +1 -0
  29. package/build/tools/read.js +302 -0
  30. package/build/tools/read.js.map +1 -0
  31. package/build/tools/tags.d.ts +3 -0
  32. package/build/tools/tags.d.ts.map +1 -0
  33. package/build/tools/tags.js +146 -0
  34. package/build/tools/tags.js.map +1 -0
  35. package/build/tools/write.d.ts +3 -0
  36. package/build/tools/write.d.ts.map +1 -0
  37. package/build/tools/write.js +241 -0
  38. package/build/tools/write.js.map +1 -0
  39. package/build/types.d.ts +84 -0
  40. package/build/types.d.ts.map +1 -0
  41. package/build/types.js +2 -0
  42. package/build/types.js.map +1 -0
  43. package/package.json +37 -0
@@ -0,0 +1,550 @@
1
+ import { z } from "zod";
2
+ import { listNotes, readNote } from "../lib/vault.js";
3
+ import { extractWikilinks, resolveWikilink } from "../lib/markdown.js";
4
+ async function buildLinkGraph(vaultPath, folder) {
5
+ const allNotes = await listNotes(vaultPath, folder);
6
+ const outlinks = new Map();
7
+ const backlinks = new Map();
8
+ const rawLinks = new Map();
9
+ const noteLines = new Map();
10
+ // Initialize sets for all notes
11
+ for (const notePath of allNotes) {
12
+ outlinks.set(notePath, new Set());
13
+ backlinks.set(notePath, new Set());
14
+ }
15
+ for (const notePath of allNotes) {
16
+ let content;
17
+ try {
18
+ content = await readNote(vaultPath, notePath);
19
+ }
20
+ catch {
21
+ console.error(`Failed to read note for link graph: ${notePath}`);
22
+ continue;
23
+ }
24
+ noteLines.set(notePath, content.split("\n"));
25
+ const links = extractWikilinks(content);
26
+ // Fill in source for each link
27
+ for (const link of links) {
28
+ link.source = notePath;
29
+ }
30
+ rawLinks.set(notePath, links);
31
+ const outSet = outlinks.get(notePath) ?? new Set();
32
+ for (const link of links) {
33
+ // Strip heading/block refs for resolution (e.g., "note#heading" -> "note")
34
+ const targetBase = link.target.split("#")[0].trim();
35
+ if (!targetBase)
36
+ continue;
37
+ const resolved = resolveWikilink(targetBase, notePath, allNotes);
38
+ if (resolved) {
39
+ outSet.add(resolved);
40
+ // Ensure backlinks set exists for target
41
+ if (!backlinks.has(resolved)) {
42
+ backlinks.set(resolved, new Set());
43
+ }
44
+ backlinks.get(resolved).add(notePath);
45
+ }
46
+ }
47
+ outlinks.set(notePath, outSet);
48
+ }
49
+ return { allNotes, outlinks, backlinks, rawLinks, noteLines };
50
+ }
51
+ function findLineWithLink(lines, linkTarget) {
52
+ const targetLower = linkTarget.toLowerCase();
53
+ for (let i = 0; i < lines.length; i++) {
54
+ const lineLower = lines[i].toLowerCase();
55
+ if (lineLower.includes(`[[${targetLower}`) || lineLower.includes(`[[${targetLower}|`)) {
56
+ return { line: i + 1, content: lines[i].trim() };
57
+ }
58
+ }
59
+ // Fallback: search for partial match on just the basename
60
+ const basename = linkTarget.split("/").pop()?.toLowerCase() ?? targetLower;
61
+ for (let i = 0; i < lines.length; i++) {
62
+ const lineLower = lines[i].toLowerCase();
63
+ if (lineLower.includes(`[[${basename}`)) {
64
+ return { line: i + 1, content: lines[i].trim() };
65
+ }
66
+ }
67
+ return { line: 0, content: "" };
68
+ }
69
+ export function registerLinkTools(server, vaultPath) {
70
+ // ── get_backlinks ──────────────────────────────────────────────
71
+ server.registerTool("get_backlinks", {
72
+ description: "Find all notes that link to a specific note",
73
+ inputSchema: {
74
+ path: z.string().describe("The target note path (relative to vault root)"),
75
+ },
76
+ }, async ({ path: targetPath }) => {
77
+ try {
78
+ const graph = await buildLinkGraph(vaultPath);
79
+ // Normalize target for comparison
80
+ const targetNormalized = targetPath.replace(/\.md$/i, "").toLowerCase();
81
+ const targetBasename = targetNormalized.split("/").pop() ?? targetNormalized;
82
+ // Find the actual note path that matches the target
83
+ let resolvedTarget = null;
84
+ for (const notePath of graph.allNotes) {
85
+ const noteNormalized = notePath.replace(/\.md$/i, "").toLowerCase();
86
+ if (noteNormalized === targetNormalized) {
87
+ resolvedTarget = notePath;
88
+ break;
89
+ }
90
+ }
91
+ // Also try basename matching if exact match failed
92
+ if (!resolvedTarget) {
93
+ for (const notePath of graph.allNotes) {
94
+ const noteBasename = notePath
95
+ .replace(/\.md$/i, "")
96
+ .split("/")
97
+ .pop()
98
+ ?.toLowerCase();
99
+ if (noteBasename === targetBasename) {
100
+ resolvedTarget = notePath;
101
+ break;
102
+ }
103
+ }
104
+ }
105
+ if (!resolvedTarget) {
106
+ return {
107
+ content: [
108
+ {
109
+ type: "text",
110
+ text: `No note found matching path: ${targetPath}`,
111
+ },
112
+ ],
113
+ };
114
+ }
115
+ const backlinkSources = graph.backlinks.get(resolvedTarget);
116
+ if (!backlinkSources || backlinkSources.size === 0) {
117
+ return {
118
+ content: [
119
+ {
120
+ type: "text",
121
+ text: `No backlinks found for: ${resolvedTarget}`,
122
+ },
123
+ ],
124
+ };
125
+ }
126
+ const results = [];
127
+ for (const sourcePath of backlinkSources) {
128
+ const lines = graph.noteLines.get(sourcePath) ?? [];
129
+ // Find the line(s) that contain the link to the target
130
+ const links = graph.rawLinks.get(sourcePath) ?? [];
131
+ const relevantLinks = links.filter((l) => {
132
+ const base = l.target.split("#")[0].trim();
133
+ const resolved = resolveWikilink(base, sourcePath, graph.allNotes);
134
+ return resolved === resolvedTarget;
135
+ });
136
+ if (relevantLinks.length > 0) {
137
+ for (const link of relevantLinks) {
138
+ const lineInfo = findLineWithLink(lines, link.target);
139
+ results.push({
140
+ source: sourcePath,
141
+ line: lineInfo.line,
142
+ context: lineInfo.content,
143
+ });
144
+ }
145
+ }
146
+ else {
147
+ results.push({ source: sourcePath, line: 0, context: "" });
148
+ }
149
+ }
150
+ // Deduplicate by source+line
151
+ const seen = new Set();
152
+ const deduped = results.filter((r) => {
153
+ const key = `${r.source}:${r.line}`;
154
+ if (seen.has(key))
155
+ return false;
156
+ seen.add(key);
157
+ return true;
158
+ });
159
+ const output = [
160
+ `Backlinks to: ${resolvedTarget}`,
161
+ `Found: ${deduped.length} backlink(s)\n`,
162
+ ...deduped.map((r) => {
163
+ const lineStr = r.line > 0 ? `:${r.line}` : "";
164
+ const contextStr = r.context ? ` → ${r.context}` : "";
165
+ return `- ${r.source}${lineStr}${contextStr}`;
166
+ }),
167
+ ].join("\n");
168
+ return { content: [{ type: "text", text: output }] };
169
+ }
170
+ catch (err) {
171
+ console.error("get_backlinks error:", err);
172
+ return {
173
+ content: [
174
+ {
175
+ type: "text",
176
+ text: `Error finding backlinks: ${err instanceof Error ? err.message : String(err)}`,
177
+ },
178
+ ],
179
+ };
180
+ }
181
+ });
182
+ // ── get_outlinks ───────────────────────────────────────────────
183
+ server.registerTool("get_outlinks", {
184
+ description: "Get all links from a specific note",
185
+ inputSchema: {
186
+ path: z.string().describe("The note path (relative to vault root)"),
187
+ },
188
+ }, async ({ path: notePath }) => {
189
+ try {
190
+ const allNotes = await listNotes(vaultPath);
191
+ const content = await readNote(vaultPath, notePath);
192
+ const links = extractWikilinks(content);
193
+ const results = [];
194
+ for (const link of links) {
195
+ const targetBase = link.target.split("#")[0].trim();
196
+ if (!targetBase)
197
+ continue;
198
+ const resolved = resolveWikilink(targetBase, notePath, allNotes);
199
+ results.push({
200
+ target: link.target,
201
+ resolvedPath: resolved,
202
+ isValid: resolved !== null,
203
+ isEmbed: link.isEmbed,
204
+ });
205
+ }
206
+ if (results.length === 0) {
207
+ return {
208
+ content: [
209
+ {
210
+ type: "text",
211
+ text: `No outgoing links found in: ${notePath}`,
212
+ },
213
+ ],
214
+ };
215
+ }
216
+ const valid = results.filter((r) => r.isValid);
217
+ const broken = results.filter((r) => !r.isValid);
218
+ const lines = [
219
+ `Outgoing links from: ${notePath}`,
220
+ `Total: ${results.length} (${valid.length} valid, ${broken.length} broken)\n`,
221
+ ];
222
+ if (valid.length > 0) {
223
+ lines.push("Valid links:");
224
+ for (const r of valid) {
225
+ const embedPrefix = r.isEmbed ? "📎 " : "";
226
+ lines.push(` ${embedPrefix}[[${r.target}]] → ${r.resolvedPath}`);
227
+ }
228
+ }
229
+ if (broken.length > 0) {
230
+ lines.push("\nBroken links:");
231
+ for (const r of broken) {
232
+ const embedPrefix = r.isEmbed ? "📎 " : "";
233
+ lines.push(` ${embedPrefix}[[${r.target}]] → (not found)`);
234
+ }
235
+ }
236
+ return { content: [{ type: "text", text: lines.join("\n") }] };
237
+ }
238
+ catch (err) {
239
+ console.error("get_outlinks error:", err);
240
+ return {
241
+ content: [
242
+ {
243
+ type: "text",
244
+ text: `Error getting outlinks: ${err instanceof Error ? err.message : String(err)}`,
245
+ },
246
+ ],
247
+ };
248
+ }
249
+ });
250
+ // ── find_orphans ───────────────────────────────────────────────
251
+ server.registerTool("find_orphans", {
252
+ description: "Find notes that have no incoming or outgoing links",
253
+ inputSchema: {
254
+ includeOutlinksCheck: z
255
+ .boolean()
256
+ .optional()
257
+ .default(true)
258
+ .describe("Also check for notes with no outgoing links"),
259
+ },
260
+ }, async ({ includeOutlinksCheck }) => {
261
+ try {
262
+ const graph = await buildLinkGraph(vaultPath);
263
+ const noBacklinks = [];
264
+ const noOutlinks = [];
265
+ const fullyIsolated = [];
266
+ for (const notePath of graph.allNotes) {
267
+ const hasBacklinks = (graph.backlinks.get(notePath)?.size ?? 0) > 0;
268
+ const hasOutlinks = (graph.outlinks.get(notePath)?.size ?? 0) > 0;
269
+ if (!hasBacklinks && !hasOutlinks) {
270
+ fullyIsolated.push({ path: notePath, hasOutlinks: false, hasBacklinks: false });
271
+ }
272
+ else if (!hasBacklinks) {
273
+ noBacklinks.push({ path: notePath, hasOutlinks, hasBacklinks: false });
274
+ }
275
+ else if (!hasOutlinks && includeOutlinksCheck) {
276
+ noOutlinks.push({ path: notePath, hasOutlinks: false, hasBacklinks });
277
+ }
278
+ }
279
+ const lines = [
280
+ `Orphan analysis for vault (${graph.allNotes.length} notes total)\n`,
281
+ ];
282
+ lines.push(`Fully isolated (no links in or out): ${fullyIsolated.length}`);
283
+ for (const note of fullyIsolated) {
284
+ lines.push(` - ${note.path}`);
285
+ }
286
+ lines.push(`\nNo backlinks (not linked by any note): ${noBacklinks.length}`);
287
+ for (const note of noBacklinks) {
288
+ lines.push(` - ${note.path}`);
289
+ }
290
+ if (includeOutlinksCheck) {
291
+ lines.push(`\nNo outlinks (links to no other notes): ${noOutlinks.length}`);
292
+ for (const note of noOutlinks) {
293
+ lines.push(` - ${note.path}`);
294
+ }
295
+ }
296
+ const totalOrphans = fullyIsolated.length + noBacklinks.length + (includeOutlinksCheck ? noOutlinks.length : 0);
297
+ lines.push(`\nTotal orphan entries: ${totalOrphans}`);
298
+ return { content: [{ type: "text", text: lines.join("\n") }] };
299
+ }
300
+ catch (err) {
301
+ console.error("find_orphans error:", err);
302
+ return {
303
+ content: [
304
+ {
305
+ type: "text",
306
+ text: `Error finding orphans: ${err instanceof Error ? err.message : String(err)}`,
307
+ },
308
+ ],
309
+ };
310
+ }
311
+ });
312
+ // ── find_broken_links ──────────────────────────────────────────
313
+ server.registerTool("find_broken_links", {
314
+ description: "Find all wikilinks that point to non-existent notes",
315
+ inputSchema: {
316
+ folder: z
317
+ .string()
318
+ .optional()
319
+ .describe("Limit scan to a specific folder"),
320
+ },
321
+ }, async ({ folder }) => {
322
+ try {
323
+ // Get all notes in vault for resolution, but only scan the folder
324
+ const allNotes = await listNotes(vaultPath);
325
+ const scanNotes = folder ? await listNotes(vaultPath, folder) : allNotes;
326
+ const brokenBySource = new Map();
327
+ for (const notePath of scanNotes) {
328
+ let content;
329
+ try {
330
+ content = await readNote(vaultPath, notePath);
331
+ }
332
+ catch {
333
+ console.error(`Failed to read note for broken link scan: ${notePath}`);
334
+ continue;
335
+ }
336
+ const lines = content.split("\n");
337
+ const links = extractWikilinks(content);
338
+ for (const link of links) {
339
+ const targetBase = link.target.split("#")[0].trim();
340
+ if (!targetBase)
341
+ continue;
342
+ const resolved = resolveWikilink(targetBase, notePath, allNotes);
343
+ if (!resolved) {
344
+ const lineInfo = findLineWithLink(lines, link.target);
345
+ const broken = {
346
+ sourcePath: notePath,
347
+ targetLink: link.target,
348
+ line: lineInfo.line,
349
+ };
350
+ if (!brokenBySource.has(notePath)) {
351
+ brokenBySource.set(notePath, []);
352
+ }
353
+ brokenBySource.get(notePath).push(broken);
354
+ }
355
+ }
356
+ }
357
+ if (brokenBySource.size === 0) {
358
+ const scopeStr = folder ? ` in folder: ${folder}` : "";
359
+ return {
360
+ content: [
361
+ {
362
+ type: "text",
363
+ text: `No broken links found${scopeStr}`,
364
+ },
365
+ ],
366
+ };
367
+ }
368
+ let totalBroken = 0;
369
+ const lines = [];
370
+ const scopeStr = folder ? ` (folder: ${folder})` : "";
371
+ lines.push(`Broken links report${scopeStr}\n`);
372
+ for (const [sourcePath, brokenLinks] of brokenBySource) {
373
+ lines.push(`${sourcePath}:`);
374
+ for (const bl of brokenLinks) {
375
+ const lineStr = bl.line > 0 ? ` (line ${bl.line})` : "";
376
+ lines.push(` - [[${bl.targetLink}]]${lineStr}`);
377
+ totalBroken++;
378
+ }
379
+ lines.push("");
380
+ }
381
+ lines.push(`Total: ${totalBroken} broken link(s) across ${brokenBySource.size} file(s)`);
382
+ return { content: [{ type: "text", text: lines.join("\n") }] };
383
+ }
384
+ catch (err) {
385
+ console.error("find_broken_links error:", err);
386
+ return {
387
+ content: [
388
+ {
389
+ type: "text",
390
+ text: `Error finding broken links: ${err instanceof Error ? err.message : String(err)}`,
391
+ },
392
+ ],
393
+ };
394
+ }
395
+ });
396
+ // ── get_graph_neighbors ────────────────────────────────────────
397
+ server.registerTool("get_graph_neighbors", {
398
+ description: "Get notes within N link-hops of a given note",
399
+ inputSchema: {
400
+ path: z.string().describe("The starting note path (relative to vault root)"),
401
+ depth: z
402
+ .number()
403
+ .int()
404
+ .min(1)
405
+ .max(5)
406
+ .optional()
407
+ .default(1)
408
+ .describe("Maximum number of link-hops (1-5)"),
409
+ direction: z
410
+ .enum(["both", "inbound", "outbound"])
411
+ .optional()
412
+ .default("both")
413
+ .describe("Direction to traverse: inbound (backlinks), outbound (outlinks), or both"),
414
+ },
415
+ }, async ({ path: startPath, depth, direction }) => {
416
+ try {
417
+ const graph = await buildLinkGraph(vaultPath);
418
+ // Resolve the start path
419
+ const startNormalized = startPath.replace(/\.md$/i, "").toLowerCase();
420
+ let resolvedStart = null;
421
+ for (const notePath of graph.allNotes) {
422
+ const noteNormalized = notePath.replace(/\.md$/i, "").toLowerCase();
423
+ if (noteNormalized === startNormalized) {
424
+ resolvedStart = notePath;
425
+ break;
426
+ }
427
+ }
428
+ if (!resolvedStart) {
429
+ // Try basename matching
430
+ const startBasename = startNormalized.split("/").pop() ?? startNormalized;
431
+ for (const notePath of graph.allNotes) {
432
+ const noteBasename = notePath
433
+ .replace(/\.md$/i, "")
434
+ .split("/")
435
+ .pop()
436
+ ?.toLowerCase();
437
+ if (noteBasename === startBasename) {
438
+ resolvedStart = notePath;
439
+ break;
440
+ }
441
+ }
442
+ }
443
+ if (!resolvedStart) {
444
+ return {
445
+ content: [
446
+ {
447
+ type: "text",
448
+ text: `No note found matching path: ${startPath}`,
449
+ },
450
+ ],
451
+ };
452
+ }
453
+ // BFS traversal
454
+ const visited = new Map();
455
+ const queue = [
456
+ { path: resolvedStart, currentDepth: 0 },
457
+ ];
458
+ visited.set(resolvedStart, {
459
+ path: resolvedStart,
460
+ depth: 0,
461
+ direction: "both",
462
+ });
463
+ while (queue.length > 0) {
464
+ const { path: currentPath, currentDepth } = queue.shift();
465
+ if (currentDepth >= depth)
466
+ continue;
467
+ const neighbors = [];
468
+ if (direction === "outbound" || direction === "both") {
469
+ const outs = graph.outlinks.get(currentPath);
470
+ if (outs) {
471
+ for (const target of outs) {
472
+ neighbors.push({ path: target, dir: "outbound" });
473
+ }
474
+ }
475
+ }
476
+ if (direction === "inbound" || direction === "both") {
477
+ const ins = graph.backlinks.get(currentPath);
478
+ if (ins) {
479
+ for (const source of ins) {
480
+ neighbors.push({ path: source, dir: "inbound" });
481
+ }
482
+ }
483
+ }
484
+ for (const neighbor of neighbors) {
485
+ if (!visited.has(neighbor.path)) {
486
+ const neighborInfo = {
487
+ path: neighbor.path,
488
+ depth: currentDepth + 1,
489
+ direction: neighbor.dir,
490
+ };
491
+ visited.set(neighbor.path, neighborInfo);
492
+ queue.push({ path: neighbor.path, currentDepth: currentDepth + 1 });
493
+ }
494
+ }
495
+ }
496
+ // Remove the start node from results
497
+ visited.delete(resolvedStart);
498
+ if (visited.size === 0) {
499
+ return {
500
+ content: [
501
+ {
502
+ type: "text",
503
+ text: `No neighbors found for: ${resolvedStart} (depth: ${depth}, direction: ${direction})`,
504
+ },
505
+ ],
506
+ };
507
+ }
508
+ // Group by depth level for tree-like output
509
+ const byDepth = new Map();
510
+ for (const neighbor of visited.values()) {
511
+ if (!byDepth.has(neighbor.depth)) {
512
+ byDepth.set(neighbor.depth, []);
513
+ }
514
+ byDepth.get(neighbor.depth).push(neighbor);
515
+ }
516
+ const lines = [
517
+ `Graph neighbors of: ${resolvedStart}`,
518
+ `Direction: ${direction} | Max depth: ${depth} | Found: ${visited.size} note(s)\n`,
519
+ resolvedStart,
520
+ ];
521
+ const sortedDepths = [...byDepth.keys()].sort((a, b) => a - b);
522
+ for (const d of sortedDepths) {
523
+ const neighbors = byDepth.get(d);
524
+ neighbors.sort((a, b) => a.path.localeCompare(b.path));
525
+ for (const neighbor of neighbors) {
526
+ const indent = " ".repeat(d);
527
+ const arrow = neighbor.direction === "inbound"
528
+ ? "←"
529
+ : neighbor.direction === "outbound"
530
+ ? "→"
531
+ : "↔";
532
+ lines.push(`${indent}${arrow} ${neighbor.path} (depth ${d})`);
533
+ }
534
+ }
535
+ return { content: [{ type: "text", text: lines.join("\n") }] };
536
+ }
537
+ catch (err) {
538
+ console.error("get_graph_neighbors error:", err);
539
+ return {
540
+ content: [
541
+ {
542
+ type: "text",
543
+ text: `Error getting graph neighbors: ${err instanceof Error ? err.message : String(err)}`,
544
+ },
545
+ ],
546
+ };
547
+ }
548
+ });
549
+ }
550
+ //# sourceMappingURL=links.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"links.js","sourceRoot":"","sources":["../../src/tools/links.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ import { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
2
+ export declare function registerReadTools(server: McpServer, vaultPath: string): void;
3
+ //# sourceMappingURL=read.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"read.d.ts","sourceRoot":"","sources":["../../src/tools/read.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAMpE,wBAAgB,iBAAiB,CAAC,MAAM,EAAE,SAAS,EAAE,SAAS,EAAE,MAAM,GAAG,IAAI,CA2V5E"}