unreal-engine-mcp-server 0.4.7 → 0.5.1

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.
Files changed (454) hide show
  1. package/.env.example +26 -0
  2. package/.env.production +38 -7
  3. package/.eslintrc.json +0 -54
  4. package/.eslintrc.override.json +8 -0
  5. package/.github/ISSUE_TEMPLATE/bug_report.yml +94 -0
  6. package/.github/ISSUE_TEMPLATE/config.yml +8 -0
  7. package/.github/ISSUE_TEMPLATE/feature_request.yml +56 -0
  8. package/.github/copilot-instructions.md +478 -45
  9. package/.github/dependabot.yml +19 -0
  10. package/.github/labeler.yml +24 -0
  11. package/.github/labels.yml +70 -0
  12. package/.github/pull_request_template.md +42 -0
  13. package/.github/release-drafter-config.yml +51 -0
  14. package/.github/workflows/auto-merge.yml +38 -0
  15. package/.github/workflows/ci.yml +38 -0
  16. package/.github/workflows/dependency-review.yml +17 -0
  17. package/.github/workflows/gemini-issue-triage.yml +172 -0
  18. package/.github/workflows/greetings.yml +27 -0
  19. package/.github/workflows/labeler.yml +17 -0
  20. package/.github/workflows/links.yml +80 -0
  21. package/.github/workflows/pr-size-labeler.yml +137 -0
  22. package/.github/workflows/publish-mcp.yml +13 -7
  23. package/.github/workflows/release-drafter.yml +23 -0
  24. package/.github/workflows/release.yml +112 -0
  25. package/.github/workflows/semantic-pull-request.yml +35 -0
  26. package/.github/workflows/smoke-test.yml +36 -0
  27. package/.github/workflows/stale.yml +28 -0
  28. package/CHANGELOG.md +338 -31
  29. package/CONTRIBUTING.md +140 -0
  30. package/GEMINI.md +115 -0
  31. package/Public/Plugin_setup_guide.mp4 +0 -0
  32. package/README.md +189 -128
  33. package/claude_desktop_config_example.json +7 -6
  34. package/dist/automation/bridge.d.ts +50 -0
  35. package/dist/automation/bridge.js +452 -0
  36. package/dist/automation/connection-manager.d.ts +23 -0
  37. package/dist/automation/connection-manager.js +107 -0
  38. package/dist/automation/handshake.d.ts +11 -0
  39. package/dist/automation/handshake.js +89 -0
  40. package/dist/automation/index.d.ts +3 -0
  41. package/dist/automation/index.js +3 -0
  42. package/dist/automation/message-handler.d.ts +12 -0
  43. package/dist/automation/message-handler.js +149 -0
  44. package/dist/automation/request-tracker.d.ts +25 -0
  45. package/dist/automation/request-tracker.js +98 -0
  46. package/dist/automation/types.d.ts +130 -0
  47. package/dist/automation/types.js +2 -0
  48. package/dist/cli.js +32 -5
  49. package/dist/config.d.ts +26 -0
  50. package/dist/config.js +59 -0
  51. package/dist/constants.d.ts +16 -0
  52. package/dist/constants.js +16 -0
  53. package/dist/graphql/loaders.d.ts +64 -0
  54. package/dist/graphql/loaders.js +117 -0
  55. package/dist/graphql/resolvers.d.ts +268 -0
  56. package/dist/graphql/resolvers.js +746 -0
  57. package/dist/graphql/schema.d.ts +5 -0
  58. package/dist/graphql/schema.js +437 -0
  59. package/dist/graphql/server.d.ts +26 -0
  60. package/dist/graphql/server.js +117 -0
  61. package/dist/graphql/types.d.ts +9 -0
  62. package/dist/graphql/types.js +2 -0
  63. package/dist/handlers/resource-handlers.d.ts +20 -0
  64. package/dist/handlers/resource-handlers.js +180 -0
  65. package/dist/index.d.ts +33 -18
  66. package/dist/index.js +130 -619
  67. package/dist/resources/actors.d.ts +17 -12
  68. package/dist/resources/actors.js +56 -76
  69. package/dist/resources/assets.d.ts +6 -14
  70. package/dist/resources/assets.js +115 -147
  71. package/dist/resources/levels.d.ts +13 -13
  72. package/dist/resources/levels.js +25 -34
  73. package/dist/server/resource-registry.d.ts +20 -0
  74. package/dist/server/resource-registry.js +37 -0
  75. package/dist/server/tool-registry.d.ts +23 -0
  76. package/dist/server/tool-registry.js +322 -0
  77. package/dist/server-setup.d.ts +20 -0
  78. package/dist/server-setup.js +71 -0
  79. package/dist/services/health-monitor.d.ts +34 -0
  80. package/dist/services/health-monitor.js +105 -0
  81. package/dist/services/metrics-server.d.ts +11 -0
  82. package/dist/services/metrics-server.js +105 -0
  83. package/dist/tools/actors.d.ts +163 -9
  84. package/dist/tools/actors.js +356 -311
  85. package/dist/tools/animation.d.ts +135 -4
  86. package/dist/tools/animation.js +510 -411
  87. package/dist/tools/assets.d.ts +75 -29
  88. package/dist/tools/assets.js +265 -284
  89. package/dist/tools/audio.d.ts +102 -42
  90. package/dist/tools/audio.js +272 -685
  91. package/dist/tools/base-tool.d.ts +17 -0
  92. package/dist/tools/base-tool.js +46 -0
  93. package/dist/tools/behavior-tree.d.ts +94 -0
  94. package/dist/tools/behavior-tree.js +39 -0
  95. package/dist/tools/blueprint.d.ts +208 -126
  96. package/dist/tools/blueprint.js +685 -832
  97. package/dist/tools/consolidated-tool-definitions.d.ts +5462 -1781
  98. package/dist/tools/consolidated-tool-definitions.js +829 -496
  99. package/dist/tools/consolidated-tool-handlers.d.ts +2 -1
  100. package/dist/tools/consolidated-tool-handlers.js +198 -1027
  101. package/dist/tools/debug.d.ts +143 -85
  102. package/dist/tools/debug.js +234 -180
  103. package/dist/tools/dynamic-handler-registry.d.ts +13 -0
  104. package/dist/tools/dynamic-handler-registry.js +23 -0
  105. package/dist/tools/editor.d.ts +30 -83
  106. package/dist/tools/editor.js +247 -244
  107. package/dist/tools/engine.d.ts +10 -4
  108. package/dist/tools/engine.js +13 -5
  109. package/dist/tools/environment.d.ts +30 -0
  110. package/dist/tools/environment.js +267 -0
  111. package/dist/tools/foliage.d.ts +65 -99
  112. package/dist/tools/foliage.js +221 -331
  113. package/dist/tools/handlers/actor-handlers.d.ts +3 -0
  114. package/dist/tools/handlers/actor-handlers.js +227 -0
  115. package/dist/tools/handlers/animation-handlers.d.ts +3 -0
  116. package/dist/tools/handlers/animation-handlers.js +185 -0
  117. package/dist/tools/handlers/argument-helper.d.ts +16 -0
  118. package/dist/tools/handlers/argument-helper.js +80 -0
  119. package/dist/tools/handlers/asset-handlers.d.ts +3 -0
  120. package/dist/tools/handlers/asset-handlers.js +496 -0
  121. package/dist/tools/handlers/audio-handlers.d.ts +3 -0
  122. package/dist/tools/handlers/audio-handlers.js +166 -0
  123. package/dist/tools/handlers/blueprint-handlers.d.ts +4 -0
  124. package/dist/tools/handlers/blueprint-handlers.js +358 -0
  125. package/dist/tools/handlers/common-handlers.d.ts +14 -0
  126. package/dist/tools/handlers/common-handlers.js +56 -0
  127. package/dist/tools/handlers/editor-handlers.d.ts +3 -0
  128. package/dist/tools/handlers/editor-handlers.js +119 -0
  129. package/dist/tools/handlers/effect-handlers.d.ts +3 -0
  130. package/dist/tools/handlers/effect-handlers.js +171 -0
  131. package/dist/tools/handlers/environment-handlers.d.ts +3 -0
  132. package/dist/tools/handlers/environment-handlers.js +170 -0
  133. package/dist/tools/handlers/graph-handlers.d.ts +3 -0
  134. package/dist/tools/handlers/graph-handlers.js +90 -0
  135. package/dist/tools/handlers/input-handlers.d.ts +3 -0
  136. package/dist/tools/handlers/input-handlers.js +21 -0
  137. package/dist/tools/handlers/inspect-handlers.d.ts +3 -0
  138. package/dist/tools/handlers/inspect-handlers.js +383 -0
  139. package/dist/tools/handlers/level-handlers.d.ts +3 -0
  140. package/dist/tools/handlers/level-handlers.js +237 -0
  141. package/dist/tools/handlers/lighting-handlers.d.ts +3 -0
  142. package/dist/tools/handlers/lighting-handlers.js +144 -0
  143. package/dist/tools/handlers/performance-handlers.d.ts +3 -0
  144. package/dist/tools/handlers/performance-handlers.js +130 -0
  145. package/dist/tools/handlers/pipeline-handlers.d.ts +3 -0
  146. package/dist/tools/handlers/pipeline-handlers.js +110 -0
  147. package/dist/tools/handlers/sequence-handlers.d.ts +3 -0
  148. package/dist/tools/handlers/sequence-handlers.js +376 -0
  149. package/dist/tools/handlers/system-handlers.d.ts +4 -0
  150. package/dist/tools/handlers/system-handlers.js +506 -0
  151. package/dist/tools/input.d.ts +19 -0
  152. package/dist/tools/input.js +89 -0
  153. package/dist/tools/introspection.d.ts +103 -40
  154. package/dist/tools/introspection.js +425 -568
  155. package/dist/tools/landscape.d.ts +54 -93
  156. package/dist/tools/landscape.js +284 -409
  157. package/dist/tools/level.d.ts +66 -27
  158. package/dist/tools/level.js +647 -675
  159. package/dist/tools/lighting.d.ts +77 -38
  160. package/dist/tools/lighting.js +445 -943
  161. package/dist/tools/logs.d.ts +3 -3
  162. package/dist/tools/logs.js +5 -57
  163. package/dist/tools/materials.d.ts +91 -24
  164. package/dist/tools/materials.js +194 -118
  165. package/dist/tools/niagara.d.ts +149 -39
  166. package/dist/tools/niagara.js +267 -182
  167. package/dist/tools/performance.d.ts +27 -13
  168. package/dist/tools/performance.js +203 -122
  169. package/dist/tools/physics.d.ts +32 -77
  170. package/dist/tools/physics.js +175 -582
  171. package/dist/tools/property-dictionary.d.ts +13 -0
  172. package/dist/tools/property-dictionary.js +82 -0
  173. package/dist/tools/sequence.d.ts +85 -60
  174. package/dist/tools/sequence.js +208 -747
  175. package/dist/tools/tool-definition-utils.d.ts +59 -0
  176. package/dist/tools/tool-definition-utils.js +35 -0
  177. package/dist/tools/ui.d.ts +64 -34
  178. package/dist/tools/ui.js +134 -214
  179. package/dist/types/automation-responses.d.ts +115 -0
  180. package/dist/types/automation-responses.js +2 -0
  181. package/dist/types/env.d.ts +0 -3
  182. package/dist/types/env.js +0 -7
  183. package/dist/types/responses.d.ts +249 -0
  184. package/dist/types/responses.js +2 -0
  185. package/dist/types/tool-interfaces.d.ts +898 -0
  186. package/dist/types/tool-interfaces.js +2 -0
  187. package/dist/types/tool-types.d.ts +183 -19
  188. package/dist/types/tool-types.js +0 -4
  189. package/dist/unreal-bridge.d.ts +24 -131
  190. package/dist/unreal-bridge.js +364 -1506
  191. package/dist/utils/command-validator.d.ts +9 -0
  192. package/dist/utils/command-validator.js +68 -0
  193. package/dist/utils/elicitation.d.ts +1 -1
  194. package/dist/utils/elicitation.js +12 -15
  195. package/dist/utils/error-handler.d.ts +2 -51
  196. package/dist/utils/error-handler.js +11 -87
  197. package/dist/utils/ini-reader.d.ts +3 -0
  198. package/dist/utils/ini-reader.js +69 -0
  199. package/dist/utils/logger.js +9 -6
  200. package/dist/utils/normalize.d.ts +3 -0
  201. package/dist/utils/normalize.js +56 -0
  202. package/dist/utils/path-security.d.ts +2 -0
  203. package/dist/utils/path-security.js +24 -0
  204. package/dist/utils/response-factory.d.ts +7 -0
  205. package/dist/utils/response-factory.js +27 -0
  206. package/dist/utils/response-validator.d.ts +3 -24
  207. package/dist/utils/response-validator.js +130 -81
  208. package/dist/utils/result-helpers.d.ts +4 -5
  209. package/dist/utils/result-helpers.js +15 -16
  210. package/dist/utils/safe-json.js +5 -11
  211. package/dist/utils/unreal-command-queue.d.ts +24 -0
  212. package/dist/utils/unreal-command-queue.js +120 -0
  213. package/dist/utils/validation.d.ts +0 -40
  214. package/dist/utils/validation.js +1 -78
  215. package/dist/wasm/index.d.ts +70 -0
  216. package/dist/wasm/index.js +535 -0
  217. package/docs/GraphQL-API.md +888 -0
  218. package/docs/Migration-Guide-v0.5.0.md +684 -0
  219. package/docs/Roadmap.md +53 -0
  220. package/docs/WebAssembly-Integration.md +628 -0
  221. package/docs/editor-plugin-extension.md +370 -0
  222. package/docs/handler-mapping.md +242 -0
  223. package/docs/native-automation-progress.md +128 -0
  224. package/docs/testing-guide.md +423 -0
  225. package/mcp-config-example.json +6 -6
  226. package/package.json +67 -28
  227. package/plugins/McpAutomationBridge/Config/FilterPlugin.ini +8 -0
  228. package/plugins/McpAutomationBridge/McpAutomationBridge.uplugin +64 -0
  229. package/plugins/McpAutomationBridge/Source/McpAutomationBridge/McpAutomationBridge.Build.cs +189 -0
  230. package/plugins/McpAutomationBridge/Source/McpAutomationBridge/Private/McpAutomationBridgeGlobals.cpp +22 -0
  231. package/plugins/McpAutomationBridge/Source/McpAutomationBridge/Private/McpAutomationBridgeGlobals.h +30 -0
  232. package/plugins/McpAutomationBridge/Source/McpAutomationBridge/Private/McpAutomationBridgeHelpers.h +1983 -0
  233. package/plugins/McpAutomationBridge/Source/McpAutomationBridge/Private/McpAutomationBridgeModule.cpp +72 -0
  234. package/plugins/McpAutomationBridge/Source/McpAutomationBridge/Private/McpAutomationBridgeSettings.cpp +46 -0
  235. package/plugins/McpAutomationBridge/Source/McpAutomationBridge/Private/McpAutomationBridgeSubsystem.cpp +581 -0
  236. package/plugins/McpAutomationBridge/Source/McpAutomationBridge/Private/McpAutomationBridge_AnimationHandlers.cpp +2394 -0
  237. package/plugins/McpAutomationBridge/Source/McpAutomationBridge/Private/McpAutomationBridge_AssetQueryHandlers.cpp +300 -0
  238. package/plugins/McpAutomationBridge/Source/McpAutomationBridge/Private/McpAutomationBridge_AssetWorkflowHandlers.cpp +2807 -0
  239. package/plugins/McpAutomationBridge/Source/McpAutomationBridge/Private/McpAutomationBridge_AudioHandlers.cpp +1087 -0
  240. package/plugins/McpAutomationBridge/Source/McpAutomationBridge/Private/McpAutomationBridge_BehaviorTreeHandlers.cpp +488 -0
  241. package/plugins/McpAutomationBridge/Source/McpAutomationBridge/Private/McpAutomationBridge_BlueprintCreationHandlers.cpp +643 -0
  242. package/plugins/McpAutomationBridge/Source/McpAutomationBridge/Private/McpAutomationBridge_BlueprintCreationHandlers.h +31 -0
  243. package/plugins/McpAutomationBridge/Source/McpAutomationBridge/Private/McpAutomationBridge_BlueprintGraphHandlers.cpp +1184 -0
  244. package/plugins/McpAutomationBridge/Source/McpAutomationBridge/Private/McpAutomationBridge_BlueprintHandlers.cpp +5652 -0
  245. package/plugins/McpAutomationBridge/Source/McpAutomationBridge/Private/McpAutomationBridge_BlueprintHandlers_List.cpp +152 -0
  246. package/plugins/McpAutomationBridge/Source/McpAutomationBridge/Private/McpAutomationBridge_ControlHandlers.cpp +2614 -0
  247. package/plugins/McpAutomationBridge/Source/McpAutomationBridge/Private/McpAutomationBridge_DebugHandlers.cpp +42 -0
  248. package/plugins/McpAutomationBridge/Source/McpAutomationBridge/Private/McpAutomationBridge_EditorFunctionHandlers.cpp +1237 -0
  249. package/plugins/McpAutomationBridge/Source/McpAutomationBridge/Private/McpAutomationBridge_EffectHandlers.cpp +1701 -0
  250. package/plugins/McpAutomationBridge/Source/McpAutomationBridge/Private/McpAutomationBridge_EnvironmentHandlers.cpp +2145 -0
  251. package/plugins/McpAutomationBridge/Source/McpAutomationBridge/Private/McpAutomationBridge_FoliageHandlers.cpp +954 -0
  252. package/plugins/McpAutomationBridge/Source/McpAutomationBridge/Private/McpAutomationBridge_InputHandlers.cpp +209 -0
  253. package/plugins/McpAutomationBridge/Source/McpAutomationBridge/Private/McpAutomationBridge_InsightsHandlers.cpp +41 -0
  254. package/plugins/McpAutomationBridge/Source/McpAutomationBridge/Private/McpAutomationBridge_LandscapeHandlers.cpp +1164 -0
  255. package/plugins/McpAutomationBridge/Source/McpAutomationBridge/Private/McpAutomationBridge_LevelHandlers.cpp +762 -0
  256. package/plugins/McpAutomationBridge/Source/McpAutomationBridge/Private/McpAutomationBridge_LightingHandlers.cpp +634 -0
  257. package/plugins/McpAutomationBridge/Source/McpAutomationBridge/Private/McpAutomationBridge_LogHandlers.cpp +136 -0
  258. package/plugins/McpAutomationBridge/Source/McpAutomationBridge/Private/McpAutomationBridge_MaterialGraphHandlers.cpp +494 -0
  259. package/plugins/McpAutomationBridge/Source/McpAutomationBridge/Private/McpAutomationBridge_NiagaraGraphHandlers.cpp +278 -0
  260. package/plugins/McpAutomationBridge/Source/McpAutomationBridge/Private/McpAutomationBridge_NiagaraHandlers.cpp +625 -0
  261. package/plugins/McpAutomationBridge/Source/McpAutomationBridge/Private/McpAutomationBridge_PerformanceHandlers.cpp +401 -0
  262. package/plugins/McpAutomationBridge/Source/McpAutomationBridge/Private/McpAutomationBridge_PipelineHandlers.cpp +67 -0
  263. package/plugins/McpAutomationBridge/Source/McpAutomationBridge/Private/McpAutomationBridge_ProcessRequest.cpp +735 -0
  264. package/plugins/McpAutomationBridge/Source/McpAutomationBridge/Private/McpAutomationBridge_PropertyHandlers.cpp +2634 -0
  265. package/plugins/McpAutomationBridge/Source/McpAutomationBridge/Private/McpAutomationBridge_RenderHandlers.cpp +189 -0
  266. package/plugins/McpAutomationBridge/Source/McpAutomationBridge/Private/McpAutomationBridge_SCSHandlers.cpp +917 -0
  267. package/plugins/McpAutomationBridge/Source/McpAutomationBridge/Private/McpAutomationBridge_SCSHandlers.h +39 -0
  268. package/plugins/McpAutomationBridge/Source/McpAutomationBridge/Private/McpAutomationBridge_SequenceHandlers.cpp +2670 -0
  269. package/plugins/McpAutomationBridge/Source/McpAutomationBridge/Private/McpAutomationBridge_SequencerHandlers.cpp +519 -0
  270. package/plugins/McpAutomationBridge/Source/McpAutomationBridge/Private/McpAutomationBridge_TestHandlers.cpp +38 -0
  271. package/plugins/McpAutomationBridge/Source/McpAutomationBridge/Private/McpAutomationBridge_UiHandlers.cpp +668 -0
  272. package/plugins/McpAutomationBridge/Source/McpAutomationBridge/Private/McpAutomationBridge_WorldPartitionHandlers.cpp +346 -0
  273. package/plugins/McpAutomationBridge/Source/McpAutomationBridge/Private/McpBridgeWebSocket.cpp +1330 -0
  274. package/plugins/McpAutomationBridge/Source/McpAutomationBridge/Private/McpBridgeWebSocket.h +149 -0
  275. package/plugins/McpAutomationBridge/Source/McpAutomationBridge/Private/McpConnectionManager.cpp +783 -0
  276. package/plugins/McpAutomationBridge/Source/McpAutomationBridge/Public/McpAutomationBridgeSettings.h +115 -0
  277. package/plugins/McpAutomationBridge/Source/McpAutomationBridge/Public/McpAutomationBridgeSubsystem.h +796 -0
  278. package/plugins/McpAutomationBridge/Source/McpAutomationBridge/Public/McpConnectionManager.h +117 -0
  279. package/scripts/check-unreal-connection.mjs +19 -0
  280. package/scripts/clean-tmp.js +23 -0
  281. package/scripts/patch-wasm.js +26 -0
  282. package/scripts/run-all-tests.mjs +136 -0
  283. package/scripts/smoke-test.ts +94 -0
  284. package/scripts/sync-mcp-plugin.js +143 -0
  285. package/scripts/test-no-plugin-alternates.mjs +113 -0
  286. package/scripts/validate-server.js +46 -0
  287. package/scripts/verify-automation-bridge.js +200 -0
  288. package/server.json +58 -21
  289. package/src/automation/bridge.ts +558 -0
  290. package/src/automation/connection-manager.ts +130 -0
  291. package/src/automation/handshake.ts +99 -0
  292. package/src/automation/index.ts +2 -0
  293. package/src/automation/message-handler.ts +167 -0
  294. package/src/automation/request-tracker.ts +123 -0
  295. package/src/automation/types.ts +107 -0
  296. package/src/cli.ts +33 -6
  297. package/src/config.ts +73 -0
  298. package/src/constants.ts +19 -0
  299. package/src/graphql/loaders.ts +244 -0
  300. package/src/graphql/resolvers.ts +1008 -0
  301. package/src/graphql/schema.ts +452 -0
  302. package/src/graphql/server.ts +156 -0
  303. package/src/graphql/types.ts +10 -0
  304. package/src/handlers/resource-handlers.ts +186 -0
  305. package/src/index.ts +166 -664
  306. package/src/resources/actors.ts +58 -76
  307. package/src/resources/assets.ts +148 -134
  308. package/src/resources/levels.ts +28 -33
  309. package/src/server/resource-registry.ts +47 -0
  310. package/src/server/tool-registry.ts +354 -0
  311. package/src/server-setup.ts +114 -0
  312. package/src/services/health-monitor.ts +132 -0
  313. package/src/services/metrics-server.ts +142 -0
  314. package/src/tools/actors.ts +426 -323
  315. package/src/tools/animation.ts +672 -461
  316. package/src/tools/assets.ts +364 -289
  317. package/src/tools/audio.ts +323 -766
  318. package/src/tools/base-tool.ts +52 -0
  319. package/src/tools/behavior-tree.ts +45 -0
  320. package/src/tools/blueprint.ts +792 -970
  321. package/src/tools/consolidated-tool-definitions.ts +993 -515
  322. package/src/tools/consolidated-tool-handlers.ts +258 -1146
  323. package/src/tools/debug.ts +292 -187
  324. package/src/tools/dynamic-handler-registry.ts +33 -0
  325. package/src/tools/editor.ts +329 -253
  326. package/src/tools/engine.ts +14 -3
  327. package/src/tools/environment.ts +281 -0
  328. package/src/tools/foliage.ts +330 -392
  329. package/src/tools/handlers/actor-handlers.ts +265 -0
  330. package/src/tools/handlers/animation-handlers.ts +237 -0
  331. package/src/tools/handlers/argument-helper.ts +142 -0
  332. package/src/tools/handlers/asset-handlers.ts +532 -0
  333. package/src/tools/handlers/audio-handlers.ts +194 -0
  334. package/src/tools/handlers/blueprint-handlers.ts +380 -0
  335. package/src/tools/handlers/common-handlers.ts +87 -0
  336. package/src/tools/handlers/editor-handlers.ts +123 -0
  337. package/src/tools/handlers/effect-handlers.ts +220 -0
  338. package/src/tools/handlers/environment-handlers.ts +183 -0
  339. package/src/tools/handlers/graph-handlers.ts +116 -0
  340. package/src/tools/handlers/input-handlers.ts +28 -0
  341. package/src/tools/handlers/inspect-handlers.ts +450 -0
  342. package/src/tools/handlers/level-handlers.ts +252 -0
  343. package/src/tools/handlers/lighting-handlers.ts +147 -0
  344. package/src/tools/handlers/performance-handlers.ts +132 -0
  345. package/src/tools/handlers/pipeline-handlers.ts +127 -0
  346. package/src/tools/handlers/sequence-handlers.ts +415 -0
  347. package/src/tools/handlers/system-handlers.ts +564 -0
  348. package/src/tools/input.ts +101 -0
  349. package/src/tools/introspection.ts +493 -584
  350. package/src/tools/landscape.ts +418 -507
  351. package/src/tools/level.ts +786 -708
  352. package/src/tools/lighting.ts +588 -984
  353. package/src/tools/logs.ts +9 -57
  354. package/src/tools/materials.ts +237 -121
  355. package/src/tools/niagara.ts +335 -168
  356. package/src/tools/performance.ts +320 -169
  357. package/src/tools/physics.ts +274 -613
  358. package/src/tools/property-dictionary.ts +98 -0
  359. package/src/tools/sequence.ts +276 -820
  360. package/src/tools/tool-definition-utils.ts +35 -0
  361. package/src/tools/ui.ts +205 -283
  362. package/src/types/automation-responses.ts +119 -0
  363. package/src/types/env.ts +0 -10
  364. package/src/types/responses.ts +355 -0
  365. package/src/types/tool-interfaces.ts +250 -0
  366. package/src/types/tool-types.ts +243 -21
  367. package/src/unreal-bridge.ts +460 -1550
  368. package/src/utils/command-validator.ts +76 -0
  369. package/src/utils/elicitation.ts +10 -7
  370. package/src/utils/error-handler.ts +14 -90
  371. package/src/utils/ini-reader.ts +86 -0
  372. package/src/utils/logger.ts +8 -3
  373. package/src/utils/normalize.test.ts +162 -0
  374. package/src/utils/normalize.ts +60 -0
  375. package/src/utils/path-security.ts +43 -0
  376. package/src/utils/response-factory.ts +44 -0
  377. package/src/utils/response-validator.ts +176 -56
  378. package/src/utils/result-helpers.ts +21 -19
  379. package/src/utils/safe-json.test.ts +90 -0
  380. package/src/utils/safe-json.ts +14 -11
  381. package/src/utils/unreal-command-queue.ts +152 -0
  382. package/src/utils/validation.test.ts +184 -0
  383. package/src/utils/validation.ts +4 -1
  384. package/src/wasm/index.ts +838 -0
  385. package/test-server.mjs +100 -0
  386. package/tests/run-unreal-tool-tests.mjs +242 -14
  387. package/tests/test-animation.mjs +369 -0
  388. package/tests/test-asset-advanced.mjs +82 -0
  389. package/tests/test-asset-errors.mjs +35 -0
  390. package/tests/test-asset-graph.mjs +311 -0
  391. package/tests/test-audio.mjs +417 -0
  392. package/tests/test-automation-timeouts.mjs +98 -0
  393. package/tests/test-behavior-tree.mjs +444 -0
  394. package/tests/test-blueprint-graph.mjs +410 -0
  395. package/tests/test-blueprint.mjs +577 -0
  396. package/tests/test-client-mode.mjs +86 -0
  397. package/tests/test-console-command.mjs +56 -0
  398. package/tests/test-control-actor.mjs +425 -0
  399. package/tests/test-control-editor.mjs +112 -0
  400. package/tests/test-graphql.mjs +372 -0
  401. package/tests/test-input.mjs +349 -0
  402. package/tests/test-inspect.mjs +302 -0
  403. package/tests/test-landscape.mjs +316 -0
  404. package/tests/test-lighting.mjs +428 -0
  405. package/tests/test-manage-asset.mjs +438 -0
  406. package/tests/test-manage-level.mjs +89 -0
  407. package/tests/test-materials.mjs +356 -0
  408. package/tests/test-niagara.mjs +185 -0
  409. package/tests/test-no-inline-python.mjs +122 -0
  410. package/tests/test-performance.mjs +539 -0
  411. package/tests/test-plugin-handshake.mjs +82 -0
  412. package/tests/test-runner.mjs +933 -0
  413. package/tests/test-sequence.mjs +104 -0
  414. package/tests/test-system.mjs +96 -0
  415. package/tests/test-wasm.mjs +283 -0
  416. package/tests/test-world-partition.mjs +215 -0
  417. package/tsconfig.json +3 -3
  418. package/vitest.config.ts +35 -0
  419. package/wasm/Cargo.lock +363 -0
  420. package/wasm/Cargo.toml +42 -0
  421. package/wasm/LICENSE +21 -0
  422. package/wasm/README.md +253 -0
  423. package/wasm/src/dependency_resolver.rs +377 -0
  424. package/wasm/src/lib.rs +153 -0
  425. package/wasm/src/property_parser.rs +271 -0
  426. package/wasm/src/transform_math.rs +396 -0
  427. package/wasm/tests/integration.rs +109 -0
  428. package/.github/workflows/smithery-build.yml +0 -29
  429. package/dist/prompts/index.d.ts +0 -21
  430. package/dist/prompts/index.js +0 -217
  431. package/dist/tools/build_environment_advanced.d.ts +0 -65
  432. package/dist/tools/build_environment_advanced.js +0 -633
  433. package/dist/tools/rc.d.ts +0 -110
  434. package/dist/tools/rc.js +0 -437
  435. package/dist/tools/visual.d.ts +0 -40
  436. package/dist/tools/visual.js +0 -282
  437. package/dist/utils/http.d.ts +0 -6
  438. package/dist/utils/http.js +0 -151
  439. package/dist/utils/python-output.d.ts +0 -18
  440. package/dist/utils/python-output.js +0 -290
  441. package/dist/utils/python.d.ts +0 -2
  442. package/dist/utils/python.js +0 -4
  443. package/dist/utils/stdio-redirect.d.ts +0 -2
  444. package/dist/utils/stdio-redirect.js +0 -20
  445. package/docs/unreal-tool-test-cases.md +0 -574
  446. package/smithery.yaml +0 -29
  447. package/src/prompts/index.ts +0 -249
  448. package/src/tools/build_environment_advanced.ts +0 -732
  449. package/src/tools/rc.ts +0 -515
  450. package/src/tools/visual.ts +0 -281
  451. package/src/utils/http.ts +0 -187
  452. package/src/utils/python-output.ts +0 -351
  453. package/src/utils/python.ts +0 -3
  454. package/src/utils/stdio-redirect.ts +0 -18
@@ -0,0 +1,796 @@
1
+ #pragma once
2
+
3
+ #include "Containers/Ticker.h"
4
+ #include "CoreMinimal.h"
5
+ #include "Dom/JsonObject.h"
6
+ #include "EditorSubsystem.h"
7
+ #include "HAL/CriticalSection.h"
8
+ #include "Templates/SharedPointer.h"
9
+ #include "McpAutomationBridgeSubsystem.generated.h"
10
+
11
+
12
+ UENUM(BlueprintType)
13
+ enum class EMcpAutomationBridgeState : uint8 {
14
+ Disconnected,
15
+ Connecting,
16
+ Connected
17
+ };
18
+
19
+ /** Minimal payload wrapper for incoming automation messages. */
20
+ USTRUCT(BlueprintType)
21
+ struct MCPAUTOMATIONBRIDGE_API FMcpAutomationMessage {
22
+ GENERATED_BODY()
23
+
24
+ UPROPERTY(BlueprintReadOnly, Category = "MCP Automation")
25
+ FString Type;
26
+
27
+ UPROPERTY(BlueprintReadOnly, Category = "MCP Automation")
28
+ FString PayloadJson;
29
+ };
30
+
31
+ DECLARE_DYNAMIC_MULTICAST_DELEGATE_OneParam(FMcpAutomationMessageReceived,
32
+ const FMcpAutomationMessage &,
33
+ Message);
34
+
35
+ class FMcpBridgeWebSocket;
36
+ DECLARE_LOG_CATEGORY_EXTERN(LogMcpAutomationBridgeSubsystem, Log, All);
37
+
38
+ UCLASS()
39
+ class MCPAUTOMATIONBRIDGE_API UMcpAutomationBridgeSubsystem
40
+ : public UEditorSubsystem {
41
+ GENERATED_BODY()
42
+
43
+ public:
44
+ virtual void Initialize(FSubsystemCollectionBase &Collection) override;
45
+ virtual void Deinitialize() override;
46
+
47
+ UFUNCTION(BlueprintCallable, Category = "MCP Automation")
48
+ bool IsBridgeActive() const;
49
+
50
+ UFUNCTION(BlueprintCallable, Category = "MCP Automation")
51
+ EMcpAutomationBridgeState GetBridgeState() const;
52
+
53
+ UFUNCTION(BlueprintCallable, Category = "MCP Automation")
54
+ bool SendRawMessage(const FString &Message);
55
+
56
+ UPROPERTY(BlueprintAssignable, Category = "MCP Automation")
57
+ FMcpAutomationMessageReceived OnMessageReceived;
58
+
59
+ // Public helpers for sending automation responses/errors. These need to be
60
+ // callable from out-of-line helper functions and translation-unit-level
61
+ // handlers that receive a UMcpAutomationBridgeSubsystem* (e.g. static
62
+ // blueprint helper routines). They were previously declared private which
63
+ // prevented those helpers from invoking them via a 'Self' pointer.
64
+ void SendAutomationResponse(TSharedPtr<FMcpBridgeWebSocket> TargetSocket,
65
+ const FString &RequestId, bool bSuccess,
66
+ const FString &Message,
67
+ const TSharedPtr<FJsonObject> &Result = nullptr,
68
+ const FString &ErrorCode = FString());
69
+ void SendAutomationError(TSharedPtr<FMcpBridgeWebSocket> TargetSocket,
70
+ const FString &RequestId, const FString &Message,
71
+ const FString &ErrorCode);
72
+
73
+ bool ExecuteEditorCommands(const TArray<FString> &Commands,
74
+ FString &OutErrorMessage);
75
+ #if MCP_HAS_CONTROLRIG_FACTORY
76
+ UBlueprint *CreateControlRigBlueprint(const FString &AssetName,
77
+ const FString &PackagePath,
78
+ USkeleton *TargetSkeleton,
79
+ FString &OutError);
80
+ #endif
81
+
82
+ // Automation Handler Delegate
83
+ using FAutomationHandler = TFunction<bool(const FString &, const FString &,
84
+ const TSharedPtr<FJsonObject> &,
85
+ TSharedPtr<FMcpBridgeWebSocket>)>;
86
+
87
+ /**
88
+ * Registers a handler for a specific automation action.
89
+ * This allows for O(1) dispatch of automation requests and runtime
90
+ * extensibility.
91
+ */
92
+ void RegisterHandler(const FString &Action, FAutomationHandler Handler);
93
+
94
+ private:
95
+ // Telemetry structs moved to McpConnectionManager
96
+
97
+ bool Tick(float DeltaTime);
98
+
99
+ // Connection Manager
100
+ TSharedPtr<class FMcpConnectionManager> ConnectionManager;
101
+
102
+ // Track a blueprint currently being modified by this subsystem request
103
+ // so scope-exit handlers can reliably clear busy state without
104
+ // attempting to capture local variables inside macros.
105
+ FString CurrentBusyBlueprintKey;
106
+ bool bCurrentBlueprintBusyMarked = false;
107
+ bool bCurrentBlueprintBusyScheduled = false;
108
+
109
+ // Pending automation request queue (thread-safe). Inbound socket threads
110
+ // will enqueue requests here; the queue is drained sequentially on the
111
+ // game thread to ensure deterministic processing order and avoid
112
+ // reentrancy issues.
113
+ struct FPendingAutomationRequest {
114
+ FString RequestId;
115
+ FString Action;
116
+ TSharedPtr<FJsonObject> Payload;
117
+ TSharedPtr<FMcpBridgeWebSocket> RequestingSocket;
118
+ };
119
+ TArray<FPendingAutomationRequest> PendingAutomationRequests;
120
+ FCriticalSection PendingAutomationRequestsMutex;
121
+ bool bPendingRequestsScheduled = false;
122
+ void ProcessPendingAutomationRequests();
123
+
124
+ void RecordAutomationTelemetry(const FString &RequestId, bool bSuccess,
125
+ const FString &Message,
126
+ const FString &ErrorCode);
127
+
128
+ // Active Log Device
129
+ TSharedPtr<FOutputDevice> LogCaptureDevice;
130
+
131
+ // Action handlers (implemented in separate translation units)
132
+ TMap<FString, FAutomationHandler> AutomationHandlers;
133
+ void InitializeHandlers();
134
+
135
+ /**
136
+ * Handle lightweight, well-known editor function invocations sent from the
137
+ * server. This action is intended as a native replacement for the
138
+ * execute_editor_python fallback for common scripted templates (spawn,
139
+ * delete, list actors, set viewport camera, asset existence checks, etc.).
140
+ * When the plugin implements a native function we will handle it here and
141
+ * avoid executing arbitrary Python inside the editor.
142
+ */
143
+ bool
144
+ HandleExecuteEditorFunction(const FString &RequestId, const FString &Action,
145
+ const TSharedPtr<FJsonObject> &Payload,
146
+ TSharedPtr<FMcpBridgeWebSocket> RequestingSocket);
147
+ bool
148
+ HandleSetObjectProperty(const FString &RequestId, const FString &Action,
149
+ const TSharedPtr<FJsonObject> &Payload,
150
+ TSharedPtr<FMcpBridgeWebSocket> RequestingSocket);
151
+ bool
152
+ HandleGetObjectProperty(const FString &RequestId, const FString &Action,
153
+ const TSharedPtr<FJsonObject> &Payload,
154
+ TSharedPtr<FMcpBridgeWebSocket> RequestingSocket);
155
+ // Array manipulation operations
156
+ bool HandleArrayAppend(const FString &RequestId, const FString &Action,
157
+ const TSharedPtr<FJsonObject> &Payload,
158
+ TSharedPtr<FMcpBridgeWebSocket> RequestingSocket);
159
+ bool HandleArrayRemove(const FString &RequestId, const FString &Action,
160
+ const TSharedPtr<FJsonObject> &Payload,
161
+ TSharedPtr<FMcpBridgeWebSocket> RequestingSocket);
162
+ bool HandleArrayInsert(const FString &RequestId, const FString &Action,
163
+ const TSharedPtr<FJsonObject> &Payload,
164
+ TSharedPtr<FMcpBridgeWebSocket> RequestingSocket);
165
+ bool HandleArrayGetElement(const FString &RequestId, const FString &Action,
166
+ const TSharedPtr<FJsonObject> &Payload,
167
+ TSharedPtr<FMcpBridgeWebSocket> RequestingSocket);
168
+ bool HandleArraySetElement(const FString &RequestId, const FString &Action,
169
+ const TSharedPtr<FJsonObject> &Payload,
170
+ TSharedPtr<FMcpBridgeWebSocket> RequestingSocket);
171
+ bool HandleArrayClear(const FString &RequestId, const FString &Action,
172
+ const TSharedPtr<FJsonObject> &Payload,
173
+ TSharedPtr<FMcpBridgeWebSocket> RequestingSocket);
174
+ // Map manipulation operations
175
+ bool HandleMapSetValue(const FString &RequestId, const FString &Action,
176
+ const TSharedPtr<FJsonObject> &Payload,
177
+ TSharedPtr<FMcpBridgeWebSocket> RequestingSocket);
178
+ bool HandleMapGetValue(const FString &RequestId, const FString &Action,
179
+ const TSharedPtr<FJsonObject> &Payload,
180
+ TSharedPtr<FMcpBridgeWebSocket> RequestingSocket);
181
+ bool HandleMapRemoveKey(const FString &RequestId, const FString &Action,
182
+ const TSharedPtr<FJsonObject> &Payload,
183
+ TSharedPtr<FMcpBridgeWebSocket> RequestingSocket);
184
+ bool HandleMapHasKey(const FString &RequestId, const FString &Action,
185
+ const TSharedPtr<FJsonObject> &Payload,
186
+ TSharedPtr<FMcpBridgeWebSocket> RequestingSocket);
187
+ bool HandleMapGetKeys(const FString &RequestId, const FString &Action,
188
+ const TSharedPtr<FJsonObject> &Payload,
189
+ TSharedPtr<FMcpBridgeWebSocket> RequestingSocket);
190
+ bool HandleMapClear(const FString &RequestId, const FString &Action,
191
+ const TSharedPtr<FJsonObject> &Payload,
192
+ TSharedPtr<FMcpBridgeWebSocket> RequestingSocket);
193
+ // Set manipulation operations
194
+ bool HandleSetAdd(const FString &RequestId, const FString &Action,
195
+ const TSharedPtr<FJsonObject> &Payload,
196
+ TSharedPtr<FMcpBridgeWebSocket> RequestingSocket);
197
+ bool HandleSetRemove(const FString &RequestId, const FString &Action,
198
+ const TSharedPtr<FJsonObject> &Payload,
199
+ TSharedPtr<FMcpBridgeWebSocket> RequestingSocket);
200
+ bool HandleSetContains(const FString &RequestId, const FString &Action,
201
+ const TSharedPtr<FJsonObject> &Payload,
202
+ TSharedPtr<FMcpBridgeWebSocket> RequestingSocket);
203
+ bool HandleSetClear(const FString &RequestId, const FString &Action,
204
+ const TSharedPtr<FJsonObject> &Payload,
205
+ TSharedPtr<FMcpBridgeWebSocket> RequestingSocket);
206
+ // Asset-related automation actions implemented by the plugin (editor-only
207
+ // operations)
208
+ bool HandleAssetAction(const FString &RequestId, const FString &Action,
209
+ const TSharedPtr<FJsonObject> &Payload,
210
+ TSharedPtr<FMcpBridgeWebSocket> RequestingSocket);
211
+ // Asset dependency graph traversal
212
+ bool
213
+ HandleGetAssetReferences(const FString &RequestId, const FString &Action,
214
+ const TSharedPtr<FJsonObject> &Payload,
215
+ TSharedPtr<FMcpBridgeWebSocket> RequestingSocket);
216
+ bool
217
+ HandleGetAssetDependencies(const FString &RequestId, const FString &Action,
218
+ const TSharedPtr<FJsonObject> &Payload,
219
+ TSharedPtr<FMcpBridgeWebSocket> RequestingSocket);
220
+ // Actor/editor control actions implemented by the plugin
221
+ bool
222
+ HandleControlActorAction(const FString &RequestId, const FString &Action,
223
+ const TSharedPtr<FJsonObject> &Payload,
224
+ TSharedPtr<FMcpBridgeWebSocket> RequestingSocket);
225
+ bool
226
+ HandleControlEditorAction(const FString &RequestId, const FString &Action,
227
+ const TSharedPtr<FJsonObject> &Payload,
228
+ TSharedPtr<FMcpBridgeWebSocket> RequestingSocket);
229
+ // Level and lighting helpers (top-level actions)
230
+ bool HandleLevelAction(const FString &RequestId, const FString &Action,
231
+ const TSharedPtr<FJsonObject> &Payload,
232
+ TSharedPtr<FMcpBridgeWebSocket> RequestingSocket);
233
+ bool HandleUiAction(const FString &RequestId, const FString &Action,
234
+ const TSharedPtr<FJsonObject> &Payload,
235
+ TSharedPtr<FMcpBridgeWebSocket> RequestingSocket);
236
+ // Animation and physics related automation actions
237
+ bool HandleAnimationPhysicsAction(
238
+ const FString &RequestId, const FString &Action,
239
+ const TSharedPtr<FJsonObject> &Payload,
240
+ TSharedPtr<FMcpBridgeWebSocket> RequestingSocket);
241
+ bool HandleEffectAction(const FString &RequestId, const FString &Action,
242
+ const TSharedPtr<FJsonObject> &Payload,
243
+ TSharedPtr<FMcpBridgeWebSocket> RequestingSocket);
244
+ bool HandleBlueprintAction(const FString &RequestId, const FString &Action,
245
+ const TSharedPtr<FJsonObject> &Payload,
246
+ TSharedPtr<FMcpBridgeWebSocket> RequestingSocket);
247
+ bool HandleSequenceAction(const FString &RequestId, const FString &Action,
248
+ const TSharedPtr<FJsonObject> &Payload,
249
+ TSharedPtr<FMcpBridgeWebSocket> RequestingSocket);
250
+ bool HandleInputAction(const FString &RequestId, const FString &Action,
251
+ const TSharedPtr<FJsonObject> &Payload,
252
+ TSharedPtr<FMcpBridgeWebSocket> RequestingSocket);
253
+ bool CreateNiagaraEffect(const FString &RequestId,
254
+ const TSharedPtr<FJsonObject> &Payload,
255
+ TSharedPtr<FMcpBridgeWebSocket> RequestingSocket,
256
+ const FString &EffectName,
257
+ const FString &DefaultSystemPath);
258
+ // Audio related automation actions
259
+ bool HandleAudioAction(const FString &RequestId, const FString &Action,
260
+ const TSharedPtr<FJsonObject> &Payload,
261
+ TSharedPtr<FMcpBridgeWebSocket> RequestingSocket);
262
+ // Lighting related automation actions
263
+ bool HandleLightingAction(const FString &RequestId, const FString &Action,
264
+ const TSharedPtr<FJsonObject> &Payload,
265
+ TSharedPtr<FMcpBridgeWebSocket> RequestingSocket);
266
+ // Performance related automation actions
267
+ bool
268
+ HandlePerformanceAction(const FString &RequestId, const FString &Action,
269
+ const TSharedPtr<FJsonObject> &Payload,
270
+ TSharedPtr<FMcpBridgeWebSocket> RequestingSocket);
271
+ // Environment building automation actions (landscape, foliage, etc.)
272
+ bool HandleBuildEnvironmentAction(
273
+ const FString &RequestId, const FString &Action,
274
+ const TSharedPtr<FJsonObject> &Payload,
275
+ TSharedPtr<FMcpBridgeWebSocket> RequestingSocket);
276
+ bool HandleControlEnvironmentAction(
277
+ const FString &RequestId, const FString &Action,
278
+ const TSharedPtr<FJsonObject> &Payload,
279
+ TSharedPtr<FMcpBridgeWebSocket> RequestingSocket);
280
+ bool HandlePaintFoliage(const FString &RequestId, const FString &Action,
281
+ const TSharedPtr<FJsonObject> &Payload,
282
+ TSharedPtr<FMcpBridgeWebSocket> RequestingSocket);
283
+ bool
284
+ HandleGetFoliageInstances(const FString &RequestId, const FString &Action,
285
+ const TSharedPtr<FJsonObject> &Payload,
286
+ TSharedPtr<FMcpBridgeWebSocket> RequestingSocket);
287
+ bool HandleRemoveFoliage(const FString &RequestId, const FString &Action,
288
+ const TSharedPtr<FJsonObject> &Payload,
289
+ TSharedPtr<FMcpBridgeWebSocket> RequestingSocket);
290
+ // Asset workflow handlers
291
+ bool
292
+ HandleSourceControlCheckout(const FString &RequestId, const FString &Action,
293
+ const TSharedPtr<FJsonObject> &Payload,
294
+ TSharedPtr<FMcpBridgeWebSocket> RequestingSocket);
295
+ bool
296
+ HandleSourceControlSubmit(const FString &RequestId, const FString &Action,
297
+ const TSharedPtr<FJsonObject> &Payload,
298
+ TSharedPtr<FMcpBridgeWebSocket> RequestingSocket);
299
+ bool HandleFixupRedirectors(const FString &RequestId, const FString &Action,
300
+ const TSharedPtr<FJsonObject> &Payload,
301
+ TSharedPtr<FMcpBridgeWebSocket> RequestingSocket);
302
+ bool HandleBulkRenameAssets(const FString &RequestId, const FString &Action,
303
+ const TSharedPtr<FJsonObject> &Payload,
304
+ TSharedPtr<FMcpBridgeWebSocket> RequestingSocket);
305
+ bool HandleBulkDeleteAssets(const FString &RequestId, const FString &Action,
306
+ const TSharedPtr<FJsonObject> &Payload,
307
+ TSharedPtr<FMcpBridgeWebSocket> RequestingSocket);
308
+ bool
309
+ HandleGenerateThumbnail(const FString &RequestId, const FString &Action,
310
+ const TSharedPtr<FJsonObject> &Payload,
311
+ TSharedPtr<FMcpBridgeWebSocket> RequestingSocket);
312
+ // Landscape, foliage, and Niagara handlers
313
+ bool HandleCreateLandscape(const FString &RequestId, const FString &Action,
314
+ const TSharedPtr<FJsonObject> &Payload,
315
+ TSharedPtr<FMcpBridgeWebSocket> RequestingSocket);
316
+ bool HandleCreateProceduralTerrain(
317
+ const FString &RequestId, const FString &Action,
318
+ const TSharedPtr<FJsonObject> &Payload,
319
+ TSharedPtr<FMcpBridgeWebSocket> RequestingSocket);
320
+ bool HandleCreateProceduralFoliage(
321
+ const FString &RequestId, const FString &Action,
322
+ const TSharedPtr<FJsonObject> &Payload,
323
+ TSharedPtr<FMcpBridgeWebSocket> RequestingSocket);
324
+ bool HandleCreateLandscapeGrassType(
325
+ const FString &RequestId, const FString &Action,
326
+ const TSharedPtr<FJsonObject> &Payload,
327
+ TSharedPtr<FMcpBridgeWebSocket> RequestingSocket);
328
+ bool HandleGenerateLODs(const FString &RequestId, const FString &Action,
329
+ const TSharedPtr<FJsonObject> &Payload,
330
+ TSharedPtr<FMcpBridgeWebSocket> RequestingSocket);
331
+ bool HandleBakeLightmap(const FString &RequestId, const FString &Action,
332
+ const TSharedPtr<FJsonObject> &Payload,
333
+ TSharedPtr<FMcpBridgeWebSocket> RequestingSocket);
334
+ // Aggregate landscape editor that dispatches to specific edit ops
335
+ bool HandleEditLandscape(const FString &RequestId, const FString &Action,
336
+ const TSharedPtr<FJsonObject> &Payload,
337
+ TSharedPtr<FMcpBridgeWebSocket> RequestingSocket);
338
+ // Specific landscape edit operations
339
+ bool HandleModifyHeightmap(const FString &RequestId, const FString &Action,
340
+ const TSharedPtr<FJsonObject> &Payload,
341
+ TSharedPtr<FMcpBridgeWebSocket> RequestingSocket);
342
+ bool
343
+ HandlePaintLandscapeLayer(const FString &RequestId, const FString &Action,
344
+ const TSharedPtr<FJsonObject> &Payload,
345
+ TSharedPtr<FMcpBridgeWebSocket> RequestingSocket);
346
+ bool HandleSculptLandscape(const FString &RequestId, const FString &Action,
347
+ const TSharedPtr<FJsonObject> &Payload,
348
+ TSharedPtr<FMcpBridgeWebSocket> RequestingSocket);
349
+ bool
350
+ HandleSetLandscapeMaterial(const FString &RequestId, const FString &Action,
351
+ const TSharedPtr<FJsonObject> &Payload,
352
+ TSharedPtr<FMcpBridgeWebSocket> RequestingSocket);
353
+ bool HandleCreateNiagaraSystemNative(
354
+ const FString &RequestId, const FString &Action,
355
+ const TSharedPtr<FJsonObject> &Payload,
356
+ TSharedPtr<FMcpBridgeWebSocket> RequestingSocket);
357
+ bool
358
+ HandleAddSequencerKeyframe(const FString &RequestId, const FString &Action,
359
+ const TSharedPtr<FJsonObject> &Payload,
360
+ TSharedPtr<FMcpBridgeWebSocket> RequestingSocket);
361
+ bool
362
+ HandleManageSequencerTrack(const FString &RequestId, const FString &Action,
363
+ const TSharedPtr<FJsonObject> &Payload,
364
+ TSharedPtr<FMcpBridgeWebSocket> RequestingSocket);
365
+ bool
366
+ HandleCreateAnimBlueprint(const FString &RequestId, const FString &Action,
367
+ const TSharedPtr<FJsonObject> &Payload,
368
+ TSharedPtr<FMcpBridgeWebSocket> RequestingSocket);
369
+ bool
370
+ HandleCreateMaterialNodes(const FString &RequestId, const FString &Action,
371
+ const TSharedPtr<FJsonObject> &Payload,
372
+ TSharedPtr<FMcpBridgeWebSocket> RequestingSocket);
373
+ // Niagara system handlers
374
+ bool
375
+ HandleCreateNiagaraSystem(const FString &RequestId, const FString &Action,
376
+ const TSharedPtr<FJsonObject> &Payload,
377
+ TSharedPtr<FMcpBridgeWebSocket> RequestingSocket);
378
+ bool
379
+ HandleCreateNiagaraRibbon(const FString &RequestId, const FString &Action,
380
+ const TSharedPtr<FJsonObject> &Payload,
381
+ TSharedPtr<FMcpBridgeWebSocket> RequestingSocket);
382
+ bool
383
+ HandleCreateNiagaraEmitter(const FString &RequestId, const FString &Action,
384
+ const TSharedPtr<FJsonObject> &Payload,
385
+ TSharedPtr<FMcpBridgeWebSocket> RequestingSocket);
386
+ bool
387
+ HandleSpawnNiagaraActor(const FString &RequestId, const FString &Action,
388
+ const TSharedPtr<FJsonObject> &Payload,
389
+ TSharedPtr<FMcpBridgeWebSocket> RequestingSocket);
390
+ bool HandleModifyNiagaraParameter(
391
+ const FString &RequestId, const FString &Action,
392
+ const TSharedPtr<FJsonObject> &Payload,
393
+ TSharedPtr<FMcpBridgeWebSocket> RequestingSocket);
394
+ // Animation blueprint handlers
395
+ bool HandlePlayAnimMontage(const FString &RequestId, const FString &Action,
396
+ const TSharedPtr<FJsonObject> &Payload,
397
+ TSharedPtr<FMcpBridgeWebSocket> RequestingSocket);
398
+ bool HandleSetupRagdoll(const FString &RequestId, const FString &Action,
399
+ const TSharedPtr<FJsonObject> &Payload,
400
+ TSharedPtr<FMcpBridgeWebSocket> RequestingSocket);
401
+ // Material graph handlers
402
+ bool HandleAddMaterialTextureSample(
403
+ const FString &RequestId, const FString &Action,
404
+ const TSharedPtr<FJsonObject> &Payload,
405
+ TSharedPtr<FMcpBridgeWebSocket> RequestingSocket);
406
+ bool
407
+ HandleAddMaterialExpression(const FString &RequestId, const FString &Action,
408
+ const TSharedPtr<FJsonObject> &Payload,
409
+ TSharedPtr<FMcpBridgeWebSocket> RequestingSocket);
410
+ // Sequencer track handlers
411
+ bool HandleAddCameraTrack(const FString &RequestId, const FString &Action,
412
+ const TSharedPtr<FJsonObject> &Payload,
413
+ TSharedPtr<FMcpBridgeWebSocket> RequestingSocket);
414
+ bool
415
+ HandleAddAnimationTrack(const FString &RequestId, const FString &Action,
416
+ const TSharedPtr<FJsonObject> &Payload,
417
+ TSharedPtr<FMcpBridgeWebSocket> RequestingSocket);
418
+ bool
419
+ HandleAddTransformTrack(const FString &RequestId, const FString &Action,
420
+ const TSharedPtr<FJsonObject> &Payload,
421
+ TSharedPtr<FMcpBridgeWebSocket> RequestingSocket);
422
+ // Foliage handlers
423
+ bool HandleAddFoliageType(const FString &RequestId, const FString &Action,
424
+ const TSharedPtr<FJsonObject> &Payload,
425
+ TSharedPtr<FMcpBridgeWebSocket> RequestingSocket);
426
+ bool
427
+ HandleAddFoliageInstances(const FString &RequestId, const FString &Action,
428
+ const TSharedPtr<FJsonObject> &Payload,
429
+ TSharedPtr<FMcpBridgeWebSocket> RequestingSocket);
430
+ // SCS Blueprint authoring handler
431
+ bool HandleSCSAction(const FString &RequestId, const FString &Action,
432
+ const TSharedPtr<FJsonObject> &Payload,
433
+ TSharedPtr<FMcpBridgeWebSocket> RequestingSocket);
434
+
435
+ // Additional consolidated tool handlers
436
+ bool
437
+ HandleSystemControlAction(const FString &RequestId, const FString &Action,
438
+ const TSharedPtr<FJsonObject> &Payload,
439
+ TSharedPtr<FMcpBridgeWebSocket> RequestingSocket);
440
+ bool
441
+ HandleConsoleCommandAction(const FString &RequestId, const FString &Action,
442
+ const TSharedPtr<FJsonObject> &Payload,
443
+ TSharedPtr<FMcpBridgeWebSocket> RequestingSocket);
444
+ bool HandleInspectAction(const FString &RequestId, const FString &Action,
445
+ const TSharedPtr<FJsonObject> &Payload,
446
+ TSharedPtr<FMcpBridgeWebSocket> RequestingSocket);
447
+
448
+ // 1. Editor Authoring & Graph Editing
449
+ bool
450
+ HandleBlueprintGraphAction(const FString &RequestId, const FString &Action,
451
+ const TSharedPtr<FJsonObject> &Payload,
452
+ TSharedPtr<FMcpBridgeWebSocket> RequestingSocket);
453
+ bool
454
+ HandleNiagaraGraphAction(const FString &RequestId, const FString &Action,
455
+ const TSharedPtr<FJsonObject> &Payload,
456
+ TSharedPtr<FMcpBridgeWebSocket> RequestingSocket);
457
+ bool HandleMaterialGraphAction(const FString &RequestId,
458
+ const FString &Action,
459
+ const TSharedPtr<FJsonObject> &Payload,
460
+ TSharedPtr<FMcpBridgeWebSocket> Socket);
461
+ bool
462
+ HandleBehaviorTreeAction(const FString &RequestId, const FString &Action,
463
+ const TSharedPtr<FJsonObject> &Payload,
464
+ TSharedPtr<FMcpBridgeWebSocket> RequestingSocket);
465
+ bool
466
+ HandleWorldPartitionAction(const FString &RequestId, const FString &Action,
467
+ const TSharedPtr<FJsonObject> &Payload,
468
+ TSharedPtr<FMcpBridgeWebSocket> RequestingSocket);
469
+ bool HandleRenderAction(const FString &RequestId, const FString &Action,
470
+ const TSharedPtr<FJsonObject> &Payload,
471
+ TSharedPtr<FMcpBridgeWebSocket> RequestingSocket);
472
+ bool HandleListBlueprints(const FString &RequestId, const FString &Action,
473
+ const TSharedPtr<FJsonObject> &Payload,
474
+ TSharedPtr<FMcpBridgeWebSocket> RequestingSocket);
475
+
476
+ // 2. Execution & Build / Test Pipeline
477
+ bool HandlePipelineAction(const FString &RequestId, const FString &Action,
478
+ const TSharedPtr<FJsonObject> &Payload,
479
+ TSharedPtr<FMcpBridgeWebSocket> RequestingSocket);
480
+ bool HandleTestAction(const FString &RequestId, const FString &Action,
481
+ const TSharedPtr<FJsonObject> &Payload,
482
+ TSharedPtr<FMcpBridgeWebSocket> RequestingSocket);
483
+
484
+ // 3. Observability, Logs, Debugging & History
485
+ bool HandleLogAction(const FString &RequestId, const FString &Action,
486
+ const TSharedPtr<FJsonObject> &Payload,
487
+ TSharedPtr<FMcpBridgeWebSocket> RequestingSocket);
488
+ bool HandleDebugAction(const FString &RequestId, const FString &Action,
489
+ const TSharedPtr<FJsonObject> &Payload,
490
+ TSharedPtr<FMcpBridgeWebSocket> RequestingSocket);
491
+ bool HandleAssetQueryAction(const FString &RequestId, const FString &Action,
492
+ const TSharedPtr<FJsonObject> &Payload,
493
+ TSharedPtr<FMcpBridgeWebSocket> RequestingSocket);
494
+ bool HandleInsightsAction(const FString &RequestId, const FString &Action,
495
+ const TSharedPtr<FJsonObject> &Payload,
496
+ TSharedPtr<FMcpBridgeWebSocket> RequestingSocket);
497
+
498
+ // 4. Input, UI, Hotkeys & Dialogs
499
+ bool
500
+ HandleUiAutomationAction(const FString &RequestId, const FString &Action,
501
+ const TSharedPtr<FJsonObject> &Payload,
502
+ TSharedPtr<FMcpBridgeWebSocket> RequestingSocket);
503
+
504
+ private:
505
+ // Ticker handle for managing the subsystems tick function
506
+ FTSTicker::FDelegateHandle TickHandle;
507
+
508
+ // Sequence helpers
509
+ FString ResolveSequencePath(const TSharedPtr<FJsonObject> &Payload);
510
+ TSharedPtr<FJsonObject> EnsureSequenceEntry(const FString &SeqPath);
511
+
512
+ // Individual sequence action handlers
513
+ bool HandleSequenceCreate(const FString &RequestId,
514
+ const TSharedPtr<FJsonObject> &Payload,
515
+ TSharedPtr<FMcpBridgeWebSocket> Socket);
516
+ bool HandleSequenceSetDisplayRate(const FString &RequestId,
517
+ const TSharedPtr<FJsonObject> &Payload,
518
+ TSharedPtr<FMcpBridgeWebSocket> Socket);
519
+ bool HandleSequenceSetProperties(const FString &RequestId,
520
+ const TSharedPtr<FJsonObject> &Payload,
521
+ TSharedPtr<FMcpBridgeWebSocket> Socket);
522
+ bool HandleSequenceOpen(const FString &RequestId,
523
+ const TSharedPtr<FJsonObject> &Payload,
524
+ TSharedPtr<FMcpBridgeWebSocket> Socket);
525
+ bool HandleSequenceAddCamera(const FString &RequestId,
526
+ const TSharedPtr<FJsonObject> &Payload,
527
+ TSharedPtr<FMcpBridgeWebSocket> Socket);
528
+ bool HandleSequencePlay(const FString &RequestId,
529
+ const TSharedPtr<FJsonObject> &Payload,
530
+ TSharedPtr<FMcpBridgeWebSocket> Socket);
531
+ bool HandleSequenceAddActor(const FString &RequestId,
532
+ const TSharedPtr<FJsonObject> &Payload,
533
+ TSharedPtr<FMcpBridgeWebSocket> Socket);
534
+ bool HandleSequenceAddActors(const FString &RequestId,
535
+ const TSharedPtr<FJsonObject> &Payload,
536
+ TSharedPtr<FMcpBridgeWebSocket> Socket);
537
+ bool HandleSequenceAddSpawnable(const FString &RequestId,
538
+ const TSharedPtr<FJsonObject> &Payload,
539
+ TSharedPtr<FMcpBridgeWebSocket> Socket);
540
+ bool HandleSequenceRemoveActors(const FString &RequestId,
541
+ const TSharedPtr<FJsonObject> &Payload,
542
+ TSharedPtr<FMcpBridgeWebSocket> Socket);
543
+ bool HandleSequenceGetBindings(const FString &RequestId,
544
+ const TSharedPtr<FJsonObject> &Payload,
545
+ TSharedPtr<FMcpBridgeWebSocket> Socket);
546
+ bool HandleSequenceGetProperties(const FString &RequestId,
547
+ const TSharedPtr<FJsonObject> &Payload,
548
+ TSharedPtr<FMcpBridgeWebSocket> Socket);
549
+ bool HandleSequenceSetPlaybackSpeed(const FString &RequestId,
550
+ const TSharedPtr<FJsonObject> &Payload,
551
+ TSharedPtr<FMcpBridgeWebSocket> Socket);
552
+ bool HandleSequencePause(const FString &RequestId,
553
+ const TSharedPtr<FJsonObject> &Payload,
554
+ TSharedPtr<FMcpBridgeWebSocket> Socket);
555
+ bool HandleSequenceStop(const FString &RequestId,
556
+ const TSharedPtr<FJsonObject> &Payload,
557
+ TSharedPtr<FMcpBridgeWebSocket> Socket);
558
+ bool HandleSequenceList(const FString &RequestId,
559
+ const TSharedPtr<FJsonObject> &Payload,
560
+ TSharedPtr<FMcpBridgeWebSocket> Socket);
561
+ bool HandleSequenceDuplicate(const FString &RequestId,
562
+ const TSharedPtr<FJsonObject> &Payload,
563
+ TSharedPtr<FMcpBridgeWebSocket> Socket);
564
+ bool HandleSequenceRename(const FString &RequestId,
565
+ const TSharedPtr<FJsonObject> &Payload,
566
+ TSharedPtr<FMcpBridgeWebSocket> Socket);
567
+ bool HandleSequenceDelete(const FString &RequestId,
568
+ const TSharedPtr<FJsonObject> &Payload,
569
+ TSharedPtr<FMcpBridgeWebSocket> Socket);
570
+ bool HandleSequenceGetMetadata(const FString &RequestId,
571
+ const TSharedPtr<FJsonObject> &Payload,
572
+ TSharedPtr<FMcpBridgeWebSocket> Socket);
573
+ bool HandleSequenceAddKeyframe(const FString &RequestId,
574
+ const TSharedPtr<FJsonObject> &Payload,
575
+ TSharedPtr<FMcpBridgeWebSocket> Socket);
576
+
577
+ // Control handlers
578
+ AActor *FindActorByName(const FString &Target);
579
+
580
+ // Control Actor Subhandlers
581
+ bool HandleControlActorSpawn(const FString &RequestId,
582
+ const TSharedPtr<FJsonObject> &Payload,
583
+ TSharedPtr<FMcpBridgeWebSocket> Socket);
584
+ bool HandleControlActorSpawnBlueprint(const FString &RequestId,
585
+ const TSharedPtr<FJsonObject> &Payload,
586
+ TSharedPtr<FMcpBridgeWebSocket> Socket);
587
+ bool HandleControlActorDelete(const FString &RequestId,
588
+ const TSharedPtr<FJsonObject> &Payload,
589
+ TSharedPtr<FMcpBridgeWebSocket> Socket);
590
+ bool HandleControlActorApplyForce(const FString &RequestId,
591
+ const TSharedPtr<FJsonObject> &Payload,
592
+ TSharedPtr<FMcpBridgeWebSocket> Socket);
593
+ bool HandleControlActorSetTransform(const FString &RequestId,
594
+ const TSharedPtr<FJsonObject> &Payload,
595
+ TSharedPtr<FMcpBridgeWebSocket> Socket);
596
+ bool HandleControlActorGetTransform(const FString &RequestId,
597
+ const TSharedPtr<FJsonObject> &Payload,
598
+ TSharedPtr<FMcpBridgeWebSocket> Socket);
599
+ bool HandleControlActorSetVisibility(const FString &RequestId,
600
+ const TSharedPtr<FJsonObject> &Payload,
601
+ TSharedPtr<FMcpBridgeWebSocket> Socket);
602
+ bool HandleControlActorAddComponent(const FString &RequestId,
603
+ const TSharedPtr<FJsonObject> &Payload,
604
+ TSharedPtr<FMcpBridgeWebSocket> Socket);
605
+ bool HandleSequenceAddSection(const FString &RequestId,
606
+ const TSharedPtr<FJsonObject> &Payload,
607
+ TSharedPtr<FMcpBridgeWebSocket> Socket);
608
+ bool HandleSequenceSetTickResolution(const FString &RequestId,
609
+ const TSharedPtr<FJsonObject> &Payload,
610
+ TSharedPtr<FMcpBridgeWebSocket> Socket);
611
+ bool HandleSequenceSetViewRange(const FString &RequestId,
612
+ const TSharedPtr<FJsonObject> &Payload,
613
+ TSharedPtr<FMcpBridgeWebSocket> Socket);
614
+ bool HandleSequenceSetTrackMuted(const FString &RequestId,
615
+ const TSharedPtr<FJsonObject> &Payload,
616
+ TSharedPtr<FMcpBridgeWebSocket> Socket);
617
+ bool HandleSequenceSetTrackSolo(const FString &RequestId,
618
+ const TSharedPtr<FJsonObject> &Payload,
619
+ TSharedPtr<FMcpBridgeWebSocket> Socket);
620
+ bool HandleSequenceSetTrackLocked(const FString &RequestId,
621
+ const TSharedPtr<FJsonObject> &Payload,
622
+ TSharedPtr<FMcpBridgeWebSocket> Socket);
623
+ bool HandleSequenceRemoveTrack(const FString &RequestId,
624
+ const TSharedPtr<FJsonObject> &Payload,
625
+ TSharedPtr<FMcpBridgeWebSocket> Socket);
626
+
627
+ bool HandleControlActorSetComponentProperties(
628
+ const FString &RequestId, const TSharedPtr<FJsonObject> &Payload,
629
+ TSharedPtr<FMcpBridgeWebSocket> Socket);
630
+ bool HandleControlActorGetComponents(const FString &RequestId,
631
+ const TSharedPtr<FJsonObject> &Payload,
632
+ TSharedPtr<FMcpBridgeWebSocket> Socket);
633
+ bool HandleControlActorDuplicate(const FString &RequestId,
634
+ const TSharedPtr<FJsonObject> &Payload,
635
+ TSharedPtr<FMcpBridgeWebSocket> Socket);
636
+ bool HandleControlActorAttach(const FString &RequestId,
637
+ const TSharedPtr<FJsonObject> &Payload,
638
+ TSharedPtr<FMcpBridgeWebSocket> Socket);
639
+ bool HandleControlActorDetach(const FString &RequestId,
640
+ const TSharedPtr<FJsonObject> &Payload,
641
+ TSharedPtr<FMcpBridgeWebSocket> Socket);
642
+ bool HandleControlActorFindByTag(const FString &RequestId,
643
+ const TSharedPtr<FJsonObject> &Payload,
644
+ TSharedPtr<FMcpBridgeWebSocket> Socket);
645
+ bool HandleControlActorAddTag(const FString &RequestId,
646
+ const TSharedPtr<FJsonObject> &Payload,
647
+ TSharedPtr<FMcpBridgeWebSocket> Socket);
648
+ bool HandleControlActorRemoveTag(const FString &RequestId,
649
+ const TSharedPtr<FJsonObject> &Payload,
650
+ TSharedPtr<FMcpBridgeWebSocket> Socket);
651
+ bool HandleControlActorFindByName(const FString &RequestId,
652
+ const TSharedPtr<FJsonObject> &Payload,
653
+ TSharedPtr<FMcpBridgeWebSocket> Socket);
654
+ bool HandleControlActorDeleteByTag(const FString &RequestId,
655
+ const TSharedPtr<FJsonObject> &Payload,
656
+ TSharedPtr<FMcpBridgeWebSocket> Socket);
657
+ bool HandleControlActorSetBlueprintVariables(
658
+ const FString &RequestId, const TSharedPtr<FJsonObject> &Payload,
659
+ TSharedPtr<FMcpBridgeWebSocket> Socket);
660
+ bool HandleControlActorCreateSnapshot(const FString &RequestId,
661
+ const TSharedPtr<FJsonObject> &Payload,
662
+ TSharedPtr<FMcpBridgeWebSocket> Socket);
663
+ bool HandleControlActorList(const FString &RequestId,
664
+ const TSharedPtr<FJsonObject> &Payload,
665
+ TSharedPtr<FMcpBridgeWebSocket> Socket);
666
+ bool HandleControlActorGet(const FString &RequestId,
667
+ const TSharedPtr<FJsonObject> &Payload,
668
+ TSharedPtr<FMcpBridgeWebSocket> Socket);
669
+ bool
670
+ HandleControlActorRestoreSnapshot(const FString &RequestId,
671
+ const TSharedPtr<FJsonObject> &Payload,
672
+ TSharedPtr<FMcpBridgeWebSocket> Socket);
673
+ bool HandleControlActorExport(const FString &RequestId,
674
+ const TSharedPtr<FJsonObject> &Payload,
675
+ TSharedPtr<FMcpBridgeWebSocket> Socket);
676
+ bool HandleControlActorGetBoundingBox(const FString &RequestId,
677
+ const TSharedPtr<FJsonObject> &Payload,
678
+ TSharedPtr<FMcpBridgeWebSocket> Socket);
679
+ bool HandleControlActorGetMetadata(const FString &RequestId,
680
+ const TSharedPtr<FJsonObject> &Payload,
681
+ TSharedPtr<FMcpBridgeWebSocket> Socket);
682
+
683
+ // Control Editor Subhandlers
684
+ bool HandleControlEditorPlay(const FString &RequestId,
685
+ const TSharedPtr<FJsonObject> &Payload,
686
+ TSharedPtr<FMcpBridgeWebSocket> Socket);
687
+ bool HandleControlEditorStop(const FString &RequestId,
688
+ const TSharedPtr<FJsonObject> &Payload,
689
+ TSharedPtr<FMcpBridgeWebSocket> Socket);
690
+ bool HandleControlEditorEject(const FString &RequestId,
691
+ const TSharedPtr<FJsonObject> &Payload,
692
+ TSharedPtr<FMcpBridgeWebSocket> Socket);
693
+ bool HandleControlEditorPossess(const FString &RequestId,
694
+ const TSharedPtr<FJsonObject> &Payload,
695
+ TSharedPtr<FMcpBridgeWebSocket> Socket);
696
+ bool HandleControlEditorFocusActor(const FString &RequestId,
697
+ const TSharedPtr<FJsonObject> &Payload,
698
+ TSharedPtr<FMcpBridgeWebSocket> Socket);
699
+ bool HandleControlEditorSetCamera(const FString &RequestId,
700
+ const TSharedPtr<FJsonObject> &Payload,
701
+ TSharedPtr<FMcpBridgeWebSocket> Socket);
702
+ bool HandleControlEditorSetViewMode(const FString &RequestId,
703
+ const TSharedPtr<FJsonObject> &Payload,
704
+ TSharedPtr<FMcpBridgeWebSocket> Socket);
705
+ bool HandleControlEditorOpenAsset(const FString &RequestId,
706
+ const TSharedPtr<FJsonObject> &Payload,
707
+ TSharedPtr<FMcpBridgeWebSocket> Socket);
708
+
709
+ // Asset handlers
710
+ bool HandleImportAsset(const FString &RequestId,
711
+ const TSharedPtr<FJsonObject> &Payload,
712
+ TSharedPtr<FMcpBridgeWebSocket> Socket);
713
+ bool HandleCreateMaterial(const FString &RequestId,
714
+ const TSharedPtr<FJsonObject> &Payload,
715
+ TSharedPtr<FMcpBridgeWebSocket> Socket);
716
+ bool HandleCreateMaterialInstance(const FString &RequestId,
717
+ const TSharedPtr<FJsonObject> &Payload,
718
+ TSharedPtr<FMcpBridgeWebSocket> Socket);
719
+ bool HandleCreateNiagaraSystemAsset(const FString &RequestId,
720
+ const TSharedPtr<FJsonObject> &Payload,
721
+ TSharedPtr<FMcpBridgeWebSocket> Socket);
722
+ bool HandleDuplicateAsset(const FString &RequestId,
723
+ const TSharedPtr<FJsonObject> &Payload,
724
+ TSharedPtr<FMcpBridgeWebSocket> Socket);
725
+ bool HandleRenameAsset(const FString &RequestId,
726
+ const TSharedPtr<FJsonObject> &Payload,
727
+ TSharedPtr<FMcpBridgeWebSocket> Socket);
728
+ bool HandleMoveAsset(const FString &RequestId,
729
+ const TSharedPtr<FJsonObject> &Payload,
730
+ TSharedPtr<FMcpBridgeWebSocket> Socket);
731
+ bool HandleDeleteAssets(const FString &RequestId,
732
+ const TSharedPtr<FJsonObject> &Payload,
733
+ TSharedPtr<FMcpBridgeWebSocket> Socket);
734
+ bool HandleListAssets(const FString &RequestId,
735
+ const TSharedPtr<FJsonObject> &Payload,
736
+ TSharedPtr<FMcpBridgeWebSocket> Socket);
737
+ bool HandleGetAsset(const FString &RequestId,
738
+ const TSharedPtr<FJsonObject> &Payload,
739
+ TSharedPtr<FMcpBridgeWebSocket> Socket);
740
+ bool HandleCreateFolder(const FString &RequestId,
741
+ const TSharedPtr<FJsonObject> &Payload,
742
+ TSharedPtr<FMcpBridgeWebSocket> Socket);
743
+ bool HandleGetDependencies(const FString &RequestId,
744
+ const TSharedPtr<FJsonObject> &Payload,
745
+ TSharedPtr<FMcpBridgeWebSocket> Socket);
746
+ bool HandleGetAssetGraph(const FString &RequestId,
747
+ const TSharedPtr<FJsonObject> &Payload,
748
+ TSharedPtr<FMcpBridgeWebSocket> Socket);
749
+ bool HandleCreateThumbnail(const FString &RequestId,
750
+ const TSharedPtr<FJsonObject> &Payload,
751
+ TSharedPtr<FMcpBridgeWebSocket> Socket);
752
+ bool HandleSetTags(const FString &RequestId,
753
+ const TSharedPtr<FJsonObject> &Payload,
754
+ TSharedPtr<FMcpBridgeWebSocket> Socket);
755
+ bool HandleSetMetadata(const FString &RequestId,
756
+ const TSharedPtr<FJsonObject> &Payload,
757
+ TSharedPtr<FMcpBridgeWebSocket> Socket);
758
+ bool HandleGetMetadata(const FString &RequestId,
759
+ const TSharedPtr<FJsonObject> &Payload,
760
+ TSharedPtr<FMcpBridgeWebSocket> Socket);
761
+ bool HandleGenerateReport(const FString &RequestId,
762
+ const TSharedPtr<FJsonObject> &Payload,
763
+ TSharedPtr<FMcpBridgeWebSocket> Socket);
764
+ bool HandleValidateAsset(const FString &RequestId,
765
+ const TSharedPtr<FJsonObject> &Payload,
766
+ TSharedPtr<FMcpBridgeWebSocket> Socket);
767
+ bool HandleAddMaterialParameter(const FString &RequestId,
768
+ const TSharedPtr<FJsonObject> &Payload,
769
+ TSharedPtr<FMcpBridgeWebSocket> Socket);
770
+ bool HandleListMaterialInstances(const FString &RequestId,
771
+ const TSharedPtr<FJsonObject> &Payload,
772
+ TSharedPtr<FMcpBridgeWebSocket> Socket);
773
+ bool HandleResetInstanceParameters(const FString &RequestId,
774
+ const TSharedPtr<FJsonObject> &Payload,
775
+ TSharedPtr<FMcpBridgeWebSocket> Socket);
776
+ bool HandleDoesAssetExist(const FString &RequestId,
777
+ const TSharedPtr<FJsonObject> &Payload,
778
+ TSharedPtr<FMcpBridgeWebSocket> Socket);
779
+ bool HandleGetMaterialStats(const FString &RequestId,
780
+ const TSharedPtr<FJsonObject> &Payload,
781
+ TSharedPtr<FMcpBridgeWebSocket> Socket);
782
+ bool HandleRebuildMaterial(const FString &RequestId,
783
+ const TSharedPtr<FJsonObject> &Payload,
784
+ TSharedPtr<FMcpBridgeWebSocket> Socket);
785
+
786
+ // Lightweight snapshot cache for automation requests (e.g., create_snapshot)
787
+ TMap<FString, FTransform> CachedActorSnapshots;
788
+
789
+ /** Guards against reentrant automation request processing */
790
+ bool bProcessingAutomationRequest = false;
791
+
792
+ void
793
+ ProcessAutomationRequest(const FString &RequestId, const FString &Action,
794
+ const TSharedPtr<FJsonObject> &Payload,
795
+ TSharedPtr<FMcpBridgeWebSocket> RequestingSocket);
796
+ };