Saltar al contenido
MCP ThesaurusMCP Thesaurus

sunub obsidian mcp server

ComunidadIncomplete39/100Reclamar

streamable-httpISCupdated 2mo ago

obsidian-mcp-server๋Š” Obsidian Vault์˜ Markdown ๋ฌธ์„œ๋ฅผ AI ์—์ด์ „ํŠธ๊ฐ€ ์กฐํšŒํ•˜๊ณ , ๊ด€๋ จ ๊ทผ๊ฑฐ๋ฅผ ์„ ๋ณ„ํ•˜๊ณ , ์ปจํ…์ŠคํŠธ๋กœ ์••์ถ•ํ•ด ํ™œ์šฉํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ•ด์ฃผ๋Š” ๋กœ์ปฌ ์šฐ์„  MCP ์„œ๋ฒ„์ž…๋‹ˆ๋‹ค.

CรณdigoWeb2

ยฟQuรฉ puedes hacer con sunub obsidian mcp server?

Obsidian MCP Server

npm version

obsidian-mcp-server๋Š” Obsidian Vault์˜ Markdown ๋ฌธ์„œ๋ฅผ AI ์—์ด์ „ํŠธ๊ฐ€ ์กฐํšŒํ•˜๊ณ , ๊ด€๋ จ ๊ทผ๊ฑฐ๋ฅผ ์„ ๋ณ„ํ•˜๊ณ , ์ปจํ…์ŠคํŠธ๋กœ ์••์ถ•ํ•ด ํ™œ์šฉํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ•ด์ฃผ๋Š” ๋กœ์ปฌ ์šฐ์„  MCP ์„œ๋ฒ„์ž…๋‹ˆ๋‹ค.

์ด ํ”„๋กœ์ ํŠธ์—์„œ RAG๋Š” ํŠน์ • ๋ฒกํ„ฐ DB๋‚˜ ๊ฒ€์ƒ‰ ์—”์ง„ ์„ ํƒ์„ ๋œปํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. RAG๋Š” Vault์—์„œ ํ›„๋ณด ๋ฌธ์„œ๋ฅผ ์ฐพ๊ณ , Agent ์ž‘์—…์— ๋งž๋Š” ๊ทผ๊ฑฐ๋ฅผ ๊ณ ๋ฅด๊ณ , ์ปจํ…์ŠคํŠธ ์œˆ๋„์šฐ์— ๋งž๊ฒŒ ์••์ถ•ํ•ด ์ œ๊ณตํ•˜๋Š” Agent Context Pipeline์ž…๋‹ˆ๋‹ค.

ํ•ต์‹ฌ ๋ฐฉํ–ฅ

  • ๋กœ์ปฌ ์šฐ์„  ๋™์ž‘: ์™ธ๋ถ€ ์„œ๋น„์Šค๋‚˜ ๋ณ„๋„๋กœ ์šด์˜ํ•ด์•ผ ํ•˜๋Š” ๊ฒ€์ƒ‰ ์—”์ง„ ์—†์ด ์‚ฌ์šฉ์ž ๋จธ์‹ ์—์„œ Vault ๊ฒ€์ƒ‰๊ณผ ์ปจํ…์ŠคํŠธ ์ค€๋น„๋ฅผ ์ˆ˜ํ–‰ํ•ฉ๋‹ˆ๋‹ค.
  • ์ปจํ…์ŠคํŠธ ์„ ๋ณ„: ํ‚ค์›Œ๋“œ ๊ฒ€์ƒ‰๊ณผ ์‹œ๋งจํ‹ฑ ๊ฒ€์ƒ‰์„ ๊ฒฐํ•ฉํ•ด Agent์—๊ฒŒ ์ œ๊ณตํ•  ๊ทผ๊ฑฐ ํ›„๋ณด๋ฅผ ์ฐพ์Šต๋‹ˆ๋‹ค.
  • ๋ช…์‹œ์  RAG ํ†ตํ•ฉ: ๋ชจ๋“  ํ”„๋กฌํ”„ํŠธ์— ๋ฐฑ๊ทธ๋ผ์šด๋“œ ๊ฒ€์ƒ‰์„ ๋ถ™์ด์ง€ ์•Š๊ณ , Vault ๊ด€๋ จ ๋ช…๋ น์ด๋‚˜ ๋„๊ตฌ ์ฐธ์กฐ๊ฐ€ ์žˆ์„ ๋•Œ ๋ฌธ๋งฅ ์ˆ˜์ง‘ ๊ฒฝ๋กœ๋ฅผ ์—ฝ๋‹ˆ๋‹ค.
  • ํ† ํฐ ์ ˆ์•ฝ: ์›๋ฌธ ์ „์ฒด๋ฅผ ๋ฐ€์–ด๋„ฃ๊ธฐ๋ณด๋‹ค excerpt, evidence snippet, memory_packet ํ˜•ํƒœ๋กœ ์••์ถ•ํ•ฉ๋‹ˆ๋‹ค.
  • ๋กœ์ปฌ ๋ชจ๋ธ ๊ธฐ๋ฐ˜ ๊ฒ€์ƒ‰: @huggingface/transformers, LanceDB, local reranker๋ฅผ ์‚ฌ์šฉํ•ด semantic retrieval์„ ๋กœ์ปฌ์—์„œ ์ˆ˜ํ–‰ํ•ฉ๋‹ˆ๋‹ค.

Elasticsearch ๊ฐ™์€ ๊ฒ€์ƒ‰ ์—”์ง„๋„ retrieval backend๋กœ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ๋Œ€์•ˆ์ž…๋‹ˆ๋‹ค. ๋‹ค๋งŒ ์ด ํ”„๋กœ์ ํŠธ์˜ ๊ธฐ๋ณธ ๋ชฉํ‘œ๋Š” ์™ธ๋ถ€ ์„œ๋น„์Šค๋‚˜ ๋ณ„๋„ ๊ฒ€์ƒ‰ ์—”์ง„์— ์˜์กดํ•˜์ง€ ์•Š๋Š” ๋กœ์ปฌ ๋‹จ๋… ์ž‘์—…์ด๋ฏ€๋กœ, embedded retrieval stack์„ ๊ธฐ๋ณธ๊ฐ’์œผ๋กœ ์„ ํƒํ•ฉ๋‹ˆ๋‹ค.

์ œ๊ณต ๊ธฐ๋Šฅ

MCP Tools

  • vault
    • search: ํ‚ค์›Œ๋“œ์™€ ์˜๋ฏธ ๊ธฐ๋ฐ˜ ๊ฒ€์ƒ‰์„ ๊ฒฐํ•ฉํ•œ ํ•˜์ด๋ธŒ๋ฆฌ๋“œ ํ›„๋ณด ํƒ์ƒ‰
    • read: ํŠน์ • ๋…ธํŠธ ๋ณธ๋ฌธ๊ณผ ๋ฉ”ํƒ€๋ฐ์ดํ„ฐ ์กฐํšŒ
    • list_all: Vault ๋ฌธ์„œ ๋ชฉ๋ก ์กฐํšŒ
    • stats: Vault ๋ฐ ์ธ๋ฑ์Šค ์ƒํƒœ ์กฐํšŒ
    • collect_context: ์ฃผ์ œ์™€ ์—ฐ๊ด€๋œ ๋ฌธ์„œ๋ฅผ ์„ ๋ณ„ํ•ด memory_packet ์ƒ์„ฑ
    • load_memory: ์ €์žฅ๋œ ์ปจํ…์ŠคํŠธ ๋ฉ”๋ชจ๋ฆฌ ์Šค๋ƒ…์ƒท ๋กœ๋“œ
  • generate_property: ๋ฌธ์„œ ๋‚ด์šฉ์„ ๋ฐ”ํƒ•์œผ๋กœ frontmatter ํ›„๋ณด ์ƒ์„ฑ
  • write_property: frontmatter ์“ฐ๊ธฐ
  • create_document_with_properties: ๋ฌธ์„œ ๋ถ„์„ ํ›„ ์†์„ฑ ์ƒ์„ฑ/์“ฐ๊ธฐ 2๋‹จ๊ณ„ ์›Œํฌํ”Œ๋กœ์šฐ
  • organize_attachments: ๋ฌธ์„œ ๋‚ด ์ฒจ๋ถ€ํŒŒ์ผ ์ •๋ฆฌ ๋ฐ ๋งํฌ ๊ฐฑ์‹ 

Retrieval Pipeline

ํ˜„์žฌ ๊ธฐ๋ณธ retrieval backend๋Š” ๋‹ค์Œ ์ˆœ์„œ๋กœ ๋™์ž‘ํ•ฉ๋‹ˆ๋‹ค.

  1. Keyword Search: ๋‚ด๋ถ€ Indexer๋กœ ์ •ํ™•ํ•œ ๋‹จ์–ด ๋งค์นญ ํ›„๋ณด๋ฅผ ์ฐพ์Šต๋‹ˆ๋‹ค.
  2. Vector Search: LanceDB์™€ ๋กœ์ปฌ embedding model๋กœ ์˜๋ฏธ์ ์œผ๋กœ ์œ ์‚ฌํ•œ ์ฒญํฌ๋ฅผ ์ฐพ์Šต๋‹ˆ๋‹ค.
  3. RRF Fusion: ํ‚ค์›Œ๋“œ ๊ฒฐ๊ณผ์™€ ๋ฒกํ„ฐ ๊ฒฐ๊ณผ์˜ ์ˆœ์œ„๋ฅผ ๊ฒฐํ•ฉํ•ฉ๋‹ˆ๋‹ค.
  4. Local Reranking: ์ƒ์œ„ ํ›„๋ณด๋ฅผ reranker๋กœ ๋‹ค์‹œ ํ‰๊ฐ€ํ•ฉ๋‹ˆ๋‹ค.
  5. Compression: ํ•„์š”ํ•œ excerpt, source ref, memory packet๋งŒ Agent context๋กœ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค.

๋กœ์ปฌ embedding/reranking ๋ชจ๋ธ์ด ์„ค์น˜๋˜์ง€ ์•Š์€ ๊ฒฝ์šฐ ์„œ๋ฒ„๋Š” ํ‚ค์›Œ๋“œ ๊ฒ€์ƒ‰์œผ๋กœ ํด๋ฐฑํ•ฉ๋‹ˆ๋‹ค.

์„ค์น˜

์š”๊ตฌ์‚ฌํ•ญ

  • Node.js 22 ์ด์ƒ
  • ์ ‘๊ทผ ๊ฐ€๋Šฅํ•œ Obsidian Vault ์ ˆ๋Œ€ ๊ฒฝ๋กœ

MCP ์„œ๋ฒ„ ์„ค์น˜ ๋ฐ ๋ชจ๋ธ ์ค€๋น„

npx @sunub/obsidian-mcp-server setup

์ด ๋ช…๋ น์€ ๋กœ์ปฌ semantic search์™€ reranking์— ํ•„์š”ํ•œ ๋ชจ๋ธ์„ ์บ์‹œ์— ์„ค์น˜ํ•ฉ๋‹ˆ๋‹ค.

์ด๋ฏธ ํŒจํ‚ค์ง€๋ฅผ ์„ค์น˜ํ•œ ํ™˜๊ฒฝ์—์„œ๋Š” ๋‹ค์Œ์ฒ˜๋Ÿผ ์‹คํ–‰ํ•  ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค.

obsidian-mcp-server setup

๋ชจ๋ธ ์„ค์น˜๊ฐ€ ์—†์œผ๋ฉด ๊ธฐ๋ณธ ํ‚ค์›Œ๋“œ ๊ฒ€์ƒ‰์€ ๋™์ž‘ํ•˜์ง€๋งŒ, semantic search์™€ reranking ํ’ˆ์งˆ์€ ์‚ฌ์šฉํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.

MCP ํด๋ผ์ด์–ธํŠธ ์„ค์ •

Claude Desktop, Cursor, Copilot ๋“ฑ MCP ํด๋ผ์ด์–ธํŠธ์—๋Š” ๋‹ค์Œ์ฒ˜๋Ÿผ ๋“ฑ๋กํ•ฉ๋‹ˆ๋‹ค.

{
  "mcpServers": {
    "obsidian": {
      "command": "npx",
      "args": ["-y", "@sunub/obsidian-mcp-server@latest"],
      "env": {
        "VAULT_DIR_PATH": "/Users/username/Documents/MyVault"
      }
    }
  }
}

VAULT_DIR_PATH๋Š” ๋ฐ˜๋“œ์‹œ ๋ณธ์ธ์˜ Vault ์ ˆ๋Œ€ ๊ฒฝ๋กœ๋กœ ๋ฐ”๊ฟ”์•ผ ํ•ฉ๋‹ˆ๋‹ค.

ํ™˜๊ฒฝ ๋ณ€์ˆ˜

ํ™˜๊ฒฝ๋ณ€์ˆ˜ ๊ธฐ๋ณธ๊ฐ’ ์šฉ๋„ ํ•„์ˆ˜
VAULT_DIR_PATH ์—†์Œ Obsidian Vault ์ ˆ๋Œ€ ๊ฒฝ๋กœ ์˜ˆ
LOGGING_LEVEL info debug, info, warn, error ์•„๋‹ˆ์˜ค
LLM_API_URL http://127.0.0.1:8080 CLI UI๊ฐ€ ์‚ฌ์šฉํ•  OpenAI ํ˜ธํ™˜ ๋กœ์ปฌ LLM endpoint CLI ์‚ฌ์šฉ ์‹œ
LLM_CHAT_MODEL llama3 CLI UI ๋‹ต๋ณ€ ์ƒ์„ฑ ๋ชจ๋ธ๋ช… CLI ์‚ฌ์šฉ ์‹œ

MCP ์„œ๋ฒ„์˜ Vault ๊ฒ€์ƒ‰/์ฝ๊ธฐ ๋„๊ตฌ์—๋Š” VAULT_DIR_PATH๊ฐ€ ํ•ต์‹ฌ ์„ค์ •์ž…๋‹ˆ๋‹ค. LLM_API_URL๊ณผ LLM_CHAT_MODEL์€ ์ €์žฅ์†Œ์— ํฌํ•จ๋œ ๊ฐœ๋ฐœ์šฉ CLI UI์—์„œ ๋Œ€ํ™”ํ˜• ์ŠคํŠธ๋ฆฌ๋ฐ ๋‹ต๋ณ€์„ ๋ฐ›์„ ๋•Œ ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค.

๊ฐœ๋ฐœ์šฉ CLI AI Agent UI

์ด ์ €์žฅ์†Œ์—๋Š” ํ„ฐ๋ฏธ๋„ ๊ธฐ๋ฐ˜ AI Agent UI๊ฐ€ ํฌํ•จ๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค. ์ด CLI๋Š” npm ํŒจํ‚ค์ง€์˜ ๊ณต๊ฐœ bin์ด ์•„๋‹ˆ๋ผ ์ €์žฅ์†Œ ๊ฐœ๋ฐœ ํ™˜๊ฒฝ์—์„œ ์‹คํ–‰ํ•˜๋Š” ์ง„์ž…์ ์ž…๋‹ˆ๋‹ค.

์ด CLI์˜ ๋ชฉ์ ์€ Obsidian Vault๋ฅผ ๋‹จ์ˆœํžˆ ๊ฒ€์ƒ‰ํ•˜๋Š” ์ˆ˜์ค€์„ ๋„˜์–ด์„œ, MCP ๋„๊ตฌ ํ˜ธ์ถœ, ์กฐ๊ฑด๋ถ€ RAG ๊ธฐ๋ฐ˜ ๋ฌธ๋งฅ ์ˆ˜์ง‘, OpenAI ํ˜ธํ™˜ LLM endpoint ์ŠคํŠธ๋ฆฌ๋ฐ ์‘๋‹ต์„ ํ•˜๋‚˜์˜ ๋Œ€ํ™”ํ˜• ์ž‘์—… ํ๋ฆ„์œผ๋กœ ๋ฌถ๋Š” ๋ฐ ์žˆ์Šต๋‹ˆ๋‹ค. ์ฆ‰, ๋‹จ์ˆœํ•œ "์ฑ„ํŒ… UI"๋งŒ ๊ตฌํ˜„ํ•˜๋Š” ๊ณณ์ด ์•„๋‹ˆ๋ผ, Vault์™€ ๋„๊ตฌ, ๋ชจ๋ธ ์‚ฌ์ด๋ฅผ ์—ฐ๊ฒฐํ•˜๋Š” ์˜ค์ผ€์ŠคํŠธ๋ ˆ์ด์…˜ ๋ ˆ์ด์–ด์ž…๋‹ˆ๋‹ค.

์™œ ์ด CLI๊ฐ€ ํ•„์š”ํ•œ๊ฐ€

ํ”„๋กœ์ ํŠธ์˜ ๋ฌธ์„œ์™€ ์„ค๊ณ„ ๋ฐฉํ–ฅ์„ ๊ธฐ์ค€์œผ๋กœ ๋ณด๋ฉด, ์ด CLI๋Š” ๋‹ค์Œ ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๊ฑฐ๋‚˜ ์™„ํ™”ํ•˜๊ธฐ ์œ„ํ•ด ๋งŒ๋“ค์–ด์กŒ์Šต๋‹ˆ๋‹ค.

  • ์™ธ๋ถ€ AI ์„œ๋น„์Šค ์˜์กด์„ฑ ๊ฐ์†Œ: ํ”„๋กœ์ ํŠธ๊ฐ€ ๋กœ์ปฌ Vault์™€ ๋กœ์ปฌ ๋„๊ตฌ๋ฅผ ๋‹ค๋ฃจ๋Š” ๋งŒํผ, ๊ฐ€๋Šฅํ•œ ํ•œ ๋กœ์ปฌ ์‹คํ–‰ ํ™˜๊ฒฝ์—์„œ ๋…๋ฆฝ์ ์œผ๋กœ ๋™์ž‘ํ•˜๋„๋ก ์ง€ํ–ฅํ•ฉ๋‹ˆ๋‹ค.
  • ๋ฌธ๋งฅ ์†์‹ค ๊ฐ์†Œ: Vault ๊ด€๋ จ ๋„๊ตฌ๊ฐ€ ํŠธ๋ฆฌ๊ฑฐ๋œ ์งˆ๋ฌธ์—์„œ๋Š” ๊ด€๋ จ ๋ฌธ์„œ๋ฅผ ์ˆ˜์ง‘ํ•˜๊ณ  ์š”์•ฝํ•ด LLM์— ํ•จ๊ป˜ ์ „๋‹ฌํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  • ํ† ํฐ ๋‚ญ๋น„ ๊ฐ์†Œ: collect_context ๊ธฐ๋ฐ˜ ์••์ถ• ์š”์•ฝ๊ณผ ๋Œ€๋Ÿ‰ ์ž…๋ ฅ ์˜คํ”„๋กœ๋”ฉ์„ ํ†ตํ•ด ๊ธด ๋ฌธ์„œ๋‚˜ ๋Œ€ํ˜• paste๋ฅผ ๊ทธ๋Œ€๋กœ ๋ชจ๋ธ์— ๋ฐ€์–ด๋„ฃ์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
  • ํ„ฐ๋ฏธ๋„ ์ž…๋ ฅ ์•ˆ์ •์„ฑ ๊ฐœ์„ : Raw mode ๊ธฐ๋ฐ˜ ์ž…๋ ฅ ํ™˜๊ฒฝ์—์„œ ๋ฐœ์ƒํ•˜๋Š” paste storm, ๋‹ค์ค‘ Enter ํŠธ๋ฆฌ๊ฑฐ, ๋ฒ„ํผ ์˜ค์—ผ ๊ฐ™์€ ๋ฌธ์ œ๋ฅผ ์ œ์–ดํ•ฉ๋‹ˆ๋‹ค.
  • ์žฅ์‹œ๊ฐ„ ์„ธ์…˜ ์•ˆ์ •์„ฑ ํ™•๋ณด: ์ŠคํŠธ๋ฆฌ๋ฐ ์ทจ์†Œ, ํžˆ์Šคํ† ๋ฆฌ pruning, scrollback ์œ„์ž„ ๊ฐ™์€ ๊ตฌ์กฐ๋ฅผ ํ†ตํ•ด ๋ฉ”๋ชจ๋ฆฌ ์‚ฌ์šฉ๋Ÿ‰๊ณผ ๋ Œ๋”๋ง ๋ถ€๋‹ด์„ ์ค„์ž…๋‹ˆ๋‹ค.

์ด CLI๊ฐ€ ํ•˜๋Š” ์ผ

1. ๋Œ€ํ™”ํ˜• AI ์ธํ„ฐํŽ˜์ด์Šค

์‚ฌ์šฉ์ž๋Š” ํ„ฐ๋ฏธ๋„์—์„œ ์ž์—ฐ์–ด๋กœ ์งˆ๋ฌธ์„ ์ž…๋ ฅํ•˜๊ณ , CLI๋Š” LLM ์„œ๋ฒ„์™€ ํ†ต์‹ ํ•ด ๋‹ต๋ณ€์„ ์ŠคํŠธ๋ฆฌ๋ฐํ•ฉ๋‹ˆ๋‹ค.

  • ์‘๋‹ต์„ ์‹ค์‹œ๊ฐ„์œผ๋กœ ์ถœ๋ ฅํ•ฉ๋‹ˆ๋‹ค.
  • ๋ชจ๋ธ์˜ thinking ์˜์—ญ์ด ์žˆ์œผ๋ฉด ์ค‘๊ฐ„ ์ถ”๋ก  ์ƒํƒœ๋„ ๋ณ„๋„๋กœ ๋ Œ๋”๋งํ•ฉ๋‹ˆ๋‹ค.
  • ์™„๋ฃŒ๋œ ๋Œ€ํ™”๋Š” ํžˆ์Šคํ† ๋ฆฌ์— ๋ฐ˜์˜ํ•˜๊ณ , ์ง„ํ–‰ ์ค‘ ์‘๋‹ต์€ ๋ณ„๋„ pending ์ƒํƒœ๋กœ ๊ด€๋ฆฌํ•ฉ๋‹ˆ๋‹ค.
2. MCP ๋„๊ตฌ ์‹คํ–‰ ์ธํ„ฐํŽ˜์ด์Šค

CLI๋Š” MCP ์„œ๋ฒ„์— ์—ฐ๊ฒฐ๋œ ๋„๊ตฌ๋ฅผ ํ„ฐ๋ฏธ๋„์—์„œ ์ง์ ‘ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ•ฉ๋‹ˆ๋‹ค.

  • /search, /read, /stats, /context, /tools ๊ฐ™์€ ์Šฌ๋ž˜์‹œ ์ปค๋งจ๋“œ๋ฅผ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค.
  • ์‚ฌ์šฉ์ž์˜ ๋ช…์‹œ์  ๋ช…๋ น๋ฟ ์•„๋‹ˆ๋ผ, LLM์ด tool call์„ ์ƒ์„ฑํ–ˆ์„ ๋•Œ๋„ ์ด๋ฅผ ์‹คํ–‰ํ•  ์ˆ˜ ์žˆ๋Š” ๋ฃจํ”„๋ฅผ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค.
  • ์—ฌ๋Ÿฌ MCP ์„œ๋ฒ„์— ์—ฐ๊ฒฐํ•˜๊ณ , ๊ฐ ์„œ๋ฒ„์˜ ๋„๊ตฌ ๋ชฉ๋ก๊ณผ ์—ฐ๊ฒฐ ์ƒํƒœ๋ฅผ ํ•จ๊ป˜ ๊ด€๋ฆฌํ•ฉ๋‹ˆ๋‹ค.
3. ์กฐ๊ฑด๋ถ€ RAG ๊ธฐ๋ฐ˜ ๋ฌธ๋งฅ ์ฃผ์ž…

์ด CLI๋Š” ๋ชจ๋“  ์ผ๋ฐ˜ ์งˆ๋ฌธ์— ๋Œ€ํ•ด ์ž๋™์œผ๋กœ RAG๋ฅผ ์ˆ˜ํ–‰ํ•˜์ง€๋Š” ์•Š์Šต๋‹ˆ๋‹ค. ํ˜„์žฌ ๊ตฌํ˜„ ๊ธฐ์ค€์œผ๋กœ๋Š” ์ž…๋ ฅ ํ…์ŠคํŠธ์—์„œ vault ๋„๊ตฌ๋‚˜ ๊ด€๋ จ ์„œ๋ฒ„/๋„๊ตฌ ์ด๋ฆ„์ด ํŠธ๋ฆฌ๊ฑฐ๋œ ๊ฒฝ์šฐ์—๋งŒ Vault ๋ฌธ๋งฅ ์ˆ˜์ง‘์„ ์‹œ๋„ํ•˜๊ณ , ์ด๋ฅผ <context> ๋ธ”๋ก์œผ๋กœ ์ •๋ฆฌํ•ด ํ”„๋กฌํ”„ํŠธ์— ์ฃผ์ž…ํ•ฉ๋‹ˆ๋‹ค.

  • collect_context ์•ก์…˜์„ ํ™œ์šฉํ•ด ๊ด€๋ จ ๋ฌธ์„œ๋ฅผ ๋ฐฐ์น˜ ๋‹จ์œ„๋กœ ์ˆ˜์ง‘ํ•ฉ๋‹ˆ๋‹ค.
  • memory_packet๊ณผ ๊ณ ์—ฐ๊ด€ ๋ฌธ์„œ excerpt๋ฅผ ์กฐํ•ฉํ•ด LLM ์ž…๋ ฅ์„ ๊ตฌ์„ฑํ•ฉ๋‹ˆ๋‹ค.
  • ๋”ฐ๋ผ์„œ ์ด CLI๋Š” ํ•ญ์ƒ RAG๊ฐ€ ๋ถ™๋Š” ์ฑ„ํŒ…์ฐฝ์ด๋ผ๊ธฐ๋ณด๋‹ค, ํ•„์š” ์‹œ Vault-aware ๋™์ž‘์„ ์ˆ˜ํ–‰ํ•˜๋Š” agent UI์— ๊ฐ€๊น์Šต๋‹ˆ๋‹ค.
4. ๋Œ€์šฉ๋Ÿ‰ ์ž…๋ ฅ ์ตœ์ ํ™”

๊ธด ์ฝ”๋“œ, ๋กœ๊ทธ, ๋ฌธ์„œ๊ฐ€ ๋ถ™์—ฌ๋„ฃ๊ธฐ๋˜๋ฉด ์ด๋ฅผ ๊ทธ๋Œ€๋กœ ๋ชจ๋ธ์— ๋ณด๋‚ด๋Š” ๋Œ€์‹  ์•ˆ์ „ํ•˜๊ฒŒ ์ถ•์•ฝ/์˜คํ”„๋กœ๋”ฉํ•ฉ๋‹ˆ๋‹ค.

  • ํฐ paste๋Š” ์ž„์‹œ ํŒŒ์ผ๋กœ ๋ถ„๋ฆฌํ•ด ์ €์žฅํ•ฉ๋‹ˆ๋‹ค.
  • LLM์—๋Š” ์ „์ฒด ๋ณธ๋ฌธ ๋Œ€์‹  ํŒŒ์ผ ์œ„์น˜์™€ ๋ฏธ๋ฆฌ๋ณด๊ธฐ, ์ฒ˜๋ฆฌ ์ง€์‹œ๋ฌธ์„ ์ „๋‹ฌํ•ฉ๋‹ˆ๋‹ค.
  • ์ด ๋ฐฉ์‹์€ ํ† ํฐ ์‚ฌ์šฉ๋Ÿ‰์„ ์ค„์ด๊ณ , ํ•„์š”ํ•  ๋•Œ๋งŒ ๋„๊ตฌ๋ฅผ ํ†ตํ•ด ์›๋ฌธ์„ ์ฝ๊ฒŒ ๋งŒ๋“ญ๋‹ˆ๋‹ค.
5. ์ŠคํŠธ๋ฆฌ๋ฐ ์ค‘์‹ฌ ์‚ฌ์šฉ์ž ๊ฒฝํ—˜

CLI UI๋Š” ์‘๋‹ต์ด ๋๋‚œ ๋’ค ํ•œ ๋ฒˆ์— ๋ณด์—ฌ์ฃผ๋Š” ๊ตฌ์กฐ๊ฐ€ ์•„๋‹ˆ๋ผ, ์ƒ์„ฑ ์ค‘์ธ ์ƒํƒœ๋ฅผ ์ฆ‰์‹œ ๋ณด์—ฌ์ฃผ๋Š” ํ๋ฆ„์„ ์ค‘์‹ฌ์œผ๋กœ ์„ค๊ณ„๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค.

  • ์ž…๋ ฅ ์งํ›„ ๋ฒ„ํผ๋ฅผ ๋น„์›Œ ๋‹ค์Œ ์ž‘์—…์„ ์ค€๋น„ํ•ฉ๋‹ˆ๋‹ค.
  • ์ฒซ ํ† ํฐ ์ „์—๋Š” thinking/processing ์ƒํƒœ๋ฅผ ๋ณด์—ฌ์ค๋‹ˆ๋‹ค.
  • ์™„๋ฃŒ๋œ ๊ธฐ๋ก์€ ์ •์  ์˜์—ญ์œผ๋กœ ๋„˜๊ธฐ๊ณ , ํ˜„์žฌ ์‘๋‹ต๋งŒ ๋™์ ์œผ๋กœ ๋‹ค์‹œ ๋ Œ๋”๋งํ•ฉ๋‹ˆ๋‹ค.

์ฃผ์š” ์‹คํ–‰ ํ๋ฆ„

  1. ์‚ฌ์šฉ์ž๊ฐ€ ๋ฉ”์‹œ์ง€ ๋˜๋Š” ์Šฌ๋ž˜์‹œ ์ปค๋งจ๋“œ๋ฅผ ์ž…๋ ฅํ•ฉ๋‹ˆ๋‹ค.
  2. ์งˆ๋ฌธ ๋‚ด์šฉ์—์„œ Vault ๊ด€๋ จ ๋„๊ตฌ๊ฐ€ ํŠธ๋ฆฌ๊ฑฐ๋˜๋ฉด ๊ด€๋ จ ๋ฌธ๋งฅ ์ˆ˜์ง‘์„ ์‹œ๋„ํ•ฉ๋‹ˆ๋‹ค.
  3. LLM ์ŠคํŠธ๋ฆฌ๋ฐ ์š”์ฒญ์„ ์‹œ์ž‘ํ•ฉ๋‹ˆ๋‹ค.
  4. ํ•„์š” ์‹œ MCP ๋„๊ตฌ๋ฅผ ํ˜ธ์ถœํ•ฉ๋‹ˆ๋‹ค.
  5. ์‘๋‹ต์„ ์‹ค์‹œ๊ฐ„์œผ๋กœ ์ถœ๋ ฅํ•ฉ๋‹ˆ๋‹ค.
  6. ์™„๋ฃŒ๋œ ๊ฒฐ๊ณผ๋ฅผ ํžˆ์Šคํ† ๋ฆฌ์— ๋ฐ˜์˜ํ•˜๊ณ  ๋‹ค์Œ ์ž…๋ ฅ์„ ๊ธฐ๋‹ค๋ฆฝ๋‹ˆ๋‹ค.

์•„ํ‚คํ…์ฒ˜ ๊ด€์ ์—์„œ์˜ ์—ญํ• 

์˜์—ญ ์—ญํ•  ๋Œ€ํ‘œ ํŒŒ์ผ
๋ถ€ํŒ… ๋ฐ ํ™˜๊ฒฝ ํ™•์ธ LLM endpoint ํ™•์ธ, ์ดˆ๊ธฐ ๋กœ๋”/์—๋Ÿฌ ํ™”๋ฉด ์ œ์–ด AppContainer.tsx, ui/LLMHealthChecker.tsx, ui/LLMStatusLoader.tsx
MCP ์—ฐ๊ฒฐ ๊ด€๋ฆฌ ์„ค์ • ํŒŒ์ผ ๊ธฐ๋ฐ˜ MCP ์„œ๋ฒ„ ์—ฐ๊ฒฐ, ๋„๊ตฌ ๋ชฉ๋ก ์ˆ˜์ง‘, ๋ฉ€ํ‹ฐ ์„œ๋ฒ„ ์ƒํƒœ ๊ด€๋ฆฌ hooks/useMcpManager.ts, services/McpClientService.ts, config/mcpServersConfig.ts
์ž…๋ ฅ ์‹œ์Šคํ…œ Raw key ์ฒ˜๋ฆฌ, paste ๋ฒ„ํผ๋ง, ๋ฉ€ํ‹ฐ๋ผ์ธ ํŽธ์ง‘, ํžˆ์Šคํ† ๋ฆฌ ํƒ์ƒ‰ context/KeypressContext.tsx, ui/InputPrompt.tsx, key/
๋ช…๋ น ๋””์ŠคํŒจ์น˜ ์Šฌ๋ž˜์‹œ ์ปค๋งจ๋“œ๋ฅผ MCP ๋„๊ตฌ ํ˜ธ์ถœ๋กœ ๋ณ€ํ™˜ hooks/useDispatcher.ts
RAG ์ปจํ…์ŠคํŠธ ์ˆ˜์ง‘ Vault ๊ด€๋ จ ๋„๊ตฌ๊ฐ€ ํŠธ๋ฆฌ๊ฑฐ๋œ ์งˆ๋ฌธ์—์„œ๋งŒ ๋ฌธ๋งฅ์„ ์ˆ˜์ง‘ํ•ด ํ”„๋กฌํ”„ํŠธ์— ์ฃผ์ž… hooks/useRagContext.ts
LLM ์ŠคํŠธ๋ฆฌ๋ฐ ๋ฃจํ”„ ์ŠคํŠธ๋ฆฌ๋ฐ ์‘๋‹ต, tool call ์‹คํ–‰, thinking ํŒŒ์‹ฑ hooks/useLlmStream/useLlmStream.ts
๋ Œ๋”๋ง ๋ฐ ์„ธ์…˜ ๊ด€๋ฆฌ ํžˆ์Šคํ† ๋ฆฌ ์ถœ๋ ฅ, pending ์‘๋‹ต ํ‘œ์‹œ, transient UI ๋ฉ”์‹œ์ง€ ๊ด€๋ฆฌ ui/MainContent.tsx, hooks/useHistoryManager.ts
๋Œ€๋Ÿ‰ ์ž…๋ ฅ ์ตœ์ ํ™” ํฐ ๋ถ™์—ฌ๋„ฃ๊ธฐ ์ž…๋ ฅ ์˜คํ”„๋กœ๋”ฉ ๋ฐ ์ž„์‹œ ํŒŒ์ผ ์ •๋ฆฌ services/InputOffloadService.ts

์„ค๊ณ„ ์›์น™

์ด CLI๋Š” ๋‹ค์Œ ์›์น™์„ ์ค‘์‹ฌ์œผ๋กœ ์„ค๊ณ„๋ฉ๋‹ˆ๋‹ค.

  • ์ž…๋ ฅ๊ณผ ๋ Œ๋”๋ง์˜ ๋ถ„๋ฆฌ
  • ์ŠคํŠธ๋ฆฌ๋ฐ ์šฐ์„  UX
  • ์„ค์ • ํŒŒ์ผ ๊ธฐ๋ฐ˜ MCP ์—ฐ๊ฒฐ
  • ๋„๊ตฌ ํ˜ธ์ถœ๊ณผ ๋Œ€ํ™” ํ๋ฆ„์˜ ํ†ตํ•ฉ
  • ํ† ํฐ/๋ฉ”๋ชจ๋ฆฌ ํšจ์œจ ์ตœ์ ํ™”
  • ์ค‘๋‹จ ๊ฐ€๋Šฅ์„ฑ๊ณผ ๋ณต๊ตฌ ๊ฐ€๋Šฅ์„ฑ ๋ณด์žฅ

์ œ๊ณตํ•˜๋Š” ์ฃผ์š” ๋ช…๋ น

ํ˜„์žฌ ์ฝ”๋“œ ๊ธฐ์ค€์œผ๋กœ ๊ธฐ๋ณธ ์ œ๊ณต๋˜๋Š” ๋Œ€ํ‘œ ์Šฌ๋ž˜์‹œ ์ปค๋งจ๋“œ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

  • /search <keyword>: Vault ํ•˜์ด๋ธŒ๋ฆฌ๋“œ ๊ฒ€์ƒ‰
  • /read "filename": ํŠน์ • ๋ฌธ์„œ ์—ด๋žŒ
  • /semantic <query>: ์‹œ๋งจํ‹ฑ ๊ฒ€์ƒ‰
  • /stats: Vault ์ƒํƒœ ํ™•์ธ
  • /index: ๋ฒกํ„ฐ ์ธ๋ฑ์Šค ๊ฐฑ์‹ 
  • /context <topic>: ํ† ํ”ฝ ๊ธฐ๋ฐ˜ ๋ฌธ๋งฅ ์ˆ˜์ง‘
  • /organize <keyword>: ์ฒจ๋ถ€ ์ •๋ฆฌ ๋„๊ตฌ ์‹คํ–‰
  • /genprop <filename>: frontmatter ์ƒ์„ฑ ๋„๊ตฌ ํ˜ธ์ถœ
  • /tools: ์—ฐ๊ฒฐ๋œ MCP ๋„๊ตฌ ๋ชฉ๋ก ํ™•์ธ
  • /help: ๋„์›€๋ง ํ‘œ์‹œ
  • /clear: ํ™”๋ฉด/๋Œ€ํ™” ์ƒํƒœ ์ดˆ๊ธฐํ™”
  • /quit, /exit: CLI ์ข…๋ฃŒ

์‹คํ–‰ ๋ฐฉ๋ฒ•

ํ˜„์žฌ CLI ์ง„์ž…์ ์€ ์ €์žฅ์†Œ ๊ฐœ๋ฐœ ํ™˜๊ฒฝ์šฉ ์‹คํ–‰ ๋ฐฉ์‹์ž…๋‹ˆ๋‹ค. ํŒจํ‚ค์ง€์˜ bin ์—”ํŠธ๋ฆฌ๋Š” MCP ์„œ๋ฒ„์šฉ์ด๋ฉฐ, CLI UI๋Š” ๋ฃจํŠธ์—์„œ ๋ณ„๋„ ์Šคํฌ๋ฆฝํŠธ๋กœ ์‹คํ–‰๋ฉ๋‹ˆ๋‹ค.

์ €์žฅ์†Œ ๋ฃจํŠธ์—์„œ ์˜์กด์„ฑ์„ ์„ค์น˜ํ•˜๊ณ  ์„œ๋ฒ„๋ฅผ ๋จผ์ € ๋นŒ๋“œํ•ฉ๋‹ˆ๋‹ค.

npm install
npm run build

์ด ์ €์žฅ์†Œ ๋ฃจํŠธ์—๋Š” ๊ธฐ๋ณธ mcp-servers.json์ด ํฌํ•จ๋˜์–ด ์žˆ์œผ๋ฉฐ, node ./build/index.js๋กœ ์„œ๋ฒ„๋ฅผ ์‹คํ–‰ํ•ฉ๋‹ˆ๋‹ค.

๊ทธ ๋‹ค์Œ OpenAI ํ˜ธํ™˜ ๋กœ์ปฌ LLM ์„œ๋ฒ„๋ฅผ ์‹คํ–‰ํ•ฉ๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด llama.cpp์˜ llama-server๋ฅผ 8080 ํฌํŠธ์— ๋„์šธ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

llama-server -m /path/to/model.gguf --port 8080

CLI๋Š” ๋‹ค์Œ์ฒ˜๋Ÿผ ํ™˜๊ฒฝ ๋ณ€์ˆ˜๋ฅผ ์ฃผ์ž…ํ•˜์—ฌ ์‹คํ–‰ํ•ฉ๋‹ˆ๋‹ค:

VAULT_DIR_PATH="/Users/username/Documents/MyVault" \
LLM_API_URL="http://127.0.0.1:8080" \
LLM_CHAT_MODEL="llama3" \
npm run cli
MCP ์„ค์ • ํŒŒ์ผ

CLI๋Š” ์‹คํ–‰ ์‹œ ํ˜„์žฌ ์ž‘์—… ๋””๋ ‰ํ„ฐ๋ฆฌ์—์„œ ๋‹ค์Œ ํŒŒ์ผ์„ ์ˆœ์„œ๋Œ€๋กœ ์ฐพ์Šต๋‹ˆ๋‹ค.

  1. mcp-servers.json
  2. .mcp-servers.json

์„ค์ • ํŒŒ์ผ์ด ์—†์œผ๋ฉด ํ™˜๊ฒฝ ๋ณ€์ˆ˜ ๊ธฐ๋ฐ˜ fallback์„ ์‹œ๋„ํ•˜์ง€๋งŒ, ๊ฐ€์žฅ ์•ˆ์ „ํ•œ ์‹คํ–‰ ๋ฐฉ์‹์€ ์ €์žฅ์†Œ ๋ฃจํŠธ์—์„œ, build/index.js๊ฐ€ ์ค€๋น„๋œ ์ƒํƒœ๋กœ ์‹คํ–‰ํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

์‹คํ–‰ ์‹œ ์ฃผ์˜ํ•  ์ 
  • ์ด CLI ์‹คํ–‰ ๋ฐฉ๋ฒ•์€ ๊ฐœ๋ฐœ์šฉ CLI UI ์ง„์ž…์  ๊ธฐ์ค€์ž…๋‹ˆ๋‹ค. ๋ฐฐํฌ๋œ npx @sunub/obsidian-mcp-server๋Š” MCP ์„œ๋ฒ„๋ฅผ ๋„์šธ ๋ฟ CLI UI๋ฅผ ์‹คํ–‰ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
  • CLI๊ฐ€ MCP ์„œ๋ฒ„์— ์—ฐ๊ฒฐ๋˜๋ ค๋ฉด ํ˜„์žฌ ๋””๋ ‰ํ„ฐ๋ฆฌ์˜ mcp-servers.json ๋˜๋Š” .mcp-servers.json์ด ์œ ํšจํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.
  • VAULT_DIR_PATH๊ฐ€ ์—†๊ฑฐ๋‚˜ ์ž˜๋ชป๋˜๋ฉด Vault ๊ด€๋ จ ๋„๊ตฌ๊ฐ€ ๋™์ž‘ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
  • semantic search์™€ reranking์„ ์“ฐ๋ ค๋ฉด ์„œ๋ฒ„ setup์œผ๋กœ ๋กœ์ปฌ ๋ชจ๋ธ์„ ์„ค์น˜ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

์ฃผ์˜ ์‚ฌํ•ญ

  • VAULT_DIR_PATH๊ฐ€ ์—†๊ฑฐ๋‚˜ ์ž˜๋ชป๋˜๋ฉด Vault ๊ด€๋ จ ๋„๊ตฌ๊ฐ€ ๋™์ž‘ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
  • semantic search์™€ reranking์„ ์“ฐ๋ ค๋ฉด setup์œผ๋กœ ๋กœ์ปฌ ๋ชจ๋ธ์„ ์„ค์น˜ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.
  • CLI UI๋ฅผ ์“ฐ๋ ค๋ฉด ๋ณ„๋„์˜ OpenAI ํ˜ธํ™˜ ๋กœ์ปฌ LLM ์„œ๋ฒ„๊ฐ€ ์‹คํ–‰ ์ค‘์ด์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.
  • CLI์˜ ๋ช…์‹œ์  RAG๋Š” vault ๊ด€๋ จ ๋ช…๋ น, ์„œ๋ฒ„๋ช…, ๋„๊ตฌ๋ช…์ด ์ž…๋ ฅ์—์„œ ํŠธ๋ฆฌ๊ฑฐ๋  ๋•Œ๋งŒ ์‚ฌ์ „ ๋ฌธ๋งฅ ์ˆ˜์ง‘์„ ์‹œ๋„ํ•ฉ๋‹ˆ๋‹ค.
  • collect_context๋Š” ๊ธด ์ฃผ์ œ ์ •๋ฆฌ์™€ ๋ฉ”๋ชจ๋ฆฌ ํŒจํ‚ท ์ƒ์„ฑ์— ์ ํ•ฉํ•˜๊ณ , ๋‹จ๊ฑด ์กฐํšŒ๋Š” search๋‚˜ read๊ฐ€ ๋” ๋‹จ์ˆœํ•ฉ๋‹ˆ๋‹ค.
  • ์“ฐ๊ธฐ ๊ณ„์—ด ๋„๊ตฌ๋Š” Vault ๋ฐ”๊นฅ ๊ฒฝ๋กœ์— ์“ฐ์ง€ ์•Š๋„๋ก ์ฐจ๋‹จํ•ฉ๋‹ˆ๋‹ค.

์ฐธ๊ณ  ๋ฌธ์„œ

๋ผ์ด์„ ์Šค

Apache-2.0