Connects to YouTube Data API v3 and exposes search, video details, channel statistics, transcripts, comments, and trending video discovery. Built with token optimization as a first principle, stripping YouTube's bloated JSON payloads down by 64-87% compared to raw API responses. Includes optional MongoDB caching to protect your daily API quota when agents re-query the same data. Ships with transcript fetching in zero-config mode if you want to skip the API key setup. Designed for production use with 97% test coverage and strict type safety via Zod. Reach for this when you need your LLM to analyze YouTube content, research channels, or extract insights from comments without burning through context windows or quota limits.
Public tool metadata for what this MCP can expose to an agent.
YOUTUBE_GET_CHANNEL_ACTIVITIESGets recent activities from a YouTube channel including video uploads, playlist additions, likes, and other channel events.6 paramsGets recent activities from a YouTube channel including video uploads, playlist additions, likes, and other channel events.
partstringchannelIdstringpageTokenstringmaxResultsintegerpublishedAfterstringpublishedBeforestringYOUTUBE_GET_CHANNEL_ID_BY_HANDLERetrieves the YouTube Channel ID for a specific YouTube channel handle.1 paramsRetrieves the YouTube Channel ID for a specific YouTube channel handle.
channel_handlestringYOUTUBE_GET_CHANNEL_STATISTICSGets detailed statistics for YouTube channels including subscriber counts, view counts, and video counts.2 paramsGets detailed statistics for YouTube channels including subscriber counts, view counts, and video counts.
idstringpartstringYOUTUBE_GET_VIDEO_DETAILS_BATCHRetrieves multiple YouTube video resource parts in a single batch call. Use when you need cohort-level metrics for many videos to reduce quota usage and latency.3 paramsRetrieves multiple YouTube video resource parts in a single batch call. Use when you need cohort-level metrics for many videos to reduce quota usage and latency.
hlstringidarraypartsarrayYOUTUBE_LIST_CAPTION_TRACKRetrieves a list of caption tracks for a YouTube video, returning an empty list if no captions exist or failing if the video ID is invalid or not found.2 paramsRetrieves a list of caption tracks for a YouTube video, returning an empty list if no captions exist or failing if the video ID is invalid or not found.
partstringvideoIdstringYOUTUBE_LIST_CHANNEL_VIDEOSLists videos from a specified YouTube channel, ensuring results are of `type: 'video'`.4 paramsLists videos from a specified YouTube channel, ensuring results are of `type: 'video'`.
partstringchannelIdstringpageTokenstringmaxResultsintegerYOUTUBE_LIST_PLAYLIST_ITEMSTool to list videos in a playlist, with pagination support. Use when walking through a channel's uploads playlist to enumerate all videos.7 paramsTool to list videos in a playlist, with pagination support. Use when walking through a channel's uploads playlist to enumerate all videos.
partstringfieldsstringvideoIdstringpageTokenstringmaxResultsintegerplaylistIdstringonBehalfOfContentOwnerstringYOUTUBE_LIST_USER_PLAYLISTSRetrieves playlists owned by the authenticated user, implicitly using mine=True.3 paramsRetrieves playlists owned by the authenticated user, implicitly using mine=True.
partstringpageTokenstringmaxResultsintegerYOUTUBE_LIST_USER_SUBSCRIPTIONSRetrieves the authenticated user's YouTube channel subscriptions, allowing specification of response parts and pagination.3 paramsRetrieves the authenticated user's YouTube channel subscriptions, allowing specification of response parts and pagination.
partstringpageTokenstringmaxResultsintegerYOUTUBE_LOAD_CAPTIONSDownloads a specific YouTube caption track, which must be owned by the authenticated user, and returns its content as text. Note: This action requires you to own the video (YouTube Data API v3 restriction). Non-owned videos will return 403 Forbidden errors, including many auto...2 paramsDownloads a specific YouTube caption track, which must be owned by the authenticated user, and returns its content as text. Note: This action requires you to own the video (YouTube Data API v3 restriction). Non-owned videos will return 403 Forbidden errors, including many auto...
idstringtfmtstringYOUTUBE_SEARCH_YOU_TUBESearches YouTube for videos, channels, or playlists using a query term, returning the raw API response.5 paramsSearches YouTube for videos, channels, or playlists using a query term, returning the raw API response.
qstringpartstringtypestringpageTokenstringmaxResultsintegerYOUTUBE_SUBSCRIBE_CHANNELSubscribes the authenticated user to a specified YouTube channel, identified by its unique `channelId` which must be valid and existing.1 paramsSubscribes the authenticated user to a specified YouTube channel, identified by its unique `channelId` which must be valid and existing.
channelIdstringYOUTUBE_UPDATE_THUMBNAILSets the custom thumbnail for a YouTube video using an image from thumbnailUrl; the authenticated user must have permission to edit the video.2 paramsSets the custom thumbnail for a YouTube video using an image from thumbnailUrl; the authenticated user must have permission to edit the video.
videoIdstringthumbnailUrlstringYOUTUBE_UPDATE_VIDEOUpdates metadata for a YouTube video identified by videoId, which must exist; an empty list for tags removes all existing tags.6 paramsUpdates metadata for a YouTube video identified by videoId, which must exist; an empty list for tags removes all existing tags.
tagsarraytitlestringvideoIdstringcategoryIdstringdescriptionstringprivacyStatusstringYOUTUBE_UPLOAD_VIDEOUploads a video from a local file path to a YouTube channel; the video file must be in a YouTube-supported format.6 paramsUploads a video from a local file path to a YouTube channel; the video file must be in a YouTube-supported format.
tagsarraytitlestringcategoryIdstringdescriptionstringprivacyStatusstringvideoFilePathstringYOUTUBE_VIDEO_DETAILSRetrieves specified information parts (e.g., snippet, contentDetails, statistics) for a YouTube video, identified by its ID.2 paramsRetrieves specified information parts (e.g., snippet, contentDetails, statistics) for a YouTube video, identified by its ID.
idstringpartstringA production-grade YouTube Data MCP server engineered specifically for AI agents.
Unlike standard API wrappers that flood your LLM with redundant data, this server strips away YouTube's heavy payload bloat. It is designed to save you massive amounts of context window tokens, protect your daily API quotas via caching, and run reliably without breaking your workflows.
Most MCP servers are weekend projects. @kirbah/mcp-youtube is built for reliable, daily, cost-effective agentic workflows.
The raw YouTube API returns massive JSON payloads filled with nested eTags, redundant thumbnails, and localization data that LLMs don't need. This server structures the data to give your LLM exactly what it needs to reason, and nothing else.
%%{init: { "theme": "base", "themeVariables": { "xyChart": { "plotColorPalette": "#ef4444, #22c55e" } } } }%%
xychart-beta
title "Token Consumption (Lower is Better)"
x-axis ["getVideoDetails", "searchVideos", "getChannelStats"]
y-axis "Context Tokens" 0 --> 1200
bar "Raw YouTube API" [854, 1115, 673]
bar "MCP-YouTube (Optimized)" [209, 402, 86]
| API Method | Raw YouTube Tokens | MCP-YouTube Tokens | Token Savings | Data Size |
|---|---|---|---|---|
getChannelStatistics | 673 | 86 | ~87% Less | 1.9 KB ➔ 0.2 KB |
getVideoDetails | 854 | 209 | ~75% Less | 2.9 KB ➔ 0.6 KB |
searchVideos | 1115 | 402 | ~64% Less | 3.4 KB ➔ 1.2 KB |
(Curious? You can compare the raw API responses vs optimized outputs in the examples folder).
The YouTube Data API has strict daily limits (10,000 quota units). If your LLM gets stuck in a loop or re-asks a question, standard servers will drain your API limit in minutes. This server includes an optional MongoDB caching layer. If your agent requests a video details or searches the same trending videos twice, the server serves it from the cache - costing you 0 API quota points.
Tired of MCP tools crashing your AI client? This server is built to be a rock-solid dependency:
npm run lint passes 100%).Want to just fetch transcripts? You can use this server immediately without any configuration! Just install and go. Add a YouTube API key later to unlock deep search and analytics.
The easiest way to install this server is by clicking the "Add to Claude Desktop" button on the Glama server page.
If you are configuring manually (e.g., in Cursor), just add this bare-minimum setup:
{
"mcpServers": {
"youtube": {
"command": "npx",
"args": ["-y", "@kirbah/mcp-youtube"]
}
}
}
✨ Tip: In Zero-Config mode, you can ask your AI to simply "Read the transcript for youtube://transcript/{videoId}"!
If you prefer to configure your MCP client manually (e.g., Claude Desktop or Cursor), add the following to your configuration file:
{
"mcpServers": {
"youtube": {
"command": "npx",
"args": ["-y", "@kirbah/mcp-youtube"],
"env": {
"YOUTUBE_API_KEY": "YOUR_YOUTUBE_API_KEY_HERE",
"MDB_MCP_CONNECTION_STRING": "mongodb+srv://user:pass@cluster0.abc.mongodb.net/youtube_niche_analysis"
}
}
}
}
(Windows PowerShell Users: If npx fails, try using "command": "cmd" and "args": ["/k", "npx", "-y", "@kirbah/mcp-youtube"])
The server provides the following MCP tools, each designed to return token-optimized data:
| Tool Name | Description | Parameters (see details in tool schema) |
|---|---|---|
getVideoDetails | Retrieves detailed, lean information for multiple YouTube videos including metadata, statistics, engagement ratios, and content details. | videoIds (array of strings) |
searchVideos | Searches for videos or channels based on a query string with various filtering options, returning concise results. | query (string), maxResults (optional number), order (optional), type (optional), channelId (optional), etc. |
getTranscripts | Retrieves token-efficient transcripts (captions) for multiple videos, with options for full text or key segments (intro/outro). | videoIds (array of strings), lang (optional string for language code), format (optional enum: 'full_text', 'key_segments' - default 'key_segments') |
getChannelStatistics | Retrieves lean statistics for multiple channels (subscriber count, view count, video count, creation date). | channelIds (array of strings) |
getChannelTopVideos | Retrieves a list of a channel's top-performing videos with lean details and engagement ratios. | channelId (string), maxResults (optional number) |
getTrendingVideos | Retrieves a list of trending videos for a given region and optional category, with lean details and engagement ratios. | regionCode (optional string), categoryId (optional string), maxResults (optional number) |
getVideoCategories | Retrieves available YouTube video categories (ID and title) for a specific region, providing essential data only. | regionCode (optional string) |
getVideoComments | Retrieves comments for a YouTube video. Allows sorting, limiting results, and fetching a small number of replies per comment. | videoId (string), maxResults (optional number), order (optional), maxReplies (optional number), commentDetail (optional string) |
findConsistentOutlierChannels | Identifies channels that consistently perform as outliers within a specific niche. Requires a MongoDB connection. | niche (string), minVideos (optional number), maxChannels (optional number) |
For detailed input parameters and their descriptions, please refer to the inputSchema within each tool's configuration file in the src/tools/ directory (e.g., src/tools/video/getVideoDetails.ts).
Note on API Quota Costs: Most tools are highly efficient.
getVideoDetails,getChannelStatistics, andgetTrendingVideoscost only 1 unit per call. ThegetTranscriptstool has 0 API cost. The newgetVideoCommentstool has a variable cost: the base call is 1 unit, but if you request replies (by settingmaxReplies > 0), it costs an additional 1 unit for each top-level comment it fetches replies for. The search-based tools are the most expensive:searchVideoscosts 100 units andgetChannelTopVideoscosts 101 units.
If you wish to contribute, modify the server, or run it locally outside of an MCP client's managed environment:
package.json engines field - currently >=20.0.0)Clone the repository:
git clone https://github.com/kirbah/mcp-youtube.git
cd mcp-youtube
Install dependencies:
npm ci
Configure Environment:
Create a .env file in the root by copying .env.example:
cp .env.example .env
Then, edit .env to add your YOUTUBE_API_KEY:
YOUTUBE_API_KEY=your_youtube_api_key_here
MDB_MCP_CONNECTION_STRING=your_mongodb_connection_string_here
# Run in development mode with live reloading
npm run dev
# Build for production
npm run build
# Run the production build (after npm run build)
npm start
# Lint files
npm run lint
# Run tests
npm run test
npm run test -- --coverage # To generate coverage reports
# Inspect MCP server using the Model Context Protocol Inspector
npm run inspector
To have an MCP client run your local development version (instead of the published NPM package):
Ensure you have a script in package.json for a non-watching start, e.g.:
"scripts": {
"start:client": "tsx ./src/index.ts"
}
Configure your MCP client to spawn this local script:
{
"mcpServers": {
"youtube_local_dev": {
"command": "npm",
"args": ["run", "start:client"],
"working_directory": "/absolute/path/to/your/cloned/mcp-youtube",
"env": {
"YOUTUBE_API_KEY": "YOUR_LOCAL_DEV_API_KEY_HERE"
}
}
}
}
Note on the env block above: Setting YOUTUBE_API_KEY directly in the env block for the client configuration is one way to provide the API key. Alternatively, if your server correctly loads its .env file based on the working_directory, you might not need to specify it in the client's env block, as long as your local .env file in the project root contains the YOUTUBE_API_KEY. The working_directory path must be absolute and correct for the server to find its .env file.
YOUTUBE_API_KEY.>=20.0.0 (as specified in package.json)findConsistentOutlierChannels ToolThe findConsistentOutlierChannels tool is designed to identify emerging or established YouTube channels that consistently outperform their size within a specific niche. This tool is particularly useful for content creators, marketers, and analysts looking for high-potential channels.
Important Note: This tool requires a MongoDB connection to store and analyze channel data. Without MDB_MCP_CONNECTION_STRING configured, this tool will not be available.
The tool operates through a multi-phase analysis process, leveraging both YouTube Data API and a MongoDB database:
Candidate Search (Phase 1):
query to search for relevant videos and channels on YouTube.videoCategoryId and regionCode if specified.Channel Filtering (Phase 2):
channelAge (e.g., 'NEW' for channels under 6 months, 'ESTABLISHED' for 6-24 months).Deep Analysis (Phase 3):
consistencyLevel (e.g., 'MODERATE' for ~30% of videos showing outlier performance, 'HIGH' for ~50%).outlierMagnitude (e.g., 'STANDARD' for views > subscribers, 'STRONG' for views > 3x subscribers).Ranking & Formatting (Phase 4):
The behavior of this tool is primarily controlled by the following parameters:
query (string, required): The central topic or niche to analyze (e.g., "DIY home repair", "quantum computing explained").channelAge (enum: "NEW", "ESTABLISHED", default: "NEW"): Focuses the search on emerging or more mature channels.consistencyLevel (enum: "MODERATE", "HIGH", default: "MODERATE"): Sets the threshold for how consistently a channel's videos must perform as outliers.outlierMagnitude (enum: "STANDARD", "STRONG", default: "STANDARD"): Defines how significantly a video's performance must exceed typical expectations (e.g., views vs. subscribers) to be considered an "outlier."videoCategoryId (string, optional): Narrows the search to a specific YouTube category ID.regionCode (string, optional): Targets channels relevant to a particular geographical region.maxResults (number, default: 10): Limits the number of top outlier channels returned.YOUTUBE_API_KEY is sensitive. Never commit it directly to your repository. Use environment variables (e.g., via a .env file which should be listed in .gitignore).This project is licensed under the MIT License. See the LICENSE file for details.
YOUTUBE_API_KEYsecretYouTube Data API v3 key
MDB_MCP_CONNECTION_STRINGsecretMongoDB connection string for caching
com.mcparmory/google-sheets
domdomegg/google-sheets-mcp
henilcalagiya/google-sheets-mcp
cct15/war-dashboard-data
moooonad/mcp-google-sheets-full
io.github.br0ski777/csv-to-json