Skip to main content
Glama

mateai-youtube-mcp

Release mategog/mateai-youtube-mcp MCP server YouTube Channel Sponsor on GitHub Buy Me A Coffee License: Apache 2.0 + Commons Clause

MateAI YouTube Studio & Shorts Experiment Dashboard

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.mp4 with 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.html dashboard.

  • 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.html

Print a Markdown table for tracking Shorts A/B style experiments:

MATEAI_YT_PUBLIC_SCRAPE=1 python3 yt_studio.py experiment-table --handle @mateai-c6m

Related 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-youtube

Option B: Claude Code

Install directly from the plugin marketplace:

claude plugin marketplace add mategog/mateai-youtube-mcp
claude plugin install yt-studio@mateai-youtube-mcp

The 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 setup

Replace <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

yt_channel_snapshot

Fetch channel overview, Long-form uploads, Shorts stats, and update report.html.

yt_shorts_experiment_table

Generate a Markdown table comparing Shorts retention, swipe-away rate, and views.

yt_video_details

Inspect metadata and metrics for any 11-character YouTube video_id.

yt_upload_draft

Upload a local MP4/MOV + cover image + full Studio setup (title, description, hashtags, tags, language, contains_synthetic_media, pinned_comment, and publish_at schedule).

yt_update_video

Update title, description, tags, privacy status, schedule time, or thumbnail of an existing video.

yt_post_comment

Post a top-level comment (e.g. your ## Pinned comment question) on a video.

TikTok (optional, needs the TikTok setup)

Tool

Description

tiktok_channel_snapshot

Fetch your TikTok profile stats and recent videos (views, likes, comments, shares) through TikTok's official API.

tiktok_upload_draft

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.

cross_platform_shorts_table

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-pipeline command and yt-scraper, channel-analyzer, idea-validator agents) — 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, interactive report.html dashboard & 1-command setup wizard) — 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 ~/Downloads and run /yt-setup again.

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 /yt-setup.

"Login did not finish"

The tab was closed early or a box was not ticked. Rerun /yt-setup.

"yt-studio plugin is not installed"

Run claude plugin install yt-studio@mateai-youtube-mcp.

"Could not install the Google libraries"

Install Python 3 (python.org) and check your internet connection.

Nothing happens

Hooks may be off (disableAllHooks). /yt-setup is a hook-based mod.

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 ~/.claude/plugins/data/yt-studio-mateai-youtube-mcp/.tokens, then rerun /yt-setup.

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 setup

What python3 yt_studio.py setup does automatically:

  1. Creates .venv & installs Google's OAuth libraries automatically if not yet installed.

  2. Auto-enables the YouTube APIs via gcloud (if you have the gcloud CLI installed), or pops open the direct 1-click enablement pages.

  3. Opens the exact Test User & Create Desktop Client screens and watches your ~/Downloads folder in real time—the instant you click "Download JSON" in your browser, the wizard automatically grabs client_secret_*.json from ~/Downloads, moves it into google_auth_secret/client_secret.json (0600 permissions, .gitignored), launches your YouTube channel login, and opens your live report.html dashboard!


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.mp4 to my TikTok inbox with the caption from planning/my-short-upload.md."

"Show my YouTube Shorts next to the same videos on TikTok."

Connect TikTok (once)

  1. Create an app at developers.tiktok.com and choose the Desktop platform.

  2. Add the redirect URI http://127.0.0.1:8765/callback/ (exactly, with the trailing slash).

  3. Enable these scopes: user.info.basic, user.info.profile, user.info.stats, video.list, video.upload.

  4. 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 setup

If 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 TikTok

Good to know

  • Captions are pasted by hand. TikTok's inbox upload cannot take a caption. tiktok_upload_draft builds one from your upload spec (title plus the #hashtags in the description, #Shorts removed) 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.json and the login token is .tokens/tiktok_token.json, both owner-only (0600) and .gitignored. The cache is tiktok_snapshot.json. Details in PRIVACY.md.

Problem

Fix

"No TikTok OAuth token found"

Run python3 tiktok_studio.py setup.

"TikTok refresh token expired"

Run python3 tiktok_studio.py setup again to sign in.

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 http://127.0.0.1:8765/callback/.

Channel handle is empty

The user.info.profile scope is missing. Enable it in your TikTok app and run setup again.


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.com channel and video pages only when you opt in with --public, force_public=true or MATEAI_YT_PUBLIC_SCRAPE=1.

  • yt_upload_draft reads the video and cover files whose paths you give it and uploads them to your channel. yt_update_video and yt_post_comment change your video or post a comment, only when called.

  • Writes channel_snapshot.json and report.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*.json in the plugin data folder, your current project and ~/Downloads (up to 5 folders deep), and copies a Desktop-app client into the data folder with 600 permissions. 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:

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 tools
yt_channel_snapshotA
Idempotent

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.

NameRequiredDescriptionDefault
handleNoYouTube channel handle (with or without leading '@', e.g. '@mateai-c6m'). Defaults to '@mateai-c6m'.@mateai-c6m
force_publicNoOpt in to public page scraping for this call (bypasses OAuth2; public views/likes only). Only set when the user asks for it.

Output Schema

NameRequiredDescription
modeYes
shortsYes
videosYes
channelYes
dashboardPathYes

TDQS

A4.6/5.0
Behavior5/5

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.

Conciseness4/5

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.

Completeness5/5

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.

Parameters4/5

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.

Purpose5/5

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.

Usage Guidelines4/5

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.

NameRequiredDescriptionDefault
textYesPlain-text comment body (1–10,000 characters) to publish publicly on the video.
video_idYes11-character YouTube video ID where the top-level comment will be posted.

Output Schema

NameRequiredDescription
textNo
videoIdYes
commentIdYes

TDQS

A4.5/5.0
Behavior5/5

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.

Conciseness5/5

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.

Completeness5/5

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.

Parameters3/5

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.

Purpose5/5

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.

Usage Guidelines4/5

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_tableA
Read-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.

NameRequiredDescriptionDefault
handleNoYouTube channel handle (with or without leading '@', default '@mateai-c6m').@mateai-c6m

TDQS

A3.9/5.0
Behavior4/5

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.

Conciseness4/5

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.

Completeness4/5

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.

Parameters3/5

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.

Purpose5/5

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.

Usage Guidelines3/5

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_videoA
Idempotent

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}.

NameRequiredDescriptionDefault
tagsNoReplacement list of YouTube SEO keyword tags. Leave omitted to keep existing tags.
titleNoNew video title (1–100 characters). Leave omitted to keep existing title.
video_idYes11-character YouTube video ID to update.
publish_atNoFuture ISO 8601 timestamp with timezone offset to schedule publication (e.g. '2026-11-05T17:00:00+01:00'). Forces privacy_status='private'.
descriptionNoNew video description (up to 5,000 characters). Leave omitted to keep existing description.
privacy_statusNoUpdated visibility status. Ignored and forced to 'private' if publish_at is provided.
thumbnail_pathNoOptional absolute local filesystem path to a readable PNG/JPG image (<=2MB) to upload via thumbnails.set.

Output Schema

NameRequiredDescription
videoIdYes
studioUrlYes

TDQS

A4.3/5.0
Behavior5/5

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.

Conciseness4/5

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.

Completeness5/5

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.

Parameters4/5

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.

Purpose4/5

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.

Usage Guidelines4/5

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.

NameRequiredDescriptionDefault
tagsNoYouTube SEO keyword tags (combined length up to 500 characters).
titleNoVideo title (1–100 characters). Required unless spec_path provides a '## Title' section.
hashtagsNoHashtags to append to the end of description (e.g. ['#AINews', '#Shorts']).
languageNoBCP-47 language code for defaultLanguage and defaultAudioLanguage (default: 'en').en
spec_pathNoOptional local path to a Markdown upload spec file ('## Title', '## Description', '## Tags', '## Pinned comment') used as fallback when inline fields are omitted.
publish_atNoOptional 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_pathYesAbsolute local filesystem path to a readable MP4 or MOV video file to upload.
category_idNoYouTube numeric category ID (default: '28' for Science & Technology).28
descriptionNoVideo description (up to 5,000 characters). Hashtags from 'hashtags' are appended if not already present.
made_for_kidsNoCOPPA selfDeclaredMadeForKids flag (default: false).
pinned_commentNoTop-level comment text to post on the video when auto_post_comment is true.
privacy_statusNoInitial visibility in YouTube Studio (default: 'private'). Forced to 'private' whenever publish_at is set.private
thumbnail_pathNoOptional absolute local path to a PNG/JPG custom thumbnail image (<=2MB, requires verified YouTube account).
auto_post_commentNoIf true and pinned_comment is non-empty, immediately posts pinned_comment as a top-level comment (requires video to allow comments).
contains_synthetic_mediaNoYouTube Studio altered/synthetic media disclosure flag (status.containsSyntheticMedia, default: false).

Output Schema

NameRequiredDescription
videoIdYes
watchUrlYes
publishAtNo
studioUrlYes
privacyStatusNo

TDQS

A4.6/5.0
Behavior5/5

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.

Conciseness4/5

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.

Completeness5/5

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.

Parameters4/5

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.

Purpose5/5

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.

Usage Guidelines4/5

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_detailsA
Read-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.

NameRequiredDescriptionDefault
video_idYes11-character YouTube video or Short ID (e.g. 'I9c6W135VZk').
force_publicNoOpt in to scraping the public watch page for title/views/likes. Only set when the user asks for it.
words_or_script_pathNoOptional 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

NameRequiredDescription
titleNo
videoIdYes
likeCountNo
viewCountNo
studioDiagnosisNo

TDQS

A4.4/5.0
Behavior5/5

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.

Conciseness4/5

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.

Completeness5/5

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.

Parameters3/5

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.

Purpose5/5

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.

Usage Guidelines4/5

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.

  1. 2 tool updatesv0.3.0
    • Changedyt_channel_snapshot1 field changed
      • changedInput schema / properties / force_public / description
        Previous 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."
    • Changedyt_video_details1 field changed
      • addedInput schema / properties / force_public
        Added 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"
        +}
  2. 6 tool updatesv0.2.0
    • Changedyt_channel_snapshot6 fields changed
      • addedInput schema / properties / force_public / default
        Added value: +false
      • changedInput schema / properties / force_public / description
        Previous 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."
      • addedInput schema / properties / handle / default
        Added value: +"@mateai-c6m"
      • changedInput schema / properties / handle / description
        Previous 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'."
      • addedInput schema / properties / handle / pattern
        Added value: +"^@?[A-Za-z0-9._-]+$"
      • changedOutput 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"
        +}
    • Changedyt_post_comment6 fields changed
      • changedInput schema / properties / text / description
        Previous value: -"Comment text to post."New value: +"Plain-text comment body (1–10,000 characters) to publish publicly on the video."
      • addedInput schema / properties / text / maxLength
        Added value: +10000
      • addedInput schema / properties / text / minLength
        Added value: +1
      • changedInput schema / properties / video_id / description
        Previous value: -"11-character YouTube video ID."New value: +"11-character YouTube video ID where the top-level comment will be posted."
      • addedInput schema / properties / video_id / pattern
        Added value: +"^[A-Za-z0-9_-]{11}$"
      • changedOutput schema / (root)
        Previous value: -nullNew value: +{
        +  "properties": {
        +    "commentId": {
        +      "type": "string"
        +    },
        +    "text": {
        +      "type": "string"
        +    },
        +    "videoId": {
        +      "type": "string"
        +    }
        +  },
        +  "required": [
        +    "commentId",
        +    "videoId"
        +  ],
        +  "type": "object"
        +}
    • Changedyt_shorts_experiment_table3 fields changed
      • addedInput schema / properties / handle / default
        Added value: +"@mateai-c6m"
      • changedInput schema / properties / handle / description
        Previous value: -"YouTube channel handle (default '@mateai-c6m')."New value: +"YouTube channel handle (with or without leading '@', default '@mateai-c6m')."
      • addedInput schema / properties / handle / pattern
        Added value: +"^@?[A-Za-z0-9._-]+$"
    • Changedyt_update_video11 fields changed
      • changedInput schema / properties / description / description
        Previous value: -"New video description (up to 5000 characters)."New value: +"New video description (up to 5,000 characters). Leave omitted to keep existing description."
      • addedInput schema / properties / description / maxLength
        Added value: +5000
      • changedInput schema / properties / privacy_status / description
        Previous value: -"Updated visibility status in YouTube Studio."New value: +"Updated visibility status. Ignored and forced to 'private' if publish_at is provided."
      • changedInput schema / properties / publish_at / description
        Previous 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'."
      • changedInput schema / properties / tags / description
        Previous value: -"Updated list of YouTube SEO keyword tags."New value: +"Replacement list of YouTube SEO keyword tags. Leave omitted to keep existing tags."
      • changedInput schema / properties / thumbnail_path / description
        Previous 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."
      • changedInput schema / properties / title / description
        Previous value: -"New video title (up to 100 characters)."New value: +"New video title (1–100 characters). Leave omitted to keep existing title."
      • addedInput schema / properties / title / maxLength
        Added value: +100
      • changedInput schema / properties / video_id / description
        Previous value: -"11-character YouTube video ID."New value: +"11-character YouTube video ID to update."
      • addedInput schema / properties / video_id / pattern
        Added value: +"^[A-Za-z0-9_-]{11}$"
      • changedOutput schema / (root)
        Previous value: -nullNew value: +{
        +  "properties": {
        +    "studioUrl": {
        +      "type": "string"
        +    },
        +    "videoId": {
        +      "type": "string"
        +    }
        +  },
        +  "required": [
        +    "videoId",
        +    "studioUrl"
        +  ],
        +  "type": "object"
        +}
    • Changedyt_upload_draft24 fields changed
      • addedInput schema / properties / auto_post_comment / default
        Added value: +false
      • changedInput schema / properties / auto_post_comment / description
        Previous 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)."
      • addedInput schema / properties / category_id / default
        Added value: +"28"
      • changedInput schema / properties / category_id / description
        Previous value: -"YouTube category ID (default: '28' for Science & Technology)."New value: +"YouTube numeric category ID (default: '28' for Science & Technology)."
      • addedInput schema / properties / contains_synthetic_media / default
        Added value: +false
      • changedInput schema / properties / contains_synthetic_media / description
        Previous value: -"Altered/synthetic media disclosure flag in YouTube Studio (default: false)."New value: +"YouTube Studio altered/synthetic media disclosure flag (status.containsSyntheticMedia, default: false)."
      • changedInput schema / properties / description / description
        Previous 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."
      • addedInput schema / properties / description / maxLength
        Added value: +5000
      • changedInput schema / properties / hashtags / description
        Previous value: -"Hashtags to append to description (e.g. ['#AINews', '#Shorts'])."New value: +"Hashtags to append to the end of description (e.g. ['#AINews', '#Shorts'])."
      • addedInput schema / properties / language / default
        Added value: +"en"
      • changedInput schema / properties / language / description
        Previous value: -"BCP-47 language code for title/audio (default: 'en')."New value: +"BCP-47 language code for defaultLanguage and defaultAudioLanguage (default: 'en')."
      • addedInput schema / properties / made_for_kids / default
        Added value: +false
      • changedInput schema / properties / made_for_kids / description
        Previous value: -"Whether video is made for kids (default: false)."New value: +"COPPA selfDeclaredMadeForKids flag (default: false)."
      • changedInput schema / properties / pinned_comment / description
        Previous 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."
      • addedInput schema / properties / privacy_status / default
        Added value: +"private"
      • changedInput schema / properties / privacy_status / description
        Previous 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."
      • changedInput schema / properties / publish_at / description
        Previous 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."
      • changedInput schema / properties / spec_path / description
        Previous 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."
      • changedInput schema / properties / tags / description
        Previous value: -"YouTube SEO keyword tags."New value: +"YouTube SEO keyword tags (combined length up to 500 characters)."
      • changedInput schema / properties / thumbnail_path / description
        Previous 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)."
      • changedInput schema / properties / title / description
        Previous value: -"Video title (up to 100 characters)."New value: +"Video title (1–100 characters). Required unless spec_path provides a '## Title' section."
      • addedInput schema / properties / title / maxLength
        Added value: +100
      • changedInput schema / properties / video_path / description
        Previous value: -"Absolute path to MP4/MOV file."New value: +"Absolute local filesystem path to a readable MP4 or MOV video file to upload."
      • changedOutput 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"
        +}
    • Changedyt_video_details4 fields changed
      • changedInput schema / properties / video_id / description
        Previous value: -"11-character YouTube video ID (e.g. 'I9c6W135VZk')."New value: +"11-character YouTube video or Short ID (e.g. 'I9c6W135VZk')."
      • addedInput schema / properties / video_id / pattern
        Added value: +"^[A-Za-z0-9_-]{11}$"
      • changedInput schema / properties / words_or_script_path / description
        Previous 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."
      • changedOutput 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"
        +}
  3. 6 tool updatesv0.1.0
    • First observedyt_channel_snapshot
    • First observedyt_post_comment
    • First observedyt_shorts_experiment_table
    • First observedyt_update_video
    • First observedyt_upload_draft
    • First observedyt_video_details

TDQS

A4.1/5.0

Scored across 6 tools

Disambiguation4/5

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.

Naming Consistency4/5

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.

Tool Count5/5

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.

Completeness3/5

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

ActivityMaintained
ResponsivenessNo issues

Related MCP Connectors

Related MCP Servers