Set the motion plan of a frame
figma_set_motion_planRecord an animated frame's motion brief and beat sheet before animating; validate beat timing, copy read time, and transitions, then store the plan in shared plugin data.
Instructions
Record the plan of one animated top-level frame before animating it, as a motion designer does: the brief (audience, message, format, durationS, fps, bpm?) and the beat sheet, beats back to back from 0 to durationS, each with its copy on screen, action and transition. Checked before anything is stored, every problem listed at once: times on the frame grid; no gap or overlap; each beat long enough to read its copy, max(5/6 s, 0.3 s a word), [picture notes] untimed; accents within a frame of the beat grid with bpm; every transition named. Stored on the frame in shared plugin data, so every session sees it; figma_get_motion_context returns it; a new call replaces it. figma_check_motion judges the frame against it: its bpm, holds, brandId, ctaId, and accept, the findings the brief intends (a still open: cold_open), each with its reason. Under BRIDGE_PROCESS=strict (the default) figma_set_keyframes and figma_remove_keyframes refuse a frame without a plan. Editors: Design only.
Input Schema
| Name | Required | Description | Default |
|---|---|---|---|
| cuts | No | Planned hard cuts, in seconds. | |
| beats | Yes | The beat sheet, in order, back to back from 0 to brief.durationS. | |
| brief | Yes | The motion brief. | |
| ctaId | No | The call-to-action layer in the frame, for cta_short. | |
| holds | No | Intended stillness, in seconds: what figma_check_motion's `holds` exempts. | |
| accept | No | Findings the brief intends (a still open, a hard-cut grammar, a loop): figma_check_motion lists them in `accepted`, not against ok. | |
| nodeId | Yes | The animated top-level frame, or any layer in it (id or Figma link). | |
| brandId | No | The brand layer in the frame, for figma_check_motion's brand_late. | |
| session | No | Optional sessionId or file name, to pick a Figma file when more than one is connected. | |
| idempotencyKey | No | Caller-owned retry key, ≤128 chars. Re-calling with the same key never executes twice: it returns the existing result, or waits for the op still in flight. Supply your own for anything large — if the MCP client times out (rather than the bridge), only a key you chose can be used to retry safely. |