MOTIONSTASH

Using Motionstash from a coding agent

The premise of this registry is that a language model should not be writing easing curves. Generated animation code is the part of a video pipeline most likely to be subtly wrong and least likely to be caught by a test — an off-by-four-frames entrance reads as cheap, and it typechecks. So the model’s job here is narrower: pick a component, fill a typed parameter set, order the shots. All 533 props across 76 components are declared in Zod schemas, which means every value an agent supplies either validates or fails loudly.

The MCP server

A stdio Model Context Protocol server ships with the repository. It needs no key and talks to nothing over the network — the catalog is a local JSON file and the renderer is local Remotion.

mcp.json
{
  "mcpServers": {
    "motionstash": {
      "command": "node",
      "args": ["scripts/mcp-server.mjs"]
    }
  }
}

Five tools

list_motion_items
Search and filter the catalog by category, aspect ratio, tag or free text. Returns ids, summaries and frame budgets — not source.
get_motion_item
Read one component in full: every prop with its type, default, allowed values and description, plus its declared budget and its source file.
render_motion_item
Render one component to MP4 with a given props object. Validation happens against the component's own schema, so a bad value fails before the renderer starts.
render_shot_list
Render an ordered sequence of components as one video. Consecutive scenes are overlapped by the timing grammar rather than butt-joined.
get_timing_grammar
Read the budgets, springs and easing curves so a generated shot list uses the same vocabulary the components were authored against.

The CLI, for humans

Nothing here is distributed as a package to depend on. One command copies the component you want plus the four spine files it imports, and the copy is then yours to edit — the same model shadcn/ui popularised, for video.

npx motionstash add kinetic-headline

The timing grammar

Components in this registry compose in time, not in space, and the grammar is what makes that safe. Everything runs at a canonical 30fps and declares its duration as three numbers — enter, hold, exit — taken from four budgets. Because every component multiplies its own presence by the same stage function, two clips placed back to back cross-dissolve instead of cutting.

Frame budgets at 30fps
BudgetEnterHoldExitTotal
beat12f36f12f2.0s
statement15f60f15f3.0s
scene18f114f18f5.0s
feature20f200f20f8.0s
Spring presets
SpringDampingStiffnessMass
settle181800.9
snap223000.7
glide26901.4
pop112400.8

Four easing curves exist and no more — enter, exit, travel, accent — because a library where every component picks its own bezier is a library that never looks like one system.

What the authoring contract forbids

Every component is checked against these in CI, not by review. They are also the rules to follow if you are generating a new component rather than using one.

Read the catalog without an agent

The whole registry is three static files. None of them require a login, a token or a rate-limit budget.