obsidian-mcp-server 3.1.1 → 3.1.3

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 (75) hide show
  1. package/CLAUDE.md +10 -1
  2. package/README.md +30 -8
  3. package/changelog/3.1.x/3.1.2.md +23 -0
  4. package/changelog/3.1.x/3.1.3.md +23 -0
  5. package/dist/config/server-config.d.ts +5 -2
  6. package/dist/config/server-config.d.ts.map +1 -1
  7. package/dist/config/server-config.js +73 -0
  8. package/dist/config/server-config.js.map +1 -1
  9. package/dist/index.js +39 -5
  10. package/dist/index.js.map +1 -1
  11. package/dist/mcp-server/tools/definitions/_shared/schemas.d.ts.map +1 -1
  12. package/dist/mcp-server/tools/definitions/_shared/schemas.js +4 -2
  13. package/dist/mcp-server/tools/definitions/_shared/schemas.js.map +1 -1
  14. package/dist/mcp-server/tools/definitions/index.d.ts +764 -27
  15. package/dist/mcp-server/tools/definitions/index.d.ts.map +1 -1
  16. package/dist/mcp-server/tools/definitions/index.js +15 -9
  17. package/dist/mcp-server/tools/definitions/index.js.map +1 -1
  18. package/dist/mcp-server/tools/definitions/obsidian-append-to-note.tool.d.ts +7 -1
  19. package/dist/mcp-server/tools/definitions/obsidian-append-to-note.tool.d.ts.map +1 -1
  20. package/dist/mcp-server/tools/definitions/obsidian-append-to-note.tool.js +10 -1
  21. package/dist/mcp-server/tools/definitions/obsidian-append-to-note.tool.js.map +1 -1
  22. package/dist/mcp-server/tools/definitions/obsidian-delete-note.tool.d.ts +7 -2
  23. package/dist/mcp-server/tools/definitions/obsidian-delete-note.tool.d.ts.map +1 -1
  24. package/dist/mcp-server/tools/definitions/obsidian-delete-note.tool.js +8 -2
  25. package/dist/mcp-server/tools/definitions/obsidian-delete-note.tool.js.map +1 -1
  26. package/dist/mcp-server/tools/definitions/obsidian-execute-command.tool.js +2 -2
  27. package/dist/mcp-server/tools/definitions/obsidian-execute-command.tool.js.map +1 -1
  28. package/dist/mcp-server/tools/definitions/obsidian-get-note.tool.d.ts +15 -2
  29. package/dist/mcp-server/tools/definitions/obsidian-get-note.tool.d.ts.map +1 -1
  30. package/dist/mcp-server/tools/definitions/obsidian-get-note.tool.js +65 -5
  31. package/dist/mcp-server/tools/definitions/obsidian-get-note.tool.js.map +1 -1
  32. package/dist/mcp-server/tools/definitions/obsidian-list-notes.tool.d.ts +7 -2
  33. package/dist/mcp-server/tools/definitions/obsidian-list-notes.tool.d.ts.map +1 -1
  34. package/dist/mcp-server/tools/definitions/obsidian-list-notes.tool.js +20 -7
  35. package/dist/mcp-server/tools/definitions/obsidian-list-notes.tool.js.map +1 -1
  36. package/dist/mcp-server/tools/definitions/obsidian-list-tags.tool.js +1 -1
  37. package/dist/mcp-server/tools/definitions/obsidian-list-tags.tool.js.map +1 -1
  38. package/dist/mcp-server/tools/definitions/obsidian-manage-frontmatter.tool.d.ts +7 -2
  39. package/dist/mcp-server/tools/definitions/obsidian-manage-frontmatter.tool.d.ts.map +1 -1
  40. package/dist/mcp-server/tools/definitions/obsidian-manage-frontmatter.tool.js +10 -4
  41. package/dist/mcp-server/tools/definitions/obsidian-manage-frontmatter.tool.js.map +1 -1
  42. package/dist/mcp-server/tools/definitions/obsidian-manage-tags.tool.d.ts +7 -2
  43. package/dist/mcp-server/tools/definitions/obsidian-manage-tags.tool.d.ts.map +1 -1
  44. package/dist/mcp-server/tools/definitions/obsidian-manage-tags.tool.js +9 -3
  45. package/dist/mcp-server/tools/definitions/obsidian-manage-tags.tool.js.map +1 -1
  46. package/dist/mcp-server/tools/definitions/obsidian-open-in-ui.tool.d.ts +5 -0
  47. package/dist/mcp-server/tools/definitions/obsidian-open-in-ui.tool.d.ts.map +1 -1
  48. package/dist/mcp-server/tools/definitions/obsidian-open-in-ui.tool.js +6 -0
  49. package/dist/mcp-server/tools/definitions/obsidian-open-in-ui.tool.js.map +1 -1
  50. package/dist/mcp-server/tools/definitions/obsidian-patch-note.tool.d.ts +9 -4
  51. package/dist/mcp-server/tools/definitions/obsidian-patch-note.tool.d.ts.map +1 -1
  52. package/dist/mcp-server/tools/definitions/obsidian-patch-note.tool.js +10 -4
  53. package/dist/mcp-server/tools/definitions/obsidian-patch-note.tool.js.map +1 -1
  54. package/dist/mcp-server/tools/definitions/obsidian-replace-in-note.tool.d.ts +8 -3
  55. package/dist/mcp-server/tools/definitions/obsidian-replace-in-note.tool.d.ts.map +1 -1
  56. package/dist/mcp-server/tools/definitions/obsidian-replace-in-note.tool.js +10 -4
  57. package/dist/mcp-server/tools/definitions/obsidian-replace-in-note.tool.js.map +1 -1
  58. package/dist/mcp-server/tools/definitions/obsidian-search-notes.tool.d.ts +2 -2
  59. package/dist/mcp-server/tools/definitions/obsidian-search-notes.tool.d.ts.map +1 -1
  60. package/dist/mcp-server/tools/definitions/obsidian-search-notes.tool.js +21 -16
  61. package/dist/mcp-server/tools/definitions/obsidian-search-notes.tool.js.map +1 -1
  62. package/dist/mcp-server/tools/definitions/obsidian-write-note.tool.d.ts +5 -0
  63. package/dist/mcp-server/tools/definitions/obsidian-write-note.tool.d.ts.map +1 -1
  64. package/dist/mcp-server/tools/definitions/obsidian-write-note.tool.js +7 -1
  65. package/dist/mcp-server/tools/definitions/obsidian-write-note.tool.js.map +1 -1
  66. package/dist/services/obsidian/obsidian-service.d.ts +7 -0
  67. package/dist/services/obsidian/obsidian-service.d.ts.map +1 -1
  68. package/dist/services/obsidian/obsidian-service.js +114 -17
  69. package/dist/services/obsidian/obsidian-service.js.map +1 -1
  70. package/dist/services/obsidian/path-policy.d.ts +56 -0
  71. package/dist/services/obsidian/path-policy.d.ts.map +1 -0
  72. package/dist/services/obsidian/path-policy.js +154 -0
  73. package/dist/services/obsidian/path-policy.js.map +1 -0
  74. package/package.json +17 -6
  75. package/server.json +41 -3
@@ -1,12 +1,691 @@
1
1
  /**
2
- * @fileoverview Tool registration barrel. The command-palette pair
3
- * (`obsidian_list_commands` + `obsidian_execute_command`) is exported
4
- * separately so callers can decide whether to register them based on the
5
- * `OBSIDIAN_ENABLE_COMMANDS` flag — keeping this module free of eager
6
- * config reads.
2
+ * @fileoverview Tool registration barrel. Tools are split into read-only and
3
+ * write groups so the entry point can wrap the write set with `disabledTool()`
4
+ * when `OBSIDIAN_READ_ONLY=true`. The command-palette pair is exported
5
+ * separately so the entry point wraps it with `disabledTool()` when either
6
+ * `OBSIDIAN_ENABLE_COMMANDS=false` or `OBSIDIAN_READ_ONLY=true` — keeping this
7
+ * module free of eager config reads.
7
8
  * @module mcp-server/tools/definitions/index
8
9
  */
9
- /** Tools registered unconditionally on every server. */
10
+ /** Read-only tools — always registered, even with `OBSIDIAN_READ_ONLY=true`. */
11
+ export declare const readToolDefinitions: (import("@cyanheads/mcp-ts-core").ToolDefinition<import("zod").ZodObject<{
12
+ format: import("zod").ZodEnum<{
13
+ content: "content";
14
+ section: "section";
15
+ full: "full";
16
+ "document-map": "document-map";
17
+ }>;
18
+ target: import("zod").ZodDiscriminatedUnion<[import("zod").ZodObject<{
19
+ type: import("zod").ZodLiteral<"path">;
20
+ path: import("zod").ZodString;
21
+ }, import("zod/v4/core").$strip>, import("zod").ZodObject<{
22
+ type: import("zod").ZodLiteral<"active">;
23
+ }, import("zod/v4/core").$strip>, import("zod").ZodObject<{
24
+ type: import("zod").ZodLiteral<"periodic">;
25
+ period: import("zod").ZodEnum<{
26
+ daily: "daily";
27
+ weekly: "weekly";
28
+ monthly: "monthly";
29
+ quarterly: "quarterly";
30
+ yearly: "yearly";
31
+ }>;
32
+ date: import("zod").ZodOptional<import("zod").ZodString>;
33
+ }, import("zod/v4/core").$strip>], "type">;
34
+ section: import("zod").ZodOptional<import("zod").ZodObject<{
35
+ type: import("zod").ZodEnum<{
36
+ heading: "heading";
37
+ block: "block";
38
+ frontmatter: "frontmatter";
39
+ }>;
40
+ target: import("zod").ZodString;
41
+ }, import("zod/v4/core").$strip>>;
42
+ includeLinks: import("zod").ZodDefault<import("zod").ZodBoolean>;
43
+ }, import("zod/v4/core").$strip>, import("zod").ZodObject<{
44
+ result: import("zod").ZodDiscriminatedUnion<[import("zod").ZodObject<{
45
+ format: import("zod").ZodLiteral<"content">;
46
+ path: import("zod").ZodString;
47
+ content: import("zod").ZodString;
48
+ }, import("zod/v4/core").$strip>, import("zod").ZodObject<{
49
+ format: import("zod").ZodLiteral<"full">;
50
+ path: import("zod").ZodString;
51
+ content: import("zod").ZodString;
52
+ frontmatter: import("zod").ZodRecord<import("zod").ZodString, import("zod").ZodUnknown>;
53
+ tags: import("zod").ZodArray<import("zod").ZodString>;
54
+ stat: import("zod").ZodObject<{
55
+ ctime: import("zod").ZodNumber;
56
+ mtime: import("zod").ZodNumber;
57
+ size: import("zod").ZodNumber;
58
+ }, import("zod/v4/core").$strip>;
59
+ outgoingLinks: import("zod").ZodOptional<import("zod").ZodArray<import("zod").ZodObject<{
60
+ target: import("zod").ZodString;
61
+ type: import("zod").ZodEnum<{
62
+ markdown: "markdown";
63
+ wikilink: "wikilink";
64
+ }>;
65
+ }, import("zod/v4/core").$strip>>>;
66
+ }, import("zod/v4/core").$strip>, import("zod").ZodObject<{
67
+ format: import("zod").ZodLiteral<"document-map">;
68
+ path: import("zod").ZodString;
69
+ headings: import("zod").ZodArray<import("zod").ZodString>;
70
+ blocks: import("zod").ZodArray<import("zod").ZodString>;
71
+ frontmatterFields: import("zod").ZodArray<import("zod").ZodString>;
72
+ }, import("zod/v4/core").$strip>, import("zod").ZodObject<{
73
+ format: import("zod").ZodLiteral<"section">;
74
+ path: import("zod").ZodString;
75
+ section: import("zod").ZodObject<{
76
+ type: import("zod").ZodEnum<{
77
+ heading: "heading";
78
+ block: "block";
79
+ frontmatter: "frontmatter";
80
+ }>;
81
+ target: import("zod").ZodString;
82
+ }, import("zod/v4/core").$strip>;
83
+ valueText: import("zod").ZodOptional<import("zod").ZodString>;
84
+ valueJson: import("zod").ZodOptional<import("zod").ZodUnknown>;
85
+ }, import("zod/v4/core").$strip>], "format">;
86
+ }, import("zod/v4/core").$strip>, readonly [{
87
+ readonly reason: "section_required";
88
+ readonly code: import("@cyanheads/mcp-ts-core/errors").JsonRpcErrorCode.ValidationError;
89
+ readonly when: "`format` is \"section\" but no `section` locator was provided.";
90
+ readonly recovery: "Pass `section: { type, target }` (e.g. `{ type: \"heading\", target: \"Intro\" }`), or use `format: \"full\"` / `\"document-map\"` instead.";
91
+ }, {
92
+ readonly reason: "path_forbidden";
93
+ readonly code: import("@cyanheads/mcp-ts-core/errors").JsonRpcErrorCode.Forbidden;
94
+ readonly when: "The target path is outside OBSIDIAN_READ_PATHS (and OBSIDIAN_WRITE_PATHS, since write paths imply read access).";
95
+ readonly recovery: "Use a path inside the configured read scope. The error data echoes the active scope.";
96
+ }, {
97
+ readonly reason: "note_missing";
98
+ readonly code: import("@cyanheads/mcp-ts-core/errors").JsonRpcErrorCode.NotFound;
99
+ readonly when: "The vault path does not resolve to an existing note.";
100
+ readonly recovery: "Verify the path with obsidian_list_notes or use obsidian_search_notes to locate the note.";
101
+ }, {
102
+ readonly reason: "no_active_file";
103
+ readonly code: import("@cyanheads/mcp-ts-core/errors").JsonRpcErrorCode.NotFound;
104
+ readonly when: "Target was `active` but no file is currently open in Obsidian.";
105
+ readonly recovery: "Call obsidian_open_in_ui to focus a file, or pass an explicit path target instead.";
106
+ }, {
107
+ readonly reason: "periodic_not_found";
108
+ readonly code: import("@cyanheads/mcp-ts-core/errors").JsonRpcErrorCode.NotFound;
109
+ readonly when: "Target was `periodic` but no matching periodic note exists.";
110
+ readonly recovery: "Create the periodic note first or pass an explicit path target.";
111
+ }, {
112
+ readonly reason: "periodic_disabled";
113
+ readonly code: import("@cyanheads/mcp-ts-core/errors").JsonRpcErrorCode.ValidationError;
114
+ readonly when: "Target was `periodic` but the requested period is not enabled in Obsidian's Periodic Notes plugin settings.";
115
+ readonly recovery: "Pass an explicit path target — the requested period is disabled in the operator's Periodic Notes plugin.";
116
+ }]> | import("@cyanheads/mcp-ts-core").ToolDefinition<import("zod").ZodObject<{
117
+ path: import("zod").ZodOptional<import("zod").ZodString>;
118
+ extension: import("zod").ZodOptional<import("zod").ZodString>;
119
+ nameRegex: import("zod").ZodOptional<import("zod").ZodString>;
120
+ depth: import("zod").ZodDefault<import("zod").ZodNumber>;
121
+ }, import("zod/v4/core").$strip>, import("zod").ZodObject<{
122
+ path: import("zod").ZodString;
123
+ entries: import("zod").ZodArray<import("zod").ZodObject<{
124
+ path: import("zod").ZodString;
125
+ type: import("zod").ZodEnum<{
126
+ file: "file";
127
+ directory: "directory";
128
+ }>;
129
+ truncated: import("zod").ZodOptional<import("zod").ZodBoolean>;
130
+ }, import("zod/v4/core").$strip>>;
131
+ totals: import("zod").ZodObject<{
132
+ entries: import("zod").ZodNumber;
133
+ files: import("zod").ZodNumber;
134
+ directories: import("zod").ZodNumber;
135
+ }, import("zod/v4/core").$strip>;
136
+ appliedFilters: import("zod").ZodObject<{
137
+ extension: import("zod").ZodOptional<import("zod").ZodString>;
138
+ nameRegex: import("zod").ZodOptional<import("zod").ZodString>;
139
+ depth: import("zod").ZodNumber;
140
+ }, import("zod/v4/core").$strip>;
141
+ excluded: import("zod").ZodOptional<import("zod").ZodObject<{
142
+ reason: import("zod").ZodLiteral<"entry_cap">;
143
+ cap: import("zod").ZodNumber;
144
+ hint: import("zod").ZodString;
145
+ }, import("zod/v4/core").$strip>>;
146
+ }, import("zod/v4/core").$strip>, readonly [{
147
+ readonly reason: "regex_invalid";
148
+ readonly code: import("@cyanheads/mcp-ts-core/errors").JsonRpcErrorCode.ValidationError;
149
+ readonly when: "The supplied `nameRegex` is not a valid ECMAScript regex.";
150
+ readonly recovery: "Use a valid ECMAScript regex (e.g. `^Project.*\\.md$`), or omit nameRegex to disable filtering.";
151
+ }, {
152
+ readonly reason: "path_forbidden";
153
+ readonly code: import("@cyanheads/mcp-ts-core/errors").JsonRpcErrorCode.Forbidden;
154
+ readonly when: "The supplied `path` is outside OBSIDIAN_READ_PATHS (root listings always pass; specific subdirectories must be readable).";
155
+ 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.";
156
+ }, {
157
+ readonly reason: "note_missing";
158
+ readonly code: import("@cyanheads/mcp-ts-core/errors").JsonRpcErrorCode.NotFound;
159
+ readonly when: "The supplied `path` does not exist in the vault. Sub-directories that disappear mid-walk are silently skipped — only the root path surfaces this error.";
160
+ readonly recovery: "List a parent directory to find the correct casing or check the spelling.";
161
+ }]> | import("@cyanheads/mcp-ts-core").ToolDefinition<import("zod").ZodObject<{}, import("zod/v4/core").$strip>, import("zod").ZodObject<{
162
+ tags: import("zod").ZodArray<import("zod").ZodObject<{
163
+ name: import("zod").ZodString;
164
+ count: import("zod").ZodNumber;
165
+ }, import("zod/v4/core").$strip>>;
166
+ }, import("zod/v4/core").$strip>, undefined> | import("@cyanheads/mcp-ts-core").ToolDefinition<import("zod").ZodObject<{
167
+ path: import("zod").ZodString;
168
+ failIfMissing: import("zod").ZodDefault<import("zod").ZodBoolean>;
169
+ newLeaf: import("zod").ZodDefault<import("zod").ZodBoolean>;
170
+ }, import("zod/v4/core").$strip>, import("zod").ZodObject<{
171
+ path: import("zod").ZodString;
172
+ opened: import("zod").ZodBoolean;
173
+ createdIfMissing: import("zod").ZodBoolean;
174
+ }, import("zod/v4/core").$strip>, readonly [{
175
+ readonly reason: "path_forbidden";
176
+ readonly code: import("@cyanheads/mcp-ts-core/errors").JsonRpcErrorCode.Forbidden;
177
+ readonly when: "The target path is outside OBSIDIAN_READ_PATHS (and OBSIDIAN_WRITE_PATHS, since write paths imply read access).";
178
+ readonly recovery: "Use a path inside the configured read scope. The error data echoes the active scope.";
179
+ }, {
180
+ readonly reason: "note_missing";
181
+ readonly code: import("@cyanheads/mcp-ts-core/errors").JsonRpcErrorCode.NotFound;
182
+ readonly when: "`failIfMissing: true` (default) and the path does not exist in the vault. Pass `failIfMissing: false` to allow Obsidian to create the file on open.";
183
+ readonly recovery: "Verify the path with obsidian_list_notes or pass failIfMissing false to create on open.";
184
+ }]> | import("@cyanheads/mcp-ts-core").ToolDefinition<import("zod").ZodObject<{
185
+ mode: import("zod").ZodEnum<{
186
+ text: "text";
187
+ dataview: "dataview";
188
+ jsonlogic: "jsonlogic";
189
+ }>;
190
+ query: import("zod").ZodOptional<import("zod").ZodString>;
191
+ logic: import("zod").ZodOptional<import("zod").ZodRecord<import("zod").ZodString, import("zod").ZodUnknown>>;
192
+ contextLength: import("zod").ZodDefault<import("zod").ZodNumber>;
193
+ pathPrefix: import("zod").ZodOptional<import("zod").ZodString>;
194
+ maxMatchesPerHit: import("zod").ZodDefault<import("zod").ZodNumber>;
195
+ }, import("zod/v4/core").$strip>, import("zod").ZodObject<{
196
+ result: import("zod").ZodDiscriminatedUnion<[import("zod").ZodObject<{
197
+ mode: import("zod").ZodLiteral<"text">;
198
+ hits: import("zod").ZodArray<import("zod").ZodObject<{
199
+ filename: import("zod").ZodString;
200
+ score: import("zod").ZodOptional<import("zod").ZodNumber>;
201
+ matches: import("zod").ZodArray<import("zod").ZodObject<{
202
+ context: import("zod").ZodString;
203
+ match: import("zod").ZodObject<{
204
+ start: import("zod").ZodNumber;
205
+ end: import("zod").ZodNumber;
206
+ }, import("zod/v4/core").$strip>;
207
+ }, import("zod/v4/core").$strip>>;
208
+ totalMatches: import("zod").ZodOptional<import("zod").ZodNumber>;
209
+ truncated: import("zod").ZodOptional<import("zod").ZodBoolean>;
210
+ }, import("zod/v4/core").$strip>>;
211
+ excluded: import("zod").ZodOptional<import("zod").ZodObject<{
212
+ count: import("zod").ZodNumber;
213
+ hint: import("zod").ZodString;
214
+ }, import("zod/v4/core").$strip>>;
215
+ }, import("zod/v4/core").$strip>, import("zod").ZodObject<{
216
+ mode: import("zod").ZodLiteral<"dataview">;
217
+ hits: import("zod").ZodArray<import("zod").ZodObject<{
218
+ filename: import("zod").ZodString;
219
+ result: import("zod").ZodUnknown;
220
+ }, import("zod/v4/core").$strip>>;
221
+ excluded: import("zod").ZodOptional<import("zod").ZodObject<{
222
+ count: import("zod").ZodNumber;
223
+ hint: import("zod").ZodString;
224
+ }, import("zod/v4/core").$strip>>;
225
+ }, import("zod/v4/core").$strip>, import("zod").ZodObject<{
226
+ mode: import("zod").ZodLiteral<"jsonlogic">;
227
+ hits: import("zod").ZodArray<import("zod").ZodObject<{
228
+ filename: import("zod").ZodString;
229
+ result: import("zod").ZodUnknown;
230
+ }, import("zod/v4/core").$strip>>;
231
+ excluded: import("zod").ZodOptional<import("zod").ZodObject<{
232
+ count: import("zod").ZodNumber;
233
+ hint: import("zod").ZodString;
234
+ }, import("zod/v4/core").$strip>>;
235
+ }, import("zod/v4/core").$strip>], "mode">;
236
+ }, import("zod/v4/core").$strip>, readonly [{
237
+ readonly reason: "path_prefix_invalid_mode";
238
+ readonly code: import("@cyanheads/mcp-ts-core/errors").JsonRpcErrorCode.ValidationError;
239
+ readonly when: "`pathPrefix` was provided in a non-text mode (only `text` supports prefix filtering).";
240
+ readonly recovery: "Drop pathPrefix or switch mode to text for prefix filtering.";
241
+ }, {
242
+ readonly reason: "query_required";
243
+ readonly code: import("@cyanheads/mcp-ts-core/errors").JsonRpcErrorCode.ValidationError;
244
+ readonly when: "`query` is missing for `text` or `dataview` mode (required for both).";
245
+ readonly recovery: "Pass `query` — search terms for text mode (e.g. \"TODO\"), or DQL like \"TABLE WHERE file.mtime > date(today)\" for dataview mode.";
246
+ }, {
247
+ readonly reason: "logic_required";
248
+ readonly code: import("@cyanheads/mcp-ts-core/errors").JsonRpcErrorCode.ValidationError;
249
+ readonly when: "`logic` is missing for `jsonlogic` mode.";
250
+ readonly recovery: "Pass a JSONLogic tree as `logic`, e.g. `{\"glob\": [{\"var\": \"path\"}, \"Projects/*.md\"]}`.";
251
+ }]>)[];
252
+ /** Write tools — wrapped with `disabledTool()` when `OBSIDIAN_READ_ONLY=true`. */
253
+ export declare const writeToolDefinitions: (import("@cyanheads/mcp-ts-core").ToolDefinition<import("zod").ZodObject<{
254
+ target: import("zod").ZodDiscriminatedUnion<[import("zod").ZodObject<{
255
+ type: import("zod").ZodLiteral<"path">;
256
+ path: import("zod").ZodString;
257
+ }, import("zod/v4/core").$strip>, import("zod").ZodObject<{
258
+ type: import("zod").ZodLiteral<"active">;
259
+ }, import("zod/v4/core").$strip>, import("zod").ZodObject<{
260
+ type: import("zod").ZodLiteral<"periodic">;
261
+ period: import("zod").ZodEnum<{
262
+ daily: "daily";
263
+ weekly: "weekly";
264
+ monthly: "monthly";
265
+ quarterly: "quarterly";
266
+ yearly: "yearly";
267
+ }>;
268
+ date: import("zod").ZodOptional<import("zod").ZodString>;
269
+ }, import("zod/v4/core").$strip>], "type">;
270
+ content: import("zod").ZodString;
271
+ section: import("zod").ZodOptional<import("zod").ZodObject<{
272
+ type: import("zod").ZodEnum<{
273
+ heading: "heading";
274
+ block: "block";
275
+ frontmatter: "frontmatter";
276
+ }>;
277
+ target: import("zod").ZodString;
278
+ }, import("zod/v4/core").$strip>>;
279
+ contentType: import("zod").ZodDefault<import("zod").ZodEnum<{
280
+ markdown: "markdown";
281
+ json: "json";
282
+ }>>;
283
+ createTargetIfMissing: import("zod").ZodDefault<import("zod").ZodBoolean>;
284
+ }, import("zod/v4/core").$strip>, import("zod").ZodObject<{
285
+ path: import("zod").ZodString;
286
+ sectionTargeted: import("zod").ZodBoolean;
287
+ }, import("zod/v4/core").$strip>, readonly [{
288
+ readonly reason: "path_forbidden";
289
+ readonly code: import("@cyanheads/mcp-ts-core/errors").JsonRpcErrorCode.Forbidden;
290
+ readonly when: "The target path is outside OBSIDIAN_WRITE_PATHS, or OBSIDIAN_READ_ONLY=true denies all writes.";
291
+ readonly recovery: "Use a path inside the configured write scope. The error data echoes the active scope.";
292
+ }]> | import("@cyanheads/mcp-ts-core").ToolDefinition<import("zod").ZodObject<{
293
+ target: import("zod").ZodDiscriminatedUnion<[import("zod").ZodObject<{
294
+ type: import("zod").ZodLiteral<"path">;
295
+ path: import("zod").ZodString;
296
+ }, import("zod/v4/core").$strip>, import("zod").ZodObject<{
297
+ type: import("zod").ZodLiteral<"active">;
298
+ }, import("zod/v4/core").$strip>, import("zod").ZodObject<{
299
+ type: import("zod").ZodLiteral<"periodic">;
300
+ period: import("zod").ZodEnum<{
301
+ daily: "daily";
302
+ weekly: "weekly";
303
+ monthly: "monthly";
304
+ quarterly: "quarterly";
305
+ yearly: "yearly";
306
+ }>;
307
+ date: import("zod").ZodOptional<import("zod").ZodString>;
308
+ }, import("zod/v4/core").$strip>], "type">;
309
+ }, import("zod/v4/core").$strip>, import("zod").ZodObject<{
310
+ path: import("zod").ZodString;
311
+ deleted: import("zod").ZodBoolean;
312
+ }, import("zod/v4/core").$strip>, readonly [{
313
+ readonly reason: "path_forbidden";
314
+ readonly code: import("@cyanheads/mcp-ts-core/errors").JsonRpcErrorCode.Forbidden;
315
+ readonly when: "The target path is outside OBSIDIAN_WRITE_PATHS, or OBSIDIAN_READ_ONLY=true denies all writes.";
316
+ readonly recovery: "Use a path inside the configured write scope. The error data echoes the active scope.";
317
+ }, {
318
+ readonly reason: "cancelled";
319
+ readonly code: import("@cyanheads/mcp-ts-core/errors").JsonRpcErrorCode.InvalidRequest;
320
+ readonly when: "User declined the deletion via interactive elicitation.";
321
+ readonly recovery: "Re-run the tool when the user is ready to confirm deletion.";
322
+ }, {
323
+ readonly reason: "note_missing";
324
+ readonly code: import("@cyanheads/mcp-ts-core/errors").JsonRpcErrorCode.NotFound;
325
+ readonly when: "The vault path does not resolve to an existing note.";
326
+ readonly recovery: "Verify the path with obsidian_list_notes or use obsidian_search_notes to locate the note.";
327
+ }, {
328
+ readonly reason: "no_active_file";
329
+ readonly code: import("@cyanheads/mcp-ts-core/errors").JsonRpcErrorCode.NotFound;
330
+ readonly when: "Target was `active` but no file is currently open in Obsidian.";
331
+ readonly recovery: "Call obsidian_open_in_ui to focus a file, or pass an explicit path target instead.";
332
+ }, {
333
+ readonly reason: "periodic_not_found";
334
+ readonly code: import("@cyanheads/mcp-ts-core/errors").JsonRpcErrorCode.NotFound;
335
+ readonly when: "Target was `periodic` but no matching periodic note exists.";
336
+ readonly recovery: "Pass an explicit path target — periodic notes must already exist.";
337
+ }, {
338
+ readonly reason: "periodic_disabled";
339
+ readonly code: import("@cyanheads/mcp-ts-core/errors").JsonRpcErrorCode.ValidationError;
340
+ readonly when: "Target was `periodic` but the requested period is not enabled in Obsidian's Periodic Notes plugin settings.";
341
+ readonly recovery: "Pass an explicit path target — the requested period is disabled in the operator's Periodic Notes plugin.";
342
+ }]> | import("@cyanheads/mcp-ts-core").ToolDefinition<import("zod").ZodObject<{
343
+ operation: import("zod").ZodEnum<{
344
+ set: "set";
345
+ delete: "delete";
346
+ get: "get";
347
+ }>;
348
+ target: import("zod").ZodDiscriminatedUnion<[import("zod").ZodObject<{
349
+ type: import("zod").ZodLiteral<"path">;
350
+ path: import("zod").ZodString;
351
+ }, import("zod/v4/core").$strip>, import("zod").ZodObject<{
352
+ type: import("zod").ZodLiteral<"active">;
353
+ }, import("zod/v4/core").$strip>, import("zod").ZodObject<{
354
+ type: import("zod").ZodLiteral<"periodic">;
355
+ period: import("zod").ZodEnum<{
356
+ daily: "daily";
357
+ weekly: "weekly";
358
+ monthly: "monthly";
359
+ quarterly: "quarterly";
360
+ yearly: "yearly";
361
+ }>;
362
+ date: import("zod").ZodOptional<import("zod").ZodString>;
363
+ }, import("zod/v4/core").$strip>], "type">;
364
+ key: import("zod").ZodString;
365
+ value: import("zod").ZodOptional<import("zod").ZodUnknown>;
366
+ }, import("zod/v4/core").$strip>, import("zod").ZodObject<{
367
+ result: import("zod").ZodDiscriminatedUnion<[import("zod").ZodObject<{
368
+ operation: import("zod").ZodLiteral<"get">;
369
+ path: import("zod").ZodString;
370
+ key: import("zod").ZodString;
371
+ exists: import("zod").ZodBoolean;
372
+ value: import("zod").ZodUnknown;
373
+ }, import("zod/v4/core").$strip>, import("zod").ZodObject<{
374
+ operation: import("zod").ZodLiteral<"set">;
375
+ path: import("zod").ZodString;
376
+ key: import("zod").ZodString;
377
+ frontmatter: import("zod").ZodRecord<import("zod").ZodString, import("zod").ZodUnknown>;
378
+ }, import("zod/v4/core").$strip>, import("zod").ZodObject<{
379
+ operation: import("zod").ZodLiteral<"delete">;
380
+ path: import("zod").ZodString;
381
+ key: import("zod").ZodString;
382
+ frontmatter: import("zod").ZodRecord<import("zod").ZodString, import("zod").ZodUnknown>;
383
+ }, import("zod/v4/core").$strip>], "operation">;
384
+ }, import("zod/v4/core").$strip>, readonly [{
385
+ readonly reason: "path_forbidden";
386
+ readonly code: import("@cyanheads/mcp-ts-core/errors").JsonRpcErrorCode.Forbidden;
387
+ readonly when: "`get` requires the path to be readable; `set`/`delete` require it to be inside OBSIDIAN_WRITE_PATHS, with OBSIDIAN_READ_ONLY=false.";
388
+ readonly recovery: "Use a path inside the configured scope. The error data echoes the active scope.";
389
+ }, {
390
+ readonly reason: "value_required";
391
+ readonly code: import("@cyanheads/mcp-ts-core/errors").JsonRpcErrorCode.ValidationError;
392
+ readonly when: "`operation` is \"set\" but no `value` was supplied.";
393
+ readonly recovery: "Pass `value` as any JSON-typed value: string, number, boolean, array, or object (e.g. `\"draft\"`, `42`, `true`, `[\"a\",\"b\"]`).";
394
+ }, {
395
+ readonly reason: "note_missing";
396
+ readonly code: import("@cyanheads/mcp-ts-core/errors").JsonRpcErrorCode.NotFound;
397
+ readonly when: "The vault path does not resolve to an existing note.";
398
+ readonly recovery: "Verify the path with obsidian_list_notes or use obsidian_search_notes to locate the note.";
399
+ }, {
400
+ readonly reason: "no_active_file";
401
+ readonly code: import("@cyanheads/mcp-ts-core/errors").JsonRpcErrorCode.NotFound;
402
+ readonly when: "Target was `active` but no file is currently open in Obsidian.";
403
+ readonly recovery: "Call obsidian_open_in_ui to focus a file, or pass an explicit path target instead.";
404
+ }, {
405
+ readonly reason: "periodic_not_found";
406
+ readonly code: import("@cyanheads/mcp-ts-core/errors").JsonRpcErrorCode.NotFound;
407
+ readonly when: "Target was `periodic` but no matching periodic note exists.";
408
+ readonly recovery: "Create the periodic note first or pass an explicit path target.";
409
+ }, {
410
+ readonly reason: "periodic_disabled";
411
+ readonly code: import("@cyanheads/mcp-ts-core/errors").JsonRpcErrorCode.ValidationError;
412
+ readonly when: "Target was `periodic` but the requested period is not enabled in Obsidian's Periodic Notes plugin settings.";
413
+ readonly recovery: "Pass an explicit path target — the requested period is disabled in the operator's Periodic Notes plugin.";
414
+ }]> | import("@cyanheads/mcp-ts-core").ToolDefinition<import("zod").ZodObject<{
415
+ target: import("zod").ZodDiscriminatedUnion<[import("zod").ZodObject<{
416
+ type: import("zod").ZodLiteral<"path">;
417
+ path: import("zod").ZodString;
418
+ }, import("zod/v4/core").$strip>, import("zod").ZodObject<{
419
+ type: import("zod").ZodLiteral<"active">;
420
+ }, import("zod/v4/core").$strip>, import("zod").ZodObject<{
421
+ type: import("zod").ZodLiteral<"periodic">;
422
+ period: import("zod").ZodEnum<{
423
+ daily: "daily";
424
+ weekly: "weekly";
425
+ monthly: "monthly";
426
+ quarterly: "quarterly";
427
+ yearly: "yearly";
428
+ }>;
429
+ date: import("zod").ZodOptional<import("zod").ZodString>;
430
+ }, import("zod/v4/core").$strip>], "type">;
431
+ operation: import("zod").ZodEnum<{
432
+ list: "list";
433
+ add: "add";
434
+ remove: "remove";
435
+ }>;
436
+ tags: import("zod").ZodOptional<import("zod").ZodArray<import("zod").ZodString>>;
437
+ location: import("zod").ZodDefault<import("zod").ZodEnum<{
438
+ frontmatter: "frontmatter";
439
+ inline: "inline";
440
+ both: "both";
441
+ }>>;
442
+ }, import("zod/v4/core").$strip>, import("zod").ZodObject<{
443
+ result: import("zod").ZodDiscriminatedUnion<[import("zod").ZodObject<{
444
+ operation: import("zod").ZodLiteral<"list">;
445
+ path: import("zod").ZodString;
446
+ tags: import("zod").ZodObject<{
447
+ frontmatter: import("zod").ZodArray<import("zod").ZodString>;
448
+ inline: import("zod").ZodArray<import("zod").ZodString>;
449
+ all: import("zod").ZodArray<import("zod").ZodString>;
450
+ }, import("zod/v4/core").$strip>;
451
+ }, import("zod/v4/core").$strip>, import("zod").ZodObject<{
452
+ operation: import("zod").ZodLiteral<"add">;
453
+ path: import("zod").ZodString;
454
+ applied: import("zod").ZodArray<import("zod").ZodString>;
455
+ skipped: import("zod").ZodArray<import("zod").ZodString>;
456
+ tags: import("zod").ZodArray<import("zod").ZodString>;
457
+ }, import("zod/v4/core").$strip>, import("zod").ZodObject<{
458
+ operation: import("zod").ZodLiteral<"remove">;
459
+ path: import("zod").ZodString;
460
+ applied: import("zod").ZodArray<import("zod").ZodString>;
461
+ skipped: import("zod").ZodArray<import("zod").ZodString>;
462
+ tags: import("zod").ZodArray<import("zod").ZodString>;
463
+ }, import("zod/v4/core").$strip>], "operation">;
464
+ }, import("zod/v4/core").$strip>, readonly [{
465
+ readonly reason: "path_forbidden";
466
+ readonly code: import("@cyanheads/mcp-ts-core/errors").JsonRpcErrorCode.Forbidden;
467
+ readonly when: "`list` requires the path to be readable; `add`/`remove` require it to be inside OBSIDIAN_WRITE_PATHS, with OBSIDIAN_READ_ONLY=false.";
468
+ readonly recovery: "Use a path inside the configured scope. The error data echoes the active scope.";
469
+ }, {
470
+ readonly reason: "tags_required";
471
+ readonly code: import("@cyanheads/mcp-ts-core/errors").JsonRpcErrorCode.ValidationError;
472
+ readonly when: "`operation` is \"add\" or \"remove\" but `tags` was empty or omitted.";
473
+ readonly recovery: "Pass a non-empty `tags` array (without `#`), e.g. `[\"draft\", \"wip\"]`.";
474
+ }, {
475
+ readonly reason: "note_missing";
476
+ readonly code: import("@cyanheads/mcp-ts-core/errors").JsonRpcErrorCode.NotFound;
477
+ readonly when: "The vault path does not resolve to an existing note.";
478
+ readonly recovery: "Verify the path with obsidian_list_notes or use obsidian_search_notes to locate the note.";
479
+ }, {
480
+ readonly reason: "no_active_file";
481
+ readonly code: import("@cyanheads/mcp-ts-core/errors").JsonRpcErrorCode.NotFound;
482
+ readonly when: "Target was `active` but no file is currently open in Obsidian.";
483
+ readonly recovery: "Call obsidian_open_in_ui to focus a file, or pass an explicit path target instead.";
484
+ }, {
485
+ readonly reason: "periodic_not_found";
486
+ readonly code: import("@cyanheads/mcp-ts-core/errors").JsonRpcErrorCode.NotFound;
487
+ readonly when: "Target was `periodic` but no matching periodic note exists.";
488
+ readonly recovery: "Create the periodic note first or pass an explicit path target.";
489
+ }, {
490
+ readonly reason: "periodic_disabled";
491
+ readonly code: import("@cyanheads/mcp-ts-core/errors").JsonRpcErrorCode.ValidationError;
492
+ readonly when: "Target was `periodic` but the requested period is not enabled in Obsidian's Periodic Notes plugin settings.";
493
+ readonly recovery: "Pass an explicit path target — the requested period is disabled in the operator's Periodic Notes plugin.";
494
+ }]> | import("@cyanheads/mcp-ts-core").ToolDefinition<import("zod").ZodObject<{
495
+ target: import("zod").ZodDiscriminatedUnion<[import("zod").ZodObject<{
496
+ type: import("zod").ZodLiteral<"path">;
497
+ path: import("zod").ZodString;
498
+ }, import("zod/v4/core").$strip>, import("zod").ZodObject<{
499
+ type: import("zod").ZodLiteral<"active">;
500
+ }, import("zod/v4/core").$strip>, import("zod").ZodObject<{
501
+ type: import("zod").ZodLiteral<"periodic">;
502
+ period: import("zod").ZodEnum<{
503
+ daily: "daily";
504
+ weekly: "weekly";
505
+ monthly: "monthly";
506
+ quarterly: "quarterly";
507
+ yearly: "yearly";
508
+ }>;
509
+ date: import("zod").ZodOptional<import("zod").ZodString>;
510
+ }, import("zod/v4/core").$strip>], "type">;
511
+ section: import("zod").ZodObject<{
512
+ type: import("zod").ZodEnum<{
513
+ heading: "heading";
514
+ block: "block";
515
+ frontmatter: "frontmatter";
516
+ }>;
517
+ target: import("zod").ZodString;
518
+ }, import("zod/v4/core").$strip>;
519
+ operation: import("zod").ZodEnum<{
520
+ replace: "replace";
521
+ append: "append";
522
+ prepend: "prepend";
523
+ }>;
524
+ content: import("zod").ZodString;
525
+ contentType: import("zod").ZodDefault<import("zod").ZodEnum<{
526
+ markdown: "markdown";
527
+ json: "json";
528
+ }>>;
529
+ patchOptions: import("zod").ZodOptional<import("zod").ZodObject<{
530
+ createTargetIfMissing: import("zod").ZodDefault<import("zod").ZodBoolean>;
531
+ applyIfContentPreexists: import("zod").ZodDefault<import("zod").ZodBoolean>;
532
+ trimTargetWhitespace: import("zod").ZodDefault<import("zod").ZodBoolean>;
533
+ }, import("zod/v4/core").$strip>>;
534
+ }, import("zod/v4/core").$strip>, import("zod").ZodObject<{
535
+ path: import("zod").ZodString;
536
+ section: import("zod").ZodObject<{
537
+ type: import("zod").ZodEnum<{
538
+ heading: "heading";
539
+ block: "block";
540
+ frontmatter: "frontmatter";
541
+ }>;
542
+ target: import("zod").ZodString;
543
+ }, import("zod/v4/core").$strip>;
544
+ operation: import("zod").ZodEnum<{
545
+ replace: "replace";
546
+ append: "append";
547
+ prepend: "prepend";
548
+ }>;
549
+ }, import("zod/v4/core").$strip>, readonly [{
550
+ readonly reason: "path_forbidden";
551
+ readonly code: import("@cyanheads/mcp-ts-core/errors").JsonRpcErrorCode.Forbidden;
552
+ readonly when: "The target path is outside OBSIDIAN_WRITE_PATHS, or OBSIDIAN_READ_ONLY=true denies all writes.";
553
+ readonly recovery: "Use a path inside the configured write scope. The error data echoes the active scope.";
554
+ }, {
555
+ readonly reason: "note_missing";
556
+ readonly code: import("@cyanheads/mcp-ts-core/errors").JsonRpcErrorCode.NotFound;
557
+ readonly when: "The vault path does not resolve to an existing note.";
558
+ readonly recovery: "Verify the path with obsidian_list_notes or use obsidian_search_notes to locate the note.";
559
+ }, {
560
+ readonly reason: "no_active_file";
561
+ readonly code: import("@cyanheads/mcp-ts-core/errors").JsonRpcErrorCode.NotFound;
562
+ readonly when: "Target was `active` but no file is currently open in Obsidian.";
563
+ readonly recovery: "Call obsidian_open_in_ui to focus a file, or pass an explicit path target instead.";
564
+ }, {
565
+ readonly reason: "periodic_not_found";
566
+ readonly code: import("@cyanheads/mcp-ts-core/errors").JsonRpcErrorCode.NotFound;
567
+ readonly when: "Target was `periodic` but no matching periodic note exists.";
568
+ readonly recovery: "Create the periodic note first or pass an explicit path target.";
569
+ }, {
570
+ readonly reason: "periodic_disabled";
571
+ readonly code: import("@cyanheads/mcp-ts-core/errors").JsonRpcErrorCode.ValidationError;
572
+ readonly when: "Target was `periodic` but the requested period is not enabled in Obsidian's Periodic Notes plugin settings.";
573
+ readonly recovery: "Pass an explicit path target — the requested period is disabled in the operator's Periodic Notes plugin.";
574
+ }, {
575
+ readonly reason: "section_target_missing";
576
+ readonly code: import("@cyanheads/mcp-ts-core/errors").JsonRpcErrorCode.ValidationError;
577
+ 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.";
578
+ readonly recovery: "Call obsidian_get_note with format document-map to discover the available targets.";
579
+ }]> | import("@cyanheads/mcp-ts-core").ToolDefinition<import("zod").ZodObject<{
580
+ target: import("zod").ZodDiscriminatedUnion<[import("zod").ZodObject<{
581
+ type: import("zod").ZodLiteral<"path">;
582
+ path: import("zod").ZodString;
583
+ }, import("zod/v4/core").$strip>, import("zod").ZodObject<{
584
+ type: import("zod").ZodLiteral<"active">;
585
+ }, import("zod/v4/core").$strip>, import("zod").ZodObject<{
586
+ type: import("zod").ZodLiteral<"periodic">;
587
+ period: import("zod").ZodEnum<{
588
+ daily: "daily";
589
+ weekly: "weekly";
590
+ monthly: "monthly";
591
+ quarterly: "quarterly";
592
+ yearly: "yearly";
593
+ }>;
594
+ date: import("zod").ZodOptional<import("zod").ZodString>;
595
+ }, import("zod/v4/core").$strip>], "type">;
596
+ replacements: import("zod").ZodArray<import("zod").ZodObject<{
597
+ search: import("zod").ZodString;
598
+ replace: import("zod").ZodString;
599
+ useRegex: import("zod").ZodDefault<import("zod").ZodBoolean>;
600
+ caseSensitive: import("zod").ZodDefault<import("zod").ZodBoolean>;
601
+ wholeWord: import("zod").ZodDefault<import("zod").ZodBoolean>;
602
+ flexibleWhitespace: import("zod").ZodDefault<import("zod").ZodBoolean>;
603
+ replaceAll: import("zod").ZodDefault<import("zod").ZodBoolean>;
604
+ }, import("zod/v4/core").$strip>>;
605
+ }, import("zod/v4/core").$strip>, import("zod").ZodObject<{
606
+ path: import("zod").ZodString;
607
+ totalReplacements: import("zod").ZodNumber;
608
+ perReplacement: import("zod").ZodArray<import("zod").ZodObject<{
609
+ search: import("zod").ZodString;
610
+ count: import("zod").ZodNumber;
611
+ }, import("zod/v4/core").$strip>>;
612
+ }, import("zod/v4/core").$strip>, readonly [{
613
+ readonly reason: "path_forbidden";
614
+ readonly code: import("@cyanheads/mcp-ts-core/errors").JsonRpcErrorCode.Forbidden;
615
+ 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.)";
616
+ readonly recovery: "Use a path inside the configured write scope. The error data echoes the active scope.";
617
+ }, {
618
+ readonly reason: "regex_invalid";
619
+ readonly code: import("@cyanheads/mcp-ts-core/errors").JsonRpcErrorCode.ValidationError;
620
+ readonly when: "A `useRegex: true` replacement supplied a `search` pattern that is not a valid ECMAScript regex.";
621
+ readonly recovery: "Use a valid ECMAScript regex, or set useRegex to false to match `search` as a literal string.";
622
+ }, {
623
+ readonly reason: "note_missing";
624
+ readonly code: import("@cyanheads/mcp-ts-core/errors").JsonRpcErrorCode.NotFound;
625
+ readonly when: "The vault path does not resolve to an existing note.";
626
+ readonly recovery: "Verify the path with obsidian_list_notes or use obsidian_search_notes to locate the note.";
627
+ }, {
628
+ readonly reason: "no_active_file";
629
+ readonly code: import("@cyanheads/mcp-ts-core/errors").JsonRpcErrorCode.NotFound;
630
+ readonly when: "Target was `active` but no file is currently open in Obsidian.";
631
+ readonly recovery: "Call obsidian_open_in_ui to focus a file, or pass an explicit path target instead.";
632
+ }, {
633
+ readonly reason: "periodic_not_found";
634
+ readonly code: import("@cyanheads/mcp-ts-core/errors").JsonRpcErrorCode.NotFound;
635
+ readonly when: "Target was `periodic` but no matching periodic note exists.";
636
+ readonly recovery: "Create the periodic note first or pass an explicit path target.";
637
+ }, {
638
+ readonly reason: "periodic_disabled";
639
+ readonly code: import("@cyanheads/mcp-ts-core/errors").JsonRpcErrorCode.ValidationError;
640
+ readonly when: "Target was `periodic` but the requested period is not enabled in Obsidian's Periodic Notes plugin settings.";
641
+ readonly recovery: "Pass an explicit path target — the requested period is disabled in the operator's Periodic Notes plugin.";
642
+ }]> | import("@cyanheads/mcp-ts-core").ToolDefinition<import("zod").ZodObject<{
643
+ target: import("zod").ZodDiscriminatedUnion<[import("zod").ZodObject<{
644
+ type: import("zod").ZodLiteral<"path">;
645
+ path: import("zod").ZodString;
646
+ }, import("zod/v4/core").$strip>, import("zod").ZodObject<{
647
+ type: import("zod").ZodLiteral<"active">;
648
+ }, import("zod/v4/core").$strip>, import("zod").ZodObject<{
649
+ type: import("zod").ZodLiteral<"periodic">;
650
+ period: import("zod").ZodEnum<{
651
+ daily: "daily";
652
+ weekly: "weekly";
653
+ monthly: "monthly";
654
+ quarterly: "quarterly";
655
+ yearly: "yearly";
656
+ }>;
657
+ date: import("zod").ZodOptional<import("zod").ZodString>;
658
+ }, import("zod/v4/core").$strip>], "type">;
659
+ content: import("zod").ZodString;
660
+ section: import("zod").ZodOptional<import("zod").ZodObject<{
661
+ type: import("zod").ZodEnum<{
662
+ heading: "heading";
663
+ block: "block";
664
+ frontmatter: "frontmatter";
665
+ }>;
666
+ target: import("zod").ZodString;
667
+ }, import("zod/v4/core").$strip>>;
668
+ contentType: import("zod").ZodDefault<import("zod").ZodEnum<{
669
+ markdown: "markdown";
670
+ json: "json";
671
+ }>>;
672
+ overwrite: import("zod").ZodDefault<import("zod").ZodBoolean>;
673
+ }, import("zod/v4/core").$strip>, import("zod").ZodObject<{
674
+ path: import("zod").ZodString;
675
+ sectionTargeted: import("zod").ZodBoolean;
676
+ created: import("zod").ZodBoolean;
677
+ }, import("zod/v4/core").$strip>, readonly [{
678
+ readonly reason: "file_exists";
679
+ readonly code: import("@cyanheads/mcp-ts-core/errors").JsonRpcErrorCode.Conflict;
680
+ readonly when: "Whole-file write was attempted against an existing note and `overwrite` was not set to `true`.";
681
+ readonly recovery: "Retry with overwrite true or use obsidian_patch_note for in-place edits.";
682
+ }, {
683
+ readonly reason: "path_forbidden";
684
+ readonly code: import("@cyanheads/mcp-ts-core/errors").JsonRpcErrorCode.Forbidden;
685
+ readonly when: "The target path is outside OBSIDIAN_WRITE_PATHS, or OBSIDIAN_READ_ONLY=true denies all writes.";
686
+ readonly recovery: "Use a path inside the configured write scope. The error data echoes the active scope.";
687
+ }]>)[];
688
+ /** Combined base set — preserves the previous registration order. */
10
689
  export declare const baseToolDefinitions: (import("@cyanheads/mcp-ts-core").ToolDefinition<import("zod").ZodObject<{
11
690
  target: import("zod").ZodDiscriminatedUnion<[import("zod").ZodObject<{
12
691
  type: import("zod").ZodLiteral<"path">;
@@ -41,7 +720,12 @@ export declare const baseToolDefinitions: (import("@cyanheads/mcp-ts-core").Tool
41
720
  }, import("zod/v4/core").$strip>, import("zod").ZodObject<{
42
721
  path: import("zod").ZodString;
43
722
  sectionTargeted: import("zod").ZodBoolean;
44
- }, import("zod/v4/core").$strip>, undefined> | import("@cyanheads/mcp-ts-core").ToolDefinition<import("zod").ZodObject<{
723
+ }, import("zod/v4/core").$strip>, readonly [{
724
+ readonly reason: "path_forbidden";
725
+ readonly code: import("@cyanheads/mcp-ts-core/errors").JsonRpcErrorCode.Forbidden;
726
+ readonly when: "The target path is outside OBSIDIAN_WRITE_PATHS, or OBSIDIAN_READ_ONLY=true denies all writes.";
727
+ readonly recovery: "Use a path inside the configured write scope. The error data echoes the active scope.";
728
+ }]> | import("@cyanheads/mcp-ts-core").ToolDefinition<import("zod").ZodObject<{
45
729
  target: import("zod").ZodDiscriminatedUnion<[import("zod").ZodObject<{
46
730
  type: import("zod").ZodLiteral<"path">;
47
731
  path: import("zod").ZodString;
@@ -62,6 +746,11 @@ export declare const baseToolDefinitions: (import("@cyanheads/mcp-ts-core").Tool
62
746
  path: import("zod").ZodString;
63
747
  deleted: import("zod").ZodBoolean;
64
748
  }, import("zod/v4/core").$strip>, readonly [{
749
+ readonly reason: "path_forbidden";
750
+ readonly code: import("@cyanheads/mcp-ts-core/errors").JsonRpcErrorCode.Forbidden;
751
+ readonly when: "The target path is outside OBSIDIAN_WRITE_PATHS, or OBSIDIAN_READ_ONLY=true denies all writes.";
752
+ readonly recovery: "Use a path inside the configured write scope. The error data echoes the active scope.";
753
+ }, {
65
754
  readonly reason: "cancelled";
66
755
  readonly code: import("@cyanheads/mcp-ts-core/errors").JsonRpcErrorCode.InvalidRequest;
67
756
  readonly when: "User declined the deletion via interactive elicitation.";
@@ -75,7 +764,7 @@ export declare const baseToolDefinitions: (import("@cyanheads/mcp-ts-core").Tool
75
764
  readonly reason: "no_active_file";
76
765
  readonly code: import("@cyanheads/mcp-ts-core/errors").JsonRpcErrorCode.NotFound;
77
766
  readonly when: "Target was `active` but no file is currently open in Obsidian.";
78
- readonly recovery: "Open a note in Obsidian or pass an explicit path target instead.";
767
+ readonly recovery: "Call obsidian_open_in_ui to focus a file, or pass an explicit path target instead.";
79
768
  }, {
80
769
  readonly reason: "periodic_not_found";
81
770
  readonly code: import("@cyanheads/mcp-ts-core/errors").JsonRpcErrorCode.NotFound;
@@ -85,7 +774,7 @@ export declare const baseToolDefinitions: (import("@cyanheads/mcp-ts-core").Tool
85
774
  readonly reason: "periodic_disabled";
86
775
  readonly code: import("@cyanheads/mcp-ts-core/errors").JsonRpcErrorCode.ValidationError;
87
776
  readonly when: "Target was `periodic` but the requested period is not enabled in Obsidian's Periodic Notes plugin settings.";
88
- readonly recovery: "Enable the period in Obsidian's Periodic Notes plugin settings, or pass an explicit path target instead.";
777
+ readonly recovery: "Pass an explicit path target — the requested period is disabled in the operator's Periodic Notes plugin.";
89
778
  }]> | import("@cyanheads/mcp-ts-core").ToolDefinition<import("zod").ZodObject<{
90
779
  format: import("zod").ZodEnum<{
91
780
  content: "content";
@@ -117,6 +806,7 @@ export declare const baseToolDefinitions: (import("@cyanheads/mcp-ts-core").Tool
117
806
  }>;
118
807
  target: import("zod").ZodString;
119
808
  }, import("zod/v4/core").$strip>>;
809
+ includeLinks: import("zod").ZodDefault<import("zod").ZodBoolean>;
120
810
  }, import("zod/v4/core").$strip>, import("zod").ZodObject<{
121
811
  result: import("zod").ZodDiscriminatedUnion<[import("zod").ZodObject<{
122
812
  format: import("zod").ZodLiteral<"content">;
@@ -133,6 +823,13 @@ export declare const baseToolDefinitions: (import("@cyanheads/mcp-ts-core").Tool
133
823
  mtime: import("zod").ZodNumber;
134
824
  size: import("zod").ZodNumber;
135
825
  }, import("zod/v4/core").$strip>;
826
+ outgoingLinks: import("zod").ZodOptional<import("zod").ZodArray<import("zod").ZodObject<{
827
+ target: import("zod").ZodString;
828
+ type: import("zod").ZodEnum<{
829
+ markdown: "markdown";
830
+ wikilink: "wikilink";
831
+ }>;
832
+ }, import("zod/v4/core").$strip>>>;
136
833
  }, import("zod/v4/core").$strip>, import("zod").ZodObject<{
137
834
  format: import("zod").ZodLiteral<"document-map">;
138
835
  path: import("zod").ZodString;
@@ -158,6 +855,11 @@ export declare const baseToolDefinitions: (import("@cyanheads/mcp-ts-core").Tool
158
855
  readonly code: import("@cyanheads/mcp-ts-core/errors").JsonRpcErrorCode.ValidationError;
159
856
  readonly when: "`format` is \"section\" but no `section` locator was provided.";
160
857
  readonly recovery: "Pass `section: { type, target }` (e.g. `{ type: \"heading\", target: \"Intro\" }`), or use `format: \"full\"` / `\"document-map\"` instead.";
858
+ }, {
859
+ readonly reason: "path_forbidden";
860
+ readonly code: import("@cyanheads/mcp-ts-core/errors").JsonRpcErrorCode.Forbidden;
861
+ readonly when: "The target path is outside OBSIDIAN_READ_PATHS (and OBSIDIAN_WRITE_PATHS, since write paths imply read access).";
862
+ readonly recovery: "Use a path inside the configured read scope. The error data echoes the active scope.";
161
863
  }, {
162
864
  readonly reason: "note_missing";
163
865
  readonly code: import("@cyanheads/mcp-ts-core/errors").JsonRpcErrorCode.NotFound;
@@ -167,7 +869,7 @@ export declare const baseToolDefinitions: (import("@cyanheads/mcp-ts-core").Tool
167
869
  readonly reason: "no_active_file";
168
870
  readonly code: import("@cyanheads/mcp-ts-core/errors").JsonRpcErrorCode.NotFound;
169
871
  readonly when: "Target was `active` but no file is currently open in Obsidian.";
170
- readonly recovery: "Open a note in Obsidian or pass an explicit path target instead.";
872
+ readonly recovery: "Call obsidian_open_in_ui to focus a file, or pass an explicit path target instead.";
171
873
  }, {
172
874
  readonly reason: "periodic_not_found";
173
875
  readonly code: import("@cyanheads/mcp-ts-core/errors").JsonRpcErrorCode.NotFound;
@@ -177,12 +879,12 @@ export declare const baseToolDefinitions: (import("@cyanheads/mcp-ts-core").Tool
177
879
  readonly reason: "periodic_disabled";
178
880
  readonly code: import("@cyanheads/mcp-ts-core/errors").JsonRpcErrorCode.ValidationError;
179
881
  readonly when: "Target was `periodic` but the requested period is not enabled in Obsidian's Periodic Notes plugin settings.";
180
- readonly recovery: "Enable the period in Obsidian's Periodic Notes plugin settings, or pass an explicit path target instead.";
882
+ readonly recovery: "Pass an explicit path target — the requested period is disabled in the operator's Periodic Notes plugin.";
181
883
  }]> | import("@cyanheads/mcp-ts-core").ToolDefinition<import("zod").ZodObject<{
182
884
  path: import("zod").ZodOptional<import("zod").ZodString>;
183
885
  extension: import("zod").ZodOptional<import("zod").ZodString>;
184
886
  nameRegex: import("zod").ZodOptional<import("zod").ZodString>;
185
- depth: import("zod").ZodOptional<import("zod").ZodNumber>;
887
+ depth: import("zod").ZodDefault<import("zod").ZodNumber>;
186
888
  }, import("zod/v4/core").$strip>, import("zod").ZodObject<{
187
889
  path: import("zod").ZodString;
188
890
  entries: import("zod").ZodArray<import("zod").ZodObject<{
@@ -212,7 +914,12 @@ export declare const baseToolDefinitions: (import("@cyanheads/mcp-ts-core").Tool
212
914
  readonly reason: "regex_invalid";
213
915
  readonly code: import("@cyanheads/mcp-ts-core/errors").JsonRpcErrorCode.ValidationError;
214
916
  readonly when: "The supplied `nameRegex` is not a valid ECMAScript regex.";
215
- readonly recovery: "Test the pattern (e.g. `^Project.*\\.md$`) in a JS regex tester, or omit nameRegex to disable filtering.";
917
+ readonly recovery: "Use a valid ECMAScript regex (e.g. `^Project.*\\.md$`), or omit nameRegex to disable filtering.";
918
+ }, {
919
+ readonly reason: "path_forbidden";
920
+ readonly code: import("@cyanheads/mcp-ts-core/errors").JsonRpcErrorCode.Forbidden;
921
+ readonly when: "The supplied `path` is outside OBSIDIAN_READ_PATHS (root listings always pass; specific subdirectories must be readable).";
922
+ 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.";
216
923
  }, {
217
924
  readonly reason: "note_missing";
218
925
  readonly code: import("@cyanheads/mcp-ts-core/errors").JsonRpcErrorCode.NotFound;
@@ -266,6 +973,11 @@ export declare const baseToolDefinitions: (import("@cyanheads/mcp-ts-core").Tool
266
973
  frontmatter: import("zod").ZodRecord<import("zod").ZodString, import("zod").ZodUnknown>;
267
974
  }, import("zod/v4/core").$strip>], "operation">;
268
975
  }, import("zod/v4/core").$strip>, readonly [{
976
+ readonly reason: "path_forbidden";
977
+ readonly code: import("@cyanheads/mcp-ts-core/errors").JsonRpcErrorCode.Forbidden;
978
+ readonly when: "`get` requires the path to be readable; `set`/`delete` require it to be inside OBSIDIAN_WRITE_PATHS, with OBSIDIAN_READ_ONLY=false.";
979
+ readonly recovery: "Use a path inside the configured scope. The error data echoes the active scope.";
980
+ }, {
269
981
  readonly reason: "value_required";
270
982
  readonly code: import("@cyanheads/mcp-ts-core/errors").JsonRpcErrorCode.ValidationError;
271
983
  readonly when: "`operation` is \"set\" but no `value` was supplied.";
@@ -279,7 +991,7 @@ export declare const baseToolDefinitions: (import("@cyanheads/mcp-ts-core").Tool
279
991
  readonly reason: "no_active_file";
280
992
  readonly code: import("@cyanheads/mcp-ts-core/errors").JsonRpcErrorCode.NotFound;
281
993
  readonly when: "Target was `active` but no file is currently open in Obsidian.";
282
- readonly recovery: "Open a note in Obsidian or pass an explicit path target instead.";
994
+ readonly recovery: "Call obsidian_open_in_ui to focus a file, or pass an explicit path target instead.";
283
995
  }, {
284
996
  readonly reason: "periodic_not_found";
285
997
  readonly code: import("@cyanheads/mcp-ts-core/errors").JsonRpcErrorCode.NotFound;
@@ -289,7 +1001,7 @@ export declare const baseToolDefinitions: (import("@cyanheads/mcp-ts-core").Tool
289
1001
  readonly reason: "periodic_disabled";
290
1002
  readonly code: import("@cyanheads/mcp-ts-core/errors").JsonRpcErrorCode.ValidationError;
291
1003
  readonly when: "Target was `periodic` but the requested period is not enabled in Obsidian's Periodic Notes plugin settings.";
292
- readonly recovery: "Enable the period in Obsidian's Periodic Notes plugin settings, or pass an explicit path target instead.";
1004
+ readonly recovery: "Pass an explicit path target — the requested period is disabled in the operator's Periodic Notes plugin.";
293
1005
  }]> | import("@cyanheads/mcp-ts-core").ToolDefinition<import("zod").ZodObject<{
294
1006
  target: import("zod").ZodDiscriminatedUnion<[import("zod").ZodObject<{
295
1007
  type: import("zod").ZodLiteral<"path">;
@@ -341,6 +1053,11 @@ export declare const baseToolDefinitions: (import("@cyanheads/mcp-ts-core").Tool
341
1053
  tags: import("zod").ZodArray<import("zod").ZodString>;
342
1054
  }, import("zod/v4/core").$strip>], "operation">;
343
1055
  }, import("zod/v4/core").$strip>, readonly [{
1056
+ readonly reason: "path_forbidden";
1057
+ readonly code: import("@cyanheads/mcp-ts-core/errors").JsonRpcErrorCode.Forbidden;
1058
+ readonly when: "`list` requires the path to be readable; `add`/`remove` require it to be inside OBSIDIAN_WRITE_PATHS, with OBSIDIAN_READ_ONLY=false.";
1059
+ readonly recovery: "Use a path inside the configured scope. The error data echoes the active scope.";
1060
+ }, {
344
1061
  readonly reason: "tags_required";
345
1062
  readonly code: import("@cyanheads/mcp-ts-core/errors").JsonRpcErrorCode.ValidationError;
346
1063
  readonly when: "`operation` is \"add\" or \"remove\" but `tags` was empty or omitted.";
@@ -354,7 +1071,7 @@ export declare const baseToolDefinitions: (import("@cyanheads/mcp-ts-core").Tool
354
1071
  readonly reason: "no_active_file";
355
1072
  readonly code: import("@cyanheads/mcp-ts-core/errors").JsonRpcErrorCode.NotFound;
356
1073
  readonly when: "Target was `active` but no file is currently open in Obsidian.";
357
- readonly recovery: "Open a note in Obsidian or pass an explicit path target instead.";
1074
+ readonly recovery: "Call obsidian_open_in_ui to focus a file, or pass an explicit path target instead.";
358
1075
  }, {
359
1076
  readonly reason: "periodic_not_found";
360
1077
  readonly code: import("@cyanheads/mcp-ts-core/errors").JsonRpcErrorCode.NotFound;
@@ -364,7 +1081,7 @@ export declare const baseToolDefinitions: (import("@cyanheads/mcp-ts-core").Tool
364
1081
  readonly reason: "periodic_disabled";
365
1082
  readonly code: import("@cyanheads/mcp-ts-core/errors").JsonRpcErrorCode.ValidationError;
366
1083
  readonly when: "Target was `periodic` but the requested period is not enabled in Obsidian's Periodic Notes plugin settings.";
367
- readonly recovery: "Enable the period in Obsidian's Periodic Notes plugin settings, or pass an explicit path target instead.";
1084
+ readonly recovery: "Pass an explicit path target — the requested period is disabled in the operator's Periodic Notes plugin.";
368
1085
  }]> | import("@cyanheads/mcp-ts-core").ToolDefinition<import("zod").ZodObject<{
369
1086
  path: import("zod").ZodString;
370
1087
  failIfMissing: import("zod").ZodDefault<import("zod").ZodBoolean>;
@@ -374,6 +1091,11 @@ export declare const baseToolDefinitions: (import("@cyanheads/mcp-ts-core").Tool
374
1091
  opened: import("zod").ZodBoolean;
375
1092
  createdIfMissing: import("zod").ZodBoolean;
376
1093
  }, import("zod/v4/core").$strip>, readonly [{
1094
+ readonly reason: "path_forbidden";
1095
+ readonly code: import("@cyanheads/mcp-ts-core/errors").JsonRpcErrorCode.Forbidden;
1096
+ readonly when: "The target path is outside OBSIDIAN_READ_PATHS (and OBSIDIAN_WRITE_PATHS, since write paths imply read access).";
1097
+ readonly recovery: "Use a path inside the configured read scope. The error data echoes the active scope.";
1098
+ }, {
377
1099
  readonly reason: "note_missing";
378
1100
  readonly code: import("@cyanheads/mcp-ts-core/errors").JsonRpcErrorCode.NotFound;
379
1101
  readonly when: "`failIfMissing: true` (default) and the path does not exist in the vault. Pass `failIfMissing: false` to allow Obsidian to create the file on open.";
@@ -404,9 +1126,9 @@ export declare const baseToolDefinitions: (import("@cyanheads/mcp-ts-core").Tool
404
1126
  target: import("zod").ZodString;
405
1127
  }, import("zod/v4/core").$strip>;
406
1128
  operation: import("zod").ZodEnum<{
1129
+ replace: "replace";
407
1130
  append: "append";
408
1131
  prepend: "prepend";
409
- replace: "replace";
410
1132
  }>;
411
1133
  content: import("zod").ZodString;
412
1134
  contentType: import("zod").ZodDefault<import("zod").ZodEnum<{
@@ -429,11 +1151,16 @@ export declare const baseToolDefinitions: (import("@cyanheads/mcp-ts-core").Tool
429
1151
  target: import("zod").ZodString;
430
1152
  }, import("zod/v4/core").$strip>;
431
1153
  operation: import("zod").ZodEnum<{
1154
+ replace: "replace";
432
1155
  append: "append";
433
1156
  prepend: "prepend";
434
- replace: "replace";
435
1157
  }>;
436
1158
  }, import("zod/v4/core").$strip>, readonly [{
1159
+ readonly reason: "path_forbidden";
1160
+ readonly code: import("@cyanheads/mcp-ts-core/errors").JsonRpcErrorCode.Forbidden;
1161
+ readonly when: "The target path is outside OBSIDIAN_WRITE_PATHS, or OBSIDIAN_READ_ONLY=true denies all writes.";
1162
+ readonly recovery: "Use a path inside the configured write scope. The error data echoes the active scope.";
1163
+ }, {
437
1164
  readonly reason: "note_missing";
438
1165
  readonly code: import("@cyanheads/mcp-ts-core/errors").JsonRpcErrorCode.NotFound;
439
1166
  readonly when: "The vault path does not resolve to an existing note.";
@@ -442,7 +1169,7 @@ export declare const baseToolDefinitions: (import("@cyanheads/mcp-ts-core").Tool
442
1169
  readonly reason: "no_active_file";
443
1170
  readonly code: import("@cyanheads/mcp-ts-core/errors").JsonRpcErrorCode.NotFound;
444
1171
  readonly when: "Target was `active` but no file is currently open in Obsidian.";
445
- readonly recovery: "Open a note in Obsidian or pass an explicit path target instead.";
1172
+ readonly recovery: "Call obsidian_open_in_ui to focus a file, or pass an explicit path target instead.";
446
1173
  }, {
447
1174
  readonly reason: "periodic_not_found";
448
1175
  readonly code: import("@cyanheads/mcp-ts-core/errors").JsonRpcErrorCode.NotFound;
@@ -452,7 +1179,7 @@ export declare const baseToolDefinitions: (import("@cyanheads/mcp-ts-core").Tool
452
1179
  readonly reason: "periodic_disabled";
453
1180
  readonly code: import("@cyanheads/mcp-ts-core/errors").JsonRpcErrorCode.ValidationError;
454
1181
  readonly when: "Target was `periodic` but the requested period is not enabled in Obsidian's Periodic Notes plugin settings.";
455
- readonly recovery: "Enable the period in Obsidian's Periodic Notes plugin settings, or pass an explicit path target instead.";
1182
+ readonly recovery: "Pass an explicit path target — the requested period is disabled in the operator's Periodic Notes plugin.";
456
1183
  }, {
457
1184
  readonly reason: "section_target_missing";
458
1185
  readonly code: import("@cyanheads/mcp-ts-core/errors").JsonRpcErrorCode.ValidationError;
@@ -492,10 +1219,15 @@ export declare const baseToolDefinitions: (import("@cyanheads/mcp-ts-core").Tool
492
1219
  count: import("zod").ZodNumber;
493
1220
  }, import("zod/v4/core").$strip>>;
494
1221
  }, import("zod/v4/core").$strip>, readonly [{
1222
+ readonly reason: "path_forbidden";
1223
+ readonly code: import("@cyanheads/mcp-ts-core/errors").JsonRpcErrorCode.Forbidden;
1224
+ 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.)";
1225
+ readonly recovery: "Use a path inside the configured write scope. The error data echoes the active scope.";
1226
+ }, {
495
1227
  readonly reason: "regex_invalid";
496
1228
  readonly code: import("@cyanheads/mcp-ts-core/errors").JsonRpcErrorCode.ValidationError;
497
1229
  readonly when: "A `useRegex: true` replacement supplied a `search` pattern that is not a valid ECMAScript regex.";
498
- readonly recovery: "Test the pattern in a JS regex tester, or set useRegex to false to match `search` as a literal string.";
1230
+ readonly recovery: "Use a valid ECMAScript regex, or set useRegex to false to match `search` as a literal string.";
499
1231
  }, {
500
1232
  readonly reason: "note_missing";
501
1233
  readonly code: import("@cyanheads/mcp-ts-core/errors").JsonRpcErrorCode.NotFound;
@@ -505,7 +1237,7 @@ export declare const baseToolDefinitions: (import("@cyanheads/mcp-ts-core").Tool
505
1237
  readonly reason: "no_active_file";
506
1238
  readonly code: import("@cyanheads/mcp-ts-core/errors").JsonRpcErrorCode.NotFound;
507
1239
  readonly when: "Target was `active` but no file is currently open in Obsidian.";
508
- readonly recovery: "Open a note in Obsidian or pass an explicit path target instead.";
1240
+ readonly recovery: "Call obsidian_open_in_ui to focus a file, or pass an explicit path target instead.";
509
1241
  }, {
510
1242
  readonly reason: "periodic_not_found";
511
1243
  readonly code: import("@cyanheads/mcp-ts-core/errors").JsonRpcErrorCode.NotFound;
@@ -515,7 +1247,7 @@ export declare const baseToolDefinitions: (import("@cyanheads/mcp-ts-core").Tool
515
1247
  readonly reason: "periodic_disabled";
516
1248
  readonly code: import("@cyanheads/mcp-ts-core/errors").JsonRpcErrorCode.ValidationError;
517
1249
  readonly when: "Target was `periodic` but the requested period is not enabled in Obsidian's Periodic Notes plugin settings.";
518
- readonly recovery: "Enable the period in Obsidian's Periodic Notes plugin settings, or pass an explicit path target instead.";
1250
+ readonly recovery: "Pass an explicit path target — the requested period is disabled in the operator's Periodic Notes plugin.";
519
1251
  }]> | import("@cyanheads/mcp-ts-core").ToolDefinition<import("zod").ZodObject<{
520
1252
  mode: import("zod").ZodEnum<{
521
1253
  text: "text";
@@ -524,9 +1256,9 @@ export declare const baseToolDefinitions: (import("@cyanheads/mcp-ts-core").Tool
524
1256
  }>;
525
1257
  query: import("zod").ZodOptional<import("zod").ZodString>;
526
1258
  logic: import("zod").ZodOptional<import("zod").ZodRecord<import("zod").ZodString, import("zod").ZodUnknown>>;
527
- contextLength: import("zod").ZodOptional<import("zod").ZodNumber>;
1259
+ contextLength: import("zod").ZodDefault<import("zod").ZodNumber>;
528
1260
  pathPrefix: import("zod").ZodOptional<import("zod").ZodString>;
529
- maxMatchesPerHit: import("zod").ZodOptional<import("zod").ZodNumber>;
1261
+ maxMatchesPerHit: import("zod").ZodDefault<import("zod").ZodNumber>;
530
1262
  }, import("zod/v4/core").$strip>, import("zod").ZodObject<{
531
1263
  result: import("zod").ZodDiscriminatedUnion<[import("zod").ZodObject<{
532
1264
  mode: import("zod").ZodLiteral<"text">;
@@ -623,8 +1355,13 @@ export declare const baseToolDefinitions: (import("@cyanheads/mcp-ts-core").Tool
623
1355
  readonly code: import("@cyanheads/mcp-ts-core/errors").JsonRpcErrorCode.Conflict;
624
1356
  readonly when: "Whole-file write was attempted against an existing note and `overwrite` was not set to `true`.";
625
1357
  readonly recovery: "Retry with overwrite true or use obsidian_patch_note for in-place edits.";
1358
+ }, {
1359
+ readonly reason: "path_forbidden";
1360
+ readonly code: import("@cyanheads/mcp-ts-core/errors").JsonRpcErrorCode.Forbidden;
1361
+ readonly when: "The target path is outside OBSIDIAN_WRITE_PATHS, or OBSIDIAN_READ_ONLY=true denies all writes.";
1362
+ readonly recovery: "Use a path inside the configured write scope. The error data echoes the active scope.";
626
1363
  }]>)[];
627
- /** Command-palette tools — registered only when `OBSIDIAN_ENABLE_COMMANDS=true`. */
1364
+ /** Command-palette tools — opt-in via `OBSIDIAN_ENABLE_COMMANDS=true`; suppressed by `OBSIDIAN_READ_ONLY=true`. */
628
1365
  export declare const commandToolDefinitions: (import("@cyanheads/mcp-ts-core").ToolDefinition<import("zod").ZodObject<{
629
1366
  commandId: import("zod").ZodString;
630
1367
  }, import("zod/v4/core").$strip>, import("zod").ZodObject<{