Files
João Henrique b541f502ba feat: initial commit - Jhonny Editor
- Adicionado estrutura completa do projeto
- Configurado MCP server para Premiere Pro
- Adicionado documentação e skills
- Configurado Gitignore para o projeto
2026-09-08 09:59:31 -04:00

471 lines
24 KiB
Markdown
Executable File

# Premiere Pro MCP Server — API Research & Capability Map
## Sources Researched
1. **ExtendScript Scripting Guide** (ppro-scripting.docsforadobe.dev) — Complete official reference
2. **QE DOM API** (vakago-tools.com, community.adobe.com) — Undocumented internal API via `app.enableQE()`
3. **UXP API Reference** (developer.adobe.com/premiere-pro/uxp/) — Modern API (v25.6+), action-based
4. **Adobe CEP Samples** (github.com/Adobe-CEP/Samples/PProPanel) — Official sample ExtendScript
5. **adb-mcp** (github.com/mikechambers/adb-mcp) — UXP-based MCP for Premiere (Python + proxy)
6. **hetpatel-11/Adobe_Premiere_Pro_MCP** — CEP-based MCP (same architecture as ours)
### Adobe AI editorial workflow boundary (2026-08-21)
Adobe's current Premiere AI Assistant documentation describes a beta, in-product
assistant that can organize Project-panel assets, work with transcripts and
markers, and help construct stringouts or first cuts. It does not document a
public CEP, UXP, REST, or MCP invocation API. The Generative Media Tool is also
beta and requires in-product access, service availability, and generative
credits; it is not wired to this server.
Accordingly, this repository exposes only local, revision-aware planning and
preview artifacts for editorial workflows. Applying any recommendation remains
an explicit call to a supported, separately authorized Premiere tool, and
generation, transcription, translation, cloud upload, and paid-provider use
remain outside this implementation.
Primary references:
- Adobe Premiere AI Assistant FAQ — https://helpx.adobe.com/premiere/desktop/premiere-ai-assistant/assistant-faq.html
- Adobe Premiere UXP Transcript API — https://developer.adobe.com/premiere-pro/uxp/ppro-reference/classes/transcript/
- Adobe Premiere UXP SequenceEditor API — https://developer.adobe.com/premiere-pro/uxp/ppro-reference/classes/sequenceeditor/
- Adobe Premiere UXP Hybrid Plugins guide — https://developer.adobe.com/premiere-pro/uxp/plugins/hybrid-plugins/
---
## Historical Repository Snapshot (2026-07-20)
This is a dated research snapshot, not the source of truth for current releases or
tool counts. Use `README.md` and `CHANGELOG.md` for current product and release
information.
- **Release candidate:** `1.2.0` is integrated on `main`; `package.json`, `package-lock.json`, and
both CEP extension entries in `cep-plugin/CSXS/manifest.xml` are version-aligned.
- **npm status:** `1.1.7` is not yet published. The registry publish was attempted after the GitHub
push and stopped at npm's required one-time-password challenge; the package remains at `1.1.6`
on npm until an authenticated publish completes.
- **MCP surface:** 268 runtime-registered tools across 29 modules, 3 resources, and 4 prompts.
Capability profiles fail closed for raw scripting, and compound edit plans support preview-bound
confirmation and correlated audit events.
- **UXP preview:** `uxp-plugin/` provides a versioned WebSocket protocol, capability discovery,
state events, and verified frame export. Live Premiere and OS-specific loopback validation remain
required before it can replace CEP in production.
- **CEP bridge:** The operational workflow is unchanged, but the visible panel now has a compact
Premiere-oriented dark interface, clearer connection state, responsive controls, an improved
bridge-directory field, and a larger live activity monitor. Accessibility work includes labels,
focus states, live regions, and reduced-motion handling.
- **Website:** The redesigned landing page and its SEO metadata, manifest, dynamic `robots.txt`,
and dynamic sitemap are merged into `main`.
- **Validation:** The root TypeScript build and all 333 automated tests pass. Landing-page lint
passes, and Next.js compiles and generates all seven static pages. On this OneDrive checkout,
the final export cleanup repeatedly reports `EBUSY` while removing `landing/out`; this is an
environment/filesystem lock after page generation, not a source compilation failure.
### Release completion gate
Publish `premiere-pro-mcp@1.2.0` from `main` with a current npm authenticator OTP, then verify both
`npm view premiere-pro-mcp version` and the `latest` dist-tag resolve to `1.2.0`.
---
## Complete API Surface (ExtendScript + QE DOM)
### Application Object (`app`)
| Method | Description | Implemented? |
|--------|-------------|:---:|
| `app.enableQE()` | Enables QE DOM | ✅ |
| `app.project` | Active project | ✅ |
| `app.newProject(path)` | Create new project | ❌ **MISSING** |
| `app.openDocument(path)` | Open project | ✅ |
| `app.openFCPXML()` | Import FCP XML | ❌ |
| `app.quit()` | Quit Premiere | ❌ (dangerous) |
| `app.getEnableProxies()` | Check proxy state | ❌ |
| `app.setEnableProxies()` | Toggle proxies | ✅ (in manage_proxies) |
| `app.getWorkspaces()` | List workspaces | ✅ |
| `app.setWorkspace(name)` | Switch workspace | ✅ |
| `app.setScratchDiskPath(type, path)` | Set scratch disk | ✅ |
| `app.sourceMonitor` | Source monitor control | ✅ |
| `app.encoder` | AME encoder | ✅ |
| `app.properties` | Persistent properties | ❌ |
| `app.bind(eventName, fn)` | Event binding | N/A |
| `app.getProjectViewIDs()` | Multi-project support | ❌ |
| `app.getCurrentProjectViewSelection()` | Current selection | ❌ |
### Project Object (`app.project`)
| Method | Description | Implemented? |
|--------|-------------|:---:|
| `project.save()` | Save | ✅ |
| `project.saveAs(path)` | Save as | ✅ |
| `project.closeDocument(save, prompt)` | Close project | ❌ **MISSING** |
| `project.createNewSequence(name, id)` | Create sequence | ✅ |
| `project.createNewSequenceFromClips(name, items, bin)` | Sequence from clips | ✅ |
| `project.deleteSequence(seq)` | Delete sequence | ✅ |
| `project.importFiles(paths, suppressUI, targetBin, asNumbered)` | Import files | ✅ |
| `project.importAEComps(path, compNames, targetBin)` | Import AE comps | ✅ |
| `project.importAllAEComps(path, targetBin)` | Import all AE comps | ✅ |
| `project.importSequences(project, seqIDs)` | Import sequences from other project | ✅ |
| `project.exportAAF(...)` | Export AAF (14 params!) | ⚠️ Simplified |
| `project.exportFinalCutProXML(path, suppressUI)` | Export FCP XML | ✅ |
| `project.exportOMF(...)` | Export OMF | ✅ |
| `project.exportTimeline(preset)` | Export via preset | ❌ |
| `project.consolidateDuplicates()` | Consolidate | ✅ |
| `project.newBarsAndTone(w, h, base, name)` | Create bars & tone | ✅ |
| `project.newSequence(name, pathToPreset)` | New seq from preset | ❌ |
| `project.openSequence(seqID)` | Open/activate sequence | ✅ |
| `project.getInsertionBin()` | Current target bin | ✅ |
| `project.setEnableTranscodeOnIngest(enable)` | Ingest transcoding | ✅ |
| `project.getGraphicsWhiteLuminance()` | HDR setting | ✅ |
| `project.setGraphicsWhiteLuminance(val)` | HDR setting | ✅ |
| `project.getProjectPanelMetadata()` | Panel metadata columns | ✅ |
| `project.setProjectPanelMetadata(json)` | Set panel metadata | ✅ |
| `project.addPropertyToProjectMetadataSchema(name, label, type)` | Add custom metadata field | ✅ |
### Sequence Object
| Method | Description | Implemented? |
|--------|-------------|:---:|
| `seq.insertClip(item, time, vTrack, aTrack)` | Insert (ripple) clip | ✅ |
| `seq.overwriteClip(item, time, vTrack, aTrack)` | Overwrite clip | ✅ |
| `seq.importMGT(path, time, vOff, aOff)` | Import MOGRT | ✅ |
| `seq.importMGTFromLibrary(lib, name, time, v, a)` | MOGRT from CC Library | ✅ |
| `seq.clone()` | Duplicate sequence | ✅ |
| `seq.close()` | Close sequence tab | ✅ |
| `seq.createSubsequence(ignoreMapping)` | Create subsequence | ✅ |
| `seq.createCaptionTrack(item, startTime, captionFormat)` | Captions | ✅ |
| `seq.autoReframeSequence(num, den, preset, name, nested)` | Auto reframe | ✅ |
| `seq.attachCustomProperty(id, value)` | Custom FCP XML props | ✅ |
| `seq.getSettings()` | Get all settings | ✅ |
| `seq.setSettings(settings)` | Modify settings | ✅ |
| `seq.getSelection()` | Selected clips array | ✅ |
| `seq.getPlayerPosition()` | Playhead position | ✅ |
| `seq.setPlayerPosition(ticks)` | Move playhead | ✅ |
| `seq.getInPoint()` / `getOutPoint()` | Sequence I/O points | ✅ |
| `seq.setInPoint()` / `setOutPoint()` | Set I/O points | ✅ |
| `seq.getWorkAreaInPoint()` / `OutPoint()` | Work area | ✅ |
| `seq.setWorkAreaInPoint()` / `OutPoint()` | Set work area | ✅ |
| `seq.linkSelection()` | Link selected A/V | ✅ |
| `seq.unlinkSelection()` | Unlink selected A/V | ✅ |
| `seq.exportAsMediaDirect(path, preset, workArea)` | Direct export | ✅ |
| `seq.exportAsProject(path)` | Export as .prproj | ✅ |
| `seq.exportAsFinalCutProXML(path)` | FCP XML | ✅ |
| `seq.getExportFileExtension(preset)` | Get extension for preset | ✅ |
| `seq.isDoneAnalyzingForVideoEffects()` | Check analysis status | ❌ |
| `seq.isWorkAreaEnabled()` | Check work area bar | ✅ |
| `seq.setZeroPoint(ticks)` | Set start time code | ✅ |
| `seq.performSceneEditDetectionOnSelection()` | Scene detect | ✅ |
### Track Object
| Method | Description | Implemented? |
|--------|-------------|:---:|
| `track.insertClip(item, time, vTrack, aTrack)` | Insert clip | ✅ |
| `track.overwriteClip(item, time)` | Overwrite clip | ❌ **MISSING** |
| `track.isMuted()` | Check mute | ❌ |
| `track.setMute(muted)` | Set mute | ✅ |
| `track.clips` | TrackItemCollection | ✅ |
| `track.transitions` | Transitions on track | ❌ (read) |
### TrackItem Object
| Method | Description | Implemented? |
|--------|-------------|:---:|
| `clip.name` | Clip name | ✅ |
| `clip.nodeId` | Unique ID | ✅ |
| `clip.start` / `end` | Timeline position | ✅ |
| `clip.inPoint` / `outPoint` | Source I/O | ✅ |
| `clip.duration` | Duration | ✅ |
| `clip.components` | Effect components | ✅ |
| `clip.projectItem` | Source project item | ✅ |
| `clip.getSpeed()` | Speed multiplier | ✅ |
| `clip.isSpeedReversed()` | Is reversed? | ✅ |
| `clip.isAdjustmentLayer()` | Is adjustment layer? | ✅ |
| `clip.isSelected()` | Selection state | ✅ |
| `clip.setSelected(state, updateUI)` | Set selection | ✅ |
| `clip.remove(inRipple, inAlignToVideo)` | Remove clip | ✅ |
| `clip.move(newInPoint)` | Move clip | ✅ |
| `clip.disabled` | Enable/disable | ✅ |
| `clip.getMGTComponent()` | MOGRT params | ✅ |
| `clip.getMatchName()` | Match name | ❌ |
### ProjectItem Object
| Method | Description | Implemented? |
|--------|-------------|:---:|
| `item.name` / `nodeId` / `type` / `treePath` | Identity | ✅ |
| `item.children` | Children (for bins) | ✅ |
| `item.createBin(name)` | Create bin | ✅ |
| `item.createSmartBin(name, query)` | Smart bin | ✅ |
| `item.createSubClip(name, start, end, hard, audio, video)` | Subclip | ✅ |
| `item.deleteBin()` | Delete bin | ✅ |
| `item.moveBin(destBin)` | Move to bin | ✅ |
| `item.renameBin(name)` | Rename bin | ✅ |
| `item.select()` | Select in project panel | ✅ |
| `item.setScaleToFrameSize()` | Scale to frame | ✅ |
| `item.setStartTime(ticks)` | Set start time | ✅ |
| `item.setOverrideFrameRate(fps)` | Override FPS | ✅ |
| `item.setOverridePixelAspectRatio(n, d)` | Override PAR | ✅ |
| `item.setOffline()` | Set offline | ✅ |
| `item.refreshMedia()` | Refresh | ✅ |
| `item.changeMediaPath(path, overrideChecks)` | Relink | ✅ |
| `item.attachProxy(path, isHiRes)` | Proxy | ✅ |
| `item.hasProxy()` | Has proxy? | ✅ |
| `item.canProxy()` | Can proxy? | ❌ |
| `item.isOffline()` | Offline? | ✅ |
| `item.isSequence()` | Is sequence? | ❌ |
| `item.isMergedClip()` | Merged? | ❌ |
| `item.isMulticamClip()` | Multicam? | ❌ |
| `item.findItemsMatchingMediaPath(path)` | Find by path | ✅ |
| `item.getColorLabel()` / `setColorLabel(idx)` | Color label | ✅ |
| `item.getFootageInterpretation()` / `setFootageInterpretation()` | Footage interp | ✅ |
| `item.getProjectMetadata()` / `setProjectMetadata()` | XMP metadata | ✅ |
| `item.getXMPMetadata()` / `setXMPMetadata()` | Raw XMP | ✅ |
| `item.videoComponents()` | Video components on source | ❌ |
| `item.getColorSpace()` | Color space | ✅ |
| `item.getOriginalColorSpace()` | Original color space | ❌ |
| `item.getEmbeddedLUTID()` | Embedded LUT | ❌ |
| `item.getInputLUTID()` | Input LUT | ❌ |
| `item.getInPoint()` / `getOutPoint()` | Source I/O | ❌ |
| `item.setInPoint()` / `setOutPoint()` | Set source I/O | ❌ |
| `item.clearInPoint()` / `clearOutPoint()` | Clear source I/O | ❌ |
### ComponentParam Object (Keyframes & Effect Properties)
| Method | Description | Implemented? |
|--------|-------------|:---:|
| `param.getValue()` | Get current value | ✅ |
| `param.setValue(val, updateUI)` | Set value | ✅ |
| `param.getValueAtKey(time)` | Value at keyframe | ❌ |
| `param.getValueAtTime(time)` | Interpolated value at time | ✅ (in keyframes.ts) |
| `param.setValueAtKey(time, val, updateUI)` | Set at keyframe | ✅ |
| `param.addKey(time)` | Add keyframe | ✅ |
| `param.removeKey(time)` | Remove keyframe | ✅ |
| `param.removeKeyRange(start, end)` | Remove keyframe range | ✅ |
| `param.getKeys()` | All keyframe times | ✅ |
| `param.findNearestKey(time, threshold)` | Find nearest | ❌ |
| `param.findNextKey(time)` | Find next | ❌ |
| `param.findPreviousKey(time)` | Find previous | ❌ |
| `param.areKeyframesSupported()` | Supports keyframes? | ❌ |
| `param.isTimeVarying()` | Has keyframes? | ❌ |
| `param.setTimeVarying(bool)` | Enable keyframes | ✅ |
| `param.setInterpolationTypeAtKey(time, type, updateUI)` | Interp type | ✅ |
| `param.getColorValue()` | Color value | ❌ |
| `param.setColorValue(a, r, g, b, updateUI)` | Set color | ✅ |
| `param.displayName` | Property name | ✅ |
### Encoder Object (`app.encoder`)
| Method | Description | Implemented? |
|--------|-------------|:---:|
| `encoder.encodeSequence(seq, path, preset, workArea, removeOnCompletion)` | Queue encode | ✅ |
| `encoder.encodeProjectItem(item, path, preset, workArea, removeOnCompletion)` | Encode item | ✅ |
| `encoder.encodeFile(path, outputPath, preset, removeOnCompletion, startTime, stopTime)` | Encode file | ✅ |
| `encoder.launchEncoder()` | Launch AME | ✅ |
| `encoder.startBatch()` | Start render queue | ✅ |
| `encoder.setEmbeddedXMPEnabled(enable)` | XMP in output | ❌ |
| `encoder.setSidecarXMPEnabled(enable)` | Sidecar XMP | ❌ |
### Source Monitor (`app.sourceMonitor`)
| Method | Description | Implemented? |
|--------|-------------|:---:|
| `sourceMonitor.openProjectItem(item)` | Open in source | ✅ |
| `sourceMonitor.openFilePath(path)` | Open file in source | ✅ |
| `sourceMonitor.closeClip()` | Close current | ✅ |
| `sourceMonitor.closeAllClips()` | Close all | ✅ |
| `sourceMonitor.play(speed)` | Play | ✅ |
| `sourceMonitor.getPosition()` | CTI position | ✅ |
| `sourceMonitor.getProjectItem()` | Currently loaded item | ✅ |
### Project Manager (`app.projectManager`)
| Attribute | Description | Implemented? |
|-----------|-------------|:---:|
| All 14+ attributes for project consolidation/trimming | Copy, transfer, transcode | ✅ |
---
## QE DOM (Undocumented but Critical)
**Must call `app.enableQE()` first.**
### QE Global (`qe`)
| Method | Description |
|--------|-------------|
| `qe.project` | QE project object |
| `qe.getSequencePresets()` | All sequence presets |
| `qe.newProject(path)` | New project |
| `qe.open(path, showUI)` | Open project |
| `qe.startPlayback()` | Play timeline |
| `qe.stopPlayback()` | Stop playback |
| `qe.stop()` | Stop |
| `qe.exit()` | Exit app |
| `qe.wait(ms)` | Wait |
| `qe.getModalWindowID()` | Modal check |
| `qe.executeConsoleCommand(cmd)` | Console command |
### QE Project (`qe.project`)
| Method | Description | Implemented? |
|--------|-------------|:---:|
| `qe.project.getActiveSequence()` | QE active sequence | ✅ |
| `qe.project.getVideoEffectList()` | All video effects | ✅ |
| `qe.project.getVideoEffectByName(name)` | Get effect by name | ✅ |
| `qe.project.getAudioEffectList()` | All audio effects | ✅ |
| `qe.project.getAudioEffectByName(name)` | Get audio effect | ✅ |
| `qe.project.getVideoTransitionList()` | All video transitions | ✅ |
| `qe.project.getVideoTransitionByName(name)` | Get transition | ✅ |
| `qe.project.getAudioTransitionList()` | All audio transitions | ✅ |
| `qe.project.getAudioTransitionByName(name)` | Get audio transition | ✅ |
| `qe.project.undo()` | Undo | ✅ |
| `qe.project.newSequence(name, presetPath)` | New seq from preset | ❌ **MISSING** |
| `qe.project.importFiles(paths)` | Import | ❌ |
| `qe.project.importAEComps(path, compNames)` | AE comps | ❌ |
### QE Sequence
| Method | Description | Implemented? |
|--------|-------------|:---:|
| `qeSeq.getVideoTrackAt(idx)` | Get video track | ✅ |
| `qeSeq.getAudioTrackAt(idx)` | Get audio track | ✅ |
| `qeSeq.addTracks(vNum, aNum, aMono, a5_1, aAdaptive)` | Add tracks | ✅ |
| `qeSeq.removeTracks(vIdx, aIdx, aMonoIdx, a5_1Idx)` | Remove tracks | ❌ |
### QE Track Item (Clip) — **THE MOST POWERFUL PART**
| Method | Description | Implemented? |
|--------|-------------|:---:|
| `qeClip.addVideoEffect(effect)` | Add video effect | ✅ |
| `qeClip.addAudioEffect(effect)` | Add audio effect | ✅ |
| `qeClip.addTransition(transition, ...)` | Add transition | ✅ |
| `qeClip.removeEffects()` | Remove ALL effects | ✅ |
| `qeClip.remove()` | Remove from timeline | ✅ |
| `qeClip.rippleDelete()` | Ripple delete | ✅ |
| `qeClip.move(newTime)` | Move clip | ❌ |
| `qeClip.moveToTrack(trackIdx)` | Move to different track | ✅ |
| `qeClip.roll(newTime)` | Roll edit | ✅ |
| `qeClip.slide(offset)` | Slide edit | ✅ |
| `qeClip.slip(offset)` | Slip edit | ✅ |
| `qeClip.setSpeed(speed, ...)` | Set playback speed | ✅ |
| `qeClip.setReverse(reverse)` | Reverse playback | ✅ |
| `qeClip.setName(name)` | Rename clip | ✅ |
| `qeClip.setScaleToFrameSize()` | Scale to frame | ❌ |
| `qeClip.setFrameBlend(enable)` | Frame blending | ✅ |
| `qeClip.setTimeInterpolationType(type)` | Time interp (optical flow etc.) | ✅ |
| `qeClip.setAntiAliasQuality(quality)` | Anti-alias | ❌ |
| `qeClip.setStartPercent(pct)` | Transition start % | ❌ |
| `qeClip.setEndPercent(pct)` | Transition end % | ❌ |
| `qeClip.setStartPosition(pos)` | Start position | ❌ |
| `qeClip.setEndPosition(pos)` | End position | ❌ |
| `qeClip.setBorderColor(color)` | Border color | ❌ |
| `qeClip.setBorderWidth(width)` | Border width | ❌ |
| `qeClip.setMulticam(enable)` | Multicam | ❌ |
| `qeClip.setSwitchSources(enable)` | Switch sources | ❌ |
| `qeClip.canDoMulticam()` | Check multicam | ❌ |
| `qeClip.getClipPanComponent()` | Pan component | ❌ |
| `qeClip.getComponentAt(idx)` | Get component | ❌ |
| `qeClip.getProjectItem()` | Source item | ❌ |
---
## Implementation Status — Priority List
**Total runtime-registered tools: 268 across 29 modules** (including safe edit plans)
### P0 — Critical ✅ ALL IMPLEMENTED
1. ~~**`create_project`**~~ — ❌ Intentionally skipped (requires UXP, not available via ExtendScript CEP)
2. ✅ **`create_sequence_from_clips`** — `project.createNewSequenceFromClips` (advanced.ts)
3. ✅ **`overwrite_clip`** — `seq.overwriteClip` (advanced.ts)
4. ✅ **`ripple_delete`** — QE DOM (advanced.ts)
5. ✅ **`close_gaps`** — QE DOM ripple delete approach (advanced.ts)
6. ✅ **`get_clip_speed`** — `clip.getSpeed()` + `isSpeedReversed()` (advanced.ts)
7. ✅ **`set_clip_speed_qe`** — `qeClip.setSpeed()` (advanced.ts)
8. ✅ **`reverse_clip`** — `qeClip.setReverse()` (advanced.ts)
### P1 — Important for full LLM control ✅ ALL IMPLEMENTED
9. ✅ **`link_selection` / `unlink_selection`** — (advanced.ts)
10. ✅ **`set_clip_selection`** — (selection.ts)
11. ✅ **`roll_edit` / `slide_edit` / `slip_edit`** — QE DOM (advanced.ts)
12. ✅ **`move_clip_to_track`** — QE DOM (advanced.ts)
13. ✅ **`remove_all_effects`** — QE DOM (advanced.ts)
14. ✅ **`set_blend_mode`** — (utility.ts)
15. ✅ **`set_color_value`** — `param.setColorValue()` (advanced.ts)
16. ✅ **`capture_frame`** — Export frame + return as base64 image (export.ts)
17. ✅ **`set_keyframe_interpolation`** — Linear/Bezier/Hold (keyframes.ts)
18. ✅ **`get_keyframes` / `remove_keyframe` / `remove_keyframe_range`** — Full CRUD (keyframes.ts)
### P2 — Nice-to-have ✅ ALL IMPLEMENTED
19. ✅ **`close_sequence`** — `seq.close()` (advanced.ts)
20. ✅ **`export_as_project`** — `seq.exportAsProject()` (advanced.ts)
21. ✅ **`create_bars_and_tone`** — `project.newBarsAndTone()` (project.ts)
22. ✅ **`open_in_source_monitor`** — (source-monitor.ts)
23. ✅ **`play_source_monitor`** — (playback.ts)
24. ✅ **`start_batch_encode`** — `encoder.startBatch()` (advanced.ts)
25. ✅ **`encode_project_item` / `encode_file`** — (export.ts)
26. ✅ **`import_ae_comps`** — (project.ts)
27. ✅ **`set_frame_blend`** — QE DOM (advanced.ts)
28. ✅ **`set_time_interpolation`** — Optical flow etc. (advanced.ts)
29. ✅ **`delete_bin` / `rename_bin`** — (advanced.ts)
30. ✅ **`create_smart_bin`** — (advanced.ts)
31. ✅ **`find_items_by_media_path`** — (advanced.ts)
32. ✅ **`add_custom_metadata_field`** — (advanced.ts)
33. ✅ **`set_zero_point`** — (advanced.ts)
34. ✅ **`scene_edit_detection`** — (utility.ts)
35. ✅ **`get/set_workspace`** — (workspace.ts)
36. ✅ **LLM instructions resource** — `config://premiere-instructions` + `config://extendscript-reference`
### New modules added
- **workspace.ts** (2 tools) — get_workspaces, set_workspace
- **captions.ts** (1 tool) — create_caption_track
- **playback.ts** (4 tools) — play_timeline, stop_playback, play_source_monitor, get_source_monitor_position
- **project-manager.ts** (1 tool) — consolidate_and_transfer
- **health.ts** (1 tool) — ping
### Remaining unimplemented (low-value or risky)
- `app.newProject()` — Requires UXP or has severe limitations in ExtendScript
- `app.quit()` — Dangerous, intentionally excluded
- `app.openFCPXML()` — Use import_fcp_xml instead
- `track.overwriteClip()` — Covered by seq.overwriteClip
- `item.canProxy()`, `item.isSequence()`, `item.isMergedClip()`, `item.isMulticamClip()` — Minor read-only checks
- `param.findNearestKey()`, `param.findNextKey()`, `param.findPreviousKey()` — Minor keyframe navigation
- `qeClip.setAntiAliasQuality()`, `qeClip.setBorderColor/Width()`, `qeClip.setMulticam()` — Niche QE features
- `qeSeq.removeTracks()` — Risky operation
---
## Known Effect Match Names (for `appendVideoFilter` via QE)
From adb-mcp research:
- `AE.ADBE Black & White` — Black and white
- `AE.ADBE Gaussian Blur 2` — Gaussian blur (properties: `Blurriness`, `Blur Dimensions`)
- `AE.ADBE Tint` — Tint (properties: `Map Black To`, `Map White To`, `Amount to Tint`)
- `AE.ADBE Motion Blur` — Directional blur (properties: `Direction`, `Blur Length`)
### Valid Transition Names
**ADBE (built-in):**
- `ADBE Additive Dissolve`, `ADBE Cross Zoom`, `ADBE Cube Spin`, `ADBE Film Dissolve`
- `ADBE Flip Over`, `ADBE Gradient Wipe`, `ADBE Iris Cross`, `ADBE Iris Diamond`
- `ADBE Iris Round`, `ADBE Iris Square`, `ADBE Page Peel`, `ADBE Push`, `ADBE Slide`, `ADBE Wipe`
**AE.ADBE (After Effects):**
- `AE.ADBE Center Split`, `AE.ADBE Inset`, `AE.ADBE Cross Dissolve New`
- `AE.ADBE Dip To White`, `AE.ADBE Split`, `AE.ADBE Whip`
- `AE.ADBE Non-Additive Dissolve`, `AE.ADBE Dip To Black`
- `AE.ADBE Barn Doors`, `AE.ADBE MorphCut`
### Blend Modes
`NORMAL`, `DISSOLVE`, `DARKEN`, `MULTIPLY`, `COLORBURN`, `LINEARBURN`, `DARKERCOLOR`,
`LIGHTEN`, `SCREEN`, `COLORDODGE`, `LINEARDODGE`, `LIGHTERCOLOR`, `OVERLAY`, `SOFTLIGHT`,
`HARDLIGHT`, `VIVIDLIGHT`, `LINEARLIGHT`, `PINLIGHT`, `HARDMIX`, `DIFFERENCE`, `EXCLUSION`,
`SUBTRACT`, `DIVIDE`, `HUE`, `SATURATION`, `COLOR`, `LUMINOSITY`
### Interpolation Types
- `0` — KF_Interp_Mode_Linear
- `4` — KF_Interp_Mode_Hold
- `5` — KF_Interp_Mode_Bezier
---
## Architecture Insights from adb-mcp
Their MCP server includes a **resource** (`config://get_instructions`) that gives the LLM context about how to use Premiere effectively:
- "Add clips first, then effects, then transitions"
- "Keep transitions short (≤2 seconds)"
- "No gap between clips for transitions to work"
- "Video clips with higher track index overlap lower ones"
- "Images have default 5-second duration"
- "First clip determines sequence resolution"
This recommendation is implemented. Our server exposes `config://premiere-instructions` for editing
workflow guidance and `config://extendscript-reference` for the scripting surface. Both resources are
registered alongside the tool catalog in `src/server.ts`; version 1.2.0 also registers
`config://premiere-workflows` and four guided prompts.