add_transition_to_clip
Apply transitions to the start or end of a clip in Adobe Premiere Pro. Specify clip ID, transition name, position, and duration to automate video editing workflows.
Instructions
Adds a transition to the beginning or end of a single clip.
Input Schema
TableJSON Schema
| Name | Required | Description | Default |
|---|---|---|---|
| clipId | Yes | The ID of the clip | |
| duration | Yes | The duration of the transition in seconds | |
| position | Yes | Whether to add the transition at the start or end of the clip | |
| transitionName | Yes | The name of the transition |
Implementation Reference
- src/tools/index.ts:1327-1374 (handler)The handler function for 'add_transition_to_clip' tool. It constructs an ExtendScript that retrieves the clip by ID, gets its track, adds a transition at the specified position ('start' or 'end') with given name and duration, and executes it via the bridge.private async addTransitionToClip(clipId: string, transitionName: string, position: 'start' | 'end', duration: number): Promise<any> { const script = ` try { var clip = app.project.getClipByID("${clipId}"); if (!clip) { JSON.stringify({ success: false, error: "Clip not found" }); return; } var track = clip.getTrack(); var transition; if ("${position}" === "start") { transition = track.addTransition("${transitionName}", clip, "start", ${duration}); } else { transition = track.addTransition("${transitionName}", clip, "end", ${duration}); } if (!transition) { JSON.stringify({ success: false, error: "Failed to add transition" }); return; } JSON.stringify({ success: true, message: "Transition added successfully", transitionName: "${transitionName}", position: "${position}", duration: ${duration}, clipId: "${clipId}", transitionId: transition.nodeId }); } catch (e) { JSON.stringify({ success: false, error: e.toString() }); } `; return await this.bridge.executeScript(script); }
- src/tools/index.ts:219-227 (schema)Input schema definition for the 'add_transition_to_clip' tool using Zod, specifying parameters: clipId, transitionName, position ('start'/'end'), and duration.name: 'add_transition_to_clip', description: 'Adds a transition to the beginning or end of a single clip.', inputSchema: z.object({ clipId: z.string().describe('The ID of the clip'), transitionName: z.string().describe('The name of the transition'), position: z.enum(['start', 'end']).describe('Whether to add the transition at the start or end of the clip'), duration: z.number().describe('The duration of the transition in seconds') }) },
- src/tools/index.ts:478-481 (registration)Registration in the executeTool switch statement, dispatching to the addTransitionToClip handler method.case 'add_transition': return await this.addTransition(args.clipId1, args.clipId2, args.transitionName, args.duration); case 'add_transition_to_clip': return await this.addTransitionToClip(args.clipId, args.transitionName, args.position, args.duration);
- src/tools/index.ts:27-397 (registration)The tool is registered in the getAvailableTools() method's return array, making it discoverable by MCP clients.getAvailableTools(): MCPTool[] { return [ // Discovery Tools (NEW) { name: 'list_project_items', description: 'Lists all media items, bins, and assets in the current Premiere Pro project. Use this to discover available media before performing operations.', inputSchema: z.object({ includeBins: z.boolean().optional().describe('Whether to include bin information in the results'), includeMetadata: z.boolean().optional().describe('Whether to include detailed metadata for each item') }) }, { name: 'list_sequences', description: 'Lists all sequences in the current Premiere Pro project with their IDs, names, and basic properties.', inputSchema: z.object({}) }, { name: 'list_sequence_tracks', description: 'Lists all video and audio tracks in a specific sequence with their properties and clips.', inputSchema: z.object({ sequenceId: z.string().describe('The ID of the sequence to list tracks for') }) }, { name: 'get_project_info', description: 'Gets comprehensive information about the current project including name, path, settings, and status.', inputSchema: z.object({}) }, // Project Management { name: 'create_project', description: 'Creates a new Adobe Premiere Pro project. Use this when the user wants to start a new video editing project from scratch.', inputSchema: z.object({ name: z.string().describe('The name for the new project, e.g., "My Summer Vacation"'), location: z.string().describe('The absolute directory path where the project file should be saved, e.g., "/Users/user/Documents/Videos"') }) }, { name: 'open_project', description: 'Opens an existing Adobe Premiere Pro project from a specified file path.', inputSchema: z.object({ path: z.string().describe('The absolute path to the .prproj file to open') }) }, { name: 'save_project', description: 'Saves the currently active Adobe Premiere Pro project.', inputSchema: z.object({}) }, { name: 'save_project_as', description: 'Saves the current project with a new name and location.', inputSchema: z.object({ name: z.string().describe('The new name for the project'), location: z.string().describe('The absolute directory path where the project should be saved') }) }, // Media Management { name: 'import_media', description: 'Imports a media file (video, audio, image) into the current Premiere Pro project.', inputSchema: z.object({ filePath: z.string().describe('The absolute path to the media file to import'), binName: z.string().optional().describe('The name of the bin to import the media into. If not provided, it will be imported into the root.') }) }, { name: 'import_folder', description: 'Imports all media files from a folder into the current Premiere Pro project.', inputSchema: z.object({ folderPath: z.string().describe('The absolute path to the folder containing media files'), binName: z.string().optional().describe('The name of the bin to import the media into'), recursive: z.boolean().optional().describe('Whether to import from subfolders recursively') }) }, { name: 'create_bin', description: 'Creates a new bin (folder) in the project panel to organize media.', inputSchema: z.object({ name: z.string().describe('The name for the new bin'), parentBinName: z.string().optional().describe('The name of the parent bin to create this bin inside') }) }, // Sequence Management { name: 'create_sequence', description: 'Creates a new sequence in the project. A sequence is a timeline where you edit clips.', inputSchema: z.object({ name: z.string().describe('The name for the new sequence'), presetPath: z.string().optional().describe('Optional path to a sequence preset file for custom settings'), width: z.number().optional().describe('Sequence width in pixels'), height: z.number().optional().describe('Sequence height in pixels'), frameRate: z.number().optional().describe('Frame rate (e.g., 24, 25, 30, 60)'), sampleRate: z.number().optional().describe('Audio sample rate (e.g., 48000)') }) }, { name: 'duplicate_sequence', description: 'Creates a copy of an existing sequence with a new name.', inputSchema: z.object({ sequenceId: z.string().describe('The ID of the sequence to duplicate'), newName: z.string().describe('The name for the new sequence copy') }) }, { name: 'delete_sequence', description: 'Deletes a sequence from the project.', inputSchema: z.object({ sequenceId: z.string().describe('The ID of the sequence to delete') }) }, // Timeline Operations { name: 'add_to_timeline', description: 'Adds a media clip from the project panel to a sequence timeline at a specific track and time.', inputSchema: z.object({ sequenceId: z.string().describe('The ID of the sequence (timeline) to add the clip to'), projectItemId: z.string().describe('The ID of the project item (clip) to add'), trackIndex: z.number().describe('The index of the video or audio track (0-based)'), time: z.number().describe('The time in seconds where the clip should be placed on the timeline'), insertMode: z.enum(['overwrite', 'insert']).optional().describe('Whether to overwrite existing content or insert and shift') }) }, { name: 'remove_from_timeline', description: 'Removes a clip from the timeline.', inputSchema: z.object({ clipId: z.string().describe('The ID of the clip on the timeline to remove'), deleteMode: z.enum(['ripple', 'lift']).optional().describe('Whether to ripple delete (close gap) or lift (leave gap)') }) }, { name: 'move_clip', description: 'Moves a clip to a different position on the timeline.', inputSchema: z.object({ clipId: z.string().describe('The ID of the clip to move'), newTime: z.number().describe('The new time position in seconds'), newTrackIndex: z.number().optional().describe('The new track index (if moving to different track)') }) }, { name: 'trim_clip', description: 'Adjusts the in and out points of a clip on the timeline, effectively shortening it.', inputSchema: z.object({ clipId: z.string().describe('The ID of the clip on the timeline to trim'), inPoint: z.number().optional().describe('The new in point in seconds from the start of the clip'), outPoint: z.number().optional().describe('The new out point in seconds from the start of the clip'), duration: z.number().optional().describe('Alternative: set the desired duration in seconds') }) }, { name: 'split_clip', description: 'Splits a clip at a specific time point, creating two separate clips.', inputSchema: z.object({ clipId: z.string().describe('The ID of the clip to split'), splitTime: z.number().describe('The time in seconds where to split the clip') }) }, // Effects and Transitions { name: 'apply_effect', description: 'Applies a visual or audio effect to a specific clip on the timeline.', inputSchema: z.object({ clipId: z.string().describe('The ID of the clip to apply the effect to'), effectName: z.string().describe('The name of the effect to apply (e.g., "Gaussian Blur", "Lumetri Color")'), parameters: z.record(z.any()).optional().describe('Key-value pairs for the effect\'s parameters') }) }, { name: 'remove_effect', description: 'Removes an effect from a clip.', inputSchema: z.object({ clipId: z.string().describe('The ID of the clip'), effectName: z.string().describe('The name of the effect to remove') }) }, { name: 'add_transition', description: 'Adds a transition (e.g., cross dissolve) between two adjacent clips on the timeline.', inputSchema: z.object({ clipId1: z.string().describe('The ID of the first clip (outgoing)'), clipId2: z.string().describe('The ID of the second clip (incoming)'), transitionName: z.string().describe('The name of the transition to add (e.g., "Cross Dissolve")'), duration: z.number().describe('The duration of the transition in seconds') }) }, { name: 'add_transition_to_clip', description: 'Adds a transition to the beginning or end of a single clip.', inputSchema: z.object({ clipId: z.string().describe('The ID of the clip'), transitionName: z.string().describe('The name of the transition'), position: z.enum(['start', 'end']).describe('Whether to add the transition at the start or end of the clip'), duration: z.number().describe('The duration of the transition in seconds') }) }, // Audio Operations { name: 'adjust_audio_levels', description: 'Adjusts the volume (gain) of an audio clip on the timeline.', inputSchema: z.object({ clipId: z.string().describe('The ID of the audio clip to adjust'), level: z.number().describe('The new audio level in decibels (dB). Can be positive or negative.') }) }, { name: 'add_audio_keyframes', description: 'Adds keyframes to audio levels for dynamic volume changes.', inputSchema: z.object({ clipId: z.string().describe('The ID of the audio clip'), keyframes: z.array(z.object({ time: z.number().describe('Time in seconds'), level: z.number().describe('Audio level in dB') })).describe('Array of keyframe data') }) }, { name: 'mute_track', description: 'Mutes or unmutes an entire audio track.', inputSchema: z.object({ sequenceId: z.string().describe('The ID of the sequence'), trackIndex: z.number().describe('The index of the audio track'), muted: z.boolean().describe('Whether to mute (true) or unmute (false) the track') }) }, // Text and Graphics { name: 'add_text_overlay', description: 'Adds a text layer (title) over the video timeline.', inputSchema: z.object({ text: z.string().describe('The text content to display'), sequenceId: z.string().describe('The sequence to add the text to'), trackIndex: z.number().describe('The video track to place the text on'), startTime: z.number().describe('The time in seconds when the text should appear'), duration: z.number().describe('How long the text should remain on screen in seconds'), fontFamily: z.string().optional().describe('e.g., "Arial", "Times New Roman"'), fontSize: z.number().optional().describe('e.g., 48'), color: z.string().optional().describe('The hex color code for the text, e.g., "#FFFFFF"'), position: z.object({ x: z.number().optional().describe('Horizontal position (0-100)'), y: z.number().optional().describe('Vertical position (0-100)') }).optional().describe('Text position on screen'), alignment: z.enum(['left', 'center', 'right']).optional().describe('Text alignment') }) }, { name: 'add_shape', description: 'Adds a shape (rectangle, circle, etc.) to the timeline.', inputSchema: z.object({ shapeType: z.enum(['rectangle', 'circle', 'triangle']).describe('The type of shape to add'), sequenceId: z.string().describe('The sequence to add the shape to'), trackIndex: z.number().describe('The video track to place the shape on'), startTime: z.number().describe('The time in seconds when the shape should appear'), duration: z.number().describe('How long the shape should remain on screen in seconds'), color: z.string().optional().describe('The hex color code for the shape'), size: z.object({ width: z.number().optional().describe('Width in pixels'), height: z.number().optional().describe('Height in pixels') }).optional().describe('Shape size'), position: z.object({ x: z.number().optional().describe('Horizontal position (0-100)'), y: z.number().optional().describe('Vertical position (0-100)') }).optional().describe('Shape position on screen') }) }, // Color Correction { name: 'color_correct', description: 'Applies basic color correction adjustments to a video clip.', inputSchema: z.object({ clipId: z.string().describe('The ID of the clip to color correct'), brightness: z.number().optional().describe('Brightness adjustment (-100 to 100)'), contrast: z.number().optional().describe('Contrast adjustment (-100 to 100)'), saturation: z.number().optional().describe('Saturation adjustment (-100 to 100)'), hue: z.number().optional().describe('Hue adjustment in degrees (-180 to 180)'), highlights: z.number().optional().describe('Adjustment for the brightest parts of the image (-100 to 100)'), shadows: z.number().optional().describe('Adjustment for the darkest parts of the image (-100 to 100)'), temperature: z.number().optional().describe('Color temperature adjustment (-100 to 100)'), tint: z.number().optional().describe('Tint adjustment (-100 to 100)') }) }, { name: 'apply_lut', description: 'Applies a Look-Up Table (LUT) to a clip for color grading.', inputSchema: z.object({ clipId: z.string().describe('The ID of the clip'), lutPath: z.string().describe('The absolute path to the .cube or .3dl LUT file'), intensity: z.number().optional().describe('LUT intensity (0-100)') }) }, // Export and Rendering { name: 'export_sequence', description: 'Renders and exports a sequence to a video file. This is for creating the final video.', inputSchema: z.object({ sequenceId: z.string().describe('The ID of the sequence to export'), outputPath: z.string().describe('The absolute path where the final video file will be saved'), presetPath: z.string().optional().describe('Optional path to an export preset file (.epr) for specific settings'), format: z.enum(['mp4', 'mov', 'avi', 'h264', 'prores']).optional().describe('The export format or codec'), quality: z.enum(['low', 'medium', 'high', 'maximum']).optional().describe('Export quality setting'), resolution: z.string().optional().describe('Export resolution (e.g., "1920x1080", "3840x2160")') }) }, { name: 'export_frame', description: 'Exports a single frame from a sequence as an image file.', inputSchema: z.object({ sequenceId: z.string().describe('The ID of the sequence'), time: z.number().describe('The time in seconds to export the frame from'), outputPath: z.string().describe('The absolute path where the image file will be saved'), format: z.enum(['png', 'jpg', 'tiff']).optional().describe('The image format') }) }, // Advanced Features { name: 'create_multicam_sequence', description: 'Creates a multicamera source sequence from multiple video clips, synchronized by audio or timecode.', inputSchema: z.object({ name: z.string().describe('The name for the new multicam sequence'), cameraFiles: z.array(z.string()).describe('An array of absolute file paths for each camera angle'), syncMethod: z.enum(['timecode', 'audio', 'markers']).describe('The method to use for synchronizing the clips') }) }, { name: 'create_proxy_media', description: 'Generates low-resolution proxy versions of high-resolution media to improve editing performance.', inputSchema: z.object({ projectItemIds: z.array(z.string()).describe('An array of IDs of the project items to create proxies for'), proxyPreset: z.string().describe('The name of the proxy preset to use'), replaceOriginals: z.boolean().optional().describe('Whether to replace original media with proxies') }) }, { name: 'auto_edit_to_music', description: 'Automatically creates an edit by cutting video clips to the beat of a music track.', inputSchema: z.object({ audioTrackId: z.string().describe('The ID of the audio track containing the music'), videoClipIds: z.array(z.string()).describe('An array of video clip IDs to use for the edit'), editStyle: z.enum(['cuts_only', 'cuts_and_transitions', 'beat_sync']).describe('The desired editing style'), sensitivity: z.number().optional().describe('Beat detection sensitivity (0-100)') }) }, { name: 'stabilize_clip', description: 'Applies video stabilization to reduce camera shake.', inputSchema: z.object({ clipId: z.string().describe('The ID of the clip to stabilize'), method: z.enum(['warp', 'subspace']).optional().describe('Stabilization method'), smoothness: z.number().optional().describe('Stabilization smoothness (0-100)') }) }, { name: 'speed_change', description: 'Changes the playback speed of a clip.', inputSchema: z.object({ clipId: z.string().describe('The ID of the clip'), speed: z.number().describe('Speed multiplier (0.1 = 10% speed, 2.0 = 200% speed)'), maintainAudio: z.boolean().optional().describe('Whether to maintain audio pitch when changing speed') }) } ];