ue-mcp 1.3.10-beta.6 → 1.3.10-beta.7

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.
@@ -34,6 +34,6 @@
34
34
  },
35
35
  "nativeToolsets": 52,
36
36
  "nativeToolActions": 830,
37
- "generatedAt": "2026-09-28T19:05:33.751Z",
38
- "version": "1.3.10-beta.6"
37
+ "generatedAt": "2026-09-29T21:35:31.028Z",
38
+ "version": "1.3.10-beta.7"
39
39
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "ue-mcp",
3
- "version": "1.3.10-beta.6",
3
+ "version": "1.3.10-beta.7",
4
4
  "description": "Unreal Engine MCP server - 26 tools, 1966+ actions for AI-driven editor control",
5
5
  "type": "module",
6
6
  "main": "dist/index.js",
@@ -3564,15 +3564,32 @@ TSharedPtr<FJsonValue> FEditorHandlers::OpenAsset(const TSharedPtr<FJsonObject>&
3564
3564
  return MCPError(FString::Printf(TEXT("Failed to load asset at '%s'"), *AssetPath));
3565
3565
  }
3566
3566
 
3567
- // StaticLoadObject returns an unrooted pointer and OpenEditorForAsset can run
3568
- // the GC, so the asset is held for the rest of the call.
3569
- FGCObjectScopeGuard AssetScopeGuard(Asset);
3570
-
3571
3567
  if (!GEditor)
3572
3568
  {
3573
3569
  return MCPError(TEXT("GEditor not available"));
3574
3570
  }
3575
3571
 
3572
+ // A World opens by loading it as the editor map, which destroys the map
3573
+ // loaded before it. Asked for the map already loaded, that load would
3574
+ // destroy the very world the guard below pins, and the editor dies on its
3575
+ // world-leak check. The map is already open, so there is nothing to do.
3576
+ if (Asset == GetEditorWorld())
3577
+ {
3578
+ TSharedPtr<FJsonObject> Result = MakeShared<FJsonObject>();
3579
+ Result->SetStringField(TEXT("assetPath"), AssetPath);
3580
+ Result->SetStringField(TEXT("assetClass"), Asset->GetClass()->GetName());
3581
+ Result->SetBoolField(TEXT("success"), true);
3582
+ Result->SetBoolField(TEXT("alreadyOpen"), true);
3583
+ Result->SetBoolField(TEXT("changed"), false);
3584
+ Result->SetBoolField(TEXT("rollbackPossible"), false);
3585
+ Result->SetStringField(TEXT("rollbackNote"), TEXT("The map was already the loaded editor world, so nothing was opened."));
3586
+ return MCPResult(Result);
3587
+ }
3588
+
3589
+ // StaticLoadObject returns an unrooted pointer and OpenEditorForAsset can run
3590
+ // the GC, so the asset is held for the rest of the call.
3591
+ FGCObjectScopeGuard AssetScopeGuard(Asset);
3592
+
3576
3593
  UAssetEditorSubsystem* AssetEditorSubsystem = GEditor->GetEditorSubsystem<UAssetEditorSubsystem>();
3577
3594
  if (!AssetEditorSubsystem)
3578
3595
  {
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "FileVersion": 3,
3
3
  "Version": 1,
4
- "VersionName": "1.3.10-beta.6",
4
+ "VersionName": "1.3.10-beta.7",
5
5
  "FriendlyName": "UE MCP Bridge",
6
6
  "Description": "C++ WebSocket bridge for UE-MCP, providing 1905+ editor actions over the MCP protocol",
7
7
  "Category": "Developer Tools",