<?xml version="1.0" encoding="UTF-8"?><rss xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:atom="http://www.w3.org/2005/Atom" version="2.0"><channel><title><![CDATA[Nidhi's Blog]]></title><description><![CDATA[Nidhi's Blog]]></description><link>https://nidhibuilds.hashnode.dev</link><image><url>https://cdn.hashnode.com/res/hashnode/image/upload/v1593680282896/kNC7E8IR4.png</url><title>Nidhi&apos;s Blog</title><link>https://nidhibuilds.hashnode.dev</link></image><generator>RSS for Node</generator><lastBuildDate>Wed, 14 Oct 2026 09:18:38 GMT</lastBuildDate><atom:link href="https://nidhibuilds.hashnode.dev/rss.xml" rel="self" type="application/rss+xml"/><language><![CDATA[en]]></language><ttl>60</ttl><item><title><![CDATA[Feed a whole YouTube playlist into Claude or ChatGPT as one file (+ MCP setup)]]></title><description><![CDATA[Paste a YouTube link into Claude and ask for a summary, and one of three things happens: it tells you it can't open the link, it searches the web and summarizes what other people wrote about the video]]></description><link>https://nidhibuilds.hashnode.dev/feed-a-whole-youtube-playlist-into-claude-or-chatgpt-as-one-file-mcp-setup</link><guid isPermaLink="true">https://nidhibuilds.hashnode.dev/feed-a-whole-youtube-playlist-into-claude-or-chatgpt-as-one-file-mcp-setup</guid><category><![CDATA[claude]]></category><category><![CDATA[chatgpt]]></category><category><![CDATA[mcp]]></category><category><![CDATA[youtube]]></category><dc:creator><![CDATA[Nidhi]]></dc:creator><pubDate>Mon, 12 Oct 2026 03:10:46 GMT</pubDate><content:encoded><![CDATA[<p>Paste a YouTube link into Claude and ask for a summary, and one of three things happens: it tells you it can't open the link, it searches the web and summarizes what other people wrote about the video, or it quietly guesses from the title. None of those is the video.</p>
<p>What every assistant <em>can</em> do is read text. So the reliable workflow is:</p>
<ol>
<li>Get the captions as text.</li>
<li>For a playlist, put all of them in <strong>one file</strong> in order, with a heading per video.</li>
<li>Upload that file, or connect a transcript tool over MCP so the assistant fetches it on its own.</li>
</ol>
<p>This post covers both, with the free DIY route first.</p>
<h2>How much fits? (do this maths before uploading)</h2>
<p>Speech runs at roughly 130â€“160 words a minute, so one hour of video is about 8,000â€“10,000 words, or roughly 11,000â€“13,000 tokens for English. Rough guide:</p>
<table>
<thead>
<tr>
<th>Playlist</th>
<th>Approx. words</th>
<th>Approx. tokens</th>
</tr>
</thead>
<tbody><tr>
<td>10 Ã— 15-min videos</td>
<td>20k</td>
<td>27k</td>
</tr>
<tr>
<td>20 Ã— 1-hour lectures</td>
<td>180k</td>
<td>240k</td>
</tr>
<tr>
<td>100 Ã— 1-hour lectures</td>
<td>900k</td>
<td>1.2M</td>
</tr>
</tbody></table>
<p>Context limits differ by model and plan and change often, so check yours. Two practical rules:</p>
<ul>
<li><strong>Under your model's context limit:</strong> upload the single file and ask questions across the whole playlist.</li>
<li><strong>Over it:</strong> upload to a <strong>Claude Project</strong> or a <strong>ChatGPT Project / custom GPT</strong> as knowledge files. Those retrieve the relevant parts instead of reading everything at once, so split the playlist into a few files (e.g. one per module) with clear headings.</li>
</ul>
<h2>Step 1 (free): playlist â†’ one file with yt-dlp</h2>
<pre><code class="language-bash">pip install yt-dlp
mkdir subs &amp;&amp; cd subs
yt-dlp --skip-download --write-subs --write-auto-subs \
  --sub-langs "en.*" --sub-format vtt \
  -o "%(playlist_index)03d - %(title)s.%(ext)s" \
  "https://www.youtube.com/playlist?list=YOUR_PLAYLIST_ID"
cd ..
</code></pre>
<p>This downloads only subtitle files (no video), creator captions first, auto-captions otherwise, numbered in playlist order. Run it from a home connection; YouTube often blocks cloud and VPN IPs with a "confirm you're not a bot" error.</p>
<p>Then merge them. Raw <code>.vtt</code> auto-captions repeat each line two or three times, so dedupe while you merge:</p>
<pre><code class="language-python">import re
from pathlib import Path

TAG = re.compile(r"&lt;[^&gt;]+&gt;")
out = ["# Playlist transcripts\n"]
for f in sorted(Path("subs").glob("*.vtt")):
    lines, last = [], None
    for raw in f.read_text(encoding="utf-8", errors="ignore").splitlines():
        s = TAG.sub("", raw).strip()
        if not s or s == "WEBVTT" or "--&gt;" in s or s.startswith(("Kind:", "Language:")):
            continue
        if s != last:
            lines.append(s)
        last = s
    name = re.sub(r"\.[\w-]+\.vtt$", "", f.name)  # drop ".en.vtt"
    body = " ".join(lines)
    out.append(f"\n## {name}\n\n{body}\n")
Path("playlist.md").write_text("".join(out), encoding="utf-8")
print(len("".join(out).split()), "words")
</code></pre>
<h2>Step 2: prompt it like a long document, not a video</h2>
<p>Headings per video are what make this work. The model can cite "## 007 - Backpropagation" instead of vaguely saying "in one of the videos".</p>
<p>Prompts that use the whole playlist:</p>
<ul>
<li>"This file has one section per video. For each section, give one line: the main claim and the best example used."</li>
<li>"Where do videos 3 and 11 disagree? Quote both."</li>
<li>"Build a study plan: what to rewatch, in what order, for someone who already knows X."</li>
<li>"Turn the whole series into a checklist I can follow, with the video number next to each step."</li>
</ul>
<p>Ask it to <strong>quote</strong> when it matters. Quotes from a transcript are checkable; paraphrases can drift.</p>
<h2>Step 3 (optional): let the assistant fetch transcripts itself with MCP</h2>
<p>MCP (Model Context Protocol) lets Claude, ChatGPT, Cursor and other clients call external tools. With a YouTube transcript MCP server connected, you can say "get the transcripts for this playlist and compare videos 2 and 5", and the assistant fetches the text itself.</p>
<p>You can self-host an open-source transcript MCP server (several exist on GitHub, most built on <code>youtube-transcript-api</code>). They work well locally, but the same IP blocking applies when you deploy them to a cloud server.</p>
<p>Or use a hosted one. I built <a href="https://13-234-185-132.sslip.io/?ref=hashnode">YT Transcriber</a>, which has a remote MCP server (disclosure: I'm the maker, a student). The setup is the same pattern for any remote MCP server:</p>
<ol>
<li><strong>Get a key.</strong> Sign in, then <strong>Settings â†’ API keys â†’ Create</strong>, and copy it once. Then <strong>Settings â†’ AI &amp; Automations</strong> gives you the MCP server URL with the key included. Treat that URL like a password.</li>
<li><strong>Claude:</strong> Customize â†’ Connectors â†’ <strong>Add custom connector</strong>. Name it, paste the MCP URL, and choose no extra sign-in, since the URL carries the key.</li>
<li><strong>ChatGPT:</strong> Settings â†’ Apps â†’ <strong>Create MCP app</strong>. Paste the MCP URL, authentication: none.</li>
<li><strong>Cursor:</strong> Settings â†’ MCP â†’ New MCP server, preferably with the key in a header instead of the URL:</li>
</ol>
<pre><code class="language-json">{
  "mcpServers": {
    "yt-transcriber": {
      "url": "https://13-234-185-132.sslip.io/mcp",
      "headers": { "Authorization": "Bearer ytk_YOUR_KEY" }
    }
  }
}
</code></pre>
<p>The server exposes five tools: <code>submit_transcripts</code> (video, playlist or channel URLs), <code>list_jobs</code>, <code>get_transcript</code>, <code>export_transcript</code> (txt, md, json, toon, srt, pdf) and <code>check_quota</code>. In the web app, a finished playlist can also be downloaded as <strong>one file</strong> for this exact workflow, auto-split under 450,000 words between videos.</p>
<p>Honest limits: it reads existing captions (no speech-to-text), so caption-less videos fail. The free tier is 3 videos a day after sign-in, and you can try one video on the homepage without signing in. Whole playlists are $9/month.</p>
<h2>Summary</h2>
<ul>
<li>Don't trust a model that says it "watched" a YouTube link. Give it the transcript.</li>
<li>One file per playlist, a heading per video, in playlist order.</li>
<li>Check the size against your model's context; use Projects or knowledge files when it's bigger.</li>
<li>MCP turns "go get the transcript" into something the assistant can do on its own.</li>
</ul>
]]></content:encoded></item></channel></rss>