unreal-engine-mcp-server 0.4.7 → 0.5.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (454) hide show
  1. package/.env.example +26 -0
  2. package/.env.production +38 -7
  3. package/.eslintrc.json +0 -54
  4. package/.eslintrc.override.json +8 -0
  5. package/.github/ISSUE_TEMPLATE/bug_report.yml +94 -0
  6. package/.github/ISSUE_TEMPLATE/config.yml +8 -0
  7. package/.github/ISSUE_TEMPLATE/feature_request.yml +56 -0
  8. package/.github/copilot-instructions.md +478 -45
  9. package/.github/dependabot.yml +19 -0
  10. package/.github/labeler.yml +24 -0
  11. package/.github/labels.yml +70 -0
  12. package/.github/pull_request_template.md +42 -0
  13. package/.github/release-drafter-config.yml +51 -0
  14. package/.github/workflows/auto-merge.yml +38 -0
  15. package/.github/workflows/ci.yml +38 -0
  16. package/.github/workflows/dependency-review.yml +17 -0
  17. package/.github/workflows/gemini-issue-triage.yml +172 -0
  18. package/.github/workflows/greetings.yml +27 -0
  19. package/.github/workflows/labeler.yml +17 -0
  20. package/.github/workflows/links.yml +80 -0
  21. package/.github/workflows/pr-size-labeler.yml +137 -0
  22. package/.github/workflows/publish-mcp.yml +13 -7
  23. package/.github/workflows/release-drafter.yml +23 -0
  24. package/.github/workflows/release.yml +112 -0
  25. package/.github/workflows/semantic-pull-request.yml +35 -0
  26. package/.github/workflows/smoke-test.yml +36 -0
  27. package/.github/workflows/stale.yml +28 -0
  28. package/CHANGELOG.md +338 -31
  29. package/CONTRIBUTING.md +140 -0
  30. package/GEMINI.md +115 -0
  31. package/Public/Plugin_setup_guide.mp4 +0 -0
  32. package/README.md +189 -128
  33. package/claude_desktop_config_example.json +7 -6
  34. package/dist/automation/bridge.d.ts +50 -0
  35. package/dist/automation/bridge.js +452 -0
  36. package/dist/automation/connection-manager.d.ts +23 -0
  37. package/dist/automation/connection-manager.js +107 -0
  38. package/dist/automation/handshake.d.ts +11 -0
  39. package/dist/automation/handshake.js +89 -0
  40. package/dist/automation/index.d.ts +3 -0
  41. package/dist/automation/index.js +3 -0
  42. package/dist/automation/message-handler.d.ts +12 -0
  43. package/dist/automation/message-handler.js +149 -0
  44. package/dist/automation/request-tracker.d.ts +25 -0
  45. package/dist/automation/request-tracker.js +98 -0
  46. package/dist/automation/types.d.ts +130 -0
  47. package/dist/automation/types.js +2 -0
  48. package/dist/cli.js +32 -5
  49. package/dist/config.d.ts +26 -0
  50. package/dist/config.js +59 -0
  51. package/dist/constants.d.ts +16 -0
  52. package/dist/constants.js +16 -0
  53. package/dist/graphql/loaders.d.ts +64 -0
  54. package/dist/graphql/loaders.js +117 -0
  55. package/dist/graphql/resolvers.d.ts +268 -0
  56. package/dist/graphql/resolvers.js +746 -0
  57. package/dist/graphql/schema.d.ts +5 -0
  58. package/dist/graphql/schema.js +437 -0
  59. package/dist/graphql/server.d.ts +26 -0
  60. package/dist/graphql/server.js +117 -0
  61. package/dist/graphql/types.d.ts +9 -0
  62. package/dist/graphql/types.js +2 -0
  63. package/dist/handlers/resource-handlers.d.ts +20 -0
  64. package/dist/handlers/resource-handlers.js +180 -0
  65. package/dist/index.d.ts +33 -18
  66. package/dist/index.js +130 -619
  67. package/dist/resources/actors.d.ts +17 -12
  68. package/dist/resources/actors.js +56 -76
  69. package/dist/resources/assets.d.ts +6 -14
  70. package/dist/resources/assets.js +115 -147
  71. package/dist/resources/levels.d.ts +13 -13
  72. package/dist/resources/levels.js +25 -34
  73. package/dist/server/resource-registry.d.ts +20 -0
  74. package/dist/server/resource-registry.js +37 -0
  75. package/dist/server/tool-registry.d.ts +23 -0
  76. package/dist/server/tool-registry.js +322 -0
  77. package/dist/server-setup.d.ts +20 -0
  78. package/dist/server-setup.js +71 -0
  79. package/dist/services/health-monitor.d.ts +34 -0
  80. package/dist/services/health-monitor.js +105 -0
  81. package/dist/services/metrics-server.d.ts +11 -0
  82. package/dist/services/metrics-server.js +105 -0
  83. package/dist/tools/actors.d.ts +163 -9
  84. package/dist/tools/actors.js +356 -311
  85. package/dist/tools/animation.d.ts +135 -4
  86. package/dist/tools/animation.js +510 -411
  87. package/dist/tools/assets.d.ts +75 -29
  88. package/dist/tools/assets.js +265 -284
  89. package/dist/tools/audio.d.ts +102 -42
  90. package/dist/tools/audio.js +272 -685
  91. package/dist/tools/base-tool.d.ts +17 -0
  92. package/dist/tools/base-tool.js +46 -0
  93. package/dist/tools/behavior-tree.d.ts +94 -0
  94. package/dist/tools/behavior-tree.js +39 -0
  95. package/dist/tools/blueprint.d.ts +208 -126
  96. package/dist/tools/blueprint.js +685 -832
  97. package/dist/tools/consolidated-tool-definitions.d.ts +5462 -1781
  98. package/dist/tools/consolidated-tool-definitions.js +829 -496
  99. package/dist/tools/consolidated-tool-handlers.d.ts +2 -1
  100. package/dist/tools/consolidated-tool-handlers.js +198 -1027
  101. package/dist/tools/debug.d.ts +143 -85
  102. package/dist/tools/debug.js +234 -180
  103. package/dist/tools/dynamic-handler-registry.d.ts +13 -0
  104. package/dist/tools/dynamic-handler-registry.js +23 -0
  105. package/dist/tools/editor.d.ts +30 -83
  106. package/dist/tools/editor.js +247 -244
  107. package/dist/tools/engine.d.ts +10 -4
  108. package/dist/tools/engine.js +13 -5
  109. package/dist/tools/environment.d.ts +30 -0
  110. package/dist/tools/environment.js +267 -0
  111. package/dist/tools/foliage.d.ts +65 -99
  112. package/dist/tools/foliage.js +221 -331
  113. package/dist/tools/handlers/actor-handlers.d.ts +3 -0
  114. package/dist/tools/handlers/actor-handlers.js +227 -0
  115. package/dist/tools/handlers/animation-handlers.d.ts +3 -0
  116. package/dist/tools/handlers/animation-handlers.js +185 -0
  117. package/dist/tools/handlers/argument-helper.d.ts +16 -0
  118. package/dist/tools/handlers/argument-helper.js +80 -0
  119. package/dist/tools/handlers/asset-handlers.d.ts +3 -0
  120. package/dist/tools/handlers/asset-handlers.js +496 -0
  121. package/dist/tools/handlers/audio-handlers.d.ts +3 -0
  122. package/dist/tools/handlers/audio-handlers.js +166 -0
  123. package/dist/tools/handlers/blueprint-handlers.d.ts +4 -0
  124. package/dist/tools/handlers/blueprint-handlers.js +358 -0
  125. package/dist/tools/handlers/common-handlers.d.ts +14 -0
  126. package/dist/tools/handlers/common-handlers.js +56 -0
  127. package/dist/tools/handlers/editor-handlers.d.ts +3 -0
  128. package/dist/tools/handlers/editor-handlers.js +119 -0
  129. package/dist/tools/handlers/effect-handlers.d.ts +3 -0
  130. package/dist/tools/handlers/effect-handlers.js +171 -0
  131. package/dist/tools/handlers/environment-handlers.d.ts +3 -0
  132. package/dist/tools/handlers/environment-handlers.js +170 -0
  133. package/dist/tools/handlers/graph-handlers.d.ts +3 -0
  134. package/dist/tools/handlers/graph-handlers.js +90 -0
  135. package/dist/tools/handlers/input-handlers.d.ts +3 -0
  136. package/dist/tools/handlers/input-handlers.js +21 -0
  137. package/dist/tools/handlers/inspect-handlers.d.ts +3 -0
  138. package/dist/tools/handlers/inspect-handlers.js +383 -0
  139. package/dist/tools/handlers/level-handlers.d.ts +3 -0
  140. package/dist/tools/handlers/level-handlers.js +237 -0
  141. package/dist/tools/handlers/lighting-handlers.d.ts +3 -0
  142. package/dist/tools/handlers/lighting-handlers.js +144 -0
  143. package/dist/tools/handlers/performance-handlers.d.ts +3 -0
  144. package/dist/tools/handlers/performance-handlers.js +130 -0
  145. package/dist/tools/handlers/pipeline-handlers.d.ts +3 -0
  146. package/dist/tools/handlers/pipeline-handlers.js +110 -0
  147. package/dist/tools/handlers/sequence-handlers.d.ts +3 -0
  148. package/dist/tools/handlers/sequence-handlers.js +376 -0
  149. package/dist/tools/handlers/system-handlers.d.ts +4 -0
  150. package/dist/tools/handlers/system-handlers.js +506 -0
  151. package/dist/tools/input.d.ts +19 -0
  152. package/dist/tools/input.js +89 -0
  153. package/dist/tools/introspection.d.ts +103 -40
  154. package/dist/tools/introspection.js +425 -568
  155. package/dist/tools/landscape.d.ts +54 -93
  156. package/dist/tools/landscape.js +284 -409
  157. package/dist/tools/level.d.ts +66 -27
  158. package/dist/tools/level.js +647 -675
  159. package/dist/tools/lighting.d.ts +77 -38
  160. package/dist/tools/lighting.js +445 -943
  161. package/dist/tools/logs.d.ts +3 -3
  162. package/dist/tools/logs.js +5 -57
  163. package/dist/tools/materials.d.ts +91 -24
  164. package/dist/tools/materials.js +194 -118
  165. package/dist/tools/niagara.d.ts +149 -39
  166. package/dist/tools/niagara.js +267 -182
  167. package/dist/tools/performance.d.ts +27 -13
  168. package/dist/tools/performance.js +203 -122
  169. package/dist/tools/physics.d.ts +32 -77
  170. package/dist/tools/physics.js +175 -582
  171. package/dist/tools/property-dictionary.d.ts +13 -0
  172. package/dist/tools/property-dictionary.js +82 -0
  173. package/dist/tools/sequence.d.ts +85 -60
  174. package/dist/tools/sequence.js +208 -747
  175. package/dist/tools/tool-definition-utils.d.ts +59 -0
  176. package/dist/tools/tool-definition-utils.js +35 -0
  177. package/dist/tools/ui.d.ts +64 -34
  178. package/dist/tools/ui.js +134 -214
  179. package/dist/types/automation-responses.d.ts +115 -0
  180. package/dist/types/automation-responses.js +2 -0
  181. package/dist/types/env.d.ts +0 -3
  182. package/dist/types/env.js +0 -7
  183. package/dist/types/responses.d.ts +249 -0
  184. package/dist/types/responses.js +2 -0
  185. package/dist/types/tool-interfaces.d.ts +898 -0
  186. package/dist/types/tool-interfaces.js +2 -0
  187. package/dist/types/tool-types.d.ts +183 -19
  188. package/dist/types/tool-types.js +0 -4
  189. package/dist/unreal-bridge.d.ts +24 -131
  190. package/dist/unreal-bridge.js +364 -1506
  191. package/dist/utils/command-validator.d.ts +9 -0
  192. package/dist/utils/command-validator.js +68 -0
  193. package/dist/utils/elicitation.d.ts +1 -1
  194. package/dist/utils/elicitation.js +12 -15
  195. package/dist/utils/error-handler.d.ts +2 -51
  196. package/dist/utils/error-handler.js +11 -87
  197. package/dist/utils/ini-reader.d.ts +3 -0
  198. package/dist/utils/ini-reader.js +69 -0
  199. package/dist/utils/logger.js +9 -6
  200. package/dist/utils/normalize.d.ts +3 -0
  201. package/dist/utils/normalize.js +56 -0
  202. package/dist/utils/path-security.d.ts +2 -0
  203. package/dist/utils/path-security.js +24 -0
  204. package/dist/utils/response-factory.d.ts +7 -0
  205. package/dist/utils/response-factory.js +27 -0
  206. package/dist/utils/response-validator.d.ts +3 -24
  207. package/dist/utils/response-validator.js +130 -81
  208. package/dist/utils/result-helpers.d.ts +4 -5
  209. package/dist/utils/result-helpers.js +15 -16
  210. package/dist/utils/safe-json.js +5 -11
  211. package/dist/utils/unreal-command-queue.d.ts +24 -0
  212. package/dist/utils/unreal-command-queue.js +120 -0
  213. package/dist/utils/validation.d.ts +0 -40
  214. package/dist/utils/validation.js +1 -78
  215. package/dist/wasm/index.d.ts +70 -0
  216. package/dist/wasm/index.js +535 -0
  217. package/docs/GraphQL-API.md +888 -0
  218. package/docs/Migration-Guide-v0.5.0.md +684 -0
  219. package/docs/Roadmap.md +53 -0
  220. package/docs/WebAssembly-Integration.md +628 -0
  221. package/docs/editor-plugin-extension.md +370 -0
  222. package/docs/handler-mapping.md +242 -0
  223. package/docs/native-automation-progress.md +128 -0
  224. package/docs/testing-guide.md +423 -0
  225. package/mcp-config-example.json +6 -6
  226. package/package.json +67 -28
  227. package/plugins/McpAutomationBridge/Config/FilterPlugin.ini +8 -0
  228. package/plugins/McpAutomationBridge/McpAutomationBridge.uplugin +64 -0
  229. package/plugins/McpAutomationBridge/Source/McpAutomationBridge/McpAutomationBridge.Build.cs +189 -0
  230. package/plugins/McpAutomationBridge/Source/McpAutomationBridge/Private/McpAutomationBridgeGlobals.cpp +22 -0
  231. package/plugins/McpAutomationBridge/Source/McpAutomationBridge/Private/McpAutomationBridgeGlobals.h +30 -0
  232. package/plugins/McpAutomationBridge/Source/McpAutomationBridge/Private/McpAutomationBridgeHelpers.h +1983 -0
  233. package/plugins/McpAutomationBridge/Source/McpAutomationBridge/Private/McpAutomationBridgeModule.cpp +72 -0
  234. package/plugins/McpAutomationBridge/Source/McpAutomationBridge/Private/McpAutomationBridgeSettings.cpp +46 -0
  235. package/plugins/McpAutomationBridge/Source/McpAutomationBridge/Private/McpAutomationBridgeSubsystem.cpp +581 -0
  236. package/plugins/McpAutomationBridge/Source/McpAutomationBridge/Private/McpAutomationBridge_AnimationHandlers.cpp +2394 -0
  237. package/plugins/McpAutomationBridge/Source/McpAutomationBridge/Private/McpAutomationBridge_AssetQueryHandlers.cpp +300 -0
  238. package/plugins/McpAutomationBridge/Source/McpAutomationBridge/Private/McpAutomationBridge_AssetWorkflowHandlers.cpp +2807 -0
  239. package/plugins/McpAutomationBridge/Source/McpAutomationBridge/Private/McpAutomationBridge_AudioHandlers.cpp +1087 -0
  240. package/plugins/McpAutomationBridge/Source/McpAutomationBridge/Private/McpAutomationBridge_BehaviorTreeHandlers.cpp +488 -0
  241. package/plugins/McpAutomationBridge/Source/McpAutomationBridge/Private/McpAutomationBridge_BlueprintCreationHandlers.cpp +643 -0
  242. package/plugins/McpAutomationBridge/Source/McpAutomationBridge/Private/McpAutomationBridge_BlueprintCreationHandlers.h +31 -0
  243. package/plugins/McpAutomationBridge/Source/McpAutomationBridge/Private/McpAutomationBridge_BlueprintGraphHandlers.cpp +1184 -0
  244. package/plugins/McpAutomationBridge/Source/McpAutomationBridge/Private/McpAutomationBridge_BlueprintHandlers.cpp +5652 -0
  245. package/plugins/McpAutomationBridge/Source/McpAutomationBridge/Private/McpAutomationBridge_BlueprintHandlers_List.cpp +152 -0
  246. package/plugins/McpAutomationBridge/Source/McpAutomationBridge/Private/McpAutomationBridge_ControlHandlers.cpp +2614 -0
  247. package/plugins/McpAutomationBridge/Source/McpAutomationBridge/Private/McpAutomationBridge_DebugHandlers.cpp +42 -0
  248. package/plugins/McpAutomationBridge/Source/McpAutomationBridge/Private/McpAutomationBridge_EditorFunctionHandlers.cpp +1237 -0
  249. package/plugins/McpAutomationBridge/Source/McpAutomationBridge/Private/McpAutomationBridge_EffectHandlers.cpp +1701 -0
  250. package/plugins/McpAutomationBridge/Source/McpAutomationBridge/Private/McpAutomationBridge_EnvironmentHandlers.cpp +2145 -0
  251. package/plugins/McpAutomationBridge/Source/McpAutomationBridge/Private/McpAutomationBridge_FoliageHandlers.cpp +954 -0
  252. package/plugins/McpAutomationBridge/Source/McpAutomationBridge/Private/McpAutomationBridge_InputHandlers.cpp +209 -0
  253. package/plugins/McpAutomationBridge/Source/McpAutomationBridge/Private/McpAutomationBridge_InsightsHandlers.cpp +41 -0
  254. package/plugins/McpAutomationBridge/Source/McpAutomationBridge/Private/McpAutomationBridge_LandscapeHandlers.cpp +1164 -0
  255. package/plugins/McpAutomationBridge/Source/McpAutomationBridge/Private/McpAutomationBridge_LevelHandlers.cpp +762 -0
  256. package/plugins/McpAutomationBridge/Source/McpAutomationBridge/Private/McpAutomationBridge_LightingHandlers.cpp +634 -0
  257. package/plugins/McpAutomationBridge/Source/McpAutomationBridge/Private/McpAutomationBridge_LogHandlers.cpp +136 -0
  258. package/plugins/McpAutomationBridge/Source/McpAutomationBridge/Private/McpAutomationBridge_MaterialGraphHandlers.cpp +494 -0
  259. package/plugins/McpAutomationBridge/Source/McpAutomationBridge/Private/McpAutomationBridge_NiagaraGraphHandlers.cpp +278 -0
  260. package/plugins/McpAutomationBridge/Source/McpAutomationBridge/Private/McpAutomationBridge_NiagaraHandlers.cpp +625 -0
  261. package/plugins/McpAutomationBridge/Source/McpAutomationBridge/Private/McpAutomationBridge_PerformanceHandlers.cpp +401 -0
  262. package/plugins/McpAutomationBridge/Source/McpAutomationBridge/Private/McpAutomationBridge_PipelineHandlers.cpp +67 -0
  263. package/plugins/McpAutomationBridge/Source/McpAutomationBridge/Private/McpAutomationBridge_ProcessRequest.cpp +735 -0
  264. package/plugins/McpAutomationBridge/Source/McpAutomationBridge/Private/McpAutomationBridge_PropertyHandlers.cpp +2634 -0
  265. package/plugins/McpAutomationBridge/Source/McpAutomationBridge/Private/McpAutomationBridge_RenderHandlers.cpp +189 -0
  266. package/plugins/McpAutomationBridge/Source/McpAutomationBridge/Private/McpAutomationBridge_SCSHandlers.cpp +917 -0
  267. package/plugins/McpAutomationBridge/Source/McpAutomationBridge/Private/McpAutomationBridge_SCSHandlers.h +39 -0
  268. package/plugins/McpAutomationBridge/Source/McpAutomationBridge/Private/McpAutomationBridge_SequenceHandlers.cpp +2670 -0
  269. package/plugins/McpAutomationBridge/Source/McpAutomationBridge/Private/McpAutomationBridge_SequencerHandlers.cpp +519 -0
  270. package/plugins/McpAutomationBridge/Source/McpAutomationBridge/Private/McpAutomationBridge_TestHandlers.cpp +38 -0
  271. package/plugins/McpAutomationBridge/Source/McpAutomationBridge/Private/McpAutomationBridge_UiHandlers.cpp +668 -0
  272. package/plugins/McpAutomationBridge/Source/McpAutomationBridge/Private/McpAutomationBridge_WorldPartitionHandlers.cpp +346 -0
  273. package/plugins/McpAutomationBridge/Source/McpAutomationBridge/Private/McpBridgeWebSocket.cpp +1330 -0
  274. package/plugins/McpAutomationBridge/Source/McpAutomationBridge/Private/McpBridgeWebSocket.h +149 -0
  275. package/plugins/McpAutomationBridge/Source/McpAutomationBridge/Private/McpConnectionManager.cpp +783 -0
  276. package/plugins/McpAutomationBridge/Source/McpAutomationBridge/Public/McpAutomationBridgeSettings.h +115 -0
  277. package/plugins/McpAutomationBridge/Source/McpAutomationBridge/Public/McpAutomationBridgeSubsystem.h +796 -0
  278. package/plugins/McpAutomationBridge/Source/McpAutomationBridge/Public/McpConnectionManager.h +117 -0
  279. package/scripts/check-unreal-connection.mjs +19 -0
  280. package/scripts/clean-tmp.js +23 -0
  281. package/scripts/patch-wasm.js +26 -0
  282. package/scripts/run-all-tests.mjs +136 -0
  283. package/scripts/smoke-test.ts +94 -0
  284. package/scripts/sync-mcp-plugin.js +143 -0
  285. package/scripts/test-no-plugin-alternates.mjs +113 -0
  286. package/scripts/validate-server.js +46 -0
  287. package/scripts/verify-automation-bridge.js +200 -0
  288. package/server.json +58 -21
  289. package/src/automation/bridge.ts +558 -0
  290. package/src/automation/connection-manager.ts +130 -0
  291. package/src/automation/handshake.ts +99 -0
  292. package/src/automation/index.ts +2 -0
  293. package/src/automation/message-handler.ts +167 -0
  294. package/src/automation/request-tracker.ts +123 -0
  295. package/src/automation/types.ts +107 -0
  296. package/src/cli.ts +33 -6
  297. package/src/config.ts +73 -0
  298. package/src/constants.ts +19 -0
  299. package/src/graphql/loaders.ts +244 -0
  300. package/src/graphql/resolvers.ts +1008 -0
  301. package/src/graphql/schema.ts +452 -0
  302. package/src/graphql/server.ts +156 -0
  303. package/src/graphql/types.ts +10 -0
  304. package/src/handlers/resource-handlers.ts +186 -0
  305. package/src/index.ts +166 -664
  306. package/src/resources/actors.ts +58 -76
  307. package/src/resources/assets.ts +148 -134
  308. package/src/resources/levels.ts +28 -33
  309. package/src/server/resource-registry.ts +47 -0
  310. package/src/server/tool-registry.ts +354 -0
  311. package/src/server-setup.ts +114 -0
  312. package/src/services/health-monitor.ts +132 -0
  313. package/src/services/metrics-server.ts +142 -0
  314. package/src/tools/actors.ts +426 -323
  315. package/src/tools/animation.ts +672 -461
  316. package/src/tools/assets.ts +364 -289
  317. package/src/tools/audio.ts +323 -766
  318. package/src/tools/base-tool.ts +52 -0
  319. package/src/tools/behavior-tree.ts +45 -0
  320. package/src/tools/blueprint.ts +792 -970
  321. package/src/tools/consolidated-tool-definitions.ts +993 -515
  322. package/src/tools/consolidated-tool-handlers.ts +258 -1146
  323. package/src/tools/debug.ts +292 -187
  324. package/src/tools/dynamic-handler-registry.ts +33 -0
  325. package/src/tools/editor.ts +329 -253
  326. package/src/tools/engine.ts +14 -3
  327. package/src/tools/environment.ts +281 -0
  328. package/src/tools/foliage.ts +330 -392
  329. package/src/tools/handlers/actor-handlers.ts +265 -0
  330. package/src/tools/handlers/animation-handlers.ts +237 -0
  331. package/src/tools/handlers/argument-helper.ts +142 -0
  332. package/src/tools/handlers/asset-handlers.ts +532 -0
  333. package/src/tools/handlers/audio-handlers.ts +194 -0
  334. package/src/tools/handlers/blueprint-handlers.ts +380 -0
  335. package/src/tools/handlers/common-handlers.ts +87 -0
  336. package/src/tools/handlers/editor-handlers.ts +123 -0
  337. package/src/tools/handlers/effect-handlers.ts +220 -0
  338. package/src/tools/handlers/environment-handlers.ts +183 -0
  339. package/src/tools/handlers/graph-handlers.ts +116 -0
  340. package/src/tools/handlers/input-handlers.ts +28 -0
  341. package/src/tools/handlers/inspect-handlers.ts +450 -0
  342. package/src/tools/handlers/level-handlers.ts +252 -0
  343. package/src/tools/handlers/lighting-handlers.ts +147 -0
  344. package/src/tools/handlers/performance-handlers.ts +132 -0
  345. package/src/tools/handlers/pipeline-handlers.ts +127 -0
  346. package/src/tools/handlers/sequence-handlers.ts +415 -0
  347. package/src/tools/handlers/system-handlers.ts +564 -0
  348. package/src/tools/input.ts +101 -0
  349. package/src/tools/introspection.ts +493 -584
  350. package/src/tools/landscape.ts +418 -507
  351. package/src/tools/level.ts +786 -708
  352. package/src/tools/lighting.ts +588 -984
  353. package/src/tools/logs.ts +9 -57
  354. package/src/tools/materials.ts +237 -121
  355. package/src/tools/niagara.ts +335 -168
  356. package/src/tools/performance.ts +320 -169
  357. package/src/tools/physics.ts +274 -613
  358. package/src/tools/property-dictionary.ts +98 -0
  359. package/src/tools/sequence.ts +276 -820
  360. package/src/tools/tool-definition-utils.ts +35 -0
  361. package/src/tools/ui.ts +205 -283
  362. package/src/types/automation-responses.ts +119 -0
  363. package/src/types/env.ts +0 -10
  364. package/src/types/responses.ts +355 -0
  365. package/src/types/tool-interfaces.ts +250 -0
  366. package/src/types/tool-types.ts +243 -21
  367. package/src/unreal-bridge.ts +460 -1550
  368. package/src/utils/command-validator.ts +76 -0
  369. package/src/utils/elicitation.ts +10 -7
  370. package/src/utils/error-handler.ts +14 -90
  371. package/src/utils/ini-reader.ts +86 -0
  372. package/src/utils/logger.ts +8 -3
  373. package/src/utils/normalize.test.ts +162 -0
  374. package/src/utils/normalize.ts +60 -0
  375. package/src/utils/path-security.ts +43 -0
  376. package/src/utils/response-factory.ts +44 -0
  377. package/src/utils/response-validator.ts +176 -56
  378. package/src/utils/result-helpers.ts +21 -19
  379. package/src/utils/safe-json.test.ts +90 -0
  380. package/src/utils/safe-json.ts +14 -11
  381. package/src/utils/unreal-command-queue.ts +152 -0
  382. package/src/utils/validation.test.ts +184 -0
  383. package/src/utils/validation.ts +4 -1
  384. package/src/wasm/index.ts +838 -0
  385. package/test-server.mjs +100 -0
  386. package/tests/run-unreal-tool-tests.mjs +242 -14
  387. package/tests/test-animation.mjs +369 -0
  388. package/tests/test-asset-advanced.mjs +82 -0
  389. package/tests/test-asset-errors.mjs +35 -0
  390. package/tests/test-asset-graph.mjs +311 -0
  391. package/tests/test-audio.mjs +417 -0
  392. package/tests/test-automation-timeouts.mjs +98 -0
  393. package/tests/test-behavior-tree.mjs +444 -0
  394. package/tests/test-blueprint-graph.mjs +410 -0
  395. package/tests/test-blueprint.mjs +577 -0
  396. package/tests/test-client-mode.mjs +86 -0
  397. package/tests/test-console-command.mjs +56 -0
  398. package/tests/test-control-actor.mjs +425 -0
  399. package/tests/test-control-editor.mjs +112 -0
  400. package/tests/test-graphql.mjs +372 -0
  401. package/tests/test-input.mjs +349 -0
  402. package/tests/test-inspect.mjs +302 -0
  403. package/tests/test-landscape.mjs +316 -0
  404. package/tests/test-lighting.mjs +428 -0
  405. package/tests/test-manage-asset.mjs +438 -0
  406. package/tests/test-manage-level.mjs +89 -0
  407. package/tests/test-materials.mjs +356 -0
  408. package/tests/test-niagara.mjs +185 -0
  409. package/tests/test-no-inline-python.mjs +122 -0
  410. package/tests/test-performance.mjs +539 -0
  411. package/tests/test-plugin-handshake.mjs +82 -0
  412. package/tests/test-runner.mjs +933 -0
  413. package/tests/test-sequence.mjs +104 -0
  414. package/tests/test-system.mjs +96 -0
  415. package/tests/test-wasm.mjs +283 -0
  416. package/tests/test-world-partition.mjs +215 -0
  417. package/tsconfig.json +3 -3
  418. package/vitest.config.ts +35 -0
  419. package/wasm/Cargo.lock +363 -0
  420. package/wasm/Cargo.toml +42 -0
  421. package/wasm/LICENSE +21 -0
  422. package/wasm/README.md +253 -0
  423. package/wasm/src/dependency_resolver.rs +377 -0
  424. package/wasm/src/lib.rs +153 -0
  425. package/wasm/src/property_parser.rs +271 -0
  426. package/wasm/src/transform_math.rs +396 -0
  427. package/wasm/tests/integration.rs +109 -0
  428. package/.github/workflows/smithery-build.yml +0 -29
  429. package/dist/prompts/index.d.ts +0 -21
  430. package/dist/prompts/index.js +0 -217
  431. package/dist/tools/build_environment_advanced.d.ts +0 -65
  432. package/dist/tools/build_environment_advanced.js +0 -633
  433. package/dist/tools/rc.d.ts +0 -110
  434. package/dist/tools/rc.js +0 -437
  435. package/dist/tools/visual.d.ts +0 -40
  436. package/dist/tools/visual.js +0 -282
  437. package/dist/utils/http.d.ts +0 -6
  438. package/dist/utils/http.js +0 -151
  439. package/dist/utils/python-output.d.ts +0 -18
  440. package/dist/utils/python-output.js +0 -290
  441. package/dist/utils/python.d.ts +0 -2
  442. package/dist/utils/python.js +0 -4
  443. package/dist/utils/stdio-redirect.d.ts +0 -2
  444. package/dist/utils/stdio-redirect.js +0 -20
  445. package/docs/unreal-tool-test-cases.md +0 -574
  446. package/smithery.yaml +0 -29
  447. package/src/prompts/index.ts +0 -249
  448. package/src/tools/build_environment_advanced.ts +0 -732
  449. package/src/tools/rc.ts +0 -515
  450. package/src/tools/visual.ts +0 -281
  451. package/src/utils/http.ts +0 -187
  452. package/src/utils/python-output.ts +0 -351
  453. package/src/utils/python.ts +0 -3
  454. package/src/utils/stdio-redirect.ts +0 -18
package/package.json CHANGED
@@ -1,8 +1,8 @@
1
1
  {
2
2
  "name": "unreal-engine-mcp-server",
3
- "version": "0.4.7",
3
+ "version": "0.5.1",
4
4
  "mcpName": "io.github.ChiR24/unreal-engine-mcp",
5
- "description": "A comprehensive Model Context Protocol (MCP) server that enables AI assistants to control Unreal Engine via Remote Control API. Built with TypeScript and designed for game development automation.",
5
+ "description": "A comprehensive Model Context Protocol (MCP) server that enables AI assistants to control Unreal Engine via native automation bridge. Built with TypeScript and designed for game development automation.",
6
6
  "type": "module",
7
7
  "module": "src/index.ts",
8
8
  "main": "dist/index.js",
@@ -11,20 +11,56 @@
11
11
  "unreal-engine-mcp-server": "dist/cli.js"
12
12
  },
13
13
  "scripts": {
14
- "build": "tsc -p tsconfig.json",
14
+ "build:core": "tsc -p tsconfig.json",
15
+ "build": "npm run build:core && (npm run build:wasm || echo \"WASM build failed or wasm-pack missing; continuing with TypeScript-only build. To enable WASM, install wasm-pack and re-run npm run build.\")",
15
16
  "build:watch": "tsc -p tsconfig.json --watch",
16
- "start": "node dist/cli.js",
17
- "smithery:dev": "npx @smithery/cli dev",
18
- "smithery:build": "npx @smithery/cli build",
19
- "smithery:ci": "npm run build && npx @smithery/cli build",
20
- "dev": "ts-node-esm src/cli.ts",
21
- "lint": "eslint . --ext .ts",
17
+ "start": "node dist/cli.js",
18
+ "dev": "ts-node-esm src/cli.ts",
19
+ "lint": "echo \"Lint: typescript/javascript, C, C++, C#\" && eslint . --ext .ts",
22
20
  "lint:fix": "eslint . --ext .ts --fix",
21
+ "lint:cpp": "echo \"Running C/C++ lint (cpplint)\" && (python -m cpplint --recursive plugins || echo 'cpplint not found; skipping C/C++ lint')",
22
+ "lint:c": "echo \"Running C lint (cpplint)\" && (python -m cpplint --recursive plugins || echo 'cpplint not found; skipping C lint')",
23
+ "lint:csharp": "echo \"Running C# lint (dotnet format)\" && (dotnet tool run dotnet-format --verify-no-changes || echo 'dotnet-format not available or formatting required; skipping C# lint')",
23
24
  "clean": "rimraf dist",
24
25
  "prepare": "npm run build",
25
- "test:tools": "node tests/run-unreal-tool-tests.mjs",
26
+ "automation:sync": "node scripts/sync-mcp-plugin.js",
27
+ "clean:tmp": "node scripts/clean-tmp.js",
28
+ "test": "node scripts/run-all-tests.mjs",
29
+ "test:unit": "vitest run",
30
+ "test:unit:watch": "vitest",
31
+ "test:unit:coverage": "vitest run --coverage",
32
+ "test:all": "node scripts/run-all-tests.mjs",
33
+ "test:manage_asset": "node tests/test-manage-asset.mjs",
34
+ "test:plugin-handshake": "node tests/test-plugin-handshake.mjs",
35
+ "test:control_actor": "node tests/test-control-actor.mjs",
36
+ "test:control_editor": "node tests/test-control-editor.mjs",
37
+ "test:manage_level": "node tests/test-manage-level.mjs",
38
+ "test:animation": "node tests/test-animation.mjs",
39
+ "test:blueprint": "node tests/test-blueprint.mjs",
40
+ "test:blueprint_graph": "node tests/test-blueprint-graph.mjs",
41
+ "test:materials": "node tests/test-materials.mjs",
42
+ "test:niagara": "node tests/test-niagara.mjs",
43
+ "test:landscape": "node tests/test-landscape.mjs",
44
+ "test:sequence": "node tests/test-sequence.mjs",
45
+ "test:system": "node tests/test-system.mjs",
46
+ "test:console_command": "node tests/test-console-command.mjs",
47
+ "test:inspect": "node tests/test-inspect.mjs",
48
+ "test:asset_advanced": "node tests/test-asset-advanced.mjs",
49
+ "test:world_partition": "node tests/test-world-partition.mjs",
50
+ "test:no-inline-python": "node tests/test-no-inline-python.mjs",
51
+ "test:graphql": "node tests/test-graphql.mjs",
52
+ "test:audio": "node tests/test-audio.mjs",
53
+ "test:behavior_tree": "node tests/test-behavior-tree.mjs",
54
+ "test:lighting": "node tests/test-lighting.mjs",
55
+ "test:performance": "node tests/test-performance.mjs",
56
+ "test:input": "node tests/test-input.mjs",
57
+ "test:asset_graph": "node tests/test-asset-graph.mjs",
58
+ "test:wasm": "node tests/test-wasm.mjs",
59
+ "build:wasm": "echo 'Building WebAssembly module...' && cd wasm && wasm-pack build --target web --out-dir ../src/wasm/pkg && cd .. && node scripts/patch-wasm.js",
60
+ "test:wasm:all": "npm run build:core && npm run build:wasm && node tests/test-wasm.mjs",
61
+ "test:smoke": "node --loader ts-node/esm scripts/smoke-test.ts",
26
62
  "type-check": "tsc --noEmit",
27
- "prebuild": "npm run clean"
63
+ "prebuild": "npm run lint && npm run clean"
28
64
  },
29
65
  "engines": {
30
66
  "node": ">=18"
@@ -42,25 +78,28 @@
42
78
  "author": "Unreal Engine MCP Team",
43
79
  "license": "MIT",
44
80
  "dependencies": {
45
- "@modelcontextprotocol/sdk": "^1.19.1",
46
- "zod": "^3.22.2",
81
+ "@graphql-tools/schema": "^10.0.30",
82
+ "@graphql-tools/utils": "^10.11.0",
83
+ "@modelcontextprotocol/sdk": "^1.25.0",
47
84
  "ajv": "^8.17.1",
48
- "axios": "^1.12.2",
49
- "dotenv": "^16.4.5",
50
- "json5": "^2.2.3",
51
- "ws": "^8.18.0",
52
- "yargs": "^17.7.2"
85
+ "dataloader": "^2.2.3",
86
+ "dotenv": "^17.2.3",
87
+ "graphql": "^16.12.0",
88
+ "graphql-yoga": "^5.17.1",
89
+ "ws": "^8.18.3",
90
+ "zod": "^4.2.1"
53
91
  },
54
92
  "devDependencies": {
55
- "@types/json5": "^0.0.30",
56
- "@types/node": "^20.12.7",
57
- "@types/ws": "^8.5.10",
58
- "@typescript-eslint/eslint-plugin": "^8.44.1",
59
- "@typescript-eslint/parser": "^8.44.1",
60
- "eslint": "^9.36.0",
61
- "@smithery/cli": "^1.0.0",
62
- "rimraf": "^6.0.1",
93
+ "@types/json5": "^2.2.0",
94
+ "@types/node": "^25.0.2",
95
+ "@types/ws": "^8.18.1",
96
+ "@typescript-eslint/eslint-plugin": "^8.50.0",
97
+ "@typescript-eslint/parser": "^8.49.0",
98
+ "@vitest/coverage-v8": "^4.0.16",
99
+ "eslint": "^9.39.2",
100
+ "rimraf": "^6.1.2",
63
101
  "ts-node": "^10.9.2",
64
- "typescript": "^5.4.5"
102
+ "typescript": "^5.9.3",
103
+ "vitest": "^4.0.16"
65
104
  }
66
- }
105
+ }
@@ -0,0 +1,8 @@
1
+ [FilterPlugin]
2
+ ; This section lists additional files which will be packaged along with your plugin. Paths should be listed relative to the root plugin directory, and
3
+ ; may include "...", "*", and "?" wildcards to match directories, files, and individual characters respectively.
4
+ ;
5
+ ; Examples:
6
+ ; /README.txt
7
+ ; /Extras/...
8
+ ; /Binaries/ThirdParty/*.dll
@@ -0,0 +1,64 @@
1
+ {
2
+ "FileVersion": 3,
3
+ "Version": 1,
4
+ "VersionName": "0.1.0",
5
+ "FriendlyName": "MCP Automation Bridge",
6
+ "Description": "Editor-side bridge that accepts elevated automation requests from the Unreal MCP server.",
7
+ "Category": "Automation",
8
+ "CreatedBy": "unreal-engine-mcp-server",
9
+ "CreatedByURL": "https://github.com/ChiR24/Unreal_mcp",
10
+ "DocsURL": "",
11
+ "MarketplaceURL": "",
12
+ "SupportURL": "",
13
+ "CanContainContent": false,
14
+ "IsBetaVersion": true,
15
+ "IsExperimentalVersion": true,
16
+ "EnabledByDefault": true,
17
+ "SupportsUEBuildSystem": true,
18
+ "Modules": [
19
+ {
20
+ "Name": "McpAutomationBridge",
21
+ "Type": "Editor",
22
+ "LoadingPhase": "Default"
23
+ }
24
+ ],
25
+ "BlacklistPlatforms": [],
26
+ "Plugins": [
27
+ {
28
+ "Name": "EditorScriptingUtilities",
29
+ "Enabled": true
30
+ },
31
+ {
32
+ "Name": "LevelSequenceEditor",
33
+ "Enabled": true
34
+ },
35
+ {
36
+ "Name": "Niagara",
37
+ "Enabled": true
38
+ },
39
+ {
40
+ "Name": "ControlRig",
41
+ "Enabled": true
42
+ },
43
+ {
44
+ "Name": "ProceduralMeshComponent",
45
+ "Enabled": true
46
+ },
47
+ {
48
+ "Name": "Interchange",
49
+ "Enabled": true
50
+ },
51
+ {
52
+ "Name": "InterchangeOpenUSD",
53
+ "Enabled": true
54
+ },
55
+ {
56
+ "Name": "DataValidation",
57
+ "Enabled": true
58
+ },
59
+ {
60
+ "Name": "EnhancedInput",
61
+ "Enabled": true
62
+ }
63
+ ]
64
+ }
@@ -0,0 +1,189 @@
1
+ using UnrealBuildTool;
2
+ using System;
3
+ using System.IO;
4
+ using System.Collections.Generic;
5
+
6
+ public class McpAutomationBridge : ModuleRules
7
+ {
8
+ /// <summary>
9
+ /// Configures build rules, dependencies, and compile-time feature definitions for the McpAutomationBridge module based on the provided build target.
10
+ /// </summary>
11
+ /// <param name="Target">Build target settings used to determine platform, configuration, and whether editor-only dependencies and feature flags should be enabled.</param>
12
+ public McpAutomationBridge(ReadOnlyTargetRules Target) : base(Target)
13
+ {
14
+ PCHUsage = PCHUsageMode.UseExplicitOrSharedPCHs;
15
+
16
+ PublicDependencyModuleNames.AddRange(new string[]
17
+ {
18
+ "Core","CoreUObject","Engine","Json","JsonUtilities",
19
+ "LevelSequence", "MovieScene", "MovieSceneTracks"
20
+ });
21
+
22
+ if (Target.bBuildEditor)
23
+ {
24
+ // Editor-only Public Dependencies
25
+ PublicDependencyModuleNames.AddRange(new string[]
26
+ {
27
+ "LevelSequenceEditor", "Sequencer", "MovieSceneTools", "Niagara", "NiagaraEditor", "UnrealEd",
28
+ "WorldPartitionEditor", "DataLayerEditor", "EnhancedInput", "InputEditor"
29
+ });
30
+
31
+ PrivateDependencyModuleNames.AddRange(new string[]
32
+ {
33
+ "ApplicationCore","Slate","SlateCore","Projects","InputCore","DeveloperSettings","Settings","EngineSettings",
34
+ "Sockets","Networking","EditorSubsystem","EditorScriptingUtilities","BlueprintGraph",
35
+ "Kismet","KismetCompiler","AssetRegistry","AssetTools","MaterialEditor","SourceControl",
36
+ "AudioEditor", "DataValidation", "NiagaraEditor"
37
+ });
38
+
39
+ PrivateDependencyModuleNames.AddRange(new string[]
40
+ {
41
+ "Landscape","LandscapeEditor","LandscapeEditorUtilities","Foliage","FoliageEdit",
42
+ "AnimGraph","AnimationBlueprintLibrary","Persona","ToolMenus","EditorWidgets","PropertyEditor","LevelEditor",
43
+ "ControlRig","ControlRigDeveloper","ControlRigEditor","UMG","UMGEditor","ProceduralMeshComponent","MergeActors",
44
+ "BehaviorTreeEditor", "RenderCore", "RHI", "AutomationController", "GameplayDebugger", "TraceLog", "TraceAnalysis", "AIModule", "AIGraph",
45
+ "MeshUtilities", "MaterialUtilities"
46
+ });
47
+
48
+ // Ensure editor builds expose full Blueprint graph editing APIs.
49
+ PublicDefinitions.Add("MCP_HAS_K2NODE_HEADERS=1");
50
+ PublicDefinitions.Add("MCP_HAS_EDGRAPH_SCHEMA_K2=1");
51
+
52
+ // --- Feature Detection Logic ---
53
+
54
+ string EngineDir = Path.GetFullPath(Target.RelativeEnginePath);
55
+
56
+ // 1. SubobjectData Detection
57
+ // UE 5.7 renamed/moved this to SubobjectDataInterface in Editor/
58
+ bool bHasSubobjectDataInterface = Directory.Exists(Path.Combine(EngineDir, "Source", "Editor", "SubobjectDataInterface"));
59
+
60
+ if (bHasSubobjectDataInterface)
61
+ {
62
+ PrivateDependencyModuleNames.Add("SubobjectDataInterface");
63
+ PublicDefinitions.Add("MCP_HAS_SUBOBJECT_DATA_SUBSYSTEM=1");
64
+ }
65
+ else
66
+ {
67
+ // Fallback for older versions
68
+ if (!PrivateDependencyModuleNames.Contains("SubobjectData"))
69
+ {
70
+ PrivateDependencyModuleNames.Add("SubobjectData");
71
+ }
72
+ PublicDefinitions.Add("MCP_HAS_SUBOBJECT_DATA_SUBSYSTEM=1");
73
+ }
74
+
75
+ // 2. WorldPartition Support Detection
76
+ // Detect whether UWorldPartition supports ForEachDataLayerInstance
77
+ bool bHasWPForEach = false;
78
+ try
79
+ {
80
+ // In UE 5.7, ForEachDataLayerInstance moved to DataLayerManager.h
81
+ string WPHeader = Path.Combine(EngineDir, "Source", "Runtime", "Engine", "Public", "WorldPartition", "DataLayer", "DataLayerManager.h");
82
+ if (!File.Exists(WPHeader))
83
+ {
84
+ // Fallback to old location for older engines
85
+ WPHeader = Path.Combine(EngineDir, "Source", "Runtime", "Engine", "Public", "WorldPartition", "WorldPartition.h");
86
+ }
87
+
88
+ if (File.Exists(WPHeader))
89
+ {
90
+ string Content = File.ReadAllText(WPHeader);
91
+ if (Content.Contains("ForEachDataLayerInstance("))
92
+ {
93
+ bHasWPForEach = true;
94
+ }
95
+ }
96
+ }
97
+ catch {}
98
+
99
+ PublicDefinitions.Add(bHasWPForEach ? "MCP_HAS_WP_FOR_EACH_DATALAYER=1" : "MCP_HAS_WP_FOR_EACH_DATALAYER=0");
100
+
101
+ // Ensure Win64 debug builds emit Edit-and-Continue friendly debug info
102
+ if (Target.Platform == UnrealTargetPlatform.Win64 && Target.Configuration == UnrealTargetConfiguration.Debug)
103
+ {
104
+ PublicDefinitions.Add("MCP_ENABLE_EDIT_AND_CONTINUE=1");
105
+ }
106
+
107
+ // Control Rig Factory Support
108
+ PublicDefinitions.Add("MCP_HAS_CONTROLRIG_FACTORY=1");
109
+ }
110
+ else
111
+ {
112
+ // Non-editor builds cannot rely on editor-only headers.
113
+ PublicDefinitions.Add("MCP_HAS_K2NODE_HEADERS=0");
114
+ PublicDefinitions.Add("MCP_HAS_EDGRAPH_SCHEMA_K2=0");
115
+ PublicDefinitions.Add("MCP_HAS_SUBOBJECT_DATA_SUBSYSTEM=0");
116
+ PublicDefinitions.Add("MCP_HAS_WP_FOR_EACH_DATALAYER=0");
117
+ }
118
+ }
119
+
120
+ /// <summary>
121
+ /// Determines whether a SubobjectData module or plugin exists under the given engine directory.
122
+ /// </summary>
123
+ /// <param name="EngineDir">Absolute path to the engine root directory to inspect.</param>
124
+ /// <returns>`true` if a SubobjectData directory is found in EngineDir/Source/Runtime/SubobjectData or anywhere under EngineDir/Plugins/Runtime; `false` if not found or if an error occurs.</returns>
125
+ private bool IsSubobjectDataAvailable(string EngineDir)
126
+ {
127
+ try
128
+ {
129
+ if (string.IsNullOrEmpty(EngineDir)) return false;
130
+
131
+ // Check Runtime module
132
+ string RuntimeDir = Path.Combine(EngineDir, "Source", "Runtime", "SubobjectData");
133
+ if (Directory.Exists(RuntimeDir)) return true;
134
+
135
+ // Check Plugins
136
+ string PluginsDir = Path.Combine(EngineDir, "Plugins");
137
+ if (Directory.Exists(PluginsDir))
138
+ {
139
+ // Simple check for the folder in Runtime plugins
140
+ // A full recursive search might be slow, but we can check common locations or do a search
141
+ // The original code did a recursive search in Plugins/Runtime
142
+ string PluginsRuntime = Path.Combine(PluginsDir, "Runtime");
143
+ if (Directory.Exists(PluginsRuntime))
144
+ {
145
+ var Found = Directory.GetDirectories(PluginsRuntime, "SubobjectData", SearchOption.AllDirectories);
146
+ if (Found.Length > 0) return true;
147
+ }
148
+ }
149
+ }
150
+ catch {}
151
+ return false;
152
+ }
153
+
154
+ /// <summary>
155
+ /// Determines whether the current project contains a "SubobjectData" directory inside its Plugins folder by searching upward from the provided module directory for the project root (.uproject).
156
+ /// </summary>
157
+ /// <param name="ModuleDir">Path to the module directory used as the starting point to locate the project root.</param>
158
+ /// <returns>`true` if a "SubobjectData" directory is found under the project's Plugins directory, `false` otherwise.</returns>
159
+ private bool IsSubobjectDataInProject(string ModuleDir)
160
+ {
161
+ try
162
+ {
163
+ // Find project root by looking for .uproject
164
+ string ProjectRoot = null;
165
+ DirectoryInfo Dir = new DirectoryInfo(ModuleDir);
166
+ while (Dir != null)
167
+ {
168
+ if (Dir.GetFiles("*.uproject").Length > 0)
169
+ {
170
+ ProjectRoot = Dir.FullName;
171
+ break;
172
+ }
173
+ Dir = Dir.Parent;
174
+ }
175
+
176
+ if (!string.IsNullOrEmpty(ProjectRoot))
177
+ {
178
+ string ProjPlugins = Path.Combine(ProjectRoot, "Plugins");
179
+ if (Directory.Exists(ProjPlugins))
180
+ {
181
+ var Found = Directory.GetDirectories(ProjPlugins, "SubobjectData", SearchOption.AllDirectories);
182
+ if (Found.Length > 0) return true;
183
+ }
184
+ }
185
+ }
186
+ catch {}
187
+ return false;
188
+ }
189
+ }
@@ -0,0 +1,22 @@
1
+ #include "McpAutomationBridgeGlobals.h"
2
+
3
+ TMap<FString, TArray<TPair<FString, TSharedPtr<FMcpBridgeWebSocket>>>>
4
+ GBlueprintExistsInflight;
5
+ TMap<FString, TArray<TPair<FString, TSharedPtr<FMcpBridgeWebSocket>>>>
6
+ GBlueprintCreateInflight;
7
+ TMap<FString, double> GBlueprintCreateInflightTs;
8
+ FCriticalSection GBlueprintCreateMutex;
9
+ double GBlueprintCreateStaleTimeoutSec = 60.0;
10
+ TSet<FString> GBlueprintBusySet;
11
+ TMap<FString, TSharedPtr<FJsonObject>> GBlueprintRegistry;
12
+
13
+ TMap<FString, TSharedPtr<FJsonObject>> GSequenceRegistry;
14
+ FString GCurrentSequencePath;
15
+
16
+ TMap<FString, TSharedPtr<FJsonObject>> GNiagaraRegistry;
17
+
18
+ // Recent asset save tracking (throttle across plugin to avoid frequent
19
+ // SavePackage calls)
20
+ TMap<FString, double> GRecentAssetSaveTs;
21
+ FCriticalSection GRecentAssetSaveMutex;
22
+ double GRecentAssetSaveThrottleSeconds = 0.5;
@@ -0,0 +1,30 @@
1
+ // Shared globals for McpAutomationBridge plugin
2
+ #pragma once
3
+
4
+ #include "CoreMinimal.h"
5
+ #include "HAL/CriticalSection.h"
6
+
7
+ extern TMap<FString,
8
+ TArray<TPair<FString, TSharedPtr<class FMcpBridgeWebSocket>>>>
9
+ GBlueprintExistsInflight;
10
+ extern TMap<FString,
11
+ TArray<TPair<FString, TSharedPtr<class FMcpBridgeWebSocket>>>>
12
+ GBlueprintCreateInflight;
13
+ extern TMap<FString, double> GBlueprintCreateInflightTs;
14
+ extern FCriticalSection GBlueprintCreateMutex;
15
+ extern double GBlueprintCreateStaleTimeoutSec;
16
+ extern TSet<FString> GBlueprintBusySet;
17
+ extern TMap<FString, TSharedPtr<FJsonObject>> GBlueprintRegistry;
18
+
19
+ extern TMap<FString, TSharedPtr<FJsonObject>> GSequenceRegistry;
20
+ extern FString GCurrentSequencePath;
21
+
22
+ // Lightweight registry used for created Niagara systems when running in
23
+ // fast-mode or when native Niagara factories are not available. Tests and
24
+ // higher-level tooling may rely on a plugin-side record of created
25
+ // Niagara assets even when on-disk creation is not possible.
26
+ extern TMap<FString, TSharedPtr<FJsonObject>> GNiagaraRegistry;
27
+
28
+ extern TMap<FString, double> GRecentAssetSaveTs;
29
+ extern FCriticalSection GRecentAssetSaveMutex;
30
+ extern double GRecentAssetSaveThrottleSeconds;