Blender integration through the Model Context Protocol
Frapea is installed from its publisher's own source and answers where it runs, so this marketplace is not in the path of a single call. There is no address here to send one to, and a panel that pretended otherwise would be showing you an answer we made up. Install it and call it from your own client — the Installation tab has the entry for each one.
What it does
A video editor in your browser that your AI drives: cuts, captions, multicam, motion titles, export.
Quickstart
# 1 — add it to Claude Code
claude mcp add --scope user --transport http frapea-mcp https://app.frapea.com/mcp
# 2 — ask your agent for something these tools do
# connect, get_projects, get_timeline and 59 more
Frapea costs nothing on mcprush: there is no plan to choose here, no cap to set and nothing mcprush can bill you for.
Collected from a public index. Nobody has claimed this account, so nothing here was written by its author — claim it if it is yours.
Where are you running it?
Every route below installs the same thing and ends at the same approval screen. Nothing here runs on your machine and nothing runs on ours: this server answers at its publisher’s own address, and what you install is the connection straight to it.
This is a public server: it answers at its publisher’s own address and this marketplace is not in the path. Claude Code registers it in one command; --scope user makes it available in every project. The transport below is http, as the publisher's own manifest declares it.
claude mcp add --scope user --transport http frapea-mcp https://app.frapea.com/mcpReconnect, or start a new session, and the tools appear in the model’s tool list.
One config entry pointing straight at the publisher’s own address — this marketplace is not in the path, and nothing from this listing executes on your machine.
62 tools, with what each one reads, writes and reaches shown before you agree — the same list on every route above. Read the tool surface.
Tool surface
What the model actually sees. Descriptions are diffed on every release — see version history.
Pairs you with the user's Frapea browser tab. TWO WAYS ROUND. (1) If they already have Frapea open: ask them for the pairing code (the Connect MCP button) and call this with it. (2) If they do not, or you are not sure: call this with NO arguments and you get back a link — send them the link, then call this again with the code it contains every few seconds until it returns a token (they have to acc
| Parameter | Type | Required | Notes |
|---|---|---|---|
| code | string | no | The 8-character code — from the user's screen, or from the link this tool gave you. Omit it to get a link to send them. |
Lists the projects Frapea knows on this machine: id, name, lastOpenedAt, and for a project stored in a folder on disk its folder (the directory's name — files you write into its media/ subfolder join the pool by themselves). Call first to find the projectId every other tool needs. A project the browser has no permission for will surface PERMISSION_REQUIRED when used — relay the returned instru
| Parameter | Type | Required | Notes |
|---|---|---|---|
| token | string | yes | The session token connect returned. Pass it on every call — it says which browser to drive. |
Reads a project's timeline structure: timelines (id, name, fps, resolution) with tracks and clips. THE USER CAN COPY A CLIP'S ID from the editor's right-click menu, so a bare UUID in their message names exactly one clip — call this with NO timelineId to search every timeline and match clip.id, rather than guessing from a name. Clips carry id, name, mediaRef, kind, startFrame, endFrame (exclusive
| Parameter | Type | Required | Notes |
|---|---|---|---|
| projectId | string | yes | Project id from get_projects. |
| timelineId | string | no | Optional single timeline to read. |
| token | string | yes | The session token connect returned. Pass it on every call — it says which browser to drive. |
Lists the project's media library: mediaRef (the id clips use), name, kind (video/audio/image), durationSeconds, resolution, and sceneSamples — timestamps (seconds) where the visual indexer detected distinct moments. sceneSamples is a ready-made shot map: inspect or cut at those times first. Each asset also carries visualIndex and transcript objects: {phase: 'ready'|'pending'|'queued'|'running'|'f
| Parameter | Type | Required | Notes |
|---|---|---|---|
| projectId | string | yes | Project id from get_projects. |
| token | string | yes | The session token connect returned. Pass it on every call — it says which browser to drive. |
Returns the word-level speech transcript of one media asset: language and words [{text, startSec, endSec}]. Only assets the user has transcribed have one — NOT_FOUND means ask the user to run Transcribe on the clip in Frapea. Use the timestamps to align cuts with what is being said.
| Parameter | Type | Required | Notes |
|---|---|---|---|
| projectId | string | yes | Project id from get_projects. |
| mediaRef | string | yes | Asset reference from get_media. |
| token | string | yes | The session token connect returned. Pass it on every call — it says which browser to drive. |
Creates a MOTION COMPOSITION — an animated graphic (infographic, title, promo end-card, chart…) written as a React TSX component. Read the 'motion' skill (read_skill {topic:'motion'}) for the exact API surface, available fonts/icons and golden examples before writing one. files maps file names to TSX source; the entry must export default the component. schema declares the editable props (type st
| Parameter | Type | Required | Notes |
|---|---|---|---|
| projectId | string | yes | Project id from get_projects. |
| name | string | yes | Display name, e.g. 'Pink promo end card'. |
| files | object | yes | File name → TSX source. Relative imports between them work. |
| entry | string | no | Entry file (default composition.tsx); must export default. |
| schema | object | no | Editable props: {key: {type, default, label?, min?, max?, options?, multiline?}}. type mediaRef makes a media-pool slot. |
| width | number | no | Composition width px (default 1920). |
| height | number | no | Composition height px (default 1080). |
| fps | number | no | Composition fps (default 30). |
| durationInFrames | number | no | Length in frames (default 150). |
| preview | boolean | no | Return one large frame (≤1560 px) with the reply. Media is not loaded in a preview: media slots draw empty and the reply says how many. |
| previewProps | object | no | Merged over the schema defaults for the preview picture only, e.g. {partsBoard:true}. Nothing saved changes. |
| previewFrame | number | no | Frame to preview (default 0). |
| token | string | yes | The session token connect returned. Pass it on every call — it says which browser to drive. |
Updates a motion composition's TSX files and/or manifest (name, duration, schema…). Same compile-and-test gate as create; files given here MERGE over the existing set. Every clip playing the composition re-renders. preview:true returns one large frame of the result with the reply.
| Parameter | Type | Required | Notes |
|---|---|---|---|
| projectId | string | yes | Project id from get_projects. |
| compositionId | string | yes | From create/list_motion_compositions. |
| files | object | no | File name → TSX source (merged). |
| name | string | no | — |
| schema | object | no | — |
| width | number | no | — |
| height | number | no | — |
| fps | number | no | — |
| durationInFrames | number | no | — |
| preview | boolean | no | Return one large frame (≤1560 px) with the reply. Media is not loaded in a preview: media slots draw empty and the reply says how many. |
| previewProps | object | no | Merged over the schema defaults for the preview picture only, e.g. {partsBoard:true}. Nothing saved changes. |
| previewFrame | number | no | Frame to preview (default 0). |
| token | string | yes | The session token connect returned. Pass it on every call — it says which browser to drive. |
Returns a motion composition's manifest and full TSX sources.
| Parameter | Type | Required | Notes |
|---|---|---|---|
| projectId | string | yes | Project id from get_projects. |
| compositionId | string | yes | Composition id. |
| token | string | yes | The session token connect returned. Pass it on every call — it says which browser to drive. |
Lists the project's motion compositions: id, mediaRef (for add_clips), name, size, fps, duration and the editable props schema.
| Parameter | Type | Required | Notes |
|---|---|---|---|
| projectId | string | yes | Project id from get_projects. |
| token | string | yes | The session token connect returned. Pass it on every call — it says which browser to drive. |
Creates a new timeline in the project and returns its id. Set fps, width and height for the target format (e.g. 1080×1920 @30 for a vertical short). The new timeline starts with one video and one audio track; spare tracks appear automatically as clips land.
| Parameter | Type | Required | Notes |
|---|---|---|---|
| projectId | string | yes | Project id from get_projects. |
| name | string | yes | Display name, e.g. 'TikTok short'. |
| fps | number | no | Optional frames per second (default 30). |
| width | number | no | Optional width in px (default 1920). |
| height | number | no | Optional height in px (default 1080). |
| token | string | yes | The session token connect returned. Pass it on every call — it says which browser to drive. |
Places media segments on a timeline. Each clip: mediaRef (from get_media, 'timeline:<id>' to NEST another timeline as a clip, 'solid:#rrggbb' , 'motion:<id>' for a MOTION composition (create_motion_composition) for a generated solid-colour matte, 'adjustment:' for an adjustment clip — no picture of its own, its effects/masks/opacity grade everything below it — or 'text:' for a title, restyled via
| Parameter | Type | Required | Notes |
|---|---|---|---|
| projectId | string | yes | Project id from get_projects. |
| timelineId | string | yes | Target timeline id from get_timeline. |
| clips | array | yes | [{mediaRef, atFrame, sourceInSec, sourceOutSec, trackId?}] — segments in playback order; trackId targets a specific track (default V1/A1). |
| token | string | yes | The session token connect returned. Pass it on every call — it says which browser to drive. |
Blades clips at a timeline frame. Splits every listed clip (and its linked partner) into two independent clips at atFrame. Frames are in the target timeline's fps. Use with get_timeline to find clip ids first.
| Parameter | Type | Required | Notes |
|---|---|---|---|
| projectId | string | yes | Project id from get_projects. |
| timelineId | string | yes | Timeline containing the clips. |
| clipIds | array | yes | Clip ids to split. |
| atFrame | number | yes | Timeline frame to cut at (must lie inside each clip). |
| token | string | yes | The session token connect returned. Pass it on every call — it says which browser to drive. |
Deletes clips (lift — leaves a gap). Linked partners are NOT removed automatically; pass both ids of a pair to delete it whole. To close the gap too, use ripple_delete_ranges instead.
| Parameter | Type | Required | Notes |
|---|---|---|---|
| projectId | string | yes | Project id from get_projects. |
| timelineId | string | yes | Timeline containing the clips. |
| clipIds | array | yes | Clip ids to delete. |
| token | string | yes | The session token connect returned. Pass it on every call — it says which browser to drive. |
Extracts [fromFrame, toFrame) on one track and shifts everything after it left to close the gap (sync-locked tracks follow). The go-to tool for tightening a cut or removing a bad take.
| Parameter | Type | Required | Notes |
|---|---|---|---|
| projectId | string | yes | Project id from get_projects. |
| timelineId | string | yes | Target timeline. |
| trackId | string | yes | Track id from get_timeline. |
| fromFrame | number | yes | Range start (inclusive). |
| toFrame | number | yes | Range end (exclusive). |
| token | string | yes | The session token connect returned. Pass it on every call — it says which browser to drive. |
Adjusts a clip. Only the provided fields change. Mix: volume (0–2, 1 = unity), fadeInFrames / fadeOutFrames (gain or opacity ramps at the edges). Look: opacity (0–1), blend (normal | multiply | screen | overlay | darken | lighten | color-dodge | color-burn | hard-light | soft-light | difference | exclusion | add), transform, crop and speed. transform.fit picks how the picture meets the frame befor
| Parameter | Type | Required | Notes |
|---|---|---|---|
| projectId | string | yes | Project id from get_projects. |
| timelineId | string | yes | Timeline containing the clip. |
| clipId | string | yes | Clip to modify. |
| volume | number | no | Optional new volume (0–2). |
| fadeInFrames | number | no | Optional fade-in length in frames. |
| fadeOutFrames | number | no | Optional fade-out length in frames. |
| opacity | number | no | Optional static opacity 0–1. |
| blend | string | no | Optional blend mode (see description). |
| transform | object | no | Optional partial transform; provided keys replace, others stay. |
| crop | object | no | Optional partial crop, fractions 0–1 of the SOURCE off each edge (the inspector shows source pixels). Crop is a window: it cuts pixels away without moving or re-fitting the picture; edges may meet (th |
| cropSoftness | number | no | Optional crop-edge feather, fraction of the source width 0–0.5 (the inspector shows source pixels). Keyframable as 'cropSoftness'. |
| cropRetain | boolean | no | Optional. True = Resolve's 'Retain Image Position': the crop window stays fixed in the frame while transforms move the picture underneath it. |
| dynamicZoom | object | no | Optional Ken Burns move (Resolve's Dynamic Zoom): animates the framing from start to end over the clip's WHOLE duration (retimes when the clip is trimmed). Rects: centre x/y as picture fractions ( |
| speed | object | no | Optional retiming (Resolve's Speed Change). rate 1 = 100 % (0.01–50); direction forward | reverse | freeze; freezeFrame = held source frame (offset from trim-in) while frozen; pitchCorrection keeps th |
| speedRipple | boolean | no | Ripple Timeline for this speed edit (see speed). |
| stabilization | object | no | Optional stabilization knobs (Resolve's Stabilization). The expensive motion tracking is a per-media analysis — run it with the stabilizer; these values post-process its cached path instantly. mode pe |
| denoise | object | no | AI voice denoise (dry/wet). Setting it (or enabling the section) queues the cached background render for the clip's source file. |
| lensDistortion | number | no | Optional Lens Correction Distortion, -1–1. Positive straightens wide-angle barrel distortion, negative adds it. 0 = none. |
| solidColor | string | no | Optional, solid-colour matte clips only: recolour the matte (#rrggbb). Mattes are created by add_clips/insert_clips with mediaRef 'solid:#rrggbb'. |
| bypass | object | no | Optional section switches, true = section OFF (its values are kept but not applied) — the inspector's per-section toggles. |
Generates animated captions from a spoken clip's transcript (the same generator as Frapea's UI): transcript words group into caption text clips over the clip's span, word-timed so the animation follows speech. One undo, and they share a captionGroupId — restyle them all via set_clip_properties with text.wholeCaptionGroup. Needs a transcript (get_transcript tells you). Returns the created clip ids.
| Parameter | Type | Required | Notes |
|---|---|---|---|
| projectId | string | yes | Project id from get_projects. |
| timelineId | string | yes | Timeline containing the spoken clip. |
| clipId | string | yes | The spoken clip to caption. |
| preset | string | no | Style preset: clean (default) | boldPop | karaoke | highlight | minimal | editorial. |
| position | string | no | bottom (default) | top. |
| textCase | string | no | original (default) | upper | lower. |
| censorProfanity | boolean | no | Star out profane words. |
| maxWordsPerCaption | number | no | Words per caption before a new one starts (default 4). |
| token | string | yes | The session token connect returned. Pass it on every call — it says which browser to drive. |
Edits a clip's effect stack (ordered, per-effect enable). action: 'add' (type; returns the new effect's id) | 'remove' (effectId) | 'move' (effectId + toIndex — the order IS the render order) | 'toggle' (effectId + enabled) | 'set' (effectId + params patch, clamped to the effect's ranges) | 'curve' (effectId + curve + points). Types: 'colorBasic' (Lumetri Basic Correction-compatible: temperature/t
| Parameter | Type | Required | Notes |
|---|---|---|---|
| projectId | string | yes | Project id from get_projects. |
| timelineId | string | yes | Target timeline. |
| clipId | string | yes | Target clip. |
| action | string | yes | add | remove | move | toggle | set | curve |
| curve | string | no | For 'curve': which curve to replace. 'curves' effect: master|r|g|b (tone, identity = [0,0,1,1]); 'hueCurves': hueHue|hueSat|hueLum (x = hue with red at 0, y 0.5 = untouched). |
| points | array | no | For 'curve': flat control points [x0,y0,x1,y1,…] in the unit square. |
| type | string | no | Effect type for 'add'. |
| effectId | string | no | Effect instance id (from a previous add or get_timeline). |
| toIndex | number | no | Target position for 'move' (0 = applied first). |
| enabled | boolean | no | For 'toggle'. |
| params | object | no | For 'set': partial param patch, e.g. { exposure: 1.5 }. |
| resource | string | no | For 'set' on resource effects ('lut'): the LUT's library name (a .cube imported into the project). Empty string clears it. |
| token | string | yes | The session token connect returned. Pass it on every call — it says which browser to drive. |
Transitions on a track's cuts OR lone clip edges (a free head/tail takes a single-sided fade from/to nothing; its alignment is forced). action: 'add' (trackId + atFrame = the cut where one clip ends and the next starts, + type; optional durationFrames (default 30, clamped to the clips' source handles), alignment centered|start|end, params) | 'remove' (transitionId) | 'update' (transitionId + any o
| Parameter | Type | Required | Notes |
|---|---|---|---|
| projectId | string | yes | Project id from get_projects. |
| timelineId | string | yes | Target timeline. |
| trackId | string | yes | Track owning the cut (get_timeline). |
| action | string | yes | add | remove | update |
| atFrame | number | no | The cut frame for 'add'. |
| type | string | no | Transition type. |
| transitionId | string | no | Existing transition id. |
| durationFrames | number | no | — |
| alignment | string | no | centered | start | end |
| params | object | no | Type params patch (e.g. { angle: 90 }). |
| token | string | yes | The session token connect returned. Pass it on every call — it says which browser to drive. |
Track operations on a timeline. action: 'mute' | 'unmute' | 'solo' | 'unsolo' (audio only; any solo silences non-solo tracks) | 'hide' | 'show' | 'rename' (needs name) | 'duck' | 'unduck' (audio only: dip this track under speech detected on the other audio tracks — transcript word timings when available, energy VAD otherwise) | 'merge' (needs intoTrackId: moves every clip of trackId onto another t
| Parameter | Type | Required | Notes |
|---|---|---|---|
| projectId | string | yes | Project id from get_projects. |
| timelineId | string | yes | Target timeline. |
| trackId | string | no | Track to modify. Required for every action except 'tidy'. |
| action | string | yes | mute | unmute | solo | unsolo | hide | show | rename | duck | unduck | merge | delete | tidy |
| name | string | no | New name (rename only). |
| intoTrackId | string | no | Destination track (merge only) — same kind as trackId. |
| token | string | yes | The session token connect returned. Pass it on every call — it says which browser to drive. |
MULTICAM angle switch. The angles are ordinary video tracks stacked over each other (sync them beforehand — clips of the same take on V1..Vn); this razors the whole angle stack at atFrame and keeps only chosenTrackId live from there to the next cut — the other angles' clips are DISABLED, not deleted, so every switch stays re-decidable (cut again with a different angle to change your mind). Lin
| Parameter | Type | Required | Notes |
|---|---|---|---|
| projectId | string | yes | Project id from get_projects. |
| timelineId | string | yes | Target timeline. |
| atFrame | number | yes | The switch point (timeline frame). |
| chosenTrackId | string | yes | The angle to show from atFrame on. |
| angleTrackIds | array | no | Optional explicit angle set (video track ids). |
| audioFollowsVideo | boolean | no | Default true: linked audio toggles with its angle. |
| token | string | yes | The session token connect returned. Pass it on every call — it says which browser to drive. |
Moves clips to new positions (linked partners follow automatically). Each move: clipId, toStartFrame, optional toTrackId (same-kind track). Overwrite semantics — landing on another clip trims it like a drag-drop.
| Parameter | Type | Required | Notes |
|---|---|---|---|
| projectId | string | yes | Project id from get_projects. |
| timelineId | string | yes | Target timeline. |
| moves | array | yes | [{clipId, toStartFrame, toTrackId?}] |
| token | string | yes | The session token connect returned. Pass it on every call — it says which browser to drive. |
Sets which timeline the project opens on (and what the user sees if the editor is open). Purely a convenience — every tool here takes an explicit timelineId regardless.
| Parameter | Type | Required | Notes |
|---|---|---|---|
| projectId | string | yes | Project id from get_projects. |
| timelineId | string | yes | Timeline to activate. |
| token | string | yes | The session token connect returned. Pass it on every call — it says which browser to drive. |
Updates a timeline's fps / width / height (clips keep their timing; content re-fits) and/or renames it. Only provided fields change.
| Parameter | Type | Required | Notes |
|---|---|---|---|
| projectId | string | yes | Project id from get_projects. |
| timelineId | string | yes | Timeline to update. |
| name | string | no | Optional new display name. |
| fps | number | no | Optional new frames per second. |
| width | number | no | Optional new width in px. |
| height | number | no | Optional new height in px. |
| token | string | yes | The session token connect returned. Pass it on every call — it says which browser to drive. |
Semantic search over the project's media. Visual scope matches what is IN the picture (describe a shot: 'aerial city at night'); spoken scope matches transcribed speech (exact words, ranked first, with a snippet). Hits: {mediaRef, timeSec (best moment), fromSec, toSec, score, scope}. Requires the user to have downloaded the picture analyzer — otherwise PERMISSION_REQUIRED tells you what to relay.
| Parameter | Type | Required | Notes |
|---|---|---|---|
| projectId | string | yes | Project id from get_projects. |
| query | string | yes | What to look for — plain language. |
| token | string | yes | The session token connect returned. Pass it on every call — it says which browser to drive. |
Text-based editing: cuts the given transcript words OUT of a clip as ripple deletes (everything after each cut shifts left). wordIndices are positions in get_transcript's words array for the clip's media. Contiguous indices merge into single cuts. The go-to tool for removing filler words or tightening an interview.
| Parameter | Type | Required | Notes |
|---|---|---|---|
| projectId | string | yes | Project id from get_projects. |
| timelineId | string | yes | Timeline containing the clip. |
| clipId | string | yes | The clip whose speech is being edited. |
| wordIndices | array | yes | Indices into get_transcript words, e.g. [4,5,6,12]. |
| token | string | yes | The session token connect returned. Pass it on every call — it says which browser to drive. |
Cuts silent gaps inside a clip: any pause between transcribed words longer than minGapSec becomes a ripple delete (a small margin is kept so speech never clips). Typical minGapSec: 0.6 tight, 1.0 balanced, 1.5 loose.
| Parameter | Type | Required | Notes |
|---|---|---|---|
| projectId | string | yes | Project id from get_projects. |
| timelineId | string | yes | Timeline containing the clip. |
| clipId | string | yes | The clip to tighten. |
| minGapSec | number | yes | Minimum pause length to cut (seconds). |
| token | string | yes | The session token connect returned. Pass it on every call — it says which browser to drive. |
Reverts the most recent edit THIS agent session made to the project (one step per call; repeat to go further). Cannot revert other tabs' or the user's edits.
| Parameter | Type | Required | Notes |
|---|---|---|---|
| projectId | string | yes | Project id from get_projects. |
| token | string | yes | The session token connect returned. Pass it on every call — it says which browser to drive. |
Looks INSIDE a source asset. Returns ONE contact sheet — every requested moment as a labelled cell in a single grid image — plus a per-cell fingerprint. Pass atSec (max 12 timestamps, seconds); combine with get_media's sceneSamples for an instant storyboard of the whole file. Shows the RAW source; use inspect_timeline for the composed cut. START WITH pixels:false WHEN YOU ARE ONLY CHECKING FOR EMP
| Parameter | Type | Required | Notes |
|---|---|---|---|
| projectId | string | yes | Project id from get_projects. |
| mediaRef | string | yes | Asset from get_media. |
| atSec | array | yes | Timestamps in seconds, max 12. |
| pixels | boolean | no | False = fingerprints only, no image (default true). |
| columns | number | no | Grid columns (default 3, or one row if ≤3). |
| cellHeight | number | no | Target px height per cell (default 300). Shrunk automatically if the sheet would exceed the response budget — the reply says so when that happens. |
| token | string | yes | The session token connect returned. Pass it on every call — it says which browser to drive. |
WATCHES the cut. Composites every video layer at each requested frame and returns ONE contact sheet — the frames as labelled cells of a single grid image — plus, per cell, the visibleClipIds that contributed pixels and a fingerprint. Pass frames (timeline frame numbers, max 12). Use after every edit: this is the only tool that shows what actually PLAYS, as opposed to what get_timeline says is arra
| Parameter | Type | Required | Notes |
|---|---|---|---|
| projectId | string | yes | Project id from get_projects. |
| timelineId | string | yes | Timeline to render. |
| frames | array | yes | Timeline frame numbers, max 12. |
| pixels | boolean | no | False = structure + fingerprints only, no image (default true). |
| columns | number | no | Grid columns (default 3, or one row if ≤3). |
| cellHeight | number | no | Target px height per cell (default 300). Shrunk automatically if the sheet would exceed the response budget — the reply says so when that happens. |
| token | string | yes | The session token connect returned. Pass it on every call — it says which browser to drive. |
What has gone WRONG in the user's editor — renders that failed or stopped, footage that would not decode, chunks that could not be prepared for playback, exports that failed — each with WHERE (the timeline and frames, the source and its own frames, the footage and frame the engine could not decode) and the reason in the engine's own words. You also hear about new problems for free: every other too
| Parameter | Type | Required | Notes |
|---|---|---|---|
| projectId | string | no | Project id from get_projects. Omit for every project in this browser. |
| includeResolved | boolean | no | Also list problems that are no longer open (default false). |
| detail | boolean | no | Include the engine's raw diagnostic text per problem (default false — it can be long). |
| token | string | yes | The session token connect returned. Pass it on every call — it says which browser to drive. |
Prepare a BUG REPORT for the user: it opens in Frapea (Problems → Create bug report) for them to read and save. The report itself is NOT returned to you — it would leave the user's machine before they have seen it. You get a summary: open problems, media counts, and how many of the user's own words remain in composition code. It contains versions, problems with engine details, the project's struct
| Parameter | Type | Required | Notes |
|---|---|---|---|
| projectId | string | yes | Project id from get_projects (must be open in the editor). |
| timelineIds | array | no | Only these timelines and the timelines they nest (default: all). |
| token | string | yes | The session token connect returned. Pass it on every call — it says which browser to drive. |
RENDER a timeline the way an export would and report what does not work — call it before you call any timeline done. inspect_timeline shows a few frames through the preview path, which quietly substitutes a nearby picture where a frame cannot be rendered; this renders every motion segment the timeline reads (through every nested timeline) exactly, then composites every frame with every layer (foot
| Parameter | Type | Required | Notes |
|---|---|---|---|
| projectId | string | yes | Project id from get_projects. |
| timelineId | string | yes | Timeline to verify (nested timelines inside it are verified too). |
| cancel | boolean | no | Stop the verification of this timeline that is running. |
| token | string | yes | The session token connect returned. Pass it on every call — it says which browser to drive. |
Ripple-inserts media segments: everything at/after atFrame shifts right to make room (clips under the cut split). Same clip shape as add_clips. Use to splice a shot INTO an existing sequence without overwriting.
| Parameter | Type | Required | Notes |
|---|---|---|---|
| projectId | string | yes | Project id from get_projects. |
| timelineId | string | yes | Target timeline. |
| atFrame | number | yes | Insertion point (timeline frame). |
| clips | array | yes | [{mediaRef, sourceInSec, sourceOutSec}] |
| token | string | yes | The session token connect returned. Pass it on every call — it says which browser to drive. |
Pool file operations. action: 'rename' renames the real file on disk (needs newName; clips referencing the old name go offline). 'delete' UNLINKS the file from the media pool — the real file on disk is NOT touched; clips using it go offline until it is added again.
| Parameter | Type | Required | Notes |
|---|---|---|---|
| projectId | string | yes | Project id from get_projects. |
| mediaRef | string | yes | Asset from get_media. |
| action | string | yes | rename | delete |
| newName | string | no | New file name incl. extension (rename). |
| token | string | yes | The session token connect returned. Pass it on every call — it says which browser to drive. |
Returns Frapea's agent guide: editing conventions, tool workflow tips, the current feature surface, and the CREATIVE MANDATE — how far to run with a terse brief (source stock footage, sounds, voiceover, motion graphics and deliver a finished video vs. when to hand control back to the user). Read once at the start of an editing session. MOTION topics: 'motion' is the API surface (imports, fonts, pr
| Parameter | Type | Required | Notes |
|---|---|---|---|
| topic | string | no | Optional. Motion: motion | motion-examples | motion-craft | motion-text | motion-effects | motion-transitions | motion-sound | motion-review. Craft: core | shorts | longform | podcast | tutorial | mon |
| token | string | yes | The session token connect returned. Pass it on every call — it says which browser to drive. |
Waits (up to ~45 s per call) for the user to resolve a pending Frapea prompt — e.g. the folder-permission dialog another tool just opened. The user cannot see tool calls: BEFORE waiting, always say in your visible reply what to click in the Frapea tab, or they will never know they must act. Returns {status: 'granted' | 'denied' | 'pending'}. On 'pending', repeat the instruction and call again; on
| Parameter | Type | Required | Notes |
|---|---|---|---|
| actionId | string | yes | The actionId a previous tool returned. |
| token | string | yes | The session token connect returned. Pass it on every call — it says which browser to drive. |
Navigates the user's Frapea tab to a project so they can WATCH the edit live. Not required for editing — every tool works headlessly; use this for show-your-work moments.
| Parameter | Type | Required | Notes |
|---|---|---|---|
| projectId | string | yes | Project id from get_projects. |
| token | string | yes | The session token connect returned. Pass it on every call — it says which browser to drive. |
Navigates the user's Frapea tab back to the project manager and releases this session's headless runtime for the project.
| Parameter | Type | Required | Notes |
|---|---|---|---|
| projectId | string | yes | Project id from get_projects. |
| token | string | yes | The session token connect returned. Pass it on every call — it says which browser to drive. |
Creates a project. By default it is created in the browser's own storage, which needs no permission and no click: the project id comes back immediately and you can start working. The user can turn it into a real folder on their disk whenever they want (Cmd/Ctrl+S, or File → Save to a Folder) without losing anything. Pass storage:'folder' only when the user asked for a folder up front — that needs
| Parameter | Type | Required | Notes |
|---|---|---|---|
| name | string | yes | Project name, e.g. from the user's brief. |
| storage | string | no | Where the project lives. 'browser' (default) needs no user action. 'folder' asks the user to pick a directory on their disk. |
| token | string | yes | The session token connect returned. Pass it on every call — it says which browser to drive. |
Asks the user to attach a folder of THEIR OWN source footage to the project — opens a dialog in Frapea with a 'Connect folder' button. Only a human can do this (browser security gesture): tell the user IN YOUR REPLY to click it, then call await_user_action with the returned actionId; on 'granted', get_media will list the folder's files. Use when get_media comes back empty and the user has footage
| Parameter | Type | Required | Notes |
|---|---|---|---|
| projectId | string | yes | Project id from get_projects. |
| reason | string | yes | One or two sentences for the dialog, addressed to the user: which folder to pick and why — e.g. 'Pick the folder with your trip clips from Lisbon, so I can cut them into the reel you asked for.' |
| token | string | yes | The session token connect returned. Pass it on every call — it says which browser to drive. |
Adjusts one edge of a clip (linked A/V partners follow). edge: 'start' trims/extends the in-point, 'end' the out-point. deltaFrames > 0 moves the edge right, < 0 left — e.g. edge 'end', delta -12 shortens the clip by 12 frames. Extending is limited by the source material.
| Parameter | Type | Required | Notes |
|---|---|---|---|
| projectId | string | yes | Project id from get_projects. |
| timelineId | string | yes | Timeline containing the clip. |
| clipId | string | yes | Clip to trim. |
| edge | string | yes | start | end |
| deltaFrames | number | yes | Signed frame delta for that edge. |
| token | string | yes | The session token connect returned. Pass it on every call — it says which browser to drive. |
How far the project's media analysis has got. Analysis runs BY ITSELF whenever media is connected — never start it. Returns percent (0-100) — which reaching 100 only means nothing is OUTSTANDING, so always read failed beside it and call retry_analysis on anything that failed — done/total/pending item counts, runningItem {mediaRef, kind, progress}, etaSeconds (null until something has finished),
| Parameter | Type | Required | Notes |
|---|---|---|---|
| projectId | string | yes | Project id from get_projects. |
| token | string | yes | The session token connect returned. Pass it on every call — it says which browser to drive. |
Asks the user to enable Frapea's on-device AI analyzers (picture search, speech). Opens a dialog in every Frapea tab and returns an actionId — tell the user IN YOUR REPLY to confirm it, then call await_user_action and poll get_analysis_status until models are enabled. Call this when get_media reports 'needs-models'.
| Parameter | Type | Required | Notes |
|---|---|---|---|
| projectId | string | yes | Project the work belongs to. |
| token | string | yes | The session token connect returned. Pass it on every call — it says which browser to drive. |
Indexes the project's pictures for search_media. Usually not needed: indexing is automatic and this only nudges the queue to re-check now. When the user switched automatic indexing off, this asks for every video and image to be indexed. Returns the same payload as get_analysis_status.
| Parameter | Type | Required | Notes |
|---|---|---|---|
| projectId | string | yes | Project id from get_projects. |
| token | string | yes | The session token connect returned. Pass it on every call — it says which browser to drive. |
Transcribes one asset even if automatic transcription is switched off. Speech transcripts otherwise appear on their own. Returns the project's analysis status; poll get_analysis_status, then read get_transcript.
| Parameter | Type | Required | Notes |
|---|---|---|---|
| projectId | string | yes | Project id from get_projects. |
| mediaRef | string | yes | Asset from get_media. |
| token | string | yes | The session token connect returned. Pass it on every call — it says which browser to drive. |
Status of a background job started by a job-returning tool (generate_voiceover, verify_timeline): {state: queued|running|done|failed, progress: 0-1, detail, ...result fields such as mediaRef when done; verify_timeline puts its report in result}. Poll every few seconds while state is 'queued' or 'running' (queued = waiting for the analysis master tab, which loads the models once for the whole bro
| Parameter | Type | Required | Notes |
|---|---|---|---|
| jobId | string | yes | Id returned by the start_* tool. |
| token | string | yes | The session token connect returned. Pass it on every call — it says which browser to drive. |
The text-to-speech providers Frapea can generate voiceovers with. Returns providers[]: the FREE in-browser models straight from the TTS registry ({id, label, languages, voices: [{id, label, language, gender, grade}], modelAssets, state: {phase: needs-download|downloading|ready|error}}), plus the PREMIUM cloud provider flagged premium: true ({id: 'elevenlabs', label, premium, voices: [{id, label}],
| Parameter | Type | Required | Notes |
|---|---|---|---|
| token | string | yes | The session token connect returned. Pass it on every call — it says which browser to drive. |
Generates an AI voiceover from a script, entirely on-device. The WAV lands in the project's media library as a normal audio asset (with waveform and analysis), the script is stored as asset metadata, and a script-corrected word-level transcript is written so captions work immediately. CALL THIS BEFORE YOU CUT THE PICTURE. A script does not tell you how long it takes to SAY, so a narrated edit asse
| Parameter | Type | Required | Notes |
|---|---|---|---|
| projectId | string | yes | Project id from get_projects. |
| text | string | yes | The script to speak (multi-line ok). |
| provider | string | no | TTS provider id from list_voiceover_models (default 'kokoro'; 'elevenlabs' = premium, needs the user's key + consent). |
| voice | string | no | Voice id from the provider's manifest (default: its first voice for the chosen language). |
| language | string | no | Language tag from the provider's manifest (e.g. 'en-us'). Ignored for ElevenLabs — its voices are multilingual. |
| speed | number | no | Speaking rate multiplier (default 1). Local providers accept 0.5–2; ElevenLabs 0.7–1.2. |
| modelId | string | no | ElevenLabs only: TTS model id from list_voiceover_models (default 'eleven_multilingual_v2'; turbo/flash cost half). Check the model's supportsAudioTags before writing [calm]-style tags into the text — |
| voiceSettings | object | no | ElevenLabs only: voice knobs, each optional. stability, similarityBoost and style are 0–1; speakerBoost is a boolean. |
| consentActionId | string | no | The actionId from a CONSENT_REQUIRED refusal, after await_user_action returned 'granted'. Good for one job. |
| fileName | string | no | Optional base name for the audio file written into media/. |
| token | string | yes | The session token connect returned. Pass it on every call — it says which browser to drive. |
Searches the Pexels stock library (photos or videos) with the user's connected API key. Returns items with id, dimensions, duration (videos), author, thumbnail url, available video qualities, and a downloaded flag telling whether the asset is already in the project's media pool. If no key is connected the tool errors — TELL THE USER to open Library → Generators → Stock Library and connect their
| Parameter | Type | Required | Notes |
|---|---|---|---|
| projectId | string | yes | Project id from get_projects. |
| kind | string | yes | photos | videos |
| query | string | no | Search phrase; empty = curated/popular feed. |
| orientation | string | no | Optional: landscape | portrait | square |
| size | string | no | Optional: large | medium | small |
| color | string | no | Optional, photos only: a Pexels color name. |
| page | number | no | 1-based page, 40 items per page. |
| token | string | yes | The session token connect returned. Pass it on every call — it says which browser to drive. |
Downloads one Pexels asset into the project's media pool as a virtual file at the Library root (name pexels-<id>.jpg|.mp4). Asynchronous: the first call accepts the download and returns its state; CALL AGAIN with the same arguments to poll — state becomes 'done' with the asset's mediaRef, ready for add_clips. maxHeight picks the best video rendition not exceeding it (default: the best available)
| Parameter | Type | Required | Notes |
|---|---|---|---|
| projectId | string | yes | Project id from get_projects. |
| kind | string | yes | photo | video |
| pexelsId | number | yes | The item id from search_stock_media. |
| maxHeight | number | no | Videos only: cap the rendition height (e.g. 1080). |
| token | string | yes | The session token connect returned. Pass it on every call — it says which browser to drive. |
Searches the Freesound library (SFX, ambience, foley) with the user's connected API key. Every item carries what you need to JUDGE the sound without hearing it: the uploader's full description, tags, duration, community rating and download count, format/samplerate, and — when analyzed — AudioCommons descriptors (acAnalysis: ac_loudness LUFS, ac_dynamic_range, ac_tempo, ac_tonality, ac_single_event
| Parameter | Type | Required | Notes |
|---|---|---|---|
| projectId | string | yes | Project id from get_projects. |
| query | string | yes | Search phrase (e.g. 'door slam', 'jungle ambience'). |
| minDurationSeconds | number | no | Optional lower duration bound. |
| maxDurationSeconds | number | no | Optional upper duration bound. |
| license | string | no | Optional: cc0 | by | by-nc |
| sort | string | no | Optional: score (default) | rating_desc | downloads_desc | created_desc |
| page | number | no | 1-based page, 40 items per page. |
| token | string | yes | The session token connect returned. Pass it on every call — it says which browser to drive. |
Downloads one Freesound sound (its HQ MP3 preview, ~128 kbps — plenty for SFX/ambience) into the project's media pool as a virtual file at the Library root (name freesound-<id>.mp3). Asynchronous: the first call accepts the download and returns its state; CALL AGAIN with the same arguments to poll — state becomes 'done' with the asset's mediaRef, ready for add_clips onto an audio track. Three fi
| Parameter | Type | Required | Notes |
|---|---|---|---|
| projectId | string | yes | Project id from get_projects. |
| soundId | number | yes | The sound id from search_sounds. |
| token | string | yes | The session token connect returned. Pass it on every call — it says which browser to drive. |
frapea's BUILT-IN sound-effects pack — synthesized, licence-free, no API key, no download wait. Reach for this FIRST; use search_sounds only for something the pack does not cover (ambience, foley, a specific real-world object). Call with no ids to get the catalogue: each sound carries what it sounds like AND when to use it. Call with ids to copy them into the project's media pool as `sfx-<id>.
| Parameter | Type | Required | Notes |
|---|---|---|---|
| projectId | string | yes | Project id from get_projects. |
| ids | array | no | Sound ids to add (e.g. ['whip','thump','ding']). Omit to list the pack. |
| id | string | no | Convenience: a single sound id. |
| token | string | yes | The session token connect returned. Pass it on every call — it says which browser to drive. |
Full control of the background work queue. action 'list' returns every queued/running item across all projects (analyses, proxies, beats) plus the visible task rows (downloads, voiceover jobs, failures) with a cancellable flag. action 'cancel' stops ONE kind of work for ONE asset — queued or already running (a running visual index stops at the next sample and keeps its checkpoint). The asset then
| Parameter | Type | Required | Notes |
|---|---|---|---|
| action | string | yes | list | cancel |
| projectId | string | no | cancel only: project id from get_projects. |
| mediaRef | string | no | cancel only: asset from get_media. |
| kind | string | no | cancel only: index | transcribe | stabilize | denoise | proxy | beats |
| token | string | yes | The session token connect returned. Pass it on every call — it says which browser to drive. |
Runs ONE analysis of ONE asset again — picture indexing or speech transcription — clearing whatever failure was recorded for it. Use when get_media shows phase 'failed' and the error looks worth another go, or when you want a fresh result for a file that changed meaning. Returns the project's analysis status.
| Parameter | Type | Required | Notes |
|---|---|---|---|
| projectId | string | yes | Project id from get_projects. |
| mediaRef | string | yes | Asset from get_media. |
| kind | string | yes | index | transcribe |
| token | string | yes | The session token connect returned. Pass it on every call — it says which browser to drive. |
Animates one clip property. property: opacity | volume | positionX | positionY | scaleX | scaleY | rotationDeg | pitch | yaw | anchorX | anchorY | cropLeft | cropTop | cropRight | cropBottom | cropSoftness. Keyframes are stamped in SOURCE frames (frames into the media, i.e. timelineFrame - startFrame + trimStartFrame), so they survive moves and trims. action 'set' (default) upserts the given keyfr
| Parameter | Type | Required | Notes |
|---|---|---|---|
| projectId | string | yes | Project id from get_projects. |
| timelineId | string | yes | Timeline containing the clip. |
| clipId | string | yes | Clip to animate. |
| action | string | no | set | remove | clear (default set). |
| effectId | string | no | Animate an EFFECT param instead of a clip property: the effect instance id (from manage_effects add / get_timeline). Use with param; property is then ignored. |
| param | string | no | The effect param key to animate (e.g. 'exposure'). |
| property | string | no | Animatable property (see description). |
| keyframes | array | no | For 'set': keyframes to add or replace. |
| atSourceFrames | array | no | For 'remove': source frames whose keyframes to delete. |
| token | string | yes | The session token connect returned. Pass it on every call — it says which browser to drive. |
Arranges clips into a screen layout by writing ordinary transform + crop values (first clipId → first cell). layout: full | side-by-side | top-bottom | pip-top-left | pip-top-right | pip-bottom-left | pip-bottom-right | grid-2x2 | main-sidebar | three-up. mode 'fit' letterboxes each source in its cell, 'cover' fills the cell and crops the overflow (bias 0–1 picks the surviving part; 0.5/0.5 = cent
| Parameter | Type | Required | Notes |
|---|---|---|---|
| projectId | string | yes | Project id from get_projects. |
| timelineId | string | yes | Timeline containing the clips. |
| clipIds | array | yes | Clips to arrange, in cell order. |
| layout | string | yes | Layout id (see description). |
| mode | string | no | fit | cover (default fit). |
| bias | object | no | Cover-crop bias 0–1 per axis (default 0.5/0.5). |
| token | string | yes | The session token connect returned. Pass it on every call — it says which browser to drive. |
Finds every FACE in a video clip and stores one independent path per person — position, size and head rotation (nod/turn/tilt) per frame. Queued, not immediate: poll list_face_tracks until state is 'ready'. Re-running on the same clip REPLACES its previous run and keeps the same trackId, so clips already bound stay bound. A person who leaves the shot and returns much later becomes a SECOND face on
| Parameter | Type | Required | Notes |
|---|---|---|---|
| projectId | string | yes | Project id from get_projects. |
| clipId | string | yes | The video clip to scan, from get_timeline. |
| name | string | no | Display name for the run. |
| scoreThreshold | number | no | Detection confidence floor, 0.3–0.95 (default 0.6). |
| holdSeconds | number | no | How long a vanished face is still 'the same face' when it comes back (default 1). |
| travelFaces | number | no | How far it may reappear from where it vanished, in face widths (default 0.8). |
| token | string | yes | The session token connect returned. Pass it on every call — it says which browser to drive. |
Lists face-tracking runs and the people each one found: faceId, name, frame range, how many frames it was actually visible for, and how many gaps it has. Sample data is deliberately not returned. Use this to poll a queued run and to pick a faceId for bind_face.
| Parameter | Type | Required | Notes |
|---|---|---|---|
| projectId | string | yes | Project id from get_projects. |
| clipId | string | no | Only runs made from this clip. |
| token | string | yes | The session token connect returned. Pass it on every call — it says which browser to drive. |
Joins two or more faces from one run into a single person — for somebody who walked out of the shot and came back. REFUSED when any two of them appear on the same frame, since they cannot then be one person. The earliest face's id and name survive, so existing bindings keep working, and the time between sightings stays a gap for the clip's gap policy to handle.
| Parameter | Type | Required | Notes |
|---|---|---|---|
| projectId | string | yes | Project id from get_projects. |
| trackId | string | yes | The run, from list_face_tracks. |
| faceIds | array | yes | Two or more faceIds within that run. |
| token | string | yes | The session token connect returned. Pass it on every call — it says which browser to drive. |
Makes a clip FOLLOW a tracked face — the way to stick a mask, label or blur onto somebody's head. Movement is relative to where the face was first seen, so the clip keeps the framing it already had and only inherits the motion. Pick what to copy with channels, and what happens while the face is missing with gap. Pass trackId: null to unbind.
| Parameter | Type | Required | Notes |
|---|---|---|---|
| projectId | string | yes | Project id from get_projects. |
| clipId | string | yes | The clip that should follow the face. |
| trackId | string | no | The run; null unbinds this clip. |
| faceId | string | no | Which person in that run. |
| channels | object | no | What to copy: {position, scale, pitch, yaw, roll} booleans. Default position and scale on, the three rotations off. |
| gap | string | no | While the face is missing: 'hold' stays put then jumps, 'hide' disappears, 'glide' travels smoothly to where it reappears. One of: hold | hide | glide. |
| maxGlideSeconds | number | no | Longest gap 'glide' will cross before hiding instead (default 1.8). |
| smooth | number | no | Jitter filtering 0–1 (default 0.25). |
| token | string | yes | The session token connect returned. Pass it on every call — it says which browser to drive. |
THE MEDIA POOL'S SHAPE — bins (the pool's folders) and what sits in them. Use it to tidy a project: group the footage, the voice-over, the music and the graphics instead of leaving eighty files at the root. Bins are VIRTUAL and live in the project, not on disk. Moving an item between bins NEVER touches the file or its mediaRef, so it cannot break a clip's link or make the app ask the user to reloc
| Parameter | Type | Required | Notes |
|---|---|---|---|
| projectId | string | yes | Project id from get_projects. |
| action | string | yes | list | create_bin | rename_bin | move_bin | delete_bin | move_items |
| binId | string | no | Target bin (rename/move/delete). |
| toBinId | string | no | Destination bin for move_bin / move_items. Omit or '' = Library root. |
| parentBinId | string | no | Parent for create_bin. Omit or '' = Library root. |
| name | string | no | Bin name (create_bin, rename_bin). |
| itemKeys | array | no | move_items: mediaRefs / 'timeline:<id>' / 'motion:<id>' to move together. |
| token | string | yes | The session token connect returned. Pass it on every call — it says which browser to drive. |
- Every tool — any call limit is its publisher’s, not ours
- No card, and mcprush charges nothing for it
- Runs at its publisher’s own address — this marketplace is not in the path
- Nothing to cap, because mcprush bills nothing
What counts against your monthly calls
| Tool | Unit | Calls used | Out of the allowance |
|---|
Nothing here is billable: mcprush charges nothing to install Frapea or to call it, at any volume.
Two independent axes, because powerful and malicious are different questions. The grade is threat only. The capability level is blast radius, and it is never a penalty on the grade — it is priced as one subtract-only term in the score, where you can see it.
This listing is an address its publisher runs, and you connect to it directly — this marketplace is not in the path. The scanner reads packages and public source, and an address is neither. So there is no grade — not a withheld one, an unmeasured one.
Release history
This is an address its publisher runs: which release it serves is theirs to choose, so there is nothing here to pin. The history below is for reading; the current release on file is 0.2.0.
No release note was published with this version.
One review per account, from a signed-in account that does not publish this listing. Nothing else is asked — you can say what you think before you install it. Publishers can reply once per review, and a review can be edited or deleted by whoever wrote it.
Any signed-in account that does not publish Frapea can review it, once — before installing it or after. A review from an account that has installed it is marked as one.
Nobody has reviewed this listing. The rating on the card is the mean of the reviews written here and nothing else, so there is no rating until somebody writes the first — which takes a signed-in account that does not publish it, and nothing else.