@aniketbiswas/obsidian-mcp-server 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 (99) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +232 -0
  3. package/build/index.d.ts +26 -0
  4. package/build/index.d.ts.map +1 -0
  5. package/build/index.js +148 -0
  6. package/build/index.js.map +1 -0
  7. package/build/prompts/index.d.ts +33 -0
  8. package/build/prompts/index.d.ts.map +1 -0
  9. package/build/prompts/index.js +152 -0
  10. package/build/prompts/index.js.map +1 -0
  11. package/build/prompts/obsidian.d.ts +17 -0
  12. package/build/prompts/obsidian.d.ts.map +1 -0
  13. package/build/prompts/obsidian.js +305 -0
  14. package/build/prompts/obsidian.js.map +1 -0
  15. package/build/resources/index.d.ts +31 -0
  16. package/build/resources/index.d.ts.map +1 -0
  17. package/build/resources/index.js +111 -0
  18. package/build/resources/index.js.map +1 -0
  19. package/build/resources/obsidian.d.ts +19 -0
  20. package/build/resources/obsidian.d.ts.map +1 -0
  21. package/build/resources/obsidian.js +246 -0
  22. package/build/resources/obsidian.js.map +1 -0
  23. package/build/tools/_template.d.ts +23 -0
  24. package/build/tools/_template.d.ts.map +1 -0
  25. package/build/tools/_template.js +124 -0
  26. package/build/tools/_template.js.map +1 -0
  27. package/build/tools/calculator.d.ts +32 -0
  28. package/build/tools/calculator.d.ts.map +1 -0
  29. package/build/tools/calculator.js +130 -0
  30. package/build/tools/calculator.js.map +1 -0
  31. package/build/tools/daily-notes.d.ts +19 -0
  32. package/build/tools/daily-notes.d.ts.map +1 -0
  33. package/build/tools/daily-notes.js +469 -0
  34. package/build/tools/daily-notes.js.map +1 -0
  35. package/build/tools/greeting.d.ts +23 -0
  36. package/build/tools/greeting.d.ts.map +1 -0
  37. package/build/tools/greeting.js +111 -0
  38. package/build/tools/greeting.js.map +1 -0
  39. package/build/tools/index.d.ts +28 -0
  40. package/build/tools/index.d.ts.map +1 -0
  41. package/build/tools/index.js +46 -0
  42. package/build/tools/index.js.map +1 -0
  43. package/build/tools/links.d.ts +19 -0
  44. package/build/tools/links.d.ts.map +1 -0
  45. package/build/tools/links.js +467 -0
  46. package/build/tools/links.js.map +1 -0
  47. package/build/tools/metadata.d.ts +18 -0
  48. package/build/tools/metadata.d.ts.map +1 -0
  49. package/build/tools/metadata.js +447 -0
  50. package/build/tools/metadata.js.map +1 -0
  51. package/build/tools/navigation.d.ts +19 -0
  52. package/build/tools/navigation.d.ts.map +1 -0
  53. package/build/tools/navigation.js +378 -0
  54. package/build/tools/navigation.js.map +1 -0
  55. package/build/tools/notes.d.ts +19 -0
  56. package/build/tools/notes.d.ts.map +1 -0
  57. package/build/tools/notes.js +622 -0
  58. package/build/tools/notes.js.map +1 -0
  59. package/build/tools/search.d.ts +19 -0
  60. package/build/tools/search.d.ts.map +1 -0
  61. package/build/tools/search.js +418 -0
  62. package/build/tools/search.js.map +1 -0
  63. package/build/tools/templates.d.ts +18 -0
  64. package/build/tools/templates.d.ts.map +1 -0
  65. package/build/tools/templates.js +581 -0
  66. package/build/tools/templates.js.map +1 -0
  67. package/build/tools/vault.d.ts +19 -0
  68. package/build/tools/vault.d.ts.map +1 -0
  69. package/build/tools/vault.js +403 -0
  70. package/build/tools/vault.js.map +1 -0
  71. package/build/types/index.d.ts +11 -0
  72. package/build/types/index.d.ts.map +1 -0
  73. package/build/types/index.js +11 -0
  74. package/build/types/index.js.map +1 -0
  75. package/build/types/obsidian.d.ts +329 -0
  76. package/build/types/obsidian.d.ts.map +1 -0
  77. package/build/types/obsidian.js +38 -0
  78. package/build/types/obsidian.js.map +1 -0
  79. package/build/utils/client.d.ts +201 -0
  80. package/build/utils/client.d.ts.map +1 -0
  81. package/build/utils/client.js +656 -0
  82. package/build/utils/client.js.map +1 -0
  83. package/build/utils/config.d.ts +43 -0
  84. package/build/utils/config.d.ts.map +1 -0
  85. package/build/utils/config.js +117 -0
  86. package/build/utils/config.js.map +1 -0
  87. package/build/utils/frontmatter.d.ts +90 -0
  88. package/build/utils/frontmatter.d.ts.map +1 -0
  89. package/build/utils/frontmatter.js +306 -0
  90. package/build/utils/frontmatter.js.map +1 -0
  91. package/build/utils/index.d.ts +13 -0
  92. package/build/utils/index.d.ts.map +1 -0
  93. package/build/utils/index.js +13 -0
  94. package/build/utils/index.js.map +1 -0
  95. package/build/utils/markdown.d.ts +134 -0
  96. package/build/utils/markdown.d.ts.map +1 -0
  97. package/build/utils/markdown.js +330 -0
  98. package/build/utils/markdown.js.map +1 -0
  99. package/package.json +60 -0
@@ -0,0 +1,46 @@
1
+ /**
2
+ * ============================================================================
3
+ * OBSIDIAN MCP - Tools Index
4
+ * ============================================================================
5
+ *
6
+ * Central registration point for all Obsidian MCP tools.
7
+ * Each tool module is imported and registered with the server.
8
+ * ============================================================================
9
+ */
10
+ // Import tool registration functions
11
+ import { registerVaultTools } from "./vault.js";
12
+ import { registerNoteTools } from "./notes.js";
13
+ import { registerSearchTools } from "./search.js";
14
+ import { registerMetadataTools } from "./metadata.js";
15
+ import { registerNavigationTools } from "./navigation.js";
16
+ import { registerDailyNotesTools } from "./daily-notes.js";
17
+ import { registerLinkTools } from "./links.js";
18
+ import { registerTemplateTools } from "./templates.js";
19
+ /**
20
+ * Register all Obsidian tools with the MCP server.
21
+ *
22
+ * @param server - The MCP server instance
23
+ * @param client - The Obsidian API client
24
+ */
25
+ export function registerAllTools(server, client) {
26
+ // Vault management tools
27
+ registerVaultTools(server, client);
28
+ // Note CRUD operations
29
+ registerNoteTools(server, client);
30
+ // Search functionality
31
+ registerSearchTools(server, client);
32
+ // Metadata and frontmatter management
33
+ registerMetadataTools(server, client);
34
+ // Navigation and commands
35
+ registerNavigationTools(server, client);
36
+ // Daily and periodic notes
37
+ registerDailyNotesTools(server, client);
38
+ // Link analysis tools
39
+ registerLinkTools(server, client);
40
+ // Template tools
41
+ registerTemplateTools(server, client);
42
+ console.error("✅ All Obsidian tools registered");
43
+ }
44
+ // Re-export individual tool registration functions for selective use
45
+ export { registerVaultTools, registerNoteTools, registerSearchTools, registerMetadataTools, registerNavigationTools, registerDailyNotesTools, registerLinkTools, registerTemplateTools, };
46
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/tools/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAKH,qCAAqC;AACrC,OAAO,EAAE,kBAAkB,EAAE,MAAM,YAAY,CAAC;AAChD,OAAO,EAAE,iBAAiB,EAAE,MAAM,YAAY,CAAC;AAC/C,OAAO,EAAE,mBAAmB,EAAE,MAAM,aAAa,CAAC;AAClD,OAAO,EAAE,qBAAqB,EAAE,MAAM,eAAe,CAAC;AACtD,OAAO,EAAE,uBAAuB,EAAE,MAAM,iBAAiB,CAAC;AAC1D,OAAO,EAAE,uBAAuB,EAAE,MAAM,kBAAkB,CAAC;AAC3D,OAAO,EAAE,iBAAiB,EAAE,MAAM,YAAY,CAAC;AAC/C,OAAO,EAAE,qBAAqB,EAAE,MAAM,gBAAgB,CAAC;AAEvD;;;;;GAKG;AACH,MAAM,UAAU,gBAAgB,CAAC,MAAiB,EAAE,MAAsB;IACxE,yBAAyB;IACzB,kBAAkB,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAEnC,uBAAuB;IACvB,iBAAiB,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAElC,uBAAuB;IACvB,mBAAmB,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAEpC,sCAAsC;IACtC,qBAAqB,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAEtC,0BAA0B;IAC1B,uBAAuB,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAExC,2BAA2B;IAC3B,uBAAuB,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAExC,sBAAsB;IACtB,iBAAiB,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAElC,iBAAiB;IACjB,qBAAqB,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAEtC,OAAO,CAAC,KAAK,CAAC,iCAAiC,CAAC,CAAC;AACnD,CAAC;AAED,qEAAqE;AACrE,OAAO,EACL,kBAAkB,EAClB,iBAAiB,EACjB,mBAAmB,EACnB,qBAAqB,EACrB,uBAAuB,EACvB,uBAAuB,EACvB,iBAAiB,EACjB,qBAAqB,GACtB,CAAC"}
@@ -0,0 +1,19 @@
1
+ /**
2
+ * ============================================================================
3
+ * OBSIDIAN MCP - Link Analysis Tools
4
+ * ============================================================================
5
+ *
6
+ * Tools for analyzing links between notes: backlinks, outgoing links,
7
+ * graph analysis, and finding orphan notes.
8
+ * ============================================================================
9
+ */
10
+ import { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
11
+ import { ObsidianClient } from "../utils/client.js";
12
+ /**
13
+ * Register link analysis tools with the MCP server.
14
+ *
15
+ * @param server - The MCP server instance
16
+ * @param client - The Obsidian API client
17
+ */
18
+ export declare function registerLinkTools(server: McpServer, client: ObsidianClient): void;
19
+ //# sourceMappingURL=links.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"links.d.ts","sourceRoot":"","sources":["../../src/tools/links.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAEpE,OAAO,EAAE,cAAc,EAAE,MAAM,oBAAoB,CAAC;AASpD;;;;;GAKG;AACH,wBAAgB,iBAAiB,CAAC,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,cAAc,GAAG,IAAI,CAgjBjF"}
@@ -0,0 +1,467 @@
1
+ /**
2
+ * ============================================================================
3
+ * OBSIDIAN MCP - Link Analysis Tools
4
+ * ============================================================================
5
+ *
6
+ * Tools for analyzing links between notes: backlinks, outgoing links,
7
+ * graph analysis, and finding orphan notes.
8
+ * ============================================================================
9
+ */
10
+ import { z } from "zod";
11
+ import { ObsidianApiError } from "../types/obsidian.js";
12
+ import { extractInternalLinks, extractAllLinks, createWikilink, } from "../utils/markdown.js";
13
+ /**
14
+ * Register link analysis tools with the MCP server.
15
+ *
16
+ * @param server - The MCP server instance
17
+ * @param client - The Obsidian API client
18
+ */
19
+ export function registerLinkTools(server, client) {
20
+ // ---------------------------------------------------------------------------
21
+ // TOOL: get_outgoing_links
22
+ // ---------------------------------------------------------------------------
23
+ // Get all links from a note.
24
+ // ---------------------------------------------------------------------------
25
+ server.tool("get_outgoing_links", "Get all outgoing links from a note. " +
26
+ "Returns internal links ([[note]]), external links, and tags.", {
27
+ path: z.string().describe("Path to the note."),
28
+ }, async ({ path }) => {
29
+ try {
30
+ const filePath = path.endsWith(".md") ? path : `${path}.md`;
31
+ const content = await client.getFile(filePath);
32
+ const links = extractAllLinks(content, filePath);
33
+ // Separate by type
34
+ const internal = links.filter((l) => l.type === "internal");
35
+ const external = links.filter((l) => l.type === "external");
36
+ const tags = links.filter((l) => l.type === "tag");
37
+ return {
38
+ content: [
39
+ {
40
+ type: "text",
41
+ text: JSON.stringify({
42
+ success: true,
43
+ path: filePath,
44
+ totalLinks: links.length,
45
+ internalLinks: internal.map((l) => ({
46
+ target: l.target,
47
+ displayText: l.displayText,
48
+ isEmbed: l.isEmbed,
49
+ })),
50
+ externalLinks: external.map((l) => ({
51
+ url: l.target,
52
+ displayText: l.displayText,
53
+ })),
54
+ tags: tags.map((l) => l.target),
55
+ }, null, 2),
56
+ },
57
+ ],
58
+ };
59
+ }
60
+ catch (error) {
61
+ const message = error instanceof ObsidianApiError ? error.message : String(error);
62
+ return {
63
+ content: [
64
+ {
65
+ type: "text",
66
+ text: `Error getting outgoing links: ${message}`,
67
+ },
68
+ ],
69
+ isError: true,
70
+ };
71
+ }
72
+ });
73
+ // ---------------------------------------------------------------------------
74
+ // TOOL: get_backlinks
75
+ // ---------------------------------------------------------------------------
76
+ // Find all notes that link to a specific note.
77
+ // ---------------------------------------------------------------------------
78
+ server.tool("get_backlinks", "Find all notes that link to a specific note (backlinks). " +
79
+ "Searches the entire vault for [[note]] references.", {
80
+ path: z.string().describe("Path to the note to find backlinks for."),
81
+ includeContext: z
82
+ .boolean()
83
+ .optional()
84
+ .default(false)
85
+ .describe("Whether to include the context around each backlink."),
86
+ }, async ({ path, includeContext }) => {
87
+ try {
88
+ const filePath = path.endsWith(".md") ? path : `${path}.md`;
89
+ // Extract the note name (without path and extension) for searching
90
+ const noteName = filePath
91
+ .split("/")
92
+ .pop()
93
+ .replace(/\.md$/, "");
94
+ // Search for [[noteName]] in all files
95
+ const searchResults = await client.search(`[[${noteName}]]`);
96
+ // Filter out self-references
97
+ const backlinks = searchResults.filter((r) => r.filename.toLowerCase() !== filePath.toLowerCase());
98
+ const results = await Promise.all(backlinks.map(async (result) => {
99
+ const item = {
100
+ source: result.filename,
101
+ };
102
+ if (includeContext && result.matches) {
103
+ item.contexts = result.matches.slice(0, 3).map((m) => m.match);
104
+ }
105
+ return item;
106
+ }));
107
+ return {
108
+ content: [
109
+ {
110
+ type: "text",
111
+ text: JSON.stringify({
112
+ success: true,
113
+ target: filePath,
114
+ backlinksCount: results.length,
115
+ backlinks: results,
116
+ }, null, 2),
117
+ },
118
+ ],
119
+ };
120
+ }
121
+ catch (error) {
122
+ const message = error instanceof ObsidianApiError ? error.message : String(error);
123
+ return {
124
+ content: [
125
+ {
126
+ type: "text",
127
+ text: `Error getting backlinks: ${message}`,
128
+ },
129
+ ],
130
+ isError: true,
131
+ };
132
+ }
133
+ });
134
+ // ---------------------------------------------------------------------------
135
+ // TOOL: find_broken_links
136
+ // ---------------------------------------------------------------------------
137
+ // Find links that point to non-existent notes.
138
+ // ---------------------------------------------------------------------------
139
+ server.tool("find_broken_links", "Find broken internal links in the vault. " +
140
+ "Identifies [[links]] that point to notes that don't exist.", {
141
+ folder: z
142
+ .string()
143
+ .optional()
144
+ .describe("Folder to check. Defaults to entire vault."),
145
+ }, async ({ folder }) => {
146
+ try {
147
+ // Get all markdown files
148
+ const allFiles = await client.listAllFiles(folder || "", 10);
149
+ const mdFiles = allFiles.filter((f) => f.type === "file" && f.extension === "md");
150
+ // Build a set of existing note paths (without extension)
151
+ const existingNotes = new Set();
152
+ for (const file of mdFiles) {
153
+ // Add with path
154
+ existingNotes.add(file.path.toLowerCase());
155
+ // Add without .md extension
156
+ existingNotes.add(file.path.replace(/\.md$/, "").toLowerCase());
157
+ // Add just the filename
158
+ const filename = file.path.split("/").pop().replace(/\.md$/, "");
159
+ existingNotes.add(filename.toLowerCase());
160
+ }
161
+ const brokenLinks = [];
162
+ // Check each file for broken links
163
+ for (const file of mdFiles.slice(0, 200)) {
164
+ // Limit to avoid timeout
165
+ try {
166
+ const content = await client.getFile(file.path);
167
+ const internalLinks = extractInternalLinks(content);
168
+ for (const link of internalLinks) {
169
+ // Check if target exists
170
+ const target = link.target.split("#")[0]; // Remove heading reference
171
+ const targetLower = target.toLowerCase();
172
+ // Check various forms of the target
173
+ const exists = existingNotes.has(targetLower) ||
174
+ existingNotes.has(`${targetLower}.md`) ||
175
+ mdFiles.some((f) => f.path.toLowerCase().endsWith(`/${targetLower}.md`) ||
176
+ f.path.toLowerCase().endsWith(`/${targetLower}`));
177
+ if (!exists) {
178
+ brokenLinks.push({
179
+ source: file.path,
180
+ target: link.target,
181
+ });
182
+ }
183
+ }
184
+ }
185
+ catch {
186
+ // Skip files that can't be read
187
+ }
188
+ }
189
+ return {
190
+ content: [
191
+ {
192
+ type: "text",
193
+ text: JSON.stringify({
194
+ success: true,
195
+ folder: folder || "/",
196
+ filesChecked: Math.min(mdFiles.length, 200),
197
+ brokenLinksCount: brokenLinks.length,
198
+ brokenLinks,
199
+ }, null, 2),
200
+ },
201
+ ],
202
+ };
203
+ }
204
+ catch (error) {
205
+ const message = error instanceof ObsidianApiError ? error.message : String(error);
206
+ return {
207
+ content: [
208
+ {
209
+ type: "text",
210
+ text: `Error finding broken links: ${message}`,
211
+ },
212
+ ],
213
+ isError: true,
214
+ };
215
+ }
216
+ });
217
+ // ---------------------------------------------------------------------------
218
+ // TOOL: find_orphan_notes
219
+ // ---------------------------------------------------------------------------
220
+ // Find notes that have no incoming or outgoing links.
221
+ // ---------------------------------------------------------------------------
222
+ server.tool("find_orphan_notes", "Find orphan notes - notes with no incoming links from other notes. " +
223
+ "These are notes that aren't connected to the rest of your knowledge graph.", {
224
+ folder: z
225
+ .string()
226
+ .optional()
227
+ .describe("Folder to check. Defaults to entire vault."),
228
+ includeUnlinked: z
229
+ .boolean()
230
+ .optional()
231
+ .default(false)
232
+ .describe("Also include notes that don't link to anything."),
233
+ }, async ({ folder, includeUnlinked }) => {
234
+ try {
235
+ // Get all markdown files
236
+ const allFiles = await client.listAllFiles(folder || "", 10);
237
+ const mdFiles = allFiles.filter((f) => f.type === "file" && f.extension === "md");
238
+ // Track which notes are linked to
239
+ const linkedTo = new Set();
240
+ const hasOutgoingLinks = new Set();
241
+ // Build link map
242
+ for (const file of mdFiles.slice(0, 300)) {
243
+ try {
244
+ const content = await client.getFile(file.path);
245
+ const links = extractInternalLinks(content);
246
+ if (links.length > 0) {
247
+ hasOutgoingLinks.add(file.path);
248
+ }
249
+ for (const link of links) {
250
+ const target = link.target.split("#")[0];
251
+ // Add various forms of the target
252
+ linkedTo.add(target.toLowerCase());
253
+ linkedTo.add(`${target.toLowerCase()}.md`);
254
+ }
255
+ }
256
+ catch {
257
+ // Skip files that can't be read
258
+ }
259
+ }
260
+ // Find orphans (notes not linked to)
261
+ const orphans = [];
262
+ for (const file of mdFiles) {
263
+ const noteName = file.path
264
+ .split("/")
265
+ .pop()
266
+ .replace(/\.md$/, "")
267
+ .toLowerCase();
268
+ const isLinkedTo = linkedTo.has(noteName) ||
269
+ linkedTo.has(`${noteName}.md`) ||
270
+ linkedTo.has(file.path.toLowerCase());
271
+ if (!isLinkedTo) {
272
+ const hasLinks = hasOutgoingLinks.has(file.path);
273
+ if (!includeUnlinked || !hasLinks) {
274
+ orphans.push({
275
+ path: file.path,
276
+ hasOutgoingLinks: hasLinks,
277
+ });
278
+ }
279
+ }
280
+ }
281
+ return {
282
+ content: [
283
+ {
284
+ type: "text",
285
+ text: JSON.stringify({
286
+ success: true,
287
+ folder: folder || "/",
288
+ totalNotes: mdFiles.length,
289
+ orphanCount: orphans.length,
290
+ orphans: orphans.slice(0, 100),
291
+ truncated: orphans.length > 100,
292
+ }, null, 2),
293
+ },
294
+ ],
295
+ };
296
+ }
297
+ catch (error) {
298
+ const message = error instanceof ObsidianApiError ? error.message : String(error);
299
+ return {
300
+ content: [
301
+ {
302
+ type: "text",
303
+ text: `Error finding orphan notes: ${message}`,
304
+ },
305
+ ],
306
+ isError: true,
307
+ };
308
+ }
309
+ });
310
+ // ---------------------------------------------------------------------------
311
+ // TOOL: add_link_to_note
312
+ // ---------------------------------------------------------------------------
313
+ // Add an internal link to another note.
314
+ // ---------------------------------------------------------------------------
315
+ server.tool("add_link_to_note", "Add an internal link ([[note]]) to a note. " +
316
+ "Can append to the end or insert at a specific location.", {
317
+ sourcePath: z.string().describe("Path to the note to add the link to."),
318
+ targetPath: z.string().describe("Path of the note to link to."),
319
+ displayText: z
320
+ .string()
321
+ .optional()
322
+ .describe("Optional display text for the link."),
323
+ position: z
324
+ .enum(["append", "prepend"])
325
+ .optional()
326
+ .default("append")
327
+ .describe("Where to add the link (append or prepend)."),
328
+ asListItem: z
329
+ .boolean()
330
+ .optional()
331
+ .default(false)
332
+ .describe("Whether to format as a list item (- [[link]])."),
333
+ }, async ({ sourcePath, targetPath, displayText, position, asListItem }) => {
334
+ try {
335
+ const sourceFile = sourcePath.endsWith(".md")
336
+ ? sourcePath
337
+ : `${sourcePath}.md`;
338
+ const targetNote = targetPath.replace(/\.md$/, "");
339
+ const wikilink = createWikilink(targetNote, displayText);
340
+ const content = asListItem ? `- ${wikilink}` : wikilink;
341
+ if (position === "prepend") {
342
+ await client.patchFile(sourceFile, `${content}\n`, {
343
+ operation: "prepend",
344
+ });
345
+ }
346
+ else {
347
+ await client.appendToFile(sourceFile, `\n${content}`);
348
+ }
349
+ return {
350
+ content: [
351
+ {
352
+ type: "text",
353
+ text: JSON.stringify({
354
+ success: true,
355
+ message: `Link added to ${sourceFile}`,
356
+ source: sourceFile,
357
+ target: targetNote,
358
+ link: wikilink,
359
+ position,
360
+ }, null, 2),
361
+ },
362
+ ],
363
+ };
364
+ }
365
+ catch (error) {
366
+ const message = error instanceof ObsidianApiError ? error.message : String(error);
367
+ return {
368
+ content: [
369
+ {
370
+ type: "text",
371
+ text: `Error adding link: ${message}`,
372
+ },
373
+ ],
374
+ isError: true,
375
+ };
376
+ }
377
+ });
378
+ // ---------------------------------------------------------------------------
379
+ // TOOL: get_link_graph_data
380
+ // ---------------------------------------------------------------------------
381
+ // Get data for building a link graph visualization.
382
+ // ---------------------------------------------------------------------------
383
+ server.tool("get_link_graph_data", "Get link graph data for a folder or the entire vault. " +
384
+ "Returns nodes (notes) and edges (links) for visualization.", {
385
+ folder: z
386
+ .string()
387
+ .optional()
388
+ .describe("Folder to analyze. Defaults to entire vault."),
389
+ maxNotes: z
390
+ .number()
391
+ .int()
392
+ .min(1)
393
+ .max(500)
394
+ .optional()
395
+ .default(100)
396
+ .describe("Maximum number of notes to include (default: 100)."),
397
+ }, async ({ folder, maxNotes }) => {
398
+ try {
399
+ // Get all markdown files
400
+ const allFiles = await client.listAllFiles(folder || "", 10);
401
+ const mdFiles = allFiles
402
+ .filter((f) => f.type === "file" && f.extension === "md")
403
+ .slice(0, maxNotes);
404
+ const nodes = [];
405
+ const edges = [];
406
+ const noteNames = new Set();
407
+ // Create node for each file
408
+ for (const file of mdFiles) {
409
+ const noteName = file.path.replace(/\.md$/, "");
410
+ const label = file.path.split("/").pop().replace(/\.md$/, "");
411
+ nodes.push({ id: noteName, label });
412
+ noteNames.add(noteName.toLowerCase());
413
+ }
414
+ // Extract links and create edges
415
+ for (const file of mdFiles) {
416
+ try {
417
+ const content = await client.getFile(file.path);
418
+ const links = extractInternalLinks(content);
419
+ const sourceName = file.path.replace(/\.md$/, "");
420
+ for (const link of links) {
421
+ if (!link.isEmbed) {
422
+ const target = link.target.split("#")[0];
423
+ // Only add edge if target exists in our nodes
424
+ if (noteNames.has(target.toLowerCase())) {
425
+ edges.push({
426
+ source: sourceName,
427
+ target,
428
+ });
429
+ }
430
+ }
431
+ }
432
+ }
433
+ catch {
434
+ // Skip files that can't be read
435
+ }
436
+ }
437
+ return {
438
+ content: [
439
+ {
440
+ type: "text",
441
+ text: JSON.stringify({
442
+ success: true,
443
+ folder: folder || "/",
444
+ nodeCount: nodes.length,
445
+ edgeCount: edges.length,
446
+ nodes,
447
+ edges,
448
+ }, null, 2),
449
+ },
450
+ ],
451
+ };
452
+ }
453
+ catch (error) {
454
+ const message = error instanceof ObsidianApiError ? error.message : String(error);
455
+ return {
456
+ content: [
457
+ {
458
+ type: "text",
459
+ text: `Error getting graph data: ${message}`,
460
+ },
461
+ ],
462
+ isError: true,
463
+ };
464
+ }
465
+ });
466
+ }
467
+ //# 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,18 @@
1
+ /**
2
+ * ============================================================================
3
+ * OBSIDIAN MCP - Metadata Tools
4
+ * ============================================================================
5
+ *
6
+ * Tools for managing note metadata: frontmatter, tags, aliases, and properties.
7
+ * ============================================================================
8
+ */
9
+ import { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
10
+ import { ObsidianClient } from "../utils/client.js";
11
+ /**
12
+ * Register metadata tools with the MCP server.
13
+ *
14
+ * @param server - The MCP server instance
15
+ * @param client - The Obsidian API client
16
+ */
17
+ export declare function registerMetadataTools(server: McpServer, client: ObsidianClient): void;
18
+ //# sourceMappingURL=metadata.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"metadata.d.ts","sourceRoot":"","sources":["../../src/tools/metadata.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAEpE,OAAO,EAAE,cAAc,EAAE,MAAM,oBAAoB,CAAC;AAYpD;;;;;GAKG;AACH,wBAAgB,qBAAqB,CAAC,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,cAAc,GAAG,IAAI,CAojBrF"}