RAG MCP Claude
MCP (Model Context Protocol) Server สำหรับ Semantic Search บน YouTube transcripts ใช้ OpenAI Embeddings + ChromaDB
ต่างจาก keyword search ทั่วไป (FTS5) ที่ค้นได้เฉพาะ "คำตรงกัน" RAG ค้นหาด้วย ความหมาย ได้ เช่น ค้นว่า "วิธีฝึกจิตให้เข้มแข็ง" จะเจอข้อความเกี่ยวกับ "สมาธิ" แม้ไม่มีคำว่า "ฝึกจิต" ในข้อความเลย
ดูรายละเอียดเปรียบเทียบ RAG vs Keyword Search ที่ docs/concept-comparison.md
Features
- rag_search - ค้นหาด้วย semantic similarity (ความหมายใกล้เคียง)
- rag_ingest - นำ transcript / text เข้า knowledge base
- rag_list_collections - แสดง collections พร้อมสถิติ
- rag_delete - ลบข้อมูลออกจาก knowledge base
Architecture
rag-mcp-claude
Port: 3020
┌──────────────────────────────────────────────────┐
│ │
│ ┌──────────┐ ┌─────────────┐ │
│ │ Ingest │───▶│ Text Splitter│ │
│ │ Pipeline │ │ (chunk 500 │ │
│ └──────────┘ │ overlap 50) │ │
│ └──────┬──────┘ │
│ ▼ │
│ ┌───────────────┐ │
│ │ OpenAI API │ │
│ │ text-embedding │ │
│ ┌──────┐ │ -3-small │ │
│ │Search│─────▶│ (1536 dims) │ │
│ └──────┘ └───────┬───────┘ │
│ ▼ │
│ ┌───────────────┐ │
│ │ ChromaDB │ │
│ │ Vector Store │ │
│ │ (cosine sim) │ │
│ └───────────────┘ │
│ │
└──────────────────────────────────────────────────┘Quick Start
1. สร้าง OpenAI API Key
ไปที่ https://platform.openai.com/api-keys แล้วสร้าง key
2. สร้าง .env
cp .env.example .env
# แก้ไข .env ใส่ API keyOPENAI_API_KEY=sk-your-api-key-here3. Deploy ด้วย Docker
docker compose up -dจะ start 2 containers:
rag-chromadb- Vector database (port 8100)rag-mcp-claude- MCP server (port 3020)
4. ตรวจสอบ
curl http://localhost:3020/health5. Ingest transcript ตัวอย่าง
# Ingest ทุกไฟล์ใน data/sources/
node src/cli-ingest.js --dir ./data/sources
# Ingest ไฟล์เดียว
node src/cli-ingest.js data/sources/SF6Tskjx6Qw.mdดูคู่มือ ingest ละเอียดที่ docs/guide-ingest.md
MCP Client Configuration
เพิ่มใน .mcp.json หรือ Claude Desktop config:
{
"mcpServers": {
"rag": {
"url": "http://localhost:3020/mcp"
}
}
}Project Structure
rag-mcp-claude/
├── src/
│ ├── server-sse.js # Streamable HTTP transport server (port 3020)
│ ├── index.js # Stdio transport server
│ ├── config.js # Configuration
│ ├── embeddings.js # OpenAI embedding API wrapper
│ ├── vectorstore.js # ChromaDB operations (CRUD)
│ ├── ingest.js # Chunk → Embed → Store pipeline
│ ├── search.js # Semantic search
│ └── cli-ingest.js # CLI batch ingest tool
├── data/
│ └── sources/ # Transcript files (.md)
├── docs/
│ ├── concept-comparison.md # RAG vs FTS5 comparison
│ ├── guide-ingest.md # คู่มือ ingest ข้อมูล
│ ├── guide-search.md # คู่มือ search
│ └── guide-openai-key.md # คู่มือสร้าง OpenAI API Key
├── Dockerfile
├── docker-compose.yml
├── .env.example
└── package.jsonAPI Endpoints
| Endpoint | Method | Description |
|---|---|---|
/mcp | POST | MCP message endpoint (Streamable HTTP) |
/mcp | GET | SSE stream endpoint |
/mcp | DELETE | Session termination |
/health | GET | Health check + status |
MCP Tools Reference
rag_search
ค้นหาจาก knowledge base ด้วย semantic search
| Parameter | Type | Required | Default | Description |
|---|---|---|---|---|
query | string | Yes | - | คำค้นหา (ภาษาธรรมชาติ) |
collection | string | No | youtube_transcripts | ชื่อ collection |
top_k | number | No | 5 | จำนวนผลลัพธ์ (max 20) |
Response:
{
"query": "สมาธิเปลี่ยนสมองได้อย่างไร",
"collection": "youtube_transcripts",
"totalResults": 3,
"sources": [
{
"source": "SF6Tskjx6Qw",
"title": "Ep0 - Journey Within: สำรวจโลกในหัวคุณ",
"url": "https://www.youtube.com/watch?v=SF6Tskjx6Qw",
"channel": "The Mind Architect",
"chunks": [
{
"text": "สมาธิทำให้สมองส่วน Prefrontal Cortex หนาขึ้น...",
"score": 0.892,
"chunk_index": 3
}
]
}
]
}rag_ingest
นำข้อมูลเข้า knowledge base
| Parameter | Type | Required | Description |
|---|---|---|---|
file_path | string | No* | Path ของ transcript markdown file (.md) |
text | string | No* | ข้อความที่จะ ingest โดยตรง |
source | string | No | ชื่อแหล่งข้อมูล (เช่น video ID) |
title | string | No | ชื่อเรื่อง |
collection | string | No | ชื่อ collection |
*ต้องระบุอย่างน้อย file_path หรือ text
rag_list_collections
แสดง collections ทั้งหมดพร้อมจำนวน documents
Response:
{
"total": 1,
"collections": [
{ "name": "youtube_transcripts", "count": 45 }
]
}rag_delete
ลบข้อมูลออกจาก knowledge base
| Parameter | Type | Required | Description |
|---|---|---|---|
collection | string | Yes | ชื่อ collection |
source | string | No | ลบ documents จาก source นี้ |
delete_collection | boolean | No | ลบทั้ง collection |
Environment Variables
| Variable | Default | Description |
|---|---|---|
PORT | 3020 | Server port |
HOST | 0.0.0.0 | Server host |
OPENAI_API_KEY | (required) | OpenAI API key |
EMBEDDING_MODEL | text-embedding-3-small | OpenAI embedding model |
CHROMA_URL | http://localhost:8100 | ChromaDB URL |
CHROMA_COLLECTION | youtube_transcripts | Default collection name |
CHUNK_SIZE | 500 | Tokens per chunk |
CHUNK_OVERLAP | 50 | Overlap tokens between chunks |
DEFAULT_TOP_K | 5 | Default search results |
Docker Details
| Container | Image | Port | Description |
|---|---|---|---|
rag-mcp-claude | node:22-slim (custom) | 3020 | MCP server (Streamable HTTP) |
rag-chromadb | chromadb/chroma:latest | 8100 | Vector database |
- ChromaDB data persisted in Docker volume
chroma-data - RAG server ใช้
network_mode: hostเพื่อเข้าถึง ChromaDB - OpenAI API Key ส่งผ่าน
.envfile
Data Flow
YouTube Video
│ (youtube-mcp-claude ดึง transcript)
▼
data/sources/*.md ← Transcript files
│
▼ (rag_ingest / cli-ingest.js)
┌────────────────┐
│ 1. Parse │ แยก metadata + transcript text
│ 2. Chunk │ ตัดเป็นท่อนๆ (500 tokens, overlap 50)
│ 3. Embed │ OpenAI API → vector [1536 dims]
│ 4. Store │ ChromaDB (cosine similarity index)
└────────────────┘
│
▼ (rag_search)
┌────────────────┐
│ 1. Embed query │ แปลงคำถามเป็น vector
│ 2. Search │ หา vectors ที่ใกล้เคียงที่สุด
│ 3. Return │ ส่งกลับ chunks + metadata + score
└────────────────┘Cost Estimation (OpenAI)
| Model | Price | 1 transcript (~10K tokens) | 1 search query |
|---|---|---|---|
text-embedding-3-small | $0.02 / 1M tokens | ~$0.0002 (< 1 สตางค์) | ~$0.000002 |
text-embedding-3-large | $0.13 / 1M tokens | ~$0.0013 | ~$0.000013 |
ใช้ text-embedding-3-small ราคาถูกมาก ingest transcript 1,000 วิดีโอ ≈ $0.20 (7 บาท)
Related Projects
| Server | Port | Description |
|---|---|---|
| youtube-mcp-claude | 3010 | YouTube transcript extraction |
| rag-mcp-claude | 3020 | RAG semantic search |
| chat-mcp-claude | 3001 | Chat history (FTS5) |
| thudong-mcp-claude | 3002 | Survey analysis (FTS5) |
