MCP server for the YouTube Analytics API — owner-side channel, video and playlist analytics for AI agents: watch time, traffic sources, audience retention, podcast-series metrics, and episode-over-episode comparison. Read-only.
Strong foundation with 9 well-named tools, comprehensive schemas, and detailed parameter descriptions. All tools follow verb_noun naming (yt_*). Descriptions are substantive (100-250 chars typical), exceeding the 10-1024 char baseline. Input schemas are complete with types, enums, and constraints. Tool annotations are properly implemented (readOnlyHint, destructiveHint, idempotentHint, openWorldHint). Key gaps: output schemas are not formally documented in the tool definitions (responses are JSON but structure is not declared in the schema); error handling is minimal (no recovery guidance or actionable error messages visible); no pagination support despite tools returning potentially large result sets (e.g., yt_geography max_results=250, yt_top_videos max_results=200).
Get audience retention data for a single video. Returns the percentage of viewers retained at each point in the video, showing where viewers drop off.
Get basic information about the authenticated user's YouTube channel, including channel name, custom URL, subscriber count, total video count, and total view count.
Get channel-level analytics for a date range, optionally grouped by day or month. Returns views, engagement metrics, watch time, subscriber changes, and interaction counts.
Compare performance of multiple videos (episodes) over their first N days. Aligns videos by publish date to show episode-over-episode comparison of views, watch time, and other metrics.
Analyze viewer geography by country. Returns views and watch time by country for a date range.
Output schemas not formally documented. Tools return JSON (verified in code: json() helper wraps stripNulls(data)), but the MCP tool definitions do not declare the response structure. LLMs cannot plan downstream operations or validate field presence without documented output schemas.
No pagination support despite large result sets. Tools accept max_results (e.g., yt_geography max=250, yt_top_videos max=200) but do not return cursors, offsets, or total counts. An LLM requesting 250 countries receives all in one response, risking context window exhaustion. No limit enforcement in descriptions.
| Scored | Grade | Overall | Spec posture | Rubric |
|---|---|---|---|---|
| 2026-09-23 | C | 64 | 2026-07-28+ | v2 |
Get analytics for playlists. Returns playlist-specific metrics like playlist views, starts, saves, and average time spent in playlist.
Get the top-performing videos for a date range, ranked by views. Returns video IDs, titles (if resolved), and metrics like views, watch time, and engagement.
Analyze traffic sources driving views to the channel. Returns views and watch time by traffic source type (direct, search, suggested videos, playlist, etc.) for a date range.
Get detailed analytics for specific videos. Returns metrics like views, watch time, engagement, and subscriber changes for one or more video IDs.
Error handling lacks recovery guidance. Code shows errorResult() returns isError=true with a message, but no categorization (retryable vs user-fixable vs fatal) or actionable next steps. E.g., if date validation fails, the error message guides the user but not the LLM on what to try next.
Parameter descriptions lack format constraints for dates. While assertDate() validates YYYY-MM-DD format in code, the parameter descriptions state 'Start date in YYYY-MM-DD format' but do not specify the regex or consequences of misformat. LLMs may pass '07-06-2026' or '2026/07/06' without explicit constraint text.
Composition gap: yt_channel_info returns channel metadata but does not include channel_id in the response (inferred from code structure). Downstream tools like yt_video_performance require video_ids, not channel_id, so chaining is not broken, but the response should document what fields are returned to enable agent planning.