Creates Instagram reels and YouTube Shorts by downloading videos, analyzing them, and rendering new content using Remotion (React-based programmatic video). Replaces CapCut MCP with yt-dlp + ffmpeg + Remotion.
Server has 4 tools with complete input schemas and descriptions, but quality is uneven. analyze_video and create_dialogue_reel have detailed, actionable descriptions (150-300 chars) with clear parameter types and enums. However, parameter descriptions are sparse or missing context. create_facts_reel mirrors create_dialogue_reel's structure. list_outputs is minimal. No output schemas documented. Error handling is absent, tools return raw dicts with 'error' keys but no recovery guidance. No tool annotations (readOnlyHint, destructiveHint). Naming is verb-first and clear. Composition is reasonable: analyze_video → create_*_reel → list_outputs forms a logical chain, but tools lack idempotency guarantees and confirmation steps for destructive operations (video rendering, file writes).
Download a video from any URL (Instagram, YouTube, Facebook) and extract: - Duration in seconds - Frames at 0.5fps (for script/text analysis) - Audio file path - Basic video info (resolution, fps) Returns paths to extracted frames so Claude can read them and identify the script, text overlays, timings, and style of the reference video. Call this before creating a reel based on a reference video.
Create an animated dialogue reel with speaker bubbles, slide-up animations, and a themed background. Renders to MP4. Args: composition_id: Unique ID like "bijli_reel_v2" (no spaces, alphanumeric + underscore) dialogues: List of dialogue entries, each a dict with: - s: start time in seconds (float) - e: end time in seconds (float) - lines: list of text strings (1-2 lines) - color: "pink" | "red" | "purple" | "yellow" | "cyan" - speaker: speaker label shown in tag e.g. "Citizen", "Bijli Dept" duration_seconds: Total video duration in seconds audio_public_key: Key like "audio/filename.aac" (file must be in public/audio/) background_style: "monsoon" | "dark" | "fire" | "hospital" | "gradient" output_name: Output filename without extension (defaults to composition_id) title: Optional title shown at top of video watermark: Watermark text at bottom (default: REMOTION_MCP_WATERMARK env var, or empty) Returns path to rendered MP4. Example dialogue entry: {"s": 4, "e": 7, "lines": ["Light bhej aiiyye!"], "color": "pink", "speaker": "Citizen"}
Create a facts/educational reel with scrolling text, background video loop, and optional background music. Renders to MP4. Args: composition_id: Unique ID like "facts_reel_v1" (no spaces, alphanumeric + underscore) facts: List of fact entries, each a dict with: - s: start time in seconds (float) - e: end time in seconds (float) - text: fact text (can be multi-line) - emoji: optional emoji to display duration_seconds: Total video duration in seconds background_video_key: Key like "bg/filename.mp4" (file must be in public/bg/) background_music_key: Key like "music/filename.aac" (file must be in public/music/) output_name: Output filename without extension (defaults to composition_id) title: Optional title shown at top of video watermark: Watermark text at bottom (default: REMOTION_MCP_WATERMARK env var, or empty) Returns path to rendered MP4. Example fact entry: {"s": 2, "e": 5, "text": "Did you know? Electricity is...", "emoji": "⚡"}
Output schemas not documented. Tools return dicts with fields like 'frame_paths', 'audio_public_key', 'error' but LLMs cannot infer structure or plan downstream calls. Violates pattern:tool requirement for documented return types.
Error handling lacks recovery guidance. analyze_video returns {'error': '...'} on download failure but does not suggest next steps (retry, check URL, try different format). Violates pattern:recovery-guide.
No tool annotations. create_dialogue_reel and create_facts_reel are destructive (write MP4 files, modify state) but lack destructiveHint annotation. list_outputs is read-only but lacks readOnlyHint. Violates current spec (2026-07-28) tool annotation requirement.
| Scored | Grade | Overall | Spec posture | Rubric |
|---|---|---|---|---|
| 2026-09-23 | D | 58 | 2026-07-28+ | v2 |
List all rendered MP4 files in the output directory. Use this after calling create_dialogue_reel or create_facts_reel to confirm the file was created and get its path.
Parameter descriptions incomplete or vague. 'composition_id' says 'no spaces, alphanumeric + underscore' but does not specify length limits or min/max. 'dialogues' array lacks min/max item count. 'background_style' enum is documented but no guidance on visual effect of each style. Violates pattern:constrained-input.
No idempotency or confirmation step for destructive operations. Calling create_dialogue_reel twice with same composition_id will overwrite the first output without warning. No dry-run or confirmation pattern. Violates pattern:confirmation-request.