MCP YouTube Transcript
An MCP server retrieving transcripts of YouTube videos
Description from the maker (original English)
Independent, unofficial project for YouTube metadata, transcripts, comments, and search.
These three are never merged into one score: opinions, measurements and popularity are different things.
We have not written a plain-language summary for this one yet. Below are the facts we read from the registry.
Pick the AI app you use, then copy the settings.
YT_PROVIDER, YOUTUBE_API_KEYValues marked secret are keys to your account. Never share them or paste them into a chat.
You need
Which app do you use?
Pick your app above. We remember it, so next time the button says “Install in …”.
Open Claude Desktop → Settings → Developer → Edit Config, and paste this into claude_desktop_config.json
{
"mcpServers": {
"youtube": {
"command": "npx",
"args": [
"-y",
"@granitebps/youtube-mcp"
],
"env": {
"YT_PROVIDER": "your-value",
"YOUTUBE_API_KEY": "your-value"
}
}
}
}Run this in your terminal
claude mcp add youtube --env YT_PROVIDER=your-value --env YOUTUBE_API_KEY=your-value -- npx -y @granitebps/youtube-mcpFill in the empty values before running it.
Paste into .cursor/mcp.json in your project, or ~/.cursor/mcp.json
{
"mcpServers": {
"youtube": {
"command": "npx",
"args": [
"-y",
"@granitebps/youtube-mcp"
],
"env": {
"YT_PROVIDER": "your-value",
"YOUTUBE_API_KEY": "your-value"
}
}
}
}Your browser asks to open the app, then the app shows the settings and asks you to confirm. Key values are left empty for you to fill in.
Paste into .vscode/mcp.json in your project
{
"servers": {
"youtube": {
"type": "stdio",
"command": "npx",
"args": [
"-y",
"@granitebps/youtube-mcp"
],
"env": {
"YT_PROVIDER": "your-value",
"YOUTUBE_API_KEY": "your-value"
}
}
}
}Your browser asks to open the app, then the app shows the settings and asks you to confirm. Key values are left empty for you to fill in.
This one runs on your computer, and ChatGPT can only connect to servers on the internet. Pick another app.
Your choice stays on this device in a cookie; no account needed.
YT_PROVIDER envThese settings are generated from the maker’s registry entry. If the README says otherwise, follow the README.
Runs on your computer; the tool list appears in your AI app after you install it.
We check information anyone can see; we have not read the code. Checks that do not apply are left out of the count. · Checked Nov 8, 2026
The registry name was verified with the GitHub account granitebps, which owns the repo
We have not read this repo from GitHub yet
We have not read this repo from GitHub yet
This one runs on your computer; there is no internet endpoint
Runs on your computer and uses local settings instead
Runs on your computer; we can only read tool lists from internet endpoints
Compared with every active server in this category in the registry. Stars count only when the publisher owns the repo.
It passed 1 of 1 applicable basic checks. We have not read the code. Before adding a key or token, see what access the server asks for and use a key with only the permissions you need.
You need to fill in: YOUTUBE_API_KEY
It runs on your computer. Your AI app starts it when needed, and data does not pass through the maker’s servers (unless it calls an online service itself).
The GitHub repo last changed –, and the latest version (1.1.1) reached the registry 18 days ago.
Apps that support MCP, such as Claude Desktop, Claude Code, Cursor and VS Code. You also need Node.js on your computer.
In the same category: MCP YouTube Transcript, Google Analytics MCP, BibiGPT YouTube Video Summarizer
Servers in the same category from other makers, sorted by stars.
Reading a card:★ GitHub starsiThree pillars: reviews · checks · usageiUpdated = latest version published to the registryi
An MCP server retrieving transcripts of YouTube videos
GA4 MCP server for AI agents: schema discovery, server-side aggregation, analysis-ready defaults.
AI video summarizer: summarize and transcribe YouTube, Bilibili, TikTok and podcast videos.
Copied from the maker’s repo as written. PopNx MCP has not reviewed or endorsed it. HTML, images and scripts are removed. Links lead off this site.
YouTube MCP lets an MCP client read YouTube video metadata, caption transcripts, comments, and search results. By default it needs no YouTube API key or account; an optional official YouTube Data API provider serves metadata, comments, and search with an API key.
Supports both stdio (local) and Streamable HTTP (VPS/remote) transports.
This is an independent, unofficial open-source project. It is not affiliated with, endorsed by, or sponsored by YouTube or Google.
innertube provider serves metadata, comments, and search through youtubei.js, using an unofficial/internal YouTube interface without a YouTube Data API key. Unofficial access may change, break, be restricted, or be blocked.YT_PROVIDER=api and supply your own YOUTUBE_API_KEY to use the official YouTube Data API v3 for those three tools.youtube-transcript-plus, regardless of YT_PROVIDER. Transcript retrieval remains unofficial and does not use the official Data API path or your API key.Users are responsible for deciding whether an access method suits their use and for complying with applicable service terms and law. See access methods and service terms for the tool/backend mapping, BYOK setup, limitations, and software licenses.
| Tool | Description |
|---|---|
search_youtube | Search videos with filters for upload date and popularity |
get_video_info | Video metadata: title, channel, description, duration, views, likes, upload date, tags |
get_video_comments | Comment threads with author info, likes, and the replies YouTube includes |
get_video_transcript | Transcripts (manual + auto-generated captions) with timestamps |
get_transcript_languages | Lists available manual and auto-generated caption languages |
get_server_info | Server version, active provider, and the backend serving each tool |
No YouTube API key required by default. The default
innertubeprovider usesyoutubei.js(an unofficial/internal YouTube interface) for video info, comments, and search. Transcripts always useyoutube-transcript-plus. Neither needs an API key or authentication. See Providers for the optional official API.
Your MCP client can run the published package without a clone:
npx -y @granitebps/youtube-mcp
The server uses stdio. Keep stdout reserved for MCP traffic.
To develop the server or use a clone directly:
git clone https://github.com/granitebps/youtube-mcp.git
cd youtube-mcp npm ci npm run build
Point your MCP client at the compiled entry point:
node /absolute/path/to/youtube-mcp/dist/index.js
Run npm run build after each source change. Do not use src or npm run dev as the client's stdio command; build output on stdout can corrupt MCP messages.
Each example starts with the npm package, followed by the local equivalent. Replace /absolute/path/to/youtube-mcp with your clone's path. Settings from Configuration can be added as environment variables.
Add the npm package to Claude Code:
claude mcp add youtube -- npx -y @granitebps/youtube-mcp
For a local build:
claude mcp add youtube -- node /absolute/path/to/youtube-mcp/dist/index.js
Claude Code uses local scope by default. Add --scope user before youtube to make the server available across projects.
Claude Desktop reads the same server from claude_desktop_config.json (on macOS, ~/Library/Application Support/Claude/claude_desktop_config.json). Restart the app after editing the file.
{
"mcpServers": { "youtube": { "command": "npx", "args": ["-y", "@granitebps/youtube-mcp"] } } }
For a local build, replace command and args with:
{
"command": "node", "args": ["/absolute/path/to/youtube-mcp/dist/index.js"] }
Add the npm package to ~/.codex/config.toml, or to .codex/config.toml in a trusted project:
[mcp_servers.youtube]
command = "npx" args = ["-y", "@granitebps/youtube-mcp"]
For a local build:
[mcp_servers.youtube]
command = "node" args = ["/absolute/path/to/youtube-mcp/dist/index.js"]
Restart Codex after editing the file.
Add the npm package to opencode.json or opencode.jsonc:
{
"$schema": "https://opencode.ai/config.json", "mcp": { "youtube": { "type": "local", "command": ["npx", "-y", "@granitebps/youtube-mcp"], "enabled": true } } }
For a local build, replace the command array with:
{
"command": ["node", "/absolute/path/to/youtube-mcp/dist/index.js"] }
Add the npm package to .cursor/mcp.json in a project, or to ~/.cursor/mcp.json for global use:
{
"mcpServers": { "youtube": { "command": "npx", "args": ["-y", "@granitebps/youtube-mcp"] } } }
For a local build, replace command and args with:
{
"command": "node", "args": ["/absolute/path/to/youtube-mcp/dist/index.js"] }
Add to your VS Code settings.json:
{
"mcp": { "servers": { "youtube": { "command": "npx", "args": ["-y", "@granitebps/youtube-mcp"] } } } }
For remote deployment, the server runs as a persistent HTTP service using the Streamable HTTP transport (the current MCP standard, replacing the deprecated SSE transport).
# On your VPS
git clone https://github.com/granitebps/youtube-mcp.git cd youtube-mcp npm ci npm run build
cp .env.example .env
YouTube often blocks datacenter IPs. If get_video_info returns ACCESS_BLOCKED with "Sign in to confirm you're not a bot", set YT_PROVIDER=api and YOUTUBE_API_KEY to serve metadata, comments, and search through the official API. See Providers.
# Using --http flag
node dist/index.js --http
TRANSPORT=http PORT=3000 node dist/index.js
npm run start:http
The server will listen on http://0.0.0.0:3000/mcp.
server {
listen 443 ssl; server_name mcp.yourdomain.com;
ssl_certificate /etc/letsencrypt/live/mcp.yourdomain.com/fullchain.pem; ssl_certificate_key /etc/letsencrypt/live/mcp.yourdomain.com/privkey.pem;
location /mcp { proxy_pass http://127.0.0.1:3000/mcp; proxy_http_version 1.1; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header X-Forwarded-Proto $scheme;
proxy_set_header Connection ''; proxy_buffering off; proxy_cache off; chunked_transfer_encoding on; } }
Get a free TLS certificate:
sudo apt install certbot python3-certbot-nginx
sudo certbot --nginx -d mcp.yourdomain.com
Create /etc/systemd/system/youtube-mcp.service:
[Unit]
Description=YouTube MCP Server After=network.target
[Service] Type=simple User=your_user WorkingDirectory=/path/to/youtube-mcp ExecStart=/usr/bin/node dist/index.js --http Restart=always RestartSec=5 Environment=TRANSPORT=http Environment=PORT=3000 Environment=HOST=127.0.0.1
[Install] WantedBy=multi-user.target
sudo systemctl daemon-reload
sudo systemctl enable youtube-mcp sudo systemctl start youtube-mcp sudo systemctl status youtube-mcp
{
"mcp": { "servers": { "youtube": { "type": "http", "url": "https://mcp.yourdomain.com/mcp" } } } }
{
"mcpServers": { "youtube": { "type": "streamable-http", "url": "https://mcp.yourdomain.com/mcp" } } }
Once connected, you can ask your AI agent things like:
All tools return:
content: short human-readable text for chat-style MCP clientsstructuredContent: JSON-shaped data for agents that need reliable fieldsThe server is intentionally JSON-first, text-second. Agents should prefer structuredContent when they need to filter, transform, or chain tool results.
Example shape from get_video_info:
{
"content": [ { "type": "text", "text": "📹 Example title\n\nChannel: Example channel\n..." } ], "structuredContent": { "videoId": "dQw4w9WgXcQ", "title": "Example title", "description": "Example description", "channelName": "Example channel", "channelId": "UC123", "uploadedAt": "Sep 14, 2017", "duration": "3m 33s", "durationSeconds": 213, "viewCount": "123456", "likeCount": "7890", "commentCount": null, "tags": ["music", "pop"], "thumbnailUrl": "https://..." } }
Values YouTube did not provide are null, never placeholders such as "0", "N/A" or "Unknown".
Failures return isError: true. The text starts with a code (❌ [ACCESS_BLOCKED] ...) and _meta["youtube-mcp/error"] carries the details:
{
"isError": true, "content": [{ "type": "text", "text": "❌ [ACCESS_BLOCKED] YouTube requires sign-in to access video C7OQHIpDlvA: Sign in to confirm you’re not a bot" }], "_meta": { "youtube-mcp/error": { "code": "ACCESS_BLOCKED", "message": "...", "retryable": false, "upstream": { "playabilityStatus": "LOGIN_REQUIRED", "reason": "Sign in to confirm you’re not a bot", "accessKind": "login_required" } } } }
The error is in _meta, not structuredContent, because MCP SDK clients validate any structuredContent against the tool's output schema, even on error results.
| Code | Meaning |
|---|---|
INVALID_INPUT | Not a YouTube URL or 11-character video ID, or an invalid language code |
ACCESS_BLOCKED | YouTube refused this client: HTTP 429/403, CAPTCHA, consent page, sign-in or bot check. upstream.accessKind is rate_limited, forbidden, login_required, consent_required, or quota_exceeded (official API quota used up). Says nothing about whether the video exists or has captions |
| VIDEO_UNAVAILABLE | YouTube reports the video as ERROR, UNPLAYABLE, private or offline. upstream.reason is
Only the beginning is shown; read the rest in the repo