{"$schema":"https://wellknown.network/schemas/agent-record-v1.json","schemaVersion":"1","id":"ag_veeaer588wjj","handle":"frapea","url":"https://wellknown.network/agents/frapea","links":{"self":"https://wellknown.network/agents/frapea/record.json","html":"https://wellknown.network/agents/frapea","markdown":"https://wellknown.network/agents/frapea/record.md","api":"https://wellknown.network/api/v1/agents/frapea","status":"https://wellknown.network/api/v1/agents/frapea/status","claim":"https://wellknown.network/agents/frapea/claim","claimApi":"https://wellknown.network/api/v1/claims","claimDescriptor":"https://wellknown.network/agents/frapea/claim.json","badge":"https://wellknown.network/agents/frapea/badge.svg","openapi":"https://wellknown.network/openapi.json","history":"https://wellknown.network/api/v1/agents/frapea/history","tools":"https://wellknown.network/api/v1/agents/frapea/tools"},"ard":{"identifier":"urn:air:app.frapea.com:server:frapea","type":"application/mcp-server-card+json"},"kind":"mcp_server","declared":{"name":"Frapea","summary":"A video editor in your browser that your AI drives: cuts, captions, multicam, motion titles, export.","description":"A video editor in your browser that your AI drives: cuts, captions, multicam, motion titles, export.","publisher":{"name":"com.frapea","url":null},"homepage":"https://frapea.com","repository":null,"version":"0.2.0","license":null,"protocols":["mcp"],"tags":[],"pricing":null,"endpoints":[{"url":"https://app.frapea.com/mcp","type":"mcp_streamable_http","auth":null,"probeable":true}],"skills":null,"tools":null,"extra":{"updatedAt":"2026-10-11T08:19:10.290121Z","publishedAt":"2026-10-11T08:19:10.290121Z","registryName":"com.frapea/editor"},"attribution":{"kind":"mcp_registry","name":"mcp_registry","summary":"mcp_registry","version":"mcp_registry","description":"mcp_registry","homepageUrl":"mcp_registry","publisherName":"mcp_registry"}},"derived":{"capabilities":[{"slug":"content.writing","name":"Writing & Editing","confidence":1,"provenance":"derived"},{"slug":"media.speech-synthesis","name":"Speech Synthesis","confidence":1,"provenance":"derived"},{"slug":"media.speech-recognition","name":"Speech Recognition","confidence":1,"provenance":"derived"},{"slug":"dev.filesystem","name":"Filesystem","confidence":1,"provenance":"derived"},{"slug":"infra.browser-automation","name":"Browser Automation","confidence":1,"provenance":"derived"},{"slug":"analytics.reporting","name":"Reporting & Dashboards","confidence":0.977,"provenance":"derived"},{"slug":"media.music","name":"Music & Audio","confidence":0.962,"provenance":"derived"},{"slug":"media.video-editing","name":"Video Editing","confidence":0.938,"provenance":"derived"}],"categories":["analytics","content","dev","infra","media"],"language":"en"},"observed":{"status":"live","statusReason":"Responded 1h ago.","lastOkAt":"2026-10-23T00:31:29.177Z","lastProbedAt":"2026-10-23T00:31:29.177Z","statusComputedAt":"2026-10-23T00:34:16.863Z","reliability30d":{"probes":40,"successRate":1,"p50Ms":32,"basis":"service","measures":{"availability":"availability","latency":"response time","tools":"tool surface observed","summary":"Checks reached the service itself."},"checks":{"total":40,"ok":40,"authBoundaryOk":0,"serviceOk":40,"note":"Counted from the observation rows for the window, checks of the server only (HTTP, A2A card, MCP initialize). ok = authBoundaryOk + serviceOk. `probes` is the sum of daily rollups and includes registry checks, so it can differ from `total`."}},"latestObservations":[{"at":"2026-10-23T00:31:29.177Z","kind":"mcp_initialize","ok":true,"httpStatus":200,"latencyMs":35,"error":null,"detail":{"tools":[{"name":"connect","description":"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 c"},{"name":"get_projects","description":"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"},{"name":"get_timeline","description":"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 m"},{"name":"get_media","description":"Lists the project's media library: mediaRef (the id clips use), name, kind (video/audio/image), durationSeconds, resolution, and sceneSamples — timestamps (seco"},{"name":"get_transcript","description":"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_"},{"name":"create_motion_composition","description":"Creates a MOTION COMPOSITION — an animated graphic (infographic, title, promo end-card, chart…) written as a React TSX component. Read the 'motion' skill (read_"},{"name":"update_motion_composition","description":"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 existi"},{"name":"get_motion_composition","description":"Returns a motion composition's manifest and full TSX sources."},{"name":"list_motion_compositions","description":"Lists the project's motion compositions: id, mediaRef (for add_clips), name, size, fps, duration and the editable props schema."},{"name":"create_timeline","description":"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 tim"},{"name":"add_clips","description":"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>' fo"},{"name":"split_clips","description":"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 f"},{"name":"remove_clips","description":"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"},{"name":"ripple_delete_ranges","description":"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"},{"name":"set_clip_properties","description":"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 "},{"name":"generate_captions","description":"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 "},{"name":"manage_effects","description":"Edits a clip's effect stack (ordered, per-effect enable). action: 'add' (type; returns the new effect's id) | 'remove' (effectId) | 'move' (effectId + toIndex —"},{"name":"manage_transitions","description":"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 +"},{"name":"manage_tracks","description":"Track operations on a timeline. action: 'mute' | 'unmute' | 'solo' | 'unsolo' (audio only; any solo silences non-solo tracks) | 'hide' | 'show' | 'rename' (need"},{"name":"cut_to_angle","description":"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 w"},{"name":"move_clips","description":"Moves clips to new positions (linked partners follow automatically). Each move: clipId, toStartFrame, optional toTrackId (same-kind track). Overwrite semantics "},{"name":"set_active_timeline","description":"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 reg"},{"name":"set_project_settings","description":"Updates a timeline's fps / width / height (clips keep their timing; content re-fits) and/or renames it. Only provided fields change."},{"name":"search_media","description":"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 transcribe"},{"name":"remove_words","description":"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_tr"},{"name":"remove_silence","description":"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)"},{"name":"undo","description":"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."},{"name":"inspect_media","description":"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 at"},{"name":"inspect_timeline","description":"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"},{"name":"get_problems","description":"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, export"},{"name":"get_bug_report","description":"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 wo"},{"name":"verify_timeline","description":"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"},{"name":"insert_clips","description":"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 "},{"name":"organize_media","description":"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 "},{"name":"read_skill","description":"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"},{"name":"await_user_action","description":"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 t"},{"name":"open_project","description":"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-wor"},{"name":"close_project","description":"Navigates the user's Frapea tab back to the project manager and releases this session's headless runtime for the project."},{"name":"new_project","description":"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 "},{"name":"connect_media_folder","description":"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 "},{"name":"trim_clips","description":"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, < "},{"name":"get_analysis_status","description":"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"},{"name":"request_ai_models","description":"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 "},{"name":"start_visual_indexing","description":"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 switche"},{"name":"start_transcription","description":"Transcribes one asset even if automatic transcription is switched off. Speech transcripts otherwise appear on their own. Returns the project's analysis status; "},{"name":"get_job_status","description":"Status of a background job started by a job-returning tool (generate_voiceover, verify_timeline, measure_loudness): {state: queued|running|done|failed|cancelled"},{"name":"list_voiceover_models","description":"The text-to-speech providers Frapea can generate voiceovers with. Returns providers[]: the FREE in-browser models straight from the TTS registry ({id, label, la"},{"name":"generate_voiceover","description":"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), "},{"name":"search_stock_media","description":"Searches the Pexels stock library (photos or videos) with the user's connected API key. Returns items with id, dimensions, duration (videos), author, thumbnail "},{"name":"download_stock_media","description":"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 accep"},{"name":"search_sounds","description":"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:"},{"name":"download_sound","description":"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 (nam"},{"name":"add_sfx","description":"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 p"},{"name":"manage_queue","description":"Full control of the background work queue. action 'list' returns every queued/running item across all projects (analyses, proxies, beats) plus the visible task "},{"name":"retry_analysis","description":"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 "},{"name":"set_keyframes","description":"Animates one clip property. property: opacity | volume | positionX | positionY | scaleX | scaleY | rotationDeg | pitch | yaw | anchorX | anchorY | cropLeft | cr"},{"name":"apply_layout","description":"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-"},{"name":"track_faces","description":"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:"},{"name":"list_face_tracks","description":"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"},{"name":"merge_faces","description":"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 sa"},{"name":"bind_face","description":"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 "},{"name":"organize_pool","description":"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 graphic"},{"name":"measure_loudness","description":"MEASURE THE MIX — you cannot hear it; this is how you check it. Mixes the timeline's audio offline exactly as an export does (every audio track, nested timeline"},{"name":"duplicate_timeline","description":"Copy a timeline under a new name — a backup of the cut before a review round changes it, or a variant to try something on. A DEEP copy: new ids for the timeline"}],"toolCount":64,"toolsHash":"8c68fa78da84350bff2f07e0882eef1944e735e86686fa739819b5bdf2ce8068","serverName":"frapea","capabilities":["tools"],"serverVersion":"0.2.0","protocolVersion":"2025-06-18"}},{"at":"2026-10-22T18:32:00.254Z","kind":"mcp_initialize","ok":true,"httpStatus":200,"latencyMs":47,"error":null,"detail":{"tools":[{"name":"connect","description":"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 c"},{"name":"get_projects","description":"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"},{"name":"get_timeline","description":"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 m"},{"name":"get_media","description":"Lists the project's media library: mediaRef (the id clips use), name, kind (video/audio/image), durationSeconds, resolution, and sceneSamples — timestamps (seco"},{"name":"get_transcript","description":"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_"},{"name":"create_motion_composition","description":"Creates a MOTION COMPOSITION — an animated graphic (infographic, title, promo end-card, chart…) written as a React TSX component. Read the 'motion' skill (read_"},{"name":"update_motion_composition","description":"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 existi"},{"name":"get_motion_composition","description":"Returns a motion composition's manifest and full TSX sources."},{"name":"list_motion_compositions","description":"Lists the project's motion compositions: id, mediaRef (for add_clips), name, size, fps, duration and the editable props schema."},{"name":"create_timeline","description":"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 tim"},{"name":"add_clips","description":"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>' fo"},{"name":"split_clips","description":"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 f"},{"name":"remove_clips","description":"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"},{"name":"ripple_delete_ranges","description":"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"},{"name":"set_clip_properties","description":"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 "},{"name":"generate_captions","description":"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 "},{"name":"manage_effects","description":"Edits a clip's effect stack (ordered, per-effect enable). action: 'add' (type; returns the new effect's id) | 'remove' (effectId) | 'move' (effectId + toIndex —"},{"name":"manage_transitions","description":"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 +"},{"name":"manage_tracks","description":"Track operations on a timeline. action: 'mute' | 'unmute' | 'solo' | 'unsolo' (audio only; any solo silences non-solo tracks) | 'hide' | 'show' | 'rename' (need"},{"name":"cut_to_angle","description":"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 w"},{"name":"move_clips","description":"Moves clips to new positions (linked partners follow automatically). Each move: clipId, toStartFrame, optional toTrackId (same-kind track). Overwrite semantics "},{"name":"set_active_timeline","description":"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 reg"},{"name":"set_project_settings","description":"Updates a timeline's fps / width / height (clips keep their timing; content re-fits) and/or renames it. Only provided fields change."},{"name":"search_media","description":"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 transcribe"},{"name":"remove_words","description":"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_tr"},{"name":"remove_silence","description":"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)"},{"name":"undo","description":"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."},{"name":"inspect_media","description":"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 at"},{"name":"inspect_timeline","description":"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"},{"name":"get_problems","description":"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, export"},{"name":"get_bug_report","description":"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 wo"},{"name":"verify_timeline","description":"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"},{"name":"insert_clips","description":"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 "},{"name":"organize_media","description":"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 "},{"name":"read_skill","description":"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"},{"name":"await_user_action","description":"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 t"},{"name":"open_project","description":"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-wor"},{"name":"close_project","description":"Navigates the user's Frapea tab back to the project manager and releases this session's headless runtime for the project."},{"name":"new_project","description":"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 "},{"name":"connect_media_folder","description":"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 "},{"name":"trim_clips","description":"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, < "},{"name":"get_analysis_status","description":"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"},{"name":"request_ai_models","description":"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 "},{"name":"start_visual_indexing","description":"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 switche"},{"name":"start_transcription","description":"Transcribes one asset even if automatic transcription is switched off. Speech transcripts otherwise appear on their own. Returns the project's analysis status; "},{"name":"get_job_status","description":"Status of a background job started by a job-returning tool (generate_voiceover, verify_timeline, measure_loudness): {state: queued|running|done|failed|cancelled"},{"name":"list_voiceover_models","description":"The text-to-speech providers Frapea can generate voiceovers with. Returns providers[]: the FREE in-browser models straight from the TTS registry ({id, label, la"},{"name":"generate_voiceover","description":"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), "},{"name":"search_stock_media","description":"Searches the Pexels stock library (photos or videos) with the user's connected API key. Returns items with id, dimensions, duration (videos), author, thumbnail "},{"name":"download_stock_media","description":"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 accep"},{"name":"search_sounds","description":"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:"},{"name":"download_sound","description":"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 (nam"},{"name":"add_sfx","description":"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 p"},{"name":"manage_queue","description":"Full control of the background work queue. action 'list' returns every queued/running item across all projects (analyses, proxies, beats) plus the visible task "},{"name":"retry_analysis","description":"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 "},{"name":"set_keyframes","description":"Animates one clip property. property: opacity | volume | positionX | positionY | scaleX | scaleY | rotationDeg | pitch | yaw | anchorX | anchorY | cropLeft | cr"},{"name":"apply_layout","description":"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-"},{"name":"track_faces","description":"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:"},{"name":"list_face_tracks","description":"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"},{"name":"merge_faces","description":"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 sa"},{"name":"bind_face","description":"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 "},{"name":"organize_pool","description":"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 graphic"},{"name":"measure_loudness","description":"MEASURE THE MIX — you cannot hear it; this is how you check it. Mixes the timeline's audio offline exactly as an export does (every audio track, nested timeline"},{"name":"duplicate_timeline","description":"Copy a timeline under a new name — a backup of the cut before a review round changes it, or a variant to try something on. A DEEP copy: new ids for the timeline"}],"toolCount":64,"toolsHash":"8c68fa78da84350bff2f07e0882eef1944e735e86686fa739819b5bdf2ce8068","serverName":"frapea","capabilities":["tools"],"serverVersion":"0.2.0","protocolVersion":"2025-06-18"}},{"at":"2026-10-22T11:34:06.075Z","kind":"mcp_initialize","ok":true,"httpStatus":200,"latencyMs":129,"error":null,"detail":{"tools":[{"name":"connect","description":"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 c"},{"name":"get_projects","description":"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"},{"name":"get_timeline","description":"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 m"},{"name":"get_media","description":"Lists the project's media library: mediaRef (the id clips use), name, kind (video/audio/image), durationSeconds, resolution, and sceneSamples — timestamps (seco"},{"name":"get_transcript","description":"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_"},{"name":"create_motion_composition","description":"Creates a MOTION COMPOSITION — an animated graphic (infographic, title, promo end-card, chart…) written as a React TSX component. Read the 'motion' skill (read_"},{"name":"update_motion_composition","description":"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 existi"},{"name":"get_motion_composition","description":"Returns a motion composition's manifest and full TSX sources."},{"name":"list_motion_compositions","description":"Lists the project's motion compositions: id, mediaRef (for add_clips), name, size, fps, duration and the editable props schema."},{"name":"create_timeline","description":"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 tim"},{"name":"add_clips","description":"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>' fo"},{"name":"split_clips","description":"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 f"},{"name":"remove_clips","description":"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"},{"name":"ripple_delete_ranges","description":"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"},{"name":"set_clip_properties","description":"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 "},{"name":"generate_captions","description":"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 "},{"name":"manage_effects","description":"Edits a clip's effect stack (ordered, per-effect enable). action: 'add' (type; returns the new effect's id) | 'remove' (effectId) | 'move' (effectId + toIndex —"},{"name":"manage_transitions","description":"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 +"},{"name":"manage_tracks","description":"Track operations on a timeline. action: 'mute' | 'unmute' | 'solo' | 'unsolo' (audio only; any solo silences non-solo tracks) | 'hide' | 'show' | 'rename' (need"},{"name":"cut_to_angle","description":"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 w"},{"name":"move_clips","description":"Moves clips to new positions (linked partners follow automatically). Each move: clipId, toStartFrame, optional toTrackId (same-kind track). Overwrite semantics "},{"name":"set_active_timeline","description":"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 reg"},{"name":"set_project_settings","description":"Updates a timeline's fps / width / height (clips keep their timing; content re-fits) and/or renames it. Only provided fields change."},{"name":"search_media","description":"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 transcribe"},{"name":"remove_words","description":"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_tr"},{"name":"remove_silence","description":"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)"},{"name":"undo","description":"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."},{"name":"inspect_media","description":"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 at"},{"name":"inspect_timeline","description":"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"},{"name":"get_problems","description":"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, export"},{"name":"get_bug_report","description":"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 wo"},{"name":"verify_timeline","description":"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"},{"name":"insert_clips","description":"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 "},{"name":"organize_media","description":"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 "},{"name":"read_skill","description":"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"},{"name":"await_user_action","description":"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 t"},{"name":"open_project","description":"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-wor"},{"name":"close_project","description":"Navigates the user's Frapea tab back to the project manager and releases this session's headless runtime for the project."},{"name":"new_project","description":"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 "},{"name":"connect_media_folder","description":"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 "},{"name":"trim_clips","description":"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, < "},{"name":"get_analysis_status","description":"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"},{"name":"request_ai_models","description":"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 "},{"name":"start_visual_indexing","description":"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 switche"},{"name":"start_transcription","description":"Transcribes one asset even if automatic transcription is switched off. Speech transcripts otherwise appear on their own. Returns the project's analysis status; "},{"name":"get_job_status","description":"Status of a background job started by a job-returning tool (generate_voiceover, verify_timeline, measure_loudness): {state: queued|running|done|failed|cancelled"},{"name":"list_voiceover_models","description":"The text-to-speech providers Frapea can generate voiceovers with. Returns providers[]: the FREE in-browser models straight from the TTS registry ({id, label, la"},{"name":"generate_voiceover","description":"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), "},{"name":"search_stock_media","description":"Searches the Pexels stock library (photos or videos) with the user's connected API key. Returns items with id, dimensions, duration (videos), author, thumbnail "},{"name":"download_stock_media","description":"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 accep"},{"name":"search_sounds","description":"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:"},{"name":"download_sound","description":"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 (nam"},{"name":"add_sfx","description":"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 p"},{"name":"manage_queue","description":"Full control of the background work queue. action 'list' returns every queued/running item across all projects (analyses, proxies, beats) plus the visible task "},{"name":"retry_analysis","description":"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 "},{"name":"set_keyframes","description":"Animates one clip property. property: opacity | volume | positionX | positionY | scaleX | scaleY | rotationDeg | pitch | yaw | anchorX | anchorY | cropLeft | cr"},{"name":"apply_layout","description":"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-"},{"name":"track_faces","description":"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:"},{"name":"list_face_tracks","description":"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"},{"name":"merge_faces","description":"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 sa"},{"name":"bind_face","description":"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 "},{"name":"organize_pool","description":"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 graphic"},{"name":"measure_loudness","description":"MEASURE THE MIX — you cannot hear it; this is how you check it. Mixes the timeline's audio offline exactly as an export does (every audio track, nested timeline"},{"name":"duplicate_timeline","description":"Copy a timeline under a new name — a backup of the cut before a review round changes it, or a variant to try something on. A DEEP copy: new ids for the timeline"}],"toolCount":64,"toolsHash":"8c68fa78da84350bff2f07e0882eef1944e735e86686fa739819b5bdf2ce8068","serverName":"frapea","capabilities":["tools"],"serverVersion":"0.2.0","protocolVersion":"2025-06-18"}},{"at":"2026-10-22T04:28:12.254Z","kind":"mcp_initialize","ok":true,"httpStatus":200,"latencyMs":30,"error":null,"detail":{"tools":[{"name":"connect","description":"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 c"},{"name":"get_projects","description":"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"},{"name":"get_timeline","description":"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 m"},{"name":"get_media","description":"Lists the project's media library: mediaRef (the id clips use), name, kind (video/audio/image), durationSeconds, resolution, and sceneSamples — timestamps (seco"},{"name":"get_transcript","description":"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_"},{"name":"create_motion_composition","description":"Creates a MOTION COMPOSITION — an animated graphic (infographic, title, promo end-card, chart…) written as a React TSX component. Read the 'motion' skill (read_"},{"name":"update_motion_composition","description":"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 existi"},{"name":"get_motion_composition","description":"Returns a motion composition's manifest and full TSX sources."},{"name":"list_motion_compositions","description":"Lists the project's motion compositions: id, mediaRef (for add_clips), name, size, fps, duration and the editable props schema."},{"name":"create_timeline","description":"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 tim"},{"name":"add_clips","description":"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>' fo"},{"name":"split_clips","description":"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 f"},{"name":"remove_clips","description":"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"},{"name":"ripple_delete_ranges","description":"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"},{"name":"set_clip_properties","description":"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 "},{"name":"generate_captions","description":"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 "},{"name":"manage_effects","description":"Edits a clip's effect stack (ordered, per-effect enable). action: 'add' (type; returns the new effect's id) | 'remove' (effectId) | 'move' (effectId + toIndex —"},{"name":"manage_transitions","description":"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 +"},{"name":"manage_tracks","description":"Track operations on a timeline. action: 'mute' | 'unmute' | 'solo' | 'unsolo' (audio only; any solo silences non-solo tracks) | 'hide' | 'show' | 'rename' (need"},{"name":"cut_to_angle","description":"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 w"},{"name":"move_clips","description":"Moves clips to new positions (linked partners follow automatically). Each move: clipId, toStartFrame, optional toTrackId (same-kind track). Overwrite semantics "},{"name":"set_active_timeline","description":"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 reg"},{"name":"set_project_settings","description":"Updates a timeline's fps / width / height (clips keep their timing; content re-fits) and/or renames it. Only provided fields change."},{"name":"search_media","description":"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 transcribe"},{"name":"remove_words","description":"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_tr"},{"name":"remove_silence","description":"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)"},{"name":"undo","description":"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."},{"name":"inspect_media","description":"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 at"},{"name":"inspect_timeline","description":"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"},{"name":"get_problems","description":"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, export"},{"name":"get_bug_report","description":"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 wo"},{"name":"verify_timeline","description":"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"},{"name":"insert_clips","description":"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 "},{"name":"organize_media","description":"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 "},{"name":"read_skill","description":"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"},{"name":"await_user_action","description":"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 t"},{"name":"open_project","description":"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-wor"},{"name":"close_project","description":"Navigates the user's Frapea tab back to the project manager and releases this session's headless runtime for the project."},{"name":"new_project","description":"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 "},{"name":"connect_media_folder","description":"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 "},{"name":"trim_clips","description":"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, < "},{"name":"get_analysis_status","description":"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"},{"name":"request_ai_models","description":"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 "},{"name":"start_visual_indexing","description":"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 switche"},{"name":"start_transcription","description":"Transcribes one asset even if automatic transcription is switched off. Speech transcripts otherwise appear on their own. Returns the project's analysis status; "},{"name":"get_job_status","description":"Status of a background job started by a job-returning tool (generate_voiceover, verify_timeline, measure_loudness): {state: queued|running|done|failed|cancelled"},{"name":"list_voiceover_models","description":"The text-to-speech providers Frapea can generate voiceovers with. Returns providers[]: the FREE in-browser models straight from the TTS registry ({id, label, la"},{"name":"generate_voiceover","description":"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), "},{"name":"search_stock_media","description":"Searches the Pexels stock library (photos or videos) with the user's connected API key. Returns items with id, dimensions, duration (videos), author, thumbnail "},{"name":"download_stock_media","description":"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 accep"},{"name":"search_sounds","description":"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:"},{"name":"download_sound","description":"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 (nam"},{"name":"add_sfx","description":"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 p"},{"name":"manage_queue","description":"Full control of the background work queue. action 'list' returns every queued/running item across all projects (analyses, proxies, beats) plus the visible task "},{"name":"retry_analysis","description":"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 "},{"name":"set_keyframes","description":"Animates one clip property. property: opacity | volume | positionX | positionY | scaleX | scaleY | rotationDeg | pitch | yaw | anchorX | anchorY | cropLeft | cr"},{"name":"apply_layout","description":"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-"},{"name":"track_faces","description":"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:"},{"name":"list_face_tracks","description":"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"},{"name":"merge_faces","description":"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 sa"},{"name":"bind_face","description":"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 "},{"name":"organize_pool","description":"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 graphic"},{"name":"measure_loudness","description":"MEASURE THE MIX — you cannot hear it; this is how you check it. Mixes the timeline's audio offline exactly as an export does (every audio track, nested timeline"},{"name":"duplicate_timeline","description":"Copy a timeline under a new name — a backup of the cut before a review round changes it, or a variant to try something on. A DEEP copy: new ids for the timeline"}],"toolCount":64,"toolsHash":"8c68fa78da84350bff2f07e0882eef1944e735e86686fa739819b5bdf2ce8068","serverName":"frapea","capabilities":["tools"],"serverVersion":"0.2.0","protocolVersion":"2025-06-18"}},{"at":"2026-10-21T22:31:08.604Z","kind":"mcp_initialize","ok":true,"httpStatus":200,"latencyMs":27,"error":null,"detail":{"tools":[{"name":"connect","description":"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 c"},{"name":"get_projects","description":"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"},{"name":"get_timeline","description":"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 m"},{"name":"get_media","description":"Lists the project's media library: mediaRef (the id clips use), name, kind (video/audio/image), durationSeconds, resolution, and sceneSamples — timestamps (seco"},{"name":"get_transcript","description":"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_"},{"name":"create_motion_composition","description":"Creates a MOTION COMPOSITION — an animated graphic (infographic, title, promo end-card, chart…) written as a React TSX component. Read the 'motion' skill (read_"},{"name":"update_motion_composition","description":"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 existi"},{"name":"get_motion_composition","description":"Returns a motion composition's manifest and full TSX sources."},{"name":"list_motion_compositions","description":"Lists the project's motion compositions: id, mediaRef (for add_clips), name, size, fps, duration and the editable props schema."},{"name":"create_timeline","description":"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 tim"},{"name":"add_clips","description":"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>' fo"},{"name":"split_clips","description":"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 f"},{"name":"remove_clips","description":"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"},{"name":"ripple_delete_ranges","description":"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"},{"name":"set_clip_properties","description":"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 "},{"name":"generate_captions","description":"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 "},{"name":"manage_effects","description":"Edits a clip's effect stack (ordered, per-effect enable). action: 'add' (type; returns the new effect's id) | 'remove' (effectId) | 'move' (effectId + toIndex —"},{"name":"manage_transitions","description":"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 +"},{"name":"manage_tracks","description":"Track operations on a timeline. action: 'mute' | 'unmute' | 'solo' | 'unsolo' (audio only; any solo silences non-solo tracks) | 'hide' | 'show' | 'rename' (need"},{"name":"cut_to_angle","description":"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 w"},{"name":"move_clips","description":"Moves clips to new positions (linked partners follow automatically). Each move: clipId, toStartFrame, optional toTrackId (same-kind track). Overwrite semantics "},{"name":"set_active_timeline","description":"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 reg"},{"name":"set_project_settings","description":"Updates a timeline's fps / width / height (clips keep their timing; content re-fits) and/or renames it. Only provided fields change."},{"name":"search_media","description":"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 transcribe"},{"name":"remove_words","description":"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_tr"},{"name":"remove_silence","description":"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)"},{"name":"undo","description":"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."},{"name":"inspect_media","description":"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 at"},{"name":"inspect_timeline","description":"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"},{"name":"get_problems","description":"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, export"},{"name":"get_bug_report","description":"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 wo"},{"name":"verify_timeline","description":"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"},{"name":"insert_clips","description":"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 "},{"name":"organize_media","description":"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 "},{"name":"read_skill","description":"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"},{"name":"await_user_action","description":"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 t"},{"name":"open_project","description":"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-wor"},{"name":"close_project","description":"Navigates the user's Frapea tab back to the project manager and releases this session's headless runtime for the project."},{"name":"new_project","description":"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 "},{"name":"connect_media_folder","description":"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 "},{"name":"trim_clips","description":"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, < "},{"name":"get_analysis_status","description":"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"},{"name":"request_ai_models","description":"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 "},{"name":"start_visual_indexing","description":"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 switche"},{"name":"start_transcription","description":"Transcribes one asset even if automatic transcription is switched off. Speech transcripts otherwise appear on their own. Returns the project's analysis status; "},{"name":"get_job_status","description":"Status of a background job started by a job-returning tool (generate_voiceover, verify_timeline, measure_loudness): {state: queued|running|done|failed|cancelled"},{"name":"list_voiceover_models","description":"The text-to-speech providers Frapea can generate voiceovers with. Returns providers[]: the FREE in-browser models straight from the TTS registry ({id, label, la"},{"name":"generate_voiceover","description":"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), "},{"name":"search_stock_media","description":"Searches the Pexels stock library (photos or videos) with the user's connected API key. Returns items with id, dimensions, duration (videos), author, thumbnail "},{"name":"download_stock_media","description":"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 accep"},{"name":"search_sounds","description":"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:"},{"name":"download_sound","description":"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 (nam"},{"name":"add_sfx","description":"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 p"},{"name":"manage_queue","description":"Full control of the background work queue. action 'list' returns every queued/running item across all projects (analyses, proxies, beats) plus the visible task "},{"name":"retry_analysis","description":"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 "},{"name":"set_keyframes","description":"Animates one clip property. property: opacity | volume | positionX | positionY | scaleX | scaleY | rotationDeg | pitch | yaw | anchorX | anchorY | cropLeft | cr"},{"name":"apply_layout","description":"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-"},{"name":"track_faces","description":"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:"},{"name":"list_face_tracks","description":"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"},{"name":"merge_faces","description":"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 sa"},{"name":"bind_face","description":"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 "},{"name":"organize_pool","description":"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 graphic"},{"name":"measure_loudness","description":"MEASURE THE MIX — you cannot hear it; this is how you check it. Mixes the timeline's audio offline exactly as an export does (every audio track, nested timeline"},{"name":"duplicate_timeline","description":"Copy a timeline under a new name — a backup of the cut before a review round changes it, or a variant to try something on. A DEEP copy: new ids for the timeline"}],"toolCount":64,"toolsHash":"8c68fa78da84350bff2f07e0882eef1944e735e86686fa739819b5bdf2ce8068","serverName":"frapea","capabilities":["tools"],"serverVersion":"0.2.0","protocolVersion":"2025-06-18"}},{"at":"2026-10-21T12:27:10.845Z","kind":"mcp_initialize","ok":true,"httpStatus":200,"latencyMs":274,"error":null,"detail":{"tools":[{"name":"connect","description":"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 c"},{"name":"get_projects","description":"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"},{"name":"get_timeline","description":"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 m"},{"name":"get_media","description":"Lists the project's media library: mediaRef (the id clips use), name, kind (video/audio/image), durationSeconds, resolution, and sceneSamples — timestamps (seco"},{"name":"get_transcript","description":"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_"},{"name":"create_motion_composition","description":"Creates a MOTION COMPOSITION — an animated graphic (infographic, title, promo end-card, chart…) written as a React TSX component. Read the 'motion' skill (read_"},{"name":"update_motion_composition","description":"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 existi"},{"name":"get_motion_composition","description":"Returns a motion composition's manifest and full TSX sources."},{"name":"list_motion_compositions","description":"Lists the project's motion compositions: id, mediaRef (for add_clips), name, size, fps, duration and the editable props schema."},{"name":"create_timeline","description":"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 tim"},{"name":"add_clips","description":"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>' fo"},{"name":"split_clips","description":"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 f"},{"name":"remove_clips","description":"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"},{"name":"ripple_delete_ranges","description":"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"},{"name":"set_clip_properties","description":"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 "},{"name":"generate_captions","description":"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 "},{"name":"manage_effects","description":"Edits a clip's effect stack (ordered, per-effect enable). action: 'add' (type; returns the new effect's id) | 'remove' (effectId) | 'move' (effectId + toIndex —"},{"name":"manage_transitions","description":"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 +"},{"name":"manage_tracks","description":"Track operations on a timeline. action: 'mute' | 'unmute' | 'solo' | 'unsolo' (audio only; any solo silences non-solo tracks) | 'hide' | 'show' | 'rename' (need"},{"name":"cut_to_angle","description":"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 w"},{"name":"move_clips","description":"Moves clips to new positions (linked partners follow automatically). Each move: clipId, toStartFrame, optional toTrackId (same-kind track). Overwrite semantics "},{"name":"set_active_timeline","description":"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 reg"},{"name":"set_project_settings","description":"Updates a timeline's fps / width / height (clips keep their timing; content re-fits) and/or renames it. Only provided fields change."},{"name":"search_media","description":"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 transcribe"},{"name":"remove_words","description":"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_tr"},{"name":"remove_silence","description":"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)"},{"name":"undo","description":"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."},{"name":"inspect_media","description":"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 at"},{"name":"inspect_timeline","description":"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"},{"name":"get_problems","description":"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, export"},{"name":"get_bug_report","description":"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 wo"},{"name":"verify_timeline","description":"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"},{"name":"insert_clips","description":"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 "},{"name":"organize_media","description":"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 "},{"name":"read_skill","description":"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"},{"name":"await_user_action","description":"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 t"},{"name":"open_project","description":"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-wor"},{"name":"close_project","description":"Navigates the user's Frapea tab back to the project manager and releases this session's headless runtime for the project."},{"name":"new_project","description":"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 "},{"name":"connect_media_folder","description":"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 "},{"name":"trim_clips","description":"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, < "},{"name":"get_analysis_status","description":"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"},{"name":"request_ai_models","description":"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 "},{"name":"start_visual_indexing","description":"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 switche"},{"name":"start_transcription","description":"Transcribes one asset even if automatic transcription is switched off. Speech transcripts otherwise appear on their own. Returns the project's analysis status; "},{"name":"get_job_status","description":"Status of a background job started by a job-returning tool (generate_voiceover, verify_timeline, measure_loudness): {state: queued|running|done|failed|cancelled"},{"name":"list_voiceover_models","description":"The text-to-speech providers Frapea can generate voiceovers with. Returns providers[]: the FREE in-browser models straight from the TTS registry ({id, label, la"},{"name":"generate_voiceover","description":"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), "},{"name":"search_stock_media","description":"Searches the Pexels stock library (photos or videos) with the user's connected API key. Returns items with id, dimensions, duration (videos), author, thumbnail "},{"name":"download_stock_media","description":"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 accep"},{"name":"search_sounds","description":"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:"},{"name":"download_sound","description":"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 (nam"},{"name":"add_sfx","description":"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 p"},{"name":"manage_queue","description":"Full control of the background work queue. action 'list' returns every queued/running item across all projects (analyses, proxies, beats) plus the visible task "},{"name":"retry_analysis","description":"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 "},{"name":"set_keyframes","description":"Animates one clip property. property: opacity | volume | positionX | positionY | scaleX | scaleY | rotationDeg | pitch | yaw | anchorX | anchorY | cropLeft | cr"},{"name":"apply_layout","description":"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-"},{"name":"track_faces","description":"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:"},{"name":"list_face_tracks","description":"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"},{"name":"merge_faces","description":"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 sa"},{"name":"bind_face","description":"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 "},{"name":"organize_pool","description":"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 graphic"},{"name":"measure_loudness","description":"MEASURE THE MIX — you cannot hear it; this is how you check it. Mixes the timeline's audio offline exactly as an export does (every audio track, nested timeline"},{"name":"duplicate_timeline","description":"Copy a timeline under a new name — a backup of the cut before a review round changes it, or a variant to try something on. A DEEP copy: new ids for the timeline"}],"toolCount":64,"toolsHash":"8c68fa78da84350bff2f07e0882eef1944e735e86686fa739819b5bdf2ce8068","serverName":"frapea","capabilities":["tools"],"serverVersion":"0.2.0","protocolVersion":"2025-06-18"}},{"at":"2026-10-21T04:27:08.613Z","kind":"mcp_initialize","ok":true,"httpStatus":200,"latencyMs":32,"error":null,"detail":{"tools":[{"name":"connect","description":"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 c"},{"name":"get_projects","description":"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"},{"name":"get_timeline","description":"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 m"},{"name":"get_media","description":"Lists the project's media library: mediaRef (the id clips use), name, kind (video/audio/image), durationSeconds, resolution, and sceneSamples — timestamps (seco"},{"name":"get_transcript","description":"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_"},{"name":"create_motion_composition","description":"Creates a MOTION COMPOSITION — an animated graphic (infographic, title, promo end-card, chart…) written as a React TSX component. Read the 'motion' skill (read_"},{"name":"update_motion_composition","description":"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 existi"},{"name":"get_motion_composition","description":"Returns a motion composition's manifest and full TSX sources."},{"name":"list_motion_compositions","description":"Lists the project's motion compositions: id, mediaRef (for add_clips), name, size, fps, duration and the editable props schema."},{"name":"create_timeline","description":"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 tim"},{"name":"add_clips","description":"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>' fo"},{"name":"split_clips","description":"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 f"},{"name":"remove_clips","description":"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"},{"name":"ripple_delete_ranges","description":"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"},{"name":"set_clip_properties","description":"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 "},{"name":"generate_captions","description":"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 "},{"name":"manage_effects","description":"Edits a clip's effect stack (ordered, per-effect enable). action: 'add' (type; returns the new effect's id) | 'remove' (effectId) | 'move' (effectId + toIndex —"},{"name":"manage_transitions","description":"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 +"},{"name":"manage_tracks","description":"Track operations on a timeline. action: 'mute' | 'unmute' | 'solo' | 'unsolo' (audio only; any solo silences non-solo tracks) | 'hide' | 'show' | 'rename' (need"},{"name":"cut_to_angle","description":"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 w"},{"name":"move_clips","description":"Moves clips to new positions (linked partners follow automatically). Each move: clipId, toStartFrame, optional toTrackId (same-kind track). Overwrite semantics "},{"name":"set_active_timeline","description":"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 reg"},{"name":"set_project_settings","description":"Updates a timeline's fps / width / height (clips keep their timing; content re-fits) and/or renames it. Only provided fields change."},{"name":"search_media","description":"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 transcribe"},{"name":"remove_words","description":"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_tr"},{"name":"remove_silence","description":"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)"},{"name":"undo","description":"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."},{"name":"inspect_media","description":"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 at"},{"name":"inspect_timeline","description":"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"},{"name":"get_problems","description":"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, export"},{"name":"get_bug_report","description":"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 wo"},{"name":"verify_timeline","description":"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"},{"name":"insert_clips","description":"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 "},{"name":"organize_media","description":"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 "},{"name":"read_skill","description":"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"},{"name":"await_user_action","description":"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 t"},{"name":"open_project","description":"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-wor"},{"name":"close_project","description":"Navigates the user's Frapea tab back to the project manager and releases this session's headless runtime for the project."},{"name":"new_project","description":"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 "},{"name":"connect_media_folder","description":"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 "},{"name":"trim_clips","description":"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, < "},{"name":"get_analysis_status","description":"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"},{"name":"request_ai_models","description":"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 "},{"name":"start_visual_indexing","description":"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 switche"},{"name":"start_transcription","description":"Transcribes one asset even if automatic transcription is switched off. Speech transcripts otherwise appear on their own. Returns the project's analysis status; "},{"name":"get_job_status","description":"Status of a background job started by a job-returning tool (generate_voiceover, verify_timeline, measure_loudness): {state: queued|running|done|failed|cancelled"},{"name":"list_voiceover_models","description":"The text-to-speech providers Frapea can generate voiceovers with. Returns providers[]: the FREE in-browser models straight from the TTS registry ({id, label, la"},{"name":"generate_voiceover","description":"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), "},{"name":"search_stock_media","description":"Searches the Pexels stock library (photos or videos) with the user's connected API key. Returns items with id, dimensions, duration (videos), author, thumbnail "},{"name":"download_stock_media","description":"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 accep"},{"name":"search_sounds","description":"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:"},{"name":"download_sound","description":"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 (nam"},{"name":"add_sfx","description":"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 p"},{"name":"manage_queue","description":"Full control of the background work queue. action 'list' returns every queued/running item across all projects (analyses, proxies, beats) plus the visible task "},{"name":"retry_analysis","description":"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 "},{"name":"set_keyframes","description":"Animates one clip property. property: opacity | volume | positionX | positionY | scaleX | scaleY | rotationDeg | pitch | yaw | anchorX | anchorY | cropLeft | cr"},{"name":"apply_layout","description":"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-"},{"name":"track_faces","description":"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:"},{"name":"list_face_tracks","description":"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"},{"name":"merge_faces","description":"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 sa"},{"name":"bind_face","description":"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 "},{"name":"organize_pool","description":"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 graphic"},{"name":"measure_loudness","description":"MEASURE THE MIX — you cannot hear it; this is how you check it. Mixes the timeline's audio offline exactly as an export does (every audio track, nested timeline"},{"name":"duplicate_timeline","description":"Copy a timeline under a new name — a backup of the cut before a review round changes it, or a variant to try something on. A DEEP copy: new ids for the timeline"}],"toolCount":64,"toolsHash":"8c68fa78da84350bff2f07e0882eef1944e735e86686fa739819b5bdf2ce8068","serverName":"frapea","capabilities":["tools"],"serverVersion":"0.2.0","protocolVersion":"2025-06-18"}},{"at":"2026-10-20T22:24:29.988Z","kind":"mcp_initialize","ok":true,"httpStatus":200,"latencyMs":17,"error":null,"detail":{"tools":[{"name":"connect","description":"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 c"},{"name":"get_projects","description":"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"},{"name":"get_timeline","description":"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 m"},{"name":"get_media","description":"Lists the project's media library: mediaRef (the id clips use), name, kind (video/audio/image), durationSeconds, resolution, and sceneSamples — timestamps (seco"},{"name":"get_transcript","description":"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_"},{"name":"create_motion_composition","description":"Creates a MOTION COMPOSITION — an animated graphic (infographic, title, promo end-card, chart…) written as a React TSX component. Read the 'motion' skill (read_"},{"name":"update_motion_composition","description":"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 existi"},{"name":"get_motion_composition","description":"Returns a motion composition's manifest and full TSX sources."},{"name":"list_motion_compositions","description":"Lists the project's motion compositions: id, mediaRef (for add_clips), name, size, fps, duration and the editable props schema."},{"name":"create_timeline","description":"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 tim"},{"name":"add_clips","description":"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>' fo"},{"name":"split_clips","description":"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 f"},{"name":"remove_clips","description":"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"},{"name":"ripple_delete_ranges","description":"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"},{"name":"set_clip_properties","description":"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 "},{"name":"generate_captions","description":"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 "},{"name":"manage_effects","description":"Edits a clip's effect stack (ordered, per-effect enable). action: 'add' (type; returns the new effect's id) | 'remove' (effectId) | 'move' (effectId + toIndex —"},{"name":"manage_transitions","description":"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 +"},{"name":"manage_tracks","description":"Track operations on a timeline. action: 'mute' | 'unmute' | 'solo' | 'unsolo' (audio only; any solo silences non-solo tracks) | 'hide' | 'show' | 'rename' (need"},{"name":"cut_to_angle","description":"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 w"},{"name":"move_clips","description":"Moves clips to new positions (linked partners follow automatically). Each move: clipId, toStartFrame, optional toTrackId (same-kind track). Overwrite semantics "},{"name":"set_active_timeline","description":"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 reg"},{"name":"set_project_settings","description":"Updates a timeline's fps / width / height (clips keep their timing; content re-fits) and/or renames it. Only provided fields change."},{"name":"search_media","description":"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 transcribe"},{"name":"remove_words","description":"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_tr"},{"name":"remove_silence","description":"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)"},{"name":"undo","description":"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."},{"name":"inspect_media","description":"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 at"},{"name":"inspect_timeline","description":"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"},{"name":"get_problems","description":"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, export"},{"name":"get_bug_report","description":"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 wo"},{"name":"verify_timeline","description":"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"},{"name":"insert_clips","description":"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 "},{"name":"organize_media","description":"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 "},{"name":"read_skill","description":"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"},{"name":"await_user_action","description":"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 t"},{"name":"open_project","description":"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-wor"},{"name":"close_project","description":"Navigates the user's Frapea tab back to the project manager and releases this session's headless runtime for the project."},{"name":"new_project","description":"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 "},{"name":"connect_media_folder","description":"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 "},{"name":"trim_clips","description":"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, < "},{"name":"get_analysis_status","description":"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"},{"name":"request_ai_models","description":"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 "},{"name":"start_visual_indexing","description":"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 switche"},{"name":"start_transcription","description":"Transcribes one asset even if automatic transcription is switched off. Speech transcripts otherwise appear on their own. Returns the project's analysis status; "},{"name":"get_job_status","description":"Status of a background job started by a job-returning tool (generate_voiceover, verify_timeline, measure_loudness): {state: queued|running|done|failed|cancelled"},{"name":"list_voiceover_models","description":"The text-to-speech providers Frapea can generate voiceovers with. Returns providers[]: the FREE in-browser models straight from the TTS registry ({id, label, la"},{"name":"generate_voiceover","description":"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), "},{"name":"search_stock_media","description":"Searches the Pexels stock library (photos or videos) with the user's connected API key. Returns items with id, dimensions, duration (videos), author, thumbnail "},{"name":"download_stock_media","description":"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 accep"},{"name":"search_sounds","description":"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:"},{"name":"download_sound","description":"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 (nam"},{"name":"add_sfx","description":"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 p"},{"name":"manage_queue","description":"Full control of the background work queue. action 'list' returns every queued/running item across all projects (analyses, proxies, beats) plus the visible task "},{"name":"retry_analysis","description":"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 "},{"name":"set_keyframes","description":"Animates one clip property. property: opacity | volume | positionX | positionY | scaleX | scaleY | rotationDeg | pitch | yaw | anchorX | anchorY | cropLeft | cr"},{"name":"apply_layout","description":"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-"},{"name":"track_faces","description":"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:"},{"name":"list_face_tracks","description":"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"},{"name":"merge_faces","description":"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 sa"},{"name":"bind_face","description":"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 "},{"name":"organize_pool","description":"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 graphic"},{"name":"measure_loudness","description":"MEASURE THE MIX — you cannot hear it; this is how you check it. Mixes the timeline's audio offline exactly as an export does (every audio track, nested timeline"},{"name":"duplicate_timeline","description":"Copy a timeline under a new name — a backup of the cut before a review round changes it, or a variant to try something on. A DEEP copy: new ids for the timeline"}],"toolCount":64,"toolsHash":"8c68fa78da84350bff2f07e0882eef1944e735e86686fa739819b5bdf2ce8068","serverName":"frapea","capabilities":["tools"],"serverVersion":"0.2.0","protocolVersion":"2025-06-18"}},{"at":"2026-10-20T15:32:25.561Z","kind":"mcp_initialize","ok":true,"httpStatus":200,"latencyMs":41,"error":null,"detail":{"tools":[{"name":"connect","description":"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 c"},{"name":"get_projects","description":"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"},{"name":"get_timeline","description":"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 m"},{"name":"get_media","description":"Lists the project's media library: mediaRef (the id clips use), name, kind (video/audio/image), durationSeconds, resolution, and sceneSamples — timestamps (seco"},{"name":"get_transcript","description":"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_"},{"name":"create_motion_composition","description":"Creates a MOTION COMPOSITION — an animated graphic (infographic, title, promo end-card, chart…) written as a React TSX component. Read the 'motion' skill (read_"},{"name":"update_motion_composition","description":"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 existi"},{"name":"get_motion_composition","description":"Returns a motion composition's manifest and full TSX sources."},{"name":"list_motion_compositions","description":"Lists the project's motion compositions: id, mediaRef (for add_clips), name, size, fps, duration and the editable props schema."},{"name":"create_timeline","description":"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 tim"},{"name":"add_clips","description":"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>' fo"},{"name":"split_clips","description":"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 f"},{"name":"remove_clips","description":"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"},{"name":"ripple_delete_ranges","description":"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"},{"name":"set_clip_properties","description":"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 "},{"name":"generate_captions","description":"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 "},{"name":"manage_effects","description":"Edits a clip's effect stack (ordered, per-effect enable). action: 'add' (type; returns the new effect's id) | 'remove' (effectId) | 'move' (effectId + toIndex —"},{"name":"manage_transitions","description":"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 +"},{"name":"manage_tracks","description":"Track operations on a timeline. action: 'mute' | 'unmute' | 'solo' | 'unsolo' (audio only; any solo silences non-solo tracks) | 'hide' | 'show' | 'rename' (need"},{"name":"cut_to_angle","description":"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 w"},{"name":"move_clips","description":"Moves clips to new positions (linked partners follow automatically). Each move: clipId, toStartFrame, optional toTrackId (same-kind track). Overwrite semantics "},{"name":"set_active_timeline","description":"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 reg"},{"name":"set_project_settings","description":"Updates a timeline's fps / width / height (clips keep their timing; content re-fits) and/or renames it. Only provided fields change."},{"name":"search_media","description":"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 transcribe"},{"name":"remove_words","description":"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_tr"},{"name":"remove_silence","description":"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)"},{"name":"undo","description":"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."},{"name":"inspect_media","description":"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 at"},{"name":"inspect_timeline","description":"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"},{"name":"get_problems","description":"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, export"},{"name":"get_bug_report","description":"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 wo"},{"name":"verify_timeline","description":"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"},{"name":"insert_clips","description":"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 "},{"name":"organize_media","description":"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 "},{"name":"read_skill","description":"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"},{"name":"await_user_action","description":"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 t"},{"name":"open_project","description":"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-wor"},{"name":"close_project","description":"Navigates the user's Frapea tab back to the project manager and releases this session's headless runtime for the project."},{"name":"new_project","description":"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 "},{"name":"connect_media_folder","description":"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 "},{"name":"trim_clips","description":"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, < "},{"name":"get_analysis_status","description":"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"},{"name":"request_ai_models","description":"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 "},{"name":"start_visual_indexing","description":"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 switche"},{"name":"start_transcription","description":"Transcribes one asset even if automatic transcription is switched off. Speech transcripts otherwise appear on their own. Returns the project's analysis status; "},{"name":"get_job_status","description":"Status of a background job started by a job-returning tool (generate_voiceover, verify_timeline, measure_loudness): {state: queued|running|done|failed|cancelled"},{"name":"list_voiceover_models","description":"The text-to-speech providers Frapea can generate voiceovers with. Returns providers[]: the FREE in-browser models straight from the TTS registry ({id, label, la"},{"name":"generate_voiceover","description":"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), "},{"name":"search_stock_media","description":"Searches the Pexels stock library (photos or videos) with the user's connected API key. Returns items with id, dimensions, duration (videos), author, thumbnail "},{"name":"download_stock_media","description":"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 accep"},{"name":"search_sounds","description":"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:"},{"name":"download_sound","description":"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 (nam"},{"name":"add_sfx","description":"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 p"},{"name":"manage_queue","description":"Full control of the background work queue. action 'list' returns every queued/running item across all projects (analyses, proxies, beats) plus the visible task "},{"name":"retry_analysis","description":"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 "},{"name":"set_keyframes","description":"Animates one clip property. property: opacity | volume | positionX | positionY | scaleX | scaleY | rotationDeg | pitch | yaw | anchorX | anchorY | cropLeft | cr"},{"name":"apply_layout","description":"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-"},{"name":"track_faces","description":"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:"},{"name":"list_face_tracks","description":"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"},{"name":"merge_faces","description":"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 sa"},{"name":"bind_face","description":"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 "},{"name":"organize_pool","description":"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 graphic"},{"name":"measure_loudness","description":"MEASURE THE MIX — you cannot hear it; this is how you check it. Mixes the timeline's audio offline exactly as an export does (every audio track, nested timeline"},{"name":"duplicate_timeline","description":"Copy a timeline under a new name — a backup of the cut before a review round changes it, or a variant to try something on. A DEEP copy: new ids for the timeline"}],"toolCount":64,"toolsHash":"8c68fa78da84350bff2f07e0882eef1944e735e86686fa739819b5bdf2ce8068","serverName":"frapea","capabilities":["tools"],"serverVersion":"0.2.0","protocolVersion":"2025-06-18"}},{"at":"2026-10-20T09:25:04.982Z","kind":"mcp_initialize","ok":true,"httpStatus":200,"latencyMs":65,"error":null,"detail":{"tools":[{"name":"connect","description":"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 c"},{"name":"get_projects","description":"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"},{"name":"get_timeline","description":"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 m"},{"name":"get_media","description":"Lists the project's media library: mediaRef (the id clips use), name, kind (video/audio/image), durationSeconds, resolution, and sceneSamples — timestamps (seco"},{"name":"get_transcript","description":"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_"},{"name":"create_motion_composition","description":"Creates a MOTION COMPOSITION — an animated graphic (infographic, title, promo end-card, chart…) written as a React TSX component. Read the 'motion' skill (read_"},{"name":"update_motion_composition","description":"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 existi"},{"name":"get_motion_composition","description":"Returns a motion composition's manifest and full TSX sources."},{"name":"list_motion_compositions","description":"Lists the project's motion compositions: id, mediaRef (for add_clips), name, size, fps, duration and the editable props schema."},{"name":"create_timeline","description":"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 tim"},{"name":"add_clips","description":"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>' fo"},{"name":"split_clips","description":"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 f"},{"name":"remove_clips","description":"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"},{"name":"ripple_delete_ranges","description":"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"},{"name":"set_clip_properties","description":"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 "},{"name":"generate_captions","description":"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 "},{"name":"manage_effects","description":"Edits a clip's effect stack (ordered, per-effect enable). action: 'add' (type; returns the new effect's id) | 'remove' (effectId) | 'move' (effectId + toIndex —"},{"name":"manage_transitions","description":"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 +"},{"name":"manage_tracks","description":"Track operations on a timeline. action: 'mute' | 'unmute' | 'solo' | 'unsolo' (audio only; any solo silences non-solo tracks) | 'hide' | 'show' | 'rename' (need"},{"name":"cut_to_angle","description":"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 w"},{"name":"move_clips","description":"Moves clips to new positions (linked partners follow automatically). Each move: clipId, toStartFrame, optional toTrackId (same-kind track). Overwrite semantics "},{"name":"set_active_timeline","description":"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 reg"},{"name":"set_project_settings","description":"Updates a timeline's fps / width / height (clips keep their timing; content re-fits) and/or renames it. Only provided fields change."},{"name":"search_media","description":"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 transcribe"},{"name":"remove_words","description":"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_tr"},{"name":"remove_silence","description":"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)"},{"name":"undo","description":"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."},{"name":"inspect_media","description":"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 at"},{"name":"inspect_timeline","description":"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"},{"name":"get_problems","description":"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, export"},{"name":"get_bug_report","description":"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 wo"},{"name":"verify_timeline","description":"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"},{"name":"insert_clips","description":"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 "},{"name":"organize_media","description":"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 "},{"name":"read_skill","description":"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"},{"name":"await_user_action","description":"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 t"},{"name":"open_project","description":"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-wor"},{"name":"close_project","description":"Navigates the user's Frapea tab back to the project manager and releases this session's headless runtime for the project."},{"name":"new_project","description":"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 "},{"name":"connect_media_folder","description":"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 "},{"name":"trim_clips","description":"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, < "},{"name":"get_analysis_status","description":"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"},{"name":"request_ai_models","description":"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 "},{"name":"start_visual_indexing","description":"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 switche"},{"name":"start_transcription","description":"Transcribes one asset even if automatic transcription is switched off. Speech transcripts otherwise appear on their own. Returns the project's analysis status; "},{"name":"get_job_status","description":"Status of a background job started by a job-returning tool (generate_voiceover, verify_timeline, measure_loudness): {state: queued|running|done|failed|cancelled"},{"name":"list_voiceover_models","description":"The text-to-speech providers Frapea can generate voiceovers with. Returns providers[]: the FREE in-browser models straight from the TTS registry ({id, label, la"},{"name":"generate_voiceover","description":"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), "},{"name":"search_stock_media","description":"Searches the Pexels stock library (photos or videos) with the user's connected API key. Returns items with id, dimensions, duration (videos), author, thumbnail "},{"name":"download_stock_media","description":"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 accep"},{"name":"search_sounds","description":"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:"},{"name":"download_sound","description":"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 (nam"},{"name":"add_sfx","description":"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 p"},{"name":"manage_queue","description":"Full control of the background work queue. action 'list' returns every queued/running item across all projects (analyses, proxies, beats) plus the visible task "},{"name":"retry_analysis","description":"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 "},{"name":"set_keyframes","description":"Animates one clip property. property: opacity | volume | positionX | positionY | scaleX | scaleY | rotationDeg | pitch | yaw | anchorX | anchorY | cropLeft | cr"},{"name":"apply_layout","description":"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-"},{"name":"track_faces","description":"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:"},{"name":"list_face_tracks","description":"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"},{"name":"merge_faces","description":"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 sa"},{"name":"bind_face","description":"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 "},{"name":"organize_pool","description":"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 graphic"},{"name":"measure_loudness","description":"MEASURE THE MIX — you cannot hear it; this is how you check it. Mixes the timeline's audio offline exactly as an export does (every audio track, nested timeline"},{"name":"duplicate_timeline","description":"Copy a timeline under a new name — a backup of the cut before a review round changes it, or a variant to try something on. A DEEP copy: new ids for the timeline"}],"toolCount":64,"toolsHash":"8c68fa78da84350bff2f07e0882eef1944e735e86686fa739819b5bdf2ce8068","serverName":"frapea","capabilities":["tools"],"serverVersion":"0.2.0","protocolVersion":"2025-06-18"}}],"tools":[{"name":"connect","description":"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 c"},{"name":"get_projects","description":"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"},{"name":"get_timeline","description":"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 m"},{"name":"get_media","description":"Lists the project's media library: mediaRef (the id clips use), name, kind (video/audio/image), durationSeconds, resolution, and sceneSamples — timestamps (seco"},{"name":"get_transcript","description":"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_"},{"name":"create_motion_composition","description":"Creates a MOTION COMPOSITION — an animated graphic (infographic, title, promo end-card, chart…) written as a React TSX component. Read the 'motion' skill (read_"},{"name":"update_motion_composition","description":"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 existi"},{"name":"get_motion_composition","description":"Returns a motion composition's manifest and full TSX sources."},{"name":"list_motion_compositions","description":"Lists the project's motion compositions: id, mediaRef (for add_clips), name, size, fps, duration and the editable props schema."},{"name":"create_timeline","description":"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 tim"},{"name":"add_clips","description":"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>' fo"},{"name":"split_clips","description":"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 f"},{"name":"remove_clips","description":"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"},{"name":"ripple_delete_ranges","description":"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"},{"name":"set_clip_properties","description":"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 "},{"name":"generate_captions","description":"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 "},{"name":"manage_effects","description":"Edits a clip's effect stack (ordered, per-effect enable). action: 'add' (type; returns the new effect's id) | 'remove' (effectId) | 'move' (effectId + toIndex —"},{"name":"manage_transitions","description":"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 +"},{"name":"manage_tracks","description":"Track operations on a timeline. action: 'mute' | 'unmute' | 'solo' | 'unsolo' (audio only; any solo silences non-solo tracks) | 'hide' | 'show' | 'rename' (need"},{"name":"cut_to_angle","description":"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 w"},{"name":"move_clips","description":"Moves clips to new positions (linked partners follow automatically). Each move: clipId, toStartFrame, optional toTrackId (same-kind track). Overwrite semantics "},{"name":"set_active_timeline","description":"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 reg"},{"name":"set_project_settings","description":"Updates a timeline's fps / width / height (clips keep their timing; content re-fits) and/or renames it. Only provided fields change."},{"name":"search_media","description":"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 transcribe"},{"name":"remove_words","description":"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_tr"},{"name":"remove_silence","description":"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)"},{"name":"undo","description":"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."},{"name":"inspect_media","description":"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 at"},{"name":"inspect_timeline","description":"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"},{"name":"get_problems","description":"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, export"},{"name":"get_bug_report","description":"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 wo"},{"name":"verify_timeline","description":"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"},{"name":"insert_clips","description":"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 "},{"name":"organize_media","description":"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 "},{"name":"read_skill","description":"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"},{"name":"await_user_action","description":"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 t"},{"name":"open_project","description":"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-wor"},{"name":"close_project","description":"Navigates the user's Frapea tab back to the project manager and releases this session's headless runtime for the project."},{"name":"new_project","description":"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 "},{"name":"connect_media_folder","description":"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 "},{"name":"trim_clips","description":"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, < "},{"name":"get_analysis_status","description":"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"},{"name":"request_ai_models","description":"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 "},{"name":"start_visual_indexing","description":"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 switche"},{"name":"start_transcription","description":"Transcribes one asset even if automatic transcription is switched off. Speech transcripts otherwise appear on their own. Returns the project's analysis status; "},{"name":"get_job_status","description":"Status of a background job started by a job-returning tool (generate_voiceover, verify_timeline, measure_loudness): {state: queued|running|done|failed|cancelled"},{"name":"list_voiceover_models","description":"The text-to-speech providers Frapea can generate voiceovers with. Returns providers[]: the FREE in-browser models straight from the TTS registry ({id, label, la"},{"name":"generate_voiceover","description":"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), "},{"name":"search_stock_media","description":"Searches the Pexels stock library (photos or videos) with the user's connected API key. Returns items with id, dimensions, duration (videos), author, thumbnail "},{"name":"download_stock_media","description":"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 accep"},{"name":"search_sounds","description":"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:"},{"name":"download_sound","description":"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 (nam"},{"name":"add_sfx","description":"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 p"},{"name":"manage_queue","description":"Full control of the background work queue. action 'list' returns every queued/running item across all projects (analyses, proxies, beats) plus the visible task "},{"name":"retry_analysis","description":"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 "},{"name":"set_keyframes","description":"Animates one clip property. property: opacity | volume | positionX | positionY | scaleX | scaleY | rotationDeg | pitch | yaw | anchorX | anchorY | cropLeft | cr"},{"name":"apply_layout","description":"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-"},{"name":"track_faces","description":"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:"},{"name":"list_face_tracks","description":"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"},{"name":"merge_faces","description":"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 sa"},{"name":"bind_face","description":"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 "},{"name":"organize_pool","description":"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 graphic"},{"name":"measure_loudness","description":"MEASURE THE MIX — you cannot hear it; this is how you check it. Mixes the timeline's audio offline exactly as an export does (every audio track, nested timeline"},{"name":"duplicate_timeline","description":"Copy a timeline under a new name — a backup of the cut before a review round changes it, or a variant to try something on. A DEEP copy: new ids for the timeline"}],"package":null,"toolSurface":{"id":"ts_h6qztmc92k2r","endpointId":"ep_2sb8hbayp7gw","hash":"8c68fa78da84350bff2f07e0882eef1944e735e86686fa739819b5bdf2ce8068","toolCount":64,"serverName":"frapea","serverVersion":"0.2.0","protocolVersion":"2025-06-18","firstSeenAt":"2026-10-18T16:35:48.652Z","lastSeenAt":"2026-10-23T00:31:29.176Z","observations":16,"toolNames":["connect","get_projects","get_timeline","get_media","get_transcript","create_motion_composition","update_motion_composition","get_motion_composition","list_motion_compositions","create_timeline","add_clips","split_clips","remove_clips","ripple_delete_ranges","set_clip_properties","generate_captions","manage_effects","manage_transitions","manage_tracks","cut_to_angle","move_clips","set_active_timeline","set_project_settings","search_media","remove_words","remove_silence","undo","inspect_media","inspect_timeline","get_problems","get_bug_report","verify_timeline","insert_clips","organize_media","read_skill","await_user_action","open_project","close_project","new_project","connect_media_folder","trim_clips","get_analysis_status","request_ai_models","start_visual_indexing","start_transcription","get_job_status","list_voiceover_models","generate_voiceover","search_stock_media","download_stock_media","search_sounds","download_sound","add_sfx","manage_queue","retry_analysis","set_keyframes","apply_layout","track_faces","list_face_tracks","merge_faces","bind_face","organize_pool","measure_loudness","duplicate_timeline"],"distinctSurfaces":3},"endpointFacts":[{"id":"ep_2sb8hbayp7gw","url":"https://app.frapea.com/mcp","type":"mcp_streamable_http","factsCheckedAt":"2026-10-19T20:29:56.818Z","auth":{"observedAt":"2026-10-19T20:29:56.884Z","authRequired":false,"scheme":null,"resourceMetadata":null,"authorizationServer":null,"conformance":{"dpop":false,"rfc8414":false,"rfc9728":false,"pkceS256":false,"clientIdMetadataDocument":false,"dynamicClientRegistration":false}},"tls":{"observedAt":"2026-10-19T20:29:56.912Z","protocol":"TLSv1.3","chainValid":true,"chainError":null,"hostMatches":true,"subject":"frapea.com","issuer":{"commonName":"WE1","organization":"Google Trust Services"},"validFrom":"2026-09-17T03:38:20.000Z","validTo":"2026-12-16T04:38:17.000Z","daysToExpiry":54,"sanCount":3,"fingerprint256":"06:B6:C5:73:3A:B5:D4:A5:DE:8F:60:52:26:0A:A5:70:E6:B2:44:E7:0F:24:38:27:AD:33:C6:08:6E:9F:D1:0E"}}]},"verification":{"claimed":false,"claimedAt":null,"proofs":[]},"provenance":{"sources":[{"source":"mcp_registry","key":"com.frapea/editor","url":"https://registry.modelcontextprotocol.io/v0/servers/com.frapea%2Feditor","firstSeenAt":"2026-10-12T03:20:50.475Z","fetchedAt":"2026-10-21T18:20:15.626Z","normalizedAt":"2026-10-21T18:20:15.626Z"}]},"firstSeenAt":"2026-10-12T03:20:50.475Z","updatedAt":"2026-10-23T00:36:15.218Z"}