MCP Server

Keyframer

dev.keyframer/keyframer
Design & Creative Developer Tools Public & reachable MCP 2025-11-25

What this MCP does

Authors, validates, previews, and updates animated scenes, and generates React Native Reanimated code from them.

create_scene
Create a scene in Keyframer
Save a scene and get an editor URL where it opens in the visual editor (timeline, canvas, node graphs, mobile QR preview). Validates first. Works without a key: the scene is then a public 24-hour guest scene with a scannable QR, kept forever by signing up (free) and pressing Remix. With a key it saves to the account (free accounts up to the free scene limit, paid unlimited).
Input schema
{'type': 'object', '$schema': 'http://json-schema.org/draft-07/schema#', 'required': ['scene'], 'properties': {'name': {'type': 'string', 'maxLength': 120, 'description': 'Scene name shown in the editor (default "MCP scene")'}, 'scene': {'anyOf': [{'type': 'string'}, {'type': 'object', 'propertyNames': {'type': 'string'}, 'additionalProperties': {}}], 'description': 'The scene as a JSON object (preferred) or a JSON string. Call get_scene_format for the shape.'}, 'make_public': {'type': 'boolean', 'description': 'Make the scene publicly viewable — its share link (keyframer.dev/share/<id>) and QR then work for anyone, not just this account'}}}
generate_code
Generate React Native code
Compile a scene into a runnable React Native component. Pass inline scene JSON or a scene_id from your account. Output targets Reanimated v4 by default ("animated" targets the RN core Animated API, reduced feature set). Deterministic — no AI, no credits. Requires an API key on a paid plan.
Read only
Input schema
{'type': 'object', '$schema': 'http://json-schema.org/draft-07/schema#', 'properties': {'api': {'enum': ['reanimated', 'animated'], 'type': 'string', 'description': 'Default "reanimated"'}, 'scene': {'anyOf': [{'type': 'string'}, {'type': 'object', 'propertyNames': {'type': 'string'}, 'additionalProperties': {}}], 'description': 'The scene as a JSON object (preferred) or a JSON string. Call get_scene_format for the shape.'}, 'scene_id': {'type': 'string', 'description': 'Generate from a saved scene instead of inline JSON'}, 'relative_positioning': {'type': 'boolean', 'description': 'Emit flex-relative layout instead of absolute coordinates'}, 'gesture_handler_version': {'enum': ['v2', 'v3'], 'type': 'string', 'description': 'react-native-gesture-handler major (default v2)'}}}
get_preview_qr
Preview on device (QR)
A terminal-scannable QR code for a scene. Scan it with a phone camera and the scene runs live in the Keyframer preview app on real hardware — edits sync as they happen. Public scenes (including guest scenes) work without a key; private scenes need an API key on a paid plan.
Read only
Input schema
{'type': 'object', '$schema': 'http://json-schema.org/draft-07/schema#', 'required': ['scene_id'], 'properties': {'scene_id': {'type': 'string', 'description': 'Scene id from create_scene or list_scenes'}}}
get_recipe
Get a recipe (scene + code)
Fetch one recipe by slug: metadata, the scene JSON (usable as a starting point for create_scene), and the generated React Native Reanimated component code. Recipe code is free to use.
Read only
Input schema
{'type': 'object', '$schema': 'http://json-schema.org/draft-07/schema#', 'properties': {'id': {'type': 'string', 'description': 'Alias for slug — a scene id from a recipe works too'}, 'slug': {'type': 'string', 'description': 'Recipe slug from search_recipes'}, 'scene_id': {'type': 'string', 'description': 'When a recipe has several scenes, pick one (defaults to the first)'}, 'include_code': {'type': 'boolean', 'description': 'Include generated code (default true)'}}}
get_scene
Get a scene
Fetch one of your scenes (or any public scene) as JSON — edit it and re-save with update_scene, or feed it to generate_code. Requires an API key.
Read only
Input schema
{'type': 'object', '$schema': 'http://json-schema.org/draft-07/schema#', 'required': ['id'], 'properties': {'id': {'type': 'string', 'description': 'Scene id from list_scenes or an editor URL'}}}
get_scene_format
Scene format authoring guide
The Keyframer scene JSON format — read this before authoring a scene. Section "scene" covers elements/keyframes/easing; section "nodes" covers node graphs (procedural animation: clocks, springs, repeaters) with the full node-type schema.
Read only
Input schema
{'type': 'object', '$schema': 'http://json-schema.org/draft-07/schema#', 'properties': {'section': {'enum': ['scene', 'nodes'], 'type': 'string', 'description': 'Default "scene"'}}}
list_scenes
List your scenes
List the scenes in the connected Keyframer account (id, name, updated, visibility). Requires an API key.
Read only
Input schema
{'type': 'object', '$schema': 'http://json-schema.org/draft-07/schema#', 'properties': {}}
sample_scene
Sample animation values over time
Numerically preview a scene: evaluates keyframes AND node graphs at N evenly spaced times and returns each moving prop as a value series (the same math the editor preview runs). validate_scene checks structure — this checks MOTION: confirm ranges, spring overshoot, stagger offsets, and that elements actually move before create_scene. Free to call — iterate: author → sample → adjust.
Read only
Input schema
{'type': 'object', '$schema': 'http://json-schema.org/draft-07/schema#', 'required': ['scene'], 'properties': {'scene': {'anyOf': [{'type': 'string'}, {'type': 'object', 'propertyNames': {'type': 'string'}, 'additionalProperties': {}}], 'description': 'The scene as a JSON object (preferred) or a JSON string. Call get_scene_format for the shape.'}, 'samples': {'type': 'integer', 'maximum': 25, 'minimum': 3, 'description': 'Sample count across the duration (default 9)'}, 'element_ids': {'type': 'array', 'items': {'type': 'string'}, 'description': 'Only report these element ids'}}}
search_recipes
Search animation recipes
Search 150+ free Keyframer recipes (bounce, carousels, progress rings, particles, text effects, shaders, scroll animations…). Each recipe has a scene + verified React Native Reanimated code. Returns slugs for get_recipe.
Read only
Input schema
{'type': 'object', '$schema': 'http://json-schema.org/draft-07/schema#', 'required': ['query'], 'properties': {'limit': {'type': 'integer', 'maximum': 25, 'minimum': 1}, 'query': {'type': 'string', 'description': 'What to build, e.g. "snap carousel with parallax" or "countdown ring"'}, 'category': {'enum': ['guides', 'keyframes', 'node-graphs', 'shaders', 'timing', 'gestures', 'scroll-lists'], 'type': 'string'}}}
update_scene
Update a scene
Replace the content of one of your scenes (full scene JSON, validated first) — the edit loop for iterating instead of duplicating. Live previews watching the scene update in place. Requires an API key; own scenes only.
Destructive
Input schema
{'type': 'object', '$schema': 'http://json-schema.org/draft-07/schema#', 'required': ['scene_id', 'scene'], 'properties': {'name': {'type': 'string', 'maxLength': 120, 'description': 'New name (unchanged if omitted)'}, 'scene': {'anyOf': [{'type': 'string'}, {'type': 'object', 'propertyNames': {'type': 'string'}, 'additionalProperties': {}}], 'description': 'The scene as a JSON object (preferred) or a JSON string. Call get_scene_format for the shape.'}, 'scene_id': {'type': 'string', 'description': 'Scene id from create_scene or list_scenes'}, 'make_public': {'type': 'boolean', 'description': 'Change public visibility (unchanged if omitted)'}}}
validate_scene
Validate scene JSON
Validate a scene against the Keyframer format before create_scene or generate_code. Returns errors (must fix) and warnings (advisory). Free to call — iterate until clean.
Read only
Input schema
{'type': 'object', '$schema': 'http://json-schema.org/draft-07/schema#', 'required': ['scene'], 'properties': {'scene': {'anyOf': [{'type': 'string'}, {'type': 'object', 'propertyNames': {'type': 'string'}, 'additionalProperties': {}}], 'description': 'The scene as a JSON object (preferred) or a JSON string. Call get_scene_format for the shape.'}}}
Added
generate_code
Sept. 17, 2026, 12:39 p.m.
Added
get_preview_qr
Sept. 17, 2026, 12:39 p.m.
Added
get_scene
Sept. 17, 2026, 12:39 p.m.
Added
list_scenes
Sept. 17, 2026, 12:39 p.m.
Added
update_scene
Sept. 17, 2026, 12:39 p.m.
Added
create_scene
Sept. 17, 2026, 12:39 p.m.
Added
sample_scene
Sept. 17, 2026, 12:39 p.m.
Added
validate_scene
Sept. 17, 2026, 12:39 p.m.
Added
get_scene_format
Sept. 17, 2026, 12:39 p.m.
Added
get_recipe
Sept. 17, 2026, 12:39 p.m.
Added
search_recipes
Sept. 17, 2026, 12:39 p.m.