YouTube MCP Server
Server Configuration
Describes the environment variables required to run the server.
| Name | Required | Description | Default |
|---|---|---|---|
| MCP_HOST | No | HTTP listen address (HTTP mode only). | 0.0.0.0 |
| MCP_PORT | No | HTTP listen port (HTTP mode only). | 8088 |
| LOG_LEVEL | No | Level for the server and application loggers. | INFO |
| HTTP_PROXY | No | Generic proxy alternative for transcript fetching; unset by default. | |
| HTTPS_PROXY | No | Generic proxy alternative for transcript fetching; unset by default. | |
| DATABASE_PATH | No | SQLite cache file. Relative by default — set an absolute path in a container. | cache.db |
| MCP_TRANSPORT | No | Transport to use: stdio or http. Selects the transport in the youtube-mcp console script. | stdio |
| RESPONSE_LIMIT | No | Transcript truncation threshold, in characters. Cumulative-character policy, same for both variants. | 50000 |
| YOUTUBE_API_KEY | Yes | Required. Single YouTube Data API key. Parsed as a SecretStr, so it never appears in logs, reprs or tracebacks. | |
| CACHE_TTL_SECONDS | No | TTL for cached video statistics, in seconds. 0 means never expires. | 3600 |
| FASTMCP_STATELESS_HTTP | No | Leave it true for replicas. Set false only for a single-replica debugging session. | true |
| WEBSHARE_PROXY_PASSWORD | No | Webshare proxy password for transcript fetching; unset by default. Parsed as a SecretStr. | |
| WEBSHARE_PROXY_USERNAME | No | Webshare proxy username for transcript fetching; unset by default. | |
| YOUTUBE_TRANSCRIPT_LANG | No | Default transcript language when a tool call does not name one. | en |
Instructions
Guidance the server publishes about itself, which clients place ahead of the tool catalog so the model reads it before choosing anything.
This server publishes no instructions, or was last inspected before Glama recorded them.
Capabilities
Features and capabilities supported by this server
Protocol revision2025-11-25
| Capability | Details |
|---|---|
| tools | {
"listChanged": true
} |
| logging | {} |
| prompts | {
"listChanged": false
} |
| resources | {
"subscribe": false,
"listChanged": false
} |
Tools
Functions exposed to the LLM to take actions
| Name | Description |
|---|---|
| youtube_get_transcriptA | Fetch a YouTube video's transcript as plain text. Returns the caption text for one 11-character video ID, with the language that was
actually used, whether it is auto-generated, and Timestamps are OFF by default because each Long transcripts are truncated at the server's Costs no YouTube Data API quota: transcripts are scraped from YouTube's internal caption endpoint, not the Data API. They are cached forever, so a repeat call is free. Failures are expected and specific — captions may be disabled, absent in the requested languages, or the IP may be blocked (transient). Age-restricted videos cannot be read. |
| youtube_get_timestamped_transcriptA | Fetch a YouTube video's transcript as timed segments. Returns every caption segment as Long transcripts are truncated at |
| youtube_list_transcript_languagesA | List the caption tracks available for a YouTube video. Returns one entry per track: Cached forever, costs no Data API quota. Fails cleanly when a video has captions disabled or no caption track at all — that is a normal outcome, not an outage. |
| youtube_search_in_transcriptA | Search inside a video's transcript and return only the matching segments. A case-insensitive substring search over the caption segments, done server-side, so a
narrow question ("does this video mention Kubernetes?") costs a few hundred tokens
instead of the whole transcript. Returns matching segments with their Limitations: matching is per caption segment, so a phrase spanning a segment boundary
will not match; the query is a literal substring, not a boolean/regex expression. Pass
|
| youtube_search_videosA | Search YouTube for videos by keyword. Uses a scarce quota bucket: 100 calls/day. Returns video IDs with titles, descriptions, channels and publish times, plus
Prefer other tools first. Each page — including one fetched with
|
| youtube_get_videoA | Get YouTube video metadata by ID — title, description, channel, duration, statistics. Accepts one ID or up to 50 (a single string is treated as one ID). Returns the videos
that exist plus Costs one unit from the shared 10,000-unit daily pool per 50 IDs. If you only need
view/like/comment counts, use
|
| youtube_get_video_statsA | Get view, like and comment counts for up to 50 videos in one call. Accepts one ID or a list. Uses A batch is not atomic: IDs that do not exist or are not publicly visible come back as
|
| youtube_get_commentsA | Get a video's top-level comments — text, author, likes, publish time. Ordered by Limitation: replies are not returned in this version — and neither are their
counts. Only top-level comments come back, so there is no reply text and no reply
count to present; never imply you have read replies. Comment text arrives with
If the video's owner disabled comments, the call fails with a clear message saying so — that is normal and retrying will not change it. |
| youtube_get_channelA | Get a YouTube channel by ID or by handle — pass exactly one of the two. Returns the channel's title, description, custom URL, publish date and statistics
(subscriber count — rounded by YouTube — video count, total views) plus
|
| youtube_list_channel_videosA | List a channel's recent uploads, newest first — the cheap alternative to searching. Fetches the channel's uploads playlist (via Requires the channel's ID (start from |
| youtube_list_categoriesA | List YouTube's video categories, optionally for one region. Returns each category's The whole list arrives in one response (no paging) and costs one unit from the
shared pool. Titles are returned in English. Some categories are not assignable to
new uploads ( |
Prompts
Interactive templates invoked by user choice
| Name | Description |
|---|---|
No prompts | |
Resources
Contextual data attached and managed by the client
| Name | Description |
|---|---|
No resources | |
TDQS
Scored across 11 tools
Each tool has a distinct focus (transcript text vs. timed segments vs. language listing vs. in-transcript search vs. general video search vs. metadata vs. stats vs. comments vs. channel vs. channel uploads vs. categories). The main potential confusion is between youtube_get_transcript and youtube_get_timestamped_transcript, but the descriptions clarify exactly when to use each.
All 11 tools follow a strict youtube_verb_noun pattern (e.g., youtube_get_transcript, youtube_search_videos, youtube_list_channel_videos, youtube_get_video_stats). No deviations in casing or verb style.
With 11 tools, the set is well-scoped: it covers transcripts, searches, video metadata, stats, comments, channels, and categories without being bloated or thin. Each tool earns its place and no obvious overlaps require merging.
The surface covers most read-only YouTube operations, including transcript access, video/channel data, comments, and search. Primary gaps are write operations (e.g., posting comments) and replies in comments, but these may be intentional for a read-only server; the core discovery and retrieval workflows are complete.