ue-mcp 1.0.75 → 1.0.76

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md CHANGED
@@ -1,6 +1,6 @@
1
1
  # UE-MCP
2
2
 
3
- **Unreal Engine Model Context Protocol Server** - gives AI assistants deep read/write access to the Unreal Editor through <!-- count:tools -->21<!-- /count --> category tools covering <!-- count:actions -->566+<!-- /count --> actions, plus a YAML flow engine for multi-step workflows.
3
+ **Unreal Engine Model Context Protocol Server** - gives AI assistants deep read/write access to the Unreal Editor through <!-- count:tools -->21<!-- /count --> category tools covering <!-- count:actions -->569+<!-- /count --> actions, plus a YAML flow engine for multi-step workflows.
4
4
 
5
5
  ```mermaid
6
6
  flowchart LR
@@ -57,7 +57,7 @@ If you prefer to configure manually, add to your MCP client config:
57
57
 
58
58
  - [Getting Started](https://db-lyon.github.io/ue-mcp/getting-started/) — Installation, configuration, first run
59
59
  - [Architecture](https://db-lyon.github.io/ue-mcp/architecture/) — How the pieces fit together
60
- - [Tool Reference](https://db-lyon.github.io/ue-mcp/tool-reference/) - All <!-- count:tools -->21<!-- /count --> tools with <!-- count:actions -->566+<!-- /count --> actions
60
+ - [Tool Reference](https://db-lyon.github.io/ue-mcp/tool-reference/) - All <!-- count:tools -->21<!-- /count --> tools with <!-- count:actions -->569+<!-- /count --> actions
61
61
  - [Flows](https://db-lyon.github.io/ue-mcp/flows/) - YAML flow engine, custom tasks, rollback, hooks
62
62
  - [Configuration](https://db-lyon.github.io/ue-mcp/configuration/) — `.ue-mcp.json` and MCP client config
63
63
  - [Neon Shrine Demo](https://db-lyon.github.io/ue-mcp/neon-shrine-demo/) — Interactive guided demo
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "tools": 21,
3
- "actions": 566,
4
- "bridgeActions": 536,
3
+ "actions": 569,
4
+ "bridgeActions": 539,
5
5
  "localActions": 30,
6
6
  "perTool": {
7
7
  "project": 27,
@@ -16,7 +16,7 @@
16
16
  "niagara": 28,
17
17
  "audio": 5,
18
18
  "widget": 22,
19
- "editor": 56,
19
+ "editor": 59,
20
20
  "reflection": 8,
21
21
  "gameplay": 54,
22
22
  "gas": 14,
@@ -26,6 +26,6 @@
26
26
  "statetree": 35,
27
27
  "plugins": 2
28
28
  },
29
- "generatedAt": "2026-06-06T01:31:55.011Z",
30
- "version": "1.0.75"
29
+ "generatedAt": "2026-06-06T02:35:43.378Z",
30
+ "version": "1.0.76"
31
31
  }
@@ -120,7 +120,10 @@ export const editorTool = categoryTool("editor", "Editor commands, Python execut
120
120
  focus_on_actor: bp("Focus on actor. Params: actorLabel", "focus_viewport_on_actor"),
121
121
  create_sequence: bp("Create Level Sequence. Params: name, packagePath?", "create_level_sequence"),
122
122
  get_sequence_info: bp("Read sequence. Params: assetPath, includeSectionDetails? (attach sockets, first transform key values per track)", "get_sequence_info"),
123
- add_sequence_track: bp("Add track. Params: assetPath, trackType, actorLabel?", "add_sequence_track"),
123
+ add_sequence_track: bp("Add an empty track. Params: assetPath, trackType, actorLabel?", "add_sequence_track"),
124
+ add_sequence_section: bp("Add a section to a track (creating the track if needed), set its start/end in seconds, and for a CameraCut track bind it to a camera. Returns the section index + channel names to key. Params: sequencePath, trackType (Transform|Float|Fade|CameraCut|Audio|Event|SkeletalAnimation), actorLabel? (binding scope), startSeconds?, endSeconds?, cameraActorLabel? (#548)", "add_sequence_section", (p) => ({ sequencePath: p.sequencePath ?? p.assetPath, trackType: p.trackType, actorLabel: p.actorLabel, startSeconds: p.startSeconds, endSeconds: p.endSeconds, cameraActorLabel: p.cameraActorLabel })),
125
+ set_sequence_keyframes: bp("Add keyframes to a section channel. Transform channels: Location.X/Y/Z, Rotation.X/Y/Z (or friendly x/y/z, yaw/pitch/roll); Fade/Float: the float channel. Params: sequencePath, trackType, actorLabel?, sectionIndex? (default 0), channel, keyframes ([{seconds, value}]), interpolation? (cubic|linear) (#548)", "set_sequence_keyframes", (p) => ({ sequencePath: p.sequencePath ?? p.assetPath, trackType: p.trackType, actorLabel: p.actorLabel, sectionIndex: p.sectionIndex, channel: p.channel, keyframes: p.keyframes, interpolation: p.interpolation })),
126
+ set_sequence_playback_range: bp("Set a Level Sequence's playback range in seconds. Params: sequencePath, startSeconds, endSeconds (#548)", "set_sequence_playback_range", (p) => ({ sequencePath: p.sequencePath ?? p.assetPath, startSeconds: p.startSeconds, endSeconds: p.endSeconds })),
124
127
  play_sequence: bp("Play/stop/pause sequence. Params: assetPath, sequenceAction", "play_sequence", (p) => ({ assetPath: p.assetPath, action: p.sequenceAction ?? "play" })),
125
128
  build_all: bp("Build all (geometry, lighting, paths, HLOD)", "build_all"),
126
129
  build_geometry: bp("Rebuild BSP geometry", "build_geometry"),
@@ -177,6 +180,14 @@ export const editorTool = categoryTool("editor", "Editor commands, Python execut
177
180
  packagePath: z.string().optional(),
178
181
  assetPath: z.string().optional(),
179
182
  trackType: z.string().optional(),
183
+ sequencePath: z.string().optional().describe("Level Sequence asset path for sequencer authoring (#548)"),
184
+ startSeconds: z.number().optional().describe("Section/playback range start in seconds (#548)"),
185
+ endSeconds: z.number().optional().describe("Section/playback range end in seconds (#548)"),
186
+ cameraActorLabel: z.string().optional().describe("add_sequence_section CameraCut: camera actor to bind (#548)"),
187
+ sectionIndex: z.number().optional().describe("set_sequence_keyframes: target section index (default 0) (#548)"),
188
+ channel: z.string().optional().describe("set_sequence_keyframes: channel name (Location.X, Rotation.Z, yaw, fade...) (#548)"),
189
+ keyframes: z.array(z.object({ seconds: z.number(), value: z.number() })).optional().describe("set_sequence_keyframes: [{seconds, value}] (#548)"),
190
+ interpolation: z.string().optional().describe("set_sequence_keyframes: cubic (default) or linear (#548)"),
180
191
  sequenceAction: z.enum(["play", "stop", "pause"]).optional(),
181
192
  directory: z.string().optional(),
182
193
  platform: z.string().optional(),
@@ -1 +1 @@
1
- {"version":3,"file":"editor.js","sourceRoot":"","sources":["../../src/tools/editor.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,EAAE,YAAY,EAAE,EAAE,EAAE,SAAS,EAAkC,MAAM,aAAa,CAAC;AAC1F,OAAO,EAAE,WAAW,EAAE,UAAU,EAAE,aAAa,EAAE,YAAY,EAAE,MAAM,sBAAsB,CAAC;AAC5F,OAAO,EAAE,cAAc,EAAE,eAAe,EAAE,MAAM,0BAA0B,CAAC;AAC3E,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,eAAe,CAAC;AAE9C,MAAM,CAAC,MAAM,UAAU,GAAY,YAAY,CAC7C,QAAQ,EACR,wIAAwI,EACxI;IACE,YAAY,EAAE;QACZ,WAAW,EAAE,oEAAoE;QACjF,OAAO,EAAE,KAAK,EAAE,GAAgB,EAAE,EAAE;YAClC,MAAM,MAAM,GAAG,MAAM,WAAW,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;YAC9C,IAAI,MAAM,CAAC,OAAO,EAAE,CAAC;gBACnB,IAAI,CAAC;oBAAC,MAAM,GAAG,CAAC,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;gBAAC,CAAC;gBAAC,MAAM,CAAC,CAAC,gCAAgC,CAAC,CAAC;YACpF,CAAC;YACD,OAAO,MAAM,CAAC;QAChB,CAAC;KACF;IACD,WAAW,EAAE;QACX,WAAW,EAAE,gCAAgC;QAC7C,OAAO,EAAE,KAAK,IAAI,EAAE;YAClB,OAAO,UAAU,EAAE,CAAC;QACtB,CAAC;KACF;IACD,cAAc,EAAE;QACd,WAAW,EAAE,4BAA4B;QACzC,OAAO,EAAE,KAAK,EAAE,GAAgB,EAAE,EAAE;YAClC,OAAO,aAAa,CAAC,GAAG,CAAC,OAAO,EAAE,GAAG,CAAC,MAAM,CAAC,CAAC;QAChD,CAAC;KACF;IACD,aAAa,EAAE;QACb,WAAW,EAAE,uFAAuF;QACpG,OAAO,EAAE,KAAK,EAAE,GAAgB,EAAE,EAAE;YAClC,GAAG,CAAC,OAAO,CAAC,YAAY,EAAE,CAAC;YAC3B,MAAM,KAAK,GAAa,EAAE,CAAC;YAC3B,MAAM,MAAM,GAAG,MAAM,YAAY,CAAC,GAAG,CAAC,OAAO,CAAC,WAAY,EAAE;gBAC1D,QAAQ,EAAE,CAAC,IAAI,EAAE,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC;aACrC,CAAC,CAAC;YACH,OAAO,EAAE,GAAG,MAAM,EAAE,MAAM,EAAE,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,EAAE,CAAC;QAC/C,CAAC;KACF;IACD,eAAe,EAAE,EAAE,CAAC,sCAAsC,EAAE,iBAAiB,CAAC;IAC9E,cAAc,EAAE;QACd,WAAW,EAAE,oCAAoC;QACjD,OAAO,EAAE,KAAK,EAAE,GAAgB,EAAE,MAA+B,EAAE,EAAE;YACnE,MAAM,IAAI,GAAI,MAAM,CAAC,IAAe,IAAI,EAAE,CAAC;YAC3C,MAAM,MAAM,GAAG,MAAM,GAAG,CAAC,MAAM,CAAC,IAAI,CAAC,gBAAgB,EAAE,EAAE,IAAI,EAAE,CAAC,CAAC;YAEjE,oEAAoE;YACpE,+DAA+D;YAC/D,MAAM,OAAO,GAAG,OAAO,MAAM,KAAK,QAAQ,IAAI,MAAM,KAAK,IAAI;gBAC3D,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC;gBACtC,CAAC,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC;YACjC,MAAM,KAAK,GAAG,EAAE,IAAI,EAAE,SAAS,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,EAAE,aAAa,EAAE,OAAO,EAAE,CAAC;YACpF,cAAc,CAAC,KAAK,CAAC,CAAC;YACtB,IAAI,CAAC;gBACH,MAAM,EAAE,GAAG,MAAM,MAAM,CAAC,SAAS,CAAC,CAAC;gBACnC,MAAM,EAAE,GAAG,MAAM,MAAM,CAAC,SAAS,CAAC,CAAC;gBACnC,MAAM,IAAI,GAAG,MAAM,MAAM,CAAC,WAAW,CAAC,CAAC;gBACvC,EAAE,CAAC,cAAc,CACf,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,MAAM,EAAE,EAAE,wBAAwB,CAAC,EAChD,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,GAAG,IAAI,CAC7B,CAAC;YACJ,CAAC;YAAC,MAAM,CAAC;gBACP,uEAAuE;YACzE,CAAC;YAED,MAAM,CAAC,GAAG,eAAe,EAAE,CAAC;YAC5B,OAAO,SAAS,CACd;gBACE,+BAA+B;gBAC/B,4CAA4C,CAAC,yBAAyB;gBACtE,4DAA4D;gBAC5D,EAAE;gBACF,6CAA6C;gBAC7C,kEAAkE;gBAClE,uEAAuE;gBACvE,EAAE;gBACF,0DAA0D;gBAC1D,yCAAyC;gBACzC,mEAAmE;gBACnE,4CAA4C;gBAC5C,4DAA4D;gBAC5D,EAAE;gBACF,oDAAoD;aACrD,CAAC,IAAI,CAAC,IAAI,CAAC,EACZ,MAAM,EACN;gBACE,IAAI,EAAE,qBAAqB;gBAC3B,eAAe,EAAE;oBACf,4BAA4B;oBAC5B,sCAAsC;oBACtC,mCAAmC;iBACpC;gBACD,OAAO,EAAE;oBACP,eAAe,EAAE,CAAC;oBAClB,YAAY,EAAE,UAAU;oBACxB,cAAc,EAAE,QAAQ;oBACxB,cAAc,EAAE,CAAC,OAAO,EAAE,SAAS,EAAE,kBAAkB,EAAE,WAAW,CAAC;iBACtE;aACF,CACF,CAAC;QACJ,CAAC;KACF;IACD,eAAe,EAAE,EAAE,CAAC,8FAA8F,EAAE,iBAAiB,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,QAAQ,EAAE,CAAC,CAAC,QAAQ,EAAE,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC;IACvL,YAAY,EAAE,EAAE,CAAC,+DAA+D,EAAE,cAAc,CAAC;IACjG,cAAc,EAAE,EAAE,CAAC,2RAA2R,EAAE,aAAa,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC,CAAC,SAAS,IAAI,QAAQ,EAAE,oBAAoB,EAAE,CAAC,CAAC,oBAAoB,EAAE,2BAA2B,EAAE,CAAC,CAAC,2BAA2B,EAAE,CAAC,CAAC;IACtd,iBAAiB,EAAE,EAAE,CAAC,kLAAkL,EAAE,mBAAmB,CAAC;IAC9N,YAAY,EAAE,EAAE,CAAC,+IAA+I,EAAE,cAAc,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,WAAW,EAAE,CAAC,CAAC,WAAW,EAAE,CAAC,CAAC;IAC1N,eAAe,EAAE,EAAE,CAAC,gaAAga,EAAE,iBAAiB,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,UAAU,EAAE,CAAC,CAAC,UAAU,EAAE,YAAY,EAAE,CAAC,CAAC,YAAY,EAAE,SAAS,EAAE,CAAC,CAAC,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,SAAS,EAAE,CAAC,CAAC,SAAS,EAAE,KAAK,EAAE,CAAC,CAAC,KAAK,EAAE,CAAC,CAAC;IAC3lB,sBAAsB,EAAE,EAAE,CAAC,qxBAAqxB,EAAE,wBAAwB,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,SAAS,EAAE,CAAC,CAAC,SAAS,EAAE,YAAY,EAAE,CAAC,CAAC,YAAY,EAAE,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,SAAS,EAAE,CAAC,CAAC,SAAS,EAAE,iBAAiB,EAAE,CAAC,CAAC,iBAAiB,EAAE,KAAK,EAAE,CAAC,CAAC,KAAK,EAAE,CAAC,CAAC;IAC5+B,uBAAuB,EAAE,EAAE,CAAC,oXAAoX,EAAE,yBAAyB,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,OAAO,EAAE,CAAC,CAAC,OAAO,EAAE,gBAAgB,EAAE,CAAC,CAAC,gBAAgB,EAAE,CAAC,CAAC;IACnf,kBAAkB,EAAE,EAAE,CAAC,6GAA6G,EAAE,oBAAoB,CAAC;IAC3J,UAAU,EAAE,EAAE,CAAC,gBAAgB,EAAE,YAAY,CAAC;IAC9C,IAAI,EAAE,EAAE,CAAC,uBAAuB,EAAE,MAAM,CAAC;IACzC,IAAI,EAAE,EAAE,CAAC,uBAAuB,EAAE,MAAM,CAAC;IACzC,cAAc,EAAE,EAAE,CAAC,0BAA0B,EAAE,8BAA8B,CAAC;IAC9E,QAAQ,EAAE,EAAE,CAAC,mCAAmC,EAAE,kBAAkB,CAAC;IACrE,eAAe,EAAE,EAAE,CAAC,4BAA4B,EAAE,iBAAiB,CAAC;IACpE,kBAAkB,EAAE,EAAE,CAAC,+HAA+H,EAAE,oBAAoB,CAAC;IAC7K,iBAAiB,EAAE,EAAE,CAAC,sMAAsM,EAAE,mBAAmB,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,UAAU,EAAE,CAAC,CAAC,UAAU,EAAE,QAAQ,EAAE,CAAC,CAAC,QAAQ,EAAE,QAAQ,EAAE,CAAC,CAAC,QAAQ,EAAE,KAAK,EAAE,CAAC,CAAC,KAAK,EAAE,MAAM,EAAE,CAAC,CAAC,MAAM,EAAE,GAAG,EAAE,CAAC,CAAC,GAAG,EAAE,CAAC,CAAC;IACnX,YAAY,EAAE,EAAE,CAAC,yMAAyM,EAAE,cAAc,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,OAAO,EAAE,CAAC,CAAC,OAAO,EAAE,CAAC,CAAC;IAC5Q,YAAY,EAAE,EAAE,CAAC,qBAAqB,EAAE,mBAAmB,CAAC;IAC5D,uBAAuB,EAAE,EAAE,CAAC,6gBAA6gB,EAAE,yBAAyB,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,CAAC,CAAC,KAAK,EAAE,MAAM,EAAE,CAAC,CAAC,MAAM,EAAE,WAAW,EAAE,CAAC,CAAC,WAAW,EAAE,YAAY,EAAE,CAAC,CAAC,YAAY,EAAE,CAAC,CAAC;IAC9rB,kBAAkB,EAAE,EAAE,CAAC,omBAAomB,EAAE,oBAAoB,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,WAAW,EAAE,CAAC,CAAC,WAAW,EAAE,KAAK,EAAE,CAAC,CAAC,KAAK,EAAE,KAAK,EAAE,CAAC,CAAC,KAAK,EAAE,CAAC,CAAC;IAC3tB,YAAY,EAAE,EAAE,CAAC,mDAAmD,EAAE,qBAAqB,CAAC;IAC5F,cAAc,EAAE,EAAE,CAAC,oCAAoC,EAAE,yBAAyB,CAAC;IACnF,eAAe,EAAE,EAAE,CAAC,mDAAmD,EAAE,uBAAuB,CAAC;IACjG,iBAAiB,EAAE,EAAE,CAAC,iHAAiH,EAAE,mBAAmB,CAAC;IAC7J,kBAAkB,EAAE,EAAE,CAAC,sDAAsD,EAAE,oBAAoB,CAAC;IACpG,aAAa,EAAE,EAAE,CAAC,6DAA6D,EAAE,eAAe,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,SAAS,EAAE,CAAC,CAAC,SAAS,EAAE,MAAM,EAAE,CAAC,CAAC,cAAc,IAAI,MAAM,EAAE,CAAC,CAAC;IAC1K,SAAS,EAAE,EAAE,CAAC,6CAA6C,EAAE,WAAW,CAAC;IACzE,cAAc,EAAE,EAAE,CAAC,sBAAsB,EAAE,gBAAgB,CAAC;IAC5D,UAAU,EAAE,EAAE,CAAC,aAAa,EAAE,YAAY,CAAC;IAC3C,eAAe,EAAE,EAAE,CAAC,yCAAyC,EAAE,iBAAiB,CAAC;IACjF,gBAAgB,EAAE,EAAE,CAAC,sBAAsB,EAAE,kBAAkB,CAAC;IAChE,YAAY,EAAE,EAAE,CAAC,iCAAiC,EAAE,cAAc,CAAC;IACnE,OAAO,EAAE,EAAE,CAAC,wDAAwD,EAAE,gBAAgB,CAAC;IACvF,UAAU,EAAE,EAAE,CAAC,2BAA2B,EAAE,YAAY,CAAC;IACzD,eAAe,EAAE,EAAE,CAAC,oCAAoC,EAAE,iBAAiB,CAAC;IAC5E,YAAY,EAAE,EAAE,CAAC,oBAAoB,EAAE,cAAc,CAAC;IACtD,cAAc,EAAE,EAAE,CAAC,wCAAwC,EAAE,gBAAgB,CAAC;IAC9E,iBAAiB,EAAE,EAAE,CAAC,0BAA0B,EAAE,mBAAmB,CAAC;IACtE,iBAAiB,EAAE,EAAE,CAAC,uEAAuE,EAAE,mBAAmB,CAAC;IACnH,mBAAmB,EAAE,EAAE,CAAC,yCAAyC,EAAE,qBAAqB,CAAC;IACzF,iBAAiB,EAAE,EAAE,CAAC,6BAA6B,EAAE,mBAAmB,CAAC;IACzE,YAAY,EAAE,EAAE,CAAC,2BAA2B,EAAE,cAAc,CAAC;IAC7D,iBAAiB,EAAE,EAAE,CAAC,+EAA+E,EAAE,mBAAmB,CAAC;IAC3H,UAAU,EAAE,EAAE,CAAC,6CAA6C,EAAE,YAAY,CAAC;IAC3E,aAAa,EAAE,EAAE,CAAC,6CAA6C,EAAE,iBAAiB,CAAC;IACnF,UAAU,EAAE,EAAE,CAAC,4PAA4P,EAAE,YAAY,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,WAAW,EAAE,CAAC,CAAC,WAAW,EAAE,cAAc,EAAE,CAAC,CAAC,cAAc,EAAE,CAAC,CAAC;IACrW,aAAa,EAAE,EAAE,CAAC,6LAA6L,EAAE,eAAe,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,UAAU,EAAE,CAAC,CAAC,UAAU,EAAE,OAAO,EAAE,CAAC,CAAC,OAAO,EAAE,kBAAkB,EAAE,CAAC,CAAC,kBAAkB,EAAE,oBAAoB,EAAE,CAAC,CAAC,oBAAoB,EAAE,CAAC,CAAC;IACpX,cAAc,EAAE,EAAE,CAAC,qGAAqG,EAAE,gBAAgB,CAAC;IAC3I,mBAAmB,EAAE,EAAE,CAAC,yDAAyD,EAAE,qBAAqB,CAAC;CAC1G,EACD,SAAS,EACT;IACE,OAAO,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;IAC9B,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;IAC3B,QAAQ,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,iDAAiD,CAAC;IAC3F,IAAI,EAAE,CAAC,CAAC,KAAK,CAAC;QACZ,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC;QACnB,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,OAAO,EAAE,CAAC;KACtB,CAAC,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,oGAAoG,CAAC;IAC5H,UAAU,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;IACjC,MAAM,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,0DAA0D,CAAC;IAClG,WAAW,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,gDAAgD,CAAC;IAC7F,YAAY,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;IACnC,SAAS,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,wGAAwG,CAAC;IACnJ,SAAS,EAAE,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,yHAAyH,CAAC;IAC9K,SAAS,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,mGAAmG,CAAC;IAC9I,iBAAiB,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,wIAAwI,CAAC;IAC3L,KAAK,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,qDAAqD,CAAC;IAC5F,YAAY,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;IACnC,KAAK,EAAE,CAAC,CAAC,OAAO,EAAE,CAAC,QAAQ,EAAE;IAC7B,SAAS,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,OAAO,EAAE,MAAM,EAAE,QAAQ,CAAC,CAAC,CAAC,QAAQ,EAAE;IACzD,oBAAoB,EAAE,CAAC,CAAC,OAAO,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,0FAA0F,CAAC;IACjJ,2BAA2B,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,6EAA6E,CAAC;IAC1I,UAAU,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;IACjC,KAAK,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;IAC5B,QAAQ,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;IAC/B,UAAU,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;IACjC,QAAQ,EAAE,IAAI,CAAC,QAAQ,EAAE;IACzB,QAAQ,EAAE,OAAO,CAAC,QAAQ,EAAE;IAC5B,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;IAC3B,WAAW,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;IAClC,SAAS,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;IAChC,SAAS,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;IAChC,cAAc,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,MAAM,EAAE,MAAM,EAAE,OAAO,CAAC,CAAC,CAAC,QAAQ,EAAE;IAC5D,SAAS,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;IAChC,QAAQ,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;IAC/B,QAAQ,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;IAC/B,MAAM,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;IAC7B,QAAQ,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;IAC/B,KAAK,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;IAC5B,OAAO,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;IAC9B,WAAW,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;IAClC,OAAO,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,6FAA6F,CAAC;IACtI,gBAAgB,EAAE,CAAC,CAAC,OAAO,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,wFAAwF,CAAC;IAC3I,QAAQ,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,KAAK,EAAE,IAAI,EAAE,IAAI,EAAE,QAAQ,EAAE,OAAO,EAAE,UAAU,EAAE,QAAQ,EAAE,OAAO,CAAC,CAAC,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,mCAAmC,CAAC;IAChJ,WAAW,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,2CAA2C,CAAC;IACxF,WAAW,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,2CAA2C,CAAC;IACxF,MAAM,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,qDAAqD,CAAC;IAC7F,qBAAqB,EAAE,CAAC,CAAC,OAAO,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,0EAA0E,CAAC;IAClI,UAAU,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,qGAAqG,CAAC;IACjJ,OAAO,EAAE,CAAC,CAAC,OAAO,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,8DAA8D,CAAC;IACxG,KAAK,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,yBAAyB,CAAC;IAChE,MAAM,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,0BAA0B,CAAC;IAClE,GAAG,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,wBAAwB,CAAC;IAC7D,CAAC,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,2CAA2C,CAAC;IAC9E,CAAC,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,2CAA2C,CAAC;IAC9E,WAAW,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,gEAAgE,CAAC;IAC7G,YAAY,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,+CAA+C,CAAC;IACtG,WAAW,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,kEAAkE,CAAC;IAC/G,KAAK,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,0EAA0E,CAAC;IAC1H,WAAW,EAAE,CAAC,CAAC,OAAO,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,iDAAiD,CAAC;IAC/F,cAAc,EAAE,CAAC,CAAC,OAAO,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,qDAAqD,CAAC;IACtG,UAAU,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,sCAAsC,CAAC;IAClF,OAAO,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,6CAA6C,CAAC;IACtF,kBAAkB,EAAE,CAAC,CAAC,OAAO,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,oCAAoC,CAAC;IACzF,oBAAoB,EAAE,CAAC,CAAC,OAAO,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,0CAA0C,CAAC;CAClG,CACF,CAAC"}
1
+ {"version":3,"file":"editor.js","sourceRoot":"","sources":["../../src/tools/editor.ts"],"names":[],"mappings":"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"}
@@ -2458,9 +2458,27 @@ tasks:
2458
2458
  editor.add_sequence_track:
2459
2459
  class_path: ue-mcp.bridge
2460
2460
  group: editor
2461
- description: "Add track. Params: assetPath, trackType, actorLabel?"
2461
+ description: "Add an empty track. Params: assetPath, trackType, actorLabel?"
2462
2462
  options:
2463
2463
  method: add_sequence_track
2464
+ editor.add_sequence_section:
2465
+ class_path: ue-mcp.bridge
2466
+ group: editor
2467
+ description: "Add a section to a track (creating the track if needed), set its start/end in seconds, and for a CameraCut track bind it to a camera. Returns the section index + channel names to key. Params: sequencePath, trackType (Transform|Float|Fade|CameraCut|Audio|Event|SkeletalAnimation), actorLabel? (binding scope), startSeconds?, endSeconds?, cameraActorLabel? (#548)"
2468
+ options:
2469
+ method: add_sequence_section
2470
+ editor.set_sequence_keyframes:
2471
+ class_path: ue-mcp.bridge
2472
+ group: editor
2473
+ description: "Add keyframes to a section channel. Transform channels: Location.X/Y/Z, Rotation.X/Y/Z (or friendly x/y/z, yaw/pitch/roll); Fade/Float: the float channel. Params: sequencePath, trackType, actorLabel?, sectionIndex? (default 0), channel, keyframes ([{seconds, value}]), interpolation? (cubic|linear) (#548)"
2474
+ options:
2475
+ method: set_sequence_keyframes
2476
+ editor.set_sequence_playback_range:
2477
+ class_path: ue-mcp.bridge
2478
+ group: editor
2479
+ description: "Set a Level Sequence's playback range in seconds. Params: sequencePath, startSeconds, endSeconds (#548)"
2480
+ options:
2481
+ method: set_sequence_playback_range
2464
2482
  editor.play_sequence:
2465
2483
  class_path: ue-mcp.bridge
2466
2484
  group: editor
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "ue-mcp",
3
- "version": "1.0.75",
4
- "description": "Unreal Engine MCP server - 21 tools, 566+ actions for AI-driven editor control",
3
+ "version": "1.0.76",
4
+ "description": "Unreal Engine MCP server - 21 tools, 569+ actions for AI-driven editor control",
5
5
  "type": "module",
6
6
  "main": "dist/index.js",
7
7
  "exports": {
@@ -15,6 +15,7 @@
15
15
  #include "Tracks/MovieScene3DAttachTrack.h"
16
16
  #include "Sections/MovieScene3DAttachSection.h"
17
17
  #include "Sections/MovieScene3DTransformSection.h"
18
+ #include "Sections/MovieSceneCameraCutSection.h"
18
19
  #include "Channels/MovieSceneDoubleChannel.h"
19
20
  #include "Channels/MovieSceneFloatChannel.h"
20
21
  #include "Channels/MovieSceneChannelProxy.h"
@@ -37,6 +38,74 @@ void FSequencerHandlers::RegisterHandlers(FMCPHandlerRegistry& Registry)
37
38
  Registry.RegisterHandler(TEXT("get_sequence_info"), &ReadSequenceInfo);
38
39
  Registry.RegisterHandler(TEXT("add_sequence_track"), &AddTrack);
39
40
  Registry.RegisterHandler(TEXT("play_sequence"), &SequenceControl);
41
+ Registry.RegisterHandler(TEXT("set_sequence_playback_range"), &SetPlaybackRange);
42
+ Registry.RegisterHandler(TEXT("add_sequence_section"), &AddSection);
43
+ Registry.RegisterHandler(TEXT("set_sequence_keyframes"), &SetKeyframes);
44
+ }
45
+
46
+ // ─── #548 sequencer authoring helpers ────────────────────────────────
47
+ namespace
48
+ {
49
+ ULevelSequence* LoadSequence(const TSharedPtr<FJsonObject>& Params, FString& OutPath, FString& OutError)
50
+ {
51
+ if (!Params->TryGetStringField(TEXT("sequencePath"), OutPath))
52
+ {
53
+ if (!Params->TryGetStringField(TEXT("assetPath"), OutPath) && !Params->TryGetStringField(TEXT("path"), OutPath))
54
+ {
55
+ OutError = TEXT("Missing 'sequencePath' parameter");
56
+ return nullptr;
57
+ }
58
+ }
59
+ ULevelSequence* Seq = Cast<ULevelSequence>(UEditorAssetLibrary::LoadAsset(OutPath));
60
+ if (!Seq) { OutError = FString::Printf(TEXT("LevelSequence not found: %s"), *OutPath); return nullptr; }
61
+ return Seq;
62
+ }
63
+
64
+ // Resolve (creating if needed) the actor's possessable binding GUID.
65
+ bool ResolveActorBinding(ULevelSequence* Sequence, UMovieScene* MovieScene, const FString& ActorLabel, FGuid& OutGuid, FString& OutError)
66
+ {
67
+ UWorld* World = GetEditorWorld();
68
+ if (!World) { OutError = TEXT("No editor world available"); return false; }
69
+ AActor* TargetActor = FindActorByLabel(World, ActorLabel);
70
+ if (!TargetActor) { OutError = FString::Printf(TEXT("Actor not found: %s"), *ActorLabel); return false; }
71
+
72
+ for (int32 i = 0; i < MovieScene->GetPossessableCount(); ++i)
73
+ {
74
+ const FMovieScenePossessable& P = MovieScene->GetPossessable(i);
75
+ if (P.GetName() == ActorLabel || P.GetName() == TargetActor->GetName()) { OutGuid = P.GetGuid(); return true; }
76
+ }
77
+ OutGuid = MovieScene->AddPossessable(ActorLabel, TargetActor->GetClass());
78
+ Sequence->BindPossessableObject(OutGuid, *TargetActor, World);
79
+ return true;
80
+ }
81
+
82
+ UClass* ResolveTrackClass(const FString& TrackType)
83
+ {
84
+ if (TrackType.Equals(TEXT("Transform"), ESearchCase::IgnoreCase)) return UMovieScene3DTransformTrack::StaticClass();
85
+ if (TrackType.Equals(TEXT("Float"), ESearchCase::IgnoreCase)) return UMovieSceneFloatTrack::StaticClass();
86
+ if (TrackType.Equals(TEXT("SkeletalAnimation"), ESearchCase::IgnoreCase)) return UMovieSceneSkeletalAnimationTrack::StaticClass();
87
+ if (TrackType.Equals(TEXT("CameraCut"), ESearchCase::IgnoreCase)) return UMovieSceneCameraCutTrack::StaticClass();
88
+ if (TrackType.Equals(TEXT("Audio"), ESearchCase::IgnoreCase)) return UMovieSceneAudioTrack::StaticClass();
89
+ if (TrackType.Equals(TEXT("Event"), ESearchCase::IgnoreCase)) return UMovieSceneEventTrack::StaticClass();
90
+ if (TrackType.Equals(TEXT("Fade"), ESearchCase::IgnoreCase)) return UMovieSceneFadeTrack::StaticClass();
91
+ return nullptr;
92
+ }
93
+
94
+ // Map a friendly channel name to the canonical transform channel name.
95
+ FString CanonicalTransformChannel(const FString& In)
96
+ {
97
+ const FString L = In.ToLower();
98
+ if (L == TEXT("x") || L == TEXT("location.x")) return TEXT("Location.X");
99
+ if (L == TEXT("y") || L == TEXT("location.y")) return TEXT("Location.Y");
100
+ if (L == TEXT("z") || L == TEXT("location.z")) return TEXT("Location.Z");
101
+ if (L == TEXT("roll") || L == TEXT("rotation.x")) return TEXT("Rotation.X");
102
+ if (L == TEXT("pitch") || L == TEXT("rotation.y")) return TEXT("Rotation.Y");
103
+ if (L == TEXT("yaw") || L == TEXT("rotation.z")) return TEXT("Rotation.Z");
104
+ if (L == TEXT("scale.x")) return TEXT("Scale.X");
105
+ if (L == TEXT("scale.y")) return TEXT("Scale.Y");
106
+ if (L == TEXT("scale.z")) return TEXT("Scale.Z");
107
+ return In;
108
+ }
40
109
  }
41
110
 
42
111
  TSharedPtr<FJsonValue> FSequencerHandlers::CreateLevelSequence(const TSharedPtr<FJsonObject>& Params)
@@ -428,3 +497,265 @@ TSharedPtr<FJsonValue> FSequencerHandlers::SequenceControl(const TSharedPtr<FJso
428
497
 
429
498
  return MCPResult(Result);
430
499
  }
500
+
501
+ // set_sequence_playback_range -- set a Level Sequence's playback range in
502
+ // seconds. (#548) Params: sequencePath, startSeconds, endSeconds.
503
+ TSharedPtr<FJsonValue> FSequencerHandlers::SetPlaybackRange(const TSharedPtr<FJsonObject>& Params)
504
+ {
505
+ FString Path, Err;
506
+ ULevelSequence* Sequence = LoadSequence(Params, Path, Err);
507
+ if (!Sequence) return MCPError(Err);
508
+ UMovieScene* MovieScene = Sequence->GetMovieScene();
509
+ if (!MovieScene) return MCPError(TEXT("Sequence has no MovieScene"));
510
+
511
+ double StartSeconds = 0.0, EndSeconds = 0.0;
512
+ if (!Params->TryGetNumberField(TEXT("startSeconds"), StartSeconds) ||
513
+ !Params->TryGetNumberField(TEXT("endSeconds"), EndSeconds))
514
+ {
515
+ return MCPError(TEXT("Missing 'startSeconds' and/or 'endSeconds'"));
516
+ }
517
+
518
+ const FFrameRate Tick = MovieScene->GetTickResolution();
519
+ const FFrameNumber Start = Tick.AsFrameNumber(StartSeconds);
520
+ const FFrameNumber End = Tick.AsFrameNumber(EndSeconds);
521
+ MovieScene->SetPlaybackRange(TRange<FFrameNumber>(Start, End));
522
+ Sequence->GetOutermost()->MarkPackageDirty();
523
+
524
+ auto Result = MCPSuccess();
525
+ MCPSetUpdated(Result);
526
+ Result->SetStringField(TEXT("sequencePath"), Path);
527
+ Result->SetNumberField(TEXT("startSeconds"), StartSeconds);
528
+ Result->SetNumberField(TEXT("endSeconds"), EndSeconds);
529
+ return MCPResult(Result);
530
+ }
531
+
532
+ // add_sequence_section -- add a section to a track (creating the track if
533
+ // needed), set its start/end in seconds, and for a CameraCut track bind it to
534
+ // a camera actor. Returns the section index and its channel names. (#548)
535
+ // Params: sequencePath, trackType, actorLabel? (binding scope), startSeconds?,
536
+ // endSeconds?, cameraActorLabel? (CameraCut).
537
+ TSharedPtr<FJsonValue> FSequencerHandlers::AddSection(const TSharedPtr<FJsonObject>& Params)
538
+ {
539
+ FString Path, Err;
540
+ ULevelSequence* Sequence = LoadSequence(Params, Path, Err);
541
+ if (!Sequence) return MCPError(Err);
542
+ UMovieScene* MovieScene = Sequence->GetMovieScene();
543
+ if (!MovieScene) return MCPError(TEXT("Sequence has no MovieScene"));
544
+
545
+ FString TrackType;
546
+ if (auto E = RequireString(Params, TEXT("trackType"), TrackType)) return E;
547
+ UClass* TrackClass = ResolveTrackClass(TrackType);
548
+ if (!TrackClass) return MCPError(FString::Printf(TEXT("Unknown track type: '%s'"), *TrackType));
549
+
550
+ const FString ActorLabel = OptionalString(Params, TEXT("actorLabel"));
551
+
552
+ UMovieSceneTrack* Track = nullptr;
553
+ FGuid BindingGuid;
554
+ if (!ActorLabel.IsEmpty())
555
+ {
556
+ if (!ResolveActorBinding(Sequence, MovieScene, ActorLabel, BindingGuid, Err)) return MCPError(Err);
557
+ Track = MovieScene->FindTrack(TrackClass, BindingGuid);
558
+ if (!Track) Track = MovieScene->AddTrack(TrackClass, BindingGuid);
559
+ }
560
+ else
561
+ {
562
+ for (UMovieSceneTrack* T : MovieScene->GetTracks())
563
+ {
564
+ if (T && T->IsA(TrackClass)) { Track = T; break; }
565
+ }
566
+ if (!Track) Track = MovieScene->AddTrack(TrackClass);
567
+ }
568
+ if (!Track) return MCPError(FString::Printf(TEXT("Failed to resolve/add %s track"), *TrackType));
569
+
570
+ // Resolve the camera binding up front so a bad cameraActorLabel fails before
571
+ // we create an orphan section.
572
+ const FString CameraActorLabel = OptionalString(Params, TEXT("cameraActorLabel"));
573
+ FGuid CamGuid;
574
+ if (!CameraActorLabel.IsEmpty())
575
+ {
576
+ if (!ResolveActorBinding(Sequence, MovieScene, CameraActorLabel, CamGuid, Err)) return MCPError(Err);
577
+ }
578
+
579
+ UMovieSceneSection* Section = Track->CreateNewSection();
580
+ if (!Section) return MCPError(TEXT("Failed to create section"));
581
+ Track->AddSection(*Section);
582
+
583
+ const FFrameRate Tick = MovieScene->GetTickResolution();
584
+ double StartSeconds = 0.0, EndSeconds = 0.0;
585
+ const bool bHasStart = Params->TryGetNumberField(TEXT("startSeconds"), StartSeconds);
586
+ const bool bHasEnd = Params->TryGetNumberField(TEXT("endSeconds"), EndSeconds);
587
+ if (bHasStart || bHasEnd)
588
+ {
589
+ const FFrameNumber Start = Tick.AsFrameNumber(StartSeconds);
590
+ const FFrameNumber End = Tick.AsFrameNumber(bHasEnd ? EndSeconds : StartSeconds + 1.0);
591
+ Section->SetRange(TRange<FFrameNumber>(Start, End));
592
+ }
593
+
594
+ // CameraCut: bind to the camera actor's possessable resolved above.
595
+ if (!CameraActorLabel.IsEmpty())
596
+ {
597
+ if (UMovieSceneCameraCutSection* CutSection = Cast<UMovieSceneCameraCutSection>(Section))
598
+ {
599
+ CutSection->SetCameraGuid(CamGuid);
600
+ }
601
+ }
602
+
603
+ const int32 SectionIndex = Track->GetAllSections().IndexOfByKey(Section);
604
+
605
+ // Enumerate channel names so the caller knows what to key.
606
+ TArray<TSharedPtr<FJsonValue>> ChannelNames;
607
+ FMovieSceneChannelProxy& Proxy = Section->GetChannelProxy();
608
+ for (const FMovieSceneChannelEntry& Entry : Proxy.GetAllEntries())
609
+ {
610
+ TArrayView<const FMovieSceneChannelMetaData> AllMeta = Entry.GetMetaData();
611
+ for (const FMovieSceneChannelMetaData& Meta : AllMeta)
612
+ {
613
+ ChannelNames.Add(MakeShared<FJsonValueString>(Meta.Name.ToString()));
614
+ }
615
+ }
616
+
617
+ Sequence->GetOutermost()->MarkPackageDirty();
618
+
619
+ auto Result = MCPSuccess();
620
+ MCPSetCreated(Result);
621
+ Result->SetStringField(TEXT("sequencePath"), Path);
622
+ Result->SetStringField(TEXT("trackType"), TrackType);
623
+ if (!ActorLabel.IsEmpty()) Result->SetStringField(TEXT("bindingGuid"), BindingGuid.ToString());
624
+ Result->SetNumberField(TEXT("sectionIndex"), SectionIndex);
625
+ Result->SetArrayField(TEXT("channels"), ChannelNames);
626
+ return MCPResult(Result);
627
+ }
628
+
629
+ // set_sequence_keyframes -- add keyframes to a named channel of a section.
630
+ // Supports transform double channels (Location.X..Scale.Z, plus friendly
631
+ // x/y/z/yaw/pitch/roll) and float channels (Fade/Float). (#548)
632
+ // Params: sequencePath, trackType, actorLabel? (binding scope), sectionIndex?
633
+ // (default 0), channel, keyframes ([{seconds, value}]), interpolation? (cubic|linear).
634
+ TSharedPtr<FJsonValue> FSequencerHandlers::SetKeyframes(const TSharedPtr<FJsonObject>& Params)
635
+ {
636
+ FString Path, Err;
637
+ ULevelSequence* Sequence = LoadSequence(Params, Path, Err);
638
+ if (!Sequence) return MCPError(Err);
639
+ UMovieScene* MovieScene = Sequence->GetMovieScene();
640
+ if (!MovieScene) return MCPError(TEXT("Sequence has no MovieScene"));
641
+
642
+ FString TrackType;
643
+ if (auto E = RequireString(Params, TEXT("trackType"), TrackType)) return E;
644
+ UClass* TrackClass = ResolveTrackClass(TrackType);
645
+ if (!TrackClass) return MCPError(FString::Printf(TEXT("Unknown track type: '%s'"), *TrackType));
646
+
647
+ FString ChannelName;
648
+ if (auto E = RequireString(Params, TEXT("channel"), ChannelName)) return E;
649
+
650
+ const TArray<TSharedPtr<FJsonValue>>* Keyframes = nullptr;
651
+ if (!Params->TryGetArrayField(TEXT("keyframes"), Keyframes) || !Keyframes)
652
+ {
653
+ return MCPError(TEXT("Missing 'keyframes' array ([{seconds, value}, ...])"));
654
+ }
655
+
656
+ const FString ActorLabel = OptionalString(Params, TEXT("actorLabel"));
657
+ UMovieSceneTrack* Track = nullptr;
658
+ if (!ActorLabel.IsEmpty())
659
+ {
660
+ FGuid BindingGuid;
661
+ if (!ResolveActorBinding(Sequence, MovieScene, ActorLabel, BindingGuid, Err)) return MCPError(Err);
662
+ Track = MovieScene->FindTrack(TrackClass, BindingGuid);
663
+ }
664
+ else
665
+ {
666
+ for (UMovieSceneTrack* T : MovieScene->GetTracks())
667
+ {
668
+ if (T && T->IsA(TrackClass)) { Track = T; break; }
669
+ }
670
+ }
671
+ if (!Track) return MCPError(FString::Printf(TEXT("No %s track found (add a section first)"), *TrackType));
672
+
673
+ const TArray<UMovieSceneSection*>& Sections = Track->GetAllSections();
674
+ if (Sections.Num() == 0) return MCPError(TEXT("Track has no sections (call add_sequence_section first)"));
675
+ int32 SectionIndex = 0;
676
+ Params->TryGetNumberField(TEXT("sectionIndex"), SectionIndex);
677
+ if (SectionIndex < 0 || SectionIndex >= Sections.Num())
678
+ {
679
+ return MCPError(FString::Printf(TEXT("sectionIndex %d out of range (sections=%d)"), SectionIndex, Sections.Num()));
680
+ }
681
+ UMovieSceneSection* Section = Sections[SectionIndex];
682
+
683
+ const FString Canonical = CanonicalTransformChannel(ChannelName);
684
+ const bool bLinear = OptionalString(Params, TEXT("interpolation"), TEXT("cubic")).Equals(TEXT("linear"), ESearchCase::IgnoreCase);
685
+ const FFrameRate Tick = MovieScene->GetTickResolution();
686
+ Section->Modify();
687
+
688
+ int32 KeysAdded = 0;
689
+ FMovieSceneChannelProxy& Proxy = Section->GetChannelProxy();
690
+
691
+ // Try double channels (transform) by metadata name.
692
+ TArrayView<FMovieSceneDoubleChannel*> DoubleChannels = Proxy.GetChannels<FMovieSceneDoubleChannel>();
693
+ TArrayView<const FMovieSceneChannelMetaData> DoubleMeta = Proxy.GetMetaData<FMovieSceneDoubleChannel>();
694
+ bool bMatched = false;
695
+ for (int32 i = 0; i < DoubleChannels.Num(); ++i)
696
+ {
697
+ if (DoubleMeta.IsValidIndex(i) && DoubleMeta[i].Name.ToString().Equals(Canonical, ESearchCase::IgnoreCase))
698
+ {
699
+ for (const TSharedPtr<FJsonValue>& KfVal : *Keyframes)
700
+ {
701
+ const TSharedPtr<FJsonObject>* Kf = nullptr;
702
+ if (!KfVal->TryGetObject(Kf) || !Kf) continue;
703
+ double Sec = 0.0, Val = 0.0;
704
+ (*Kf)->TryGetNumberField(TEXT("seconds"), Sec);
705
+ (*Kf)->TryGetNumberField(TEXT("value"), Val);
706
+ const FFrameNumber Frame = Tick.AsFrameNumber(Sec);
707
+ if (bLinear) DoubleChannels[i]->AddLinearKey(Frame, Val);
708
+ else DoubleChannels[i]->AddCubicKey(Frame, Val);
709
+ ++KeysAdded;
710
+ }
711
+ bMatched = true;
712
+ break;
713
+ }
714
+ }
715
+
716
+ // Otherwise try float channels (fade/float track). Match by name, or take
717
+ // the only channel when the name doesn't disambiguate.
718
+ if (!bMatched)
719
+ {
720
+ TArrayView<FMovieSceneFloatChannel*> FloatChannels = Proxy.GetChannels<FMovieSceneFloatChannel>();
721
+ TArrayView<const FMovieSceneChannelMetaData> FloatMeta = Proxy.GetMetaData<FMovieSceneFloatChannel>();
722
+ int32 ChosenIdx = INDEX_NONE;
723
+ for (int32 i = 0; i < FloatChannels.Num(); ++i)
724
+ {
725
+ if (FloatMeta.IsValidIndex(i) && FloatMeta[i].Name.ToString().Equals(ChannelName, ESearchCase::IgnoreCase)) { ChosenIdx = i; break; }
726
+ }
727
+ if (ChosenIdx == INDEX_NONE && FloatChannels.Num() == 1) ChosenIdx = 0;
728
+ if (ChosenIdx != INDEX_NONE)
729
+ {
730
+ for (const TSharedPtr<FJsonValue>& KfVal : *Keyframes)
731
+ {
732
+ const TSharedPtr<FJsonObject>* Kf = nullptr;
733
+ if (!KfVal->TryGetObject(Kf) || !Kf) continue;
734
+ double Sec = 0.0, Val = 0.0;
735
+ (*Kf)->TryGetNumberField(TEXT("seconds"), Sec);
736
+ (*Kf)->TryGetNumberField(TEXT("value"), Val);
737
+ const FFrameNumber Frame = Tick.AsFrameNumber(Sec);
738
+ if (bLinear) FloatChannels[ChosenIdx]->AddLinearKey(Frame, (float)Val);
739
+ else FloatChannels[ChosenIdx]->AddCubicKey(Frame, (float)Val);
740
+ ++KeysAdded;
741
+ }
742
+ bMatched = true;
743
+ }
744
+ }
745
+
746
+ if (!bMatched)
747
+ {
748
+ return MCPError(FString::Printf(TEXT("Channel '%s' not found on the section. For Transform use Location.X/Rotation.Z/etc or x/yaw; for Fade use the float channel."), *ChannelName));
749
+ }
750
+
751
+ Sequence->GetOutermost()->MarkPackageDirty();
752
+
753
+ auto Result = MCPSuccess();
754
+ MCPSetUpdated(Result);
755
+ Result->SetStringField(TEXT("sequencePath"), Path);
756
+ Result->SetStringField(TEXT("trackType"), TrackType);
757
+ Result->SetStringField(TEXT("channel"), ChannelName);
758
+ Result->SetNumberField(TEXT("sectionIndex"), SectionIndex);
759
+ Result->SetNumberField(TEXT("keysAdded"), KeysAdded);
760
+ return MCPResult(Result);
761
+ }
@@ -16,4 +16,7 @@ private:
16
16
  static TSharedPtr<FJsonValue> ReadSequenceInfo(const TSharedPtr<FJsonObject>& Params);
17
17
  static TSharedPtr<FJsonValue> AddTrack(const TSharedPtr<FJsonObject>& Params);
18
18
  static TSharedPtr<FJsonValue> SequenceControl(const TSharedPtr<FJsonObject>& Params);
19
+ static TSharedPtr<FJsonValue> SetPlaybackRange(const TSharedPtr<FJsonObject>& Params);
20
+ static TSharedPtr<FJsonValue> AddSection(const TSharedPtr<FJsonObject>& Params);
21
+ static TSharedPtr<FJsonValue> SetKeyframes(const TSharedPtr<FJsonObject>& Params);
19
22
  };