mcp-for-retriever

HyunjunJeon/mcp-for-retriever

3.3

If you are the rightful owner of mcp-for-retriever and would like to certify it and/or have it hosted online, please leave a comment on the right or send an email to henry@mcphub.com.

The Model Context Protocol (MCP) server is a unified platform that integrates multiple retriever services, including web search, vector databases, and relational databases.

Tools
5
Resources
0
Prompts
0

MCP for Retriever

์›น ๊ฒ€์ƒ‰, ๋ฒกํ„ฐ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค(Qdrant), ๊ด€๊ณ„ํ˜• ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค(PostgreSQL)๋ฅผ ํ†ตํ•ฉํ•˜๋ฉฐ
์ธ์ฆ/์ธ๊ฐ€(Authentication/Authorization) ๊ธฐ๋Šฅ์„ ์ œ๊ณตํ•˜๋Š” MCP(Model Context Protocol) ์„œ๋ฒ„์ž…๋‹ˆ๋‹ค.

๋ผ์ด์„ ์Šค

๋ผ์ด์„ ์Šค์— ๋”ฐ๋ผ ๋ฐฐํฌ๋ฉ๋‹ˆ๋‹ค.

๐Ÿš€ ๋น ๋ฅธ ์‹œ์ž‘

ํ•„์ˆ˜ ์š”๊ตฌ์‚ฌํ•ญ

  • Docker: ๋ชจ๋“  ์„œ๋น„์Šค๋Š” Docker(Compose)๋กœ ์‹คํ–‰๋ฉ๋‹ˆ๋‹ค.
  • Tavily API Key: https://tavily.com์—์„œ ๋ฐœ๊ธ‰ (๋ฌด๋ฃŒ)

Docker๋กœ ์‹คํ–‰ํ•˜๊ธฐ

# 1. ํ™˜๊ฒฝ ์„ค์ •
cp .env.example .env
# .env ํŒŒ์ผ์—์„œ TAVILY_API_KEY ์„ค์ • ํ•„์ˆ˜

# 2. ๋ชจ๋“  ์„œ๋น„์Šค ์‹œ์ž‘
./scripts/start-docker.sh --build

# 3. ์„œ๋น„์Šค ์ƒํƒœ ํ™•์ธ
./scripts/test-services.sh

์ด ํ”„๋กœ์ ํŠธ๋Š” Docker Compose๋กœ๋งŒ ์‹คํ–‰๋˜๋„๋ก ๊ตฌ์„ฑํ–ˆ์Šต๋‹ˆ๋‹ค. (MCP - Streamable HTTP๋งŒ ์ง€์›ํ•˜๋„๋ก ๋ชฉํ‘œํ•จ)
๊ทธ๋ž˜์„œ ๋ชจ๋“  ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์™€ ์„œ๋น„์Šค๊ฐ€ ์ปจํ…Œ์ด๋„ˆ๋กœ ๊ด€๋ฆฌ๋ฉ๋‹ˆ๋‹ค.

๐Ÿ“‹ ์ฃผ์š” ๊ธฐ๋Šฅ

๊ฒ€์ƒ‰ ๊ธฐ๋Šฅ

  • ์›น ๊ฒ€์ƒ‰: Tavily API๋ฅผ ํ†ตํ•œ ์›น ์ฝ˜ํ…์ธ  ๊ฒ€์ƒ‰
  • ๋ฒกํ„ฐ ๊ฒ€์ƒ‰: Qdrant๋ฅผ ํ†ตํ•œ ์˜๋ฏธ๋ก ์  ๊ฒ€์ƒ‰
  • ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ๊ฒ€์ƒ‰: PostgreSQL ์ „๋ฌธ ๊ฒ€์ƒ‰
  • ํ†ตํ•ฉ ๊ฒ€์ƒ‰: ๋ชจ๋“  ์†Œ์Šค์—์„œ ๋™์‹œ ๊ฒ€์ƒ‰

๊ด€๋ฆฌ์ž ๋Œ€์‹œ๋ณด๋“œ

  • JWT ์ธ์ฆ: ์—ญํ•  ๊ธฐ๋ฐ˜ ์ ‘๊ทผ ์ œ์–ด (RBAC)
  • ์‚ฌ์šฉ์ž/์„ธ์…˜ ๊ด€๋ฆฌ: ํ† ํฐ ๋ฌดํšจํ™” ๋ฐ ๊ถŒํ•œ ๊ด€๋ฆฌ
  • ๐Ÿ“Š ๋ถ„์„ ๋Œ€์‹œ๋ณด๋“œ: Chart.js ๊ธฐ๋ฐ˜ ์‹œ๊ฐ์  ๋ฉ”ํŠธ๋ฆญ โœจ NEW
  • ๐Ÿ“ค ๋ฐ์ดํ„ฐ ๋‚ด๋ณด๋‚ด๊ธฐ: CSV/JSON ํ˜•ํƒœ ๋ฐ์ดํ„ฐ ์ถ”์ถœ โœจ NEW
  • ๐ŸŒ ๊ตญ์ œํ™”: ํ•œ๊ตญ์–ด/์˜์–ด ์ง€์› โœจ NEW
  • ๐Ÿ”” ์‹ค์‹œ๊ฐ„ ์•Œ๋ฆผ: SSE ๊ธฐ๋ฐ˜ ์‹œ์Šคํ…œ ์ด๋ฒคํŠธ ์•Œ๋ฆผ โœจ NEW

์„ฑ๋Šฅ ๋ฐ ๋ชจ๋‹ˆํ„ฐ๋ง

  • Redis ์บ์‹ฑ: ๊ฒ€์ƒ‰ ๊ฒฐ๊ณผ ์บ์‹ฑ
  • ๋น„๋™๊ธฐ ์ฒ˜๋ฆฌ: Python asyncio ๊ธฐ๋ฐ˜
  • ๊ด€์ฐฐ์„ฑ: OpenTelemetry + Sentry ํ†ตํ•ฉ
  • ํ—ฌ์Šค ์ฒดํฌ: ๋ชจ๋“  ์„œ๋น„์Šค ์ƒํƒœ ๋ชจ๋‹ˆํ„ฐ๋ง

๐Ÿ—๏ธ ์•„ํ‚คํ…์ฒ˜

graph TB
    Client[MCP Client] -->|JWT Token| MCPServer[MCP Server :8001]
    Client -->|Login/Admin| AuthGateway[Auth Gateway :8000]
    
    AuthGateway --> SQLite[(SQLite DB)]
    AuthGateway --> Redis[(Redis)]
    
    MCPServer --> PostgreSQL[(PostgreSQL)]
    MCPServer --> Qdrant[(Qdrant)]
    MCPServer --> Redis
    MCPServer --> Tavily[Tavily API]

์„œ๋น„์Šค ๊ตฌ์„ฑ

์„œ๋น„์ŠคํฌํŠธ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์„ค๋ช…
Auth Gateway8000SQLite์ธ์ฆ/์ธ๊ฐ€, Admin UI
MCP Server8001PostgreSQLMCP ๋„๊ตฌ ์ œ๊ณต
PostgreSQL5432-๊ฒ€์ƒ‰ ๋ฐ์ดํ„ฐ, ์ฝ˜ํ…์ธ  ์ €์žฅ
Qdrant6333/6334-๋ฒกํ„ฐ ๊ฒ€์ƒ‰ ์—”์ง„
Redis6379-์บ์‹œ, ์„ธ์…˜, ํ† ํฐ ์ €์žฅ์†Œ

๐Ÿ” ์ธ์ฆ ํ”Œ๋กœ์šฐ

1. ์‚ฌ์šฉ์ž ๋“ฑ๋ก ๋ฐ ๋กœ๊ทธ์ธ

# ๋“ฑ๋ก
curl -X POST http://localhost:8000/auth/register \
  -H "Content-Type: application/json" \
  -d '{"email": "user@example.com", "password": "Password123!"}'

# ๋กœ๊ทธ์ธ (JWT ํ† ํฐ ํš๋“)
curl -X POST http://localhost:8000/auth/login \
  -H "Content-Type: application/json" \
  -d '{"email": "user@example.com", "password": "Password123!"}'

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

{
  "mcpServers": {
    "mcp-retriever": {
      "url": "http://localhost:8001/",
      "transport": "http",
      "auth": {
        "type": "bearer",
        "token": "YOUR_JWT_TOKEN_HERE"
      }
    }
  }
}

๐Ÿ› ๏ธ ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•œ ๋„๊ตฌ

  • search_web: Tavily ์›น ๊ฒ€์ƒ‰
  • search_vectors: Qdrant ๋ฒกํ„ฐ ๊ฒ€์ƒ‰
  • search_database: PostgreSQL ๊ฒ€์ƒ‰
  • search_all: ๋ชจ๋“  ์†Œ์Šค ํ†ตํ•ฉ ๊ฒ€์ƒ‰
  • health_check: ์„œ๋น„์Šค ์ƒํƒœ ํ™•์ธ

๐Ÿ‘จโ€๐Ÿ’ผ Admin UI

๐Ÿ“‹ ๊ฐœ์š”

FastHTML + HTMX ๊ธฐ๋ฐ˜์˜ ํ˜„๋Œ€์ ์ธ ๊ด€๋ฆฌ์ž ์ธํ„ฐํŽ˜์ด์Šค

ํ•ต์‹ฌ ํŠน์ง•:

  • ๐ŸŽจ Tailwind CSS + HTMX ๋ฐ˜์‘ํ˜• ๋””์ž์ธ
  • ๐Ÿ” JWT ์ธ์ฆ ๋ฐ RBAC ๊ถŒํ•œ ๊ด€๋ฆฌ
  • ๐Ÿ“Š ์‹ค์‹œ๊ฐ„ ๋ถ„์„ ๋ฐ ๋ฐ์ดํ„ฐ ๋‚ด๋ณด๋‚ด๊ธฐ โœจ NEW
  • ๐ŸŒ ๋‹ค๊ตญ์–ด ์ง€์› (ํ•œ๊ตญ์–ด/์˜์–ด) โœจ NEW
  • ๐Ÿ”” ์‹ค์‹œ๊ฐ„ ์•Œ๋ฆผ (SSE ๊ธฐ๋ฐ˜) โœจ NEW
  • ๐Ÿงฉ 14๊ฐœ ์žฌ์‚ฌ์šฉ ์ปดํฌ๋„ŒํŠธ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ

๐ŸŽฏ ๊ด€๋ฆฌ์ž ๊ธฐ๋Šฅ

1. ๋Œ€์‹œ๋ณด๋“œ (/admin)
  • ์‹œ์Šคํ…œ ํ†ต๊ณ„ ์นด๋“œ (์‚ฌ์šฉ์ž, ์„ธ์…˜, ๊ถŒํ•œ ์ˆ˜)
  • ๋น ๋ฅธ ์•ก์…˜ ๋ฒ„ํŠผ
2. ์‚ฌ์šฉ์ž ๊ด€๋ฆฌ (/admin/users)
  • ์‚ฌ์šฉ์ž ๋ชฉ๋ก ๋ฐ ์—ญํ•  ๊ด€๋ฆฌ
  • ๊ถŒํ•œ ๋ณด๊ธฐ ๋ฐ ์—ญํ•  ๋ณ€๊ฒฝ
3. ์„ธ์…˜ ๊ด€๋ฆฌ (/admin/sessions)
  • ํ™œ์„ฑ JWT ํ† ํฐ ๋ชฉ๋ก
  • ๊ฐœ๋ณ„/์ผ๊ด„ ํ† ํฐ ๋ฌดํšจํ™”
4. ๊ถŒํ•œ ๊ด€๋ฆฌ (/admin/permissions)
  • ๊ถŒํ•œ ๋ชฉ๋ก ๋ฐ ์‹ค์‹œ๊ฐ„ ํ•„ํ„ฐ๋ง
  • ๋ฆฌ์†Œ์Šค๋ณ„ ๊ถŒํ•œ ์ƒ์„ฑ/์‚ญ์ œ
  • ์™€์ผ๋“œ์นด๋“œ ํŒจํ„ด ์ง€์›
5. ์—ญํ•  ๊ด€๋ฆฌ (/admin/roles)
  • ์—ญํ• -๊ถŒํ•œ ๋งคํŠธ๋ฆญ์Šค
  • ์—ญํ•  ํŽธ์ง‘ ๋ฐ ๊ด€๋ฆฌ
6. ๋ถ„์„ ๋Œ€์‹œ๋ณด๋“œ (/admin/analytics) โœจ NEW
  • Chart.js ์‹œ๊ฐํ™”: ๋„๊ตฌ ์‚ฌ์šฉ๋Ÿ‰, ์‘๋‹ต์‹œ๊ฐ„ ๋ถ„ํฌ
  • ๋ฉ”ํŠธ๋ฆญ ํ…Œ์ด๋ธ”: ์ •๋ ฌ ๊ฐ€๋Šฅํ•œ ์ƒ์„ธ ํ†ต๊ณ„
  • ์ž๋™ ์ƒˆ๋กœ๊ณ ์นจ: HTMX ๊ธฐ๋ฐ˜ ์‹ค์‹œ๊ฐ„ ์—…๋ฐ์ดํŠธ
7. ๋ฐ์ดํ„ฐ ๋‚ด๋ณด๋‚ด๊ธฐ โœจ NEW
  • ์‚ฌ์šฉ์ž ๋ฐ์ดํ„ฐ: /admin/export/users.csv
  • ๊ถŒํ•œ ๋ฐ์ดํ„ฐ: /admin/export/permissions.csv
  • ๋ฉ”ํŠธ๋ฆญ ๋ฐ์ดํ„ฐ: /admin/export/metrics.json
8. ์–ธ์–ด ์„ค์ • โœจ NEW
  • ์–ธ์–ด ์ „ํ™˜: ์ƒ๋‹จ LanguageSelector ๋“œ๋กญ๋‹ค์šด
  • ์„ธ์…˜ ์œ ์ง€: ๋ธŒ๋ผ์šฐ์ € ์žฌ์‹œ์ž‘ ํ›„์—๋„ ์–ธ์–ด ์„ค์ • ์œ ์ง€
  • ์ „์ฒด ๋ฒˆ์—ญ: 200๊ฐœ ์ด์ƒ UI ์š”์†Œ ๋ฒˆ์—ญ
9. ์‹ค์‹œ๊ฐ„ ์•Œ๋ฆผ โœจ NEW
  • SSE ์ŠคํŠธ๋ฆผ: /admin/events ์—”๋“œํฌ์ธํŠธ
  • ์‹œ์Šคํ…œ ์ด๋ฒคํŠธ: ์˜ค๋ฅ˜, ์‚ฌ์šฉ์ž ์•ก์…˜ ์‹ค์‹œ๊ฐ„ ์•Œ๋ฆผ
  • HTMX ํ†ตํ•ฉ: JavaScript ์—†๋Š” ์‹ค์‹œ๊ฐ„ ์—…๋ฐ์ดํŠธ

๐Ÿ” ๊ถŒํ•œ ๊ด€๋ฆฌ ์‹œ์Šคํ…œ (RBAC)

์—ญํ•  ๊ธฐ๋ฐ˜ ์ ‘๊ทผ ์ œ์–ด

MCP Retriever๋Š” ์™„์ „ํ•œ RBAC(Role-Based Access Control) ์‹œ์Šคํ…œ์„ ๊ตฌํ˜„ํ•ฉ๋‹ˆ๋‹ค:

# ๊ธฐ๋ณธ ์—ญํ•  ๊ตฌ์กฐ
admin:    # ๋ชจ๋“  ๊ถŒํ•œ (์›น๊ฒ€์ƒ‰, ๋ฒกํ„ฐDB, ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค R/W)
โ”œโ”€ user:  # ์ œํ•œ๋œ ๊ถŒํ•œ (์›น๊ฒ€์ƒ‰ R, ๋ฒกํ„ฐDB R/W, ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค R/W)
โ””โ”€ guest: # ์ฝ๊ธฐ ์ „์šฉ (์›น๊ฒ€์ƒ‰ R๋งŒ)

# ๋ณ„์นญ ์—ญํ• 
viewer โ†’ guest   # ์ฝ๊ธฐ ์ „์šฉ ์‚ฌ์šฉ์ž
analyst โ†’ user   # ๋ถ„์„๊ฐ€ (user์™€ ๋™์ผํ•œ ๊ถŒํ•œ)
๋ฆฌ์†Œ์Šค ํƒ€์ž… ๋ฐ ๊ถŒํ•œ
๋ฆฌ์†Œ์Šค ํƒ€์ž…์„ค๋ช…์ง€์› ์•ก์…˜
web_searchTavily ์›น ๊ฒ€์ƒ‰ APIREAD
vector_dbQdrant ๋ฒกํ„ฐ ๋ฐ์ดํ„ฐ๋ฒ ์ด์ŠคREAD, WRITE
databasePostgreSQL ๋ฐ์ดํ„ฐ๋ฒ ์ด์ŠคREAD, WRITE, DELETE
๋„๊ตฌ๋ณ„ ๊ถŒํ•œ ๋งคํŠธ๋ฆญ์Šค
๋„๊ตฌguestuseradmin์„ค๋ช…
health_checkโœ…โœ…โœ…๋ชจ๋“  ์‚ฌ์šฉ์ž ์ ‘๊ทผ ๊ฐ€๋Šฅ
search_webโŒโœ…โœ…์›น ๊ฒ€์ƒ‰ ๊ถŒํ•œ ํ•„์š”
search_vectorsโŒโœ…โœ…๋ฒกํ„ฐ DB ์“ฐ๊ธฐ ๊ถŒํ•œ ํ•„์š”
search_databaseโŒโœ…โœ…๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์“ฐ๊ธฐ ๊ถŒํ•œ ํ•„์š”
search_allโŒโŒโœ…๋ชจ๋“  ๋ฆฌ์†Œ์Šค ์ฝ๊ธฐ ๊ถŒํ•œ ํ•„์š”

๐Ÿš€ ๊ธฐ๋ณธ ๊ด€๋ฆฌ์ž ๊ณ„์ •

Docker ์‹œ์ž‘ ์‹œ ์ž๋™์œผ๋กœ ์ƒ์„ฑ๋˜๋Š” ๊ธฐ๋ณธ ๊ณ„์ •:

ํ•ญ๋ชฉ๊ธฐ๋ณธ๊ฐ’ํ™˜๊ฒฝ๋ณ€์ˆ˜
์ด๋ฉ”์ผadmin@example.comADMIN_EMAIL
๋น„๋ฐ€๋ฒˆํ˜ธAdmin123!ADMIN_PASSWORD
์‚ฌ์šฉ์ž๋ช…System AdminADMIN_USERNAME
์ž๋™ ์ƒ์„ฑtrueAUTO_CREATE_ADMIN

๐Ÿ“ฑ ์ ‘์† ๋ฐ ์‚ฌ์šฉ๋ฒ•

1. ๊ด€๋ฆฌ์ž ๋กœ๊ทธ์ธ
# 1. Auth Gateway ๋กœ๊ทธ์ธ ํŽ˜์ด์ง€ ์ ‘์†
open http://localhost:8000/auth/login-page

# 2. ๊ธฐ๋ณธ ๊ด€๋ฆฌ์ž ๊ณ„์ •์œผ๋กœ ๋กœ๊ทธ์ธ
์ด๋ฉ”์ผ: admin@example.com
๋น„๋ฐ€๋ฒˆํ˜ธ: Admin123!

# 3. Admin UI ์ ‘์†
open http://localhost:8000/admin
2. API๋ฅผ ํ†ตํ•œ ์ ‘๊ทผ
# JWT ํ† ํฐ ํš๋“
TOKEN=$(curl -s -X POST "http://localhost:8000/auth/login" \
  -H "Content-Type: application/json" \
  -d '{"email": "admin@example.com", "password": "Admin123!"}' | \
  jq -r '.access_token')

# Admin API ํ˜ธ์ถœ
curl -H "Authorization: Bearer $TOKEN" \
  "http://localhost:8000/api/v1/admin/users"

๐Ÿ› ๏ธ ๊ด€๋ฆฌ์ž ๊ณ„์ • ์ปค์Šคํ„ฐ๋งˆ์ด์ฆˆ

ํ™˜๊ฒฝ ๋ณ€์ˆ˜๋กœ ์ดˆ๊ธฐ ๊ด€๋ฆฌ์ž ๊ณ„์ •์„ ์„ค์ •ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค:

# .env ํŒŒ์ผ์—์„œ ์„ค์ •
AUTO_CREATE_ADMIN=true                    # ์ž๋™ ์ƒ์„ฑ ์—ฌ๋ถ€
ADMIN_EMAIL=admin@yourdomain.com          # ๊ด€๋ฆฌ์ž ์ด๋ฉ”์ผ
ADMIN_PASSWORD=YourSecurePassword123!     # ๊ด€๋ฆฌ์ž ๋น„๋ฐ€๋ฒˆํ˜ธ  
ADMIN_USERNAME=Your Admin Name            # ๊ด€๋ฆฌ์ž ์ด๋ฆ„

๐Ÿ”— ์ฃผ์š” API ์—”๋“œํฌ์ธํŠธ

์ธ์ฆ ๋ฐ ๊ด€๋ฆฌ

# ์ธ์ฆ
POST /auth/login
POST /auth/register

# ์„ธ์…˜ ๊ด€๋ฆฌ
GET /api/v1/admin/sessions/active
POST /api/v1/admin/users/{user_id}/revoke-tokens

# ๋ฐ์ดํ„ฐ ๋‚ด๋ณด๋‚ด๊ธฐ โœจ NEW
GET /admin/export/users.csv
GET /admin/export/permissions.csv
GET /admin/export/metrics.json

# ๋ถ„์„ ๋ฐ ์•Œ๋ฆผ โœจ NEW
GET /admin/analytics
GET /admin/events (SSE)

# ์–ธ์–ด ์„ค์ • โœจ NEW
POST /admin/change-language

๐Ÿงช ํ…Œ์ŠคํŠธ

์™„๋น„๋œ ํ…Œ์ŠคํŠธ ์‹œ์Šคํ…œ

  • ์ด ํ…Œ์ŠคํŠธ: 250๊ฐœ ์ด์ƒ โœจ ํ™•์žฅ
  • E2E ํ…Œ์ŠคํŠธ: Playwright ๊ธฐ๋ฐ˜ Admin UI ์ž๋™ํ™”
  • ๋‹จ์œ„ ํ…Œ์ŠคํŠธ: 77๊ฐœ ์ปดํฌ๋„ŒํŠธ ํ…Œ์ŠคํŠธ (๊ธฐ์กด 38๊ฐœ + ์ƒˆ๋กœ ์ถ”๊ฐ€ 39๊ฐœ) โœจ NEW
  • ํ†ตํ•ฉ ํ…Œ์ŠคํŠธ: Docker ํ™˜๊ฒฝ ๊ธฐ๋ฐ˜ ์ „์ฒด ์‹œ์Šคํ…œ ๊ฒ€์ฆ

๐ŸŽญ E2E ํ…Œ์ŠคํŠธ ํ™•์žฅ โœจ NEW

์ƒˆ๋กœ ์ถ”๊ฐ€๋œ 4๊ฐœ ํ…Œ์ŠคํŠธ ํŒŒ์ผ (43๊ฐœ ํ…Œ์ŠคํŠธ):

  • test_analytics_dashboard.py - ๋ถ„์„ ๋Œ€์‹œ๋ณด๋“œ ์‹œ๊ฐํ™” ํ…Œ์ŠคํŠธ
  • test_data_export.py - CSV/JSON ๋‚ด๋ณด๋‚ด๊ธฐ ๊ฒ€์ฆ
  • test_internationalization.py - ๋‹ค๊ตญ์–ด ์ „ํ™˜ ํ…Œ์ŠคํŠธ
  • test_real_time_notifications.py - SSE ์‹ค์‹œ๊ฐ„ ์•Œ๋ฆผ ํ…Œ์ŠคํŠธ

๐Ÿงฉ ์ปดํฌ๋„ŒํŠธ ๋‹จ์œ„ ํ…Œ์ŠคํŠธ ํ™•์žฅ โœจ NEW

์ƒˆ๋กœ ์ถ”๊ฐ€๋œ 5๊ฐœ ์ปดํฌ๋„ŒํŠธ ํ…Œ์ŠคํŠธ (39๊ฐœ ํ…Œ์ŠคํŠธ):

  • TestAnalyticsChart - Chart.js ๋ Œ๋”๋ง ๊ฒ€์ฆ
  • TestExportButton - ๋ฐ์ดํ„ฐ ๋‚ด๋ณด๋‚ด๊ธฐ ๋ฒ„ํŠผ ํ…Œ์ŠคํŠธ
  • TestMetricsTable - ๋ฉ”ํŠธ๋ฆญ ํ…Œ์ด๋ธ” ๊ธฐ๋Šฅ ๊ฒ€์ฆ
  • TestNotificationBanner - ์‹ค์‹œ๊ฐ„ ์•Œ๋ฆผ ํ‘œ์‹œ ํ…Œ์ŠคํŠธ
  • TestLanguageSelector - ์–ธ์–ด ์„ ํƒ ๋“œ๋กญ๋‹ค์šด ํ…Œ์ŠคํŠธ

ํ…Œ์ŠคํŠธ ์‹คํ–‰

# ์ „์ฒด ํ…Œ์ŠคํŠธ ์‹คํ–‰
./scripts/run-integration-tests.sh

# E2E ํ…Œ์ŠคํŠธ ์‹คํ–‰
./scripts/run-e2e-tests.sh

# ์ƒˆ๋กœ์šด ๊ธฐ๋Šฅ ํ…Œ์ŠคํŠธ๋งŒ ์‹คํ–‰
docker exec -it mcp-server pytest tests/e2e/test_analytics_dashboard.py -v
docker exec -it mcp-server pytest tests/unit/test_auth/test_components.py::TestAnalyticsChart -v

๐Ÿ“ ํ™˜๊ฒฝ ์„ค์ •

์ดˆ๊ธฐ ์„ค์ • ๊ฐ€์ด๋“œ

  1. ํ™˜๊ฒฝ ๋ณ€์ˆ˜ ํŒŒ์ผ ์ƒ์„ฑ

    cp .env.example .env
    
  2. ํ•„์ˆ˜ API ํ‚ค ์„ค์ •

    • TAVILY_API_KEY: Tavily์—์„œ ๋ฌด๋ฃŒ API ํ‚ค ๋ฐœ๊ธ‰
    • ๋‚˜๋จธ์ง€ ํ‚ค๋Š” ์ž๋™ ์ƒ์„ฑ๋จ (์ˆ˜์ • ๋ถˆํ•„์š”)
  3. Docker Compose ํ™˜๊ฒฝ ๋ณ€์ˆ˜ (์ž๋™ ์„ค์ •)

    # ์„œ๋น„์Šค URL - Docker ๋„คํŠธ์›Œํฌ์—์„œ ์ž๋™ ์„ค์ •
    AUTH_GATEWAY_URL=http://auth-gateway:8000
    MCP_SERVER_URL=http://mcp-server:8001
    
    # ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ํ˜ธ์ŠคํŠธ - ์ปจํ…Œ์ด๋„ˆ ์ด๋ฆ„์œผ๋กœ ์ž๋™ ์„ค์ •
    POSTGRES_HOST=postgres
    QDRANT_HOST=qdrant
    REDIS_HOST=redis
    

์„œ๋ฒ„ ํ”„๋กœํŒŒ์ผ

Docker ํ™˜๊ฒฝ์—์„œ๋Š” ์ž๋™์œผ๋กœ COMPLETE ํ”„๋กœํŒŒ์ผ์ด ์ ์šฉ๋˜์–ด ๋ชจ๋“  ๊ธฐ๋Šฅ์ด ํ™œ์„ฑํ™”๋ฉ๋‹ˆ๋‹ค:

  • JWT ์ธ์ฆ ๋ฐ ๊ถŒํ•œ ๊ด€๋ฆฌ
  • ์ปจํ…์ŠคํŠธ ์ถ”์ 
  • Redis ์บ์‹ฑ
  • ์†๋„ ์ œํ•œ
  • ์„ฑ๋Šฅ ๋ฉ”ํŠธ๋ฆญ

๐Ÿš€ ๋ฐฐํฌ

Docker ์šด์˜ ๋ช…๋ น์–ด

# ์„œ๋น„์Šค ์‹œ์ž‘/์ค‘์ง€
./scripts/start-docker.sh
./scripts/stop-docker.sh

# ๋กœ๊ทธ ํ™•์ธ
./scripts/logs-docker.sh -f
./scripts/logs-docker.sh mcp-server -f

# ์ปจํ…Œ์ด๋„ˆ ์ ‘์†
docker exec -it mcp-postgres psql -U mcp_user -d mcp_retriever
docker exec -it mcp-redis redis-cli

๐Ÿ“ˆ ํ”„๋กœ์ ํŠธ ํ˜„ํ™ฉ

๐Ÿ” ๊ฒ€์ƒ‰ ๋ฐ ๋ฐ์ดํ„ฐ ์ฒ˜๋ฆฌ

  • ํ†ตํ•ฉ ๊ฒ€์ƒ‰ (์›น/๋ฒกํ„ฐ/๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค)
  • Redis ์บ์‹ฑ ๋ฐ ๋น„๋™๊ธฐ ์ฒ˜๋ฆฌ

๐Ÿ” ๋ณด์•ˆ ๋ฐ ์ธ์ฆ

  • JWT + RBAC ๊ถŒํ•œ ๊ด€๋ฆฌ
  • ์„ธ์…˜ ์ถ”์  ๋ฐ ํ† ํฐ ๋ฌดํšจํ™”

๐Ÿ–ฅ๏ธ Admin UI (FastHTML + HTMX)

  • 14๊ฐœ ์žฌ์‚ฌ์šฉ ์ปดํฌ๋„ŒํŠธ (๊ธฐ์กด 9๊ฐœ + ํ™•์žฅ 5๊ฐœ) โœจ ํ™•์žฅ
  • ๋ถ„์„ ๋Œ€์‹œ๋ณด๋“œ (Chart.js ์‹œ๊ฐํ™”) โœจ NEW
  • ๋ฐ์ดํ„ฐ ๋‚ด๋ณด๋‚ด๊ธฐ (CSV/JSON) โœจ NEW
  • ๋‹ค๊ตญ์–ด ์ง€์› (ํ•œ๊ตญ์–ด/์˜์–ด) โœจ NEW
  • ์‹ค์‹œ๊ฐ„ ์•Œ๋ฆผ (SSE ๊ธฐ๋ฐ˜) โœจ NEW

๐Ÿงช ํ…Œ์ŠคํŠธ ๋ฐ ํ’ˆ์งˆ ๋ณด์ฆ

  • 250๊ฐœ ์ด์ƒ ํ…Œ์ŠคํŠธ (๊ธฐ์กด 220๊ฐœ โ†’ ํ™•์žฅ) โœจ ํ™•์žฅ
  • 77๊ฐœ ์ปดํฌ๋„ŒํŠธ ๋‹จ์œ„ ํ…Œ์ŠคํŠธ (38๊ฐœ โ†’ 77๊ฐœ) โœจ ํ™•์žฅ
  • 43๊ฐœ E2E ํ…Œ์ŠคํŠธ ์ถ”๊ฐ€ (์ƒˆ ๊ธฐ๋Šฅ ์ž๋™ํ™”) โœจ NEW
  • Docker ํ†ตํ•ฉ ํ…Œ์ŠคํŠธ ์™„๋น„

๐Ÿš€ ์ธํ”„๋ผ ๋ฐ ๋ฐฐํฌ

  • Docker Compose ์™„์ „ ์ปจํ…Œ์ด๋„ˆํ™”
  • ํ†ตํ•ฉ ์„œ๋ฒ„ ํ”„๋กœํŒŒ์ผ ๋ฐ ํ—ฌ์Šค ์ฒดํฌ
  • ์ž๋™ํ™” ์Šคํฌ๋ฆฝํŠธ (๋ฐฐํฌ/ํ…Œ์ŠคํŠธ/๋กœ๊ทธ)