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,302 @@
1
+ import { z } from "zod";
2
+ import { searchNotes, readNote, listNotes } from "../lib/vault.js";
3
+ import { parseFrontmatter, extractTags } from "../lib/markdown.js";
4
+ import { getDailyNoteConfig } from "../config.js";
5
+ export function registerReadTools(server, vaultPath) {
6
+ server.registerTool("search_notes", {
7
+ description: "Full-text search across all notes in the vault",
8
+ inputSchema: {
9
+ query: z.string().describe("Search query string"),
10
+ caseSensitive: z
11
+ .boolean()
12
+ .optional()
13
+ .default(false)
14
+ .describe("Whether the search should be case sensitive"),
15
+ maxResults: z
16
+ .number()
17
+ .optional()
18
+ .default(20)
19
+ .describe("Maximum number of results to return"),
20
+ folder: z
21
+ .string()
22
+ .optional()
23
+ .describe("Limit search to a specific folder"),
24
+ },
25
+ }, async ({ query, caseSensitive, maxResults, folder }) => {
26
+ try {
27
+ const results = await searchNotes(vaultPath, query, {
28
+ caseSensitive,
29
+ maxResults,
30
+ folder,
31
+ });
32
+ if (results.length === 0) {
33
+ return {
34
+ content: [
35
+ {
36
+ type: "text",
37
+ text: `No results found for "${query}"`,
38
+ },
39
+ ],
40
+ };
41
+ }
42
+ const lines = [
43
+ `Found ${results.length} result(s) for "${query}":`,
44
+ "",
45
+ ];
46
+ for (const result of results) {
47
+ lines.push(`## ${result.relativePath}`);
48
+ for (const match of result.matches) {
49
+ lines.push(` Line ${match.line}: ${match.content}`);
50
+ }
51
+ lines.push("");
52
+ }
53
+ return {
54
+ content: [{ type: "text", text: lines.join("\n") }],
55
+ };
56
+ }
57
+ catch (err) {
58
+ console.error("search_notes error:", err);
59
+ return {
60
+ content: [
61
+ {
62
+ type: "text",
63
+ text: `Error searching notes: ${err instanceof Error ? err.message : String(err)}`,
64
+ },
65
+ ],
66
+ };
67
+ }
68
+ });
69
+ server.registerTool("get_note", {
70
+ description: "Read the full content of a note by its path",
71
+ inputSchema: {
72
+ path: z
73
+ .string()
74
+ .describe("Relative path to the note within the vault"),
75
+ },
76
+ }, async ({ path: notePath }) => {
77
+ try {
78
+ const content = await readNote(vaultPath, notePath);
79
+ const { data: frontmatterData } = parseFrontmatter(content);
80
+ const header = [];
81
+ if (Object.keys(frontmatterData).length > 0) {
82
+ header.push("--- Frontmatter ---");
83
+ for (const [key, value] of Object.entries(frontmatterData)) {
84
+ header.push(`${key}: ${JSON.stringify(value)}`);
85
+ }
86
+ header.push("--- End Frontmatter ---");
87
+ header.push("");
88
+ }
89
+ const tags = extractTags(content);
90
+ if (tags.length > 0) {
91
+ header.push(`Tags: ${tags.join(", ")}`);
92
+ header.push("");
93
+ }
94
+ return {
95
+ content: [
96
+ {
97
+ type: "text",
98
+ text: header.length > 0
99
+ ? header.join("\n") + content
100
+ : content,
101
+ },
102
+ ],
103
+ };
104
+ }
105
+ catch (err) {
106
+ console.error("get_note error:", err);
107
+ return {
108
+ content: [
109
+ {
110
+ type: "text",
111
+ text: `Error reading note: ${err instanceof Error ? err.message : String(err)}`,
112
+ },
113
+ ],
114
+ };
115
+ }
116
+ });
117
+ server.registerTool("list_notes", {
118
+ description: "List all notes in the vault or a specific folder",
119
+ inputSchema: {
120
+ folder: z
121
+ .string()
122
+ .optional()
123
+ .describe("Folder to list notes from (omit for entire vault)"),
124
+ limit: z
125
+ .number()
126
+ .optional()
127
+ .default(50)
128
+ .describe("Maximum number of notes to return"),
129
+ },
130
+ }, async ({ folder, limit }) => {
131
+ try {
132
+ const notes = await listNotes(vaultPath, folder);
133
+ const limited = notes.slice(0, limit);
134
+ const totalCount = notes.length;
135
+ const lines = [
136
+ `Found ${totalCount} note(s)${folder ? ` in "${folder}"` : ""}${totalCount > limit ? ` (showing first ${limit})` : ""}:`,
137
+ "",
138
+ ...limited,
139
+ ];
140
+ return {
141
+ content: [{ type: "text", text: lines.join("\n") }],
142
+ };
143
+ }
144
+ catch (err) {
145
+ console.error("list_notes error:", err);
146
+ return {
147
+ content: [
148
+ {
149
+ type: "text",
150
+ text: `Error listing notes: ${err instanceof Error ? err.message : String(err)}`,
151
+ },
152
+ ],
153
+ };
154
+ }
155
+ });
156
+ server.registerTool("get_daily_note", {
157
+ description: "Get today's daily note or a specific date's daily note",
158
+ inputSchema: {
159
+ date: z
160
+ .string()
161
+ .optional()
162
+ .describe("Date in YYYY-MM-DD format (defaults to today)"),
163
+ },
164
+ }, async ({ date }) => {
165
+ try {
166
+ const config = getDailyNoteConfig(vaultPath);
167
+ const targetDate = date ?? new Date().toISOString().slice(0, 10);
168
+ // Build the filename from the configured format
169
+ // Replace common date tokens with actual date parts
170
+ const [year, month, day] = targetDate.split("-");
171
+ let filename = config.format
172
+ .replace("YYYY", year)
173
+ .replace("MM", month)
174
+ .replace("DD", day);
175
+ if (!filename.endsWith(".md")) {
176
+ filename += ".md";
177
+ }
178
+ const notePath = config.folder
179
+ ? `${config.folder}/${filename}`
180
+ : filename;
181
+ let content;
182
+ try {
183
+ content = await readNote(vaultPath, notePath);
184
+ }
185
+ catch {
186
+ return {
187
+ content: [
188
+ {
189
+ type: "text",
190
+ text: `Daily note not found for ${targetDate} (expected at "${notePath}")`,
191
+ },
192
+ ],
193
+ };
194
+ }
195
+ const { data: dailyFrontmatter } = parseFrontmatter(content);
196
+ const header = [
197
+ `Daily Note: ${targetDate}`,
198
+ `Path: ${notePath}`,
199
+ "",
200
+ ];
201
+ if (Object.keys(dailyFrontmatter).length > 0) {
202
+ header.push("--- Frontmatter ---");
203
+ for (const [key, value] of Object.entries(dailyFrontmatter)) {
204
+ header.push(`${key}: ${JSON.stringify(value)}`);
205
+ }
206
+ header.push("--- End Frontmatter ---");
207
+ header.push("");
208
+ }
209
+ return {
210
+ content: [
211
+ { type: "text", text: header.join("\n") + content },
212
+ ],
213
+ };
214
+ }
215
+ catch (err) {
216
+ console.error("get_daily_note error:", err);
217
+ return {
218
+ content: [
219
+ {
220
+ type: "text",
221
+ text: `Error reading daily note: ${err instanceof Error ? err.message : String(err)}`,
222
+ },
223
+ ],
224
+ };
225
+ }
226
+ });
227
+ server.registerTool("search_by_frontmatter", {
228
+ description: "Search notes by frontmatter property values",
229
+ inputSchema: {
230
+ property: z
231
+ .string()
232
+ .describe("Frontmatter property key to search for"),
233
+ value: z.string().describe("Value to match against the property"),
234
+ folder: z
235
+ .string()
236
+ .optional()
237
+ .describe("Limit search to a specific folder"),
238
+ },
239
+ }, async ({ property, value, folder }) => {
240
+ try {
241
+ const notes = await listNotes(vaultPath, folder);
242
+ const matches = [];
243
+ for (const notePath of notes) {
244
+ let content;
245
+ try {
246
+ content = await readNote(vaultPath, notePath);
247
+ }
248
+ catch {
249
+ console.error(`Failed to read note during frontmatter search: ${notePath}`);
250
+ continue;
251
+ }
252
+ const { data: frontmatterData } = parseFrontmatter(content);
253
+ const propValue = frontmatterData[property];
254
+ if (propValue === undefined)
255
+ continue;
256
+ const stringified = Array.isArray(propValue)
257
+ ? propValue.map(String)
258
+ : [String(propValue)];
259
+ const isMatch = stringified.some((v) => v.toLowerCase() === value.toLowerCase());
260
+ if (isMatch) {
261
+ matches.push({ path: notePath, frontmatter: frontmatterData });
262
+ }
263
+ }
264
+ if (matches.length === 0) {
265
+ return {
266
+ content: [
267
+ {
268
+ type: "text",
269
+ text: `No notes found with frontmatter "${property}" matching "${value}"`,
270
+ },
271
+ ],
272
+ };
273
+ }
274
+ const lines = [
275
+ `Found ${matches.length} note(s) where "${property}" matches "${value}":`,
276
+ "",
277
+ ];
278
+ for (const match of matches) {
279
+ lines.push(`## ${match.path}`);
280
+ for (const [key, val] of Object.entries(match.frontmatter)) {
281
+ lines.push(` ${key}: ${JSON.stringify(val)}`);
282
+ }
283
+ lines.push("");
284
+ }
285
+ return {
286
+ content: [{ type: "text", text: lines.join("\n") }],
287
+ };
288
+ }
289
+ catch (err) {
290
+ console.error("search_by_frontmatter error:", err);
291
+ return {
292
+ content: [
293
+ {
294
+ type: "text",
295
+ text: `Error searching by frontmatter: ${err instanceof Error ? err.message : String(err)}`,
296
+ },
297
+ ],
298
+ };
299
+ }
300
+ });
301
+ }
302
+ //# sourceMappingURL=read.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"read.js","sourceRoot":"","sources":["../../src/tools/read.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ import { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
2
+ export declare function registerTagTools(server: McpServer, vaultPath: string): void;
3
+ //# sourceMappingURL=tags.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tags.d.ts","sourceRoot":"","sources":["../../src/tools/tags.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAMpE,wBAAgB,gBAAgB,CAAC,MAAM,EAAE,SAAS,EAAE,SAAS,EAAE,MAAM,GAAG,IAAI,CA8J3E"}
@@ -0,0 +1,146 @@
1
+ import { z } from "zod";
2
+ import { listNotes, readNote } from "../lib/vault.js";
3
+ import { extractTags } from "../lib/markdown.js";
4
+ export function registerTagTools(server, vaultPath) {
5
+ server.registerTool("get_tags", {
6
+ description: "List all tags used in the vault with their usage counts",
7
+ inputSchema: {
8
+ sortBy: z
9
+ .enum(["count", "name"])
10
+ .optional()
11
+ .default("count")
12
+ .describe("Sort tags by usage count (descending) or name (alphabetical)"),
13
+ },
14
+ }, async ({ sortBy }) => {
15
+ try {
16
+ const notes = await listNotes(vaultPath);
17
+ const tagMap = new Map();
18
+ for (const notePath of notes) {
19
+ let content;
20
+ try {
21
+ content = await readNote(vaultPath, notePath);
22
+ }
23
+ catch (err) {
24
+ console.error(`Failed to read note for tag extraction: ${notePath}`, err);
25
+ continue;
26
+ }
27
+ const tags = extractTags(content);
28
+ for (const tag of tags) {
29
+ const normalizedTag = tag.toLowerCase();
30
+ const existing = tagMap.get(normalizedTag);
31
+ if (existing) {
32
+ existing.count++;
33
+ if (!existing.files.includes(notePath)) {
34
+ existing.files.push(notePath);
35
+ }
36
+ }
37
+ else {
38
+ tagMap.set(normalizedTag, {
39
+ tag: normalizedTag,
40
+ count: 1,
41
+ files: [notePath],
42
+ });
43
+ }
44
+ }
45
+ }
46
+ const tagInfos = Array.from(tagMap.values());
47
+ if (sortBy === "name") {
48
+ tagInfos.sort((a, b) => a.tag.localeCompare(b.tag));
49
+ }
50
+ else {
51
+ tagInfos.sort((a, b) => b.count - a.count || a.tag.localeCompare(b.tag));
52
+ }
53
+ const lines = [];
54
+ lines.push(`Total unique tags: ${tagInfos.length}`);
55
+ lines.push("");
56
+ for (const info of tagInfos) {
57
+ lines.push(`#${info.tag} (${info.count} ${info.count === 1 ? "note" : "notes"})`);
58
+ }
59
+ return {
60
+ content: [{ type: "text", text: lines.join("\n") }],
61
+ };
62
+ }
63
+ catch (err) {
64
+ console.error("Error in get_tags:", err);
65
+ return {
66
+ content: [
67
+ {
68
+ type: "text",
69
+ text: `Error listing tags: ${err instanceof Error ? err.message : String(err)}`,
70
+ },
71
+ ],
72
+ };
73
+ }
74
+ });
75
+ server.registerTool("search_by_tag", {
76
+ description: "Find all notes that contain a specific tag",
77
+ inputSchema: {
78
+ tag: z.string().describe("Tag to search for (with or without # prefix)"),
79
+ includeContent: z
80
+ .boolean()
81
+ .optional()
82
+ .default(false)
83
+ .describe("If true, include first 200 characters of note content as a preview"),
84
+ },
85
+ }, async ({ tag, includeContent }) => {
86
+ try {
87
+ const searchTag = tag.replace(/^#/, "").toLowerCase();
88
+ const notes = await listNotes(vaultPath);
89
+ const matchingNotes = [];
90
+ for (const notePath of notes) {
91
+ let content;
92
+ try {
93
+ content = await readNote(vaultPath, notePath);
94
+ }
95
+ catch (err) {
96
+ console.error(`Failed to read note for tag search: ${notePath}`, err);
97
+ continue;
98
+ }
99
+ const tags = extractTags(content);
100
+ const hasMatch = tags.some((t) => {
101
+ const normalized = t.toLowerCase();
102
+ return normalized === searchTag || normalized.startsWith(`${searchTag}/`);
103
+ });
104
+ if (hasMatch) {
105
+ const entry = { path: notePath };
106
+ if (includeContent) {
107
+ entry.preview = content.slice(0, 200).trim();
108
+ }
109
+ matchingNotes.push(entry);
110
+ }
111
+ }
112
+ if (matchingNotes.length === 0) {
113
+ return {
114
+ content: [
115
+ { type: "text", text: `No notes found with tag #${searchTag}` },
116
+ ],
117
+ };
118
+ }
119
+ const lines = [];
120
+ lines.push(`Found ${matchingNotes.length} ${matchingNotes.length === 1 ? "note" : "notes"} with tag #${searchTag}`);
121
+ lines.push("");
122
+ for (const note of matchingNotes) {
123
+ lines.push(`- ${note.path}`);
124
+ if (note.preview) {
125
+ lines.push(` ${note.preview}`);
126
+ lines.push("");
127
+ }
128
+ }
129
+ return {
130
+ content: [{ type: "text", text: lines.join("\n") }],
131
+ };
132
+ }
133
+ catch (err) {
134
+ console.error("Error in search_by_tag:", err);
135
+ return {
136
+ content: [
137
+ {
138
+ type: "text",
139
+ text: `Error searching by tag: ${err instanceof Error ? err.message : String(err)}`,
140
+ },
141
+ ],
142
+ };
143
+ }
144
+ });
145
+ }
146
+ //# sourceMappingURL=tags.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tags.js","sourceRoot":"","sources":["../../src/tools/tags.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ import { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
2
+ export declare function registerWriteTools(server: McpServer, vaultPath: string): void;
3
+ //# sourceMappingURL=write.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"write.d.ts","sourceRoot":"","sources":["../../src/tools/write.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAyDpE,wBAAgB,kBAAkB,CAAC,MAAM,EAAE,SAAS,EAAE,SAAS,EAAE,MAAM,GAAG,IAAI,CAyO7E"}