Let AI watch videos: local files or YouTube/Bilibili URLs -> timestamped transcript + keyframes + contact sheets. Offline, no API key. MCP server + CLI + agent skill.
Six tools with clear verb-noun naming (watch_video, get_transcript, search_transcript, get_frames, get_frame_at, list_videos). All have descriptions (194 - 250 chars, within baseline 34 - 392). Input schemas present with type declarations and parameter descriptions. However, output schemas are not documented in the visible code, LLMs cannot predict return structure. Error handling is minimal; no recovery guidance or actionable error messages visible. watch_video supports long-polling (idempotent), but no confirmation pattern for destructive operations. Parameter constraints (model enum, device enum, language code) are described but not formally declared as JSON Schema enums.
Extract a single frame at an exact timestamp. Returns a JPEG image with timestamp burned into it.
Get keyframe images as a 3x3 contact sheet (grid) showing the visual storyline. Returns JPEG images.
Get the full transcript or a time range excerpt with timestamps. Returns text with [HH:MM:SS] format timestamps.
List all videos that have been processed and cached in the output directory. Returns a summary of available videos with their metadata.
Search the transcript for a keyword or phrase. Returns matching segments with timestamps and context.
Process a video file or URL (YouTube/Bilibili) to extract transcript and keyframes. Returns job status with progress information. Long-polls a running job if called again with the same video.
Output schemas not documented. LLMs cannot predict return structure (fields, types, pagination). watch_video returns job status with progress; get_transcript returns timestamped text; get_frames returns JPEG images, but no formal schema visible in code.
Parameter constraints (model, device, language) described in text but not declared as JSON Schema enums. LLMs cannot validate against allowed values; free-form strings invite hallucinated model names.
No error handling guidance. If watch_video fails (invalid URL, unsupported format, GPU OOM), no recovery hint provided. LLM cannot self-correct or suggest alternatives.
Inferred effective spec: <=2025-11-25.
| Scored | Grade | Overall | Spec posture | Rubric |
|---|---|---|---|---|
| 2026-09-23 | C | 62 | <=2025-11-25 | v2 |
list_videos has empty input schema (no parameters). Description does not explain what metadata is returned or how to filter/paginate results.
No pagination support visible. get_frames accepts 'count' (number of grids) but no offset/limit or cursor. Large video libraries could return unbounded results.