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 toolCreditsRequired inputWhat it returns
youtube_transcript1url or id (optional lang)Timed segments, joined text, language, auto-generated flag, available languages
youtube_search1query (optional type, sort, upload_date, limit up to 50)Videos, Shorts, channels and playlists with views, duration and channel
youtube_playlist1url or id (optional limit up to 100)The first page of a playlist's videos
tiktok_transcript1url 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

  1. Run this in your terminal:
bash
claude mcp add scrapeeverything -e SCRAPEEVERYTHING_API_KEY=ssk_live_... -- npx -y @scrapeeverything/mcp
  1. 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

  1. Open the config file. Claude Desktop: Settings, Developer, Edit Config (claude_desktop_config.json). Cursor: ~/.cursor/mcp.json for every project or .cursor/mcp.json for one. Windsurf: ~/.codeium/windsurf/mcp_config.json.
  2. Add the server:
json
{
  "mcpServers": {
    "scrapeeverything": {
      "command": "npx",
      "args": ["-y", "@scrapeeverything/mcp"],
      "env": { "SCRAPEEVERYTHING_API_KEY": "ssk_live_..." }
    }
  }
}
  1. Quit and reopen the app. On Windows, if npx isn't found, use "command": "cmd" with "args": ["/c", "npx", "-y", "@scrapeeverything/mcp"].

VS Code (Copilot agent mode)

  1. Create .vscode/mcp.json in your workspace:
json
{
  "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}" }
    }
  }
}
  1. 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).

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:

bash
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:

json
{
  "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:

  • text is the whole transcript as one string, and it comes before segments. That ordering matters once results get long.
  • segments carry start and duration in seconds (2 decimals) for citations and ?t= links.
  • is_auto_generated says 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_languages lists 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:

  1. Without lang, it prefers the hand-written track in the video's spoken language, then YouTube's default track, then automatic captions.
  2. With lang, it matches the exact code first, then the same base language, so pt matches pt-BR.
  3. 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.
  4. 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 lengthtext (est.)Full tool result (est.)What the model gets at the default capCredits
60-second Short~850 chars~3,000 charsEverything1
15-minute explainer~13,000~46,000Everything1
30-minute talk~26,000~92,000Everything, close to the cap1
1-hour talk~51,000~183,000Full text, timestamps for roughly the first 20 minutes1
2-hour podcast~102,000~366,000Text cut near the end, no timestamps1

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):

ServerRuns asNotable featuresProxy story
jkawamoto/mcp-youtube-transcriptPython via uvx or Docker; stdioTimed transcripts, language list; paginates transcripts over 50,000 charactersBuilt-in Webshare, ScrapingAnt and generic HTTP proxies
kimtaeyoon83/mcp-server-youtube-transcriptnpx, Node 18+; stdioget_transcript with lang, timestamps and language fallbackNot mentioned
kyong0612/youtube-mcpGo binary or Docker Compose; stdio or HTTPBatch fetch, YouTube's auto-translated captions, SRT and VTT outputProxy rotation listed as a feature
kevinwatt/yt-dlp-mcpnpx plus a local yt-dlp installYouTube search, VTT subtitles, transcripts, downloadsWhatever 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 setupPick
Laptop, a few videos a weekjkawamoto or kimtaeyoon83, free
Need auto-translated tracks or SRT output, fine with Dockerkyong0612, plus residential proxies if it runs in a cloud
Agent runs on a VPS, in CI or hostedHosted (us; blocked requests are refunded), or self-hosted plus residential proxies
Your own channel, official captionsYouTube Data API captions.download
TikTok transcripts or other platforms in the same tool listHosted (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).

WorkflowCredits per monthCost at Builder rateCost at Growth rate
Summarize 2 videos a day60~$0.09~$0.07
"Search, read 5" brief every weekday132~$0.21~$0.16
Agent pipeline, 200 transcripts a day6,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:

python
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):

json
{ "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.

More from the blog

Start with 100 free credits.

Continue with Google, create an API key and send your first request in under a minute.

Get 100 free credits