@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,581 @@
1
+ /**
2
+ * ============================================================================
3
+ * OBSIDIAN MCP - Template Tools
4
+ * ============================================================================
5
+ *
6
+ * Tools for working with note templates and creating structured notes.
7
+ * ============================================================================
8
+ */
9
+ import { z } from "zod";
10
+ import { ObsidianApiError } from "../types/obsidian.js";
11
+ import { formatDate } from "../utils/markdown.js";
12
+ /**
13
+ * Register template tools with the MCP server.
14
+ *
15
+ * @param server - The MCP server instance
16
+ * @param client - The Obsidian API client
17
+ */
18
+ export function registerTemplateTools(server, client) {
19
+ // ---------------------------------------------------------------------------
20
+ // TOOL: create_note_from_template
21
+ // ---------------------------------------------------------------------------
22
+ // Create a note using a built-in template.
23
+ // ---------------------------------------------------------------------------
24
+ server.tool("create_note_from_template", "Create a new note using a built-in template. " +
25
+ "Available templates: meeting, project, book, article, person, recipe, decision.", {
26
+ template: z
27
+ .enum(["meeting", "project", "book", "article", "person", "recipe", "decision"])
28
+ .describe("Template to use."),
29
+ title: z.string().describe("Title for the new note."),
30
+ folder: z.string().optional().describe("Folder to create the note in."),
31
+ customFields: z
32
+ .record(z.string())
33
+ .optional()
34
+ .describe("Custom fields to include in frontmatter."),
35
+ }, async ({ template, title, folder, customFields }) => {
36
+ try {
37
+ const templates = getTemplates();
38
+ const selectedTemplate = templates[template];
39
+ if (!selectedTemplate) {
40
+ return {
41
+ content: [
42
+ {
43
+ type: "text",
44
+ text: `Template "${template}" not found.`,
45
+ },
46
+ ],
47
+ isError: true,
48
+ };
49
+ }
50
+ // Generate filename
51
+ const sanitizedTitle = title.replace(/[\\/:*?"<>|]/g, "-");
52
+ const filePath = folder
53
+ ? `${folder}/${sanitizedTitle}.md`
54
+ : `${sanitizedTitle}.md`;
55
+ // Build frontmatter
56
+ const now = new Date();
57
+ const frontmatter = {
58
+ title,
59
+ created: now.toISOString(),
60
+ tags: selectedTemplate.tags,
61
+ ...selectedTemplate.frontmatter,
62
+ ...customFields,
63
+ };
64
+ // Process content with variable substitution
65
+ const content = processTemplate(selectedTemplate.content, {
66
+ title,
67
+ date: formatDate(now),
68
+ datetime: now.toISOString(),
69
+ });
70
+ await client.createNote(filePath, content, frontmatter);
71
+ return {
72
+ content: [
73
+ {
74
+ type: "text",
75
+ text: JSON.stringify({
76
+ success: true,
77
+ message: `Note created from "${template}" template`,
78
+ path: filePath,
79
+ template,
80
+ }, null, 2),
81
+ },
82
+ ],
83
+ };
84
+ }
85
+ catch (error) {
86
+ const message = error instanceof ObsidianApiError ? error.message : String(error);
87
+ return {
88
+ content: [
89
+ {
90
+ type: "text",
91
+ text: `Error creating note from template: ${message}`,
92
+ },
93
+ ],
94
+ isError: true,
95
+ };
96
+ }
97
+ });
98
+ // ---------------------------------------------------------------------------
99
+ // TOOL: create_meeting_note
100
+ // ---------------------------------------------------------------------------
101
+ // Specialized tool for creating meeting notes.
102
+ // ---------------------------------------------------------------------------
103
+ server.tool("create_meeting_note", "Create a structured meeting note with attendees, agenda, and action items.", {
104
+ title: z.string().describe("Meeting title."),
105
+ attendees: z.array(z.string()).optional().describe("List of attendees."),
106
+ agenda: z.array(z.string()).optional().describe("Meeting agenda items."),
107
+ date: z
108
+ .string()
109
+ .optional()
110
+ .describe("Meeting date (ISO format). Defaults to today."),
111
+ folder: z
112
+ .string()
113
+ .optional()
114
+ .default("Meetings")
115
+ .describe("Folder for meeting notes."),
116
+ }, async ({ title, attendees, agenda, date, folder }) => {
117
+ try {
118
+ const meetingDate = date ? new Date(date) : new Date();
119
+ const dateStr = formatDate(meetingDate);
120
+ // Generate filename with date
121
+ const sanitizedTitle = title.replace(/[\\/:*?"<>|]/g, "-");
122
+ const filePath = `${folder}/${dateStr} - ${sanitizedTitle}.md`;
123
+ // Build frontmatter
124
+ const frontmatter = {
125
+ title,
126
+ created: new Date().toISOString(),
127
+ date: dateStr,
128
+ tags: ["meeting"],
129
+ attendees: attendees || [],
130
+ };
131
+ // Build content
132
+ const lines = [];
133
+ lines.push(`# ${title}`);
134
+ lines.push("");
135
+ lines.push(`**Date:** ${dateStr}`);
136
+ lines.push("");
137
+ if (attendees && attendees.length > 0) {
138
+ lines.push("## Attendees");
139
+ for (const attendee of attendees) {
140
+ lines.push(`- ${attendee}`);
141
+ }
142
+ lines.push("");
143
+ }
144
+ if (agenda && agenda.length > 0) {
145
+ lines.push("## Agenda");
146
+ for (const item of agenda) {
147
+ lines.push(`- [ ] ${item}`);
148
+ }
149
+ lines.push("");
150
+ }
151
+ lines.push("## Notes");
152
+ lines.push("");
153
+ lines.push("(Meeting notes go here)");
154
+ lines.push("");
155
+ lines.push("## Action Items");
156
+ lines.push("");
157
+ lines.push("- [ ] ");
158
+ lines.push("");
159
+ lines.push("## Follow-up");
160
+ lines.push("");
161
+ lines.push("(Next steps and follow-up items)");
162
+ const content = lines.join("\n");
163
+ await client.createNote(filePath, content, frontmatter);
164
+ return {
165
+ content: [
166
+ {
167
+ type: "text",
168
+ text: JSON.stringify({
169
+ success: true,
170
+ message: "Meeting note created",
171
+ path: filePath,
172
+ date: dateStr,
173
+ attendees: attendees || [],
174
+ agendaItems: agenda?.length || 0,
175
+ }, null, 2),
176
+ },
177
+ ],
178
+ };
179
+ }
180
+ catch (error) {
181
+ const message = error instanceof ObsidianApiError ? error.message : String(error);
182
+ return {
183
+ content: [
184
+ {
185
+ type: "text",
186
+ text: `Error creating meeting note: ${message}`,
187
+ },
188
+ ],
189
+ isError: true,
190
+ };
191
+ }
192
+ });
193
+ // ---------------------------------------------------------------------------
194
+ // TOOL: create_project_note
195
+ // ---------------------------------------------------------------------------
196
+ // Specialized tool for creating project notes.
197
+ // ---------------------------------------------------------------------------
198
+ server.tool("create_project_note", "Create a structured project note with goals, tasks, and timeline.", {
199
+ title: z.string().describe("Project name."),
200
+ description: z.string().optional().describe("Project description."),
201
+ goals: z.array(z.string()).optional().describe("Project goals."),
202
+ status: z
203
+ .enum(["planning", "active", "on-hold", "completed", "cancelled"])
204
+ .optional()
205
+ .default("planning")
206
+ .describe("Project status."),
207
+ dueDate: z.string().optional().describe("Due date (ISO format)."),
208
+ folder: z
209
+ .string()
210
+ .optional()
211
+ .default("Projects")
212
+ .describe("Folder for project notes."),
213
+ }, async ({ title, description, goals, status, dueDate, folder }) => {
214
+ try {
215
+ const sanitizedTitle = title.replace(/[\\/:*?"<>|]/g, "-");
216
+ const filePath = `${folder}/${sanitizedTitle}.md`;
217
+ // Build frontmatter
218
+ const frontmatter = {
219
+ title,
220
+ created: new Date().toISOString(),
221
+ tags: ["project", status || "planning"],
222
+ status: status || "planning",
223
+ };
224
+ if (dueDate) {
225
+ frontmatter.due = dueDate;
226
+ }
227
+ // Build content
228
+ const lines = [];
229
+ lines.push(`# ${title}`);
230
+ lines.push("");
231
+ if (description) {
232
+ lines.push("## Overview");
233
+ lines.push("");
234
+ lines.push(description);
235
+ lines.push("");
236
+ }
237
+ lines.push("## Status");
238
+ lines.push("");
239
+ lines.push(`**Status:** ${status || "planning"}`);
240
+ if (dueDate) {
241
+ lines.push(`**Due Date:** ${dueDate}`);
242
+ }
243
+ lines.push("");
244
+ if (goals && goals.length > 0) {
245
+ lines.push("## Goals");
246
+ for (const goal of goals) {
247
+ lines.push(`- [ ] ${goal}`);
248
+ }
249
+ lines.push("");
250
+ }
251
+ lines.push("## Tasks");
252
+ lines.push("");
253
+ lines.push("### To Do");
254
+ lines.push("- [ ] ");
255
+ lines.push("");
256
+ lines.push("### In Progress");
257
+ lines.push("");
258
+ lines.push("### Done");
259
+ lines.push("");
260
+ lines.push("## Resources");
261
+ lines.push("");
262
+ lines.push("(Links to related resources)");
263
+ lines.push("");
264
+ lines.push("## Notes");
265
+ lines.push("");
266
+ lines.push("(Project notes and updates)");
267
+ lines.push("");
268
+ lines.push("## Log");
269
+ lines.push("");
270
+ lines.push(`- ${formatDate(new Date())}: Project created`);
271
+ const content = lines.join("\n");
272
+ await client.createNote(filePath, content, frontmatter);
273
+ return {
274
+ content: [
275
+ {
276
+ type: "text",
277
+ text: JSON.stringify({
278
+ success: true,
279
+ message: "Project note created",
280
+ path: filePath,
281
+ status,
282
+ goals: goals?.length || 0,
283
+ }, null, 2),
284
+ },
285
+ ],
286
+ };
287
+ }
288
+ catch (error) {
289
+ const message = error instanceof ObsidianApiError ? error.message : String(error);
290
+ return {
291
+ content: [
292
+ {
293
+ type: "text",
294
+ text: `Error creating project note: ${message}`,
295
+ },
296
+ ],
297
+ isError: true,
298
+ };
299
+ }
300
+ });
301
+ // ---------------------------------------------------------------------------
302
+ // TOOL: list_templates
303
+ // ---------------------------------------------------------------------------
304
+ // List available templates.
305
+ // ---------------------------------------------------------------------------
306
+ server.tool("list_templates", "List all available built-in templates and their descriptions.", {}, async () => {
307
+ const templates = getTemplates();
308
+ const templateInfo = Object.entries(templates).map(([name, template]) => ({
309
+ name,
310
+ description: template.description,
311
+ tags: template.tags,
312
+ }));
313
+ return {
314
+ content: [
315
+ {
316
+ type: "text",
317
+ text: JSON.stringify({
318
+ success: true,
319
+ templates: templateInfo,
320
+ }, null, 2),
321
+ },
322
+ ],
323
+ };
324
+ });
325
+ }
326
+ function getTemplates() {
327
+ return {
328
+ meeting: {
329
+ description: "Template for meeting notes with attendees and action items",
330
+ tags: ["meeting"],
331
+ content: `# {{title}}
332
+
333
+ ## Attendees
334
+
335
+ -
336
+
337
+ ## Agenda
338
+
339
+ - [ ]
340
+
341
+ ## Notes
342
+
343
+
344
+
345
+ ## Action Items
346
+
347
+ - [ ]
348
+
349
+ ## Follow-up
350
+
351
+ `,
352
+ },
353
+ project: {
354
+ description: "Template for project planning and tracking",
355
+ tags: ["project"],
356
+ frontmatter: { status: "planning" },
357
+ content: `# {{title}}
358
+
359
+ ## Overview
360
+
361
+
362
+
363
+ ## Goals
364
+
365
+ - [ ]
366
+
367
+ ## Tasks
368
+
369
+ ### To Do
370
+
371
+ - [ ]
372
+
373
+ ### In Progress
374
+
375
+
376
+
377
+ ### Done
378
+
379
+
380
+
381
+ ## Resources
382
+
383
+
384
+
385
+ ## Notes
386
+
387
+
388
+
389
+ ## Log
390
+
391
+ - {{date}}: Project created
392
+ `,
393
+ },
394
+ book: {
395
+ description: "Template for book notes and summaries",
396
+ tags: ["book", "reading"],
397
+ frontmatter: { type: "book", rating: 0 },
398
+ content: `# {{title}}
399
+
400
+ ## Book Information
401
+
402
+ - **Author:**
403
+ - **Published:**
404
+ - **Genre:**
405
+ - **Pages:**
406
+
407
+ ## Summary
408
+
409
+
410
+
411
+ ## Key Takeaways
412
+
413
+ 1.
414
+ 2.
415
+ 3.
416
+
417
+ ## Quotes
418
+
419
+ >
420
+
421
+ ## Notes
422
+
423
+
424
+
425
+ ## Related Books
426
+
427
+ -
428
+ `,
429
+ },
430
+ article: {
431
+ description: "Template for article notes and highlights",
432
+ tags: ["article", "reading"],
433
+ frontmatter: { type: "article" },
434
+ content: `# {{title}}
435
+
436
+ ## Article Information
437
+
438
+ - **Author:**
439
+ - **Source:**
440
+ - **Date Read:** {{date}}
441
+ - **URL:**
442
+
443
+ ## Summary
444
+
445
+
446
+
447
+ ## Key Points
448
+
449
+ -
450
+
451
+ ## Highlights
452
+
453
+ >
454
+
455
+ ## My Thoughts
456
+
457
+
458
+
459
+ ## Related
460
+
461
+ -
462
+ `,
463
+ },
464
+ person: {
465
+ description: "Template for people notes (contacts, colleagues)",
466
+ tags: ["person", "contact"],
467
+ frontmatter: { type: "person" },
468
+ content: `# {{title}}
469
+
470
+ ## Contact Information
471
+
472
+ - **Email:**
473
+ - **Phone:**
474
+ - **Location:**
475
+ - **Company:**
476
+ - **Role:**
477
+
478
+ ## How We Met
479
+
480
+
481
+
482
+ ## Notes
483
+
484
+
485
+
486
+ ## Interactions
487
+
488
+ - {{date}}:
489
+
490
+ ## Related People
491
+
492
+ -
493
+ `,
494
+ },
495
+ recipe: {
496
+ description: "Template for recipes",
497
+ tags: ["recipe", "cooking"],
498
+ frontmatter: { type: "recipe" },
499
+ content: `# {{title}}
500
+
501
+ ## Information
502
+
503
+ - **Prep Time:**
504
+ - **Cook Time:**
505
+ - **Servings:**
506
+ - **Difficulty:**
507
+
508
+ ## Ingredients
509
+
510
+ -
511
+
512
+ ## Instructions
513
+
514
+ 1.
515
+
516
+ ## Notes
517
+
518
+
519
+
520
+ ## Variations
521
+
522
+ -
523
+
524
+ ## Source
525
+
526
+ `,
527
+ },
528
+ decision: {
529
+ description: "Template for decision documentation (ADR style)",
530
+ tags: ["decision", "adr"],
531
+ frontmatter: { type: "decision", status: "proposed" },
532
+ content: `# {{title}}
533
+
534
+ ## Status
535
+
536
+ Proposed | {{date}}
537
+
538
+ ## Context
539
+
540
+ What is the issue that we're seeing that is motivating this decision?
541
+
542
+ ## Decision
543
+
544
+ What is the change that we're proposing and/or doing?
545
+
546
+ ## Consequences
547
+
548
+ What becomes easier or more difficult to do because of this change?
549
+
550
+ ### Positive
551
+
552
+ -
553
+
554
+ ### Negative
555
+
556
+ -
557
+
558
+ ## Alternatives Considered
559
+
560
+ 1. **Alternative 1**
561
+ - Pros:
562
+ - Cons:
563
+
564
+ ## Related Decisions
565
+
566
+ -
567
+ `,
568
+ },
569
+ };
570
+ }
571
+ /**
572
+ * Process template content with variable substitution.
573
+ */
574
+ function processTemplate(content, variables) {
575
+ let result = content;
576
+ for (const [key, value] of Object.entries(variables)) {
577
+ result = result.replace(new RegExp(`{{${key}}}`, "g"), value);
578
+ }
579
+ return result;
580
+ }
581
+ //# sourceMappingURL=templates.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"templates.js","sourceRoot":"","sources":["../../src/tools/templates.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,19 @@
1
+ /**
2
+ * ============================================================================
3
+ * OBSIDIAN MCP - Vault Tools
4
+ * ============================================================================
5
+ *
6
+ * Tools for exploring and managing the Obsidian vault structure.
7
+ * Includes listing files/folders, getting vault statistics, and file operations.
8
+ * ============================================================================
9
+ */
10
+ import { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
11
+ import { ObsidianClient } from "../utils/client.js";
12
+ /**
13
+ * Register vault-related 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 registerVaultTools(server: McpServer, client: ObsidianClient): void;
19
+ //# sourceMappingURL=vault.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"vault.d.ts","sourceRoot":"","sources":["../../src/tools/vault.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAEpE,OAAO,EAAE,cAAc,EAAE,MAAM,oBAAoB,CAAC;AAGpD;;;;;GAKG;AACH,wBAAgB,kBAAkB,CAAC,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,cAAc,GAAG,IAAI,CAqblF"}