Extract subtitles/transcripts from YouTube videos. Triggers: "youtube transcript", "extract subtitles", "video captions", "视频字幕", "字幕提取", "YouTube转文字", "提取字幕".
Extract subtitles/transcripts from a YouTube video URL and save them as a local file.
Input YouTube URL: $ARGUMENTS
Confirm the input is a valid YouTube URL (supports youtube.com/watch?v=, youtu.be/, and youtube.com/shorts/ formats). If no URL is provided via arguments, check the conversation context for a YouTube link.
Use command-line tools to quickly extract subtitles.
Execute which yt-dlp.
yt-dlp is found, proceed to 2.2.yt-dlp is not found, skip to Step 3.yt-dlp --cookies-from-browser=chrome --get-title "[VIDEO_URL]"
--cookies-from-browser to avoid sign-in restrictions. Default to chrome.firefox, safari, edge) and retry.yt-dlp --cookies-from-browser=chrome --write-auto-sub --write-sub --sub-lang zh-Hans,zh-Hant,en --skip-download --output "<Video Title>.%(ext)s" "[VIDEO_URL]"
yt-dlp saves subtitles as .vtt or .srt files. Convert the downloaded file to plain Timestamp Text format:
.vtt or .srt).<Video Title>.txt with one Timestamp Text entry per line.When the CLI method fails or yt-dlp is missing, use Chrome DevTools MCP to extract subtitles via browser UI automation.
Check if Chrome DevTools MCP tools are available (look for tools matching chrome__new_page or similar).
If Chrome DevTools MCP is not available and yt-dlp was not found in Step 2, stop and notify the user: "Unable to proceed. Please either install yt-dlp (for fast CLI extraction) or configure Chrome DevTools MCP (for browser automation)."
Use Chrome DevTools MCP new_page to open the video URL.
Use Chrome DevTools MCP take_snapshot to read the page accessibility tree.
The "Show transcript" button is usually hidden within the collapsed description area.
click to click that button.take_snapshot to get the updated UI.click to click that button.Directly reading the accessibility tree for long transcript lists is slow and token-heavy. Use Chrome DevTools MCP evaluate_script to run this JavaScript instead:
() => {
const segments = document.querySelectorAll("ytd-transcript-segment-renderer");
if (!segments.length) return "BUFFERING";
return Array.from(segments)
.map((seg) => {
const time = seg.querySelector(".segment-timestamp")?.innerText.trim();
const text = seg.querySelector(".segment-text")?.innerText.trim();
return `${time} ${text}`;
})
.join("\n");
};
If it returns "BUFFERING", wait a few seconds and retry (up to 3 attempts).
<Video Title>.txt.close_page to release resources.<Video Title>.txtTimestamp Subtitle Text.