list_sequence_tracks
Retrieve detailed properties of all video and audio tracks, including associated clips, for a specified sequence in Adobe Premiere Pro.
Instructions
Lists all video and audio tracks in a specific sequence with their properties and clips.
Input Schema
TableJSON Schema
| Name | Required | Description | Default |
|---|---|---|---|
| sequenceId | Yes | The ID of the sequence to list tracks for |
Implementation Reference
- src/tools/index.ts:627-712 (handler)The handler function for the 'list_sequence_tracks' tool. It constructs and executes an ExtendScript via the PremiereProBridge to retrieve detailed information about all video and audio tracks in the specified sequence, including clips, their timings, and track properties.private async listSequenceTracks(sequenceId: string): Promise<any> { const script = ` try { var sequence = app.project.getSequenceByID("${sequenceId}"); if (!sequence) { JSON.stringify({ success: false, error: "Sequence not found" }); return; } var videoTracks = []; var audioTracks = []; // List video tracks for (var i = 0; i < sequence.videoTracks.numTracks; i++) { var track = sequence.videoTracks[i]; var clips = []; for (var j = 0; j < track.clips.numItems; j++) { var clip = track.clips[j]; clips.push({ id: clip.nodeId, name: clip.name, startTime: clip.start.seconds, endTime: clip.end.seconds, duration: clip.duration.seconds }); } videoTracks.push({ index: i, name: track.name || "Video " + (i + 1), enabled: track.isTargeted(), locked: track.isLocked(), clips: clips, clipCount: clips.length }); } // List audio tracks for (var i = 0; i < sequence.audioTracks.numTracks; i++) { var track = sequence.audioTracks[i]; var clips = []; for (var j = 0; j < track.clips.numItems; j++) { var clip = track.clips[j]; clips.push({ id: clip.nodeId, name: clip.name, startTime: clip.start.seconds, endTime: clip.end.seconds, duration: clip.duration.seconds }); } audioTracks.push({ index: i, name: track.name || "Audio " + (i + 1), enabled: track.isTargeted(), locked: track.isLocked(), clips: clips, clipCount: clips.length }); } JSON.stringify({ success: true, sequenceId: "${sequenceId}", sequenceName: sequence.name, videoTracks: videoTracks, audioTracks: audioTracks, totalVideoTracks: videoTracks.length, totalAudioTracks: audioTracks.length }); } catch (e) { JSON.stringify({ success: false, error: e.toString() }); } `; return await this.bridge.executeScript(script); }
- src/tools/index.ts:44-49 (schema)The input schema definition for the 'list_sequence_tracks' tool, specifying that it requires a 'sequenceId' string parameter.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') }) },
- src/tools/index.ts:430-432 (registration)The switch case in executeTool that registers and dispatches to the listSequenceTracks handler when the tool name matches.case 'list_sequence_tracks': return await this.listSequenceTracks(args.sequenceId); case 'get_project_info':
- src/tools/index.ts:27-397 (registration)The getAvailableTools method that registers 'list_sequence_tracks' in the list of available MCP tools returned to the protocol.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') }) } ];