API documentation
Tool reference
Every tool the Eddie AI MCP server publishes, with the description and the input schema the server itself sends to your client. Search by name, or filter by group.
How to read this page
Every entry is generated from the catalogue the server publishes, so the description you read here is the description your client receives, word for word. Open an entry for the full text and the parameters.
- Name is what you call. Tool names are stable.
- What the call does says whether the tool only reads your project, changes it, or removes something from it. Read it before you let an agent loose on a project.
- Access is the project level the call needs. See Authentication.
- Parameters come from the tool’s JSON Schema. Required parameters are listed first and marked.
Nearly every tool takes a shareId. It accepts the bare share id or the whole share URL. See Core concepts for what the other arguments refer to.
- View
- Read a project: its sources, transcripts, edits, comments, labels and frames. Every read-only tool needs it. A viewer can never reach a tool that writes.
- Edit
- Everything View permits, plus every tool that changes a project — building and changing edits, transcripts, media and exports.
The catalogue
Read from https://mcp.heyeddie.ai/api/mcp-catalogue at . This page rereads that endpoint about every 5 minutes, so a tool added to the server appears here without a deploy of this site.
- Endpoint
https://mcp.heyeddie.ai/api/mcp- Transport
streamable-http- Protocol version
2025-11-25- Server version
3.0.18- Tools listed
- 75
- Read from
- The live endpoint
Showing all 75 tools.
Sources and media 5
list_sourcesList Available SourcesReads onlyviewGet list of all available transcript sources for a share.
Parameters
shareIdstringrequired- Share ID or full URL (e.g., "abc123" or "https://app.com/share/abc123/mcp")
set_roll_typeSet Source Roll Type (A-roll ↔ B-roll)Changes your projecteditReclassify source file(s) as interview footage (aroll) or cutaway footage (broll) when the automatic classification is wrong — use it when the user says footage is miscategorized, e.g.
Parameters
rollType"aroll" | "broll"required- The CORRECT role: "aroll" = interview/spoken footage (gets a transcript), "broll" = cutaway/overlay footage.
shareIdstringrequired- Share ID
mediaIdsstring[]optional- Multiple sources to reclassify to the same rollType in one call. Which source, from list_sources: its Source ID (preferred — always exact), or its Name (the file extension is optional and matching ignores case, underscores and dashes), or its 1-based number in the list_sources listing. An unknown handle fails with the valid sources; a handle that matches SEVERAL sources fails with the candidates and their ids — it is never guessed at, so pass the Source ID whenever names could collide.
sourceIdstringoptional- Which source, from list_sources: its Source ID (preferred — always exact), or its Name (the file extension is optional and matching ignores case, underscores and dashes), or its 1-based number in the list_sources listing. An unknown handle fails with the valid sources; a handle that matches SEVERAL sources fails with the candidates and their ids — it is never guessed at, so pass the Source ID whenever names could collide. Single source.
source_metadataSource Metadata (read / set / revert)Changes your projecteditRead or edit descriptive metadata on source files: camera_make, camera_model, camera_label, camera_number, scene, shot, shot_type, take, reel_name, shoot_date (YYYY-MM-DD), location, subjec…
Parameters
action"read" | "set" | "revert"required- read = technical + descriptive layers; set = batch-update descriptive fields; revert = restore original or a prior revision.
shareIdstringrequired- Share ID
revertsobject[]optional- action="revert" only: per-source reverts.
sourceIdsstring[]optional- action="read" only: limit to these sources (default: all sources). Which source, from list_sources: its Source ID (preferred — always exact), or its Name (the file extension is optional and matching ignores case, underscores and dashes), or its 1-based number in the list_sources listing. An unknown handle fails with the valid sources; a handle that matches SEVERAL sources fails with the candidates and their ids — it is never guessed at, so pass the Source ID whenever names could collide.
updatesobject[]optional- action="set" only: per-source field patches — batch MANY sources into ONE call.
get_framesGet Frames (images)Reads onlyviewReturn actual frame images so you can SEE the video — for genuinely VISUAL judgment only: framing, shot choice, b-roll content, "does this look right".
Parameters
shareIdstringrequired- Share ID
sourceIdstringrequired- Which source, from list_sources: its Source ID (preferred — always exact), or its Name (the file extension is optional and matching ignores case, underscores and dashes), or its 1-based number in the list_sources listing. An unknown handle fails with the valid sources; a handle that matches SEVERAL sources fails with the candidates and their ids — it is never guessed at, so pass the Source ID whenever names could collide. For mode="clip", any source with a video file.
countintegeroptional- mode="clip": how many evenly-spaced frames to return (default 6, max 12). Need the whole clip? Use mode="scan". Need a closer look at part of it? Make further calls with explicit, narrower startTime/endTime windows instead of raising the count.
endTimenumberoptional- mode="clip": window end in seconds (default source duration; clamped to sourceDurationSec).
maxImagesintegeroptional- mode="segments": max thumbnails to return (default 4, max 8).
maxSheetsintegeroptional- mode="scan": sprite sheets per call (default and max 10 — the whole strip when it fits, else a page; each 5×5 sheet is 25 frames).
mode"clip" | "segments" | "scan"optional- How to pick frames. DEFAULT 'clip' = evenly-spaced frames across a clip window; works on ANY source with a video, NO transcript required (b-roll, montages, not-yet-transcribed footage). 'scan' = the WHOLE clip: every sheet of the frame strip extracted at import, in time order, paged with sheetOffset — the way to look at all of a clip or to search footage visually. 'segments' = frames for specific transcript segments (requires a transcribed source); request it explicitly.
sectionsobject[]optional- mode="segments": time ranges to render (alternative to segmentIndices).
segmentIndicesinteger[]optional- mode="segments": segment indices to render (from get_transcript).
sheetOffsetintegeroptional- mode="scan": 0-based index of the first sprite sheet to return (default 0 = the start of the clip). Pass the previous answer's nextSheetOffset to read the next page.
startTimenumberoptional- mode="clip": window start in seconds (default 0). Must be before the end of the source — a start ≥ sourceDurationSec is an error.
transcribe_sourceTranscribe Source (STT)Changes your projecteditTranscribe ONE source on demand with speech-to-text.
Parameters
shareIdstringrequired- Share ID
sourcestringrequired- The source to transcribe: Source ID from list_sources (preferred), exact file name, or list index.
confirmbooleanoptional- false/omitted = quote the exact charge, change nothing. true = the user approved the quoted charge — charge and start.
languagestringoptional- Force this STT language for THIS run (ISO code like "es", "fr-CA", "pt-BR"; "auto" = detect, the default). Overrides the project's transcription-language setting for the run. An unsupported code fails with the full valid list.
mode"missing" | "replace"optional- "missing" (default) = transcribe a source that has NO transcript. "replace" = re-run STT for a source that already has one and swap it in place.
setProjectDefaultbooleanoptional- With `language`: also save it as the project's transcription-language default for future transcriptions (default false — the override applies to this run only).
Transcripts 3
get_transcriptGet Transcript ContentReads onlyviewFetch transcript segments (timestamps + speakers).
Parameters
shareIdstringrequired- Share ID (e.g., "abc123")
endTimenumberoptional- Only return segments overlapping at/before this second. Single-source only.
includeWordsbooleanoptional- Attach per-word timings (`words`: [{text, start, end}], source-media seconds) to each returned segment — the exact cut points for word/phrase-boundary trims. Single-source only, and only honored on pages of ≤25 segments: narrow with startTime/endTime (or limit) to the moment you are timing.
limitintegeroptional- Max segments to return (default 200, max 500). Single-source only.
offsetintegeroptional- Segment index to start from (default 0). Single-source only.
sourceIdstringoptional- Which source, from list_sources: its Source ID (preferred — always exact), or its Name (the file extension is optional and matching ignores case, underscores and dashes), or its 1-based number in the list_sources listing. An unknown handle fails with the valid sources; a handle that matches SEVERAL sources fails with the candidates and their ids — it is never guessed at, so pass the Source ID whenever names could collide. Omit to fetch ALL sources at once.
startTimenumberoptional- Only return segments overlapping at/after this second. Single-source only.
correct_transcriptCorrect Transcript WordingChanges your projecteditFix misheard words in a source's transcript — names, jargon, homophones ("it's Zahra, not Sarah") — WITHOUT re-transcribing.
Parameters
shareIdstringrequired- Share ID
sourceIdstringrequired- Which source, from list_sources: its Source ID (preferred — always exact), or its Name (the file extension is optional and matching ignores case, underscores and dashes), or its 1-based number in the list_sources listing. An unknown handle fails with the valid sources; a handle that matches SEVERAL sources fails with the candidates and their ids — it is never guessed at, so pass the Source ID whenever names could collide.
correctionsobject[]optional- The corrections to apply (up to 20 per call).
revertAllbooleanoptional- Remove ALL stored corrections for this source instead of adding new ones.
find_transcript_segmentsFind Transcript SegmentsReads onlyviewLocate transcript segments by SPEAKER, text (case-insensitive substring) and/or a time window, without fetching whole transcripts.
Parameters
shareIdstringrequired- Share ID
endTimenumberoptional- Only segments overlapping at/before this second.
kind"transcript" | "sound"optional- What to search. "transcript" (the default) searches spoken words. "sound" searches what the analyser HEARD and OBSERVED — b-roll sound (music, ambience, sound effects, silence) and interview moments (a voice breaking, a long pause, wiping an eye, looking away) — matching the kind, the observed label and the `readsAs` reading, and returns {sourceId, start, end} rows on each source's own timeline. It covers every roll, but only footage that HAS been analysed: sources without sound events or moments return nothing, which means "not analysed", never "silent" and never "nothing happened".
limitintegeroptional- Max matches to return (default 50, max 200).
querystringoptional- Case-insensitive text to search for in segment content.
sourceIdstringoptional- Which source, from list_sources: its Source ID (preferred — always exact), or its Name (the file extension is optional and matching ignores case, underscores and dashes), or its 1-based number in the list_sources listing. An unknown handle fails with the valid sources; a handle that matches SEVERAL sources fails with the candidates and their ids — it is never guessed at, so pass the Source ID whenever names could collide. OMIT to search every transcribed source in the project (A-roll, plus any b-roll with a transcript).
speakerstringoptional- Only segments spoken by this person. Matches the display name, the diarization label, or one word of a full name ("Jill" matches "Jill Okafor"). An unrecognized name fails with the list of real speakers.
startTimenumberoptional- Only segments overlapping at/after this second.
Logs and labels 4
labelApply LabelsChanges your projecteditApply labels to either source media files (target="source") or multicam groups (target="multicam_group").
Parameters
itemsobject[]required- Labels to apply.
shareIdstringrequired- Share ID
target"source" | "multicam_group"required- What to label: individual source files ("source") or multicam groups ("multicam_group").
removebooleanoptional- If true, remove these labels instead of adding them.
tag_segmentsTag/Bookmark Transcript SegmentsChanges your projecteditTag transcript segments of a source. Set action="bookmark" to bookmark them, or action="label" (with a label) to apply a custom label. Target by segmentIndices (preferred — the indices retu…
Parameters
action"bookmark" | "label"required- Whether to bookmark the segments or apply a custom label (requires "label").
shareIdstringrequired- Share ID
sourceIdstringrequired- Which source, from list_sources: its Source ID (preferred — always exact), or its Name (the file extension is optional and matching ignores case, underscores and dashes), or its 1-based number in the list_sources listing. An unknown handle fails with the valid sources; a handle that matches SEVERAL sources fails with the candidates and their ids — it is never guessed at, so pass the Source ID whenever names could collide.
labelstringoptional- The label to add or remove (required when action="label").
removebooleanoptional- If true, remove the bookmark/label from the matched segments.
sectionsobject[]optional- Time ranges to tag (alternative to segmentIndices).
segmentIndicesinteger[]optional- Segment indices to tag (from get_transcript).
get_labelsGet All Labels and ModificationsReads onlyviewView the current bookmarks, deletes, segment labels, source/multicam labels, and edits from the durable saved state (the same state the browser shows).
Parameters
shareIdstringrequired- Share ID
request_aroll_logsGenerate Interview LogsChanges your projecteditStart generating the interview (A-roll) footage logs — organized bins of soundbites/summaries — for a project whose logging was SKIPPED at import (small projects defer it) or FAILED.
Parameters
shareIdstringrequired- Share ID
Multicam 7
get_multicam_anglesGet Multicam AnglesReads onlyviewFor a multicam edit, list the available camera angles (id, role, name, real pixel dimensions/aspect) and which angle is currently active per segment.
Parameters
editNamestringrequired- Edit name to inspect
shareIdstringrequired- Share ID
set_multicam_anglesSet Multicam AnglesChanges your projecteditChoose which camera angle is shown for segments of a multicam edit — i.e.
Parameters
editNamestringrequired- Edit name
shareIdstringrequired- Share ID
assignmentsobject[]optional- Per-segment angle choices (optional when only setting mainCameraId / mainAudioId)
groupstringoptional- Which multicam group this call applies to — a groupId or groupName from get_multicam_angles. Optional (and unnecessary) when the edit uses a single group. REQUIRED alongside mainCameraId / mainAudioId when the edit spans several groups, since those are per-group settings. When given, every assignment must target a segment in that group.
mainAudioIdstringoptional- Set the group's MAIN AUDIO (project-wide, per group): a mediaId, role, or name from get_multicam_angles, belonging to `group` (or to the edit's only group). Becomes the single declared audio angle in NLE exports. Pass 'clear' to return to the default (the group's reference audio).
mainCameraIdstringoptional- Set the group's MAIN CAMERA (project-wide, per group — not per segment): a mediaId, role, or name from get_multicam_angles, belonging to `group` (or to the edit's only group). Becomes the default active angle on exported mc-clips and the first mc-angle. Pass 'clear' to remove the choice.
create_multicam_groupCreate Multicam GroupChanges your projecteditCreate a multicam group FROM SCRATCH when cameras of the same take were NOT auto-grouped at import (list_sources shows them as `Multicam Group: None`).
Parameters
shareIdstringrequired- Share ID
anglesobject[]optional- Every camera other than the reference, with offsets.
clearbooleanoptional- true = remove a user-created group instead.
groupstringoptional- With clear: the user-created group id to remove.
namestringoptional- Short name for the group (e.g. "interview"). Same name = same group (re-calls replace it). Defaults to the reference filename.
offsetSource"measured" | "user_supplied"optional- REQUIRED whenever you pass `angles` (per-angle `offsetSource` overrides it). "measured" = you read the offset off matching transcript timestamps or a moment both cameras captured. "user_supplied" = the human gave or confirmed this exact number. There is no third option: if neither is honestly true, do not call this tool — ask the user for the offset, or run resync_all_multicam to measure it.
referencestringoptional- The reference camera (source id or filename from list_sources) — the timing anchor, offset 0. Prefer the camera that covers the whole take.
ungroup_multicamUngroup MulticamChanges your projecteditDissolve a multicam group so its files behave as INDEPENDENT sources — use when import auto-grouped files that are NOT simultaneous camera angles of the same take (e.g.
Parameters
groupstringrequired- The group to dissolve: a multicam group id from list_sources, or any source in the group (id, filename, or list index).
shareIdstringrequired- Share ID
confirmbooleanoptional- Required (true) only when saved edits reference the group — confirm with the user first.
assign_media_to_multicam_groupAssign Media to Multicam GroupChanges your projecteditAdd a newly-added clip to an EXISTING multicam group as another camera angle of the same take, when it was imported separately and did not auto-join.
Parameters
shareIdstringrequired- Share ID
sourceIdstringrequired- The newly-added clip to add (source id from list_sources)
targetGroupstringrequired- Existing group to add it to: a multicam group id, or a source id/filename already in that group
resync_all_multicamRe-sync All CamerasChanges your projecteditAutomatically find and sync ALL camera angles across an entire project in one pass — including cameras added later via "Add media" — with no manual pairing.
Parameters
shareIdstringrequired- Share ID
commitbooleanoptional- true = apply the previously-proposed grouping (requires proposalId). Omit/false = analyze and propose (charges, changes nothing).
onContradiction"apply_measured" | "keep_applied"optional- Only needed if a commit was refused with contradiction=true (a camera is already synced at an offset that materially disagrees with what the sync run measured). Show the user the reported numbers and let THEM choose: "apply_measured" (recommended — replace the applied offsets with the measured ones) or "keep_applied" (leave those cameras exactly as they are and commit the rest). Never pick one on the user's behalf.
proposalIdstringoptional- With commit=true: the proposalId returned by the propose step to apply.
get_multicam_resync_statusGet Camera Sync StatusReads onlyviewCheck what happened to a project-wide camera sync started by resync_all_multicam.
Parameters
shareIdstringrequired- Share ID
runIdstringoptional- The runId returned by resync_all_multicam. Omit to report the most recent camera sync for this project.
Build and change edits 17
remove_contentRemove Content (cut words or delete segments)Changes your projecteditRemove spoken content from a SOURCE, reversibly (set restore:true with the same target to undo).
Parameters
shareIdstringrequired- Share ID
sourceIdstringrequired- Which source, from list_sources: its Source ID (preferred — always exact), or its Name (the file extension is optional and matching ignores case, underscores and dashes), or its 1-based number in the list_sources listing. An unknown handle fails with the valid sources; a handle that matches SEVERAL sources fails with the candidates and their ids — it is never guessed at, so pass the Source ID whenever names could collide.
confirmbooleanoptional- Pass true ONLY when re-issuing an identical call after the tool returned a needs_confirmation preview for a large removal, and only after verifying the preview matches what the user asked to remove.
nearstringoptional- Surrounding text to disambiguate which occurrence (the unique words around the target).
occurrencestring | integeroptional- "all" to cut every occurrence (good for filler), or the 1-based index of one specific occurrence.
phrasestringoptional- The exact words to cut, as they appear in the transcript (e.g. "um", "you know", "I, I think").
restorebooleanoptional- If true, reverse (un-delete / un-cut) whatever the same target specifies.
sectionsobject[]optional- Time ranges (SOURCE-media seconds). Whole-segment coverage deletes the segment; a partial range cuts just those words.
segmentIdstringoptional- Restrict the phrase search to a single segment id.
segmentIdsstring[]optional- PREFERRED whole-segment targeting: exact segment ids (the `segmentId` field from get_transcript / find_transcript_segments for THIS source). Unknown ids are a hard error.
segmentIndicesinteger[]optional- 0-based SOURCE-transcript indices to delete wholesale (from get_transcript for this source, NEVER from get_edit). Out-of-range indices are a hard error. Prefer segmentIds.
trim_segmentTrim SegmentChanges your projecteditAdjusts what ONE edit segment plays, in two modes (edit-scoped — the source is never touched):
Parameters
editNamestringrequired- Edit to modify (from list_edits).
indexintegerrequired- Segment index from get_edit(format="segments").
shareIdstringrequired- Share ID
cutInSecnumberoptional- MID-SEGMENT CUT: start of the range to remove, in SOURCE-media seconds (inside the segment's startTime/endTime from get_edit format="segments"). Requires cutOutSec; not combinable with extendHeadSec/extendTailSec.
cutOutSecnumberoptional- MID-SEGMENT CUT: end of the range to remove, in SOURCE-media seconds (must be greater than cutInSec).
extendHeadSecnumberoptional- Seconds to extend the head EARLIER into the source (negative tightens). E.g. 0.5 starts the clip half a second sooner.
extendTailSecnumberoptional- Seconds to extend the tail LATER into the source (negative tightens).
remove_from_editRemove Segments From Edit (edit-scoped)Changes your projecteditRemove whole segments from ONE edit's timeline — the mirror-image of remove_content: this edits the EDIT only and leaves the SOURCE untouched (no reject marks; the material stays available…
Parameters
editNamestringrequired- Edit to modify (from list_edits).
shareIdstringrequired- Share ID
confirmbooleanoptional- Pass true ONLY when re-issuing an identical call after the tool returned a needs_confirmation preview for a large removal, and only after verifying the preview matches what the user asked to remove.
segmentIdsstring[]optional- Edit-segment ids to remove — the `segmentId` values from get_edit(format="segments") for this edit. Unknown ids are a hard error.
segmentIndicesinteger[]optional- 0-based EDIT-segment indices to remove — the `index` values from get_edit(format="segments") for THIS edit, NEVER from get_transcript. Out-of-range indices are a hard error.
include_pauseInclude PauseChanges your projecteditRe-includes the silence/action that was cut between two adjacent segments of an edit — the pause becomes a real (textless) segment that plays, renders, and exports like any clip.
Parameters
editNamestringrequired- Edit to modify (from list_edits).
shareIdstringrequired- Share ID
afterIndexintegeroptional- Index (from get_edit format="segments") of the segment the pause follows. For multiple pauses use afterIndices instead.
afterIndicesinteger[]optional- Batch form (PREFERRED for ranges): indices of ALL segments whose following pause should be included, in one call. All indices refer to the ORIGINAL get_edit segment order — do not re-fetch between items.
analyze_editAnalyze Edit (video feedback)Changes your projecteditGets professional editorial feedback on an edit by RENDERING it and having a video-understanding model (Gemini) actually watch it — story, pacing, hook, cut list with timestamps, audio issu…
Parameters
shareIdstringrequired- Share ID
analysisIdstringoptional- Poll mode: fetch the status/result of a previously started analysis. Must be the EXACT analysisId string the start call returned (format "an-<uuid>") — never a placeholder, template, or invented value.
editNamestringoptional- Edit to analyze (from list_edits). Required to start.
feedback_as_commentsbooleanoptional- Post the feedback as timestamped Eddie comments on the edit timeline instead of returning prose. Use when the user asks for feedback/notes/a review of the edit.
questionstringoptional- Optional specific question to focus the feedback on (e.g. "does the opening hook work?").
layout_editSet Edit Canvas & LayoutChanges your projecteditGive an edit its own canvas (aspect ratio) and place video layers on it — e.g.
Parameters
editNamestringrequired- Edit to lay out
shareIdstringrequired- Share ID
canvasobjectoptional- Canvas size/aspect. Required unless clear=true. Preset or explicit pixel dimensions.
clearbooleanoptional- Remove the layout instead of setting one.
layersobject[]optional- Video layers (the edit-level default). At most one V1 and one V2 entry. Omit for a bare canvas change.
segmentOverridesobject[]optional- Per-segment layer overrides — e.g. full-frame whoever is speaking on their segments, split-screen everywhere else. Segments not listed use the edit-level layers. Replaces ALL previous overrides each call.
create_edit_resultCreate Edit ResultChanges your projecteditCreate a new edit sequence from soundbites across one or more sources.
Parameters
editNamestringrequired- Unique name for this edit sequence (1-3 words, latin characters only, no emojis or special characters). MUST be different from all prior edit names in this share.
shareIdstringrequired- Share ID
soundbitesobject[]requiredallowDuplicatesbooleanoptional- Set true ONLY when the user deliberately wants the SAME footage placed more than once in this cut (a shot reprised at the end, a deliberate callback). It turns off the repeated-footage guard for this call. Leave it off for ordinary builds — the guard is what stops several soundbites that landed on one long transcript segment writing that segment over and over.
allowPartialFootagebooleanoptional- Set true ONLY when the USER has explicitly chosen to build now from partial footage. When this project still has sources importing and your frame reads for it came back empty, this build is otherwise held with a message saying how many sources are ready. Before setting it, tell the user what is still importing and that it will be missing from the cut — never set it silently, and never hide the hold from them.
minimumDurationMinutesnumberoptional- The FLOOR of the user's ask, in minutes — set when they stated a RANGE ("28-30 minutes" → 28, with targetDurationMinutes 29) or an explicit MINIMUM ("at least 20 minutes" → 20). A result materially under it (below ~90%) is flagged underDurationFloor and must not be narrated as done: lengthen it with additional real segments (append_to_edit), never padding. Has no effect without targetDurationMinutes, and never combined with targetIsMaximum.
targetDurationMinutesnumberoptional- How long this cut is meant to run, in minutes. Use the length the user asked for ("make it about ten minutes" → 10); if they gave none, use the target list_sources proposed from the amount of footage. Omit ONLY when neither is available — the tool then falls back to the footage-derived target so the result is still measured against something. When the number came from the USER and the build lands materially under it (below ~80%), the result carries underDurationTarget and must not be reported as done at their number: extend it with real segments, or say plainly how long it runs and why the footage supports no more. Materially OVER it (above ~120%) carries overDurationTarget and is the same failure in the other direction: tighten the cut to their length, or say plainly how long it runs and why.
targetIsMaximumbooleanoptional- Set true when targetDurationMinutes is a HARD CAP the user stated ("45 seconds max", "no longer than a minute", "keep it under 90s") rather than a goal. The length check then treats ANY overshoot as a failure: the result carries overDurationCap and must not be narrated as done until the edit is trimmed to fit. Has no effect without targetDurationMinutes.
append_to_editAppend to EditChanges your projecteditAppend soundbites to the END of an EXISTING edit's spine.
Parameters
editNamestringrequired- The name of the EXISTING edit to append to.
shareIdstringrequired- Share ID
soundbitesobject[]requiredallowDuplicatesbooleanoptional- Set true ONLY when the user deliberately wants footage that is already on this edit placed a SECOND time (a shot reprised at the end, a deliberate callback). It turns off the already-present guard for this call, so the clips are appended as copies. Leave it off for ordinary appends — the guard is what stops a build accumulating accidental duplicates.
allowPartialFootagebooleanoptional- Set true ONLY when the USER has explicitly chosen to build now from partial footage. When this project still has sources importing and your frame reads for it came back empty, this build is otherwise held with a message saying how many sources are ready. Before setting it, tell the user what is still importing and that it will be missing from the cut — never set it silently, and never hide the hold from them.
minimumDurationMinutesnumberoptional- The FLOOR of the user's ask, in minutes — a stated RANGE's low end ("28-30 minutes" → 28) or an explicit MINIMUM ("at least 20 minutes" → 20). While the edit's new total stays materially under it (below ~90%) the result carries underDurationFloor and must not be narrated as done — keep appending real material. Has no effect without targetDurationMinutes, and never combined with targetIsMaximum.
targetDurationMinutesnumberoptional- How long the finished edit is meant to run, in minutes — the length the user asked for, or the target list_sources proposed. The response reports the edit's NEW total duration against it, so you can tell whether this append got there. While a USER-stated target is still materially unmet (below ~80%) the result carries underDurationTarget, and an append that carries the total materially PAST it (above ~120%) carries overDurationTarget. Omit to fall back to the footage-derived target.
targetIsMaximumbooleanoptional- Set true when targetDurationMinutes is a HARD CAP the user stated ("45 seconds max", "no longer than a minute") rather than a goal. An append that leaves the edit over the cap is flagged overDurationCap and must be trimmed back before the cut is described as done. Has no effect without targetDurationMinutes.
add_breakAdd Visual Break (dead space)Changes your projecteditInsert a visual break — empty "breathing room" between sections of an edit, for documentary pacing (let the viewer breathe between topics).
Parameters
durationSecondsnumberrequired- How long the break lasts, in seconds (0.1–600). Typical breathing room is 1–4s; a title/establishing beat 3–6s.
editNamestringrequired- Name of the existing edit to add the break to.
shareIdstringrequired- Share ID
afterSegmentIdstringoptional- Insert the break AFTER the segment with this id. Alternative to afterSegmentIndex.
afterSegmentIndexintegeroptional- Insert the break AFTER the segment at this 0-based index (from get_edit / list). Omit with afterSegmentId/atStart.
atStartbooleanoptional- Insert the break at the very START of the edit.
create_video_sequenceCreate Video Sequence (clip edit, no transcript spine)Changes your projecteditCreate an edit whose timeline IS an ordered sequence of trimmed video clips — NO A-roll/transcript spine, StoryJson, or container required.
Parameters
editNamestringrequired- Unique name for this edit (1-3 words, latin characters only). A name that collides with an existing edit is de-duplicated ("… 2") rather than refused — read `editName` back off the response and use that.
shareIdstringrequired- Share ID
allowPartialFootagebooleanoptional- Set true ONLY when the USER has explicitly chosen to build now from partial footage. When this project still has sources importing and your frame reads for it came back empty, this build is otherwise held with a message saying how many sources are ready. Before setting it, tell the user what is still importing and that it will be missing from the cut — never set it silently, and never hide the hold from them.
clipsobject[]optional- Ordered clips; they play back-to-back in this order. Use when the in/out points differ per clip; for a uniform batch use `sourceIds` instead. Exactly one of `clips` / `sourceIds` is required.
clipSecondsnumberoptional- Seconds per clip for the `sourceIds` form (default 4 — a still's own fixed length, so N photos is exactly N×4 seconds). Ignored when `clips` is used.
sourceIdsstring[]optional- Ordered source ids — one clip per id, each trimmed 0→clipSeconds and clamped to the real source length. Use INSTEAD of `clips` for a large uniform batch (e.g. every photo in the project, in order). Produces exactly the same timeline as the equivalent `clips` array.
list_editsList EditsReads onlyviewList the edits saved for this share (name, segment count, duration), plus at-a-glance counts of what is stored on each: `cropCount` (per-segment reframes from crop_segments), `graphicsCount…
Parameters
shareIdstringrequired- Share ID
get_editGet EditReads onlyviewGet an edit in one of three formats (set `format`):
Parameters
editNamestringrequired- Edit name from list_edits
shareIdstringrequired- Share ID or full URL
format"segments" | "timeline" | "export"optional- 'segments' = paginated edit segments; 'timeline' = visible-clip timeline; 'export' = flat frame-accurate multi-track NLE timeline.
includeMarkersbooleanoptional- format="export" only: include per-clip spoken text + speaker (for markers/clip names). Default false to keep the payload small — only set true when you actually need markers, since dumping a long transcript can bloat context and degrade FCPXML/OTIO accuracy.
limitintegeroptional- format="segments" only.
offsetintegeroptional- format="segments" only.
delete_editDelete EditRemoves thingseditDelete an edit from this share by name. DESTRUCTIVE and permanent — it discards the whole edit (every cut, plus its captions, b-roll, titles and graphics). Do NOT use this to make a scoped…
Parameters
editNamestringrequired- Edit name to delete
shareIdstringrequired- Share ID
confirmbooleanoptional- Set true ONLY when the user has EXPLICITLY asked to delete this edit or rebuild it from scratch. A built edit cannot be deleted without this. If the user asked for a scoped change (remove captions, remove gaps, trim, drop a clip), leave this off and use the targeted tools instead.
confirmBatchbooleanoptional- Whole-batch confirmation, separate from `confirm`. A delete that is not the first of this run, or that would leave the project with no edits, returns a preview of every edit and its segment count instead of deleting. Read that preview as a BATCH, tell the user which edits go, then re-issue with confirmBatch:true. Pass it on every remaining delete in the run — the confirmation is given once, not per edit.
undo_last_changeUndo Last Change (revert project state to a revision)Removes thingseditRevert the project's durable state to an earlier revision — the recovery path after a BAD destructive write (a mistaken remove_content, remove_from_edit or delete_edit).
Parameters
shareIdstringrequired- Share ID
confirmbooleanoptional- Pass true ONLY when re-issuing the identical call after reviewing the preview diff, and only if the diff matches what the user wants reverted.
toRevisionintegeroptional- The revision to revert to — use the `baseRevision` echoed by the destructive call you are undoing. Defaults to the revision immediately before the current head (undoes the most recent write).
list_edit_versionsList Edit Versions (history of one edit)Reads onlyviewShow the saved version history of an edit — every revision at which THAT edit actually changed, with when it changed, WHO wrote it, and how many segments and bytes it held at the time.
Parameters
shareIdstringrequired- Share ID or full URL
beforeintegeroptional- Page further back: return only versions OLDER than this revision. Pass the `nextBefore` from the previous page. Omit for the most recent versions. Ignored without editName.
editNamestringoptional- The edit to show history for — from list_edits, or the name the user remembers even if list_edits no longer shows it. Omit for a rollup of every edit the project has ever had.
limitintegeroptional- How many versions to return per page (default 10, max 50). Ignored without editName.
restore_edit_versionRestore Edit Version (clone an old version back)Changes your projecteditBring back an earlier version of an edit, listed by list_edit_versions.
Parameters
editNamestringrequired- The edit whose version to restore — the ORIGINAL name, even if the edit is gone from the current state.
revisionintegerrequired- The revision to restore, from list_edit_versions. Must be a revision at which this edit actually existed.
shareIdstringrequired- Share ID or full URL
rename_editRename EditChanges your projecteditRename an edit. The new name must be unique for the share.
Parameters
editNamestringrequired- Current edit name
newNamestringrequired- New unique edit name
shareIdstringrequired- Share ID
B-roll 7
add_brollsAdd B-rolls to EditChanges your projecteditAdd visual-only B-roll placements on top of an existing edit.
Parameters
editNamestringrequired- Name of the existing edit to add B-rolls to
shareIdstringrequired- Share ID
clearbooleanoptional- If true, remove ALL existing B-roll placements from this edit. Alone it clears the B-roll track; with placements it rebuilds the track from only these placements.
instructionsstringoptional- Optional editorial guidance for choosing B-rolls, e.g. match barber shop visuals to barber shop A-roll.
libraryOffsetintegeroptional- Index to start listing the B-roll library from on an inspect call. The library is listed a page at a time; when a page is truncated the response carries a "libraryPage" block with the totals and the nextOffset to pass here. Every id in the project is placeable, whichever page it appeared on.
placementsobject[]optional- B-roll placements chosen by the calling AI agent. Omit on the first call to inspect available B-roll options.
removeinteger[]optional- A-roll segment indices whose existing B-roll placements should be deleted. Use alone to just remove B-roll, or together with placements to delete and insert in one atomic call. Other segments are never shifted.
replacebooleanoptional- If true, existing B-roll on each placement's target A-roll segment is removed before the new placement is laid down — swap a segment's cutaway in one atomic call. Without it placements are additive and only fill whatever room the target segment has left.
find_stock_brollFind Stock B-roll FootageChanges your projecteditSearch stock footage for b-roll matching the themes of this project: free Pexels always, PLUS the user's own Shutterstock catalog when they have connected their Shutterstock API key (Integr…
Parameters
shareIdstringrequired- Share ID
themesobject[]required- Themes to find footage for (max 6 per call)
minDurationSecnumberoptional- Shortest usable clip in seconds (pass the intended cutaway length; default 4)
orientation"landscape" | "portrait"optional- Project orientation — 'portrait' for vertical/social projects. Defaults to landscape.
import_stock_brollImport Stock B-roll FootageChanges your projecteditImport stock clips the user chose from find_stock_broll results into this project as b-roll sources.
Parameters
clipsobject[]required- The clips the user chose (max 5 per call)
shareIdstringrequired- Share ID
generate_brollGenerate AI B-roll FootageChanges your projecteditGenerate a short AI b-roll clip when neither the project's own footage nor stock has what a moment needs.
Parameters
shareIdstringrequired- Share ID
themestringrequired- What the covered moment is about, in the speaker's own terms (e.g. "the team shipping late at night") — Eddie turns this into a concrete filmable shot
confirmbooleanoptional- FALSE/omitted = free quote only, nothing generated or charged. TRUE = charge and start generating (only after the user agreed to the quoted price).
contextstring[]optional- Up to 4 short transcript lines from the clips being covered — the single biggest lever on whether the generated shot fits
orientation"landscape" | "portrait"optional- Match the project's aspect (default 'landscape'; use 'portrait' for vertical/social projects)
promptstringoptional- Explicit shot description, overriding derivation from theme/context. Use when the user described the shot themselves.
tier"best" | "standard" | "budget"optional- Quality/price tier (default 'standard'). Quote each tier the user asks about before spending.
request_broll_logsGenerate B-roll LogsChanges your projecteditRe-drive the B-roll footage logging (b-roll analysis) for a project whose b-roll logging FAILED, and report the current b-roll logging state otherwise.
Parameters
shareIdstringrequired- Share ID
generate_broll_subclipsGenerate B-roll Subclips (guided)Changes your projecteditCut the project's b-roll sources into SUBCLIPS chosen by the user's own guidance, and add them to the b-roll library so add_brolls and the sequence tools can use them.
Parameters
guidancestringrequired- REQUIRED. The user's own words for what the subclips should be of — the rubric clips are selected BY. Never invent this; elicit it in conversation first. e.g. "wide establishing aerials with smooth movement, nothing with people in frame".
shareIdstringrequired- Share ID
confirmbooleanoptional- false/omitted = state the price, change nothing. true = the user agreed to the rates — charge and start.
maxPerSourceintegeroptional- Maximum subclips to cut per source (default 3). Raising it CAN raise the price: every clip produced carries a 10-credit minimum, so a scope that would otherwise be billed on its duration can end up billed on its clip count instead. Raise it when the user wants more coverage, not by default.
scopestring[]optional- Optional b-roll source ids to analyse (from list_sources / the b-roll library). Omit to analyse every b-roll source in the project. Ids that are not analysable b-roll are refused rather than silently skipped.
get_broll_statusB-roll Subclip Status (free)Reads onlyviewFREE, read-only status of guidance-driven b-roll SUBCLIP generation for a project.
Parameters
shareIdstringrequired- Share ID
Look and motion 11
crop_segmentsCrop Edit SegmentsChanges your projecteditSets a normalized crop rectangle per segment WITHIN A SPECIFIC EDIT; the crop is shown during timeline-view playback in the web app.
Parameters
cropsobject[]requirededitNamestringrequired- The edit these crops apply to (from list_edits / get_edit). Crops are stored per-edit and only affect this edit.
shareIdstringrequired- Share ID
clearbooleanoptional- If true, remove crops for the given segmentIndices instead of setting them.
stabilize_segmentsStabilize Edit Segments (shaky drone / handheld)Changes your projecteditSmooths out SHAKY footage on the given segments WITHIN A SPECIFIC EDIT — drone, gimbal-less handheld, walking shots.
Parameters
editNamestringrequired- The edit these stabilization flags apply to (from list_edits / get_edit). Flags are stored per-edit and only affect this edit.
segmentIndexesinteger[]required- The 0-based segment `index` values from get_edit(format="segments") to (un-)stabilize.
shareIdstringrequired- Share ID
enablebooleanoptional- true (default) stabilizes the segments; false un-stabilizes them (reverts to the original footage).
animate_segmentsAnimate Edit Segments (Ken Burns / punch-in)Changes your projecteditAdds a subtle motion ramp (Ken Burns / slow punch-in / pan) to segments WITHIN A SPECIFIC EDIT — shown in the web player preview and baked into MP4 renders.
Parameters
editNamestringrequired- The edit these motions apply to (from list_edits). Motion is stored per-edit and only affects this edit.
motionsobject[]required- One entry per segment to animate (or clear).
shareIdstringrequired- Share ID
set_motion_styleSet Motion Style (cinematic movement on/off)Changes your projecteditSets the PROJECT-WIDE motion style — whether Eddie's "cinematic motion" house style is on.
Parameters
shareIdstringrequired- Share ID
style"cinematic" | "static"required- "cinematic" = auto motion ON (Ken Burns on stills + subtle push/drift on b-roll & montage clips, plus subtle jump-cut reframes on talking-head cuts where enabled); "static" = ALL auto motion OFF — every clip, talking-head spine included, holds still. Explicit per-segment motion is unaffected either way.
set_transitionsSet Transitions (fade in / fade out / dissolve)Changes your projecteditAdds or removes TRANSITIONS on segments WITHIN A SPECIFIC EDIT — fade in (from black at the start of a chosen segment), fade out (to black at the end of a chosen segment), and cross DISSOLV…
Parameters
editNamestringrequired- The edit these transitions apply to (from list_edits). Transitions are stored per-edit and only affect this edit.
shareIdstringrequired- Share ID
transitionsobject[]required- One entry per transition to set (or clear).
grade_editColor Grade EditChanges your projecteditApplies a color grade (a "look") to ONE EDIT — this edit only; other edits sharing the same footage are never affected.
Parameters
editNamestringrequired- Edit to grade (from list_edits). Only this edit changes.
shareIdstringrequired- Share ID
clearbooleanoptional- If true, remove this edit's entire grade (whole-edit look + source overrides) instead of setting it.
contrastnumberoptional- Contrast multiplier, ~0.5–1.5 (1 = neutral).
exposurenumberoptional- Brightness multiplier, ~0.5–1.5 (1 = neutral).
saturationnumberoptional- Saturation multiplier, 0–2 (1 = neutral, 0 = black & white).
sourceOverridesobject[]optional- Per-source refinements WITHIN this edit; each entry layers over the whole-edit look for that source only.
temperaturenumberoptional- Cool ↔ warm, -100..100 (0 = neutral).
tintnumberoptional- Green ↔ magenta, -100..100 (0 = neutral).
set_titlesSet Title TrackChanges your projecteditSets an edit's title (T1) track: on-screen text items with start/end times in TIMELINE seconds (the edit's own playback clock, not source time).
Parameters
editNamestringrequired- Edit whose title track to set (from list_edits).
shareIdstringrequired- Share ID
titlesobject[]required- The full title list (replaces existing). Empty = clear. Each item has EXACTLY these fields: text, startSec, endSec, optional fontFamily, color, position, entrance, entranceSeed — no other field names are accepted.
add_graphicAdd Motion GraphicChanges your projecteditAdds an animated motion-graphic overlay to an edit from a curated template, placed in TIMELINE seconds.
Parameters
editNamestringrequired- Edit to place the graphic on (from list_edits).
shareIdstringrequired- Share ID
clearbooleanoptional- true = delete ALL graphics on this edit.
endSecnumberoptionalidstringoptional- Existing graphic id to replace in place.
propsobjectoptional- The template's props (see template contracts).
removestringoptional- Graphic id to delete.
startSecnumberoptionalstylePack"eddie-default" | "editorial-bold" | "explainer" | "bold-social" | "signal" | "clean-white"optional- Style pack for this edit's graphics. Sets the edit default (same as set_style_pack) and styles this graphic.
template"kinetic-title" | "lower-third" | "stat-callout"optional- Template to use (required unless remove/clear).
set_style_packSet Motion-Graphics Style PackChanges your projecteditSets the STYLE PACK for an edit's motion graphics — one named preset bundling type, palette and card treatment, so every graphic on the edit shares one designed look.
Parameters
editNamestringrequired- Edit to style (from list_edits).
pack"eddie-default" | "editorial-bold" | "explainer" | "bold-social" | "signal" | "clean-white"required- Style pack to apply to this edit.
shareIdstringrequired- Share ID
add_captionsAdd CaptionsChanges your projecteditAdds a caption track to an edit. Pick a designed `look` first: 'social' — big karaoke word-pop on a solid rounded band per line, bold yellow active word (the loud, social/vertical style); '…
Parameters
editNamestringrequired- Edit to caption (from list_edits).
shareIdstringrequired- Share ID
activeColorstringoptional- Highlight color for the word being spoken (hex). Default #39E0A6. Ignored for 'static' captions (no per-word highlight).
background"none" | "pill" | "scrim"optional- Per-line background band: 'pill' = solid rounded band, 'scrim' = soft translucent wash, 'none' = bare text with shadow. Overrides the look's band. Default none (social = pill, documentary = scrim).
bandOpacitynumberoptional- Background band opacity override (pill default 0.6, scrim 0.38). Ignored without a band.
clearbooleanoptional- Remove the caption track instead of adding it.
colorstringoptional- Word/text color (hex). Default #FFFFFF. For static captions this is the only color used.
entrance"none" | "fade-up" | "slide-in" | "drop-in" | "random"optional- Per-card entrance animation: 'fade-up' = every card fades in while rising; 'slide-in' = slides in from the left; 'drop-in' = falls in from above; 'random' = varied entrance per card, deterministic from entranceSeed so preview == export. Default none (cards cut in).
entranceSeedintegeroptional- Seed for the 'random' entrance variation (stored so the web preview and the MP4 bake move identically). Absent = rolled once server-side.
fontFamilystringoptional- Brand/workspace font family for the caption text (a face uploaded to the workspace, so the MP4 burn-in stages the same file the preview shows). Default Arial Black. Latin lines only — non-Latin scripts keep their bundled face for glyph coverage.
fontPackFamily"Open Sauce Two" | "Libre Franklin" | "Fraunces" | "Chivo" | "Space Grotesk"optional- A bundled display typeface for latin caption text — one the MP4 bake also stages, so preview and export match. Default is the classic Arial Black. 'Chivo' is heaviest (short-form), 'Libre Franklin' is a news gothic, 'Fraunces' is an editorial serif. Non-latin scripts keep their own face either way. A workspace-uploaded `fontFamily` overrides this.
keepFillersbooleanoptional- Keep filler words (um, uh, er, hmm, "you know" tics) in the caption text. Default false — fillers are stripped from captions (never from the audio or transcript). Set true only when the user explicitly asks for verbatim captions.
look"social" | "documentary" | "minimal" | "punch" | "editorial"optional- Designed caption look: 'social' = big word-pop on a rounded band, yellow highlight; 'documentary' = calm static phrases on a soft wash; 'minimal' = small bare text; 'punch' = short-form/vertical style, TWO words a card, very large upper-case, green highlight, no band; 'editorial' = explainer style, four words a card in a news gothic on a soft wash. Sets defaults for the params below; any explicit param overrides its field.
position"bottom" | "center"optional- Vertical placement of the caption band. Default bottom.
sizeFractionnumberoptional- Font size as a fraction of canvas height (default 0.06).
style"word-pop" | "static"optional- 'word-pop' (default) = animated karaoke-style, each word pops/highlights as it's spoken. 'static' = plain subtitle block, whole phrase appears at once, no per-word animation.
uppercasebooleanoptional- Render caption text UPPERCASED (display only — stored words keep their transcript casing). Default false.
wordsPerCardintegeroptional- How many words a caption card may hold (1-12; default 7). This is the biggest lever on how captions read: 7 is subtitle rhythm, 2-3 is the short-form creator rhythm. Cards still break earlier at sentence ends and real pauses.
add_watermarkAdd Brand WatermarkChanges your projecteditPlaces the project's Brand kit logo as a persistent watermark overlay on an edit — the whole edit by default, or a timed span with startSec/endSec.
Parameters
editNamestringrequired- Edit to watermark
shareIdstringrequired- Share ID
clearbooleanoptional- Remove the watermark instead of setting one.
endSecnumberoptional- End of the watermark window, timeline seconds. Omit (with startSec) for the whole edit.
position"top-left" | "top-right" | "bottom-left" | "bottom-right"optional- Named corner for the logo. Required unless `rect` is given (or clear=true).
rectobjectoptional- Custom normalized placement rect (x,y,w,h, 0..1) on the canvas — an escape hatch for finer control than a named corner. Overrides `position` when both are given (position is still stored, snapped to the nearest corner, for export labeling).
sizeFractionnumberoptional- Logo width as a fraction of canvas width. Default 0.12 (~12%).
startSecnumberoptional- Start of the watermark window, timeline seconds. Omit (with endSec) for the whole edit.
Sound 5
add_music_trackAdd Soundtrack (Music Track)Changes your projecteditPuts a soundtrack on an edit's music (M1) track, from EITHER of two places.
Parameters
editNamestringrequired- Edit to attach the soundtrack to (from list_edits).
shareIdstringrequired- Share ID
duckingobjectoptional- Transcript-driven auto-ducking under speech. Omitted = enabled with defaults.
durationSecnumberoptional- Track length in seconds — match the edit's duration (10–300). Required to generate.
lengthGovernance"picture" | "track"optional- THE USER'S ANSWER to the length question — required only when the tool has already refused with one. 'picture' = the cut governs (the bed is clamped/looped to the edit; this is what every soundtrack did before the shelf). 'track' = the track governs (nothing is trimmed; the edit is meant to grow to the track's length). Do NOT supply a value the user did not give you.
promptstringoptional- Music description: genre, mood, tempo, instrumentation, arc. Required to generate; omit to only update `ducking` on the existing track.
removebooleanoptional- If true, remove the edit's music track instead.
titlestringoptional- Short display title for the track (default: prompt).
trackIdstringoptional- Attach this track from the workspace music shelf (FREE). Omit to attach whatever the project has attached in its context picker. Ignored when `prompt` is given. Never an upload — the shelf is filled on the /music page.
detect_beatsDetect Beats (Music Beat Grid)Changes your projecteditMeasures (or reads) the BEAT GRID of music — bpm, beat timestamps and a confidence score — so cuts can land on the beat.
Parameters
shareIdstringrequired- Share ID
editNamestringoptional- Analyze this edit's attached soundtrack (from list_edits). Pass exactly one of editName / sourceId.
forcebooleanoptional- Re-analyze past the cache (a fresh PAID analysis). Only useful when the audio itself changed.
sourceIdstringoptional- Analyze a project source instead (music imported as footage). Which source, from list_sources: its Source ID (preferred — always exact), or its Name (the file extension is optional and matching ignores case, underscores and dashes), or its 1-based number in the list_sources listing. An unknown handle fails with the valid sources; a handle that matches SEVERAL sources fails with the candidates and their ids — it is never guessed at, so pass the Source ID whenever names could collide.
snap_cuts_to_beatsSnap Cuts to BeatsChanges your projecteditNudges an edit's CUT points onto the nearest beat of analyzed music, so the cuts read as intentional and musical — the finishing move for a music-driven or rhythmic cut.
Parameters
editNamestringrequired- Edit whose cuts to snap (from list_edits).
shareIdstringrequired- Share ID
sourceIdstringoptional- Snap against this analyzed project source's beat grid instead of the edit's own soundtrack. Which source, from list_sources: its Source ID (preferred — always exact), or its Name (the file extension is optional and matching ignores case, underscores and dashes), or its 1-based number in the list_sources listing. An unknown handle fails with the valid sources; a handle that matches SEVERAL sources fails with the candidates and their ids — it is never guessed at, so pass the Source ID whenever names could collide.
toleranceSecnumberoptional- How far a cut may move to reach a beat, in seconds (0.05–1, default 0.3). A cut only ever moves to one of its two adjacent beats — it never crosses a beat.
set_track_muteMute / Unmute a Timeline TrackChanges your projecteditMutes or unmutes one whole audio lane of an edit's timeline, by name — the same per-edit setting as the speaker toggles on the share view's timeline rails, so the player, the cloud MP4 rend…
Parameters
editNamestringrequired- Edit whose track to mute (from list_edits).
mutedbooleanrequired- true silences the lane in playback and every export; false restores its audio.
shareIdstringrequired- Share ID
track"original" | "voiceover" | "music"required- Which lane: 'original' = the clips' own synced camera audio (V1 dialogue spine), 'voiceover' = the VO lane's generated narration clips, 'music' = the M lane's soundtrack.
generate_voiceoverGenerate Voice-over (TTS)Changes your projecteditGenerates a spoken voice-over clip with AI (ElevenLabs TTS) and places it on the edit's timeline at `startSec` (TIMELINE seconds — the edit's own playback clock).
Parameters
editNamestringrequired- Edit to attach the voice-over to (from list_edits).
shareIdstringrequired- Share ID
confirmShorterReplacementbooleanoptional- Say YES to a replacement that removes narration. A generation that lands on an existing voice-over with a materially shorter script (or with that clip's own opening, cut off) is REFUSED, and the refusal quotes both lengths in seconds and words. Tell the user what it removes and get their answer; only then re-send the same call with this set. If they wanted a different READ rather than a shorter voice-over, send the FULL script again instead of setting this.
dubLanguagestringoptional- DUB MODE: dub the whole edit instead of speaking a script. Pass a supported language code (e.g. es, fr, de, ja, pt-BR — the same set transcribe_source supports on ElevenLabs) and the edit's own dialogue is translated and spoken as VO clips placed where the original lines land (cuts respected, edit-timeline time). `text` and `startSec` are ignored. Runs IN THE BACKGROUND: the call returns a dispatch receipt with a batchId — NOT a result. Tell the user it was STARTED, never that it is done or that it will definitely land. The terminal outcome (clips landed, or failed with a full refund) is posted to the project chat as a notice when the batch finishes; check progress any time with `dubStatus: true` (free). One running batch per edit: a second start while one is running is refused. PAID like a normal voice-over, billed on the TRANSLATED script's total length at the same per-character rate, one charge for the whole batch, auto-refunded in full if any part fails.
dubStatusbooleanoptional- FREE STATUS CHECK for dub batches: returns the recent dub batches of this edit with their terminal truth — running / completed / failed, the user-facing reason, and any refund. CALL THIS before telling the user a dub is "processing" and before starting a dub again: a batch reported FAILED here is dead (its charge was refunded) and must be reported as failed, never as still working. Ignores every other parameter except editName.
endSecnumberoptional- OPTIONAL, and the way to make the narration ACTUALLY FIT: the latest timeline second this clip may still be talking at — normally where the next thing it must not tread on begins. Given one, the server generates, MEASURES the real audio, and regenerates at a faster supported delivery until it fits (at most 3 generations, no extra charge — you are billed on characters, once). If no supported delivery fits the script in that span, the call FAILS and refunds instead of placing a clip that talks over what follows; shorten the script and try again. Omit it for narration with nothing behind it.
removeIdstringoptional- Remove the voice-over clip with this id instead. The clip stops playing everywhere immediately, and is KEPT in the edit's voice-over history — the response returns the id to bring it back with restoreTakeId.
restoreTakeIdstringoptional- GO BACK to an earlier take: pass the id of a previous take (from get_edit's `previousTakeIds` on the clip) and it becomes the one that plays again. Non-destructive and symmetric — the take it replaces goes into the history in its place, so this can be undone by restoring the other one. FREE: nothing is generated, so nothing is charged.
retakeOfstringoptional- TRY ANOTHER TAKE of an existing voice-over instead of adding a second clip beside it. Pass the id of the clip you want to redo (get_edit lists them). The previous take is NOT deleted — it moves into that clip's take history and can be brought back with restoreTakeId. Use this rather than removeId+create whenever the user wants a different read, voice or wording of something that already exists. Charged like any generation.
startSecnumberoptional- Where the clip starts on the edit timeline (seconds). Required unless removeId.
textstringoptional- The exact script to speak. Required unless removeId.
voicestringoptional- Premade voice name — each with the read it gives, so pick the one that suits the script rather than the first in the list: rachel (F, calm), domi (F, confident), bella (F, soft), antoni (M, warm), elli (F, expressive), josh (M, young), arnold (M, crisp), adam (M, deep), sam (M, raspy). A raw ElevenLabs voice id also works. Default rachel.
Deliver 4
build_documentBuild DocumentChanges your projecteditCreates a downloadable FILE from text/data YOU provide and returns a link.
Parameters
contentstringrequired- The COMPLETE file content, already formatted for the chosen format — valid SRT/VTT cues, CSV with a header row, etc. You build this.
filenamestringrequired- File name WITHOUT extension, e.g. "Episode 4 transcript (French)".
format"srt" | "vtt" | "txt" | "md" | "csv" | "json" | …required- srt/vtt = subtitles, txt/md = plain/markdown, csv = spreadsheet, json = data, pdf/docx = typeset documents (write markdown-style content).
shareIdstringrequired- Share ID
verify_premiere_exportVerify Premiere Export (free)Reads onlyviewFREE, read-only verification for the native Premiere Pro project Eddie would export from the CURRENT saved edit.
Parameters
editNamestringrequired- Edit to verify (from list_edits).
shareIdstringrequired- Share ID
export_editExport EditChanges your projecteditExports an edit and returns a download link.
Parameters
editNamestringrequired- Edit to export (from list_edits).
format"fcpxml" | "fcpxml-resolve" | "premiere" | "premiere-xml" | "otio" | "edl" | …required- fcpxml (Final Cut Pro), fcpxml-resolve (DaVinci Resolve), premiere (a NATIVE Premiere Pro project file, .prproj — what a user means by "export to Premiere", and the same file the web Export menu's Premiere row sends), premiere-xml (the older Premiere interchange XML; use it only when the user asks for the XML by name or says they are on Premiere 2018 or older, which cannot open a .prproj), otio (OpenTimelineIO), edl (Avid/universal), mp4 (finished video, cloud-rendered — max 20 minutes), resolve-cloud (Blackmagic mirror projects only: lands the cut as a timeline INSIDE the connected DaVinci Resolve cloud project — no file, no download; call again to check progress), or premiere-production (Production mirror projects only: writes the cut as a native .prproj into the connected Premiere Production's Eddie folder — no file, no download; call again to check progress). The .prproj keeps bins, per-clip crops, gains, audio channel layout and REAL multicam clips; premiere-xml flattens multicam onto stacked tracks and carries none of the rest — so never offer the XML as the better file, only as the older-Premiere one. This list is what THIS TOOL can produce, not everything Eddie exports: the native DaVinci Resolve `.drp` is real and supported but comes from the web share view's Export menu rather than from here. `fcpxml-resolve` is an interchange file Resolve imports — it is NOT a substitute for a `.drp`, so never offer it as one.
shareIdstringrequired- Share ID
exportJobTokenstringoptional- For a pending fcpxml, fcpxml-resolve, or premiere-xml export only: pass back the exportJobToken from the previous export_edit response, with the same shareId, editName, and format, to collect the finished file.
includeBrollSpeechbooleanoptional- Deprecated compatibility flag. The unified mcp-api-state interchange exporter does not carry source-side b-roll transcript markers yet, so NLE exports proceed without them and include an explicit note. MP4 ignores this flag.
redeliverbooleanoptional- resolve-cloud / premiere-production only: a finished delivery normally just reports done on repeat calls; pass true to deliver the edit AGAIN (e.g. after changing the edit) — resolve-cloud as a new versioned timeline, premiere-production as a fresh project file (overwriting Eddie's own earlier delivery, versioning any other collision).
resolution"1080p" | "source"optional- mp4 only: '1080p' (default, HD) or 'source' (original quality, up to 4K).
export_selectsExport Tiered SelectsChanges your projecteditRates the transcript segments of the chosen sources against ORDERED free-text quality tiers and exports a TIERED SELECTS TIMELINE where each tier lands on its own video track — e.g.
Parameters
format"premiere" | "edl" | "fcpxml" | "fcpxml-resolve"required- premiere (tier N → literal video track N) or edl (one file per tier). fcpxml flavors: not yet available for tiered output. NOTE: "premiere" here is the Premiere interchange XML — a tiered selects timeline has no native .prproj; that file is export_edit's `premiere` format and covers an EDIT, not a selects reel.
shareIdstringrequired- Share ID
tiersobject[]required- ORDERED tiers, best/top-priority first — a segment lands on the FIRST tier whose criteria it matches.
keepFullCoveragebooleanoptional- Keep segments that match no tier on the LAST tier instead of omitting them (redundant when a catch-all "everything else" tier exists).
scopeobjectoptional- Omit to rate ALL a-roll sources.
selectsJobTokenstringoptional- For a pending background rating pass only: pass back the selectsJobToken from the previous export_selects response, with the same arguments, to get progress or collect the finished download links.
Comments 2
get_commentsGet CommentsReads onlyviewThe comments left on an edit — both the editor's own notes and the feedback clients left through a review link — as threads ordered by position in the cut.
Parameters
editNamestringrequired- Edit name from list_edits
shareIdstringrequired- Share ID or full URL
openOnlybooleanoptional- Only unresolved notes. Off by default — resolved feedback is still the record of what was asked for.
reviewOnlybooleanoptional- Only notes that came in through a review link (what clients asked for), excluding the editor's own comments.
add_commentAdd CommentChanges your projecteditLeave a note on an edit at a specific moment — the same timeline comments a human reviewer leaves, readable by everyone on the project and by get_comments.
Parameters
bodystringrequired- The note itself. One point, in plain language, saying what you would change and why.
editNamestringrequired- Edit name from list_edits
shareIdstringrequired- Share ID or full URL
timelineSecnumberoptional- Seconds into the finished cut this note is about. Omit for a note about the whole edit.
Recipes and skills 5
read_skillRead Agent SkillReads onlyviewRead the full text of one skill belonging to an agent persona.
Parameters
agentIdstringrequired- The agent id, given in your instructions.
shareIdstringrequired- Share ID or full URL
skillIdstringrequired- The skill's id, from the list in your instructions.
list_recipesList Workspace RecipesReads onlyviewList the saved RECIPES for the workspace that owns this project.
Parameters
shareIdstringrequired- Share ID of the project.
get_recipeGet a Workspace RecipeReads onlyviewRead ONE workspace recipe in full by its `recipeId` (from list_recipes).
Parameters
recipeIdstringrequired- The recipe id, from list_recipes.
shareIdstringrequired- Share ID of the project.
run_recipeRun a Workspace RecipeReads onlyviewTurn a saved recipe plus the user's input values into a ready-to-run PROMPT.
Parameters
recipeIdstringrequired- The recipe id to run, from list_recipes.
shareIdstringrequired- Share ID of the project.
valuesobjectoptional- The input values, keyed by each recipe input id (e.g. {"topic": "our new studio", "length": 3}). Read the ids from get_recipe. Omit an optional input to drop its line from the prompt.
create_recipeSave a Workspace RecipeChanges your projecteditSave a new RECIPE to the workspace that owns this project — a named, reusable prompt template the whole team can re-run.
Parameters
promptTemplatestringrequired- The prompt, with each reusable blank written as {input_id}. Keep optional blanks on their own line so an empty value drops the line.
shareIdstringrequired- Share ID of the project.
taglinestringrequired- One plain sentence saying what it makes.
titlestringrequired- Short name for what the recipe produces, e.g. "Client review cut".
descriptionstringoptional- Optional longer description.
icon"film" | "phone" | "tag" | "script" | "mic"optional- Icon key (default film).
inputsany[]optional- The recipe's typed blanks (max 6). Each has an `id` (matching a {id} in the template), a `label`, and a `kind`: "textarea" ({placeholder?, required?, rows?}), "number" ({min, max, defaultValue, unit}), or "segmented" ({options:[{value,label}], defaultValue}). Omit for a recipe with no blanks.
requires"broll" | "multicam"optional- A project prerequisite the recipe needs (broll or multicam). Omit for none.
toolsUsedstring[]optional- Optional list of edit tool names this recipe typically uses (for display only).
Account and support 4
report_issueReport a Bug or Feature RequestChanges your projecteditTell the Eddie team about a PLATFORM problem you hit — a tool that errored or behaved wrong ('bug'), or something the user asked for that no tool supports ('missing_feature').
Parameters
kind"bug" | "missing_feature"required- 'bug' = a tool errored or did the wrong thing; 'missing_feature' = the user wanted something no tool can do.
summarystringrequired- One specific line (used to dedupe + count).
detailstringoptional- What you were trying to do, what happened, and (for a bug) any error text.
editNamestringoptional- Edit name, if relevant.
severity"blocking" | "annoying" | "nice_to_have"optional- 'blocking' = you could not complete the task; 'annoying' = worked around it; 'nice_to_have' = polish.
shareIdstringoptional- Share ID/URL for context, if relevant.
toolNamestringoptional- The tool that failed, if this is about one.
search_helpSearch Eddie Help ArticlesReads onlySearch Eddie's help center (www.heyeddie.ai/help).
Parameters
querystringrequired- Keywords for the user's question (e.g. 'export premiere', 'credits cost', 'multicam angles').
get_credit_balanceGet Credit BalanceReads onlyviewRead the credit balance that pays for THIS project, plus every workspace you can act in.
Parameters
shareIdstringrequired- Share ID
estimatedCostnumberoptional- Optional: credits the operation you are about to run costs. Returns whether the paying pool covers it and, if not, exactly how many credits short it is.
get_credit_historyGet Credit HistoryReads onlyviewItemized credit ledger for the workspace that pays for THIS project — the answer to ANY billing or spend-breakdown question: "what did I spend my credits on?", "where did my credits go this…
Parameters
shareIdstringrequired- Share ID
daysintegeroptional- How many days back to look (default 30, max 365). "This month" is the default; use 7 for "this week", 90 for "this quarter".
limitintegeroptional- Max transactions to return, newest first (default 50, max 200). The category rollup always covers the whole window regardless.
Other 1
request_interview_momentsAnalyse Interview MomentsChanges your projecteditAnalyse this project's footage for what the transcript cannot carry — a voice breaking, a long pause, a hand wiping an eye, a subject looking away, a shift in posture — and record each one…
Parameters
shareIdstringrequired- Share ID
confirmbooleanoptional- false/omitted = state the price, change nothing and charge nothing. true = the user agreed to the rate — start the analysis. Ignored when runId is given (a progress read never starts a run).
includeArollbooleanoptional- Analyse the interview (A-roll) footage. Default true — this is the footage the feature is for. Set false only when the user explicitly wants the b-roll alone.
includeBrollbooleanoptional- Analyse the b-roll as well. Default true. Set false to spend the run on the interviews alone, which is cheaper because less footage is analysed.
runIdstringoptional- The runId a previous call returned. Pass it to READ PROGRESS; it never starts a second analysis and never charges twice. Omit it to quote or to start.
topicsstring[]optional- WHAT TO LOOK FOR, in the user's own words — the shots or moments they are hunting, e.g. ["music drifting out from a roadside diner", "hesitation before answering"]. This is the lens that turns a general description pass into a SEARCH. At most 50 entries of 100 characters each; a list outside that is refused with a sentence naming the entry, so send what the user said and relay the refusal rather than trimming it yourself. Guidance for THIS RUN only; nothing is saved on the project. Omit it to run the general pass. Never invent topics.
What is not listed here
Tools that no customer account can call — support-admin tooling and connectors in a narrowed rollout — are counted, not listed.
The server also publishes MCP resources. A client that supports them can render one inline:
- Eddie edit card
- Compact inline view of an Eddie edit.
ui://eddie/edit-card.html
Eddie’s web and desktop applications do work that no tool here exposes. A capability missing from this page is not evidence that the product cannot do it.