Skip to main content
Glama

Reels Studio

Make a vertical 3D reel from a short script. An AI assistant can direct the editor over MCP (Model Context Protocol), or you can edit the example scene as JSON and render it from the terminal. Blender draws the frames and FFmpeg writes the MP4 on your computer.

Render your first reel

You'll need Node.js 20 or newer, Blender 5.2.x, and FFmpeg with H.264 encoding on macOS or Linux. Install Blender in the usual macOS Applications folder or put the blender executable on your PATH. If it lives elsewhere, set REELS_BLENDER to its full path.

Clone the repository and render the example

git clone https://github.com/Endroe/reels-studio.git
cd reels-studio
npm ci
npm run demo

The demo renders a silent, two-shot reel called What if gravity took a coffee break? The last line gives the MP4 path. Watch the sample export.

Open the scene file. Change the second shot's title or the ball's final position, save, and run the demo again. Each run creates a separate draft under .workspace/demo/. The demo uses built-in shapes and requires no accounts or API keys.

Related MCP server: lc-editor

Make your own

Use the creator workflow for the brief, script review, shot plan, narration timing, and final viewing pass. It includes prompts you can paste into your assistant.

To let an MCP-capable assistant operate the editor, create an import folder with mkdir -p imports. Add the entry below to your client's stdio MCP configuration. Replace every /absolute/path/to/reels-studio with the location of this checkout. Launch Node directly. If the client cannot find Node, use the full path printed by which node.

{
  "mcpServers": {
    "reels": {
      "command": "node",
      "args": ["/absolute/path/to/reels-studio/server.mjs"],
      "env": {
        "REELS_DATA_DIR": "/absolute/path/to/reels-studio/.workspace/studio",
        "REELS_IMPORT_ROOT": "/absolute/path/to/reels-studio/imports",
        "REELS_FONT": "/absolute/path/to/reels-studio/assets/Montserrat-Black.ttf"
      }
    }
  }
}

Reconnect the client and try this prompt

Use the reels tools. Create a demo project, show me the opening frame with safe-zone guides, then change the hero's shirt to orange and show me the same frame. Wait for my feedback before rendering the full reel.

Each editor process needs its own data directory. The editor stores scenes, imported assets, and exports there. Your latest successful export is at exports/<project-id>/video.mp4 inside that directory. Copy a version you want to keep before rendering another revision. Publishing is a separate creator step.

Development

npm test runs the core suite, including a real stdio client handshake. Tests require Python 3. For render integration tests, install the optional Chromium backend and run

npm run browser:install
REELS_BLENDER_TEST=1 REELS_RENDER_TEST=1 npm test

Blender is the default. The optional Three.js backend can be selected for MCP with REELS_RENDERER=three.

Included notices

Reels Studio code and the original example are licensed under GPL-3.0-or-later. Copyright 2026 Endroe. The Blender worker notice is retained. The bundled Montserrat font is distributed under its SIL Open Font License. Dependencies retain their respective licenses.

Available Tools

21 tools
reels_catalogB
Read-only

Read supported scene features, limits, and the workflow. Small response; request the schema resource only when needed.

Inputs: no named parameters.

reels_createB

Create a project from structured shots or the demo. Returns only ID, revision and counts.

Inputs: project, projectId.

reels_download_assetB

Download a selected Poly Haven model and its PBR textures, verify checksums, embed as one GLB and register in the shared bank. Reuses existing downloads. New candidates require visual review. Powered by Poly Haven.

Inputs: providerId (required), resolution.

reels_edit_entityB

Patch one existing entity: color, pose, movement or geometry. Omitted fields stay unchanged.

Inputs: patch (required), shotId (required), entityId (required), revision (required), +1 more.

reels_edit_shotB

Patch only supplied fields in one shot. Camera fields merge; other supplied fields replace. No scene code or full-project rewrite.

Inputs: patch (required), shotId (required), revision (required), projectId (required).

reels_getB
Read-only

Get a compact shot list, one full shot, or the complete document on explicit request.

Inputs: projectId (required), full, shotId.

reels_get_assetA
Read-only

Read one canonical asset record, including source provenance and converted variants.

Inputs: assetId (required).

reels_import_assetA

Import audio, image, or self-contained GLB from the configured local import root. Stored once by content hash; no arbitrary URLs or code.

Inputs: path (required).

reels_import_pipelineA

Import an existing work/ narration and aligned words into a new editor project. Visuals become explicit placeholders; does not convert WGSL or modify the source.

Inputs: directory (required), projectId.

reels_listC
Read-only

List projects with compact summaries and pagination.

Inputs: limit, offset.

reels_previewA
Read-only

Render one frame as an inline image. Use sparse key times; enable guides to inspect safe zones.

Inputs: projectId (required), time, guides.

reels_preview_assetA
Read-only

Inspect the stored preview of one selected asset without loading its mesh or running Blender. Use after search; previews may not exist for source-only assets.

Inputs: assetId (required).

reels_register_assetB

Register an already imported file in the searchable bank. Reuse an existing asset ID when adding a new variant. New variants require visual review before resolve will return them.

Inputs: kind (required), name (required), tags (required), asset (required), +3 more.

reels_renderB

Queue an MP4 export of the current revision. Identical content/settings reuse the cached export. Returns immediately.

Inputs: projectId (required), width.

reels_render_statusB
Read-only

Read the last render status for a project. Output is the captured revision, even if later edits exist.

Inputs: projectId (required).

reels_resolve_assetB
Read-only

Resolve a verified reusable variant to the hashed asset reference for a model/image/audio field. Rejects candidates, rejected versions and stale conversions.

Inputs: assetId (required), variant (required).

reels_review_assetA

Record the AI visual review of a specific imported variant after inspecting it in preview. Verified variants may be reused; reject inferior variants rather than silently substituting them.

Inputs: notes (required), status (required), assetId (required), variant (required).

reels_search_assetsB
Read-only

Search reusable characters, props, sets and sounds before creating anything. Returns compact metadata, variants and readiness; no geometry in context.

Inputs: kind, limit, query, offset, +1 more.

reels_search_remote_assetsB
Read-only

Search downloadable Poly Haven CC0 models when the local bank lacks a suitable asset. Catalog is cached for one day. Returns compact metadata; Powered by Poly Haven.

Inputs: limit, query, offset.

reels_set_audioB

Attach imported narration and/or aligned words. Whole words array replaces the previous one. Null audio removes narration.

Inputs: revision (required), projectId (required), audio, words.

reels_timelineC

Insert, remove or move one shot atomically. Index is zero-based in the resulting timeline; removing the last shot is rejected.

Inputs: action (required), revision (required), projectId (required), shot, +2 more.

Tool Schema Changelog

Recent tool additions, removals, and schema changes observed during successful MCP inspections.

Loading tool schema changelog…

    TDQS

    B3.3/5.0

    Scored across 21 tools

    Disambiguation4/5

    Most tools have clearly distinct roles: project listing/creation, asset search/registration/review/resolution, shot/entity edits, timeline, audio and render are separable. The weakest boundaries are reels_list vs reels_get (project vs shot/document read), and the dense asset family (search_assets, search_remote_assets, get_asset, preview_asset, resolve_asset, register_asset, download_asset), where descriptions do the heavy lifting but an agent could still misselect a first step.

    Naming Consistency4/5

    All tools share a predictable reels_ prefix and snake_case verb_noun form. The deviation is that project-scoped tools drop the noun (reels_list, reels_create, reels_get, reels_preview, reels_render) while asset tools name their resource explicitly, so reels_get/reels_list read less self-explanatory than reels_get_asset.

    Tool Count3/5

    At 21 tools the surface is on the heavy side for a single MCP server, and the asset bank alone consumes eight tools (search, search_remote, get, preview, register, review, resolve, download). Each has a defensible role, but several are fine-grained steps that could reasonably be consolidated.

    Completeness4/5

    The lifecycle is largely covered: project creation/read, shot and entity patching, timeline mutation, audio attachment, preview/render with status, plus local and remote asset import, registration, review and resolution. Gaps remain around destructive/administrative operations — no project delete or metadata update, no render cancel/listing, and no entity or asset removal.

    Related MCP Connectors

    Related MCP Servers