---
title: ToolRouter — Tool Detail
description: Detailed documentation for a ToolRouter tool including skills, parameters, and examples.
url: https://toolrouter.com/tools/video-production
---
# Video Production

Produce a complete video from a creative brief: treatment planning, screenplay, AI storyboard with keyframes, video clip generation, and final assembly with music and transitions. Each step is individually accessible. For brands, agencies, and filmmakers.

- **Version:** 0.02
- **Categories:** media, ai
- **Workflow:** create_treatment → create_script → create_storyboard → revise_storyboard → generate_videos → assemble_video

## Skills (6)

### Create Treatment (`create_treatment`)

Step 1: Generate a treatment plan from a creative brief. Queries knowledge bases (cinematography, lighting, colour, wardrobe, scriptwriting) and returns visual style, camera, sound, typography, pacing, emotional arc, and persona directions. Takes ~10s.

**Parameters:**

| Name | Type | Required | Description |
|------|------|----------|-------------|
| `brief` | string | Yes | Creative brief describing the video -- concept, goals, tone, audience, duration, style preferences |
| `creative_overrides` | object | No | Optional per-role creative overrides that take priority over brief analysis |
| `brand` | object | No | Brand information for integration |
| `personas` | array | No | Character personas with optional turnaround sheet images |
| `reference_images` | array | No | URLs for visual reference/moodboards |
| `target_platform` | string | No | Target distribution platform (default youtube) (youtube, instagram, tiktok, cinema, web) |
| `llm_model` | string | No | OpenRouter model ID override |

**Returns:** Comprehensive treatment plan with visual, camera, sound, typography, pacing, emotional arc, persona directions, and cost estimate

**Examples:**

*Treatment for a luxury watch reveal:*

```json
{
  "brief": "A 60-second cinematic product reveal for a luxury watch brand. Dark, moody aesthetic with precise movements.",
  "target_platform": "youtube"
}
```

### Create Script (`create_script`)

Step 2: Generate a full screenplay from the treatment. Uses scriptwriting frameworks for hooks, retention, and emotional architecture. Returns scenes with dialogue, voiceover, pacing markers, and audio cues. Takes ~10s. Requires full treatment from step 1.

**Parameters:**

| Name | Type | Required | Description |
|------|------|----------|-------------|
| `treatment` | object | Yes | Full treatment plan output from create_treatment |
| `duration_seconds` | number | No | Target video duration in seconds (overrides treatment estimate) |
| `brand` | object | No | Brand info (optional, same as create_treatment) |
| `personas` | array | No | Persona list (optional) |
| `target_platform` | string | No | Target distribution platform (youtube, instagram, tiktok, cinema, web) |
| `llm_model` | string | No | OpenRouter model ID override |

**Returns:** Full screenplay with scenes, dialogue, voiceover, pacing markers, emotional beats, and audio cues

**Examples:**

*Script from treatment:*

```json
{
  "treatment": {
    "concept": "Luxury watch reveal",
    "target_duration_seconds": 60,
    "visual": {},
    "camera": {},
    "sound": {
      "music_genre": "ambient electronic"
    },
    "pacing": {},
    "emotional_arc": [],
    "persona_directions": []
  },
  "duration_seconds": 60
}
```

### Create Storyboard (`create_storyboard`)

Step 3: Generate a shot list with AI keyframe images from script and treatment. Two-pass generation for consistency: establishing shots first, then remaining shots with persona references. Takes 1-5 min. Async -- poll with get_job_result. Requires steps 1-2.

**Parameters:**

| Name | Type | Required | Description |
|------|------|----------|-------------|
| `script` | object | Yes | Full script output from create_script |
| `treatment` | object | Yes | Full treatment output from create_treatment (includes treatment_id and persona_directions) |
| `personas` | array | No | Persona list (optional) |
| `keyframe_model` | string | No | fal.ai image model for keyframe generation [default: "fal-ai/nano-banana-2"] |
| `aspect_ratio` | string | No | Keyframe aspect ratio (16:9, 9:16, 1:1) [default: "16:9"] |
| `llm_model` | string | No | OpenRouter model ID override |

**Returns:** Storyboard with shots (keyframe images, video prompts, overlays), audio plan, and cost estimate

**Examples:**

*Storyboard from script and treatment:*

```json
{
  "script": {
    "title": "Watch Reveal",
    "total_duration_seconds": 60,
    "scenes": [
      {
        "scene_number": 1,
        "title": "Opening",
        "duration_seconds": 10,
        "location": "Dark studio",
        "action": "Watch on velvet",
        "dialogue": [],
        "voiceover": "",
        "pacing": "slow",
        "emotional_beat": "anticipation"
      }
    ]
  },
  "treatment": {
    "treatment_id": "abc123",
    "concept": "Luxury watch reveal",
    "visual": {
      "style": "cinematic",
      "color_palette": [
        "#1a1a2e",
        "#c9a55a"
      ],
      "color_grading": "desaturated with gold highlights",
      "lighting": "dramatic chiaroscuro"
    },
    "camera": {
      "default_framing": "medium close-up"
    },
    "pacing": {
      "default_shot_duration": 5,
      "transition_style": "fade",
      "transition_duration": 0.5
    },
    "persona_directions": []
  }
}
```

### Revise Storyboard (`revise_storyboard`)

Step 4 (optional, repeatable): Edit individual shots and regenerate keyframes. Supports field-level changes, shot addition/removal, and reordering. Same seeds by default; set new_seed for fresh generation. Takes 30-60s. Async -- poll with get_job_result.

**Parameters:**

| Name | Type | Required | Description |
|------|------|----------|-------------|
| `storyboard` | object | Yes | Full storyboard output from create_storyboard or previous revise_storyboard |
| `treatment` | object | Yes | Full treatment output (for persona directions and visual settings) |
| `personas` | array | No | Persona list (optional) |
| `revisions` | array | No | Array of shot revisions |
| `add_shots` | array | No | New shots to insert |
| `remove_shots` | array | No | Shot numbers to remove |
| `reorder` | array | No | New shot order (by shot_number) |

**Returns:** Updated storyboard with revised shots, renumbered, and regenerated keyframes

**Examples:**

*Change framing and regenerate keyframe for shot 3:*

```json
{
  "storyboard": {
    "shots": [
      {
        "shot_number": 1,
        "scene_number": 1,
        "description": "Wide establishing shot",
        "keyframe_url": "https://example.com/kf1.png",
        "keyframe_seed": 12345
      }
    ],
    "audio_plan": {
      "segments": []
    },
    "cost_estimate": {}
  },
  "treatment": {
    "treatment_id": "abc123",
    "visual": {
      "color_palette": [
        "#1a1a2e"
      ],
      "style": "cinematic"
    },
    "persona_directions": []
  },
  "revisions": [
    {
      "shot_number": 1,
      "changes": {
        "framing": "extreme close-up"
      },
      "regenerate_keyframe": true
    }
  ]
}
```

### Generate Videos (`generate_videos`)

Step 5: Generate video clips from storyboard keyframes via Kling 3.0 or other models. Each clip uses the keyframe + video_prompt to produce video with synced dialogue and audio. Takes 5-30 min. Async -- poll with get_job_result. Pending clips retrievable later.

**Parameters:**

| Name | Type | Required | Description |
|------|------|----------|-------------|
| `storyboard` | object | Yes | Full storyboard output from create_storyboard / revise_storyboard |
| `video_model` | string | No | Video model key (kling-3.0, kling-2.6, veo-3.1, etc.) [default: "kling-3.0"] |
| `shot_duration` | number | No | Target duration per clip in seconds (snapped to model-valid durations) [default: 5] |
| `max_parallel` | number | No | Max parallel video generation requests [default: 3] |

**Returns:** Video clips array with URLs and filenames, plus any pending clips still generating

**Examples:**

*Generate videos from storyboard:*

```json
{
  "storyboard": {
    "shots": [
      {
        "shot_number": 1,
        "scene_number": 1,
        "keyframe_url": "https://example.com/kf1.png",
        "video_prompt": "[Visual]: Dark studio, watch on velvet\n[Camera]: Slow dolly-in\n[Lighting]: Dramatic chiaroscuro\n[Mood]: Anticipation",
        "duration_seconds": 5
      }
    ],
    "audio_plan": {
      "segments": []
    }
  }
}
```

### Assemble Video (`assemble_video`)

Step 6 (final): Stitch clips into a complete video with transitions, overlays, titles, end card, and audio mixing. Auto-generates music or uses provided URL, with volume ducking during speech. Takes 2-5 min. Async -- poll with get_job_result.

**Parameters:**

| Name | Type | Required | Description |
|------|------|----------|-------------|
| `video_clips` | object | Yes | Full output from generate_videos (contains clips array) |
| `storyboard` | object | Yes | Full storyboard output |
| `treatment` | object | Yes | Full treatment output (for sound, typography, pacing) |
| `audio` | object | No | Audio configuration |
| `brand` | object | No | Brand info for end card (logo_url, name, colors) |
| `format` | string | No | Video aspect ratio format (landscape, portrait, square) [default: "landscape"] |
| `fps` | number | No | Frames per second (default 30) [default: 30] |

**Returns:** Final assembled video file (auto-uploaded via asset system) with duration and cost breakdown

**Examples:**

*Assemble final video:*

```json
{
  "video_clips": {
    "clips": [
      {
        "shot_number": 1,
        "video_url": "https://example.com/shot1.mp4",
        "video_path": "/tmp/shot1.mp4",
        "duration_seconds": 5,
        "filename": "shot_001_scene_01.mp4"
      }
    ]
  },
  "storyboard": {
    "shots": [
      {
        "shot_number": 1,
        "scene_number": 1,
        "overlays": [],
        "dialogue": "",
        "voiceover": ""
      }
    ],
    "audio_plan": {
      "segments": []
    }
  },
  "treatment": {
    "concept": "Luxury Watch",
    "logline": "A cinematic reveal",
    "sound": {
      "music_genre": "ambient electronic",
      "music_arc": "building tension to release",
      "sfx_style": "minimal"
    },
    "typography": {
      "heading_font": "Inter"
    },
    "visual": {
      "color_palette": [
        "#1a1a2e"
      ]
    },
    "pacing": {
      "transition_style": "fade",
      "transition_duration": 0.5
    }
  }
}
```

## Quick Start

```bash
# Via CLI
TOOLROUTER_API_KEY=tr_live_xxx npx -y toolrouter-mcp call video-production create_treatment --brief A 60-second cinematic product reveal for a luxury watch brand. Dark, moody aesthetic with precise movements. --target_platform youtube

# Via REST API
curl -H "Authorization: Bearer tr_live_xxx" \
     -d '{"tool":"video-production","skill":"create_treatment","input":{"brief":"A 60-second cinematic product reveal for a luxury watch brand. Dark, moody aesthetic with precise movements.","target_platform":"youtube"}}' \
     https://api.toolrouter.com/v1/tools/call
```

## Frequently Asked Questions

### Can I start from a brief and end with a finished video?

Yes. The tool is designed as a full pipeline: treatment, script, storyboard, video generation, and final assembly. Each step builds on the previous one.

### Do I have to pass each step into the next one?

Yes. The manifest expects the full output from each step to be passed forward, which keeps the treatment, script, storyboard, and final edit aligned.

### Can I control aspect ratio and recurring characters?

Yes. Set `aspect_ratio` to `16:9` or `9:16`, and use personas with a turnaround sheet URL when you need the same character to stay consistent across scenes.

### Are the render steps asynchronous?

Yes. Storyboard generation, revisions, video generation, and final assembly are async steps, so you poll `get_job_result` until the job finishes.

---

## Get Started with ToolRouter

**Already connected?** Call any tool with `use_tool({ tool, skill, input })`. Browse tools with `discover` or visit https://toolrouter.com/llms-full.txt

**New to ToolRouter?** Connect with one command (no API key needed — auto-provisions on first use):

```bash
# MCP (Claude Code, Codex CLI)
claude mcp add toolrouter -- npx -y toolrouter-mcp

# MCP (Cursor, Windsurf, Cline, VS Code, Gemini CLI, Claude Desktop)
{"mcpServers":{"toolrouter":{"command":"npx","args":["-y","toolrouter-mcp"]}}}

# Claude Chat / Claude Cowork / Claude Mobile — add as a connector:
# Settings → Connectors → Add custom connector → URL: https://api.toolrouter.com/mcp

# ChatGPT — add as an app:
# Settings → Apps → Advanced settings → enable Developer mode → Create app → MCP Server URL: https://api.toolrouter.com/mcp

# CLI (works instantly, no restart needed)
npx -y toolrouter-mcp tools                    # browse all tools
npx -y toolrouter-mcp search "seo"             # search by keyword
npx -y toolrouter-mcp call seo analyze_page --url https://example.com
```

Free tools work immediately. For paid tools, visit https://toolrouter.com/claim to add credits.

All platforms: https://toolrouter.com/connect | Full catalog: https://toolrouter.com/llms-full.txt | Docs: https://toolrouter.com/docs