obsidian-mcp-server 2.0.6 → 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 -118
  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,124 @@
1
+ /**
2
+ * @fileoverview Client-side section extraction from a NoteJson body.
3
+ * The upstream Local REST API exposes section *targeting* for PATCH but not
4
+ * section-extracted GET, so we slice the markdown ourselves for `format: 'section'`.
5
+ * @module services/obsidian/section-extractor
6
+ */
7
+ import { notFound } from '@cyanheads/mcp-ts-core/errors';
8
+ /**
9
+ * Extract a section's raw markdown (heading/block) or JSON value (frontmatter).
10
+ * Throws `NotFound` if the target does not exist in the note.
11
+ */
12
+ export function extractSection(note, section) {
13
+ switch (section.type) {
14
+ case 'frontmatter':
15
+ return extractFrontmatterField(note, section.target);
16
+ case 'heading':
17
+ return extractHeading(note.content, section.target);
18
+ case 'block':
19
+ return extractBlock(note.content, section.target);
20
+ }
21
+ }
22
+ function extractFrontmatterField(note, key) {
23
+ if (!(key in note.frontmatter)) {
24
+ throw notFound(`Frontmatter key '${key}' not found in ${note.path}.`, {
25
+ path: note.path,
26
+ key,
27
+ });
28
+ }
29
+ return note.frontmatter[key];
30
+ }
31
+ /**
32
+ * Match a heading by "::"-delimited hierarchy. "Top::Sub" walks to a level-N
33
+ * heading "Top" and then a deeper heading "Sub" beneath it.
34
+ */
35
+ function extractHeading(content, target) {
36
+ const parts = target
37
+ .split('::')
38
+ .map((p) => p.trim())
39
+ .filter(Boolean);
40
+ if (parts.length === 0) {
41
+ throw notFound('Empty heading target.', { target });
42
+ }
43
+ const lines = content.split('\n');
44
+ const bodyStart = frontmatterEndLine(lines);
45
+ let cursor = bodyStart;
46
+ let parentLevel = 0;
47
+ for (const part of parts) {
48
+ let found = -1;
49
+ let foundLevel = 0;
50
+ for (let i = cursor; i < lines.length; i++) {
51
+ const m = /^(#{1,6})\s+(.*?)\s*$/.exec(lines[i] ?? '');
52
+ if (!m)
53
+ continue;
54
+ const level = (m[1] ?? '').length;
55
+ const text = (m[2] ?? '').trim();
56
+ if (parentLevel > 0 && level <= parentLevel) {
57
+ // exited the parent; stop searching deeper for this part
58
+ break;
59
+ }
60
+ if (text === part && (parentLevel === 0 || level > parentLevel)) {
61
+ found = i;
62
+ foundLevel = level;
63
+ break;
64
+ }
65
+ }
66
+ if (found === -1) {
67
+ throw notFound(`Heading '${target}' not found.`, { target });
68
+ }
69
+ cursor = found + 1;
70
+ parentLevel = foundLevel;
71
+ }
72
+ // Slice from the matched heading line to the next heading at the same or shallower level.
73
+ const startLine = cursor - 1;
74
+ let endLine = lines.length;
75
+ for (let i = cursor; i < lines.length; i++) {
76
+ const m = /^(#{1,6})\s+/.exec(lines[i] ?? '');
77
+ if (m && (m[1] ?? '').length <= parentLevel) {
78
+ endLine = i;
79
+ break;
80
+ }
81
+ }
82
+ return lines.slice(startLine, endLine).join('\n').replace(/\n+$/, '');
83
+ }
84
+ /**
85
+ * Match a block by its `^blockId` reference. Returns the line containing the
86
+ * reference plus any preceding lines belonging to the same paragraph (until a
87
+ * blank line or heading).
88
+ */
89
+ function extractBlock(content, blockId) {
90
+ const lines = content.split('\n');
91
+ const bodyStart = frontmatterEndLine(lines);
92
+ const escaped = blockId.replace(/[\\^$.*+?()[\]{}|]/g, '\\$&');
93
+ const ref = new RegExp(`(^|\\s)\\^${escaped}\\s*$`);
94
+ for (let i = bodyStart; i < lines.length; i++) {
95
+ if (ref.test(lines[i] ?? '')) {
96
+ let start = i;
97
+ while (start > bodyStart) {
98
+ const prev = lines[start - 1] ?? '';
99
+ if (prev.trim() === '' || /^#{1,6}\s+/.test(prev))
100
+ break;
101
+ start--;
102
+ }
103
+ return lines.slice(start, i + 1).join('\n');
104
+ }
105
+ }
106
+ throw notFound(`Block reference '^${blockId}' not found.`, { blockId });
107
+ }
108
+ /**
109
+ * Return the line index where the document body starts, skipping a leading
110
+ * `---`/`---` YAML frontmatter block. Returns 0 when no frontmatter is present.
111
+ * Without this guard, heading and block extraction would scan inside the
112
+ * frontmatter and falsely match YAML comment lines or include the fence in a
113
+ * paragraph walk-back.
114
+ */
115
+ function frontmatterEndLine(lines) {
116
+ if (!/^---\s*$/.test(lines[0] ?? ''))
117
+ return 0;
118
+ for (let i = 1; i < lines.length; i++) {
119
+ if (/^---\s*$/.test(lines[i] ?? ''))
120
+ return i + 1;
121
+ }
122
+ return 0;
123
+ }
124
+ //# sourceMappingURL=section-extractor.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"section-extractor.js","sourceRoot":"","sources":["../../../src/services/obsidian/section-extractor.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,91 @@
1
+ /**
2
+ * @fileoverview Shared types for the Obsidian Local REST API service layer.
3
+ * Mirrors the upstream plugin's response shapes (NoteJson, document map, etc.).
4
+ * @module services/obsidian/types
5
+ */
6
+ export type PeriodicPeriod = 'daily' | 'weekly' | 'monthly' | 'quarterly' | 'yearly';
7
+ export type NoteTarget = {
8
+ type: 'path';
9
+ path: string;
10
+ } | {
11
+ type: 'active';
12
+ } | {
13
+ type: 'periodic';
14
+ period: PeriodicPeriod;
15
+ date?: string | undefined;
16
+ };
17
+ export type SectionType = 'heading' | 'block' | 'frontmatter';
18
+ export interface SectionTarget {
19
+ /** Heading name ("::" delimits nesting), block reference, or frontmatter field name. */
20
+ target: string;
21
+ type: SectionType;
22
+ }
23
+ export interface NoteStat {
24
+ ctime: number;
25
+ mtime: number;
26
+ size: number;
27
+ }
28
+ export interface NoteJson {
29
+ content: string;
30
+ frontmatter: Record<string, unknown>;
31
+ path: string;
32
+ stat: NoteStat;
33
+ tags: string[];
34
+ }
35
+ export interface DocumentMap {
36
+ blocks: string[];
37
+ frontmatterFields: string[];
38
+ headings: string[];
39
+ }
40
+ export interface FileListing {
41
+ files: string[];
42
+ }
43
+ export interface VaultStatus {
44
+ authenticated: boolean;
45
+ manifest?: {
46
+ id: string;
47
+ name: string;
48
+ version: string;
49
+ };
50
+ service: string;
51
+ status: string;
52
+ versions?: {
53
+ obsidian?: string;
54
+ self?: string;
55
+ };
56
+ }
57
+ export interface ObsidianTag {
58
+ count: number;
59
+ name: string;
60
+ }
61
+ export interface ObsidianCommand {
62
+ id: string;
63
+ name: string;
64
+ }
65
+ export type SearchMode = 'text' | 'dataview' | 'jsonlogic';
66
+ export interface TextSearchHit {
67
+ filename: string;
68
+ matches: Array<{
69
+ context: string;
70
+ match: {
71
+ start: number;
72
+ end: number;
73
+ };
74
+ }>;
75
+ score?: number;
76
+ }
77
+ export interface StructuredSearchHit {
78
+ filename: string;
79
+ result: unknown;
80
+ }
81
+ export interface PatchHeaders {
82
+ applyIfContentPreexists?: boolean | undefined;
83
+ contentType?: 'markdown' | 'json' | undefined;
84
+ createTargetIfMissing?: boolean | undefined;
85
+ operation: 'append' | 'prepend' | 'replace';
86
+ target: string;
87
+ targetDelimiter?: string | undefined;
88
+ targetType: SectionType;
89
+ trimTargetWhitespace?: boolean | undefined;
90
+ }
91
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../src/services/obsidian/types.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,7 @@
1
+ /**
2
+ * @fileoverview Shared types for the Obsidian Local REST API service layer.
3
+ * Mirrors the upstream plugin's response shapes (NoteJson, document map, etc.).
4
+ * @module services/obsidian/types
5
+ */
6
+ export {};
7
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../../../src/services/obsidian/types.ts"],"names":[],"mappings":"AAAA;;;;GAIG"}
package/package.json CHANGED
@@ -1,91 +1,85 @@
1
1
  {
2
2
  "name": "obsidian-mcp-server",
3
- "version": "2.0.6",
4
- "description": "Obsidian Knowledge-Management MCP (Model Context Protocol) server that enables AI agents and development tools to interact with an Obsidian vault. It provides a comprehensive suite of tools for reading, writing, searching, and managing notes, tags, and frontmatter, acting as a bridge to the Obsidian Local REST API plugin.",
3
+ "version": "3.0.0",
4
+ "mcpName": "io.github.cyanheads/obsidian-mcp-server",
5
+ "description": "MCP server for Obsidian vaults — read, write, search, and surgically edit notes, tags, and frontmatter via the Local REST API plugin. STDIO or Streamable HTTP.",
6
+ "type": "module",
5
7
  "main": "dist/index.js",
8
+ "types": "dist/index.d.ts",
9
+ "bin": {
10
+ "obsidian-mcp-server": "dist/index.js"
11
+ },
6
12
  "files": [
7
- "dist",
13
+ "changelog/",
14
+ "dist/",
8
15
  "README.md",
9
16
  "LICENSE",
10
- "CHANGELOG.md"
17
+ "CLAUDE.md",
18
+ "Dockerfile",
19
+ "server.json"
11
20
  ],
12
- "bin": {
13
- "obsidian-mcp-server": "dist/index.js"
14
- },
15
- "type": "module",
16
- "repository": {
17
- "type": "git",
18
- "url": "git+https://github.com/cyanheads/obsidian-mcp-server.git"
19
- },
20
- "bugs": {
21
- "url": "https://github.com/cyanheads/obsidian-mcp-server/issues"
22
- },
23
- "homepage": "https://github.com/cyanheads/obsidian-mcp-server#readme",
24
21
  "scripts": {
25
- "build": "tsc && node --loader ts-node/esm scripts/make-executable.ts dist/index.js",
22
+ "build": "bun run scripts/build.ts",
23
+ "rebuild": "bun run scripts/clean.ts && bun run build",
24
+ "clean": "bun run scripts/clean.ts",
25
+ "devcheck": "bun run scripts/devcheck.ts",
26
+ "tree": "bun run scripts/tree.ts",
27
+ "format": "biome check --write --unsafe .",
28
+ "lint:mcp": "bun run scripts/lint-mcp.ts",
29
+ "changelog:build": "bun run scripts/build-changelog.ts",
30
+ "changelog:check": "bun run scripts/build-changelog.ts --check",
31
+ "test": "bunx vitest run",
32
+ "dev:stdio": "MCP_TRANSPORT_TYPE=stdio bun --watch src/index.ts",
33
+ "dev:http": "MCP_TRANSPORT_TYPE=http bun --watch src/index.ts",
26
34
  "start": "node dist/index.js",
27
- "start:stdio": "MCP_LOG_LEVEL=debug MCP_TRANSPORT_TYPE=stdio node dist/index.js",
28
- "start:http": "MCP_LOG_LEVEL=debug MCP_TRANSPORT_TYPE=http node dist/index.js",
29
- "rebuild": "npx ts-node --esm scripts/clean.ts && npm run build",
30
- "fetch:spec": "npx ts-node --esm scripts/fetch-openapi-spec.ts",
31
- "docs:generate": "typedoc --tsconfig ./tsconfig.typedoc.json",
32
- "tree": "npx ts-node --esm scripts/tree.ts",
33
- "format": "prettier --write \"**/*.{ts,js,json,md,html,css}\"",
34
- "inspect": "mcp-inspector --config mcp.json",
35
- "inspect:stdio": "mcp-inspector --config mcp.json --server obsidian-mcp-server-stdio",
36
- "inspect:http": "mcp-inspector --config mcp.json --server obsidian-mcp-server-http"
37
- },
38
- "dependencies": {
39
- "@hono/node-server": "^1.14.4",
40
- "@modelcontextprotocol/inspector": "^0.14.3",
41
- "@modelcontextprotocol/sdk": "^1.13.0",
42
- "@types/sanitize-html": "^2.16.0",
43
- "@types/validator": "13.15.2",
44
- "axios": "^1.10.0",
45
- "chrono-node": "2.8.0",
46
- "date-fns": "^4.1.0",
47
- "dotenv": "^16.5.0",
48
- "hono": "^4.8.2",
49
- "ignore": "^7.0.5",
50
- "jose": "^6.0.11",
51
- "js-yaml": "^4.1.0",
52
- "openai": "^5.6.0",
53
- "partial-json": "^0.1.7",
54
- "sanitize-html": "^2.17.0",
55
- "tiktoken": "^1.0.21",
56
- "ts-node": "^10.9.2",
57
- "typescript": "^5.8.3",
58
- "validator": "13.15.15",
59
- "winston": "^3.17.0",
60
- "winston-transport": "^4.9.0",
61
- "zod": "^3.25.67"
35
+ "start:stdio": "MCP_TRANSPORT_TYPE=stdio bun ./dist/index.js",
36
+ "start:http": "MCP_TRANSPORT_TYPE=http bun ./dist/index.js"
62
37
  },
63
38
  "keywords": [
64
39
  "mcp",
40
+ "mcp-server",
65
41
  "model-context-protocol",
66
42
  "obsidian",
67
- "obsidian-md",
68
- "ai",
69
- "llm",
70
- "agent",
71
- "automation",
72
- "api",
73
- "server",
74
- "typescript",
75
- "knowledge-management",
43
+ "obsidian-vault",
44
+ "knowledge-base",
76
45
  "note-taking",
77
- "rest-api",
78
- "integration"
46
+ "llm",
47
+ "llm-agent",
48
+ "ai-tools",
49
+ "typescript"
79
50
  ],
80
- "author": "Casey Hand @cyanheads",
51
+ "author": "cyanheads <casey@caseyjhand.com> (https://github.com/cyanheads/obsidian-mcp-server#readme)",
52
+ "repository": {
53
+ "type": "git",
54
+ "url": "git+https://github.com/cyanheads/obsidian-mcp-server.git"
55
+ },
56
+ "homepage": "https://github.com/cyanheads/obsidian-mcp-server#readme",
57
+ "bugs": {
58
+ "url": "https://github.com/cyanheads/obsidian-mcp-server/issues"
59
+ },
81
60
  "license": "Apache-2.0",
82
61
  "engines": {
83
- "node": ">=16.0.0"
62
+ "bun": ">=1.3.11",
63
+ "node": ">=22.0.0"
84
64
  },
85
- "devDependencies": {
65
+ "packageManager": "bun@1.3.11",
66
+ "publishConfig": {
67
+ "access": "public"
68
+ },
69
+ "dependencies": {
70
+ "@cyanheads/mcp-ts-core": "^0.8.1",
86
71
  "@types/js-yaml": "^4.0.9",
87
- "@types/node": "^24.0.3",
88
- "prettier": "^3.5.3",
89
- "typedoc": "^0.28.5"
72
+ "js-yaml": "^4.1.1",
73
+ "pino-pretty": "^13.1.3",
74
+ "undici": "^8.1.0"
75
+ },
76
+ "devDependencies": {
77
+ "@biomejs/biome": "^2.4.13",
78
+ "@types/node": "^25.6.0",
79
+ "depcheck": "^1.4.7",
80
+ "ignore": "^7.0.5",
81
+ "tsc-alias": "^1.8.16",
82
+ "typescript": "^6.0.3",
83
+ "vitest": "^4.1.5"
90
84
  }
91
85
  }
package/server.json ADDED
@@ -0,0 +1,167 @@
1
+ {
2
+ "$schema": "https://static.modelcontextprotocol.io/schemas/2025-12-11/server.schema.json",
3
+ "name": "io.github.cyanheads/obsidian-mcp-server",
4
+ "description": "MCP server for Obsidian vaults — read, write, search, and edit notes via the Local REST API plugin.",
5
+ "repository": {
6
+ "url": "https://github.com/cyanheads/obsidian-mcp-server",
7
+ "source": "github"
8
+ },
9
+ "version": "3.0.0",
10
+ "packages": [
11
+ {
12
+ "registryType": "npm",
13
+ "registryBaseUrl": "https://registry.npmjs.org",
14
+ "identifier": "obsidian-mcp-server",
15
+ "runtimeHint": "node",
16
+ "version": "3.0.0",
17
+ "packageArguments": [
18
+ {
19
+ "type": "positional",
20
+ "value": "run"
21
+ },
22
+ {
23
+ "type": "positional",
24
+ "value": "start:stdio"
25
+ }
26
+ ],
27
+ "environmentVariables": [
28
+ {
29
+ "name": "OBSIDIAN_API_KEY",
30
+ "description": "Bearer token for the Obsidian Local REST API plugin (Settings → Community Plugins → Local REST API).",
31
+ "format": "string",
32
+ "isRequired": true
33
+ },
34
+ {
35
+ "name": "OBSIDIAN_BASE_URL",
36
+ "description": "Base URL of the Obsidian Local REST API. Default: http://127.0.0.1:27123 (enable \"Non-encrypted (HTTP) Server\" in plugin settings). Use https://127.0.0.1:27124 for the always-on HTTPS port (self-signed cert; pair with OBSIDIAN_VERIFY_SSL=false).",
37
+ "format": "string",
38
+ "isRequired": false,
39
+ "default": "http://127.0.0.1:27123"
40
+ },
41
+ {
42
+ "name": "OBSIDIAN_VERIFY_SSL",
43
+ "description": "Whether to verify the TLS certificate on the Obsidian endpoint. Default false because the plugin uses a self-signed cert.",
44
+ "format": "string",
45
+ "isRequired": false,
46
+ "default": "false"
47
+ },
48
+ {
49
+ "name": "OBSIDIAN_REQUEST_TIMEOUT_MS",
50
+ "description": "Per-request timeout in milliseconds.",
51
+ "format": "string",
52
+ "isRequired": false,
53
+ "default": "30000"
54
+ },
55
+ {
56
+ "name": "OBSIDIAN_ENABLE_COMMANDS",
57
+ "description": "Opt-in flag for obsidian_execute_command. Off by default — Obsidian commands are opaque and can be destructive.",
58
+ "format": "string",
59
+ "isRequired": false,
60
+ "default": "false"
61
+ },
62
+ {
63
+ "name": "MCP_LOG_LEVEL",
64
+ "description": "Sets the minimum log level for output (e.g., 'debug', 'info', 'warn').",
65
+ "format": "string",
66
+ "isRequired": false,
67
+ "default": "info"
68
+ }
69
+ ],
70
+ "transport": {
71
+ "type": "stdio"
72
+ }
73
+ },
74
+ {
75
+ "registryType": "npm",
76
+ "registryBaseUrl": "https://registry.npmjs.org",
77
+ "identifier": "obsidian-mcp-server",
78
+ "runtimeHint": "node",
79
+ "version": "3.0.0",
80
+ "packageArguments": [
81
+ {
82
+ "type": "positional",
83
+ "value": "run"
84
+ },
85
+ {
86
+ "type": "positional",
87
+ "value": "start:http"
88
+ }
89
+ ],
90
+ "environmentVariables": [
91
+ {
92
+ "name": "OBSIDIAN_API_KEY",
93
+ "description": "Bearer token for the Obsidian Local REST API plugin (Settings → Community Plugins → Local REST API).",
94
+ "format": "string",
95
+ "isRequired": true
96
+ },
97
+ {
98
+ "name": "OBSIDIAN_BASE_URL",
99
+ "description": "Base URL of the Obsidian Local REST API. Default: http://127.0.0.1:27123 (enable \"Non-encrypted (HTTP) Server\" in plugin settings). Use https://127.0.0.1:27124 for the always-on HTTPS port (self-signed cert; pair with OBSIDIAN_VERIFY_SSL=false).",
100
+ "format": "string",
101
+ "isRequired": false,
102
+ "default": "http://127.0.0.1:27123"
103
+ },
104
+ {
105
+ "name": "OBSIDIAN_VERIFY_SSL",
106
+ "description": "Whether to verify the TLS certificate on the Obsidian endpoint. Default false because the plugin uses a self-signed cert.",
107
+ "format": "string",
108
+ "isRequired": false,
109
+ "default": "false"
110
+ },
111
+ {
112
+ "name": "OBSIDIAN_REQUEST_TIMEOUT_MS",
113
+ "description": "Per-request timeout in milliseconds.",
114
+ "format": "string",
115
+ "isRequired": false,
116
+ "default": "30000"
117
+ },
118
+ {
119
+ "name": "OBSIDIAN_ENABLE_COMMANDS",
120
+ "description": "Opt-in flag for obsidian_execute_command. Off by default — Obsidian commands are opaque and can be destructive.",
121
+ "format": "string",
122
+ "isRequired": false,
123
+ "default": "false"
124
+ },
125
+ {
126
+ "name": "MCP_HTTP_HOST",
127
+ "description": "The hostname for the HTTP server.",
128
+ "format": "string",
129
+ "isRequired": false,
130
+ "default": "127.0.0.1"
131
+ },
132
+ {
133
+ "name": "MCP_HTTP_PORT",
134
+ "description": "The port to run the HTTP server on.",
135
+ "format": "string",
136
+ "isRequired": false,
137
+ "default": "3010"
138
+ },
139
+ {
140
+ "name": "MCP_HTTP_ENDPOINT_PATH",
141
+ "description": "The endpoint path for the MCP server.",
142
+ "format": "string",
143
+ "isRequired": false,
144
+ "default": "/mcp"
145
+ },
146
+ {
147
+ "name": "MCP_AUTH_MODE",
148
+ "description": "Authentication mode to use: 'none', 'jwt', or 'oauth'.",
149
+ "format": "string",
150
+ "isRequired": false,
151
+ "default": "none"
152
+ },
153
+ {
154
+ "name": "MCP_LOG_LEVEL",
155
+ "description": "Sets the minimum log level for output (e.g., 'debug', 'info', 'warn').",
156
+ "format": "string",
157
+ "isRequired": false,
158
+ "default": "info"
159
+ }
160
+ ],
161
+ "transport": {
162
+ "type": "streamable-http",
163
+ "url": "http://localhost:3010/mcp"
164
+ }
165
+ }
166
+ ]
167
+ }