# YouTube Research MCP [![Tests](https://github.com/lee-s-dev/youtube-research-mcp/actions/workflows/tests.yml/badge.svg)](https://github.com/lee-s-dev/youtube-research-mcp/actions/workflows/tests.yml) [![PyPI](https://img.shields.io/pypi/v/youtube-research-mcp)](https://pypi.org/project/youtube-research-mcp/) [πŸ‡ΊπŸ‡Έ English](README.en.md) > ## μœ νŠœλΈŒμ— μžˆλŠ” λͺ¨λ“  정보λ₯Ό β€” μžλ§‰, λŒ“κΈ€, 채널 β€” AI λ¦¬μ„œμΉ˜ μ†ŒμŠ€λ‘œ. AIμ—κ²Œ μš”μ²­λ§Œ ν•˜λ©΄ β€” μžλ§‰ μˆ˜μ§‘, λŒ“κΈ€ μ—¬λ‘  뢄석, μ—¬λŸ¬ μ˜μƒ λΉ„κ΅κΉŒμ§€ μ „λΆ€ AIκ°€ 직접 μ²˜λ¦¬ν•©λ‹ˆλ‹€. **API ν‚€ 없이도 μžλ§‰Β·μ±„λ„ 뢄석을 μ¦‰μ‹œ μ‚¬μš©ν•  수 μžˆμŠ΅λ‹ˆλ‹€.** --- ## μ–΄λ””μ„œ μ“Έ 수 μžˆλ‚˜μš”? MCP(Model Context Protocol)λ₯Ό μ§€μ›ν•˜λŠ” AI ν΄λΌμ΄μ–ΈνŠΈλΌλ©΄ μ–΄λ””μ„œλ“  μ‚¬μš©ν•  수 μžˆμŠ΅λ‹ˆλ‹€. | ν΄λΌμ΄μ–ΈνŠΈ | 지원 μ—¬λΆ€ | |-----------|:--------:| | [Claude Desktop](https://claude.ai/download) | βœ… | | [Cursor](https://cursor.com) | βœ… | | [Windsurf](https://windsurf.com) | βœ… | | [Cline](https://github.com/cline/cline) | βœ… | | MCP 지원 ν΄λΌμ΄μ–ΈνŠΈ 전체 | βœ… | --- ## 이런 게 λ©λ‹ˆλ‹€ AI μ±„νŒ…μ°½μ— κ·Έλƒ₯ λ§ν•˜λ“―μ΄ μž…λ ₯ν•˜λ©΄ λ©λ‹ˆλ‹€. ### API ν‚€ 없이 λ°”λ‘œ ``` 이 μ˜μƒ ν•΅μ‹¬λ§Œ μš”μ•½ν•΄μ€˜: https://www.youtube.com/watch?v=tTw1z10yMCI ``` ``` @fireship 채널 졜근 μ˜μƒ 5개 λΆ„μ„ν•΄μ„œ μš”μ¦˜ μ–΄λ–€ 기술 주제 λ‹€λ£¨λŠ”μ§€ μ•Œλ €μ€˜ ``` ``` 이 3개 μ˜μƒ λΉ„κ΅ν•΄μ„œ 각자 μ–΄λ–€ μ£Όμž₯ ν•˜λŠ”μ§€, 곡톡점·차이점 μ •λ¦¬ν•΄μ€˜: https://www.youtube.com/watch?v=aaa https://www.youtube.com/watch?v=bbb https://www.youtube.com/watch?v=ccc ``` ### API ν‚€ 있으면 λŒ“κΈ€ μ—¬λ‘ κΉŒμ§€ ``` 였늘 ν•œκ΅­ 주식 닀룬 μœ νŠœλ²„ μ˜μƒ 3개 λŒ“κΈ€κΉŒμ§€ μ‘°μ‚¬ν•΄μ„œ μ‹œμž₯ μ΄μŠˆλž‘ λΆ„μœ„κΈ° μ²΄ν¬ν•΄μ€˜ ``` ``` 이 슀마트폰 리뷰 μ˜μƒ β€” 크리에이터 ν‰κ°€λž‘ μ‹€μ œ λŒ“κΈ€ λ°˜μ‘μ΄ μ–Όλ§ˆλ‚˜ λ‹€λ₯Έμ§€ λΉ„κ΅ν•΄μ€˜ ``` ``` "AI μ—μ΄μ „νŠΈ" μ˜μƒ 4개 κ²€μƒ‰ν•΄μ„œ 각자 μ–΄λ–€ μ£Όμž₯인지 λΉ„κ΅ν•˜κ³ , λŒ“κΈ€ λ°˜μ‘λ„ μ •λ¦¬ν•΄μ€˜ ``` ### μ‹€μ œλ‘œ μ–΄λ–»κ²Œ 닡이 λ‚˜μ˜€λ‚˜μš”? **πŸ‘€ μž…λ ₯:** > "이 슀마트폰 리뷰 μ˜μƒ 핡심 μž₯단점 μ •λ¦¬ν•˜κ³ , λŒ“κΈ€μ—μ„œ κ°€μž₯ 많이 λ°˜λ³΅λ˜λŠ” 뢈만 3κ°€μ§€ μ•Œλ €μ€˜." **πŸ€– AI 응닡:** > "μ˜μƒμ—μ„œ μ œμž‘μžλŠ” 카메라 μ„±λŠ₯κ³Ό 배터리λ₯Ό μ£Όμš” μž₯점으둜 κΌ½μ•˜μŠ΅λ‹ˆλ‹€. κ·ΈλŸ¬λ‚˜ **μˆ˜μ§‘λœ λŒ“κΈ€ 뢄석 κ²°κ³Ό** μ‹€μ œ μ‚¬μš©μžλ“€μ΄ κ°€μž₯ 많이 μ–ΈκΈ‰ν•œ λΆˆλ§Œμ€ β‘  λ°œμ—΄ 문제, β‘‘ νŠΉμ • μ•±μ—μ„œμ˜ ν”„λ ˆμž„ λ“œλž, β‘’ μΆ©μ „ μ†λ„μ˜€μŠ΅λ‹ˆλ‹€. μ˜μƒμ˜ 긍정적 평가와 μ‹€μ œ μ‚¬μš©μž κ²½ν—˜ 사이에 μ˜¨λ„μ°¨κ°€ μžˆμŠ΅λ‹ˆλ‹€." --- ## κΈ°λŠ₯ μš”μ•½ | κΈ°λŠ₯ | API ν‚€ 없이 | API ν‚€ μžˆμ„ λ•Œ | |------|:-----------:|:--------------:| | μ˜μƒ μžλ§‰ μˆ˜μ§‘ | βœ… | βœ… | | μ˜μƒ 메타데이터 쑰회 | βœ… (yt-dlp 경유) | βœ… | | 채널 μ΅œμ‹  μ˜μƒ 뢄석 | βœ… (yt-dlp 경유) | βœ… | | ν‚€μ›Œλ“œ 검색 | ❌ | βœ… | | λŒ“κΈ€ μˆ˜μ§‘ 및 μ—¬λ‘  뢄석 | ❌ | βœ… | | API μ‚¬μš©λŸ‰ 쑰회 | ❌ | βœ… | > **λŒ“κΈ€Β·κ²€μƒ‰ κΈ°λŠ₯**은 YouTube Data API ν‚€κ°€ ν•„μš”ν•©λ‹ˆλ‹€. λ°œκΈ‰μ€ 무료, ν•˜λ£¨ 10,000 μœ λ‹› 제곡. --- ## μ„€μΉ˜ ### μΆ”μ²œ β€” `uvx`둜 μ„€μΉ˜ 없이 λ°”λ‘œ μ‚¬μš© [uv](https://docs.astral.sh/uv/getting-started/installation/)만 μ„€μΉ˜ν•˜λ©΄ 별도 ν™˜κ²½ μ„ΈνŒ… 없이 λ°”λ‘œ μ—°κ²°λ©λ‹ˆλ‹€. ```bash # uv μ„€μΉ˜ (아직 μ—†λ‹€λ©΄) curl -LsSf https://astral.sh/uv/install.sh | sh # macOS / Linux # λ˜λŠ”: winget install astral-sh.uv # Windows ``` ### λŒ€μ•ˆ β€” pip으둜 μ„€μΉ˜ ```bash pip install youtube-research-mcp ``` --- ## MCP ν΄λΌμ΄μ–ΈνŠΈ μ—°κ²° ### Claude Desktop `~/Library/Application Support/Claude/claude_desktop_config.json` νŒŒμΌμ— μΆ”κ°€ν•©λ‹ˆλ‹€. > 파일이 μ—†μœΌλ©΄ μƒˆλ‘œ λ§Œλ“œμ„Έμš”. Claude Desktop을 λ¨Όμ € ν•œ 번 μ‹€ν–‰ν•΄μ•Ό 폴더가 μƒκΉλ‹ˆλ‹€. **API ν‚€ 없이 (μžλ§‰ + 채널 뢄석)** ```json { "mcpServers": { "youtube-research": { "command": "uvx", "args": ["youtube-research-mcp"] } } } ``` **API ν‚€ μžˆμ„ λ•Œ (전체 κΈ°λŠ₯)** ```json { "mcpServers": { "youtube-research": { "command": "uvx", "args": ["youtube-research-mcp"], "env": { "YOUTUBE_API_KEY": "AIzaSy..." } } } } ``` ### Cursor / Windsurf / 기타 MCP ν΄λΌμ΄μ–ΈνŠΈ 각 ν΄λΌμ΄μ–ΈνŠΈμ˜ MCP μ„€μ • νŒŒμΌμ— λ™μΌν•œ λ°©μ‹μœΌλ‘œ μΆ”κ°€ν•˜λ©΄ λ©λ‹ˆλ‹€. `command`와 `args`λŠ” λ™μΌν•©λ‹ˆλ‹€. μ„€μ • μ €μž₯ ν›„ **ν΄λΌμ΄μ–ΈνŠΈλ₯Ό μ™„μ „νžˆ μ’…λ£Œν•˜κ³  μž¬μ‹œμž‘**ν•˜λ©΄ μ μš©λ©λ‹ˆλ‹€. > **pip으둜 μ„€μΉ˜ν–ˆλ‹€λ©΄** `"command": "youtube-research-mcp"`, `"args": []`둜 μ„€μ •ν•˜μ„Έμš”. --- ## YouTube API ν‚€ λ°œκΈ‰ (선택 사항) κ²€μƒ‰Β·λŒ“κΈ€ κΈ°λŠ₯에 ν•„μš”ν•©λ‹ˆλ‹€. **무료**이며 ν•˜λ£¨ 10,000 μœ λ‹› β€” 일반 μ‚¬μš©μœΌλ‘œλŠ” μ†Œμ§„λ˜μ§€ μ•ŠμŠ΅λ‹ˆλ‹€. 1. [Google Cloud Console](https://console.cloud.google.com) 접속 2. μƒˆ ν”„λ‘œμ νŠΈ 생성 3. **APIs & Services β†’ Library** β†’ `YouTube Data API v3` 검색 β†’ Enable 4. **APIs & Services β†’ Credentials** β†’ **+ Create Credentials β†’ API key** 5. μƒμ„±λœ ν‚€ 볡사 **λ³΄μ•ˆ μ„€μ • ꢌμž₯:** Edit API key β†’ API restrictions β†’ YouTube Data API v3만 ν—ˆμš© --- ## μ„€μΉ˜ν•΄λ„ μ•ˆμ „ν•œκ°€μš”? ν•œ 쀄 μš”μ•½: **λ„€, μ•ˆμ „ν•©λ‹ˆλ‹€.** | | 이 μ„œλ²„κ°€ ν•˜λŠ” 일 | |---|---| | βœ… | YouTubeμ—μ„œ μžλ§‰κ³Ό 메타데이터λ₯Ό κ°€μ Έμ˜΅λ‹ˆλ‹€ | | βœ… | 결과물을 λ‚΄ μ»΄ν“¨ν„°μ˜ 둜컬 SQLite νŒŒμΌμ— μΊμ‹œν•©λ‹ˆλ‹€ | | βœ… | API ν‚€λ₯Ό μ œκ³΅ν•œ κ²½μš°μ—λ§Œ YouTube Data API v3λ₯Ό ν˜ΈμΆœν•©λ‹ˆλ‹€ | | ❌ | μˆ˜μ§‘ν•œ 데이터λ₯Ό μ™ΈλΆ€ μ„œλ²„λ‘œ **μ „μ†‘ν•˜μ§€ μ•ŠμŠ΅λ‹ˆλ‹€** | | ❌ | LLMΒ·AI APIλ₯Ό **ν˜ΈμΆœν•˜μ§€ μ•ŠμŠ΅λ‹ˆλ‹€** | | ❌ | μΊμ‹œ 디렉토리 μ™Έμ˜ 둜컬 νŒŒμΌμ— **μ ‘κ·Όν•˜μ§€ μ•ŠμŠ΅λ‹ˆλ‹€** | | ❌ | μ…Έ λͺ…λ Ήμ–΄ μ‹€ν–‰μ΄λ‚˜ μ‹œμŠ€ν…œ 접근을 **ν•˜μ§€ μ•ŠμŠ΅λ‹ˆλ‹€** | μžλ§‰κ³Ό λŒ“κΈ€μ—λŠ” `safety_notice` ν•„λ“œκ°€ ν¬ν•¨λ˜μ–΄ ν”„λ‘¬ν”„νŠΈ μΈμ μ…˜μ„ λ°©μ§€ν•©λ‹ˆλ‹€. 전체 μ†ŒμŠ€ μ½”λ“œλŠ” [GitHub](https://github.com/lee-s-dev/youtube-research-mcp)에 κ³΅κ°œλ˜μ–΄ μžˆμŠ΅λ‹ˆλ‹€. --- ## 섀계 원칙 - **LLM 호좜 μ—†μŒ** β€” 데이터 μˆ˜μ§‘λ§Œ λ‹΄λ‹Ήν•©λ‹ˆλ‹€. λΆ„μ„Β·μš”μ•½Β·νŒλ‹¨μ€ AI μ–΄μ‹œμŠ€ν„΄νŠΈκ°€ ν•©λ‹ˆλ‹€. - **ν”„λ‘¬ν”„νŠΈ μΈμ μ…˜ λ°©μ–΄** β€” μžλ§‰κ³Ό λŒ“κΈ€μ— `safety_notice`λ₯Ό 포함해 μ™ΈλΆ€ μ½˜ν…μΈ μž„μ„ λͺ…μ‹œν•©λ‹ˆλ‹€. - **API μš”κΈˆ 폭탄 μ—†μŒ** β€” μžλ§‰Β·λŒ“κΈ€Β·κ²€μƒ‰ κ²°κ³Όλ₯Ό SQLite에 μΊμ‹œν•΄ 쀑볡 ν˜ΈμΆœμ„ μ°¨λ‹¨ν•©λ‹ˆλ‹€. - **ν‚€ 없어도 핡심 κΈ°λŠ₯ μ‚¬μš©** β€” μžλ§‰ μˆ˜μ§‘κ³Ό 채널 뢄석은 yt-dlp둜 API ν‚€ 없이 λ™μž‘ν•©λ‹ˆλ‹€. --- ## 도ꡬ λͺ©λ‘ ### API ν‚€ 없이 μ‚¬μš© κ°€λŠ₯ #### `get_transcript` β€” μ˜μƒ μžλ§‰ κ°€μ Έμ˜€κΈ° ``` 이 μ˜μƒ 핡심 λ‚΄μš©λ§Œ μš”μ•½ν•΄μ€˜: https://www.youtube.com/watch?v=tTw1z10yMCI ``` | νŒŒλΌλ―Έν„° | μ„€λͺ… | κΈ°λ³Έκ°’ | |----------|------|--------| | `url_or_video_id` | YouTube URL λ˜λŠ” video ID | ν•„μˆ˜ | | `languages` | μžλ§‰ μ–Έμ–΄ μš°μ„ μˆœμœ„ (예: `["ko", "en"]`) | μžλ™ 선택 | --- #### `analyze_videos` β€” μ—¬λŸ¬ μ˜μƒ ν•œ λ²ˆμ— 뢄석 URL λͺ©λ‘μ„ μ£Όλ©΄ μžλ§‰Β·λ©”νƒ€λ°μ΄ν„°λ₯Ό 병렬 μˆ˜μ§‘ν•©λ‹ˆλ‹€. API ν‚€κ°€ 있으면 λŒ“κΈ€λ„ ν•¨κ»˜ μˆ˜μ§‘ν•©λ‹ˆλ‹€. ``` 이 3개 μ˜μƒ λΆ„μ„ν•΄μ„œ 각자 μ–΄λ–€ μ£Όμž₯인지, 곡톡점과 차이점 μ •λ¦¬ν•΄μ€˜: https://www.youtube.com/watch?v=aaa https://www.youtube.com/watch?v=bbb https://www.youtube.com/watch?v=ccc ``` | νŒŒλΌλ―Έν„° | μ„€λͺ… | κΈ°λ³Έκ°’ | |----------|------|--------| | `urls_or_video_ids` | URL λ˜λŠ” video ID λͺ©λ‘ | ν•„μˆ˜ | | `languages` | μžλ§‰ μ–Έμ–΄ μš°μ„ μˆœμœ„ | μžλ™ 선택 | | `include_comments` | λŒ“κΈ€ 포함 μ—¬λΆ€ (⚠️ API ν‚€ ν•„μš”) | `true` | | `max_comments_per_video` | μ˜μƒλ‹Ή μ΅œλŒ€ λŒ“κΈ€ 수 | `25` | | `max_transcript_chars` | μžλ§‰ μ΅œλŒ€ κΈ€μž 수 (0 = μ œν•œ μ—†μŒ) | `8000` | --- #### `analyze_channel` β€” 채널 뢄석 채널 ν•Έλ“€(`@채널λͺ…`) λ˜λŠ” 채널 ID둜 μ΅œμ‹  μ˜μƒ N개λ₯Ό μˆ˜μ§‘Β·λΆ„μ„ν•©λ‹ˆλ‹€. ``` @ycombinator 채널 졜근 μ˜μƒ 5개 보고 μ–΄λ–€ μŠ€νƒ€νŠΈμ—… νŠΈλ Œλ“œ λ‹€λ£¨λŠ”μ§€ λΆ„μ„ν•΄μ€˜ ``` | νŒŒλΌλ―Έν„° | μ„€λͺ… | κΈ°λ³Έκ°’ | |----------|------|--------| | `channel_id_or_handle` | 채널 ν•Έλ“€ λ˜λŠ” ID | ν•„μˆ˜ | | `max_videos` | μˆ˜μ§‘ν•  μ˜μƒ 수 (μ΅œλŒ€ 8) | `5` | | `min_duration_seconds` | μ΅œμ†Œ μ˜μƒ 길이 (초) | `120` | | `max_duration_seconds` | μ΅œλŒ€ μ˜μƒ 길이 (초) | `7200` | | `include_comments` | λŒ“κΈ€ 포함 μ—¬λΆ€ (⚠️ API ν‚€ ν•„μš”) | `true` | --- #### `get_capabilities` β€” ν˜„μž¬ μ‚¬μš© κ°€λŠ₯ν•œ κΈ°λŠ₯ 확인 ``` μ§€κΈˆ μ–΄λ–€ κΈ°λŠ₯을 μ“Έ 수 μžˆμ–΄? ``` --- ### API ν‚€ ν•„μš” #### `search_videos` β€” ν‚€μ›Œλ“œλ‘œ μ˜μƒ 검색 ``` "AI agent" κ΄€λ ¨ μ΅œμ‹  μ˜μƒ 5개 κ²€μƒ‰ν•΄μ€˜ ``` | νŒŒλΌλ―Έν„° | μ„€λͺ… | κΈ°λ³Έκ°’ | |----------|------|--------| | `query` | 검색어 | ν•„μˆ˜ | | `max_results` | μ΅œλŒ€ κ²°κ³Ό 수 | `5` | | `published_after` | 이후 λ‚ μ§œ (YYYY-MM-DD) | μ—†μŒ | | `published_before` | 이전 λ‚ μ§œ (YYYY-MM-DD) | μ—†μŒ | | `exclude_shorts` | μ‡ΌμΈ  μ œμ™Έ μ—¬λΆ€ | `false` | --- #### `get_video_comments` β€” λŒ“κΈ€ μˆ˜μ§‘ | νŒŒλΌλ―Έν„° | μ„€λͺ… | κΈ°λ³Έκ°’ | |----------|------|--------| | `url_or_video_id` | YouTube URL λ˜λŠ” video ID | ν•„μˆ˜ | | `max_comments` | μ΅œλŒ€ λŒ“κΈ€ 수 | `50` | | `order` | μ •λ ¬ 방식 (`relevance` / `time`) | `relevance` | | `include_replies` | λŒ€λŒ“κΈ€ 포함 μ—¬λΆ€ | `false` | --- #### `collect_video_discussion` β€” μžλ§‰ + λŒ“κΈ€ ν•œ λ²ˆμ— 크리에이터 μ£Όμž₯κ³Ό μ‹œμ²­μž λ°˜μ‘μ„ ν•œ λ²ˆμ— 비ꡐ할 λ•Œ μœ μš©ν•©λ‹ˆλ‹€. ``` 이 μ˜μƒ λ‚΄μš©μ΄λž‘ λŒ“κΈ€ λ°˜μ‘ 같이 λΆ„μ„ν•΄μ€˜: https://www.youtube.com/watch?v=tTw1z10yMCI ``` --- #### `collect_research_sources` β€” 검색 β†’ μžλ§‰ 묢음 μˆ˜μ§‘ ``` "러슀트 vs κ³  비ꡐ" μ˜μƒ 5개 κ²€μƒ‰ν•΄μ„œ 각 μ˜μƒμ΄ μ–΄λ–€ κ²°λ‘  λ‚΄λ¦¬λŠ”μ§€ μ •λ¦¬ν•΄μ€˜ ``` | νŒŒλΌλ―Έν„° | μ„€λͺ… | κΈ°λ³Έκ°’ | |----------|------|--------| | `query` | 검색어 | ν•„μˆ˜ | | `max_videos` | μˆ˜μ§‘ν•  μ˜μƒ 수 (μ΅œλŒ€ 8) | `5` | | `min_duration_seconds` | μ΅œμ†Œ μ˜μƒ 길이 (초) | `120` | | `exclude_shorts` | μ‡ΌμΈ  μ œμ™Έ μ—¬λΆ€ | `true` | | `min_view_count` | μ΅œμ†Œ 쑰회수 | `0` | --- #### `collect_research_discussions` β€” 검색 β†’ μžλ§‰ + λŒ“κΈ€ 묢음 μˆ˜μ§‘ κ°€μž₯ κ°•λ ₯ν•œ λ¦¬μ„œμΉ˜ 도ꡬ. κ²€μƒ‰Β·μžλ§‰Β·λŒ“κΈ€μ„ ν•œ λ²ˆμ— 병렬 μˆ˜μ§‘ν•©λ‹ˆλ‹€. ``` "LLM νŒŒμΈνŠœλ‹" μ˜μƒ 3개 κ²€μƒ‰ν•΄μ„œ 크리에이터듀이 κ³΅ν†΅μœΌλ‘œ κ°•μ‘°ν•˜λŠ” 것, μ„œλ‘œ λ‹€λ₯Έ 의견, λŒ“κΈ€μ—μ„œ λ°˜λ³΅λ˜λŠ” 질문 μ •λ¦¬ν•΄μ€˜ ``` --- #### `get_quota_usage` β€” API μ‚¬μš©λŸ‰ 쑰회 였늘 μ‚¬μš©ν•œ YouTube API 쿼터와 남은 양을 ν™•μΈν•©λ‹ˆλ‹€. --- ## μΊμ‹œ λ™μž‘ 방식 같은 μ˜μƒμ„ μ—¬λŸ¬ 번 뢄석해도 **μΆ”κ°€ API μΏΌν„°κ°€ μ†ŒλΉ„λ˜μ§€ μ•ŠμŠ΅λ‹ˆλ‹€.** | 데이터 | μΊμ‹œ 유효 κΈ°κ°„ | |--------|---------------| | μžλ§‰ | 30일 | | λŒ“κΈ€ | 6μ‹œκ°„ | | 검색 κ²°κ³Ό | 2μ‹œκ°„ | | μ˜μƒ 메타데이터 | 영ꡬ | μΊμ‹œ μœ„μΉ˜ (OS μžλ™ 선택, `YOUTUBE_RESEARCH_CACHE_DB` ν™˜κ²½ λ³€μˆ˜λ‘œ λ³€κ²½ κ°€λŠ₯): - macOS: `~/Library/Application Support/youtube-research-mcp/cache.db` - Windows: `%APPDATA%\youtube-research-mcp\cache.db` - Linux: `~/.local/share/youtube-research-mcp/cache.db` --- ## λΌμ΄μ„ μŠ€ [MIT](LICENSE)