mateai-youtube
This MCP server lets an AI manage and analyze a YouTube channel through official YouTube APIs.
Fetch channel stats, recent long-form videos, and Shorts metrics, writing report.html and channel_snapshot.json.
Generate a Markdown Shorts experiment table with views, retention, swipe-away, and subscriber metrics.
Inspect a video's metadata and owner-authorized retention curve, drop-off cliffs, peer percentiles, and traffic sources.
Upload a local MP4/MOV as a draft or scheduled release, with custom thumbnail, metadata, hashtags, and optional pinned comment.
Update an existing video's title, description, tags, privacy, schedule, or thumbnail.
Post a public top-level comment on a video or Short.
Optionally use public page scraping when explicitly opted in; private analytics/edits require OAuth2.
Provides tools for interacting with YouTube APIs to fetch channel overviews, long-form video and Shorts statistics, inspect video metadata/metrics, update videos, and post comments.
Integrates with YouTube Studio Analytics and upload workflows to retrieve private metrics such as average percentage viewed, viewed vs. swiped away, engaged views, watch time, and subscribers gained, and to upload videos with thumbnails as private drafts with scheduling/update capabilities.
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., "@mateai-youtubeFetch the latest public channel snapshot and view performance data."
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.
mateai-youtube-mcp

Tell your AI to upload, title, schedule and analyze your YouTube videos. Use the Claude or Antigravity subscription you already pay for, with no extra tool and no monthly fee.
"Upload
exports/short.mp4with this cover, write the title, description and hashtags, and schedule it for tomorrow 20:00 CET.""Which of my Shorts lost viewers in the first two seconds?"
That is what this plugin does. It connects Claude Code / Claude Desktop or Google Antigravity to your own YouTube channel through Google's official, free YouTube APIs, so the assistant you already use can do the work you'd otherwise do by hand in YouTube Studio:
Upload and schedule: video, custom cover, title, description, hashtags, tags, language, synthetic-media disclosure and a future publish time.
Edit and engage: update metadata on existing videos and post comments.
Analyze: retention, Viewed vs. swiped away, engaged views, watch time and subscribers gained, per video, with a local
report.htmldashboard.Compare with TikTok (optional): connect your TikTok account through TikTok's official API to pull its stats, send a Short to your TikTok app inbox with a ready-to-paste caption, and see your YouTube Shorts and TikToks side by side. See TikTok.
Hosted "creator OS" tools charge $19-$49 a month to wrap those same free Google APIs. Here nothing sits between your AI and YouTube: it runs 100% on your machine, your login stays in a local file only you can read, and the plugin costs $0. Connecting takes one command, /yt-setup (see Easy Setup).
Public stats (no login) are available as an opt-in mode: --public, force_public=true or MATEAI_YT_PUBLIC_SCRAPE=1. Built for the MateAI channel.
Quick Start (Public Snapshot, opt-in)
No API keys or packages needed, but public page scraping is opt-in, so pass --public. For your own channel, the OAuth2 setup below (official YouTube APIs) is the recommended default:
git clone https://github.com/mategog/mateai-youtube-mcp.git
cd mateai-youtube-mcp
python3 yt_studio.py snapshot --public --handle @mateai-c6m
open report.htmlPrint a Markdown table for tracking Shorts A/B style experiments:
MATEAI_YT_PUBLIC_SCRAPE=1 python3 yt_studio.py experiment-table --handle @mateai-c6mRelated MCP server: YouTube MCP
Install as a Plugin (Antigravity & Claude Code)
mateai-youtube-mcp ships as a full Plugin (bundling the MCP Server + the yt-studio AI Producer Skill + UI card & starter prompts).
Option A: Google Antigravity
Clone directly into your Antigravity plugins directory and restart Antigravity:
git clone https://github.com/mategog/mateai-youtube-mcp.git \
~/.gemini/config/plugins/mateai-youtubeOption B: Claude Code
Install directly from the plugin marketplace:
claude plugin marketplace add mategog/mateai-youtube-mcp
claude plugin install yt-studio@mateai-youtube-mcpThe plugin keeps its state (.venv, OAuth secret, tokens, channel_snapshot.json, report.html) in ~/.claude/plugins/data/yt-studio-mateai-youtube-mcp/, which survives plugin updates. Public snapshots work once you opt in (see above). To unlock private Studio analytics and uploads, run /yt-setup (needs Claude Code 2.1.287 or newer; see Easy Setup below).
On an older Claude Code, run the setup wizard by hand with MATEAI_YT_HOME pointing at that folder:
MATEAI_YT_HOME=~/.claude/plugins/data/yt-studio-mateai-youtube-mcp \
python3 ~/.claude/plugins/cache/mateai-youtube-mcp/yt-studio/<version>/yt_studio.py setupReplace <version> with your installed version (ls ~/.claude/plugins/cache/mateai-youtube-mcp/yt-studio/), or run the same command from any clone of this repo. Restart Claude Code afterwards.
Option C: Standalone MCP Config (mcp_config.json / claude_desktop_config.json)
{
"mcpServers": {
"mateai-youtube": {
"command": "python3",
"args": ["/ABSOLUTE/PATH/TO/mateai-youtube-mcp/mcp_server.py"]
}
}
}Exposed MCP Tools
YouTube
Tool | Description |
| Fetch channel overview, Long-form uploads, Shorts stats, and update |
| Generate a Markdown table comparing Shorts retention, swipe-away rate, and views. |
| Inspect metadata and metrics for any 11-character YouTube |
| Upload a local MP4/MOV + cover image + full Studio setup ( |
| Update title, description, tags, privacy status, schedule time, or thumbnail of an existing video. |
| Post a top-level comment (e.g. your |
TikTok (optional, needs the TikTok setup)
Tool | Description |
| Fetch your TikTok profile stats and recent videos (views, likes, comments, shares) through TikTok's official API. |
| Send a local MP4/MOV to your TikTok app inbox and return the caption to paste, plus a reminder to switch on TikTok's AI-generated label. It does not publish for you. |
| Markdown table that pairs each YouTube Short with the same video on TikTok (views, likes, comments, YouTube avg % viewed, TikTok shares). Videos that exist on only one platform get their own row. |
Bundled YouTube Strategy & Creator Skills (Full Pipeline)
This plugin integrates the YouTube Strategy & Creator Skill Suite directly alongside the mateai-youtube MCP server, so your AI agent handles everything from niche research and hook writing to live Studio scheduling:
Production Pipeline Skills (
yt-research,yt-ideation,yt-brief,yt-packaging,yt-outline, plus/yt-pipelinecommand andyt-scraper,channel-analyzer,idea-validatoragents) — created by Jeremy Longshore (@jeremylongshore/ Intent Solutions) (@intentsolutionsio/youtube-strategy, MIT).14 Creator Sub-Skills & Playbooks (
audit,seo,script,hook,thumbnail,strategy,calendar,shorts,analyze,repurpose,monetize,competitor,metadata,ideate) — created by Daniel Agrici (@AgriciDaniel) (claude-youtube, MIT).Live YouTube Studio Execution & Analytics MCP (
yt_channel_snapshot,yt_shorts_experiment_table,yt_upload_draft,yt_update_video,yt_post_comment, optional TikTok tools, interactivereport.htmldashboard & 1-commandsetupwizard) — built by MateAI (@mateai-c6m).
Dashboard: /yt-dashboard (Claude Code 2.1.287+)
Type /yt-dashboard to show or hide a channel card above the prompt: total views, subscribers, video count, and your latest five videos with a viewed-vs-swiped bar and its percentage. Desktop, VS Code and mobile draw it as a card; the terminal shows a text version. It reads the last channel_snapshot.json, and redraws whenever Claude runs yt_channel_snapshot, so the standalone report.html is optional.
Easy Setup: /yt-setup (Claude Code)
Type /yt-setup in Claude Code and it connects the plugin to your YouTube account. You do this once. Everything stays on your computer; only Google sees your sign-in.
You need: Claude Code 2.1.287 or newer, this plugin installed, and the Google account that owns your channel.
1. Type /yt-setup and read the answer.
It says | Meaning | You |
"Already connected." | Done. | Nothing |
"Found your Google client file. Opening your browser…" | It has the file it needs. | Go to step 3 |
"One manual step first… I opened two Google pages." | No client file yet. Google makes everyone create one. | Go to step 2 |
2. Make the Google client file (only if asked, about 3 minutes). No program can do this for you.
Page "Audience": click Add users under Test users, enter your YouTube email, Save.
Page "Create OAuth client": Application type = Desktop app (not "Web application"), any name, Create, then Download JSON.
Leave the file in
~/Downloadsand run/yt-setupagain.
3. Sign in (your browser opens). Pick your YouTube account. On "Google hasn't verified this app" click Advanced, then Go to … (unsafe); this is your own app. Tick every box, click Allow. Claude Code then shows "yt-setup: connected!" and the "YouTube: not connected" status hint disappears.
/yt-setup copies your client file into the plugin's data folder with 600 permissions, never prints it, and never sees your Google password.
Problem | Fix |
It says the file is a "web" client | Create a new client and choose Desktop app. |
Browser shows "Access blocked" / 403 access_denied | Your email is not under Test users. Add it, then rerun |
"Login did not finish" | The tab was closed early or a box was not ticked. Rerun |
"yt-studio plugin is not installed" | Run |
"Could not install the Google libraries" | Install Python 3 (python.org) and check your internet connection. |
Nothing happens | Hooks may be off ( |
Asked to log in again after about a week | Apps in "Testing" mode can have sign-ins that expire after about 7 days. Publishing the app on the Audience page may avoid that. [unconfirmed] |
Start over | Delete |
Not using Claude Code, or on an older version? Use the wizard below.
Unlock Private YouTube Studio Analytics & Draft Uploads ($0/mo)
Google gives every developer 10,000 free quota units/day on the YouTube Data API v3 and YouTube Analytics API v2. Because you run this locally for your own channel in "Testing" mode, no Google app verification is required and you keep 100% of your own private quota.
Run the 1-Command Guided Setup Wizard:
python3 yt_studio.py setupWhat python3 yt_studio.py setup does automatically:
Creates
.venv& installs Google's OAuth libraries automatically if not yet installed.Auto-enables the YouTube APIs via
gcloud(if you have thegcloudCLI installed), or pops open the direct 1-click enablement pages.Opens the exact Test User & Create Desktop Client screens and watches your
~/Downloadsfolder in real time—the instant you click "Download JSON" in your browser, the wizard automatically grabsclient_secret_*.jsonfrom~/Downloads, moves it intogoogle_auth_secret/client_secret.json(0600permissions,.gitignored), launches your YouTube channel login, and opens your livereport.htmldashboard!
TikTok (optional)
Cross-post your Shorts and see how they do on both platforms. This uses TikTok's official, free developer API only: no cookies, no scraping. It never publishes for you; a video lands in your TikTok app inbox and you tap Post yourself. Everything stays on your machine, and the YouTube tools work the same whether or not you set this up.
What you can ask your AI
"Send
exports/short.mp4to my TikTok inbox with the caption fromplanning/my-short-upload.md.""Show my YouTube Shorts next to the same videos on TikTok."
Connect TikTok (once)
Create an app at developers.tiktok.com and choose the Desktop platform.
Add the redirect URI
http://127.0.0.1:8765/callback/(exactly, with the trailing slash).Enable these scopes:
user.info.basic,user.info.profile,user.info.stats,video.list,video.upload.Run the wizard. It asks for your app's Client Key and Client Secret, opens TikTok's sign-in in your browser, and saves the token locally:
python3 tiktok_studio.py setupIf you installed the plugin, point it at the plugin's data folder first, the same way as for the YouTube wizard: MATEAI_YT_HOME=~/.claude/plugins/data/yt-studio-mateai-youtube-mcp python3 tiktok_studio.py setup.
Command line
python3 tiktok_studio.py snapshot # profile and recent videos
python3 tiktok_studio.py upload-draft --video exports/short.mp4 \
--spec planning/my-short-upload.md # send to your TikTok inbox
python3 tiktok_studio.py cross-table # YouTube Shorts vs TikTokGood to know
Captions are pasted by hand. TikTok's inbox upload cannot take a caption.
tiktok_upload_draftbuilds one from your upload spec (title plus the#hashtagsin the description,#Shortsremoved) and returns it for you to paste in the app.Switch on the AI-generated label yourself. If your video uses a synthetic voice or AI visuals, turn on TikTok's AI-generated content toggle in the app before posting. The API cannot set it.
Matching is by title. The comparison table pairs a Short with a TikTok when the title (hashtags ignored) matches the TikTok title or description. Anything else shows up as its own row, with "—" for the missing platform.
Only official numbers. TikTok's API gives views, likes, comments and shares. Retention-style metrics exist for YouTube only.
Your data. The client file is
tiktok_auth_secret/tiktok_client.jsonand the login token is.tokens/tiktok_token.json, both owner-only (0600) and.gitignored. The cache istiktok_snapshot.json. Details in PRIVACY.md.
Problem | Fix |
"No TikTok OAuth token found" | Run |
"TikTok refresh token expired" | Run |
Setup waits, then times out | The browser tab was closed. Rerun setup; it waits 5 minutes for the sign-in. |
Sign-in page rejects the redirect | The redirect URI in your TikTok app must be exactly |
Channel handle is empty | The |
What this plugin runs, sends and fetches
Everything runs on your own computer. The author receives no data. Nothing is sent anywhere except to Google/YouTube (and to TikTok, only if you set up the optional TikTok connection), and to your Claude conversation, which is under Anthropic's own privacy terms (see PRIVACY.md).
The MCP server (mcp_server.py, started by Claude Code as python3 ${CLAUDE_PLUGIN_ROOT}/mcp_server.py):
Calls Google's YouTube Data API v3 and YouTube Analytics API v2 with the scopes you approve at sign-in: read-only analytics, and optionally upload, edit metadata and post comments.
Public mode (off by default): fetches public
youtube.comchannel and video pages only when you opt in with--public,force_public=trueorMATEAI_YT_PUBLIC_SCRAPE=1.yt_upload_draftreads the video and cover files whose paths you give it and uploads them to your channel.yt_update_videoandyt_post_commentchange your video or post a comment, only when called.Writes
channel_snapshot.jsonandreport.html(cached statistics for your own channel) to the plugin data folder.
The /yt-setup command (a Claude Code mod in hooks/):
Looks for a
client_secret*.jsonin the plugin data folder, your current project and~/Downloads(up to 5 folders deep), and copies a Desktop-app client into the data folder with600permissions. It never prints the file.Creates a Python virtual environment in the data folder and runs
pip install -r requirements.txt(from PyPI:google-api-python-client,google-auth-oauthlib,google-auth-httplib2).Opens two Google Cloud pages (macOS
open) and starts Google's sign-in in your browser. Your Google password is typed on Google's own page and never reaches this plugin.Reads your saved token only to check which permissions it holds.
Works with macOS paths; on Windows use the manual wizard below.
Where your login lives: ~/.claude/plugins/data/yt-studio-mateai-youtube-mcp/ (client_secret.json and .tokens/token.json, both mode 600). Delete that folder to remove it, and revoke access at https://myaccount.google.com/permissions.
Support & Channel
If this saved you from paying for a monthly "Creator OS" subscription:
Sponsor on GitHub: github.com/sponsors/mategog
Subscribe on YouTube: MateAI (@mateai-c6m) — real AI build-logs, measured costs, no hype.
Buy Mate a Coffee: buymeacoffee.com/epuplanner
License & Anti-Resale Protection
Licensed under Apache License 2.0 with Commons Clause Restriction v1.0 (LICENSE). This is a source-available license, not an OSI open-source one; GitHub may label the repository "Apache-2.0" because of the base text.
Free for creators & developers: You may freely use, modify, and share this tool for your own YouTube channels (including monetized channels).
No commercial resale / paid SaaS wrapping: You may not sell this software, bundle it into a paid product, or host it as a paid/managed MCP service without a commercial license from MateAI.
Available Tools
6 toolsyt_channel_snapshotAIdempotent
Fetch live YouTube channel statistics, recent long-form videos, and Shorts metrics, and write an updated local report.html dashboard and channel_snapshot.json cache on disk. When YouTube OAuth2 credentials are present (and force_public is false), queries YouTube Data API v3 (~3 quota units) and YouTube Analytics API v2 for private owner metrics (averageViewPercentage, swipedAwayRate, engagedViews, estimatedMinutesWatched, subscribersGained); public page scraping is opt-in only (force_public=true or MATEAI_YT_PUBLIC_SCRAPE=1); without OAuth or opt-in it returns setup instructions. Overwrites report.html idempotently on each run.
| Name | Required | Description | Default |
|---|---|---|---|
| handle | No | YouTube channel handle (with or without leading '@', e.g. '@mateai-c6m'). Defaults to '@mateai-c6m'. | @mateai-c6m |
| force_public | No | Opt in to public page scraping for this call (bypasses OAuth2; public views/likes only). Only set when the user asks for it. |
Output Schema
| Name | Required | Description |
|---|---|---|
| mode | Yes | |
| shorts | Yes | |
| videos | Yes | |
| channel | Yes | |
| dashboardPath | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Adds substantial behavior beyond the annotations: quota cost (~3 units), which APIs are queried for which private metrics, the auth precondition for private metrics, the opt-in gate for scraping, the fallback of returning setup instructions, and that report.html is overwritten idempotently. This is exactly the disk-write/auth/quota context the annotations alone (readOnlyHint=false, idempotentHint=true) do not convey.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loads the purpose and side effects, then layers auth/quota/fallback details. It is dense with parenthetical metric lists and would benefit from slight trimming, but nearly every clause carries actionable information.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a tool with disk side effects, auth branching, and quota cost, the description covers the decision points an agent needs: auth requirement, opt-in scraping, fallback behavior, and idempotent overwrite. An output schema exists, so return-value detail is correctly omitted.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so baseline is 3, but the description adds real meaning: force_public bypasses OAuth2 and yields public views/likes only, is opt-in, and should only be set on user request. That clarifies the parameter's consequence in a way the schema text alone does not fully convey.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource set — fetch live channel stats, recent long-form videos, Shorts metrics — and names the concrete side effects (report.html dashboard, channel_snapshot.json cache). No sibling tool does a snapshot-style fetch, and the description makes that scope unmistakable.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Clearly describes the two operating modes: OAuth-present path hits Data API v3 / Analytics API v2, while public scraping only happens with force_public=true or the env var, and without either it returns setup instructions. It stops short of explicitly routing against siblings (e.g. yt_video_details) or stating when-not-to-use, so it is not a full 5.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
yt_post_commentA
Post a public top-level comment thread on a YouTube video or Short via YouTube Data API v3 (commentThreads.insert, costs ~50 daily quota units). Requires OAuth2 with youtube.force-ssl scope. Non-idempotent: each call publishes a new visible comment immediately under the authenticated channel identity and returns {commentId, videoId, text}. Fails if comments are disabled on the target video or the video is private.
| Name | Required | Description | Default |
|---|---|---|---|
| text | Yes | Plain-text comment body (1–10,000 characters) to publish publicly on the video. | |
| video_id | Yes | 11-character YouTube video ID where the top-level comment will be posted. |
Output Schema
| Name | Required | Description |
|---|---|---|
| text | No | |
| videoId | Yes | |
| commentId | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Goes well beyond the annotations: discloses quota cost, the required youtube.force-ssl OAuth scope, immediate public visibility under the authenticated channel identity, and concrete failure conditions. Annotations already flag non-idempotence, and the description reinforces it with the consequence (each call publishes a new visible comment).
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Four dense sentences, each carrying distinct information (action, cost/auth, side effects, failure modes), with the core action front-loaded and no filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Everything needed to invoke correctly is present: auth requirement, cost, side effects, failure conditions, and even the return shape despite an output schema already existing. Nothing material is missing for a two-parameter mutation tool.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so both parameters are already fully documented with length and pattern constraints. The description adds only the notion that the comment is public and top-level, which is useful framing but not new per-parameter meaning, so the baseline of 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ("Post a public top-level comment thread on a YouTube video or Short") and pins the exact API method (commentThreads.insert), which cleanly separates it from siblings like yt_upload_draft and yt_update_video.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives clear preconditions and failure modes (comments disabled, private video) plus the ~50 unit quota cost, so an agent can judge affordability and applicability. It does not explicitly name an alternative tool or say when not to use it, but the sibling set contains no closer competitor for this action.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
yt_shorts_experiment_tableARead-onlyIdempotent
Generate a GitHub-Flavored Markdown comparison table of the channel's YouTube Shorts ordered newest-first with columns for Publish Date, Title, Views, Viewed vs Swiped Away %, Average % Viewed, Engaged Views, and Subscribers Gained. Pulls live data from YouTube Data API v3 + YouTube Analytics API v2 when OAuth2 is configured (or public channel pages when unauthenticated, where private retention columns are shown as '—'). Returns a 'No Shorts found' notice if the channel has no Shorts.
| Name | Required | Description | Default |
|---|---|---|---|
| handle | No | YouTube channel handle (with or without leading '@', default '@mateai-c6m'). | @mateai-c6m |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already cover readOnly, idempotent, and openWorld, and the description adds substantial behavior beyond them: the newest-first ordering, the live YouTube Data API v3 + Analytics API v2 sourcing, the unauthenticated fallback to public channel pages, and the '—' placeholder for private retention columns. The only gap is that it doesn't say what happens on API failure or auth errors.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three sentences, front-loaded with the deliverable and column list before the data-source/auth caveats and the empty-case notice. The middle sentence is dense but every clause (auth fallback, placeholder behavior) carries information an agent needs; little could be cut without loss.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema, the description does the heavy lifting by naming the columns, the ordering, the placeholder for unavailable metrics, and the 'No Shorts found' empty case — enough for correct invocation and interpretation. Minor gaps remain around result-size limits and error behavior, but nothing essential is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The single 'handle' parameter is fully documented in the schema (100% coverage, including pattern and default), so the description adds nothing parameter-specific beyond referring to "the channel's" Shorts. A baseline 3 is appropriate when the schema already carries the semantics.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and artifact — "Generate a GitHub-Flavored Markdown comparison table" — scoped to the channel's YouTube Shorts, and enumerates the exact columns. This clearly separates it from siblings like yt_video_details (single video) or yt_channel_snapshot (different output shape).
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description implies when this is the right tool (you want a newest-first retention/engagement comparison across Shorts), and it explains the authenticated vs unauthenticated data paths. However, it never explicitly says when to prefer a sibling such as yt_video_details or yt_channel_snapshot, so the agent must infer routing from the output format alone.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
yt_update_videoAIdempotent
Perform a partial, idempotent update on an existing YouTube video's metadata, visibility, schedule, or custom thumbnail in YouTube Studio via YouTube Data API v3 (videos.list + videos.update, costs ~51 quota units). Requires channel-owner OAuth2. Fetches current snippet/status first so omitted parameters (title, description, tags, privacy_status, publish_at) are preserved unchanged rather than cleared. Setting publish_at automatically forces privacy_status='private' as required by YouTube's scheduling API. Returns {videoId, studioUrl, updatedFields}.
| Name | Required | Description | Default |
|---|---|---|---|
| tags | No | Replacement list of YouTube SEO keyword tags. Leave omitted to keep existing tags. | |
| title | No | New video title (1–100 characters). Leave omitted to keep existing title. | |
| video_id | Yes | 11-character YouTube video ID to update. | |
| publish_at | No | Future ISO 8601 timestamp with timezone offset to schedule publication (e.g. '2026-11-05T17:00:00+01:00'). Forces privacy_status='private'. | |
| description | No | New video description (up to 5,000 characters). Leave omitted to keep existing description. | |
| privacy_status | No | Updated visibility status. Ignored and forced to 'private' if publish_at is provided. | |
| thumbnail_path | No | Optional absolute local filesystem path to a readable PNG/JPG image (<=2MB) to upload via thumbnails.set. |
Output Schema
| Name | Required | Description |
|---|---|---|
| videoId | Yes | |
| studioUrl | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Goes well beyond the annotations: it discloses the ~51 quota unit cost, the OAuth2 authorization requirement, and the crucial fetch-then-merge behavior that preserves omitted fields rather than clearing them. It also flags the non-obvious side effect that publish_at forcibly overrides privacy_status to 'private', which an agent could not predict from the schema alone.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Dense but front-loaded: purpose first, then prerequisites, then behavioral caveats, then return shape. Every sentence carries information, though the final sentence listing the return keys is redundant given an output schema exists.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a 7-parameter mutation tool with an output schema, the description covers authorization, quota cost, side effects, and merge semantics — everything an agent needs to call it correctly. Return values are documented in the output schema, so the brief mention of them is harmless surplus rather than a gap.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the baseline is 3, and the description does consolidate the merge semantics (omitted params preserved) and the publish_at/privacy_status interaction into one readable statement. However, most of this detail — 'Leave omitted to keep existing', 'Forces privacy_status=private' — is already duplicated verbatim in the schema, so the added meaning is modest.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource — 'partial, idempotent update on an existing YouTube video's metadata, visibility, schedule, or custom thumbnail' — and enumerates exactly which fields are touched. The word 'existing' implicitly separates it from yt_upload_draft, but no sibling is named explicitly, so an agent must infer the boundary rather than read it.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives clear operating context: channel-owner OAuth2 is required, and the underlying calls (videos.list + videos.update) with their quota cost are disclosed. It does not state when to prefer this over yt_video_details (read) or yt_upload_draft (create), so the exclusion guidance is inferential rather than explicit.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
yt_upload_draftA
Upload a local MP4/MOV video file to YouTube Studio via YouTube Data API v3 (videos.insert, costs ~1,600 daily quota units) and optionally attach a custom thumbnail (thumbnails.set) and top-level pinned comment (commentThreads.insert). Requires channel OAuth2 with youtube.upload scope. Non-idempotent: each call creates a new YouTube video resource and returns {videoId, studioUrl, watchUrl, privacyStatus, publishAt}. Defaults to privacy_status='private' (unpublished draft); when publish_at (ISO 8601 future timestamp) is provided, privacy_status is forced to 'private' until YouTube automatically publishes the video at publish_at. Inline parameters (title, description, tags, hashtags, pinned_comment) override values parsed from spec_path.
| Name | Required | Description | Default |
|---|---|---|---|
| tags | No | YouTube SEO keyword tags (combined length up to 500 characters). | |
| title | No | Video title (1–100 characters). Required unless spec_path provides a '## Title' section. | |
| hashtags | No | Hashtags to append to the end of description (e.g. ['#AINews', '#Shorts']). | |
| language | No | BCP-47 language code for defaultLanguage and defaultAudioLanguage (default: 'en'). | en |
| spec_path | No | Optional local path to a Markdown upload spec file ('## Title', '## Description', '## Tags', '## Pinned comment') used as fallback when inline fields are omitted. | |
| publish_at | No | Optional future ISO 8601 timestamp with timezone offset for scheduled publication (e.g. '2026-11-04T18:00:00+01:00'). Forces privacy_status='private' until release. | |
| video_path | Yes | Absolute local filesystem path to a readable MP4 or MOV video file to upload. | |
| category_id | No | YouTube numeric category ID (default: '28' for Science & Technology). | 28 |
| description | No | Video description (up to 5,000 characters). Hashtags from 'hashtags' are appended if not already present. | |
| made_for_kids | No | COPPA selfDeclaredMadeForKids flag (default: false). | |
| pinned_comment | No | Top-level comment text to post on the video when auto_post_comment is true. | |
| privacy_status | No | Initial visibility in YouTube Studio (default: 'private'). Forced to 'private' whenever publish_at is set. | private |
| thumbnail_path | No | Optional absolute local path to a PNG/JPG custom thumbnail image (<=2MB, requires verified YouTube account). | |
| auto_post_comment | No | If true and pinned_comment is non-empty, immediately posts pinned_comment as a top-level comment (requires video to allow comments). | |
| contains_synthetic_media | No | YouTube Studio altered/synthetic media disclosure flag (status.containsSyntheticMedia, default: false). |
Output Schema
| Name | Required | Description |
|---|---|---|
| videoId | Yes | |
| watchUrl | Yes | |
| publishAt | No | |
| studioUrl | Yes | |
| privacyStatus | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Beyond the annotations, it discloses the ~1,600-unit quota cost, the required youtube.upload OAuth scope, the fact that a new video resource is created each call, and the exact return payload ({videoId, studioUrl, watchUrl, privacyStatus, publishAt}). It also explains the publish_at/privacy_status interaction and that inline fields override spec_path values, which the annotations do not cover.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is dense but front-loaded, leading with the action, API call and quota before optional behaviors. The enumeration of return fields is slightly redundant given an output schema exists, but otherwise every sentence carries decision-relevant information.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a 15-parameter mutation with rich annotations and an output schema, the description supplies the remaining essentials: authentication scope, cost, idempotency consequences, default state, scheduling semantics and parameter precedence. An agent has enough to call it correctly without further exploration.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is already 100%, so the schema carries most of the burden, but the description still adds real meaning by stating the precedence rule (inline title/description/tags/hashtags/pinned_comment override spec_path) and clarifying that publish_at overrides privacy_status. Those cross-parameter interactions are not expressed in the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description names a specific verb and resource ('Upload a local MP4/MOV video file to YouTube Studio'), plus the underlying API call (videos.insert) and the two optional side-operations (thumbnails.set, commentThreads.insert). It is clearly distinct from siblings like yt_update_video and yt_post_comment, which modify or comment on an existing video rather than create one.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It gives clear operating context: defaults to an unpublished private draft, and publish_at triggers scheduled release with privacy forced to 'private'. It does not explicitly say when to prefer yt_update_video or the dedicated yt_post_comment over the inline pinned_comment option, so the boundary with siblings is left implied rather than stated.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
yt_video_detailsARead-onlyIdempotent
Fetch public video metadata plus owner-authorized YouTube Analytics retention diagnostics for a single 11-character video_id: 100-point elapsedVideoTimeRatio audience retention curve, exact MM:SS drop-off cliffs, relativeRetentionPerformance peer percentiles, and traffic source breakdown. Retention curve and traffic diagnostics require channel-owner OAuth2 (a studioDiagnosisError explains a missing scope). Public page metadata (title, views, likes) is scraped only when force_public=true or MATEAI_YT_PUBLIC_SCRAPE=1. When words_or_script_path is provided, maps each retention drop-off cliff onto the exact spoken words at that timestamp.
| Name | Required | Description | Default |
|---|---|---|---|
| video_id | Yes | 11-character YouTube video or Short ID (e.g. 'I9c6W135VZk'). | |
| force_public | No | Opt in to scraping the public watch page for title/views/likes. Only set when the user asks for it. | |
| words_or_script_path | No | Optional local filesystem path to a readable Whisper words.js or JSON word-timestamp file used to align retention drop-off cliffs with spoken words. |
Output Schema
| Name | Required | Description |
|---|---|---|
| title | No | |
| videoId | Yes | |
| likeCount | No | |
| viewCount | No | |
| studioDiagnosis | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Goes well beyond readOnly/idempotent annotations by disclosing the OAuth2 scope requirement, the studioDiagnosisError raised on a missing scope, and the fact that scraping is opt-in via a flag or environment variable. These are exactly the operational traits an agent needs before calling.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loads the core purpose and keeps every clause informative, but the enumerated list of return metrics is verbose and partly duplicates the output schema. Still tight for the amount of conditional behavior it must convey.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Covers identification, auth requirements, the opt-in gate for scraping, the optional words-alignment mode, and the error surface. With an output schema present, return value documentation is not required, so nothing critical is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the schema already explains video_id format, the force_public opt-in, and the words file purpose. The description largely restates those semantics in behavioral terms (what the words file unlocks, why scraping is gated) without adding format, defaults, or edge-case detail beyond the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb ('Fetch') and a precisely bounded resource: metadata plus owner-authorized Analytics retention diagnostics for a single 11-character video_id. The output artifacts (retention curve, drop-off cliffs, peer percentiles, traffic sources) make it unmistakable against siblings like yt_channel_snapshot or yt_update_video.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives clear preconditions for use: retention/traffic diagnostics need channel-owner OAuth2, and public page scraping happens only when force_public=true or the env var is set. It does not, however, explicitly contrast itself with sibling tools or state when a caller should prefer yt_channel_snapshot instead.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
Tool Schema Changelog
Recent tool additions, removals, and schema changes observed during successful MCP inspections.
2 tool updates
v0.3.0- Changed
yt_channel_snapshot1 field changed- changed
Input schema / properties / force_public / descriptionPrevious value: -"If true, bypass stored OAuth2 tokens and use zero-config public scraping only."New value: +"Opt in to public page scraping for this call (bypasses OAuth2; public views/likes only). Only set when the user asks for it."
- Changed
yt_video_details1 field changed- added
Input schema / properties / force_publicAdded value: +{ + "default": false, + "description": "Opt in to scraping the public watch page for title/views/likes. Only set when the user asks for it.", + "type": "boolean" +}
6 tool updates
v0.2.0- Changed
yt_channel_snapshot6 fields changed- added
Input schema / properties / force_public / defaultAdded value: +false - changed
Input schema / properties / force_public / descriptionPrevious value: -"If true, use zero-config public snapshot even if OAuth token exists."New value: +"If true, bypass stored OAuth2 tokens and use zero-config public scraping only." - added
Input schema / properties / handle / defaultAdded value: +"@mateai-c6m" - changed
Input schema / properties / handle / descriptionPrevious value: -"YouTube channel handle (e.g. '@mateai-c6m'). Defaults to '@mateai-c6m'."New value: +"YouTube channel handle (with or without leading '@', e.g. '@mateai-c6m'). Defaults to '@mateai-c6m'." - added
Input schema / properties / handle / patternAdded value: +"^@?[A-Za-z0-9._-]+$" - changed
Output schema / (root)Previous value: -nullNew value: +{ + "properties": { + "channel": { + "type": "object" + }, + "dashboardPath": { + "type": "string" + }, + "mode": { + "enum": [ + "studio_oauth", + "public_scrape" + ], + "type": "string" + }, + "shorts": { + "items": { + "type": "object" + }, + "type": "array" + }, + "videos": { + "items": { + "type": "object" + }, + "type": "array" + } + }, + "required": [ + "mode", + "channel", + "videos", + "shorts", + "dashboardPath" + ], + "type": "object" +}
- Changed
yt_post_comment6 fields changed- changed
Input schema / properties / text / descriptionPrevious value: -"Comment text to post."New value: +"Plain-text comment body (1–10,000 characters) to publish publicly on the video." - added
Input schema / properties / text / maxLengthAdded value: +10000 - added
Input schema / properties / text / minLengthAdded value: +1 - changed
Input schema / properties / video_id / descriptionPrevious value: -"11-character YouTube video ID."New value: +"11-character YouTube video ID where the top-level comment will be posted." - added
Input schema / properties / video_id / patternAdded value: +"^[A-Za-z0-9_-]{11}$" - changed
Output schema / (root)Previous value: -nullNew value: +{ + "properties": { + "commentId": { + "type": "string" + }, + "text": { + "type": "string" + }, + "videoId": { + "type": "string" + } + }, + "required": [ + "commentId", + "videoId" + ], + "type": "object" +}
- Changed
yt_shorts_experiment_table3 fields changed- added
Input schema / properties / handle / defaultAdded value: +"@mateai-c6m" - changed
Input schema / properties / handle / descriptionPrevious value: -"YouTube channel handle (default '@mateai-c6m')."New value: +"YouTube channel handle (with or without leading '@', default '@mateai-c6m')." - added
Input schema / properties / handle / patternAdded value: +"^@?[A-Za-z0-9._-]+$"
- Changed
yt_update_video11 fields changed- changed
Input schema / properties / description / descriptionPrevious value: -"New video description (up to 5000 characters)."New value: +"New video description (up to 5,000 characters). Leave omitted to keep existing description." - added
Input schema / properties / description / maxLengthAdded value: +5000 - changed
Input schema / properties / privacy_status / descriptionPrevious value: -"Updated visibility status in YouTube Studio."New value: +"Updated visibility status. Ignored and forced to 'private' if publish_at is provided." - changed
Input schema / properties / publish_at / descriptionPrevious value: -"ISO 8601 schedule time (e.g. '2026-11-05T17:00:00+01:00')."New value: +"Future ISO 8601 timestamp with timezone offset to schedule publication (e.g. '2026-11-05T17:00:00+01:00'). Forces privacy_status='private'." - changed
Input schema / properties / tags / descriptionPrevious value: -"Updated list of YouTube SEO keyword tags."New value: +"Replacement list of YouTube SEO keyword tags. Leave omitted to keep existing tags." - changed
Input schema / properties / thumbnail_path / descriptionPrevious value: -"Optional absolute path to new thumbnail image."New value: +"Optional absolute local filesystem path to a readable PNG/JPG image (<=2MB) to upload via thumbnails.set." - changed
Input schema / properties / title / descriptionPrevious value: -"New video title (up to 100 characters)."New value: +"New video title (1–100 characters). Leave omitted to keep existing title." - added
Input schema / properties / title / maxLengthAdded value: +100 - changed
Input schema / properties / video_id / descriptionPrevious value: -"11-character YouTube video ID."New value: +"11-character YouTube video ID to update." - added
Input schema / properties / video_id / patternAdded value: +"^[A-Za-z0-9_-]{11}$" - changed
Output schema / (root)Previous value: -nullNew value: +{ + "properties": { + "studioUrl": { + "type": "string" + }, + "videoId": { + "type": "string" + } + }, + "required": [ + "videoId", + "studioUrl" + ], + "type": "object" +}
- Changed
yt_upload_draft24 fields changed- added
Input schema / properties / auto_post_comment / defaultAdded value: +false - changed
Input schema / properties / auto_post_comment / descriptionPrevious value: -"If true, automatically post the pinned_comment onto the video."New value: +"If true and pinned_comment is non-empty, immediately posts pinned_comment as a top-level comment (requires video to allow comments)." - added
Input schema / properties / category_id / defaultAdded value: +"28" - changed
Input schema / properties / category_id / descriptionPrevious value: -"YouTube category ID (default: '28' for Science & Technology)."New value: +"YouTube numeric category ID (default: '28' for Science & Technology)." - added
Input schema / properties / contains_synthetic_media / defaultAdded value: +false - changed
Input schema / properties / contains_synthetic_media / descriptionPrevious value: -"Altered/synthetic media disclosure flag in YouTube Studio (default: false)."New value: +"YouTube Studio altered/synthetic media disclosure flag (status.containsSyntheticMedia, default: false)." - changed
Input schema / properties / description / descriptionPrevious value: -"Full video description (up to 5000 characters)."New value: +"Video description (up to 5,000 characters). Hashtags from 'hashtags' are appended if not already present." - added
Input schema / properties / description / maxLengthAdded value: +5000 - changed
Input schema / properties / hashtags / descriptionPrevious value: -"Hashtags to append to description (e.g. ['#AINews', '#Shorts'])."New value: +"Hashtags to append to the end of description (e.g. ['#AINews', '#Shorts'])." - added
Input schema / properties / language / defaultAdded value: +"en" - changed
Input schema / properties / language / descriptionPrevious value: -"BCP-47 language code for title/audio (default: 'en')."New value: +"BCP-47 language code for defaultLanguage and defaultAudioLanguage (default: 'en')." - added
Input schema / properties / made_for_kids / defaultAdded value: +false - changed
Input schema / properties / made_for_kids / descriptionPrevious value: -"Whether video is made for kids (default: false)."New value: +"COPPA selfDeclaredMadeForKids flag (default: false)." - changed
Input schema / properties / pinned_comment / descriptionPrevious value: -"Top-level comment to post on the video."New value: +"Top-level comment text to post on the video when auto_post_comment is true." - added
Input schema / properties / privacy_status / defaultAdded value: +"private" - changed
Input schema / properties / privacy_status / descriptionPrevious value: -"Visibility in YouTube Studio (default: 'private'). Automatically set to 'private' when publish_at is used."New value: +"Initial visibility in YouTube Studio (default: 'private'). Forced to 'private' whenever publish_at is set." - changed
Input schema / properties / publish_at / descriptionPrevious value: -"Optional ISO 8601 timestamp to schedule automatic publication (e.g. '2026-11-04T18:00:00+01:00')."New value: +"Optional future ISO 8601 timestamp with timezone offset for scheduled publication (e.g. '2026-11-04T18:00:00+01:00'). Forces privacy_status='private' until release." - changed
Input schema / properties / spec_path / descriptionPrevious value: -"Optional path to upload markdown file (fallback if title/description omitted)."New value: +"Optional local path to a Markdown upload spec file ('## Title', '## Description', '## Tags', '## Pinned comment') used as fallback when inline fields are omitted." - changed
Input schema / properties / tags / descriptionPrevious value: -"YouTube SEO keyword tags."New value: +"YouTube SEO keyword tags (combined length up to 500 characters)." - changed
Input schema / properties / thumbnail_path / descriptionPrevious value: -"Optional absolute path to thumbnail PNG/JPG."New value: +"Optional absolute local path to a PNG/JPG custom thumbnail image (<=2MB, requires verified YouTube account)." - changed
Input schema / properties / title / descriptionPrevious value: -"Video title (up to 100 characters)."New value: +"Video title (1–100 characters). Required unless spec_path provides a '## Title' section." - added
Input schema / properties / title / maxLengthAdded value: +100 - changed
Input schema / properties / video_path / descriptionPrevious value: -"Absolute path to MP4/MOV file."New value: +"Absolute local filesystem path to a readable MP4 or MOV video file to upload." - changed
Output schema / (root)Previous value: -nullNew value: +{ + "properties": { + "privacyStatus": { + "type": "string" + }, + "publishAt": { + "type": [ + "string", + "null" + ] + }, + "studioUrl": { + "type": "string" + }, + "videoId": { + "type": "string" + }, + "watchUrl": { + "type": "string" + } + }, + "required": [ + "videoId", + "studioUrl", + "watchUrl" + ], + "type": "object" +}
- Changed
yt_video_details4 fields changed- changed
Input schema / properties / video_id / descriptionPrevious value: -"11-character YouTube video ID (e.g. 'I9c6W135VZk')."New value: +"11-character YouTube video or Short ID (e.g. 'I9c6W135VZk')." - added
Input schema / properties / video_id / patternAdded value: +"^[A-Za-z0-9_-]{11}$" - changed
Input schema / properties / words_or_script_path / descriptionPrevious value: -"Optional path to Whisper words.js / JSON timing file to map drop-off cliffs to exact spoken words."New value: +"Optional local filesystem path to a readable Whisper words.js or JSON word-timestamp file used to align retention drop-off cliffs with spoken words." - changed
Output schema / (root)Previous value: -nullNew value: +{ + "properties": { + "likeCount": { + "type": "integer" + }, + "studioDiagnosis": { + "type": "object" + }, + "title": { + "type": "string" + }, + "videoId": { + "type": "string" + }, + "viewCount": { + "type": "integer" + } + }, + "required": [ + "videoId" + ], + "type": "object" +}
6 tool updates
v0.1.0- First observed
yt_channel_snapshot - First observed
yt_post_comment - First observed
yt_shorts_experiment_table - First observed
yt_update_video - First observed
yt_upload_draft - First observed
yt_video_details
TDQS
Scored across 6 tools
Each tool maps to a distinct action: publish comment, upload, update, single-video diagnostics, channel dashboard, and Shorts comparison table. The only mild overlap is between yt_channel_snapshot (which includes Shorts metrics and writes report.html) and yt_shorts_experiment_table (which renders a Shorts comparison table), but the differing outputs and side effects keep them separable.
All tools share a consistent yt_ prefix and snake_case convention. However, half the set uses verb_noun phrasing (yt_post_comment, yt_update_video, yt_upload_draft) while the others use noun phrases (yt_channel_snapshot, yt_video_details, yt_shorts_experiment_table), a minor deviation from a single predictable pattern.
Six tools is well within a healthy scope and each covers a clearly different workflow (publish, upload, update, analyze one video, analyze the channel, compare Shorts). Nothing feels redundant or padded.
The surface covers upload, metadata update, video-level diagnostics, channel snapshot, Shorts comparison, and comment posting, so the main creation/read/update flows exist. But there is no delete/remove operation, no ability to read or reply to existing comments (only post new ones), and no way to list or search videos directly, leaving several likely agent workflows as dead ends.
Maintenance
Related MCP Connectors
Hosted MCP for YouTube Studio: uploads, metadata, playlists, comments, analytics, captions.
Remote MCP for AI Studio Android release gate MCP, structured receipts, audit logs, and reviewer-rea
Read-only Google Analytics 4 MCP server for AI assistants.
Remote MCP server for AI.TV creators — delegate account operations to your AI agent over MCP.
Related MCP Servers
- AlicenseAqualityCmaintenanceMCP server for YouTube creator-ops — video metadata, comments, playlists, channel analytics, plus a ComfyUI bridge for AI thumbnail generation.1577 npm1MIT
- AlicenseBqualityDmaintenanceLocal read-only MCP server for YouTube Data API v3 and YouTube Analytics API, enabling public video searches and OAuth-based private channel reads.9MIT
- AlicenseNot gradedqualityCmaintenanceA local, privacy-first MCP server providing direct access to official YouTube Data, Analytics, Reporting, and Live Streaming APIs for creators, enabling channel analysis, research, and guarded management operations.3MIT
- AlicenseNot gradedqualityCmaintenanceA local, read-only MCP server that provides Claude with private YouTube Analytics data—views, retention, traffic sources, demographics, revenue, and impressions/CTR—via authenticated Google APIs.7 npmMIT