@sunub/obsidian-mcp-server 0.1.1 → 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 (284) hide show
  1. package/LICENSE +15 -0
  2. package/README.md +392 -153
  3. package/build/cli/AppContainer.d.ts +1 -0
  4. package/build/cli/AppContainer.js +197 -0
  5. package/build/cli/AppContainer.js.map +1 -0
  6. package/build/cli/app.js +7 -0
  7. package/build/cli/app.js.map +1 -0
  8. package/build/cli/config/SettingContext.d.ts +1 -0
  9. package/build/cli/config/SettingContext.js +2 -0
  10. package/build/cli/config/SettingContext.js.map +1 -0
  11. package/build/cli/config/mcpServersConfig.d.ts +18 -0
  12. package/build/cli/config/mcpServersConfig.js +119 -0
  13. package/build/cli/config/mcpServersConfig.js.map +1 -0
  14. package/build/cli/config/settingSchema.d.ts +180 -0
  15. package/build/cli/config/settingSchema.js +128 -0
  16. package/build/cli/config/settingSchema.js.map +1 -0
  17. package/build/cli/context/InputContext.d.ts +12 -0
  18. package/build/cli/context/InputContext.js +10 -0
  19. package/build/cli/context/InputContext.js.map +1 -0
  20. package/build/cli/context/KeypressContext.d.ts +30 -0
  21. package/build/cli/context/KeypressContext.js +200 -0
  22. package/build/cli/context/KeypressContext.js.map +1 -0
  23. package/build/cli/context/KeypressContext.util.d.ts +7 -0
  24. package/build/cli/context/KeypressContext.util.js +474 -0
  25. package/build/cli/context/KeypressContext.util.js.map +1 -0
  26. package/build/cli/hooks/useAtCompletion.d.ts +12 -0
  27. package/build/cli/hooks/useAtCompletion.js +5 -0
  28. package/build/cli/hooks/useAtCompletion.js.map +1 -0
  29. package/build/cli/hooks/useCommandCompletion.d.ts +59 -0
  30. package/build/cli/hooks/useCommandCompletion.js +344 -0
  31. package/build/cli/hooks/useCommandCompletion.js.map +1 -0
  32. package/build/cli/hooks/useCompletion.d.ts +22 -0
  33. package/build/cli/hooks/useCompletion.js +84 -0
  34. package/build/cli/hooks/useCompletion.js.map +1 -0
  35. package/build/cli/hooks/useDispatcher.d.ts +6 -0
  36. package/build/cli/hooks/useDispatcher.js +286 -0
  37. package/build/cli/hooks/useDispatcher.js.map +1 -0
  38. package/build/cli/hooks/useFocus.d.ts +2 -0
  39. package/build/cli/hooks/useFocus.js +3 -0
  40. package/build/cli/hooks/useFocus.js.map +1 -0
  41. package/build/cli/hooks/useInputHistory.d.ts +24 -0
  42. package/build/cli/hooks/useInputHistory.js +159 -0
  43. package/build/cli/hooks/useInputHistory.js.map +1 -0
  44. package/build/cli/hooks/useKeyMatchers.d.ts +17 -0
  45. package/build/cli/hooks/useKeyMatchers.js +13 -0
  46. package/build/cli/hooks/useKeyMatchers.js.map +1 -0
  47. package/build/cli/hooks/useKeypress.d.ts +19 -0
  48. package/build/cli/hooks/useKeypress.js +28 -0
  49. package/build/cli/hooks/useKeypress.js.map +1 -0
  50. package/build/cli/hooks/useLlmStream.d.ts +12 -0
  51. package/build/cli/hooks/useLlmStream.js +365 -0
  52. package/build/cli/hooks/useLlmStream.js.map +1 -0
  53. package/build/cli/hooks/useMcpClient.d.ts +10 -0
  54. package/build/cli/hooks/useMcpClient.js +100 -0
  55. package/build/cli/hooks/useMcpClient.js.map +1 -0
  56. package/build/cli/hooks/useMcpManager.d.ts +22 -0
  57. package/build/cli/hooks/useMcpManager.js +86 -0
  58. package/build/cli/hooks/useMcpManager.js.map +1 -0
  59. package/build/cli/hooks/usePromptCompletion.d.ts +19 -0
  60. package/build/cli/hooks/usePromptCompletion.js +13 -0
  61. package/build/cli/hooks/usePromptCompletion.js.map +1 -0
  62. package/build/cli/hooks/useRagContext.d.ts +6 -0
  63. package/build/cli/hooks/useRagContext.js +83 -0
  64. package/build/cli/hooks/useRagContext.js.map +1 -0
  65. package/build/cli/hooks/useShellCompletion.d.ts +18 -0
  66. package/build/cli/hooks/useShellCompletion.js +10 -0
  67. package/build/cli/hooks/useShellCompletion.js.map +1 -0
  68. package/build/cli/hooks/useSlashCompletion.d.ts +21 -0
  69. package/build/cli/hooks/useSlashCompletion.js +11 -0
  70. package/build/cli/hooks/useSlashCompletion.js.map +1 -0
  71. package/build/cli/hooks/useTerminalSize.d.ts +9 -0
  72. package/build/cli/hooks/useTerminalSize.js +26 -0
  73. package/build/cli/hooks/useTerminalSize.js.map +1 -0
  74. package/build/cli/index.js +27 -0
  75. package/build/cli/index.js.map +1 -0
  76. package/build/cli/key/keyBindings.d.ts +152 -0
  77. package/build/cli/key/keyBindings.js +630 -0
  78. package/build/cli/key/keyBindings.js.map +1 -0
  79. package/build/cli/key/keyMatchers.d.ts +27 -0
  80. package/build/cli/key/keyMatchers.js +33 -0
  81. package/build/cli/key/keyMatchers.js.map +1 -0
  82. package/build/cli/key/text-buffer-bestcase.js +2754 -0
  83. package/build/cli/key/text-buffer-bestcase.js.map +1 -0
  84. package/build/cli/key/text-buffer.js +918 -0
  85. package/build/cli/key/text-buffer.js.map +1 -0
  86. package/build/cli/reference/HistoryItemDisplay.d.ts +23 -0
  87. package/build/cli/reference/HistoryItemDisplay.js +63 -0
  88. package/build/cli/reference/HistoryItemDisplay.js.map +1 -0
  89. package/build/cli/reference/InputContext.d.ts +17 -0
  90. package/build/cli/reference/InputContext.js +16 -0
  91. package/build/cli/reference/InputContext.js.map +1 -0
  92. package/build/cli/reference/KerypressContext.d.ts +37 -0
  93. package/build/cli/reference/KerypressContext.js +791 -0
  94. package/build/cli/reference/KerypressContext.js.map +1 -0
  95. package/build/cli/reference/MainContent.d.ts +6 -0
  96. package/build/cli/reference/MainContent.js +207 -0
  97. package/build/cli/reference/MainContent.js.map +1 -0
  98. package/build/cli/reference/UIStateContext.d.ts +188 -0
  99. package/build/cli/reference/UIStateContext.js +16 -0
  100. package/build/cli/reference/UIStateContext.js.map +1 -0
  101. package/build/cli/reference/useGeminiStream.d.ts +42 -0
  102. package/build/cli/reference/useGeminiStream.js +1404 -0
  103. package/build/cli/reference/useGeminiStream.js.map +1 -0
  104. package/build/cli/services/McpClientService.d.ts +32 -0
  105. package/build/cli/services/McpClientService.js +123 -0
  106. package/build/cli/services/McpClientService.js.map +1 -0
  107. package/build/cli/services/McpManager.d.ts +28 -0
  108. package/build/cli/services/McpManager.js +146 -0
  109. package/build/cli/services/McpManager.js.map +1 -0
  110. package/build/cli/theme/builtin/no-color.js +125 -0
  111. package/build/cli/theme/builtin/no-color.js.map +1 -0
  112. package/build/cli/theme/builtin/tokyonight-dark.js +146 -0
  113. package/build/cli/theme/builtin/tokyonight-dark.js.map +1 -0
  114. package/build/cli/theme/semantic-colors.js +19 -0
  115. package/build/cli/theme/semantic-colors.js.map +1 -0
  116. package/build/cli/theme/semantic-tokens.js +77 -0
  117. package/build/cli/theme/semantic-tokens.js.map +1 -0
  118. package/build/cli/theme/theme-manager.d.ts +32 -0
  119. package/build/cli/theme/theme-manager.js +150 -0
  120. package/build/cli/theme/theme-manager.js.map +1 -0
  121. package/build/cli/theme/theme.js +333 -0
  122. package/build/cli/theme/theme.js.map +1 -0
  123. package/build/cli/tmp.js +27 -0
  124. package/build/cli/tmp.js.map +1 -0
  125. package/build/cli/types.d.ts +72 -0
  126. package/build/cli/types.js +8 -0
  127. package/build/cli/types.js.map +1 -0
  128. package/build/cli/ui/ConnectionStatus.d.ts +13 -0
  129. package/build/cli/ui/ConnectionStatus.js +24 -0
  130. package/build/cli/ui/ConnectionStatus.js.map +1 -0
  131. package/build/cli/ui/HelpCommands.d.ts +5 -0
  132. package/build/cli/ui/HelpCommands.js +11 -0
  133. package/build/cli/ui/HelpCommands.js.map +1 -0
  134. package/build/cli/ui/HistoryItemDisplay.d.ts +9 -0
  135. package/build/cli/ui/HistoryItemDisplay.js +38 -0
  136. package/build/cli/ui/HistoryItemDisplay.js.map +1 -0
  137. package/build/cli/ui/InputPrompt-bestcase.d.ts +63 -0
  138. package/build/cli/ui/InputPrompt-bestcase.js +1301 -0
  139. package/build/cli/ui/InputPrompt-bestcase.js.map +1 -0
  140. package/build/cli/ui/InputPrompt.d.ts +12 -0
  141. package/build/cli/ui/InputPrompt.js +145 -0
  142. package/build/cli/ui/InputPrompt.js.map +1 -0
  143. package/build/cli/ui/InputPrompt.tmp.d.ts +7 -0
  144. package/build/cli/ui/InputPrompt.tmp.js +215 -0
  145. package/build/cli/ui/InputPrompt.tmp.js.map +1 -0
  146. package/build/cli/ui/MainContent.d.ts +10 -0
  147. package/build/cli/ui/MainContent.js +24 -0
  148. package/build/cli/ui/MainContent.js.map +1 -0
  149. package/build/cli/ui/MouseContext.d.ts +1 -0
  150. package/build/cli/ui/MouseContext.js +2 -0
  151. package/build/cli/ui/MouseContext.js.map +1 -0
  152. package/build/cli/ui/SuggestionsDisplay.d.ts +25 -0
  153. package/build/cli/ui/SuggestionsDisplay.js +45 -0
  154. package/build/cli/ui/SuggestionsDisplay.js.map +1 -0
  155. package/build/cli/ui/ThinkingIndicator.d.ts +2 -0
  156. package/build/cli/ui/ThinkingIndicator.js +16 -0
  157. package/build/cli/ui/ThinkingIndicator.js.map +1 -0
  158. package/build/cli/ui/layout/DefaultAppLayout.d.ts +2 -0
  159. package/build/cli/ui/layout/DefaultAppLayout.js +6 -0
  160. package/build/cli/ui/layout/DefaultAppLayout.js.map +1 -0
  161. package/build/cli/ui/shared/ExpandableText.d.ts +14 -0
  162. package/build/cli/ui/shared/ExpandableText.js +19 -0
  163. package/build/cli/ui/shared/ExpandableText.js.map +1 -0
  164. package/build/cli/utils/commandUtils.d.ts +11 -0
  165. package/build/cli/utils/commandUtils.js +16 -0
  166. package/build/cli/utils/commandUtils.js.map +1 -0
  167. package/build/cli/utils/debugLogger.d.ts +12 -0
  168. package/build/cli/utils/debugLogger.js +52 -0
  169. package/build/cli/utils/debugLogger.js.map +1 -0
  170. package/build/cli/utils/historyStorage.d.ts +13 -0
  171. package/build/cli/utils/historyStorage.js +64 -0
  172. package/build/cli/utils/historyStorage.js.map +1 -0
  173. package/build/cli/utils/textUtil.d.ts +68 -0
  174. package/build/cli/utils/textUtil.js +236 -0
  175. package/build/cli/utils/textUtil.js.map +1 -0
  176. package/build/config.js +31 -5
  177. package/build/config.js.map +1 -0
  178. package/build/db.js +55 -0
  179. package/build/db.js.map +1 -0
  180. package/build/index.js +4 -4
  181. package/build/index.js.map +1 -0
  182. package/build/tools/create_document_with_properties/index.d.ts +60 -0
  183. package/build/tools/create_document_with_properties/index.js +6 -0
  184. package/build/tools/create_document_with_properties/index.js.map +1 -0
  185. package/build/tools/create_document_with_properties/params.d.ts +66 -0
  186. package/build/tools/generate_property/index.js +6 -0
  187. package/build/tools/generate_property/index.js.map +1 -0
  188. package/build/tools/index.d.ts +184 -0
  189. package/build/tools/organize_attachments/index.js +6 -0
  190. package/build/tools/organize_attachments/index.js.map +1 -0
  191. package/build/tools/organize_attachments/params.d.ts +122 -0
  192. package/build/tools/vault/index.js +16 -2
  193. package/build/tools/vault/index.js.map +1 -0
  194. package/build/tools/vault/params.d.ts +115 -0
  195. package/build/tools/vault/types/collect_context.d.ts +1340 -0
  196. package/build/tools/vault/types/list_all.d.ts +387 -0
  197. package/build/tools/vault/types/read_specific.d.ts +297 -0
  198. package/build/tools/vault/types/search.d.ts +598 -0
  199. package/build/tools/vault/utils/actions/collect_context.js +26 -1
  200. package/build/tools/vault/utils/actions/collect_context.js.map +1 -0
  201. package/build/tools/vault/utils/actions/index_rag.js +27 -0
  202. package/build/tools/vault/utils/actions/index_rag.js.map +1 -0
  203. package/build/tools/vault/utils/actions/list_all.js +1 -0
  204. package/build/tools/vault/utils/actions/list_all.js.map +1 -0
  205. package/build/tools/vault/utils/actions/load_memory.js +23 -13
  206. package/build/tools/vault/utils/actions/load_memory.js.map +1 -0
  207. package/build/tools/vault/utils/actions/read.js +2 -1
  208. package/build/tools/vault/utils/actions/read.js.map +1 -0
  209. package/build/tools/vault/utils/actions/search.js +2 -1
  210. package/build/tools/vault/utils/actions/search.js.map +1 -0
  211. package/build/tools/vault/utils/actions/search_semantic.js +54 -0
  212. package/build/tools/vault/utils/actions/search_semantic.js.map +1 -0
  213. package/build/tools/vault/utils/actions/stats.js +1 -0
  214. package/build/tools/vault/utils/actions/stats.js.map +1 -0
  215. package/build/tools/vault/utils/document.js +1 -0
  216. package/build/tools/vault/utils/document.js.map +1 -0
  217. package/build/tools/write_property/index.d.ts +58 -0
  218. package/build/tools/write_property/index.js +6 -0
  219. package/build/tools/write_property/index.js.map +1 -0
  220. package/build/utils/DirectoryWalker.d.ts +6 -0
  221. package/build/utils/DirectoryWalker.js +7 -0
  222. package/build/utils/DirectoryWalker.js.map +1 -0
  223. package/build/utils/Indexer.d.ts +18 -0
  224. package/build/utils/Indexer.js +5 -9
  225. package/build/utils/Indexer.js.map +1 -0
  226. package/build/utils/LLMClient.d.ts +37 -0
  227. package/build/utils/LLMClient.js +82 -0
  228. package/build/utils/LLMClient.js.map +1 -0
  229. package/build/utils/RAGIndexer.d.ts +22 -0
  230. package/build/utils/RAGIndexer.js +206 -0
  231. package/build/utils/RAGIndexer.js.map +1 -0
  232. package/build/utils/RerankerClient.d.ts +27 -0
  233. package/build/utils/RerankerClient.js +69 -0
  234. package/build/utils/RerankerClient.js.map +1 -0
  235. package/build/utils/VaultManger/VaultManager.d.ts +34 -0
  236. package/build/utils/VaultManger/VaultManager.js +1 -0
  237. package/build/utils/VaultManger/VaultManager.js.map +1 -0
  238. package/build/utils/VaultManger/VaultPathError.d.ts +6 -0
  239. package/build/utils/VaultManger/VaultPathError.js +1 -0
  240. package/build/utils/VaultManger/VaultPathError.js.map +1 -0
  241. package/build/utils/VaultManger/index.d.ts +3 -0
  242. package/build/utils/VaultManger/index.js +1 -0
  243. package/build/utils/VaultManger/index.js.map +1 -0
  244. package/build/utils/VaultManger/types.d.ts +16 -0
  245. package/build/utils/VaultManger/types.js +1 -0
  246. package/build/utils/VaultManger/types.js.map +1 -0
  247. package/build/utils/VaultWatcher.d.ts +8 -0
  248. package/build/utils/VaultWatcher.js +96 -0
  249. package/build/utils/VaultWatcher.js.map +1 -0
  250. package/build/utils/VectorDB.d.ts +53 -0
  251. package/build/utils/VectorDB.js +243 -0
  252. package/build/utils/VectorDB.js.map +1 -0
  253. package/build/utils/createToolError.d.ts +2 -0
  254. package/build/utils/createToolError.js +1 -0
  255. package/build/utils/createToolError.js.map +1 -0
  256. package/build/utils/getVaultManager.d.ts +2 -0
  257. package/build/utils/getVaultManager.js +1 -0
  258. package/build/utils/getVaultManager.js.map +1 -0
  259. package/build/utils/processor/LinkExtractor.d.ts +2 -0
  260. package/build/utils/processor/LinkExtractor.js +1 -0
  261. package/build/utils/processor/LinkExtractor.js.map +1 -0
  262. package/build/utils/processor/MatterParser.d.ts +2 -0
  263. package/build/utils/processor/MatterParser.js +12 -3
  264. package/build/utils/processor/MatterParser.js.map +1 -0
  265. package/build/utils/processor/types.d.ts +100 -0
  266. package/package.json +28 -7
  267. package/build/server.js +0 -32
  268. package/build/tools/create_document_with_properties/params.js +0 -32
  269. package/build/tools/generate_property/params.js +0 -54
  270. package/build/tools/index.js +0 -12
  271. package/build/tools/organize_attachments/params.js +0 -60
  272. package/build/tools/organize_attachments/utils.js +0 -65
  273. package/build/tools/vault/metrics.js +0 -126
  274. package/build/tools/vault/params.js +0 -141
  275. package/build/tools/vault/types/collect_context.js +0 -102
  276. package/build/tools/vault/types/list_all.js +0 -52
  277. package/build/tools/vault/types/read_specific.js +0 -40
  278. package/build/tools/vault/types/search.js +0 -58
  279. package/build/tools/vault/utils/constants.js +0 -2
  280. package/build/tools/vault/utils/shared.js +0 -74
  281. package/build/tools/vault/utils.js +0 -6
  282. package/build/tools/write_property/params.js +0 -51
  283. package/build/utils/processor/types.js +0 -27
  284. package/build/utils/semaphore.js +0 -25
package/README.md CHANGED
@@ -1,257 +1,496 @@
1
1
  # Obsidian MCP Server
2
2
 
3
- `obsidian-mcp-server`는 [Model Context Protocol(MCP)](https://modelcontextprotocol.io/docs/getting-started/intro)을 구현한 서버로, 로컬 Obsidian vault의 문서들을 AI 에이전트나 외부 애플리케이션에서 쉽게 탐색하고 관리할 수 있도록 강력한 도구 API를 제공합니다.
3
+ [![npm version](https://img.shields.io/npm/v/@sunub/obsidian-mcp-server.svg)](https://www.npmjs.com/package/@sunub/obsidian-mcp-server)
4
4
 
5
- Obsidian Vault 이용해 AI 활용 가능한 지식 베이스(Knowledge Base)로 확장하여 사용할 있게끔 하고 문서 검색, 요약, 정리와 같은 부가적인 작업을 자동화하여 사용자가 핵심적인 "글쓰기 활동"에만 집중할 수 있는 환경을 구축하고자 제작했습니다.
5
+ `obsidian-mcp-server`는 Obsidian Vault Markdown 문서를 AI 에이전트가 조회하고, 검색하고, 요약할있게 해주는 MCP 서버입니다.
6
6
 
7
- ## 핵심 아키텍처
7
+ MCP 클라이언트에 연결해 에이전트에게 **토큰 사용량을 제어하면서** Vault 내용을 조회할 수 있게 합니다.
8
8
 
9
- 서버는 `VaultManager`와 `Indexer`를 중심으로 구축되어 대규모 Vault에서도 높은 성능과 메모리 효율성을 보장합니다.
9
+ llama.cpp 기반 로컬 LLM(임베딩·채팅·리랭킹)과 연동하면 **외부 API 없이 완전히 로컬에서** Vault RAG를 구축하고 구동할 있습니다.
10
10
 
11
- - **`Indexer` 기반 검색**: 서버 시작 시 가벼운 역 인덱스(Inverted Index)를 생성하여 키워드 검색 시 거의 즉각적인 결과를 반환합니다(O(1)). 전체 파일 내용을 메모리에 상주시키지 않아 메모리 사용량을 최소화합니다.
12
- - **`VaultManager`**: Vault 내의 모든 문서를 효율적으로 관리하며, 파일 시스템과 상호작용하여 문서의 생성, 수정, 삭제를 처리합니다.
11
+ ## 무엇을 있나
13
12
 
14
- ## 주요 기능
13
+ - 키워드 기반 노트 검색 (`vault`, `action="search"`)
14
+ - 특정 노트 열람 (`vault`, `action="read"`)
15
+ - Vault 전체 문서 목록 조회 (`vault`, `action="list_all"`)
16
+ - Vault 상태 조회 (`vault`, `action="stats"`)
17
+ - RAG 기반 검색 (`vault`, `action="search_vault_by_semantic"`) - LLM 서버(llama.cpp) 연동 필수
18
+ - 전체 색인 트리거 (`vault`, `action="index_vault_to_vectordb"`)
19
+ - frontmatter 자동 생성 제안 (`generate_property`)
20
+ - frontmatter 실제 반영 (`write_property`)
21
+ - 이미지 첨부파일 정리 (`organize_attachments`)
15
22
 
16
- - **고급 문서 탐색**: `vault` 도구를 통해 키워드 검색, 전체 목록 조회, 특정 문서 읽기, 통계 분석 등 다양한 탐색 기능을 제공합니다.
17
- - **컨텍스트 수집/기억 패킷 생성**: `vault collect_context`로 문서 배치 수집, 압축, continuation 토큰 발급, 메모리 패킷(JSON canonical)을 생성합니다.
18
- - **저장된 메모리 재호출**: `vault load_memory`로 `memory/context_memory_snapshot.v1.md`를 빠르게 로드해 다음 턴 컨텍스트로 재사용할 수 있습니다.
19
- - **AI 기반 속성 생성**: `generate_property` 도구는 문서 본문을 분석하여 `title`, `tags`, `summary` 등 적절한 frontmatter 속성을 자동으로 생성합니다.
20
- - **안전한 속성 업데이트**: `write_property` 도구를 사용하여 생성된 속성을 기존 frontmatter와 병합하여 파일에 안전하게 기록합니다.
21
- - **첨부 파일 자동 정리**: `organize_attachments` 도구는 문서와 연결된 첨부 파일(예: 이미지)을 자동으로 감지하여 문서 제목에 맞는 폴더로 이동시키고 링크를 업데이트합니다.
22
- - **통합 워크플로우**: `create_document_with_properties`와 같은 도구를 통해 문서 분석부터 속성 생성, 파일 업데이트까지의 전체 과정을 단일 명령으로 실행합니다.
23
- - **신뢰성 및 테스트**: `vitest`를 사용한 End-to-End 테스트와 GitHub Actions 기반의 CI/CD 파이프라인을 통해 서버의 안정성과 각 도구 API의 응답 스키마를 검증합니다.
23
+ ## 사전 주의사항
24
24
 
25
- ## 도구 API
25
+ 서버는 Vault 내용을 클라이언트에 노출합니다. 운영 환경에서 신중히 사용하세요.
26
26
 
27
- `obsidian-mcp-server`는 MCP 클라이언트를 통해 호출할 있는 다음과 같은 도구들을 제공합니다.
27
+ - 신뢰할없는 AI 에이전트와 연결하지 마세요.
28
+ - Vault 경로(`VAULT_DIR_PATH`)는 최소 권한으로 제한하세요.
29
+ - 조회량이 큰 Vault는 `maxOutputChars`, `limit`를 조절해 토큰 비용을 통제하세요.
30
+ - `vault` 액션 기본 압축 모드는 `balanced`입니다.
28
31
 
29
- ### `vault`
30
-
31
- Vault 내 문서를 탐색하고 분석하는 핵심 도구입니다. `action` 파라미터를 통해 다양한 기능을 수행할 수 있습니다.
32
+ ### 설정 확인사항
32
33
 
33
- - **`list_all`**: Vault 모든 문서의 목록과 메타데이터를 반환합니다.
34
- - **`search`**: 키워드를 기반으로 문서 제목, 내용, 태그를 검색합니다.
35
- - **`read`**: 특정 파일의 내용을 읽고 frontmatter와 본문을 반환합니다.
36
- - **`stats`**: Vault 내 모든 문서의 통계(단어, 글자 수 등)를 제공합니다.
37
- - **`collect_context`**: 문서를 배치 처리하여 메모리 패킷을 생성하고, 필요 시 `memory/context_memory_snapshot.v1.md`에 저장합니다.
38
- - **`load_memory`**: 저장된 메모리 노트의 canonical JSON 블록을 파싱하여 빠른 재주입용 payload를 반환합니다.
34
+ **1. Vault 경로: `VAULT_DIR_PATH`에는 반드시 절대 경로를 입력해야 합니다.**
39
35
 
40
- ### `generate_property`
36
+ ```bash
37
+ # ✅ 올바른 예시 (macOS / Linux)
38
+ VAULT_DIR_PATH="/Users/username/Documents/MyVault"
41
39
 
42
- 문서 경로(`filePath`)를 입력받아 해당 문서의 내용을 분석하고, AI가 추천하는 frontmatter 속성을 생성하여 반환합니다.
40
+ # 올바른 예시 (Windows 역슬래시 이스케이프)
41
+ VAULT_DIR_PATH="C:\\Users\\username\\Documents\\MyVault"
43
42
 
44
- ### `write_property`
43
+ # ✅ 올바른 예시 (WSL)
44
+ VAULT_DIR_PATH="/mnt/c/Users/username/Documents/MyVault"
45
45
 
46
- 파일 경로(`filePath`)와 JSON 형식의 속성(`properties`)을 입력받아, 해당 파일의 frontmatter를 업데이트합니다.
46
+ # 잘못된 예시 상대 경로는 서버 시작 시 오류 발생
47
+ VAULT_DIR_PATH="~/Documents/MyVault"
48
+ VAULT_DIR_PATH="./vault"
49
+ ```
47
50
 
48
- ### `create_document_with_properties`
51
+ **2. Node.js 요구사항: Node.js 22 이상이 설치되어 있어야 합니다.**
49
52
 
50
- 문서 분석, 속성 생성, 파일 업데이트의 전 과정을 한 번에 처리하는 통합 도구입니다.
53
+ ```bash
54
+ node --version # v22.0.0 이상 확인
55
+ ```
51
56
 
52
- ### `organize_attachments`
57
+ ---
53
58
 
54
- 키워드로 문서를 찾아 해당 문서에 연결된 모든 첨부 파일을 `images/{문서 제목}` 폴더로 이동시키고, 문서 내의 링크를 자동으로 업데이트합니다.
59
+ ### 환경변수 전체 설정 예시
55
60
 
56
- ## 메모리 운영 원칙
61
+ MCP 클라이언트 설정(`mcpServers.env`) 또는 셸 환경변수로 주입합니다.
62
+ 시맨틱 검색·리랭킹 기능을 사용하지 않을 경우 `VAULT_DIR_PATH`만 필수입니다.
57
63
 
58
- ### 서버와 에이전트 책임 분리
64
+ **최소 설정 (기본 도구만 사용)**
59
65
 
60
- - **MCP 서버(Data Plane)**: 검색, 읽기, 압축, continuation, memory packet 생성/저장까지 담당합니다.
61
- - **에이전트 런타임(Memory Plane)**: 사용자 의도 감지, `load_memory` 자동 호출, 다음 턴 프롬프트 선주입을 담당합니다.
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
+ ```
62
79
 
63
- 중요: 서버만으로는 "다음 자동 기억 반영"을 보장할 수 없습니다. 이 동작은 반드시 클라이언트/에이전트 런타임에서 구현해야 합니다.
80
+ **전체 설정 (시맨틱 검색 + 리랭킹 포함)**
64
81
 
65
- ### 메모리 산출물 포맷
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
+ ```
66
102
 
67
- - 기본 저장 경로: `memory/context_memory_snapshot.v1.md`
68
- - 구성: 사람이 읽는 Markdown 요약 + AI 파싱용 canonical JSON code block
69
- - 스키마 키: `schema_version`, `generated_at`, `source_hash`, `documents[].doc_hash`, `memory_packet`
103
+ 변수가 연결되는 서버는 아래와 같습니다:
70
104
 
71
- ## collect_context 추천 프리셋
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 기록 경로 | 선택 |
72
115
 
73
- | 목적 | 주요 파라미터 | 권장 값 |
74
- | -------------------- | --------------------------------------------------------------------- | --------------------------------------- |
75
- | 빠른 토픽 스캔 | `scope`, `maxDocs`, `maxCharsPerDoc`, `compressionMode` | `topic`, `8`, `700`, `aggressive` |
76
- | 이력서 컨텍스트 구축 | `scope`, `maxDocs`, `maxCharsPerDoc`, `memoryMode`, `compressionMode` | `all`, `20`, `1200`, `both`, `balanced` |
77
- | 장문 Vault 단계 처리 | `maxDocs`, `maxCharsPerDoc`, `maxOutputChars` | `10`, `900`, `2800` |
116
+ > `LLM_EMBEDDING_API_URL`이 없으면 `search_vault_by_semantic`과 `index_vault_to_vectordb`가 동작하지 않습니다.
117
+ > `LLM_RERANKER_API_URL`에 서버가 없으면 오류 없이 폴백(원래 정렬 유지)됩니다.
78
118
 
79
- 가드레일은 출력 상한 초과 시 다음 순서로 축소됩니다: `backlinks -> per-doc chars -> doc count -> continuation`.
119
+ ## 시작하기 (빠른 설정)
80
120
 
81
- ## 예제 MCP 요청 (3개)
121
+ ### 1) 공통 요구사항
82
122
 
83
- 아래는 MCP 클라이언트의 `callTool`에 전달하는 `arguments` 예시입니다.
123
+ - 최소 설정은 `VAULT_DIR_PATH` (Vault 절대 경로)입니다.
124
+ - MCP 실행 자체는 배포 패키지 기준으로 맞춰 설명합니다.
125
+ - 배포 패키지(`npx`) 사용 (권장)
126
+ - 로컬 `build/index.js`는 개발/디버깅 목적
127
+ - 로컬 실행은 마지막 섹션(5)에서 분리 안내합니다.
128
+ - Vault 경로가 없으면 시작이 실패합니다.
129
+ - 아래 예시는 복붙으로 바로 사용할 수 있도록 정리했습니다.
84
130
 
85
- ### 1) 전체 Vault에서 메모리 구축 시작
131
+ ### 2) 배포 패키지 (`npx`) 설정
86
132
 
87
133
  ```json
88
134
  {
89
- "action": "collect_context",
90
- "scope": "all",
91
- "maxDocs": 20,
92
- "maxCharsPerDoc": 1200,
93
- "memoryMode": "both",
94
- "compressionMode": "balanced"
135
+ "mcpServers": {
136
+ "obsidian": {
137
+ "command": "npx",
138
+ "args": ["-y", "@sunub/obsidian-mcp-server@latest"],
139
+ "env": {
140
+ "VAULT_DIR_PATH": "/abs/path/to/your/vault",
141
+ "LOGGING_LEVEL": "info"
142
+ }
143
+ }
144
+ }
95
145
  }
96
146
  ```
97
147
 
98
- ### 2) continuationToken으로 다음 배치 이어서 수집
148
+ CLI 직접 실행:
99
149
 
100
- ```json
101
- {
102
- "action": "collect_context",
103
- "continuationToken": "<previous_response.batch.continuation_token>",
104
- "compressionMode": "balanced"
105
- }
150
+ ```bash
151
+ npx -y @sunub/obsidian-mcp-server@latest --vault-path /abs/path/to/your/vault --logging-level info
106
152
  ```
107
153
 
108
- ### 3) 저장된 메모리 빠른 로드(quiet)
154
+ ### 3) MCP Client configuration
109
155
 
110
- ```json
111
- {
112
- "action": "load_memory",
113
- "memoryPath": "memory/context_memory_snapshot.v1.md",
114
- "quiet": true
115
- }
116
- ```
156
+ 클라이언트별 UI가 다르더라도 `command`/`args`/`env`의 기본 형태는 동일합니다.
157
+
158
+ > 배포 패키지 기준 핵심: `command="npx"`, `args=["-y","@sunub/obsidian-mcp-server@latest"]`, `env.VAULT_DIR_PATH`
159
+
160
+ <details>
161
+ <summary>Codex</summary>
162
+ `.codex/config.toml`에 아래처럼 등록합니다.
163
+
164
+ ```toml
165
+ [mcp_servers.obsidian]
166
+ command = "npx"
167
+ args = ["-y", "@sunub/obsidian-mcp-server@latest"]
168
+ env = { VAULT_DIR_PATH = "/abs/path/to/your/vault" }
169
+ ```
170
+
171
+ </details>
172
+
173
+ <details>
174
+ <summary>Copilot CLI</summary>
117
175
 
118
- 클라이언트 자동 주입 규칙은 `docs/CLIENT_INJECTION_GUIDE.md`를 참고하세요.
176
+ 1) `copilot` 실행
177
+ 2) `/mcp add`
178
+ 3) 아래 값 입력
119
179
 
120
- ## 설치 사용
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" }`
121
184
 
122
- ### MCP 클라이언트 설정
185
+ </details>
123
186
 
124
- MCP를 지원하는 AI 도구(Claude Desktop, Gemini 등)의 설정 파일에 다음 구성을 추가하세요.
187
+ <details>
188
+ <summary>Copilot / VS Code</summary>
125
189
 
126
- #### Claude Desktop
190
+ 버전별 JSON 키 이름이 다를 수 있으므로(예: `servers`/`mcpServers`), 프로젝트 문서에 맞춰 적용하세요.
127
191
 
128
- `claude_desktop_config.json` 파일에 추가해야할 내용:
192
+ ```json
193
+ {
194
+ "mcpServers": {
195
+ "obsidian": {
196
+ "command": "npx",
197
+ "args": ["-y", "@sunub/obsidian-mcp-server@latest"],
198
+ "env": { "VAULT_DIR_PATH": "/abs/path/to/your/vault" }
199
+ }
200
+ }
201
+ }
202
+ ```
203
+
204
+ </details>
205
+
206
+ <details>
207
+ <summary>Cursor</summary>
208
+
209
+ `Cursor Settings` → `MCP` → `New MCP Server`에서 등록합니다.
210
+
211
+ ```json
212
+ {
213
+ "obsidian": {
214
+ "command": "npx",
215
+ "args": ["-y", "@sunub/obsidian-mcp-server@latest"],
216
+ "env": { "VAULT_DIR_PATH": "/abs/path/to/your/vault" }
217
+ }
218
+ }
219
+ ```
220
+
221
+ ※ 일부 버전은 서버 식별 키명이 다를 수 있으니 설정 화면 안내에 맞춰 붙여넣으세요.
222
+ </details>
223
+
224
+ <details>
225
+ <summary>Gemini CLI</summary>
226
+
227
+ 패키지 설치형 예시:
228
+
229
+ ```bash
230
+ gemini mcp add obsidian npx -y @sunub/obsidian-mcp-server@latest --vault-path /abs/path/to/your/vault
231
+ ```
232
+
233
+ ※ 일부 Gemini 버전은 `--vault-path` 지원이 다를 수 있으므로, `gemini mcp add`의 최신 문서를 확인하세요.
234
+ </details>
235
+
236
+ ### 4) 완성 예시 설정
129
237
 
130
238
  ```json
131
239
  {
132
240
  "mcpServers": {
133
- "obsidian-mcp-server": {
241
+ "obsidian": {
134
242
  "command": "npx",
135
- "args": ["-y", "@sunub/obsidian-mcp-server"],
243
+ "args": [
244
+ "-y",
245
+ "@sunub/obsidian-mcp-server@latest"
246
+ ],
136
247
  "env": {
137
- "VAULT_DIR_PATH": "/absolute/path/to/your/obsidian/vault"
248
+ "VAULT_DIR_PATH": "/path/to/obsidian-vault",
249
+ "VAULT_METRICS_LOG_PATH": "/path/to/vault-metrics.ndjson",
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"
138
255
  }
139
256
  }
140
257
  }
141
258
  }
142
- ```
143
-
144
- #### Gemini
145
-
146
- `gemini_config.json` 파일에 추가해야할 내용:
147
-
148
259
  ```json
149
260
  {
150
261
  "mcpServers": {
151
- "obsidian-mcp-server": {
262
+ "obsidian": {
152
263
  "command": "npx",
153
- "args": ["-y", "@sunub/obsidian-mcp-server"],
264
+ "args": [
265
+ "-y",
266
+ "@sunub/obsidian-mcp-server@latest"
267
+ ],
154
268
  "env": {
155
- "VAULT_DIR_PATH": "/absolute/path/to/your/obsidian/vault"
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"
156
277
  }
157
278
  }
158
279
  }
159
280
  }
160
281
  ```
161
282
 
162
- ### 설정 확인사항
283
+ > 각 변수의 역할과 기본값은 [사전 주의사항 → 환경변수 전체 설정 예시](#환경변수-전체-설정-예시)를 참고하세요.
163
284
 
164
- 1. **Vault 경로**: `VAULT_DIR_PATH`에는 반드시 **절대 경로**를 입력해야 합니다.
285
+ ## 시맨틱 검색 (RAG) 설정
165
286
 
166
- ```json
167
- // ✅ 올바른 예시
168
- "VAULT_DIR_PATH": "/Users/username/Documents/MyVault"
169
- "VAULT_DIR_PATH": "C:\\Users\\username\\Documents\\MyVault" // Windows
170
- "VAULT_DIR_PATH": "/mnt/c/Users/username/Documents/MyVault" // WSL
287
+ 키워드 검색 외에 **의미 기반 벡터 검색**을 사용하려면 임베딩 서버가 필요합니다.
171
288
 
172
- // 잘못된 예시
173
- "VAULT_DIR_PATH": "~/Documents/MyVault" // 상대 경로 사용 불가
174
- "VAULT_DIR_PATH": "./vault" // 상대 경로 사용 불가
175
- ```
289
+ ### 활성화 조건
176
290
 
177
- 2. **Node.js 요구사항**: Node.js 22 이상이 설치되어 있어야 합니다.
291
+ `LLM_EMBEDDING_API_URL`이 가리키는 서버가 실행 중이어야 합니다.
292
+ 없으면 `search_vault_by_semantic`과 `index_vault_to_vectordb`가 동작하지 않고,
293
+ `useRagContext`는 자동으로 키워드 검색으로 폴백됩니다.
178
294
 
179
- ```bash
180
- node --version # v22.0.0 이상 확인
181
- ```
295
+ ```bash
296
+ # ecosystem.config.cjs 기준 — 임베딩 서버 단독 시작
297
+ pm2 start ecosystem.config.cjs --only llama-embedding-server
298
+ ```
182
299
 
183
- 3. **설정 적용**: 설정 파일 저장 후 AI 도구를 재시작하면 MCP 서버가 자동으로 연결됩니다.
300
+ ### 초기 색인 실행
184
301
 
185
- ### 수동 실행 (테스트용)
302
+ 서버 연결 처음 한 번은 전체 색인을 직접 트리거해야 합니다.
186
303
 
187
- 터미널에서 직접 서버를 실행하여 테스트할 수도 있습니다:
304
+ ```text
305
+ "Vault 전체를 재색인해줘."
306
+ ```
188
307
 
189
- ```bash
190
- # 환경 변수 설정 후 실행
191
- VAULT_DIR_PATH=/path/to/vault npx -y @sunub/obsidian-mcp-server
308
+ 내부 동작:
192
309
 
193
- # 또는 명령줄 인자로 경로 지정
194
- npx -y @sunub/obsidian-mcp-server --vault-path /path/to/vault
310
+ ```json
311
+ {
312
+ "method": "tools/call",
313
+ "params": {
314
+ "name": "vault",
315
+ "arguments": { "action": "index_vault_to_vectordb" }
316
+ }
317
+ }
195
318
  ```
196
319
 
197
- ### 테스트
320
+ 이후에는 파일 변경 시 **VaultWatcher가 자동으로 증분 색인**합니다 (mtime 기반).
198
321
 
199
- `vitest`를 사용한 End-to-End 테스트:
322
+ ### 색인 저장 위치
200
323
 
201
- ```bash
202
- # 테스트 실행
203
- npm test
324
+ ```
325
+ {VAULT_DIR_PATH}/.obsidian/vector_cache/ ← LanceDB 데이터 디렉터리
326
+ ```
327
+
328
+ - 직접 삭제해도 무방합니다. 다음 `index_vault_to_vectordb` 호출 시 재생성됩니다.
329
+ - `LLM_EMBEDDING_MODEL`을 변경하면 서버 시작 시 **자동으로 전체 재색인**이 발생합니다 (INDEX_VERSION 또는 모델명 불일치 감지).
330
+
331
+ ### 검색 전략 흐름
204
332
 
205
- # Watch 모드
206
- npm run test:watch
333
+ ```
334
+ 사용자 질문
335
+
336
+
337
+ search_vault_by_semantic (벡터 유사도 검색 → 리랭킹)
338
+ │ 결과 없음
339
+
340
+ vault.search (키워드 폴백)
341
+ │ 결과 없음
342
+
343
+ 컨텍스트 없이 LLM 응답
207
344
  ```
208
345
 
209
- ### 비용 계측(B1)
346
+ <details>
347
+ <summary>청크·토큰 파라미터 (파워유저용)</summary>
210
348
 
211
- `VAULT_METRICS_LOG_PATH`를 지정하면 `vault` 도구 응답마다 아래 메트릭이 JSONL로 기록됩니다.
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 제한 |
212
358
 
213
- - `estimated_tokens`
214
- - `mode`
215
- - `truncated`
216
- - `doc_count`
359
+ </details>
217
360
 
218
- 예시:
361
+ ## 시작 후 빠른 검증
219
362
 
220
- ```bash
221
- # 1) 메트릭 로그 경로 지정
222
- export VAULT_METRICS_LOG_PATH=.tmp/vault-metrics.jsonl
363
+ 연결이 끝나면 아래 3가지만 먼저 확인하세요.
364
+ 문서가 열리더라도 어디서 실패했는지 바로 좁힐 수 있습니다.
223
365
 
224
- # 2) 평소처럼 MCP 시나리오 실행 (search/read/collect_context/load_memory)
225
- npm run inspector
366
+ 1) Vault 상태 확인
226
367
 
227
- # 3) 시나리오 종료 후 리포트 생성
228
- npm run metrics:report -- .tmp/vault-metrics.jsonl
368
+ ```text
369
+ "Vault 상태를 요약해줘."
229
370
  ```
230
371
 
231
- 리포트는 액션별 `count`, `total_tokens`, `avg/p95_tokens`, `avg_doc_count`, `truncated_rate(%)`를 출력합니다.
372
+ 예상 내부 동작:
232
373
 
233
- ### 코드 품질
374
+ ```json
375
+ {
376
+ "method": "tools/call",
377
+ "params": {
378
+ "name": "vault",
379
+ "arguments": { "action": "stats" }
380
+ }
381
+ }
382
+ ```
234
383
 
235
- ```bash
236
- # 포맷팅
237
- npm run format
384
+ 정상 동작 시 응답에 `totalFiles`, `isInitialized`, `vaultPath`가 들어갑니다.
385
+
386
+ 1) 검색 인덱스 확인
387
+
388
+ ```text
389
+ "노트 제목에 'MCP'가 들어간 문서만 5개 찾아줘."
390
+ ```
391
+
392
+ 예상 내부 동작:
393
+
394
+ ```json
395
+ {
396
+ "method": "tools/call",
397
+ "params": {
398
+ "name": "vault",
399
+ "arguments": {
400
+ "action": "search",
401
+ "keyword": "MCP",
402
+ "limit": 5
403
+ }
404
+ }
405
+ }
406
+ ```
238
407
 
239
- # 린팅
240
- npm run lint
408
+ `search`에서 결과가 비어 있으면 인덱싱/경로 또는 키워드 범위를 의심합니다.
241
409
 
242
- # 전체 체크 (포맷팅 + 린팅)
243
- npm run check
410
+ 1) 문서 읽기 확인
411
+
412
+ ```text
413
+ "특정 노트 하나를 읽어줘."
414
+ ```
415
+
416
+ 예상 내부 동작:
417
+
418
+ ```json
419
+ {
420
+ "method": "tools/call",
421
+ "params": {
422
+ "name": "vault",
423
+ "arguments": {
424
+ "action": "read",
425
+ "filename": "예: 어떤 문서 이름"
426
+ }
427
+ }
428
+ }
244
429
  ```
245
430
 
246
- ### CI/CD
431
+ `filename`이 틀리면 `{ "error": "Document not found: ..." }`가 오고, `read` 대신 `list_all`으로 후보를 먼저 확인하면 해결이 빠릅니다.
432
+
433
+ `search`, `list_all`, `load_memory`는 `quiet` 기본값이 `true`라서 기본 응답이 간략해질 수 있습니다.
434
+ 필요하면 `quiet: false`, `includeContent: true`, `excerptLength`(또는 `maxOutputChars`)를 함께 써서 상세를 확인하세요.
435
+
436
+ ## 사용 예시
437
+
438
+ MCP를 어떻게 호출하는지보다 “무슨 동작을 하려고 하는지”가 더 중요합니다.
439
+
440
+ 마크다운 문서에 작성되어 있는 첨부파일을 정리하는 동작 예시 :
441
+
442
+ <https://github.com/user-attachments/assets/eb74ec05-09f7-4632-a22c-666b7e844147>
443
+
444
+ - 특정 문서를 대상으로 문서에 작성되더 있는 이미지 첨부 파일을 정리해달라고 요구할 경우 해당 `images` 폴더 내부에 해당 파일의 이름으로 폴더를 생성하여 정리합니다.
445
+ - 정리된 문서는 기존의 작성되어 있던 문서의 연결이 깨지지 않도록 `images` 폴더를 기준으로 연결을 업데이트 합니다.
446
+
447
+ 직접 실행용 질문 예시:
448
+
449
+ - `README.md`에서 `시작하기 (빠른 설정)`의 `MCP Client configuration` 부분만 찾아줘.
450
+ - `docs/tools-usage-guide.md`의 `vault` 설정 예시만 읽고 정리해줘.
451
+ - `docs/tool-reference.md`에서 `vault`의 `collect_context` 파라미터만 찾아줘.
452
+ - `docs/tools-usage-guide.md`에서 `MCP 서버` 설정 블록만 정리해줘.
453
+
454
+ 자연어 예시는 아래처럼 구체적으로 쓰면 도구가 더 정확하게 동작합니다.
455
+
456
+ - `"README.md의 시작하기 부분에서 실행 명령 예시만 찾아줘"`
457
+ - `"docs/tools-usage-guide.md에서 vault 관련 사용 예시만 찾아서 비교해줘"`
458
+ - `"docs/tool-reference.md의 vault.read 파라미터 설명만 읽어줘"`
459
+
460
+ `vault`는 사용자 질문을 토대로 내부적으로 매핑되어 호출되며, 실제 흐름은 아래처럼 동작합니다.
461
+
462
+ - `README.md의 시작하기 (빠른 설정)에서 npx 예시만 보여줘`
463
+ → 핵심 키워드만 추출해 `vault.search`가 먼저 호출됩니다.
464
+ - `docs/tool-reference.md의 collect_context 파라미터만 읽어줘`
465
+ → 먼저 `vault.read`로 문서의 해당 부분을 읽고, 필요 시 `vault.collect_context`로 정리합니다.
466
+ - `docs/tools-usage-guide.md에서 frontmatter 처리 과정을 읽어줘`
467
+ → 문서 위치를 `vault.read`로 찾은 뒤 `generate_property`/`write_property`/`create_document_with_properties`를 순차 호출할 수 있습니다.
468
+
469
+ 동작하는 도구의 호출 흐름은 [사용 예시(도구 호출 흐름)](docs/tool-call-flows.md)에서 구체 JSON 예시와 함께 확인하세요.
470
+
471
+ ## 등록된 도구
472
+
473
+ <!-- BEGIN AUTO GENERATED TOOLS -->
247
474
 
248
- 프로젝트는 GitHub Actions를 사용하여 CI/CD 파이프라인을 구축했습니다:
475
+ - **Obsidian Tools (8 actions)**
476
+ - [`vault`](docs/tool-reference.md#vault-action)
477
+ - `search`
478
+ - `read`
479
+ - `list_all`
480
+ - `stats`
481
+ - `collect_context`
482
+ - `load_memory`
483
+ - `search_vault_by_semantic`
484
+ - `index_vault_to_vectordb`
485
+ - [`generate_property`](docs/tool-reference.md#generate_property)
486
+ - [`write_property`](docs/tool-reference.md#write_property)
487
+ - [`create_document_with_properties`](docs/tool-reference.md#create_document_with_properties)
488
+ - [`organize_attachments`](docs/tool-reference.md#organize_attachments)
249
489
 
250
- - **빌드**: TypeScript 컴파일 빌드 검증
251
- - **린트**: Biome를 사용한 코드 품질 검사
252
- - **테스트**: Vitest를 통한 E2E 테스트
253
- - **배포**: 태그 푸시 시 자동으로 npm에 배포
490
+ <!-- END AUTO GENERATED TOOLS -->
254
491
 
255
- ## 라이선스
492
+ ## 자세한 사용 규약
256
493
 
257
- ISC License
494
+ - 도구 상세 동작, 파라미터 기본값, 실제 응답 형식은 [Tool Reference](docs/tool-reference.md)에서 확인하세요.
495
+ - `vault`는 하나의 MCP tool이고 `action` 값으로 실제 동작이 분기됩니다. 오타가 가장 흔한 실패 원인입니다.
496
+ - 대규모 Vault에서는 `collect_context`를 `scope="all"`, `maxDocs`를 작게 시작해 단계적으로 확장하세요.
@@ -0,0 +1 @@
1
+ export declare const AppContainer: () => import("react/jsx-runtime").JSX.Element;