YouTube video analysis tools — model-agnostic Gemini-style video understanding with dense frame↔transcript interleaving, scene-change detection, and timestamp-burned screenshots.
Five tools with clear verb-noun naming and detailed descriptions (avg 180 chars, within baseline 194). All tools have input schemas with Zod validation and type definitions. However, output schemas are undocumented, responses are inferred from code (text + image content arrays) but never formally declared. Parameter descriptions are present but lack constraint details (ranges, enums, format specs). Error handling returns toolError() calls but lacks recovery guidance or error classification. No tool annotations (readOnlyHint, idempotentHint) despite all being read-only operations.
Extract frames from a YouTube video at specific timestamps. Returns images with burned-in timestamps.
Get a visual overview grid of a YouTube video — a composite image showing frames at every scene change, tiled into a single image with timestamps. Quick way to see what a video covers without watching the whole thing.
Fetch the full timestamped transcript of a YouTube video. Returns text with timestamps.
Fetch metadata about a YouTube video: title, channel, duration, description, upload date, view count.
Watch a YouTube video in segments. For short videos (<5 min), returns everything at once. For longer videos, processes a segment at a time — call repeatedly with start_time to page through the full video. Each segment returns dense frame↔transcript interleaving with ~1 frame every 5 seconds (close to Gemini's density). The response tells you how to continue to the next segment.
Output schemas undocumented. All tools return CallToolResult with text/image content arrays, but no formal schema is declared. LLMs cannot plan downstream operations or validate response structure.
Parameter constraints missing. Numeric params (width, max_scenes, columns, segment_duration, max_frames) lack min/max bounds. LLMs can pass absurd values (width=1, max_scenes=1000) that break processing.
Error responses lack recovery guidance. toolError() returns bare error messages ('Failed to get video info: ...') without suggesting next steps or error classification (retryable vs fatal).
| Scored | Grade | Overall | Spec posture | Rubric |
|---|---|---|---|---|
| 2026-09-23 | D | 58 | 2026-07-28+ | v2 |
No tool annotations. All five tools are read-only (no side effects), but readOnlyHint is not set. Agents cannot distinguish safe tools from destructive ones without reading descriptions.
watch_video parameter semantics unclear. segment_duration and max_frames both default to 0 (auto-calculated), but the interaction between them is not documented. LLMs cannot reason about pagination strategy.