Set the motion plan of a frame
figma_set_motion_planRecord 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…
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. A role-motion brief (figma_set_brief { role: "motion" }; briefId, or the one in force) fills the fields left out. Checked before anything is stored: 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); accents on the bpm grid; every transition named. Stored on the frame; a new call replaces it. figma_check_motion judges the frame against it: bpm, holds, brandId, ctaId and accept (findings the brief intends, with reasons). Under BRIDGE_PROCESS=strict the keyframe tools refuse a frame without a plan. The result gives each beat's frames and check, the figma_check_motion call. One undo step. 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; fields left out come from a role-motion brief. | |
| ctaId | No | The call-to-action layer in the frame, for cta_short. | |
| force | No | Overwrite on purpose. A write to a node someone changed after you last read it is refused (STALE); read it again and resend instead. Pass true only when the person said to overwrite their edit. | |
| 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. | |
| briefId | No | The role-motion brief to take left-out fields from (figma_set_brief returns its id). Default: the motion brief in force. | |
| 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. |