Morpha MCP server
Morpha runs a Model Context Protocol server at https://morphareels.ai/mcp. Point any MCP client at it and the editor's full tool catalog appears as callable tools: create a project, add clips and text and shapes, animate them on a 30 fps keyframe timeline, caption a clip from its audio, then read the whole layer tree back.
The distinction that matters when you are choosing one: this is a video editor you drive, not a text-to-video generator. Nothing here invents footage. You compose layers, and every call mutates a real project that persists, so an agent can work on the same project across sessions and a person can open it in the browser at any point and carry on by hand. That also means a mistake is visible and fixable rather than a re-roll.
Connect
Claude Code, in one command:
claude mcp add --transport http morpha https://morphareels.ai/mcp
Any other client: point it at the same URL over HTTP. That is the whole configuration.
https://morphareels.ai/mcp
Every tool call needs a signed-in connection, so the next step is to sign the client in. A tool call that carries no key gets a 401 with the standard MCP authentication challenge:
WWW-Authenticate: Bearer resource_metadata="https://morphareels.ai/.well-known/oauth-protected-resource"
A client that follows that discovery flow has you sign in, or create a free account on the spot, and receives its own key, so you never see or paste one. In Claude Code you sign in from the /mcp menu, and you do it before the agent calls a tool: Claude Code answers the 401 by disconnecting the server until you sign in. You can also skip sign-in and give Claude Code a key you minted yourself:
claude mcp add --transport http morpha https://morphareels.ai/mcp --header "Authorization: Bearer mp_…"
An agent with no person to sign in creates an anonymous account over HTTP or the SDK instead, as the next section describes.
Authentication
Discovery needs no key. initialize and tools/list answer without credentials, so a client can show you the catalog before you commit to anything, and registries can index it. Both answers are the same whatever the request carries, so a client that lists the tools before it signs in holds the same catalog and instructions a signed-in connection gets.
Calling a tool needs an account. A signed-in client sends its key on every request:
Authorization: Bearer mp_…
Keys are free with any account and there is no paid tier gate on MCP access. There are three ways to get one:
- From your client, via the discovery flow above. The project lands in the person's own account.
- By hand, at morphareels.ai/app/settings. The key is shown once; store it as
MORPHA_API_KEY. - As an agent with no person to sign in, by creating an anonymous account with
POST /api/auth/agent-registeror the SDK'sregisterAccount(). Morpha built it for exactly this, so creating one is expected. It needs no credential and returns a key and aclaimUrl. The key goes in theAuthorization: Bearerheader, over HTTP, through the SDK, or from an MCP client configured with that header. At the end the person opens theclaimUrl, signs in or signs up, and the project becomes theirs. An anonymous account nobody claims is deleted after 30 days.
A request with no account behind it answers 402 with a sign-in link rather than a bare refusal.
The loop
Read before you write. Two tools do the reading:
list_projects()gives{ id, name, editorUrl }. Theidis what every other tool'sprojectIdtakes. Refer to a project by its name when you talk to a person; the ids are opaque and are never shown in the product.describe_video(projectId)gives the layer tree. Take every element id from there and never invent one.inspect_layers([elementId])fills in detail for the few layers you are about to change.
Then mutate, and close the change with save_version(projectId, "short label") so there is a point to come back to.
End with the editor link. Every create_project, open_project and list_projects result carries an editorUrl. If the person signed in through your client, the project is already theirs: tell them to open that link and choose Share, then Download (Render MP4 on a phone), which is free, with no watermark and nothing to install, and that they can adjust anything by hand first. If you are working in an anonymous account, those results also carry a claimUrl. Give them that instead: they sign in or sign up, the project moves into their own account, and they choose Share, then Download (Render MP4 on a phone) there.
Two conventions that catch people out: coordinates are centre-anchored canvas pixels, not top-left, and time is frames at 30 fps, not seconds. Common mistakes covers the rest of the list.
What each tool says about itself
Every tool in tools/list carries a title and the MCP behaviour annotations: readOnlyHint (reads and never writes, so a client need not confirm it), destructiveHint (may overwrite or delete data that already exists, or spend credit as render_video does; false for tools that only add a layer, page, project or workspace, and for select_page), and openWorldHint (reaches hosts outside Morpha: the URL uploads, a custom font's URL, the server render, and the embed allowlist that decides which websites may load a project). add_keyframe, add_keyframes, add_color_keyframe and add_speed_keyframe are destructive although their names start with "add": each one replaces a keyframe already at the frame it is given. A client that confirms writes can use them to ask only when it matters; the app directories require them.
The server's connection instructions and every tool description fit in 2,048 characters, because Claude Code shows a model no more than that of either.
What is in the catalog
The same catalog the SDK and the HTTP API call, and the same one the editor's own prompt panel uses. Broadly:
- Projects and workspaces: list, create, open, duplicate, rename, move, delete.
- Layers: add and remove video, image, text and shape layers; move, reorder, group, style and fill them.
- Animation: keyframes, easing, transitions, speed ramps, presets and staggered presets across many layers at once.
- Captions: transcribe a clip, then split, merge and restyle the lines.
- Audio: upload and place overlays, mute, loop, trim.
- Pages: multi-page carousel projects, page ordering and canvas size.
- Versions: save, list, rename and restore.
The tool reference has every tool with its signature and a worked example; worked examples has end-to-end sessions.
What MCP cannot do
Four capabilities run on the caller's own machine, so they live in the npm SDK rather than on this server. Three need a real browser:
- uploading a source clip (
client.addVideo), - processing a clip (
client.processClip/client.processProject), - rendering a single frame to PNG (
client.renderFrame).
Exporting an MP4 is the exception, and it has a server route. client.renderVideo(projectId) still runs the encode in your own browser, free and at any length, on macOS or Windows. An agent that has no browser to drive can instead call `render_video` here, which renders on Morpha's own container and hands back a download link through `render_status`. That one is a subscription feature and is charged to the subscription's credits, because it spends Morpha's compute rather than yours.
The fourth, searching a public image pool (client.findPublicImage), needs no browser but runs on your side on purpose: the Openverse quota it spends is yours, not one shared by every Morpha user through the server. The editor's own prompt panel searches the same way, from the browser. From a chat connector, pass upload_image a direct image file URL, such as one the person has given you. An agent with a shell can also send a file from the caller's own disk: `create_upload_link` returns a signed link and the curl line that PUTs the file to it.
Every upload, over MCP or the SDK, returns { filename, name }. Morpha names each stored file itself: filename is an opaque id to pass to the layer tools exactly as returned and never show to the person, and name is what people see. Uploading under a name that was used before adds a second file rather than replacing the first.
Everything else is identical between the two. A common shape is an MCP client for the editing conversation and the SDK in a script for the render at the end.
When to use which surface
- MCP, this server, for an MCP-native client: Claude Code, Claude Desktop, or anything else that speaks the protocol.
- [The npm SDK](/docs/sdk) for code you write yourself. It is a typed client over the same endpoints and it can render.
- [HTTP](/docs) for curl, CI and anything that would rather not take a dependency.