MCP YouTube字幕专业版
一个可投入生产的模型上下文协议(MCP)服务器,用于获取带有元数据的YouTube视频字幕。
🎯 特点
- 4 MCP 工具完整实现 list_tracks、get_transcript、get_timed_transcript、get_video_info 功能
- 混合架构YouTube数据API v3用于元数据 + yt-dlp用于稳健的内容提取
- 完全符合MCP(可能指某种标准、协议或规范,具体需根据上下文确定)通过stdin/stdout使用的JSON-RPC 2.0协议
- 经过实战检验全面的测试套件,成功率100%
- 生产质量使用严格类型的TypeScript,完善的错误处理,详细的日志记录
- 无需OAuth使用API密钥获取元数据,使用yt-dlp获取字幕内容(无需OAuth 2.0的复杂性)
📋 先决条件
- Node.js 20多个版本 (用于运行MCP服务器)
- YouTube数据API密钥 (提供免费套餐)
- yt-dlp (用于提取转录本)
安装 yt-dlp
Windows(winget):
winget install yt-dlpmacOS(使用Homebrew):
brew install yt-dlpLinux(curl):
sudo curl -L https://github.com/yt-dlp/yt-dlp/releases/latest/download/yt-dlp -o /usr/local/bin/yt-dlp
sudo chmod a+rx /usr/local/bin/yt-dlp获取YouTube API密钥
- 首选 Google Cloud 控制台
- 创建一个新项目(或选择现有项目)
- 启用“YouTube Data API v3”
- 创建凭据 → API密钥
- 复制API密钥
🚀 快速入门
安装
# Clone or navigate to the project directory
cd mcp-youtube-transcript-pro
# Install dependencies
npm install
# Create .env file with your API key
echo "YOUTUBE_API_KEY=your_api_key_here" > .env
# Build the project
npm run build运行测试
# Test all four MCP tools directly
npx ts-node test-mcp-tools.ts
# Test the JSON-RPC protocol implementation
npx ts-node test-mcp-protocol.ts启动服务器
# Start the MCP server (listens on stdin/stdout)
npm run start🔧 与Claude桌面版的使用
添加到您的Claude桌面配置中(claude_desktop_config.json):
{
"mcpServers": {
"youtube-transcript": {
"command": "node",
"args": [
"H:\\-EMBLEM-PROJECT(s)-\\Tools\\packages\\mcp-youtube-transcript-pro\\dist\\index.js"
],
"env": {
"YOUTUBE_API_KEY": "your_api_key_here"
}
}
}
}注将路径替换为您实际的安装目录。
📚 MCP 工具
1. 列出音轨
列出YouTube视频可用的字幕轨道。
输入:
{
"url": "https://www.youtube.com/watch?v=lxRAj1Gijic"
}输出:
[
{
"lang": "en",
"source": "youtube_api_manual"
}
]2. 获取成绩单
返回合并后的纯文本转录稿。
输入:
{
"url": "lxRAj1Gijic",
"lang": "en"
}输出:
"today we're going to enhance your vs code to ensure that you've got the most efficient workspace..."3. 获取定时转录文本
返回带有时间戳的转录片段,支持多种格式。
输入:
{
"url": "https://youtu.be/lxRAj1Gijic",
"lang": "en",
"format": "json"
}输出 (格式: json(默认):
[
{
"start": 0.08,
"end": 0.32,
"text": "today",
"lang": "en",
"source": "web_extraction"
},
...
]支持的格式:
json(默认):TranscriptSegment 对象的数组srtSubRip 字幕格式vttWebVTT网络字幕格式csv电子表格格式,共7列txt纯文本格式
看 格式支持 以下是详细示例。
4. 获取视频信息
返回视频元数据,包括标题、频道、时长以及可用的字幕。
输入:
{
"url": "https://www.youtube.com/watch?v=lxRAj1Gijic"
}输出:
{
"title": "The ULTIMATE VS Code Setup - Extensions & Settings 2025",
"channelId": "UCRVtCne4XmwFLot1FHMfhuw",
"duration": "PT15M23S",
"captionsAvailable": [
{ "lang": "en", "source": "youtube_api_manual" }
]
}📤 格式支持
这个(或:该) get_timed_transcript 该工具支持5种针对不同使用场景优化的输出格式:
JSON(默认)
结构化数据格式,非常适合程序化处理。
[
{
"start": 0.08,
"end": 4.359,
"text": "today I'm going to be showing you the best extensions",
"lang": "en",
"source": "web_extraction"
}
]SRT(SubRip,字幕复制工具)
视频编辑软件(Adobe Premiere、Final Cut Pro、DaVinci Resolve)的标准字幕格式。
1
00:00:00,080 --> 00:00:04,359
today I'm going to be showing you the best extensions
2
00:00:04,359 --> 00:00:07,000
and settings for VS Code in 2025VTT(WebVTT)
适用于HTML5视频播放器和浏览器的网页原生字幕格式。
WEBVTT
00:00:00.080 --> 00:00:04.359
today I'm going to be showing you the best extensions
00:00:04.359 --> 00:00:07.000
and settings for VS Code in 2025CSV(逗号分隔值)
用于数据分析的电子表格格式(Excel、Google Sheets、Python pandas)。
Sequence,Start,End,Duration,Text,Language,Source
1,00:00:00.080,00:00:04.359,00:00:04.279,"today I'm going to be showing you the best extensions",en,web_extraction
2,00:00:04.359,00:00:07.000,00:00:02.641,"and settings for VS Code in 2025",en,web_extractionTXT(纯文本)
用于文档或简单文本提取的人类可读格式。
today I'm going to be showing you the best extensions and settings for VS Code in 2025使用示例
{
"url": "https://youtu.be/lxRAj1Gijic",
"format": "srt"
}格式对比
| 格式 | 文件大小\* | 最佳用途 | MIME 类型 |
|---|---|---|---|
| JSON | 289 KB | 数据处理,APIs | application/json |
| SRT | 144 KB | 视频编辑(Premiere,Final Cut) | application/x-subrip |
| VTT | 127 KB | 网页字幕,HTML5 视频 | text/vtt |
| CSV | 175 KB | 电子表格分析,Excel | text/csv |
| TXT | 17.5 KB | 文档,纯文本 | text/plain |
\*基于一段15分钟的视频,包含3,624个转录片段。
如需了解详细的格式规范、兼容性信息以及决策树,请参阅 FORMATS.md(文件名,可译为“格式说明.md”或保持原样,根据上下文决定是否需要翻译文件名)。
🔧 预处理选项
这个(或“它”) get_timed_transcript 该工具包含可选的预处理参数,用于在格式化之前清理和优化转录本数据。出于向后兼容的考虑,默认情况下所有选项均为禁用状态。
过滤空值
移除文本为空或仅包含空白字符的段落。
用例清理自动生成的字幕,其中包含静音时段的计时标记。
示例:
{
"url": "https://youtu.be/lxRAj1Gijic",
"filterEmpty": true
}之前 (1,089个片段):
[
{ "start": 0.08, "end": 0.32, "text": "today", ... },
{ "start": 0.32, "end": 0.56, "text": "", ... },
{ "start": 0.56, "end": 1.12, "text": " ", ... },
{ "start": 1.12, "end": 1.44, "text": "we're", ... }
]之后 (987个片段,已删除102个):
[
{ "start": 0.08, "end": 0.32, "text": "today", ... },
{ "start": 1.12, "end": 1.44, "text": "we're", ... }
]合并重叠部分
合并时间戳重叠的片段。
用例修复自动生成字幕中的单词级时间同步问题,其中 end[n] > start[n+1]。
示例:
{
"url": "https://youtu.be/lxRAj1Gijic",
"mergeOverlaps": true
}之前 (时间戳重叠)
[
{ "start": 0.08, "end": 1.50, "text": "Hello", ... },
{ "start": 1.20, "end": 2.50, "text": "world", ... }
]之后 (合并后):
[
{ "start": 0.08, "end": 2.50, "text": "Hello world", ... }
]去除静音
从字幕中删除静音和暂停标记。
用例创建清晰易读的转录文本,无需(额外步骤/工具等,根据上下文补充完整) [silence], [pause], [Music] 标记物。
示例:
{
"url": "https://youtu.be/lxRAj1Gijic",
"removeSilence": true
}移除的图案 不区分大小写
[silence][pause][Music]- 单周期:
. - 单破折号:
- - 空文本/仅包含空白字符的文本
之前:
[
{ "start": 0.08, "end": 0.32, "text": "Hello", ... },
{ "start": 0.32, "end": 1.50, "text": "[silence]", ... },
{ "start": 1.50, "end": 2.80, "text": "[Music]", ... },
{ "start": 2.80, "end": 3.20, "text": "world", ... }
]之后 (已删除2段):
[
{ "start": 0.08, "end": 0.32, "text": "Hello", ... },
{ "start": 2.80, "end": 3.20, "text": "world", ... }
]组合期权
所有三种预处理选项可以一起使用。它们的应用顺序如下:
- 去除静音 - 移除静音/暂停标记
- 过滤空值 - 移除空段落
- 合并重叠部分 - 合并重叠的时间戳
示例 (所有选项均启用):
{
"url": "https://youtu.be/lxRAj1Gijic",
"filterEmpty": true,
"mergeOverlaps": true,
"removeSilence": true,
"format": "srt"
}结果:
- 1,089个片段
- 去除静音后:1,012个片段(移除77个)
- 过滤后(filterEmpty):987个片段(移除25个)
- 合并重叠后:342个片段(645个已合并)
- 决赛342个已清理并合并的SRT格式片段
TypeScript 使用方法
import { get_timed_transcript } from './tools';
// Clean transcript for reading
const cleanTranscript = await get_timed_transcript({
url: 'https://youtu.be/lxRAj1Gijic',
filterEmpty: true,
removeSilence: true,
format: 'txt'
});
// Optimized subtitle file
const subtitles = await get_timed_transcript({
url: 'https://youtu.be/lxRAj1Gijic',
mergeOverlaps: true,
filterEmpty: true,
format: 'srt'
});🏗️ 建筑学
MCP Client (e.g., Claude Desktop)
↓ JSON-RPC 2.0 over stdin
MCP Server (index.ts)
↓
Tool Router (tools.ts)
↓
┌──────────────────────┬─────────────────────────┐
│ YouTube Data API v3 │ yt-dlp (web extraction)│
│ (youtube_api.ts) │ (web_extraction.ts) │
├──────────────────────┼─────────────────────────┤
│ • List captions │ • Get transcript content│
│ • Get video metadata │ • Timestamped segments │
│ • API key auth │ • No auth required │
│ • Quota limits │ • No quota limits │
└──────────────────────┴─────────────────────────┘为何选择混合动力?
- YouTube API快速元数据检索,可靠的标题列表
- 局限性\captions.download()\ 需要 OAuth 2.0 认证(不适合自动化服务器使用)
- yt-dlp(一种用于从YouTube等网站下载视频的命令行工具)无需认证,积极维护,处理边缘情况
- 优势下载转录内容,无需OAuth复杂性
- 两者之优,集于一身元数据API,yt-dlp用于内容提取
📁 项目结构
mcp-youtube-transcript-pro/
├── src/
│ ├── index.ts # MCP server entry point (JSON-RPC handler)
│ ├── tools.ts # MCP tool implementations
│ ├── types.ts # TypeScript interfaces
│ └── adapters/
│ ├── youtube_api.ts # YouTube Data API v3 integration
│ └── web_extraction.ts # yt-dlp integration
├── test-mcp-tools.ts # Direct tool tests
├── test-mcp-protocol.ts # End-to-end protocol tests
├── package.json
├── tsconfig.json
├── .env # YOUTUBE_API_KEY
└── dist/ # Compiled JavaScript🧪 测试结果
所有测试均通过,成功率100%:
=== MCP YouTube Transcript Pro - Tool Tests ===
✅ list_tracks passed
✅ get_video_info passed
✅ get_timed_transcript passed (3624 segments, 15.39 minutes)
✅ get_transcript passed (17917 characters, 3624 words)
=== MCP JSON-RPC Protocol Tests ===
✅ initialize passed
✅ tools/list passed (4 tools)
✅ tools/call (all 4 tools) passed
✅ ping passed🛠️ 开发
可用脚本
npm run build # Compile TypeScript to dist/
npm run start # Start the MCP server
npm run dev # Start in development mode with auto-reload
npm run lint # Run ESLint
npm test # Run Jest testsVS Code 任务
使用 Ctrl+Shift+B(或在 macOS 上使用 Cmd+Shift+B)来访问预配置的任务:
- 构建编译TypeScript
- 开始运行服务器
- Dev(开发人员/开发者)使用 ts-node 的开发模式
- Lint(在编程或软件开发中,通常指代码中的无用字符、空格、注释或其他不需要的文本片段,用于清理或优化代码)检查代码质量
- 测试运行测试套件
- 安装依赖项npm install
📝 环境变量
创建一个 .env 项目根目录下的文件:
YOUTUBE_API_KEY=your_youtube_data_api_v3_key_here🔍 故障排除
“未找到 yt-dlp”
- 解决方案使用包管理器安装 yt-dlp(参见前提条件)
- 验证跑
yt-dlp --version在终端(中)
“YOUTUBE_API_KEY”环境变量未设置
- 解决方案创建
.env包含您的API密钥的文件 - 验证检查一下
.env存在并且包含YOUTUBE_API_KEY=...
“找不到模块 '../types'”
- 解决方案使用(指定工具或方法)重新构建项目
npm run build - 验证检查一下
dist/目录存在且包含编译后的 .js 文件
API配额已超出
- 问题YouTube Data API 有每日配额限制(免费层级:10,000 单位/天)
- 解决方案每个API调用使用约3个单位,yt-dlp没有配额限制
- 权宜之计;变通方法服务器使用yt-dlp获取字幕内容(不会影响API配额)
📄 许可证
MIT 许可证 - 详情请参阅 LICENSE 文件
🤝 贡献/参与
这个项目是在AI辅助下(使用GitHub Copilot - Claude Sonnet 4.5)完成的。欢迎贡献!
看 IMPLEMENTATION_COMPLETE.md 翻译为中文是:“实施完成.md”(其中,“.md”通常表示Markdown文件格式,但在此处作为文件名的一部分,直接保留原样) 以获取详细的实施说明和经验教训。
🙏 致谢
- yt-dlp(一个用于从YouTube等网站下载视频的命令行工具)YouTube内容提取的金标准
- 谷歌YouTube数据API可靠的元数据和标题列表
- 模型上下文协议人工智能工具集成的标准化协议
______________________________________________________________________
状态✅ 可投入生产 最后更新时间2025年10月17日 测试视频https://www.youtube.com/watch?v=lxRAj1Gijic(视频链接,中文表述为:“YouTube上的视频链接,观看地址为lxRAj1Gijic”)
运行容器:
docker run -i mcp-youtube-transcript-pro注:版本1.1.0增加了预处理选项(filterEmpty、mergeOverlaps、removeSilence)以及CSV/TXT输出格式。
