obsidian-mcp-server 2.0.7 → 3.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (253) hide show
  1. package/CLAUDE.md +364 -0
  2. package/Dockerfile +99 -0
  3. package/LICENSE +4 -6
  4. package/README.md +246 -206
  5. package/changelog/3.0.x/3.0.0.md +102 -0
  6. package/changelog/template.md +51 -0
  7. package/dist/config/server-config.d.ts +19 -0
  8. package/dist/config/server-config.d.ts.map +1 -0
  9. package/dist/config/server-config.js +55 -0
  10. package/dist/config/server-config.js.map +1 -0
  11. package/dist/index.d.ts +7 -0
  12. package/dist/index.d.ts.map +1 -0
  13. package/dist/index.js +23 -295
  14. package/dist/index.js.map +1 -0
  15. package/dist/mcp-server/prompts/definitions/index.d.ts +8 -0
  16. package/dist/mcp-server/prompts/definitions/index.d.ts.map +1 -0
  17. package/dist/mcp-server/prompts/definitions/index.js +8 -0
  18. package/dist/mcp-server/prompts/definitions/index.js.map +1 -0
  19. package/dist/mcp-server/resources/definitions/index.d.ts +36 -0
  20. package/dist/mcp-server/resources/definitions/index.d.ts.map +1 -0
  21. package/dist/mcp-server/resources/definitions/index.js +9 -0
  22. package/dist/mcp-server/resources/definitions/index.js.map +1 -0
  23. package/dist/mcp-server/resources/definitions/obsidian-status.resource.d.ts +23 -0
  24. package/dist/mcp-server/resources/definitions/obsidian-status.resource.d.ts.map +1 -0
  25. package/dist/mcp-server/resources/definitions/obsidian-status.resource.js +47 -0
  26. package/dist/mcp-server/resources/definitions/obsidian-status.resource.js.map +1 -0
  27. package/dist/mcp-server/resources/definitions/obsidian-tags.resource.d.ts +13 -0
  28. package/dist/mcp-server/resources/definitions/obsidian-tags.resource.d.ts.map +1 -0
  29. package/dist/mcp-server/resources/definitions/obsidian-tags.resource.js +30 -0
  30. package/dist/mcp-server/resources/definitions/obsidian-tags.resource.js.map +1 -0
  31. package/dist/mcp-server/resources/definitions/obsidian-vault-note.resource.d.ts +21 -0
  32. package/dist/mcp-server/resources/definitions/obsidian-vault-note.resource.d.ts.map +1 -0
  33. package/dist/mcp-server/resources/definitions/obsidian-vault-note.resource.js +38 -0
  34. package/dist/mcp-server/resources/definitions/obsidian-vault-note.resource.js.map +1 -0
  35. package/dist/mcp-server/tools/definitions/_shared/schemas.d.ts +45 -0
  36. package/dist/mcp-server/tools/definitions/_shared/schemas.d.ts.map +1 -0
  37. package/dist/mcp-server/tools/definitions/_shared/schemas.js +66 -0
  38. package/dist/mcp-server/tools/definitions/_shared/schemas.js.map +1 -0
  39. package/dist/mcp-server/tools/definitions/_shared/suggest-paths.d.ts +51 -0
  40. package/dist/mcp-server/tools/definitions/_shared/suggest-paths.d.ts.map +1 -0
  41. package/dist/mcp-server/tools/definitions/_shared/suggest-paths.js +120 -0
  42. package/dist/mcp-server/tools/definitions/_shared/suggest-paths.js.map +1 -0
  43. package/dist/mcp-server/tools/definitions/index.d.ts +531 -0
  44. package/dist/mcp-server/tools/definitions/index.d.ts.map +1 -0
  45. package/dist/mcp-server/tools/definitions/index.js +38 -0
  46. package/dist/mcp-server/tools/definitions/index.js.map +1 -0
  47. package/dist/mcp-server/tools/definitions/obsidian-append-to-note.tool.d.ts +42 -0
  48. package/dist/mcp-server/tools/definitions/obsidian-append-to-note.tool.d.ts.map +1 -0
  49. package/dist/mcp-server/tools/definitions/obsidian-append-to-note.tool.js +58 -0
  50. package/dist/mcp-server/tools/definitions/obsidian-append-to-note.tool.js.map +1 -0
  51. package/dist/mcp-server/tools/definitions/obsidian-delete-note.tool.d.ts +46 -0
  52. package/dist/mcp-server/tools/definitions/obsidian-delete-note.tool.d.ts.map +1 -0
  53. package/dist/mcp-server/tools/definitions/obsidian-delete-note.tool.js +66 -0
  54. package/dist/mcp-server/tools/definitions/obsidian-delete-note.tool.js.map +1 -0
  55. package/dist/mcp-server/tools/definitions/obsidian-execute-command.tool.d.ts +19 -0
  56. package/dist/mcp-server/tools/definitions/obsidian-execute-command.tool.d.ts.map +1 -0
  57. package/dist/mcp-server/tools/definitions/obsidian-execute-command.tool.js +43 -0
  58. package/dist/mcp-server/tools/definitions/obsidian-execute-command.tool.js.map +1 -0
  59. package/dist/mcp-server/tools/definitions/obsidian-get-note.tool.d.ts +92 -0
  60. package/dist/mcp-server/tools/definitions/obsidian-get-note.tool.d.ts.map +1 -0
  61. package/dist/mcp-server/tools/definitions/obsidian-get-note.tool.js +245 -0
  62. package/dist/mcp-server/tools/definitions/obsidian-get-note.tool.js.map +1 -0
  63. package/dist/mcp-server/tools/definitions/obsidian-list-commands.tool.d.ts +13 -0
  64. package/dist/mcp-server/tools/definitions/obsidian-list-commands.tool.d.ts.map +1 -0
  65. package/dist/mcp-server/tools/definitions/obsidian-list-commands.tool.js +38 -0
  66. package/dist/mcp-server/tools/definitions/obsidian-list-commands.tool.js.map +1 -0
  67. package/dist/mcp-server/tools/definitions/obsidian-list-notes.tool.d.ts +59 -0
  68. package/dist/mcp-server/tools/definitions/obsidian-list-notes.tool.d.ts.map +1 -0
  69. package/dist/mcp-server/tools/definitions/obsidian-list-notes.tool.js +273 -0
  70. package/dist/mcp-server/tools/definitions/obsidian-list-notes.tool.js.map +1 -0
  71. package/dist/mcp-server/tools/definitions/obsidian-list-tags.tool.d.ts +13 -0
  72. package/dist/mcp-server/tools/definitions/obsidian-list-tags.tool.d.ts.map +1 -0
  73. package/dist/mcp-server/tools/definitions/obsidian-list-tags.tool.js +38 -0
  74. package/dist/mcp-server/tools/definitions/obsidian-list-tags.tool.js.map +1 -0
  75. package/dist/mcp-server/tools/definitions/obsidian-manage-frontmatter.tool.d.ts +68 -0
  76. package/dist/mcp-server/tools/definitions/obsidian-manage-frontmatter.tool.d.ts.map +1 -0
  77. package/dist/mcp-server/tools/definitions/obsidian-manage-frontmatter.tool.js +178 -0
  78. package/dist/mcp-server/tools/definitions/obsidian-manage-frontmatter.tool.js.map +1 -0
  79. package/dist/mcp-server/tools/definitions/obsidian-manage-tags.tool.d.ts +77 -0
  80. package/dist/mcp-server/tools/definitions/obsidian-manage-tags.tool.d.ts.map +1 -0
  81. package/dist/mcp-server/tools/definitions/obsidian-manage-tags.tool.js +172 -0
  82. package/dist/mcp-server/tools/definitions/obsidian-manage-tags.tool.js.map +1 -0
  83. package/dist/mcp-server/tools/definitions/obsidian-open-in-ui.tool.d.ts +22 -0
  84. package/dist/mcp-server/tools/definitions/obsidian-open-in-ui.tool.d.ts.map +1 -0
  85. package/dist/mcp-server/tools/definitions/obsidian-open-in-ui.tool.js +88 -0
  86. package/dist/mcp-server/tools/definitions/obsidian-open-in-ui.tool.js.map +1 -0
  87. package/dist/mcp-server/tools/definitions/obsidian-patch-note.tool.d.ts +81 -0
  88. package/dist/mcp-server/tools/definitions/obsidian-patch-note.tool.d.ts.map +1 -0
  89. package/dist/mcp-server/tools/definitions/obsidian-patch-note.tool.js +83 -0
  90. package/dist/mcp-server/tools/definitions/obsidian-patch-note.tool.js.map +1 -0
  91. package/dist/mcp-server/tools/definitions/obsidian-replace-in-note.tool.d.ts +59 -0
  92. package/dist/mcp-server/tools/definitions/obsidian-replace-in-note.tool.d.ts.map +1 -0
  93. package/dist/mcp-server/tools/definitions/obsidian-replace-in-note.tool.js +167 -0
  94. package/dist/mcp-server/tools/definitions/obsidian-replace-in-note.tool.js.map +1 -0
  95. package/dist/mcp-server/tools/definitions/obsidian-search-notes.tool.d.ts +76 -0
  96. package/dist/mcp-server/tools/definitions/obsidian-search-notes.tool.d.ts.map +1 -0
  97. package/dist/mcp-server/tools/definitions/obsidian-search-notes.tool.js +244 -0
  98. package/dist/mcp-server/tools/definitions/obsidian-search-notes.tool.js.map +1 -0
  99. package/dist/mcp-server/tools/definitions/obsidian-write-note.tool.d.ts +41 -0
  100. package/dist/mcp-server/tools/definitions/obsidian-write-note.tool.d.ts.map +1 -0
  101. package/dist/mcp-server/tools/definitions/obsidian-write-note.tool.js +76 -0
  102. package/dist/mcp-server/tools/definitions/obsidian-write-note.tool.js.map +1 -0
  103. package/dist/services/obsidian/frontmatter-ops.d.ts +34 -0
  104. package/dist/services/obsidian/frontmatter-ops.d.ts.map +1 -0
  105. package/dist/services/obsidian/frontmatter-ops.js +230 -0
  106. package/dist/services/obsidian/frontmatter-ops.js.map +1 -0
  107. package/dist/services/obsidian/obsidian-service.d.ts +73 -0
  108. package/dist/services/obsidian/obsidian-service.d.ts.map +1 -0
  109. package/dist/services/obsidian/obsidian-service.js +399 -0
  110. package/dist/services/obsidian/obsidian-service.js.map +1 -0
  111. package/dist/services/obsidian/section-extractor.d.ts +13 -0
  112. package/dist/services/obsidian/section-extractor.d.ts.map +1 -0
  113. package/dist/services/obsidian/section-extractor.js +124 -0
  114. package/dist/services/obsidian/section-extractor.js.map +1 -0
  115. package/dist/services/obsidian/types.d.ts +91 -0
  116. package/dist/services/obsidian/types.d.ts.map +1 -0
  117. package/dist/services/obsidian/types.js +7 -0
  118. package/dist/services/obsidian/types.js.map +1 -0
  119. package/package.json +63 -69
  120. package/server.json +167 -0
  121. package/CHANGELOG.md +0 -124
  122. package/dist/config/index.d.ts +0 -41
  123. package/dist/config/index.js +0 -191
  124. package/dist/mcp-server/server.d.ts +0 -33
  125. package/dist/mcp-server/server.js +0 -211
  126. package/dist/mcp-server/tools/obsidianDeleteNoteTool/index.d.ts +0 -12
  127. package/dist/mcp-server/tools/obsidianDeleteNoteTool/index.js +0 -12
  128. package/dist/mcp-server/tools/obsidianDeleteNoteTool/logic.d.ts +0 -51
  129. package/dist/mcp-server/tools/obsidianDeleteNoteTool/logic.js +0 -168
  130. package/dist/mcp-server/tools/obsidianDeleteNoteTool/registration.d.ts +0 -19
  131. package/dist/mcp-server/tools/obsidianDeleteNoteTool/registration.js +0 -91
  132. package/dist/mcp-server/tools/obsidianGlobalSearchTool/index.d.ts +0 -12
  133. package/dist/mcp-server/tools/obsidianGlobalSearchTool/index.js +0 -12
  134. package/dist/mcp-server/tools/obsidianGlobalSearchTool/logic.d.ts +0 -77
  135. package/dist/mcp-server/tools/obsidianGlobalSearchTool/logic.js +0 -341
  136. package/dist/mcp-server/tools/obsidianGlobalSearchTool/registration.d.ts +0 -18
  137. package/dist/mcp-server/tools/obsidianGlobalSearchTool/registration.js +0 -69
  138. package/dist/mcp-server/tools/obsidianListNotesTool/index.d.ts +0 -12
  139. package/dist/mcp-server/tools/obsidianListNotesTool/index.js +0 -12
  140. package/dist/mcp-server/tools/obsidianListNotesTool/logic.d.ts +0 -68
  141. package/dist/mcp-server/tools/obsidianListNotesTool/logic.js +0 -215
  142. package/dist/mcp-server/tools/obsidianListNotesTool/registration.d.ts +0 -23
  143. package/dist/mcp-server/tools/obsidianListNotesTool/registration.js +0 -98
  144. package/dist/mcp-server/tools/obsidianManageFrontmatterTool/index.d.ts +0 -3
  145. package/dist/mcp-server/tools/obsidianManageFrontmatterTool/index.js +0 -2
  146. package/dist/mcp-server/tools/obsidianManageFrontmatterTool/logic.d.ts +0 -42
  147. package/dist/mcp-server/tools/obsidianManageFrontmatterTool/logic.js +0 -152
  148. package/dist/mcp-server/tools/obsidianManageFrontmatterTool/registration.d.ts +0 -3
  149. package/dist/mcp-server/tools/obsidianManageFrontmatterTool/registration.js +0 -52
  150. package/dist/mcp-server/tools/obsidianManageTagsTool/index.d.ts +0 -3
  151. package/dist/mcp-server/tools/obsidianManageTagsTool/index.js +0 -2
  152. package/dist/mcp-server/tools/obsidianManageTagsTool/logic.d.ts +0 -28
  153. package/dist/mcp-server/tools/obsidianManageTagsTool/logic.js +0 -161
  154. package/dist/mcp-server/tools/obsidianManageTagsTool/registration.d.ts +0 -3
  155. package/dist/mcp-server/tools/obsidianManageTagsTool/registration.js +0 -52
  156. package/dist/mcp-server/tools/obsidianReadNoteTool/index.d.ts +0 -12
  157. package/dist/mcp-server/tools/obsidianReadNoteTool/index.js +0 -12
  158. package/dist/mcp-server/tools/obsidianReadNoteTool/logic.d.ts +0 -87
  159. package/dist/mcp-server/tools/obsidianReadNoteTool/logic.js +0 -216
  160. package/dist/mcp-server/tools/obsidianReadNoteTool/registration.d.ts +0 -20
  161. package/dist/mcp-server/tools/obsidianReadNoteTool/registration.js +0 -101
  162. package/dist/mcp-server/tools/obsidianSearchReplaceTool/index.d.ts +0 -12
  163. package/dist/mcp-server/tools/obsidianSearchReplaceTool/index.js +0 -12
  164. package/dist/mcp-server/tools/obsidianSearchReplaceTool/logic.d.ts +0 -255
  165. package/dist/mcp-server/tools/obsidianSearchReplaceTool/logic.js +0 -583
  166. package/dist/mcp-server/tools/obsidianSearchReplaceTool/registration.d.ts +0 -22
  167. package/dist/mcp-server/tools/obsidianSearchReplaceTool/registration.js +0 -111
  168. package/dist/mcp-server/tools/obsidianUpdateNoteTool/index.d.ts +0 -12
  169. package/dist/mcp-server/tools/obsidianUpdateNoteTool/index.js +0 -12
  170. package/dist/mcp-server/tools/obsidianUpdateNoteTool/logic.d.ts +0 -183
  171. package/dist/mcp-server/tools/obsidianUpdateNoteTool/logic.js +0 -490
  172. package/dist/mcp-server/tools/obsidianUpdateNoteTool/registration.d.ts +0 -21
  173. package/dist/mcp-server/tools/obsidianUpdateNoteTool/registration.js +0 -108
  174. package/dist/mcp-server/transports/auth/core/authContext.d.ts +0 -33
  175. package/dist/mcp-server/transports/auth/core/authContext.js +0 -24
  176. package/dist/mcp-server/transports/auth/core/authTypes.d.ts +0 -17
  177. package/dist/mcp-server/transports/auth/core/authTypes.js +0 -5
  178. package/dist/mcp-server/transports/auth/core/authUtils.d.ts +0 -18
  179. package/dist/mcp-server/transports/auth/core/authUtils.js +0 -45
  180. package/dist/mcp-server/transports/auth/index.d.ts +0 -10
  181. package/dist/mcp-server/transports/auth/index.js +0 -9
  182. package/dist/mcp-server/transports/auth/strategies/jwt/jwtMiddleware.d.ts +0 -27
  183. package/dist/mcp-server/transports/auth/strategies/jwt/jwtMiddleware.js +0 -149
  184. package/dist/mcp-server/transports/auth/strategies/oauth/oauthMiddleware.d.ts +0 -20
  185. package/dist/mcp-server/transports/auth/strategies/oauth/oauthMiddleware.js +0 -124
  186. package/dist/mcp-server/transports/httpErrorHandler.d.ts +0 -26
  187. package/dist/mcp-server/transports/httpErrorHandler.js +0 -73
  188. package/dist/mcp-server/transports/httpTransport.d.ts +0 -21
  189. package/dist/mcp-server/transports/httpTransport.js +0 -208
  190. package/dist/mcp-server/transports/stdioTransport.d.ts +0 -42
  191. package/dist/mcp-server/transports/stdioTransport.js +0 -63
  192. package/dist/services/obsidianRestAPI/index.d.ts +0 -15
  193. package/dist/services/obsidianRestAPI/index.js +0 -17
  194. package/dist/services/obsidianRestAPI/methods/activeFileMethods.d.ts +0 -38
  195. package/dist/services/obsidianRestAPI/methods/activeFileMethods.js +0 -62
  196. package/dist/services/obsidianRestAPI/methods/commandMethods.d.ts +0 -22
  197. package/dist/services/obsidianRestAPI/methods/commandMethods.js +0 -31
  198. package/dist/services/obsidianRestAPI/methods/openMethods.d.ts +0 -16
  199. package/dist/services/obsidianRestAPI/methods/openMethods.js +0 -21
  200. package/dist/services/obsidianRestAPI/methods/patchMethods.d.ts +0 -37
  201. package/dist/services/obsidianRestAPI/methods/patchMethods.js +0 -94
  202. package/dist/services/obsidianRestAPI/methods/periodicNoteMethods.d.ts +0 -42
  203. package/dist/services/obsidianRestAPI/methods/periodicNoteMethods.js +0 -66
  204. package/dist/services/obsidianRestAPI/methods/searchMethods.d.ts +0 -25
  205. package/dist/services/obsidianRestAPI/methods/searchMethods.js +0 -36
  206. package/dist/services/obsidianRestAPI/methods/vaultMethods.d.ts +0 -58
  207. package/dist/services/obsidianRestAPI/methods/vaultMethods.js +0 -144
  208. package/dist/services/obsidianRestAPI/service.d.ts +0 -195
  209. package/dist/services/obsidianRestAPI/service.js +0 -379
  210. package/dist/services/obsidianRestAPI/types.d.ts +0 -127
  211. package/dist/services/obsidianRestAPI/types.js +0 -7
  212. package/dist/services/obsidianRestAPI/vaultCache/index.d.ts +0 -4
  213. package/dist/services/obsidianRestAPI/vaultCache/index.js +0 -4
  214. package/dist/services/obsidianRestAPI/vaultCache/service.d.ts +0 -88
  215. package/dist/services/obsidianRestAPI/vaultCache/service.js +0 -299
  216. package/dist/types-global/errors.d.ts +0 -73
  217. package/dist/types-global/errors.js +0 -71
  218. package/dist/utils/index.d.ts +0 -5
  219. package/dist/utils/index.js +0 -13
  220. package/dist/utils/internal/asyncUtils.d.ts +0 -54
  221. package/dist/utils/internal/asyncUtils.js +0 -101
  222. package/dist/utils/internal/errorHandler.d.ts +0 -176
  223. package/dist/utils/internal/errorHandler.js +0 -351
  224. package/dist/utils/internal/index.d.ts +0 -4
  225. package/dist/utils/internal/index.js +0 -4
  226. package/dist/utils/internal/logger.d.ts +0 -141
  227. package/dist/utils/internal/logger.js +0 -406
  228. package/dist/utils/internal/requestContext.d.ts +0 -83
  229. package/dist/utils/internal/requestContext.js +0 -72
  230. package/dist/utils/metrics/index.d.ts +0 -1
  231. package/dist/utils/metrics/index.js +0 -1
  232. package/dist/utils/metrics/tokenCounter.d.ts +0 -27
  233. package/dist/utils/metrics/tokenCounter.js +0 -128
  234. package/dist/utils/obsidian/index.d.ts +0 -5
  235. package/dist/utils/obsidian/index.js +0 -5
  236. package/dist/utils/obsidian/obsidianApiUtils.d.ts +0 -14
  237. package/dist/utils/obsidian/obsidianApiUtils.js +0 -29
  238. package/dist/utils/obsidian/obsidianStatUtils.d.ts +0 -68
  239. package/dist/utils/obsidian/obsidianStatUtils.js +0 -143
  240. package/dist/utils/parsing/dateParser.d.ts +0 -56
  241. package/dist/utils/parsing/dateParser.js +0 -104
  242. package/dist/utils/parsing/index.d.ts +0 -2
  243. package/dist/utils/parsing/index.js +0 -3
  244. package/dist/utils/parsing/jsonParser.d.ts +0 -80
  245. package/dist/utils/parsing/jsonParser.js +0 -133
  246. package/dist/utils/security/idGenerator.d.ts +0 -140
  247. package/dist/utils/security/idGenerator.js +0 -194
  248. package/dist/utils/security/index.d.ts +0 -3
  249. package/dist/utils/security/index.js +0 -3
  250. package/dist/utils/security/rateLimiter.d.ts +0 -156
  251. package/dist/utils/security/rateLimiter.js +0 -235
  252. package/dist/utils/security/sanitization.d.ts +0 -244
  253. package/dist/utils/security/sanitization.js +0 -599
@@ -0,0 +1,38 @@
1
+ /**
2
+ * @fileoverview obsidian_list_commands — list Obsidian command-palette commands.
3
+ * Always available; surfaces the command surface even when execution is gated.
4
+ * @module mcp-server/tools/definitions/obsidian-list-commands.tool
5
+ */
6
+ import { tool, z } from '@cyanheads/mcp-ts-core';
7
+ import { getObsidianService } from '../../../services/obsidian/obsidian-service.js';
8
+ export const obsidianListCommands = tool('obsidian_list_commands', {
9
+ description: 'List the Obsidian command-palette commands available in the active vault, with their IDs and display names.',
10
+ annotations: { readOnlyHint: true, idempotentHint: true },
11
+ input: z.object({}),
12
+ output: z.object({
13
+ commands: z
14
+ .array(z
15
+ .object({
16
+ id: z.string().describe('Command ID — the slug used to invoke the command.'),
17
+ name: z.string().describe('Display name of the command.'),
18
+ })
19
+ .describe('An Obsidian command-palette entry.'))
20
+ .describe('All commands registered in the active Obsidian instance.'),
21
+ }),
22
+ auth: ['tool:obsidian_list_commands:read'],
23
+ async handler(_input, ctx) {
24
+ const svc = getObsidianService();
25
+ const commands = await svc.listCommands(ctx);
26
+ return { commands };
27
+ },
28
+ format: (result) => {
29
+ if (result.commands.length === 0) {
30
+ return [{ type: 'text', text: '_No commands available._' }];
31
+ }
32
+ const lines = [`**${result.commands.length} commands**`, ''];
33
+ for (const c of result.commands)
34
+ lines.push(`- \`${c.id}\` — ${c.name}`);
35
+ return [{ type: 'text', text: lines.join('\n') }];
36
+ },
37
+ });
38
+ //# sourceMappingURL=obsidian-list-commands.tool.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"obsidian-list-commands.tool.js","sourceRoot":"","sources":["../../../../src/mcp-server/tools/definitions/obsidian-list-commands.tool.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,IAAI,EAAE,CAAC,EAAE,MAAM,wBAAwB,CAAC;AACjD,OAAO,EAAE,kBAAkB,EAAE,MAAM,yCAAyC,CAAC;AAE7E,MAAM,CAAC,MAAM,oBAAoB,GAAG,IAAI,CAAC,wBAAwB,EAAE;IACjE,WAAW,EACT,6GAA6G;IAC/G,WAAW,EAAE,EAAE,YAAY,EAAE,IAAI,EAAE,cAAc,EAAE,IAAI,EAAE;IACzD,KAAK,EAAE,CAAC,CAAC,MAAM,CAAC,EAAE,CAAC;IACnB,MAAM,EAAE,CAAC,CAAC,MAAM,CAAC;QACf,QAAQ,EAAE,CAAC;aACR,KAAK,CACJ,CAAC;aACE,MAAM,CAAC;YACN,EAAE,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,mDAAmD,CAAC;YAC5E,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,8BAA8B,CAAC;SAC1D,CAAC;aACD,QAAQ,CAAC,oCAAoC,CAAC,CAClD;aACA,QAAQ,CAAC,0DAA0D,CAAC;KACxE,CAAC;IACF,IAAI,EAAE,CAAC,kCAAkC,CAAC;IAE1C,KAAK,CAAC,OAAO,CAAC,MAAM,EAAE,GAAG;QACvB,MAAM,GAAG,GAAG,kBAAkB,EAAE,CAAC;QACjC,MAAM,QAAQ,GAAG,MAAM,GAAG,CAAC,YAAY,CAAC,GAAG,CAAC,CAAC;QAC7C,OAAO,EAAE,QAAQ,EAAE,CAAC;IACtB,CAAC;IAED,MAAM,EAAE,CAAC,MAAM,EAAE,EAAE;QACjB,IAAI,MAAM,CAAC,QAAQ,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YACjC,OAAO,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,0BAA0B,EAAE,CAAC,CAAC;QAC9D,CAAC;QACD,MAAM,KAAK,GAAG,CAAC,KAAK,MAAM,CAAC,QAAQ,CAAC,MAAM,aAAa,EAAE,EAAE,CAAC,CAAC;QAC7D,KAAK,MAAM,CAAC,IAAI,MAAM,CAAC,QAAQ;YAAE,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,EAAE,QAAQ,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC;QACzE,OAAO,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IACpD,CAAC;CACF,CAAC,CAAC"}
@@ -0,0 +1,59 @@
1
+ /**
2
+ * @fileoverview obsidian_list_notes — recursive vault listing with bounded depth.
3
+ * Walks the vault tree DFS up to `depth` levels (default 2 — top-level + their
4
+ * immediate children, the structural-overview sweet spot), applying optional
5
+ * extension and nameRegex filters across the walk, and renders both a flat
6
+ * `entries[]` array (for programmatic consumption) and a box-drawing tree view
7
+ * in `format()` (for LLM consumption — tree views are easier to scan than flat
8
+ * paths). Hard cap at {@link ENTRY_CAP} entries protects against runaway HTTP
9
+ * fan-out on large vaults; per-directory `truncated: true` flags signal where
10
+ * the depth limit cut off recursion. Drill deeper by passing a higher `depth`,
11
+ * narrowing with `path`, or filtering with `extension`/`nameRegex`.
12
+ *
13
+ * Named `_notes` rather than `_files` to disambiguate from agents' generic
14
+ * file-system tools (Read, Glob, LS) — a `_files` tool surface tempts agents
15
+ * to fish for non-vault paths through it.
16
+ * @module mcp-server/tools/definitions/obsidian-list-notes.tool
17
+ */
18
+ import { z } from '@cyanheads/mcp-ts-core';
19
+ import { JsonRpcErrorCode } from '@cyanheads/mcp-ts-core/errors';
20
+ export declare const obsidianListNotes: import("@cyanheads/mcp-ts-core").ToolDefinition<z.ZodObject<{
21
+ path: z.ZodOptional<z.ZodString>;
22
+ extension: z.ZodOptional<z.ZodString>;
23
+ nameRegex: z.ZodOptional<z.ZodString>;
24
+ depth: z.ZodOptional<z.ZodNumber>;
25
+ }, z.core.$strip>, z.ZodObject<{
26
+ path: z.ZodString;
27
+ entries: z.ZodArray<z.ZodObject<{
28
+ path: z.ZodString;
29
+ type: z.ZodEnum<{
30
+ file: "file";
31
+ directory: "directory";
32
+ }>;
33
+ truncated: z.ZodOptional<z.ZodBoolean>;
34
+ }, z.core.$strip>>;
35
+ totals: z.ZodObject<{
36
+ entries: z.ZodNumber;
37
+ files: z.ZodNumber;
38
+ directories: z.ZodNumber;
39
+ }, z.core.$strip>;
40
+ appliedFilters: z.ZodObject<{
41
+ extension: z.ZodOptional<z.ZodString>;
42
+ nameRegex: z.ZodOptional<z.ZodString>;
43
+ depth: z.ZodNumber;
44
+ }, z.core.$strip>;
45
+ excluded: z.ZodOptional<z.ZodObject<{
46
+ reason: z.ZodLiteral<"entry_cap">;
47
+ cap: z.ZodNumber;
48
+ hint: z.ZodString;
49
+ }, z.core.$strip>>;
50
+ }, z.core.$strip>, readonly [{
51
+ readonly reason: "regex_invalid";
52
+ readonly code: JsonRpcErrorCode.ValidationError;
53
+ readonly when: "The supplied `nameRegex` is not a valid ECMAScript regex.";
54
+ }, {
55
+ readonly reason: "note_missing";
56
+ readonly code: JsonRpcErrorCode.NotFound;
57
+ 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.";
58
+ }]>;
59
+ //# sourceMappingURL=obsidian-list-notes.tool.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"obsidian-list-notes.tool.d.ts","sourceRoot":"","sources":["../../../../src/mcp-server/tools/definitions/obsidian-list-notes.tool.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;GAgBG;AAGH,OAAO,EAAQ,CAAC,EAAE,MAAM,wBAAwB,CAAC;AACjD,OAAO,EAAE,gBAAgB,EAAY,MAAM,+BAA+B,CAAC;AA0C3E,eAAO,MAAM,iBAAiB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA0J5B,CAAC"}
@@ -0,0 +1,273 @@
1
+ /**
2
+ * @fileoverview obsidian_list_notes — recursive vault listing with bounded depth.
3
+ * Walks the vault tree DFS up to `depth` levels (default 2 — top-level + their
4
+ * immediate children, the structural-overview sweet spot), applying optional
5
+ * extension and nameRegex filters across the walk, and renders both a flat
6
+ * `entries[]` array (for programmatic consumption) and a box-drawing tree view
7
+ * in `format()` (for LLM consumption — tree views are easier to scan than flat
8
+ * paths). Hard cap at {@link ENTRY_CAP} entries protects against runaway HTTP
9
+ * fan-out on large vaults; per-directory `truncated: true` flags signal where
10
+ * the depth limit cut off recursion. Drill deeper by passing a higher `depth`,
11
+ * narrowing with `path`, or filtering with `extension`/`nameRegex`.
12
+ *
13
+ * Named `_notes` rather than `_files` to disambiguate from agents' generic
14
+ * file-system tools (Read, Glob, LS) — a `_files` tool surface tempts agents
15
+ * to fish for non-vault paths through it.
16
+ * @module mcp-server/tools/definitions/obsidian-list-notes.tool
17
+ */
18
+ import { tool, z } from '@cyanheads/mcp-ts-core';
19
+ import { JsonRpcErrorCode, McpError } from '@cyanheads/mcp-ts-core/errors';
20
+ import { getObsidianService } from '../../../services/obsidian/obsidian-service.js';
21
+ const DEFAULT_DEPTH = 2;
22
+ const MAX_DEPTH = 20;
23
+ const ENTRY_CAP = 1000;
24
+ const ENTRY_CAP_HINT = `Walk stopped at ${ENTRY_CAP} entries. Narrow with \`extension\`/\`nameRegex\`, list a deeper subdirectory, or lower \`depth\`.`;
25
+ const EntrySchema = z
26
+ .object({
27
+ path: z.string().describe('Vault-relative path of this entry.'),
28
+ type: z
29
+ .enum(['file', 'directory'])
30
+ .describe('Whether this entry is a regular file or a subdirectory.'),
31
+ truncated: z
32
+ .boolean()
33
+ .optional()
34
+ .describe('On directory entries: true when the depth limit prevented walking into this directory. Pass a deeper `depth` to expand.'),
35
+ })
36
+ .describe('A single entry in the listing.');
37
+ export const obsidianListNotes = tool('obsidian_list_notes', {
38
+ description: `List notes and subdirectories at a vault path. Defaults to vault root when \`path\` is omitted. Walks the directory tree up to \`depth\` levels (default ${DEFAULT_DEPTH} — top-level entries plus their immediate children, a structural overview; max ${MAX_DEPTH}). Pass \`depth: 1\` for a flat single-directory listing, or bump higher to walk deeper. Optional \`extension\` and \`nameRegex\` filters apply across the whole walk. Returns flat \`entries[]\` (each with \`path\`, \`type\`, optional \`truncated\`) plus a tree view in the rendered output. Capped at ${ENTRY_CAP} entries per call — when reached, walking stops and \`excluded\` is set; drill deeper by narrowing \`path\` to a subdirectory or applying filters.`,
39
+ annotations: { readOnlyHint: true, idempotentHint: true },
40
+ input: z.object({
41
+ path: z.string().optional().describe('Vault-relative directory path. Omit for the vault root.'),
42
+ extension: z
43
+ .string()
44
+ .optional()
45
+ .describe('Only include files matching this extension, with or without leading dot. Applies to files only — directories are returned regardless.'),
46
+ nameRegex: z
47
+ .string()
48
+ .optional()
49
+ .describe('Optional ECMAScript regex (no flags) applied to entry names. Matches both files and directories; directories that fail the regex are skipped without recursing into them.'),
50
+ depth: z
51
+ .number()
52
+ .int()
53
+ .min(1)
54
+ .max(MAX_DEPTH)
55
+ .optional()
56
+ .describe(`How many directory levels to walk. \`1\` = target directory only (no recursion); \`${DEFAULT_DEPTH}\` (default) = target plus its immediate children — a structural overview; bump higher to drill in. Prefer narrowing \`path\` to a subdirectory over a high \`depth\` on the vault root.`),
57
+ }),
58
+ output: z.object({
59
+ path: z.string().describe('The directory listed (empty string for vault root).'),
60
+ entries: z
61
+ .array(EntrySchema)
62
+ .describe('Entries in DFS order — top-level first, then descendants.'),
63
+ totals: z
64
+ .object({
65
+ entries: z.number().describe('Total entries returned across all walked depths.'),
66
+ files: z.number().describe('Number of file entries.'),
67
+ directories: z.number().describe('Number of directory entries.'),
68
+ })
69
+ .describe('Counts across the returned tree.'),
70
+ appliedFilters: z
71
+ .object({
72
+ extension: z
73
+ .string()
74
+ .optional()
75
+ .describe('Extension filter applied, normalized with leading dot.'),
76
+ nameRegex: z.string().optional().describe('nameRegex filter applied to this listing.'),
77
+ depth: z.number().describe('Recursion depth used to produce this listing.'),
78
+ })
79
+ .describe('Active filters and the recursion depth that produced this listing.'),
80
+ excluded: z
81
+ .object({
82
+ reason: z
83
+ .literal('entry_cap')
84
+ .describe('`entry_cap`: walk stopped because the per-call entry limit was reached.'),
85
+ cap: z.number().describe('The cap value at which walking stopped.'),
86
+ hint: z.string().describe('Suggestion for narrowing the listing.'),
87
+ })
88
+ .optional()
89
+ .describe('Present when the walk was truncated by the global entry cap.'),
90
+ }),
91
+ auth: ['tool:obsidian_list_notes:read'],
92
+ errors: [
93
+ {
94
+ reason: 'regex_invalid',
95
+ code: JsonRpcErrorCode.ValidationError,
96
+ when: 'The supplied `nameRegex` is not a valid ECMAScript regex.',
97
+ },
98
+ {
99
+ reason: 'note_missing',
100
+ code: JsonRpcErrorCode.NotFound,
101
+ 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.',
102
+ },
103
+ ],
104
+ async handler(input, ctx) {
105
+ const svc = getObsidianService();
106
+ const depth = input.depth ?? DEFAULT_DEPTH;
107
+ let regex;
108
+ if (input.nameRegex) {
109
+ try {
110
+ regex = new RegExp(input.nameRegex);
111
+ }
112
+ catch (err) {
113
+ throw ctx.fail('regex_invalid', `Invalid nameRegex: ${err.message}`, { nameRegex: input.nameRegex }, { cause: err });
114
+ }
115
+ }
116
+ const ext = input.extension
117
+ ? input.extension.startsWith('.')
118
+ ? input.extension.toLowerCase()
119
+ : `.${input.extension.toLowerCase()}`
120
+ : undefined;
121
+ const rootDir = (input.path ?? '').replace(/^\/+|\/+$/g, '');
122
+ const state = { entries: [], totalFiles: 0, totalDirs: 0, cappedByEntries: false };
123
+ await walkVault(svc, ctx, rootDir, 1, state, { depth, regex, ext });
124
+ const appliedFilters = { depth };
125
+ if (ext)
126
+ appliedFilters.extension = ext;
127
+ if (input.nameRegex)
128
+ appliedFilters.nameRegex = input.nameRegex;
129
+ return {
130
+ path: input.path ?? '',
131
+ entries: state.entries,
132
+ totals: {
133
+ entries: state.entries.length,
134
+ files: state.totalFiles,
135
+ directories: state.totalDirs,
136
+ },
137
+ appliedFilters,
138
+ ...(state.cappedByEntries
139
+ ? { excluded: { reason: 'entry_cap', cap: ENTRY_CAP, hint: ENTRY_CAP_HINT } }
140
+ : {}),
141
+ };
142
+ },
143
+ format: (result) => {
144
+ const headerName = result.path === '' ? '(vault root)' : result.path;
145
+ const meta = [
146
+ `${result.totals.entries} entries`,
147
+ `${result.totals.files} files, ${result.totals.directories} directories`,
148
+ `depth=${result.appliedFilters.depth}`,
149
+ ];
150
+ const filterParts = [];
151
+ if (result.appliedFilters.extension)
152
+ filterParts.push(`extension=\`${result.appliedFilters.extension}\``);
153
+ if (result.appliedFilters.nameRegex)
154
+ filterParts.push(`nameRegex=\`${result.appliedFilters.nameRegex}\``);
155
+ if (filterParts.length)
156
+ meta.push(`filters: ${filterParts.join(', ')}`);
157
+ const lines = [`**${headerName}** — ${meta.join(' · ')}`];
158
+ if (result.entries.length === 0) {
159
+ lines.push('', '_(empty)_');
160
+ }
161
+ else {
162
+ lines.push('', '```');
163
+ lines.push(...renderTree(result.entries));
164
+ lines.push('```');
165
+ }
166
+ if (result.excluded) {
167
+ lines.push('', `_Excluded: ${result.excluded.reason} (cap=${result.excluded.cap}). ${result.excluded.hint}_`);
168
+ }
169
+ return [{ type: 'text', text: lines.join('\n') }];
170
+ },
171
+ });
172
+ /**
173
+ * Recursive vault walk with depth and entry-count caps. Mutates `state` in
174
+ * place; returns once the walk completes or hits the entry cap. Sub-directory
175
+ * 404s (currentDepth > 1) are swallowed because the vault can shift mid-walk;
176
+ * a 404 at currentDepth === 1 is the caller's root path missing and propagates
177
+ * as a `note_missing` service error. Hoisted out of the handler so the lint's
178
+ * source scanner doesn't see the framework's NotFound code in handler text.
179
+ */
180
+ async function walkVault(svc, ctx, dir, currentDepth, state, opts) {
181
+ if (state.cappedByEntries)
182
+ return;
183
+ let listing;
184
+ try {
185
+ listing = await svc.listFiles(ctx, dir);
186
+ }
187
+ catch (err) {
188
+ if (currentDepth > 1 && err instanceof McpError && err.code === JsonRpcErrorCode.NotFound) {
189
+ ctx.log.warning('Subdirectory disappeared during walk; skipping', { dir });
190
+ return;
191
+ }
192
+ throw err;
193
+ }
194
+ for (const raw of listing.files) {
195
+ if (state.entries.length >= ENTRY_CAP) {
196
+ state.cappedByEntries = true;
197
+ return;
198
+ }
199
+ const isDir = raw.endsWith('/');
200
+ const name = isDir ? raw.slice(0, -1) : raw;
201
+ if (opts.regex && !opts.regex.test(name))
202
+ continue;
203
+ if (!isDir && opts.ext && !name.toLowerCase().endsWith(opts.ext))
204
+ continue;
205
+ const fullPath = dir ? `${dir}/${name}` : name;
206
+ const entry = { path: fullPath, type: isDir ? 'directory' : 'file' };
207
+ if (isDir && currentDepth >= opts.depth)
208
+ entry.truncated = true;
209
+ state.entries.push(entry);
210
+ if (isDir)
211
+ state.totalDirs++;
212
+ else
213
+ state.totalFiles++;
214
+ if (isDir && currentDepth < opts.depth) {
215
+ await walkVault(svc, ctx, fullPath, currentDepth + 1, state, opts);
216
+ if (state.cappedByEntries)
217
+ return;
218
+ }
219
+ }
220
+ }
221
+ /**
222
+ * Render entries (in DFS order) as a box-drawing tree. Builds a parent→children
223
+ * map keyed by each entry's parent vault path, then emits each top-level group
224
+ * (parents that aren't themselves entries) as the roots of the rendered tree.
225
+ * This makes the renderer agnostic to the caller's root path — entries anchor
226
+ * the tree, not the input.
227
+ */
228
+ function renderTree(entries) {
229
+ const childrenByParent = new Map();
230
+ const entryPaths = new Set();
231
+ for (const e of entries)
232
+ entryPaths.add(e.path);
233
+ for (const e of entries) {
234
+ const slash = e.path.lastIndexOf('/');
235
+ const parent = slash >= 0 ? e.path.slice(0, slash) : '';
236
+ let list = childrenByParent.get(parent);
237
+ if (!list) {
238
+ list = [];
239
+ childrenByParent.set(parent, list);
240
+ }
241
+ list.push(e);
242
+ }
243
+ const lines = [];
244
+ function emit(entry, prefix, isLast) {
245
+ const branch = isLast ? '└── ' : '├── ';
246
+ const slashIdx = entry.path.lastIndexOf('/');
247
+ const name = slashIdx >= 0 ? entry.path.slice(slashIdx + 1) : entry.path;
248
+ const trailing = entry.type === 'directory' ? '/' : '';
249
+ const truncMarker = entry.truncated ? ' [truncated — pass deeper `depth` to expand]' : '';
250
+ lines.push(`${prefix}${branch}${name}${trailing}${truncMarker}`);
251
+ if (entry.type === 'directory' && !entry.truncated) {
252
+ const childPrefix = prefix + (isLast ? ' ' : '│ ');
253
+ const children = childrenByParent.get(entry.path) ?? [];
254
+ for (let i = 0; i < children.length; i++) {
255
+ const c = children[i];
256
+ if (c)
257
+ emit(c, childPrefix, i === children.length - 1);
258
+ }
259
+ }
260
+ }
261
+ for (const parent of childrenByParent.keys()) {
262
+ if (entryPaths.has(parent))
263
+ continue;
264
+ const children = childrenByParent.get(parent) ?? [];
265
+ for (let i = 0; i < children.length; i++) {
266
+ const c = children[i];
267
+ if (c)
268
+ emit(c, '', i === children.length - 1);
269
+ }
270
+ }
271
+ return lines;
272
+ }
273
+ //# sourceMappingURL=obsidian-list-notes.tool.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"obsidian-list-notes.tool.js","sourceRoot":"","sources":["../../../../src/mcp-server/tools/definitions/obsidian-list-notes.tool.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,13 @@
1
+ /**
2
+ * @fileoverview obsidian_list_tags — all tags found in the vault, with usage counts.
3
+ * Mirrors the plugin's `/tags/` endpoint; counts are upstream-provided.
4
+ * @module mcp-server/tools/definitions/obsidian-list-tags.tool
5
+ */
6
+ import { z } from '@cyanheads/mcp-ts-core';
7
+ export declare const obsidianListTags: import("@cyanheads/mcp-ts-core").ToolDefinition<z.ZodObject<{}, z.core.$strip>, z.ZodObject<{
8
+ tags: z.ZodArray<z.ZodObject<{
9
+ name: z.ZodString;
10
+ count: z.ZodNumber;
11
+ }, z.core.$strip>>;
12
+ }, z.core.$strip>, undefined>;
13
+ //# sourceMappingURL=obsidian-list-tags.tool.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"obsidian-list-tags.tool.d.ts","sourceRoot":"","sources":["../../../../src/mcp-server/tools/definitions/obsidian-list-tags.tool.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAQ,CAAC,EAAE,MAAM,wBAAwB,CAAC;AAGjD,eAAO,MAAM,gBAAgB;;;;;6BAiC3B,CAAC"}
@@ -0,0 +1,38 @@
1
+ /**
2
+ * @fileoverview obsidian_list_tags — all tags found in the vault, with usage counts.
3
+ * Mirrors the plugin's `/tags/` endpoint; counts are upstream-provided.
4
+ * @module mcp-server/tools/definitions/obsidian-list-tags.tool
5
+ */
6
+ import { tool, z } from '@cyanheads/mcp-ts-core';
7
+ import { getObsidianService } from '../../../services/obsidian/obsidian-service.js';
8
+ export const obsidianListTags = tool('obsidian_list_tags', {
9
+ description: 'List every tag found across the vault, with usage counts. Includes hierarchical parents — `work/tasks` contributes to both `work` and `work/tasks`.',
10
+ annotations: { readOnlyHint: true, idempotentHint: true },
11
+ input: z.object({}),
12
+ output: z.object({
13
+ tags: z
14
+ .array(z
15
+ .object({
16
+ name: z.string().describe('Tag name without the leading `#`.'),
17
+ count: z.number().describe('Usage count across the vault.'),
18
+ })
19
+ .describe('A tag with its usage count.'))
20
+ .describe('All tags in the vault, in upstream-provided order.'),
21
+ }),
22
+ auth: ['tool:obsidian_list_tags:read'],
23
+ async handler(_input, ctx) {
24
+ const svc = getObsidianService();
25
+ const tags = await svc.listTags(ctx);
26
+ return { tags: tags.map((t) => ({ name: t.name, count: t.count })) };
27
+ },
28
+ format: (result) => {
29
+ if (result.tags.length === 0) {
30
+ return [{ type: 'text', text: '_No tags found in the vault._' }];
31
+ }
32
+ const lines = [`**${result.tags.length} tags**`, ''];
33
+ for (const t of result.tags)
34
+ lines.push(`- \`#${t.name}\` (${t.count})`);
35
+ return [{ type: 'text', text: lines.join('\n') }];
36
+ },
37
+ });
38
+ //# sourceMappingURL=obsidian-list-tags.tool.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"obsidian-list-tags.tool.js","sourceRoot":"","sources":["../../../../src/mcp-server/tools/definitions/obsidian-list-tags.tool.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,IAAI,EAAE,CAAC,EAAE,MAAM,wBAAwB,CAAC;AACjD,OAAO,EAAE,kBAAkB,EAAE,MAAM,yCAAyC,CAAC;AAE7E,MAAM,CAAC,MAAM,gBAAgB,GAAG,IAAI,CAAC,oBAAoB,EAAE;IACzD,WAAW,EACT,qJAAqJ;IACvJ,WAAW,EAAE,EAAE,YAAY,EAAE,IAAI,EAAE,cAAc,EAAE,IAAI,EAAE;IACzD,KAAK,EAAE,CAAC,CAAC,MAAM,CAAC,EAAE,CAAC;IACnB,MAAM,EAAE,CAAC,CAAC,MAAM,CAAC;QACf,IAAI,EAAE,CAAC;aACJ,KAAK,CACJ,CAAC;aACE,MAAM,CAAC;YACN,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,mCAAmC,CAAC;YAC9D,KAAK,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,+BAA+B,CAAC;SAC5D,CAAC;aACD,QAAQ,CAAC,6BAA6B,CAAC,CAC3C;aACA,QAAQ,CAAC,oDAAoD,CAAC;KAClE,CAAC;IACF,IAAI,EAAE,CAAC,8BAA8B,CAAC;IAEtC,KAAK,CAAC,OAAO,CAAC,MAAM,EAAE,GAAG;QACvB,MAAM,GAAG,GAAG,kBAAkB,EAAE,CAAC;QACjC,MAAM,IAAI,GAAG,MAAM,GAAG,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC;QACrC,OAAO,EAAE,IAAI,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,KAAK,EAAE,CAAC,CAAC,KAAK,EAAE,CAAC,CAAC,EAAE,CAAC;IACvE,CAAC;IAED,MAAM,EAAE,CAAC,MAAM,EAAE,EAAE;QACjB,IAAI,MAAM,CAAC,IAAI,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YAC7B,OAAO,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,+BAA+B,EAAE,CAAC,CAAC;QACnE,CAAC;QACD,MAAM,KAAK,GAAG,CAAC,KAAK,MAAM,CAAC,IAAI,CAAC,MAAM,SAAS,EAAE,EAAE,CAAC,CAAC;QACrD,KAAK,MAAM,CAAC,IAAI,MAAM,CAAC,IAAI;YAAE,KAAK,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,IAAI,OAAO,CAAC,CAAC,KAAK,GAAG,CAAC,CAAC;QACzE,OAAO,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IACpD,CAAC;CACF,CAAC,CAAC"}
@@ -0,0 +1,68 @@
1
+ /**
2
+ * @fileoverview obsidian_manage_frontmatter — atomic get/set/delete on a single
3
+ * frontmatter key. `set` PATCHes the field; `delete` reads-modifies-writes the
4
+ * file because PATCH has no `delete` operation.
5
+ * @module mcp-server/tools/definitions/obsidian-manage-frontmatter.tool
6
+ */
7
+ import { z } from '@cyanheads/mcp-ts-core';
8
+ import { JsonRpcErrorCode } from '@cyanheads/mcp-ts-core/errors';
9
+ export declare const obsidianManageFrontmatter: import("@cyanheads/mcp-ts-core").ToolDefinition<z.ZodObject<{
10
+ operation: z.ZodEnum<{
11
+ set: "set";
12
+ delete: "delete";
13
+ get: "get";
14
+ }>;
15
+ target: z.ZodDiscriminatedUnion<[z.ZodObject<{
16
+ type: z.ZodLiteral<"path">;
17
+ path: z.ZodString;
18
+ }, z.core.$strip>, z.ZodObject<{
19
+ type: z.ZodLiteral<"active">;
20
+ }, z.core.$strip>, z.ZodObject<{
21
+ type: z.ZodLiteral<"periodic">;
22
+ period: z.ZodEnum<{
23
+ daily: "daily";
24
+ weekly: "weekly";
25
+ monthly: "monthly";
26
+ quarterly: "quarterly";
27
+ yearly: "yearly";
28
+ }>;
29
+ date: z.ZodOptional<z.ZodString>;
30
+ }, z.core.$strip>], "type">;
31
+ key: z.ZodString;
32
+ value: z.ZodOptional<z.ZodUnknown>;
33
+ }, z.core.$strip>, z.ZodObject<{
34
+ result: z.ZodDiscriminatedUnion<[z.ZodObject<{
35
+ operation: z.ZodLiteral<"get">;
36
+ path: z.ZodString;
37
+ key: z.ZodString;
38
+ exists: z.ZodBoolean;
39
+ value: z.ZodUnknown;
40
+ }, z.core.$strip>, z.ZodObject<{
41
+ operation: z.ZodLiteral<"set">;
42
+ path: z.ZodString;
43
+ key: z.ZodString;
44
+ frontmatter: z.ZodRecord<z.ZodString, z.ZodUnknown>;
45
+ }, z.core.$strip>, z.ZodObject<{
46
+ operation: z.ZodLiteral<"delete">;
47
+ path: z.ZodString;
48
+ key: z.ZodString;
49
+ frontmatter: z.ZodRecord<z.ZodString, z.ZodUnknown>;
50
+ }, z.core.$strip>], "operation">;
51
+ }, z.core.$strip>, readonly [{
52
+ readonly reason: "value_required";
53
+ readonly code: JsonRpcErrorCode.ValidationError;
54
+ readonly when: "`operation` is \"set\" but no `value` was supplied.";
55
+ }, {
56
+ readonly reason: "note_missing";
57
+ readonly code: JsonRpcErrorCode.NotFound;
58
+ readonly when: "The vault path does not resolve to an existing note.";
59
+ }, {
60
+ readonly reason: "no_active_file";
61
+ readonly code: JsonRpcErrorCode.NotFound;
62
+ readonly when: "Target was `active` but no file is currently open in Obsidian.";
63
+ }, {
64
+ readonly reason: "periodic_not_found";
65
+ readonly code: JsonRpcErrorCode.NotFound;
66
+ readonly when: "Target was `periodic` but no matching periodic note exists.";
67
+ }]>;
68
+ //# sourceMappingURL=obsidian-manage-frontmatter.tool.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"obsidian-manage-frontmatter.tool.d.ts","sourceRoot":"","sources":["../../../../src/mcp-server/tools/definitions/obsidian-manage-frontmatter.tool.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAQ,CAAC,EAAE,MAAM,wBAAwB,CAAC;AACjD,OAAO,EAAE,gBAAgB,EAAE,MAAM,+BAA+B,CAAC;AAKjE,eAAO,MAAM,yBAAyB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAqKpC,CAAC"}