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
@@ -1,672 +1,1018 @@
1
- // Consolidated tool definitions - reduced from 36 to 13 multi-purpose tools
1
+ import { commonSchemas } from './tool-definition-utils.js';
2
+ // Force rebuild timestamp update
2
3
 
3
4
  export const consolidatedToolDefinitions = [
4
- // 1. ASSET MANAGER - Combines asset operations
5
+ // 1. ASSET MANAGER
5
6
  {
6
7
  name: 'manage_asset',
7
- description: `Asset library utility for browsing, importing, and bootstrapping simple materials.
8
+ description: `Comprehensive asset management suite. Handles import/export, basic file operations, dependency analysis, source control, and specialized graph editing (Materials, Behavior Trees).
8
9
 
9
10
  Use it when you need to:
10
- - explore project content (\u002fContent automatically maps to \u002fGame).
11
- - import FBX/PNG/WAV/EXR files into the project.
12
- - spin up a minimal Material asset at a specific path.
11
+ - manage asset lifecycle (import, duplicate, rename, delete).
12
+ - organize project structure (folders, redirects).
13
+ - analyze dependencies or fix reference issues.
14
+ - edit Material graphs or Behavior Trees.
15
+ - generate basic assets like Materials, Textures, or Blueprints (via asset creation).
13
16
 
14
- Supported actions: list, import, create_material.`,
17
+ Supported actions:
18
+ - Core: list, import, duplicate, rename, move, delete, delete_assets, create_folder, search_assets.
19
+ - Utils: get_dependencies, get_source_control_state, analyze_graph, create_thumbnail, set_tags, get_metadata, set_metadata, validate, fixup_redirectors, find_by_tag, generate_report.
20
+ - Creation: create_material, create_material_instance, create_render_target.
21
+ - Rendering: nanite_rebuild_mesh.
22
+ - Material Graph: add_material_node, connect_material_pins, remove_material_node, break_material_connections, get_material_node_details.
23
+ - Behavior Tree: add_bt_node, connect_bt_nodes, remove_bt_node, break_bt_connections, set_bt_node_properties.`,
15
24
  inputSchema: {
16
25
  type: 'object',
17
26
  properties: {
18
- action: {
19
- type: 'string',
20
- enum: ['list', 'import', 'create_material'],
27
+ action: {
28
+ type: 'string',
29
+ enum: [
30
+ // Core
31
+ 'list', 'import', 'duplicate', 'rename', 'move', 'delete', 'delete_asset', 'delete_assets', 'create_folder', 'search_assets',
32
+ // Utils
33
+ 'get_dependencies', 'get_source_control_state', 'analyze_graph', 'get_asset_graph', 'create_thumbnail', 'set_tags', 'get_metadata', 'set_metadata', 'validate', 'fixup_redirectors', 'find_by_tag', 'generate_report',
34
+ // Creation
35
+ 'create_material', 'create_material_instance', 'create_render_target', 'generate_lods', 'add_material_parameter', 'list_instances', 'reset_instance_parameters', 'exists', 'get_material_stats',
36
+ // Rendering
37
+ 'nanite_rebuild_mesh',
38
+ // Material Graph
39
+ 'add_material_node', 'connect_material_pins', 'remove_material_node', 'break_material_connections', 'get_material_node_details', 'rebuild_material'
40
+ ],
21
41
  description: 'Action to perform'
22
42
  },
23
- // For list
24
- directory: { type: 'string', description: 'Directory path to list (shows immediate children only). Automatically maps /Content to /Game. Example: "/Game/MyAssets"' },
25
- // For import
26
- sourcePath: { type: 'string', description: 'Source file path on disk to import (FBX, PNG, WAV, EXR supported). Example: "C:/MyAssets/mesh.fbx"' },
27
- destinationPath: { type: 'string', description: 'Destination path in project content where asset will be imported. Example: "/Game/ImportedAssets"' },
28
- // For create_material
29
- name: { type: 'string', description: 'Name for the new material asset. Example: "MyMaterial"' },
30
- path: { type: 'string', description: 'Content path where material will be saved. Example: "/Game/Materials"' }
43
+ // -- Common --
44
+ assetPath: { type: 'string', description: 'Target asset path (e.g., "/Game/MyAsset").' },
45
+
46
+ // -- List/Search --
47
+ directory: { type: 'string', description: 'Directory path to list.' },
48
+ classNames: { type: 'array', items: { type: 'string' }, description: 'Class names filter.' },
49
+ packagePaths: { type: 'array', items: { type: 'string' }, description: 'Package paths to search.' },
50
+ recursivePaths: { type: 'boolean' },
51
+ recursiveClasses: { type: 'boolean' },
52
+ limit: { type: 'number' },
53
+
54
+ // -- Import --
55
+ sourcePath: { type: 'string', description: 'Source file path on disk.' },
56
+ destinationPath: { type: 'string', description: 'Destination content path.' },
57
+
58
+ // -- Operations --
59
+ assetPaths: { type: 'array', items: { type: 'string' }, description: 'Batch asset paths.' },
60
+ lodCount: { type: 'number', description: 'Number of LODs to generate.' },
61
+ reductionSettings: { type: 'object', description: 'LOD reduction settings.' },
62
+ nodeName: { type: 'string', description: 'Variable name or Function name, depending on node type' },
63
+ eventName: { type: 'string', description: 'For Event nodes (e.g. ReceiveBeginPlay) or CustomEvent nodes' },
64
+ memberClass: { type: 'string', description: 'For Event nodes, the class defining the event (optional)' },
65
+ posX: { type: 'number' },
66
+ newName: { type: 'string', description: 'New name for rename/duplicate.' },
67
+ overwrite: { type: 'boolean' },
68
+ save: { type: 'boolean' },
69
+ fixupRedirectors: { type: 'boolean' },
70
+ directoryPath: { type: 'string' },
71
+
72
+ // -- Material/Instance Creation --
73
+ name: { type: 'string', description: 'Name of new asset.' },
74
+ path: { type: 'string', description: 'Directory to create asset in.' },
75
+ parentMaterial: { type: 'string', description: 'Parent material for instances.' },
76
+ parameters: { type: 'object', description: 'Material instance parameters.' },
77
+
78
+ // -- Render Target --
79
+ width: { type: 'number' },
80
+ height: { type: 'number' },
81
+ format: { type: 'string' },
82
+
83
+ // -- Nanite --
84
+ meshPath: { type: 'string' },
85
+
86
+ // -- Metadata/Tags --
87
+ tag: { type: 'string' },
88
+ metadata: { type: 'object' },
89
+
90
+ // -- Graph Editing (Material/BT) --
91
+ graphName: { type: 'string' },
92
+ nodeType: { type: 'string' },
93
+ nodeId: { type: 'string' },
94
+ fromNodeId: { type: 'string' },
95
+ fromPin: { type: 'string' },
96
+ toNodeId: { type: 'string' },
97
+ toPin: { type: 'string' },
98
+ parameterName: { type: 'string' },
99
+ value: { description: 'Property value (number, string, etc).' },
100
+ x: { type: 'number' },
101
+ y: { type: 'number' },
102
+ comment: { type: 'string' },
103
+ parentNodeId: { type: 'string' },
104
+ childNodeId: { type: 'string' },
105
+
106
+ // -- Analyze --
107
+ maxDepth: { type: 'number' }
31
108
  },
32
109
  required: ['action']
33
110
  },
34
111
  outputSchema: {
35
112
  type: 'object',
36
113
  properties: {
37
- success: { type: 'boolean', description: 'Whether the operation succeeded' },
38
- assets: {
39
- type: 'array',
40
- description: 'List of assets (for list action)',
41
- items: {
42
- type: 'object',
43
- properties: {
44
- Name: { type: 'string' },
45
- Path: { type: 'string' },
46
- Class: { type: 'string' },
47
- PackagePath: { type: 'string' }
48
- }
49
- }
50
- },
51
- paths: { type: 'array', items: { type: 'string' }, description: 'Imported asset paths (for import)' },
52
- materialPath: { type: 'string', description: 'Created material path (for create_material)' },
53
- message: { type: 'string', description: 'Status message' },
54
- error: { type: 'string', description: 'Error message if failed' }
114
+ success: { type: 'boolean' },
115
+ message: { type: 'string' },
116
+ assets: { type: 'array', items: { type: 'object' } },
117
+ paths: { type: 'array', items: { type: 'string' } },
118
+ path: { type: 'string' },
119
+ error: { type: 'string' },
120
+ // Graph results
121
+ nodeId: { type: 'string' },
122
+ details: { type: 'object' }
55
123
  }
56
124
  }
57
125
  },
58
126
 
59
- // 2. ACTOR CONTROL - Combines actor operations
127
+ // 2. BLUEPRINT MANAGER
60
128
  {
61
- name: 'control_actor',
62
- description: `Viewport actor toolkit for spawning, removing, or nudging actors with physics forces.
129
+ name: 'manage_blueprint',
130
+ description: `Blueprint authoring and editing tool.
63
131
 
64
132
  Use it when you need to:
65
- - drop a class or mesh into the level (classPath accepts names or asset paths).
66
- - delete actors by label, case-insensitively.
67
- - push a physics-enabled actor with a world-space force vector.
133
+ - create new Blueprints.
134
+ - inspect existing Blueprints (get_blueprint).
135
+ - modify the component hierarchy (SCS).
136
+ - edit the Blueprint graph (nodes, pins, properties).
68
137
 
69
- Supported actions: spawn, delete, apply_force.`,
138
+ Supported actions:
139
+ - Lifecycle: create, get_blueprint.
140
+ - Components (SCS): add_component, set_default, modify_scs, get_scs, add_scs_component, remove_scs_component, reparent_scs_component, set_scs_transform, set_scs_property.
141
+ - Helpers: ensure_exists, probe_handle, add_variable, add_function, add_event, add_construction_script, set_variable_metadata, set_metadata.
142
+ - Graph: create_node, delete_node, connect_pins, break_pin_links, set_node_property, create_reroute_node, get_node_details, get_graph_details, get_pin_details.`,
70
143
  inputSchema: {
71
144
  type: 'object',
72
145
  properties: {
73
- action: {
74
- type: 'string',
75
- enum: ['spawn', 'delete', 'apply_force'],
76
- description: 'Action to perform'
77
- },
78
- // Common
79
- actorName: { type: 'string', description: 'Actor label/name (optional for spawn, auto-generated if not provided; required for delete). Case-insensitive for delete action.' },
80
- classPath: {
81
- type: 'string',
82
- description: 'Actor class (e.g., "StaticMeshActor", "CameraActor") OR asset path (e.g., "/Engine/BasicShapes/Cube", "/Game/MyMesh"). Asset paths will automatically spawn as StaticMeshActor with the mesh applied. Required for spawn action.'
83
- },
84
- // Transform
85
- location: {
86
- type: 'object',
87
- description: 'World space location in centimeters (Unreal units). Optional for spawn, defaults to origin.',
88
- properties: {
89
- x: { type: 'number', description: 'X coordinate (forward axis in Unreal)' },
90
- y: { type: 'number', description: 'Y coordinate (right axis in Unreal)' },
91
- z: { type: 'number', description: 'Z coordinate (up axis in Unreal)' }
92
- }
93
- },
94
- rotation: {
95
- type: 'object',
96
- description: 'World space rotation in degrees. Optional for spawn, defaults to zero rotation.',
97
- properties: {
98
- pitch: { type: 'number', description: 'Pitch rotation in degrees (Y-axis rotation)' },
99
- yaw: { type: 'number', description: 'Yaw rotation in degrees (Z-axis rotation)' },
100
- roll: { type: 'number', description: 'Roll rotation in degrees (X-axis rotation)' }
101
- }
146
+ action: {
147
+ type: 'string',
148
+ enum: [
149
+ // Lifecycle
150
+ 'create', 'get_blueprint', 'get', 'compile',
151
+ // SCS
152
+ 'add_component', 'set_default', 'modify_scs', 'get_scs', 'add_scs_component', 'remove_scs_component', 'reparent_scs_component', 'set_scs_transform', 'set_scs_property',
153
+ // Helpers
154
+ 'ensure_exists', 'probe_handle', 'add_variable', 'remove_variable', 'rename_variable', 'add_function', 'add_event', 'remove_event', 'add_construction_script', 'set_variable_metadata', 'set_metadata',
155
+ // Graph
156
+ 'create_node', 'add_node', 'delete_node', 'connect_pins', 'break_pin_links', 'set_node_property', 'create_reroute_node', 'get_node_details', 'get_graph_details', 'get_pin_details'
157
+ ],
158
+ description: 'Blueprint action'
102
159
  },
103
- // Physics
104
- force: {
105
- type: 'object',
106
- description: 'Force vector to apply in Newtons. Required for apply_force action. Actor must have physics simulation enabled.',
107
- properties: {
108
- x: { type: 'number', description: 'Force magnitude along X-axis' },
109
- y: { type: 'number', description: 'Force magnitude along Y-axis' },
110
- z: { type: 'number', description: 'Force magnitude along Z-axis' }
111
- }
112
- }
160
+ // -- Identifiers --
161
+ name: { type: 'string', description: 'Blueprint name.' },
162
+ blueprintPath: { type: 'string', description: 'Blueprint asset path.' },
163
+
164
+ // -- Create --
165
+ blueprintType: { type: 'string', description: 'Parent class (e.g., Actor).' },
166
+ savePath: { type: 'string' },
167
+
168
+ // -- Components --
169
+ componentType: { type: 'string' },
170
+ componentName: { type: 'string' },
171
+ componentClass: { type: 'string' },
172
+ attachTo: { type: 'string' },
173
+ newParent: { type: 'string' },
174
+
175
+ // -- Properties/Defaults --
176
+ propertyName: { type: 'string' },
177
+ variableName: { type: 'string', description: 'Name of the variable.' },
178
+ oldName: { type: 'string' },
179
+ newName: { type: 'string' },
180
+ value: { description: 'Value to set.' },
181
+ metadata: { type: 'object' },
182
+ properties: { type: 'object', description: 'Initial CDO properties for new blueprints.' },
183
+
184
+ // -- Graph Editing --
185
+ graphName: { type: 'string' },
186
+ nodeType: { type: 'string' },
187
+ nodeId: { type: 'string' },
188
+ pinName: { type: 'string' },
189
+ linkedTo: { type: 'string' },
190
+ memberName: { type: 'string' },
191
+ x: { type: 'number' },
192
+ y: { type: 'number' },
193
+
194
+ // -- SCS Transform --
195
+ location: { type: 'array', items: { type: 'number' } },
196
+ rotation: { type: 'array', items: { type: 'number' } },
197
+ scale: { type: 'array', items: { type: 'number' } },
198
+
199
+ // -- Batch Operations --
200
+ operations: { type: 'array', items: { type: 'object' } },
201
+ compile: { type: 'boolean' },
202
+ save: { type: 'boolean' },
203
+
204
+ // -- Events --
205
+ eventType: { type: 'string', description: 'Event type (e.g. "BeginPlay", "Tick", "custom").' },
206
+ customEventName: { type: 'string', description: 'Name for custom event.' },
207
+ parameters: { type: 'array', items: { type: 'object' }, description: 'Parameters for the event.' }
113
208
  },
114
209
  required: ['action']
115
210
  },
116
211
  outputSchema: {
117
212
  type: 'object',
118
213
  properties: {
119
- success: { type: 'boolean', description: 'Whether the operation succeeded' },
120
- actor: { type: 'string', description: 'Spawned actor name (for spawn)' },
121
- deleted: { type: 'string', description: 'Deleted actor name (for delete)' },
122
- physicsEnabled: { type: 'boolean', description: 'Physics state (for apply_force)' },
123
- message: { type: 'string', description: 'Status message' },
124
- error: { type: 'string', description: 'Error message if failed' }
214
+ success: { type: 'boolean' },
215
+ blueprintPath: { type: 'string' },
216
+ message: { type: 'string' },
217
+ error: { type: 'string' },
218
+ // Snapshot data
219
+ blueprint: { type: 'object' }
125
220
  }
126
221
  }
127
222
  },
128
223
 
129
- // 3. EDITOR CONTROL - Combines editor operations
224
+ // 3. ACTOR CONTROL
130
225
  {
131
- name: 'control_editor',
132
- description: `Editor session controls for PIE playback, camera placement, and view modes.
226
+ name: 'control_actor',
227
+ description: `Viewport actor manipulation.
133
228
 
134
229
  Use it when you need to:
135
- - start or stop Play In Editor.
136
- - reposition the active viewport camera.
137
- - switch between Lit/Unlit/Wireframe and other safe view modes.
230
+ - spawn, destroy, or duplicate actors.
231
+ - move/rotate/scale actors.
232
+ - modify actor components or tags.
233
+ - apply physics forces.
138
234
 
139
- Supported actions: play, stop, set_camera, set_view_mode (with validation).`,
235
+ Supported actions: spawn, spawn_blueprint, delete, delete_by_tag, duplicate, apply_force, set_transform, get_transform, set_visibility, add_component, set_component_properties, get_components, add_tag, remove_tag, find_by_tag, find_by_name, list, set_blueprint_variables, create_snapshot, attach, detach.`,
140
236
  inputSchema: {
141
237
  type: 'object',
142
238
  properties: {
143
- action: {
144
- type: 'string',
145
- enum: ['play', 'stop', 'set_camera', 'set_view_mode'],
146
- description: 'Editor action'
147
- },
148
- // Camera
149
- location: {
150
- type: 'object',
151
- description: 'World space camera location for set_camera action. All coordinates required.',
152
- properties: {
153
- x: { type: 'number', description: 'X coordinate in centimeters' },
154
- y: { type: 'number', description: 'Y coordinate in centimeters' },
155
- z: { type: 'number', description: 'Z coordinate in centimeters' }
156
- }
157
- },
158
- rotation: {
159
- type: 'object',
160
- description: 'Camera rotation for set_camera action. All rotation components required.',
161
- properties: {
162
- pitch: { type: 'number', description: 'Pitch in degrees' },
163
- yaw: { type: 'number', description: 'Yaw in degrees' },
164
- roll: { type: 'number', description: 'Roll in degrees' }
165
- }
239
+ action: {
240
+ type: 'string',
241
+ enum: [
242
+ 'spawn', 'spawn_blueprint', 'delete', 'delete_by_tag', 'duplicate',
243
+ 'apply_force', 'set_transform', 'get_transform', 'set_visibility',
244
+ 'add_component', 'set_component_properties', 'get_components',
245
+ 'add_tag', 'remove_tag', 'find_by_tag', 'find_by_name', 'list', 'set_blueprint_variables',
246
+ 'create_snapshot', 'attach', 'detach'
247
+ ],
248
+ description: 'Action to perform'
166
249
  },
167
- // View mode
168
- viewMode: {
169
- type: 'string',
170
- description: 'View mode for set_view_mode action. Supported: Lit, Unlit, Wireframe, DetailLighting, LightingOnly, LightComplexity, ShaderComplexity. Required for set_view_mode.'
171
- }
250
+ actorName: { type: 'string' },
251
+ childActor: { type: 'string', description: 'Name of the child actor (alias for actorName in detach, or specific child for attach).' },
252
+ parentActor: { type: 'string' },
253
+ classPath: { type: 'string' },
254
+ meshPath: { type: 'string' },
255
+ blueprintPath: { type: 'string' },
256
+ location: commonSchemas.location,
257
+ rotation: commonSchemas.rotation,
258
+ scale: commonSchemas.scale,
259
+ force: commonSchemas.vector3,
260
+ componentType: { type: 'string' },
261
+ componentName: { type: 'string' },
262
+ properties: { type: 'object' },
263
+ visible: { type: 'boolean' },
264
+ newName: { type: 'string' },
265
+ tag: { type: 'string' },
266
+ variables: { type: 'object' },
267
+ snapshotName: { type: 'string' }
172
268
  },
173
269
  required: ['action']
174
270
  },
175
271
  outputSchema: {
176
272
  type: 'object',
177
273
  properties: {
178
- success: { type: 'boolean', description: 'Whether the operation succeeded' },
179
- playing: { type: 'boolean', description: 'PIE play state' },
180
- location: {
181
- type: 'array',
182
- items: { type: 'number' },
183
- description: 'Camera location [x, y, z]'
184
- },
185
- rotation: {
186
- type: 'array',
187
- items: { type: 'number' },
188
- description: 'Camera rotation [pitch, yaw, roll]'
274
+ success: { type: 'boolean' },
275
+ actor: { type: 'string' },
276
+ actorPath: { type: 'string' },
277
+ message: { type: 'string' },
278
+ components: {
279
+ type: 'array',
280
+ items: {
281
+ type: 'object',
282
+ properties: {
283
+ name: { type: 'string' },
284
+ class: { type: 'string' },
285
+ relativeLocation: { type: 'object', properties: { x: { type: 'number' }, y: { type: 'number' }, z: { type: 'number' } } },
286
+ relativeRotation: { type: 'object', properties: { pitch: { type: 'number' }, yaw: { type: 'number' }, roll: { type: 'number' } } },
287
+ relativeScale: { type: 'object', properties: { x: { type: 'number' }, y: { type: 'number' }, z: { type: 'number' } } }
288
+ }
289
+ }
189
290
  },
190
- viewMode: { type: 'string', description: 'Current view mode' },
191
- message: { type: 'string', description: 'Status message' }
291
+ data: { type: 'object' }
192
292
  }
193
293
  }
194
294
  },
195
295
 
196
- // 4. LEVEL MANAGER - Combines level and lighting operations
296
+ // 4. EDITOR CONTROL
197
297
  {
198
- name: 'manage_level',
199
- description: `Level management helper for loading/saving, streaming, light creation, and lighting builds.
298
+ name: 'control_editor',
299
+ description: `Editor session control.
200
300
 
201
301
  Use it when you need to:
202
- - open or save a level by path.
203
- - toggle streaming sublevels on/off.
204
- - spawn a light actor of a given type.
205
- - kick off a lighting build at a chosen quality.
302
+ - control PIE (Play In Editor).
303
+ - move the viewport camera.
304
+ - execute console commands (legacy).
305
+ - take screenshots/bookmarks.
306
+ - simulate input (UI).
206
307
 
207
- Supported actions: load, save, stream, create_light, build_lighting.`,
308
+ Supported actions: play, stop, stop_pie, pause, resume, set_game_speed, eject, possess, set_camera, set_camera_position, set_camera_fov, set_view_mode, set_viewport_resolution, console_command, screenshot, step_frame, start_recording, stop_recording, create_bookmark, jump_to_bookmark, set_preferences, set_viewport_realtime, open_asset, simulate_input.`,
208
309
  inputSchema: {
209
310
  type: 'object',
210
311
  properties: {
211
- action: {
212
- type: 'string',
213
- enum: ['load', 'save', 'stream', 'create_light', 'build_lighting'],
214
- description: 'Level action'
215
- },
216
- // Level
217
- levelPath: { type: 'string', description: 'Full content path to level asset (e.g., "/Game/Maps/MyLevel"). Required for load action.' },
218
- levelName: { type: 'string', description: 'Level name for streaming operations. Required for stream action.' },
219
- streaming: { type: 'boolean', description: 'Whether to use streaming load (true) or direct load (false). Optional for load action.' },
220
- shouldBeLoaded: { type: 'boolean', description: 'Whether to load (true) or unload (false) the streaming level. Required for stream action.' },
221
- shouldBeVisible: { type: 'boolean', description: 'Whether the streaming level should be visible after loading. Optional for stream action.' },
222
- // Lighting
223
- lightType: {
224
- type: 'string',
225
- enum: ['Directional', 'Point', 'Spot', 'Rect'],
226
- description: 'Type of light to create. Directional for sun-like lighting, Point for omni-directional, Spot for cone-shaped, Rect for area lighting. Required for create_light.'
227
- },
228
- name: { type: 'string', description: 'Name for the spawned light actor. Optional, auto-generated if not provided.' },
229
- location: {
230
- type: 'object',
231
- description: 'World space location for light placement in centimeters. Optional for create_light, defaults to origin.',
232
- properties: {
233
- x: { type: 'number', description: 'X coordinate' },
234
- y: { type: 'number', description: 'Y coordinate' },
235
- z: { type: 'number', description: 'Z coordinate' }
236
- }
237
- },
238
- intensity: { type: 'number', description: 'Light intensity value in lumens (for Point/Spot) or lux (for Directional). Typical range: 1000-10000. Optional for create_light.' },
239
- quality: {
312
+ action: {
240
313
  type: 'string',
241
- enum: ['Preview', 'Medium', 'High', 'Production'],
242
- description: 'Lighting build quality level. Preview is fastest, Production is highest quality. Required for build_lighting action.'
243
- }
314
+ enum: [
315
+ 'play', 'stop', 'stop_pie', 'pause', 'resume', 'set_game_speed', 'eject', 'possess',
316
+ 'set_camera', 'set_camera_position', 'set_camera_fov', 'set_view_mode',
317
+ 'set_viewport_resolution', 'console_command', 'execute_command', 'screenshot', 'step_frame',
318
+ 'start_recording', 'stop_recording', 'create_bookmark', 'jump_to_bookmark',
319
+ 'set_preferences', 'set_viewport_realtime', 'open_asset', 'simulate_input'
320
+ ],
321
+ description: 'Editor action'
322
+ },
323
+ location: commonSchemas.location,
324
+ rotation: commonSchemas.rotation,
325
+ viewMode: { type: 'string' },
326
+ enabled: { type: 'boolean', description: 'For set_viewport_realtime.' },
327
+ speed: { type: 'number' },
328
+ filename: { type: 'string' },
329
+ fov: { type: 'number' },
330
+ width: { type: 'number' },
331
+ height: { type: 'number' },
332
+ command: { type: 'string' },
333
+ steps: { type: 'integer' },
334
+ bookmarkName: { type: 'string' },
335
+ assetPath: { type: 'string' },
336
+ // Simulate Input
337
+ keyName: { type: 'string' },
338
+ eventType: { type: 'string', enum: ['KeyDown', 'KeyUp', 'Both'] }
244
339
  },
245
340
  required: ['action']
246
341
  },
247
342
  outputSchema: {
248
343
  type: 'object',
249
344
  properties: {
250
- success: { type: 'boolean', description: 'Whether the operation succeeded' },
251
- levelName: { type: 'string', description: 'Level name' },
252
- loaded: { type: 'boolean', description: 'Level loaded state' },
253
- visible: { type: 'boolean', description: 'Level visibility' },
254
- lightName: { type: 'string', description: 'Created light name' },
255
- buildQuality: { type: 'string', description: 'Lighting build quality used' },
256
- message: { type: 'string', description: 'Status message' }
345
+ success: { type: 'boolean' },
346
+ message: { type: 'string' }
257
347
  }
258
348
  }
259
349
  },
260
350
 
261
- // 5. ANIMATION SYSTEM - Combines animation and physics setup
351
+ // 5. LEVEL MANAGER
262
352
  {
263
- name: 'animation_physics',
264
- description: `Animation and physics rigging helper covering Anim BPs, montage playback, and ragdoll setup.
353
+ name: 'manage_level',
354
+ description: `Level and World Partition management.
265
355
 
266
356
  Use it when you need to:
267
- - generate an Animation Blueprint for a skeleton.
268
- - play a montage/animation on an actor at a chosen rate.
269
- - enable a quick ragdoll using an existing physics asset.
357
+ - load/save levels.
358
+ - manage streaming levels.
359
+ - build lighting.
360
+ - load world partition cells or toggle data layers.
270
361
 
271
- Supported actions: create_animation_bp, play_montage, setup_ragdoll.`,
362
+ Supported actions: load, save, stream, create_level, create_light, build_lighting, set_metadata, load_cells, set_datalayer, export_level, import_level, list_levels, get_summary, delete, validate_level.`,
272
363
  inputSchema: {
273
364
  type: 'object',
274
365
  properties: {
275
- action: {
276
- type: 'string',
277
- enum: ['create_animation_bp', 'play_montage', 'setup_ragdoll'],
278
- description: 'Action type'
366
+ action: {
367
+ type: 'string',
368
+ enum: [
369
+ 'load', 'save', 'save_as', 'save_level_as', 'stream', 'create_level', 'create_light', 'build_lighting',
370
+ 'set_metadata', 'load_cells', 'set_datalayer',
371
+ 'export_level', 'import_level', 'list_levels', 'get_summary', 'delete', 'validate_level',
372
+ 'cleanup_invalid_datalayers', 'add_sublevel'
373
+ ],
374
+ description: 'Action'
279
375
  },
280
- // Common
281
- name: { type: 'string', description: 'Name for the created animation blueprint asset. Required for create_animation_bp action.' },
282
- actorName: { type: 'string', description: 'Actor label/name in the level to apply animation to. Required for play_montage and setup_ragdoll actions.' },
283
- // Animation
284
- skeletonPath: { type: 'string', description: 'Content path to skeleton asset (e.g., "/Game/Characters/MySkeleton"). Required for create_animation_bp action.' },
285
- montagePath: { type: 'string', description: 'Content path to animation montage asset to play. Required for play_montage if animationPath not provided.' },
286
- animationPath: { type: 'string', description: 'Content path to animation sequence asset to play. Alternative to montagePath for play_montage action.' },
287
- playRate: { type: 'number', description: 'Animation playback speed multiplier. 1.0 is normal speed, 2.0 is double speed, 0.5 is half speed. Optional, defaults to 1.0.' },
288
- // Physics
289
- physicsAssetName: { type: 'string', description: 'Name or path to physics asset for ragdoll simulation. Required for setup_ragdoll action.' },
290
- blendWeight: { type: 'number', description: 'Blend weight between animated and ragdoll physics (0.0 to 1.0). 0.0 is fully animated, 1.0 is fully ragdoll. Optional, defaults to 1.0.' },
291
- savePath: { type: 'string', description: 'Content path where animation blueprint will be saved (e.g., "/Game/Animations"). Required for create_animation_bp action.' }
376
+ levelPath: { type: 'string', description: 'Required for load/save actions and get_summary.' },
377
+ levelName: { type: 'string' },
378
+ streaming: { type: 'boolean' },
379
+ shouldBeLoaded: { type: 'boolean' },
380
+ shouldBeVisible: { type: 'boolean' },
381
+ // Lighting
382
+ lightType: { type: 'string', enum: ['Directional', 'Point', 'Spot', 'Rect'] },
383
+ location: commonSchemas.location,
384
+ intensity: { type: 'number' },
385
+ quality: { type: 'string' },
386
+ // World Partition
387
+ min: { type: 'array', items: { type: 'number' } },
388
+ max: { type: 'array', items: { type: 'number' } },
389
+ dataLayerLabel: { type: 'string' },
390
+ dataLayerState: { type: 'string' },
391
+ recursive: { type: 'boolean' },
392
+ // Export/Import
393
+ exportPath: { type: 'string' },
394
+ packagePath: { type: 'string' },
395
+ destinationPath: { type: 'string' },
396
+ note: { type: 'string' },
397
+ // Delete
398
+ levelPaths: { type: 'array', items: { type: 'string' } },
399
+ // Sublevel
400
+ subLevelPath: { type: 'string' },
401
+ parentLevel: { type: 'string' },
402
+ streamingMethod: { type: 'string', enum: ['Blueprint', 'AlwaysLoaded'] }
292
403
  },
293
404
  required: ['action']
294
405
  },
295
406
  outputSchema: {
296
407
  type: 'object',
297
408
  properties: {
298
- success: { type: 'boolean', description: 'Whether the operation succeeded' },
299
- blueprintPath: { type: 'string', description: 'Created animation blueprint path' },
300
- playing: { type: 'boolean', description: 'Montage playing state' },
301
- playRate: { type: 'number', description: 'Current play rate' },
302
- ragdollActive: { type: 'boolean', description: 'Ragdoll activation state' },
303
- message: { type: 'string', description: 'Status message' }
409
+ success: { type: 'boolean' },
410
+ message: { type: 'string' },
411
+ data: { type: 'object' }
304
412
  }
305
413
  }
306
414
  },
307
415
 
308
- // 6. EFFECTS SYSTEM - Combines particles and visual effects
416
+ // 6. ANIMATION & PHYSICS
309
417
  {
310
- name: 'create_effect',
311
- description: `FX sandbox for spawning Niagara systems, particle presets, or disposable debug shapes.
418
+ name: 'animation_physics',
419
+ description: `Animation and Physics tools.
312
420
 
313
421
  Use it when you need to:
314
- - fire a Niagara system at a specific location/scale.
315
- - trigger a simple particle effect by tag/name.
316
- - draw temporary debug primitives (box/sphere/line) for planning layouts.
422
+ - create Animation Blueprints, Montages, or Blend Spaces.
423
+ - setup Ragdolls or Physics Assets.
424
+ - configure vehicles.
317
425
 
318
- Supported actions: niagara, particle, debug_shape.`,
426
+ Supported actions: create_animation_bp, play_montage, setup_ragdoll, configure_vehicle, create_blend_space, create_state_machine, setup_ik, create_procedural_anim, create_blend_tree, setup_retargeting, setup_physics_simulation, cleanup.`,
319
427
  inputSchema: {
320
428
  type: 'object',
321
429
  properties: {
322
- action: {
323
- type: 'string',
324
- enum: ['particle', 'niagara', 'debug_shape'],
325
- description: 'Effect type'
326
- },
327
- // Common
328
- name: { type: 'string', description: 'Name for the spawned effect actor. Optional, auto-generated if not provided.' },
329
- location: {
330
- type: 'object',
331
- description: 'World space location where effect will be spawned in centimeters. Optional, defaults to origin.',
332
- properties: {
333
- x: { type: 'number', description: 'X coordinate' },
334
- y: { type: 'number', description: 'Y coordinate' },
335
- z: { type: 'number', description: 'Z coordinate' }
336
- }
337
- },
338
- // Particles
339
- effectType: {
340
- type: 'string',
341
- description: 'Preset particle effect type (Fire, Smoke, Water, Explosion, etc.). Used for particle action to spawn common effects.'
342
- },
343
- systemPath: { type: 'string', description: 'Content path to Niagara system asset (e.g., "/Game/Effects/MyNiagaraSystem"). Required for niagara action.' },
344
- scale: { type: 'number', description: 'Uniform scale multiplier for Niagara effect. 1.0 is normal size. Optional, defaults to 1.0.' },
345
- // Debug
346
- shape: {
430
+ action: {
347
431
  type: 'string',
348
- description: 'Debug shape type to draw (Line, Box, Sphere, Capsule, Cone, Cylinder, Arrow). Required for debug_shape action.'
349
- },
350
- size: { type: 'number', description: 'Size/radius of debug shape in centimeters. For Line, this is thickness. For shapes, this is radius/extent. Optional, defaults vary by shape.' },
351
- color: {
352
- type: 'array',
353
- items: { type: 'number' },
354
- description: 'RGBA color array with values 0-255 (e.g., [255, 0, 0, 255] for red). Optional, defaults to white.'
432
+ enum: [
433
+ 'create_animation_bp', 'play_montage', 'setup_ragdoll', 'activate_ragdoll', 'configure_vehicle',
434
+ 'create_blend_space', 'create_state_machine', 'setup_ik', 'create_procedural_anim',
435
+ 'create_blend_tree', 'setup_retargeting', 'setup_physics_simulation', 'cleanup',
436
+ 'create_animation_asset', 'add_notify'
437
+ ],
438
+ description: 'Action'
355
439
  },
356
- duration: { type: 'number', description: 'How long debug shape persists in seconds. 0 means one frame, -1 means permanent until cleared. Optional, defaults to 0.' }
440
+ name: { type: 'string' },
441
+ actorName: { type: 'string' },
442
+ skeletonPath: { type: 'string' },
443
+ montagePath: { type: 'string' },
444
+ animationPath: { type: 'string' },
445
+ playRate: { type: 'number' },
446
+ physicsAssetName: { type: 'string' },
447
+ meshPath: { type: 'string' },
448
+ vehicleName: { type: 'string' },
449
+ vehicleType: { type: 'string' },
450
+ // ... (omitting detailed vehicle/IK schema for brevity, keeping core structure)
451
+ savePath: { type: 'string' }
357
452
  },
358
453
  required: ['action']
359
454
  },
360
455
  outputSchema: {
361
456
  type: 'object',
362
457
  properties: {
363
- success: { type: 'boolean', description: 'Whether the operation succeeded' },
364
- effectName: { type: 'string', description: 'Created effect name' },
365
- effectPath: { type: 'string', description: 'Effect asset path' },
366
- spawned: { type: 'boolean', description: 'Whether effect was spawned in level' },
367
- location: {
368
- type: 'array',
369
- items: { type: 'number' },
370
- description: 'Effect location [x, y, z]'
371
- },
372
- message: { type: 'string', description: 'Status message' }
458
+ success: { type: 'boolean' },
459
+ message: { type: 'string' }
373
460
  }
374
461
  }
375
462
  },
376
463
 
377
- // 7. BLUEPRINT MANAGER - Blueprint operations
464
+ // 7. EFFECTS MANAGER (Niagara & Particles)
378
465
  {
379
- name: 'manage_blueprint',
380
- description: `Blueprint scaffolding helper for creating assets and attaching components.
466
+ name: 'manage_effect',
467
+ description: `Effects management (Niagara, Particles, Debug Shapes).
381
468
 
382
469
  Use it when you need to:
383
- - create a new Blueprint of a specific base type (Actor, Pawn, Character, ...).
384
- - add a component to an existing Blueprint asset with a unique name.
470
+ - spawn effects or debug shapes.
471
+ - create/edit Niagara systems and emitters.
472
+ - edit Niagara graphs (modules, pins).
385
473
 
386
- Supported actions: create, add_component.`,
474
+ Supported actions:
475
+ - Spawning: particle, niagara, debug_shape, spawn_niagara, create_dynamic_light.
476
+ - Asset Creation: create_niagara_system, create_niagara_emitter.
477
+ - Graph: add_niagara_module, connect_niagara_pins, remove_niagara_node, set_niagara_parameter.
478
+ - Utils: clear_debug_shapes, cleanup.`,
387
479
  inputSchema: {
388
480
  type: 'object',
389
481
  properties: {
390
- action: {
391
- type: 'string',
392
- enum: ['create', 'add_component'],
393
- description: 'Blueprint action'
394
- },
395
- name: { type: 'string', description: 'Name for the blueprint asset. Required for create action. For add_component, this is the blueprint asset name or path.' },
396
- blueprintType: {
482
+ action: {
397
483
  type: 'string',
398
- description: 'Base class type for blueprint (Actor, Pawn, Character, Object, ActorComponent, SceneComponent, etc.). Required for create action.'
484
+ enum: [
485
+ 'particle', 'niagara', 'debug_shape', 'spawn_niagara', 'create_dynamic_light',
486
+ 'create_niagara_system', 'create_niagara_emitter',
487
+ 'create_volumetric_fog', 'create_particle_trail', 'create_environment_effect', 'create_impact_effect', 'create_niagara_ribbon',
488
+ 'activate', 'activate_effect', 'deactivate', 'reset', 'advance_simulation',
489
+ 'add_niagara_module', 'connect_niagara_pins', 'remove_niagara_node', 'set_niagara_parameter',
490
+ 'clear_debug_shapes', 'cleanup'
491
+ ],
492
+ description: 'Action'
399
493
  },
400
- componentType: { type: 'string', description: 'Component class to add (StaticMeshComponent, SkeletalMeshComponent, CameraComponent, etc.). Required for add_component action.' },
401
- componentName: { type: 'string', description: 'Unique name for the component instance within the blueprint. Required for add_component action.' },
402
- savePath: { type: 'string', description: 'Content path where blueprint will be saved (e.g., "/Game/Blueprints"). Required for create action.' }
494
+ name: { type: 'string' },
495
+ systemName: { type: 'string' },
496
+ systemPath: { type: 'string', description: 'Required for spawning Niagara effects (spawn_niagara, create_volumetric_fog, etc) and most graph operations.' },
497
+ preset: { type: 'string', description: 'Required for particle action. Path to particle system asset.' },
498
+ location: commonSchemas.location,
499
+ scale: { type: 'number' },
500
+ shape: { type: 'string', description: 'Supported: sphere, box, cylinder, line, cone, capsule, arrow, plane' },
501
+ size: { type: 'number' },
502
+ color: { type: 'array', items: { type: 'number' } },
503
+ // Graph
504
+ modulePath: { type: 'string' },
505
+ emitterName: { type: 'string' },
506
+ pinName: { type: 'string' },
507
+ linkedTo: { type: 'string' },
508
+ parameterName: { type: 'string' },
509
+ parameterType: { type: 'string', description: 'Float, Vector, Color, Bool, etc.' },
510
+ type: { type: 'string', description: 'Alias for parameterType' },
511
+ value: { description: 'Value.' },
512
+ // Cleanup
513
+ filter: { type: 'string', description: 'Filter for cleanup action. Required.' }
403
514
  },
404
- required: ['action', 'name']
515
+ required: ['action']
405
516
  },
406
517
  outputSchema: {
407
518
  type: 'object',
408
519
  properties: {
409
- success: { type: 'boolean', description: 'Whether the operation succeeded' },
410
- blueprintPath: { type: 'string', description: 'Blueprint asset path' },
411
- componentAdded: { type: 'string', description: 'Added component name' },
412
- message: { type: 'string', description: 'Status message' },
413
- warning: { type: 'string', description: 'Warning if manual steps needed' }
520
+ success: { type: 'boolean' },
521
+ message: { type: 'string' }
414
522
  }
415
523
  }
416
524
  },
417
525
 
418
- // 8. ENVIRONMENT BUILDER - Landscape and foliage
526
+ // 8. ENVIRONMENT BUILDER
419
527
  {
420
528
  name: 'build_environment',
421
- description: `Environment authoring toolkit for landscapes and foliage, from sculpting to procedural scatters.
529
+ description: `Environment creation (Landscape, Foliage).
422
530
 
423
531
  Use it when you need to:
424
- - create or sculpt a landscape actor.
425
- - add foliage via types or paint strokes.
426
- - drive procedural terrain/foliage generation with bounds, seeds, and density settings.
427
- - spawn explicit foliage instances at transforms.
532
+ - create/sculpt landscapes.
533
+ - paint foliage.
534
+ - procedural generation.
428
535
 
429
- Supported actions: create_landscape, sculpt, add_foliage, paint_foliage, create_procedural_terrain, create_procedural_foliage, add_foliage_instances, create_landscape_grass_type.`,
536
+ Supported actions: create_landscape, sculpt, add_foliage, paint_foliage, create_procedural_terrain, create_procedural_foliage, add_foliage_instances, get_foliage_instances, remove_foliage.`,
430
537
  inputSchema: {
431
538
  type: 'object',
432
539
  properties: {
433
- action: {
434
- type: 'string',
435
- enum: ['create_landscape', 'sculpt', 'add_foliage', 'paint_foliage', 'create_procedural_terrain', 'create_procedural_foliage', 'add_foliage_instances', 'create_landscape_grass_type'],
436
- description: 'Environment action'
540
+ action: {
541
+ type: 'string',
542
+ enum: [
543
+ 'create_landscape', 'sculpt', 'sculpt_landscape', 'add_foliage', 'paint_foliage',
544
+ 'create_procedural_terrain', 'create_procedural_foliage', 'add_foliage_instances',
545
+ 'get_foliage_instances', 'remove_foliage', 'paint_landscape', 'paint_landscape_layer',
546
+ 'modify_heightmap', 'set_landscape_material', 'create_landscape_grass_type',
547
+ 'generate_lods', 'bake_lightmap', 'export_snapshot', 'import_snapshot', 'delete'
548
+ ],
549
+ description: 'Action'
437
550
  },
438
551
  // Common
439
- name: { type: 'string', description: 'Name for landscape, foliage type, or grass type actor. Optional for most actions, auto-generated if not provided.' },
552
+ name: { type: 'string', description: 'Name of landscape, foliage type, or procedural volume.' },
553
+ landscapeName: { type: 'string' },
554
+ heightData: { type: 'array', items: { type: 'number' } },
555
+ minX: { type: 'number' },
556
+ minY: { type: 'number' },
557
+ maxX: { type: 'number' },
558
+ maxY: { type: 'number' },
559
+ updateNormals: { type: 'boolean' },
560
+ location: commonSchemas.location,
561
+ rotation: commonSchemas.rotation,
562
+ scale: commonSchemas.scale,
563
+
440
564
  // Landscape
441
- sizeX: { type: 'number', description: 'Landscape width in components. Each component is typically 63 quads. Required for create_landscape action.' },
442
- sizeY: { type: 'number', description: 'Landscape height in components. Each component is typically 63 quads. Required for create_landscape action.' },
443
- tool: {
444
- type: 'string',
445
- description: 'Landscape sculpt tool to use (Sculpt, Smooth, Flatten, Ramp, Erosion, Hydro, Noise). Required for sculpt action.'
446
- },
447
- // Advanced: procedural terrain
448
- location: {
449
- type: 'object',
450
- description: 'World space location for terrain placement. Required for create_procedural_terrain.',
451
- properties: { x: { type: 'number', description: 'X coordinate' }, y: { type: 'number', description: 'Y coordinate' }, z: { type: 'number', description: 'Z coordinate' } }
452
- },
453
- subdivisions: { type: 'number', description: 'Number of subdivisions for procedural terrain mesh. Higher values create more detailed terrain. Optional for create_procedural_terrain.' },
454
- heightFunction: { type: 'string', description: 'Mathematical function or algorithm for terrain height generation (e.g., "perlin", "simplex", custom formula). Optional for create_procedural_terrain.' },
455
- materialPath: { type: 'string', description: 'Content path to material for terrain/landscape (e.g., "/Game/Materials/TerrainMat"). Optional.' },
456
- // Advanced: procedural foliage
457
- bounds: {
458
- type: 'object',
459
- properties: {
460
- location: { type: 'object', properties: { x: { type: 'number' }, y: { type: 'number' }, z: { type: 'number' } } },
461
- size: { type: 'object', properties: { x: { type: 'number' }, y: { type: 'number' }, z: { type: 'number' } } }
462
- }
463
- },
464
- foliageTypes: {
465
- type: 'array',
466
- items: {
467
- type: 'object',
468
- properties: {
469
- meshPath: { type: 'string' },
470
- density: { type: 'number' },
471
- minScale: { type: 'number' },
472
- maxScale: { type: 'number' },
473
- alignToNormal: { type: 'boolean' },
474
- randomYaw: { type: 'boolean' }
475
- }
476
- }
477
- },
478
- seed: { type: 'number' },
479
- // Advanced: direct foliage instances
480
- foliageType: { type: 'string' },
565
+ sizeX: { type: 'number' },
566
+ sizeY: { type: 'number' },
567
+ sectionSize: { type: 'number' },
568
+ sectionsPerComponent: { type: 'number' },
569
+ componentCount: { type: 'object', properties: { x: { type: 'number' }, y: { type: 'number' } } },
570
+ materialPath: { type: 'string' },
571
+
572
+ // Sculpt/Paint
573
+ tool: { type: 'string' },
574
+ radius: { type: 'number' },
575
+ strength: { type: 'number' },
576
+ falloff: { type: 'number' },
577
+ brushSize: { type: 'number' },
578
+ layerName: { type: 'string', description: 'Required for paint_landscape.' },
579
+ eraseMode: { type: 'boolean' },
580
+
581
+ // Foliage
582
+ foliageType: { type: 'string', description: 'Required for add_foliage_instances, paint_foliage.' },
583
+ foliageTypePath: { type: 'string' },
584
+ meshPath: { type: 'string' },
585
+ density: { type: 'number' },
586
+ minScale: { type: 'number' },
587
+ maxScale: { type: 'number' },
588
+ cullDistance: { type: 'number' },
589
+ alignToNormal: { type: 'boolean' },
590
+ randomYaw: { type: 'boolean' },
591
+ locations: { type: 'array', items: commonSchemas.location },
481
592
  transforms: {
482
593
  type: 'array',
483
594
  items: {
484
595
  type: 'object',
485
596
  properties: {
486
- location: { type: 'object', properties: { x: { type: 'number' }, y: { type: 'number' }, z: { type: 'number' } } },
487
- rotation: { type: 'object', properties: { pitch: { type: 'number' }, yaw: { type: 'number' }, roll: { type: 'number' } } },
488
- scale: { type: 'object', properties: { x: { type: 'number' }, y: { type: 'number' }, z: { type: 'number' } } }
597
+ location: commonSchemas.location,
598
+ rotation: commonSchemas.rotation,
599
+ scale: commonSchemas.scale
489
600
  }
490
601
  }
491
602
  },
492
- // Foliage (for add_foliage)
493
- meshPath: { type: 'string', description: 'Content path to static mesh for foliage (e.g., "/Game/Foliage/TreeMesh"). Required for add_foliage action.' },
494
- density: { type: 'number', description: 'Foliage placement density (instances per unit area). Typical range: 0.1 to 10.0. Required for add_foliage and affects procedural foliage.' },
495
- // Painting
496
- position: {
497
- type: 'object',
498
- description: 'World space position for foliage paint brush center. Required for paint_foliage action.',
499
- properties: {
500
- x: { type: 'number', description: 'X coordinate' },
501
- y: { type: 'number', description: 'Y coordinate' },
502
- z: { type: 'number', description: 'Z coordinate' }
503
- }
504
- },
505
- brushSize: { type: 'number', description: 'Radius of foliage paint brush in centimeters. Typical range: 500-5000. Required for paint_foliage action.' },
506
- strength: { type: 'number', description: 'Paint tool strength/intensity (0.0 to 1.0). Higher values place more instances. Optional for paint_foliage, defaults to 0.5.' }
603
+ position: commonSchemas.location,
604
+
605
+ // Procedural
606
+ bounds: { type: 'object' },
607
+ volumeName: { type: 'string' },
608
+ seed: { type: 'number' },
609
+ foliageTypes: { type: 'array', items: { type: 'object' } },
610
+
611
+ // General
612
+ path: { type: 'string' },
613
+ filename: { type: 'string' },
614
+ assetPaths: { type: 'array', items: { type: 'string' } }
507
615
  },
508
616
  required: ['action']
509
617
  },
510
618
  outputSchema: {
511
619
  type: 'object',
512
620
  properties: {
513
- success: { type: 'boolean', description: 'Whether the operation succeeded' },
514
- landscapeName: { type: 'string', description: 'Landscape actor name' },
515
- foliageTypeName: { type: 'string', description: 'Foliage type name' },
516
- instancesPlaced: { type: 'number', description: 'Number of foliage instances placed' },
517
- message: { type: 'string', description: 'Status message' }
621
+ success: { type: 'boolean' },
622
+ message: { type: 'string' }
518
623
  }
519
624
  }
520
625
  },
521
626
 
522
- // 9. PERFORMANCE & AUDIO - System settings
627
+ // 9. SYSTEM CONTROL
523
628
  {
524
629
  name: 'system_control',
525
- description: `Runtime/system controls for profiling, quality tiers, audio/UI triggers, screenshots, and editor lifecycle.
630
+ description: `System-level control.
526
631
 
527
632
  Use it when you need to:
528
- - toggle stat overlays or targeted profilers.
529
- - adjust scalability categories (sg.*) or enable FPS display.
530
- - play a one-shot sound and optionally position it.
531
- - create/show lightweight widgets.
532
- - capture a screenshot or start/quit the editor process.
633
+ - profiling & performance (stat commands).
634
+ - quality settings.
635
+ - run external tools (UBT, Tests).
636
+ - manage logs/insights.
637
+ - execute arbitrary console commands.
638
+ - set/get CVars and project settings.
639
+ - validate assets.
533
640
 
534
- Supported actions: profile, show_fps, set_quality, play_sound, create_widget, show_widget, screenshot, engine_start, engine_quit.`,
641
+ Supported actions:
642
+ - Core: profile, show_fps, set_quality, screenshot, set_resolution, set_fullscreen, execute_command, console_command.
643
+ - CVars: set_cvar.
644
+ - Settings: get_project_settings, validate_assets.
645
+ - Pipeline: run_ubt, run_tests.
646
+ - Debug/Logs: subscribe, spawn_category, start_session.
647
+ - Render: lumen_update_scene.
648
+ - UI: play_sound, create_widget, show_widget.`,
535
649
  inputSchema: {
536
650
  type: 'object',
537
651
  properties: {
538
- action: {
539
- type: 'string',
540
- enum: ['profile', 'show_fps', 'set_quality', 'play_sound', 'create_widget', 'show_widget', 'screenshot', 'engine_start', 'engine_quit', 'read_log'],
541
- description: 'System action'
542
- },
543
- // Performance
544
- profileType: {
652
+ action: {
545
653
  type: 'string',
546
- description: 'Type of profiling to enable: CPU (stat cpu), GPU (stat gpu), Memory (stat memory), FPS (stat fps), Unit (stat unit). Required for profile action.'
654
+ enum: [
655
+ 'profile', 'show_fps', 'set_quality', 'screenshot', 'set_resolution', 'set_fullscreen', 'execute_command', 'console_command',
656
+ 'run_ubt', 'run_tests', 'subscribe', 'unsubscribe', 'spawn_category', 'start_session', 'lumen_update_scene',
657
+ 'play_sound', 'create_widget', 'show_widget', 'add_widget_child',
658
+ // Added missing actions
659
+ 'set_cvar', 'get_project_settings', 'validate_assets',
660
+ 'set_project_setting'
661
+ ],
662
+ description: 'Action'
547
663
  },
548
- category: {
664
+ // Profile/Quality
665
+ profileType: { type: 'string' },
666
+ category: { type: 'string' },
667
+ level: { type: 'number' },
668
+ enabled: { type: 'boolean' },
669
+ resolution: { type: 'string', description: 'Resolution string (e.g. "1920x1080").' },
670
+
671
+ // Commands
672
+ command: { type: 'string' },
673
+
674
+ // UBT
675
+ target: { type: 'string' },
676
+ platform: { type: 'string' },
677
+ configuration: { type: 'string' },
678
+ arguments: { type: 'string' },
679
+
680
+ // Tests
681
+ filter: { type: 'string' },
682
+
683
+ // Insights
684
+ channels: { type: 'string' },
685
+
686
+ // UI Widget Management
687
+ widgetPath: { type: 'string', description: 'Path to the widget blueprint (for add_widget_child).' },
688
+ childClass: { type: 'string', description: 'Class of the child widget to add (e.g. /Script/UMG.Button).' },
689
+ parentName: { type: 'string', description: 'Name of the parent widget to add to (optional).' },
690
+
691
+ // Project Settings
692
+ section: { type: 'string', description: 'Config section (e.g. /Script/EngineSettings.GeneralProjectSettings).' },
693
+ key: { type: 'string', description: 'Config key (e.g. ProjectID).' },
694
+ value: { type: 'string', description: 'Config value.' },
695
+ configName: { type: 'string', description: 'Config file name (Game, Engine, Input, etc.). Defaults to Game.' }
696
+ },
697
+ required: ['action']
698
+ },
699
+ outputSchema: {
700
+ type: 'object',
701
+ properties: {
702
+ success: { type: 'boolean' },
703
+ message: { type: 'string' },
704
+ output: { type: 'string' }
705
+ }
706
+ }
707
+ },
708
+
709
+ // 10. SEQUENCER
710
+ {
711
+ name: 'manage_sequence',
712
+ description: `Sequencer (Cinematics) management.
713
+
714
+ Use it when you need to:
715
+ - create/edit level sequences.
716
+ - add tracks (camera, actors, audio, events).
717
+ - keyframe properties.
718
+ - manage sequence playback and settings.
719
+
720
+ Supported actions:
721
+ - Lifecycle: create, open, duplicate, rename, delete, list.
722
+ - Bindings: add_camera, add_actor, add_actors, remove_actors, get_bindings, add_spawnable_from_class.
723
+ - Playback: play, pause, stop, set_playback_speed.
724
+ - Keyframes: add_keyframe.
725
+ - Properties: get_properties, set_properties, get_metadata, set_metadata.
726
+ - Tracks: add_track, add_section, list_tracks, remove_track, set_track_muted, set_track_solo, set_track_locked.
727
+ - Settings: set_display_rate, set_tick_resolution, set_work_range, set_view_range.`,
728
+ inputSchema: {
729
+ type: 'object',
730
+ properties: {
731
+ action: {
549
732
  type: 'string',
550
- description: 'Scalability quality category to adjust: ViewDistance, AntiAliasing, Shadow/Shadows, PostProcess/PostProcessing, Texture/Textures, Effects, Foliage, Shading. Required for set_quality action.'
551
- },
552
- level: { type: 'number', description: 'Quality level (0=Low, 1=Medium, 2=High, 3=Epic, 4=Cinematic). Required for set_quality action.' },
553
- enabled: { type: 'boolean', description: 'Enable (true) or disable (false) profiling/FPS display. Required for profile and show_fps actions.' },
554
- verbose: { type: 'boolean', description: 'Show verbose profiling output with additional details. Optional for profile action.' },
555
- // Audio
556
- soundPath: { type: 'string', description: 'Content path to sound asset (SoundCue or SoundWave, e.g., "/Game/Audio/MySound"). Required for play_sound action.' },
557
- location: {
558
- type: 'object',
559
- description: 'World space location for 3D sound playback. Required if is3D is true for play_sound action.',
560
- properties: {
561
- x: { type: 'number', description: 'X coordinate' },
562
- y: { type: 'number', description: 'Y coordinate' },
563
- z: { type: 'number', description: 'Z coordinate' }
564
- }
733
+ enum: [
734
+ 'create', 'open', 'add_camera', 'add_actor', 'add_actors', 'remove_actors',
735
+ 'get_bindings', 'play', 'pause', 'stop', 'set_playback_speed', 'add_keyframe',
736
+ // Added missing sequence actions
737
+ 'get_properties', 'set_properties', 'duplicate', 'rename', 'delete', 'list', 'get_metadata', 'set_metadata',
738
+ 'add_spawnable_from_class', 'add_track', 'add_section', 'set_display_rate', 'set_tick_resolution',
739
+ 'set_work_range', 'set_view_range', 'set_track_muted', 'set_track_solo', 'set_track_locked',
740
+ 'list_tracks', 'remove_track'
741
+ ],
742
+ description: 'Action'
565
743
  },
566
- volume: { type: 'number', description: 'Volume multiplier (0.0=silent, 1.0=full volume). Optional for play_sound, defaults to 1.0.' },
567
- is3D: { type: 'boolean', description: 'Whether sound should be played as 3D positional audio (true) or 2D (false). Optional for play_sound, defaults to false.' },
568
- // UI
569
- widgetName: { type: 'string', description: 'Name for widget asset or instance. Required for create_widget and show_widget actions.' },
570
- widgetType: {
744
+ name: { type: 'string', description: 'Sequence name for creation.' },
745
+ path: { type: 'string', description: 'Sequence asset path.' },
746
+ actorName: { type: 'string', description: 'Actor name for binding.' },
747
+ actorNames: { type: 'array', items: { type: 'string' }, description: 'Multiple actor names.' },
748
+ frame: { type: 'number', description: 'Frame number for keyframes.' },
749
+ value: { type: 'object', description: 'Value for keyframes.' },
750
+ property: { type: 'string', description: 'Property name for keyframes.' },
751
+ // Duplicate/Rename
752
+ destinationPath: { type: 'string', description: 'Destination path for duplicate.' },
753
+ newName: { type: 'string', description: 'New name for rename/duplicate.' },
754
+ overwrite: { type: 'boolean', description: 'Overwrite existing on duplicate.' },
755
+ // Playback
756
+ speed: { type: 'number', description: 'Playback speed multiplier.' },
757
+ startTime: { type: 'number', description: 'Start time for playback.' },
758
+ loopMode: { type: 'string', description: 'Loop mode for playback.' },
759
+ // Spawnable
760
+ className: { type: 'string', description: 'Class name for spawnables.' },
761
+ spawnable: { type: 'boolean', description: 'Create as spawnable.' },
762
+ // Track management
763
+ trackType: { type: 'string', description: 'Track type (Animation, Transform, Audio, Event).' },
764
+ trackName: { type: 'string', description: 'Track name for track operations.' },
765
+ muted: { type: 'boolean', description: 'Mute state for set_track_muted.' },
766
+ solo: { type: 'boolean', description: 'Solo state for set_track_solo.' },
767
+ locked: { type: 'boolean', description: 'Lock state for set_track_locked.' },
768
+ // Section
769
+ assetPath: { type: 'string', description: 'Asset path for section content.' },
770
+ startFrame: { type: 'number', description: 'Section start frame.' },
771
+ endFrame: { type: 'number', description: 'Section end frame.' },
772
+ // Display settings
773
+ frameRate: { type: 'string', description: 'Display frame rate (e.g., "30fps").' },
774
+ resolution: { type: 'string', description: 'Tick resolution (e.g., "24000fps").' },
775
+ // Work/View range
776
+ start: { type: 'number', description: 'Range start.' },
777
+ end: { type: 'number', description: 'Range end.' },
778
+ // Properties
779
+ lengthInFrames: { type: 'number', description: 'Sequence length in frames.' },
780
+ playbackStart: { type: 'number', description: 'Playback start frame.' },
781
+ playbackEnd: { type: 'number', description: 'Playback end frame.' },
782
+ // Metadata
783
+ metadata: { type: 'object', description: 'Metadata object.' }
784
+ },
785
+ required: ['action']
786
+ },
787
+ outputSchema: {
788
+ type: 'object',
789
+ properties: {
790
+ success: { type: 'boolean' },
791
+ message: { type: 'string' }
792
+ }
793
+ }
794
+ },
795
+
796
+ // 11. INPUT MANAGEMENT
797
+ {
798
+ name: 'manage_input',
799
+ description: `Enhanced Input management.
800
+
801
+ Use it when you need to:
802
+ - create Input Actions (IA_*)
803
+ - create Input Mapping Contexts (IMC_*)
804
+ - bind keys to actions in a mapping context.
805
+
806
+ Supported actions:
807
+ - create_input_action: Create a UInputAction asset.
808
+ - create_input_mapping_context: Create a UInputMappingContext asset.
809
+ - add_mapping: Add a key mapping to a context.
810
+ - remove_mapping: Remove a mapping from a context.`,
811
+ inputSchema: {
812
+ type: 'object',
813
+ properties: {
814
+ action: {
571
815
  type: 'string',
572
- description: 'Widget blueprint type or category (HUD, Menu, Dialog, Notification, etc.). Optional for create_widget, helps categorize the widget.'
816
+ enum: [
817
+ 'create_input_action',
818
+ 'create_input_mapping_context',
819
+ 'add_mapping',
820
+ 'remove_mapping'
821
+ ],
822
+ description: 'Action to perform'
573
823
  },
574
- visible: { type: 'boolean', description: 'Whether widget should be visible (true) or hidden (false). Required for show_widget action.' },
575
- // Screenshot
576
- resolution: { type: 'string', description: 'Screenshot resolution in WIDTHxHEIGHT format (e.g., "1920x1080", "3840x2160"). Optional for screenshot action, uses viewport size if not specified.' },
577
- // Engine lifecycle
578
- projectPath: { type: 'string', description: 'Absolute path to .uproject file (e.g., "C:/Projects/MyGame/MyGame.uproject"). Required for engine_start unless UE_PROJECT_PATH environment variable is set.' },
579
- editorExe: { type: 'string', description: 'Absolute path to Unreal Editor executable (e.g., "C:/UnrealEngine/Engine/Binaries/Win64/UnrealEditor.exe"). Required for engine_start unless UE_EDITOR_EXE environment variable is set.' }
580
- ,
581
- // Log reading
582
- filter_category: { description: 'Category filter as string or array; comma-separated or array values' },
583
- filter_level: { type: 'string', enum: ['Error','Warning','Log','Verbose','VeryVerbose','All'], description: 'Log level filter' },
584
- lines: { type: 'number', description: 'Number of lines to read from tail' },
585
- log_path: { type: 'string', description: 'Absolute path to a specific .log file to read' },
586
- include_prefixes: { type: 'array', items: { type: 'string' }, description: 'Only include categories starting with any of these prefixes' },
587
- exclude_categories: { type: 'array', items: { type: 'string' }, description: 'Categories to exclude' }
824
+ name: { type: 'string', description: 'Name of the asset (for creation).' },
825
+ path: { type: 'string', description: 'Path to save the asset (e.g. /Game/Input).' },
826
+ contextPath: { type: 'string', description: 'Path to the Input Mapping Context.' },
827
+ actionPath: { type: 'string', description: 'Path to the Input Action.' },
828
+ key: { type: 'string', description: 'Key name (e.g. "SpaceBar", "W", "Gamepad_FaceButton_Bottom").' }
588
829
  },
589
830
  required: ['action']
590
831
  },
591
832
  outputSchema: {
592
833
  type: 'object',
593
834
  properties: {
594
- success: { type: 'boolean', description: 'Whether the operation succeeded' },
595
- profiling: { type: 'boolean', description: 'Profiling active state' },
596
- fpsVisible: { type: 'boolean', description: 'FPS display state' },
597
- qualityLevel: { type: 'number', description: 'Current quality level' },
598
- soundPlaying: { type: 'boolean', description: 'Sound playback state' },
599
- widgetPath: { type: 'string', description: 'Created widget path' },
600
- widgetVisible: { type: 'boolean', description: 'Widget visibility state' },
601
- imagePath: { type: 'string', description: 'Saved screenshot path' },
602
- imageBase64: { type: 'string', description: 'Screenshot image base64 (truncated)' },
603
- pid: { type: 'number', description: 'Process ID for launched editor' },
604
- message: { type: 'string', description: 'Status message' },
605
- error: { type: 'string', description: 'Error message if failed' },
606
- logPath: { type: 'string', description: 'Log file path used for read_log' },
607
- entries: {
608
- type: 'array',
609
- items: { type: 'object', properties: { timestamp: { type: 'string' }, category: { type: 'string' }, level: { type: 'string' }, message: { type: 'string' } } },
610
- description: 'Parsed Output Log entries'
835
+ success: { type: 'boolean' },
836
+ message: { type: 'string' },
837
+ assetPath: { type: 'string' }
838
+ }
839
+ }
840
+ },
841
+
842
+ // 12. INTROSPECTION (INSPECT)
843
+ {
844
+ name: 'inspect',
845
+ description: `Low-level object inspection and property manipulation.
846
+
847
+ Use it when you need to:
848
+ - read/write properties of any UObject or component.
849
+ - list objects/components.
850
+ - manage actor tags and snapshots.
851
+ - find objects by class or tag.
852
+
853
+ Supported actions:
854
+ - Object: inspect_object, inspect_class, list_objects, find_by_class, delete_object, export.
855
+ - Properties: get_property, set_property, get_component_property, set_component_property.
856
+ - Components: get_components, get_bounding_box.
857
+ - Tags: add_tag, find_by_tag, get_metadata.
858
+ - Snapshots: create_snapshot, restore_snapshot.`,
859
+ inputSchema: {
860
+ type: 'object',
861
+ properties: {
862
+ action: {
863
+ type: 'string',
864
+ enum: [
865
+ 'inspect_object', 'set_property', 'get_property', 'get_components', 'inspect_class', 'list_objects',
866
+ // Added missing inspect actions
867
+ 'get_component_property', 'set_component_property', 'get_metadata', 'add_tag', 'find_by_tag',
868
+ 'create_snapshot', 'restore_snapshot', 'export', 'delete_object', 'find_by_class', 'get_bounding_box'
869
+ ],
870
+ description: 'Action'
611
871
  },
612
- filteredCount: { type: 'number', description: 'Count of entries after filtering' }
872
+ objectPath: { type: 'string', description: 'UObject path to inspect/modify.' },
873
+ propertyName: { type: 'string', description: 'Property name to get/set.' },
874
+ propertyPath: { type: 'string', description: 'Alternate property path parameter.' },
875
+ value: { description: 'Value to set.' },
876
+ // Actor/Component identifiers
877
+ actorName: { type: 'string', description: 'Actor name (required for snapshots, export, and component resolution).' },
878
+ name: { type: 'string', description: 'Object name (alternative to objectPath).' },
879
+ componentName: { type: 'string', description: 'Component name for component property access.' },
880
+ // Search/Filter
881
+ className: { type: 'string', description: 'Class name for find_by_class.' },
882
+ classPath: { type: 'string', description: 'Class path (alternative to className).' },
883
+ tag: { type: 'string', description: 'Tag for add_tag/find_by_tag.' },
884
+ filter: { type: 'string', description: 'Filter for list_objects.' },
885
+ // Snapshots
886
+ snapshotName: { type: 'string', description: 'Snapshot name for create/restore.' },
887
+ // Export
888
+ destinationPath: { type: 'string', description: 'Export destination path.' },
889
+ outputPath: { type: 'string', description: 'Alternative export path.' },
890
+ format: { type: 'string', description: 'Export format (e.g., JSON).' }
891
+ },
892
+ required: ['action']
893
+ },
894
+ outputSchema: {
895
+ type: 'object',
896
+ properties: {
897
+ success: { type: 'boolean' },
898
+ value: { description: 'Property value.' }
613
899
  }
614
900
  }
615
901
  },
616
902
 
617
- // 10. CONSOLE COMMAND - Universal tool
903
+ // 12. AUDIO MANAGER
618
904
  {
619
- name: 'console_command',
620
- description: `Guarded console command executor for one-off \`stat\`, \`r.*\`, or viewmode commands.
905
+ name: 'manage_audio',
906
+ description: `Audio asset and component management.
907
+
908
+ Use it when you need to:
909
+ - create sound cues/mixes.
910
+ - play sounds (3D/2D).
911
+ - control audio components.
621
912
 
622
- Use it when higher-level tools don't cover the console tweak you need. Hazardous commands (quit/exit, crash triggers, unsafe viewmodes) are blocked, and unknown commands respond with a warning instead of executing blindly.`,
913
+ Supported actions:
914
+ - Assets: create_sound_cue, create_sound_mix, create_sound_class, create_reverb_zone, create_ambient_sound.
915
+ - Playback: play_sound_at_location, play_sound_2d, play_sound_attached, spawn_sound_at_location.
916
+ - Components: create_audio_component, fade_sound, fade_sound_in, fade_sound_out.
917
+ - Mixes: push_sound_mix, pop_sound_mix, set_sound_mix_class_override, clear_sound_mix_class_override, set_base_sound_mix.
918
+ - Global: enable_audio_analysis, set_doppler_effect, set_audio_occlusion, set_sound_attenuation.`,
623
919
  inputSchema: {
624
920
  type: 'object',
625
921
  properties: {
626
- command: { type: 'string', description: 'Console command to execute in Unreal Engine (e.g., "stat fps", "r.SetRes 1920x1080", "viewmode lit"). Dangerous commands like quit/exit and crash triggers are blocked. Required.' }
922
+ action: {
923
+ type: 'string',
924
+ enum: [
925
+ 'create_sound_cue', 'play_sound_at_location', 'play_sound_2d', 'create_audio_component',
926
+ 'create_sound_mix', 'push_sound_mix', 'pop_sound_mix',
927
+ 'set_sound_mix_class_override', 'clear_sound_mix_class_override', 'set_base_sound_mix',
928
+ 'prime_sound', 'play_sound_attached', 'spawn_sound_at_location',
929
+ 'fade_sound_in', 'fade_sound_out', 'create_ambient_sound',
930
+ // Added missing actions
931
+ 'create_sound_class', 'set_sound_attenuation', 'create_reverb_zone',
932
+ 'enable_audio_analysis', 'fade_sound', 'set_doppler_effect', 'set_audio_occlusion'
933
+ ],
934
+ description: 'Action'
935
+ },
936
+ name: { type: 'string' },
937
+ soundPath: { type: 'string', description: 'Required for create_sound_cue, play_sound_*, create_audio_component, create_ambient_sound.' },
938
+ location: commonSchemas.location,
939
+ rotation: commonSchemas.rotation,
940
+ volume: { type: 'number' },
941
+ pitch: { type: 'number' },
942
+ startTime: { type: 'number' },
943
+ attenuationPath: { type: 'string' },
944
+ concurrencyPath: { type: 'string' },
945
+ mixName: { type: 'string' },
946
+ soundClassName: { type: 'string' },
947
+ fadeInTime: { type: 'number' },
948
+ fadeOutTime: { type: 'number' },
949
+ fadeTime: { type: 'number' },
950
+ targetVolume: { type: 'number' },
951
+ attachPointName: { type: 'string' },
952
+ actorName: { type: 'string' },
953
+ componentName: { type: 'string' },
954
+ // Added missing parameters
955
+ parentClass: { type: 'string' },
956
+ properties: { type: 'object' },
957
+ innerRadius: { type: 'number' },
958
+ falloffDistance: { type: 'number' },
959
+ attenuationShape: { type: 'string' },
960
+ falloffMode: { type: 'string' },
961
+ reverbEffect: { type: 'string' },
962
+ size: commonSchemas.scale,
963
+ fftSize: { type: 'number' },
964
+ outputType: { type: 'string' },
965
+ soundName: { type: 'string' },
966
+ fadeType: { type: 'string' },
967
+ scale: { type: 'number' },
968
+ lowPassFilterFrequency: { type: 'number' },
969
+ volumeAttenuation: { type: 'number' },
970
+ enabled: { type: 'boolean' }
627
971
  },
628
- required: ['command']
972
+ required: ['action']
629
973
  },
630
974
  outputSchema: {
631
975
  type: 'object',
632
976
  properties: {
633
- success: { type: 'boolean', description: 'Whether the command executed' },
634
- command: { type: 'string', description: 'The command that was executed' },
635
- result: { type: 'object', description: 'Command execution result' },
636
- warning: { type: 'string', description: 'Warning if command may be unrecognized' },
637
- info: { type: 'string', description: 'Additional information' },
638
- error: { type: 'string', description: 'Error message if failed' }
977
+ success: { type: 'boolean' },
978
+ message: { type: 'string' }
639
979
  }
640
980
  }
641
981
  },
642
982
 
643
- // 11. REMOTE CONTROL PRESETS
983
+ // 13. BEHAVIOR TREE
644
984
  {
645
- name: 'manage_rc',
646
- description: `Remote Control preset helper for building, exposing, and mutating RC assets.
985
+ name: 'manage_behavior_tree',
986
+ description: `Behavior Tree editing tool.
647
987
 
648
988
  Use it when you need to:
649
- - create a preset asset on disk.
650
- - expose actors or object properties to the preset.
651
- - list the exposed fields for inspection.
652
- - get or set property values through RC with JSON-serializable payloads.
989
+ - create new Behavior Tree assets.
990
+ - add nodes (Sequence, Selector, Tasks).
991
+ - connect nodes.
992
+ - set properties.
653
993
 
654
- Supported actions: create_preset, expose_actor, expose_property, list_fields, set_property, get_property.`,
994
+ Supported actions: create, add_node, connect_nodes, remove_node, break_connections, set_node_properties.`,
655
995
  inputSchema: {
656
996
  type: 'object',
657
997
  properties: {
658
998
  action: {
659
999
  type: 'string',
660
- enum: ['create_preset', 'expose_actor', 'expose_property', 'list_fields', 'set_property', 'get_property'],
661
- description: 'RC action'
1000
+ enum: ['create', 'add_node', 'connect_nodes', 'remove_node', 'break_connections', 'set_node_properties'],
1001
+ description: 'Action'
662
1002
  },
663
- name: { type: 'string', description: 'Name for Remote Control preset asset. Required for create_preset action.' },
664
- path: { type: 'string', description: 'Content path where preset will be saved (e.g., "/Game/RCPresets"). Required for create_preset action.' },
665
- presetPath: { type: 'string', description: 'Full content path to existing Remote Control preset asset (e.g., "/Game/RCPresets/MyPreset"). Required for expose_actor, expose_property, list_fields, set_property, and get_property actions.' },
666
- actorName: { type: 'string', description: 'Actor label/name in level to expose to Remote Control preset. Required for expose_actor action.' },
667
- objectPath: { type: 'string', description: 'Full object path for property operations (e.g., "/Game/Maps/Level.Level:PersistentLevel.StaticMeshActor_0"). Required for expose_property, set_property, and get_property actions.' },
668
- propertyName: { type: 'string', description: 'Name of the property to expose, get, or set (e.g., "RelativeLocation", "Intensity", "bHidden"). Required for expose_property, set_property, and get_property actions.' },
669
- value: { description: 'New value to set for property. Must be JSON-serializable and compatible with property type (e.g., {"X":100,"Y":200,"Z":300} for location, true/false for bool, number for numeric types). Required for set_property action.' }
1003
+ // For create action
1004
+ name: { type: 'string', description: 'Name of the new Behavior Tree asset' },
1005
+ savePath: { type: 'string', description: 'Path to save the new Behavior Tree (e.g., /Game/AI)' },
1006
+ // Existing params
1007
+ assetPath: { type: 'string' },
1008
+ nodeType: { type: 'string' },
1009
+ nodeId: { type: 'string' },
1010
+ parentNodeId: { type: 'string' },
1011
+ childNodeId: { type: 'string' },
1012
+ x: { type: 'number' },
1013
+ y: { type: 'number' },
1014
+ comment: { type: 'string' },
1015
+ properties: { type: 'object' }
670
1016
  },
671
1017
  required: ['action']
672
1018
  },
@@ -675,50 +1021,147 @@ Supported actions: create_preset, expose_actor, expose_property, list_fields, se
675
1021
  properties: {
676
1022
  success: { type: 'boolean' },
677
1023
  message: { type: 'string' },
678
- presetPath: { type: 'string' },
679
- fields: { type: 'array', items: { type: 'object' } },
680
- value: {},
681
- error: { type: 'string' }
1024
+ nodeId: { type: 'string' }
682
1025
  }
683
1026
  }
684
1027
  },
685
1028
 
686
- // 12. SEQUENCER / CINEMATICS
1029
+ // 14. BLUEPRINT GRAPH DIRECT
687
1030
  {
688
- name: 'manage_sequence',
689
- description: `Sequencer automation helper for Level Sequences: asset management, bindings, and playback control.
1031
+ name: 'manage_blueprint_graph',
1032
+ description: `Direct Blueprint Graph manipulation.
690
1033
 
691
1034
  Use it when you need to:
692
- - create or open a sequence asset.
693
- - add actors, spawnable cameras, or other bindings.
694
- - adjust sequence metadata (frame rate, bounds, playback window).
695
- - drive playback (play/pause/stop), adjust speed, or fetch binding info.
1035
+ - add nodes (Function, Variable, Event, Macro).
1036
+ - connect/disconnect pins.
1037
+ - create reroute nodes.
1038
+ - set node properties.
1039
+ - get node/graph details.
696
1040
 
697
- Supported actions: create, open, add_camera, add_actor, add_actors, remove_actors, get_bindings, add_spawnable_from_class, play, pause, stop, set_properties, get_properties, set_playback_speed.`,
1041
+ Supported actions: create_node, delete_node, connect_pins, break_pin_links, set_node_property, create_reroute_node, get_node_details, get_graph_details, get_pin_details.`,
698
1042
  inputSchema: {
699
1043
  type: 'object',
700
1044
  properties: {
701
- action: {
702
- type: 'string',
1045
+ action: {
1046
+ type: 'string',
703
1047
  enum: [
704
- 'create', 'open', 'add_camera', 'add_actor', 'add_actors',
705
- 'remove_actors', 'get_bindings', 'add_spawnable_from_class',
706
- 'play', 'pause', 'stop', 'set_properties', 'get_properties', 'set_playback_speed'
707
- ],
708
- description: 'Sequence action'
1048
+ 'create_node', 'delete_node', 'connect_pins', 'break_pin_links', 'set_node_property',
1049
+ 'create_reroute_node', 'get_node_details', 'get_graph_details', 'get_pin_details'
1050
+ ],
1051
+ description: 'Action'
709
1052
  },
710
- name: { type: 'string', description: 'Name for new Level Sequence asset. Required for create action.' },
711
- path: { type: 'string', description: 'Content path - for create action: save location (e.g., "/Game/Cinematics"); for open/operations: full asset path (e.g., "/Game/Cinematics/MySequence"). Required for create and open actions.' },
712
- actorName: { type: 'string', description: 'Actor label/name in level to add as possessable binding to sequence. Required for add_actor action.' },
713
- actorNames: { type: 'array', items: { type: 'string' }, description: 'Array of actor labels/names for batch add or remove operations. Required for add_actors and remove_actors actions.' },
714
- className: { type: 'string', description: 'Unreal class name for spawnable actor (e.g., "StaticMeshActor", "CineCameraActor", "SkeletalMeshActor"). Required for add_spawnable_from_class action.' },
715
- spawnable: { type: 'boolean', description: 'If true, camera is spawnable (owned by sequence); if false, camera is possessable (references level actor). Optional for add_camera, defaults to true.' },
716
- frameRate: { type: 'number', description: 'Sequence frame rate in frames per second (e.g., 24, 30, 60). Required for set_properties when changing frame rate.' },
717
- lengthInFrames: { type: 'number', description: 'Total sequence length measured in frames. Required for set_properties when changing duration.' },
718
- playbackStart: { type: 'number', description: 'First frame of playback range (inclusive). Optional for set_properties.' },
719
- playbackEnd: { type: 'number', description: 'Last frame of playback range (inclusive). Optional for set_properties.' },
720
- speed: { type: 'number', description: 'Playback speed multiplier. 1.0 is normal speed, 2.0 is double speed, 0.5 is half speed. Required for set_playback_speed action.' },
721
- loopMode: { type: 'string', enum: ['once', 'loop', 'pingpong'], description: 'How sequence loops: "once" plays once and stops, "loop" repeats from start, "pingpong" plays forward then backward. Optional for set_properties.' }
1053
+ blueprintPath: { type: 'string' },
1054
+ graphName: { type: 'string' },
1055
+ nodeType: { type: 'string' },
1056
+ nodeId: { type: 'string' },
1057
+ pinName: { type: 'string' },
1058
+ linkedTo: { type: 'string' },
1059
+ memberName: { type: 'string' },
1060
+ x: { type: 'number' },
1061
+ y: { type: 'number' },
1062
+ propertyName: { type: 'string' },
1063
+ value: { description: 'Value.' }
1064
+ },
1065
+ required: ['action']
1066
+ },
1067
+ outputSchema: {
1068
+ type: 'object',
1069
+ properties: {
1070
+ success: { type: 'boolean' },
1071
+ nodeId: { type: 'string' },
1072
+ details: { type: 'object' }
1073
+ }
1074
+ }
1075
+ },
1076
+
1077
+ // 15. LIGHTING MANAGER
1078
+ {
1079
+ name: 'manage_lighting',
1080
+ description: `Lighting and Rendering configuration.
1081
+
1082
+ Use it when you need to:
1083
+ - spawn and configure lights (Directional, Point, Spot, Rect, Sky).
1084
+ - configure Global Illumination (Lumen, Lightmass) and Shadows.
1085
+ - setup Volumetric Fog and Atmosphere.
1086
+ - build lighting (bake).
1087
+ - set exposure and post-process settings.
1088
+
1089
+ Supported actions:
1090
+ - Spawning: spawn_light, create_light, spawn_sky_light, create_sky_light, ensure_single_sky_light, create_lightmass_volume, create_lighting_enabled_level, create_dynamic_light.
1091
+ - Configuration: setup_global_illumination, configure_shadows, set_exposure, set_ambient_occlusion, setup_volumetric_fog.
1092
+ - Building: build_lighting.`,
1093
+ inputSchema: {
1094
+ type: 'object',
1095
+ properties: {
1096
+ action: {
1097
+ type: 'string',
1098
+ enum: [
1099
+ 'spawn_light', 'create_light', 'spawn_sky_light', 'create_sky_light', 'ensure_single_sky_light',
1100
+ 'create_lightmass_volume', 'create_lighting_enabled_level', 'create_dynamic_light',
1101
+ 'setup_global_illumination', 'configure_shadows', 'set_exposure', 'set_ambient_occlusion', 'setup_volumetric_fog',
1102
+ 'build_lighting'
1103
+ ],
1104
+ description: 'Action'
1105
+ },
1106
+ // Common
1107
+ name: { type: 'string' },
1108
+ location: commonSchemas.location,
1109
+ rotation: commonSchemas.rotation,
1110
+
1111
+ // Light Properties
1112
+ lightType: { type: 'string', enum: ['Directional', 'Point', 'Spot', 'Rect'] },
1113
+ intensity: { type: 'number' },
1114
+ color: { type: 'array', items: { type: 'number' } },
1115
+ castShadows: { type: 'boolean' },
1116
+ useAsAtmosphereSunLight: { type: 'boolean', description: 'For Directional Lights, use as Atmosphere Sun Light.' },
1117
+ temperature: { type: 'number' },
1118
+ radius: { type: 'number' },
1119
+ falloffExponent: { type: 'number' },
1120
+ innerCone: { type: 'number' },
1121
+ outerCone: { type: 'number' },
1122
+ width: { type: 'number' },
1123
+ height: { type: 'number' },
1124
+
1125
+ // Sky Light
1126
+ sourceType: { type: 'string', enum: ['CapturedScene', 'SpecifiedCubemap'] },
1127
+ cubemapPath: { type: 'string' },
1128
+ recapture: { type: 'boolean' },
1129
+
1130
+ // Global Illumination
1131
+ method: { type: 'string', enum: ['Lightmass', 'LumenGI', 'ScreenSpace', 'None'] },
1132
+ quality: { type: 'string' }, // 'Low' | 'Medium' | 'High' | 'Epic' | 'Preview' | 'Production'
1133
+ indirectLightingIntensity: { type: 'number' },
1134
+ bounces: { type: 'number' },
1135
+
1136
+ // Shadows
1137
+ shadowQuality: { type: 'string' },
1138
+ cascadedShadows: { type: 'boolean' },
1139
+ shadowDistance: { type: 'number' },
1140
+ contactShadows: { type: 'boolean' },
1141
+ rayTracedShadows: { type: 'boolean' },
1142
+
1143
+ // Exposure / Post Process
1144
+ compensationValue: { type: 'number' },
1145
+ minBrightness: { type: 'number' },
1146
+ maxBrightness: { type: 'number' },
1147
+ enabled: { type: 'boolean' },
1148
+
1149
+ // Volumetric Fog
1150
+ density: { type: 'number' },
1151
+ scatteringIntensity: { type: 'number' },
1152
+ fogHeight: { type: 'number' },
1153
+
1154
+ // Building
1155
+ buildOnlySelected: { type: 'boolean' },
1156
+ buildReflectionCaptures: { type: 'boolean' },
1157
+
1158
+ // Level
1159
+ levelName: { type: 'string' },
1160
+ copyActors: { type: 'boolean' },
1161
+ useTemplate: { type: 'boolean' },
1162
+
1163
+ // Volume
1164
+ size: commonSchemas.scale
722
1165
  },
723
1166
  required: ['action']
724
1167
  },
@@ -726,41 +1169,77 @@ Supported actions: create, open, add_camera, add_actor, add_actors, remove_actor
726
1169
  type: 'object',
727
1170
  properties: {
728
1171
  success: { type: 'boolean' },
729
- sequencePath: { type: 'string' },
730
- cameraBindingId: { type: 'string' },
731
- bindings: { type: 'array', items: { type: 'object' } },
732
- actorsAdded: { type: 'array', items: { type: 'string' } },
733
- removedActors: { type: 'array', items: { type: 'string' } },
734
- notFound: { type: 'array', items: { type: 'string' } },
735
- spawnableId: { type: 'string' },
736
- frameRate: { type: 'object' },
737
- playbackStart: { type: 'number' },
738
- playbackEnd: { type: 'number' },
739
- duration: { type: 'number' },
740
- playbackSpeed: { type: 'number' },
741
1172
  message: { type: 'string' },
742
- error: { type: 'string' }
1173
+ actorName: { type: 'string' }
743
1174
  }
744
1175
  }
745
1176
  },
746
1177
 
747
- // 13. INTROSPECTION
1178
+ // 16. PERFORMANCE MANAGER
748
1179
  {
749
- name: 'inspect',
750
- description: `Introspection utility for reading or mutating properties on actors, components, or CDOs.
1180
+ name: 'manage_performance',
1181
+ description: `Performance profiling and optimization.
751
1182
 
752
1183
  Use it when you need to:
753
- - inspect an object by path and retrieve its serialized properties.
754
- - set a property value with built-in validation.
1184
+ - profiling (CPU, GPU, Memory, RenderThread).
1185
+ - optimize content (LODs, texture streaming, draw calls).
1186
+ - benchmark the scene.
1187
+ - configure rendering features (Nanite, Lumen, World Partition).
755
1188
 
756
- Supported actions: inspect_object, set_property.`,
1189
+ Supported actions:
1190
+ - Profiling: start_profiling, stop_profiling, run_benchmark, show_fps, show_stats, generate_memory_report.
1191
+ - Settings: set_scalability, set_resolution_scale, set_vsync, set_frame_rate_limit, enable_gpu_timing.
1192
+ - Optimization: configure_texture_streaming, configure_lod, apply_baseline_settings, optimize_draw_calls, merge_actors, configure_occlusion_culling, optimize_shaders.
1193
+ - Features: configure_nanite, configure_world_partition.`,
757
1194
  inputSchema: {
758
1195
  type: 'object',
759
1196
  properties: {
760
- action: { type: 'string', enum: ['inspect_object', 'set_property'], description: 'Introspection action: "inspect_object" retrieves all properties, "set_property" modifies a specific property. Required.' },
761
- objectPath: { type: 'string', description: 'Full object path in Unreal format (e.g., "/Game/Maps/Level.Level:PersistentLevel.StaticMeshActor_0" or "/Script/Engine.Default__StaticMeshActor" for CDO). Required for both actions.' },
762
- propertyName: { type: 'string', description: 'Name of the property to modify (e.g., "RelativeLocation", "Mobility", "bHidden"). Required for set_property action.' },
763
- value: { description: 'New property value. Must be JSON-serializable and compatible with property type (e.g., {"X":100,"Y":0,"Z":0} for vectors, 5.0 for floats, true for bools, "Value" for strings). Required for set_property action.' }
1197
+ action: {
1198
+ type: 'string',
1199
+ enum: [
1200
+ 'start_profiling', 'stop_profiling', 'run_benchmark', 'show_fps', 'show_stats', 'generate_memory_report',
1201
+ 'set_scalability', 'set_resolution_scale', 'set_vsync', 'set_frame_rate_limit', 'enable_gpu_timing',
1202
+ 'configure_texture_streaming', 'configure_lod', 'apply_baseline_settings', 'optimize_draw_calls', 'merge_actors',
1203
+ 'configure_occlusion_culling', 'optimize_shaders', 'configure_nanite', 'configure_world_partition'
1204
+ ],
1205
+ description: 'Action'
1206
+ },
1207
+ // Profiling
1208
+ type: { type: 'string', enum: ['CPU', 'GPU', 'Memory', 'RenderThread', 'GameThread', 'All'] },
1209
+ duration: { type: 'number' },
1210
+ outputPath: { type: 'string' },
1211
+ detailed: { type: 'boolean' },
1212
+ category: { type: 'string' },
1213
+
1214
+ // Settings
1215
+ level: { type: 'number' },
1216
+ scale: { type: 'number' },
1217
+ enabled: { type: 'boolean' },
1218
+ maxFPS: { type: 'number' },
1219
+ verbose: { type: 'boolean' },
1220
+
1221
+ // Optimization
1222
+ poolSize: { type: 'number' },
1223
+ boostPlayerLocation: { type: 'boolean' },
1224
+ forceLOD: { type: 'number' },
1225
+ lodBias: { type: 'number' },
1226
+ distanceScale: { type: 'number' },
1227
+ skeletalBias: { type: 'number' },
1228
+ hzb: { type: 'boolean' },
1229
+ enableInstancing: { type: 'boolean' },
1230
+ enableBatching: { type: 'boolean' },
1231
+ mergeActors: { type: 'boolean' },
1232
+ actors: { type: 'array', items: { type: 'string' } },
1233
+ freezeRendering: { type: 'boolean' },
1234
+ compileOnDemand: { type: 'boolean' },
1235
+ cacheShaders: { type: 'boolean' },
1236
+ reducePermutations: { type: 'boolean' },
1237
+
1238
+ // Features
1239
+ maxPixelsPerEdge: { type: 'number' },
1240
+ streamingPoolSize: { type: 'number' },
1241
+ streamingDistance: { type: 'number' },
1242
+ cellSize: { type: 'number' }
764
1243
  },
765
1244
  required: ['action']
766
1245
  },
@@ -768,9 +1247,8 @@ Supported actions: inspect_object, set_property.`,
768
1247
  type: 'object',
769
1248
  properties: {
770
1249
  success: { type: 'boolean' },
771
- info: { type: 'object' },
772
1250
  message: { type: 'string' },
773
- error: { type: 'string' }
1251
+ params: { type: 'object' }
774
1252
  }
775
1253
  }
776
1254
  }