Keyframer

150+ React Native animation recipes, scene authoring, phone preview via QR, Reanimated v4 codegen

Should I use this

Quality & Safety

A
Description quality
100%
Schema completeness
86%
Naming quality
98%
Poisoning risk
100%
Permission match
100%
Protocol compliance
100%

Based on automated analysis of tool definitions and protocol compliance.

Context Cost

~1,848Tokens (tool definitions)
~1.2 KBTypical response size
Moderate attention impact (1.44% of 128k context)

This is the approximate number of tokens consumed each time the server's tools are loaded into a model's context. Higher counts reduce the attention available for other tasks.

Install

One-Click Install

Add this to your `claude_desktop_config.json` file:

{
  "mcpServers": {
    "keyframer": {
      "url": "https://api.keyframer.dev/mcp"
    }
  }
}

Remote endpoints

https://api.keyframer.dev/mcpstreamable-http

What it can do

Tool inventory

Tools (11)

🟒 Read-only🟑 WriteπŸ”΄ Deleteβšͺ Unknown
🟒search_recipes(query, category, limit)

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.

Input Schema

{
  "type": "object",
  "properties": {
    "query": {
      "type": "string",
      "description": "What to build, e.g. \"snap carousel with parallax\" or \"countdown ring\""
    },
    "category": {
      "type": "string",
      "enum": [
        "guides",
        "keyframes",
        "node-graphs",
        "shaders",
        "timing",
        "gestures",
        "scroll-lists"
      ]
    },
    "limit": {
      "type": "integer",
      "minimum": 1,
      "maximum": 25
    }
  },
  "required": [
    "query"
  ],
  "$schema": "http://json-schema.org/draft-07/schema#"
}
🟒get_recipe(slug, id, scene_id, include_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.

Input Schema

{
  "type": "object",
  "properties": {
    "slug": {
      "description": "Recipe slug from search_recipes",
      "type": "string"
    },
    "id": {
      "description": "Alias for slug β€” a scene id from a recipe works too",
      "type": "string"
    },
    "scene_id": {
      "description": "When a recipe has several scenes, pick one (defaults to the first)",
      "type": "string"
    },
    "include_code": {
      "description": "Include generated code (default true)",
      "type": "boolean"
    }
  },
  "$schema": "http://json-schema.org/draft-07/schema#"
}
🟒get_scene_format(section)

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.

Input Schema

{
  "type": "object",
  "properties": {
    "section": {
      "description": "Default \"scene\"",
      "type": "string",
      "enum": [
        "scene",
        "nodes"
      ]
    }
  },
  "$schema": "http://json-schema.org/draft-07/schema#"
}
🟒validate_scene(scene)

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.

Input Schema

{
  "type": "object",
  "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."
    }
  },
  "required": [
    "scene"
  ],
  "$schema": "http://json-schema.org/draft-07/schema#"
}
🟒sample_scene(scene, samples, element_ids)

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.

Input Schema

{
  "type": "object",
  "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": {
      "description": "Sample count across the duration (default 9)",
      "type": "integer",
      "minimum": 3,
      "maximum": 25
    },
    "element_ids": {
      "description": "Only report these element ids",
      "type": "array",
      "items": {
        "type": "string"
      }
    }
  },
  "required": [
    "scene"
  ],
  "$schema": "http://json-schema.org/draft-07/schema#"
}
🟑create_scene(scene, name, make_public)

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",
  "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."
    },
    "name": {
      "description": "Scene name shown in the editor (default \"MCP scene\")",
      "type": "string",
      "maxLength": 120
    },
    "make_public": {
      "description": "Make the scene publicly viewable β€” its share link (keyframer.dev/share/<id>) and QR then work for anyone, not just this account",
      "type": "boolean"
    }
  },
  "required": [
    "scene"
  ],
  "$schema": "http://json-schema.org/draft-07/schema#"
}
πŸ”΄update_scene(scene_id, scene, name, make_public)

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.

Input Schema

{
  "type": "object",
  "properties": {
    "scene_id": {
      "type": "string",
      "description": "Scene id from create_scene or list_scenes"
    },
    "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."
    },
    "name": {
      "description": "New name (unchanged if omitted)",
      "type": "string",
      "maxLength": 120
    },
    "make_public": {
      "description": "Change public visibility (unchanged if omitted)",
      "type": "boolean"
    }
  },
  "required": [
    "scene_id",
    "scene"
  ],
  "$schema": "http://json-schema.org/draft-07/schema#"
}
🟒list_scenes

List the scenes in the connected Keyframer account (id, name, updated, visibility). Requires an API key.

Input Schema

{
  "type": "object",
  "properties": {},
  "$schema": "http://json-schema.org/draft-07/schema#"
}
🟒get_scene(id)

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.

Input Schema

{
  "type": "object",
  "properties": {
    "id": {
      "type": "string",
      "description": "Scene id from list_scenes or an editor URL"
    }
  },
  "required": [
    "id"
  ],
  "$schema": "http://json-schema.org/draft-07/schema#"
}
🟒get_preview_qr(scene_id)

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.

Input Schema

{
  "type": "object",
  "properties": {
    "scene_id": {
      "type": "string",
      "description": "Scene id from create_scene or list_scenes"
    }
  },
  "required": [
    "scene_id"
  ],
  "$schema": "http://json-schema.org/draft-07/schema#"
}
🟒generate_code(scene, scene_id, api, relative_positioning, gesture_handler_version)

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.

Input Schema

{
  "type": "object",
  "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."
    },
    "scene_id": {
      "description": "Generate from a saved scene instead of inline JSON",
      "type": "string"
    },
    "api": {
      "description": "Default \"reanimated\"",
      "type": "string",
      "enum": [
        "reanimated",
        "animated"
      ]
    },
    "relative_positioning": {
      "description": "Emit flex-relative layout instead of absolute coordinates",
      "type": "boolean"
    },
    "gesture_handler_version": {
      "description": "react-native-gesture-handler major (default v2)",
      "type": "string",
      "enum": [
        "v2",
        "v3"
      ]
    }
  },
  "$schema": "http://json-schema.org/draft-07/schema#"
}

Community

Rate this Server

Evidence

Recent observations

verifiedversion not recorded11 tools
verifiedversion not recorded11 tools