unreal-engine-mcp-server 0.4.6 → 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.
- package/.env.example +26 -0
- package/.env.production +38 -7
- package/.eslintrc.json +0 -54
- package/.eslintrc.override.json +8 -0
- package/.github/ISSUE_TEMPLATE/bug_report.yml +94 -0
- package/.github/ISSUE_TEMPLATE/config.yml +8 -0
- package/.github/ISSUE_TEMPLATE/feature_request.yml +56 -0
- package/.github/copilot-instructions.md +478 -45
- package/.github/dependabot.yml +19 -0
- package/.github/labeler.yml +24 -0
- package/.github/labels.yml +70 -0
- package/.github/pull_request_template.md +42 -0
- package/.github/release-drafter.yml +148 -0
- package/.github/workflows/auto-merge.yml +38 -0
- package/.github/workflows/ci.yml +38 -0
- package/.github/workflows/dependency-review.yml +17 -0
- package/.github/workflows/gemini-issue-triage.yml +172 -0
- package/.github/workflows/greetings.yml +23 -0
- package/.github/workflows/labeler.yml +16 -0
- package/.github/workflows/links.yml +80 -0
- package/.github/workflows/pr-size-labeler.yml +137 -0
- package/.github/workflows/publish-mcp.yml +12 -7
- package/.github/workflows/release-drafter.yml +23 -0
- package/.github/workflows/release.yml +112 -0
- package/.github/workflows/semantic-pull-request.yml +35 -0
- package/.github/workflows/smoke-test.yml +36 -0
- package/.github/workflows/stale.yml +28 -0
- package/CHANGELOG.md +269 -22
- package/CONTRIBUTING.md +140 -0
- package/README.md +166 -72
- package/claude_desktop_config_example.json +7 -6
- package/dist/automation/bridge.d.ts +50 -0
- package/dist/automation/bridge.js +452 -0
- package/dist/automation/connection-manager.d.ts +23 -0
- package/dist/automation/connection-manager.js +107 -0
- package/dist/automation/handshake.d.ts +11 -0
- package/dist/automation/handshake.js +89 -0
- package/dist/automation/index.d.ts +3 -0
- package/dist/automation/index.js +3 -0
- package/dist/automation/message-handler.d.ts +12 -0
- package/dist/automation/message-handler.js +149 -0
- package/dist/automation/request-tracker.d.ts +25 -0
- package/dist/automation/request-tracker.js +98 -0
- package/dist/automation/types.d.ts +130 -0
- package/dist/automation/types.js +2 -0
- package/dist/cli.js +32 -5
- package/dist/config.d.ts +27 -0
- package/dist/config.js +60 -0
- package/dist/constants.d.ts +12 -0
- package/dist/constants.js +12 -0
- package/dist/graphql/resolvers.d.ts +268 -0
- package/dist/graphql/resolvers.js +743 -0
- package/dist/graphql/schema.d.ts +5 -0
- package/dist/graphql/schema.js +437 -0
- package/dist/graphql/server.d.ts +26 -0
- package/dist/graphql/server.js +115 -0
- package/dist/graphql/types.d.ts +7 -0
- package/dist/graphql/types.js +2 -0
- package/dist/handlers/resource-handlers.d.ts +20 -0
- package/dist/handlers/resource-handlers.js +180 -0
- package/dist/index.d.ts +31 -18
- package/dist/index.js +119 -604
- package/dist/prompts/index.js +4 -4
- package/dist/resources/actors.d.ts +17 -12
- package/dist/resources/actors.js +56 -76
- package/dist/resources/assets.d.ts +6 -14
- package/dist/resources/assets.js +115 -147
- package/dist/resources/levels.d.ts +13 -13
- package/dist/resources/levels.js +25 -34
- package/dist/server/resource-registry.d.ts +20 -0
- package/dist/server/resource-registry.js +37 -0
- package/dist/server/tool-registry.d.ts +23 -0
- package/dist/server/tool-registry.js +322 -0
- package/dist/server-setup.d.ts +21 -0
- package/dist/server-setup.js +111 -0
- package/dist/services/health-monitor.d.ts +34 -0
- package/dist/services/health-monitor.js +105 -0
- package/dist/services/metrics-server.d.ts +11 -0
- package/dist/services/metrics-server.js +105 -0
- package/dist/tools/actors.d.ts +147 -9
- package/dist/tools/actors.js +350 -311
- package/dist/tools/animation.d.ts +135 -4
- package/dist/tools/animation.js +510 -411
- package/dist/tools/assets.d.ts +117 -19
- package/dist/tools/assets.js +259 -284
- package/dist/tools/audio.d.ts +102 -42
- package/dist/tools/audio.js +272 -685
- package/dist/tools/base-tool.d.ts +17 -0
- package/dist/tools/base-tool.js +46 -0
- package/dist/tools/behavior-tree.d.ts +94 -0
- package/dist/tools/behavior-tree.js +39 -0
- package/dist/tools/blueprint/helpers.d.ts +29 -0
- package/dist/tools/blueprint/helpers.js +182 -0
- package/dist/tools/blueprint.d.ts +228 -118
- package/dist/tools/blueprint.js +685 -832
- package/dist/tools/consolidated-tool-definitions.d.ts +5475 -1627
- package/dist/tools/consolidated-tool-definitions.js +829 -482
- package/dist/tools/consolidated-tool-handlers.d.ts +2 -1
- package/dist/tools/consolidated-tool-handlers.js +211 -1009
- package/dist/tools/debug.d.ts +143 -85
- package/dist/tools/debug.js +234 -180
- package/dist/tools/dynamic-handler-registry.d.ts +11 -0
- package/dist/tools/dynamic-handler-registry.js +101 -0
- package/dist/tools/editor.d.ts +139 -18
- package/dist/tools/editor.js +239 -244
- package/dist/tools/engine.d.ts +10 -4
- package/dist/tools/engine.js +13 -5
- package/dist/tools/environment.d.ts +36 -0
- package/dist/tools/environment.js +267 -0
- package/dist/tools/foliage.d.ts +105 -14
- package/dist/tools/foliage.js +219 -331
- package/dist/tools/handlers/actor-handlers.d.ts +3 -0
- package/dist/tools/handlers/actor-handlers.js +232 -0
- package/dist/tools/handlers/animation-handlers.d.ts +3 -0
- package/dist/tools/handlers/animation-handlers.js +185 -0
- package/dist/tools/handlers/argument-helper.d.ts +16 -0
- package/dist/tools/handlers/argument-helper.js +80 -0
- package/dist/tools/handlers/asset-handlers.d.ts +3 -0
- package/dist/tools/handlers/asset-handlers.js +496 -0
- package/dist/tools/handlers/audio-handlers.d.ts +3 -0
- package/dist/tools/handlers/audio-handlers.js +166 -0
- package/dist/tools/handlers/blueprint-handlers.d.ts +4 -0
- package/dist/tools/handlers/blueprint-handlers.js +358 -0
- package/dist/tools/handlers/common-handlers.d.ts +14 -0
- package/dist/tools/handlers/common-handlers.js +56 -0
- package/dist/tools/handlers/editor-handlers.d.ts +3 -0
- package/dist/tools/handlers/editor-handlers.js +119 -0
- package/dist/tools/handlers/effect-handlers.d.ts +3 -0
- package/dist/tools/handlers/effect-handlers.js +171 -0
- package/dist/tools/handlers/environment-handlers.d.ts +3 -0
- package/dist/tools/handlers/environment-handlers.js +170 -0
- package/dist/tools/handlers/graph-handlers.d.ts +3 -0
- package/dist/tools/handlers/graph-handlers.js +90 -0
- package/dist/tools/handlers/input-handlers.d.ts +3 -0
- package/dist/tools/handlers/input-handlers.js +21 -0
- package/dist/tools/handlers/inspect-handlers.d.ts +3 -0
- package/dist/tools/handlers/inspect-handlers.js +383 -0
- package/dist/tools/handlers/level-handlers.d.ts +3 -0
- package/dist/tools/handlers/level-handlers.js +237 -0
- package/dist/tools/handlers/lighting-handlers.d.ts +3 -0
- package/dist/tools/handlers/lighting-handlers.js +144 -0
- package/dist/tools/handlers/performance-handlers.d.ts +3 -0
- package/dist/tools/handlers/performance-handlers.js +130 -0
- package/dist/tools/handlers/pipeline-handlers.d.ts +3 -0
- package/dist/tools/handlers/pipeline-handlers.js +110 -0
- package/dist/tools/handlers/sequence-handlers.d.ts +3 -0
- package/dist/tools/handlers/sequence-handlers.js +376 -0
- package/dist/tools/handlers/system-handlers.d.ts +4 -0
- package/dist/tools/handlers/system-handlers.js +506 -0
- package/dist/tools/input.d.ts +19 -0
- package/dist/tools/input.js +89 -0
- package/dist/tools/introspection.d.ts +103 -40
- package/dist/tools/introspection.js +425 -568
- package/dist/tools/landscape.d.ts +97 -36
- package/dist/tools/landscape.js +280 -409
- package/dist/tools/level.d.ts +130 -10
- package/dist/tools/level.js +639 -675
- package/dist/tools/lighting.d.ts +77 -38
- package/dist/tools/lighting.js +441 -943
- package/dist/tools/logs.d.ts +45 -0
- package/dist/tools/logs.js +210 -0
- package/dist/tools/materials.d.ts +91 -24
- package/dist/tools/materials.js +190 -118
- package/dist/tools/niagara.d.ts +149 -39
- package/dist/tools/niagara.js +232 -182
- package/dist/tools/performance.d.ts +27 -12
- package/dist/tools/performance.js +204 -122
- package/dist/tools/physics.d.ts +32 -77
- package/dist/tools/physics.js +171 -582
- package/dist/tools/property-dictionary.d.ts +13 -0
- package/dist/tools/property-dictionary.js +82 -0
- package/dist/tools/sequence.d.ts +73 -48
- package/dist/tools/sequence.js +196 -748
- package/dist/tools/tool-definition-utils.d.ts +59 -0
- package/dist/tools/tool-definition-utils.js +35 -0
- package/dist/tools/ui.d.ts +66 -34
- package/dist/tools/ui.js +134 -214
- package/dist/types/env.d.ts +0 -3
- package/dist/types/env.js +0 -7
- package/dist/types/tool-interfaces.d.ts +898 -0
- package/dist/types/tool-interfaces.js +2 -0
- package/dist/types/tool-types.d.ts +195 -11
- package/dist/types/tool-types.js +0 -4
- package/dist/unreal-bridge.d.ts +24 -131
- package/dist/unreal-bridge.js +364 -1506
- package/dist/utils/command-validator.d.ts +9 -0
- package/dist/utils/command-validator.js +67 -0
- package/dist/utils/elicitation.d.ts +1 -1
- package/dist/utils/elicitation.js +12 -15
- package/dist/utils/error-handler.d.ts +2 -51
- package/dist/utils/error-handler.js +11 -87
- package/dist/utils/ini-reader.d.ts +3 -0
- package/dist/utils/ini-reader.js +69 -0
- package/dist/utils/logger.js +9 -6
- package/dist/utils/normalize.d.ts +3 -0
- package/dist/utils/normalize.js +56 -0
- package/dist/utils/response-factory.d.ts +7 -0
- package/dist/utils/response-factory.js +33 -0
- package/dist/utils/response-validator.d.ts +3 -24
- package/dist/utils/response-validator.js +130 -81
- package/dist/utils/result-helpers.d.ts +4 -5
- package/dist/utils/result-helpers.js +15 -16
- package/dist/utils/safe-json.js +5 -11
- package/dist/utils/unreal-command-queue.d.ts +24 -0
- package/dist/utils/unreal-command-queue.js +120 -0
- package/dist/utils/validation.d.ts +0 -40
- package/dist/utils/validation.js +1 -78
- package/dist/wasm/index.d.ts +70 -0
- package/dist/wasm/index.js +535 -0
- package/docs/GraphQL-API.md +888 -0
- package/docs/Migration-Guide-v0.5.0.md +692 -0
- package/docs/Roadmap.md +53 -0
- package/docs/WebAssembly-Integration.md +628 -0
- package/docs/editor-plugin-extension.md +370 -0
- package/docs/handler-mapping.md +242 -0
- package/docs/native-automation-progress.md +128 -0
- package/docs/testing-guide.md +423 -0
- package/mcp-config-example.json +6 -6
- package/package.json +60 -27
- package/plugins/McpAutomationBridge/Config/FilterPlugin.ini +8 -0
- package/plugins/McpAutomationBridge/McpAutomationBridge.uplugin +64 -0
- package/plugins/McpAutomationBridge/Source/McpAutomationBridge/McpAutomationBridge.Build.cs +189 -0
- package/plugins/McpAutomationBridge/Source/McpAutomationBridge/Private/McpAutomationBridgeGlobals.cpp +22 -0
- package/plugins/McpAutomationBridge/Source/McpAutomationBridge/Private/McpAutomationBridgeGlobals.h +30 -0
- package/plugins/McpAutomationBridge/Source/McpAutomationBridge/Private/McpAutomationBridgeHelpers.h +1983 -0
- package/plugins/McpAutomationBridge/Source/McpAutomationBridge/Private/McpAutomationBridgeModule.cpp +72 -0
- package/plugins/McpAutomationBridge/Source/McpAutomationBridge/Private/McpAutomationBridgeSettings.cpp +46 -0
- package/plugins/McpAutomationBridge/Source/McpAutomationBridge/Private/McpAutomationBridgeSubsystem.cpp +581 -0
- package/plugins/McpAutomationBridge/Source/McpAutomationBridge/Private/McpAutomationBridge_AnimationHandlers.cpp +2394 -0
- package/plugins/McpAutomationBridge/Source/McpAutomationBridge/Private/McpAutomationBridge_AssetQueryHandlers.cpp +300 -0
- package/plugins/McpAutomationBridge/Source/McpAutomationBridge/Private/McpAutomationBridge_AssetWorkflowHandlers.cpp +2807 -0
- package/plugins/McpAutomationBridge/Source/McpAutomationBridge/Private/McpAutomationBridge_AudioHandlers.cpp +1087 -0
- package/plugins/McpAutomationBridge/Source/McpAutomationBridge/Private/McpAutomationBridge_BehaviorTreeHandlers.cpp +488 -0
- package/plugins/McpAutomationBridge/Source/McpAutomationBridge/Private/McpAutomationBridge_BlueprintCreationHandlers.cpp +643 -0
- package/plugins/McpAutomationBridge/Source/McpAutomationBridge/Private/McpAutomationBridge_BlueprintCreationHandlers.h +31 -0
- package/plugins/McpAutomationBridge/Source/McpAutomationBridge/Private/McpAutomationBridge_BlueprintGraphHandlers.cpp +1184 -0
- package/plugins/McpAutomationBridge/Source/McpAutomationBridge/Private/McpAutomationBridge_BlueprintHandlers.cpp +5652 -0
- package/plugins/McpAutomationBridge/Source/McpAutomationBridge/Private/McpAutomationBridge_BlueprintHandlers_List.cpp +152 -0
- package/plugins/McpAutomationBridge/Source/McpAutomationBridge/Private/McpAutomationBridge_ControlHandlers.cpp +2614 -0
- package/plugins/McpAutomationBridge/Source/McpAutomationBridge/Private/McpAutomationBridge_DebugHandlers.cpp +42 -0
- package/plugins/McpAutomationBridge/Source/McpAutomationBridge/Private/McpAutomationBridge_EditorFunctionHandlers.cpp +1237 -0
- package/plugins/McpAutomationBridge/Source/McpAutomationBridge/Private/McpAutomationBridge_EffectHandlers.cpp +1701 -0
- package/plugins/McpAutomationBridge/Source/McpAutomationBridge/Private/McpAutomationBridge_EnvironmentHandlers.cpp +2145 -0
- package/plugins/McpAutomationBridge/Source/McpAutomationBridge/Private/McpAutomationBridge_FoliageHandlers.cpp +954 -0
- package/plugins/McpAutomationBridge/Source/McpAutomationBridge/Private/McpAutomationBridge_InputHandlers.cpp +209 -0
- package/plugins/McpAutomationBridge/Source/McpAutomationBridge/Private/McpAutomationBridge_InsightsHandlers.cpp +41 -0
- package/plugins/McpAutomationBridge/Source/McpAutomationBridge/Private/McpAutomationBridge_LandscapeHandlers.cpp +1164 -0
- package/plugins/McpAutomationBridge/Source/McpAutomationBridge/Private/McpAutomationBridge_LevelHandlers.cpp +762 -0
- package/plugins/McpAutomationBridge/Source/McpAutomationBridge/Private/McpAutomationBridge_LightingHandlers.cpp +634 -0
- package/plugins/McpAutomationBridge/Source/McpAutomationBridge/Private/McpAutomationBridge_LogHandlers.cpp +136 -0
- package/plugins/McpAutomationBridge/Source/McpAutomationBridge/Private/McpAutomationBridge_MaterialGraphHandlers.cpp +494 -0
- package/plugins/McpAutomationBridge/Source/McpAutomationBridge/Private/McpAutomationBridge_NiagaraGraphHandlers.cpp +278 -0
- package/plugins/McpAutomationBridge/Source/McpAutomationBridge/Private/McpAutomationBridge_NiagaraHandlers.cpp +625 -0
- package/plugins/McpAutomationBridge/Source/McpAutomationBridge/Private/McpAutomationBridge_PerformanceHandlers.cpp +401 -0
- package/plugins/McpAutomationBridge/Source/McpAutomationBridge/Private/McpAutomationBridge_PipelineHandlers.cpp +67 -0
- package/plugins/McpAutomationBridge/Source/McpAutomationBridge/Private/McpAutomationBridge_ProcessRequest.cpp +735 -0
- package/plugins/McpAutomationBridge/Source/McpAutomationBridge/Private/McpAutomationBridge_PropertyHandlers.cpp +2634 -0
- package/plugins/McpAutomationBridge/Source/McpAutomationBridge/Private/McpAutomationBridge_RenderHandlers.cpp +189 -0
- package/plugins/McpAutomationBridge/Source/McpAutomationBridge/Private/McpAutomationBridge_SCSHandlers.cpp +917 -0
- package/plugins/McpAutomationBridge/Source/McpAutomationBridge/Private/McpAutomationBridge_SCSHandlers.h +39 -0
- package/plugins/McpAutomationBridge/Source/McpAutomationBridge/Private/McpAutomationBridge_SequenceHandlers.cpp +2670 -0
- package/plugins/McpAutomationBridge/Source/McpAutomationBridge/Private/McpAutomationBridge_SequencerHandlers.cpp +519 -0
- package/plugins/McpAutomationBridge/Source/McpAutomationBridge/Private/McpAutomationBridge_TestHandlers.cpp +38 -0
- package/plugins/McpAutomationBridge/Source/McpAutomationBridge/Private/McpAutomationBridge_UiHandlers.cpp +668 -0
- package/plugins/McpAutomationBridge/Source/McpAutomationBridge/Private/McpAutomationBridge_WorldPartitionHandlers.cpp +346 -0
- package/plugins/McpAutomationBridge/Source/McpAutomationBridge/Private/McpBridgeWebSocket.cpp +1330 -0
- package/plugins/McpAutomationBridge/Source/McpAutomationBridge/Private/McpBridgeWebSocket.h +149 -0
- package/plugins/McpAutomationBridge/Source/McpAutomationBridge/Private/McpConnectionManager.cpp +783 -0
- package/plugins/McpAutomationBridge/Source/McpAutomationBridge/Public/McpAutomationBridgeSettings.h +115 -0
- package/plugins/McpAutomationBridge/Source/McpAutomationBridge/Public/McpAutomationBridgeSubsystem.h +796 -0
- package/plugins/McpAutomationBridge/Source/McpAutomationBridge/Public/McpConnectionManager.h +117 -0
- package/scripts/check-unreal-connection.mjs +19 -0
- package/scripts/clean-tmp.js +23 -0
- package/scripts/patch-wasm.js +26 -0
- package/scripts/run-all-tests.mjs +131 -0
- package/scripts/smoke-test.ts +94 -0
- package/scripts/sync-mcp-plugin.js +143 -0
- package/scripts/test-no-plugin-alternates.mjs +113 -0
- package/scripts/validate-server.js +46 -0
- package/scripts/verify-automation-bridge.js +200 -0
- package/server.json +57 -21
- package/src/automation/bridge.ts +558 -0
- package/src/automation/connection-manager.ts +130 -0
- package/src/automation/handshake.ts +99 -0
- package/src/automation/index.ts +2 -0
- package/src/automation/message-handler.ts +167 -0
- package/src/automation/request-tracker.ts +123 -0
- package/src/automation/types.ts +107 -0
- package/src/cli.ts +33 -6
- package/src/config.ts +73 -0
- package/src/constants.ts +12 -0
- package/src/graphql/resolvers.ts +1010 -0
- package/src/graphql/schema.ts +452 -0
- package/src/graphql/server.ts +154 -0
- package/src/graphql/types.ts +7 -0
- package/src/handlers/resource-handlers.ts +186 -0
- package/src/index.ts +152 -649
- package/src/prompts/index.ts +4 -4
- package/src/resources/actors.ts +58 -76
- package/src/resources/assets.ts +147 -134
- package/src/resources/levels.ts +28 -33
- package/src/server/resource-registry.ts +47 -0
- package/src/server/tool-registry.ts +354 -0
- package/src/server-setup.ts +148 -0
- package/src/services/health-monitor.ts +132 -0
- package/src/services/metrics-server.ts +142 -0
- package/src/tools/actors.ts +417 -322
- package/src/tools/animation.ts +671 -461
- package/src/tools/assets.ts +353 -289
- package/src/tools/audio.ts +323 -766
- package/src/tools/base-tool.ts +52 -0
- package/src/tools/behavior-tree.ts +45 -0
- package/src/tools/blueprint/helpers.ts +189 -0
- package/src/tools/blueprint.ts +787 -965
- package/src/tools/consolidated-tool-definitions.ts +993 -500
- package/src/tools/consolidated-tool-handlers.ts +272 -1122
- package/src/tools/debug.ts +292 -187
- package/src/tools/dynamic-handler-registry.ts +151 -0
- package/src/tools/editor.ts +309 -246
- package/src/tools/engine.ts +14 -3
- package/src/tools/environment.ts +287 -0
- package/src/tools/foliage.ts +314 -379
- package/src/tools/handlers/actor-handlers.ts +271 -0
- package/src/tools/handlers/animation-handlers.ts +237 -0
- package/src/tools/handlers/argument-helper.ts +142 -0
- package/src/tools/handlers/asset-handlers.ts +532 -0
- package/src/tools/handlers/audio-handlers.ts +194 -0
- package/src/tools/handlers/blueprint-handlers.ts +380 -0
- package/src/tools/handlers/common-handlers.ts +87 -0
- package/src/tools/handlers/editor-handlers.ts +123 -0
- package/src/tools/handlers/effect-handlers.ts +220 -0
- package/src/tools/handlers/environment-handlers.ts +183 -0
- package/src/tools/handlers/graph-handlers.ts +116 -0
- package/src/tools/handlers/input-handlers.ts +28 -0
- package/src/tools/handlers/inspect-handlers.ts +450 -0
- package/src/tools/handlers/level-handlers.ts +252 -0
- package/src/tools/handlers/lighting-handlers.ts +147 -0
- package/src/tools/handlers/performance-handlers.ts +132 -0
- package/src/tools/handlers/pipeline-handlers.ts +127 -0
- package/src/tools/handlers/sequence-handlers.ts +415 -0
- package/src/tools/handlers/system-handlers.ts +564 -0
- package/src/tools/input.ts +101 -0
- package/src/tools/introspection.ts +493 -584
- package/src/tools/landscape.ts +394 -489
- package/src/tools/level.ts +752 -694
- package/src/tools/lighting.ts +583 -984
- package/src/tools/logs.ts +219 -0
- package/src/tools/materials.ts +231 -121
- package/src/tools/niagara.ts +293 -168
- package/src/tools/performance.ts +320 -168
- package/src/tools/physics.ts +268 -613
- package/src/tools/property-dictionary.ts +98 -0
- package/src/tools/sequence.ts +255 -815
- package/src/tools/tool-definition-utils.ts +35 -0
- package/src/tools/ui.ts +207 -283
- package/src/types/env.ts +0 -10
- package/src/types/tool-interfaces.ts +250 -0
- package/src/types/tool-types.ts +250 -13
- package/src/unreal-bridge.ts +460 -1550
- package/src/utils/command-validator.ts +75 -0
- package/src/utils/elicitation.ts +10 -7
- package/src/utils/error-handler.ts +14 -90
- package/src/utils/ini-reader.ts +86 -0
- package/src/utils/logger.ts +8 -3
- package/src/utils/normalize.ts +60 -0
- package/src/utils/response-factory.ts +39 -0
- package/src/utils/response-validator.ts +176 -56
- package/src/utils/result-helpers.ts +21 -19
- package/src/utils/safe-json.ts +14 -11
- package/src/utils/unreal-command-queue.ts +152 -0
- package/src/utils/validation.ts +4 -1
- package/src/wasm/index.ts +838 -0
- package/test-server.mjs +100 -0
- package/tests/run-unreal-tool-tests.mjs +242 -14
- package/tests/test-animation.mjs +44 -0
- package/tests/test-asset-advanced.mjs +82 -0
- package/tests/test-asset-errors.mjs +35 -0
- package/tests/test-audio.mjs +219 -0
- package/tests/test-automation-timeouts.mjs +98 -0
- package/tests/test-behavior-tree.mjs +261 -0
- package/tests/test-blueprint-events.mjs +35 -0
- package/tests/test-blueprint-graph.mjs +79 -0
- package/tests/test-blueprint.mjs +577 -0
- package/tests/test-client-mode.mjs +86 -0
- package/tests/test-console-command.mjs +56 -0
- package/tests/test-control-actor.mjs +425 -0
- package/tests/test-control-editor.mjs +80 -0
- package/tests/test-extra-tools.mjs +38 -0
- package/tests/test-graphql.mjs +322 -0
- package/tests/test-inspect.mjs +72 -0
- package/tests/test-landscape.mjs +60 -0
- package/tests/test-manage-asset.mjs +438 -0
- package/tests/test-manage-level.mjs +70 -0
- package/tests/test-materials.mjs +356 -0
- package/tests/test-niagara.mjs +185 -0
- package/tests/test-no-inline-python.mjs +122 -0
- package/tests/test-plugin-handshake.mjs +82 -0
- package/tests/test-render.mjs +33 -0
- package/tests/test-runner.mjs +933 -0
- package/tests/test-search-assets.mjs +66 -0
- package/tests/test-sequence.mjs +68 -0
- package/tests/test-system.mjs +57 -0
- package/tests/test-wasm.mjs +193 -0
- package/tests/test-world-partition.mjs +215 -0
- package/tsconfig.json +3 -3
- package/wasm/Cargo.lock +363 -0
- package/wasm/Cargo.toml +42 -0
- package/wasm/LICENSE +21 -0
- package/wasm/README.md +253 -0
- package/wasm/src/dependency_resolver.rs +377 -0
- package/wasm/src/lib.rs +153 -0
- package/wasm/src/property_parser.rs +271 -0
- package/wasm/src/transform_math.rs +396 -0
- package/wasm/tests/integration.rs +109 -0
- package/.github/workflows/smithery-build.yml +0 -29
- package/dist/tools/build_environment_advanced.d.ts +0 -65
- package/dist/tools/build_environment_advanced.js +0 -633
- package/dist/tools/rc.d.ts +0 -110
- package/dist/tools/rc.js +0 -437
- package/dist/tools/visual.d.ts +0 -40
- package/dist/tools/visual.js +0 -282
- package/dist/utils/http.d.ts +0 -6
- package/dist/utils/http.js +0 -151
- package/dist/utils/python-output.d.ts +0 -18
- package/dist/utils/python-output.js +0 -290
- package/dist/utils/python.d.ts +0 -2
- package/dist/utils/python.js +0 -4
- package/dist/utils/stdio-redirect.d.ts +0 -2
- package/dist/utils/stdio-redirect.js +0 -20
- package/docs/unreal-tool-test-cases.md +0 -572
- package/smithery.yaml +0 -29
- package/src/tools/build_environment_advanced.ts +0 -732
- package/src/tools/rc.ts +0 -515
- package/src/tools/visual.ts +0 -281
- package/src/utils/http.ts +0 -187
- package/src/utils/python-output.ts +0 -351
- package/src/utils/python.ts +0 -3
- package/src/utils/stdio-redirect.ts +0 -18
|
@@ -1,572 +0,0 @@
|
|
|
1
|
-
# Unreal Tool Automated Test Cases
|
|
2
|
-
|
|
3
|
-
These scenarios feed the automated harness in `tests/run-unreal-tool-tests.mjs`. Every row uses a JSON payload the runner can execute directly without manual edits.
|
|
4
|
-
|
|
5
|
-
**Placeholders**
|
|
6
|
-
|
|
7
|
-
- `{{FBX_TEST_MODEL}}` resolves to a writable FBX file path. By default it maps to `C:\\Users\\micro\\Downloads\\Compressed\\fbx\\test_model.fbx`; override with the `UNREAL_MCP_FBX_DIR` or `UNREAL_MCP_FBX_FILE` environment variables if needed.
|
|
8
|
-
|
|
9
|
-
---
|
|
10
|
-
|
|
11
|
-
## Lighting Tools (`src/tools/lighting.ts`)
|
|
12
|
-
|
|
13
|
-
| # | Scenario | Example Input Payload | Expected Outcome |
|
|
14
|
-
|---|----------|-----------------------|------------------|
|
|
15
|
-
| 1 | Directional light spawn uses defaults | `{"action":"create_light","lightType":"Directional","name":"MCP_Test_Directional"}` | Success response reports the directional light spawn. |
|
|
16
|
-
| 2 | Point light spawn at custom location | `{"action":"create_light","lightType":"Point","name":"MCP_Test_Point","location":{"x":0,"y":200,"z":400}}` | Success response confirms the point light creation. |
|
|
17
|
-
| 3 | Directional light rejects negative intensity | `{"action":"create_light","lightType":"Directional","name":"MCP_Test_Directional_Bad","intensity":-1}` | Error message explains the invalid intensity value. |
|
|
18
|
-
| 4 | Directional light custom intensity and color | `{"name":"Dir_Custom","intensity":50,"color":[0.2,0.4,0.8]}` | Success response notes the directional light intensity and color update. |
|
|
19
|
-
| 5 | Directional light with custom rotation | `{"name":"Dir_Rot","rotation":[45,90,0]}` | Success response reports the directional light spawned with the requested rotation. |
|
|
20
|
-
| 6 | Point light custom location and radius | `{"name":"Point_Custom","location":[100,0,400],"radius":500}` | Success response confirms the point light radius change. |
|
|
21
|
-
| 7 | Point light invalid radius is rejected | `{"name":"Point_Bad","radius":-1}` | Error message highlights that the radius must be positive. |
|
|
22
|
-
| 8 | Point light custom falloff exponent | `{"name":"Point_Falloff","falloffExponent":4}` | Success response notes the falloff exponent update. |
|
|
23
|
-
| 9 | Spot light with cone overrides | `{"name":"Spot_Cone","location":[0,0,0],"rotation":[0,0,0],"innerCone":10,"outerCone":25}` | Success response confirms the spot light cone angles. |
|
|
24
|
-
| 10 | Spot light rejects invalid cone order | `{"name":"Spot_ConeSwap","innerCone":45,"outerCone":30}` | Error message states inner cone must be less than outer cone. |
|
|
25
|
-
| 11 | Spot light rejects outer cone above 180 | `{"name":"Spot_BadCone","outerCone":200}` | Error response cites the outer cone limit of 180 degrees. |
|
|
26
|
-
| 12 | Rect light width and height overrides | `{"name":"Rect_Custom","width":200,"height":50}` | Success response reports the rect light dimensions. |
|
|
27
|
-
| 13 | Rect light invalid width fails validation | `{"name":"Rect_Bad","width":0}` | Error message explains the width must be greater than zero. |
|
|
28
|
-
| 14 | Sky light default spawn with recapture | `{"name":"Sky_Default","recapture":true}` | Success response confirms the sky light setup and recapture trigger. |
|
|
29
|
-
| 15 | Sky light missing cubemap asset fails without cubemap | `{"name":"Sky_MissingCubemap","sourceType":"SpecifiedCubemap"}` | Error message states that a cubemap path is required when `sourceType` is `SpecifiedCubemap`. |
|
|
30
|
-
|
|
31
|
-
---
|
|
32
|
-
|
|
33
|
-
## Actor Tools (`src/tools/actors.ts`)
|
|
34
|
-
|
|
35
|
-
| # | Scenario | Example Input Payload | Expected Outcome |
|
|
36
|
-
|---|----------|-----------------------|------------------|
|
|
37
|
-
| 1 | Spawn cube actor for MCP smoke test | `{"action":"spawn","classPath":"/Engine/BasicShapes/Cube","name":"MCP_Cube_A"}` | Success response indicates the actor spawned. |
|
|
38
|
-
| 2 | Delete previously spawned actor | `{"action":"delete","actorName":"MCP_Cube_A"}` | Success response reports the actor delete. |
|
|
39
|
-
| 3 | Spawn without class path returns validation error | `{"action":"spawn"}` | Error message states that `classPath` is required. |
|
|
40
|
-
| 4 | Spawn cube actor with transform override | `{"action":"spawn","classPath":"/Engine/BasicShapes/Cube","name":"MCP_Cube_B","location":[0,100,300],"rotation":[0,45,0]}` | Success response confirms the actor spawn using the provided transform. |
|
|
41
|
-
| 5 | Delete missing actor returns error | `{"action":"delete","actorName":"MCP_Cube_Missing"}` | Error message notes that the actor could not be found. |
|
|
42
|
-
|
|
43
|
-
---
|
|
44
|
-
|
|
45
|
-
## Asset Tools (`src/tools/assets.ts`)
|
|
46
|
-
|
|
47
|
-
| # | Scenario | Example Input Payload | Expected Outcome |
|
|
48
|
-
|---|----------|-----------------------|------------------|
|
|
49
|
-
| 1 | List root content directory | `{"action":"list","directory":"/Game"}` | Success response enumerates `/Game` children. |
|
|
50
|
-
| 2 | Create material asset in MCP folder | `{"action":"create_material","name":"MCP_TestMaterial","path":"/Game/MCP/Materials"}` | Success response states that the material was created. |
|
|
51
|
-
| 3 | Import FBX with missing source file | `{"action":"import","sourcePath":"C:/Invalid/path/to/model.fbx","destinationPath":"/Game/MCP/Imports"}` | Error message explains that the source file could not be imported. |
|
|
52
|
-
| 4 | Create material in read-only engine folder | `{"action":"create_material","name":"MCP_ReadOnly","path":"/Engine/Restricted"}` | Failure response notes the destination path is read-only and nothing is written. |
|
|
53
|
-
|
|
54
|
-
---
|
|
55
|
-
|
|
56
|
-
## Animation Tools (`src/tools/animation.ts`)
|
|
57
|
-
|
|
58
|
-
| # | Scenario | Example Input Payload | Expected Outcome |
|
|
59
|
-
|---|----------|-----------------------|------------------|
|
|
60
|
-
| 1 | Create animation blueprint with missing skeleton fails | `{"action":"create_animation_bp","name":"ABP_MCP_Test","skeletonPath":"/Game/MCP/NotReal.SK_NotReal"}` | Error message explains that the skeleton asset is missing. |
|
|
61
|
-
| 2 | Play montage on missing actor fails gracefully | `{"action":"play_montage","actorName":"MissingActor","montagePath":"/Game/MCP/Anims/MT_Missing"}` | Error response notes that the actor was not found. |
|
|
62
|
-
| 3 | Setup ragdoll on missing actor fails | `{"action":"setup_ragdoll","actorName":"MissingActor","physicsAssetName":"/Game/MCP/Physics/PH_Missing"}` | Error response states that the actor could not be located for ragdoll setup. |
|
|
63
|
-
| 4 | Create animation blueprint using engine skeletal cube | `{"action":"create_animation_bp","name":"ABP_MCP_EngineCube","skeletonPath":"/Engine/EngineMeshes/SkeletalCube.SkeletalCube","savePath":"/Game/MCP/Anims"}` | Failure response explains the referenced skeleton asset is invalid. |
|
|
64
|
-
|
|
65
|
-
---
|
|
66
|
-
|
|
67
|
-
## Blueprint Tools (`src/tools/blueprint.ts`)
|
|
68
|
-
|
|
69
|
-
| # | Scenario | Example Input Payload | Expected Outcome |
|
|
70
|
-
|---|----------|-----------------------|------------------|
|
|
71
|
-
| 1 | Create actor blueprint | `{"action":"create","name":"BP_Test","blueprintType":"Actor","savePath":"/Game/Blueprints"}` | Asset created at path. |
|
|
72
|
-
| 2 | Create blueprint invalid parent | `{"action":"create","name":"BP_InvalidParent","blueprintType":"Actor","savePath":"/Game/Blueprints","parentClass":"/Script/NonExisting"}` | Failure message. |
|
|
73
|
-
| 3 | Create blueprint whitespace name | `{"action":"create","name":" BP Hello ","blueprintType":"Actor","savePath":"/Game/Blueprints"}` | Name sanitized/trimmed before creation. |
|
|
74
|
-
| 4 | Create blueprint missing path | `{"action":"create","name":"BP_DefaultPath","blueprintType":"Actor"}` | Tool defaults to `/Game/Blueprints`; success. |
|
|
75
|
-
| 5 | Create blueprint reserved keyword | `{"action":"create","name":"class","blueprintType":"Actor","savePath":"/Game/Blueprints"}` | Name adjusted to `class_Asset`. |
|
|
76
|
-
| 6 | Create blueprint path with invalid characters | `{"action":"create","name":"BP_BadPath","blueprintType":"Actor","savePath":"/Game/Bad:Path"}` | Path sanitized before asset creation. |
|
|
77
|
-
| 7 | Create blueprint when folder locked | `{"action":"create","name":"BP_ReadOnly","blueprintType":"Actor","savePath":"/Engine/Blueprints"}` | Failure due to write protection. |
|
|
78
|
-
| 8 | Add component to blueprint | `{"action":"add_component","name":"BP_Test","componentType":"StaticMeshComponent","componentName":"MeshComp"}` | Component added; compile success. |
|
|
79
|
-
| 9 | Add component to missing blueprint fails | `{"action":"add_component","name":"BP_Missing","componentType":"StaticMeshComponent","componentName":"MeshComp"}` | Error message indicates that the blueprint asset was not found. |
|
|
80
|
-
| 10 | Add component with invalid component type fails | `{"action":"add_component","name":"BP_Test","componentType":"InvalidComponent","componentName":"BadComp"}` | Error message references the missing component class. |
|
|
81
|
-
|
|
82
|
-
Additional advanced blueprint scenarios remain documented in the legacy matrix for manual execution.
|
|
83
|
-
|
|
84
|
-
---
|
|
85
|
-
|
|
86
|
-
## Material Tools (`src/tools/materials.ts`)
|
|
87
|
-
|
|
88
|
-
| # | Scenario | Example Input Payload | Expected Outcome |
|
|
89
|
-
|---|----------|-----------------------|------------------|
|
|
90
|
-
| 1 | Create material asset at custom path | `{"name":"MCP_TestMaterial","path":"/Game/MCP/Materials"}` | Success response states that the material was created. |
|
|
91
|
-
| 2 | Create material with invalid characters fails | `{"name":"MCP Material","path":"/Game/MCP/Materials"}` | Error message highlights the invalid material name. |
|
|
92
|
-
| 3 | Create material in read-only engine folder fails | `{"name":"MCP_ReadOnly","path":"/Engine/Restricted"}` | Error explains that the destination path is read-only. |
|
|
93
|
-
| 4 | Create material with empty name fails validation | `{"name":" ","path":"/Game/MCP/Materials"}` | Error response states that the material name cannot be empty. |
|
|
94
|
-
| 5 | Create material outside /Game or /Engine is rejected | `{"name":"MCP_InvalidPath","path":"/Projects/Test"}` | Error explains that the path must start with `/Game` or `/Engine`. |
|
|
95
|
-
| 6 | Material name exceeding 100 characters fails | `{"name":"MCP_ThisNameIsWayTooLongForMaterialCreationBecauseItExceedsTheAllowedCharacterLimitWhichIs100Characters_Total","path":"/Game/MCP/Materials"}` | Error message notes that the material name length is above the 100 character limit. |
|
|
96
|
-
|
|
97
|
-
---
|
|
98
|
-
|
|
99
|
-
## Niagara Tools (`src/tools/niagara.ts`)
|
|
100
|
-
|
|
101
|
-
| # | Scenario | Example Input Payload | Expected Outcome |
|
|
102
|
-
|---|----------|-----------------------|------------------|
|
|
103
|
-
| 1 | Spawn debug sphere via Niagara tool | `{"action":"debug_shape","shape":"Sphere","location":{"x":0,"y":0,"z":200},"size":100,"color":[0,0.5,1,1],"duration":2}` | Success response confirms the debug shape draw. |
|
|
104
|
-
| 2 | Spawn Niagara with missing asset fails | `{"action":"niagara","systemPath":"/Game/MCP/FX/NS_Missing"}` | Error response reports that the Niagara system could not be found. |
|
|
105
|
-
| 3 | Spawn Niagara particle preset | `{"action":"particle","effectType":"Fire","name":"MCP_Fire","location":{"x":0,"y":0,"z":0},"scale":1.0}` | Success response notes the particle preset launch or simulated playback. |
|
|
106
|
-
| 4 | Niagara particle invalid effect type fails | `{"action":"particle","effectType":"NotReal","name":"MCP_Bad"}` | Error message explains the requested preset or system is unavailable. |
|
|
107
|
-
| 5 | Niagara particle rejects non-string effect type | `{"action":"particle","effectType":123,"name":"MCP_InvalidType_Number","location":{"x":0,"y":0,"z":0}}` | Error explicitly states the effect type is invalid. |
|
|
108
|
-
|
|
109
|
-
---
|
|
110
|
-
|
|
111
|
-
## Level Tools (`src/tools/level.ts`)
|
|
112
|
-
|
|
113
|
-
| # | Scenario | Example Input Payload | Expected Outcome |
|
|
114
|
-
|---|----------|-----------------------|------------------|
|
|
115
|
-
| 1 | Save current level to ensure baseline | `{"action":"save"}` | Success response confirms the level save. |
|
|
116
|
-
| 2 | Stream missing level returns error | `{"action":"stream","levelName":"NotARealSubLevel","shouldBeLoaded":true,"shouldBeVisible":true}` | Error message explains that the sub-level was not found. |
|
|
117
|
-
| 3 | Load level missing path parameter fails | `{"action":"load"}` | Error message states that `levelPath` is required. |
|
|
118
|
-
| 4 | Load non-existent level returns error | `{"action":"load","levelPath":"/Game/Maps/NotReal"}` | Error response reports that the level could not be loaded. |
|
|
119
|
-
| 5 | Stream level unload invalid name | `{"action":"stream","levelName":"AnotherMissingSubLevel","shouldBeLoaded":false,"shouldBeVisible":false}` | Error response notes that the streaming level name could not be resolved. |
|
|
120
|
-
|
|
121
|
-
---
|
|
122
|
-
|
|
123
|
-
## Sequence Tools (`src/tools/sequence.ts`)
|
|
124
|
-
|
|
125
|
-
| # | Scenario | Example Input Payload | Expected Outcome |
|
|
126
|
-
|---|----------|-----------------------|------------------|
|
|
127
|
-
| 1 | Create sequence asset for MCP automation | `{"action":"create","name":"Seq_MCP_Test","path":"/Game/MCP/Sequences"}` | Success response reports the sequence creation. |
|
|
128
|
-
| 2 | Add spawnable camera to MCP sequence | `{"action":"add_camera","path":"/Game/MCP/Sequences/Seq_MCP_Test","spawnable":true}` | Success response notes the new camera binding. |
|
|
129
|
-
| 3 | Open missing sequence returns error | `{"action":"open","path":"/Game/MCP/Sequences/Missing"}` | Error message indicates the sequence asset was not found. |
|
|
130
|
-
| 4 | Add actor binding with Sequencer disabled | `{"action":"add_actor","path":"/Game/MCP/Sequences/Seq_MCP_Test","actorName":"Cube_1"}` | Failure response warns that required Sequencer plugins are disabled. |
|
|
131
|
-
| 5 | Play sequence with loop mode pingpong | `{"action":"play","loopMode":"pingpong"}` | Success response includes `loopMode` confirmation. |
|
|
132
|
-
| 6 | Pause sequence when Sequencer disabled | `{"action":"pause"}` | Failure response notes missing Sequencer plugins. |
|
|
133
|
-
| 7 | Set sequence properties frame rate and length | `{"action":"set_properties","path":"/Game/MCP/Sequences/Seq_MCP_Test","frameRate":30,"lengthInFrames":480}` | Success response reports updated properties. |
|
|
134
|
-
| 8 | Get sequence bindings without focused sequence | `{"action":"get_bindings"}` | Failure response states no sequence is currently focused. |
|
|
135
|
-
|
|
136
|
-
---
|
|
137
|
-
|
|
138
|
-
## UI Tools (`src/tools/ui.ts`)
|
|
139
|
-
|
|
140
|
-
| # | Scenario | Example Input Payload | Expected Outcome |
|
|
141
|
-
|---|----------|-----------------------|------------------|
|
|
142
|
-
| 1 | Create HUD widget through system control | `{"action":"create_widget","widgetName":"MCP_Widget","widgetType":"HUD"}` | Success response confirms widget creation. |
|
|
143
|
-
| 2 | Show widget that does not exist fails | `{"action":"show_widget","widgetName":"Widget_Does_Not_Exist","visible":true}` | Error message states that the widget was not found. |
|
|
144
|
-
| 3 | Create widget invalid type fails validation | `{"action":"create_widget","widgetName":"Bad_Widget","widgetType":42}` | Error message highlights that the widget type must be a string. |
|
|
145
|
-
| 4 | Show widget without providing a name fails | `{"action":"show_widget","visible":true}` | Error response indicates `widgetName` is required. |
|
|
146
|
-
|
|
147
|
-
---
|
|
148
|
-
|
|
149
|
-
## Physics Tools (`src/tools/physics.ts`)
|
|
150
|
-
|
|
151
|
-
| # | Scenario | Example Input Payload | Expected Outcome |
|
|
152
|
-
|---|----------|-----------------------|------------------|
|
|
153
|
-
| 1 | Apply force to missing actor returns error | `{"action":"apply_force","actorName":"PhysicsBox","force":{"x":0,"y":0,"z":5000}}` | Error response indicates the actor was not found. |
|
|
154
|
-
| 2 | Apply force with invalid vector fails validation | `{"action":"apply_force","actorName":"PhysicsBox","force":{"x":"invalid"}}` | Error message reports the invalid force vector. |
|
|
155
|
-
| 3 | Apply force with missing actor name fails validation | `{"action":"apply_force","force":{"x":0,"y":0,"z":2000}}` | Error message highlights that the actor name parameter is required. |
|
|
156
|
-
|
|
157
|
-
---
|
|
158
|
-
|
|
159
|
-
## Landscape Tools (`src/tools/landscape.ts`)
|
|
160
|
-
|
|
161
|
-
| # | Scenario | Example Input Payload | Expected Outcome |
|
|
162
|
-
|---|----------|-----------------------|------------------|
|
|
163
|
-
| 1 | Create landscape actor for MCP tests | `{"action":"create_landscape","name":"Landscape_MCP","sizeX":256,"sizeY":256}` | Success response confirms landscape creation. |
|
|
164
|
-
| 2 | Create landscape with negative size fails | `{"action":"create_landscape","name":"Landscape_Invalid","sizeX":-1,"sizeY":256}` | Error message highlights the invalid landscape size. |
|
|
165
|
-
| 3 | Create small landscape with defaults | `{"action":"create_landscape","name":"Landscape_Small"}` | Success response reports that a landscape actor was created using default size. |
|
|
166
|
-
| 4 | Landscape sculpt reports editor-only limitation | `{"action":"sculpt","name":"Landscape_MCP","tool":"Sculpt"}` | Error message states sculpting is not implemented via Remote Control. |
|
|
167
|
-
|
|
168
|
-
---
|
|
169
|
-
|
|
170
|
-
## Build Environment Tools (`src/tools/build_environment_advanced.ts`)
|
|
171
|
-
|
|
172
|
-
| # | Scenario | Example Input Payload | Expected Outcome |
|
|
173
|
-
|---|----------|-----------------------|------------------|
|
|
174
|
-
| 1 | Add foliage type with invalid mesh path fails | `{"action":"add_foliage","name":"InvalidFoliage","meshPath":"undefined"}` | Error message reports that the foliage mesh path is invalid. |
|
|
175
|
-
| 2 | Create procedural foliage without bounds fails | `{"action":"create_procedural_foliage","name":"ProceduralTest"}` | Error response states that `bounds.location` and `bounds.size` must be provided. |
|
|
176
|
-
| 3 | Add foliage instances with missing asset fails | `{"action":"add_foliage_instances","foliageType":"/Game/Foliage/Types/FT_Missing","transforms":[{"location":[0,0,0]}]}` | Error message notes that the foliage asset could not be loaded. |
|
|
177
|
-
|
|
178
|
-
---
|
|
179
|
-
|
|
180
|
-
## Performance Tools (`src/tools/performance.ts`)
|
|
181
|
-
|
|
182
|
-
| # | Scenario | Example Input Payload | Expected Outcome |
|
|
183
|
-
|---|----------|-----------------------|------------------|
|
|
184
|
-
| 1 | Enable FPS overlay | `{"action":"show_fps","enabled":true}` | Success response confirms the FPS overlay toggle. |
|
|
185
|
-
| 2 | Set shadow quality to medium | `{"action":"set_quality","category":"Shadows","level":2}` | Success response reports the updated shadow quality. |
|
|
186
|
-
| 3 | Set shadow quality with invalid level fails | `{"action":"set_quality","category":"Shadows","level":7}` | Error message explains that the level is out of range. |
|
|
187
|
-
| 4 | Start CPU profiling session | `{"action":"profile","profileType":"CPU"}` | Success response states that CPU profiling started. |
|
|
188
|
-
|
|
189
|
-
---
|
|
190
|
-
|
|
191
|
-
## System Control Tools (`src/tools/consolidated-tool-handlers.ts`)
|
|
192
|
-
|
|
193
|
-
| # | Scenario | Example Input Payload | Expected Outcome |
|
|
194
|
-
|---|----------|-----------------------|------------------|
|
|
195
|
-
| 1 | Trigger screenshot capture with defaults | `{"action":"screenshot"}` | Success response notes that a screenshot command was issued. |
|
|
196
|
-
| 2 | Play sound with missing asset fails | `{"action":"play_sound","soundPath":"/Game/MCP/Audio/Missing"}` | Error message reports that the sound asset could not be found. |
|
|
197
|
-
| 3 | Play sound at location missing asset fails | `{"action":"play_sound","soundPath":"/Game/MCP/Audio/Missing","location":{"x":0,"y":0,"z":0}}` | Error message reports that the sound asset could not be found for the world location playback. |
|
|
198
|
-
| 4 | Play sound with empty path fails validation | `{"action":"play_sound","soundPath":"","volume":1.0}` | Error message explains that the sound asset path could not be resolved. |
|
|
199
|
-
|
|
200
|
-
---
|
|
201
|
-
|
|
202
|
-
## Debug Tools (`src/tools/debug.ts`)
|
|
203
|
-
|
|
204
|
-
| # | Scenario | Example Input Payload | Expected Outcome |
|
|
205
|
-
|---|----------|-----------------------|------------------|
|
|
206
|
-
| 1 | Draw debug sphere in front of camera | `{"action":"debug_shape","shape":"Sphere","location":{"x":0,"y":0,"z":100},"size":50,"color":[1,0,0,1],"duration":3}` | Success response notes the debug sphere render. |
|
|
207
|
-
| 2 | Debug shape rejects unknown primitive | `{"action":"debug_shape","shape":"Hexagon","location":{"x":0,"y":0,"z":0},"size":50}` | Error message states that the shape is unsupported. |
|
|
208
|
-
|
|
209
|
-
---
|
|
210
|
-
|
|
211
|
-
## Remote Control Preset Tools (`src/tools/rc.ts`)
|
|
212
|
-
|
|
213
|
-
| # | Scenario | Example Input Payload | Expected Outcome |
|
|
214
|
-
|---|----------|-----------------------|------------------|
|
|
215
|
-
| 1 | Create RC preset | `{"action":"create_preset","name":"RCP_Test","path":"/Game/RCPresets"}` | Preset asset created. |
|
|
216
|
-
| 2 | Create preset invalid path | `{"action":"create_preset","name":"RCP_Restricted","path":"/Engine/Restricted"}` | Failure message. |
|
|
217
|
-
| 3 | Expose actor | `{"action":"expose_actor","presetPath":"/Game/RCPresets/RCP_Test","actorName":"MCP_Cube_B"}` | Actor exposed; success true. |
|
|
218
|
-
| 4 | Expose missing actor | `{"action":"expose_actor","presetPath":"/Game/RCPresets/RCP_Test","actorName":"MissingActor"}` | Error message. |
|
|
219
|
-
| 5 | List fields empty preset | `{"action":"list_fields","presetPath":"/Game/RCPresets/RCP_Test"}` | Empty array returned. |
|
|
220
|
-
| 6 | Delete preset success | `{"action":"delete_preset","presetPath":"/Game/RCPresets/RCP_Test"}` | Asset removed. |
|
|
221
|
-
|
|
222
|
-
More advanced preset workflows (batch exposure, property mutation, etc.) continue to live in the legacy manual section.
|
|
223
|
-
|
|
224
|
-
---
|
|
225
|
-
|
|
226
|
-
## Legacy Comprehensive Matrix (manual + advanced scenarios)
|
|
227
|
-
|
|
228
|
-
The following tables mirror the full scenario list that previously lived in this file. They remain valuable for manual validation and for expanding automated coverage over time.
|
|
229
|
-
|
|
230
|
-
## Lighting Tools (`src/tools/lighting.ts`)
|
|
231
|
-
|
|
232
|
-
| # | Scenario | Example Input Payload | Expected Outcome |
|
|
233
|
-
|---|----------|-----------------------|------------------|
|
|
234
|
-
| 1 | Spawn directional light with defaults | `{"name":"Dir_Default"}` | Actor spawns at default location/rotation; log contains "Directional light 'Dir_Default' spawned". |
|
|
235
|
-
| 2 | Directional light custom intensity/color | `{"name":"Dir_Custom","intensity":50,"color":[0.2,0.4,0.8]}` | Light component intensity = 50 and color matches payload. |
|
|
236
|
-
| 3 | Reject negative intensity | `{"name":"Dir_Bad","intensity":-10}` | API throws validation error before Python execution. |
|
|
237
|
-
| 4 | Reject non-numeric color | `{"name":"Dir_Color","color":["a",0,0]}` | Validation error citing invalid color component. |
|
|
238
|
-
| 5 | Apply custom rotation | `{"name":"Dir_Rot","rotation":[45,90,0]}` | Actor rotation updated; log still reports success. |
|
|
239
|
-
| 6 | Spawn point light defaults | `{"name":"Point_Default"}` | Point light at origin with default radius/intensity. |
|
|
240
|
-
| 7 | Point light custom location & radius | `{"name":"Point_Custom","location":[100,0,400],"radius":500}` | Light positioned as requested; attenuation radius = 500. |
|
|
241
|
-
| 8 | Point light invalid radius | `{"name":"Point_Bad","radius":-1}` | Validation error referencing radius. |
|
|
242
|
-
| 9 | Point light custom falloff exponent | `{"name":"Point_Falloff","falloffExponent":4}` | Component falloff exponent set to 4. |
|
|
243
|
-
| 10 | Spot light with cone values | `{"name":"Spot_Cone","location":[0,0,0],"rotation":[0,0,0],"innerCone":10,"outerCone":25}` | Spot light spawns; component cones reflect payload. |
|
|
244
|
-
| 11 | Spot light inner cone > outer cone | `{"name":"Spot_ConeSwap","location":[0,0,0],"rotation":[0,0,0],"innerCone":45,"outerCone":30}` | Validation error or engine warning (record behavior). |
|
|
245
|
-
| 12 | Spot light outer cone >180 | `{"name":"Spot_BadCone","location":[0,0,0],"rotation":[0,0,0],"outerCone":200}` | Validation error (must be ≤180). |
|
|
246
|
-
| 13 | Rect light width/height | `{"name":"Rect_Custom","location":[0,0,0],"rotation":[0,0,0],"width":200,"height":50}` | Rect light component width=200 height=50. |
|
|
247
|
-
| 14 | Rect light invalid width | `{"name":"Rect_Bad","location":[0,0,0],"rotation":[0,0,0],"width":0}` | Validation error for positive width. |
|
|
248
|
-
| 15 | Sky light reuse existing | Call twice `{"name":"Sky_Unique"}` | First call spawns/labels actor; second ensures reuse (no duplicates, log indicates success). |
|
|
249
|
-
| 16 | Sky light with cubemap path | `{"name":"Sky_Cubemap","sourceType":"SpecifiedCubemap","cubemapPath":"/Game/Textures/T_Sky"}` | Component cubemap set if asset exists; recapture executed. |
|
|
250
|
-
| 17 | Sky light missing cubemap asset | Same as above with invalid path | Tool returns failure with error referencing asset lookup. |
|
|
251
|
-
| 18 | Ensure single sky light default | `ensureSingleSkyLight()` | Only one SkyLight remains, renamed `MCP_Test_Sky`; logs removed count. |
|
|
252
|
-
| 19 | Ensure single sky light custom trimmed name | `{"name":" CustomSky "}` | Result renames to `CustomSky`; trimmed input accepted. |
|
|
253
|
-
| 20 | Create lightmass volume valid | `{"name":"LM_Volume","location":[0,0,0],"size":[1000,800,600]}` | Actor spawns; scale approx size; log success. |
|
|
254
|
-
| 21 | Create lightmass volume blank name | `{"name":" ","location":[0,0,0],"size":[100,100,100]}` | Normalization throws "Invalid name" error. |
|
|
255
|
-
| 22 | Create lightmass volume negative size | `{"name":"LM_Bad","location":[0,0,0],"size":[-10,100,100]}` | Python logs failure; tool surfaces error message. |
|
|
256
|
-
|
|
257
|
-
---
|
|
258
|
-
|
|
259
|
-
## Actor Tools (`src/tools/actors.ts`)
|
|
260
|
-
|
|
261
|
-
| # | Scenario | Example Input Payload | Expected Outcome |
|
|
262
|
-
|---|----------|-----------------------|------------------|
|
|
263
|
-
| 1 | Spawn cube actor for MCP smoke test | `{"action":"spawn","classPath":"/Engine/BasicShapes/Cube","name":"MCP_Cube_A"}` | Success response indicates the actor spawned. |
|
|
264
|
-
| 2 | Delete previously spawned actor | `{"action":"delete","actorName":"MCP_Cube_A"}` | Success response reports the actor delete. |
|
|
265
|
-
| 3 | Spawn without class path returns validation error | `{"action":"spawn"}` | Error message states that `classPath` is required. |
|
|
266
|
-
| 4 | Apply force to missing actor returns error | `{"action":"apply_force","actorName":"PhysicsBox","force":{"x":0,"y":0,"z":5000}}` | Error response indicates the actor was not found. |
|
|
267
|
-
| 5 | Apply force with invalid vector fails validation | `{"action":"apply_force","actorName":"PhysicsBox","force":{"x":"invalid"}}` | Error message reports the invalid force vector. |
|
|
268
|
-
|
|
269
|
-
---
|
|
270
|
-
|
|
271
|
-
## Editor Tools (`src/tools/editor.ts`)
|
|
272
|
-
|
|
273
|
-
| # | Scenario | Example Input Payload | Expected Outcome |
|
|
274
|
-
|---|----------|-----------------------|------------------|
|
|
275
|
-
| 1 | Set viewport to wireframe mode | `{"action":"set_view_mode","viewMode":"Wireframe"}` | Success response confirms the view mode change. |
|
|
276
|
-
| 2 | Unsafe view mode is rejected | `{"action":"set_view_mode","viewMode":"BaseColor"}` | Error message explains the requested view mode is blocked for safety. |
|
|
277
|
-
| 3 | Position viewport camera above origin | `{"action":"set_camera","location":{"x":0,"y":0,"z":1000},"rotation":{"pitch":-45,"yaw":0,"roll":0}}` | Success response notes that the camera was updated. |
|
|
278
|
-
| 4 | Reject non-positive editor game speed | `{"action":"set_game_speed","speed":0}` | Error message states that the speed must be a positive number. |
|
|
279
|
-
|
|
280
|
-
---
|
|
281
|
-
|
|
282
|
-
## Asset Tools (`src/tools/assets.ts`)
|
|
283
|
-
|
|
284
|
-
| # | Scenario | Example Input Payload | Expected Outcome |
|
|
285
|
-
|---|----------|-----------------------|------------------|
|
|
286
|
-
| 1 | List root content directory | `{"action":"list","directory":"/Game"}` | Success response enumerates `/Game` children. |
|
|
287
|
-
| 2 | Create material asset in MCP folder | `{"action":"create_material","name":"MCP_TestMaterial","path":"/Game/MCP/Materials"}` | Success response states that the material was created. |
|
|
288
|
-
| 3 | Import FBX with missing source file | `{"action":"import","sourcePath":"C:/Invalid/path/to/model.fbx","destinationPath":"/Game/MCP/Imports"}` | Error message explains that the source file could not be imported. |
|
|
289
|
-
| 4 | Create material in read-only engine folder | `{"action":"create_material","name":"MCP_ReadOnly","path":"/Engine/Restricted"}` | Error explains the destination path is read-only and the asset is not created. |
|
|
290
|
-
|
|
291
|
-
---
|
|
292
|
-
|
|
293
|
-
## Animation Tools (`src/tools/animation.ts`)
|
|
294
|
-
|
|
295
|
-
| # | Scenario | Example Input Payload | Expected Outcome |
|
|
296
|
-
|---|----------|-----------------------|------------------|
|
|
297
|
-
| 1 | Create animation blueprint with missing skeleton fails | `{"action":"create_animation_bp","name":"ABP_MCP_Test","skeletonPath":"/Game/MCP/NotReal.SK_NotReal"}` | Error message explains that the skeleton asset is missing. |
|
|
298
|
-
| 2 | Play montage on missing actor fails gracefully | `{"action":"play_montage","actorName":"MissingActor","montagePath":"/Game/MCP/Anims/MT_Missing"}` | Error response notes that the actor was not found. |
|
|
299
|
-
| 3 | Setup ragdoll on missing actor returns error | `{"action":"setup_ragdoll","actorName":"MissingActor","physicsAssetName":"/Game/MCP/Physics/PH_Missing"}` | Error response indicates that the actor could not be located. |
|
|
300
|
-
| 4 | Create animation blueprint using engine skeletal cube | `{"action":"create_animation_bp","name":"ABP_MCP_EngineCube","skeletonPath":"/Engine/EngineMeshes/SkeletalCube.SkeletalCube","savePath":"/Game/MCP/Anims"}` | Success response reports the created animation blueprint path. |
|
|
301
|
-
|
|
302
|
-
---
|
|
303
|
-
|
|
304
|
-
## Blueprint Tools (`src/tools/blueprint.ts`)
|
|
305
|
-
|
|
306
|
-
| # | Scenario | Example Input Payload | Expected Outcome |
|
|
307
|
-
|---|----------|-----------------------|------------------|
|
|
308
|
-
| 1 | Create actor blueprint | `{"name":"BP_Test","parentClass":"Actor","path":"/Game/Blueprints"}` | Asset created at path. |
|
|
309
|
-
| 2 | Create blueprint invalid parent | `parentClass":"/Script/NonExisting"` | Failure message. |
|
|
310
|
-
| 3 | Create blueprint whitespace name | `" BP Hello "` | Name sanitized/trimmed before creation. |
|
|
311
|
-
| 4 | Create blueprint missing path | Path omitted | Tool defaults to `/Game/Blueprints`; success. |
|
|
312
|
-
| 5 | Create blueprint reserved keyword | `name":"class"` | Name adjusted to `class_Asset`. |
|
|
313
|
-
| 6 | Create blueprint path with invalid characters | `path":"/Game/Bad:Path"` | Path sanitized before asset creation. |
|
|
314
|
-
| 7 | Create blueprint when folder locked | e.g., `/Engine/Blueprints` | Failure due to write protection. |
|
|
315
|
-
| 8 | Add component to blueprint | `{"blueprintPath":"/Game/Blueprints/BP_Test","componentType":"StaticMeshComponent","componentName":"MeshComp"}` | Component added; compile success. |
|
|
316
|
-
| 9 | Add component duplicate name | Same payload twice | Name deduped (MeshComp_1) or error; document behavior. |
|
|
317
|
-
| 10 | Add component invalid blueprint path | Non-existent asset | Operation fails with error. |
|
|
318
|
-
| 11 | Add component invalid type | `componentType":"InvalidComponent"` | Error referencing missing class. |
|
|
319
|
-
| 12 | Add component empty name | `componentName":" "` | Tool sanitizes or auto-generates name. |
|
|
320
|
-
| 13 | Create blueprint with interfaces | Provide interface list in payload | Interfaces implemented; blueprint compiles. |
|
|
321
|
-
| 14 | Create blueprint while asset exists (overwrite) | Provide same name & path | Tool either reuses or fails; note result. |
|
|
322
|
-
| 15 | Delete blueprint after test (via asset tool) | Confirm removal. |
|
|
323
|
-
| 16 | Create blueprint with metadata tags | `metadata":{"Category":"Test"}` | Tags applied (verify in asset). |
|
|
324
|
-
| 17 | Add component when blueprint already open (locked) | Operation fails gracefully. |
|
|
325
|
-
| 18 | Create blueprint in nested folders | `path":"/Game/Blueprints/SubFolder"` | Folders auto-created; asset saved. |
|
|
326
|
-
| 19 | Create blueprint extremely long name | >64 characters | Name truncated; creation success. |
|
|
327
|
-
| 20 | Create blueprint with unicode characters | Name includes Unicode | Ensure sanitized but retains valid segments. |
|
|
328
|
-
| 21 | Verify logs contain `RESULT` JSON for automation parsing. |
|
|
329
|
-
|
|
330
|
-
---
|
|
331
|
-
|
|
332
|
-
## Material Tools (`src/tools/materials.ts`)
|
|
333
|
-
|
|
334
|
-
| # | Scenario | Example Input Payload | Expected Outcome |
|
|
335
|
-
|---|----------|-----------------------|------------------|
|
|
336
|
-
| 1 | Create material asset at custom path | `{"name":"MCP_TestMaterial","path":"/Game/MCP/Materials"}` | Success response states that the material was created. |
|
|
337
|
-
| 2 | Create material with invalid characters fails | `{"name":"MCP Material","path":"/Game/MCP/Materials"}` | Error message highlights the invalid material name. |
|
|
338
|
-
| 3 | Create material in read-only engine folder fails | `{"name":"MCP_ReadOnly","path":"/Engine/Restricted"}` | Error explains that the destination path is read-only. |
|
|
339
|
-
|
|
340
|
-
---
|
|
341
|
-
|
|
342
|
-
## Niagara Tools (`src/tools/niagara.ts`)
|
|
343
|
-
|
|
344
|
-
| # | Scenario | Example Input Payload | Expected Outcome |
|
|
345
|
-
|---|----------|-----------------------|------------------|
|
|
346
|
-
| 1 | Spawn debug sphere via Niagara tool | `{"action":"debug_shape","shape":"Sphere","location":{"x":0,"y":0,"z":200},"size":100,"color":[0,0.5,1,1],"duration":2}` | Success response confirms the debug shape draw. |
|
|
347
|
-
| 2 | Spawn Niagara with missing asset fails | `{"action":"niagara","systemPath":"/Game/MCP/FX/NS_Missing"}` | Error response reports that the Niagara system could not be found. |
|
|
348
|
-
| 3 | Create particle preset effect | `{"action":"particle","effectType":"Fire","name":"MCP_Fire","location":{"x":0,"y":0,"z":0},"scale":1.0}` | Success response notes that the effect asset was created. |
|
|
349
|
-
|
|
350
|
-
---
|
|
351
|
-
|
|
352
|
-
## Level Tools (`src/tools/level.ts`)
|
|
353
|
-
|
|
354
|
-
| # | Scenario | Example Input Payload | Expected Outcome |
|
|
355
|
-
|---|----------|-----------------------|------------------|
|
|
356
|
-
| 1 | Load level valid | `{"action":"load","levelPath":"/Game/Maps/Test"}` | Level loads without errors. |
|
|
357
|
-
| 2 | Load level missing | Path invalid | Failure message. |
|
|
358
|
-
| 3 | Save current level | `{"action":"save"}` | Save completes; log success. |
|
|
359
|
-
| 4 | Save dirty level locked | Level read-only | Failure message referencing inability to save. |
|
|
360
|
-
| 5 | Stream level in visible | `{"action":"stream","levelName":"SubLevel","shouldBeLoaded":true,"shouldBeVisible":true}` | Sublevel loads and becomes visible. |
|
|
361
|
-
| 6 | Stream level out | Same but `shouldBeLoaded:false` | Sublevel unloaded; duplicates removed. |
|
|
362
|
-
| 7 | Stream invalid level name | Error. |
|
|
363
|
-
| 8 | Stream visible false but loaded true | `shouldBeVisible:false` | Level stays loaded but hidden. |
|
|
364
|
-
| 9 | Load level while PIE active | Ensure command succeeds or warns. |
|
|
365
|
-
| 10 | Load same level twice | Idempotent; no reload error. |
|
|
366
|
-
| 11 | Save with custom path (if parameter) | Provide `targetPath` | Save as new level; confirm asset. |
|
|
367
|
-
| 12 | Build lighting via tool | `{"action":"build_lighting","quality":"High"}` | Build triggered; log indicates start. |
|
|
368
|
-
| 13 | Build lighting invalid quality | `quality":"Ultra"` | Validation error. |
|
|
369
|
-
| 14 | Load level with relative path | `"Maps/Test"` | Auto-prepends `/Game/`. |
|
|
370
|
-
| 15 | Stream level while already loaded | Should handle gracefully; no duplicates. |
|
|
371
|
-
| 16 | Save level with no changes | Operation success; message indicates saved or no action. |
|
|
372
|
-
| 17 | Load level with uppercase path | Works (case-insensitive). |
|
|
373
|
-
| 18 | Attempt to save when editor lacks permissions | Error from UE log. |
|
|
374
|
-
| 19 | Stream level during asset load | Check concurrency; expect success. |
|
|
375
|
-
| 20 | Save multiple times sequentially | All succeed without stale state. |
|
|
376
|
-
| 21 | Validate response includes sanitized message for automation. |
|
|
377
|
-
|
|
378
|
-
---
|
|
379
|
-
|
|
380
|
-
## Sequence Tools (`src/tools/sequence.ts`)
|
|
381
|
-
|
|
382
|
-
| # | Scenario | Example Input Payload | Expected Outcome |
|
|
383
|
-
|---|----------|-----------------------|------------------|
|
|
384
|
-
| 1 | Create new sequence asset | `{"action":"create","name":"Seq_Test","path":"/Game/Sequences"}` | Sequence created; file path returned. |
|
|
385
|
-
| 2 | Create sequence duplicate name | Same payload twice | Second call handles collision (suffix or error). |
|
|
386
|
-
| 3 | Open existing sequence | `{"action":"open","path":"/Game/Sequences/Seq_Test"}` | Sequence opened successfully. |
|
|
387
|
-
| 4 | Open missing sequence | Invalid path | Failure message. |
|
|
388
|
-
| 5 | Add camera spawnable | `{"action":"add_camera","path":"/Game/Sequences/Seq_Test","spawnable":true}` | Camera binding added; returns binding id. |
|
|
389
|
-
| 6 | Add actor possessable | `{"action":"add_actor","path":"/Game/Sequences/Seq_Test","actorName":"Cube_1"}` | Actor bound; success message. |
|
|
390
|
-
| 7 | Add multiple actors | `add_actors` list | All actors bound; result enumerates ids. |
|
|
391
|
-
| 8 | Remove actor binding | `{"action":"remove_actors","path":"...","actorNames":["Cube_1"]}` | Binding removed. |
|
|
392
|
-
| 9 | Set sequence properties | `{"action":"set_properties","path":"...","frameRate":24,"lengthInFrames":240}` | Properties updated. |
|
|
393
|
-
| 10 | Play sequence once | `{"action":"play","path":"...","loopMode":"once"}` | Sequence plays; log indicates playback start. |
|
|
394
|
-
| 11 | Play loop mode | `loopMode":"loop"` | Sequence loops; confirm log. |
|
|
395
|
-
| 12 | Pause sequence | `{"action":"pause","path":"..."}` | Playback paused; state recorded. |
|
|
396
|
-
| 13 | Stop sequence | `{"action":"stop","path":"..."}` | Playback stops; time resets. |
|
|
397
|
-
| 14 | Set playback speed >1 | `{"action":"set_playback_speed","path":"...","speed":2}` | Plays faster; log success. |
|
|
398
|
-
| 15 | Set playback speed invalid | Speed ≤0 | Validation error. |
|
|
399
|
-
| 16 | Play sequence missing path | Path omitted | Validation error. |
|
|
400
|
-
| 17 | Add camera when path invalid | Failure message. |
|
|
401
|
-
| 18 | Pause sequence not playing | Should handle gracefully (no crash). |
|
|
402
|
-
| 19 | Get properties | `{"action":"get_properties","path":"..."}` | Returns frame rate, length, playback window. |
|
|
403
|
-
| 20 | Set playback range beyond length | e.g., `playbackEnd":500` when length 240 | Tool accepts or warns; record behavior. |
|
|
404
|
-
| 21 | Delete sequence asset after tests | Use asset tool; ensure no residuals. |
|
|
405
|
-
|
|
406
|
-
---
|
|
407
|
-
|
|
408
|
-
## UI Tools (`src/tools/ui.ts`)
|
|
409
|
-
|
|
410
|
-
| # | Scenario | Example Input Payload | Expected Outcome |
|
|
411
|
-
|---|----------|-----------------------|------------------|
|
|
412
|
-
| 1 | Create 3D widget default class | `{"action":"create_widget","widgetType":"HUD","name":"Widget_Test"}` | Widget spawned; handle returned. |
|
|
413
|
-
| 2 | Create widget invalid class | Non-existent widget blueprint path | Error message. |
|
|
414
|
-
| 3 | Show widget | `{"action":"show_widget","widgetName":"Widget_Test","visible":true}` | Widget becomes visible in viewport. |
|
|
415
|
-
| 4 | Hide widget | Same with `visible:false` | Widget hidden. |
|
|
416
|
-
| 5 | Create widget with location/rotation | Provide transform fields | Widget placed accordingly. |
|
|
417
|
-
| 6 | Create widget whitespace name | Name sanitized; unique identifier returned. |
|
|
418
|
-
| 7 | Create multiple widgets same base name | Ensure unique suffix appended. |
|
|
419
|
-
| 8 | Create widget invalid parameters (non-string) | e.g., `widgetType:42` | Validation error. |
|
|
420
|
-
| 9 | Show non-existent widget | Failure message. |
|
|
421
|
-
| 10 | Destroy widget (if action) | `{"action":"destroy_widget","widgetName":"Widget_Test"}` | Widget removed. |
|
|
422
|
-
| 11 | Attach widget to actor | Provide `attachToActor` field | Widget follows actor transform. |
|
|
423
|
-
| 12 | Update widget content (if action) | e.g., set text | Change reflected in UI. |
|
|
424
|
-
| 13 | Create widget while Slate disabled | Error referencing subsystem. |
|
|
425
|
-
| 14 | Create widget with long name | Name truncated but functional. |
|
|
426
|
-
| 15 | Batch create 20 widgets | Ensure runtime handles count; check for perf issues. |
|
|
427
|
-
| 16 | Create widget during PIE | Works in game viewport; record. |
|
|
428
|
-
| 17 | Show widget already visible | Idempotent; no error. |
|
|
429
|
-
| 18 | Hide widget already hidden | Idempotent. |
|
|
430
|
-
| 19 | Create widget with custom blueprint requiring constructor args | Tool passes defaults or errors; record behavior. |
|
|
431
|
-
| 20 | Clean up all widgets (loop destroy) | Environment returns to baseline. |
|
|
432
|
-
| 21 | Validate log output uses consistent `RESULT` structure. |
|
|
433
|
-
|
|
434
|
-
---
|
|
435
|
-
|
|
436
|
-
## Physics Tools (`src/tools/physics.ts`)
|
|
437
|
-
|
|
438
|
-
| # | Scenario | Example Input Payload | Expected Outcome |
|
|
439
|
-
|---|----------|-----------------------|------------------|
|
|
440
|
-
| 1 | Apply impulse | `{"action":"applyImpulse","actorName":"PhysicsBox","vector":[0,0,5000]}` | Actor moves upward; success message. |
|
|
441
|
-
| 2 | Apply impulse invalid actor | Non-existent name | Failure message. |
|
|
442
|
-
| 3 | Apply impulse invalid vector | `[0,"a",0]` | Validation error. |
|
|
443
|
-
| 4 | Apply radial force | `{"action":"applyRadialForce","origin":[0,0,0],"radius":500,"strength":10000}` | Nearby actors affected. |
|
|
444
|
-
| 5 | Apply radial force negative radius | `radius":"-10"` | Validation error. |
|
|
445
|
-
| 6 | Toggle ragdoll on skeletal actor | `{"action":"enableRagdoll","actorName":"SkeletalActor"}` | Actor enters ragdoll; success log. |
|
|
446
|
-
| 7 | Disable ragdoll | `{"action":"disableRagdoll","actorName":"SkeletalActor"}` | Actor returns to default pose. |
|
|
447
|
-
| 8 | Enable ragdoll missing physics asset | Actor lacking asset | Failure message indicates requirement. |
|
|
448
|
-
| 9 | Set mass override | `{"action":"setMass","actorName":"PhysicsBox","mass":50}` | Mass property updated. |
|
|
449
|
-
| 10 | Set mass invalid value | Negative mass -> validation error. |
|
|
450
|
-
| 11 | Toggle gravity off | `{"action":"setGravity","actorName":"PhysicsBox","enabled":false}` | Actor no longer affected by gravity. |
|
|
451
|
-
| 12 | Toggle gravity on | Reverse of above | Gravity restored. |
|
|
452
|
-
| 13 | Apply torque | `{"action":"applyTorque","actorName":"PhysicsBox","vector":[0,1000,0]}` | Actor rotates; success message. |
|
|
453
|
-
| 14 | Apply physics to actor without sim | Non-physics actor -> error. |
|
|
454
|
-
| 15 | Apply impulse during PIE | Works as expected; record logs. |
|
|
455
|
-
| 16 | Apply radial force to large actor count | Stress test; ensure no crash. |
|
|
456
|
-
| 17 | Reset physics state | `{"action":"resetPhysics","actorName":"PhysicsBox"}` | Actor returns to initial state. |
|
|
457
|
-
| 18 | Apply damping settings | Provide `linearDamping`, `angularDamping` | Values updated. |
|
|
458
|
-
| 19 | Apply force when subsystem unavailable | Force tool handles gracefully. |
|
|
459
|
-
| 20 | Cleanup: disable ragdoll, restore gravity | System returns to baseline. |
|
|
460
|
-
| 21 | Validate `warnings` field when engine emits warnings (e.g., on constraints). |
|
|
461
|
-
|
|
462
|
-
---
|
|
463
|
-
|
|
464
|
-
## Landscape Tools (`src/tools/landscape.ts`)
|
|
465
|
-
|
|
466
|
-
| # | Scenario | Example Input Payload | Expected Outcome |
|
|
467
|
-
|---|----------|-----------------------|------------------|
|
|
468
|
-
| 1 | Create landscape basic | `{"action":"create_landscape","name":"Landscape_Test","sizeX":1024,"sizeY":1024}` | Landscape actor created; log success. |
|
|
469
|
-
| 2 | Create landscape invalid size | `sizeX:-1` | Validation error. |
|
|
470
|
-
| 3 | Sculpt raise region | `{"action":"sculpt","tool":"Sculpt","location":{"x":0,"y":0,"z":0},"strength":0.5,"brushSize":500}` | Terrain height increases. |
|
|
471
|
-
| 4 | Sculpt smooth | `tool":"Smooth"` | Terrain smoothed. |
|
|
472
|
-
| 5 | Sculpt invalid tool name | `tool":"Invalid"` | Error referencing tool. |
|
|
473
|
-
| 6 | Add foliage asset | `{"action":"add_foliage","name":"FT_Grass","meshPath":"/Game/Foliage/SM_Grass","density":300}` | Foliage type asset created/registered. |
|
|
474
|
-
| 7 | Add foliage invalid mesh path | Non-existent asset | Error. |
|
|
475
|
-
| 8 | Paint foliage | `{"action":"paint_foliage","foliageType":"/Game/Foliage/FT_Grass","position":{"x":0,"y":0,"z":0},"brushSize":300}` | Instances placed; visible in viewport. |
|
|
476
|
-
| 9 | Paint foliage invalid type | Wrong path | Failure message. |
|
|
477
|
-
| 10 | Create procedural terrain | `{"action":"create_procedural_terrain","name":"AutoLandscape","bounds":{"location":{"x":0,"y":0,"z":0},"size":{"x":5000,"y":5000,"z":1000}}}` | Procedural landscape generated (if supported). |
|
|
478
|
-
| 11 | Create procedural foliage | Provide `foliageTypes` array | Instances spawn automatically. |
|
|
479
|
-
| 12 | Add foliage instances direct | Provide transforms | Instances appear. |
|
|
480
|
-
| 13 | Add foliage invalid density | Negative value -> validation error. |
|
|
481
|
-
| 14 | Paint foliage outside bounds | Provide far position | Either clamps or records warning. |
|
|
482
|
-
| 15 | Create landscape grass type | `{"action":"create_landscape_grass_type","name":"LG_Grass","foliageTypes":[{"meshPath":"/Game/Foliage/SM_Grass","density":200}]}` | Grass type asset created. |
|
|
483
|
-
| 16 | Sculpt while PIE active | Confirm tool works or warns. |
|
|
484
|
-
| 17 | Delete or cleanup created landscapes (if action) | Ensure environment reset. |
|
|
485
|
-
| 18 | Performance: sculpt with large brush size repeatedly | Record frame impact. |
|
|
486
|
-
| 19 | Validate logs include success tags. |
|
|
487
|
-
| 20 | Create landscape with material assignment | Provide `materialPath` in payload | Material applied. |
|
|
488
|
-
| 21 | Attempt operations when landscape subsystem missing | Error captured. |
|
|
489
|
-
|
|
490
|
-
---
|
|
491
|
-
|
|
492
|
-
## Performance Tools (`src/tools/performance.ts`)
|
|
493
|
-
|
|
494
|
-
| # | Scenario | Example Input Payload | Expected Outcome |
|
|
495
|
-
|---|----------|-----------------------|------------------|
|
|
496
|
-
| 1 | Show FPS | `{"action":"show_fps","enabled":true}` | `stat fps` overlay enabled. |
|
|
497
|
-
| 2 | Hide FPS | Same with `enabled:false` | Overlay hidden. |
|
|
498
|
-
| 3 | Start CPU profile | `{"action":"profile","profileType":"CPU","enabled":true}` | Profiling begins; log message. |
|
|
499
|
-
| 4 | Stop CPU profile | `enabled:false` | Profiling stops. |
|
|
500
|
-
| 5 | Invalid profile type | `profileType":"RAM"` | Validation error. |
|
|
501
|
-
| 6 | Set quality shadows | `{"action":"set_quality","category":"Shadows","level":2}` | Console var `sg.ShadowQuality` set to 2. |
|
|
502
|
-
| 7 | Set quality invalid category | Unknown category -> error. |
|
|
503
|
-
| 8 | Set quality invalid level | `level":6` | Validation error. |
|
|
504
|
-
| 9 | Play 3D sound | `{"action":"play_sound","soundPath":"/Game/Audio/SFX/Click","location":{"x":0,"y":0,"z":0},"volume":0.5,"is3D":true}` | Sound plays; log success. |
|
|
505
|
-
| 10 | Play sound invalid asset | Wrong path -> error. |
|
|
506
|
-
| 11 | Play sound without location (2D) | Omit location; `is3D:false` | Plays as 2D sound. |
|
|
507
|
-
| 12 | Create HUD widget | `{"action":"create_widget","widgetName":"PerfHUD","widgetType":"HUD"}` | Widget created (integration with UI tool). |
|
|
508
|
-
| 13 | Show widget invalid name | `show_widget` on missing | Failure. |
|
|
509
|
-
| 14 | Capture screenshot | `{"action":"screenshot","resolution":"1920x1080"}` | Screenshot saved; file path logged. |
|
|
510
|
-
| 15 | Screenshot invalid resolution | `resolution":"abc"` | Validation error. |
|
|
511
|
-
| 16 | Engine start without project path | `{"action":"engine_start"}` missing path | Error requiring configuration. |
|
|
512
|
-
| 17 | Engine quit | `{"action":"engine_quit"}` | Unreal attempts to quit; confirm connection handling. |
|
|
513
|
-
| 18 | Toggle verbose stats | `{"action":"profile","profileType":"CPU","verbose":true}` | Verbosity change recorded. |
|
|
514
|
-
| 19 | Set quality sequentially | Issue commands level 0–4 | Each succeeds; verify logs. |
|
|
515
|
-
| 20 | Play sound with volume >1 | `volume":1.5` | Clamped or validation error; record. |
|
|
516
|
-
| 21 | Show FPS when already enabled | Idempotent success. |
|
|
517
|
-
|
|
518
|
-
---
|
|
519
|
-
|
|
520
|
-
## Debug Tools (`src/tools/debug.ts`)
|
|
521
|
-
|
|
522
|
-
| # | Scenario | Example Input Payload | Expected Outcome |
|
|
523
|
-
|---|----------|-----------------------|------------------|
|
|
524
|
-
| 1 | Draw debug line | `{"shape":"Line","start":{"x":0,"y":0,"z":0},"end":{"x":0,"y":500,"z":0},"color":[1,0,0,1],"duration":5}` | Red line visible for 5 seconds. |
|
|
525
|
-
| 2 | Draw debug box | `{"shape":"Box","center":{"x":0,"y":0,"z":100},"extent":100,"color":[0,1,0,1],"duration":5}` | Green box rendered. |
|
|
526
|
-
| 3 | Draw debug sphere | `{"shape":"Sphere","center":{"x":0,"y":0,"z":100},"radius":100,"color":[0,0,1,1]}` | Blue sphere visible. |
|
|
527
|
-
| 4 | Draw debug cylinder | Provide top/bottom radius | Cylinder rendered correctly. |
|
|
528
|
-
| 5 | Draw debug arrow | `start` and `end` vectors | Arrow drawn pointing toward end. |
|
|
529
|
-
| 6 | Draw debug text | `{"shape":"Text","location":{"x":0,"y":0,"z":200},"text":"Hello Unreal","color":[1,1,0,1]}` | Text appears; properly escaped. |
|
|
530
|
-
| 7 | Draw debug text with quotes | Text contains `'"` | Escapes; displays correctly. |
|
|
531
|
-
| 8 | Draw invalid shape | `shape":"Hexagon"` | Validation error referencing allowed shapes. |
|
|
532
|
-
| 9 | Draw with invalid color values | `color":[2,-1,0,1]` | Values clamped or validation error. |
|
|
533
|
-
| 10 | Draw line zero duration | `duration":0` | Line visible for single frame; no crash. |
|
|
534
|
-
| 11 | Draw persistent line | `duration":-1` (if supported) | Persistent overlay until cleared. |
|
|
535
|
-
| 12 | Clear debug shapes | `{"action":"clear"}` | All debug drawings removed. |
|
|
536
|
-
| 13 | Draw while PIE active | Works both in editor and PIE. |
|
|
537
|
-
| 14 | Draw numerous shapes quickly | Stress test; ensure performance acceptable. |
|
|
538
|
-
| 15 | Draw shapes with metadata | `meta.action":"debug_draw"` | Metadata recorded; logs show correct action string. |
|
|
539
|
-
| 16 | Draw text invalid location | Missing fields -> validation error. |
|
|
540
|
-
| 17 | Draw to actor socket (if supported) | Provide `attachToActor` and `socketName` | Shape follows actor. |
|
|
541
|
-
| 18 | Draw concurrently from multiple requests | No conflicting state. |
|
|
542
|
-
| 19 | Draw using color array length <4 | Validation error. |
|
|
543
|
-
| 20 | Draw with negative extent | Error message. |
|
|
544
|
-
| 21 | Draw after clearing ensures new shapes display normally. |
|
|
545
|
-
|
|
546
|
-
---
|
|
547
|
-
|
|
548
|
-
## Remote Control Preset Tools (`src/tools/rc.ts`)
|
|
549
|
-
|
|
550
|
-
| # | Scenario | Example Input Payload | Expected Outcome |
|
|
551
|
-
|---|----------|-----------------------|------------------|
|
|
552
|
-
| 1 | Create RC preset | `{"action":"create_preset","name":"RCP_Test","path":"/Game/RCPresets"}` | Preset asset created. |
|
|
553
|
-
| 2 | Create preset invalid path | `/Engine/Restricted` | Failure message. |
|
|
554
|
-
| 3 | Expose actor | `{"action":"expose_actor","presetPath":"/Game/RCPresets/RCP_Test","actorName":"MCP_Cube_B"}` | Actor exposed; success true. |
|
|
555
|
-
| 4 | Expose missing actor | Actor absent | Error message. |
|
|
556
|
-
| 5 | Expose property valid | Provide object path + property | Property exposed. |
|
|
557
|
-
| 6 | Expose property invalid | Non-existent property | Error returned. |
|
|
558
|
-
| 7 | List fields empty preset | `list_fields` on new preset | Empty array returned. |
|
|
559
|
-
| 8 | List fields with entries | After expose operations | Array lists exposed entities. |
|
|
560
|
-
| 9 | Set property numeric | Provide float value | Property updated. |
|
|
561
|
-
| 10 | Set property invalid type | Send string where number expected | Error returned. |
|
|
562
|
-
| 11 | Get property valid | Returns current value. |
|
|
563
|
-
| 12 | Get property missing | Non-existent property -> error. |
|
|
564
|
-
| 13 | Delete preset success | `delete_preset` call | Asset removed. |
|
|
565
|
-
| 14 | Delete preset missing | Non-existent path -> error. |
|
|
566
|
-
| 15 | Create preset duplicate | Same name/path | Tool appends suffix or fails; record. |
|
|
567
|
-
| 16 | Expose actor while preset locked | Error referencing locked asset. |
|
|
568
|
-
| 17 | Set property with vector payload | Provide `{x,y,z}` | Value applied. |
|
|
569
|
-
| 18 | Get property while actor missing | Error message. |
|
|
570
|
-
| 19 | Batch expose actors | Provide list sequentially | All succeed or partial fail captured. |
|
|
571
|
-
| 20 | Toggle property via remote control panel (manual) | Validate UI integration. |
|
|
572
|
-
| 21 | Validate RC preset saved to disk | Confirm file in Content Browser. |
|
package/smithery.yaml
DELETED
|
@@ -1,29 +0,0 @@
|
|
|
1
|
-
name: "Unreal Engine MCP"
|
|
2
|
-
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."
|
|
3
|
-
runtime: "typescript"
|
|
4
|
-
env:
|
|
5
|
-
NODE_ENV: "production"
|
|
6
|
-
LOG_LEVEL: "info"
|
|
7
|
-
UE_PROJECT_PATH: "C:/Users/YourName/Documents/Unreal Projects/YourProject"
|
|
8
|
-
# Session configuration hints (served by the exported Zod configSchema in src/index.ts)
|
|
9
|
-
sessionConfig:
|
|
10
|
-
ueHost:
|
|
11
|
-
type: string
|
|
12
|
-
description: "Unreal Engine host (e.g., 127.0.0.1)"
|
|
13
|
-
default: "127.0.0.1"
|
|
14
|
-
ueHttpPort:
|
|
15
|
-
type: number
|
|
16
|
-
description: "Remote Control HTTP port"
|
|
17
|
-
default: 30010
|
|
18
|
-
ueWsPort:
|
|
19
|
-
type: number
|
|
20
|
-
description: "Remote Control WS port"
|
|
21
|
-
default: 30011
|
|
22
|
-
logLevel:
|
|
23
|
-
type: string
|
|
24
|
-
description: "Server log verbosity"
|
|
25
|
-
default: "info"
|
|
26
|
-
projectPath:
|
|
27
|
-
type: string
|
|
28
|
-
description: "Absolute path to your .uproject file"
|
|
29
|
-
default: "C:/Users/YourName/Documents/Unreal Projects/YourProject"
|