YtMCP
YtMCP - YouTube Model Context Protocol Server
YtMCP is a production-grade Model Context Protocol (MCP) server providing comprehensive, read-only access to YouTube data through 16 specialized tools. Designed for both local development (STDIO) and cloud deployment (HTTPS on Render), it combines multiple battle-tested libraries to deliver robust YouTube intelligence for LLM applications.
š Table of Contents
⨠Features
š Category A: Core Discovery (5 Tools)
search_videos- Basic keyword search with customizable limitssearch_filtered- Advanced search with filters (upload date, duration, sort)get_trending_videos- Fetch current trending videosfind_channels- Search for channels by name or topicfind_playlists- Discover playlists by keyword
š„ Category B: Video Intelligence (5 Tools)
get_transcript- Extract time-synced transcripts/subtitles (CRITICAL for content analysis)get_video_metadata- Comprehensive video data (views, tags, description, likes, duration)get_video_chapters- Extract video chapters/key momentsget_thumbnail- High-resolution thumbnail URLs (all qualities)get_comments- Fetch top comments (rate-limited for safety)
š Category C: Channel & Playlist Forensics (5 Tools)
get_channel_videos- List channel videos with sorting (newest, oldest, popular)get_channel_shorts- List YouTube Shorts from a channelget_channel_streams- List live streams (past and present)get_playlist_items- Flatten playlist contentsget_channel_about- Channel description and statistics
š ļø Category D: Utilities (1 Tool)
get_audio_stream_url- Get direct audio stream URLs
š Quick Start
Local Development (STDIO)
Prerequisites:
Python 3.13+
UV package manager (recommended) or pip
Installation:
# Clone the repository
git clone https://github.com/utkarshchaudhary009/ytmcp.git
cd ytmcp
# Install with UV (recommended)
uv sync
# OR install with pip
pip install -e .Run the server:
# Using UV
uv run ytmcp
# OR using pip
ytmcpThe server will start in STDIO mode, ready to accept MCP client connections.
Production Deployment (Render)
One-Click Deploy:
Manual Deployment:
Fork this repository
Create a new Web Service on Render:
Go to Render Dashboard
Click "New +" ā "Web Service"
Connect your GitHub repository
Configure the service:
Name: ytmcp Environment: Python 3 Build Command: pip install -e . Start Command: ytmcp --transport streamable-http --host 0.0.0.0 --port $PORTSet environment variables (optional):
FASTMCP_LOG_LEVEL=INFODeploy - Render will automatically deploy your MCP server with HTTPS
Your server will be available at: https://ytmcp-<random>.onrender.com
šļø Architecture
ytmcp/
āāā src/
ā āāā ytmcp/
ā āāā __init__.py
ā āāā server.py # Main FastMCP server with health check
ā āāā middleware/
ā ā āāā __init__.py
ā ā āāā rate_limiter.py # Global rate limiting (0.75s delay)
ā āāā tools/
ā āāā __init__.py
ā āāā search.py # Category A: Search tools
ā āāā video.py # Category B: Video intelligence
ā āāā channel.py # Category C: Channel forensics
ā āāā utils.py # Category D: Utilities
āāā examples/ # MCP client configurations
āāā research/ # Library research & feasibility docs
āāā render.yaml # Render deployment config
āāā Procfile # Process definition
āāā runtime.txt # Python version specification
āāā pyproject.toml # Project metadata & dependencies
āāā README.mdš§ Design Principles
Rate Limiting First - Global 0.75s delay prevents IP bans
Library Specialization:
scrapetubeā Fast channel/playlist listingyoutube-search-pythonā Search & filteringyt-dlpā Comprehensive metadata extractionyoutube-transcript-apiā Transcript fetching
LLM-Optimized Output - All responses in Markdown
Dual-Mode Operation - STDIO for local, HTTPS for production
Health Monitoring -
/healthendpoint for load balancers
āļø Configuration
MCP Clients
Gemini CLI (.gemini/mcp_config.json)
{
"mcpServers": {
"ytmcp-local": {
"command": "uv",
"args": ["run", "--directory", "/path/to/ytmcp", "ytmcp"],
"description": "YouTube MCP (Local)"
},
"ytmcp-prod": {
"url": "https://your-ytmcp.onrender.com/mcp",
"description": "YouTube MCP (Production)"
}
}
}Claude Desktop (~/Library/Application Support/Claude/claude_desktop_config.json)
{
"mcpServers": {
"ytmcp": {
"command": "uv",
"args": ["--directory", "/path/to/ytmcp", "run", "ytmcp"]
}
}
}Cursor (.cursor/mcp.json)
{
"mcpServers": {
"ytmcp": {
"command": "uv",
"args": ["--directory", "/path/to/ytmcp", "run", "ytmcp"]
}
}
}VS Code Continue (~/.continue/config.json)
{
"mcpServers": {
"ytmcp": {
"command": "uv",
"args": ["run", "--directory", "/path/to/ytmcp", "ytmcp"]
}
}
}Environment Variables
Variable | Default | Description |
|
| Logging level ( |
|
| Host to bind (HTTP transports) |
|
| Port to bind (HTTP transports) |
| - | Render auto-assigns this (production) |
š API Reference
Example Tool Calls
Search for Videos
search_videos_tool(
query="python tutorial",
limit=10
)Returns: Markdown-formatted list with titles, channels, views, URLs
Get Video Transcript
get_transcript_tool(
video_id="dQw4w9WgXcQ", # Or full URL
languages="en,de" # Fallback languages
)Returns: Time-synced transcript with [MM:SS] timestamps
Analyze Channel
get_channel_videos_tool(
channel_id="@fireship", # Supports @handle, ID, or URL
sort_by="popular",
limit=20
)Returns: Sorted video list with metadata
Extract Metadata
get_video_metadata_tool(
video_id="https://youtube.com/watch?v=dQw4w9WgXcQ"
)Returns: Comprehensive metadata (views, likes, description, tags, etc.)
š ļø Development
Setup Development Environment
# Install with dev dependencies
uv sync --dev
# Run tests
uv run pytest
# Type checking
uv run mypy src/
# Linting
uv run ruff check src/Running Different Transports
# STDIO (for MCP clients)
uv run ytmcp
# SSE (for web clients)
uv run ytmcp --transport sse --port 8000
# StreamableHTTP (for production)
uv run ytmcp --transport streamable-http --host 0.0.0.0 --port 8080Code Structure
Each tool follows this pattern:
from ..middleware.rate_limiter import rate_limiter
@rate_limiter # Automatic rate limiting
async def tool_name(param: str) -> str:
"""Tool description."""
# 1. Extract/validate IDs
# 2. Define library options
# 3. Fetch data in thread pool
# 4. Format as Markdown
# 5. Return LLM-optimized outputš¢ Deployment Guide
Render (Recommended)
Advantages:
Free tier with 750 hours/month
Auto-SSL (HTTPS)
Auto-restart on crashes
GitHub integration for auto-deploy
Steps:
Push code to GitHub
Connect Render to your repo
Use
render.yamlconfiguration (included)Deploy
Health Check: https://your-app.onrender.com/health
MCP Endpoint: https://your-app.onrender.com/mcp
Heroku
# Login to Heroku
heroku login
# Create app
heroku create ytmcp
# Deploy
git push heroku main
# Set environment
heroku config:set FASTMCP_LOG_LEVEL=INFORailway
Connect GitHub repo
Add environment variables
Deploy with Procfile
Docker (Self-Hosted)
FROM python:3.13-slim
WORKDIR /app
COPY . .
RUN pip install -e .
EXPOSE 8080
CMD ["ytmcp", "--transport", "streamable-http", "--host", "0.0.0.0", "--port", "8080"]docker build -t ytmcp .
docker run -p 8080:8080 ytmcpš Security & Compliance
Read-Only: No write operations to YouTube
No API Keys: Uses scraping libraries (check YouTube ToS for commercial use)
Privacy: No user authentication or tracking
Rate Limiting: Prevents abuse and IP bans
Transport Security: HTTPS in production, SSH for STDIO
ā ļø YouTube Terms of Service: This server uses scraping libraries that bypass official YouTube API quotas. Review YouTube's ToS before deploying for commercial purposes.
š Troubleshooting
Server Won't Start
Check Python version:
python --version # Should be 3.13+Reinstall dependencies:
uv sync --reinstallRate Limiting Too Aggressive
Adjust in src/ytmcp/middleware/rate_limiter.py:
rate_limiter = RateLimiter(delay_seconds=0.5) # Faster (risky)Render Deployment Fails
Check build logs:
Ensure Python 3.13 is available
Verify
runtime.txtspecifiespython-3.13
Common fix:
buildCommand: pip install --upgrade pip && pip install -e .MCP Client Can't Connect
Local (STDIO):
Ensure server is running:
uv run ytmcpCheck client config paths are absolute
Restart MCP client
Production (HTTPS):
Verify server health:
curl https://your-app.onrender.com/healthCheck MCP endpoint:
https://your-app.onrender.com/mcpEnsure HTTPS (not HTTP)
š¤ Contributing
Contributions welcome! Please:
Review
/researchfor library capabilitiesFollow existing tool patterns
Maintain rate limiting
Format outputs in Markdown
Update documentation
Development Workflow:
# Fork and clone
git clone https://github.com/utkarshchaudhary009/ytmcp.git
# Create feature branch
git checkout -b feature/new-tool
# Make changes and test
uv run ytmcp
# Submit PRš License
MIT License - See LICENSE file
š Acknowledgments
Built with these excellent libraries:
yt-dlp - Video metadata extraction
scrapetube - Channel scraping
youtube-search-python - Search
youtube-transcript-api - Transcripts
MCP Python SDK - Protocol foundation
š Support
Issues: GitHub Issues
Discussions: GitHub Discussions
Documentation: See
/researchfor design decisions
Built with ā¤ļø for the LLM ecosystem