Skip to main content
Glama

Video Transcript MCP Server

A Model Context Protocol server for video/audio transcription with multi-platform support.

Features

  • Three-tier transcription strategy: Subtitle extraction first (zero cost) → Whisper local transcription (offline free) → Mini-program guidance for closed platforms

  • 1000+ platform support via yt-dlp: YouTube, Bilibili, Douyin, Kuaishou, TikTok, and more

  • Long video handling: Auto-split by 30-minute segments (configurable) with checkpoint resume

  • Chinese ASR optimization: Bilibili AI subtitles, HuggingFace mirror, SenseVoice/Paraformer ready

  • Sync & Async modes: Direct results for short videos, task polling for long videos

  • Structured output: Pydantic-validated results with timestamps, segments, and metadata

Related MCP server: Video Transcriber MCP Server

Quick Start

Install

pip install video-transcript-mcp

# With Whisper support
pip install 'video-transcript-mcp[whisper]'

# With dev tools (MCP Inspector, testing)
pip install 'video-transcript-mcp[dev]'

Run

# Direct run
video-transcript-mcp

# Or with uvx (no install needed)
uvx video-transcript-mcp

# Debug with MCP Inspector
mcp dev video_transcript_mcp.server:mcp

Prerequisites

The server relies on external tools for audio processing:

# Install yt-dlp (video download + subtitle extraction)
pip install yt-dlp

# Install FFmpeg (audio splitting + format conversion)
brew install ffmpeg        # macOS
sudo apt install ffmpeg    # Ubuntu/Debian

# Install faster-whisper (local transcription)
pip install faster-whisper

MCP Client Configuration

Claude Desktop

Add to ~/Library/Application Support/Claude/claude_desktop_config.json:

{
  "mcpServers": {
    "video-transcript": {
      "command": "uvx",
      "args": ["video-transcript-mcp"]
    }
  }
}

Cursor

Add to .cursor/mcp.json:

{
  "mcpServers": {
    "video-transcript": {
      "command": "uvx",
      "args": ["video-transcript-mcp"]
    }
  }
}

Trae

Add to Trae MCP settings:

{
  "mcpServers": {
    "video-transcript": {
      "command": "python3",
      "args": ["-m", "video_transcript_mcp.server"]
    }
  }
}

Claude Code

claude mcp add video-transcript -- uvx video-transcript-mcp

Tools

transcribe_url

Transcribe a video from URL using the three-tier strategy.

# Short video (sync mode - direct result)
transcribe_url(url="https://www.youtube.com/watch?v=xxxxx")

# Long video (async mode - returns task_id)
transcribe_url(
    url="https://www.bilibili.com/video/BVxxxxx",
    async_mode=True
)
# Then poll:
get_transcript_status(task_id="abc12345")

Parameters:

Parameter

Type

Default

Description

url

str

required

Video URL

model

str

large-v3-turbo

Whisper model

language

str

zh

Language code

cookies_browser

str?

null

Browser for cookies

skip_subtitles

bool

false

Skip to Whisper directly

segment_minutes

int

30

Segment length for long video splitting. Increase for 1h+ videos

async_mode

bool

false

Return task_id for polling

transcribe_file

Transcribe a local audio/video file.

# Short file (sync mode)
transcribe_file(file_path="/path/to/audio.mp3")

# Long file (1h+) with larger segments
transcribe_file(
    file_path="/path/to/lecture.mp4",
    segment_minutes=60,
    async_mode=True
)

get_transcript_status

Poll the status of an async transcription task.

get_transcript_status(task_id="abc12345")
# Returns: {status: "completed", progress: 1.0, result: {...}}

list_transcripts

List all completed transcripts.

list_transcripts()
# Returns: [{task_id, title, platform, method, duration, ...}]

Three-Tier Transcription Strategy

URL Input
    │
    ├─ Tier 1: Subtitle Extraction (zero cost, fastest)
    │   ├─ YouTube: zh-Hans, zh-CN, zh, en
    │   ├─ Bilibili: ai-zh (AI subtitles)
    │   └─ Others: zh-CN, zh, en
    │
    ├─ Tier 2: Whisper Transcription (offline, free)
    │   ├─ Download audio via yt-dlp
    │   ├─ Split by 30-min segments (configurable, long video)
    │   ├─ Transcribe each segment with faster-whisper
    │   ├─ Global timestamp concatenation
    │   └─ Checkpoint resume support
    │
    └─ Tier 3: Mini-Program Guidance (closed platforms)
        ├─ Xiaohongshu (小红书)
        └─ WeChat Video (视频号)

Environment Variables

Variable

Default

Description

HF_ENDPOINT

(unset)

Set to https://hf-mirror.com for China network optimization

HF_HUB_DISABLE_XET

1

Disable Xet storage (avoids download errors)

TRANSCRIPT_OUTPUT_DIR

~/.video-transcript-mcp/output

Output directory

Supported Platforms

Platform

Subtitle Extraction

Whisper Fallback

Notes

YouTube

✅

✅

Auto-subs + manual subs

Bilibili

✅

✅

AI subtitle (ai-zh), requires cookies for subtitle access

Douyin

✅

✅

Kuaishou

✅

✅

TikTok

✅

✅

Weibo

✅

✅

Xiaohongshu

❌

❌

Mini-program guidance

WeChat Video

❌

❌

Mini-program guidance

Local files

N/A

✅

mp3, mp4, wav, m4a, flac

Podcast URLs

✅

✅

Direct audio download

Community

Join our AI Tool Monetization Circle (AI 工具变现实战圈) on Knowledge Planet (知识星球):

  • Weekly MCP tutorials and real-world case studies

  • Deep-dive source code analysis of this project

  • AI tool monetization strategies and playbooks

  • 1-on-1 technical Q&A

Scan the QR code above or search "AI 工具变现实战圈" on Knowledge Planet to join.

License

MIT

Available Tools

4 tools
get_transcript_statusA

Check the status of an async transcription task.

Returns the task status, progress, and result (if completed). Poll this periodically until status is 'completed' or 'failed'.

Inputs: task_id (required).

list_transcriptsA

List all completed transcripts.

Returns a list of completed transcription tasks with metadata. Use get_transcript_status with a task_id to get full transcript text.

Inputs: no named parameters. Returns: result

transcribe_fileA

Transcribe a local audio/video file using Whisper.

Supports mp3, m4a, mp4, wav, flac, and other FFmpeg-compatible formats. For files over 30 minutes, use async_mode=true. Adjust segment_minutes for 1h+ files to reduce segment count.

Inputs: file_path (required), model, language, async_mode, +1 more.

transcribe_urlA

Transcribe a video from URL using three-tier strategy.

Tier 1: Extract platform subtitles (zero cost, fastest) Tier 2: Download audio + Whisper local transcription (offline, free) Tier 3: Return guidance for closed platforms (Xiaohongshu/WeChat)

For videos under 30 minutes, use sync mode (default) for direct results. For longer videos, set async_mode=true to get a task_id, then poll with get_transcript_status. Adjust segment_minutes for 1h+ videos.

Inputs: url (required), model, language, async_mode, +3 more.

Tool Schema Changelog

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

Loading tool schema changelog…

    TDQS

    A4.5/5.0

    Scored across 4 tools

    Disambiguation5/5

    Each tool has a clearly distinct purpose: transcribe_file processes local media, transcribe_url handles remote videos, get_transcript_status polls async tasks, and list_transcripts shows completed transcripts. The descriptions explicitly differentiate these, leaving no ambiguity.

    Naming Consistency5/5

    All four tools follow a consistent verb_noun pattern with snake_case (transcribe_file, transcribe_url, get_transcript_status, list_transcripts). The verbs clearly indicate the action and the nouns the resource, forming a predictable and coherent naming scheme.

    Tool Count5/5

    Four tools is well-scoped for a video transcription server, covering the essential operations (transcribe local/remote, check status, list results) without unnecessary overlap or bloat. This is an appropriate size for the domain.

    Completeness4/5

    The tool set covers the full transcription workflow: synchronous and async transcription, status polling, and listing completed results. Minor gaps like cancellation or direct retrieval of a transcript by ID are missing, but these are not critical for the core use case.

    Maintenance

    ActivityNo data
    ResponsivenessOutdated data

    Related MCP Connectors

    Related MCP Servers