Skip to main content
Glama
sungreong

Markdown Source Graph MCP

by sungreong
README.md
# Markdown Source Graph MCP

## ๐ŸŒ ์›น์‚ฌ์ดํŠธ์—์„œ ๋ณด๊ธฐ

**์ฒ˜์Œ ๋ฐฉ๋ฌธํ–ˆ๋‹ค๋ฉด ์—ฌ๊ธฐ๋ถ€ํ„ฐ ์‹œ์ž‘ํ•˜์„ธ์š”:**
[ํ”„๋กœ์ ํŠธ ์†Œ๊ฐœยท๋„๊ตฌ ๋ชฉ๋กยท์„ค์น˜ ์ˆœ์„œ ์—ด๊ธฐ โ†’](https://sungreong.github.io/markdown-source-graph-mcp/)

![Agent Docs for Markdown์ด ๊ฐ ์›Œํฌ์ŠคํŽ˜์ด์Šค์— Source Graph๋ฅผ ๋งŒ๋“ค๊ณ , ์—ฌ๋Ÿฌ ๊ทธ๋ž˜ํ”„๊ฐ€ ํ•˜๋‚˜์˜ Markdown Source Graph MCP๋กœ ์—ฐ๊ฒฐ๋˜๋Š” ๊ตฌ์„ฑ](assets/markdown-source-graph-hero.png)

[Agent Docs for Markdown](https://marketplace.visualstudio.com/items?itemName=datanewbie-labs.markdown-agent-docs)์ด
๋งŒ๋“  ๋กœ์ปฌ Source Graph๋ฅผ Codex, Claude Code, Gemini CLI์—์„œ ๊ฒ€์ƒ‰ ๋„๊ตฌ๋กœ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ•ด์ฃผ๋Š”
Docker ๊ธฐ๋ฐ˜ MCP ์„œ๋ฒ„์ž…๋‹ˆ๋‹ค.

![Markdown Source Graph MCP GitHub Pages ์†Œ๊ฐœ ํ™”๋ฉด](assets/github-pages-preview.png)

Markdown ์›๋ฌธ๊ณผ `.mps/source-graph.sqlite`๋Š” ์ฝ๊ธฐ ์ „์šฉ์œผ๋กœ ๋งˆ์šดํŠธ๋ฉ๋‹ˆ๋‹ค. ์„œ๋ฒ„๋Š” ๋ฌธ์„œ๋ฅผ ์ˆ˜์ •ํ•˜์ง€
์•Š๊ณ , ๊ฒ€์ƒ‰์šฉ ์บ์‹œ๋งŒ ๋ณ„๋„์˜ Docker ๋ณผ๋ฅจ์— ์ €์žฅํ•ฉ๋‹ˆ๋‹ค.

## ๋จผ์ € ์ฝ์„ ๋ฌธ์„œ

- ์ฒ˜์Œ ์„ค์น˜๋ถ€ํ„ฐ Codex ๋“ฑ๋ก๊นŒ์ง€: [GETTING_STARTED.md](GETTING_STARTED.md)
- Single, Hub, ์˜ค๋ฅ˜ ๋ฐ ์‹ค์ œ E2E ๊ฒ€์ฆ: [SCENARIOS.md](SCENARIOS.md)
- ์ €์žฅ์†Œ์—์„œ ์ž‘์—…ํ•˜๋Š” ์—์ด์ „ํŠธ ์ง€์นจ: [AGENTS.md](AGENTS.md)
- GitHub Pages ์•ˆ๋‚ด ์‚ฌ์ดํŠธ ์šด์˜: [docs/github-pages.md](docs/github-pages.md)

## ์ œ๊ณตํ•˜๋Š” ๊ธฐ๋Šฅ

| MCP ๋„๊ตฌ | ์šฉ๋„ |
|---|---|
| `search_markdown` | ์ œ๋ชฉ๊ณผ ๋ณธ๋ฌธ์„ ๊ฒ€์ƒ‰ํ•˜๊ณ  ๊ฒฝ๋กœ, excerpt, heading์„ ๋ฐ˜ํ™˜ |
| `search_all_markdown` | ์—ฌ๋Ÿฌ ์›Œํฌ์ŠคํŽ˜์ด์Šค๋ฅผ ๋™์‹œ์— ๊ฒ€์ƒ‰ |
| `find_relevant_markdown_roots` | ์งˆ๋ฌธ์„ ๊ฐ ๋ฃจํŠธ์— ๋Œ€์ž…ํ•ด ์ ํ•ฉํ•œ ์›Œํฌ์ŠคํŽ˜์ด์Šค ํ›„๋ณด์™€ ๊ทผ๊ฑฐ ๋ฐ˜ํ™˜ |
| `read_markdown` | ๊ฒ€์ƒ‰ ๊ฒฐ๊ณผ์˜ Markdown์„ ์ง€์ •ํ•œ ์ค„ ๋ฒ”์œ„๋งŒ ์ฝ๊ธฐ |
| `get_markdown_links` | ๋ฌธ์„œ์˜ ๋งํฌ์™€ backlink๋ฅผ Source Graph์—์„œ ์กฐํšŒ |
| `list_markdown_roots` | ์—ฐ๊ฒฐ๋œ ์›Œํฌ์ŠคํŽ˜์ด์Šค์™€ ์ธ๋ฑ์Šค ์ƒํƒœ ํ™•์ธ |
| `get_source_graph_status` | Source Graph ์ข…๋ฅ˜, ๋ฌธ์„œ ์ˆ˜, ์บ์‹œ ์ตœ์‹ ์„ฑ ํ™•์ธ |
| `refresh_markdown_root` | ํ˜„์žฌ `.mps` ์ธ๋ฑ์Šค๋ฅผ MCP ๊ฒ€์ƒ‰ ์บ์‹œ๋กœ ๋‹ค์‹œ ๊ฐ€์ ธ์˜ค๊ธฐ |

๊ฒ€์ƒ‰ํ•  ๋•Œ Source Graph ํŒŒ์ผ์ด ๋ฐ”๋€ ๊ฒƒ์ด ๊ฐ์ง€๋˜๋ฉด ๊ฒ€์ƒ‰ ์บ์‹œ๋Š” ์ž๋™์œผ๋กœ ๊ฐฑ์‹ ๋ฉ๋‹ˆ๋‹ค.

## ์ „์ฒด ํ๋ฆ„

![VS Code์—์„œ Agent Docs for Markdown ์„ค์น˜, ์›Œํฌ์ŠคํŽ˜์ด์Šค๋ณ„ Source Graph ์ƒ์„ฑ, ์—ฌ๋Ÿฌ ๊ทธ๋ž˜ํ”„๋ฅผ ํ•˜๋‚˜์˜ MCP์— ์—ฐ๊ฒฐํ•ด ๊ฒ€์ƒ‰ํ•˜๋Š” ์™ผ์ชฝ์—์„œ ์˜ค๋ฅธ์ชฝ ์ˆœ์„œ](assets/vscode-extension-flow.svg)

๊ฐ ์›Œํฌ์ŠคํŽ˜์ด์Šค์˜ `Agent Docs for Markdown`์ด ์ž์ฒด `.mps/source-graph.sqlite`๋ฅผ ๋งŒ๋“ญ๋‹ˆ๋‹ค.
์—ฌ๋Ÿฌ ๊ทธ๋ž˜ํ”„๋ฅผ ํ•˜๋‚˜์˜ MCP์—์„œ ์‚ฌ์šฉํ•˜๋ ค๋ฉด ์•„๋ž˜์˜ **Hub** ๋˜๋Š” **Named Multi-root** ๋ชจ๋“œ๋กœ
ํ—ˆ์šฉํ•  ์›Œํฌ์ŠคํŽ˜์ด์Šค๋ฅผ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค. ํด๋ผ์ด์–ธํŠธ๋Š” `root_id`๋กœ ํ•˜๋‚˜๋ฅผ ๊ณ ๋ฅด๊ฑฐ๋‚˜
`search_all_markdown`์œผ๋กœ ์—ฌ๋Ÿฌ ๋ฃจํŠธ๋ฅผ ํ•จ๊ป˜ ๊ฒ€์ƒ‰ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

## ์ค€๋น„ ์‚ฌํ•ญ

- Docker Desktop ๋˜๋Š” Docker Engine + Compose
- VS Code
- [Agent Docs for Markdown ํ™•์žฅ](https://marketplace.visualstudio.com/items?itemName=datanewbie-labs.markdown-agent-docs)
- ๊ฒ€์ƒ‰ํ•  Markdown ์›Œํฌ์ŠคํŽ˜์ด์Šค

## 1. Agent Docs ํ™•์žฅ ์„ค์น˜์™€ Source Graph ์ƒ์„ฑ

VS Code์—์„œ Marketplace๋ฅผ ์—ด๊ณ  `Agent Docs for Markdown`์„ ์„ค์น˜ํ•˜๊ฑฐ๋‚˜ ๋‹ค์Œ ๋ช…๋ น์„ ์‹คํ–‰ํ•ฉ๋‹ˆ๋‹ค.

```powershell
code --install-extension datanewbie-labs.markdown-agent-docs
```

๊ทธ๋‹ค์Œ ๊ฒ€์ƒ‰ํ•  Markdown ํด๋”๋ฅผ VS Code์˜ ์›Œํฌ์ŠคํŽ˜์ด์Šค๋กœ ์—ฝ๋‹ˆ๋‹ค.

1. Activity Bar์—์„œ **Agent Docs**๋ฅผ ์—ฝ๋‹ˆ๋‹ค.
2. **Open Graph** ๋˜๋Š” ๋ช…๋ น ํŒ”๋ ˆํŠธ์˜ `Agent Docs: Open Source Graph`๋ฅผ ์‹คํ–‰ํ•ฉ๋‹ˆ๋‹ค.
3. ์ฒ˜์Œ์ด๋ผ๋ฉด `Agent Docs: Initialize Source Graph`๋ฅผ ์‹คํ–‰ํ•ฉ๋‹ˆ๋‹ค.
4. **Start Graph**๋กœ ์ฒซ ์ธ๋ฑ์Šค๋ฅผ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค.
5. ์›Œํฌ์ŠคํŽ˜์ด์Šค์— ์•„๋ž˜ ํŒŒ์ผ์ด ์ƒ๊ฒผ๋Š”์ง€ ํ™•์ธํ•ฉ๋‹ˆ๋‹ค.

```text
<markdown-workspace>/.mps/source-graph.sqlite
```

๋ถˆํ•„์š”ํ•œ ํด๋”๋Š” `.mps/.mpsignore`์—์„œ ์ œ์™ธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ํ™•์žฅ์€ Markdown ์ €์žฅ ์‹œ Source Graph๋ฅผ
์ž๋™ ๊ฐฑ์‹ ํ•  ์ˆ˜ ์žˆ์œผ๋ฉฐ, ์ด MCP๋Š” ๊ฐฑ์‹ ๋œ SQLite์˜ ๋ณ€๊ฒฝ ์‹œ๊ฐ์„ ๊ฐ์ง€ํ•ด ๋‹ค์Œ ๊ฒ€์ƒ‰ ์ „์— ์บ์‹œ๋ฅผ ๋‹ค์‹œ
๊ฐ€์ ธ์˜ต๋‹ˆ๋‹ค.

## 2. ์ €์žฅ์†Œ ํด๋ก 

```powershell
git clone https://github.com/sungreong/markdown-source-graph-mcp.git
cd markdown-source-graph-mcp
```

## 3. ์›Œํฌ์ŠคํŽ˜์ด์Šค ๊ฒฝ๋กœ ์„ค์ •

`.env.example`์„ `.env`๋กœ ๋ณต์‚ฌํ•ฉ๋‹ˆ๋‹ค.

```powershell
Copy-Item .env.example .env
```

`.env`์˜ ๊ฒฝ๋กœ๋ฅผ ์‹ค์ œ Markdown ์›Œํฌ์ŠคํŽ˜์ด์Šค๋กœ ๋ฐ”๊ฟ‰๋‹ˆ๋‹ค. Windows์—์„œ๋Š” ์—ญ์Šฌ๋ž˜์‹œ๋ณด๋‹ค `/`๋ฅผ
๊ถŒ์žฅํ•ฉ๋‹ˆ๋‹ค.

```dotenv
MARKDOWN_MCP_MODE=single
MARKDOWN_MOUNT_SOURCE=C:/Users/you/Documents/my-markdown-workspace
MARKDOWN_PUBLIC_PATH=C:/Users/you/Documents/my-markdown-workspace
MCP_PORT=8811
```

- `MARKDOWN_MCP_MODE`: ์›Œํฌ์ŠคํŽ˜์ด์Šค ํ•˜๋‚˜๋Š” `single`, ์ƒ์œ„ ํด๋” ํ•˜๋‚˜์—์„œ ๋™์ ์œผ๋กœ ๊ณ ๋ฅด๋ฉด `hub`
- `MARKDOWN_MOUNT_SOURCE`: Docker์— ์ฝ๊ธฐ ์ „์šฉ์œผ๋กœ ๋งˆ์šดํŠธํ•  ์‹ค์ œ ํด๋”
- `MARKDOWN_PUBLIC_PATH`: MCP ์‘๋‹ต์— ํ‘œ์‹œํ•  ํ˜ธ์ŠคํŠธ ๊ฒฝ๋กœ
- `MCP_PORT`: ๋กœ์ปฌ MCP ํฌํŠธ

Single ๋ชจ๋“œ์—์„œ๋Š” ์›Œํฌ์ŠคํŽ˜์ด์Šค ์ž์ฒด๋ฅผ ์ง€์ •ํ•ด์•ผ ํ•˜๋ฉฐ `.mps` ํด๋”๋ฅผ ์ง์ ‘ ์ง€์ •ํ•˜๋ฉด ์•ˆ ๋ฉ๋‹ˆ๋‹ค.

Compose๋ฅผ ์‹คํ–‰ํ•˜๊ธฐ ์ „์— ๊ฒฝ๋กœ์™€ ์ธ๋ฑ์Šค๋ฅผ ๊ฒ€์‚ฌํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

```powershell
python scripts/check_workspace.py "C:/Users/you/Documents/my-markdown-workspace"
```

๋ฌธ์ œ๊ฐ€ ์žˆ์œผ๋ฉด ์˜ค๋ฅ˜ ๋ฉ”์‹œ์ง€์™€ ํ•จ๊ป˜ ์ข…๋ฃŒ ์ฝ”๋“œ `2`๋ฅผ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.

## 4. Docker Compose ์‹คํ–‰

```powershell
docker compose up -d --build
docker compose ps
```

์ƒํƒœ๋ฅผ ํ™•์ธํ•ฉ๋‹ˆ๋‹ค.

```powershell
Invoke-RestMethod http://127.0.0.1:8811/healthz
```

`status`๊ฐ€ `ok`์ด๊ณ  `mps_index_present`๊ฐ€ `true`์ด๋ฉด ์ค€๋น„๊ฐ€ ๋๋‚ฌ์Šต๋‹ˆ๋‹ค. ๊ฒฝ๋กœ๊ฐ€ ์ž˜๋ชป๋๊ฑฐ๋‚˜
์ง€์›๋˜๋Š” `.mps`๊ฐ€ ์—†์œผ๋ฉด `/healthz`๋Š” HTTP 503์„ ๋ฐ˜ํ™˜ํ•˜๊ณ  ์ปจํ…Œ์ด๋„ˆ๋Š” `unhealthy`๋กœ ํ‘œ์‹œ๋ฉ๋‹ˆ๋‹ค.

๋ธŒ๋ผ์šฐ์ € ๋Œ€์‹œ๋ณด๋“œ:

```text
http://127.0.0.1:8811/
```

## 5. ์›น ๋Œ€์‹œ๋ณด๋“œ์—์„œ ํ™•์ธํ•˜๊ณ  ๊ฒ€์ƒ‰ํ•˜๊ธฐ

![Markdown Knowledge Hub์˜ ์ „์ฒด ์ƒํƒœ, ๋ฌธ์„œ ์ˆ˜, ์ตœ๊ทผ ํ™œ๋™์„ ๋ณด์—ฌ์ฃผ๋Š” ๋Œ€์‹œ๋ณด๋“œ](assets/dashboard-overview.png)

๋Œ€์‹œ๋ณด๋“œ๋Š” ์™ธ๋ถ€ ๋ฆฌ์†Œ์Šค ์—†์ด ๋กœ์ปฌ MCP ์„œ๋ฒ„์—์„œ๋งŒ ์ œ๊ณต๋ฉ๋‹ˆ๋‹ค. ์—ฐ๊ฒฐ๋œ ์›Œํฌ์ŠคํŽ˜์ด์Šค์™€ ๋ฌธ์„œ ์ˆ˜,
์ธ๋ฑ์Šค ์ƒํƒœ, ์ตœ๊ทผ MCP ํ˜ธ์ถœ์„ ํ•œ๋ˆˆ์— ํ™•์ธํ•  ์ˆ˜ ์žˆ๊ณ  ์ƒํƒœ๋Š” 10์ดˆ๋งˆ๋‹ค ์ž๋™ ๊ฐฑ์‹ ๋ฉ๋‹ˆ๋‹ค.

### Markdown ์ง€์‹ ๊ฒ€์ƒ‰

![์›Œํฌ์ŠคํŽ˜์ด์Šค๋ฅผ ์„ ํƒํ•˜๊ณ  Markdown ๋ฌธ์„œ๋ฅผ ๊ฒ€์ƒ‰ํ•˜๋Š” ํ™”๋ฉด](assets/dashboard-search.png)

1. **์ง€์‹ ๊ฒ€์ƒ‰** ํƒญ์„ ์—ฝ๋‹ˆ๋‹ค.
2. ์งˆ๋ฌธ์ด๋‚˜ ํ‚ค์›Œ๋“œ๋ฅผ ์ž…๋ ฅํ•ฉ๋‹ˆ๋‹ค.
3. **์ „์ฒด ์›Œํฌ์ŠคํŽ˜์ด์Šค** ๋˜๋Š” ํŠน์ • ์›Œํฌ์ŠคํŽ˜์ด์Šค๋ฅผ ์„ ํƒํ•ฉ๋‹ˆ๋‹ค.
4. **๊ฒ€์ƒ‰**์„ ๋ˆ„๋ฅด๋ฉด ์ œ๋ชฉ, ๊ด€๋ จ ๋ณธ๋ฌธ, ํŒŒ์ผ ๊ฒฝ๋กœ, ์›Œํฌ์ŠคํŽ˜์ด์Šค๊ฐ€ ํ‘œ์‹œ๋ฉ๋‹ˆ๋‹ค.
5. ๊ฒฐ๊ณผ๊ฐ€ ๋งŽ์œผ๋ฉด ํ™”๋ฉด ์•„๋ž˜ ํŽ˜์ด์ง€ ๋ฒ„ํŠผ์œผ๋กœ ๋‹ค์Œ ๊ฒฐ๊ณผ๋ฅผ ํƒ์ƒ‰ํ•ฉ๋‹ˆ๋‹ค.

๊ฒ€์ƒ‰ ์ƒํƒœ๋ฅผ URL์— ๋‹ด์•„ ๊ณต์œ ํ•˜๊ฑฐ๋‚˜ ๋ธŒ๋ผ์šฐ์ € ์ฆ๊ฒจ์ฐพ๊ธฐ๋กœ ์ €์žฅํ•  ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค.

```text
http://127.0.0.1:8811/?tab=search&q=์ง€์›%20์šฐ์„ ์ˆœ์œ„&root_id=career-signal
```

### MCP ๋„๊ตฌ ์ดํ•ดํ•˜๊ธฐ

![MCP ๋„๊ตฌ์˜ ์šฉ๋„, ์ฃผ์š” ํŒŒ๋ผ๋ฏธํ„ฐ, ๊ถŒ์žฅ ์‚ฌ์šฉ ์ˆœ์„œ๋ฅผ ๋ณด์—ฌ์ฃผ๋Š” ๋„๊ตฌ ์•ˆ๋‚ด ํ™”๋ฉด](assets/dashboard-tools.png)

**๋„๊ตฌ ์•ˆ๋‚ด** ํƒญ์—๋Š” MCP๊ฐ€ ์ œ๊ณตํ•˜๋Š” ๋ชจ๋“  ๋„๊ตฌ์™€ ์šฉ๋„, ์ฃผ์š” ํŒŒ๋ผ๋ฏธํ„ฐ๊ฐ€ ์ •๋ฆฌ๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค.
์ฒ˜์Œ ์‚ฌ์šฉํ•  ๋•Œ๋Š” `list_markdown_roots` โ†’ `find_relevant_markdown_roots` โ†’
`search_markdown` ๋˜๋Š” `search_all_markdown` ์ˆœ์„œ๋ฅผ ์ฐธ๊ณ ํ•˜๋ฉด ๋ฉ๋‹ˆ๋‹ค.

### ํด๋ผ์ด์–ธํŠธ๋ณ„ ํ”„๋กฌํ”„ํŠธ ๋ณต์‚ฌํ•˜๊ธฐ

![Codex ์„ค์น˜ ๋ฐ ์‚ฌ์šฉ ํ”„๋กฌํ”„ํŠธ๋ฅผ ์„ ํƒํ•ด ๋ณต์‚ฌํ•  ์ˆ˜ ์žˆ๋Š” ํ”„๋กฌํ”„ํŠธ ํ™”๋ฉด](assets/dashboard-prompts.png)

**ํ”„๋กฌํ”„ํŠธ** ํƒญ์—์„œ Codex, Claude Code, Gemini CLI๋ฅผ ์„ ํƒํ•˜๋ฉด ์„ค์น˜์™€ ์‚ฌ์šฉ ํ”„๋กฌํ”„ํŠธ๊ฐ€ ๋‚˜๋‰˜์–ด
ํ‘œ์‹œ๋ฉ๋‹ˆ๋‹ค. **๋ณต์‚ฌ** ๋ฒ„ํŠผ์œผ๋กœ ์›ํ•˜๋Š” ํ”„๋กฌํ”„ํŠธ๋ฅผ ๋ณต์‚ฌํ•œ ๋’ค ํ•ด๋‹น ํด๋ผ์ด์–ธํŠธ์— ๊ทธ๋Œ€๋กœ ๋ถ™์—ฌ ๋„ฃ์„ ์ˆ˜
์žˆ์Šต๋‹ˆ๋‹ค. **์‚ฌ์šฉ ์ด๋ ฅ**๊ณผ **์งˆ๋ฌธ ํŒจํ„ด** ํƒญ์€ ๊ฒ€์ƒ‰ยทํ•„ํ„ฐยทํŽ˜์ด์ง€ ์ด๋™์„ ์ง€์›ํ•˜๋ฏ€๋กœ ํ˜ธ์ถœ์ด ๋งŽ์ด
์Œ“์—ฌ๋„ ํ•„์š”ํ•œ ๊ธฐ๋ก๊ณผ ์ž์ฃผ ์“ฐ๋Š” ํŒŒ๋ผ๋ฏธํ„ฐ ์กฐํ•ฉ์„ ์ฐพ์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

![๋„๊ตฌ, ๊ฒ€์ƒ‰์–ด, root_id, ํŽ˜์ด์ง€, ์ฒ˜๋ฆฌ ์‹œ๊ฐ„๊ณผ ๊ฒฐ๊ณผ ์ˆ˜๋ฅผ ํ•จ๊ป˜ ๋ณด์—ฌ์ฃผ๋Š” ์‚ฌ์šฉ ์ด๋ ฅ ํ™”๋ฉด](assets/dashboard-activity.png)

๋Œ€์‹œ๋ณด๋“œ ๊ธฐ๋Šฅ๊ณผ ๋กœ์ปฌ ๊ฐ์‚ฌ ๋กœ๊ทธ ๋ณด์กด ์„ค์ •์€ [docs/dashboard.md](docs/dashboard.md)๋ฅผ ์ฐธ๊ณ ํ•˜์„ธ์š”.

MCP endpoint:

```text
http://127.0.0.1:8811/mcp
```

๋กœ๊ทธ์™€ ์ข…๋ฃŒ ๋ช…๋ น:

```powershell
docker compose logs -f markdown-source-graph-mcp
docker compose down
```

## 6. AI ํด๋ผ์ด์–ธํŠธ์— MCP ๋“ฑ๋ก

ํด๋ผ์ด์–ธํŠธ๋ณ„ ์ƒ์„ธ ๊ฐ€์ด๋“œ์™€ ๋ณต์‚ฌ ๊ฐ€๋Šฅํ•œ ์„ค์ • ํŒŒ์ผ์„ ๋ถ„๋ฆฌํ•ด ๋‘์—ˆ์Šต๋‹ˆ๋‹ค.

| ํด๋ผ์ด์–ธํŠธ | ๊ฐ€์ด๋“œ | ์˜ˆ์‹œ ์„ค์ • |
|---|---|---|
| Codex | [docs/clients/codex.md](docs/clients/codex.md) | [examples/clients/codex/config.toml](examples/clients/codex/config.toml) |
| Claude Code | [docs/clients/claude-code.md](docs/clients/claude-code.md) | [examples/clients/claude-code/.mcp.json](examples/clients/claude-code/.mcp.json) |
| Gemini CLI | [docs/clients/gemini-cli.md](docs/clients/gemini-cli.md) | [examples/clients/gemini-cli/settings.json](examples/clients/gemini-cli/settings.json) |

### Codex ๋น ๋ฅธ ๋“ฑ๋ก

```powershell
codex mcp add markdownSourceGraph --url http://127.0.0.1:8811/mcp
codex mcp list
```

### Claude Code ๋น ๋ฅธ ๋“ฑ๋ก

```powershell
claude mcp add --transport http markdown-source-graph --scope project http://127.0.0.1:8811/mcp
claude mcp list
```

### Gemini CLI ๋น ๋ฅธ ๋“ฑ๋ก

```powershell
gemini mcp add --transport http --scope project markdown-source-graph http://127.0.0.1:8811/mcp
gemini mcp list
```

## 7. ์‚ฌ์šฉ ์˜ˆ์‹œ

์—ฐ๊ฒฐํ•œ ํด๋ผ์ด์–ธํŠธ์—์„œ ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์š”์ฒญํ•ฉ๋‹ˆ๋‹ค.

```text
markdown-source-graph MCP๋ฅผ ์‚ฌ์šฉํ•ด "agent evaluation"์„ ๊ฒ€์ƒ‰ํ•ด์ค˜.
๊ด€๋ จ ๋ฌธ์„œ 5๊ฐœ์˜ ๊ฒฝ๋กœ, ์ œ๋ชฉ, ๊ด€๋ จ heading๊ณผ ํ•ต์‹ฌ ๊ทผ๊ฑฐ๋ฅผ ์ •๋ฆฌํ•ด์ค˜.
```

```text
"MCP tooling"๊ณผ ๊ฐ€์žฅ ๊ด€๋ จ ์žˆ๋Š” ๊ธฐ์ค€ ๋ฌธ์„œ๋ฅผ ์ฐพ๊ณ ,
get_markdown_links๋กœ ๋งํฌ์™€ backlink๋ฅผ ์กฐ์‚ฌํ•ด์„œ ํ•จ๊ป˜ ์ฝ์–ด์•ผ ํ•  ๋ฌธ์„œ๋ฅผ ์•Œ๋ ค์ค˜.
```

```text
docs/architecture.md๋ฅผ ์ˆ˜์ •ํ•˜๊ธฐ ์ „์— ์ด ๋ฌธ์„œ๋ฅผ ์ฐธ์กฐํ•˜๋Š” ๋ฌธ์„œ์™€
์ด ๋ฌธ์„œ๊ฐ€ ์ฐธ์กฐํ•˜๋Š” ๋ฌธ์„œ๋ฅผ ์ฐพ์•„ ๋ณ€๊ฒฝ ์˜ํ–ฅ ๋ฒ”์œ„๋ฅผ ์ •๋ฆฌํ•ด์ค˜.
```

๋” ๋งŽ์€ ๋ณต์‚ฌยท๋ถ™์—ฌ๋„ฃ๊ธฐ ์˜ˆ์‹œ๋Š” [examples/prompts/markdown-search.md](examples/prompts/markdown-search.md)์— ์žˆ์Šต๋‹ˆ๋‹ค.
์—์ด์ „ํŠธ๊ฐ€ ๊ฒฝ๋กœ๋ฅผ ์งˆ๋ฌธํ•˜๋ฉฐ ์„ค์น˜ํ•˜๋„๋ก ๋งก๊ธฐ๋Š” ํ”„๋กฌํ”„ํŠธ์™€ ํด๋ผ์ด์–ธํŠธ๋ณ„ ์„ค์น˜ยท๋‹ค์ค‘ ๊ฒ€์ƒ‰ยท์šด์˜ ์ ๊ฒ€
ํ”„๋กฌํ”„ํŠธ๋Š” [Prompt Pack](docs/prompt-pack.md)์— ๋ชจ์•„ ๋‘์—ˆ์Šต๋‹ˆ๋‹ค.

## ์—ฌ๋Ÿฌ ์›Œํฌ์ŠคํŽ˜์ด์Šค ์‚ฌ์šฉ

๊ฐ Markdown ์›Œํฌ์ŠคํŽ˜์ด์Šค์—๋Š” ๊ฐ์ž์˜ `.mps` ์ธ๋ฑ์Šค๊ฐ€ ์ƒ๊น๋‹ˆ๋‹ค. ์›Œํฌ์ŠคํŽ˜์ด์Šค๋ณ„๋กœ Compose ํ”„๋กœ์ ํŠธ
์ด๋ฆ„, ํ™˜๊ฒฝ ํŒŒ์ผ, ํฌํŠธ๋ฅผ ๋ถ„๋ฆฌํ•˜๋ฉด ์—ฌ๋Ÿฌ MCP๋ฅผ ๋™์‹œ์— ์‹คํ–‰ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

```powershell
docker compose --project-name markdown-research --env-file .env.research up -d --build
docker compose --project-name markdown-wiki --env-file .env.wiki up -d --build
```

์ž์„ธํ•œ ์˜ˆ์‹œ๋Š” [docs/multiple-workspaces.md](docs/multiple-workspaces.md)๋ฅผ ์ฐธ๊ณ ํ•˜์„ธ์š”.

๊ณตํ†ต ์ƒ์œ„ ํด๋”๊ฐ€ ์—†๋Š” ์›Œํฌ์ŠคํŽ˜์ด์Šค๋งŒ ์ •ํ™•ํžˆ ๊ณจ๋ผ ์—ฐ๊ฒฐํ•˜๋ ค๋ฉด Named Multi-root ๋ชจ๋“œ๋ฅผ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.
์˜ˆ๋ฅผ ๋“ค์–ด `C:/app/AI_MONITORING`๊ณผ `C:/app/interset_monitoring/my_carrer_signal`๋งŒ ๊ฐ๊ฐ ์ฝ๊ธฐ ์ „์šฉ์œผ๋กœ
์—ฐ๊ฒฐํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์„ค์ •๊ณผ ์งˆ๋ฌธ๋ณ„ ์ž๋™ ์„ ํƒ ํ๋ฆ„์€ [docs/multi-root.md](docs/multi-root.md)๋ฅผ ์ฐธ๊ณ ํ•˜์„ธ์š”.

### ํ•˜๋‚˜์˜ ์„œ๋ฒ„์—์„œ ํด๋ผ์ด์–ธํŠธ๊ฐ€ ์›Œํฌ์ŠคํŽ˜์ด์Šค ์„ ํƒํ•˜๊ธฐ

Hub ๋ชจ๋“œ๋Š” ํ—ˆ์šฉ๋œ ์ƒ์œ„ ํด๋” ํ•˜๋‚˜๋ฅผ ์ฝ๊ธฐ ์ „์šฉ์œผ๋กœ ๋งˆ์šดํŠธํ•ฉ๋‹ˆ๋‹ค. ํด๋ผ์ด์–ธํŠธ๋Š”
`list_markdown_roots`๋กœ ๋ฐœ๊ฒฌ๋œ `root_id`๋ฅผ ๋ฐ›์€ ๋’ค, ๊ฒ€์ƒ‰ํ•  ๋•Œ ๊ทธ ๊ฐ’์„ ๋ฐ”๊ฟ” ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.

```dotenv
MARKDOWN_MCP_MODE=hub
MARKDOWN_MOUNT_SOURCE=C:/Users/you/Documents/ProjectCode
MARKDOWN_PUBLIC_PATH=C:/Users/you/Documents/ProjectCode
MARKDOWN_MCP_DISCOVERY_MAX_DEPTH=4
MCP_PORT=8811
```

```text
list_markdown_roots๋ฅผ ํ˜ธ์ถœํ•ด ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•œ ์›Œํฌ์ŠคํŽ˜์ด์Šค๋ฅผ ๋ณด์—ฌ์ค˜.
๊ทธ์ค‘ root_id="01_2026_EXP/markdown-pattern-studio"์—์„œ "MCP"๋ฅผ ๊ฒ€์ƒ‰ํ•ด์ค˜.
```

์ปจํ…Œ์ด๋„ˆ ์‹คํ–‰ ํ›„ ํด๋ผ์ด์–ธํŠธ๊ฐ€ ์ž„์˜์˜ ํ˜ธ์ŠคํŠธ ์ ˆ๋Œ€ ๊ฒฝ๋กœ๋ฅผ ์ƒˆ๋กœ ๋งˆ์šดํŠธํ•˜๋Š” ๋ฐฉ์‹์€ Docker์™€ ๋ณด์•ˆ์ƒ
์ง€์›ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๋ฐ˜๋“œ์‹œ ๋ฏธ๋ฆฌ ํ—ˆ์šฉํ•œ Hub ๊ฒฝ๋กœ ์•„๋ž˜์˜ ์ƒ๋Œ€ `root_id`๋งŒ ์„ ํƒํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
์„ค์ •๊ณผ ๋ณด์•ˆ ๋ฒ”์œ„๋Š” [docs/hub-mode.md](docs/hub-mode.md)๋ฅผ ์ฐธ๊ณ ํ•˜์„ธ์š”.

## ์ธ๋ฑ์Šค ๊ฐฑ์‹  ๋ฐฉ์‹

1. VS Code์—์„œ Markdown์„ ์ˆ˜์ •ํ•˜๊ณ  ์ €์žฅํ•ฉ๋‹ˆ๋‹ค.
2. Agent Docs๊ฐ€ `.mps/source-graph.sqlite`๋ฅผ ๊ฐฑ์‹ ํ•ฉ๋‹ˆ๋‹ค.
3. ๋‹ค์Œ `search_markdown` ํ˜ธ์ถœ์—์„œ MCP๊ฐ€ ๋ณ€๊ฒฝ ์‹œ๊ฐ์„ ๊ฐ์ง€ํ•ฉ๋‹ˆ๋‹ค.
4. MCP๊ฐ€ Docker ๋ณผ๋ฅจ์˜ ๊ฒ€์ƒ‰ ์บ์‹œ๋ฅผ ์ž๋™ ์žฌ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค.

์ฆ‰์‹œ ๊ฐ•์ œ ๊ฐฑ์‹ ํ•˜๋ ค๋ฉด ํด๋ผ์ด์–ธํŠธ์—์„œ ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์š”์ฒญํ•ฉ๋‹ˆ๋‹ค.

```text
refresh_markdown_root๋ฅผ root_id="workspace"๋กœ ์‹คํ–‰ํ•ด์ค˜.
```

์ด ์ž‘์—…์€ Markdown์ด๋‚˜ `.mps`๋ฅผ ์ˆ˜์ •ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

## ํ˜ธํ™˜์„ฑ

๋‹ค์Œ Source Graph ์‹๋ณ„์ž๋ฅผ ๋ชจ๋‘ ์ง€์›ํ•ฉ๋‹ˆ๋‹ค.

- `markdown-agent-docs.source-graph`
- `markdown-pattern-studio.source-graph` โ€” ์ด์ „ Markdown Pattern Studio ์ธ๋ฑ์Šค

์ง€์› ์Šคํ‚ค๋งˆ ๋ฒ„์ „์€ ํ˜„์žฌ `1`์ž…๋‹ˆ๋‹ค.

## ๋ณด์•ˆ ๋ชจ๋ธ

- ํฌํŠธ๋Š” `127.0.0.1`์—๋งŒ ๊ณต๊ฐœ๋ฉ๋‹ˆ๋‹ค.
- Markdown ์›Œํฌ์ŠคํŽ˜์ด์Šค๋Š” ์ปจํ…Œ์ด๋„ˆ์— ์ฝ๊ธฐ ์ „์šฉ์œผ๋กœ ์—ฐ๊ฒฐ๋ฉ๋‹ˆ๋‹ค.
- ์„œ๋ฒ„์—๋Š” Markdown ์ž‘์„ฑยท์‚ญ์ œ ๋„๊ตฌ๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค.
- ๋ณ„๋„์˜ ์ธ์ฆ์€ ์—†์œผ๋ฏ€๋กœ ํฌํŠธ๋ฅผ `0.0.0.0`์ด๋‚˜ LAN์— ๊ณต๊ฐœํ•˜์ง€ ๋งˆ์„ธ์š”.
- ๊ฒ€์ƒ‰ ๊ฒฐ๊ณผ์™€ Markdown ๋‚ด์šฉ์€ ์—ฐ๊ฒฐ๋œ AI ํด๋ผ์ด์–ธํŠธ์˜ ์ปจํ…์ŠคํŠธ๋กœ ์ „๋‹ฌ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
- MCP ํ˜ธ์ถœ ๋ฉ”ํƒ€๋ฐ์ดํ„ฐ์—๋Š” ๊ฒ€์ƒ‰์–ด์™€ ํŒŒ์ผ ๊ฒฝ๋กœ๊ฐ€ ํฌํ•จ๋  ์ˆ˜ ์žˆ์œผ๋ฉฐ ๋กœ์ปฌ `/data/audit.sqlite3`์—
  ์ œํ•œ๋œ ๊ฐœ์ˆ˜๋งŒ ์ €์žฅ๋ฉ๋‹ˆ๋‹ค. ๋ณธ๋ฌธ๊ณผ ๊ฒ€์ƒ‰ ๊ฒฐ๊ณผ ์ „๋ฌธ์€ ์ €์žฅํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

๋Œ€์‹œ๋ณด๋“œ ํƒญ๊ณผ ํ˜ธ์ถœ ์ด๋ ฅยท๋ณด์กด ์„ค์ •์€ [docs/dashboard.md](docs/dashboard.md)๋ฅผ ์ฐธ๊ณ ํ•˜์„ธ์š”.

## ๋ฌธ์ œ ํ•ด๊ฒฐ

### `waiting_for_index` ๋˜๋Š” `mps_index_present: false`

- `.env`์˜ `MARKDOWN_MOUNT_SOURCE`๊ฐ€ ์˜ฌ๋ฐ”๋ฅธ์ง€ ํ™•์ธํ•ฉ๋‹ˆ๋‹ค.
- `<์›Œํฌ์ŠคํŽ˜์ด์Šค>/.mps/source-graph.sqlite`๊ฐ€ ์žˆ๋Š”์ง€ ํ™•์ธํ•ฉ๋‹ˆ๋‹ค.
- Agent Docs์—์„œ `Initialize Source Graph`์™€ `Start Graph`๋ฅผ ๋‹ค์‹œ ์‹คํ–‰ํ•ฉ๋‹ˆ๋‹ค.
- Docker Desktop์—์„œ ํ•ด๋‹น ๋“œ๋ผ์ด๋ธŒ๊ฐ€ ๊ณต์œ  ๊ฐ€๋Šฅํ•œ์ง€ ํ™•์ธํ•ฉ๋‹ˆ๋‹ค.

### Docker Compose๊ฐ€ ๊ฒฝ๋กœ๋ฅผ ์ฐพ์ง€ ๋ชปํ•จ

Windows ๊ฒฝ๋กœ๋Š” ๋‹ค์Œ์ฒ˜๋Ÿผ ์ž‘์„ฑํ•ฉ๋‹ˆ๋‹ค.

```dotenv
MARKDOWN_MOUNT_SOURCE=C:/Users/you/Documents/notes
```

### MCP ํด๋ผ์ด์–ธํŠธ์— ๋„๊ตฌ๊ฐ€ ๋ณด์ด์ง€ ์•Š์Œ

1. `http://127.0.0.1:8811/healthz`๋ฅผ ํ™•์ธํ•ฉ๋‹ˆ๋‹ค.
2. MCP URL ๋์— `/mcp`๊ฐ€ ์žˆ๋Š”์ง€ ํ™•์ธํ•ฉ๋‹ˆ๋‹ค.
3. ํด๋ผ์ด์–ธํŠธ์˜ MCP ๋ชฉ๋ก ๋ช…๋ น์„ ์‹คํ–‰ํ•ฉ๋‹ˆ๋‹ค.
4. ํด๋ผ์ด์–ธํŠธ๋ฅผ ์™„์ „ํžˆ ์žฌ์‹œ์ž‘ํ•ฉ๋‹ˆ๋‹ค.

### ๊ฒ€์ƒ‰ ๊ฒฐ๊ณผ๊ฐ€ ์˜ˆ์ „ ๋‚ด์šฉ์ž„

- Agent Docs Source Graph๊ฐ€ ๋จผ์ € ๊ฐฑ์‹ ๋๋Š”์ง€ ํ™•์ธํ•ฉ๋‹ˆ๋‹ค.
- `get_source_graph_status`์—์„œ `source_updated_at`๊ณผ `stale`์„ ํ™•์ธํ•ฉ๋‹ˆ๋‹ค.
- `refresh_markdown_root`๋ฅผ ์‹คํ–‰ํ•ฉ๋‹ˆ๋‹ค.

## ๊ฐœ๋ฐœ

```powershell
python -m venv .venv
.\.venv\Scripts\Activate.ps1
pip install -r requirements-dev.txt
pytest
```

Docker ์„ค์ • ๊ฒ€์ฆ:

```powershell
docker compose config
docker compose build
```

## ํ”„๋กœ์ ํŠธ ๊ตฌ์กฐ

```text
.
โ”œโ”€ src/markdown_source_graph_mcp/  # MCP ์„œ๋ฒ„์™€ Source Graph ์„œ๋น„์Šค
โ”œโ”€ tests/                          # SQLite ํ˜ธํ™˜์„ฑ๊ณผ ๊ฒฝ๋กœ ์•ˆ์ „์„ฑ ํ…Œ์ŠคํŠธ
โ”œโ”€ docs/clients/                   # Codex, Claude Code, Gemini CLI ๊ฐ€์ด๋“œ
โ”œโ”€ docs/dashboard.md               # ์ƒํƒœ ํ™”๋ฉด๊ณผ MCP ํ˜ธ์ถœ ๊ฐ์‚ฌ ์ด๋ ฅ
โ”œโ”€ docs/prompt-pack.md             # ์„ค์น˜ยท์‚ฌ์šฉ ํ”„๋กฌํ”„ํŠธ ์ƒ‰์ธ
โ”œโ”€ docs/github-pages.md            # ๊ณต๊ฐœ ํ”„๋กœ์ ํŠธ ์•ˆ๋‚ด ์‚ฌ์ดํŠธ์™€ ๋ฐฐํฌ ๋ฐฉ์‹
โ”œโ”€ examples/clients/               # ํด๋ผ์ด์–ธํŠธ๋ณ„ ์„ค์ • ํŒŒ์ผ
โ”œโ”€ examples/prompts/setup/         # ๊ณตํ†ตยทํด๋ผ์ด์–ธํŠธ๋ณ„ ์„ค์น˜ ํ”„๋กฌํ”„ํŠธ
โ”œโ”€ examples/prompts/usage/         # ๋‹ค์ค‘ ๊ฒ€์ƒ‰ยท์กฐ์‚ฌยท์šด์˜ ํ”„๋กฌํ”„ํŠธ
โ”œโ”€ scripts/check_workspace.py       # Compose ์‹คํ–‰ ์ „ ๊ฒฝ๋กœยท์ธ๋ฑ์Šค ๊ฒ€์‚ฌ
โ”œโ”€ assets/                          # README ๋Œ€ํ‘œ ์ด๋ฏธ์ง€์™€ ์„ค์น˜ยท๊ฒ€์ƒ‰ ํ๋ฆ„๋„
โ”œโ”€ AGENTS.md                        # ์ž‘์—… ์—์ด์ „ํŠธ์šฉ ํ•„์ˆ˜ ์ง€์นจ
โ”œโ”€ GETTING_STARTED.md               # ์„ค์น˜๋ถ€ํ„ฐ ์ฒซ ์‚ฌ์šฉ๊นŒ์ง€
โ”œโ”€ SCENARIOS.md                     # ์‹คํ–‰ยท์˜ค๋ฅ˜ยทE2E ๊ฒ€์ฆ ์‹œ๋‚˜๋ฆฌ์˜ค
โ”œโ”€ LICENSE                          # MIT License
โ”œโ”€ index.html                       # GitHub Pages ํ”„๋กœ์ ํŠธ ์†Œ๊ฐœ ์‚ฌ์ดํŠธ
โ”œโ”€ site/                            # ์†Œ๊ฐœ ์‚ฌ์ดํŠธ ์Šคํƒ€์ผ๊ณผ ๋™์ž‘
โ”œโ”€ Dockerfile
โ”œโ”€ docker-compose.yml
โ”œโ”€ docker-compose.multi.yml          # ์„œ๋กœ ๋–จ์–ด์ง„ ์—ฌ๋Ÿฌ ๊ฒฝ๋กœ์˜ ๋ช…์‹œ์  ๋งˆ์šดํŠธ
โ”œโ”€ .env.example                     # Single ๋ชจ๋“œ ์˜ˆ์‹œ
โ”œโ”€ .env.hub.example                 # Hub ๋ชจ๋“œ ์˜ˆ์‹œ
โ””โ”€ .env.multi.example               # Named Multi-root ์˜ˆ์‹œ
```

## ๊ด€๋ จ ๋ฌธ์„œ

- [Agent Docs for Markdown Marketplace](https://marketplace.visualstudio.com/items?itemName=datanewbie-labs.markdown-agent-docs)
- [Codex MCP ์„ค์ • ์ฐธ๊ณ ](https://developers.openai.com/learn/docs-mcp)
- [Claude Code MCP ๋ฌธ์„œ](https://code.claude.com/docs/en/mcp)
- [Gemini CLI MCP ์„œ๋ฒ„ ๋ฌธ์„œ](https://github.com/google-gemini/gemini-cli/blob/main/docs/tools/mcp-server.md)

## ๋ผ์ด์„ ์Šค

์ด ํ”„๋กœ์ ํŠธ๋Š” [MIT License](LICENSE)๋กœ ๋ฐฐํฌ๋ฉ๋‹ˆ๋‹ค.