YouTube Channel MCP
You can run and manage a YouTube channel from an MCP client, including uploads, metadata, analytics, comments, playlists, captions, A/B testing, thumbnails, and Shorts.
Connect and manage multiple YouTube channels; check auth, quota, uploads, and AI provider status.
Upload local files or public URLs with resumable/checkpointed uploads, scheduling, thumbnails, playlists, and captions; cancel, resume, and poll status.
List, inspect, edit, publish, unlist, schedule, translate, set thumbnails for, and delete videos.
Manage playlists: create, edit, delete, add/remove videos, reorder, and list items.
Manage captions: list, upload/replace, download, delete, and transcribe local videos.
Manage comments: list, reply as the channel, moderate held/spam comments, ban authors, and delete the channel’s own comments.
Pull YouTube Analytics reports and channel/video performance data, including retention, traffic sources, search terms, geography, devices, and demographics.
Analyze growth: diagnose underperformance, find outliers, research topics, find best publish times, get SEO scores, and generate content ideas.
Generate and preview metadata, manage templates, and score SEO/packaging.
Run A/B tests on titles, thumbnails, or descriptions; manage test schedules and winners.
Find and cut Shorts, extract frames, generate thumbnails, and critique/rank thumbnail images.
Edit channel profile and branding, manage channel localizations, banners, and watermarks.
Configure AI providers/models for writing, vision, image generation, and transcription.
Require confirmation tokens for public or destructive actions such as publishing, deleting, moderating, or changing channel branding.
Supports optional speech-to-text transcription of local videos using OpenAI-compatible speech-to-text APIs, including OpenAI.
Provides tools for managing a YouTube channel through the official YouTube Data API v3 and YouTube Analytics API, including uploading and scheduling videos, editing metadata, managing comments, playlists, captions, channel profile and banner, and retrieving analytics.
Click on "Deploy Server".
Wait a few minutes for the server to deploy. Once ready, it will show a "Started" state.
In the chat, type
@followed by the MCP server name and your instructions, e.g., "@YouTube Channel MCP Upload ~/Videos/ep12.mp4 and schedule it for Friday at 6 pm."
That's it! The server will respond to your query, and you can continue using it as needed.
Here is a step-by-step guide with screenshots.
YouTube Channel MCP
Run and grow your whole YouTube channel from Claude, Hermes, Cursor, Codex, Windsurf or any MCP client. Upload and schedule videos, A/B test titles and thumbnails, diagnose why a video under-performs, find outliers and breakout topics, cut Shorts, design thumbnails, write metadata, answer comments, and manage playlists, captions and the channel profile.
“Upload
~/Videos/ep12.mp4with chapters from the transcript, add it to the Podcast playlist and schedule it for Friday 6 pm.” “Which videos brought in the most subscribers this month, and where did the views come from?” “Show me comments held for review and reply to the questions.”
It runs on your own computer, talks only to the official YouTube Data API v3 and YouTube Analytics API, and keeps your Google sign-in in your OS keychain. No browser automation, no cookies, no third-party server.
npx @joinhackyard/youtube-channel-mcp setupSetup takes about five minutes: it walks you through creating your Google credentials, connects your channel, and adds itself to the AI apps it finds on your machine.
What it covers
Area | |
Publishing | Upload local files or public URLs with resumable 16 MB chunks, checkpointed to disk: a dropped connection or closed app resumes from the last byte YouTube confirmed. Private, unlisted, public or scheduled ( |
Videos | List everything on the channel (including private and scheduled), edit title, description, tags, category, languages, audience and AI-content disclosure, translate titles and descriptions, publish, unlist, schedule, delete. |
A/B testing | Test up to 3 alternative titles, thumbnails or descriptions against the live version: daily rotation in balanced random order, trend-adjusted significance test, winner applied automatically. Start one from |
Growth | Per-video diagnosis (outlier score vs your usual, hook retention at 30 s, retention curve, traffic sources, search terms, SEO score), channel outliers, topic research with breakout videos, best publish time, content ideas from your own data. |
Shorts & thumbnails | Find the best Short-sized moments in a long video and cut vertical 1080x1920 clips; grab frames; generate thumbnails with an image model; have a vision model rank them. |
AI providers | Optional: Claude, OpenAI, Azure OpenAI, Gemini, OpenRouter, Groq, Ollama or any OpenAI-compatible API, with a model per job (writing, vision, images, transcription). Without one, tools hand your AI app the data and a brief. |
Metadata |
|
Channel | Profile and stats, description, keywords, country, language, trailer for non-subscribers, translations, banner, video watermark. |
Comments | Read comments per video or across the channel, including held for review and likely spam; reply as the channel; publish, hold or remove; ban authors; delete your own comments. |
Analytics | Overview, daily trend, top videos, traffic sources, YouTube search terms, geography, devices, age and gender, audience retention for a video, subscribed vs not, or any custom metrics and dimensions. |
Playlists | List, create, edit, delete, add, remove, reorder. Name a playlist and it is found (or created). |
Captions | Upload |
Several channels | Connect any number of channels, including brand accounts; pick a default or name one per call. |
Quota-aware | Tracks the daily budget, stops on |
Related MCP server: youtube-mcp
Install
Requirements: Node.js 22.13+. Optional: ffmpeg, only for transcription.
npx @joinhackyard/youtube-channel-mcp setupSetup does four things:
Google credentials (one time). YouTube only allows this through an OAuth client you own, so setup opens the right Google Cloud pages and you click through:
Enable the YouTube Data API v3 and the YouTube Analytics API.
Configure the OAuth consent screen: External, then under Audience either add your Google account as a test user, or click Publish app so sign-ins don't expire every 7 days (Google shows an “unverified app” notice you can click through for your own app).
Create an OAuth client of type Desktop app and download the JSON.
Then drag that JSON file into the terminal. The client ID and secret go into your keychain.
Connect a channel. Your browser opens Google sign-in; choose the account and the channel.
AI providers (optional): add Claude, OpenAI, Azure OpenAI, Gemini, OpenRouter, Groq, Ollama or a custom endpoint, then pick a model per job from each provider's live model list.
Add to your AI apps. It detects and configures Claude Desktop, Claude Code, Cursor, Windsurf, Codex and Hermes Agent. Your original config is kept as
*.before-youtube-channel-mcp.bak, and an existing server namedyoutubeis never touched. Restart the app afterwards.Background service (recommended): keeps uploads going and A/B tests rotating when no AI app is open (launchd on macOS, systemd on Linux, Task Scheduler on Windows).
Prefer a global install? npm i -g @joinhackyard/youtube-channel-mcp && youtube-channel-mcp setup.
Manual configuration
npx @joinhackyard/youtube-channel-mcp config prints snippets for your machine. The general shape:
{
"mcpServers": {
"youtube-channel": {
"command": "npx",
"args": ["-y", "@joinhackyard/youtube-channel-mcp@latest"]
}
}
}Hermes Agent (~/.hermes/config.yaml), where tools appear as mcp_youtube_channel_*:
mcp_servers:
youtube-channel:
command: "npx"
args: ["-y", "@joinhackyard/youtube-channel-mcp@latest"]
timeout: 180Claude Code: claude mcp add youtube-channel --scope user -- npx -y @joinhackyard/youtube-channel-mcp@latest
Try it
“Check my YouTube connection.”
“Upload ~/Videos/launch.mp4 as private with the title ‘We shipped v2’, then show me the upload status.”
“Transcribe ~/Videos/episode-12.mp4, write three title options, a description with chapters and tags using my podcast template, and schedule it for Friday 18:00 IST with ~/Videos/ep12.jpg as the thumbnail.”
“How did the channel do in the last 28 days compared with the month before? Which five videos drove it?”
“What are people searching on YouTube to find us?”
“List comments held for review, publish the genuine ones and remove the spam.”
“Reply to the unanswered questions on my latest video.”
“Rewrite the channel description and keywords around hackathons and founders.”
“Add Hindi titles and descriptions to my five most viewed videos.”
“Make every video in the ‘Drafts’ playlist unlisted.”
“Why did my last video under-perform? Suggest three titles and A/B test them for two weeks.”
“Upload ~/Videos/demo.mp4 publicly with ab_test thumbnails ~/thumbs/b.jpg and ~/thumbs/c.jpg.”
“Find my outliers and research what is breaking out on ‘hackathon India’ this quarter, then give me 10 video ideas.”
“Find 5 Shorts in ~/Videos/talk.mp4 and cut the best two.”
“Design three thumbnails for ‘We built a robot in 24 hours’ and tell me which one wins.”
Tools
Tool | What it does |
| Connection, sign-in health, quota, known limits |
| Background uploads from a file or URL, with progress and resume |
| Videos |
| Channel profile and branding |
| Comments and moderation |
| YouTube Analytics reports for the channel or a video |
| Playlists |
| Captions and transcripts |
| Writing metadata and channel templates |
| A/B tests of titles, thumbnails and descriptions |
| Growth analysis |
| Shorts and thumbnails |
| Comment triage with draft replies; translated titles and descriptions |
| AI providers and model per job |
| Today's quota estimate |
There is also a publish_video prompt for clients that support MCP prompts.
A/B testing
YouTube Studio's own Test & Compare (which measures impressions click-through rate) has no API, and the YouTube Analytics API no longer returns impressions or CTR. So this server runs its own tests on the official APIs:
Variants. A is the live version; B, C, D change the title, thumbnail and/or description.
Rotation. One version is live per day, in balanced random order (each block of days shows every version once, so weekdays even out). Days are Pacific Time to match YouTube Analytics. A day only counts if its version went live within 3 hours of midnight; missed or late days are excluded.
Measurement. Daily views, watch time, average view percentage, average view duration, subscribers gained or engagement for the video. Counts are compared on a log scale after removing the video's own trend (daily views usually decline), using Welch's t-test against the original.
Finish. A goes back live, the server waits about 3 days for analytics to settle, then reports lift and p-values. With
auto_apply_winner, a significant winner is put live.
Run tests for 14 days or more on videos with steady daily views. For small channels, bold changes (a new thumbnail concept, not a word swap) are the ones that show up. Keep the background service installed so no day is missed.
AI providers
Connect any mix in a terminal with npx @joinhackyard/youtube-channel-mcp ai. Keys go to your OS keychain and are never sent through chat.
Provider | Writing & analysis | Vision | Thumbnails | Transcription |
Anthropic Claude | ✓ (default | ✓ | ||
OpenAI | ✓ | ✓ | ✓ ( | ✓ ( |
Azure OpenAI / AI Foundry | ✓ | ✓ | ✓ | ✓ (your deployment names) |
Google Gemini | ✓ | ✓ | ✓ | ✓ |
OpenRouter | ✓ | ✓ | ||
Groq | ✓ | ✓ ( | ||
Ollama (local) | ✓ | ✓ | ||
Other OpenAI-compatible | ✓ | ✓ | ✓ | ✓ |
Choose a model per job interactively, with ai models --text anthropic:claude-opus-5-5 --image openai:gpt-image-2, or from your AI app with set_ai_models. Scripted setup reads keys from stdin, for example … | npx @joinhackyard/youtube-channel-mcp ai add azure --endpoint https://<resource>.cognitiveservices.azure.com --key-stdin.
Approvals
Reading is free. Private uploads and private edits go straight through. Anything other people will see or that cannot be undone needs your approval: public, unlisted or scheduled uploads and visibility changes, public replies and comments, channel profile, banner and watermark changes, starting or stopping A/B tests, removing comments or banning authors, and deleting videos, playlists, captions or channels.
In clients that support MCP elicitation, you get a confirm dialog.
Otherwise the tool returns
CONFIRMATION REQUIREDwith a summary and a single-use token tied to those exact arguments. The AI is instructed to show you the summary and call again with the token only after you agree; if the arguments change, the token is rejected. This fallback relies on the AI following instructions, so prefer clients with elicitation, orYT_CONFIRM=always, when the AI reads untrusted text such as comments.
Set YT_CONFIRM=always to confirm every write, or never for unattended pipelines.
Templates
Templates are JSON files in ~/.youtube-channel-mcp/templates/ (or ask your AI to call save_template):
{
"name": "podcast",
"description": "Weekly episode",
"title_format": "{title} | My Podcast",
"description_footer": "Listen everywhere: https://example.com/podcast",
"hashtags": ["#Podcast"],
"tags": ["podcast", "interview"],
"category_id": "22",
"playlists": ["Podcast episodes"],
"guidance": "Lead with the guest's name and the one idea listeners take away."
}extends inherits another template. Tags and hashtags are combined, the footer is appended, and guidance is passed to your AI when it writes metadata. A built-in shorts template adds #Shorts. See examples/templates.
Things YouTube decides (worth knowing)
Unaudited projects upload as private. Google Cloud projects created after July 2020 that haven't passed the YouTube API compliance audit can have every API upload locked to private. The server detects this and tells you; publish those videos in YouTube Studio, or apply for the audit.
Testing-mode sign-ins last 7 days. If your consent screen is in Testing, Google expires the sign-in weekly. Reconnect (
connect_channel), or publish the consent screen. Stopped uploads resume on their own after you reconnect.Quota. Each Google Cloud project has a daily budget shared by every channel connected through it (by default about 10,000 API units; uploads have their own allowance).
quota_statusshows this server's estimate; the Cloud Console has the exact numbers.Not available through the API: pinning comments, changing the channel name or handle, community posts, and Shorts-specific editing. Do those in YouTube Studio.
Phone verification. Custom thumbnails and videos over 15 minutes need a verified channel.
Configuration
Everything works without these. Environment variables override what setup stored.
Variable | Default | |
| from keychain | Desktop-app OAuth client |
|
| Data folder (state database, templates, transcripts) |
|
|
|
|
| Upload chunk size (rounded to 256 KB) |
|
| Budgets used for the local estimate |
| auto | Set to |
| from keychain | AI provider keys (setting them in the environment overrides |
| from | Azure OpenAI resource |
| Local or other OpenAI-compatible endpoints | |
| from |
|
|
| Reasoning effort for Claude |
Security
Google refresh tokens and client secrets are stored in the OS keychain (macOS Keychain, Windows Credential Manager, Linux Secret Service). On machines without one, they go into an AES-256-GCM encrypted file with a separate
0600key file.Sign-in uses a one-shot
127.0.0.1loopback server with PKCE and a random state, as Google recommends for desktop apps.Requested scopes:
youtube.upload,youtube,youtube.force-ssl(comments, captions and deletes) andyt-analytics.readonly(reports). No monetary or revenue access.AI provider keys live in the OS keychain; the database only stores which provider and model to use.
URL downloads refuse private and internal addresses.
disconnect_channelrevokes the token at Google.An audit log of uploads and changes is kept in the local database.
CLI
youtube-channel-mcp setup guided setup (safe to re-run)
youtube-channel-mcp connect connect or reconnect a channel
youtube-channel-mcp status channels, quota, recent uploads
youtube-channel-mcp doctor check everything, explain fixes
youtube-channel-mcp install [ids|all] claude-desktop, claude-code, cursor, windsurf, codex, hermes
youtube-channel-mcp uninstall [ids]
youtube-channel-mcp config print config snippets
youtube-channel-mcp ai connect AI providers and choose models (ai --help for scripted use)
youtube-channel-mcp service install keep uploads and A/B tests running in the background
youtube-channel-mcp daemon run background work in the foregroundContributing
Contributions are welcome. Start with CONTRIBUTING.md for setup, layout and guidelines. Please follow the Code of Conduct.
Questions and setup help: Discussions, see also SUPPORT.md
Bugs and ideas: Issues
Security problems: report privately, see SECURITY.md
Release notes: CHANGELOG.md
License
MIT. Built and maintained by Hackyard. Not affiliated with, or endorsed by, YouTube or Google. YouTube is a trademark of Google LLC.
Available Tools
65 toolsadd_to_playlistAdd a video to a playlistB
Add a video to a playlist by playlist id or exact title. Optionally at a position (0 = first).
Inputs: playlist (required), video_id (required), channel, position, +1 more.
ai_statusAI providers and modelsARead-only
Which AI providers are connected (Claude, OpenAI, Azure OpenAI, Gemini, OpenRouter, Groq, Ollama, custom) and which model each job uses: text (writing, analysis), vision (judging thumbnails), image (making thumbnails), transcribe. Keys are never shown.
Inputs: no named parameters.
analyze_videoDiagnose a video and suggest fixesARead-only
Full performance picture for one video: views vs this channel's usual (outlier score), watch time, average view percentage, hook retention at 30 s and the retention curve, traffic sources, YouTube search terms, subscribers gained, SEO score. With an AI model connected it adds a diagnosis: what's working, what's hurting, title variants and thumbnail ideas ready to A/B test, and next actions.
Inputs: video_id (required), channel, diagnose, template.
auth_statusConnection statusARead-only
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.
Inputs: no named parameters.
best_publish_timeBest day and time to publishARead-only
Compares first-week views of the channel's recent public uploads by weekday and time of day they were published (in your time zone), relative to the channel median. Uses YouTube Analytics; needs 6+ videos older than a week.
Inputs: sample, channel, time_zone.
cancel_uploadCancel an uploadA
Stop an upload job that has not finished. It can be resumed later with resume_upload.
Inputs: job_id (required).
connect_channelConnect a YouTube 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.
Inputs: open_browser, wait_seconds.
content_ideasWhat to make nextARead-only
Next video ideas grounded in this channel's data: its outliers (what over-performed vs its usual), underperformers, and optionally a topic to research. With an AI model it returns ideas with angle, why now, thumbnail concept and confidence; otherwise the data for you to reason from.
Inputs: count, focus, channel, template.
create_ab_testA/B test titles, thumbnails or descriptionsA
Tests 1-3 challenger versions of a live video against its current version (A). The server rotates which version is live one full day at a time (Pacific days, matching YouTube Analytics), in balanced random order so weekdays even out, then compares daily views, watch time, average view percentage, subscribers or engagement, adjusting for the video's natural decline in daily views, with a significance test. At the end it restores A, waits ~3 days for analytics to land, and (if auto_apply_winner) puts a significant winner live. YouTube Studio's own Test & Compare (with impressions click-through rate) has no API; this works on any channel through the official APIs. Each variant can change title, thumbnail and/or description. Changes are public, so the user confirms first.
Inputs: variants (required), video_id (required), days, start, +5 more.
create_playlistCreate a playlistC
Create a new playlist on the channel.
Inputs: title (required), channel, privacy, description.
create_shortCut a vertical ShortA
Cuts start-end (seconds) from a local video into a vertical 1080x1920 MP4 for YouTube Shorts (max 180 s). layout crop fills the frame from the centre (talking heads); blur shows the whole frame over a blurred fill; original keeps the aspect ratio. Needs ffmpeg.
Inputs: end (required), start (required), file_path (required), layout, +2 more.
critique_thumbnailsJudge and rank thumbnailsARead-only
Scores 1-4 thumbnail images as a phone viewer sees them (readability at small size, emotion, subject clarity, fit with the title), ranks them and lists fixes. Needs a vision model (Claude, OpenAI, Gemini, Azure).
Inputs: title (required), image_paths (required).
delete_captionsDelete a caption trackADestructiveIdempotent
Delete an uploaded caption track (see list_captions for ids). Needs the user’s confirmation.
Inputs: caption_id (required), channel, confirmation_token.
delete_commentDelete the channel’s own commentADestructiveIdempotent
Delete a comment or reply that the channel itself wrote (other people’s comments are removed with moderate_comments). Needs the user’s confirmation.
Inputs: comment_id (required), channel, confirmation_token.
delete_playlistDelete a playlistADestructiveIdempotent
Delete a playlist (the videos in it are not deleted). Needs the user’s confirmation.
Inputs: playlist (required), channel, confirmation_token.
delete_templateDelete a templateCDestructiveIdempotent
Delete a saved template file.
Inputs: name (required).
delete_videoDelete a videoADestructiveIdempotent
Permanently delete a video from YouTube. Cannot be undone. Always needs the user’s confirmation.
Inputs: video_id (required), channel, confirmation_token.
disconnect_channelDisconnect a channelADestructive
Remove a connected channel and revoke this app’s Google access to it. Needs the user’s confirmation.
Inputs: channel, confirmation_token.
download_captionsDownload captionsARead-only
Download a caption track of your own video as SRT (prefers uploaded tracks, falls back to auto-generated). Costs 250 quota units.
Inputs: video_id (required), channel, language.
extract_framesGrab stills for thumbnailsA
Saves evenly spaced stills (or stills at given seconds) from a local video as 1280-wide JPGs, as thumbnail candidates or as references for generate_thumbnails. Needs ffmpeg.
Inputs: file_path (required), count, at_seconds.
find_outliersChannel outliersARead-only
Ranks the channel's videos by outlier score (views ÷ the median of neighbouring uploads of the same format). Shows what over-performed (repeat it) and what under-performed (fix packaging or drop the topic). Shorts and long videos are compared separately.
Inputs: format, channel, max_videos.
generate_metadataWrite titles, description, chapters and tagsARead-only
Gets the transcript with timestamps (from text you pass, a .srt/.vtt/.txt file, an uploaded video’s captions, or by transcribing a local file). When an AI writing model is configured (Azure OpenAI, OpenAI…), it returns a finished draft: 3 titles, description with chapters, tags, hashtags, pinned comment and thumbnail text, already merged with the template and checked against YouTube’s limits. Otherwise (or with draft: false) it returns a brief for you to write from. Show the draft to the user before using it.
Inputs: draft, notes, format, channel, +6 more.
generate_thumbnailsDesign and generate thumbnailsA
Designs thumbnail concepts for a title (text overlay + image prompt) with the text model, then renders them with the image model (OpenAI gpt-image, Azure OpenAI image deployments, Gemini image). Optionally builds on a video frame. Saves 1280x720 JPGs under 2 MB, ready for set_thumbnail or create_ab_test. Without an image model it returns the concepts only.
Inputs: title (required), count, style, context, +1 more.
get_ab_testA/B test details and resultsB
Schedule, live variant and results so far (per-variant daily averages, lift vs the original, p-values, verdict). Results become reliable once every version has 3+ clean days; analytics lag about 2 days.
Inputs: test_id (required), refresh.
get_analyticsChannel and video analyticsARead-only
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.
Inputs: sort, report, channel, filters, +6 more.
get_channelChannel profile and statsCRead-only
The channel’s title, handle, description, keywords, country, default language, trailer, subscriber/view/video counts, banner and settings.
Inputs: channel.
get_upload_statusUpload and processing statusARead-only
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.
Inputs: job_id, channel, video_id, wait_seconds.
get_videoGet video detailsBRead-only
Full details of one video: metadata, privacy and schedule, processing state, duration, captions flag and statistics.
Inputs: video_id (required), channel.
list_ab_testsList A/B testsCRead-only
A/B tests with their status (scheduled, running, collecting results, completed, stopped), live variant and winner.
Inputs: status.
list_captionsList caption tracksCRead-only
Caption tracks on a video (language, name, auto-generated or uploaded, draft).
Inputs: video_id (required), channel.
list_categoriesList video categoriesBRead-only
YouTube video categories you can assign (id and name) for a region.
Inputs: channel, region_code.
list_channelsList connected channelsBRead-only
List the YouTube channels connected to this server.
Inputs: no named parameters.
list_commentsList commentsARead-only
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.
Inputs: order, search, status, channel, +3 more.
list_my_videosList channel videosARead-only
List videos on the channel, newest first (including private, unlisted and scheduled ones), with privacy, schedule, duration and view counts. Paginate with page_token.
Inputs: query, channel, privacy, page_token, +1 more.
list_playlist_itemsList videos in a playlistDRead-only
Videos in a playlist, in order.
Inputs: playlist (required), channel, page_token, max_results.
list_playlistsList playlistsBRead-only
All playlists on the channel with id, title, privacy and video count.
Inputs: channel.
list_templatesList templatesCRead-only
Metadata templates (title format, description footer, default tags, hashtags, category, playlists, voice guidance) available for uploads.
Inputs: no named parameters.
list_uploadsList upload jobsBRead-only
Recent upload jobs from this computer, newest first, with progress and results.
Inputs: limit, status.
moderate_commentsModerate commentsADestructiveIdempotent
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.
Inputs: action (required), comment_ids (required), channel, ban_author, +1 more.
move_in_playlistReorder a playlistAIdempotent
Move a video to a new position in a playlist (0 = first). Works for playlists sorted manually.
Inputs: playlist (required), position (required), video_id (required), channel.
preview_metadataPreview final metadataARead-only
Show exactly what would be sent to YouTube (title, description, tags, playlists) after applying a template, check it against YouTube’s limits and chapter rules, and score its SEO/packaging (0-100 with fixes). No API call, no quota.
Inputs: title (required), tags, keyword, license, +10 more.
quota_statusQuota statusARead-only
Estimated YouTube API quota used today (units and uploads) for this Google Cloud project, and when it resets (midnight Pacific Time).
Inputs: no named parameters.
remove_from_playlistRemove a video from a playlistBDestructiveIdempotent
Remove a video from a playlist (the video itself is not deleted).
Inputs: playlist (required), video_id (required), channel.
reply_to_commentReply or comment as the channelA
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.
Inputs: text (required), channel, video_id, comment_id, +1 more.
research_topicResearch a topic on YouTubeBRead-only
Searches YouTube for recent videos on a topic and ranks them by breakout ratio (views ÷ the uploader's subscribers: above 1 means it reached far beyond its audience), with title patterns (length, numbers, questions, common words) and typical duration. Costs about 102+ quota units per call.
Inputs: query (required), days, order, channel, +3 more.
resume_uploadResume an 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.
Inputs: job_id (required), wait_seconds.
save_templateSave a templateBIdempotent
Create or replace a metadata template, saved as JSON in the templates folder. Use {title} in title_format. extends inherits another template; tags and hashtags combine.
Inputs: name (required), tags, extends, license, +12 more.
seo_checkSEO and packaging scoreARead-only
Scores a video's (or draft's) title, description, tags, hashtags and chapters against YouTube best practice, 0-100 with fixes in order of impact. No AI needed; 1 quota unit for a video_id, none for a draft.
Inputs: tags, title, channel, keyword, +3 more.
set_ai_modelsChoose AI modelsAIdempotent
Pick which connected provider and model handle each job, as "provider:model" (Azure: "azure:"), e.g. text "anthropic:claude-opus-5-5", image "openai:gpt-image-2", transcribe "groq:whisper-large-v3". Pass null to go back to the automatic choice.
Inputs: text, image, effort, vision, +1 more.
set_channel_bannerSet channel bannerAIdempotent
Upload a channel banner (JPG/PNG, 16:9, at least 2048x1152, ideally 2560x1440, max 6 MB). Public, so the user confirms first.
Inputs: image_path (required), channel, confirmation_token.
set_default_channelSet the default channelAIdempotent
Choose which connected channel is used when a tool call does not name one.
Inputs: channel (required).
set_thumbnailSet custom thumbnailAIdempotent
Upload a JPG or PNG (max 2 MB, ideally 1280x720) from this computer as the video’s thumbnail. The channel must be phone-verified.
Inputs: video_id (required), image_path (required), channel.
set_video_localizationsTranslate title and descriptionAIdempotent
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).
Inputs: video_id (required), localizations (required), channel, remove_languages.
set_visibilityPublish, unlist, hide or scheduleAIdempotent
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.
Inputs: video_id (required), channel, privacy, publish_at, +1 more.
set_watermarkSet or remove the video watermarkAIdempotent
Set the subscribe watermark shown on all channel videos (square JPG/PNG, at least 150x150, max 1 MB), or remove it with remove: true.
Inputs: show, remove, channel, image_path, +2 more.
stop_ab_testStop an A/B testAIdempotent
Stops a test and puts the chosen version live (A = original). Public change, so the user confirms first.
Inputs: test_id (required), keep, confirmation_token.
suggest_shortsFind Shorts in a long videoARead-only
Finds the moments in a long video that work as standalone Shorts (hook in the first seconds, one idea, a payoff) with start/end times, hook line, title and a score. Use a local file (transcribed), an uploaded video's captions, or a transcript file. Then cut them with create_short.
Inputs: count, channel, video_id, file_path, +2 more.
transcribe_videoTranscribe a local 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.
Inputs: file_path (required), language.
translate_video_metadataDraft translated titles and descriptionsARead-only
Drafts the video's title and description in other languages so it can reach viewers who search in them. Returns drafts only; apply them with set_video_localizations after the user approves.
Inputs: video_id (required), languages (required), channel.
triage_commentsSort comments and draft repliesARead-only
Reads recent comments (one video or the whole channel) and returns sentiment, themes, unanswered questions with draft replies, comments worth a reply, spam or abuse to moderate, and video ideas the audience is asking for. Drafts only: nothing is posted. Without an AI model it returns the comments for you to triage.
Inputs: channel, video_id, include_held, max_comments.
update_channelEdit channel profileAIdempotent
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.)
Inputs: channel, country, keywords, description, +4 more.
update_playlistEdit a playlistAIdempotent
Rename a playlist, change its description or privacy. Making it public or unlisted needs the user’s confirmation.
Inputs: playlist (required), title, channel, privacy, +2 more.
update_videoEdit video metadataAIdempotent
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).
Inputs: video_id (required), tags, title, channel, +14 more.
upload_captionsUpload captionsB
Add a captions track (.srt, .vtt or other YouTube-supported format) to a video, from a file on this computer or inline content.
Inputs: video_id (required), name, channel, content, +4 more.
upload_videoUpload a 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).
Inputs: title (required), url, tags, ab_test, +23 more.
Tool Schema Changelog
Recent tool additions, removals, and schema changes observed during successful MCP inspections.
Loading tool schema changelog…
TDQS
Scored across 65 tools
Most tools target a distinct resource+action, and descriptions helpfully cross-reference each other (delete_comment points to moderate_comments; update_video points to set_visibility). However, several clusters overlap: seo_check vs preview_metadata vs generate_metadata all score/produce metadata, get_analytics vs analyze_video vs find_outliers all report performance, and set_thumbnail vs set_channel_banner vs set_watermark are near-neighbours. With 65 tools an agent must read carefully to avoid picking the near-miss.
The overwhelming majority follow a snake_case verb_noun pattern (list_playlists, create_ab_test, delete_captions, update_channel), which makes the set predictable. A handful of noun-first names break the pattern: seo_check, content_ideas, best_publish_time, quota_status, auth_status, ai_status. These are readable and conventional enough that the deviation is minor rather than confusing.
65 tools is far past the practical ceiling for a single agent surface, and even though the YouTube-channel domain is genuinely broad, most sessions will only need a small slice of it. The clustering (upload lifecycle, A/B tests, thumbnails, comments, captions, analytics) means large sub-areas could be grouped or gated rather than exposed flat. Each tool is purposeful, so it is not chaos, but the count is disproportionate.
Coverage is unusually thorough: upload lifecycle, metadata/templates, SEO, thumbnails, Shorts cutting, A/B testing, analytics, comments/moderation, playlists, captions, localizations, and channel branding all have full CRUD-ish surfaces. Remaining gaps are peripheral to the stated purpose — no live streaming, community posts, cards/end screens, or video trimming. No obvious dead ends in the core publishing workflow.
Maintenance
Related MCP Connectors
Hosted MCP for YouTube Studio: uploads, metadata, playlists, comments, analytics, captions.
YouTube MCP — wraps the YouTube Data API v3 (BYO API key)
Build, run, schedule, and publish AI video pipelines to YouTube and TikTok from any MCP client.
The YouTube autopilot: plan, write and schedule YouTube videos, and upload from your machine.
Related MCP Servers
- FlicenseAqualityDmaintenanceEnables interaction with YouTube's Data API through MCP, providing tools for channel info, videos, playlists, captions, subscriptions, and more.14-
- AlicenseAqualityCmaintenanceEnables Claude to control a YouTube channel through MCP, including uploading and editing videos, scheduling releases, and reading channel and video analytics via official APIs.8MIT
- FlicenseNot gradedqualityBmaintenanceEnables users to access their own YouTube channel, videos, and analytics through MCP-compatible clients such as ChatGPT and Claude, exposing tools for channel stats, video listing, video analytics, and video search.26 npm-
- AlicenseAqualityBmaintenanceEnables MCP clients like Claude or Cursor to upload videos from your local machine directly to YouTube, schedule them, and manage channel content through Runsheet.1144 npmMIT