# Morphareels Morpha MCP server

Source: https://glimind.com/server/mcp-registry%2Fai.morphareels%2Fmorpha
Registry id: `mcp-registry/ai.morphareels/morpha`
Status: live (checked 2026-10-27T02:19:04.583Z)

## Measurements (30 days)

- Uptime: 100%
- Checks: 5041
- Outages (90 days): 0

## Install

```json
{
  "mcpServers": {
    "morphareels-morpha-mcp-server": {
      "type": "http",
      "url": "https://morphareels.ai/mcp"
    }
  }
}
```

Claude Code:

```sh
claude mcp add --transport http morphareels-morpha-mcp-server https://morphareels.ai/mcp
```

## Tools (100)

- `add_audio_overlay`: Add an audio overlay (mp3/m4a/wav/ogg) scheduled at a frame-aligned start. The asset must already be uploaded (upload_audio, or the editor for a file from the p
- `add_caption_track`: Build a caption track from pre-timed lines (e.g. derived from transcribe_clip's word timings). mode "line-sync" (default) creates one text layer per line, each 
- `add_color_keyframe`: Add or overwrite a colour keyframe on a fill track. Targets a leaf (shapes.<id>, image.<id>, video.<id>, group.<id>). The canvas backdrop is the pinned is_backg
- `add_curve`: Draw an editable arrow / curved line — a stroked quadratic bezier with an arrowhead. Specify the two endpoints (x1,y1)→(x2,y2) in canvas pixels; `bend` pushes t
- `add_embed_origin`: Add one hostname to the project's embed allowlist (the hostnames permitted to load the public <morpha-video> embed). Idempotent — re-adding an existing entry is
- `add_from_collection`: Add an item from the user's Collection into a project as a self-contained COPY. Pass the destination `projectId`, plus the `sourceProjectId` + `elementId` of an
- `add_image_layer`: Add an image layer. The image must already be uploaded: upload_image takes a web URL or a file attached in the chat, and a file from the person's disk is upload
- `add_keyframe`: Add or overwrite a keyframe on a layer's animation track. For leaves (image/video/shape), x/y/rotation keyframes are ABSOLUTE canvas-space values: x and y are t
- `add_keyframes`: Add many keyframes to ONE element's ONE property in a single call, with an optional loop mode applied in the same call. The idiomatic form when every layer in a
- `add_page`: Append a page to the project — works on any project, turning a single-page video into a multi-page one. Without duplicate_index a blank page is appended, sized 
- `add_shape`: Add a shape layer. `kind` selects the primitive: rect | ellipse | triangle | star | pentagon | hexagon | arrow | heart | rounded-rect | diamond | parallelogram 
- `add_speed_keyframe`: Add or overwrite a speed-ramp (time-remap) keyframe on a video layer, for a rate that CHANGES over the clip. `frame` is a PROJECT-timeline frame and must sit on
- `add_text_layer`: Create a new text layer — a first-class leaf that animates, groups, and z-orders exactly like an image or shape. The renderer draws live typeset text (multi-lin
- `add_to_collection`: Add a layer to the user's reusable Collection. Pass ANY element id — a leaf (text.<id>, image.<id>, …) or a whole group.<id> (a lower-third, logo sting, brand i
- `add_video_layer`: Add a video layer. The clip must already be uploaded; clips are uploaded in the MorphaReels editor. An upload returns { filename, name }: pass `filename` (the s
- `apply_preset`: Apply a canned animation preset to a layer.
- `apply_preset_stagger`: Apply the same preset to a LIST of layers with a per-element startFrame offset — one call instead of N apply_preset calls. For diagonal pop-in grids, sequential
- `clip_processing_status`: Report whether a clip — or every video clip in the project, if `clip` is omitted — has been through the browser-side video-processing pipeline: proxy build, aud
- `create_project`: Create a new project and return its server-minted id. The id is an opaque v4 UUID assigned automatically, not chosen by the caller; people see the project's `na
- `create_workspace`: Create a new workspace (a shared team space) owned by the caller, and return it as { id, name, role, memberCount }. Use this when the user wants a new place to 
- `cut_range`: Ripple-delete a time window [startFrame, endFrame) — remove that span and pull all later content earlier by delta = endFrame - startFrame (the NLE 'ripple delet
- `delete_page`: Remove the page at `index`. Fails on an out-of-range index or when only one page remains — a project must keep at least one page. The active page stays active; 
- `delete_project`: Move a project to Recently deleted. It leaves every project list at once and can be restored for 30 days, with restore_project or from the person's projects pag
- `delete_version`: Permanently delete one saved version (bookmark or auto-snapshot). Accepts the version's UUID `id` or the `v<N>` shorthand. The bookmark v<N> sequence keeps gaps
- `describe_video`: Structural OVERVIEW of the composition (the table of contents) — canvas size, duration, platform_safe_area (the part of the canvas TikTok / Reels UI and Instagr
- `detect_text_regions`: Return the OCR text regions detected in a clip's video frames OR a still image asset. Pass either `clip` (a video.<id>.clip filename) or `image` (an image layer
- `duplicate_layer`: Composition primitive: clone a leaf (image.<id> / video.<id> / shapes.<id> / text.<id>) `count` times, applying a cumulative per-step transform — copy i is offs
- `duplicate_project`: Duplicate an existing project into a brand-new one — a full copy of its layers, animations, styles, uploaded assets, and clips. Pass the SOURCE project's `proje
- `embed_project`: Embed another of the user's projects ("a morpha") inside this one as a version-pinned band. The source's layers are inlined into the host as a collapsible group
- `fade_layer`: Fade a layer's opacity between two frames in one call.
- `fit_duration_to_content`: Clear an authored composition length and return to AUTO-FIT — the comp length tracks the furthest content (keyframe / video window / audio end) again, with a 1-
- `freeze_frame`: Freeze the picture at a frame: the clip is CUT there and a still of that frame is inserted between the halves, pushing everything after it later (the NLE 'frame
- `group_layers`: Wrap sibling elements in a new group, which the Layers panel shows as one named row the person can select, move and animate as one thing (a butterfly assembled 
- `inspect_layers`: Full per-element drill-in — the 'open this layer' half of the browser. Returns each named element's COMPLETE record: all of its own fields plus its animation tr
- `list_collection`: List the user's reusable Collection — layers they added with add_to_collection (lower-thirds, logo stings, brand intros, or any single layer). Returns { items: 
- `list_fonts`: List available font families across every source the editor knows about (Google + Bunny + Fontshare + Fontsource + Velvetyne) PLUS the project's user-uploaded c
- `list_projects`: List projects as { id, name, editorUrl } entries. The id is what every other tool's `projectId` argument takes. `name` is the human-readable label shown in the 
- `list_trash`: List the projects in Recently deleted as { id, name, trashedAt, purgeAt, deletedBy, canEdit } entries. Each can be restored with restore_project until purgeAt (
- `list_versions`: List every saved version of a project, newest-first. Returns summaries (id, name, timestamp, source, kind, version_number, cp) — not the inner project JSON. `ki
- `list_workspaces`: List the workspaces (shared team spaces) the account belongs to, as { id, name, role, memberCount } entries. `role` is the caller's role in that workspace (owne
- `merge_caption_lines`: Merge two or more caption lines into one. The earliest line survives with the union window and the time-ordered texts joined by spaces; the others are removed. 
- `move_layer`: Set a layer's static base transform. Writes x/y/w/h/rotation directly on image.<id>, video.<id>, and shapes.<id>; for group.<id> sets pivotX/pivotY (no width/he
- `move_project_to_workspace`: Move a project into a workspace, or back to the caller's personal space. Pass `workspaceId` (from list_workspaces) to place the project in that workspace — ever
- `open_project`: Get a link that opens a project directly in the editor (the editor loads exactly this project from the URL), where the person can see the work, change it by han
- `reid_project`: Change a project's id LOSSLESSLY — re-keys its JSON, every saved version, and all assets + clips, then deletes the old id. Unlike create_project (clone), versio
- `remove_audio_overlay`: Delete an audio overlay by id.
- `remove_color_keyframe`: Remove the colour keyframe at an exact frame on a fill track. No-op when no track or no matching keyframe exists. Removing the last keyframe drops the track ent
- `remove_embed_origin`: Remove one hostname from the project's embed allowlist. Idempotent — removing an entry that isn't present is a no-op. Removing the last entry turns embedding OF
- `remove_from_collection`: Remove a layer from the user's Collection so it's no longer offered for reuse. Pass the element id that was added with add_to_collection. Copies already placed 
- `remove_keyframe`: Remove the keyframe at frame N on a layer's track. Removing the last keyframe from a track restores the layer's static base value across the timeline.
- `remove_layer`: Delete a video, image, text, or shape LEAF layer. Errors on a group.<id> (dissolve it with ungroup_layers instead) and on a pinned layer such as the canvas back
- `remove_speed_keyframe`: Remove the speed-ramp keyframe at `frame` (a PROJECT-timeline frame — the same value add_speed_keyframe and inspect_layers report) on a video layer. Removing th
- `rename_group`: Rename a group. Pure cosmetic — labels appear in the Inspector and describe_video output.
- `rename_layer`: Set the human-readable name of a video / image / shape / text layer — the label shown in the Inspector, and the basis for the layer's auto-derived <morpha-video
- `rename_project`: Update a project's human-readable name (shown in the editor's project picker). Pass an empty string to clear the name and fall back to the id. Doesn't touch any
- `rename_version`: Rename a saved version's human-readable label (what the user sees in the picker). The `v<N>` partner-facing identifier is unaffected — only the display name cha
- `rename_workspace`: Rename an existing workspace. Requires an owner or admin role in it (the same roles that may change its membership); an editor or viewer is refused. Takes the w
- `render_status`: Check a server render started by render_video, and get its download link. Returns { ok: true, status: 'not-ready' } while it is still rendering (wait and call a
- `render_video`: Render the project to an MP4 on Morpha's servers, for an agent that has no browser to drive (a chat app, a Linux box). Returns { renderId, status: 'rendering', 
- `reorder_layer`: Move a layer within its parent's siblings. newIndex is 0-based among siblings (root list when ungrouped, or the parent group's children when nested). 0 = bottom
- `reorder_pages`: Move a page from `from_index` to `to_index`. The remaining pages shift to fill the gap; active_index is rewritten so it keeps pointing at the same page it did b
- `restore_project`: Bring a project back from Recently deleted, with its versions, files, workspace and sharing as they were. Returns { projectId, name }. Scheduled social posts ca
- `restore_version`: Load a saved version over the live project. Accepts either the version's UUID `id` or the `v<N>` shorthand (e.g. `"v6"` finds the bookmark with version_number=6
- `safe_zones`: Return horizontal 'safe band' y-ranges of the canvas where a clip's burned-in video text (subtitles, lower thirds, titles) does NOT appear, plus the inverse 'te
- `save_version`: Save a version of the current project state. The person flicks between versions in the editor to compare or roll back, so one version per logical change-set (no
- `select_page`: Switch which page is ACTIVE — the page the content tools target. Subsequent describe_video / inspect_layers / all content tools read and write this page until t
- `set_canvas_size`: Resize the ACTIVE page's canvas to width × height pixels. The composition is scaled UNIFORMLY to fit the new frame (a single factor s = min(newW/oldW, newH/oldH
- `set_clip_speed`: Play a clip slower or faster at a CONSTANT rate — the normal way to retime a clip. 1 = source speed, 0.5 = half speed, 2 = double speed; range [0.1, 8]. The tri
- `set_custom_font`: Register a typeface Morpha does NOT ship, so text layers can use it by family name via font_family (exactly like a built-in family). Families already in the bui
- `set_duration`: Author an EXPLICIT composition length in seconds, pinning it (duration_authored=true) so the auto-fit no longer drives it. Morpha normally DERIVES the comp leng
- `set_embed_origins`: Replace the project's embed allowlist — the hostnames permitted to load this project through the public <morpha-video> embed. Pass the full desired list; it ove
- `set_embed_start`: Place an embedded morpha band on the host timeline: set its TIME ORIGIN (the frame it starts). The band's whole inner reel plays relative to this frame, so its 
- `set_group_box`: Set a group's backdrop rect size. The rect is centred on (pivotX, pivotY) in group-local space and transforms with the group. Either dimension at 0 hides the ba
- `set_group_parent`: Move an element into a group (or out to root). Refuses to place a group inside its own descendants.
- `set_group_window`: TRIM a group's own visible window — the [start, start+duration) range over which the group and its subtree are drawn. The contents are NOT moved or deleted: thi
- `set_image_filename`: Repoint an existing image layer at a different uploaded asset — keeps the layer's id, position, size, animations, and styles; only the bitmap changes. The image
- `set_keyframes_batch`: Add or overwrite MANY keyframes across MANY layers in ONE call — functionally equivalent to N add_keyframe calls but with one HTTP/MCP round-trip. Pass an array
- `set_layer_block`: Set (or replace) a layer's timeline BLOCK — the [start, start+duration) window it exists for. The layer is drawn ONLY inside that window, and its animation keyf
- `set_layer_fill`: Set a layer's fill. The canvas backdrop is the pinned is_background image_layer (its element id is exposed via describe_video as background.elementId; the liter
- `set_layer_text`: Edit an existing text layer (text.<id>). Patches its text content, font, size, colour, and full type styling — pass only the fields you want to change. Does NOT
- `set_layer_transition`: Set how a layer ENTERS at the start of its on-timeline window and LEAVES at the end, instead of popping. The transition is EDGE-RELATIVE — only a length and a l
- `set_layer_visible`: Show or hide a layer instantly by writing a single opacity keyframe (1 or 0) at frame 0.
- `set_loop`: Set the project's loop section: the whole composition repeats once per value, with one field of one layer varying across the repeats. Builds one pass per value,
- `set_matte_source`: Set (or clear) a track matte — the host shows only where the matte source is opaque. The HOST can be a leaf (image.<id>, video.<id>, shapes.<id>, text.<id>) OR 
- `set_pivot`: Set the rotation / scale pivot anchor for an image, video, shape, or text leaf. Picks one of the 9 standard bbox anchors — corners, edge midpoints, or centre — 
- `set_style`: Set style fields on a layer. Only the fields you pass are changed; omit a field to leave it untouched. Covers border/radius/shadow (including borderAlign — inne
- `set_text_background`: Add or update the rounded background box behind a TEXT layer (text.<id>) in one call — sets the backdrop fill plus the box's padding, corner radius, and optiona
- `set_track_loop`: Set the extrapolation mode for one property's animation track. Modes: "hold" (default — holds the boundary keyframe's value past the ends), "loop" (wraps frames
- `set_video_clip`: Repoint an existing video layer at a different uploaded clip — keeps the layer's id, position, size, animations, styles, and trim window; only the source mp4 ch
- `set_video_layer_muted`: Mute or unmute a video layer's baked audio (silenced in both preview and export). The processing pipeline's audio-split step sets this true after demuxing the c
- `set_video_layer_trim`: Patch a video layer's trim window: source_in_frame (frame in source to start), source_out_frame (frame in source to stop, or null for natural end), timeline_sta
- `shift_group`: MOVE a group and everything inside it along the timeline, keeping its internal timing intact — the 'slide this whole section later' operation. A plain group is 
- `shift_track`: Bulk-shift every keyframe's VALUE on one property of one layer by `delta`. Mirrors the 'select all keyframes + nudge layer' gesture in After Effects / Premiere 
- `show_project`: Show the project in the chat as a live preview that plays and follows every edit; a multi-page project turns its pages in the preview. Call it once per project,
- `split_caption_line`: Split one caption line into two at a COMPOSITION frame strictly inside its window (in the editor this is the playhead). The right half is a full clone — style, 
- `transcribe_clip`: Return the cached transcript of a clip's audio. Generated client-side in the Morpha editor (transformers.js Whisper) and cached in R2 next to the clip; if absen
- `ungroup_layers`: Dissolve a group: its children are spliced into the group's parent at the group's old position. The group's animation tracks are discarded — children survive at
- `update_audio_overlay`: Patch an existing audio overlay. Only the fields you pass are changed. Pass endFrame:null to clear it (revert to natural-length playback).
- `upload_audio`: Upload an audio track into a project from a public http(s) URL or a file attached in the chat, fetched server-side — the ONLY way to get an audio file's bytes i
- `upload_image`: Upload an image into a project from a public http(s) URL or a file attached in the chat, fetched server-side. Pass `url` for a public http(s) link, or `file` fo

Measured by Glimind (https://glimind.com): MCP handshake + tool list only, no tool is ever called. CC BY 4.0.
