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 key
OPENAI_API_KEY=sk-your-api-key-here
3. 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/health
5. 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.json
API 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: ``json { "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: ``json { "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) |











