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