creatomate-mcp-server
Provides text-to-speech synthesis for voiceovers in videos via ElevenLabs TTS.
Provides text-to-speech synthesis for voiceovers in videos via Google TTS.
Creates videos optimized for Instagram Reels with 9:16 aspect ratio, kinetic typography, and auto-captions.
Creates videos optimized for TikTok with 9:16 aspect ratio, kinetic typography, and auto-captions.
Creates videos optimized for YouTube Shorts with 9:16 aspect ratio, kinetic typography, and auto-captions.
This server does not currently have a deployable release on Glama. Follow the repository's setup instructions to install and configure it for your MCP client, including any required credentials and local dependencies.
Creatomate MCP Server
A production-grade Model Context Protocol server for Creatomate. It lets AI agents produce professional videos and images and keep track of everything they publish.
It runs on the 2026-07-28 MCP spec (stateless Streamable HTTP, multi-round-trip elicitation) with backwards-compatible serving for 2025-era clients, and ships with Docker. It also includes an agent skill and Claude Code plugin, and an agent-driven eval suite.
Why not just Creatomate's hosted MCP? The official server exposes 8 thin CRUD tools. This one is built around what teams do every day:
a design composer with professional, safe-zone-aware recipes
a linter for the silent failures Creatomate's validator accepts
visual previews the agent can see
an asset ledger with full-text search: Creatomate has no API to list past renders, and its files expire after 30 days
brand kits
cost guardrails with user confirmation
variants and batches
prompts, resources and completions
The eval suite measures both servers head to head.
Contents
Related MCP server: video-overlay-kit
Quick start
Requirements: Docker. Node 22.13+ is needed only for local development.
cp .env.example .env
# edit .env:
# CREATOMATE_API_KEY=<your project API key> (Creatomate → Project Settings → API)
# MCP_AUTH_TOKENS=me:<long random token> (node -e "console.log(require('crypto').randomBytes(24).toString('base64url'))")
docker compose up -d --build
curl http://127.0.0.1:8787/healthz # {"status":"ok",...}The MCP endpoint is
http://127.0.0.1:8787/mcp.The port is published on localhost only.
The ledger lives in the named volume
ledger-data.
Connect a client
Claude Code: plugin (MCP connection + skill in one step)
claude plugin marketplace add WAR10CK222/creatomate-mcp-server # or a local path to this repo
claude plugin install creatomate@creatomate-mcp # prompts for URL and token (stored in the keychain)Claude Code: MCP only
claude mcp add --transport http creatomate http://127.0.0.1:8787/mcp --header "Authorization: Bearer <token>"Claude Desktop, via mcp-remote in claude_desktop_config.json:
{ "mcpServers": { "creatomate": { "command": "npx", "args": ["-y", "mcp-remote", "http://127.0.0.1:8787/mcp", "--header", "Authorization:Bearer ${CREATOMATE_MCP_TOKEN}"], "env": { "CREATOMATE_MCP_TOKEN": "<token>" } } } }VS Code: .vscode/mcp.json is preconfigured and prompts for the token.
Claude Agent SDK
import { query } from '@anthropic-ai/claude-agent-sdk';
for await (const m of query({
prompt: 'Make a 15s Instagram Reel announcing our cold brew launch',
options: {
mcpServers: { creatomate: { type: 'http', url: 'http://127.0.0.1:8787/mcp', headers: { Authorization: `Bearer ${process.env.CREATOMATE_MCP_TOKEN}` } } },
allowedTools: ['mcp__creatomate__*'],
},
})) { /* … */ }Then try the capabilities_tour prompt (≈2 credits), or ask for any video.
What agents get
Tools (14)
Tool | Purpose | Notes |
| One-call context: brand kits, campaigns, ledger health, spend by campaign/day/template/platform/status/actor, budget, rate-limit headroom, key health | read-only |
| RenderScript knowledge base (15 guides): elements, timing, animations, captions, audio/TTS, templates, layout, cost, pitfalls | read-only |
| Brief → complete professional RenderScript for routine content. 6 recipes ( | read-only, free |
| Creatomate dry run + a 46-rule linter (untracked layers, elements after the end, non-built-in fonts, JPG-by-default, 60 fps trap, broken caption links, unreachable URLs, safe zones, contrast, reading speed …) + cost estimate | read-only, free |
| Renders key frames as small JPGs and returns them as images the agent can see | ≈1 credit/frame |
| Renders and records the asset. Supports | spends credits |
| Full-text and faceted search of the ledger (on-screen text, color words, campaign, tags, status, approval, aspect, dates, expiry) | read-only |
| Status, URLs, source and history; imports external render ids; waits for pending renders with progress | read-only |
| Title, campaign, tags, approval, notes; bulk edits by filter with | idempotent |
| Templates, their modifiable fields, and integration snippets (Node SDK, fetch v2, curl) | read-only |
| Create, update or delete templates (updates and deletes need confirmation) | destructive |
| Persist colors, fonts, logo and tone | idempotent |
Every tool has:
a title, annotations and a description written for agents
zod-validated input
compact JSON results (also returned as
structuredContent)resource_links for assetsactionable errors in the form
{kind, hint, fix}
Resources (with completion)
Resource | Contents |
| How to use this server |
| The 15 guides |
| Reference catalogs |
| 8 validated golden RenderScripts |
| Templates |
| Ledger records |
| Campaign summaries |
| Saved brand kits |
| Stored sources |
Prompts (ready-made workflows, with argument completion)
Prompt | Use |
| Short-form social video |
| Captioned clip |
| Single image design |
| Resize an asset for other platforms |
| Build a template (developers) |
| One render per data row |
| Campaign summary |
| Guided tour of the server |
User interaction & utilities
Confirmations. Renders above
CONFIRM_ABOVE_CREDITS, batches aboveCONFIRM_BATCH_ABOVE, template updates and deletes, and bulk ledger edits ask the user.Through elicitation: a form dialog via 2026 multi-round-trip
input_required, or the legacy shim for older clients.Through a signed
confirm_tokenwhen the client can't show dialogs.Tokens are HMAC-bound to the exact arguments, and an explicit decline is final.
Progress notifications while waiting for renders.
Cancellation stops waiting; the render itself continues.
Idempotency: identical render calls within 2 minutes are de-duplicated.
Cost guardrails: an estimate on every validate and compose,
max_creditsper call,HARD_MAX_CREDITS_PER_RENDER,DAILY_CREDIT_BUDGET.Rate limiting: an adaptive client-side limiter tracks Creatomate's
X-RateLimit-*headers (30 requests per 10 s per account) and retries withRetry-After.Webhooks (when
PUBLIC_BASE_URLis set):/webhooks/creatomate/<token>updates the ledger. Set it as the project's default webhook to capture renders made elsewhere (dashboard, Zapier, n8n).
The asset ledger
Creatomate cannot list past renders, and it deletes files after 30 days. The server records every render in SQLite with an FTS5 index. Each record holds:
Descriptive: title, campaign, tags, brief, notes, brand kit.
Content: on-screen text, color words ("teal", "navy"), fonts.
Output: format, size, aspect, duration.
Cost: estimated and actual credits.
Status: render status, approval, expiry.
Lineage: parent asset, batch.
The exact source, so expired assets can be re-rendered.
The CLI (docker compose exec creatomate-mcp node dist/cli.js <cmd>) offers stats, export, alias (move history after a key rotation), webhook-url and tenant-id.
Authentication & security
Mode | Client sends | Use |
|
| Single team / local Docker. The token name is recorded as the actor on each asset. |
|
| Multi-tenant. Keys are verified with a free dry run, cached by HMAC, and never stored or logged. Each project gets an isolated ledger. |
Hardening:
Host and Origin validation (DNS-rebinding protection).
The port is bound to
127.0.0.1.The container runs non-root, read-only, with
no-new-privilegesand all capabilities dropped.Credentials are redacted in pino logs.
SSRF-guarded URL checks: public http(s) only, private and loopback IPs blocked after DNS, no redirects.
Ledger text is labelled as data, guarding against prompt injection; this is covered by an eval.
claude.ai web connectors need public HTTPS and OAuth, which is out of scope. Use Claude Code, Desktop, VS Code or the SDKs.
Configuration
See .env.example. Key variables:
Variable | Default | Purpose |
|
|
|
| – | Project key (static mode) |
| – |
|
| auto (persisted in | HMAC for tenant ids, confirmation tokens, webhooks |
|
|
|
| – | Extra hostnames, e.g. behind a reverse proxy |
| – | Enables webhooks |
|
| Confirmation threshold |
|
| Batch-size confirmation threshold |
|
| Hard cap per render |
|
| Daily budget across renders |
|
| How long tools wait for renders |
|
| Check media URLs before rendering |
| – |
|
Agent skill & Claude Code plugin
The plugin/ folder is a Claude Code plugin, published through the repo-root .claude-plugin/marketplace.json. It contains:
Path | What |
| Connects the server; the URL and token come from plugin |
| A router skill modeled on the Remotion and HyperFrames skills: preflight → start from state → route by deliverable → production checklist → non-negotiables → tool table |
| 13 references: setup, scene planning, creative direction (routine vs hero pieces), RenderScript, motion, captions/voiceover, typography/layout, brand kits, templates, variants/batches, asset library, cost/safety, pitfalls |
| Synced golden sources ( |
| ffprobe checks + frame extraction |
| Trigger and behaviour evals for the skill |
Skill only, for other agents: npx skills add WAR10CK222/creatomate-mcp-server --skill creatomate-mcp.
Evals
The evals are agent-driven: real Claude Code, headless, using only the MCP tools, against an isolated eval server (docker compose --profile eval). There are 26 everyday scenarios:
content quality (Reels, captions, quote cards, thumbnails, real-estate video, multi-format, countdowns, revisions)
template work
asset tracking (find, failures, spend, fuzzy recall, bulk approve, expiry, import)
safety (cost confirmation, declines, 429 recovery, broken URLs, prompt injection)
knowledge
Checks are programmatic: ledger, Creatomate API, ffprobe. T1 adds an Opus vision judge and a blind pairwise comparison against Creatomate's official MCP.
Latest held-out comparison (15 briefs never used for tuning, checks frozen, Official able to read its guide):
Both servers delivered every brief.
This server won the blind head-to-head 8–4 with 3 ties, and averaged 3.23 vs 2.96 in judge quality. That is a consistent lead, but a modest one.
Official remains stronger on high-energy sale designs.
This server used about 2.5× fewer tool calls and 3.5× less agent spend, but about 2× the Creatomate credits, because of its preview frames.
Details and the fairness audit are in docs/eval-results.md.
See evals/README.md and the latest results in docs/eval-results.md.
npm run eval -- --tier T0 --arm full # free (simulated renders)
npm run eval -- --tier T1 --arm full,full-skill,official # real renders + judgeDevelopment
npm install
npm run dev # tsx watch (reads .env)
npm run typecheck
npm test # 96 unit + integration tests (in-process MCP client, fake Creatomate API)
npm run build # dist/
npm run smoke # end-to-end against a running server (MCP_URL, MCP_TOKEN; --render spends ~4 credits)
npm run test:live # dry-run every golden example and compose recipe against the real API (free)
npm run gen:examples && npm run skill:syncsrc/
index.ts, cli.ts, config.ts
http/ app (Express via @modelcontextprotocol/express), auth, webhooks
mcp/ server factory, instructions, confirm (elicitation/token), pipeline, refresh, resources, prompts, tools/*
creatomate/ typed v2 fetch client, errors, adaptive rate limiter, simulator
renderscript/ lint (+ SSRF-safe url checks), compose recipes, timeline, cost, extract, colors, modifications
ledger/ node:sqlite + FTS5 schema, repository
knowledge/ kb/*.md, catalogs/*.json (platforms, animations, 1,187 fonts, caption styles, providers, stock), examples/*.json
plugin/ Claude Code plugin + creatomate-mcp skill
evals/ harness, scenarios, fixtures, reports
test/ unit + integration
docs/ spike findings, eval resultsDependencies:
Group | Packages |
MCP |
|
Runtime |
|
Dev | TypeScript 7, Vitest 5 |
The deprecated creatomate SDK is replaced by a typed v2 client that uses the same Bearer authentication.
Architecture
Client ──POST /mcp (Bearer)──► Express (Host/Origin checks) ─► auth (static | passthrough) ─► tenant
└► createMcpHandler: fresh McpServer per request (stateless; 2026-07-28 + legacy 2025 clients)
├ tools / resources / prompts / completions
├ pipeline: resolve source → Creatomate dry run → lint → cost → confirm → render
├ Creatomate v2 client (rate limiter, retries, timeouts)
└ ledger (SQLite WAL + FTS5) ◄── webhooks (optional)Design notes from the spikes: docs/spikes.md.
License
MIT
This server cannot be deployed
Maintenance
Related MCP Connectors
MCP server for Luma Dream Machine AI video generation
Make, render and auto-post AI faceless videos to YouTube, TikTok and Instagram from any MCP client.
MCP server for Google Veo AI video generation
MCP server for OpenAI Sora AI video generation
Related MCP Servers
- FlicenseAqualityDmaintenanceAn MCP server that transforms LLM-enabled IDEs into professional video editors by pre-processing footage into text proxies, generating motion graphics via HTML/CSS, and orchestrating complex FFmpeg renders.4-
- AlicenseAqualityDmaintenanceAn MCP server that generates MP4 b-roll videos from scene specs, enabling AI agents to create branded overlays for short-form video without After Effects.525 npm2MIT
- FlicenseNot gradedqualityDmaintenanceAn MCP server that automates short-form video production for TikTok, Instagram Reels, and YouTube Shorts, using AI agents and behavioral science to generate production-ready videos from a topic and vibe.1-
- AlicenseAqualityDmaintenanceMCP server for faceless YouTube video automation, turning LLM-authored scripts into narrated, captioned videos with AI-generated images and motion.9MIT