FilmeraDocs
All pages

Use Filmera from AI agents (MCP)

Filmera exposes its studio — projects, canvas nodes, generation, media, timeline and export — to AI agents through the Model Context Protocol (MCP). Connect it once and your agent can plan shots, generate takes, assemble a cut and export the film, using your Filmera credits.

Endpoint: https://www.filmera.ai/api/mcp (Streamable HTTP)

Sign in with OAuth

Every MCP client connects the same way: add https://www.filmera.ai/api/mcp as a connector (or remote MCP server) and sign in. The first time the agent calls a Filmera tool your browser opens the Filmera sign-in, you approve access, and the client keeps the token and renews it on its own.

API keys don't work for MCP. A request to /api/mcp that carries an API key (Authorization: Bearer fk_…) is refused with 401 api_key_not_supported. If you set Filmera up with a key before, remove the Authorization header from your client's config and reconnect — the client then starts the sign-in by itself. API keys still work for the REST API, for scripts and automation.

The agent acts as you: it sees only your projects, and every generation is charged to your credits.

Credits, approval and spending caps

A connected agent spends your Filmera credits at the same prices as the studio — there is no separate budget to set up.

By default, an agent needs your go-ahead in the conversation before it spends. When the agent asks Filmera to generate, nothing runs yet: it gets back the cost (a quote) and tells you what it will make and what it costs. Once you say yes ("go ahead", "진행해"), it asks again with the quote and your reply, and Filmera records those words with the run. If the cost has gone up since the quote — say the agent switched to a pricier model — Filmera hands back a new quote and the agent has to ask you again.

Filmera cannot see your conversation, so this relies on the agent passing along what you actually said. It is not a hard lock. For a hard ceiling, set a spending cap (below).

If you trust an agent to spend on its own, turn the check off for that agent under Settings → API keys (Connected agents) ("Ask me in the chat before this agent spends credits"). It then generates immediately, as the studio does when you click.

If you want a hard ceiling, set a spending cap for a connected agent on the same page. Generation calls stop once that agent has spent its cap. You can disconnect an agent from the same page.

Connect

Inside the studio, the Connect agent button in any project's header walks you through this for Claude, ChatGPT, Gemini, Grok, Claude Code and Cursor, with the server URL and commands ready to copy.

Claude.ai / Claude Desktop

One click: Add Filmera to Claude opens Claude's Add custom connector dialog with the name and URL already filled in. Claude notes that the values came from an external link — check them and click Continue, then sign in when prompted.

By hand: Customize → Connectors → Add custom connector → URL https://www.filmera.ai/api/mcp. Sign in when prompted.

ChatGPT

Custom plugins need Developer mode, available on the web for Plus plans and above. Turn it on in Settings → Security, then open Plugins:

  1. Click + at the top right → Create app → Create MCP app.
  2. Name it Filmera. Under Connection, keep Server URL and paste https://www.filmera.ai/api/mcp. Leave Authentication on OAuth.
  3. Tick the custom-MCP risk acknowledgement and click Create.
  4. Sign in to Filmera when prompted.

Gemini

Gemini has no link that fills in the connector for you, so you paste the URL once.

Gemini web (custom apps). Google currently offers custom apps only in the US, to people 18 or older signed in with a personal Google account, with the app in English and Keep Activity turned on. Work and school accounts can't add them.

  1. On gemini.google.com open Connected Apps (Settings → Connected Apps, or Customize → Connectors).
  2. Under Custom apps click Add a custom app, paste the endpoint above and click Next.
  3. Sign in to Filmera when prompted.

You can add the app only on the web, but it then works in the Gemini mobile app too. To make sure Gemini uses Filmera, type @ in a chat and pick it.

Gemini CLI. Since June 18, 2026 Gemini CLI works only with a paid Gemini API key or a Gemini Code Assist Standard or Enterprise license; Google AI Pro, Ultra and free accounts moved to Antigravity CLI. If you have one of those, run this once: gemini mcp add --transport http --scope user filmera followed by the endpoint above. --scope user adds Filmera for your user account; without it the server only shows up in the folder you ran it from.

gemini mcp add --transport http --scope user filmera https://www.filmera.ai/api/mcp

The first Filmera call opens the sign-in in your browser. If you need to sign in again, run /mcp auth filmera inside Gemini CLI.

On Gemini Enterprise only a team admin can add custom MCP servers, and these steps don't cover that setup.

Grok

On grok.com open Connectors, click New Connector → Custom, paste https://www.filmera.ai/api/mcp and sign in when Grok asks. Grok discovers the Filmera tools on its own; the server has to be reachable on the public internet, which it is. On Grok Business and Enterprise a team admin adds the connector in the console first, then members can use it.

Claude Code

claude mcp add --transport http filmera https://www.filmera.ai/api/mcp

Claude Code opens the browser sign-in the first time it calls Filmera. Run /mcp inside Claude Code to sign in again. Don't add --header "Authorization: …" — API keys are refused on MCP.

Cursor

Add to ~/.cursor/mcp.json:

{
  "mcpServers": {
    "filmera": {
      "url": "https://www.filmera.ai/api/mcp"
    }
  }
}

Cursor opens the Filmera sign-in on first use. Leave out a headers entry — API keys are refused on MCP.

Codex / other clients

Any MCP client that supports Streamable HTTP and OAuth 2.1 sign-in (with dynamic client registration) works. A client that can only send a fixed API-key header can't connect to MCP — use the REST API from it instead. The server is stateless — no session resume, no SSE stream.

What the agent can do

| Group | Tools | | --- | --- | | Read | get_guide (the agent playbook) · list_projects · get_project (every node's position, and each video and image node's model and settings) · get_timeline · list_models (ids, settings, each model's prompt length cap and its reference limits — how many images, videos and audio clips it takes, how long a clip may be, image sizes) · search_voices (ElevenLabs voices for voice_id) · list_media · list_folders · get_credits · get_node_references · read_node_prompt · view_media · list_presets · compare_prices (credits per model for the same settings) · get_download (direct URL and the app's filename) · list_showcases · get_chat_history (your own messages with the in-app agent in a project, newest first) · list_templates / get_template (the public template gallery — full prompts when a template's prompts are open, the website's preview when it is showcase-only) | | Build | create_project · rename_project · create_image_node · create_video_node · create_audio_node (voice, music or SFX node with its recipe) · update_audio_node (its script, model, voice, references or settings — generated nodes too) · import_media_from_url · upload_media · create_media_folder · rename_media_folder · move_media · organize_canvas · create_section · move_nodes_to_section · move_nodes · resize_section · update_node_prompt · connect_nodes · disconnect_nodes · delete_nodes · set_frame_slots · set_film_meta · create_note · update_note · add_take_from_media (an uploaded file as a new take on a node) · set_take_recipe (record an uploaded take's prompt, model and settings) · set_node_kind · save_preset · apply_preset · add_scene · update_scene | | Several at once | create_ref_nodes (up to 8 image nodes from prompts the agent wrote) · create_video_nodes (up to 8 video nodes) · draft_storyboard (save the scenes it wrote) | | Generate (spends credits) | generate_ref_nodes · generate_video_nodes (both take takes_per_node 1-4) · generate_audio (SFX, score, change voice, clean) · generate_audio_node (a take on an audio node with any audio model — text-to-speech, music, SFX, or ElevenLabs speech-to-speech) · generate_character_voice · generate_retake (new take on an existing node — prompt, model, settings, keyframes or voices) · generate_upscale · generate_vfx (swap actor, replace background, add/remove object, relight, extend shot) | | Edit & finish | assemble_timeline (generated video nodes or video files, in order) · create_timeline · duplicate_timeline · rename_timeline · set_frame_ratio · edit_tracks · edit_timeline · undo_timeline_edit · place_audio_take · set_best_take · extract_last_frame · export_timeline | | Review (Theater, free) | get_take_analysis (a take's full check — shots, dialogue, every flag and note, and the model's raw output) · list_fix_requests · keep_flags / unkeep_flags (mark a flag as intended) · decide_fix (use the new version or keep the old) · undo_fix · set_story_order (the order the Theater plays) | | Wait | get_job_status · wait_for_jobs · check_effects | | Feedback | report_feedback (sends a bug report or a missing-feature note to Filmera's team — see below) | | Manage (all reversible) | rename_media · set_media_flag · trash_media · restore_media · trash_project · restore_project · duplicate_project · share_project (read-only link) · publish_showcase / unpublish_showcase (Community gallery) · duplicate_template (copy a public template into a new project, like its Duplicate button) |

With the check on (the default), the first generate call returns status: "confirmation_required" with the cost and a quote_id — nothing runs. After you agree, the agent calls again with quote_id and user_confirmation (your reply, word for word).

The quote also carries the reference warnings the editor shows next to a clip — references the model will drop because it takes fewer, character voices left out, a character mentioned but not connected — as warnings on each item, with a short code for each in warning_details. create_video_node, update_node_prompt and connect_nodes report the same warnings as soon as they apply.

If the connection drops and the agent is not sure the generation started, it sends that same call again, unchanged. A run that already started answers status: "already_started" with its original job_ids, and you are not charged a second time; idempotency_in_progress means the first call is still being processed, so the agent tries again a moment later. Agents can also pass their own idempotency_key (any unique string) to get the same protection, and a fresh quote lists recent_jobs already running on the same nodes.

Fewer permission prompts

Every tool in the Read row is marked read-only in the catalog (the MCP readOnlyHint annotation), and the tools that delete or replace something — delete_nodes, assemble_timeline, edit_timeline, undo_timeline_edit, trash_media, trash_project, share_project (turning a link off revokes it) — are marked destructive. Nothing is deleted permanently through the API: trashed media and projects come back with restore_media and restore_project. Clients that honour the annotations run the read-only tools without asking. Clients that ask for every call have their own allow lists: in Claude.ai choose Always allow on a tool the first time it asks; in Claude Code answer Always allow at the prompt, or add the tool names (mcp__filmera__get_project, mcp__filmera__list_media, …) to permissions.allow in your settings via /permissions. Generation tools keep asking — that prompt is on purpose, since they spend your credits.

The agent playbook

Filmera tells a connected agent how to work before it builds anything. The server instructions point it at get_guide, which returns one chapter of the playbook at a time — rules (read the project first, spend only with approval, set every setting explicitly, retake instead of duplicating, keep the canvas tidy), canvas (which tool does what, limits, section naming), prompts (what a reference set needs and how a clip prompt is shaped), workflows (idea to film, reference clip to film, an upscale template, music and voice) and troubleshooting (content blocks, snapped settings, drift, upload and approval errors). The same chapters are published as MCP resources at filmera://guide/<topic> for clients that attach resources on their own.

Four more chapters are Filmera's own film craft, published word for word from the instructions its in-app agents follow: sheets (character model sheets, empty location plates, prop sheets, second looks), video (the timestamped prompt shape, the closing Constraints block, identity locks, first frames), performance (beats, acting, camera, dialogue, sound) and story (breaking a brief into scenes). The agent reads one chapter per call. Clients that support MCP prompts — Claude Code lists them as slash commands — also get write_reference_sheets, write_video_prompts and design_story, which hand the agent the task and the matching craft in one message. The same chapters are a downloadable agent skill for agents that are not connected yet.

Changing a clip's voice

There are two ways, and they trade off differently. generate_audio with op: "voice" keeps the picture untouched and only re-performs the dialogue — cheap, but the lip sync is still the one the clip was generated with. generate_retake with voice_node_ids regenerates the shot with that voice attached, so the model performs and lip-syncs it — a new take on the same node, at video prices.

Either way the voice has to come from somewhere: a character node that has a voice (generate_character_voice), or an audio file you upload — upload_media puts audio on the canvas as a node you can connect. For op: "voice", every speaker in the clip needs a character; when the names in the prompt do not match, pass speaker_voices to say who performs whom.

Generation is asynchronous: a generate call returns immediately with job_ids, and the agent waits on them with wait_for_jobs (it long-polls up to 50 seconds per call) until all_done is true — every job is done, failed or not_found (listed in missing), and polling again would not change any of them. A generate call that fails returns job_ids: [] with all_done: true, error and retryable, so there is nothing to wait for. Clients must send Accept: application/json, text/event-stream (every MCP client does; only hand-written curl calls need care).

Who writes the prompt

Your agent does — every prompt, with its own model. Filmera supplies the craft (the chapters above) and the tools; it does not run its own models to write prompts for a connected agent. create_image_node and create_video_node take one finished prompt, on any plan. create_ref_nodes and create_video_nodes take up to eight the agent wrote, with the same fields per item, and draft_storyboard saves the scenes it wrote. Nothing is charged until a generate tool runs. The prompt length cap is the model's, not the tool's: list_models reports prompt_max_chars for each model, and a prompt over the cap is refused with a model that would fit.

Until 23 October 2026 those three tools took a one-line brief and Filmera wrote the prompt on its servers. An agent that still sends a brief gets status: "needs_prompts" back — nothing is created, and the answer names the chapter to read and the shape to call again with. The in-app agent (the chat in the studio) still writes prompts for you as before.

Pointing at a reference by name

Inside a node prompt, write @Name to point at another node on the canvas:

@Anneke stands by the @Workroom window, the pearl catching the light

Filmera attaches those nodes as references and numbers them for the model at generation time. Write the name, not a number — @Image1 and friends are refused, because the numbering depends on the final attachment order and a hand-written number silently points at the wrong picture once that order changes. Names are matched loosely, so @ANNEKE, @Anneke and @anneke all find a node titled "Anneke". If a name matches nothing, or matches two nodes, the tool says so in its reply and leaves your text alone.

The numbers themselves are worth understanding, because they are not simply the order you connected things. References are numbered in the order they are sent to the model: locked keyframes first, then a first-frame anchor, then character sheets, then the connected reference nodes in their own order — and the sheets take numbers too, so three connected nodes are not always @Image1–@Image3. Connections keep the order you make them in (connect_nodes uses the order of the list you pass, and adding one later puts it at the end). To see exactly which number each reference has on a given node, call get_node_references.

Revising a shot

A node's prompt and settings freeze the moment it generates — they are the recipe that produced the takes, so update_node_prompt refuses to rewrite them. That does not mean an agent has to start a new node to change something.

generate_retake runs an already-generated node again with a revised prompt, and optionally a different model, different settings, or different pinned first/last frames. The result arrives as another take on the same node, and the earlier takes stay where they are — the same thing the Retake button does in the app. Use it for "again but slower", "warmer light", "try the other model", "start from this frame instead". Start a fresh node only when it is genuinely a different shot, otherwise the canvas fills up with variants of one idea and nothing says which is current.

read_node_prompt is how an agent gets the recipe to revise: the node summaries in get_project are abridged, so a rewrite built from them loses detail. It returns the ★ take's exact prompt, model and settings, free of charge.

Audio nodes work the other way round: their recipe — script, model, voice, references, tuning — stays editable after generating, because each take is made from the recipe as it is at that moment. update_audio_node changes it (only the fields you pass), and the next generate_audio_node run makes a take with the new recipe while earlier takes stay.

When an agent tries to rewrite a generated node's prompt, the refusal tells it which of the two applies. A small tweak to the same shot is sent straight to generate_retake; a prompt describing something else is sent to a new node. When the new prompt sits between the two — the same character in a different framing, say — the tool asks the agent to check with you first, because a take and a node are not interchangeable: takes are versions of one shot, nodes are different shots.

Organising the canvas

The simplest way is to organise as you build: create_image_node, create_video_node, create_ref_nodes and create_video_nodes take an optional section — a title such as "Characters" or "Scene 1", or a section id. The node goes into that section in a grid of four columns; if no section has that title yet, one is created below everything else on the canvas. create_video_nodes uses its scene_name when you leave section out. Nodes created without a section fill rows of six and then start a new row, so the canvas never runs off to the right.

organize_canvas lays the whole canvas out in one call. Reference images go into numbered sections stacked in a column on the left — 00 · CLIENT PHOTOS (your uploads), 01 · CHARACTERS, 02 · ENVIRONMENTS, 03 · PROPS and 06 · FRAMES (extracted stills) — in the order the videos attach them. Video nodes go into 04 · VIDEO SEQUENCES in a column to the right, in timeline order and centred on the references, and audio goes into 05 · AUDIO below the video. Boxes fit their nodes and are coloured (characters pink, props red, environments green, video blue). Sections you made yourself are moved as a block into the matching column, notes stay where they are, and nothing is deleted; running it again on an organised canvas changes nothing. dry_run: true shows the plan without moving anything, and rename_nodes: true also numbers the titles ("01 · Mina", "GEN 1 · Opening — 8s"). create_section takes a color too.

create_section draws a titled group box, sized to enclose whatever nodes you pass it — the same Section tool that is in the app, so a project can carry the Characters / Environments / Props / Clips structure the media folders have. move_nodes_to_section puts existing nodes in one (or takes them out with section_id: null); the box grows to fit and nothing moves on screen. To rename a section, call update_node_prompt with just a title.

get_project reports every node's x, y, w and h in absolute canvas coordinates, and move_nodes puts nodes anywhere in that same space — so an agent can read a canvas that has piled up and lay it out properly: a row of shots, their references stacked above each one, a grid per scene.

Where a node lands decides which section it is in, exactly as dragging it would: drop it inside a section's box and it joins (the box grows to stay around it); move it off and it leaves. Moving a section itself moves everything inside it. resize_section changes a group box without moving its contents — it will not shrink past the nodes it holds, and tells you the size it actually got.

Seeing the results

view_media returns the picture itself in the tool result, so an agent can look at what it generated instead of describing it from the prompt. Give it a node id (its selected take, or take_index for a specific one) or a file id; video takes come back as their poster frame. Audio has no picture, so for an audio take the result reports its duration and URL instead. It sends a downscaled copy for viewing and the full-resolution URL alongside — useful because agent sandboxes often cannot fetch media URLs directly.

Editing the cut

assemble_timeline lays whole clips end to end. For anything finer, the agent reads get_timeline — every clip with its position, length, source in/out points and the gaps between clips — then sends a batch of edits to edit_timeline: trim a clip's source in/out (with ripple: true the clips after it on the same track move up so no gap opens), move it in time or to another track, split it, delete it (optionally closing the gap behind it), close every gap on a track with close_gaps, set per-clip volume and mute, or place a clip in the frame with set_transform (scale and offset — a small picture-in-picture over a background on a lower track — or fit: "fill" to cover the frame, for example a landscape clip on a 9:16 cut; Filmera works out the scale). get_timeline also says whether each clip is a video or an image, and the timeline's frame shape. Times are seconds on a 24 fps grid, and the same rules the editor uses apply: minimum clip length, source bounds, and audio detached on V2 gets cut with its video.

Music and sound go on with add_audio in the same batch: any audio file in the media pool — one you uploaded with upload_media or import_media_from_url, or a generated one — on an audio track, with its own start, in/out points and volume. place_audio_take does the quick version (a whole take, on a timeline you name with timeline_id); it accepts the file id, a take id or an audio node id, and says which timeline it used.

Two things make this safe to hand to an agent. It can pass preview: true to see the resulting timeline without writing anything, and expected_version from the read, which refuses the write if you or another agent changed the timeline in the meantime. undo_timeline_edit walks back the last batch, up to 20 steps.

assemble_timeline places each clip's ★ best take (set_best_take). When the cut is right, export_timeline renders it and returns job_ids; wait_for_jobs on those hands back output_url once the file is ready.

Close the Edit page while an agent reshapes a timeline. The editor keeps its own copy of the cut and saves it after your next change, which would overwrite the agent's edits to clips it already knew about. If you do have it open, the timeline toolbar shows an Updated elsewhere button the moment an agent saves; reloading from there picks up its version. (Canvas changes appear on their own, without a reload.)

import_media_from_url lets the agent bring in reference images (or video and audio) it found or generated elsewhere: the file is downloaded from a public URL into the media pool, and images land on the canvas as a reference node ready to connect to a video node. Only public http(s) URLs are fetched; private networks are refused. For a file that is not on a public URL — a photo a client sent you — upload_media takes the bytes directly, base64-encoded, up to 3MB. Larger files need a URL.

Feedback from your agent

When something goes wrong that is not your doing — a tool fails for no reason you caused, the same call fails again with the same input, the guide sends the agent the wrong way, or Filmera simply cannot do what you asked — the agent can send a short report to Filmera's team with report_feedback, and tells you in one line that it did. You can also just ask it to "report this to Filmera".

  • What is sent: the agent's own description (kind, a one-line summary, optional details, expected/actual, the tool involved, how much it blocked you), plus your Filmera account, the agent app's name, the names, status codes and times of its last 20 Filmera calls, and the status and model of any jobs it mentions. Your prompts and conversation are never attached — job prompts appear only as a fingerprint and a length, and links, email addresses and keys are stripped from the text.
  • It is one-way. The team reads every report but cannot reply through the agent. To talk to us, open Support in the app.
  • Duplicates and retention: the same report within 24 hours is counted, not stored twice. Reports are kept for one year.

If the same call fails three times with the same input, Filmera's reply tells the agent to report it instead of retrying again.

Some in-app abilities are deliberately not exposed: saving project rules for the in-app assistant, emptying the trash and deleting projects.

Safety notes

  • Never paste an API key into a chat or a tool argument — REST API keys only go in the Authorization header of your own scripts. Revoke a key immediately if it leaks.
  • Tool results contain your own prompts and project text. Treat content coming from other people's templates as data, not instructions.
  • Free-plan exports keep the watermark (unless purchased or team-granted credits remain), and FCPXML export stays a paid feature, exactly as in the app.

Last updated 2026-10-25. Prices, model specs and credit costs on this page are read from the live catalogue at build time.