Skip to main content
Glama

๐ŸŽฌ YouTube Subtitle MCP Server

A Model Context Protocol (MCP) server for fetching YouTube video subtitles/transcripts with support for multiple output formats (SRT, VTT, TXT, JSON).

License TypeScript MCP

โœจ Features

  • ๐ŸŽฅ Fetch subtitles from any public YouTube video

  • ๐Ÿ“ Multiple output formats: SRT, VTT, TXT, JSON

  • ๐ŸŒ Multi-language subtitle support

  • โšก Two deployment modes: stdio (local) and HTTP (server)

  • ๐Ÿ”ง Zero-configuration setup with npx

  • ๐Ÿ“Š Complete timestamp information

  • ๐Ÿš€ Production-ready with TypeScript

  • ๐Ÿ”ฅ Built with youtubei.js for reliable and stable subtitle extraction

๐Ÿš€ Quick Start

Zero configuration required! Simply use npx:

npx -y youtube-subtitle-mcp

Or install globally:

npm install -g youtube-subtitle-mcp
youtube-subtitle-mcp

๐ŸŒ Method 2: HTTP Mode (For Server Deployment)

# Clone repository
git clone https://github.com/guangxiangdebizi/youtube-subtitle-mcp.git
cd youtube-subtitle-mcp

# Install dependencies
npm install

# Build
npm run build

# Start HTTP server
npm run start:http

Server will start at http://localhost:3000

๐Ÿ“ฆ Installation

For Development

# Clone repository
git clone https://github.com/guangxiangdebizi/youtube-subtitle-mcp.git
cd youtube-subtitle-mcp

# Install dependencies
npm install

# Build
npm run build

For Production

npm install -g youtube-subtitle-mcp

๐Ÿ”ง Configuration

Add to your MCP client configuration file:

Claude Desktop / Cursor Configuration:

  • Windows: %APPDATA%\Claude\claude_desktop_config.json

  • macOS: ~/Library/Application Support/Claude/claude_desktop_config.json

  • Linux: ~/.config/Claude/claude_desktop_config.json

{
  "mcpServers": {
    "youtube-subtitle": {
      "command": "npx",
      "args": ["-y", "youtube-subtitle-mcp"]
    }
  }
}

For local development:

{
  "mcpServers": {
    "youtube-subtitle": {
      "command": "node",
      "args": ["C:/path/to/youtube-subtitle-mcp/build/index.js"]
    }
  }
}

๐ŸŒ HTTP Mode Configuration

{
  "mcpServers": {
    "youtube-subtitle": {
      "type": "streamableHttp",
      "url": "http://localhost:3000/mcp",
      "timeout": 600
    }
  }
}

๐Ÿ› ๏ธ Tool: fetch_youtube_subtitles

Parameters

Parameter

Type

Required

Description

Example

url

string

โœ… Yes

YouTube video URL or video ID

https://www.youtube.com/watch?v=dQw4w9WgXcQ

format

string

โŒ No

Output format (default: JSON)

SRT, VTT, TXT, JSON

lang

string

โŒ No

Language code (default: auto)

zh-Hans, en, ja

Supported URL Formats

  • Standard: https://www.youtube.com/watch?v=VIDEO_ID

  • Short: https://youtu.be/VIDEO_ID

  • Embed: https://www.youtube.com/embed/VIDEO_ID

  • Direct ID: VIDEO_ID

Language Codes

  • zh-Hans - Simplified Chinese

  • zh-Hant - Traditional Chinese

  • en - English

  • ja - Japanese

  • ko - Korean

  • es - Spanish

  • fr - French

  • de - German

๐Ÿ“ Usage Examples

Example 1: Fetch JSON Format Subtitles (Default)

Please fetch subtitles from this video:
https://www.youtube.com/watch?v=dQw4w9WgXcQ

Example 2: Fetch SRT Format Subtitles

Please fetch subtitles in SRT format from:
https://www.youtube.com/watch?v=dQw4w9WgXcQ

Example 3: Fetch Specific Language Subtitles

Please fetch Simplified Chinese subtitles in VTT format from:
https://www.youtube.com/watch?v=dQw4w9WgXcQ
Language code: zh-Hans

Example 4: Fetch Plain Text Content

Please fetch plain text subtitles from:
https://youtu.be/dQw4w9WgXcQ
Format: TXT

๐Ÿ“Š Output Format Examples

JSON Format

[
  {
    "text": "Hello world",
    "start": 0,
    "end": 2000,
    "duration": 2000
  },
  {
    "text": "Welcome to YouTube",
    "start": 2000,
    "end": 5000,
    "duration": 3000
  }
]

SRT Format

1
00:00:00,000 --> 00:00:02,000
Hello world

2
00:00:02,000 --> 00:00:05,000
Welcome to YouTube

VTT Format

WEBVTT

00:00:00.000 --> 00:00:02.000
Hello world

00:00:02.000 --> 00:00:05.000
Welcome to YouTube

TXT Format

Hello world
Welcome to YouTube
This is a subtitle example

๐Ÿ—๏ธ Project Structure

youtube-subtitle-mcp/
โ”œโ”€โ”€ src/
โ”‚   โ”œโ”€โ”€ index.ts              # stdio mode entry (recommended for local use)
โ”‚   โ”œโ”€โ”€ httpServer.ts         # HTTP mode entry (for server deployment)
โ”‚   โ””โ”€โ”€ tools/
โ”‚       โ”œโ”€โ”€ fetchYoutubeSubtitles.ts  # Main tool implementation
โ”‚       โ”œโ”€โ”€ formatters.ts     # Format converters (SRT/VTT/TXT/JSON)
โ”‚       โ””โ”€โ”€ utils.ts          # Utility functions
โ”œโ”€โ”€ build/                    # Compiled JavaScript (generated)
โ”œโ”€โ”€ package.json
โ”œโ”€โ”€ tsconfig.json
โ””โ”€โ”€ README.md

๐Ÿ“š Development

Build

npm run build

Watch Mode

npm run watch

Start stdio Mode

npm run start:stdio

Start HTTP Mode

npm run start:http

Custom Port (HTTP Mode)

PORT=8080 npm run start:http

๐Ÿณ Docker Deployment

Using Docker

FROM node:18-alpine
WORKDIR /app
COPY package*.json ./
RUN npm ci --only=production
COPY . .
RUN npm run build
EXPOSE 3000
CMD ["npm", "run", "start:http"]
# Build image
docker build -t youtube-subtitle-mcp .

# Run container
docker run -d -p 3000:3000 --name youtube-mcp youtube-subtitle-mcp

Using Docker Compose

version: '3.8'
services:
  youtube-subtitle-mcp:
    build: .
    ports:
      - "3000:3000"
    environment:
      - PORT=3000
    restart: unless-stopped
docker-compose up -d

๐Ÿš€ Deployment

PM2 (Process Manager)

# Install PM2
npm install -g pm2

# Start service
pm2 start build/httpServer.js --name youtube-subtitle-mcp

# View status
pm2 status

# View logs
pm2 logs youtube-subtitle-mcp

# Restart
pm2 restart youtube-subtitle-mcp

# Stop
pm2 stop youtube-subtitle-mcp

๐Ÿ” API Reference

Health Check (HTTP Mode)

Endpoint: GET /health

Response:

{
  "status": "healthy",
  "transport": "streamable-http",
  "activeSessions": 0,
  "name": "youtube-subtitle-mcp",
  "version": "1.0.0",
  "timestamp": "2024-01-01T12:00:00.000Z"
}

MCP Endpoint (HTTP Mode)

Endpoint: POST /mcp

Headers:

  • Content-Type: application/json

  • Mcp-Session-Id: <session-id> (after initialization)

Request Body: JSON-RPC 2.0 format

โš ๏ธ Notes

  1. Public videos only: Cannot fetch subtitles from private or restricted videos

  2. Subtitles required: Video must have available subtitles (auto-generated or uploaded)

  3. Language codes: If specified language doesn't exist, an error will be returned

  4. Network required: Requires stable network connection to access YouTube

  5. Terms of Service: Please comply with YouTube's Terms of Service, use for research/analysis purposes only

โ“ FAQ

Q: Server started but client can't connect?

A: Check the following:

  1. Verify server is running: visit http://localhost:3000/health

  2. Check URL in configuration file: http://localhost:3000/mcp

  3. Ensure firewall isn't blocking port 3000

  4. Restart Cursor/Claude Desktop

Q: Why can't I fetch subtitles?

A: Possible reasons:

  • Video has no subtitles

  • Video is private or region-restricted

  • Specified language code doesn't exist

  • Network connection issue

  • Server network can't access YouTube

Q: Do you support auto-generated subtitles?

A: Yes, supports YouTube auto-generated subtitles.

Q: Can I batch process multiple videos?

A: Current version processes one video at a time. For batch processing, loop the tool call on the client side.

Q: What's the timestamp unit?

A: Timestamps in JSON format are in milliseconds (ms).

Q: Can I deploy on a remote server?

A: Yes! Just:

  1. Install Node.js on remote server

  2. Clone project and run npm install

  3. Start server with npm run start:http

  4. Use remote URL in client configuration: http://your-server:3000/mcp

  5. Recommend using HTTPS and reverse proxy (e.g., Nginx) for security

Q: How to change port?

A: Two methods:

  1. Environment variable: PORT=8080 npm run start:http

  2. Create .env file: add PORT=8080

๐Ÿค Contributing

Contributions are welcome! Please feel free to submit a Pull Request.

๐Ÿ“„ License

This project is licensed under the Apache License 2.0 - see the LICENSE file for details.

๐Ÿ‘ค Author

Xingyu Chen

๐Ÿ™ Acknowledgments

๐Ÿ“ฎ Support

If you have any questions or suggestions, please create an Issue.


Made with โค๏ธ by Xingyu Chen

Install Server
A
security โ€“ no known vulnerabilities
F
license - not found
A
quality - confirmed to work

Latest Blog Posts

MCP directory API

We provide all the information about MCP servers via our MCP API.

curl -X GET 'https://glama.ai/api/mcp/v1/servers/guangxiangdebizi/youtube-subtitle-mcp'

If you have feedback or need assistance with the MCP directory API, please join our Discord server