Skip to content
Closed
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
70 changes: 69 additions & 1 deletion MCPForUnity/Editor/Tools/ManageEditor.cs
Original file line number Diff line number Diff line change
Expand Up @@ -136,6 +136,15 @@ public static object HandleCommand(JObject @params)
// return SetQualityLevel(@params["qualityLevel"]);

// Prefab Stage
case "open_prefab_stage":
{
string prefabPath = @params["path"]?.ToString();
if (string.IsNullOrEmpty(prefabPath))
return new ErrorResponse("'path' parameter required (e.g. 'Assets/Prefabs/MyPrefab.prefab').");
return OpenPrefabStage(prefabPath);
}
case "save_prefab_stage":
return SavePrefabStage();
case "close_prefab_stage":
return ClosePrefabStage();

Expand Down Expand Up @@ -176,7 +185,7 @@ public static object HandleCommand(JObject @params)

default:
return new ErrorResponse(
$"Unknown action: '{action}'. Supported actions: play, pause, stop, set_active_tool, add_tag, remove_tag, add_layer, remove_layer, close_prefab_stage, deploy_package, restore_package, undo, redo. Use MCP resources for reading editor state, project info, tags, layers, selection, windows, prefab stage, and active tool."
$"Unknown action: '{action}'. Supported actions: play, pause, stop, set_active_tool, add_tag, remove_tag, add_layer, remove_layer, open_prefab_stage, save_prefab_stage, close_prefab_stage, deploy_package, restore_package, undo, redo. Use MCP resources for reading editor state, project info, tags, layers, selection, windows, prefab stage, and active tool."
);
}
}
Expand Down Expand Up @@ -398,6 +407,65 @@ private static object RemoveLayer(string layerName)

// --- Prefab Stage Methods ---

private static object OpenPrefabStage(string prefabPath)
{
try
{
var asset = AssetDatabase.LoadMainAssetAtPath(prefabPath);
if (asset == null)
{
return new ErrorResponse($"Prefab not found at path: '{prefabPath}'.");
}

var prefabType = PrefabUtility.GetPrefabAssetType(asset);
if (prefabType == PrefabAssetType.NotAPrefab)
{
return new ErrorResponse($"Asset at '{prefabPath}' is not a prefab.");
}

var stage = PrefabStageUtility.OpenPrefab(prefabPath);
if (stage == null)
{
return new ErrorResponse($"Failed to open prefab stage for '{prefabPath}'.");
}

return new SuccessResponse(
$"Opened prefab stage for '{prefabPath}'. Use manage_gameobject/manage_components to edit objects inside, then save_prefab_stage to persist changes.",
new { prefabPath, rootName = stage.prefabContentsRoot.name, prefabType = prefabType.ToString() });
}
catch (Exception e)
{
return new ErrorResponse($"Error opening prefab stage: {e.Message}");
}
}

private static object SavePrefabStage()
{
try
{
var prefabStage = PrefabStageUtility.GetCurrentPrefabStage();
if (prefabStage == null)
{
return new ErrorResponse("Not currently in prefab editing mode. Open a prefab stage first with open_prefab_stage.");
}

string prefabPath = prefabStage.assetPath;

EditorSceneManager.MarkSceneDirty(prefabStage.scene);
bool saved = EditorSceneManager.SaveScene(prefabStage.scene);
if (!saved)
{
return new ErrorResponse($"Failed to save prefab stage for '{prefabPath}'. The file may be read-only or the disk may be full.");
}

return new SuccessResponse($"Saved prefab stage changes for '{prefabPath}'.", new { prefabPath, saved });
}
catch (Exception e)
{
return new ErrorResponse($"Error saving prefab stage: {e.Message}");
}
}

private static object ClosePrefabStage()
{
try
Expand Down