Skip to main content
Glama
YouTube Transcript MCP Server

YouTube Transcript MCP Server

by suckerfish

YouTube Transcript MCP Server

A production-ready Model Context Protocol (MCP) server that provides YouTube transcript fetching capabilities using yt-dlp CLI for reliable subtitle extraction. Uses browser impersonation and a JS runtime to reduce YouTube rate limiting.

Status: Production Ready

  • CLI-Based: Uses yt-dlp subprocess with browser impersonation to reduce HTTP 429 rate limiting

  • FastMCP 2.14.5: Tool annotations, context logging, progress reporting, prompt templates

  • GHCR CI/CD: Multi-arch Docker images (amd64/arm64) built on every push

  • Universal Compatibility: Time parameters work across all MCP clients

  • Advanced Analytics: Enhanced transcript summary with content analysis

  • Multi-Language: 100+ languages with auto-generated and manual transcripts

Related MCP server: ytmcp

Features

  • Fetch transcripts from YouTube videos with metadata and timestamps

  • Time filtering - extract specific segments by start/end times

  • Search functionality - find text within transcripts with context

  • Advanced analytics - speaking pace, filler words, engagement metrics, top words

  • Language detection - list available transcript languages

  • Prompt templates - pre-built prompts for video summarization and topic search

  • Transcript caching - 10-minute TTL cache avoids redundant YouTube requests

  • Retry with backoff - automatic retries on timeouts and transient errors

  • Universal format support - handles both video IDs and full YouTube URLs

  • Dual transport - STDIO and HTTP transport modes

  • Docker support - containerized deployment via GHCR with health checks

Installation

# Pull from GHCR and run
docker run -d -p 8080:8080 ghcr.io/suckerfish/yttranscript_mcp:latest

# Or use docker compose
docker compose up -d

# Health check
curl http://localhost:8080/health

Local Development

# Install dependencies
uv pip install -e .

# Run server (STDIO mode)
python src/server.py

# Run server (HTTP mode)
uvicorn src.server:app --host 0.0.0.0 --port 8080

Usage

Available Tools

All tools are read-only (readOnlyHint=True) and tagged read.

  1. get_transcript - Fetch video transcripts with optional time filtering

  2. search_transcript - Search for specific text within transcripts

  3. get_transcript_summary - Advanced analytics and content insights

  4. get_available_languages - List available transcript languages

Prompt Templates

  • summarize_video(video_id, language_code) - Summarize a YouTube video transcript

  • search_topic_in_video(video_id, topic) - Search for and analyze a topic within a video

Testing Commands

# Discover tools
mcp tools .venv/bin/python src/server.py

# Basic transcript
mcp call get_transcript --params '{"video_id":"jNQXAC9IVRw"}' .venv/bin/python src/server.py

# Time-filtered transcript
mcp call get_transcript --params '{"video_id":"jNQXAC9IVRw", "start_time": 10, "end_time": 60}' .venv/bin/python src/server.py

# Search within transcript
mcp call search_transcript --params '{"video_id":"jNQXAC9IVRw", "query":"example"}' .venv/bin/python src/server.py

# Advanced analytics
mcp call get_transcript_summary --params '{"video_id":"jNQXAC9IVRw"}' .venv/bin/python src/server.py

# Available languages
mcp call get_available_languages --params '{"video_id":"jNQXAC9IVRw"}' .venv/bin/python src/server.py

MCP Client Configuration

HTTP Transport (Production)

{
  "yttranscript": {
    "url": "http://localhost:8080/mcp"
  }
}

STDIO Transport (Development)

{
  "yttranscript": {
    "command": "uv",
    "args": [
      "run",
      "--directory", "/path/to/yttranscript_mcp",
      "src/server.py"
    ]
  }
}

Key Features

Universal Parameter Compatibility

Time filtering parameters accept multiple formats:

  • Integers: {"start_time": 10}

  • Floats: {"start_time": 10.5}

  • Strings: {"start_time": "10"}

  • Nulls: {"start_time": null} or {"start_time": "null"}

Advanced Analytics

The get_transcript_summary tool provides:

  • Speaking pace analysis (words per minute with descriptive labels)

  • Filler word detection (um, uh, like, etc.) with percentages

  • Content indicators (conversational, formal, high energy)

  • Top frequent words (excluding stop words)

  • Engagement metrics (questions, exclamations)

  • Reading time estimates at multiple speeds

CLI Implementation Benefits

  • Fewer rate limits - browser impersonation, a JS runtime, and backoff retries on HTTP 429

  • Reliable extraction - uses yt-dlp's robust parsing

  • Automatic retries - backoff on timeouts and transient errors

  • Format flexibility - handles VTT, JSON3, and other subtitle formats

Configuration

Environment Variables

YT_TRANSCRIPT_SERVER_PORT=8080    # Server port (default: 8080)
YT_TRANSCRIPT_SERVER_HOST=0.0.0.0 # Server host (default: 0.0.0.0)
YT_TRANSCRIPT_DEBUG=false         # Debug mode

Dependencies

  • fastmcp>=2.14.5,<3.0.0 - MCP server framework

  • yt-dlp - YouTube transcript extraction via CLI

  • pydantic>=2.0.0 - Data validation and models

  • uvicorn>=0.24.0 - ASGI server for HTTP transport

This project uses uv for package management.

Deployment

Docker images are built by GitHub Actions on every push to main and published to GHCR:

ghcr.io/suckerfish/yttranscript_mcp:latest

Multi-arch support: linux/amd64 and linux/arm64.

Troubleshooting

  • Tool not found: Verify @mcp.tool() decorator in tool definitions

  • Validation errors: Video IDs must be 11 characters, time values must be non-negative

  • Time filtering issues: Parameters accept multiple formats (int/float/string/null)

  • Transport issues: Use uvicorn for HTTP mode, python src/server.py for STDIO

  • No transcript available: Check with get_available_languages first

  • Missing session ID: Server uses stateless_http=True for clients without session management

License

This project is open source and available under the MIT License.

Available Tools

4 tools
get_available_languagesC
    Get list of available transcript languages for a YouTube video using yt-dlp.
    
    Args:
        video_id: YouTube video ID or URL
        
    Returns:
        List of available languages with metadata
    

Inputs: video_id (required).

get_transcriptA
    Fetch the transcript for a YouTube video using yt-dlp.
    
    Args:
        video_id: YouTube video ID or URL
        language_code: Optional language code (e.g., 'en', 'es'). If not provided, uses auto-detected language.
        preserve_formatting: Whether to preserve timestamp formatting in plain text
        start_time: Optional start time in seconds to filter transcript
        end_time: Optional end time in seconds to filter transcript
        
    Returns:
        Complete transcript data with metadata
    

Inputs: video_id (required), language_code, preserve_formatting, start_time, +1 more.

get_transcript_summaryB
    Get a summary of the transcript including key statistics and sample text.
    
    Args:
        video_id: YouTube video ID or URL
        language_code: Optional language code
        max_length: Maximum length of sample text
        
    Returns:
        Summary with statistics and sample text
    

Inputs: video_id (required), language_code, max_length.

search_transcriptA
    Search for specific text within a YouTube video transcript.
    
    Args:
        video_id: YouTube video ID or URL
        query: Text to search for
        language_code: Optional language code for transcript
        case_sensitive: Whether search should be case sensitive
        context_window: Seconds of context to include before/after matches
        
    Returns:
        Search results with context and timestamps
    

Inputs: video_id (required), query (required), language_code, case_sensitive, +1 more.

Tool Schema Changelog

Recent tool additions, removals, and schema changes observed during successful MCP inspections.

Loading tool schema changelog…

    TDQS

    A3.8/5.0

    Scored across 4 tools

    Disambiguation5/5

    Each tool has a clearly distinct purpose with no overlap: get_available_languages lists languages, get_transcript fetches full transcripts, get_transcript_summary provides statistical summaries, and search_transcript performs text searches. The descriptions reinforce these distinct roles, making tool selection unambiguous for an agent.

    Naming Consistency5/5

    All tool names follow a consistent verb_noun pattern with snake_case (e.g., get_available_languages, get_transcript, get_transcript_summary, search_transcript). The naming is predictable and readable throughout the set, with no deviations in style or convention.

    Tool Count5/5

    With 4 tools, the server is well-scoped for its purpose of YouTube transcript retrieval and analysis. Each tool earns its place by covering distinct aspects of the workflow (language discovery, full transcript fetching, summarization, and searching), avoiding bloat while providing complete functionality.

    Completeness5/5

    The tool set offers complete coverage for the domain of YouTube transcript operations. It includes language discovery, full transcript retrieval, summarization, and searching, with no obvious gaps. Agents can perform all core transcript-related tasks without dead ends or missing operations.

    Maintenance

    ActivityMaintained
    ResponsivenessNo recent community issues

    Related MCP Connectors

    Related MCP Servers