EditAI agent server: the timeline exposed as MCP tools for TrueForge, plus a live project store for the web app.
EditAI demonstrates strong naming conventions (verb_noun pattern: get_project, split_clip, delete_clip) and comprehensive parameter schemas using Zod validation. All 16 tools have descriptions (avg ~120 chars, within baseline 34-392 range). Tool annotations (readOnlyHint, destructiveHint, idempotentHint) are correctly applied per pattern:tool-annotations. However, parameter descriptions are sparse or missing in several tools (e.g., find_silences lacks description for track_id default 'a1'; detect_beats track_id undescribed). Output schemas are not explicitly documented in the code, responses are JSON-stringified but structure is inferred rather than formally declared. Error handling returns structured {error: message} but lacks recovery guidance (pattern:recovery-guide). Composition is excellent: tools chain naturally (transcribe_clip → add_captions), and destructive operations (delete_clip, ripple_delete, remove_silences) correctly require user approval.
Add timed caption clips on the captions track, creating it if needed. Pass segments from transcribe_clip, edited as you see fit.
Add a title or caption on a text track.
Remove a clip from the timeline, leaving a gap. Destructive: the user is asked to approve first.
Beat timestamps in timeline seconds for the music track, derived from its tempo.
Render the timeline to a file. Always asks the user to approve first.
Silent ranges on the voice track, in timeline seconds, at least min_duration long. Read-only: use remove_silences to actually cut them.
The whole timeline: tracks, clips (id, name, kind, trackId, start, duration, sourceOffset, volume), media metadata (transcripts, silences, bpm) and past exports. Call this first. Clip ids change after edits, so read it again before a second round.
Output schemas not formally documented. Responses are JSON-stringified but structure (fields, types, pagination) is not declared in tool definitions. LLMs cannot reliably extract fields for downstream chaining.
Parameter descriptions incomplete or missing. find_silences.track_id, detect_beats.track_id, undo (no params documented), and set_volume.volume lack explicit descriptions of constraints (e.g., 'Voice track identifier (default a1)' vs bare 'Track identifier').
Error handling lacks recovery guidance. Errors return {error: message} but do not suggest next steps (e.g., 'Clip not found. Call get_project() to list available clips'). Pattern:recovery-guide not applied.
Inferred effective spec: <=2025-11-25.
| Scored | Grade | Overall | Spec posture | Rubric |
|---|---|---|---|---|
| 2026-09-23 | C | 69 | <=2025-11-25 | v2 |
The most recent edits made to the project, oldest first.
Move a clip to a new start time and/or to another track of the same kind.
Ripple-delete every silence on the voice track at least min_duration long, across all tracks. Destructive: preview with find_silences and tell the user what will go before calling this.
Remove a time range from every track and close the gap, shifting later clips left. Destructive: the user is asked to approve first.
Volume for a video or audio clip, 0 to 100 percent.
Cut a clip in two at a timeline time. Returns both halves.
Speech inside a clip's time range, as timed segments in timeline seconds. Use it to write captions for one clip.
Set a clip's new start and/or end on the timeline. Trimming the start keeps the media in sync by moving the source offset.
Revert the most recent change to the project.
Destructive operations (delete_clip, ripple_delete, remove_silences, export_project) require user approval but no dry-run or preview tool exists. Agents cannot preview consequences before committing.
add_captions.segments parameter lacks detailed schema. Described as 'Array of caption segments with start, end (seconds), and text' but no formal type definition (object shape, required fields, field types) visible in code snippet.