YouTube Channel MCP
Server Configuration
Describes the environment variables required to run the server.
| Name | Required | Description | Default |
|---|---|---|---|
| YT_CONFIRM | No | Confirmation mode: public, always or never. | public |
| YT_CHUNK_MB | No | Upload chunk size in MB, rounded to 256 KB. | 16 |
| YT_MCP_HOME | No | Data folder for the state database, templates and transcripts. | ~/.youtube-channel-mcp |
| YT_MCP_VAULT | No | Set to file to use the encrypted file instead of the OS keychain. | |
| OPENAI_API_KEY | No | Speech-to-text API key. Alternative to TRANSCRIBE_API_KEY. | |
| OPENAI_BASE_URL | No | Any OpenAI-compatible speech-to-text endpoint. Alternative to TRANSCRIBE_BASE_URL. | https://api.openai.com/v1 |
| GOOGLE_CLIENT_ID | No | Desktop-app OAuth client ID. Defaults to the value stored in the OS keychain by setup. | |
| TRANSCRIBE_MODEL | No | Speech-to-text model or deployment name. | whisper-1 |
| TRANSCRIBE_API_KEY | No | Speech-to-text API key. Alternative to OPENAI_API_KEY. | |
| TRANSCRIBE_BASE_URL | No | Any OpenAI-compatible speech-to-text endpoint. Alternative to OPENAI_BASE_URL. | https://api.openai.com/v1 |
| YT_DAILY_UNIT_LIMIT | No | Daily API unit budget used for the local quota estimate. | 10000 |
| GOOGLE_CLIENT_SECRET | No | Desktop-app OAuth client secret. Defaults to the value stored in the OS keychain by setup. | |
| YT_DAILY_UPLOAD_LIMIT | No | Daily upload budget used for the local quota estimate. | 100 |
Instructions
Guidance the server publishes about itself, which clients place ahead of the tool catalog so the model reads it before choosing anything.
Manage a YouTube channel through the official YouTube Data and Analytics APIs.
Start with auth_status. If no channel is connected, call connect_channel (it opens Google sign-in in the browser).
What you can do:
Publish: generate_metadata → write title/description/chapters/tags → preview_metadata → upload_video (file_path on this computer, or url) → follow get_upload_status until ready. Thumbnail, playlists and captions can go in the same call. Uploads resume from the last byte after drops or restarts.
Videos: list_my_videos, get_video, update_video, set_visibility (publish/unlist/schedule), set_thumbnail, set_video_localizations, delete_video.
Channel: get_channel, update_channel (description, keywords, trailer, translations), set_channel_banner, set_watermark.
Community: list_comments (per video or channel-wide, including held-for-review and likely spam), reply_to_comment, moderate_comments, delete_comment.
Analytics: get_analytics (overview, daily, top_videos, traffic_sources, search_terms, geography, devices, demographics, retention, custom).
Organise: playlists (list/create/update/delete/add/remove/reorder), captions (list/upload/download/delete, transcribe_video), templates.
Safety: anything public (publishing, scheduling, public replies, channel profile and banner changes) or destructive needs the user's approval. If a tool returns CONFIRMATION REQUIRED, show the summary to the user and only call again with the confirmation_token after they say yes. Never invent approval.
Quota: one Google Cloud project has a daily budget (about 100 uploads and 10,000 API units). On quota errors, stop; uploads resume after the midnight Pacific reset. Unaudited Google Cloud projects may have uploads forced to private; tools report it when it happens.
Capabilities
Features and capabilities supported by this server
Protocol revision2025-11-25
| Capability | Details |
|---|---|
| tools | {
"listChanged": true
} |
| logging | {} |
| prompts | {
"listChanged": true
} |
Tools
Functions exposed to the LLM to take actions
| Name | Description |
|---|---|
| auth_statusA | Show whether Google OAuth is configured, which YouTube channels are connected (and whether their sign-in is healthy), the default channel, today’s quota use, and known project limitations. Call this first in a new conversation. |
| connect_channelA | Start Google sign-in to connect (or reconnect) a YouTube channel. Opens the browser on this computer and returns the sign-in link; the user picks the Google account and channel (brand accounts work). Waits up to wait_seconds for them to finish. |
| list_channelsB | List the YouTube channels connected to this server. |
| set_default_channelA | Choose which connected channel is used when a tool call does not name one. |
| disconnect_channelA | Remove a connected channel and revoke this app’s Google access to it. Needs the user’s confirmation. |
| upload_videoA | Upload a video file from this computer (file_path) or a public URL to YouTube with a resumable, checkpointed upload that survives network drops and restarts. Optionally schedule it (publish_at), set a thumbnail, add it to playlists and attach captions in the same call. Runs in the background: returns a job_id right away (or the finished video if it completes within wait_seconds). Poll get_upload_status. Private uploads start immediately; public, unlisted and scheduled uploads need the user’s confirmation first. Tip: write metadata first (generate_metadata, then preview_metadata). |
| get_upload_statusA | Status of an upload job (progress, errors, resulting video) and/or a video’s YouTube processing state (processing, failed, rejected), plus a check for the "locked to private" restriction. Can wait for changes. |
| list_uploadsB | Recent upload jobs from this computer, newest first, with progress and results. |
| cancel_uploadA | Stop an upload job that has not finished. It can be resumed later with resume_upload. |
| resume_uploadB | Resume a stopped, failed or cancelled upload from the last byte YouTube confirmed (for example after a quota reset or reconnecting the channel). Network drops and quota resets are also retried automatically. |
| list_my_videosA | List videos on the channel, newest first (including private, unlisted and scheduled ones), with privacy, schedule, duration and view counts. Paginate with page_token. |
| get_videoB | Full details of one video: metadata, privacy and schedule, processing state, duration, captions flag and statistics. |
| update_videoA | Change a video’s title, description, tags, category, languages, audience and other settings. Only the fields you pass change. Optionally apply a template to the fields you pass (title format; footer and hashtags when you pass description; template tags when you pass tags). Changing visibility to public/unlisted or scheduling needs the user’s confirmation (or use set_visibility). |
| set_visibilityA | Change who can see a video: private, unlisted or public, or schedule it with publish_at. Anything other than private needs the user’s confirmation. |
| delete_videoA | Permanently delete a video from YouTube. Cannot be undone. Always needs the user’s confirmation. |
| set_thumbnailA | Upload a JPG or PNG (max 2 MB, ideally 1280x720) from this computer as the video’s thumbnail. The channel must be phone-verified. |
| set_video_localizationsA | Add or update the title and description shown to viewers in other languages, e.g. {"hi": {"title": "...", "description": "..."}}. Merged with existing translations. The video needs a default_language set (update_video). |
| list_categoriesB | YouTube video categories you can assign (id and name) for a region. |
| list_playlistsB | All playlists on the channel with id, title, privacy and video count. |
| create_playlistC | Create a new playlist on the channel. |
| add_to_playlistB | Add a video to a playlist by playlist id or exact title. Optionally at a position (0 = first). |
| remove_from_playlistB | Remove a video from a playlist (the video itself is not deleted). |
| update_playlistA | Rename a playlist, change its description or privacy. Making it public or unlisted needs the user’s confirmation. |
| delete_playlistA | Delete a playlist (the videos in it are not deleted). Needs the user’s confirmation. |
| move_in_playlistA | Move a video to a new position in a playlist (0 = first). Works for playlists sorted manually. |
| list_playlist_itemsD | Videos in a playlist, in order. |
| list_captionsC | Caption tracks on a video (language, name, auto-generated or uploaded, draft). |
| upload_captionsB | Add a captions track (.srt, .vtt or other YouTube-supported format) to a video, from a file on this computer or inline content. |
| delete_captionsA | Delete an uploaded caption track (see list_captions for ids). Needs the user’s confirmation. |
| download_captionsA | Download a caption track of your own video as SRT (prefers uploaded tracks, falls back to auto-generated). Costs 250 quota units. |
| transcribe_videoA | Transcribe a video file on this computer with any OpenAI-compatible speech-to-text API (needs ffmpeg and a configured key). Saves an .srt you can pass to upload_video or upload_captions, and returns a timestamped transcript for writing metadata and chapters. |
| generate_metadataA | Collect everything needed to write a strong title, description, chapters and tags: the transcript with timestamps (from text you pass, a .srt/.vtt/.txt file, an uploaded video’s captions, or by transcribing a local file), the chosen template and YouTube’s rules. You then write the metadata and check it with preview_metadata. |
| preview_metadataA | Show exactly what would be sent to YouTube (title, description, tags, playlists) after applying a template, and check it against YouTube’s limits and chapter rules. No API call, no quota. |
| list_templatesC | Metadata templates (title format, description footer, default tags, hashtags, category, playlists, voice guidance) available for uploads. |
| save_templateB | Create or replace a metadata template, saved as JSON in the templates folder. Use {title} in title_format. |
| delete_templateC | Delete a saved template file. |
| quota_statusA | Estimated YouTube API quota used today (units and uploads) for this Google Cloud project, and when it resets (midnight Pacific Time). |
| get_channelC | The channel’s title, handle, description, keywords, country, default language, trailer, subscriber/view/video counts, banner and settings. |
| update_channelA | Change the channel description, keywords, country, default language or the trailer shown to non-subscribers. Only the fields you pass change. These are public, so the user confirms first. (The channel name and handle can only be changed in YouTube Studio.) |
| set_channel_bannerA | Upload a channel banner (JPG/PNG, 16:9, at least 2048x1152, ideally 2560x1440, max 6 MB). Public, so the user confirms first. |
| set_watermarkA | Set the subscribe watermark shown on all channel videos (square JPG/PNG, at least 150x150, max 1 MB), or remove it with remove: true. |
| list_commentsA | Comment threads on one video, or across the whole channel (newest first). Filter by moderation state (published, held_for_review, likely_spam) or search text. Includes replies. |
| reply_to_commentA | Post a public reply to a comment (comment_id = the top-level comment or thread id) or a new top-level comment on a video (video_id). Posts publicly as the channel, so the user confirms the exact text first. |
| moderate_commentsA | Publish held comments, hold comments for review, or remove (reject) them; optionally ban the author from commenting on the channel. Removing or banning needs the user’s confirmation. |
| delete_commentA | Delete a comment or reply that the channel itself wrote (other people’s comments are removed with moderate_comments). Needs the user’s confirmation. |
| get_analyticsA | YouTube Analytics for the channel or one video. Reports: overview (views, watch time, average view duration, subscribers gained/lost, likes, comments, shares), daily (trend by day), top_videos (best performers with titles), traffic_sources, search_terms (YouTube search queries), geography, devices, demographics (age/gender), retention (audience retention curve, needs video_id), subscribed_status, or custom (your own metrics/dimensions). Defaults to the last 28 days. Data lags about 2 days. |
Prompts
Interactive templates invoked by user choice
| Name | Description |
|---|---|
| publish_video | Guided flow: transcript → metadata → upload → thumbnail/playlists → confirm visibility. |
Resources
Contextual data attached and managed by the client
| Name | Description |
|---|---|
No resources | |
TDQS
Scored across 46 tools
Tools are largely organized by resource+action (video, playlist, caption, comment, channel, template), and descriptions draw the few delicate boundaries explicitly (delete_comment only deletes the channel's own comments; others go through moderate_comments). The main soft overlaps are set_visibility vs update_video's visibility field and moderate_comments' remove vs delete_comment, but both are spelled out. An agent can pick correctly with modest care.
Nearly everything follows a verb_noun pattern (upload_video, list_playlists, move_in_playlist, moderate_comments, set_thumbnail). The only deviations are noun-only status tools (auth_status, quota_status), which read fine in context. No mixed casing or style chaos.
46 tools is far beyond a comfortable working set for a single server, even one covering this many sub-domains (uploads, videos, playlists, captions, comments, channel branding, analytics, templates, auth, quota). Several thin tools (auth_status, quota_status, list_uploads) could be folded into broader resources. The surface is heavy enough that discovery itself becomes a burden.
The lifecycle is covered end to end: video and playlist CRUD plus item reordering, caption upload/download/delete, channel profile and branding, comment listing/reply/moderation/deletion, analytics reports, background upload jobs with cancel/resume, and metadata templates. Even operational concerns (quota, auth health, confirmation rules, previews) are represented, leaving no obvious dead ends.