@sunub/obsidian-mcp-server 0.2.0 → 0.3.1

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 (262) hide show
  1. package/README.md +217 -25
  2. package/build/cli/AppContainer.d.ts +1 -0
  3. package/build/cli/AppContainer.js +197 -0
  4. package/build/cli/AppContainer.js.map +1 -0
  5. package/build/cli/config/SettingContext.d.ts +1 -0
  6. package/build/cli/config/SettingContext.js +2 -0
  7. package/build/cli/config/SettingContext.js.map +1 -0
  8. package/build/cli/config/mcpServersConfig.d.ts +18 -0
  9. package/build/cli/config/mcpServersConfig.js +119 -0
  10. package/build/cli/config/mcpServersConfig.js.map +1 -0
  11. package/build/cli/config/settingSchema.d.ts +180 -0
  12. package/build/cli/config/settingSchema.js +128 -0
  13. package/build/cli/config/settingSchema.js.map +1 -0
  14. package/build/cli/context/InputContext.d.ts +12 -0
  15. package/build/cli/context/InputContext.js +10 -0
  16. package/build/cli/context/InputContext.js.map +1 -0
  17. package/build/cli/context/KeypressContext.d.ts +30 -0
  18. package/build/cli/context/KeypressContext.js +200 -0
  19. package/build/cli/context/KeypressContext.js.map +1 -0
  20. package/build/cli/context/KeypressContext.util.d.ts +7 -0
  21. package/build/cli/context/KeypressContext.util.js +474 -0
  22. package/build/cli/context/KeypressContext.util.js.map +1 -0
  23. package/build/cli/hooks/useAtCompletion.d.ts +12 -0
  24. package/build/cli/hooks/useAtCompletion.js +5 -0
  25. package/build/cli/hooks/useAtCompletion.js.map +1 -0
  26. package/build/cli/hooks/useCommandCompletion.d.ts +59 -0
  27. package/build/cli/hooks/useCommandCompletion.js +344 -0
  28. package/build/cli/hooks/useCommandCompletion.js.map +1 -0
  29. package/build/cli/hooks/useCompletion.d.ts +22 -0
  30. package/build/cli/hooks/useCompletion.js +84 -0
  31. package/build/cli/hooks/useCompletion.js.map +1 -0
  32. package/build/cli/hooks/useDispatcher.d.ts +6 -0
  33. package/build/cli/hooks/useDispatcher.js +286 -0
  34. package/build/cli/hooks/useDispatcher.js.map +1 -0
  35. package/build/cli/hooks/useFocus.d.ts +2 -0
  36. package/build/cli/hooks/useFocus.js +3 -0
  37. package/build/cli/hooks/useFocus.js.map +1 -0
  38. package/build/cli/hooks/useInputHistory.d.ts +24 -0
  39. package/build/cli/hooks/useInputHistory.js +159 -0
  40. package/build/cli/hooks/useInputHistory.js.map +1 -0
  41. package/build/cli/hooks/useKeyMatchers.d.ts +17 -0
  42. package/build/cli/hooks/useKeyMatchers.js +13 -0
  43. package/build/cli/hooks/useKeyMatchers.js.map +1 -0
  44. package/build/cli/hooks/useKeypress.d.ts +19 -0
  45. package/build/cli/hooks/useKeypress.js +28 -0
  46. package/build/cli/hooks/useKeypress.js.map +1 -0
  47. package/build/cli/hooks/useLlmStream.d.ts +12 -0
  48. package/build/cli/hooks/useLlmStream.js +365 -0
  49. package/build/cli/hooks/useLlmStream.js.map +1 -0
  50. package/build/cli/hooks/useMcpClient.d.ts +10 -0
  51. package/build/cli/hooks/useMcpClient.js +100 -0
  52. package/build/cli/hooks/useMcpClient.js.map +1 -0
  53. package/build/cli/hooks/useMcpManager.d.ts +22 -0
  54. package/build/cli/hooks/useMcpManager.js +86 -0
  55. package/build/cli/hooks/useMcpManager.js.map +1 -0
  56. package/build/cli/hooks/usePromptCompletion.d.ts +19 -0
  57. package/build/cli/hooks/usePromptCompletion.js +13 -0
  58. package/build/cli/hooks/usePromptCompletion.js.map +1 -0
  59. package/build/cli/hooks/useRagContext.d.ts +6 -0
  60. package/build/cli/hooks/useRagContext.js +83 -0
  61. package/build/cli/hooks/useRagContext.js.map +1 -0
  62. package/build/cli/hooks/useShellCompletion.d.ts +18 -0
  63. package/build/cli/hooks/useShellCompletion.js +10 -0
  64. package/build/cli/hooks/useShellCompletion.js.map +1 -0
  65. package/build/cli/hooks/useSlashCompletion.d.ts +21 -0
  66. package/build/cli/hooks/useSlashCompletion.js +11 -0
  67. package/build/cli/hooks/useSlashCompletion.js.map +1 -0
  68. package/build/cli/hooks/useTerminalSize.d.ts +9 -0
  69. package/build/cli/hooks/useTerminalSize.js +26 -0
  70. package/build/cli/hooks/useTerminalSize.js.map +1 -0
  71. package/build/cli/index.js +27 -0
  72. package/build/cli/index.js.map +1 -0
  73. package/build/cli/key/keyBindings.d.ts +152 -0
  74. package/build/cli/key/keyBindings.js +630 -0
  75. package/build/cli/key/keyBindings.js.map +1 -0
  76. package/build/cli/key/keyMatchers.d.ts +27 -0
  77. package/build/cli/key/keyMatchers.js +33 -0
  78. package/build/cli/key/keyMatchers.js.map +1 -0
  79. package/build/cli/key/text-buffer.js +918 -0
  80. package/build/cli/key/text-buffer.js.map +1 -0
  81. package/build/cli/reference/HistoryItemDisplay.d.ts +23 -0
  82. package/build/cli/reference/HistoryItemDisplay.js +63 -0
  83. package/build/cli/reference/HistoryItemDisplay.js.map +1 -0
  84. package/build/cli/reference/InputContext.d.ts +17 -0
  85. package/build/cli/reference/InputContext.js +16 -0
  86. package/build/cli/reference/InputContext.js.map +1 -0
  87. package/build/cli/reference/KerypressContext.d.ts +37 -0
  88. package/build/cli/reference/KerypressContext.js +791 -0
  89. package/build/cli/reference/KerypressContext.js.map +1 -0
  90. package/build/cli/reference/MainContent.d.ts +6 -0
  91. package/build/cli/reference/MainContent.js +207 -0
  92. package/build/cli/reference/MainContent.js.map +1 -0
  93. package/build/cli/reference/UIStateContext.d.ts +188 -0
  94. package/build/cli/reference/UIStateContext.js +16 -0
  95. package/build/cli/reference/UIStateContext.js.map +1 -0
  96. package/build/cli/reference/useGeminiStream.d.ts +42 -0
  97. package/build/cli/reference/useGeminiStream.js +1404 -0
  98. package/build/cli/reference/useGeminiStream.js.map +1 -0
  99. package/build/cli/services/McpClientService.d.ts +32 -0
  100. package/build/cli/services/McpClientService.js +123 -0
  101. package/build/cli/services/McpClientService.js.map +1 -0
  102. package/build/cli/services/McpManager.d.ts +28 -0
  103. package/build/cli/services/McpManager.js +146 -0
  104. package/build/cli/services/McpManager.js.map +1 -0
  105. package/build/cli/tmp.js +27 -0
  106. package/build/cli/tmp.js.map +1 -0
  107. package/build/cli/ui/ConnectionStatus.d.ts +13 -0
  108. package/build/cli/ui/ConnectionStatus.js +24 -0
  109. package/build/cli/ui/ConnectionStatus.js.map +1 -0
  110. package/build/cli/ui/HelpCommands.d.ts +5 -0
  111. package/build/cli/ui/HelpCommands.js +11 -0
  112. package/build/cli/ui/HelpCommands.js.map +1 -0
  113. package/build/cli/ui/HistoryItemDisplay.d.ts +9 -0
  114. package/build/cli/ui/HistoryItemDisplay.js +38 -0
  115. package/build/cli/ui/HistoryItemDisplay.js.map +1 -0
  116. package/build/cli/ui/InputPrompt-bestcase.d.ts +63 -0
  117. package/build/cli/ui/InputPrompt-bestcase.js +1301 -0
  118. package/build/cli/ui/InputPrompt-bestcase.js.map +1 -0
  119. package/build/cli/ui/InputPrompt.d.ts +12 -0
  120. package/build/cli/ui/InputPrompt.js +145 -0
  121. package/build/cli/ui/InputPrompt.js.map +1 -0
  122. package/build/cli/ui/InputPrompt.tmp.d.ts +7 -0
  123. package/build/cli/ui/InputPrompt.tmp.js +215 -0
  124. package/build/cli/ui/InputPrompt.tmp.js.map +1 -0
  125. package/build/cli/ui/MainContent.d.ts +10 -0
  126. package/build/cli/ui/MainContent.js +24 -0
  127. package/build/cli/ui/MainContent.js.map +1 -0
  128. package/build/cli/ui/MouseContext.d.ts +1 -0
  129. package/build/cli/ui/MouseContext.js +2 -0
  130. package/build/cli/ui/MouseContext.js.map +1 -0
  131. package/build/cli/ui/SuggestionsDisplay.d.ts +25 -0
  132. package/build/cli/ui/SuggestionsDisplay.js +45 -0
  133. package/build/cli/ui/SuggestionsDisplay.js.map +1 -0
  134. package/build/cli/ui/ThinkingIndicator.d.ts +2 -0
  135. package/build/cli/ui/ThinkingIndicator.js +16 -0
  136. package/build/cli/ui/ThinkingIndicator.js.map +1 -0
  137. package/build/cli/ui/layout/DefaultAppLayout.d.ts +2 -0
  138. package/build/cli/ui/layout/DefaultAppLayout.js +6 -0
  139. package/build/cli/ui/layout/DefaultAppLayout.js.map +1 -0
  140. package/build/cli/ui/shared/ExpandableText.d.ts +14 -0
  141. package/build/cli/ui/shared/ExpandableText.js +19 -0
  142. package/build/cli/ui/shared/ExpandableText.js.map +1 -0
  143. package/build/cli/utils/commandUtils.d.ts +11 -0
  144. package/build/cli/utils/commandUtils.js +16 -0
  145. package/build/cli/utils/commandUtils.js.map +1 -0
  146. package/build/cli/utils/debugLogger.d.ts +12 -0
  147. package/build/cli/utils/debugLogger.js +52 -0
  148. package/build/cli/utils/debugLogger.js.map +1 -0
  149. package/build/cli/utils/historyStorage.d.ts +13 -0
  150. package/build/cli/utils/historyStorage.js +64 -0
  151. package/build/cli/utils/historyStorage.js.map +1 -0
  152. package/build/cli/utils/textUtil.d.ts +68 -0
  153. package/build/cli/utils/textUtil.js +236 -0
  154. package/build/cli/utils/textUtil.js.map +1 -0
  155. package/build/db.js +55 -0
  156. package/build/db.js.map +1 -0
  157. package/build/index.js +4 -0
  158. package/build/index.js.map +1 -0
  159. package/build/tools/create_document_with_properties/index.d.ts +60 -0
  160. package/build/tools/create_document_with_properties/index.js +7 -1
  161. package/build/tools/create_document_with_properties/index.js.map +1 -0
  162. package/build/tools/create_document_with_properties/params.d.ts +66 -0
  163. package/build/tools/generate_property/index.js +6 -0
  164. package/build/tools/generate_property/index.js.map +1 -0
  165. package/build/tools/index.d.ts +184 -0
  166. package/build/tools/organize_attachments/index.js +7 -1
  167. package/build/tools/organize_attachments/index.js.map +1 -0
  168. package/build/tools/organize_attachments/params.d.ts +122 -0
  169. package/build/tools/vault/index.js +17 -3
  170. package/build/tools/vault/index.js.map +1 -0
  171. package/build/tools/vault/params.d.ts +115 -0
  172. package/build/tools/vault/types/collect_context.d.ts +1340 -0
  173. package/build/tools/vault/types/list_all.d.ts +387 -0
  174. package/build/tools/vault/types/read_specific.d.ts +297 -0
  175. package/build/tools/vault/types/search.d.ts +598 -0
  176. package/build/tools/vault/utils/actions/collect_context.js +26 -1
  177. package/build/tools/vault/utils/actions/collect_context.js.map +1 -0
  178. package/build/tools/vault/utils/actions/index_rag.js +27 -0
  179. package/build/tools/vault/utils/actions/index_rag.js.map +1 -0
  180. package/build/tools/vault/utils/actions/list_all.js +1 -0
  181. package/build/tools/vault/utils/actions/list_all.js.map +1 -0
  182. package/build/tools/vault/utils/actions/load_memory.js +23 -13
  183. package/build/tools/vault/utils/actions/load_memory.js.map +1 -0
  184. package/build/tools/vault/utils/actions/read.js +2 -1
  185. package/build/tools/vault/utils/actions/read.js.map +1 -0
  186. package/build/tools/vault/utils/actions/search.js +2 -1
  187. package/build/tools/vault/utils/actions/search.js.map +1 -0
  188. package/build/tools/vault/utils/actions/search_semantic.js +54 -0
  189. package/build/tools/vault/utils/actions/search_semantic.js.map +1 -0
  190. package/build/tools/vault/utils/actions/stats.js +1 -0
  191. package/build/tools/vault/utils/actions/stats.js.map +1 -0
  192. package/build/tools/vault/utils/document.js +1 -0
  193. package/build/tools/vault/utils/document.js.map +1 -0
  194. package/build/tools/write_property/index.d.ts +58 -0
  195. package/build/tools/write_property/index.js +7 -1
  196. package/build/tools/write_property/index.js.map +1 -0
  197. package/build/utils/DirectoryWalker.d.ts +6 -0
  198. package/build/utils/DirectoryWalker.js +7 -0
  199. package/build/utils/DirectoryWalker.js.map +1 -0
  200. package/build/utils/Indexer.d.ts +18 -0
  201. package/build/utils/Indexer.js +5 -9
  202. package/build/utils/Indexer.js.map +1 -0
  203. package/build/utils/LLMClient.d.ts +37 -0
  204. package/build/utils/LLMClient.js +82 -0
  205. package/build/utils/LLMClient.js.map +1 -0
  206. package/build/utils/RAGIndexer.d.ts +22 -0
  207. package/build/utils/RAGIndexer.js +206 -0
  208. package/build/utils/RAGIndexer.js.map +1 -0
  209. package/build/utils/RerankerClient.d.ts +27 -0
  210. package/build/utils/RerankerClient.js +69 -0
  211. package/build/utils/RerankerClient.js.map +1 -0
  212. package/build/utils/VaultManger/VaultManager.d.ts +34 -0
  213. package/build/utils/VaultManger/VaultManager.js +1 -0
  214. package/build/utils/VaultManger/VaultManager.js.map +1 -0
  215. package/build/utils/VaultManger/VaultPathError.d.ts +6 -0
  216. package/build/utils/VaultManger/VaultPathError.js +1 -0
  217. package/build/utils/VaultManger/VaultPathError.js.map +1 -0
  218. package/build/utils/VaultManger/index.d.ts +3 -0
  219. package/build/utils/VaultManger/index.js +1 -0
  220. package/build/utils/VaultManger/index.js.map +1 -0
  221. package/build/utils/VaultManger/types.d.ts +16 -0
  222. package/build/utils/VaultManger/types.js +1 -0
  223. package/build/utils/VaultManger/types.js.map +1 -0
  224. package/build/utils/VaultWatcher.d.ts +8 -0
  225. package/build/utils/VaultWatcher.js +96 -0
  226. package/build/utils/VaultWatcher.js.map +1 -0
  227. package/build/utils/VectorDB.d.ts +53 -0
  228. package/build/utils/VectorDB.js +243 -0
  229. package/build/utils/VectorDB.js.map +1 -0
  230. package/build/utils/createToolError.d.ts +2 -0
  231. package/build/utils/createToolError.js +1 -0
  232. package/build/utils/createToolError.js.map +1 -0
  233. package/build/utils/getVaultManager.d.ts +2 -0
  234. package/build/utils/getVaultManager.js +2 -1
  235. package/build/utils/getVaultManager.js.map +1 -0
  236. package/build/utils/processor/LinkExtractor.d.ts +2 -0
  237. package/build/utils/processor/LinkExtractor.js +1 -0
  238. package/build/utils/processor/LinkExtractor.js.map +1 -0
  239. package/build/utils/processor/MatterParser.d.ts +2 -0
  240. package/build/utils/processor/MatterParser.js +12 -3
  241. package/build/utils/processor/MatterParser.js.map +1 -0
  242. package/build/utils/processor/types.d.ts +100 -0
  243. package/package.json +29 -3
  244. package/build/config.js +0 -55
  245. package/build/server.js +0 -32
  246. package/build/tools/create_document_with_properties/params.js +0 -32
  247. package/build/tools/generate_property/params.js +0 -54
  248. package/build/tools/index.js +0 -12
  249. package/build/tools/organize_attachments/params.js +0 -60
  250. package/build/tools/organize_attachments/utils.js +0 -65
  251. package/build/tools/vault/metrics.js +0 -126
  252. package/build/tools/vault/params.js +0 -141
  253. package/build/tools/vault/types/collect_context.js +0 -102
  254. package/build/tools/vault/types/list_all.js +0 -52
  255. package/build/tools/vault/types/read_specific.js +0 -40
  256. package/build/tools/vault/types/search.js +0 -58
  257. package/build/tools/vault/utils/constants.js +0 -2
  258. package/build/tools/vault/utils/shared.js +0 -74
  259. package/build/tools/vault/utils.js +0 -6
  260. package/build/tools/write_property/params.js +0 -51
  261. package/build/utils/processor/types.js +0 -27
  262. package/build/utils/semaphore.js +0 -25
@@ -0,0 +1,243 @@
1
+ import fs from "node:fs/promises";
2
+ import path from "node:path";
3
+ import { connect, Index } from "@lancedb/lancedb";
4
+ import * as arrow from "apache-arrow";
5
+ import { debugLogger } from "../cli/utils/debugLogger.js";
6
+ import state from "../config.js";
7
+ export const INDEX_VERSION = 5;
8
+ const VECTOR_DIM = 768;
9
+ const VaultDocumentSchema = new arrow.Schema([
10
+ new arrow.Field("id", new arrow.Utf8()),
11
+ new arrow.Field("filePath", new arrow.Utf8()),
12
+ new arrow.Field("fileName", new arrow.Utf8()),
13
+ new arrow.Field("chunkIndex", new arrow.Int32()),
14
+ new arrow.Field("content", new arrow.Utf8()),
15
+ new arrow.Field("context", new arrow.Utf8(), true),
16
+ new arrow.Field("vector", new arrow.FixedSizeList(VECTOR_DIM, new arrow.Field("item", new arrow.Float32(), true))),
17
+ new arrow.Field("metadata", new arrow.Struct([
18
+ new arrow.Field("title", new arrow.Utf8()),
19
+ new arrow.Field("date", new arrow.Utf8()),
20
+ new arrow.Field("tags", new arrow.Utf8()),
21
+ new arrow.Field("summary", new arrow.Utf8()),
22
+ new arrow.Field("slug", new arrow.Utf8()),
23
+ new arrow.Field("category", new arrow.Utf8()),
24
+ new arrow.Field("completed", new arrow.Bool()),
25
+ ])),
26
+ ]);
27
+ export class VectorDB {
28
+ dbPath;
29
+ tableName = "obsidian_chunks";
30
+ metaTableName = "obsidian_meta";
31
+ fileMetaTableName = "obsidian_file_meta";
32
+ db = null;
33
+ constructor() {
34
+ const vaultDotObsidian = path.join(state.vaultPath, ".obsidian");
35
+ this.dbPath = path.join(vaultDotObsidian, "vector_cache");
36
+ }
37
+ async ensureDir() {
38
+ try {
39
+ await fs.mkdir(this.dbPath, { recursive: true });
40
+ }
41
+ catch (error) {
42
+ debugLogger.error("Error creating vector cache directory:", error);
43
+ }
44
+ }
45
+ async connect() {
46
+ await this.ensureDir();
47
+ return await connect(this.dbPath);
48
+ }
49
+ async getDb() {
50
+ if (!this.db) {
51
+ this.db = await this.connect();
52
+ }
53
+ return this.db;
54
+ }
55
+ async getTable() {
56
+ const db = await this.getDb();
57
+ const tableNames = await db.tableNames();
58
+ if (!tableNames.includes(this.tableName)) {
59
+ return null;
60
+ }
61
+ return await db.openTable(this.tableName);
62
+ }
63
+ async checkAndMigrateIfNeeded() {
64
+ const db = await this.connect();
65
+ const tableNames = await db.tableNames();
66
+ const currentEmbedModel = state.llmEmbeddingModel;
67
+ if (!tableNames.includes(this.metaTableName)) {
68
+ const tablesToDrop = [this.tableName, this.fileMetaTableName];
69
+ for (const t of tablesToDrop) {
70
+ if (tableNames.includes(t)) {
71
+ debugLogger.error(`[VectorDB] No meta table found but ${t} exists — dropping stale index.`);
72
+ await db.dropTable(t);
73
+ }
74
+ }
75
+ await this.writeMetadata(db);
76
+ this.db = null;
77
+ return true;
78
+ }
79
+ const meta = await this.readMetadata(db);
80
+ const storedVersion = Number.parseInt(meta["index_version"] ?? "0", 10);
81
+ const storedModel = meta["embed_model"] ?? "";
82
+ if (storedVersion !== INDEX_VERSION || storedModel !== currentEmbedModel) {
83
+ debugLogger.error(`[VectorDB] Index version mismatch (stored: v${storedVersion}/${storedModel}, current: v${INDEX_VERSION}/${currentEmbedModel}) — rebuilding index.`);
84
+ const tablesToDrop = [
85
+ this.tableName,
86
+ this.metaTableName,
87
+ this.fileMetaTableName,
88
+ ];
89
+ for (const t of tablesToDrop) {
90
+ if (tableNames.includes(t)) {
91
+ await db.dropTable(t);
92
+ }
93
+ }
94
+ await this.writeMetadata(db);
95
+ this.db = null;
96
+ return true;
97
+ }
98
+ debugLogger.info(`[VectorDB] Index is up-to-date (v${INDEX_VERSION}, ${currentEmbedModel}).`);
99
+ return false;
100
+ }
101
+ async readMetadata(db) {
102
+ try {
103
+ const table = await db.openTable(this.metaTableName);
104
+ const rows = (await table.query().toArray());
105
+ const result = {};
106
+ for (const row of rows) {
107
+ result[row.key] = row.value;
108
+ }
109
+ return result;
110
+ }
111
+ catch {
112
+ return {};
113
+ }
114
+ }
115
+ async writeMetadata(db) {
116
+ const records = [
117
+ { key: "index_version", value: String(INDEX_VERSION) },
118
+ { key: "embed_model", value: state.llmEmbeddingModel },
119
+ ];
120
+ await db.createTable(this.metaTableName, records, { mode: "overwrite" });
121
+ }
122
+ async createVectorIndex() {
123
+ const table = await this.getTable();
124
+ if (!table) {
125
+ return;
126
+ }
127
+ const rowCount = await table.countRows();
128
+ if (rowCount < 256) {
129
+ console.error(`[VectorDB] Skipping index creation: only ${rowCount} rows (need 256+)`);
130
+ return;
131
+ }
132
+ const numPartitions = Math.max(2, Math.floor(Math.sqrt(rowCount)));
133
+ await table.createIndex("vector", {
134
+ config: Index.ivfPq({
135
+ numPartitions,
136
+ numSubVectors: 96,
137
+ distanceType: "cosine",
138
+ }),
139
+ });
140
+ debugLogger.info(`[VectorDB] Created vector index with ${numPartitions} partitions for ${rowCount} rows.`);
141
+ }
142
+ async upsertChunks(records) {
143
+ if (!this.db) {
144
+ this.db = await this.connect();
145
+ }
146
+ const tableNames = await this.db.tableNames();
147
+ if (!tableNames.includes(this.tableName)) {
148
+ await this.db.createEmptyTable(this.tableName, VaultDocumentSchema);
149
+ }
150
+ const table = await this.db.openTable(this.tableName);
151
+ const filePaths = Array.from(new Set(records.map((r) => r.filePath)));
152
+ const inClause = filePaths
153
+ .map((fp) => `'${fp.replace(/'/g, "''")}'`)
154
+ .join(", ");
155
+ await table.delete(`filePath IN (${inClause})`);
156
+ await table.add(records);
157
+ }
158
+ async updateFileMeta(filePath, mtime) {
159
+ if (!this.db) {
160
+ this.db = await this.connect();
161
+ }
162
+ const tableNames = await this.db.tableNames();
163
+ if (!tableNames.includes(this.fileMetaTableName)) {
164
+ await this.db.createTable(this.fileMetaTableName, [{ filePath, mtime }]);
165
+ return;
166
+ }
167
+ const table = await this.db.openTable(this.fileMetaTableName);
168
+ await table.delete(`filePath = '${filePath.replace(/'/g, "''")}'`);
169
+ await table.add([{ filePath, mtime }]);
170
+ }
171
+ async updateFileMetaBatch(entries) {
172
+ if (entries.length === 0)
173
+ return;
174
+ if (!this.db) {
175
+ this.db = await this.connect();
176
+ }
177
+ const tableNames = await this.db.tableNames();
178
+ if (!tableNames.includes(this.fileMetaTableName)) {
179
+ await this.db.createTable(this.fileMetaTableName, entries);
180
+ return;
181
+ }
182
+ const table = await this.db.openTable(this.fileMetaTableName);
183
+ const inClause = entries
184
+ .map((e) => `'${e.filePath.replace(/'/g, "''")}'`)
185
+ .join(", ");
186
+ await table.delete(`filePath IN (${inClause})`);
187
+ await table.add(entries);
188
+ }
189
+ async getFileMtime(filePath) {
190
+ if (!this.db) {
191
+ this.db = await this.connect();
192
+ }
193
+ const tableNames = await this.db.tableNames();
194
+ if (!tableNames.includes(this.fileMetaTableName))
195
+ return null;
196
+ const table = await this.db.openTable(this.fileMetaTableName);
197
+ const rows = (await table
198
+ .query()
199
+ .where(`filePath = '${filePath.replace(/'/g, "''")}'`)
200
+ .toArray());
201
+ return rows.length > 0 ? rows[0].mtime : null;
202
+ }
203
+ async deleteByFilePath(filePath) {
204
+ const table = await this.getTable();
205
+ if (table) {
206
+ await table.delete(`filePath = '${filePath.replace(/'/g, "''")}'`);
207
+ }
208
+ if (!this.db) {
209
+ this.db = await this.connect();
210
+ }
211
+ if ((await this.db.tableNames()).includes(this.fileMetaTableName)) {
212
+ const fileMetaTable = await this.db.openTable(this.fileMetaTableName);
213
+ await fileMetaTable.delete(`filePath = '${filePath.replace(/'/g, "''")}'`);
214
+ }
215
+ }
216
+ async hasFile(filePath) {
217
+ const table = await this.getTable();
218
+ if (!table)
219
+ return false;
220
+ try {
221
+ const count = await table.countRows(`filePath = '${filePath.replace(/'/g, "''")}'`);
222
+ return count > 0;
223
+ }
224
+ catch {
225
+ return false;
226
+ }
227
+ }
228
+ async search(queryVector, limit = 5) {
229
+ const table = await this.getTable();
230
+ if (!table)
231
+ return [];
232
+ const results = await table
233
+ .vectorSearch(queryVector)
234
+ .distanceType("cosine")
235
+ .nprobes(20)
236
+ .refineFactor(1)
237
+ .limit(limit)
238
+ .toArray();
239
+ return results;
240
+ }
241
+ }
242
+ export const vectorDB = new VectorDB();
243
+ //# sourceMappingURL=VectorDB.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"VectorDB.js","sourceRoot":"","sources":["../../src/utils/VectorDB.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ import type { CallToolResult } from "@modelcontextprotocol/sdk/types.js";
2
+ export declare function createToolError(error: string, suggestion?: string): CallToolResult;
@@ -13,3 +13,4 @@ export function createToolError(error, suggestion) {
13
13
  ],
14
14
  };
15
15
  }
16
+ //# sourceMappingURL=createToolError.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"createToolError.js","sourceRoot":"","sources":["../../src/utils/createToolError.ts"],"names":[],"mappings":"AAEA,MAAM,UAAU,eAAe,CAC9B,KAAa,EACb,UAAmB;IAEnB,MAAM,OAAO,GAA2C,EAAE,KAAK,EAAE,CAAC;IAClE,IAAI,UAAU,EAAE,CAAC;QAChB,OAAO,CAAC,UAAU,GAAG,UAAU,CAAC;IACjC,CAAC;IAED,OAAO;QACN,OAAO,EAAE,IAAI;QACb,OAAO,EAAE;YACR;gBACC,IAAI,EAAE,MAAM;gBACZ,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,OAAO,EAAE,IAAI,EAAE,CAAC,CAAC;aACtC;SACD;KACD,CAAC;AACH,CAAC"}
@@ -0,0 +1,2 @@
1
+ import { VaultManager } from "./VaultManger/VaultManager.js";
2
+ export declare function getGlobalVaultManager(): VaultManager;
@@ -1,4 +1,4 @@
1
- import state from "../config.js";
1
+ import state from "@/config.js";
2
2
  import { VaultManager } from "./VaultManger/VaultManager.js";
3
3
  let instance = null;
4
4
  export function getGlobalVaultManager() {
@@ -12,3 +12,4 @@ export function getGlobalVaultManager() {
12
12
  instance = new VaultManager(vaultPath, 20);
13
13
  return instance;
14
14
  }
15
+ //# sourceMappingURL=getVaultManager.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"getVaultManager.js","sourceRoot":"","sources":["../../src/utils/getVaultManager.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,aAAa,CAAC;AAChC,OAAO,EAAE,YAAY,EAAE,MAAM,+BAA+B,CAAC;AAE7D,IAAI,QAAQ,GAAwB,IAAI,CAAC;AAEzC,MAAM,UAAU,qBAAqB;IACpC,IAAI,QAAQ,EAAE,CAAC;QACd,OAAO,QAAQ,CAAC;IACjB,CAAC;IAED,MAAM,SAAS,GAAG,KAAK,CAAC,SAAS,CAAC;IAClC,IAAI,CAAC,SAAS,EAAE,CAAC;QAChB,MAAM,IAAI,KAAK,CAAC,gDAAgD,CAAC,CAAC;IACnE,CAAC;IAED,QAAQ,GAAG,IAAI,YAAY,CAAC,SAAS,EAAE,EAAE,CAAC,CAAC;IAC3C,OAAO,QAAQ,CAAC;AACjB,CAAC"}
@@ -0,0 +1,2 @@
1
+ export declare function extractImageLinks(content: string): string[];
2
+ export declare function extractDocumentLinks(content: string): string[];
@@ -28,3 +28,4 @@ export function extractDocumentLinks(content) {
28
28
  }
29
29
  return docLinks;
30
30
  }
31
+ //# sourceMappingURL=LinkExtractor.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"LinkExtractor.js","sourceRoot":"","sources":["../../../src/utils/processor/LinkExtractor.ts"],"names":[],"mappings":"AAAA,MAAM,UAAU,iBAAiB,CAAC,OAAe;IAChD,MAAM,UAAU,GAAa,EAAE,CAAC;IAChC,MAAM,aAAa,GAAG,oBAAoB,CAAC;IAC3C,MAAM,iBAAiB,GAAG,oBAAoB,CAAC;IAE/C,IAAI,KAA6B,CAAC;IAClC,KAAK,GAAG,aAAa,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;IACpC,OAAO,KAAK,KAAK,IAAI,EAAE,CAAC;QACvB,UAAU,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;QAC1B,KAAK,GAAG,aAAa,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;IACrC,CAAC;IACD,KAAK,GAAG,iBAAiB,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;IACxC,OAAO,KAAK,KAAK,IAAI,EAAE,CAAC;QACvB,UAAU,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;QAC1B,KAAK,GAAG,iBAAiB,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;IACzC,CAAC;IACD,OAAO,UAAU,CAAC;AACnB,CAAC;AAED,MAAM,UAAU,oBAAoB,CAAC,OAAe;IACnD,MAAM,QAAQ,GAAa,EAAE,CAAC;IAC9B,MAAM,aAAa,GAAG,yBAAyB,CAAC;IAEhD,IAAI,KAA6B,CAAC;IAClC,KAAK,GAAG,aAAa,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;IACpC,OAAO,KAAK,KAAK,IAAI,EAAE,CAAC;QACvB,gDAAgD;QAChD,MAAM,IAAI,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC;QACvC,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACpB,KAAK,GAAG,aAAa,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;IACrC,CAAC;IACD,OAAO,QAAQ,CAAC;AACjB,CAAC"}
@@ -0,0 +1,2 @@
1
+ import type { ParsedMatter } from "./types.js";
2
+ export declare function parse(filePath: string, birthTime: string, text: string): ParsedMatter;
@@ -1,6 +1,7 @@
1
+ import { basename } from "node:path";
1
2
  import matter from "gray-matter";
2
3
  import { FrontMatterSchema } from "./types.js";
3
- export function parse(text) {
4
+ export function parse(filePath, birthTime, text) {
4
5
  try {
5
6
  const parsed = matter(text);
6
7
  const frontmatter = FrontMatterSchema.parse(parsed.data);
@@ -10,10 +11,18 @@ export function parse(text) {
10
11
  };
11
12
  }
12
13
  catch {
13
- console.warn("Frontmatter 파싱에 실패했습니다. 전체를 내용으로 간주합니다.");
14
14
  return {
15
- frontmatter: FrontMatterSchema.parse({}),
15
+ frontmatter: FrontMatterSchema.parse({
16
+ title: basename(filePath, ".md"),
17
+ date: birthTime,
18
+ category: "any",
19
+ tags: [""],
20
+ summary: text.slice(0, 200).replace(/\n/g, " "),
21
+ slug: basename(filePath, ".md").toLowerCase().replace(/\s+/g, "-"),
22
+ completed: false,
23
+ }),
16
24
  content: text,
17
25
  };
18
26
  }
19
27
  }
28
+ //# sourceMappingURL=MatterParser.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"MatterParser.js","sourceRoot":"","sources":["../../../src/utils/processor/MatterParser.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,WAAW,CAAC;AACrC,OAAO,MAAM,MAAM,aAAa,CAAC;AAEjC,OAAO,EAAE,iBAAiB,EAAE,MAAM,YAAY,CAAC;AAE/C,MAAM,UAAU,KAAK,CACpB,QAAgB,EAChB,SAAiB,EACjB,IAAY;IAEZ,IAAI,CAAC;QACJ,MAAM,MAAM,GAAG,MAAM,CAAC,IAAI,CAAC,CAAC;QAC5B,MAAM,WAAW,GAAG,iBAAiB,CAAC,KAAK,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;QACzD,OAAO;YACN,WAAW;YACX,OAAO,EAAE,MAAM,CAAC,OAAO;SACvB,CAAC;IACH,CAAC;IAAC,MAAM,CAAC;QACR,OAAO;YACN,WAAW,EAAE,iBAAiB,CAAC,KAAK,CAAC;gBACpC,KAAK,EAAE,QAAQ,CAAC,QAAQ,EAAE,KAAK,CAAC;gBAChC,IAAI,EAAE,SAAS;gBACf,QAAQ,EAAE,KAAK;gBACf,IAAI,EAAE,CAAC,EAAE,CAAC;gBACV,OAAO,EAAE,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC,OAAO,CAAC,KAAK,EAAE,GAAG,CAAC;gBAC/C,IAAI,EAAE,QAAQ,CAAC,QAAQ,EAAE,KAAK,CAAC,CAAC,WAAW,EAAE,CAAC,OAAO,CAAC,MAAM,EAAE,GAAG,CAAC;gBAClE,SAAS,EAAE,KAAK;aAChB,CAAC;YACF,OAAO,EAAE,IAAI;SACb,CAAC;IACH,CAAC;AACF,CAAC"}
@@ -0,0 +1,100 @@
1
+ import { z } from "zod";
2
+ declare const PostCategorySchema: z.ZodOptional<z.ZodString>;
3
+ export declare const FrontMatterSchema: z.ZodObject<{
4
+ title: z.ZodString;
5
+ date: z.ZodOptional<z.ZodUnion<[z.ZodString, z.ZodDate]>>;
6
+ tags: z.ZodOptional<z.ZodArray<z.ZodString, "many">>;
7
+ summary: z.ZodOptional<z.ZodString>;
8
+ slug: z.ZodOptional<z.ZodString>;
9
+ category: z.ZodOptional<z.ZodString>;
10
+ completed: z.ZodOptional<z.ZodBoolean>;
11
+ }, "strip", z.ZodTypeAny, {
12
+ title: string;
13
+ date?: string | Date | undefined;
14
+ tags?: string[] | undefined;
15
+ summary?: string | undefined;
16
+ slug?: string | undefined;
17
+ category?: string | undefined;
18
+ completed?: boolean | undefined;
19
+ }, {
20
+ title: string;
21
+ date?: string | Date | undefined;
22
+ tags?: string[] | undefined;
23
+ summary?: string | undefined;
24
+ slug?: string | undefined;
25
+ category?: string | undefined;
26
+ completed?: boolean | undefined;
27
+ }>;
28
+ type FrontMatter = z.infer<typeof FrontMatterSchema>;
29
+ export interface ParsedMatter {
30
+ frontmatter: FrontMatter;
31
+ content: string;
32
+ }
33
+ export interface DocumentIndex {
34
+ filePath: string;
35
+ frontmatter: FrontMatter;
36
+ contentLength: number;
37
+ imageLinks: string[];
38
+ documentLinks: string[];
39
+ }
40
+ export declare const DocumentIndexSchema: z.ZodObject<{
41
+ filePath: z.ZodString;
42
+ frontmatter: z.ZodObject<{
43
+ title: z.ZodString;
44
+ date: z.ZodOptional<z.ZodUnion<[z.ZodString, z.ZodDate]>>;
45
+ tags: z.ZodOptional<z.ZodArray<z.ZodString, "many">>;
46
+ summary: z.ZodOptional<z.ZodString>;
47
+ slug: z.ZodOptional<z.ZodString>;
48
+ category: z.ZodOptional<z.ZodString>;
49
+ completed: z.ZodOptional<z.ZodBoolean>;
50
+ }, "strip", z.ZodTypeAny, {
51
+ title: string;
52
+ date?: string | Date | undefined;
53
+ tags?: string[] | undefined;
54
+ summary?: string | undefined;
55
+ slug?: string | undefined;
56
+ category?: string | undefined;
57
+ completed?: boolean | undefined;
58
+ }, {
59
+ title: string;
60
+ date?: string | Date | undefined;
61
+ tags?: string[] | undefined;
62
+ summary?: string | undefined;
63
+ slug?: string | undefined;
64
+ category?: string | undefined;
65
+ completed?: boolean | undefined;
66
+ }>;
67
+ contentLength: z.ZodNumber;
68
+ imageLinks: z.ZodArray<z.ZodString, "many">;
69
+ documentLinks: z.ZodArray<z.ZodString, "many">;
70
+ }, "strip", z.ZodTypeAny, {
71
+ frontmatter: {
72
+ title: string;
73
+ date?: string | Date | undefined;
74
+ tags?: string[] | undefined;
75
+ summary?: string | undefined;
76
+ slug?: string | undefined;
77
+ category?: string | undefined;
78
+ completed?: boolean | undefined;
79
+ };
80
+ contentLength: number;
81
+ filePath: string;
82
+ imageLinks: string[];
83
+ documentLinks: string[];
84
+ }, {
85
+ frontmatter: {
86
+ title: string;
87
+ date?: string | Date | undefined;
88
+ tags?: string[] | undefined;
89
+ summary?: string | undefined;
90
+ slug?: string | undefined;
91
+ category?: string | undefined;
92
+ completed?: boolean | undefined;
93
+ };
94
+ contentLength: number;
95
+ filePath: string;
96
+ imageLinks: string[];
97
+ documentLinks: string[];
98
+ }>;
99
+ export { PostCategorySchema };
100
+ export type { FrontMatter };
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@sunub/obsidian-mcp-server",
3
- "version": "0.2.0",
3
+ "version": "0.3.1",
4
4
  "description": "A server for the Obsidian Model Context Protocol.",
5
5
  "keywords": [
6
6
  "obsidian",
@@ -27,6 +27,7 @@
27
27
  "test:watch": "vitest --watch",
28
28
  "metrics:report": "node scripts/vault-metrics-report.mjs",
29
29
  "prepare": "npm run format && npm run build",
30
+ "prepublishOnly": "npm run build",
30
31
  "build": "tsc && tsc-alias && shx chmod +x build/index.js",
31
32
  "inspector": "npx -y @modelcontextprotocol/inspector node ./build/index.js",
32
33
  "format": "npx biome format --write",
@@ -36,19 +37,44 @@
36
37
  "author": "sunub",
37
38
  "license": "ISC",
38
39
  "dependencies": {
40
+ "@lancedb/lancedb": "^0.27.2",
41
+ "@langchain/core": "^1.1.39",
42
+ "@langchain/textsplitters": "^1.0.1",
39
43
  "@modelcontextprotocol/sdk": "^1.17.5",
44
+ "@types/tinycolor2": "^1.4.6",
45
+ "ansi-regex": "^6.2.2",
46
+ "apache-arrow": "^18.1.0",
47
+ "chalk": "^5.6.2",
48
+ "chokidar": "^5.0.0",
49
+ "clipboardy": "^5.3.1",
40
50
  "commander": "^14.0.2",
41
- "dotenv": "^17.2.2",
51
+ "comment-json": "^5.0.0",
52
+ "dotenv": "^17.4.2",
42
53
  "gray-matter": "^4.0.3",
54
+ "ink": "^7.0.0",
55
+ "js-tiktoken": "^1.0.21",
56
+ "mnemonist": "^0.40.3",
57
+ "ollama": "^0.6.3",
58
+ "ora": "^9.3.0",
59
+ "prompts": "^2.4.2",
60
+ "react": "^19.2.5",
61
+ "string-width": "^8.2.0",
62
+ "strip-ansi": "^7.2.0",
63
+ "tinycolor2": "^1.6.0",
64
+ "tinygradient": "^2.0.1",
65
+ "wrap-ansi": "^10.0.0",
66
+ "yargs": "^18.0.0",
43
67
  "zod": "^3.25.76"
44
68
  },
45
69
  "devDependencies": {
46
70
  "@biomejs/biome": "2.3.8",
47
71
  "@types/node": "^24.3.1",
72
+ "@types/react": "^19.2.14",
73
+ "@types/yargs": "^17.0.35",
48
74
  "jsdom": "^27.0.0",
49
75
  "shx": "^0.4.0",
50
76
  "tsc-alias": "^1.8.16",
51
- "tsx": "^4.20.5",
77
+ "tsx": "^4.21.0",
52
78
  "typescript": "^5.9.2",
53
79
  "vite-tsconfig-paths": "^5.1.4",
54
80
  "vitest": "^3.2.4"
package/build/config.js DELETED
@@ -1,55 +0,0 @@
1
- import { existsSync, statSync } from "node:fs";
2
- import { resolve } from "node:path";
3
- import { Command } from "commander";
4
- import dotenv from "dotenv";
5
- import { z } from "zod/v4";
6
- dotenv.config({ debug: false, quiet: true });
7
- const vaultPathSchema = z
8
- .string()
9
- .min(1, "Vault path는 비어 있을 수 없습니다.")
10
- .trim()
11
- .transform((val) => resolve(val)) // 입력받은 경로를 절대 경로로 변환
12
- .refine((val) => existsSync(val), {
13
- message: "파일 시스템에 해당 경로가 존재하지 않습니다.",
14
- })
15
- .refine((val) => {
16
- try {
17
- return statSync(val).isDirectory();
18
- }
19
- catch {
20
- return false;
21
- }
22
- }, {
23
- message: "지정된 경로가 디렉토리가 아닙니다.",
24
- });
25
- export const configSchema = z.object({
26
- vaultPath: vaultPathSchema,
27
- loggingLevel: z.enum(["debug", "info", "warn", "error"]).default("info"),
28
- });
29
- const state = {
30
- vaultPath: process.env.VAULT_DIR_PATH || "",
31
- loggingLevel: "info",
32
- };
33
- export function getOptions() {
34
- const program = new Command()
35
- .name("obsidian-mcp-server")
36
- .description("MCP Server for Obsidian Vault")
37
- .option("--vault-path <path>", "Path to the Obsidian vault directory", process.env.VAULT_DIR_PATH ?? "")
38
- .option("--logging-level <level>", "Logging level (debug, info, warn, error)", process.env.LOGGING_LEVEL ?? "info")
39
- .allowUnknownOption()
40
- .parse(process.argv);
41
- const options = program.opts();
42
- const parseResult = configSchema.safeParse(options);
43
- if (!parseResult.success) {
44
- console.error("Configuration Error:");
45
- parseResult.error.issues.forEach((issue) => {
46
- console.error(` - ${issue.path.join(".")}: ${issue.message}`);
47
- });
48
- console.info("\n사용 방법: Environment variables 에 VAULT_DIR_PATH 설정 또는 명령줄 인수 --vault-path <path>를 통해 올바른 구성을 제공하세요.");
49
- return false;
50
- }
51
- state.vaultPath = parseResult.data.vaultPath;
52
- state.loggingLevel = parseResult.data.loggingLevel;
53
- return state;
54
- }
55
- export default state;
package/build/server.js DELETED
@@ -1,32 +0,0 @@
1
- import { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
2
- import pkg from "../package.json" with { type: "json" };
3
- import tools from "./tools/index.js";
4
- export default function createMcpServer() {
5
- const mcpServer = new McpServer({
6
- version: pkg.version,
7
- name: "obsidian-mcp-server",
8
- title: "Obsidian MCP Server",
9
- }, {
10
- capabilities: {
11
- logging: {},
12
- tools: { listChanged: false },
13
- },
14
- instructions: `
15
- This server provides access to Obsidian vault documents and related tools.
16
-
17
- Available tools:
18
- - vault: Search, read, and list markdown documents in the vault
19
- - generate_property: Generate frontmatter property suggestions from document content
20
- - write_property: Write frontmatter properties to a markdown file
21
- - create_document_with_properties: Two-step workflow for AI-generated properties and write
22
- - organize_attachments: Move linked attachments and update markdown links
23
-
24
- Environment requirements:
25
- - VAULT_DIR_PATH: Path to your Obsidian vault directory
26
- `,
27
- });
28
- for (const tool of Object.values(tools)) {
29
- tool.register(mcpServer);
30
- }
31
- return mcpServer;
32
- }
@@ -1,32 +0,0 @@
1
- import { z } from "zod";
2
- import { obsidianPropertyOutputSchema } from "../generate_property/params.js";
3
- // input properties
4
- const sourcePath = z
5
- .string()
6
- .describe('The path to the source markdown file to read and analyze (e.g., "draft/my-article.md")');
7
- const outputPath = z
8
- .string()
9
- .optional()
10
- .describe("The path where the processed file with properties will be saved. If not provided, the source file will be updated in place.");
11
- const overwrite = z
12
- .boolean()
13
- .default(false)
14
- .describe("If set to true, existing properties will be overwritten by the AI-generated content. Default: false.");
15
- const aiGeneratedProperties = obsidianPropertyOutputSchema
16
- .optional()
17
- .describe("AI-generated properties based on content analysis. If provided, these will be used instead of internal analysis.");
18
- const quiet = z
19
- .boolean()
20
- .optional()
21
- .default(false)
22
- .describe("If true, the final write operation will return a minimal success message.");
23
- // input schema
24
- export const createDocumentWithPropertiesParamsSchema = z
25
- .object({
26
- sourcePath: sourcePath,
27
- outputPath: outputPath,
28
- overwrite: overwrite.optional(),
29
- aiGeneratedProperties: aiGeneratedProperties.optional(),
30
- quiet: quiet,
31
- })
32
- .describe("Parameters for creating or updating a document with automatically generated properties");