MCP server for YouTube channel and transcript research - no API key, no browser rendering
Four well-named tools with clear, detailed descriptions (avg 180 chars, well above 10-char minimum). All tools have complete input schemas with typed parameters and descriptions. Tool names follow verb_noun pattern (list_, get_). Descriptions explain WHAT, WHEN, and constraints. However, output schemas are not formally documented in the code, only described in prose. No error handling guidance (recovery steps, retryable vs fatal). No tool annotations (readOnlyHint present in metadata but not in schema). Parameter descriptions are strong but lack explicit format/range constraints in some cases (e.g., frame_interval lacks min/max bounds). No pagination support despite list_channel_videos accepting max_results up to 1000.
Extract frames from a video at regular intervals and return them as JPEG images. Downloads only the video stream (no audio) to a temporary file, extracts frames at the specified interval (default 5 seconds), and returns them as base64-encoded JPEG data. Optionally writes extracted frames to a caller-specified output directory. Frames are never persisted unless output_dir is explicitly provided.
Fetch metadata for a video: title, description, duration, upload date, channel name, view count, like count, comment count, and availability status. Returns structured metadata as a dictionary.
Extract a video's captions as plain text. Tries caption formats in order: json3 (YouTube's JSON format, cleanest), srv3, srv1, vtt. Returns the transcript as a single string with timestamps stripped. Raises an error if the video has no captions or is unavailable.
List a channel's videos with titles, IDs, and upload dates. Accepts a channel handle (@mwganson), channel URL, channel ID (/channel/UC...), or playlist URL. Returns up to max_results videos (default 50, max 1000). Dates come from the RSS feed when available; if the feed is down, falls back to per-video extraction (capped at 20 to avoid excessive requests). Shorts and streams are excluded by default; set include_shorts=True or include_streams=True to include them.
Output schemas not formally documented. Descriptions mention return types (e.g., 'returns structured metadata as a dictionary') but no JSON Schema definitions visible in code. LLMs cannot plan downstream tool calls without knowing exact response fields.
No error handling guidance. Descriptions do not explain what errors are possible, whether they are retryable, or what the LLM should do next. E.g., 'Raises an error if the video has no captions', but no guidance on recovery.
Numeric parameter bounds not specified. frame_interval defaults to 5.0 but no min/max documented. max_results defaults to 50, max 1000, but no minimum stated. LLMs may pass invalid values (0, negative, or absurdly large numbers).
| Scored | Grade | Overall | Spec posture | Rubric |
|---|---|---|---|---|
| 2026-09-23 | C | 66 | 2026-07-28+ | v2 |
No pagination metadata returned. list_channel_videos accepts max_results up to 1000 but no indication of total count, next_cursor, or whether results are truncated. Large result sets risk context window exhaustion.
Tool annotations missing from schema. Risk metadata (READ_ONLY) is present in the evaluation data but not visible in the actual tool registration code. readOnlyHint should be declared in tool schema for LLM safety.