Rename endpoints to make them more intuitive.

This commit is contained in:
2026-03-06 15:43:55 -05:00
parent 9f405ce5ba
commit 11dd976441
8 changed files with 492 additions and 286 deletions

View File

@@ -6,7 +6,7 @@
#include "EdGraph/EdGraphNode.h" #include "EdGraph/EdGraphNode.h"
#include "EdGraph/EdGraphPin.h" #include "EdGraph/EdGraphPin.h"
void UMCPHandler_DiffBlueprints::Handle(const FJsonObject* Json, FJsonObject* Result) void UMCPHandler_DiffTwoBlueprints::Handle(const FJsonObject* Json, FJsonObject* Result)
{ {
MCPHelper* Helper = MCPHelper::Get(); MCPHelper* Helper = MCPHelper::Get();

View File

@@ -10,7 +10,7 @@
// ListInterfaces // ListInterfaces
// ============================================================ // ============================================================
void UMCPHandler_ListInterfaces::Handle(const FJsonObject* Json, FJsonObject* Result) void UMCPHandler_ListBlueprintInterfaces::Handle(const FJsonObject* Json, FJsonObject* Result)
{ {
MCPHelper* Helper = MCPHelper::Get(); MCPHelper* Helper = MCPHelper::Get();
@@ -55,7 +55,7 @@ void UMCPHandler_ListInterfaces::Handle(const FJsonObject* Json, FJsonObject* Re
// AddInterface // AddInterface
// ============================================================ // ============================================================
void UMCPHandler_AddInterface::Handle(const FJsonObject* Json, FJsonObject* Result) void UMCPHandler_AddBlueprintInterface::Handle(const FJsonObject* Json, FJsonObject* Result)
{ {
MCPHelper* Helper = MCPHelper::Get(); MCPHelper* Helper = MCPHelper::Get();
@@ -179,7 +179,7 @@ void UMCPHandler_AddInterface::Handle(const FJsonObject* Json, FJsonObject* Resu
// RemoveInterface // RemoveInterface
// ============================================================ // ============================================================
void UMCPHandler_RemoveInterface::Handle(const FJsonObject* Json, FJsonObject* Result) void UMCPHandler_RemoveBlueprintInterface::Handle(const FJsonObject* Json, FJsonObject* Result)
{ {
MCPHelper* Helper = MCPHelper::Get(); MCPHelper* Helper = MCPHelper::Get();

View File

@@ -50,7 +50,7 @@
// ReplaceFunctionCalls — redirect function call nodes // ReplaceFunctionCalls — redirect function call nodes
// ============================================================ // ============================================================
void UMCPHandler_ReplaceFunctionCalls::Handle(const FJsonObject* Json, FJsonObject* Result) void UMCPHandler_ReplaceFunctionCallsInBlueprint::Handle(const FJsonObject* Json, FJsonObject* Result)
{ {
MCPHelper* Helper = MCPHelper::Get(); MCPHelper* Helper = MCPHelper::Get();
@@ -427,9 +427,9 @@ void UMCPHandler_DeleteAsset::Handle(const FJsonObject* Json, FJsonObject* Resul
// HandleConnectPins — wire two pins together // HandleConnectPins — wire two pins together
// ============================================================ // ============================================================
// connect_pins is now handled by UMCPHandler_ConnectPins (new-style registry) // connect_pins is now handled by UMCPHandler_ConnectBlueprintPins (new-style registry)
void UMCPHandler_ConnectPins::Handle(const FJsonObject* Json, FJsonObject* Result) void UMCPHandler_ConnectBlueprintPins::Handle(const FJsonObject* Json, FJsonObject* Result)
{ {
MCPHelper* Helper = MCPHelper::Get(); MCPHelper* Helper = MCPHelper::Get();
@@ -530,9 +530,9 @@ void UMCPHandler_ConnectPins::Handle(const FJsonObject* Json, FJsonObject* Resul
// HandleDisconnectPin — break connections on a pin // HandleDisconnectPin — break connections on a pin
// ============================================================ // ============================================================
// disconnect_pin is now handled by UMCPHandler_DisconnectPin (new-style registry) // disconnect_pin is now handled by UMCPHandler_DisconnectBlueprintPins (new-style registry)
void UMCPHandler_DisconnectPin::Handle(const FJsonObject* Json, FJsonObject* Result) void UMCPHandler_DisconnectBlueprintPins::Handle(const FJsonObject* Json, FJsonObject* Result)
{ {
MCPHelper* Helper = MCPHelper::Get(); MCPHelper* Helper = MCPHelper::Get();
@@ -639,7 +639,7 @@ void UMCPHandler_DisconnectPin::Handle(const FJsonObject* Json, FJsonObject* Res
// RefreshAllNodes — refresh all nodes and recompile // RefreshAllNodes — refresh all nodes and recompile
// ============================================================ // ============================================================
void UMCPHandler_RefreshAllNodes::Handle(const FJsonObject* Json, FJsonObject* Result) void UMCPHandler_RefreshAllNodesInGraph::Handle(const FJsonObject* Json, FJsonObject* Result)
{ {
MCPHelper* Helper = MCPHelper::Get(); MCPHelper* Helper = MCPHelper::Get();
@@ -746,7 +746,7 @@ void UMCPHandler_RefreshAllNodes::Handle(const FJsonObject* Json, FJsonObject* R
// SetPinDefault — set the default value of a pin on a node // SetPinDefault — set the default value of a pin on a node
// ============================================================ // ============================================================
void UMCPHandler_SetPinDefault::Handle(const FJsonObject* Json, FJsonObject* Result) void UMCPHandler_SetPinDefaultValues::Handle(const FJsonObject* Json, FJsonObject* Result)
{ {
MCPHelper* Helper = MCPHelper::Get(); MCPHelper* Helper = MCPHelper::Get();
@@ -1059,9 +1059,9 @@ void UMCPHandler_ChangeStructNodeType::Handle(const FJsonObject* Json, FJsonObje
// HandleDeleteNode — remove a node from a blueprint graph // HandleDeleteNode — remove a node from a blueprint graph
// ============================================================ // ============================================================
// delete_node is now handled by UMCPHandler_DeleteNode (new-style registry) // delete_node is now handled by UMCPHandler_DeleteNodeFromGraph (new-style registry)
void UMCPHandler_DeleteNode::Handle(const FJsonObject* Json, FJsonObject* Result) void UMCPHandler_DeleteNodeFromGraph::Handle(const FJsonObject* Json, FJsonObject* Result)
{ {
MCPHelper* Helper = MCPHelper::Get(); MCPHelper* Helper = MCPHelper::Get();
@@ -1219,7 +1219,7 @@ void UMCPHandler_RenameAsset::Handle(const FJsonObject* Json, FJsonObject* Resul
// SetBlueprintDefault — set a default property value on a Blueprint CDO // SetBlueprintDefault — set a default property value on a Blueprint CDO
// ============================================================ // ============================================================
void UMCPHandler_SetBlueprintDefault::Handle(const FJsonObject* Json, FJsonObject* Result) void UMCPHandler_SetClassDefaultValue::Handle(const FJsonObject* Json, FJsonObject* Result)
{ {
MCPHelper* Helper = MCPHelper::Get(); MCPHelper* Helper = MCPHelper::Get();
@@ -1377,7 +1377,7 @@ void UMCPHandler_SetBlueprintDefault::Handle(const FJsonObject* Json, FJsonObjec
// MoveNode — reposition one or more nodes in a blueprint graph // MoveNode — reposition one or more nodes in a blueprint graph
// ============================================================ // ============================================================
void UMCPHandler_MoveNode::Handle(const FJsonObject* Json, FJsonObject* Result) void UMCPHandler_SetNodePositions::Handle(const FJsonObject* Json, FJsonObject* Result)
{ {
MCPHelper* Helper = MCPHelper::Get(); MCPHelper* Helper = MCPHelper::Get();
@@ -1441,7 +1441,7 @@ void UMCPHandler_MoveNode::Handle(const FJsonObject* Json, FJsonObject* Result)
// DuplicateNodes — duplicate one or more nodes in a graph // DuplicateNodes — duplicate one or more nodes in a graph
// ============================================================ // ============================================================
void UMCPHandler_DuplicateNodes::Handle(const FJsonObject* Json, FJsonObject* Result) void UMCPHandler_DuplicateNodesInGraph::Handle(const FJsonObject* Json, FJsonObject* Result)
{ {
MCPHelper* Helper = MCPHelper::Get(); MCPHelper* Helper = MCPHelper::Get();
@@ -1656,7 +1656,7 @@ void UMCPHandler_SetNodeComment::Handle(const FJsonObject* Json, FJsonObject* Re
// for spawners matching a query string (same pool as the right-click menu) // for spawners matching a query string (same pool as the right-click menu)
// ============================================================ // ============================================================
void UMCPHandler_SearchNodeTypes::Handle(const FJsonObject* Json, FJsonObject* Result) void UMCPHandler_SearchSpawnableNodeTypes::Handle(const FJsonObject* Json, FJsonObject* Result)
{ {
int32 ClampedMax = FMath::Clamp(MaxResults, 1, 500); int32 ClampedMax = FMath::Clamp(MaxResults, 1, 500);
@@ -1678,7 +1678,7 @@ void UMCPHandler_SearchNodeTypes::Handle(const FJsonObject* Json, FJsonObject* R
// Takes a full action name, finds the spawner, and calls Invoke(). // Takes a full action name, finds the spawner, and calls Invoke().
// ============================================================ // ============================================================
void UMCPHandler_SpawnNode::Handle(const FJsonObject* Json, FJsonObject* Result) void UMCPHandler_SpawnNodesInGraph::Handle(const FJsonObject* Json, FJsonObject* Result)
{ {
MCPHelper* Helper = MCPHelper::Get(); MCPHelper* Helper = MCPHelper::Get();

View File

@@ -510,11 +510,11 @@ bool FBlueprintMCPServer::Start(int32 InPort, bool bEditorMode)
})); }));
// /api/rescan — re-scan asset registry and refresh cached asset lists (game thread) // /api/rescan — re-scan asset registry and refresh cached asset lists (game thread)
Router->BindRoute(FHttpPath(TEXT("/api/rescan")), EHttpServerRequestVerbs::VERB_POST, Router->BindRoute(FHttpPath(TEXT("/api/rescan_asset_registry")), EHttpServerRequestVerbs::VERB_POST,
QueuedHandler(TEXT("rescan"))); QueuedHandler(TEXT("rescan_asset_registry")));
// /api/list — answered directly (only reads immutable asset list) // /api/list — answered directly (only reads immutable asset list)
Router->BindRoute(FHttpPath(TEXT("/api/list")), EHttpServerRequestVerbs::VERB_GET, Router->BindRoute(FHttpPath(TEXT("/api/list_blueprint_assets")), EHttpServerRequestVerbs::VERB_GET,
FHttpRequestHandler::CreateLambda( FHttpRequestHandler::CreateLambda(
[this](const FHttpServerRequest& Request, const FHttpResultCallback& OnComplete) [this](const FHttpServerRequest& Request, const FHttpResultCallback& OnComplete)
{ {
@@ -532,87 +532,87 @@ bool FBlueprintMCPServer::Start(int32 InPort, bool bEditorMode)
})); }));
// Old-style handlers (queued, not yet ported to UMCPHandler) // Old-style handlers (queued, not yet ported to UMCPHandler)
Router->BindRoute(FHttpPath(TEXT("/api/blueprint")), EHttpServerRequestVerbs::VERB_GET, Router->BindRoute(FHttpPath(TEXT("/api/dump_blueprint")), EHttpServerRequestVerbs::VERB_GET,
QueuedHandler(TEXT("blueprint"))); QueuedHandler(TEXT("dump_blueprint")));
Router->BindRoute(FHttpPath(TEXT("/api/graph")), EHttpServerRequestVerbs::VERB_GET, Router->BindRoute(FHttpPath(TEXT("/api/dump_blueprint_graph")), EHttpServerRequestVerbs::VERB_GET,
QueuedHandler(TEXT("graph"))); QueuedHandler(TEXT("dump_blueprint_graph")));
Router->BindRoute(FHttpPath(TEXT("/api/search")), EHttpServerRequestVerbs::VERB_GET, Router->BindRoute(FHttpPath(TEXT("/api/search_within_blueprints")), EHttpServerRequestVerbs::VERB_GET,
QueuedHandler(TEXT("search"))); QueuedHandler(TEXT("search_within_blueprints")));
Router->BindRoute(FHttpPath(TEXT("/api/references")), EHttpServerRequestVerbs::VERB_GET, Router->BindRoute(FHttpPath(TEXT("/api/find_asset_references")), EHttpServerRequestVerbs::VERB_GET,
QueuedHandler(TEXT("references"))); QueuedHandler(TEXT("find_asset_references")));
Router->BindRoute(FHttpPath(TEXT("/api/change_variable_type")), EHttpServerRequestVerbs::VERB_POST, Router->BindRoute(FHttpPath(TEXT("/api/change_blueprint_variable_type")), EHttpServerRequestVerbs::VERB_POST,
QueuedHandler(TEXT("change_variable_type"))); QueuedHandler(TEXT("change_blueprint_variable_type")));
Router->BindRoute(FHttpPath(TEXT("/api/change_function_param_type")), EHttpServerRequestVerbs::VERB_POST, Router->BindRoute(FHttpPath(TEXT("/api/change_function_parameter_type")), EHttpServerRequestVerbs::VERB_POST,
QueuedHandler(TEXT("change_function_param_type"))); QueuedHandler(TEXT("change_function_parameter_type")));
Router->BindRoute(FHttpPath(TEXT("/api/test_save")), EHttpServerRequestVerbs::VERB_GET, Router->BindRoute(FHttpPath(TEXT("/api/test_save_blueprint_package")), EHttpServerRequestVerbs::VERB_GET,
QueuedHandler(TEXT("test_save"))); QueuedHandler(TEXT("test_save_blueprint_package")));
Router->BindRoute(FHttpPath(TEXT("/api/get_pin_info")), EHttpServerRequestVerbs::VERB_POST, Router->BindRoute(FHttpPath(TEXT("/api/get_pin_details")), EHttpServerRequestVerbs::VERB_POST,
QueuedHandler(TEXT("get_pin_info"))); QueuedHandler(TEXT("get_pin_details")));
Router->BindRoute(FHttpPath(TEXT("/api/check_pin_compatibility")), EHttpServerRequestVerbs::VERB_POST, Router->BindRoute(FHttpPath(TEXT("/api/check_pin_connection_compatibility")), EHttpServerRequestVerbs::VERB_POST,
QueuedHandler(TEXT("check_pin_compatibility"))); QueuedHandler(TEXT("check_pin_connection_compatibility")));
Router->BindRoute(FHttpPath(TEXT("/api/list_classes")), EHttpServerRequestVerbs::VERB_POST, Router->BindRoute(FHttpPath(TEXT("/api/search_unreal_classes")), EHttpServerRequestVerbs::VERB_POST,
QueuedHandler(TEXT("list_classes"))); QueuedHandler(TEXT("search_unreal_classes")));
Router->BindRoute(FHttpPath(TEXT("/api/list_functions")), EHttpServerRequestVerbs::VERB_POST, Router->BindRoute(FHttpPath(TEXT("/api/list_class_functions")), EHttpServerRequestVerbs::VERB_POST,
QueuedHandler(TEXT("list_functions"))); QueuedHandler(TEXT("list_class_functions")));
Router->BindRoute(FHttpPath(TEXT("/api/list_properties")), EHttpServerRequestVerbs::VERB_POST, Router->BindRoute(FHttpPath(TEXT("/api/list_class_properties")), EHttpServerRequestVerbs::VERB_POST,
QueuedHandler(TEXT("list_properties"))); QueuedHandler(TEXT("list_class_properties")));
Router->BindRoute(FHttpPath(TEXT("/api/remove_function_parameter")), EHttpServerRequestVerbs::VERB_POST, Router->BindRoute(FHttpPath(TEXT("/api/remove_function_parameter")), EHttpServerRequestVerbs::VERB_POST,
QueuedHandler(TEXT("remove_function_parameter"))); QueuedHandler(TEXT("remove_function_parameter")));
Router->BindRoute(FHttpPath(TEXT("/api/search_by_type")), EHttpServerRequestVerbs::VERB_GET, Router->BindRoute(FHttpPath(TEXT("/api/search_type_usage_in_blueprints")), EHttpServerRequestVerbs::VERB_GET,
QueuedHandler(TEXT("search_by_type"))); QueuedHandler(TEXT("search_type_usage_in_blueprints")));
Router->BindRoute(FHttpPath(TEXT("/api/validate_blueprint")), EHttpServerRequestVerbs::VERB_POST, Router->BindRoute(FHttpPath(TEXT("/api/compile_blueprint")), EHttpServerRequestVerbs::VERB_POST,
QueuedHandler(TEXT("validate_blueprint"))); QueuedHandler(TEXT("compile_blueprint")));
Router->BindRoute(FHttpPath(TEXT("/api/validate_all_blueprints")), EHttpServerRequestVerbs::VERB_POST, Router->BindRoute(FHttpPath(TEXT("/api/compile_all_blueprints")), EHttpServerRequestVerbs::VERB_POST,
QueuedHandler(TEXT("validate_all_blueprints"))); QueuedHandler(TEXT("compile_all_blueprints")));
Router->BindRoute(FHttpPath(TEXT("/api/reparent_blueprint")), EHttpServerRequestVerbs::VERB_POST, Router->BindRoute(FHttpPath(TEXT("/api/reparent_blueprint")), EHttpServerRequestVerbs::VERB_POST,
QueuedHandler(TEXT("reparent_blueprint"))); QueuedHandler(TEXT("reparent_blueprint")));
Router->BindRoute(FHttpPath(TEXT("/api/create_blueprint")), EHttpServerRequestVerbs::VERB_POST, Router->BindRoute(FHttpPath(TEXT("/api/create_blueprint_asset")), EHttpServerRequestVerbs::VERB_POST,
QueuedHandler(TEXT("create_blueprint"))); QueuedHandler(TEXT("create_blueprint_asset")));
Router->BindRoute(FHttpPath(TEXT("/api/create_graph")), EHttpServerRequestVerbs::VERB_POST, Router->BindRoute(FHttpPath(TEXT("/api/create_blueprint_graph")), EHttpServerRequestVerbs::VERB_POST,
QueuedHandler(TEXT("create_graph"))); QueuedHandler(TEXT("create_blueprint_graph")));
Router->BindRoute(FHttpPath(TEXT("/api/create_struct")), EHttpServerRequestVerbs::VERB_POST, Router->BindRoute(FHttpPath(TEXT("/api/create_struct_asset")), EHttpServerRequestVerbs::VERB_POST,
QueuedHandler(TEXT("create_struct"))); QueuedHandler(TEXT("create_struct_asset")));
Router->BindRoute(FHttpPath(TEXT("/api/create_enum")), EHttpServerRequestVerbs::VERB_POST, Router->BindRoute(FHttpPath(TEXT("/api/create_enum_asset")), EHttpServerRequestVerbs::VERB_POST,
QueuedHandler(TEXT("create_enum"))); QueuedHandler(TEXT("create_enum_asset")));
Router->BindRoute(FHttpPath(TEXT("/api/add_struct_property")), EHttpServerRequestVerbs::VERB_POST, Router->BindRoute(FHttpPath(TEXT("/api/add_struct_field")), EHttpServerRequestVerbs::VERB_POST,
QueuedHandler(TEXT("add_struct_property"))); QueuedHandler(TEXT("add_struct_field")));
Router->BindRoute(FHttpPath(TEXT("/api/remove_struct_property")), EHttpServerRequestVerbs::VERB_POST, Router->BindRoute(FHttpPath(TEXT("/api/remove_struct_field")), EHttpServerRequestVerbs::VERB_POST,
QueuedHandler(TEXT("remove_struct_property"))); QueuedHandler(TEXT("remove_struct_field")));
Router->BindRoute(FHttpPath(TEXT("/api/delete_graph")), EHttpServerRequestVerbs::VERB_POST, Router->BindRoute(FHttpPath(TEXT("/api/delete_blueprint_graph")), EHttpServerRequestVerbs::VERB_POST,
QueuedHandler(TEXT("delete_graph"))); QueuedHandler(TEXT("delete_blueprint_graph")));
Router->BindRoute(FHttpPath(TEXT("/api/rename_graph")), EHttpServerRequestVerbs::VERB_POST, Router->BindRoute(FHttpPath(TEXT("/api/rename_blueprint_graph")), EHttpServerRequestVerbs::VERB_POST,
QueuedHandler(TEXT("rename_graph"))); QueuedHandler(TEXT("rename_blueprint_graph")));
Router->BindRoute(FHttpPath(TEXT("/api/add_variable")), EHttpServerRequestVerbs::VERB_POST, Router->BindRoute(FHttpPath(TEXT("/api/add_blueprint_variable")), EHttpServerRequestVerbs::VERB_POST,
QueuedHandler(TEXT("add_variable"))); QueuedHandler(TEXT("add_blueprint_variable")));
Router->BindRoute(FHttpPath(TEXT("/api/remove_variable")), EHttpServerRequestVerbs::VERB_POST, Router->BindRoute(FHttpPath(TEXT("/api/remove_blueprint_variable")), EHttpServerRequestVerbs::VERB_POST,
QueuedHandler(TEXT("remove_variable"))); QueuedHandler(TEXT("remove_blueprint_variable")));
Router->BindRoute(FHttpPath(TEXT("/api/set_variable_metadata")), EHttpServerRequestVerbs::VERB_POST, Router->BindRoute(FHttpPath(TEXT("/api/set_blueprint_variable_metadata")), EHttpServerRequestVerbs::VERB_POST,
QueuedHandler(TEXT("set_variable_metadata"))); QueuedHandler(TEXT("set_blueprint_variable_metadata")));
Router->BindRoute(FHttpPath(TEXT("/api/add_event_dispatcher")), EHttpServerRequestVerbs::VERB_POST, Router->BindRoute(FHttpPath(TEXT("/api/add_event_dispatcher")), EHttpServerRequestVerbs::VERB_POST,
QueuedHandler(TEXT("add_event_dispatcher"))); QueuedHandler(TEXT("add_event_dispatcher")));
Router->BindRoute(FHttpPath(TEXT("/api/list_event_dispatchers")), EHttpServerRequestVerbs::VERB_POST, Router->BindRoute(FHttpPath(TEXT("/api/list_event_dispatchers")), EHttpServerRequestVerbs::VERB_POST,
QueuedHandler(TEXT("list_event_dispatchers"))); QueuedHandler(TEXT("list_event_dispatchers")));
Router->BindRoute(FHttpPath(TEXT("/api/add_function_parameter")), EHttpServerRequestVerbs::VERB_POST, Router->BindRoute(FHttpPath(TEXT("/api/add_function_parameter")), EHttpServerRequestVerbs::VERB_POST,
QueuedHandler(TEXT("add_function_parameter"))); QueuedHandler(TEXT("add_function_parameter")));
Router->BindRoute(FHttpPath(TEXT("/api/add_component")), EHttpServerRequestVerbs::VERB_POST, Router->BindRoute(FHttpPath(TEXT("/api/add_blueprint_component")), EHttpServerRequestVerbs::VERB_POST,
QueuedHandler(TEXT("add_component"))); QueuedHandler(TEXT("add_blueprint_component")));
Router->BindRoute(FHttpPath(TEXT("/api/remove_component")), EHttpServerRequestVerbs::VERB_POST, Router->BindRoute(FHttpPath(TEXT("/api/remove_blueprint_component")), EHttpServerRequestVerbs::VERB_POST,
QueuedHandler(TEXT("remove_component"))); QueuedHandler(TEXT("remove_blueprint_component")));
Router->BindRoute(FHttpPath(TEXT("/api/list_components")), EHttpServerRequestVerbs::VERB_POST, Router->BindRoute(FHttpPath(TEXT("/api/list_blueprint_components")), EHttpServerRequestVerbs::VERB_POST,
QueuedHandler(TEXT("list_components"))); QueuedHandler(TEXT("list_blueprint_components")));
Router->BindRoute(FHttpPath(TEXT("/api/snapshot_graph")), EHttpServerRequestVerbs::VERB_POST, Router->BindRoute(FHttpPath(TEXT("/api/snapshot_blueprint_graph")), EHttpServerRequestVerbs::VERB_POST,
QueuedHandler(TEXT("snapshot_graph"))); QueuedHandler(TEXT("snapshot_blueprint_graph")));
Router->BindRoute(FHttpPath(TEXT("/api/diff_graph")), EHttpServerRequestVerbs::VERB_POST, Router->BindRoute(FHttpPath(TEXT("/api/diff_blueprint_graph_vs_snapshot")), EHttpServerRequestVerbs::VERB_POST,
QueuedHandler(TEXT("diff_graph"))); QueuedHandler(TEXT("diff_blueprint_graph_vs_snapshot")));
Router->BindRoute(FHttpPath(TEXT("/api/restore_graph")), EHttpServerRequestVerbs::VERB_POST, Router->BindRoute(FHttpPath(TEXT("/api/restore_blueprint_graph_from_snapshot")), EHttpServerRequestVerbs::VERB_POST,
QueuedHandler(TEXT("restore_graph"))); QueuedHandler(TEXT("restore_blueprint_graph_from_snapshot")));
Router->BindRoute(FHttpPath(TEXT("/api/find_disconnected_pins")), EHttpServerRequestVerbs::VERB_POST, Router->BindRoute(FHttpPath(TEXT("/api/find_pins_disconnected_since_snapshot")), EHttpServerRequestVerbs::VERB_POST,
QueuedHandler(TEXT("find_disconnected_pins"))); QueuedHandler(TEXT("find_pins_disconnected_since_snapshot")));
Router->BindRoute(FHttpPath(TEXT("/api/analyze_rebuild_impact")), EHttpServerRequestVerbs::VERB_POST, Router->BindRoute(FHttpPath(TEXT("/api/analyze_cpp_rebuild_impact")), EHttpServerRequestVerbs::VERB_POST,
QueuedHandler(TEXT("analyze_rebuild_impact"))); QueuedHandler(TEXT("analyze_cpp_rebuild_impact")));
// Material read-only tools (Phase 1) // Material read-only tools (Phase 1)
Router->BindRoute(FHttpPath(TEXT("/api/materials")), EHttpServerRequestVerbs::VERB_GET, Router->BindRoute(FHttpPath(TEXT("/api/list_material_assets")), EHttpServerRequestVerbs::VERB_GET,
FHttpRequestHandler::CreateLambda( FHttpRequestHandler::CreateLambda(
[this](const FHttpServerRequest& Request, const FHttpResultCallback& OnComplete) [this](const FHttpServerRequest& Request, const FHttpResultCallback& OnComplete)
{ {
@@ -629,46 +629,46 @@ bool FBlueprintMCPServer::Start(int32 InPort, bool bEditorMode)
return true; return true;
})); }));
Router->BindRoute(FHttpPath(TEXT("/api/material")), EHttpServerRequestVerbs::VERB_GET, Router->BindRoute(FHttpPath(TEXT("/api/material")), EHttpServerRequestVerbs::VERB_GET,
QueuedHandler(TEXT("get_material"))); QueuedHandler(TEXT("dump_material")));
Router->BindRoute(FHttpPath(TEXT("/api/material_graph")), EHttpServerRequestVerbs::VERB_GET, Router->BindRoute(FHttpPath(TEXT("/api/material_graph")), EHttpServerRequestVerbs::VERB_GET,
QueuedHandler(TEXT("get_material_graph"))); QueuedHandler(TEXT("dump_material_expression_graph")));
Router->BindRoute(FHttpPath(TEXT("/api/describe_material")), EHttpServerRequestVerbs::VERB_POST, Router->BindRoute(FHttpPath(TEXT("/api/describe_material_in_english")), EHttpServerRequestVerbs::VERB_POST,
QueuedHandler(TEXT("describe_material"))); QueuedHandler(TEXT("describe_material_in_english")));
Router->BindRoute(FHttpPath(TEXT("/api/search_materials")), EHttpServerRequestVerbs::VERB_GET, Router->BindRoute(FHttpPath(TEXT("/api/search_within_materials")), EHttpServerRequestVerbs::VERB_GET,
QueuedHandler(TEXT("search_materials"))); QueuedHandler(TEXT("search_within_materials")));
Router->BindRoute(FHttpPath(TEXT("/api/material_references")), EHttpServerRequestVerbs::VERB_POST, Router->BindRoute(FHttpPath(TEXT("/api/material_references")), EHttpServerRequestVerbs::VERB_POST,
QueuedHandler(TEXT("find_material_references"))); QueuedHandler(TEXT("find_material_references")));
// Material mutation tools (Phase 2) // Material mutation tools (Phase 2)
Router->BindRoute(FHttpPath(TEXT("/api/create_material")), EHttpServerRequestVerbs::VERB_POST, Router->BindRoute(FHttpPath(TEXT("/api/create_material_asset")), EHttpServerRequestVerbs::VERB_POST,
QueuedHandler(TEXT("create_material"))); QueuedHandler(TEXT("create_material_asset")));
Router->BindRoute(FHttpPath(TEXT("/api/set_material_property")), EHttpServerRequestVerbs::VERB_POST, Router->BindRoute(FHttpPath(TEXT("/api/set_material_property")), EHttpServerRequestVerbs::VERB_POST,
QueuedHandler(TEXT("set_material_property"))); QueuedHandler(TEXT("set_material_property")));
Router->BindRoute(FHttpPath(TEXT("/api/add_material_expression")), EHttpServerRequestVerbs::VERB_POST, Router->BindRoute(FHttpPath(TEXT("/api/add_material_expression")), EHttpServerRequestVerbs::VERB_POST,
QueuedHandler(TEXT("add_material_expression"))); QueuedHandler(TEXT("add_material_expression")));
Router->BindRoute(FHttpPath(TEXT("/api/delete_material_expression")), EHttpServerRequestVerbs::VERB_POST, Router->BindRoute(FHttpPath(TEXT("/api/delete_material_expression")), EHttpServerRequestVerbs::VERB_POST,
QueuedHandler(TEXT("delete_material_expression"))); QueuedHandler(TEXT("delete_material_expression")));
Router->BindRoute(FHttpPath(TEXT("/api/connect_material_pins")), EHttpServerRequestVerbs::VERB_POST, Router->BindRoute(FHttpPath(TEXT("/api/connect_material_expression_pins")), EHttpServerRequestVerbs::VERB_POST,
QueuedHandler(TEXT("connect_material_pins"))); QueuedHandler(TEXT("connect_material_expression_pins")));
Router->BindRoute(FHttpPath(TEXT("/api/disconnect_material_pin")), EHttpServerRequestVerbs::VERB_POST, Router->BindRoute(FHttpPath(TEXT("/api/disconnect_material_expression_pin")), EHttpServerRequestVerbs::VERB_POST,
QueuedHandler(TEXT("disconnect_material_pin"))); QueuedHandler(TEXT("disconnect_material_expression_pin")));
Router->BindRoute(FHttpPath(TEXT("/api/set_expression_value")), EHttpServerRequestVerbs::VERB_POST, Router->BindRoute(FHttpPath(TEXT("/api/set_material_expression_property")), EHttpServerRequestVerbs::VERB_POST,
QueuedHandler(TEXT("set_expression_value"))); QueuedHandler(TEXT("set_material_expression_property")));
Router->BindRoute(FHttpPath(TEXT("/api/move_material_expression")), EHttpServerRequestVerbs::VERB_POST, Router->BindRoute(FHttpPath(TEXT("/api/set_material_expression_position")), EHttpServerRequestVerbs::VERB_POST,
QueuedHandler(TEXT("move_material_expression"))); QueuedHandler(TEXT("set_material_expression_position")));
// Material instance tools (Phase 3) // Material instance tools (Phase 3)
Router->BindRoute(FHttpPath(TEXT("/api/create_material_instance")), EHttpServerRequestVerbs::VERB_POST, Router->BindRoute(FHttpPath(TEXT("/api/create_material_instance_asset")), EHttpServerRequestVerbs::VERB_POST,
QueuedHandler(TEXT("create_material_instance"))); QueuedHandler(TEXT("create_material_instance_asset")));
Router->BindRoute(FHttpPath(TEXT("/api/set_material_instance_parameter")), EHttpServerRequestVerbs::VERB_POST, Router->BindRoute(FHttpPath(TEXT("/api/set_material_instance_parameter")), EHttpServerRequestVerbs::VERB_POST,
QueuedHandler(TEXT("set_material_instance_parameter"))); QueuedHandler(TEXT("set_material_instance_parameter")));
Router->BindRoute(FHttpPath(TEXT("/api/material_instance_params")), EHttpServerRequestVerbs::VERB_GET, Router->BindRoute(FHttpPath(TEXT("/api/material_instance_params")), EHttpServerRequestVerbs::VERB_GET,
QueuedHandler(TEXT("get_material_instance_params"))); QueuedHandler(TEXT("dump_material_instance_parameters")));
Router->BindRoute(FHttpPath(TEXT("/api/reparent_material_instance")), EHttpServerRequestVerbs::VERB_POST, Router->BindRoute(FHttpPath(TEXT("/api/reparent_material_instance")), EHttpServerRequestVerbs::VERB_POST,
QueuedHandler(TEXT("reparent_material_instance"))); QueuedHandler(TEXT("reparent_material_instance")));
// Material function tools (Phase 4) // Material function tools (Phase 4)
Router->BindRoute(FHttpPath(TEXT("/api/material_functions")), EHttpServerRequestVerbs::VERB_GET, Router->BindRoute(FHttpPath(TEXT("/api/list_material_function_assets")), EHttpServerRequestVerbs::VERB_GET,
FHttpRequestHandler::CreateLambda( FHttpRequestHandler::CreateLambda(
[this](const FHttpServerRequest& Request, const FHttpResultCallback& OnComplete) [this](const FHttpServerRequest& Request, const FHttpResultCallback& OnComplete)
{ {
@@ -685,47 +685,47 @@ bool FBlueprintMCPServer::Start(int32 InPort, bool bEditorMode)
return true; return true;
})); }));
Router->BindRoute(FHttpPath(TEXT("/api/material_function")), EHttpServerRequestVerbs::VERB_GET, Router->BindRoute(FHttpPath(TEXT("/api/material_function")), EHttpServerRequestVerbs::VERB_GET,
QueuedHandler(TEXT("get_material_function"))); QueuedHandler(TEXT("dump_material_function")));
Router->BindRoute(FHttpPath(TEXT("/api/create_material_function")), EHttpServerRequestVerbs::VERB_POST, Router->BindRoute(FHttpPath(TEXT("/api/create_material_function_asset")), EHttpServerRequestVerbs::VERB_POST,
QueuedHandler(TEXT("create_material_function"))); QueuedHandler(TEXT("create_material_function_asset")));
// Material snapshot/diff/restore (Phase 5) // Material snapshot/diff/restore (Phase 5)
Router->BindRoute(FHttpPath(TEXT("/api/snapshot_material_graph")), EHttpServerRequestVerbs::VERB_POST, Router->BindRoute(FHttpPath(TEXT("/api/snapshot_material_expression_graph")), EHttpServerRequestVerbs::VERB_POST,
QueuedHandler(TEXT("snapshot_material_graph"))); QueuedHandler(TEXT("snapshot_material_expression_graph")));
Router->BindRoute(FHttpPath(TEXT("/api/diff_material_graph")), EHttpServerRequestVerbs::VERB_POST, Router->BindRoute(FHttpPath(TEXT("/api/diff_material_graph_vs_snapshot")), EHttpServerRequestVerbs::VERB_POST,
QueuedHandler(TEXT("diff_material_graph"))); QueuedHandler(TEXT("diff_material_graph_vs_snapshot")));
Router->BindRoute(FHttpPath(TEXT("/api/restore_material_graph")), EHttpServerRequestVerbs::VERB_POST, Router->BindRoute(FHttpPath(TEXT("/api/restore_material_graph_from_snapshot")), EHttpServerRequestVerbs::VERB_POST,
QueuedHandler(TEXT("restore_material_graph"))); QueuedHandler(TEXT("restore_material_graph_from_snapshot")));
Router->BindRoute(FHttpPath(TEXT("/api/validate_material")), EHttpServerRequestVerbs::VERB_POST, Router->BindRoute(FHttpPath(TEXT("/api/compile_material")), EHttpServerRequestVerbs::VERB_POST,
QueuedHandler(TEXT("validate_material"))); QueuedHandler(TEXT("compile_material")));
// Animation Blueprint tools // Animation Blueprint tools
Router->BindRoute(FHttpPath(TEXT("/api/create_anim_blueprint")), EHttpServerRequestVerbs::VERB_POST, Router->BindRoute(FHttpPath(TEXT("/api/create_anim_blueprint_asset")), EHttpServerRequestVerbs::VERB_POST,
QueuedHandler(TEXT("create_anim_blueprint"))); QueuedHandler(TEXT("create_anim_blueprint_asset")));
Router->BindRoute(FHttpPath(TEXT("/api/add_anim_state")), EHttpServerRequestVerbs::VERB_POST, Router->BindRoute(FHttpPath(TEXT("/api/add_anim_state_to_machine")), EHttpServerRequestVerbs::VERB_POST,
QueuedHandler(TEXT("add_anim_state"))); QueuedHandler(TEXT("add_anim_state_to_machine")));
Router->BindRoute(FHttpPath(TEXT("/api/remove_anim_state")), EHttpServerRequestVerbs::VERB_POST, Router->BindRoute(FHttpPath(TEXT("/api/remove_anim_state_from_machine")), EHttpServerRequestVerbs::VERB_POST,
QueuedHandler(TEXT("remove_anim_state"))); QueuedHandler(TEXT("remove_anim_state_from_machine")));
Router->BindRoute(FHttpPath(TEXT("/api/add_anim_transition")), EHttpServerRequestVerbs::VERB_POST, Router->BindRoute(FHttpPath(TEXT("/api/add_anim_state_transition")), EHttpServerRequestVerbs::VERB_POST,
QueuedHandler(TEXT("add_anim_transition"))); QueuedHandler(TEXT("add_anim_state_transition")));
Router->BindRoute(FHttpPath(TEXT("/api/set_transition_rule")), EHttpServerRequestVerbs::VERB_POST, Router->BindRoute(FHttpPath(TEXT("/api/set_anim_transition_rule")), EHttpServerRequestVerbs::VERB_POST,
QueuedHandler(TEXT("set_transition_rule"))); QueuedHandler(TEXT("set_anim_transition_rule")));
Router->BindRoute(FHttpPath(TEXT("/api/add_anim_node")), EHttpServerRequestVerbs::VERB_POST, Router->BindRoute(FHttpPath(TEXT("/api/add_anim_graph_node")), EHttpServerRequestVerbs::VERB_POST,
QueuedHandler(TEXT("add_anim_node"))); QueuedHandler(TEXT("add_anim_graph_node")));
Router->BindRoute(FHttpPath(TEXT("/api/add_state_machine")), EHttpServerRequestVerbs::VERB_POST, Router->BindRoute(FHttpPath(TEXT("/api/add_anim_state_machine")), EHttpServerRequestVerbs::VERB_POST,
QueuedHandler(TEXT("add_state_machine"))); QueuedHandler(TEXT("add_anim_state_machine")));
Router->BindRoute(FHttpPath(TEXT("/api/set_state_animation")), EHttpServerRequestVerbs::VERB_POST, Router->BindRoute(FHttpPath(TEXT("/api/set_anim_state_animation")), EHttpServerRequestVerbs::VERB_POST,
QueuedHandler(TEXT("set_state_animation"))); QueuedHandler(TEXT("set_anim_state_animation")));
Router->BindRoute(FHttpPath(TEXT("/api/list_anim_slots")), EHttpServerRequestVerbs::VERB_POST, Router->BindRoute(FHttpPath(TEXT("/api/list_anim_slot_names")), EHttpServerRequestVerbs::VERB_POST,
QueuedHandler(TEXT("list_anim_slots"))); QueuedHandler(TEXT("list_anim_slot_names")));
Router->BindRoute(FHttpPath(TEXT("/api/list_sync_groups")), EHttpServerRequestVerbs::VERB_POST, Router->BindRoute(FHttpPath(TEXT("/api/list_anim_sync_groups")), EHttpServerRequestVerbs::VERB_POST,
QueuedHandler(TEXT("list_sync_groups"))); QueuedHandler(TEXT("list_anim_sync_groups")));
Router->BindRoute(FHttpPath(TEXT("/api/create_blend_space")), EHttpServerRequestVerbs::VERB_POST, Router->BindRoute(FHttpPath(TEXT("/api/create_blend_space_asset")), EHttpServerRequestVerbs::VERB_POST,
QueuedHandler(TEXT("create_blend_space"))); QueuedHandler(TEXT("create_blend_space_asset")));
Router->BindRoute(FHttpPath(TEXT("/api/set_blend_space_samples")), EHttpServerRequestVerbs::VERB_POST, Router->BindRoute(FHttpPath(TEXT("/api/set_blend_space_sample_points")), EHttpServerRequestVerbs::VERB_POST,
QueuedHandler(TEXT("set_blend_space_samples"))); QueuedHandler(TEXT("set_blend_space_sample_points")));
Router->BindRoute(FHttpPath(TEXT("/api/set_state_blend_space")), EHttpServerRequestVerbs::VERB_POST, Router->BindRoute(FHttpPath(TEXT("/api/set_anim_state_blend_space")), EHttpServerRequestVerbs::VERB_POST,
QueuedHandler(TEXT("set_state_blend_space"))); QueuedHandler(TEXT("set_anim_state_blend_space")));
// Build new-style handler registry from UMCPHandler subclasses and bind routes for each // Build new-style handler registry from UMCPHandler subclasses and bind routes for each
BuildMCPHandlerRegistry(); BuildMCPHandlerRegistry();
@@ -872,63 +872,63 @@ void FBlueprintMCPServer::RegisterHandlers()
{ {
// Mutation endpoints — wrapped in undo transactions by ProcessOneRequest() // Mutation endpoints — wrapped in undo transactions by ProcessOneRequest()
MutationEndpoints = { MutationEndpoints = {
TEXT("replace_function_calls"), TEXT("replace_function_calls_in_blueprint"),
TEXT("change_variable_type"), TEXT("change_blueprint_variable_type"),
TEXT("change_function_param_type"), TEXT("change_function_parameter_type"),
TEXT("remove_function_parameter"), TEXT("remove_function_parameter"),
TEXT("delete_asset"), TEXT("delete_asset"),
TEXT("connect_pins"), TEXT("connect_blueprint_pins"),
TEXT("disconnect_pin"), TEXT("disconnect_blueprint_pins"),
TEXT("refresh_all_nodes"), TEXT("refresh_all_nodes_in_graph"),
TEXT("set_pin_default"), TEXT("set_pin_default_values"),
TEXT("move_node"), TEXT("set_node_positions"),
TEXT("change_struct_node_type"), TEXT("change_struct_node_type"),
TEXT("delete_node"), TEXT("delete_node_from_graph"),
TEXT("duplicate_nodes"), TEXT("duplicate_nodes_in_graph"),
TEXT("spawn_node"), TEXT("spawn_nodes_in_graph"),
TEXT("set_node_comment"), TEXT("set_node_comment"),
TEXT("rename_asset"), TEXT("rename_asset"),
TEXT("reparent_blueprint"), TEXT("reparent_blueprint"),
TEXT("set_blueprint_default"), TEXT("set_class_default_value"),
TEXT("create_blueprint"), TEXT("create_blueprint_asset"),
TEXT("create_graph"), TEXT("create_blueprint_graph"),
TEXT("delete_graph"), TEXT("delete_blueprint_graph"),
TEXT("rename_graph"), TEXT("rename_blueprint_graph"),
TEXT("add_variable"), TEXT("add_blueprint_variable"),
TEXT("remove_variable"), TEXT("remove_blueprint_variable"),
TEXT("set_variable_metadata"), TEXT("set_blueprint_variable_metadata"),
TEXT("add_interface"), TEXT("add_blueprint_interface"),
TEXT("remove_interface"), TEXT("remove_blueprint_interface"),
TEXT("add_event_dispatcher"), TEXT("add_event_dispatcher"),
TEXT("add_function_parameter"), TEXT("add_function_parameter"),
TEXT("add_component"), TEXT("add_blueprint_component"),
TEXT("remove_component"), TEXT("remove_blueprint_component"),
TEXT("restore_graph"), TEXT("restore_blueprint_graph_from_snapshot"),
TEXT("create_struct"), TEXT("create_struct_asset"),
TEXT("create_enum"), TEXT("create_enum_asset"),
TEXT("add_struct_property"), TEXT("add_struct_field"),
TEXT("remove_struct_property"), TEXT("remove_struct_field"),
TEXT("create_material"), TEXT("create_material_asset"),
TEXT("set_material_property"), TEXT("set_material_property"),
TEXT("add_material_expression"), TEXT("add_material_expression"),
TEXT("delete_material_expression"), TEXT("delete_material_expression"),
TEXT("connect_material_pins"), TEXT("connect_material_expression_pins"),
TEXT("disconnect_material_pin"), TEXT("disconnect_material_expression_pin"),
TEXT("set_expression_value"), TEXT("set_material_expression_property"),
TEXT("move_material_expression"), TEXT("set_material_expression_position"),
TEXT("create_material_instance"), TEXT("create_material_instance_asset"),
TEXT("set_material_instance_parameter"), TEXT("set_material_instance_parameter"),
TEXT("reparent_material_instance"), TEXT("reparent_material_instance"),
TEXT("create_material_function"), TEXT("create_material_function_asset"),
TEXT("restore_material_graph"), TEXT("restore_material_graph_from_snapshot"),
TEXT("create_anim_blueprint"), TEXT("create_anim_blueprint_asset"),
TEXT("add_anim_state"), TEXT("add_anim_state_to_machine"),
TEXT("remove_anim_state"), TEXT("remove_anim_state_from_machine"),
TEXT("add_anim_transition"), TEXT("add_anim_state_transition"),
TEXT("set_transition_rule"), TEXT("set_anim_transition_rule"),
TEXT("add_anim_node"), TEXT("add_anim_graph_node"),
TEXT("add_state_machine"), TEXT("add_anim_state_machine"),
TEXT("set_state_animation"), TEXT("set_anim_state_animation"),
}; };
// All handlers have uniform signature: void(const FJsonObject&, FJsonObject&) // All handlers have uniform signature: void(const FJsonObject&, FJsonObject&)
@@ -937,82 +937,82 @@ void FBlueprintMCPServer::RegisterHandlers()
HandlerMap.Add(Name, [this, Fn](const FJsonObject* Json, FJsonObject* Result) { (this->*Fn)(Json, Result); }); HandlerMap.Add(Name, [this, Fn](const FJsonObject* Json, FJsonObject* Result) { (this->*Fn)(Json, Result); });
}; };
H(TEXT("rescan"), &FBlueprintMCPServer::HandleRescan); H(TEXT("rescan_asset_registry"), &FBlueprintMCPServer::HandleRescan);
H(TEXT("blueprint"), &FBlueprintMCPServer::HandleGetBlueprint); H(TEXT("dump_blueprint"), &FBlueprintMCPServer::HandleGetBlueprint);
H(TEXT("graph"), &FBlueprintMCPServer::HandleGetGraph); H(TEXT("dump_blueprint_graph"), &FBlueprintMCPServer::HandleGetGraph);
H(TEXT("search"), &FBlueprintMCPServer::HandleSearch); H(TEXT("search_within_blueprints"), &FBlueprintMCPServer::HandleSearch);
H(TEXT("references"), &FBlueprintMCPServer::HandleFindReferences); H(TEXT("find_asset_references"), &FBlueprintMCPServer::HandleFindReferences);
H(TEXT("test_save"), &FBlueprintMCPServer::HandleTestSave); H(TEXT("test_save_blueprint_package"), &FBlueprintMCPServer::HandleTestSave);
H(TEXT("search_by_type"), &FBlueprintMCPServer::HandleSearchByType); H(TEXT("search_type_usage_in_blueprints"), &FBlueprintMCPServer::HandleSearchByType);
H(TEXT("change_variable_type"), &FBlueprintMCPServer::HandleChangeVariableType); H(TEXT("change_blueprint_variable_type"), &FBlueprintMCPServer::HandleChangeVariableType);
H(TEXT("change_function_param_type"), &FBlueprintMCPServer::HandleChangeFunctionParamType); H(TEXT("change_function_parameter_type"), &FBlueprintMCPServer::HandleChangeFunctionParamType);
H(TEXT("remove_function_parameter"), &FBlueprintMCPServer::HandleRemoveFunctionParameter); H(TEXT("remove_function_parameter"), &FBlueprintMCPServer::HandleRemoveFunctionParameter);
H(TEXT("get_pin_info"), &FBlueprintMCPServer::HandleGetPinInfo); H(TEXT("get_pin_details"), &FBlueprintMCPServer::HandleGetPinInfo);
H(TEXT("check_pin_compatibility"), &FBlueprintMCPServer::HandleCheckPinCompatibility); H(TEXT("check_pin_connection_compatibility"), &FBlueprintMCPServer::HandleCheckPinCompatibility);
H(TEXT("list_classes"), &FBlueprintMCPServer::HandleListClasses); H(TEXT("search_unreal_classes"), &FBlueprintMCPServer::HandleListClasses);
H(TEXT("list_functions"), &FBlueprintMCPServer::HandleListFunctions); H(TEXT("list_class_functions"), &FBlueprintMCPServer::HandleListFunctions);
H(TEXT("list_properties"), &FBlueprintMCPServer::HandleListProperties); H(TEXT("list_class_properties"), &FBlueprintMCPServer::HandleListProperties);
H(TEXT("validate_blueprint"), &FBlueprintMCPServer::HandleValidateBlueprint); H(TEXT("compile_blueprint"), &FBlueprintMCPServer::HandleValidateBlueprint);
H(TEXT("validate_all_blueprints"), &FBlueprintMCPServer::HandleValidateAllBlueprints); H(TEXT("compile_all_blueprints"), &FBlueprintMCPServer::HandleValidateAllBlueprints);
H(TEXT("reparent_blueprint"), &FBlueprintMCPServer::HandleReparentBlueprint); H(TEXT("reparent_blueprint"), &FBlueprintMCPServer::HandleReparentBlueprint);
H(TEXT("create_blueprint"), &FBlueprintMCPServer::HandleCreateBlueprint); H(TEXT("create_blueprint_asset"), &FBlueprintMCPServer::HandleCreateBlueprint);
H(TEXT("create_graph"), &FBlueprintMCPServer::HandleCreateGraph); H(TEXT("create_blueprint_graph"), &FBlueprintMCPServer::HandleCreateGraph);
H(TEXT("delete_graph"), &FBlueprintMCPServer::HandleDeleteGraph); H(TEXT("delete_blueprint_graph"), &FBlueprintMCPServer::HandleDeleteGraph);
H(TEXT("rename_graph"), &FBlueprintMCPServer::HandleRenameGraph); H(TEXT("rename_blueprint_graph"), &FBlueprintMCPServer::HandleRenameGraph);
H(TEXT("add_variable"), &FBlueprintMCPServer::HandleAddVariable); H(TEXT("add_blueprint_variable"), &FBlueprintMCPServer::HandleAddVariable);
H(TEXT("remove_variable"), &FBlueprintMCPServer::HandleRemoveVariable); H(TEXT("remove_blueprint_variable"), &FBlueprintMCPServer::HandleRemoveVariable);
H(TEXT("set_variable_metadata"), &FBlueprintMCPServer::HandleSetVariableMetadata); H(TEXT("set_blueprint_variable_metadata"), &FBlueprintMCPServer::HandleSetVariableMetadata);
H(TEXT("add_event_dispatcher"), &FBlueprintMCPServer::HandleAddEventDispatcher); H(TEXT("add_event_dispatcher"), &FBlueprintMCPServer::HandleAddEventDispatcher);
H(TEXT("list_event_dispatchers"), &FBlueprintMCPServer::HandleListEventDispatchers); H(TEXT("list_event_dispatchers"), &FBlueprintMCPServer::HandleListEventDispatchers);
H(TEXT("add_function_parameter"), &FBlueprintMCPServer::HandleAddFunctionParameter); H(TEXT("add_function_parameter"), &FBlueprintMCPServer::HandleAddFunctionParameter);
H(TEXT("add_component"), &FBlueprintMCPServer::HandleAddComponent); H(TEXT("add_blueprint_component"), &FBlueprintMCPServer::HandleAddComponent);
H(TEXT("remove_component"), &FBlueprintMCPServer::HandleRemoveComponent); H(TEXT("remove_blueprint_component"), &FBlueprintMCPServer::HandleRemoveComponent);
H(TEXT("list_components"), &FBlueprintMCPServer::HandleListComponents); H(TEXT("list_blueprint_components"), &FBlueprintMCPServer::HandleListComponents);
H(TEXT("snapshot_graph"), &FBlueprintMCPServer::HandleSnapshotGraph); H(TEXT("snapshot_blueprint_graph"), &FBlueprintMCPServer::HandleSnapshotGraph);
H(TEXT("diff_graph"), &FBlueprintMCPServer::HandleDiffGraph); H(TEXT("diff_blueprint_graph_vs_snapshot"), &FBlueprintMCPServer::HandleDiffGraph);
H(TEXT("restore_graph"), &FBlueprintMCPServer::HandleRestoreGraph); H(TEXT("restore_blueprint_graph_from_snapshot"), &FBlueprintMCPServer::HandleRestoreGraph);
H(TEXT("find_disconnected_pins"), &FBlueprintMCPServer::HandleFindDisconnectedPins); H(TEXT("find_pins_disconnected_since_snapshot"), &FBlueprintMCPServer::HandleFindDisconnectedPins);
H(TEXT("analyze_rebuild_impact"), &FBlueprintMCPServer::HandleAnalyzeRebuildImpact); H(TEXT("analyze_cpp_rebuild_impact"), &FBlueprintMCPServer::HandleAnalyzeRebuildImpact);
H(TEXT("create_struct"), &FBlueprintMCPServer::HandleCreateStruct); H(TEXT("create_struct_asset"), &FBlueprintMCPServer::HandleCreateStruct);
H(TEXT("create_enum"), &FBlueprintMCPServer::HandleCreateEnum); H(TEXT("create_enum_asset"), &FBlueprintMCPServer::HandleCreateEnum);
H(TEXT("add_struct_property"), &FBlueprintMCPServer::HandleAddStructProperty); H(TEXT("add_struct_field"), &FBlueprintMCPServer::HandleAddStructProperty);
H(TEXT("remove_struct_property"), &FBlueprintMCPServer::HandleRemoveStructProperty); H(TEXT("remove_struct_field"), &FBlueprintMCPServer::HandleRemoveStructProperty);
H(TEXT("get_material"), &FBlueprintMCPServer::HandleGetMaterial); H(TEXT("dump_material"), &FBlueprintMCPServer::HandleGetMaterial);
H(TEXT("get_material_graph"), &FBlueprintMCPServer::HandleGetMaterialGraph); H(TEXT("dump_material_expression_graph"), &FBlueprintMCPServer::HandleGetMaterialGraph);
H(TEXT("search_materials"), &FBlueprintMCPServer::HandleSearchMaterials); H(TEXT("search_within_materials"), &FBlueprintMCPServer::HandleSearchMaterials);
H(TEXT("get_material_instance_params"),&FBlueprintMCPServer::HandleGetMaterialInstanceParameters); H(TEXT("dump_material_instance_parameters"),&FBlueprintMCPServer::HandleGetMaterialInstanceParameters);
H(TEXT("get_material_function"), &FBlueprintMCPServer::HandleGetMaterialFunction); H(TEXT("dump_material_function"), &FBlueprintMCPServer::HandleGetMaterialFunction);
H(TEXT("describe_material"), &FBlueprintMCPServer::HandleDescribeMaterial); H(TEXT("describe_material_in_english"), &FBlueprintMCPServer::HandleDescribeMaterial);
H(TEXT("find_material_references"), &FBlueprintMCPServer::HandleFindMaterialReferences); H(TEXT("find_material_references"), &FBlueprintMCPServer::HandleFindMaterialReferences);
H(TEXT("create_material"), &FBlueprintMCPServer::HandleCreateMaterial); H(TEXT("create_material_asset"), &FBlueprintMCPServer::HandleCreateMaterial);
H(TEXT("set_material_property"), &FBlueprintMCPServer::HandleSetMaterialProperty); H(TEXT("set_material_property"), &FBlueprintMCPServer::HandleSetMaterialProperty);
H(TEXT("add_material_expression"), &FBlueprintMCPServer::HandleAddMaterialExpression); H(TEXT("add_material_expression"), &FBlueprintMCPServer::HandleAddMaterialExpression);
H(TEXT("delete_material_expression"), &FBlueprintMCPServer::HandleDeleteMaterialExpression); H(TEXT("delete_material_expression"), &FBlueprintMCPServer::HandleDeleteMaterialExpression);
H(TEXT("connect_material_pins"), &FBlueprintMCPServer::HandleConnectMaterialPins); H(TEXT("connect_material_expression_pins"), &FBlueprintMCPServer::HandleConnectMaterialPins);
H(TEXT("disconnect_material_pin"), &FBlueprintMCPServer::HandleDisconnectMaterialPin); H(TEXT("disconnect_material_expression_pin"), &FBlueprintMCPServer::HandleDisconnectMaterialPin);
H(TEXT("set_expression_value"), &FBlueprintMCPServer::HandleSetExpressionValue); H(TEXT("set_material_expression_property"), &FBlueprintMCPServer::HandleSetExpressionValue);
H(TEXT("move_material_expression"), &FBlueprintMCPServer::HandleMoveMaterialExpression); H(TEXT("set_material_expression_position"), &FBlueprintMCPServer::HandleMoveMaterialExpression);
H(TEXT("create_material_instance"), &FBlueprintMCPServer::HandleCreateMaterialInstance); H(TEXT("create_material_instance_asset"), &FBlueprintMCPServer::HandleCreateMaterialInstance);
H(TEXT("set_material_instance_parameter"), &FBlueprintMCPServer::HandleSetMaterialInstanceParameter); H(TEXT("set_material_instance_parameter"), &FBlueprintMCPServer::HandleSetMaterialInstanceParameter);
H(TEXT("reparent_material_instance"), &FBlueprintMCPServer::HandleReparentMaterialInstance); H(TEXT("reparent_material_instance"), &FBlueprintMCPServer::HandleReparentMaterialInstance);
H(TEXT("create_material_function"), &FBlueprintMCPServer::HandleCreateMaterialFunction); H(TEXT("create_material_function_asset"), &FBlueprintMCPServer::HandleCreateMaterialFunction);
H(TEXT("snapshot_material_graph"), &FBlueprintMCPServer::HandleSnapshotMaterialGraph); H(TEXT("snapshot_material_expression_graph"), &FBlueprintMCPServer::HandleSnapshotMaterialGraph);
H(TEXT("diff_material_graph"), &FBlueprintMCPServer::HandleDiffMaterialGraph); H(TEXT("diff_material_graph_vs_snapshot"), &FBlueprintMCPServer::HandleDiffMaterialGraph);
H(TEXT("restore_material_graph"), &FBlueprintMCPServer::HandleRestoreMaterialGraph); H(TEXT("restore_material_graph_from_snapshot"), &FBlueprintMCPServer::HandleRestoreMaterialGraph);
H(TEXT("validate_material"), &FBlueprintMCPServer::HandleValidateMaterial); H(TEXT("compile_material"), &FBlueprintMCPServer::HandleValidateMaterial);
H(TEXT("create_anim_blueprint"), &FBlueprintMCPServer::HandleCreateAnimBlueprint); H(TEXT("create_anim_blueprint_asset"), &FBlueprintMCPServer::HandleCreateAnimBlueprint);
H(TEXT("add_anim_state"), &FBlueprintMCPServer::HandleAddAnimState); H(TEXT("add_anim_state_to_machine"), &FBlueprintMCPServer::HandleAddAnimState);
H(TEXT("remove_anim_state"), &FBlueprintMCPServer::HandleRemoveAnimState); H(TEXT("remove_anim_state_from_machine"), &FBlueprintMCPServer::HandleRemoveAnimState);
H(TEXT("add_anim_transition"), &FBlueprintMCPServer::HandleAddAnimTransition); H(TEXT("add_anim_state_transition"), &FBlueprintMCPServer::HandleAddAnimTransition);
H(TEXT("set_transition_rule"), &FBlueprintMCPServer::HandleSetTransitionRule); H(TEXT("set_anim_transition_rule"), &FBlueprintMCPServer::HandleSetTransitionRule);
H(TEXT("add_anim_node"), &FBlueprintMCPServer::HandleAddAnimNode); H(TEXT("add_anim_graph_node"), &FBlueprintMCPServer::HandleAddAnimNode);
H(TEXT("add_state_machine"), &FBlueprintMCPServer::HandleAddStateMachine); H(TEXT("add_anim_state_machine"), &FBlueprintMCPServer::HandleAddStateMachine);
H(TEXT("set_state_animation"), &FBlueprintMCPServer::HandleSetStateAnimation); H(TEXT("set_anim_state_animation"), &FBlueprintMCPServer::HandleSetStateAnimation);
H(TEXT("list_anim_slots"), &FBlueprintMCPServer::HandleListAnimSlots); H(TEXT("list_anim_slot_names"), &FBlueprintMCPServer::HandleListAnimSlots);
H(TEXT("list_sync_groups"), &FBlueprintMCPServer::HandleListSyncGroups); H(TEXT("list_anim_sync_groups"), &FBlueprintMCPServer::HandleListSyncGroups);
H(TEXT("create_blend_space"), &FBlueprintMCPServer::HandleCreateBlendSpace); H(TEXT("create_blend_space_asset"), &FBlueprintMCPServer::HandleCreateBlendSpace);
H(TEXT("set_blend_space_samples"), &FBlueprintMCPServer::HandleSetBlendSpaceSamples); H(TEXT("set_blend_space_sample_points"), &FBlueprintMCPServer::HandleSetBlendSpaceSamples);
H(TEXT("set_state_blend_space"), &FBlueprintMCPServer::HandleSetStateBlendSpace); H(TEXT("set_anim_state_blend_space"), &FBlueprintMCPServer::HandleSetStateBlendSpace);
} }
void FBlueprintMCPServer::BuildMCPHandlerRegistry() void FBlueprintMCPServer::BuildMCPHandlerRegistry()

View File

@@ -4,8 +4,8 @@
#include "MCPHandler.h" #include "MCPHandler.h"
#include "BlueprintMCPHandlers_DiffBlueprints.generated.h" #include "BlueprintMCPHandlers_DiffBlueprints.generated.h"
UCLASS(meta=(ToolName="diff_blueprints")) UCLASS(meta=(ToolName="diff_two_blueprints"))
class UMCPHandler_DiffBlueprints : public UObject, public IMCPHandler class UMCPHandler_DiffTwoBlueprints : public UObject, public IMCPHandler
{ {
GENERATED_BODY() GENERATED_BODY()

View File

@@ -4,8 +4,8 @@
#include "MCPHandler.h" #include "MCPHandler.h"
#include "BlueprintMCPHandlers_Interfaces.generated.h" #include "BlueprintMCPHandlers_Interfaces.generated.h"
UCLASS(meta=(ToolName="list_interfaces")) UCLASS(meta=(ToolName="list_blueprint_interfaces"))
class UMCPHandler_ListInterfaces : public UObject, public IMCPHandler class UMCPHandler_ListBlueprintInterfaces : public UObject, public IMCPHandler
{ {
GENERATED_BODY() GENERATED_BODY()
@@ -22,8 +22,8 @@ public:
virtual void Handle(const FJsonObject* Json, FJsonObject* Result) override; virtual void Handle(const FJsonObject* Json, FJsonObject* Result) override;
}; };
UCLASS(meta=(ToolName="add_interface")) UCLASS(meta=(ToolName="add_blueprint_interface"))
class UMCPHandler_AddInterface : public UObject, public IMCPHandler class UMCPHandler_AddBlueprintInterface : public UObject, public IMCPHandler
{ {
GENERATED_BODY() GENERATED_BODY()
@@ -43,8 +43,8 @@ public:
virtual void Handle(const FJsonObject* Json, FJsonObject* Result) override; virtual void Handle(const FJsonObject* Json, FJsonObject* Result) override;
}; };
UCLASS(meta=(ToolName="remove_interface")) UCLASS(meta=(ToolName="remove_blueprint_interface"))
class UMCPHandler_RemoveInterface : public UObject, public IMCPHandler class UMCPHandler_RemoveBlueprintInterface : public UObject, public IMCPHandler
{ {
GENERATED_BODY() GENERATED_BODY()

View File

@@ -22,8 +22,8 @@ struct FSetPinDefaultEntry
FString Value; FString Value;
}; };
UCLASS(meta=(ToolName="set_pin_default")) UCLASS(meta=(ToolName="set_pin_default_values"))
class UMCPHandler_SetPinDefault : public UObject, public IMCPHandler class UMCPHandler_SetPinDefaultValues : public UObject, public IMCPHandler
{ {
GENERATED_BODY() GENERATED_BODY()
@@ -54,8 +54,8 @@ struct FMoveNodeEntry
int32 Y = 0; int32 Y = 0;
}; };
UCLASS(meta=(ToolName="move_node")) UCLASS(meta=(ToolName="set_node_positions"))
class UMCPHandler_MoveNode : public UObject, public IMCPHandler class UMCPHandler_SetNodePositions : public UObject, public IMCPHandler
{ {
GENERATED_BODY() GENERATED_BODY()
@@ -74,8 +74,8 @@ public:
virtual void Handle(const FJsonObject* Json, FJsonObject* Result) override; virtual void Handle(const FJsonObject* Json, FJsonObject* Result) override;
}; };
UCLASS(meta=(ToolName="duplicate_nodes")) UCLASS(meta=(ToolName="duplicate_nodes_in_graph"))
class UMCPHandler_DuplicateNodes : public UObject, public IMCPHandler class UMCPHandler_DuplicateNodesInGraph : public UObject, public IMCPHandler
{ {
GENERATED_BODY() GENERATED_BODY()
@@ -120,8 +120,8 @@ struct FSpawnNodeEntry
int32 PosY = 0; int32 PosY = 0;
}; };
UCLASS(meta=(ToolName="spawn_node")) UCLASS(meta=(ToolName="spawn_nodes_in_graph"))
class UMCPHandler_SpawnNode : public UObject, public IMCPHandler class UMCPHandler_SpawnNodesInGraph : public UObject, public IMCPHandler
{ {
GENERATED_BODY() GENERATED_BODY()
@@ -188,8 +188,8 @@ public:
virtual void Handle(const FJsonObject* Json, FJsonObject* Result) override; virtual void Handle(const FJsonObject* Json, FJsonObject* Result) override;
}; };
UCLASS(meta=(ToolName="delete_node")) UCLASS(meta=(ToolName="delete_node_from_graph"))
class UMCPHandler_DeleteNode : public UObject, public IMCPHandler class UMCPHandler_DeleteNodeFromGraph : public UObject, public IMCPHandler
{ {
GENERATED_BODY() GENERATED_BODY()
@@ -227,8 +227,8 @@ struct FConnectPinsEntry
FString TargetPinName; FString TargetPinName;
}; };
UCLASS(meta=(ToolName="connect_pins")) UCLASS(meta=(ToolName="connect_blueprint_pins"))
class UMCPHandler_ConnectPins : public UObject, public IMCPHandler class UMCPHandler_ConnectBlueprintPins : public UObject, public IMCPHandler
{ {
GENERATED_BODY() GENERATED_BODY()
@@ -265,8 +265,8 @@ struct FDisconnectPinEntry
FString TargetPinName; FString TargetPinName;
}; };
UCLASS(meta=(ToolName="disconnect_pin")) UCLASS(meta=(ToolName="disconnect_blueprint_pins"))
class UMCPHandler_DisconnectPin : public UObject, public IMCPHandler class UMCPHandler_DisconnectBlueprintPins : public UObject, public IMCPHandler
{ {
GENERATED_BODY() GENERATED_BODY()
@@ -286,8 +286,8 @@ public:
virtual void Handle(const FJsonObject* Json, FJsonObject* Result) override; virtual void Handle(const FJsonObject* Json, FJsonObject* Result) override;
}; };
UCLASS(meta=(ToolName="replace_function_calls")) UCLASS(meta=(ToolName="replace_function_calls_in_blueprint"))
class UMCPHandler_ReplaceFunctionCalls : public UObject, public IMCPHandler class UMCPHandler_ReplaceFunctionCallsInBlueprint : public UObject, public IMCPHandler
{ {
GENERATED_BODY() GENERATED_BODY()
@@ -334,8 +334,8 @@ public:
virtual void Handle(const FJsonObject* Json, FJsonObject* Result) override; virtual void Handle(const FJsonObject* Json, FJsonObject* Result) override;
}; };
UCLASS(meta=(ToolName="refresh_all_nodes")) UCLASS(meta=(ToolName="refresh_all_nodes_in_graph"))
class UMCPHandler_RefreshAllNodes : public UObject, public IMCPHandler class UMCPHandler_RefreshAllNodesInGraph : public UObject, public IMCPHandler
{ {
GENERATED_BODY() GENERATED_BODY()
@@ -396,8 +396,8 @@ public:
virtual void Handle(const FJsonObject* Json, FJsonObject* Result) override; virtual void Handle(const FJsonObject* Json, FJsonObject* Result) override;
}; };
UCLASS(meta=(ToolName="set_blueprint_default")) UCLASS(meta=(ToolName="set_class_default_value"))
class UMCPHandler_SetBlueprintDefault : public UObject, public IMCPHandler class UMCPHandler_SetClassDefaultValue : public UObject, public IMCPHandler
{ {
GENERATED_BODY() GENERATED_BODY()
@@ -420,8 +420,8 @@ public:
virtual void Handle(const FJsonObject* Json, FJsonObject* Result) override; virtual void Handle(const FJsonObject* Json, FJsonObject* Result) override;
}; };
UCLASS(meta=(ToolName="search_node_types")) UCLASS(meta=(ToolName="search_spawnable_node_types"))
class UMCPHandler_SearchNodeTypes : public UObject, public IMCPHandler class UMCPHandler_SearchSpawnableNodeTypes : public UObject, public IMCPHandler
{ {
GENERATED_BODY() GENERATED_BODY()

View File

@@ -0,0 +1,206 @@
# BlueprintMCP Endpoint Naming Plan
Convention: every endpoint is `verb_noun`. Names should be descriptive enough that you can guess what the endpoint does without reading documentation. Verbs:
- **dump** — return the entire contents of a single object (blueprint, graph, material, etc.)
- **list** — enumerate assets or sub-elements from the asset registry (cheap, no loading)
- **search** — deep search that loads assets, inspects their contents, and returns matches
- **find** — look up references or locate specific items by criteria
- **create** — make a new asset/graph/struct/enum
- **add** — add a sub-element to an existing thing (variable, component, parameter, etc.)
- **remove/delete** — remove a sub-element or asset
- **set/change** — change a property value or type
- **rename** — rename something
- **connect/disconnect** — wire/unwire pins
- **validate/compile** — compile and report errors
- **snapshot/diff/restore** — capture, compare, and restore graph state
## Blueprint — Read/Query
| Current | Proposed | Description |
|---------|----------|-------------|
| `list` | `list_blueprint_assets` | List all blueprint and level blueprint assets from the asset registry (no loading). Optional `query` filters by name/path substring. Optional `parentClass` filters by parent class name. Returns name, path, and parent class for each. |
| `blueprint` | `dump_blueprint` | Load one blueprint by name and dump everything: variables, graph list, interfaces, and parent class. |
| `graph` | `dump_blueprint_graph` | Load one graph by blueprint name + graph name. Dumps all nodes with their pins, connections, positions, and metadata. |
| `search` | `search_within_blueprints` | Deep search: loads every blueprint, iterates all graphs/nodes, and finds nodes whose title, function name, event name, or variable name matches the query. Returns blueprint, graph, and node info for each match. |
| `references` | `find_asset_references` | Given an asset path, queries the asset registry for all packages that reference it. Separates results into blueprint referencers and other referencers. |
| `search_by_type` | `search_type_usage_in_blueprints` | Deep search: loads every blueprint and finds variables, function parameters, and pin types that use a given type name (struct, class, or enum). Returns usage location and context for each match. |
| `get_pin_info` | `get_pin_details` | Get detailed type and connection info for a specific pin (by blueprint, nodeId, pinName). |
| `check_pin_compatibility` | `check_pin_connection_compatibility` | Check whether two specific pins (source and target) can be connected. Returns compatibility and any error message. |
| `test_save` | `test_save_blueprint_package` | Diagnostic: load a blueprint and save its package with no modifications, to verify the save pipeline works. |
## Blueprint — Discovery (Unreal reflection)
| Current | Proposed | Description |
|---------|----------|-------------|
| `list_classes` | `search_unreal_classes` | Search all UClasses in the engine. Optional `query` filters by class name substring. Optional `parentClass` restricts to subclasses. Returns class name, path, parent, and flags. |
| `list_functions` | `list_class_functions` | List all UFunctions on a given class. Optional `query` filters by function name substring. Returns name, parameters, return type, and flags for each. |
| `list_properties` | `list_class_properties` | List all UProperties on a given class. Optional `query` filters by property name substring. Returns name, type, flags, and metadata for each. |
## Blueprint — Validation
| Current | Proposed | Description |
|---------|----------|-------------|
| `validate_blueprint` | `compile_blueprint` | Compile one blueprint and report any errors/warnings with graph, node, and message details. |
| `validate_all_blueprints` | `compile_all_blueprints` | Compile all blueprints (optional `query` to filter which ones). Returns per-blueprint pass/fail with error details. Supports pagination. |
## Blueprint — Creation/Structure
| Current | Proposed | Description |
|---------|----------|-------------|
| `create_blueprint` | `create_blueprint_asset` | Create a new Blueprint asset with a given name, path, and parent class. |
| `create_graph` | `create_blueprint_graph` | Create a new function or macro graph inside a blueprint. |
| `delete_graph` | `delete_blueprint_graph` | Delete a graph from a blueprint. |
| `rename_graph` | `rename_blueprint_graph` | Rename a graph inside a blueprint. |
| `reparent_blueprint` | `reparent_blueprint` | Change a blueprint's parent class. |
| `create_struct` | `create_struct_asset` | Create a new user-defined struct asset. |
| `create_enum` | `create_enum_asset` | Create a new user-defined enum asset. |
| `add_struct_property` | `add_struct_field` | Add a field to a user-defined struct. |
| `remove_struct_property` | `remove_struct_field` | Remove a field from a user-defined struct. |
## Blueprint — Variables
| Current | Proposed | Description |
|---------|----------|-------------|
| `add_variable` | `add_blueprint_variable` | Add a variable to a blueprint with a given name and type. |
| `remove_variable` | `remove_blueprint_variable` | Remove a variable from a blueprint by name. |
| `change_variable_type` | `change_blueprint_variable_type` | Change an existing blueprint variable's type. |
| `set_variable_metadata` | `set_blueprint_variable_metadata` | Set variable metadata (category, tooltip, replication, etc.). |
## Blueprint — Functions/Parameters
| Current | Proposed | Description |
|---------|----------|-------------|
| `add_function_parameter` | `add_function_parameter` | Add an input or output parameter to a function graph. |
| `remove_function_parameter` | `remove_function_parameter` | Remove a parameter from a function graph. |
| `change_function_param_type` | `change_function_parameter_type` | Change the type of an existing function parameter. |
## Blueprint — Event Dispatchers
| Current | Proposed | Description |
|---------|----------|-------------|
| `add_event_dispatcher` | `add_event_dispatcher` | Add an event dispatcher to a blueprint. |
| `list_event_dispatchers` | `list_event_dispatchers` | List all event dispatchers on a blueprint with their delegate signatures. |
## Blueprint — Components
| Current | Proposed | Description |
|---------|----------|-------------|
| `add_component` | `add_blueprint_component` | Add a component to a blueprint's component hierarchy. |
| `remove_component` | `remove_blueprint_component` | Remove a component from a blueprint. |
| `list_components` | `list_blueprint_components` | List all components in a blueprint's component hierarchy. |
## Blueprint — Interfaces (new-style)
| Current | Proposed | Description |
|---------|----------|-------------|
| `list_interfaces` | `list_blueprint_interfaces` | List all interfaces implemented by a blueprint, with the function stubs each provides. |
| `add_interface` | `add_blueprint_interface` | Add an interface implementation to a blueprint. Creates function stub graphs. |
| `remove_interface` | `remove_blueprint_interface` | Remove an interface implementation from a blueprint. Optionally preserves function graphs. |
## Blueprint — Node Mutation (new-style)
| Current | Proposed | Description |
|---------|----------|-------------|
| `search_node_types` | `search_spawnable_node_types` | Search the blueprint action database (the right-click menu) for spawnable node types matching a query string. Returns full action names like "Utilities\|Flow Control\|Branch". |
| `spawn_node` | `spawn_node_in_graph` | Create one or more nodes in a graph by exact action name (from search_spawnable_node_types). Invokes the spawner and returns the new node details. |
| `delete_node` | `delete_node_from_graph` | Delete a node from a graph by GUID. |
| `move_node` | `set_node_position` | Set a node's X/Y position in the graph editor. |
| `duplicate_nodes` | `duplicate_nodes_in_graph` | Duplicate one or more nodes within a graph. |
| `connect_pins` | `connect_blueprint_pins` | Connect two pins (by blueprint, source node+pin, target node+pin). |
| `disconnect_pin` | `disconnect_blueprint_pin` | Break connections on a pin (all connections, or a specific one). |
| `set_pin_default` | `set_pin_default_value` | Set a pin's default value string. |
| `get_node_comment` | `get_node_comment` | Get the comment text on a node. |
| `set_node_comment` | `set_node_comment` | Set or clear the comment text on a node. |
| `replace_function_calls` | `replace_function_calls_in_blueprint` | Bulk-replace all calls to one function with calls to another across a blueprint. |
| `refresh_all_nodes` | `refresh_all_nodes_in_graph` | Refresh (reconstruct) all nodes in a graph to pick up signature changes. |
| `change_struct_node_type` | `change_struct_node_type` | Change which struct a Break/Make/Set-Members node operates on. |
| `set_blueprint_default` | `set_class_default_value` | Set a property value on the blueprint's Class Default Object (CDO). |
| `rename_asset` | `rename_asset` | Rename or move an asset to a new name/path. |
| `delete_asset` | `delete_asset` | Delete an asset from the project. |
| `diff_blueprints` | `diff_two_blueprints` | Compare two blueprints and return structural differences (added/removed/changed nodes, connections, variables). |
## Blueprint — Snapshots
| Current | Proposed | Description |
|---------|----------|-------------|
| `snapshot_graph` | `snapshot_blueprint_graph` | Capture a snapshot of a blueprint's graphs (nodes and connections) for later diffing or restore. |
| `diff_graph` | `diff_blueprint_graph_vs_snapshot` | Diff the current state of a blueprint's graphs against a previously captured snapshot. Returns added/removed/changed nodes and connections. |
| `restore_graph` | `restore_blueprint_graph_from_snapshot` | Restore a blueprint's graphs to the state captured in a snapshot (recreates nodes and connections). |
| `find_disconnected_pins` | `find_pins_disconnected_since_snapshot` | Compare current graphs against a snapshot and find pins that were previously connected but are now disconnected. |
| `analyze_rebuild_impact` | `analyze_cpp_rebuild_impact` | Given a C++ module name, find all blueprints that use structs/classes from that module and report which nodes/pins would be affected by a rebuild. |
## Materials — Read
| Current | Proposed | Description |
|---------|----------|-------------|
| `materials` | `list_material_assets` | List all material and material instance assets from the asset registry (no loading). Optional `query` filters by name/path substring. Optional `type` filters to "material" or "instance" only. |
| `material` | `dump_material` | Load one material by name and dump everything: properties (domain, blend mode, shading model, two-sided, etc.) and expression summary. |
| `material_graph` | `dump_material_expression_graph` | Load one material and dump its full expression graph: every expression node with type, position, parameter values, and all pin connections. |
| `describe_material` | `describe_material_in_english` | Load a material and generate a human-readable text description by tracing the expression graph backwards from each material output pin. |
| `search_materials` | `search_within_materials` | Deep search: loads every material, inspects expression nodes, and finds materials/expressions whose name, class, description, or parameter name matches the query. |
| `material_references` | `find_material_references` | Given a material name, query the asset registry for all assets that reference it. |
## Materials — Mutation
| Current | Proposed | Description |
|---------|----------|-------------|
| `create_material` | `create_material_asset` | Create a new material asset. |
| `set_material_property` | `set_material_property` | Set a top-level material property (blend mode, shading model, two-sided, etc.). |
| `add_material_expression` | `add_material_expression` | Add a material expression node to a material's graph. |
| `delete_material_expression` | `delete_material_expression` | Remove a material expression node from a material's graph. |
| `connect_material_pins` | `connect_material_expression_pins` | Connect two expression pins in a material graph. |
| `disconnect_material_pin` | `disconnect_material_expression_pin` | Disconnect a pin in a material graph. |
| `set_expression_value` | `set_material_expression_property` | Set a property on a material expression node (e.g. constant value, texture, parameter name). |
| `move_material_expression` | `set_material_expression_position` | Set X/Y position of a material expression in the graph editor. |
| `validate_material` | `compile_material` | Compile a material and report errors. |
## Material Instances
| Current | Proposed | Description |
|---------|----------|-------------|
| `create_material_instance` | `create_material_instance_asset` | Create a new material instance constant with a given parent material. |
| `set_material_instance_parameter` | `set_material_instance_parameter` | Set a parameter override on a material instance (scalar, vector, texture, etc.). |
| `material_instance_params` | `dump_material_instance_parameters` | Dump all parameter values on a material instance, showing both overridden and inherited values. |
| `reparent_material_instance` | `reparent_material_instance` | Change a material instance's parent material. |
## Material Functions
| Current | Proposed | Description |
|---------|----------|-------------|
| `material_functions` | `list_material_function_assets` | List all material function assets from the asset registry. Optional `query` filters by name/path substring. |
| `material_function` | `dump_material_function` | Load one material function and dump its expressions, inputs, and outputs. |
| `create_material_function` | `create_material_function_asset` | Create a new material function asset. |
## Material Snapshots
| Current | Proposed | Description |
|---------|----------|-------------|
| `snapshot_material_graph` | `snapshot_material_expression_graph` | Capture a snapshot of a material's expression graph. |
| `diff_material_graph` | `diff_material_graph_vs_snapshot` | Diff a material's current expression graph against a snapshot. |
| `restore_material_graph` | `restore_material_graph_from_snapshot` | Restore a material's expression graph from a snapshot. |
## Animation Blueprints
| Current | Proposed | Description |
|---------|----------|-------------|
| `create_anim_blueprint` | `create_anim_blueprint_asset` | Create a new Animation Blueprint asset with a given skeleton. |
| `add_anim_state` | `add_anim_state_to_machine` | Add a state node to a state machine graph. |
| `remove_anim_state` | `remove_anim_state_from_machine` | Remove a state node from a state machine graph. |
| `add_anim_transition` | `add_anim_state_transition` | Add a transition between two states in a state machine. |
| `set_transition_rule` | `set_anim_transition_rule` | Set the boolean condition expression for a state machine transition. |
| `add_anim_node` | `add_anim_graph_node` | Add an animation node (sequence player, blend space player, etc.) to a state's graph. |
| `add_state_machine` | `add_anim_state_machine` | Add a state machine sub-graph to an anim blueprint's AnimGraph. |
| `set_state_animation` | `set_anim_state_animation` | Set which animation sequence a state plays. |
| `list_anim_slots` | `list_anim_slot_names` | List all animation slot names available in the skeleton's slot groups. |
| `list_sync_groups` | `list_anim_sync_groups` | List all animation sync groups defined in the project. |
| `create_blend_space` | `create_blend_space_asset` | Create a new Blend Space asset. |
| `set_blend_space_samples` | `set_blend_space_sample_points` | Set the sample points (animation + coordinates) on a blend space. |
| `set_state_blend_space` | `set_anim_state_blend_space` | Set a state to play a blend space instead of a single animation. |
## System
| Current | Proposed | Description |
|---------|----------|-------------|
| `health` | `health` | Returns server status, mode, and asset counts. Answered on HTTP thread, no game-thread access. |
| `rescan` | `rescan_asset_registry` | Re-scan the asset registry and refresh all cached asset lists. |
| `shutdown` | `shutdown` | Request graceful engine exit. Only available in commandlet mode. |