YouTube MCP Server
# YouTube MCP Server
MCP server that brings YouTube to Claude Code — video transcripts, search, metadata, channel info, playlists, comments, trending videos, engagement analytics, chapter extraction, SponsorBlock integration, and most-replayed heatmaps. Uses the YouTube Data API v3, youtube-transcript, and SponsorBlock.
## Quick Start
### Step 1: Get Your API Key
1. Go to [Google Cloud Console](https://console.cloud.google.com/apis/credentials)
2. Create a project (or select an existing one)
3. Enable the **YouTube Data API v3**:
- Go to [API Library](https://console.cloud.google.com/apis/library/youtube.googleapis.com)
- Click **Enable**
4. Create an API key:
- Go to [Credentials](https://console.cloud.google.com/apis/credentials)
- Click **Create Credentials** > **API key**
5. Copy the key (you'll need it in Step 3)
### Step 2: Install Prerequisites
- **Node.js 18+** - [Download here](https://nodejs.org/)
- **Claude Code CLI** - [Installation guide](https://docs.anthropic.com/claude-code)
### Step 3: Install the MCP Server
#### 3.1 Clone the repository
```text
git clone https://github.com/wynandw87/claude-code-youtube-mcp.git
cd claude-code-youtube-mcp
```
#### 3.2 Install dependencies
**macOS / Linux / Windows:**
```text
npm install
```
> **Note:** Dependencies are installed and the server is built automatically in one step.
#### 3.3 Register with Claude Code
Choose your install scope:
| Scope | Flag | Who can use it |
|-------|------|----------------|
| **User** (recommended) | `-s user` | You, in any project |
| **Project** | `-s project` | Anyone who clones this repo |
| **Local** | `-s local` | Only in current directory |
Replace `YOUR_API_KEY` with your actual YouTube Data API key, and use the full path to `dist/index.js`.
> **Tip:** To get the full path, run this from the cloned directory:
> - macOS/Linux: `echo "$(pwd)/dist/index.js"`
> - Windows: `echo %cd%\dist\index.js`
**macOS / Linux:**
```text
claude mcp add -s user youtube -e YOUTUBE_API_KEY=YOUR_API_KEY -- node /full/path/to/dist/index.js
```
**Windows (CMD):**
```text
claude mcp add -s user youtube -e "YOUTUBE_API_KEY=YOUR_API_KEY" -- node "C:\full\path\to\dist\index.js"
```
**Windows (PowerShell):**
```text
claude mcp add -s user youtube -e "YOUTUBE_API_KEY=YOUR_API_KEY" '--' node "C:\full\path\to\dist\index.js"
```
#### Alternative: Use the npm helper (if API key is set in environment)
```text
export YOUTUBE_API_KEY=YOUR_API_KEY
npm run install:claude
```
### Step 4: Restart Claude Code
Close and reopen Claude Code for the changes to take effect.
### Step 5: Verify Installation
```text
claude mcp list
```
You should see `youtube` listed with a Connected status.
---
## Features
### Transcripts & Captions
- **Get Transcript** (`get_transcript`) - Fetch full video transcripts with timestamps, supports multiple languages
- **Search Transcript** (`search_transcript`) - Find where a keyword or phrase appears in a video with timestamps
- **Clean Transcript** (`get_clean_transcript`) - Transcript with sponsors, intros, outros, and filler removed via SponsorBlock
- **Extract Chapters** (`extract_chapters`) - Parse chapter timestamps from video descriptions
### Search & Discovery
- **Search Videos** (`search_videos`) - Full YouTube search with filters for date, duration, type, and sort order
- **Search Within Channel** (`search_within_channel`) - Search for videos from a specific creator
- **Get Trending Videos** (`get_trending_videos`) - Currently trending videos by region and category
- **Get Channel Videos** (`get_channel_videos`) - Recent uploads from a channel, sorted by date or views
### Video & Channel Info
- **Video Metadata** (`get_video_metadata`) - Title, description, duration, views, likes, tags, and more
- **Channel Info** (`get_channel_info`) - Subscriber count, video count, description, country
- **Playlist Items** (`get_playlist_items`) - All videos in a playlist with positions and metadata
### Analytics & Engagement
- **Calculate Engagement** (`calculate_engagement`) - Like rate, comment rate, and engagement rate from public stats
- **Most Replayed** (`get_most_replayed`) - Heatmap data showing which parts viewers rewatch most
- **Video Comments** (`get_video_comments`) - Top comments with like counts and reply counts
### Utilities
- **Parse YouTube URL** (`parse_youtube_url`) - Extract video/channel/playlist IDs from any YouTube URL format
---
## Usage
Once installed, use trigger phrases to invoke YouTube tools:
| Trigger | Tool | Example |
|---------|------|---------|
| `youtube transcript` | Get Transcript | "get the youtube transcript for this video" |
| `youtube search` | Search Videos | "youtube search for React tutorials" |
| `youtube metadata` | Video Metadata | "get youtube metadata for this video" |
| `youtube channel` | Channel Info | "get youtube channel info for @ThePrimeagen" |
| `youtube playlist` | Playlist Items | "list the videos in this youtube playlist" |
| `youtube comments` | Video Comments | "get youtube comments for this video" |
| `youtube trending` | Trending Videos | "what's trending on youtube in the US?" |
| `youtube chapters` | Extract Chapters | "extract chapters from this youtube video" |
| `youtube engagement` | Calculate Engagement | "calculate youtube engagement for this video" |
| `youtube most replayed` | Most Replayed | "show the most replayed parts of this youtube video" |
| `youtube clean transcript` | Clean Transcript | "get a clean youtube transcript without sponsors" |
| `youtube search transcript` | Search Transcript | "search the youtube transcript for 'authentication'" |
Or ask naturally:
- *"Get the transcript of this YouTube video and summarize it"*
- *"What are the most replayed parts of this video?"*
- *"Find recent videos about TypeScript on this channel"*
- *"How many views and likes does this video have?"*
- *"Get the comments on this video and summarize the sentiment"*
- *"Show me the chapters for this tutorial"*
- *"Get a clean transcript without the sponsor reads"*
- *"What's trending on YouTube in gaming right now?"*
---
## Tool Reference
### parse_youtube_url
Parse any YouTube URL format and extract identifiers. No API key needed.
**Parameters:**
- `url` (string, required) - Any YouTube URL or video ID
**Supported formats:** `youtube.com/watch?v=`, `youtu.be/`, `/shorts/`, `/embed/`, `/playlist?list=`, `/channel/`, `/@handle`, `/c/`, `/user/`, bare video IDs
### get_transcript
Fetch the full transcript/captions of a YouTube video. No API key needed.
**Parameters:**
- `url` (string, required) - YouTube video URL or video ID
- `lang` (string, optional) - Language code for captions (default: `"en"`)
### search_transcript
Search within a video's transcript for a keyword or phrase.
**Parameters:**
- `url` (string, required) - YouTube video URL or video ID
- `query` (string, required) - Keyword or phrase to search for
- `lang` (string, optional) - Language code for captions (default: `"en"`)
### extract_chapters
Extract chapter timestamps from a video's description.
**Parameters:**
- `url` (string, required) - YouTube video URL or video ID
### get_clean_transcript
Fetch transcript with sponsor reads, intros, outros, and filler removed via SponsorBlock.
**Parameters:**
- `url` (string, required) - YouTube video URL or video ID
- `lang` (string, optional) - Language code for captions (default: `"en"`)
### get_most_replayed
Get the "most replayed" heatmap data showing which parts viewers rewatch most.
**Parameters:**
- `url` (string, required) - YouTube video URL or video ID
> **Note:** Requires approximately 50K+ views to have heatmap data available.
### search_videos
Search YouTube with full filter support.
**Parameters:**
- `query` (string, required) - Search query
- `max_results` (number, optional) - Number of results, 1-50 (default: `10`)
- `order` (string, optional) - `"relevance"`, `"date"`, `"viewCount"`, `"rating"` (default: `"relevance"`)
- `duration` (string, optional) - `"short"` (<4min), `"medium"` (4-20min), `"long"` (>20min)
- `upload_date` (string, optional) - `"hour"`, `"day"`, `"week"`, `"month"`, `"year"`
- `type` (string, optional) - `"video"`, `"channel"`, `"playlist"` (default: `"video"`)
### get_video_metadata
Get detailed metadata for a YouTube video.
**Parameters:**
- `url` (string, required) - YouTube video URL or video ID
**Returns:** Title, description, channel, duration, view/like/comment counts, tags, category, thumbnails, live status, and more.
### get_channel_info
Get YouTube channel information.
**Parameters:**
- `url` (string, required) - YouTube channel URL, @handle, or channel ID
**Returns:** Title, description, subscriber/video/view counts, country, custom URL, and thumbnail.
### get_playlist_items
Get all videos in a YouTube playlist.
**Parameters:**
- `url` (string, required) - YouTube playlist URL or playlist ID
- `max_results` (number, optional) - Number of items, 1-50 (default: `25`)
### get_channel_videos
Get recent videos from a YouTube channel.
**Parameters:**
- `url` (string, required) - YouTube channel URL, @handle, or channel ID
- `max_results` (number, optional) - Number of videos, 1-50 (default: `25`)
- `order` (string, optional) - `"date"`, `"viewCount"` (default: `"date"`)
### get_trending_videos
Get currently trending/popular YouTube videos.
**Parameters:**
- `region_code` (string, optional) - ISO 3166-1 alpha-2 country code (default: `"US"`)
- `category_id` (string, optional) - YouTube category ID (e.g., `"10"` for Music, `"20"` for Gaming, `"28"` for Science & Tech)
- `max_results` (number, optional) - Number of results, 1-50 (default: `10`)
### search_within_channel
Search for videos within a specific YouTube channel.
**Parameters:**
- `url` (string, required) - YouTube channel URL, @handle, or channel ID
- `query` (string, required) - Search query
- `max_results` (number, optional) - Number of results, 1-50 (default: `10`)
### get_video_comments
Fetch top-level comments from a YouTube video.
**Parameters:**
- `url` (string, required) - YouTube video URL or video ID
- `max_results` (number, optional) - Number of comments, 1-100 (default: `20`)
- `order` (string, optional) - `"relevance"`, `"time"` (default: `"relevance"`)
### calculate_engagement
Calculate engagement metrics for a YouTube video.
**Parameters:**
- `url` (string, required) - YouTube video URL or video ID
**Returns:** View count, like count, comment count, like rate, comment rate, and overall engagement rate.
---
## How It Works
This MCP server connects to Claude Code via stdio transport and provides 15 tools:
| Tool | Data Source | Needs API Key? |
|------|------------|----------------|
| `parse_youtube_url` | Local parsing | No |
| `get_transcript` | youtube-transcript library | No |
| `search_transcript` | youtube-transcript library | No |
| `get_clean_transcript` | youtube-transcript + SponsorBlock API | No |
| `get_most_replayed` | YouTube page (Innertube) | No |
| `extract_chapters` | YouTube Data API v3 | Yes |
| `search_videos` | YouTube Data API v3 | Yes |
| `get_video_metadata` | YouTube Data API v3 | Yes |
| `get_channel_info` | YouTube Data API v3 | Yes |
| `get_playlist_items` | YouTube Data API v3 | Yes |
| `get_channel_videos` | YouTube Data API v3 | Yes |
| `get_trending_videos` | YouTube Data API v3 | Yes |
| `search_within_channel` | YouTube Data API v3 | Yes |
| `get_video_comments` | YouTube Data API v3 | Yes |
| `calculate_engagement` | YouTube Data API v3 | Yes |
> **Note:** 5 tools work without an API key (transcripts, SponsorBlock, heatmaps, URL parsing). The remaining 10 require a YouTube Data API v3 key.
---
## Configuration
### Environment Variables
| Variable | Required | Default | Description |
|----------|----------|---------|-------------|
| `YOUTUBE_API_KEY` | Yes | — | YouTube Data API v3 key |
| `YOUTUBE_TIMEOUT` | No | `30000` | API timeout in ms |
### YouTube API Quota
The YouTube Data API v3 has a daily quota of **10,000 units**. Each tool uses a different amount:
| Operation | Cost per call |
|-----------|--------------|
| `search` (search_videos, search_within_channel) | 100 units |
| `videos.list` (get_video_metadata, get_trending, calculate_engagement) | 1 unit |
| `channels.list` (get_channel_info, get_channel_videos) | 1 unit |
| `playlists.list` (get_playlist_items) | 1 unit |
| `playlistItems.list` (get_playlist_items, get_channel_videos) | 1 unit |
| `commentThreads.list` (get_video_comments) | 1 unit |
> **Tip:** Search operations are the most expensive. Use `get_channel_videos` (1 unit) instead of `search_within_channel` (100 units) when you just need recent uploads.
---
## Troubleshooting
### Fix API Key
If you entered the wrong API key, remove and reinstall:
```text
claude mcp remove youtube
```
Then reinstall using the command from Step 3.3 above (use the same scope you originally installed with).
### MCP Server Not Showing Up
Check if the server is installed:
```text
claude mcp list
```
If not listed, follow Step 3 to install it.
### Server Won't Start
1. **Verify your API key** is valid at [Google Cloud Console](https://console.cloud.google.com/apis/credentials)
2. **Check the YouTube Data API is enabled**:
- Go to [API Library](https://console.cloud.google.com/apis/library/youtube.googleapis.com)
- It should say "Enabled"
3. **Check Node.js version** (needs 18+):
```text
node --version
```
4. **Ensure the server was built** — if `dist/index.js` is missing, run `npm install` again
### Connection Errors
1. **Check that `dist/index.js` exists** — if not, run `npm install`
2. **Verify the path is absolute** in your `claude mcp add` command
3. **Restart Claude Code** after any configuration changes
### Quota Exceeded
If you see "quotaExceeded" errors:
- Wait until midnight Pacific Time (quota resets daily)
- Use a different API key
- Prefer low-cost tools (`get_video_metadata` at 1 unit) over search tools (100 units)
### Transcript Not Available
Some videos have transcripts disabled. The `get_transcript` tool will return a clear error message. Try:
- A different language code (e.g., `lang: "es"`)
- Auto-generated captions may be available even if manual ones aren't
### Timeout Errors
Increase `YOUTUBE_TIMEOUT` environment variable for slow connections:
```text
claude mcp add -s user youtube -e YOUTUBE_API_KEY=YOUR_KEY -e YOUTUBE_TIMEOUT=60000 -- node /path/to/dist/index.js
```
### View Current Configuration
```text
claude mcp list
```
---
## Contributing
Pull requests welcome! Please keep it simple and beginner-friendly.
## License
MIT
---
Made for the Claude Code community
TDQS
Scored across 15 tools
Each tool has a clear and distinct purpose. Overlapping areas like transcripts (get_transcript, get_clean_transcript, search_transcript) are well-differentiated by their descriptions, eliminating ambiguity.
All tools use a consistent verb_noun pattern with snake_case (e.g., get_channel_info, search_videos, parse_youtube_url). No mixed conventions or vague verbs.
15 tools is within the optimal range for a domain-specific server. Each tool covers a core YouTube operation (metadata, transcripts, search, parsing) without excess or deficiency.
The tool set covers most information retrieval needs (channel, videos, playlists, comments, transcripts, search). Minor gaps include lack of channel playlist listing and comment replies, but the core workflows are well-supported.