Headless MCP: author and render PromoShot .promo video projects (stills, GIFs, video).
Copy the AI prompt to install this server into Claude Code, Cursor, or another agent β or use 1-click editor setup below.
π‘ Paste the JSON block into your client's configuration file under mcpServers, then restart the application.
See it work: demo.md β twenty-four prompts, each given to a fresh agent with only the skill and the MCP, its result beside the hand-built reference. The suite is in demos/.
The rendering engine behind PromoShot
(App Store),
and an open implementation of its project format. A .promo project is a
folder β metadata.json plus its media β and this workspace is everything
needed to validate, inspect, and render one to stills, image sequences, or
mp4 with mixed audio: no app attached, byte-for-byte the same compositor the
apps ship.
The design bet is that the format is the interface. An assistant, a
script, or a person writes metadata.json; the engine renders it the same
everywhere β the Mac and iOS apps (Metal + VideoToolbox), this repo's CLI,
or a headless Linux box with no GPU at all (wgpu on lavapipe, ffmpeg as a
subprocess). The format has three faces behind one truth: an authoring
subset with four validated recipes (promo schema), the full document
(--full), and a types-only JSON Schema generated from the parser's own
structs (--types) β and the parser the validator runs is the parser the
renderers use, so "validates" means "renders".
| Crate | What it owns |
|---|---|
promo-model | The format: wire structs, migrations, palette roles, schema.md |
promo-timeline | Timeline math: keyframes, trims, attachments, waits, validation |
promo-gpu | wgpu compositing: quads, borders, letterbox, vectors, color conversion |
promo-text | Caption shaping and effects (cosmic-text) |
promo-engine | Preview/export orchestration, frame cache, memory governor, PCM mixer |
promo-media | Decoder/encoder trait registry; ffmpeg-subprocess backend + conformance suite |
promo-editor | The document's edit vocabulary: commands with undo, the wizard's arrangement, theme rules β what promo_apply and promo_slideshow are built on |
promo-cli | promo β render a project from the command line |
promoshot-mcp | MCP server over stdio, for agents |
Rendering video needs ffmpeg (and ffprobe) on PATH β frames are composited
on the GPU and piped to it raw; ffmpeg only decodes and encodes. On a headless
Linux machine, mesa-vulkan-drivers (lavapipe) is enough of a GPU.
Add --json to any project command for machine output β one object on
stdout, errors included, exit codes unchanged.
promo video mixes the soundtrack the apps would: trims and media cuts,
held frames, speed with pitch preserved, keyframed volume, a focused
narration ducking everything under it, and only the audio tracks the
project keeps.
Headless renders are CLEAN β no watermark, and no license, serial or key will ever be asked for. (The Mac and iOS apps watermark free-tier renders; that is their App Store Pro line, and it stays on their side of the fence.)
promoshot-mcp speaks Model Context Protocol over stdio, so any MCP client
can author, inspect and render projects. It owns no rendering code β every
render shells to promo (found next to the executable, or on PATH, or via
--promo), so the CLI stays the single contract.
Two pieces: the MCP server (tools) and the skill (workflow). Neither is vendor-specific. Agents do not find this repo by themselves.
1. Build β or don't
No Rust toolchain? Grab the prebuilt pair from
Releases (linux-x64,
macos-arm64), or pull the image:
docker pull ghcr.io/garalex/promoshot-mcp β both carry promo and
promoshot-mcp together.
Put both on PATH, or pass --promo to the server. Rendering video also
wants ffmpeg/ffprobe on PATH.
2. MCP (required for tools)
Claude Code / Cursor / any mcp.json:
--workspace is where new projects go; --root fences which projects the
server will touch β pointing both at one folder is the tidy setup. Both
optional. --log <file> appends one line per tool call β when,
which tool, how many milliseconds, how it went β for a session's own
accounting; the demo pages are built from it.
Client one-liners:
3. Skill (the workflow)
Same file everywhere: skill/SKILL.md.
Any agent that reads instructions can be handed the file directly; it assumes only these tools (or the CLI).
4. Verify β ask the agent for a render:
Render examples/ProductCard.promo to a still at 3s.
One promo_validate, one promo_render_still, and a device-framed app
demo comes back as a path. From there, "make me a promo for " is
the loop the skill teaches.
Tools: promo_schema (authoring subset + four validated recipes;
promo_schema_full is the whole format; promo_schema_types is the format
as a generated, types-only JSON Schema β also checked in at
docs/promo.schema.json for $schema editor
autocomplete), promo_validate, promo_inspect (each layer listed with
its id β the handle the editing tools take),
promo_render_still, promo_render_frames, promo_render_video,
promo_render_gif, promo_workspace; the senses β promo_media_probe,
promo_media_filmstrip (a contact sheet of a SOURCE clip, times per cell),
promo_media_silences (silence spans and their inverse) and
promo_media_scenes (scene cuts and the shots between them), so an agent
knows what footage holds before composing with it; the editor trio,
promo_init, promo_upsert_layer and promo_upsert_keyframe: create a
project, add image/video/caption layers with placements, then animate β
a second placement keyframe is a push-in, viewport keyframes a Ken Burns;
your short ids are used verbatim, unnamed ones get canonical UUIDs, pixel
sizes are stamped, and the composition keeps covering its layers. Device
frames bake headless too β the same slab the apps draw. promo_slideshow
is the wizard: pictures and clips in, a complete classic, carousel or
store-listing show out, a caption on any slide becoming a layer that
lives with its picture. promo_voices
lists a provider's voices and promo_speak synthesizes narration with the
person's own provider key, reusing unchanged text by receipt. The authoring tools answer
with an inline thumbnail of the composition, so a misplaced layer is caught
at the moment it happens. The tools write ordinary metadata.json
through the format's own parser β the schema stays the source of truth, and
hand-editing remains first-class. Renders default their output into the
project's Exports/ folder and return the path written, never the bytes.
Flags, all optional: --workspace <dir> (where promo_workspace points;
else $PROMOSHOT_WORKSPACE, else the XDG data dir), --root <dir> (refuse
projects outside this tree), --promo <path>.
Narration spends the person's own provider account, and the key never passes through the agent: no tool takes one, none shows one. Register it once in the OS keyring β macOS Keychain, the Secret Service on Linux (GNOME Keyring, KWallet), the Credential Manager on Windows:
Providers: openai, elevenlabs, google. The key is read from stdin so
it lands in no shell history, no config file and no argument list.
No reviews yet β be the first to share how this listing worked for you.
Showcase your server listing on GitHub or your project documentation. Embed this dynamic SVG badge to highlight official listing status and live engagement.
[](https://allmcps.com/mcp/promoshot)<a href="https://allmcps.com/mcp/promoshot"><img src="https://allmcps.com/api/badge/promoshot?style=directory" alt="Promoshot on AllMCPs" /></a>