@sunub/obsidian-mcp-server 0.2.0 → 0.3.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 (283) hide show
  1. package/README.md +201 -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/app.js +7 -0
  6. package/build/cli/app.js.map +1 -0
  7. package/build/cli/config/SettingContext.d.ts +1 -0
  8. package/build/cli/config/SettingContext.js +2 -0
  9. package/build/cli/config/SettingContext.js.map +1 -0
  10. package/build/cli/config/mcpServersConfig.d.ts +18 -0
  11. package/build/cli/config/mcpServersConfig.js +119 -0
  12. package/build/cli/config/mcpServersConfig.js.map +1 -0
  13. package/build/cli/config/settingSchema.d.ts +180 -0
  14. package/build/cli/config/settingSchema.js +128 -0
  15. package/build/cli/config/settingSchema.js.map +1 -0
  16. package/build/cli/context/InputContext.d.ts +12 -0
  17. package/build/cli/context/InputContext.js +10 -0
  18. package/build/cli/context/InputContext.js.map +1 -0
  19. package/build/cli/context/KeypressContext.d.ts +30 -0
  20. package/build/cli/context/KeypressContext.js +200 -0
  21. package/build/cli/context/KeypressContext.js.map +1 -0
  22. package/build/cli/context/KeypressContext.util.d.ts +7 -0
  23. package/build/cli/context/KeypressContext.util.js +474 -0
  24. package/build/cli/context/KeypressContext.util.js.map +1 -0
  25. package/build/cli/hooks/useAtCompletion.d.ts +12 -0
  26. package/build/cli/hooks/useAtCompletion.js +5 -0
  27. package/build/cli/hooks/useAtCompletion.js.map +1 -0
  28. package/build/cli/hooks/useCommandCompletion.d.ts +59 -0
  29. package/build/cli/hooks/useCommandCompletion.js +344 -0
  30. package/build/cli/hooks/useCommandCompletion.js.map +1 -0
  31. package/build/cli/hooks/useCompletion.d.ts +22 -0
  32. package/build/cli/hooks/useCompletion.js +84 -0
  33. package/build/cli/hooks/useCompletion.js.map +1 -0
  34. package/build/cli/hooks/useDispatcher.d.ts +6 -0
  35. package/build/cli/hooks/useDispatcher.js +286 -0
  36. package/build/cli/hooks/useDispatcher.js.map +1 -0
  37. package/build/cli/hooks/useFocus.d.ts +2 -0
  38. package/build/cli/hooks/useFocus.js +3 -0
  39. package/build/cli/hooks/useFocus.js.map +1 -0
  40. package/build/cli/hooks/useInputHistory.d.ts +24 -0
  41. package/build/cli/hooks/useInputHistory.js +159 -0
  42. package/build/cli/hooks/useInputHistory.js.map +1 -0
  43. package/build/cli/hooks/useKeyMatchers.d.ts +17 -0
  44. package/build/cli/hooks/useKeyMatchers.js +13 -0
  45. package/build/cli/hooks/useKeyMatchers.js.map +1 -0
  46. package/build/cli/hooks/useKeypress.d.ts +19 -0
  47. package/build/cli/hooks/useKeypress.js +28 -0
  48. package/build/cli/hooks/useKeypress.js.map +1 -0
  49. package/build/cli/hooks/useLlmStream.d.ts +12 -0
  50. package/build/cli/hooks/useLlmStream.js +365 -0
  51. package/build/cli/hooks/useLlmStream.js.map +1 -0
  52. package/build/cli/hooks/useMcpClient.d.ts +10 -0
  53. package/build/cli/hooks/useMcpClient.js +100 -0
  54. package/build/cli/hooks/useMcpClient.js.map +1 -0
  55. package/build/cli/hooks/useMcpManager.d.ts +22 -0
  56. package/build/cli/hooks/useMcpManager.js +86 -0
  57. package/build/cli/hooks/useMcpManager.js.map +1 -0
  58. package/build/cli/hooks/usePromptCompletion.d.ts +19 -0
  59. package/build/cli/hooks/usePromptCompletion.js +13 -0
  60. package/build/cli/hooks/usePromptCompletion.js.map +1 -0
  61. package/build/cli/hooks/useRagContext.d.ts +6 -0
  62. package/build/cli/hooks/useRagContext.js +83 -0
  63. package/build/cli/hooks/useRagContext.js.map +1 -0
  64. package/build/cli/hooks/useShellCompletion.d.ts +18 -0
  65. package/build/cli/hooks/useShellCompletion.js +10 -0
  66. package/build/cli/hooks/useShellCompletion.js.map +1 -0
  67. package/build/cli/hooks/useSlashCompletion.d.ts +21 -0
  68. package/build/cli/hooks/useSlashCompletion.js +11 -0
  69. package/build/cli/hooks/useSlashCompletion.js.map +1 -0
  70. package/build/cli/hooks/useTerminalSize.d.ts +9 -0
  71. package/build/cli/hooks/useTerminalSize.js +26 -0
  72. package/build/cli/hooks/useTerminalSize.js.map +1 -0
  73. package/build/cli/index.js +27 -0
  74. package/build/cli/index.js.map +1 -0
  75. package/build/cli/key/keyBindings.d.ts +152 -0
  76. package/build/cli/key/keyBindings.js +630 -0
  77. package/build/cli/key/keyBindings.js.map +1 -0
  78. package/build/cli/key/keyMatchers.d.ts +27 -0
  79. package/build/cli/key/keyMatchers.js +33 -0
  80. package/build/cli/key/keyMatchers.js.map +1 -0
  81. package/build/cli/key/text-buffer-bestcase.js +2754 -0
  82. package/build/cli/key/text-buffer-bestcase.js.map +1 -0
  83. package/build/cli/key/text-buffer.js +918 -0
  84. package/build/cli/key/text-buffer.js.map +1 -0
  85. package/build/cli/reference/HistoryItemDisplay.d.ts +23 -0
  86. package/build/cli/reference/HistoryItemDisplay.js +63 -0
  87. package/build/cli/reference/HistoryItemDisplay.js.map +1 -0
  88. package/build/cli/reference/InputContext.d.ts +17 -0
  89. package/build/cli/reference/InputContext.js +16 -0
  90. package/build/cli/reference/InputContext.js.map +1 -0
  91. package/build/cli/reference/KerypressContext.d.ts +37 -0
  92. package/build/cli/reference/KerypressContext.js +791 -0
  93. package/build/cli/reference/KerypressContext.js.map +1 -0
  94. package/build/cli/reference/MainContent.d.ts +6 -0
  95. package/build/cli/reference/MainContent.js +207 -0
  96. package/build/cli/reference/MainContent.js.map +1 -0
  97. package/build/cli/reference/UIStateContext.d.ts +188 -0
  98. package/build/cli/reference/UIStateContext.js +16 -0
  99. package/build/cli/reference/UIStateContext.js.map +1 -0
  100. package/build/cli/reference/useGeminiStream.d.ts +42 -0
  101. package/build/cli/reference/useGeminiStream.js +1404 -0
  102. package/build/cli/reference/useGeminiStream.js.map +1 -0
  103. package/build/cli/services/McpClientService.d.ts +32 -0
  104. package/build/cli/services/McpClientService.js +123 -0
  105. package/build/cli/services/McpClientService.js.map +1 -0
  106. package/build/cli/services/McpManager.d.ts +28 -0
  107. package/build/cli/services/McpManager.js +146 -0
  108. package/build/cli/services/McpManager.js.map +1 -0
  109. package/build/cli/theme/builtin/no-color.js +125 -0
  110. package/build/cli/theme/builtin/no-color.js.map +1 -0
  111. package/build/cli/theme/builtin/tokyonight-dark.js +146 -0
  112. package/build/cli/theme/builtin/tokyonight-dark.js.map +1 -0
  113. package/build/cli/theme/semantic-colors.js +19 -0
  114. package/build/cli/theme/semantic-colors.js.map +1 -0
  115. package/build/cli/theme/semantic-tokens.js +77 -0
  116. package/build/cli/theme/semantic-tokens.js.map +1 -0
  117. package/build/cli/theme/theme-manager.d.ts +32 -0
  118. package/build/cli/theme/theme-manager.js +150 -0
  119. package/build/cli/theme/theme-manager.js.map +1 -0
  120. package/build/cli/theme/theme.js +333 -0
  121. package/build/cli/theme/theme.js.map +1 -0
  122. package/build/cli/tmp.js +27 -0
  123. package/build/cli/tmp.js.map +1 -0
  124. package/build/cli/types.d.ts +72 -0
  125. package/build/cli/types.js +8 -0
  126. package/build/cli/types.js.map +1 -0
  127. package/build/cli/ui/ConnectionStatus.d.ts +13 -0
  128. package/build/cli/ui/ConnectionStatus.js +24 -0
  129. package/build/cli/ui/ConnectionStatus.js.map +1 -0
  130. package/build/cli/ui/HelpCommands.d.ts +5 -0
  131. package/build/cli/ui/HelpCommands.js +11 -0
  132. package/build/cli/ui/HelpCommands.js.map +1 -0
  133. package/build/cli/ui/HistoryItemDisplay.d.ts +9 -0
  134. package/build/cli/ui/HistoryItemDisplay.js +38 -0
  135. package/build/cli/ui/HistoryItemDisplay.js.map +1 -0
  136. package/build/cli/ui/InputPrompt-bestcase.d.ts +63 -0
  137. package/build/cli/ui/InputPrompt-bestcase.js +1301 -0
  138. package/build/cli/ui/InputPrompt-bestcase.js.map +1 -0
  139. package/build/cli/ui/InputPrompt.d.ts +12 -0
  140. package/build/cli/ui/InputPrompt.js +145 -0
  141. package/build/cli/ui/InputPrompt.js.map +1 -0
  142. package/build/cli/ui/InputPrompt.tmp.d.ts +7 -0
  143. package/build/cli/ui/InputPrompt.tmp.js +215 -0
  144. package/build/cli/ui/InputPrompt.tmp.js.map +1 -0
  145. package/build/cli/ui/MainContent.d.ts +10 -0
  146. package/build/cli/ui/MainContent.js +24 -0
  147. package/build/cli/ui/MainContent.js.map +1 -0
  148. package/build/cli/ui/MouseContext.d.ts +1 -0
  149. package/build/cli/ui/MouseContext.js +2 -0
  150. package/build/cli/ui/MouseContext.js.map +1 -0
  151. package/build/cli/ui/SuggestionsDisplay.d.ts +25 -0
  152. package/build/cli/ui/SuggestionsDisplay.js +45 -0
  153. package/build/cli/ui/SuggestionsDisplay.js.map +1 -0
  154. package/build/cli/ui/ThinkingIndicator.d.ts +2 -0
  155. package/build/cli/ui/ThinkingIndicator.js +16 -0
  156. package/build/cli/ui/ThinkingIndicator.js.map +1 -0
  157. package/build/cli/ui/layout/DefaultAppLayout.d.ts +2 -0
  158. package/build/cli/ui/layout/DefaultAppLayout.js +6 -0
  159. package/build/cli/ui/layout/DefaultAppLayout.js.map +1 -0
  160. package/build/cli/ui/shared/ExpandableText.d.ts +14 -0
  161. package/build/cli/ui/shared/ExpandableText.js +19 -0
  162. package/build/cli/ui/shared/ExpandableText.js.map +1 -0
  163. package/build/cli/utils/commandUtils.d.ts +11 -0
  164. package/build/cli/utils/commandUtils.js +16 -0
  165. package/build/cli/utils/commandUtils.js.map +1 -0
  166. package/build/cli/utils/debugLogger.d.ts +12 -0
  167. package/build/cli/utils/debugLogger.js +52 -0
  168. package/build/cli/utils/debugLogger.js.map +1 -0
  169. package/build/cli/utils/historyStorage.d.ts +13 -0
  170. package/build/cli/utils/historyStorage.js +64 -0
  171. package/build/cli/utils/historyStorage.js.map +1 -0
  172. package/build/cli/utils/textUtil.d.ts +68 -0
  173. package/build/cli/utils/textUtil.js +236 -0
  174. package/build/cli/utils/textUtil.js.map +1 -0
  175. package/build/config.js +31 -5
  176. package/build/config.js.map +1 -0
  177. package/build/db.js +55 -0
  178. package/build/db.js.map +1 -0
  179. package/build/index.js +4 -0
  180. package/build/index.js.map +1 -0
  181. package/build/tools/create_document_with_properties/index.d.ts +60 -0
  182. package/build/tools/create_document_with_properties/index.js +6 -0
  183. package/build/tools/create_document_with_properties/index.js.map +1 -0
  184. package/build/tools/create_document_with_properties/params.d.ts +66 -0
  185. package/build/tools/generate_property/index.js +6 -0
  186. package/build/tools/generate_property/index.js.map +1 -0
  187. package/build/tools/index.d.ts +184 -0
  188. package/build/tools/organize_attachments/index.js +6 -0
  189. package/build/tools/organize_attachments/index.js.map +1 -0
  190. package/build/tools/organize_attachments/params.d.ts +122 -0
  191. package/build/tools/vault/index.js +16 -2
  192. package/build/tools/vault/index.js.map +1 -0
  193. package/build/tools/vault/params.d.ts +115 -0
  194. package/build/tools/vault/types/collect_context.d.ts +1340 -0
  195. package/build/tools/vault/types/list_all.d.ts +387 -0
  196. package/build/tools/vault/types/read_specific.d.ts +297 -0
  197. package/build/tools/vault/types/search.d.ts +598 -0
  198. package/build/tools/vault/utils/actions/collect_context.js +26 -1
  199. package/build/tools/vault/utils/actions/collect_context.js.map +1 -0
  200. package/build/tools/vault/utils/actions/index_rag.js +27 -0
  201. package/build/tools/vault/utils/actions/index_rag.js.map +1 -0
  202. package/build/tools/vault/utils/actions/list_all.js +1 -0
  203. package/build/tools/vault/utils/actions/list_all.js.map +1 -0
  204. package/build/tools/vault/utils/actions/load_memory.js +23 -13
  205. package/build/tools/vault/utils/actions/load_memory.js.map +1 -0
  206. package/build/tools/vault/utils/actions/read.js +2 -1
  207. package/build/tools/vault/utils/actions/read.js.map +1 -0
  208. package/build/tools/vault/utils/actions/search.js +2 -1
  209. package/build/tools/vault/utils/actions/search.js.map +1 -0
  210. package/build/tools/vault/utils/actions/search_semantic.js +54 -0
  211. package/build/tools/vault/utils/actions/search_semantic.js.map +1 -0
  212. package/build/tools/vault/utils/actions/stats.js +1 -0
  213. package/build/tools/vault/utils/actions/stats.js.map +1 -0
  214. package/build/tools/vault/utils/document.js +1 -0
  215. package/build/tools/vault/utils/document.js.map +1 -0
  216. package/build/tools/write_property/index.d.ts +58 -0
  217. package/build/tools/write_property/index.js +6 -0
  218. package/build/tools/write_property/index.js.map +1 -0
  219. package/build/utils/DirectoryWalker.d.ts +6 -0
  220. package/build/utils/DirectoryWalker.js +7 -0
  221. package/build/utils/DirectoryWalker.js.map +1 -0
  222. package/build/utils/Indexer.d.ts +18 -0
  223. package/build/utils/Indexer.js +5 -9
  224. package/build/utils/Indexer.js.map +1 -0
  225. package/build/utils/LLMClient.d.ts +37 -0
  226. package/build/utils/LLMClient.js +82 -0
  227. package/build/utils/LLMClient.js.map +1 -0
  228. package/build/utils/RAGIndexer.d.ts +22 -0
  229. package/build/utils/RAGIndexer.js +206 -0
  230. package/build/utils/RAGIndexer.js.map +1 -0
  231. package/build/utils/RerankerClient.d.ts +27 -0
  232. package/build/utils/RerankerClient.js +69 -0
  233. package/build/utils/RerankerClient.js.map +1 -0
  234. package/build/utils/VaultManger/VaultManager.d.ts +34 -0
  235. package/build/utils/VaultManger/VaultManager.js +1 -0
  236. package/build/utils/VaultManger/VaultManager.js.map +1 -0
  237. package/build/utils/VaultManger/VaultPathError.d.ts +6 -0
  238. package/build/utils/VaultManger/VaultPathError.js +1 -0
  239. package/build/utils/VaultManger/VaultPathError.js.map +1 -0
  240. package/build/utils/VaultManger/index.d.ts +3 -0
  241. package/build/utils/VaultManger/index.js +1 -0
  242. package/build/utils/VaultManger/index.js.map +1 -0
  243. package/build/utils/VaultManger/types.d.ts +16 -0
  244. package/build/utils/VaultManger/types.js +1 -0
  245. package/build/utils/VaultManger/types.js.map +1 -0
  246. package/build/utils/VaultWatcher.d.ts +8 -0
  247. package/build/utils/VaultWatcher.js +96 -0
  248. package/build/utils/VaultWatcher.js.map +1 -0
  249. package/build/utils/VectorDB.d.ts +53 -0
  250. package/build/utils/VectorDB.js +243 -0
  251. package/build/utils/VectorDB.js.map +1 -0
  252. package/build/utils/createToolError.d.ts +2 -0
  253. package/build/utils/createToolError.js +1 -0
  254. package/build/utils/createToolError.js.map +1 -0
  255. package/build/utils/getVaultManager.d.ts +2 -0
  256. package/build/utils/getVaultManager.js +1 -0
  257. package/build/utils/getVaultManager.js.map +1 -0
  258. package/build/utils/processor/LinkExtractor.d.ts +2 -0
  259. package/build/utils/processor/LinkExtractor.js +1 -0
  260. package/build/utils/processor/LinkExtractor.js.map +1 -0
  261. package/build/utils/processor/MatterParser.d.ts +2 -0
  262. package/build/utils/processor/MatterParser.js +12 -3
  263. package/build/utils/processor/MatterParser.js.map +1 -0
  264. package/build/utils/processor/types.d.ts +100 -0
  265. package/package.json +28 -3
  266. package/build/server.js +0 -32
  267. package/build/tools/create_document_with_properties/params.js +0 -32
  268. package/build/tools/generate_property/params.js +0 -54
  269. package/build/tools/index.js +0 -12
  270. package/build/tools/organize_attachments/params.js +0 -60
  271. package/build/tools/organize_attachments/utils.js +0 -65
  272. package/build/tools/vault/metrics.js +0 -126
  273. package/build/tools/vault/params.js +0 -141
  274. package/build/tools/vault/types/collect_context.js +0 -102
  275. package/build/tools/vault/types/list_all.js +0 -52
  276. package/build/tools/vault/types/read_specific.js +0 -40
  277. package/build/tools/vault/types/search.js +0 -58
  278. package/build/tools/vault/utils/constants.js +0 -2
  279. package/build/tools/vault/utils/shared.js +0 -74
  280. package/build/tools/vault/utils.js +0 -6
  281. package/build/tools/write_property/params.js +0 -51
  282. package/build/utils/processor/types.js +0 -27
  283. package/build/utils/semaphore.js +0 -25
package/README.md CHANGED
@@ -6,6 +6,7 @@
6
6
 
7
7
  MCP 클라이언트에 연결해 에이전트에게 **토큰 사용량을 제어하면서** Vault 내용을 조회할 수 있게 합니다.
8
8
 
9
+ llama.cpp 기반 로컬 LLM(임베딩·채팅·리랭킹)과 연동하면 **외부 API 없이 완전히 로컬에서** Vault RAG를 구축하고 구동할 수 있습니다.
9
10
 
10
11
  ## 무엇을 할 수 있나
11
12
 
@@ -13,11 +14,10 @@ MCP 클라이언트에 연결해 에이전트에게 **토큰 사용량을 제어
13
14
  - 특정 노트 열람 (`vault`, `action="read"`)
14
15
  - Vault 전체 문서 목록 조회 (`vault`, `action="list_all"`)
15
16
  - Vault 상태 조회 (`vault`, `action="stats"`)
16
- - 장기 컨텍스트용 메모리 패킷 생성 (`vault`, `action="collect_context"`)
17
- - 저장된 메모리 노트 조회 (`vault`, `action="load_memory"`)
17
+ - RAG 기반 검색 (`vault`, `action="search_vault_by_semantic"`) - LLM 서버(llama.cpp) 연동 필수
18
+ - 전체 색인 트리거 (`vault`, `action="index_vault_to_vectordb"`)
18
19
  - frontmatter 자동 생성 제안 (`generate_property`)
19
20
  - frontmatter 실제 반영 (`write_property`)
20
- - 문서 기반 프롬프트 워크플로우 (`create_document_with_properties`)
21
21
  - 이미지 첨부파일 정리 (`organize_attachments`)
22
22
 
23
23
  ## 사전 주의사항
@@ -31,25 +31,91 @@ MCP 클라이언트에 연결해 에이전트에게 **토큰 사용량을 제어
31
31
 
32
32
  ### 설정 확인사항
33
33
 
34
- 1. Vault 경로: VAULT_DIR_PATH에는 반드시 절대 경로를 입력해야 합니다.
34
+ **1. Vault 경로: `VAULT_DIR_PATH`에는 반드시 절대 경로를 입력해야 합니다.**
35
35
 
36
- ```plaintext
37
- // ✅ 올바른 예시
38
- "VAULT_DIR_PATH": "/Users/username/Documents/MyVault"
39
- "VAULT_DIR_PATH": "C:\\Users\\username\\Documents\\MyVault" // Windows
40
- "VAULT_DIR_PATH": "/mnt/c/Users/username/Documents/MyVault" // WSL
36
+ ```bash
37
+ # ✅ 올바른 예시 (macOS / Linux)
38
+ VAULT_DIR_PATH="/Users/username/Documents/MyVault"
39
+
40
+ # 올바른 예시 (Windows — 역슬래시 이스케이프)
41
+ VAULT_DIR_PATH="C:\\Users\\username\\Documents\\MyVault"
42
+
43
+ # ✅ 올바른 예시 (WSL)
44
+ VAULT_DIR_PATH="/mnt/c/Users/username/Documents/MyVault"
41
45
 
42
- // ❌ 잘못된 예시
43
- "VAULT_DIR_PATH": "~/Documents/MyVault" // 상대 경로 사용 불가
44
- "VAULT_DIR_PATH": "./vault" // 상대 경로 사용 불가
46
+ # ❌ 잘못된 예시 — 상대 경로는 서버 시작 시 오류 발생
47
+ VAULT_DIR_PATH="~/Documents/MyVault"
48
+ VAULT_DIR_PATH="./vault"
45
49
  ```
46
50
 
47
- 2. Node.js 요구사항: Node.js 22 이상이 설치되어 있어야 합니다.
51
+ **2. Node.js 요구사항: Node.js 22 이상이 설치되어 있어야 합니다.**
48
52
 
49
53
  ```bash
50
54
  node --version # v22.0.0 이상 확인
51
55
  ```
52
56
 
57
+ ---
58
+
59
+ ### 환경변수 전체 설정 예시
60
+
61
+ MCP 클라이언트 설정(`mcpServers.env`) 또는 셸 환경변수로 주입합니다.
62
+ 시맨틱 검색·리랭킹 기능을 사용하지 않을 경우 `VAULT_DIR_PATH`만 필수입니다.
63
+
64
+ **최소 설정 (기본 도구만 사용)**
65
+
66
+ ```json
67
+ {
68
+ "mcpServers": {
69
+ "obsidian": {
70
+ "command": "npx",
71
+ "args": ["-y", "@sunub/obsidian-mcp-server@latest"],
72
+ "env": {
73
+ "VAULT_DIR_PATH": "/abs/path/to/your/vault"
74
+ }
75
+ }
76
+ }
77
+ }
78
+ ```
79
+
80
+ **전체 설정 (시맨틱 검색 + 리랭킹 포함)**
81
+
82
+ ```json
83
+ {
84
+ "mcpServers": {
85
+ "obsidian": {
86
+ "command": "npx",
87
+ "args": ["-y", "@sunub/obsidian-mcp-server@latest"],
88
+ "env": {
89
+ "VAULT_DIR_PATH": "/abs/path/to/your/vault",
90
+ "LOGGING_LEVEL": "info",
91
+ "LLM_API_URL": "http://127.0.0.1:8080",
92
+ "LLM_EMBEDDING_API_URL": "http://127.0.0.1:8081",
93
+ "LLM_EMBEDDING_MODEL": "nomic-embed-text",
94
+ "LLM_CHAT_MODEL": "llama3",
95
+ "LLM_RERANKER_API_URL": "http://127.0.0.1:8082",
96
+ "VAULT_METRICS_LOG_PATH": "/abs/path/to/vault-metrics.ndjson"
97
+ }
98
+ }
99
+ }
100
+ }
101
+ ```
102
+
103
+ 각 변수가 연결되는 서버는 아래와 같습니다:
104
+
105
+ | 환경변수 | 기본값 | 역할 | 필수 여부 |
106
+ |---|---|---|---|
107
+ | `VAULT_DIR_PATH` | — | Obsidian Vault 절대 경로 | **필수** |
108
+ | `LOGGING_LEVEL` | `info` | 로그 수준 (`debug` / `info` / `warn` / `error`) | 선택 |
109
+ | `LLM_API_URL` | `http://127.0.0.1:8080` | llama-server 채팅 엔드포인트 | 선택 |
110
+ | `LLM_EMBEDDING_API_URL` | `http://127.0.0.1:8081` | llama-server 임베딩 엔드포인트 (벡터 색인 필수) | 선택 |
111
+ | `LLM_EMBEDDING_MODEL` | `nomic-embed-text` | 임베딩 모델명 | 선택 |
112
+ | `LLM_CHAT_MODEL` | `llama3` | 채팅 모델명 | 선택 |
113
+ | `LLM_RERANKER_API_URL` | `http://127.0.0.1:8082` | llama-server 리랭커 엔드포인트 (미설정 시 폴백) | 선택 |
114
+ | `VAULT_METRICS_LOG_PATH` | — | 응답 압축·토큰 메트릭 JSONL 기록 경로 | 선택 |
115
+
116
+ > `LLM_EMBEDDING_API_URL`이 없으면 `search_vault_by_semantic`과 `index_vault_to_vectordb`가 동작하지 않습니다.
117
+ > `LLM_RERANKER_API_URL`에 서버가 없으면 오류 없이 폴백(원래 정렬 유지)됩니다.
118
+
53
119
  ## 시작하기 (빠른 설정)
54
120
 
55
121
  ### 1) 공통 요구사항
@@ -101,6 +167,7 @@ npx -y @sunub/obsidian-mcp-server@latest --vault-path /abs/path/to/your/vault --
101
167
  args = ["-y", "@sunub/obsidian-mcp-server@latest"]
102
168
  env = { VAULT_DIR_PATH = "/abs/path/to/your/vault" }
103
169
  ```
170
+
104
171
  </details>
105
172
 
106
173
  <details>
@@ -110,10 +177,11 @@ npx -y @sunub/obsidian-mcp-server@latest --vault-path /abs/path/to/your/vault --
110
177
  2) `/mcp add`
111
178
  3) 아래 값 입력
112
179
 
113
- - **Server name:** `obsidian`
114
- - **Server Type:** `[1] Local`
115
- - **Command:** `npx -y @sunub/obsidian-mcp-server@latest`
116
- - **Environment:** `{ "VAULT_DIR_PATH": "/abs/path/to/your/vault" }`
180
+ - **Server name:** `obsidian`
181
+ - **Server Type:** `[1] Local`
182
+ - **Command:** `npx -y @sunub/obsidian-mcp-server@latest`
183
+ - **Environment:** `{ "VAULT_DIR_PATH": "/abs/path/to/your/vault" }`
184
+
117
185
  </details>
118
186
 
119
187
  <details>
@@ -132,6 +200,7 @@ npx -y @sunub/obsidian-mcp-server@latest --vault-path /abs/path/to/your/vault --
132
200
  }
133
201
  }
134
202
  ```
203
+
135
204
  </details>
136
205
 
137
206
  <details>
@@ -178,18 +247,116 @@ npx -y @sunub/obsidian-mcp-server@latest --vault-path /abs/path/to/your/vault --
178
247
  "env": {
179
248
  "VAULT_DIR_PATH": "/path/to/obsidian-vault",
180
249
  "VAULT_METRICS_LOG_PATH": "/path/to/vault-metrics.ndjson",
181
- "LOGGING_LEVEL": "info"
250
+ "LOGGING_LEVEL": "info",
251
+ "LLM_API_URL": "http://127.0.0.1:8080",
252
+ "LLM_EMBEDDING_API_URL": "http://127.0.0.1:8081",
253
+ "LLM_EMBEDDING_MODEL": "nomic-embed-text",
254
+ "LLM_CHAT_MODEL": "llama3"
255
+ }
256
+ }
257
+ }
258
+ }
259
+ ```json
260
+ {
261
+ "mcpServers": {
262
+ "obsidian": {
263
+ "command": "npx",
264
+ "args": [
265
+ "-y",
266
+ "@sunub/obsidian-mcp-server@latest"
267
+ ],
268
+ "env": {
269
+ "VAULT_DIR_PATH": "/path/to/obsidian-vault",
270
+ "VAULT_METRICS_LOG_PATH": "/path/to/vault-metrics.ndjson",
271
+ "LOGGING_LEVEL": "info",
272
+ "LLM_API_URL": "http://127.0.0.1:8080",
273
+ "LLM_EMBEDDING_API_URL": "http://127.0.0.1:8081",
274
+ "LLM_EMBEDDING_MODEL": "nomic-embed-text",
275
+ "LLM_CHAT_MODEL": "llama3",
276
+ "LLM_RERANKER_API_URL": "http://127.0.0.1:8082"
182
277
  }
183
278
  }
184
279
  }
185
280
  }
186
281
  ```
187
282
 
188
- ## 환경 변수 설정
283
+ > 변수의 역할과 기본값은 [사전 주의사항 → 환경변수 전체 설정 예시](#환경변수-전체-설정-예시)를 참고하세요.
284
+
285
+ ## 시맨틱 검색 (RAG) 설정
286
+
287
+ 키워드 검색 외에 **의미 기반 벡터 검색**을 사용하려면 임베딩 서버가 필요합니다.
288
+
289
+ ### 활성화 조건
290
+
291
+ `LLM_EMBEDDING_API_URL`이 가리키는 서버가 실행 중이어야 합니다.
292
+ 없으면 `search_vault_by_semantic`과 `index_vault_to_vectordb`가 동작하지 않고,
293
+ `useRagContext`는 자동으로 키워드 검색으로 폴백됩니다.
294
+
295
+ ```bash
296
+ # ecosystem.config.cjs 기준 — 임베딩 서버 단독 시작
297
+ pm2 start ecosystem.config.cjs --only llama-embedding-server
298
+ ```
299
+
300
+ ### 초기 색인 실행
301
+
302
+ 서버 연결 후 처음 한 번은 전체 색인을 직접 트리거해야 합니다.
303
+
304
+ ```text
305
+ "Vault 전체를 재색인해줘."
306
+ ```
307
+
308
+ 내부 동작:
309
+
310
+ ```json
311
+ {
312
+ "method": "tools/call",
313
+ "params": {
314
+ "name": "vault",
315
+ "arguments": { "action": "index_vault_to_vectordb" }
316
+ }
317
+ }
318
+ ```
319
+
320
+ 이후에는 파일 변경 시 **VaultWatcher가 자동으로 증분 색인**합니다 (mtime 기반).
321
+
322
+ ### 색인 저장 위치
323
+
324
+ ```
325
+ {VAULT_DIR_PATH}/.obsidian/vector_cache/ ← LanceDB 데이터 디렉터리
326
+ ```
327
+
328
+ - 직접 삭제해도 무방합니다. 다음 `index_vault_to_vectordb` 호출 시 재생성됩니다.
329
+ - `LLM_EMBEDDING_MODEL`을 변경하면 서버 시작 시 **자동으로 전체 재색인**이 발생합니다 (INDEX_VERSION 또는 모델명 불일치 감지).
330
+
331
+ ### 검색 전략 흐름
332
+
333
+ ```
334
+ 사용자 질문
335
+
336
+
337
+ search_vault_by_semantic (벡터 유사도 검색 → 리랭킹)
338
+ │ 결과 없음
339
+
340
+ vault.search (키워드 폴백)
341
+ │ 결과 없음
342
+
343
+ 컨텍스트 없이 LLM 응답
344
+ ```
345
+
346
+ <details>
347
+ <summary>청크·토큰 파라미터 (파워유저용)</summary>
348
+
349
+ | 항목 | 값 | 비고 |
350
+ |---|---|---|
351
+ | 청크 크기 | 500 tokens | tiktoken cl100k 기준 |
352
+ | 청크 오버랩 | 50 tokens | |
353
+ | 임베딩 최대 토큰 | 500 tokens | 초과 시 비례 잘라냄 |
354
+ | 임베딩 접두어 | `search_document: {text}` | nomic-embed-text 형식 |
355
+ | 벡터 차원 | 768 | nomic-embed-text 출력 크기 |
356
+ | IVF-PQ 인덱스 생성 | 256개 문서 이상 | 미만이면 브루트포스로 동작 |
357
+ | 동시 임베딩 요청 | 최대 3 | Semaphore 제한 |
189
358
 
190
- - `VAULT_DIR_PATH` (필수): Obsidian Vault 절대 경로
191
- - `VAULT_METRICS_LOG_PATH` (선택): 액션 응답 압축/토큰 메트릭을 JSONL로 기록
192
- - `LOGGING_LEVEL` (선택): `debug` | `info` | `warn` | `error`
359
+ </details>
193
360
 
194
361
  ## 시작 후 빠른 검증
195
362
 
@@ -216,7 +383,7 @@ npx -y @sunub/obsidian-mcp-server@latest --vault-path /abs/path/to/your/vault --
216
383
 
217
384
  정상 동작 시 응답에 `totalFiles`, `isInitialized`, `vaultPath`가 들어갑니다.
218
385
 
219
- 2) 검색 인덱스 확인
386
+ 1) 검색 인덱스 확인
220
387
 
221
388
  ```text
222
389
  "노트 제목에 'MCP'가 들어간 문서만 5개 찾아줘."
@@ -240,7 +407,7 @@ npx -y @sunub/obsidian-mcp-server@latest --vault-path /abs/path/to/your/vault --
240
407
 
241
408
  `search`에서 결과가 비어 있으면 인덱싱/경로 또는 키워드 범위를 의심합니다.
242
409
 
243
- 3) 문서 읽기 확인
410
+ 1) 문서 읽기 확인
244
411
 
245
412
  ```text
246
413
  "특정 노트 하나를 읽어줘."
@@ -270,6 +437,13 @@ npx -y @sunub/obsidian-mcp-server@latest --vault-path /abs/path/to/your/vault --
270
437
 
271
438
  MCP를 어떻게 호출하는지보다 “무슨 동작을 하려고 하는지”가 더 중요합니다.
272
439
 
440
+ 마크다운 문서에 작성되어 있는 첨부파일을 정리하는 동작 예시 :
441
+
442
+ <https://github.com/user-attachments/assets/eb74ec05-09f7-4632-a22c-666b7e844147>
443
+
444
+ - 특정 문서를 대상으로 문서에 작성되더 있는 이미지 첨부 파일을 정리해달라고 요구할 경우 해당 `images` 폴더 내부에 해당 파일의 이름으로 폴더를 생성하여 정리합니다.
445
+ - 정리된 문서는 기존의 작성되어 있던 문서의 연결이 깨지지 않도록 `images` 폴더를 기준으로 연결을 업데이트 합니다.
446
+
273
447
  직접 실행용 질문 예시:
274
448
 
275
449
  - `README.md`에서 `시작하기 (빠른 설정)`의 `MCP Client configuration` 부분만 찾아줘.
@@ -298,7 +472,7 @@ MCP를 어떻게 호출하는지보다 “무슨 동작을 하려고 하는지
298
472
 
299
473
  <!-- BEGIN AUTO GENERATED TOOLS -->
300
474
 
301
- - **Obsidian Tools (6 actions)**
475
+ - **Obsidian Tools (8 actions)**
302
476
  - [`vault`](docs/tool-reference.md#vault-action)
303
477
  - `search`
304
478
  - `read`
@@ -306,6 +480,8 @@ MCP를 어떻게 호출하는지보다 “무슨 동작을 하려고 하는지
306
480
  - `stats`
307
481
  - `collect_context`
308
482
  - `load_memory`
483
+ - `search_vault_by_semantic`
484
+ - `index_vault_to_vectordb`
309
485
  - [`generate_property`](docs/tool-reference.md#generate_property)
310
486
  - [`write_property`](docs/tool-reference.md#write_property)
311
487
  - [`create_document_with_properties`](docs/tool-reference.md#create_document_with_properties)
@@ -0,0 +1 @@
1
+ export declare const AppContainer: () => import("react/jsx-runtime").JSX.Element;
@@ -0,0 +1,197 @@
1
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ import { Box, Text } from "ink";
3
+ import { useCallback, useEffect, useMemo, useRef, useState } from "react";
4
+ import { InputContext } from "./context/InputContext.js";
5
+ import { KeypressProvider } from "./context/KeypressContext.js";
6
+ import { useDispatcher } from "./hooks/useDispatcher.js";
7
+ import { useInputHistoryStore } from "./hooks/useInputHistory.js";
8
+ import { useLlmStream } from "./hooks/useLlmStream.js";
9
+ import { useMcpManager } from "./hooks/useMcpManager.js";
10
+ import { useRagContext } from "./hooks/useRagContext.js";
11
+ import { useTerminalSize } from "./hooks/useTerminalSize.js";
12
+ import { useTextBuffer } from "./key/text-buffer.js";
13
+ import { ConnectionStatus } from "./ui/ConnectionStatus.js";
14
+ import { calculatePromptWidths, InputPrompt } from "./ui/InputPrompt.js";
15
+ import { MainContent } from "./ui/MainContent.js";
16
+ import { debugLogger } from "./utils/debugLogger.js";
17
+ import { historyStorage } from "./utils/historyStorage.js";
18
+ export const AppContainer = () => {
19
+ const [shellModeActive] = useState(false);
20
+ const [copyModeEnabled] = useState(false);
21
+ const [showEscapePrompt] = useState(false);
22
+ const { columns: terminalWidth, rows: terminalHeight } = useTerminalSize();
23
+ const mainAreaWidth = terminalWidth;
24
+ const { inputWidth, suggestionsWidth } = useMemo(() => {
25
+ const { inputWidth, suggestionsWidth } = calculatePromptWidths(mainAreaWidth);
26
+ return { inputWidth, suggestionsWidth };
27
+ }, [mainAreaWidth]);
28
+ const availableTerminalHeight = Math.max(0, terminalHeight - 2);
29
+ const { inputHistory, addInput, initializeFromLogger } = useInputHistoryStore();
30
+ useEffect(() => {
31
+ void initializeFromLogger(historyStorage);
32
+ }, [initializeFromLogger]);
33
+ // MCP Manager — 다중 MCP 서버 연결 관리
34
+ const { isConnected: mcpConnected, connections: mcpConnections, tools: mcpTools, toolsByServer: mcpToolsByServer, callTool, errors: mcpErrors, serverCount: mcpServerCount, connectedCount: mcpConnectedCount, } = useMcpManager();
35
+ const { handleDispatch } = useDispatcher(mcpTools);
36
+ const { fetchContext } = useRagContext(callTool, mcpConnected);
37
+ const buffer = useTextBuffer({
38
+ initialText: "",
39
+ viewportWidth: inputWidth,
40
+ viewportHeight: availableTerminalHeight,
41
+ });
42
+ const inputState = useMemo(() => ({
43
+ buffer,
44
+ userMessages: inputHistory,
45
+ shellModeActive,
46
+ showEscapePrompt,
47
+ copyModeEnabled,
48
+ inputWidth,
49
+ suggestionsWidth,
50
+ }), [
51
+ buffer,
52
+ inputHistory,
53
+ shellModeActive,
54
+ showEscapePrompt,
55
+ copyModeEnabled,
56
+ inputWidth,
57
+ suggestionsWidth,
58
+ ]);
59
+ // --- Phase 4~6: history + pendingItem 기반 상태 관리 ---
60
+ const [history, setHistory] = useState([]);
61
+ const nextIdRef = useRef(1);
62
+ const { pendingItem, streamingState, isLoading, error, sendMessage, reset, clearHistory, } = useLlmStream(callTool, mcpTools);
63
+ // 이관 Effect: 스트림 완료 → history로 이동
64
+ useEffect(() => {
65
+ if (pendingItem?.isComplete) {
66
+ setHistory((prev) => [
67
+ ...prev,
68
+ {
69
+ id: nextIdRef.current++,
70
+ type: "assistant",
71
+ content: pendingItem.content,
72
+ timestamp: Date.now(),
73
+ },
74
+ ]);
75
+ reset();
76
+ }
77
+ }, [pendingItem, reset]);
78
+ // 에러 로깅
79
+ useEffect(() => {
80
+ if (error) {
81
+ debugLogger.error("[AppContainer] LLM stream error:", error.message);
82
+ }
83
+ }, [error]);
84
+ const handleFinalSubmit = useCallback(async (value) => {
85
+ if (!value.trim() || isLoading)
86
+ return;
87
+ // Add to UI state session & past session recalculator
88
+ addInput(value);
89
+ // Save to physical file via storage utility
90
+ void historyStorage.appendMessage(value);
91
+ if (value.startsWith("/")) {
92
+ // 슬래시 커맨드 → Dispatcher → MCP 도구 호출
93
+ buffer.setText("");
94
+ const result = await handleDispatch(value, callTool);
95
+ // 로컬 액션 처리
96
+ if (result.content === "__CLEAR_HISTORY__") {
97
+ setHistory([]);
98
+ clearHistory();
99
+ setHistory((prev) => [
100
+ ...prev,
101
+ {
102
+ id: nextIdRef.current++,
103
+ type: "info",
104
+ content: "대화 히스토리가 초기화되었습니다.",
105
+ timestamp: Date.now(),
106
+ },
107
+ ]);
108
+ return;
109
+ }
110
+ if (result.content === "__LIST_TOOLS__") {
111
+ const toolsText = mcpConnected
112
+ ? Array.from(mcpToolsByServer.entries())
113
+ .map(([serverName, serverTools]) => {
114
+ const toolList = serverTools
115
+ .map((t) => ` • ${t.name}${t.description ? ` — ${t.description}` : ""}`)
116
+ .join("\n");
117
+ return `[${serverName}] (${serverTools.length} tools)\n${toolList}`;
118
+ })
119
+ .join("\n\n")
120
+ : "MCP 서버에 연결되지 않았습니다.";
121
+ setHistory((prev) => [
122
+ ...prev,
123
+ {
124
+ id: nextIdRef.current++,
125
+ type: "info",
126
+ content: `사용 가능한 MCP 도구:\n${toolsText}`,
127
+ timestamp: Date.now(),
128
+ },
129
+ ]);
130
+ return;
131
+ }
132
+ // 도구 결과 또는 일반 응답을 히스토리에 추가
133
+ if (result.type === "llm_required") {
134
+ // LLM 지시문 페이로드 → 사용자 입력을 히스토리에 표시 후 LLM으로 파이프
135
+ setHistory((prev) => [
136
+ ...prev,
137
+ {
138
+ id: nextIdRef.current++,
139
+ type: "user",
140
+ content: result.userIntent ?? value,
141
+ timestamp: Date.now(),
142
+ },
143
+ ]);
144
+ // 도구 결과(instructions + content_preview)를 RAG 컨텍스트처럼 LLM에 주입
145
+ void sendMessage(result.userIntent ?? value, result.content);
146
+ }
147
+ else {
148
+ setHistory((prev) => [
149
+ ...prev,
150
+ {
151
+ id: nextIdRef.current++,
152
+ type: result.type === "unknown_command" ? "error" : "info",
153
+ content: result.content,
154
+ timestamp: Date.now(),
155
+ },
156
+ ]);
157
+ }
158
+ }
159
+ else {
160
+ // 일반 텍스트 → RAG 컨텍스트 조회 → LLM 스트리밍
161
+ setHistory((prev) => [
162
+ ...prev,
163
+ {
164
+ id: nextIdRef.current++,
165
+ type: "user",
166
+ content: value,
167
+ timestamp: Date.now(),
168
+ },
169
+ ]);
170
+ // 입력창 즉시 초기화 (Phase 6 피드백 루프)
171
+ buffer.setText("");
172
+ // RAG 컨텍스트 조회 (MCP 연결 시에만)
173
+ const ragContext = await fetchContext(value);
174
+ void sendMessage(value, ragContext);
175
+ }
176
+ }, [
177
+ addInput,
178
+ buffer,
179
+ callTool,
180
+ clearHistory,
181
+ fetchContext,
182
+ handleDispatch,
183
+ isLoading,
184
+ mcpConnected,
185
+ mcpToolsByServer,
186
+ sendMessage,
187
+ ]);
188
+ // 전체 서버 연결 중 여부 판별
189
+ const isAnyConnecting = Array.from(mcpConnections.values()).some((info) => info.state === "connecting");
190
+ const hasAnyError = mcpErrors.size > 0;
191
+ return (_jsx(KeypressProvider, { children: _jsx(InputContext.Provider, { value: inputState, children: _jsxs(Box, { flexDirection: "column", width: "100%", children: [!mcpConnected && (_jsx(ConnectionStatus, { connections: mcpConnections, errors: mcpErrors })), _jsx(MainContent, { history: history, pendingItem: pendingItem, streamingState: streamingState, width: mainAreaWidth }), error && (_jsx(Box, { paddingX: 1, marginBottom: 1, children: _jsxs(Text, { color: "red", bold: true, children: ["\u2716 ", error.message] }) })), hasAnyError && !error && (_jsx(Box, { paddingX: 1, marginBottom: 1, flexDirection: "column", children: Array.from(mcpErrors.entries()).map(([serverName, serverError]) => (_jsxs(Text, { color: "yellow", bold: true, children: ["\u26A0 MCP [", serverName, "]: ", serverError.message] }, serverName))) })), _jsx(InputPrompt, { onSubmit: handleFinalSubmit, focus: streamingState === "idle" && mcpConnected, placeholder: isAnyConnecting
192
+ ? ` MCP 서버 연결 중... (${mcpConnectedCount}/${mcpServerCount})`
193
+ : hasAnyError && !mcpConnected
194
+ ? " MCP 연결에 실패했습니다"
195
+ : " Type your message..." })] }) }) }));
196
+ };
197
+ //# sourceMappingURL=AppContainer.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"AppContainer.js","sourceRoot":"","sources":["../../src/cli/AppContainer.tsx"],"names":[],"mappings":"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"}
@@ -0,0 +1,7 @@
1
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ import { Box, render, Text } from "ink";
3
+ function HistoryPrompt({ color = "blue", content = "", }) {
4
+ return (_jsxs(Box, { flexDirection: "column", padding: 1, children: [_jsx(Text, { bold: true, color: "#98FFD9", children: "\uD83D\uDD51 Conversation History:" }), _jsxs(Text, { color: "magenta", children: ["- User: \"What are the latest updates on the project?\"", "\n", "- Assistant: \"The latest update is that we have completed the initial design phase and are moving into development.\"", "\n", "- User: \"Great! Can you summarize the key points from the design phase?\"", "\n", "- Assistant: \"Sure! The key points from the design phase include defining the project scope, creating wireframes, and establishing a technology stack.\""] }), content && _jsx(Text, { color: color, children: content })] }));
5
+ }
6
+ render(_jsx(HistoryPrompt, {}));
7
+ //# sourceMappingURL=app.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"app.js","sourceRoot":"","sources":["../../src/cli/app.tsx"],"names":[],"mappings":";AAAA,OAAO,EAAE,GAAG,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,KAAK,CAAC;AAExC,SAAS,aAAa,CAAC,EACtB,KAAK,GAAG,MAAM,EACd,OAAO,GAAG,EAAE,GAIZ;IACA,OAAO,CACN,MAAC,GAAG,IAAC,aAAa,EAAC,QAAQ,EAAC,OAAO,EAAE,CAAC,aACrC,KAAC,IAAI,IAAC,IAAI,QAAC,KAAK,EAAC,SAAS,mDAEnB,EACP,MAAC,IAAI,IAAC,KAAK,EAAC,SAAS,wEAEnB,IAAI,4HAEJ,IAAI,gFAEJ,IAAI,iKAGC,EACN,OAAO,IAAI,KAAC,IAAI,IAAC,KAAK,EAAE,KAAK,YAAG,OAAO,GAAQ,IAC3C,CACN,CAAC;AACH,CAAC;AAED,MAAM,CAAC,KAAC,aAAa,KAAG,CAAC,CAAC"}
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=SettingContext.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"SettingContext.js","sourceRoot":"","sources":["../../../src/cli/config/SettingContext.tsx"],"names":[],"mappings":""}
@@ -0,0 +1,18 @@
1
+ import { z } from "zod/v4";
2
+ declare const mcpServerEntrySchema: z.ZodObject<{
3
+ command: z.ZodString;
4
+ args: z.ZodDefault<z.ZodOptional<z.ZodArray<z.ZodString>>>;
5
+ env: z.ZodDefault<z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodString>>>;
6
+ cwd: z.ZodOptional<z.ZodString>;
7
+ disabled: z.ZodDefault<z.ZodOptional<z.ZodBoolean>>;
8
+ }, z.core.$strip>;
9
+ export type McpServerEntry = z.infer<typeof mcpServerEntrySchema>;
10
+ export interface McpServerConfig {
11
+ name: string;
12
+ command: string;
13
+ args: string[];
14
+ env: Record<string, string>;
15
+ cwd?: string;
16
+ }
17
+ export declare function loadMcpServersConfig(): McpServerConfig[];
18
+ export {};