obsidian-mcp-server 3.5.2 → 3.5.4
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/AGENTS.md +55 -17
- package/CLAUDE.md +55 -17
- package/Dockerfile +3 -2
- package/README.md +145 -102
- package/changelog/3.5.x/3.5.3.md +27 -0
- package/changelog/3.5.x/3.5.4.md +42 -0
- package/changelog/template.md +9 -26
- package/dist/config/server-config.d.ts +2 -2
- package/dist/config/server-config.d.ts.map +1 -1
- package/dist/config/server-config.js +12 -5
- package/dist/config/server-config.js.map +1 -1
- package/dist/index.js +9 -0
- package/dist/index.js.map +1 -1
- package/dist/mcp-server/resources/definitions/obsidian-vault-note.resource.d.ts.map +1 -1
- package/dist/mcp-server/resources/definitions/obsidian-vault-note.resource.js +19 -1
- package/dist/mcp-server/resources/definitions/obsidian-vault-note.resource.js.map +1 -1
- package/dist/mcp-server/tools/definitions/index.d.ts +94 -2
- package/dist/mcp-server/tools/definitions/index.d.ts.map +1 -1
- package/dist/mcp-server/tools/definitions/obsidian-append-to-note.tool.d.ts +11 -0
- package/dist/mcp-server/tools/definitions/obsidian-append-to-note.tool.d.ts.map +1 -1
- package/dist/mcp-server/tools/definitions/obsidian-append-to-note.tool.js +11 -0
- package/dist/mcp-server/tools/definitions/obsidian-append-to-note.tool.js.map +1 -1
- package/dist/mcp-server/tools/definitions/obsidian-delete-note.tool.d.ts +9 -0
- package/dist/mcp-server/tools/definitions/obsidian-delete-note.tool.d.ts.map +1 -1
- package/dist/mcp-server/tools/definitions/obsidian-delete-note.tool.js +9 -0
- package/dist/mcp-server/tools/definitions/obsidian-delete-note.tool.js.map +1 -1
- package/dist/mcp-server/tools/definitions/obsidian-execute-command.tool.d.ts +1 -0
- package/dist/mcp-server/tools/definitions/obsidian-execute-command.tool.d.ts.map +1 -1
- package/dist/mcp-server/tools/definitions/obsidian-execute-command.tool.js +1 -0
- package/dist/mcp-server/tools/definitions/obsidian-execute-command.tool.js.map +1 -1
- package/dist/mcp-server/tools/definitions/obsidian-get-note.tool.d.ts +9 -0
- package/dist/mcp-server/tools/definitions/obsidian-get-note.tool.d.ts.map +1 -1
- package/dist/mcp-server/tools/definitions/obsidian-get-note.tool.js +15 -23
- package/dist/mcp-server/tools/definitions/obsidian-get-note.tool.js.map +1 -1
- package/dist/mcp-server/tools/definitions/obsidian-list-notes.tool.d.ts +3 -0
- package/dist/mcp-server/tools/definitions/obsidian-list-notes.tool.d.ts.map +1 -1
- package/dist/mcp-server/tools/definitions/obsidian-list-notes.tool.js +3 -0
- package/dist/mcp-server/tools/definitions/obsidian-list-notes.tool.js.map +1 -1
- package/dist/mcp-server/tools/definitions/obsidian-manage-frontmatter.tool.d.ts +13 -0
- package/dist/mcp-server/tools/definitions/obsidian-manage-frontmatter.tool.d.ts.map +1 -1
- package/dist/mcp-server/tools/definitions/obsidian-manage-frontmatter.tool.js +19 -1
- package/dist/mcp-server/tools/definitions/obsidian-manage-frontmatter.tool.js.map +1 -1
- package/dist/mcp-server/tools/definitions/obsidian-manage-tags.tool.d.ts +13 -0
- package/dist/mcp-server/tools/definitions/obsidian-manage-tags.tool.d.ts.map +1 -1
- package/dist/mcp-server/tools/definitions/obsidian-manage-tags.tool.js +17 -0
- package/dist/mcp-server/tools/definitions/obsidian-manage-tags.tool.js.map +1 -1
- package/dist/mcp-server/tools/definitions/obsidian-open-in-ui.tool.d.ts +4 -0
- package/dist/mcp-server/tools/definitions/obsidian-open-in-ui.tool.d.ts.map +1 -1
- package/dist/mcp-server/tools/definitions/obsidian-open-in-ui.tool.js +4 -0
- package/dist/mcp-server/tools/definitions/obsidian-open-in-ui.tool.js.map +1 -1
- package/dist/mcp-server/tools/definitions/obsidian-patch-note.tool.d.ts +11 -0
- package/dist/mcp-server/tools/definitions/obsidian-patch-note.tool.d.ts.map +1 -1
- package/dist/mcp-server/tools/definitions/obsidian-patch-note.tool.js +11 -0
- package/dist/mcp-server/tools/definitions/obsidian-patch-note.tool.js.map +1 -1
- package/dist/mcp-server/tools/definitions/obsidian-replace-in-note.tool.d.ts +10 -2
- package/dist/mcp-server/tools/definitions/obsidian-replace-in-note.tool.d.ts.map +1 -1
- package/dist/mcp-server/tools/definitions/obsidian-replace-in-note.tool.js +10 -2
- package/dist/mcp-server/tools/definitions/obsidian-replace-in-note.tool.js.map +1 -1
- package/dist/mcp-server/tools/definitions/obsidian-search-notes.tool.d.ts +6 -0
- package/dist/mcp-server/tools/definitions/obsidian-search-notes.tool.d.ts.map +1 -1
- package/dist/mcp-server/tools/definitions/obsidian-search-notes.tool.js +3 -0
- package/dist/mcp-server/tools/definitions/obsidian-search-notes.tool.js.map +1 -1
- package/dist/mcp-server/tools/definitions/obsidian-write-note.tool.d.ts +10 -0
- package/dist/mcp-server/tools/definitions/obsidian-write-note.tool.d.ts.map +1 -1
- package/dist/mcp-server/tools/definitions/obsidian-write-note.tool.js +10 -0
- package/dist/mcp-server/tools/definitions/obsidian-write-note.tool.js.map +1 -1
- package/dist/services/obsidian/frontmatter-ops.d.ts +38 -7
- package/dist/services/obsidian/frontmatter-ops.d.ts.map +1 -1
- package/dist/services/obsidian/frontmatter-ops.js +176 -53
- package/dist/services/obsidian/frontmatter-ops.js.map +1 -1
- package/dist/services/obsidian/obsidian-service.d.ts +17 -0
- package/dist/services/obsidian/obsidian-service.d.ts.map +1 -1
- package/dist/services/obsidian/obsidian-service.js +82 -24
- package/dist/services/obsidian/obsidian-service.js.map +1 -1
- package/manifest.json +11 -11
- package/package.json +12 -11
- package/server.json +3 -3
|
@@ -107,36 +107,43 @@ export declare const readToolDefinitions: (import("@cyanheads/mcp-ts-core").Tool
|
|
|
107
107
|
readonly recovery: "Pass `section: { type, target }` (e.g. `{ type: \"heading\", target: \"Intro\" }`), or use `format: \"full\"` / `\"document-map\"` instead.";
|
|
108
108
|
}, {
|
|
109
109
|
readonly reason: "path_forbidden";
|
|
110
|
+
readonly thrownBy: "service";
|
|
110
111
|
readonly code: import("@cyanheads/mcp-ts-core/errors").JsonRpcErrorCode.Forbidden;
|
|
111
112
|
readonly when: "The target path is outside OBSIDIAN_READ_PATHS (and OBSIDIAN_WRITE_PATHS, since write paths imply read access).";
|
|
112
113
|
readonly recovery: "Use a path inside the configured read scope. The error data echoes the active scope.";
|
|
113
114
|
}, {
|
|
114
115
|
readonly reason: "note_missing";
|
|
116
|
+
readonly thrownBy: "service";
|
|
115
117
|
readonly code: import("@cyanheads/mcp-ts-core/errors").JsonRpcErrorCode.NotFound;
|
|
116
118
|
readonly when: "The vault path does not resolve to an existing note.";
|
|
117
119
|
readonly recovery: "Verify the path with obsidian_list_notes or use obsidian_search_notes to locate the note.";
|
|
118
120
|
}, {
|
|
119
121
|
readonly reason: "ambiguous_path";
|
|
122
|
+
readonly thrownBy: "service";
|
|
120
123
|
readonly code: import("@cyanheads/mcp-ts-core/errors").JsonRpcErrorCode.Conflict;
|
|
121
124
|
readonly when: "The parent directory contains multiple files whose names differ only in case (case-sensitive filesystems only).";
|
|
122
125
|
readonly recovery: "Retry with one of the exact paths listed in `matches` on the error data.";
|
|
123
126
|
}, {
|
|
124
127
|
readonly reason: "no_active_file";
|
|
128
|
+
readonly thrownBy: "service";
|
|
125
129
|
readonly code: import("@cyanheads/mcp-ts-core/errors").JsonRpcErrorCode.NotFound;
|
|
126
130
|
readonly when: "Target was `active` but no file is currently open in Obsidian.";
|
|
127
131
|
readonly recovery: "Call obsidian_open_in_ui to focus a file, or pass an explicit path target instead.";
|
|
128
132
|
}, {
|
|
129
133
|
readonly reason: "periodic_unsupported";
|
|
134
|
+
readonly thrownBy: "service";
|
|
130
135
|
readonly code: import("@cyanheads/mcp-ts-core/errors").JsonRpcErrorCode.NotFound;
|
|
131
136
|
readonly when: "Target was `periodic` and this vault runs Local REST API v5.0.2 or later without the companion periodic-notes extension, so the `/periodic/` routes are not served at all.";
|
|
132
137
|
readonly recovery: "Install the periodic-notes extension from https://github.com/coddingtonbear/obsidian-local-rest-api-periodic-notes, or address the note by an explicit vault path.";
|
|
133
138
|
}, {
|
|
134
139
|
readonly reason: "periodic_not_found";
|
|
140
|
+
readonly thrownBy: "service";
|
|
135
141
|
readonly code: import("@cyanheads/mcp-ts-core/errors").JsonRpcErrorCode.NotFound;
|
|
136
142
|
readonly when: "Target was `periodic`, the `/periodic/` routes are served on this vault, and no note exists for the requested period.";
|
|
137
143
|
readonly recovery: "Create the periodic note first or pass an explicit path target.";
|
|
138
144
|
}, {
|
|
139
145
|
readonly reason: "periodic_disabled";
|
|
146
|
+
readonly thrownBy: "service";
|
|
140
147
|
readonly code: import("@cyanheads/mcp-ts-core/errors").JsonRpcErrorCode.ValidationError;
|
|
141
148
|
readonly when: "Target was `periodic` but the requested period is not enabled in Obsidian's Periodic Notes plugin settings.";
|
|
142
149
|
readonly recovery: "Pass an explicit path target — the requested period is disabled in the operator's Periodic Notes plugin.";
|
|
@@ -147,11 +154,13 @@ export declare const readToolDefinitions: (import("@cyanheads/mcp-ts-core").Tool
|
|
|
147
154
|
readonly recovery: "Call obsidian_get_note with format \"document-map\" to list available headings, blocks, and frontmatter fields, then retry with one of those locators.";
|
|
148
155
|
}, {
|
|
149
156
|
readonly reason: "path_is_directory";
|
|
157
|
+
readonly thrownBy: "service";
|
|
150
158
|
readonly code: import("@cyanheads/mcp-ts-core/errors").JsonRpcErrorCode.ValidationError;
|
|
151
159
|
readonly when: "The supplied path names a folder rather than a note file.";
|
|
152
160
|
readonly recovery: "Call obsidian_list_notes with this path to list the folder, then retry with the full path of one of the files it returns.";
|
|
153
161
|
}, {
|
|
154
162
|
readonly reason: "path_traversal";
|
|
163
|
+
readonly thrownBy: "service";
|
|
155
164
|
readonly code: import("@cyanheads/mcp-ts-core/errors").JsonRpcErrorCode.ValidationError;
|
|
156
165
|
readonly when: "The path contains a `.` or `..` segment, which is rejected to prevent vault escape.";
|
|
157
166
|
readonly recovery: "Supply a vault-relative path with no `.` or `..` segments, e.g. \"Projects/Note.md\". Use obsidian_list_notes to browse the vault.";
|
|
@@ -228,16 +237,19 @@ export declare const readToolDefinitions: (import("@cyanheads/mcp-ts-core").Tool
|
|
|
228
237
|
readonly recovery: "Avoid nested quantifiers like `(a+)+` or `(.*)*`. Use a simpler pattern (e.g. `^Project.*\\.md$`), or omit nameRegex to disable filtering.";
|
|
229
238
|
}, {
|
|
230
239
|
readonly reason: "path_forbidden";
|
|
240
|
+
readonly thrownBy: "service";
|
|
231
241
|
readonly code: import("@cyanheads/mcp-ts-core/errors").JsonRpcErrorCode.Forbidden;
|
|
232
242
|
readonly when: "The supplied `path` is outside OBSIDIAN_READ_PATHS (root listings always pass; specific subdirectories must be readable).";
|
|
233
243
|
readonly recovery: "List a directory inside the configured read scope, or omit `path` to list from the vault root. The error data echoes the active scope.";
|
|
234
244
|
}, {
|
|
235
245
|
readonly reason: "directory_missing";
|
|
246
|
+
readonly thrownBy: "service";
|
|
236
247
|
readonly code: import("@cyanheads/mcp-ts-core/errors").JsonRpcErrorCode.NotFound;
|
|
237
248
|
readonly when: "No listable directory at the supplied `path` — either it does not exist, or it exists and currently holds no files. Sub-directories that disappear mid-walk are silently skipped, so only the root path surfaces this error.";
|
|
238
249
|
readonly recovery: "List the parent directory to check the spelling and casing. A folder that exists but holds no files reports the same way, since the Local REST API omits empty folders from its listings — add a file to it, or confirm from the parent that the folder is there.";
|
|
239
250
|
}, {
|
|
240
251
|
readonly reason: "path_is_file";
|
|
252
|
+
readonly thrownBy: "service";
|
|
241
253
|
readonly code: import("@cyanheads/mcp-ts-core/errors").JsonRpcErrorCode.ValidationError;
|
|
242
254
|
readonly when: "The supplied `path` names a file rather than a directory.";
|
|
243
255
|
readonly recovery: "Read the file with obsidian_get_note instead, or list its parent directory to browse alongside it.";
|
|
@@ -253,6 +265,7 @@ export declare const readToolDefinitions: (import("@cyanheads/mcp-ts-core").Tool
|
|
|
253
265
|
createdIfMissing: import("zod").ZodBoolean;
|
|
254
266
|
}, import("zod/v4/core").$strip>, readonly [{
|
|
255
267
|
readonly reason: "path_forbidden";
|
|
268
|
+
readonly thrownBy: "service";
|
|
256
269
|
readonly code: import("@cyanheads/mcp-ts-core/errors").JsonRpcErrorCode.Forbidden;
|
|
257
270
|
readonly when: "The path is outside OBSIDIAN_READ_PATHS, or — when the file does not exist and `failIfMissing: false` would have Obsidian create it — outside OBSIDIAN_WRITE_PATHS or blocked by OBSIDIAN_READ_ONLY=true.";
|
|
258
271
|
readonly recovery: "Open a path inside the configured scope. The error data echoes the active scope and whether read or write access was the one denied.";
|
|
@@ -263,16 +276,19 @@ export declare const readToolDefinitions: (import("@cyanheads/mcp-ts-core").Tool
|
|
|
263
276
|
readonly recovery: "Verify the path with obsidian_list_notes or obsidian_search_notes first — a typo would otherwise materialize as an empty file. If creation is intended, retry with failIfMissing: false.";
|
|
264
277
|
}, {
|
|
265
278
|
readonly reason: "ambiguous_path";
|
|
279
|
+
readonly thrownBy: "service";
|
|
266
280
|
readonly code: import("@cyanheads/mcp-ts-core/errors").JsonRpcErrorCode.Conflict;
|
|
267
281
|
readonly when: "The parent directory contains multiple files whose names differ only in case (case-sensitive filesystems only).";
|
|
268
282
|
readonly recovery: "Retry with one of the exact paths listed in `matches` on the error data.";
|
|
269
283
|
}, {
|
|
270
284
|
readonly reason: "path_is_directory";
|
|
285
|
+
readonly thrownBy: "service";
|
|
271
286
|
readonly code: import("@cyanheads/mcp-ts-core/errors").JsonRpcErrorCode.ValidationError;
|
|
272
287
|
readonly when: "The supplied path names a folder rather than a file.";
|
|
273
288
|
readonly recovery: "Call obsidian_list_notes with this path to list the folder, then open one of the files it returns.";
|
|
274
289
|
}, {
|
|
275
290
|
readonly reason: "path_traversal";
|
|
291
|
+
readonly thrownBy: "service";
|
|
276
292
|
readonly code: import("@cyanheads/mcp-ts-core/errors").JsonRpcErrorCode.ValidationError;
|
|
277
293
|
readonly when: "The path contains a `.` or `..` segment, which is rejected to prevent vault escape.";
|
|
278
294
|
readonly recovery: "Supply a vault-relative path with no `.` or `..` segments, e.g. \"Projects/Note.md\". Use obsidian_list_notes to browse the vault.";
|
|
@@ -337,56 +353,67 @@ export declare const writeToolDefinitions: (import("@cyanheads/mcp-ts-core").Too
|
|
|
337
353
|
currentSizeInBytes: import("zod").ZodNumber;
|
|
338
354
|
}, import("zod/v4/core").$strip>, readonly [{
|
|
339
355
|
readonly reason: "path_forbidden";
|
|
356
|
+
readonly thrownBy: "service";
|
|
340
357
|
readonly code: import("@cyanheads/mcp-ts-core/errors").JsonRpcErrorCode.Forbidden;
|
|
341
358
|
readonly when: "The target path is outside OBSIDIAN_WRITE_PATHS, or OBSIDIAN_READ_ONLY=true denies all writes.";
|
|
342
359
|
readonly recovery: "Use a path inside the configured write scope. The error data echoes the active scope.";
|
|
343
360
|
}, {
|
|
344
361
|
readonly reason: "note_missing";
|
|
362
|
+
readonly thrownBy: "service";
|
|
345
363
|
readonly code: import("@cyanheads/mcp-ts-core/errors").JsonRpcErrorCode.NotFound;
|
|
346
364
|
readonly when: "The vault path does not resolve to an existing note.";
|
|
347
365
|
readonly recovery: "Verify the path with obsidian_list_notes or use obsidian_search_notes to locate the note.";
|
|
348
366
|
}, {
|
|
349
367
|
readonly reason: "no_active_file";
|
|
368
|
+
readonly thrownBy: "service";
|
|
350
369
|
readonly code: import("@cyanheads/mcp-ts-core/errors").JsonRpcErrorCode.NotFound;
|
|
351
370
|
readonly when: "Target was `active` but no file is currently open in Obsidian.";
|
|
352
371
|
readonly recovery: "Call obsidian_open_in_ui to focus a file, or pass an explicit path target instead.";
|
|
353
372
|
}, {
|
|
354
373
|
readonly reason: "periodic_unsupported";
|
|
374
|
+
readonly thrownBy: "service";
|
|
355
375
|
readonly code: import("@cyanheads/mcp-ts-core/errors").JsonRpcErrorCode.NotFound;
|
|
356
376
|
readonly when: "Target was `periodic` and this vault runs Local REST API v5.0.2 or later without the companion periodic-notes extension, so the `/periodic/` routes are not served at all.";
|
|
357
377
|
readonly recovery: "Install the periodic-notes extension from https://github.com/coddingtonbear/obsidian-local-rest-api-periodic-notes, or address the note by an explicit vault path.";
|
|
358
378
|
}, {
|
|
359
379
|
readonly reason: "periodic_not_found";
|
|
380
|
+
readonly thrownBy: "service";
|
|
360
381
|
readonly code: import("@cyanheads/mcp-ts-core/errors").JsonRpcErrorCode.NotFound;
|
|
361
382
|
readonly when: "Target was `periodic`, the `/periodic/` routes are served on this vault, and no note exists for the requested period.";
|
|
362
383
|
readonly recovery: "Create the periodic note first or pass an explicit path target.";
|
|
363
384
|
}, {
|
|
364
385
|
readonly reason: "periodic_disabled";
|
|
386
|
+
readonly thrownBy: "service";
|
|
365
387
|
readonly code: import("@cyanheads/mcp-ts-core/errors").JsonRpcErrorCode.ValidationError;
|
|
366
388
|
readonly when: "Target was `periodic` but the requested period is not enabled in Obsidian's Periodic Notes plugin settings.";
|
|
367
389
|
readonly recovery: "Pass an explicit path target — the requested period is disabled in the operator's Periodic Notes plugin.";
|
|
368
390
|
}, {
|
|
369
391
|
readonly reason: "section_target_missing";
|
|
392
|
+
readonly thrownBy: "service";
|
|
370
393
|
readonly code: import("@cyanheads/mcp-ts-core/errors").JsonRpcErrorCode.ValidationError;
|
|
371
394
|
readonly when: "The named heading/block/frontmatter field does not exist in the note. Use `obsidian_get_note` with `format: \"document-map\"` to discover available targets.";
|
|
372
395
|
readonly recovery: "Call obsidian_get_note with format document-map to discover the available targets.";
|
|
373
396
|
}, {
|
|
374
397
|
readonly reason: "ambiguous_section";
|
|
398
|
+
readonly thrownBy: "service";
|
|
375
399
|
readonly code: import("@cyanheads/mcp-ts-core/errors").JsonRpcErrorCode.Conflict;
|
|
376
400
|
readonly when: "A bare heading leaf name matches more than one heading in the note, so the write target is undetermined.";
|
|
377
401
|
readonly recovery: "Retry with one of the full Parent::Child heading paths listed in `candidates` on the error data.";
|
|
378
402
|
}, {
|
|
379
403
|
readonly reason: "content_preexists";
|
|
404
|
+
readonly thrownBy: "service";
|
|
380
405
|
readonly code: import("@cyanheads/mcp-ts-core/errors").JsonRpcErrorCode.ValidationError;
|
|
381
406
|
readonly when: "The supplied content already appears at the target — the patch was rejected to keep retries idempotent (the default).";
|
|
382
407
|
readonly recovery: "Pass `patchOptions.applyIfContentPreexists: true` to force-apply over preexisting content, or change the content to something not already present.";
|
|
383
408
|
}, {
|
|
384
409
|
readonly reason: "path_is_directory";
|
|
410
|
+
readonly thrownBy: "service";
|
|
385
411
|
readonly code: import("@cyanheads/mcp-ts-core/errors").JsonRpcErrorCode.ValidationError;
|
|
386
412
|
readonly when: "The supplied path names a folder rather than a note file.";
|
|
387
413
|
readonly recovery: "Call obsidian_list_notes with this path to list the folder, then retry with the full path of one of the files it returns.";
|
|
388
414
|
}, {
|
|
389
415
|
readonly reason: "path_traversal";
|
|
416
|
+
readonly thrownBy: "service";
|
|
390
417
|
readonly code: import("@cyanheads/mcp-ts-core/errors").JsonRpcErrorCode.ValidationError;
|
|
391
418
|
readonly when: "The path contains a `.` or `..` segment, which is rejected to prevent vault escape.";
|
|
392
419
|
readonly recovery: "Supply a vault-relative path with no `.` or `..` segments, e.g. \"Projects/Note.md\". Use obsidian_list_notes to browse the vault.";
|
|
@@ -435,51 +462,61 @@ export declare const writeToolDefinitions: (import("@cyanheads/mcp-ts-core").Too
|
|
|
435
462
|
readonly recovery: "Retry with overwrite true or use obsidian_patch_note for in-place edits.";
|
|
436
463
|
}, {
|
|
437
464
|
readonly reason: "path_forbidden";
|
|
465
|
+
readonly thrownBy: "service";
|
|
438
466
|
readonly code: import("@cyanheads/mcp-ts-core/errors").JsonRpcErrorCode.Forbidden;
|
|
439
467
|
readonly when: "The target path is outside OBSIDIAN_WRITE_PATHS, or OBSIDIAN_READ_ONLY=true denies all writes.";
|
|
440
468
|
readonly recovery: "Use a path inside the configured write scope. The error data echoes the active scope.";
|
|
441
469
|
}, {
|
|
442
470
|
readonly reason: "note_missing";
|
|
471
|
+
readonly thrownBy: "service";
|
|
443
472
|
readonly code: import("@cyanheads/mcp-ts-core/errors").JsonRpcErrorCode.NotFound;
|
|
444
473
|
readonly when: "Section replace targets a path that does not resolve to an existing note (PATCH requires the file to exist).";
|
|
445
474
|
readonly recovery: "Verify the path with obsidian_list_notes, or omit `section` to fall back to whole-file write (which creates the note when it is absent).";
|
|
446
475
|
}, {
|
|
447
476
|
readonly reason: "no_active_file";
|
|
477
|
+
readonly thrownBy: "service";
|
|
448
478
|
readonly code: import("@cyanheads/mcp-ts-core/errors").JsonRpcErrorCode.NotFound;
|
|
449
479
|
readonly when: "Target was `active` but no file is currently open in Obsidian.";
|
|
450
480
|
readonly recovery: "Call obsidian_open_in_ui to focus a file, or pass an explicit path target instead.";
|
|
451
481
|
}, {
|
|
452
482
|
readonly reason: "periodic_unsupported";
|
|
483
|
+
readonly thrownBy: "service";
|
|
453
484
|
readonly code: import("@cyanheads/mcp-ts-core/errors").JsonRpcErrorCode.NotFound;
|
|
454
485
|
readonly when: "Target was `periodic` and this vault runs Local REST API v5.0.2 or later without the companion periodic-notes extension, so the `/periodic/` routes are not served at all.";
|
|
455
486
|
readonly recovery: "Install the periodic-notes extension from https://github.com/coddingtonbear/obsidian-local-rest-api-periodic-notes, or address the note by an explicit vault path.";
|
|
456
487
|
}, {
|
|
457
488
|
readonly reason: "periodic_not_found";
|
|
489
|
+
readonly thrownBy: "service";
|
|
458
490
|
readonly code: import("@cyanheads/mcp-ts-core/errors").JsonRpcErrorCode.NotFound;
|
|
459
491
|
readonly when: "Target was `periodic`, the `/periodic/` routes are served on this vault, and no note exists for the requested period.";
|
|
460
492
|
readonly recovery: "Create the periodic note first or pass an explicit path target.";
|
|
461
493
|
}, {
|
|
462
494
|
readonly reason: "periodic_disabled";
|
|
495
|
+
readonly thrownBy: "service";
|
|
463
496
|
readonly code: import("@cyanheads/mcp-ts-core/errors").JsonRpcErrorCode.ValidationError;
|
|
464
497
|
readonly when: "Target was `periodic` but the requested period is not enabled in Obsidian's Periodic Notes plugin settings.";
|
|
465
498
|
readonly recovery: "Pass an explicit path target — the requested period is disabled in the operator's Periodic Notes plugin.";
|
|
466
499
|
}, {
|
|
467
500
|
readonly reason: "section_target_missing";
|
|
501
|
+
readonly thrownBy: "service";
|
|
468
502
|
readonly code: import("@cyanheads/mcp-ts-core/errors").JsonRpcErrorCode.ValidationError;
|
|
469
503
|
readonly when: "`section` was provided but the named heading/block/frontmatter field does not exist in the note.";
|
|
470
504
|
readonly recovery: "Call obsidian_get_note with format document-map to discover available targets.";
|
|
471
505
|
}, {
|
|
472
506
|
readonly reason: "ambiguous_section";
|
|
507
|
+
readonly thrownBy: "service";
|
|
473
508
|
readonly code: import("@cyanheads/mcp-ts-core/errors").JsonRpcErrorCode.Conflict;
|
|
474
509
|
readonly when: "A bare heading leaf name matches more than one heading in the note, so the replacement target is undetermined.";
|
|
475
510
|
readonly recovery: "Retry with one of the full Parent::Child heading paths listed in `candidates` on the error data.";
|
|
476
511
|
}, {
|
|
477
512
|
readonly reason: "path_is_directory";
|
|
513
|
+
readonly thrownBy: "service";
|
|
478
514
|
readonly code: import("@cyanheads/mcp-ts-core/errors").JsonRpcErrorCode.ValidationError;
|
|
479
515
|
readonly when: "The supplied path names a folder rather than a note file.";
|
|
480
516
|
readonly recovery: "Call obsidian_list_notes with this path to list the folder, then retry with the full path of one of the files it returns.";
|
|
481
517
|
}, {
|
|
482
518
|
readonly reason: "path_traversal";
|
|
519
|
+
readonly thrownBy: "service";
|
|
483
520
|
readonly code: import("@cyanheads/mcp-ts-core/errors").JsonRpcErrorCode.ValidationError;
|
|
484
521
|
readonly when: "The path contains a `.` or `..` segment, which is rejected to prevent vault escape.";
|
|
485
522
|
readonly recovery: "Supply a vault-relative path with no `.` or `..` segments, e.g. \"Projects/Note.md\". Use obsidian_list_notes to browse the vault.";
|
|
@@ -523,56 +560,67 @@ export declare const writeToolDefinitions: (import("@cyanheads/mcp-ts-core").Too
|
|
|
523
560
|
currentSizeInBytes: import("zod").ZodNumber;
|
|
524
561
|
}, import("zod/v4/core").$strip>, readonly [{
|
|
525
562
|
readonly reason: "path_forbidden";
|
|
563
|
+
readonly thrownBy: "service";
|
|
526
564
|
readonly code: import("@cyanheads/mcp-ts-core/errors").JsonRpcErrorCode.Forbidden;
|
|
527
565
|
readonly when: "The target path is outside OBSIDIAN_WRITE_PATHS, or OBSIDIAN_READ_ONLY=true denies all writes.";
|
|
528
566
|
readonly recovery: "Use a path inside the configured write scope. The error data echoes the active scope.";
|
|
529
567
|
}, {
|
|
530
568
|
readonly reason: "note_missing";
|
|
569
|
+
readonly thrownBy: "service";
|
|
531
570
|
readonly code: import("@cyanheads/mcp-ts-core/errors").JsonRpcErrorCode.NotFound;
|
|
532
571
|
readonly when: "Section append targets a path that does not resolve to an existing note (PATCH requires the file to exist).";
|
|
533
572
|
readonly recovery: "Verify the path with obsidian_list_notes, or omit `section` to fall back to whole-file append (which creates the note if missing).";
|
|
534
573
|
}, {
|
|
535
574
|
readonly reason: "no_active_file";
|
|
575
|
+
readonly thrownBy: "service";
|
|
536
576
|
readonly code: import("@cyanheads/mcp-ts-core/errors").JsonRpcErrorCode.NotFound;
|
|
537
577
|
readonly when: "Target was `active` but no file is currently open in Obsidian.";
|
|
538
578
|
readonly recovery: "Call obsidian_open_in_ui to focus a file, or pass an explicit path target instead.";
|
|
539
579
|
}, {
|
|
540
580
|
readonly reason: "periodic_unsupported";
|
|
581
|
+
readonly thrownBy: "service";
|
|
541
582
|
readonly code: import("@cyanheads/mcp-ts-core/errors").JsonRpcErrorCode.NotFound;
|
|
542
583
|
readonly when: "Target was `periodic` and this vault runs Local REST API v5.0.2 or later without the companion periodic-notes extension, so the `/periodic/` routes are not served at all.";
|
|
543
584
|
readonly recovery: "Install the periodic-notes extension from https://github.com/coddingtonbear/obsidian-local-rest-api-periodic-notes, or address the note by an explicit vault path.";
|
|
544
585
|
}, {
|
|
545
586
|
readonly reason: "periodic_not_found";
|
|
587
|
+
readonly thrownBy: "service";
|
|
546
588
|
readonly code: import("@cyanheads/mcp-ts-core/errors").JsonRpcErrorCode.NotFound;
|
|
547
589
|
readonly when: "Target was `periodic`, the `/periodic/` routes are served on this vault, and no note exists for the requested period.";
|
|
548
590
|
readonly recovery: "Create the periodic note first or pass an explicit path target.";
|
|
549
591
|
}, {
|
|
550
592
|
readonly reason: "periodic_disabled";
|
|
593
|
+
readonly thrownBy: "service";
|
|
551
594
|
readonly code: import("@cyanheads/mcp-ts-core/errors").JsonRpcErrorCode.ValidationError;
|
|
552
595
|
readonly when: "Target was `periodic` but the requested period is not enabled in Obsidian's Periodic Notes plugin settings.";
|
|
553
596
|
readonly recovery: "Pass an explicit path target — the requested period is disabled in the operator's Periodic Notes plugin.";
|
|
554
597
|
}, {
|
|
555
598
|
readonly reason: "section_target_missing";
|
|
599
|
+
readonly thrownBy: "service";
|
|
556
600
|
readonly code: import("@cyanheads/mcp-ts-core/errors").JsonRpcErrorCode.ValidationError;
|
|
557
601
|
readonly when: "`section` was provided but the named heading/block/frontmatter field does not exist in the note.";
|
|
558
602
|
readonly recovery: "Call obsidian_get_note with format document-map to discover available targets, or pass createTargetIfMissing: true to bring it into existence.";
|
|
559
603
|
}, {
|
|
560
604
|
readonly reason: "ambiguous_section";
|
|
605
|
+
readonly thrownBy: "service";
|
|
561
606
|
readonly code: import("@cyanheads/mcp-ts-core/errors").JsonRpcErrorCode.Conflict;
|
|
562
607
|
readonly when: "A bare heading leaf name matches more than one heading in the note, so the append target is undetermined.";
|
|
563
608
|
readonly recovery: "Retry with one of the full Parent::Child heading paths listed in `candidates` on the error data.";
|
|
564
609
|
}, {
|
|
565
610
|
readonly reason: "content_preexists";
|
|
611
|
+
readonly thrownBy: "service";
|
|
566
612
|
readonly code: import("@cyanheads/mcp-ts-core/errors").JsonRpcErrorCode.ValidationError;
|
|
567
613
|
readonly when: "Section append where the supplied content already appears at the target — rejected to keep retries idempotent (the default for the section path).";
|
|
568
614
|
readonly recovery: "Change the content to something not already present at the target, or use obsidian_patch_note with `patchOptions.applyIfContentPreexists: true` if a duplicate is intended.";
|
|
569
615
|
}, {
|
|
570
616
|
readonly reason: "path_is_directory";
|
|
617
|
+
readonly thrownBy: "service";
|
|
571
618
|
readonly code: import("@cyanheads/mcp-ts-core/errors").JsonRpcErrorCode.ValidationError;
|
|
572
619
|
readonly when: "The supplied path names a folder rather than a note file.";
|
|
573
620
|
readonly recovery: "Call obsidian_list_notes with this path to list the folder, then retry with the full path of one of the files it returns.";
|
|
574
621
|
}, {
|
|
575
622
|
readonly reason: "path_traversal";
|
|
623
|
+
readonly thrownBy: "service";
|
|
576
624
|
readonly code: import("@cyanheads/mcp-ts-core/errors").JsonRpcErrorCode.ValidationError;
|
|
577
625
|
readonly when: "The path contains a `.` or `..` segment, which is rejected to prevent vault escape.";
|
|
578
626
|
readonly recovery: "Supply a vault-relative path with no `.` or `..` segments, e.g. \"Projects/Note.md\". Use obsidian_list_notes to browse the vault.";
|
|
@@ -620,8 +668,9 @@ export declare const writeToolDefinitions: (import("@cyanheads/mcp-ts-core").Too
|
|
|
620
668
|
currentSizeInBytes: import("zod").ZodNumber;
|
|
621
669
|
}, import("zod/v4/core").$strip>, readonly [{
|
|
622
670
|
readonly reason: "path_forbidden";
|
|
671
|
+
readonly thrownBy: "service";
|
|
623
672
|
readonly code: import("@cyanheads/mcp-ts-core/errors").JsonRpcErrorCode.Forbidden;
|
|
624
|
-
readonly when: "The target path is outside OBSIDIAN_WRITE_PATHS, or OBSIDIAN_READ_ONLY=true denies all writes.
|
|
673
|
+
readonly when: "The target path is outside OBSIDIAN_WRITE_PATHS, or OBSIDIAN_READ_ONLY=true denies all writes. The pre-read also requires the path to be readable.";
|
|
625
674
|
readonly recovery: "Use a path inside the configured write scope. The error data echoes the active scope.";
|
|
626
675
|
}, {
|
|
627
676
|
readonly reason: "regex_invalid";
|
|
@@ -636,40 +685,47 @@ export declare const writeToolDefinitions: (import("@cyanheads/mcp-ts-core").Too
|
|
|
636
685
|
}, {
|
|
637
686
|
readonly reason: "frontmatter_invalid";
|
|
638
687
|
readonly code: import("@cyanheads/mcp-ts-core/errors").JsonRpcErrorCode.ValidationError;
|
|
639
|
-
readonly when: "A `scope` of \"frontmatter\" or \"both\" produced YAML that no longer parses as a mapping of properties. Nothing is written — the note keeps its original bytes. The check reads the rewritten YAML only, so a replacement that renames a key or changes a scalar's type while still parsing is not caught by it.";
|
|
688
|
+
readonly when: "A `scope` of \"frontmatter\" or \"both\" produced YAML that no longer parses as a mapping of properties, or that parses but cannot be re-emitted (an alias whose anchor the replacement removed). Nothing is written — the note keeps its original bytes. The check reads the rewritten YAML only, so a replacement that renames a key or changes a scalar's type while still parsing is not caught by it.";
|
|
640
689
|
readonly recovery: "Narrow the search so it cannot match inside the YAML, or leave scope at \"body\" and edit the property with obsidian_manage_frontmatter.";
|
|
641
690
|
}, {
|
|
642
691
|
readonly reason: "note_missing";
|
|
692
|
+
readonly thrownBy: "service";
|
|
643
693
|
readonly code: import("@cyanheads/mcp-ts-core/errors").JsonRpcErrorCode.NotFound;
|
|
644
694
|
readonly when: "The vault path does not resolve to an existing note.";
|
|
645
695
|
readonly recovery: "Verify the path with obsidian_list_notes or use obsidian_search_notes to locate the note.";
|
|
646
696
|
}, {
|
|
647
697
|
readonly reason: "no_active_file";
|
|
698
|
+
readonly thrownBy: "service";
|
|
648
699
|
readonly code: import("@cyanheads/mcp-ts-core/errors").JsonRpcErrorCode.NotFound;
|
|
649
700
|
readonly when: "Target was `active` but no file is currently open in Obsidian.";
|
|
650
701
|
readonly recovery: "Call obsidian_open_in_ui to focus a file, or pass an explicit path target instead.";
|
|
651
702
|
}, {
|
|
652
703
|
readonly reason: "periodic_unsupported";
|
|
704
|
+
readonly thrownBy: "service";
|
|
653
705
|
readonly code: import("@cyanheads/mcp-ts-core/errors").JsonRpcErrorCode.NotFound;
|
|
654
706
|
readonly when: "Target was `periodic` and this vault runs Local REST API v5.0.2 or later without the companion periodic-notes extension, so the `/periodic/` routes are not served at all.";
|
|
655
707
|
readonly recovery: "Install the periodic-notes extension from https://github.com/coddingtonbear/obsidian-local-rest-api-periodic-notes, or address the note by an explicit vault path.";
|
|
656
708
|
}, {
|
|
657
709
|
readonly reason: "periodic_not_found";
|
|
710
|
+
readonly thrownBy: "service";
|
|
658
711
|
readonly code: import("@cyanheads/mcp-ts-core/errors").JsonRpcErrorCode.NotFound;
|
|
659
712
|
readonly when: "Target was `periodic`, the `/periodic/` routes are served on this vault, and no note exists for the requested period.";
|
|
660
713
|
readonly recovery: "Create the periodic note first or pass an explicit path target.";
|
|
661
714
|
}, {
|
|
662
715
|
readonly reason: "periodic_disabled";
|
|
716
|
+
readonly thrownBy: "service";
|
|
663
717
|
readonly code: import("@cyanheads/mcp-ts-core/errors").JsonRpcErrorCode.ValidationError;
|
|
664
718
|
readonly when: "Target was `periodic` but the requested period is not enabled in Obsidian's Periodic Notes plugin settings.";
|
|
665
719
|
readonly recovery: "Pass an explicit path target — the requested period is disabled in the operator's Periodic Notes plugin.";
|
|
666
720
|
}, {
|
|
667
721
|
readonly reason: "path_is_directory";
|
|
722
|
+
readonly thrownBy: "service";
|
|
668
723
|
readonly code: import("@cyanheads/mcp-ts-core/errors").JsonRpcErrorCode.ValidationError;
|
|
669
724
|
readonly when: "The supplied path names a folder rather than a note file.";
|
|
670
725
|
readonly recovery: "Call obsidian_list_notes with this path to list the folder, then retry with the full path of one of the files it returns.";
|
|
671
726
|
}, {
|
|
672
727
|
readonly reason: "path_traversal";
|
|
728
|
+
readonly thrownBy: "service";
|
|
673
729
|
readonly code: import("@cyanheads/mcp-ts-core/errors").JsonRpcErrorCode.ValidationError;
|
|
674
730
|
readonly when: "The path contains a `.` or `..` segment, which is rejected to prevent vault escape.";
|
|
675
731
|
readonly recovery: "Supply a vault-relative path with no `.` or `..` segments, e.g. \"Projects/Note.md\". Use obsidian_list_notes to browse the vault.";
|
|
@@ -721,6 +777,7 @@ export declare const writeToolDefinitions: (import("@cyanheads/mcp-ts-core").Too
|
|
|
721
777
|
}, import("zod/v4/core").$strip>], "operation">;
|
|
722
778
|
}, import("zod/v4/core").$strip>, readonly [{
|
|
723
779
|
readonly reason: "path_forbidden";
|
|
780
|
+
readonly thrownBy: "service";
|
|
724
781
|
readonly code: import("@cyanheads/mcp-ts-core/errors").JsonRpcErrorCode.Forbidden;
|
|
725
782
|
readonly when: "`get` requires the path to be readable; `set`/`delete` require it to be inside OBSIDIAN_WRITE_PATHS, with OBSIDIAN_READ_ONLY=false.";
|
|
726
783
|
readonly recovery: "Use a path inside the configured scope. The error data echoes the active scope.";
|
|
@@ -729,38 +786,50 @@ export declare const writeToolDefinitions: (import("@cyanheads/mcp-ts-core").Too
|
|
|
729
786
|
readonly code: import("@cyanheads/mcp-ts-core/errors").JsonRpcErrorCode.ValidationError;
|
|
730
787
|
readonly when: "`operation` is \"set\" but no `value` was supplied.";
|
|
731
788
|
readonly recovery: "Pass `value` as any JSON-typed value: string, number, boolean, array, or object (e.g. `\"draft\"`, `42`, `true`, `[\"a\",\"b\"]`).";
|
|
789
|
+
}, {
|
|
790
|
+
readonly reason: "frontmatter_invalid";
|
|
791
|
+
readonly code: import("@cyanheads/mcp-ts-core/errors").JsonRpcErrorCode.ValidationError;
|
|
792
|
+
readonly when: "`operation` is \"delete\" and the note's existing frontmatter does not parse as a mapping of properties, or removing the key would leave YAML that cannot be re-emitted (an alias whose anchor went with it). Nothing is written — the note keeps its original bytes.";
|
|
793
|
+
readonly recovery: "Read the block with obsidian_get_note (format \"content\"), repair the YAML between the `---` fences, then retry the delete.";
|
|
732
794
|
}, {
|
|
733
795
|
readonly reason: "note_missing";
|
|
796
|
+
readonly thrownBy: "service";
|
|
734
797
|
readonly code: import("@cyanheads/mcp-ts-core/errors").JsonRpcErrorCode.NotFound;
|
|
735
798
|
readonly when: "The vault path does not resolve to an existing note.";
|
|
736
799
|
readonly recovery: "Verify the path with obsidian_list_notes or use obsidian_search_notes to locate the note.";
|
|
737
800
|
}, {
|
|
738
801
|
readonly reason: "no_active_file";
|
|
802
|
+
readonly thrownBy: "service";
|
|
739
803
|
readonly code: import("@cyanheads/mcp-ts-core/errors").JsonRpcErrorCode.NotFound;
|
|
740
804
|
readonly when: "Target was `active` but no file is currently open in Obsidian.";
|
|
741
805
|
readonly recovery: "Call obsidian_open_in_ui to focus a file, or pass an explicit path target instead.";
|
|
742
806
|
}, {
|
|
743
807
|
readonly reason: "periodic_unsupported";
|
|
808
|
+
readonly thrownBy: "service";
|
|
744
809
|
readonly code: import("@cyanheads/mcp-ts-core/errors").JsonRpcErrorCode.NotFound;
|
|
745
810
|
readonly when: "Target was `periodic` and this vault runs Local REST API v5.0.2 or later without the companion periodic-notes extension, so the `/periodic/` routes are not served at all.";
|
|
746
811
|
readonly recovery: "Install the periodic-notes extension from https://github.com/coddingtonbear/obsidian-local-rest-api-periodic-notes, or address the note by an explicit vault path.";
|
|
747
812
|
}, {
|
|
748
813
|
readonly reason: "periodic_not_found";
|
|
814
|
+
readonly thrownBy: "service";
|
|
749
815
|
readonly code: import("@cyanheads/mcp-ts-core/errors").JsonRpcErrorCode.NotFound;
|
|
750
816
|
readonly when: "Target was `periodic`, the `/periodic/` routes are served on this vault, and no note exists for the requested period.";
|
|
751
817
|
readonly recovery: "Create the periodic note first or pass an explicit path target.";
|
|
752
818
|
}, {
|
|
753
819
|
readonly reason: "periodic_disabled";
|
|
820
|
+
readonly thrownBy: "service";
|
|
754
821
|
readonly code: import("@cyanheads/mcp-ts-core/errors").JsonRpcErrorCode.ValidationError;
|
|
755
822
|
readonly when: "Target was `periodic` but the requested period is not enabled in Obsidian's Periodic Notes plugin settings.";
|
|
756
823
|
readonly recovery: "Pass an explicit path target — the requested period is disabled in the operator's Periodic Notes plugin.";
|
|
757
824
|
}, {
|
|
758
825
|
readonly reason: "path_is_directory";
|
|
826
|
+
readonly thrownBy: "service";
|
|
759
827
|
readonly code: import("@cyanheads/mcp-ts-core/errors").JsonRpcErrorCode.ValidationError;
|
|
760
828
|
readonly when: "The supplied path names a folder rather than a note file.";
|
|
761
829
|
readonly recovery: "Call obsidian_list_notes with this path to list the folder, then retry with the full path of one of the files it returns.";
|
|
762
830
|
}, {
|
|
763
831
|
readonly reason: "path_traversal";
|
|
832
|
+
readonly thrownBy: "service";
|
|
764
833
|
readonly code: import("@cyanheads/mcp-ts-core/errors").JsonRpcErrorCode.ValidationError;
|
|
765
834
|
readonly when: "The path contains a `.` or `..` segment, which is rejected to prevent vault escape.";
|
|
766
835
|
readonly recovery: "Supply a vault-relative path with no `.` or `..` segments, e.g. \"Projects/Note.md\". Use obsidian_list_notes to browse the vault.";
|
|
@@ -820,6 +889,7 @@ export declare const writeToolDefinitions: (import("@cyanheads/mcp-ts-core").Too
|
|
|
820
889
|
}, import("zod/v4/core").$strip>], "operation">;
|
|
821
890
|
}, import("zod/v4/core").$strip>, readonly [{
|
|
822
891
|
readonly reason: "path_forbidden";
|
|
892
|
+
readonly thrownBy: "service";
|
|
823
893
|
readonly code: import("@cyanheads/mcp-ts-core/errors").JsonRpcErrorCode.Forbidden;
|
|
824
894
|
readonly when: "`list` requires the path to be readable; `add`/`remove` require it to be inside OBSIDIAN_WRITE_PATHS, with OBSIDIAN_READ_ONLY=false.";
|
|
825
895
|
readonly recovery: "Use a path inside the configured scope. The error data echoes the active scope.";
|
|
@@ -828,38 +898,50 @@ export declare const writeToolDefinitions: (import("@cyanheads/mcp-ts-core").Too
|
|
|
828
898
|
readonly code: import("@cyanheads/mcp-ts-core/errors").JsonRpcErrorCode.ValidationError;
|
|
829
899
|
readonly when: "`operation` is \"add\" or \"remove\" but `tags` was empty or omitted.";
|
|
830
900
|
readonly recovery: "Pass a non-empty `tags` array (without `#`), e.g. `[\"draft\", \"wip\"]`.";
|
|
901
|
+
}, {
|
|
902
|
+
readonly reason: "frontmatter_invalid";
|
|
903
|
+
readonly code: import("@cyanheads/mcp-ts-core/errors").JsonRpcErrorCode.ValidationError;
|
|
904
|
+
readonly when: "`location` reaches the frontmatter and the note's existing block does not parse as a mapping of properties, or the tag change would leave YAML that cannot be re-emitted. Nothing is written — the note keeps its original bytes, and under `location: \"both\"` the inline half is skipped too rather than applied on its own.";
|
|
905
|
+
readonly recovery: "Use `location: \"inline\"` to tag the body without touching the block, or repair the YAML between the `---` fences and retry.";
|
|
831
906
|
}, {
|
|
832
907
|
readonly reason: "note_missing";
|
|
908
|
+
readonly thrownBy: "service";
|
|
833
909
|
readonly code: import("@cyanheads/mcp-ts-core/errors").JsonRpcErrorCode.NotFound;
|
|
834
910
|
readonly when: "The vault path does not resolve to an existing note.";
|
|
835
911
|
readonly recovery: "Verify the path with obsidian_list_notes or use obsidian_search_notes to locate the note.";
|
|
836
912
|
}, {
|
|
837
913
|
readonly reason: "no_active_file";
|
|
914
|
+
readonly thrownBy: "service";
|
|
838
915
|
readonly code: import("@cyanheads/mcp-ts-core/errors").JsonRpcErrorCode.NotFound;
|
|
839
916
|
readonly when: "Target was `active` but no file is currently open in Obsidian.";
|
|
840
917
|
readonly recovery: "Call obsidian_open_in_ui to focus a file, or pass an explicit path target instead.";
|
|
841
918
|
}, {
|
|
842
919
|
readonly reason: "periodic_unsupported";
|
|
920
|
+
readonly thrownBy: "service";
|
|
843
921
|
readonly code: import("@cyanheads/mcp-ts-core/errors").JsonRpcErrorCode.NotFound;
|
|
844
922
|
readonly when: "Target was `periodic` and this vault runs Local REST API v5.0.2 or later without the companion periodic-notes extension, so the `/periodic/` routes are not served at all.";
|
|
845
923
|
readonly recovery: "Install the periodic-notes extension from https://github.com/coddingtonbear/obsidian-local-rest-api-periodic-notes, or address the note by an explicit vault path.";
|
|
846
924
|
}, {
|
|
847
925
|
readonly reason: "periodic_not_found";
|
|
926
|
+
readonly thrownBy: "service";
|
|
848
927
|
readonly code: import("@cyanheads/mcp-ts-core/errors").JsonRpcErrorCode.NotFound;
|
|
849
928
|
readonly when: "Target was `periodic`, the `/periodic/` routes are served on this vault, and no note exists for the requested period.";
|
|
850
929
|
readonly recovery: "Create the periodic note first or pass an explicit path target.";
|
|
851
930
|
}, {
|
|
852
931
|
readonly reason: "periodic_disabled";
|
|
932
|
+
readonly thrownBy: "service";
|
|
853
933
|
readonly code: import("@cyanheads/mcp-ts-core/errors").JsonRpcErrorCode.ValidationError;
|
|
854
934
|
readonly when: "Target was `periodic` but the requested period is not enabled in Obsidian's Periodic Notes plugin settings.";
|
|
855
935
|
readonly recovery: "Pass an explicit path target — the requested period is disabled in the operator's Periodic Notes plugin.";
|
|
856
936
|
}, {
|
|
857
937
|
readonly reason: "path_is_directory";
|
|
938
|
+
readonly thrownBy: "service";
|
|
858
939
|
readonly code: import("@cyanheads/mcp-ts-core/errors").JsonRpcErrorCode.ValidationError;
|
|
859
940
|
readonly when: "The supplied path names a folder rather than a note file.";
|
|
860
941
|
readonly recovery: "Call obsidian_list_notes with this path to list the folder, then retry with the full path of one of the files it returns.";
|
|
861
942
|
}, {
|
|
862
943
|
readonly reason: "path_traversal";
|
|
944
|
+
readonly thrownBy: "service";
|
|
863
945
|
readonly code: import("@cyanheads/mcp-ts-core/errors").JsonRpcErrorCode.ValidationError;
|
|
864
946
|
readonly when: "The path contains a `.` or `..` segment, which is rejected to prevent vault escape.";
|
|
865
947
|
readonly recovery: "Supply a vault-relative path with no `.` or `..` segments, e.g. \"Projects/Note.md\". Use obsidian_list_notes to browse the vault.";
|
|
@@ -887,6 +969,7 @@ export declare const writeToolDefinitions: (import("@cyanheads/mcp-ts-core").Too
|
|
|
887
969
|
currentSizeInBytes: import("zod").ZodNumber;
|
|
888
970
|
}, import("zod/v4/core").$strip>, readonly [{
|
|
889
971
|
readonly reason: "path_forbidden";
|
|
972
|
+
readonly thrownBy: "service";
|
|
890
973
|
readonly code: import("@cyanheads/mcp-ts-core/errors").JsonRpcErrorCode.Forbidden;
|
|
891
974
|
readonly when: "The target path is outside OBSIDIAN_WRITE_PATHS, or OBSIDIAN_READ_ONLY=true denies all writes.";
|
|
892
975
|
readonly recovery: "Use a path inside the configured write scope. The error data echoes the active scope.";
|
|
@@ -894,39 +977,47 @@ export declare const writeToolDefinitions: (import("@cyanheads/mcp-ts-core").Too
|
|
|
894
977
|
readonly reason: "cancelled";
|
|
895
978
|
readonly code: import("@cyanheads/mcp-ts-core/errors").JsonRpcErrorCode.InvalidRequest;
|
|
896
979
|
readonly when: "User declined, cancelled, or answered false to the confirmation request.";
|
|
980
|
+
readonly severity: "notice";
|
|
897
981
|
readonly recovery: "Re-run the tool when the user is ready to confirm deletion.";
|
|
898
982
|
}, {
|
|
899
983
|
readonly reason: "note_missing";
|
|
984
|
+
readonly thrownBy: "service";
|
|
900
985
|
readonly code: import("@cyanheads/mcp-ts-core/errors").JsonRpcErrorCode.NotFound;
|
|
901
986
|
readonly when: "The vault path does not resolve to an existing note.";
|
|
902
987
|
readonly recovery: "Verify the path with obsidian_list_notes or use obsidian_search_notes to locate the note.";
|
|
903
988
|
}, {
|
|
904
989
|
readonly reason: "no_active_file";
|
|
990
|
+
readonly thrownBy: "service";
|
|
905
991
|
readonly code: import("@cyanheads/mcp-ts-core/errors").JsonRpcErrorCode.NotFound;
|
|
906
992
|
readonly when: "Target was `active` but no file is currently open in Obsidian.";
|
|
907
993
|
readonly recovery: "Call obsidian_open_in_ui to focus a file, or pass an explicit path target instead.";
|
|
908
994
|
}, {
|
|
909
995
|
readonly reason: "periodic_unsupported";
|
|
996
|
+
readonly thrownBy: "service";
|
|
910
997
|
readonly code: import("@cyanheads/mcp-ts-core/errors").JsonRpcErrorCode.NotFound;
|
|
911
998
|
readonly when: "Target was `periodic` and this vault runs Local REST API v5.0.2 or later without the companion periodic-notes extension, so the `/periodic/` routes are not served at all.";
|
|
912
999
|
readonly recovery: "Install the periodic-notes extension from https://github.com/coddingtonbear/obsidian-local-rest-api-periodic-notes, or address the note by an explicit vault path.";
|
|
913
1000
|
}, {
|
|
914
1001
|
readonly reason: "periodic_not_found";
|
|
1002
|
+
readonly thrownBy: "service";
|
|
915
1003
|
readonly code: import("@cyanheads/mcp-ts-core/errors").JsonRpcErrorCode.NotFound;
|
|
916
1004
|
readonly when: "Target was `periodic`, the `/periodic/` routes are served on this vault, and no note exists for the requested period.";
|
|
917
1005
|
readonly recovery: "Pass an explicit path target — periodic notes must already exist.";
|
|
918
1006
|
}, {
|
|
919
1007
|
readonly reason: "periodic_disabled";
|
|
1008
|
+
readonly thrownBy: "service";
|
|
920
1009
|
readonly code: import("@cyanheads/mcp-ts-core/errors").JsonRpcErrorCode.ValidationError;
|
|
921
1010
|
readonly when: "Target was `periodic` but the requested period is not enabled in Obsidian's Periodic Notes plugin settings.";
|
|
922
1011
|
readonly recovery: "Pass an explicit path target — the requested period is disabled in the operator's Periodic Notes plugin.";
|
|
923
1012
|
}, {
|
|
924
1013
|
readonly reason: "path_is_directory";
|
|
1014
|
+
readonly thrownBy: "service";
|
|
925
1015
|
readonly code: import("@cyanheads/mcp-ts-core/errors").JsonRpcErrorCode.ValidationError;
|
|
926
1016
|
readonly when: "The supplied path names a folder rather than a note file. Deleting a folder is not offered — the upstream removes it and everything inside it in one unrecoverable step.";
|
|
927
1017
|
readonly recovery: "Call obsidian_list_notes with this path to list the folder, then delete files one at a time by their full paths.";
|
|
928
1018
|
}, {
|
|
929
1019
|
readonly reason: "path_traversal";
|
|
1020
|
+
readonly thrownBy: "service";
|
|
930
1021
|
readonly code: import("@cyanheads/mcp-ts-core/errors").JsonRpcErrorCode.ValidationError;
|
|
931
1022
|
readonly when: "The path contains a `.` or `..` segment, which is rejected to prevent vault escape.";
|
|
932
1023
|
readonly recovery: "Supply a vault-relative path with no `.` or `..` segments, e.g. \"Projects/Note.md\". Use obsidian_list_notes to browse the vault.";
|
|
@@ -959,6 +1050,7 @@ export declare const commandToolDefinitions: (import("@cyanheads/mcp-ts-core").T
|
|
|
959
1050
|
executed: import("zod").ZodBoolean;
|
|
960
1051
|
}, import("zod/v4/core").$strip>, readonly [{
|
|
961
1052
|
readonly reason: "command_unknown";
|
|
1053
|
+
readonly thrownBy: "service";
|
|
962
1054
|
readonly code: import("@cyanheads/mcp-ts-core/errors").JsonRpcErrorCode.NotFound;
|
|
963
1055
|
readonly when: "The supplied `commandId` is not registered in Obsidian. Use `obsidian_list_commands` to discover valid IDs.";
|
|
964
1056
|
readonly recovery: "Call obsidian_list_commands to discover the registered command IDs.";
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/mcp-server/tools/definitions/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAgBH,OAAO,EAAE,oBAAoB,EAAE,MAAM,iCAAiC,CAAC;AAEvE;;;;;;;;;;;;GAYG;AACH,eAAO,MAAM,mBAAmB
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/mcp-server/tools/definitions/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAgBH,OAAO,EAAE,oBAAoB,EAAE,MAAM,iCAAiC,CAAC;AAEvE;;;;;;;;;;;;GAYG;AACH,eAAO,MAAM,mBAAmB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;iBAK/B,CAAC;AAEF,kFAAkF;AAClF,eAAO,MAAM,oBAAoB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;iBAQhC,CAAC;AAEF,mHAAmH;AACnH,eAAO,MAAM,sBAAsB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;iBAAiD,CAAC"}
|