unreal-engine-mcp-server 0.4.7 → 0.5.0

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 (438) 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.yml +148 -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 +23 -0
  19. package/.github/workflows/labeler.yml +16 -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 +12 -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 +267 -31
  29. package/CONTRIBUTING.md +140 -0
  30. package/README.md +166 -71
  31. package/claude_desktop_config_example.json +7 -6
  32. package/dist/automation/bridge.d.ts +50 -0
  33. package/dist/automation/bridge.js +452 -0
  34. package/dist/automation/connection-manager.d.ts +23 -0
  35. package/dist/automation/connection-manager.js +107 -0
  36. package/dist/automation/handshake.d.ts +11 -0
  37. package/dist/automation/handshake.js +89 -0
  38. package/dist/automation/index.d.ts +3 -0
  39. package/dist/automation/index.js +3 -0
  40. package/dist/automation/message-handler.d.ts +12 -0
  41. package/dist/automation/message-handler.js +149 -0
  42. package/dist/automation/request-tracker.d.ts +25 -0
  43. package/dist/automation/request-tracker.js +98 -0
  44. package/dist/automation/types.d.ts +130 -0
  45. package/dist/automation/types.js +2 -0
  46. package/dist/cli.js +32 -5
  47. package/dist/config.d.ts +27 -0
  48. package/dist/config.js +60 -0
  49. package/dist/constants.d.ts +12 -0
  50. package/dist/constants.js +12 -0
  51. package/dist/graphql/resolvers.d.ts +268 -0
  52. package/dist/graphql/resolvers.js +743 -0
  53. package/dist/graphql/schema.d.ts +5 -0
  54. package/dist/graphql/schema.js +437 -0
  55. package/dist/graphql/server.d.ts +26 -0
  56. package/dist/graphql/server.js +115 -0
  57. package/dist/graphql/types.d.ts +7 -0
  58. package/dist/graphql/types.js +2 -0
  59. package/dist/handlers/resource-handlers.d.ts +20 -0
  60. package/dist/handlers/resource-handlers.js +180 -0
  61. package/dist/index.d.ts +31 -18
  62. package/dist/index.js +119 -619
  63. package/dist/prompts/index.js +4 -4
  64. package/dist/resources/actors.d.ts +17 -12
  65. package/dist/resources/actors.js +56 -76
  66. package/dist/resources/assets.d.ts +6 -14
  67. package/dist/resources/assets.js +115 -147
  68. package/dist/resources/levels.d.ts +13 -13
  69. package/dist/resources/levels.js +25 -34
  70. package/dist/server/resource-registry.d.ts +20 -0
  71. package/dist/server/resource-registry.js +37 -0
  72. package/dist/server/tool-registry.d.ts +23 -0
  73. package/dist/server/tool-registry.js +322 -0
  74. package/dist/server-setup.d.ts +21 -0
  75. package/dist/server-setup.js +111 -0
  76. package/dist/services/health-monitor.d.ts +34 -0
  77. package/dist/services/health-monitor.js +105 -0
  78. package/dist/services/metrics-server.d.ts +11 -0
  79. package/dist/services/metrics-server.js +105 -0
  80. package/dist/tools/actors.d.ts +147 -9
  81. package/dist/tools/actors.js +350 -311
  82. package/dist/tools/animation.d.ts +135 -4
  83. package/dist/tools/animation.js +510 -411
  84. package/dist/tools/assets.d.ts +117 -19
  85. package/dist/tools/assets.js +259 -284
  86. package/dist/tools/audio.d.ts +102 -42
  87. package/dist/tools/audio.js +272 -685
  88. package/dist/tools/base-tool.d.ts +17 -0
  89. package/dist/tools/base-tool.js +46 -0
  90. package/dist/tools/behavior-tree.d.ts +94 -0
  91. package/dist/tools/behavior-tree.js +39 -0
  92. package/dist/tools/blueprint/helpers.d.ts +29 -0
  93. package/dist/tools/blueprint/helpers.js +182 -0
  94. package/dist/tools/blueprint.d.ts +228 -118
  95. package/dist/tools/blueprint.js +685 -832
  96. package/dist/tools/consolidated-tool-definitions.d.ts +5462 -1781
  97. package/dist/tools/consolidated-tool-definitions.js +829 -496
  98. package/dist/tools/consolidated-tool-handlers.d.ts +2 -1
  99. package/dist/tools/consolidated-tool-handlers.js +211 -1026
  100. package/dist/tools/debug.d.ts +143 -85
  101. package/dist/tools/debug.js +234 -180
  102. package/dist/tools/dynamic-handler-registry.d.ts +11 -0
  103. package/dist/tools/dynamic-handler-registry.js +101 -0
  104. package/dist/tools/editor.d.ts +139 -18
  105. package/dist/tools/editor.js +239 -244
  106. package/dist/tools/engine.d.ts +10 -4
  107. package/dist/tools/engine.js +13 -5
  108. package/dist/tools/environment.d.ts +36 -0
  109. package/dist/tools/environment.js +267 -0
  110. package/dist/tools/foliage.d.ts +105 -14
  111. package/dist/tools/foliage.js +219 -331
  112. package/dist/tools/handlers/actor-handlers.d.ts +3 -0
  113. package/dist/tools/handlers/actor-handlers.js +232 -0
  114. package/dist/tools/handlers/animation-handlers.d.ts +3 -0
  115. package/dist/tools/handlers/animation-handlers.js +185 -0
  116. package/dist/tools/handlers/argument-helper.d.ts +16 -0
  117. package/dist/tools/handlers/argument-helper.js +80 -0
  118. package/dist/tools/handlers/asset-handlers.d.ts +3 -0
  119. package/dist/tools/handlers/asset-handlers.js +496 -0
  120. package/dist/tools/handlers/audio-handlers.d.ts +3 -0
  121. package/dist/tools/handlers/audio-handlers.js +166 -0
  122. package/dist/tools/handlers/blueprint-handlers.d.ts +4 -0
  123. package/dist/tools/handlers/blueprint-handlers.js +358 -0
  124. package/dist/tools/handlers/common-handlers.d.ts +14 -0
  125. package/dist/tools/handlers/common-handlers.js +56 -0
  126. package/dist/tools/handlers/editor-handlers.d.ts +3 -0
  127. package/dist/tools/handlers/editor-handlers.js +119 -0
  128. package/dist/tools/handlers/effect-handlers.d.ts +3 -0
  129. package/dist/tools/handlers/effect-handlers.js +171 -0
  130. package/dist/tools/handlers/environment-handlers.d.ts +3 -0
  131. package/dist/tools/handlers/environment-handlers.js +170 -0
  132. package/dist/tools/handlers/graph-handlers.d.ts +3 -0
  133. package/dist/tools/handlers/graph-handlers.js +90 -0
  134. package/dist/tools/handlers/input-handlers.d.ts +3 -0
  135. package/dist/tools/handlers/input-handlers.js +21 -0
  136. package/dist/tools/handlers/inspect-handlers.d.ts +3 -0
  137. package/dist/tools/handlers/inspect-handlers.js +383 -0
  138. package/dist/tools/handlers/level-handlers.d.ts +3 -0
  139. package/dist/tools/handlers/level-handlers.js +237 -0
  140. package/dist/tools/handlers/lighting-handlers.d.ts +3 -0
  141. package/dist/tools/handlers/lighting-handlers.js +144 -0
  142. package/dist/tools/handlers/performance-handlers.d.ts +3 -0
  143. package/dist/tools/handlers/performance-handlers.js +130 -0
  144. package/dist/tools/handlers/pipeline-handlers.d.ts +3 -0
  145. package/dist/tools/handlers/pipeline-handlers.js +110 -0
  146. package/dist/tools/handlers/sequence-handlers.d.ts +3 -0
  147. package/dist/tools/handlers/sequence-handlers.js +376 -0
  148. package/dist/tools/handlers/system-handlers.d.ts +4 -0
  149. package/dist/tools/handlers/system-handlers.js +506 -0
  150. package/dist/tools/input.d.ts +19 -0
  151. package/dist/tools/input.js +89 -0
  152. package/dist/tools/introspection.d.ts +103 -40
  153. package/dist/tools/introspection.js +425 -568
  154. package/dist/tools/landscape.d.ts +97 -36
  155. package/dist/tools/landscape.js +280 -409
  156. package/dist/tools/level.d.ts +130 -10
  157. package/dist/tools/level.js +639 -675
  158. package/dist/tools/lighting.d.ts +77 -38
  159. package/dist/tools/lighting.js +441 -943
  160. package/dist/tools/logs.d.ts +3 -3
  161. package/dist/tools/logs.js +5 -57
  162. package/dist/tools/materials.d.ts +91 -24
  163. package/dist/tools/materials.js +190 -118
  164. package/dist/tools/niagara.d.ts +149 -39
  165. package/dist/tools/niagara.js +232 -182
  166. package/dist/tools/performance.d.ts +27 -12
  167. package/dist/tools/performance.js +204 -122
  168. package/dist/tools/physics.d.ts +32 -77
  169. package/dist/tools/physics.js +171 -582
  170. package/dist/tools/property-dictionary.d.ts +13 -0
  171. package/dist/tools/property-dictionary.js +82 -0
  172. package/dist/tools/sequence.d.ts +73 -48
  173. package/dist/tools/sequence.js +196 -748
  174. package/dist/tools/tool-definition-utils.d.ts +59 -0
  175. package/dist/tools/tool-definition-utils.js +35 -0
  176. package/dist/tools/ui.d.ts +66 -34
  177. package/dist/tools/ui.js +134 -214
  178. package/dist/types/env.d.ts +0 -3
  179. package/dist/types/env.js +0 -7
  180. package/dist/types/tool-interfaces.d.ts +898 -0
  181. package/dist/types/tool-interfaces.js +2 -0
  182. package/dist/types/tool-types.d.ts +183 -19
  183. package/dist/types/tool-types.js +0 -4
  184. package/dist/unreal-bridge.d.ts +24 -131
  185. package/dist/unreal-bridge.js +364 -1506
  186. package/dist/utils/command-validator.d.ts +9 -0
  187. package/dist/utils/command-validator.js +67 -0
  188. package/dist/utils/elicitation.d.ts +1 -1
  189. package/dist/utils/elicitation.js +12 -15
  190. package/dist/utils/error-handler.d.ts +2 -51
  191. package/dist/utils/error-handler.js +11 -87
  192. package/dist/utils/ini-reader.d.ts +3 -0
  193. package/dist/utils/ini-reader.js +69 -0
  194. package/dist/utils/logger.js +9 -6
  195. package/dist/utils/normalize.d.ts +3 -0
  196. package/dist/utils/normalize.js +56 -0
  197. package/dist/utils/response-factory.d.ts +7 -0
  198. package/dist/utils/response-factory.js +33 -0
  199. package/dist/utils/response-validator.d.ts +3 -24
  200. package/dist/utils/response-validator.js +130 -81
  201. package/dist/utils/result-helpers.d.ts +4 -5
  202. package/dist/utils/result-helpers.js +15 -16
  203. package/dist/utils/safe-json.js +5 -11
  204. package/dist/utils/unreal-command-queue.d.ts +24 -0
  205. package/dist/utils/unreal-command-queue.js +120 -0
  206. package/dist/utils/validation.d.ts +0 -40
  207. package/dist/utils/validation.js +1 -78
  208. package/dist/wasm/index.d.ts +70 -0
  209. package/dist/wasm/index.js +535 -0
  210. package/docs/GraphQL-API.md +888 -0
  211. package/docs/Migration-Guide-v0.5.0.md +692 -0
  212. package/docs/Roadmap.md +53 -0
  213. package/docs/WebAssembly-Integration.md +628 -0
  214. package/docs/editor-plugin-extension.md +370 -0
  215. package/docs/handler-mapping.md +242 -0
  216. package/docs/native-automation-progress.md +128 -0
  217. package/docs/testing-guide.md +423 -0
  218. package/mcp-config-example.json +6 -6
  219. package/package.json +60 -27
  220. package/plugins/McpAutomationBridge/Config/FilterPlugin.ini +8 -0
  221. package/plugins/McpAutomationBridge/McpAutomationBridge.uplugin +64 -0
  222. package/plugins/McpAutomationBridge/Source/McpAutomationBridge/McpAutomationBridge.Build.cs +189 -0
  223. package/plugins/McpAutomationBridge/Source/McpAutomationBridge/Private/McpAutomationBridgeGlobals.cpp +22 -0
  224. package/plugins/McpAutomationBridge/Source/McpAutomationBridge/Private/McpAutomationBridgeGlobals.h +30 -0
  225. package/plugins/McpAutomationBridge/Source/McpAutomationBridge/Private/McpAutomationBridgeHelpers.h +1983 -0
  226. package/plugins/McpAutomationBridge/Source/McpAutomationBridge/Private/McpAutomationBridgeModule.cpp +72 -0
  227. package/plugins/McpAutomationBridge/Source/McpAutomationBridge/Private/McpAutomationBridgeSettings.cpp +46 -0
  228. package/plugins/McpAutomationBridge/Source/McpAutomationBridge/Private/McpAutomationBridgeSubsystem.cpp +581 -0
  229. package/plugins/McpAutomationBridge/Source/McpAutomationBridge/Private/McpAutomationBridge_AnimationHandlers.cpp +2394 -0
  230. package/plugins/McpAutomationBridge/Source/McpAutomationBridge/Private/McpAutomationBridge_AssetQueryHandlers.cpp +300 -0
  231. package/plugins/McpAutomationBridge/Source/McpAutomationBridge/Private/McpAutomationBridge_AssetWorkflowHandlers.cpp +2807 -0
  232. package/plugins/McpAutomationBridge/Source/McpAutomationBridge/Private/McpAutomationBridge_AudioHandlers.cpp +1087 -0
  233. package/plugins/McpAutomationBridge/Source/McpAutomationBridge/Private/McpAutomationBridge_BehaviorTreeHandlers.cpp +488 -0
  234. package/plugins/McpAutomationBridge/Source/McpAutomationBridge/Private/McpAutomationBridge_BlueprintCreationHandlers.cpp +643 -0
  235. package/plugins/McpAutomationBridge/Source/McpAutomationBridge/Private/McpAutomationBridge_BlueprintCreationHandlers.h +31 -0
  236. package/plugins/McpAutomationBridge/Source/McpAutomationBridge/Private/McpAutomationBridge_BlueprintGraphHandlers.cpp +1184 -0
  237. package/plugins/McpAutomationBridge/Source/McpAutomationBridge/Private/McpAutomationBridge_BlueprintHandlers.cpp +5652 -0
  238. package/plugins/McpAutomationBridge/Source/McpAutomationBridge/Private/McpAutomationBridge_BlueprintHandlers_List.cpp +152 -0
  239. package/plugins/McpAutomationBridge/Source/McpAutomationBridge/Private/McpAutomationBridge_ControlHandlers.cpp +2614 -0
  240. package/plugins/McpAutomationBridge/Source/McpAutomationBridge/Private/McpAutomationBridge_DebugHandlers.cpp +42 -0
  241. package/plugins/McpAutomationBridge/Source/McpAutomationBridge/Private/McpAutomationBridge_EditorFunctionHandlers.cpp +1237 -0
  242. package/plugins/McpAutomationBridge/Source/McpAutomationBridge/Private/McpAutomationBridge_EffectHandlers.cpp +1701 -0
  243. package/plugins/McpAutomationBridge/Source/McpAutomationBridge/Private/McpAutomationBridge_EnvironmentHandlers.cpp +2145 -0
  244. package/plugins/McpAutomationBridge/Source/McpAutomationBridge/Private/McpAutomationBridge_FoliageHandlers.cpp +954 -0
  245. package/plugins/McpAutomationBridge/Source/McpAutomationBridge/Private/McpAutomationBridge_InputHandlers.cpp +209 -0
  246. package/plugins/McpAutomationBridge/Source/McpAutomationBridge/Private/McpAutomationBridge_InsightsHandlers.cpp +41 -0
  247. package/plugins/McpAutomationBridge/Source/McpAutomationBridge/Private/McpAutomationBridge_LandscapeHandlers.cpp +1164 -0
  248. package/plugins/McpAutomationBridge/Source/McpAutomationBridge/Private/McpAutomationBridge_LevelHandlers.cpp +762 -0
  249. package/plugins/McpAutomationBridge/Source/McpAutomationBridge/Private/McpAutomationBridge_LightingHandlers.cpp +634 -0
  250. package/plugins/McpAutomationBridge/Source/McpAutomationBridge/Private/McpAutomationBridge_LogHandlers.cpp +136 -0
  251. package/plugins/McpAutomationBridge/Source/McpAutomationBridge/Private/McpAutomationBridge_MaterialGraphHandlers.cpp +494 -0
  252. package/plugins/McpAutomationBridge/Source/McpAutomationBridge/Private/McpAutomationBridge_NiagaraGraphHandlers.cpp +278 -0
  253. package/plugins/McpAutomationBridge/Source/McpAutomationBridge/Private/McpAutomationBridge_NiagaraHandlers.cpp +625 -0
  254. package/plugins/McpAutomationBridge/Source/McpAutomationBridge/Private/McpAutomationBridge_PerformanceHandlers.cpp +401 -0
  255. package/plugins/McpAutomationBridge/Source/McpAutomationBridge/Private/McpAutomationBridge_PipelineHandlers.cpp +67 -0
  256. package/plugins/McpAutomationBridge/Source/McpAutomationBridge/Private/McpAutomationBridge_ProcessRequest.cpp +735 -0
  257. package/plugins/McpAutomationBridge/Source/McpAutomationBridge/Private/McpAutomationBridge_PropertyHandlers.cpp +2634 -0
  258. package/plugins/McpAutomationBridge/Source/McpAutomationBridge/Private/McpAutomationBridge_RenderHandlers.cpp +189 -0
  259. package/plugins/McpAutomationBridge/Source/McpAutomationBridge/Private/McpAutomationBridge_SCSHandlers.cpp +917 -0
  260. package/plugins/McpAutomationBridge/Source/McpAutomationBridge/Private/McpAutomationBridge_SCSHandlers.h +39 -0
  261. package/plugins/McpAutomationBridge/Source/McpAutomationBridge/Private/McpAutomationBridge_SequenceHandlers.cpp +2670 -0
  262. package/plugins/McpAutomationBridge/Source/McpAutomationBridge/Private/McpAutomationBridge_SequencerHandlers.cpp +519 -0
  263. package/plugins/McpAutomationBridge/Source/McpAutomationBridge/Private/McpAutomationBridge_TestHandlers.cpp +38 -0
  264. package/plugins/McpAutomationBridge/Source/McpAutomationBridge/Private/McpAutomationBridge_UiHandlers.cpp +668 -0
  265. package/plugins/McpAutomationBridge/Source/McpAutomationBridge/Private/McpAutomationBridge_WorldPartitionHandlers.cpp +346 -0
  266. package/plugins/McpAutomationBridge/Source/McpAutomationBridge/Private/McpBridgeWebSocket.cpp +1330 -0
  267. package/plugins/McpAutomationBridge/Source/McpAutomationBridge/Private/McpBridgeWebSocket.h +149 -0
  268. package/plugins/McpAutomationBridge/Source/McpAutomationBridge/Private/McpConnectionManager.cpp +783 -0
  269. package/plugins/McpAutomationBridge/Source/McpAutomationBridge/Public/McpAutomationBridgeSettings.h +115 -0
  270. package/plugins/McpAutomationBridge/Source/McpAutomationBridge/Public/McpAutomationBridgeSubsystem.h +796 -0
  271. package/plugins/McpAutomationBridge/Source/McpAutomationBridge/Public/McpConnectionManager.h +117 -0
  272. package/scripts/check-unreal-connection.mjs +19 -0
  273. package/scripts/clean-tmp.js +23 -0
  274. package/scripts/patch-wasm.js +26 -0
  275. package/scripts/run-all-tests.mjs +131 -0
  276. package/scripts/smoke-test.ts +94 -0
  277. package/scripts/sync-mcp-plugin.js +143 -0
  278. package/scripts/test-no-plugin-alternates.mjs +113 -0
  279. package/scripts/validate-server.js +46 -0
  280. package/scripts/verify-automation-bridge.js +200 -0
  281. package/server.json +57 -21
  282. package/src/automation/bridge.ts +558 -0
  283. package/src/automation/connection-manager.ts +130 -0
  284. package/src/automation/handshake.ts +99 -0
  285. package/src/automation/index.ts +2 -0
  286. package/src/automation/message-handler.ts +167 -0
  287. package/src/automation/request-tracker.ts +123 -0
  288. package/src/automation/types.ts +107 -0
  289. package/src/cli.ts +33 -6
  290. package/src/config.ts +73 -0
  291. package/src/constants.ts +12 -0
  292. package/src/graphql/resolvers.ts +1010 -0
  293. package/src/graphql/schema.ts +452 -0
  294. package/src/graphql/server.ts +154 -0
  295. package/src/graphql/types.ts +7 -0
  296. package/src/handlers/resource-handlers.ts +186 -0
  297. package/src/index.ts +152 -663
  298. package/src/prompts/index.ts +4 -4
  299. package/src/resources/actors.ts +58 -76
  300. package/src/resources/assets.ts +147 -134
  301. package/src/resources/levels.ts +28 -33
  302. package/src/server/resource-registry.ts +47 -0
  303. package/src/server/tool-registry.ts +354 -0
  304. package/src/server-setup.ts +148 -0
  305. package/src/services/health-monitor.ts +132 -0
  306. package/src/services/metrics-server.ts +142 -0
  307. package/src/tools/actors.ts +417 -322
  308. package/src/tools/animation.ts +671 -461
  309. package/src/tools/assets.ts +353 -289
  310. package/src/tools/audio.ts +323 -766
  311. package/src/tools/base-tool.ts +52 -0
  312. package/src/tools/behavior-tree.ts +45 -0
  313. package/src/tools/blueprint/helpers.ts +189 -0
  314. package/src/tools/blueprint.ts +787 -965
  315. package/src/tools/consolidated-tool-definitions.ts +993 -515
  316. package/src/tools/consolidated-tool-handlers.ts +272 -1139
  317. package/src/tools/debug.ts +292 -187
  318. package/src/tools/dynamic-handler-registry.ts +151 -0
  319. package/src/tools/editor.ts +309 -246
  320. package/src/tools/engine.ts +14 -3
  321. package/src/tools/environment.ts +287 -0
  322. package/src/tools/foliage.ts +314 -379
  323. package/src/tools/handlers/actor-handlers.ts +271 -0
  324. package/src/tools/handlers/animation-handlers.ts +237 -0
  325. package/src/tools/handlers/argument-helper.ts +142 -0
  326. package/src/tools/handlers/asset-handlers.ts +532 -0
  327. package/src/tools/handlers/audio-handlers.ts +194 -0
  328. package/src/tools/handlers/blueprint-handlers.ts +380 -0
  329. package/src/tools/handlers/common-handlers.ts +87 -0
  330. package/src/tools/handlers/editor-handlers.ts +123 -0
  331. package/src/tools/handlers/effect-handlers.ts +220 -0
  332. package/src/tools/handlers/environment-handlers.ts +183 -0
  333. package/src/tools/handlers/graph-handlers.ts +116 -0
  334. package/src/tools/handlers/input-handlers.ts +28 -0
  335. package/src/tools/handlers/inspect-handlers.ts +450 -0
  336. package/src/tools/handlers/level-handlers.ts +252 -0
  337. package/src/tools/handlers/lighting-handlers.ts +147 -0
  338. package/src/tools/handlers/performance-handlers.ts +132 -0
  339. package/src/tools/handlers/pipeline-handlers.ts +127 -0
  340. package/src/tools/handlers/sequence-handlers.ts +415 -0
  341. package/src/tools/handlers/system-handlers.ts +564 -0
  342. package/src/tools/input.ts +101 -0
  343. package/src/tools/introspection.ts +493 -584
  344. package/src/tools/landscape.ts +394 -489
  345. package/src/tools/level.ts +752 -694
  346. package/src/tools/lighting.ts +583 -984
  347. package/src/tools/logs.ts +9 -57
  348. package/src/tools/materials.ts +231 -121
  349. package/src/tools/niagara.ts +293 -168
  350. package/src/tools/performance.ts +320 -168
  351. package/src/tools/physics.ts +268 -613
  352. package/src/tools/property-dictionary.ts +98 -0
  353. package/src/tools/sequence.ts +255 -815
  354. package/src/tools/tool-definition-utils.ts +35 -0
  355. package/src/tools/ui.ts +207 -283
  356. package/src/types/env.ts +0 -10
  357. package/src/types/tool-interfaces.ts +250 -0
  358. package/src/types/tool-types.ts +243 -21
  359. package/src/unreal-bridge.ts +460 -1550
  360. package/src/utils/command-validator.ts +75 -0
  361. package/src/utils/elicitation.ts +10 -7
  362. package/src/utils/error-handler.ts +14 -90
  363. package/src/utils/ini-reader.ts +86 -0
  364. package/src/utils/logger.ts +8 -3
  365. package/src/utils/normalize.ts +60 -0
  366. package/src/utils/response-factory.ts +39 -0
  367. package/src/utils/response-validator.ts +176 -56
  368. package/src/utils/result-helpers.ts +21 -19
  369. package/src/utils/safe-json.ts +14 -11
  370. package/src/utils/unreal-command-queue.ts +152 -0
  371. package/src/utils/validation.ts +4 -1
  372. package/src/wasm/index.ts +838 -0
  373. package/test-server.mjs +100 -0
  374. package/tests/run-unreal-tool-tests.mjs +242 -14
  375. package/tests/test-animation.mjs +44 -0
  376. package/tests/test-asset-advanced.mjs +82 -0
  377. package/tests/test-asset-errors.mjs +35 -0
  378. package/tests/test-audio.mjs +219 -0
  379. package/tests/test-automation-timeouts.mjs +98 -0
  380. package/tests/test-behavior-tree.mjs +261 -0
  381. package/tests/test-blueprint-events.mjs +35 -0
  382. package/tests/test-blueprint-graph.mjs +79 -0
  383. package/tests/test-blueprint.mjs +577 -0
  384. package/tests/test-client-mode.mjs +86 -0
  385. package/tests/test-console-command.mjs +56 -0
  386. package/tests/test-control-actor.mjs +425 -0
  387. package/tests/test-control-editor.mjs +80 -0
  388. package/tests/test-extra-tools.mjs +38 -0
  389. package/tests/test-graphql.mjs +322 -0
  390. package/tests/test-inspect.mjs +72 -0
  391. package/tests/test-landscape.mjs +60 -0
  392. package/tests/test-manage-asset.mjs +438 -0
  393. package/tests/test-manage-level.mjs +70 -0
  394. package/tests/test-materials.mjs +356 -0
  395. package/tests/test-niagara.mjs +185 -0
  396. package/tests/test-no-inline-python.mjs +122 -0
  397. package/tests/test-plugin-handshake.mjs +82 -0
  398. package/tests/test-render.mjs +33 -0
  399. package/tests/test-runner.mjs +933 -0
  400. package/tests/test-search-assets.mjs +66 -0
  401. package/tests/test-sequence.mjs +68 -0
  402. package/tests/test-system.mjs +57 -0
  403. package/tests/test-wasm.mjs +193 -0
  404. package/tests/test-world-partition.mjs +215 -0
  405. package/tsconfig.json +3 -3
  406. package/wasm/Cargo.lock +363 -0
  407. package/wasm/Cargo.toml +42 -0
  408. package/wasm/LICENSE +21 -0
  409. package/wasm/README.md +253 -0
  410. package/wasm/src/dependency_resolver.rs +377 -0
  411. package/wasm/src/lib.rs +153 -0
  412. package/wasm/src/property_parser.rs +271 -0
  413. package/wasm/src/transform_math.rs +396 -0
  414. package/wasm/tests/integration.rs +109 -0
  415. package/.github/workflows/smithery-build.yml +0 -29
  416. package/dist/tools/build_environment_advanced.d.ts +0 -65
  417. package/dist/tools/build_environment_advanced.js +0 -633
  418. package/dist/tools/rc.d.ts +0 -110
  419. package/dist/tools/rc.js +0 -437
  420. package/dist/tools/visual.d.ts +0 -40
  421. package/dist/tools/visual.js +0 -282
  422. package/dist/utils/http.d.ts +0 -6
  423. package/dist/utils/http.js +0 -151
  424. package/dist/utils/python-output.d.ts +0 -18
  425. package/dist/utils/python-output.js +0 -290
  426. package/dist/utils/python.d.ts +0 -2
  427. package/dist/utils/python.js +0 -4
  428. package/dist/utils/stdio-redirect.d.ts +0 -2
  429. package/dist/utils/stdio-redirect.js +0 -20
  430. package/docs/unreal-tool-test-cases.md +0 -574
  431. package/smithery.yaml +0 -29
  432. package/src/tools/build_environment_advanced.ts +0 -732
  433. package/src/tools/rc.ts +0 -515
  434. package/src/tools/visual.ts +0 -281
  435. package/src/utils/http.ts +0 -187
  436. package/src/utils/python-output.ts +0 -351
  437. package/src/utils/python.ts +0 -3
  438. 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
+ };