YouTube Transcript MCP Server for Claude, Cursor and VS Code
Add a YouTube transcript MCP server to Claude, Cursor or VS Code: install configs, prompts, long-video limits and cost at 1 credit per transcript.
By Scrape Everything team · · 11 min read
Last updated: October 28, 2026
TL;DR: A YouTube transcript MCP server gives your AI assistant a tool that fetches the captions of any public YouTube video, so Claude, Cursor or VS Code can read, summarize and quote it in the chat. The Scrape Everything MCP server installs with one command in Claude Code (one config block elsewhere) and charges 1 credit per transcript, whatever the video length. New accounts get 100 free credits.
One detail most setup guides skip: the default 100,000-character cap on tool results decides how long a video your assistant can read with timestamps intact. The numbers are below.
What is a YouTube transcript MCP server?
A YouTube transcript MCP server is a small program that speaks the Model Context Protocol and exposes "get the transcript of this video" as a tool your AI assistant can call on its own. You paste a link, the assistant calls the tool, gets the caption text back as JSON and treats it like any other context.
Our server, @scrapeeverything/mcp, registers one tool per API endpoint. These are the ones that matter for video work:
| MCP tool | Credits | Required input | What it returns |
|---|---|---|---|
youtube_transcript | 1 | url or id (optional lang) | Timed segments, joined text, language, auto-generated flag, available languages |
youtube_search | 1 | query (optional type, sort, upload_date, limit up to 50) | Videos, Shorts, channels and playlists with views, duration and channel |
youtube_playlist | 1 | url or id (optional limit up to 100) | The first page of a playlist's videos |
tiktok_transcript | 1 | url or id (optional lang) | A similar transcript shape for a TikTok video |
get_account and list_scrapers are free. The server reads the live catalog at startup, so input schemas match the YouTube transcript endpoint and YouTube search endpoint without a package update.
How do I install it in Claude Code, Claude Desktop, Cursor and VS Code?
You need Node.js 18 or newer (the server runs through npx) and an API key. Get 100 free credits by signing in with Google or GitHub, no payment details needed, then create a key on the API keys page of the dashboard. It looks like ssk_live_....
Claude Code
- Run this in your terminal:
claude mcp add scrapeeverything -e SCRAPEEVERYTHING_API_KEY=ssk_live_... -- npx -y @scrapeeverything/mcp- Start a new session and ask "How many credits do I have left?" That call is free and confirms the server is connected.
Claude Desktop, Cursor and Windsurf
- Open the config file. Claude Desktop: Settings, Developer, Edit Config (
claude_desktop_config.json). Cursor:~/.cursor/mcp.jsonfor every project or.cursor/mcp.jsonfor one. Windsurf:~/.codeium/windsurf/mcp_config.json. - Add the server:
{
"mcpServers": {
"scrapeeverything": {
"command": "npx",
"args": ["-y", "@scrapeeverything/mcp"],
"env": { "SCRAPEEVERYTHING_API_KEY": "ssk_live_..." }
}
}
}- Quit and reopen the app. On Windows, if
npxisn't found, use"command": "cmd"with"args": ["/c", "npx", "-y", "@scrapeeverything/mcp"].
VS Code (Copilot agent mode)
- Create
.vscode/mcp.jsonin your workspace:
{
"inputs": [
{ "type": "promptString", "id": "scrapeeverything-key", "description": "Scrape Everything API key", "password": true }
],
"servers": {
"scrapeeverything": {
"type": "stdio",
"command": "npx",
"args": ["-y", "@scrapeeverything/mcp"],
"env": { "SCRAPEEVERYTHING_API_KEY": "${input:scrapeeverything-key}" }
}
}
}- VS Code asks for the key the first time and keeps it in its secret storage, so it never lands in your repo.
The server is also in the official MCP Registry as io.github.scrapeeverything/mcp. The MCP and CLI quickstart has every client in one place.
If the tools don't show up, the app usually wasn't fully restarted, or the JSON has a trailing comma. A bad key returns Scrape Everything error [INVALID_API_KEY] (HTTP 401) with a pointer to the keys page, and isn't charged.
Which prompts work best for a Claude YouTube transcript?
The tool only returns captions, so the prompt does the work. Tell the assistant the output format up front. "One-page brief, cite every claim" gets you something you can paste into a doc. "What do these videos say?" gets you a polite essay.
Summarize one video
This is the "summarize youtube video with claude" case:
Pull the transcript of https://www.youtube.com/watch?v=jNQXAC9IVRw and summarize it in 5 bullets. Quote the line behind each bullet with its timestamp.
The timestamps keep the summary honest. A bullet with no timestamp is a bullet the model may have invented.
Chapter notes for a long talk
Get the transcript of this video, split it into chapters of roughly 5 to 10 minutes based on topic changes, and give each chapter a title, a 2-line summary and a link like https://youtu.be/VIDEO_ID?t=SECONDS.
A 2-hour podcast costs the same 1 credit as a Short. Whether the assistant sees all its timestamps is another matter (see the length section).
Compare videos found by search
Search YouTube for "zone 2 training" videos uploaded this year, sorted by popularity, limit 10. Pick the 5 with the most views, read their transcripts and write a one-page brief: where they agree, where they disagree, and which video says what. Cite video and timestamp for every claim.
That's one youtube_search call and five youtube_transcript calls, 6 credits. For a playlist, swap the search for "list the videos in this playlist" and the assistant calls youtube_playlist first: 1 credit plus 1 per transcript. The Agent Skills pack ships the search workflow as youtube-video-research, plus podcast-and-video-transcript-notes for chaptered notes with quote links.
What does the YouTube MCP tool return?
The same JSON as the REST endpoint, wrapped as { "data": ..., "meta": ... }. Here's the call with cURL so you can see what your assistant gets:
curl -X POST https://api.scrapeeverything.com/v1/youtube/transcript \
-H "Authorization: Bearer $SCRAPEEVERYTHING_API_KEY" \
-H "Content-Type: application/json" \
-d '{"url": "https://www.youtube.com/watch?v=dQw4w9WgXcQ", "lang": "en"}'Trimmed response. The field names are real; the values are placeholders, and your output will list the tracks that video actually has:
{
"success": true,
"data": {
"video_id": "dQw4w9WgXcQ",
"language": "en",
"language_name": "English",
"is_auto_generated": false,
"available_languages": [
{ "code": "en", "name": "English", "is_auto_generated": false }
],
"segment_count": 2,
"text": "example caption line one example caption line two",
"segments": [
{ "start": 1.2, "duration": 2.16, "text": "example caption line one" },
{ "start": 3.4, "duration": 1.84, "text": "example caption line two" }
]
},
"meta": { "credits_charged": 1, "credits_remaining": 99 }
}What matters for an assistant:
textis the whole transcript as one string, and it comes beforesegments. That ordering matters once results get long.segmentscarrystartanddurationin seconds (2 decimals) for citations and?t=links.is_auto_generatedsays whether you're reading YouTube's speech recognition or creator-written captions. Auto captions tend to garble names and lack punctuation, so ask the assistant to flag names it isn't sure about.available_languageslists every caption track on the video.
For a one-off transcript with nothing installed, the free YouTube transcript tool runs the same endpoint in the browser.
How do I get a transcript in another language?
Say it in the prompt ("get the Spanish transcript") and the assistant fills in lang with a code such as en, de, pt-BR or es-419. The server picks a track like this:
- Without
lang, it prefers the hand-written track in the video's spoken language, then YouTube's default track, then automatic captions. - With
lang, it matches the exact code first, then the same base language, soptmatchespt-BR. - Machine-translated tracks aren't offered. For an English summary of a Japanese video, fetch the Japanese track and let the model translate; you also keep the original wording for quotes.
- No captions, or none in your language, returns a 404 with code
NO_TRANSCRIPT. The message lists the codes that do exist, so the assistant can retry with one of them.
That 404 is a final answer for the video, and it's charged like other 404s, so asking again costs another credit. Don't let the assistant loop on it. The errors reference lists which codes are billed. Platform blocks, timeouts and server errors are refunded automatically.
How long a video can the assistant read in one call?
Every tool result is pretty-printed JSON, truncated at 100,000 characters by default (SCRAPEEVERYTHING_MCP_MAX_CHARS), with a note when it happens. A transcript result holds the words twice: once in text, once split across segments, each segment wrapped in roughly 90 characters of JSON. Because text comes first, truncation eats the timestamps before it eats the words.
The estimates below assume speech at about 150 words per minute, about 5.7 characters per word and one segment every 4 seconds. Real videos vary. The credit column is exact.
| Video length | text (est.) | Full tool result (est.) | What the model gets at the default cap | Credits |
|---|---|---|---|---|
| 60-second Short | ~850 chars | ~3,000 chars | Everything | 1 |
| 15-minute explainer | ~13,000 | ~46,000 | Everything | 1 |
| 30-minute talk | ~26,000 | ~92,000 | Everything, close to the cap | 1 |
| 1-hour talk | ~51,000 | ~183,000 | Full text, timestamps for roughly the first 20 minutes | 1 |
| 2-hour podcast | ~102,000 | ~366,000 | Text cut near the end, no timestamps | 1 |
So for summaries, the default handles just under two hours of speech. For timestamped citations past the half-hour mark, raise the cap, for example "SCRAPEEVERYTHING_MCP_MAX_CHARS": "400000" in the server's env block, if your model's context window can take it (at a rough 4 characters per token, that's around 100,000 tokens).
Self-hosted transcript MCP or a hosted API?
The free servers are good. Here's what the READMEs of the four that come up most say (checked October 2026):
| Server | Runs as | Notable features | Proxy story |
|---|---|---|---|
jkawamoto/mcp-youtube-transcript | Python via uvx or Docker; stdio | Timed transcripts, language list; paginates transcripts over 50,000 characters | Built-in Webshare, ScrapingAnt and generic HTTP proxies |
kimtaeyoon83/mcp-server-youtube-transcript | npx, Node 18+; stdio | get_transcript with lang, timestamps and language fallback | Not mentioned |
kyong0612/youtube-mcp | Go binary or Docker Compose; stdio or HTTP | Batch fetch, YouTube's auto-translated captions, SRT and VTT output | Proxy rotation listed as a feature |
kevinwatt/yt-dlp-mcp | npx plus a local yt-dlp install | YouTube search, VTT subtitles, transcripts, downloads | Whatever yt-dlp is configured with |
Two things there beat us outright. jkawamoto's pagination hands a long transcript over in chunks instead of truncating it, and kyong0612 returns YouTube's auto-translated tracks, which we don't.
The catch with self-hosting is where the request comes from. The youtube-transcript-api Python library's README has a section on working around IP bans, and issue #593 on its repo is the typical report: works on a laptop, blocked on AWS, free Webshare datacenter proxies blocked too. The maintainer's answer: rotating residential proxies are still the most reliable and cheapest route. Fair, but a server on a VPS or hosted agent then comes with a proxy bill and a proxy config.
How we'd pick:
| Your setup | Pick |
|---|---|
| Laptop, a few videos a week | jkawamoto or kimtaeyoon83, free |
| Need auto-translated tracks or SRT output, fine with Docker | kyong0612, plus residential proxies if it runs in a cloud |
| Agent runs on a VPS, in CI or hosted | Hosted (us; blocked requests are refunded), or self-hosted plus residential proxies |
| Your own channel, official captions | YouTube Data API captions.download |
| TikTok transcripts or other platforms in the same tool list | Hosted (us, 9 platforms) |
On the official route, Google's caption download method needs OAuth and permission to edit the video, and costs 200 quota units per call. It's for channel owners. Our YouTube Data API quota alternatives post compares the rest.
How much does a YouTube transcript MCP server cost per month?
Each youtube_transcript call that returns a transcript costs 1 credit, whether the video runs 40 seconds or 4 hours. A NO_TRANSCRIPT 404 also costs 1. Search and playlist calls are 1 credit each.
Credits come in one-time packs that never expire, paid in crypto, with no subscription. Builder is $39 for 25,000 credits ($1.56 per 1,000); Growth is $119 for 100,000 ($1.19 per 1,000).
| Workflow | Credits per month | Cost at Builder rate | Cost at Growth rate |
|---|---|---|---|
| Summarize 2 videos a day | 60 | ~$0.09 | ~$0.07 |
| "Search, read 5" brief every weekday | 132 | ~$0.21 | ~$0.16 |
| Agent pipeline, 200 transcripts a day | 6,000 | ~$9.36 | ~$7.14 |
The 100 free credits cover the first row for about seven weeks. Every pack is on the pricing page, and the credit calculator does this math for your own numbers.
Repeat reads can be free. In a chat, tell the assistant to reuse a transcript it already fetched. On the REST API, cache_days (1 to 14) makes a repeat call for the same video cost 0 credits; captions change rarely enough that 14 days suits most research.
How do I run the same search-then-read chain on a schedule?
Skip the chat and call the API. This Python script searches, then fetches each transcript with caching on:
import os
import requests
API = "https://api.scrapeeverything.com"
HEADERS = {"Authorization": f"Bearer {os.environ['SCRAPEEVERYTHING_API_KEY']}"}
def call(path, body):
r = requests.post(f"{API}{path}", json=body, headers=HEADERS, timeout=60)
if r.status_code == 404:
return None # e.g. NO_TRANSCRIPT: final answer, skip this video
r.raise_for_status()
return r.json()["data"]
search = call("/v1/youtube/search", {
"query": "zone 2 training",
"type": "video",
"sort": "popularity",
"upload_date": "year",
"limit": 5,
})
for item in search["results"]:
t = call("/v1/youtube/transcript", {"id": item["video_id"], "cache_days": 14})
if t is None:
continue
print(item["title"], "|", t["language_name"], "|", t["segment_count"], "segments")Each item in search["results"] looks like this (trimmed, placeholder values):
{ "type": "video", "video_id": "VIDEO_ID_01", "title": "Example video title", "view_count": 123456, "duration_seconds": 1122, "is_short": false }The YouTube transcript API guide covers error handling and chunking for LLMs, and MCP server for social media data covers the other platforms. Without code, our OpenAPI spec imports into most HTTP tools, and there's an n8n node.
On limits: the tool reads public captions only, with no login. YouTube's terms still apply to what you do with the text, and summarizing for research is not the same as republishing whole transcripts. Our post on whether scraping public social media data is legal covers the questions to ask (it isn't legal advice).
Your next step: create a key, run the Claude Code command above, and ask for the credits check. Then hand it a video you were going to watch anyway.
FAQ
Can Claude watch YouTube videos?
Not by itself. With a YouTube transcript MCP server installed, Claude fetches the caption track as JSON and can summarize, quote or answer questions about it. It still can't see what's on screen, only what was said.
Does it work in ChatGPT or Claude.ai in the browser?
Not out of the box. Browser chat apps need a remote MCP server reachable over HTTPS, and ours runs locally over stdio. The package has a self-hosted HTTP mode (--http) you can put behind your own domain with an auth token and TLS, but we don't host a public endpoint.
Does it work for videos without captions?
No. It reads existing caption tracks and returns NO_TRANSCRIPT when there are none. Turning raw audio into text is speech-to-text, which this endpoint doesn't do.
Does it work with YouTube Shorts and live streams?
Yes, if captions exist. The url input accepts watch, youtu.be, Shorts, live and embed links, or the bare 11-character video ID, and youtube_search takes type: "shorts".
Is the YouTube transcript MCP server free?
The package is MIT-licensed and free to install; transcripts cost 1 credit each from your balance. New accounts start with 100 free credits, and get_account and list_scrapers never cost anything.
Can I use it for TikTok videos too?
Yes. tiktok_transcript returns segments with start and duration, joined text, language and available languages. TikTok uses its own language codes such as eng-US and has no language_name field, but one prompt can handle both platforms. The TikTok transcript API post has the details. Scrape Everything reads public data only and isn't affiliated with YouTube, Google or TikTok.