YouTube Summary MCP Server
by dEitY719
README.md
# YouTube Summary MCP Server
A powerful MCP (Model Context Protocol) server for summarizing YouTube videos with transcript fetching, intelligent summarization, key point extraction, and metadata retrieval. Built with **FastMCP** for simple, decorator-based tool registration and automatic MCP protocol handling.
**[한국어 문서](README_ko.md) | English Documentation**
---
## 📋 프로젝트 개요
이 프로젝트는 MCP(Model Context Protocol)를 통해 YouTube 비디오의 트랜스크립트를 가져오고, 자동으로 요약하며, 핵심 포인트를 추출하는 서버입니다. Claude Desktop, Cursor 등 MCP를 지원하는 AI 클라이언트에서 YouTube 비디오를 직접 분석할 수 있습니다.
---
## 🎯 주요 기능
- **📝 트랜스크립트 추출**: YouTube 비디오에서 자막 텍스트 추출 (4가지 URL 형식 지원)
- **📊 지능형 요약**: 다양한 길이의 요약 생성 (짧음, 중간, 긴 버전)
- **✨ 핵심 포인트 추출**: TF-IDF 기반 자동 핵심 문장 추출
- **🎬 메타데이터 조회**: 비디오 제목, 채널, 조회수 등 정보 제공
- **🌍 다국어 지원**: 7개 언어 지원 (영어, 한국어, 스페인어, 프랑스어, 독일어, 일본어, 중국어)
- **⚡ FastMCP 프레임워크**: 데코레이터 기반의 간단한 구현
- **🔒 오류 처리**: 포괄적인 에러 처리 및 로깅
- **🏗️ SOLID 원칙**: 확장 가능한 아키텍처
---
## 🏗️ 아키텍처
### 시스템 구성도
```
┌─────────────────────────┐ ┌──────────────────────┐ ┌─────────────┐
│ AI Client │◄────►│ MCP Server │◄────►│ YouTube │
│ (Claude, Cursor, etc) │ │ (FastMCP Python) │ │ API │
└─────────────────────────┘ └──────────────────────┘ └─────────────┘
│
▼
┌──────────────────┐
│ Core Components │
│ - Transcript API │
│ - Summarizer │
│ - Metadata │
└──────────────────┘
```
### 핵심 컴포넌트
1. **MCP Server Core** (`server.py`)
- MCP 프로토콜 구현 (FastMCP 사용)
- 클라이언트와의 통신 관리
- 요청/응답 처리
2. **Transcript Retriever** (`transcript_retriever.py`)
- YouTube 트랜스크립트 추출
- 다양한 URL 형식 지원
- 언어 자동 감지 및 폴백
3. **Summary Generator** (`summary_generator.py`)
- TF-IDF 기반 텍스트 요약
- 핵심 포인트 자동 추출
- 다국어 스톱워드 지원
4. **Metadata Extractor** (`metadata_extractor.py`)
- 비디오 메타데이터 추출
- 썸네일 URL 생성
5. **Config Manager** (`config_manager.py`)
- Pydantic 기반 설정 관리
- 환경 변수 지원
---
## 🛠️ 기술 스택
| 카테고리 | 기술 |
|---------|------|
| **언어** | Python 3.10+ |
| **MCP 프레임워크** | FastMCP (Model Context Protocol) |
| **YouTube 처리** | youtube-transcript-api |
| **자연언어처리** | NLTK (TF-IDF, stopwords) |
| **설정 관리** | Pydantic, Pydantic Settings |
| **패키지 관리** | uv |
| **테스트** | pytest |
| **타입 체킹** | mypy |
| **코드 포매팅** | black, ruff |
---
## 📁 프로젝트 구조
```
youtube-summary-mcp/
├── youtube_summary_mcp/ # 메인 패키지
│ ├── __init__.py # 패키지 초기화
│ ├── server.py # FastMCP 서버 구현 (stdio)
│ ├── main.py # 진입점 (stdio)
│ ├── server_sse.py # FastMCP 서버 구현 (SSE)
│ ├── main_sse.py # 진입점 (SSE)
│ ├── asgi.py # ASGI 앱 (Uvicorn/Gunicorn용)
│ ├── config_manager.py # 설정 관리 (Pydantic)
│ ├── transcript_retriever.py # 트랜스크립트 추출
│ ├── summary_generator.py # 텍스트 요약 엔진
│ └── metadata_extractor.py # 메타데이터 추출
│
├── tests/ # 테스트 스위트
│ ├── test_config_manager.py # 설정 테스트
│ ├── test_transcript_retriever.py
│ ├── test_summary_generator.py
│ └── test_metadata_extractor.py
│
├── pyproject.toml # 프로젝트 설정
├── .env.example # 환경 변수 템플릿
├── .gitignore # Git 무시 파일
└── README.md # 이 파일
```
---
## 🚀 설치 및 설정
### 1️⃣ 사전 요구사항
```bash
# 필수
- Python 3.10 이상
- uv 패키지 관리자
# 선택사항 (향상된 메타데이터를 위해)
- YouTube Data API Key
```
### 2️⃣ 의존성 설치
```bash
# 프로젝트 디렉토리로 이동
cd youtube-summary-mcp
# 의존성 설치 및 환경 구성
uv sync
```
**설치되는 주요 패키지:**
- `mcp>=0.1.0` - Model Context Protocol
- `youtube-transcript-api>=0.6.1` - YouTube 트랜스크립트
- `pydantic>=2.0.0` - 데이터 검증
- `nltk>=3.9.2` - 자연언어처리
### 3️⃣ 환경 변수 설정 (선택사항)
`.env.example`을 복사하여 `.env` 파일을 생성합니다:
```bash
cp .env.example .env
```
**`.env` 파일 내용:**
```bash
# 로깅 설정
LOG_LEVEL=INFO # DEBUG, INFO, WARNING, ERROR, CRITICAL
# 요약 설정
SUMMARY_RATIO=0.35 # 원본의 35% 길이로 요약
# 서버 설정
SERVER_NAME=YouTube Summary MCP
SERVER_VERSION=0.1.0
```
---
## ⚡ 빠른 설정 (Quick Setup)
설정 파일만 수정하면 바로 사용 가능합니다!
### Claude Desktop 설정 (claude_desktop_config.json)
**Windows:**
```json
{
"mcpServers": {
"youtube-summary": {
"command": "python",
"args": ["-m", "youtube_summary_mcp.main"],
"env": {
"PYTHONPATH": "C:\\path\\to\\youtube-summary-mcp"
}
}
}
}
```
**macOS/Linux:**
```json
{
"mcpServers": {
"youtube-summary": {
"command": "python3",
"args": ["-m", "youtube_summary_mcp.main"],
"env": {
"PYTHONPATH": "/path/to/youtube-summary-mcp"
}
}
}
}
```
### Cursor 설정 (cursor_mcp_config.json 또는 settings.json)
```json
{
"mcp": {
"servers": [
{
"id": "youtube-summary",
"name": "YouTube Summary",
"type": "command",
"command": "python",
"args": ["-m", "youtube_summary_mcp.main"],
"env": {
"PYTHONPATH": "/path/to/youtube-summary-mcp"
}
}
]
}
}
```
**설정 파일 위치:**
- **Claude Desktop (Windows)**: `C:\Users\[사용자명]\AppData\Roaming\Claude\claude_desktop_config.json`
- **Claude Desktop (macOS)**: `~/Library/Application Support/Claude/claude_desktop_config.json`
- **Claude Desktop (Linux)**: `~/.config/Claude/claude_desktop_config.json`
- **Cursor (모든 OS)**: 설정 → MCP 섹션 또는 `~/.config/Cursor/User/settings.json`
> 💡 **팁**: `/path/to/youtube-summary-mcp` 부분을 실제 프로젝트 경로로 바꾸세요!
---
## 🌐 SSE 전송 방식 설정
표준 stdio 방식 외에도 SSE(Server-Sent Events) 방식으로 MCP 서버를 실행할 수 있습니다. SSE는 HTTP 기반의 연결 방식으로, 웹 환경이나 특정 MCP 클라이언트에 유용합니다.
### SSE 방식 직접 실행 (권장)
FastMCP가 내장된 Uvicorn 서버를 자동으로 시작합니다.
```bash
# 기본값 (0.0.0.0:10719)
uv run youtube-summary-mcp-sse
# 또는 모듈로 직접 실행
uv run python -m youtube_summary_mcp.main_sse
```
### 커스텀 호스트/포트 설정
```bash
# 환경 변수를 통한 설정
MCP_SSE_HOST="127.0.0.1" MCP_SSE_PORT="8080" uv run youtube-summary-mcp-sse
# 여러 변수 설정
export MCP_SSE_HOST="0.0.0.0"
export MCP_SSE_PORT="9000"
export MCP_SSE_PATH="/mcp" # SSE 엔드포인트 경로 (기본값: /sse)
uv run youtube-summary-mcp-sse
```
**지원 환경 변수:**
- `MCP_SSE_HOST`: 바인드할 호스트 (기본값: `0.0.0.0`)
- `MCP_SSE_PORT`: 바인드할 포트 (기본값: `10719`)
- `MCP_SSE_PATH`: SSE 엔드포인트 경로 (기본값: `/sse`)
### ASGI 서버로 실행 (고급)
FastMCP 앱을 ASGI 서버(Uvicorn, Gunicorn 등)로 실행할 수도 있습니다:
```bash
# Uvicorn으로 실행
uvicorn youtube_summary_mcp.asgi:app --host 0.0.0.0 --port 10719
# 환경 변수와 함께
MCP_SSE_HOST="127.0.0.1" MCP_SSE_PORT="8080" uvicorn youtube_summary_mcp.asgi:app
```
### Claude Desktop 설정 (SSE 방식)
#### 설정 방법
1. **SSE 서버 시작:**
```bash
# 터미널에서
uv run youtube-summary-mcp-sse
```
서버가 `http://0.0.0.0:10719/sse`에서 실행됩니다.
2. **Claude Desktop 설정 파일 수정:**
**Windows:**
```json
{
"mcpServers": {
"youtube-summary-sse": {
"url": "http://localhost:10719/sse",
"disabled": false,
"alwaysAllow": []
}
}
}
```
**macOS/Linux:**
```json
{
"mcpServers": {
"youtube-summary-sse": {
"url": "http://localhost:10719/sse",
"disabled": false,
"alwaysAllow": []
}
}
}
```
3. **Claude Desktop 재시작**
### stdio vs SSE 비교
| 항목 | stdio | SSE |
|------|-------|-----|
| 전송 방식 | 표준 입출력 | HTTP SSE |
| 설정 방법 | command 기반 | URL 기반 |
| 포트 바인딩 | 필요 없음 | 필요함 |
| 시작 방식 | 자동 | 수동 (별도 터미널) |
| 성능 | 빠름 | 안정적 |
| 웹 환경 | 미지원 | 지원 |
| 추천 사용 처 | 대부분의 경우 | 웹 기반 클라이언트 |
> **팁**: 둘 다 동시에 실행 가능합니다. stdio는 항상 자동 시작되고, SSE는 필요할 때 수동으로 시작하면 됩니다!
---
## 🔧 MCP 클라이언트 설정 (매우 중요!)
### 📌 MCP란?
**Model Context Protocol (MCP)**는 AI 모델이 외부 도구와 리소스에 접근하는 표준 방식입니다. 클라이언트 설정을 통해 Claude, Cursor 등이 YouTube Summary MCP 서버에 접근할 수 있습니다.
### ⚙️ Claude Desktop 설정
#### Windows
1. **Claude Desktop 설정 파일 열기:**
```
C:\Users\[사용자명]\AppData\Roaming\Claude\claude_desktop_config.json
```
2. **다음 내용 추가 또는 수정:**
```json
{
"mcpServers": {
"youtube-summary": {
"command": "python",
"args": ["-m", "youtube_summary_mcp.main"],
"env": {
"PYTHONPATH": "C:\\path\\to\\youtube-summary-mcp"
}
}
}
}
```
**또는 절대 경로 사용:**
```json
{
"mcpServers": {
"youtube-summary": {
"command": "C:\\Python310\\python.exe",
"args": [
"C:\\path\\to\\youtube-summary-mcp\\youtube_summary_mcp\\main.py"
]
}
}
}
```
#### macOS
1. **Claude Desktop 설정 파일 열기:**
```bash
~/Library/Application\ Support/Claude/claude_desktop_config.json
```
2. **다음 내용 추가 또는 수정:**
```json
{
"mcpServers": {
"youtube-summary": {
"command": "python3",
"args": ["-m", "youtube_summary_mcp.main"],
"env": {
"PYTHONPATH": "/path/to/youtube-summary-mcp"
}
}
}
}
```
#### Linux
1. **Claude Desktop 설정 파일 열기:**
```bash
~/.config/Claude/claude_desktop_config.json
```
2. **다음 내용 추가 또는 수정:**
```json
{
"mcpServers": {
"youtube-summary": {
"command": "python3",
"args": ["-m", "youtube_summary_mcp.main"],
"env": {
"PYTHONPATH": "/home/username/path/to/youtube-summary-mcp"
}
}
}
}
```
3. **Claude Desktop 재시작**
---
### 🎨 Cursor IDE 설정
#### Windows/macOS/Linux 통일
1. **Cursor 설정 파일 열기:**
- **Windows**: `C:\Users\[사용자명]\AppData\Roaming\Cursor\User\settings.json`
- **macOS**: `~/Library/Application Support/Cursor/User/settings.json`
- **Linux**: `~/.config/Cursor/User/settings.json`
2. **다음 설정 추가:**
```json
{
"mcp": {
"servers": [
{
"id": "youtube-summary",
"name": "YouTube Summary",
"type": "command",
"command": "python",
"args": ["-m", "youtube_summary_mcp.main"],
"env": {
"PYTHONPATH": "/path/to/youtube-summary-mcp"
}
}
]
}
}
```
---
### 📌 VS Code (with MCP Extension)
1. **VS Code MCP 확장 설치:**
- "Model Context Protocol" 검색하여 설치
2. **VS Code 설정 열기** (`Ctrl+,` 또는 `Cmd+,`)
3. **settings.json 수정:**
```json
{
"mcp.servers": {
"youtube-summary": {
"command": "python",
"args": ["-m", "youtube_summary_mcp.main"],
"env": {
"PYTHONPATH": "/path/to/youtube-summary-mcp"
}
}
}
}
```
---
### 🔍 설정 확인 및 문제 해결
#### 1. 서버가 정상적으로 시작하는지 확인
```bash
# 터미널에서 직접 실행하여 로그 확인
uv run youtube-summary-mcp
```
정상이면 다음과 같은 로그가 나타납니다:
```
2025-10-28 14:59:48,114 - youtube_summary_mcp.server - INFO - Initialized YouTube Summary MCP v0.1.0
```
#### 2. 설정 파일 경로 확인
```bash
# Windows (PowerShell)
$env:APPDATA\Claude\claude_desktop_config.json
# macOS/Linux
cat ~/Library/Application\ Support/Claude/claude_desktop_config.json
# 또는
cat ~/.config/Claude/claude_desktop_config.json
```
#### 3. Python 경로 확인
```bash
# Python이 올바른 버전인지 확인
python --version # Python 3.10 이상 필요
# uv를 통한 실행
which uv # uv 설치 위치 확인
uv python list # 설치된 Python 버전 확인
```
#### 4. Claude Desktop에서 도구 표시 확인
- Claude Desktop을 시작한 후 채팅창에서 "🔧 도구" 버튼 클릭
- "YouTube Summary" 서버가 표시되는지 확인
- 각 도구 (get_transcript, summarize_video 등)가 나열되는지 확인
---
## 📊 사용 가능한 도구 (Tools)
### 1. **get_transcript** 📝
YouTube 비디오의 트랜스크립트를 추출합니다.
**매개변수:**
- `video_url` (필수): YouTube URL 또는 비디오 ID
- `language` (선택): 언어 코드 (기본값: "en")
**지원 URL 형식:**
```
https://www.youtube.com/watch?v=HQU2vbsbXkU
https://youtu.be/HQU2vbsbXkU
https://www.youtube.com/embed/HQU2vbsbXkU
HQU2vbsbXkU (ID만)
```
**지원 언어:**
- `en` - 영어
- `ko` - 한국어
- `es` - 스페인어
- `fr` - 프랑스어
- `de` - 독일어
- `ja` - 일본어
- `zh` - 중국어
**응답 예시:**
```json
{
"success": true,
"transcript": "Never gonna give you up, never gonna let you down..."
}
```
---
### 2. **summarize_video** 📊
YouTube 비디오의 자동 요약을 생성합니다.
**매개변수:**
- `video_url` (필수): YouTube URL 또는 비디오 ID
- `summary_length` (선택): 요약 길이 (기본값: "medium")
- `short` - 원본의 약 20%
- `medium` - 원본의 약 35%
- `long` - 원본의 약 50%
- `language` (선택): 언어 코드 (기본값: "en")
**응답 예시:**
```json
{
"success": true,
"summary": "이 영상은 유명한 팝 뮤직 비디오입니다...",
"length": "medium"
}
```
---
### 3. **extract_key_points** ✨
비디오 트랜스크립트에서 핵심 포인트를 자동 추출합니다.
**매개변수:**
- `video_url` (필수): YouTube URL 또는 비디오 ID
- `num_points` (선택): 추출할 핵심 포인트 개수 (기본값: 5)
- `language` (선택): 언어 코드 (기본값: "en")
**응답 예시:**
```json
{
"success": true,
"key_points": [
"Never gonna give you up",
"Never gonna let you down",
"Never gonna desert you"
],
"count": 3
}
```
---
### 4. **get_video_metadata** 🎬
YouTube 비디오의 메타데이터를 조회합니다.
**매개변수:**
- `video_url` (필수): YouTube URL 또는 비디오 ID
**응답 예시:**
```json
{
"success": true,
"metadata": "Video ID: HQU2vbsbXkU\nTitle: Rick Astley - Never Gonna Give You Up (Official Video)\nChannel: Unknown\nViews: None"
}
```
---
## 💻 사용 예제
### Claude Desktop에서 사용
1. **Claude Desktop 열기**
2. **새로운 채팅 시작**
3. **대화창에 요청:**
```
"이 비디오의 요약을 만들어줄 수 있을까?
https://www.youtube.com/watch?v=HQU2vbsbXkU"
```
Claude가 자동으로 YouTube Summary MCP 도구를 사용하여 비디오를 분석합니다.
### Cursor에서 사용
1. **Cursor 편집기 열기**
2. **chat.md 또는 새로운 파일 생성**
3. **MCP 채팅 시작**
4. **다음과 같이 요청:**
```
"YouTube 비디오를 요약해줄 수 있을까?
https://youtu.be/HQU2vbsbXkU
핵심 포인트 5개도 함께 추출해줘."
```
---
## 🔒 보안 및 개인정보
- **로컬 처리**: 모든 데이터는 로컬에서만 처리됩니다
- **no API Key 필요**: YouTube 트랜스크립트 API는 무료로 사용 가능합니다
- **데이터 캐싱 안 함**: 기본적으로 트랜스크립트 캐싱을 하지 않습니다
- **로깅**: 민감한 정보는 로그에 기록되지 않습니다
---
## 🧪 테스트
```bash
# 모든 테스트 실행
uv run pytest tests/
# 특정 테스트 파일 실행
uv run pytest tests/test_summary_generator.py -v
# 커버리지와 함께 실행
uv run pytest tests/ --cov=youtube_summary_mcp
```
---
## 🔧 개발
### 코드 스타일
```bash
# 코드 포매팅
uv run black youtube_summary_mcp/ tests/
# Linting
uv run ruff check youtube_summary_mcp/ tests/
# 타입 체킹
uv run mypy youtube_summary_mcp/
```
---
## 📈 성능 정보
| 작업 | 소요 시간 |
|------|---------|
| 서버 시작 | ~1.8초 |
| 트랜스크립트 추출 | 5-10초 (비디오 길이에 따라) |
| 요약 생성 | ~1초 |
| 핵심 포인트 추출 | ~0.5초 |
| 메타데이터 조회 | ~2초 |
---
## 🐛 문제 해결
### 서버가 시작되지 않는 경우
```bash
# 1. 직접 실행하여 에러 메시지 확인
uv run youtube-summary-mcp
# 2. Python 버전 확인 (3.10 이상 필요)
python --version
# 3. 의존성 재설치
uv sync --refresh
```
### "Tool not found" 오류
- Claude Desktop/Cursor를 완전히 종료 후 재시작
- 설정 파일의 JSON 형식 확인 (쉼표, 따옴표 등)
### 트랜스크립트를 가져올 수 없음
- 비디오에 자막이 있는지 확인
- 인기 있는 비디오는 대부분 자막이 있습니다
- 정확한 URL 형식 사용
---
## 📚 문서
더 자세한 정보는 다음 파일을 참고하세요:
- [FASTMCP_REFACTORING.md](FASTMCP_REFACTORING.md) - FastMCP로의 마이그레이션 상세 보고서
- [QUICKSTART.md](QUICKSTART.md) - 5분 빠른 시작 가이드
- [USE_CLIENT.md](USE_CLIENT.md) - 클라이언트 사용법
- [DEVELOPMENT.md](DEVELOPMENT.md) - 개발자 가이드
---
## 📋 지원 언어 및 형식
### 언어
- 영어, 한국어, 스페인어, 프랑스어, 독일어, 일본어, 중국어
### YouTube URL 형식
- 표준: `https://www.youtube.com/watch?v=VIDEO_ID`
- 단축: `https://youtu.be/VIDEO_ID`
- 임베드: `https://www.youtube.com/embed/VIDEO_ID`
- ID만: `VIDEO_ID`
### 요약 길이
- 짧음 (20%), 중간 (35%), 긴 버전 (50%)
---
## 🎓 버전 정보
- **현재 버전**: 0.2.0 (FastMCP)
- **이전 버전**: 0.1.0 (Low-level MCP)
- **상태**: 🟢 Production Ready
---
## 📝 라이선스
MIT License - 자유롭게 사용, 수정, 배포 가능합니다.
---
## 🤝 기여
버그 리포트, 기능 요청, 풀 리퀘스트를 환영합니다!
---
## 📞 지원
문제가 발생하면:
1. 문서를 다시 확인하세요
2. 에러 로그를 확인하세요
3. 설정 파일 형식을 검증하세요
---
**Happy Summarizing! 🚀**
TDQS
A3.9/5.0
Scored across 4 tools
Disambiguation5/5
Each tool targets a distinct output type: transcript, summary, key points, and metadata. There is no overlap in purpose, and the descriptions clearly differentiate them.
Naming Consistency5/5
All tools follow a consistent verb_noun pattern (get_transcript, summarize_video, extract_key_points, get_video_metadata) using snake_case. The naming is uniform and predictable.
Tool Count5/5
With 4 tools, the server is well-scoped for a YouTube summary MCP. Each tool covers a fundamental operation without unnecessary bloat or thinness.
Completeness5/5
The toolset provides a complete lifecycle for the stated purpose: fetching transcript, generating summary, extracting points, and retrieving metadata. No obvious gaps exist for a summary-focused server.
Maintenance
ActivityInactive
ResponsivenessNo issues