MCP · streamable-http · async jobs

video-render-mcp

Give any AI agent a scene plan, get a 1080p MP4 back. Motion graphics + AI narration + optional captions + your own images. One MCP tool call, no watermark, no post-production.

Quickstart ↓GitHub ↗

56s explainer rendered by this MCP — premium voice + custom SVG mockups + Ken Burns

How it works

1
Describe

Tell your agent what you want. It drafts a scene plan — title, stats, images, script, voice.

2
Render

Agent calls render_video. Returns a jobId in <1s. Actual render runs 30–300s server-side.

3
Poll + download

Poll GET /api/jobs/{id} every ~5s. Once status=success, fetch the MP4. Valid 7 days.

Quickstart

1. Get an API key

Sign in with Google (100 free credits ≈ 5 minutes of free-voice video or ~100s of premium voice). Rotate the key any time from the dashboard.

2. Wire it into your MCP client

Claude Desktop / Cursor / Zed — any MCP client with streamable-http support:

{
  "mcpServers": {
    "video-render": {
      "url": "https://video-render.regiq.in/api/mcp",
      "headers": {
        "Authorization": "Bearer vrm_live_..."
      }
    }
  }
}

3. Or hit the JSON-RPC endpoint directly

curl -X POST https://video-render.regiq.in/api/mcp \
  -H "Authorization: Bearer vrm_live_..." \
  -H "Content-Type: application/json" \
  -d '{
    "jsonrpc":"2.0","id":1,"method":"tools/call",
    "params":{"name":"render_video","arguments":{
      "title":"My video",
      "targetDurationSec":30,
      "voice":"female-uk",
      "script":"Hello world...",
      "scenes":[
        {"type":"title","copy":"My video"},
        {"type":"cta","url":"example.com","copy":"Try it"}
      ]
    }}
  }'

The two tools

plan_video_scenesDraft a scene plan from a natural-language brief.

Pure scaffolder — echoes back a validated ScenePlan the model can iterate on with the user before spending credits. Free.

render_videoEnqueue an async render of an MP4 from a ScenePlan.

Returns immediately with { jobId, statusUrl, videoUrl }. Deducts credits up front (refunded on failure). Renders 60–300s server-side; poll statusUrl. Async by design so a Cloudflare-tunnel-style 100s HTTP cap can't 524 the render.

Async job model

# 1. Enqueue (returns in <1s)
POST /api/mcp  ->  { "jobId": "cmr...", "statusUrl": ".../api/jobs/cmr...",
                     "videoUrl": ".../api/renders/cmr....mp4" }

# 2. Poll every 5s until success (auth required)
GET /api/jobs/{jobId}  ->  { "status": "pending" | "rendering"
                                    | "success"  | "failed",
                             "videoUrl": "..." (when success),
                             "durationSec": 46.8,   "sizeBytes": 8829777 }

# 3. Fetch the mp4 (public, valid 7 days)
GET /api/renders/{jobId}.mp4

Scene types

A scene plan is 1–12 scenes, each one of these types. Duration is allocated proportionally to the scenes based on their kind.

titlecopy, subtitle?

Big animated headline with an accent underline and optional subtitle. Ideal opener.

imagesrc, caption?, kenBurns?, fit?, background?

Full-frame image with Ken Burns pan/zoom. Accepts https URLs or data:image/* URLs — inline your own screenshots, photos, or SVG mockups.

statbig, small, image?

Big word or number with a caption underneath. Add an image and it switches to two-column (mockup left, copy right).

codelanguage, snippet, caption?, highlightLines?

Syntax-highlighted code snippet with optional highlighted lines and a caption underneath.

ctaurl, copy

Radial-glow call-to-action with a pulsing URL bubble. Use for the closing frame.

Example scene plan

Send this as the arguments object to a render_video tools/call. Images are optional — omit them for pure motion-graphics text.

{
  "title": "60-second product explainer",
  "targetDurationSec": 60,
  "voice": "premium-female-uk",
  "music": "upbeat",
  "captions": true,
  "accent": "#0EA5A0",
  "script": "Your full narration here, sized to ~150 wpm × duration...",
  "scenes": [
    { "type": "image",
      "src": "data:image/png;base64,iVBORw0K...",
      "caption": "A friendly helper — on your phone",
      "fit": "contain" },
    { "type": "stat",
      "big": "Reminders",
      "small": "Pinged on WhatsApp when it's time",
      "image": "https://example.com/whatsapp-mockup.svg" },
    { "type": "code",
      "language": "typescript",
      "snippet": "const x: number = 42;\nconsole.log(x);",
      "caption": "Fully typed" },
    { "type": "cta", "url": "paperloft.uk", "copy": "Free to try" }
  ]
}

Voices

Ryan · UK male
male-uk
free
Sonia · UK female
female-uk
free
Guy · US male
male-us
free
Jenny · US female
female-us
free
Daniel · UK male
premium-male-uk
premium · 3× credits
Matilda · UK female
premium-female-uk
premium · 3× credits
Josh · US male
premium-male-us
premium · 3× credits
Rachel · US female
premium-female-us
premium · 3× credits

Free = Microsoft Edge neural (msedge-tts, no key needed). Premium = ElevenLabs Turbo v2.5 with word-level timestamps for burn-in captions. Premium voices sound noticeably more human but cost 3×; captions add another 25%.

Credits

Starter
$2
1,700 credits
≈ 85 min free voice
Regular
$5
5,500 credits
10% bonus · best per-second value
Bulk
$20
25,000 credits
33% bonus · agency

New accounts start with 100 free credits. 1 credit ≈ 3 seconds of free-voice output, or ≈ 1 second of premium voice. Rendering is free — you only pay for narration seconds.

Self-host

MIT-licensed. Clone the repo, drop in a Postgres URL and (optionally) an ElevenLabs key, docker compose up. Full source for everything you see here.