Rename MCP endpoints to snake_case. Eliminate javascript wrapper.

This commit is contained in:
2026-03-06 04:53:33 -05:00
parent 3ed7a33f69
commit 6762434b43
4478 changed files with 273 additions and 1120130 deletions

View File

@@ -1727,11 +1727,11 @@ struct FNodeActionSearch
};
// ============================================================
// SearchNodeActions — search the blueprint action database
// SearchNodeTypes — search the blueprint action database
// for spawners matching a query string (same pool as the right-click menu)
// ============================================================
void UMCPHandler_SearchNodeActions::Handle(const FJsonObject* Json, FJsonObject* Result)
void UMCPHandler_SearchNodeTypes::Handle(const FJsonObject* Json, FJsonObject* Result)
{
int32 ClampedMax = FMath::Clamp(MaxResults, 1, 500);
@@ -1746,7 +1746,7 @@ void UMCPHandler_SearchNodeActions::Handle(const FJsonObject* Json, FJsonObject*
Result->SetBoolField(TEXT("success"), true);
Result->SetNumberField(TEXT("count"), ResultArray.Num());
Result->SetArrayField(TEXT("actions"), ResultArray);
Result->SetArrayField(TEXT("results"), ResultArray);
}
// ============================================================
@@ -1816,7 +1816,7 @@ void UMCPHandler_SpawnNode::Handle(const FJsonObject* Json, FJsonObject* Result)
if (Matches.Num() == 0)
{
EntryResult->SetStringField(TEXT("error"), FString::Printf(
TEXT("No action found matching '%s'. Use search_node_actions to find available actions."),
TEXT("No action found matching '%s'. Use search_node_types to find available actions."),
*Entry.ActionName));
continue;
}

View File

@@ -572,137 +572,85 @@ bool FBlueprintMCPServer::Start(int32 InPort, bool bEditorMode)
return true;
}));
// Queued (need main thread for LoadObject)
// Old-style handlers (queued, not yet ported to UMCPHandler)
Router->BindRoute(FHttpPath(TEXT("/api/blueprint")), EHttpServerRequestVerbs::VERB_GET,
QueuedHandler(TEXT("blueprint")));
Router->BindRoute(FHttpPath(TEXT("/api/graph")), EHttpServerRequestVerbs::VERB_GET,
QueuedHandler(TEXT("graph")));
Router->BindRoute(FHttpPath(TEXT("/api/search")), EHttpServerRequestVerbs::VERB_GET,
QueuedHandler(TEXT("search")));
// Reference finder + write tools
Router->BindRoute(FHttpPath(TEXT("/api/references")), EHttpServerRequestVerbs::VERB_GET,
QueuedHandler(TEXT("references")));
Router->BindRoute(FHttpPath(TEXT("/api/replace-function-calls")), EHttpServerRequestVerbs::VERB_POST,
QueuedHandler(TEXT("replace_function_calls")));
Router->BindRoute(FHttpPath(TEXT("/api/change-variable-type")), EHttpServerRequestVerbs::VERB_POST,
QueuedHandler(TEXT("changeVariableType")));
Router->BindRoute(FHttpPath(TEXT("/api/change-function-param-type")), EHttpServerRequestVerbs::VERB_POST,
QueuedHandler(TEXT("changeFunctionParamType")));
Router->BindRoute(FHttpPath(TEXT("/api/delete-asset")), EHttpServerRequestVerbs::VERB_POST,
QueuedHandler(TEXT("delete_asset")));
Router->BindRoute(FHttpPath(TEXT("/api/test-save")), EHttpServerRequestVerbs::VERB_GET,
QueuedHandler(TEXT("testSave")));
Router->BindRoute(FHttpPath(TEXT("/api/connect-pins")), EHttpServerRequestVerbs::VERB_POST,
QueuedHandler(TEXT("connect_pins")));
Router->BindRoute(FHttpPath(TEXT("/api/disconnect-pin")), EHttpServerRequestVerbs::VERB_POST,
QueuedHandler(TEXT("disconnect_pin")));
Router->BindRoute(FHttpPath(TEXT("/api/refresh-all-nodes")), EHttpServerRequestVerbs::VERB_POST,
QueuedHandler(TEXT("refresh_all_nodes")));
Router->BindRoute(FHttpPath(TEXT("/api/set-pin-default")), EHttpServerRequestVerbs::VERB_POST,
QueuedHandler(TEXT("set_pin_default")));
Router->BindRoute(FHttpPath(TEXT("/api/move-node")), EHttpServerRequestVerbs::VERB_POST,
QueuedHandler(TEXT("move_node")));
Router->BindRoute(FHttpPath(TEXT("/api/get-node-comment")), EHttpServerRequestVerbs::VERB_POST,
QueuedHandler(TEXT("get_node_comment")));
Router->BindRoute(FHttpPath(TEXT("/api/set-node-comment")), EHttpServerRequestVerbs::VERB_POST,
QueuedHandler(TEXT("set_node_comment")));
Router->BindRoute(FHttpPath(TEXT("/api/get-pin-info")), EHttpServerRequestVerbs::VERB_POST,
QueuedHandler(TEXT("getPinInfo")));
Router->BindRoute(FHttpPath(TEXT("/api/check-pin-compatibility")), EHttpServerRequestVerbs::VERB_POST,
QueuedHandler(TEXT("checkPinCompatibility")));
Router->BindRoute(FHttpPath(TEXT("/api/list-classes")), EHttpServerRequestVerbs::VERB_POST,
QueuedHandler(TEXT("listClasses")));
Router->BindRoute(FHttpPath(TEXT("/api/list-functions")), EHttpServerRequestVerbs::VERB_POST,
QueuedHandler(TEXT("listFunctions")));
Router->BindRoute(FHttpPath(TEXT("/api/list-properties")), EHttpServerRequestVerbs::VERB_POST,
QueuedHandler(TEXT("listProperties")));
Router->BindRoute(FHttpPath(TEXT("/api/change-struct-node-type")), EHttpServerRequestVerbs::VERB_POST,
QueuedHandler(TEXT("change_struct_node_type")));
Router->BindRoute(FHttpPath(TEXT("/api/remove-function-parameter")), EHttpServerRequestVerbs::VERB_POST,
QueuedHandler(TEXT("removeFunctionParameter")));
Router->BindRoute(FHttpPath(TEXT("/api/delete-node")), EHttpServerRequestVerbs::VERB_POST,
QueuedHandler(TEXT("delete_node")));
Router->BindRoute(FHttpPath(TEXT("/api/duplicate-nodes")), EHttpServerRequestVerbs::VERB_POST,
QueuedHandler(TEXT("duplicate_nodes")));
Router->BindRoute(FHttpPath(TEXT("/api/search-by-type")), EHttpServerRequestVerbs::VERB_GET,
QueuedHandler(TEXT("searchByType")));
Router->BindRoute(FHttpPath(TEXT("/api/validate-blueprint")), EHttpServerRequestVerbs::VERB_POST,
QueuedHandler(TEXT("validateBlueprint")));
Router->BindRoute(FHttpPath(TEXT("/api/validate-all-blueprints")), EHttpServerRequestVerbs::VERB_POST,
QueuedHandler(TEXT("validateAllBlueprints")));
Router->BindRoute(FHttpPath(TEXT("/api/search-node-actions")), EHttpServerRequestVerbs::VERB_POST,
QueuedHandler(TEXT("search_node_actions")));
Router->BindRoute(FHttpPath(TEXT("/api/spawn-node")), EHttpServerRequestVerbs::VERB_POST,
QueuedHandler(TEXT("spawn_node")));
Router->BindRoute(FHttpPath(TEXT("/api/rename-asset")), EHttpServerRequestVerbs::VERB_POST,
QueuedHandler(TEXT("rename_asset")));
Router->BindRoute(FHttpPath(TEXT("/api/reparent-blueprint")), EHttpServerRequestVerbs::VERB_POST,
QueuedHandler(TEXT("reparentBlueprint")));
Router->BindRoute(FHttpPath(TEXT("/api/set-blueprint-default")), EHttpServerRequestVerbs::VERB_POST,
QueuedHandler(TEXT("set_blueprint_default")));
Router->BindRoute(FHttpPath(TEXT("/api/create-blueprint")), EHttpServerRequestVerbs::VERB_POST,
QueuedHandler(TEXT("createBlueprint")));
Router->BindRoute(FHttpPath(TEXT("/api/create-graph")), EHttpServerRequestVerbs::VERB_POST,
QueuedHandler(TEXT("createGraph")));
Router->BindRoute(FHttpPath(TEXT("/api/create-struct")), EHttpServerRequestVerbs::VERB_POST,
QueuedHandler(TEXT("createStruct")));
Router->BindRoute(FHttpPath(TEXT("/api/create-enum")), EHttpServerRequestVerbs::VERB_POST,
QueuedHandler(TEXT("createEnum")));
Router->BindRoute(FHttpPath(TEXT("/api/add-struct-property")), EHttpServerRequestVerbs::VERB_POST,
QueuedHandler(TEXT("addStructProperty")));
Router->BindRoute(FHttpPath(TEXT("/api/remove-struct-property")), EHttpServerRequestVerbs::VERB_POST,
QueuedHandler(TEXT("removeStructProperty")));
Router->BindRoute(FHttpPath(TEXT("/api/delete-graph")), EHttpServerRequestVerbs::VERB_POST,
QueuedHandler(TEXT("deleteGraph")));
Router->BindRoute(FHttpPath(TEXT("/api/rename-graph")), EHttpServerRequestVerbs::VERB_POST,
QueuedHandler(TEXT("renameGraph")));
Router->BindRoute(FHttpPath(TEXT("/api/add-variable")), EHttpServerRequestVerbs::VERB_POST,
QueuedHandler(TEXT("addVariable")));
Router->BindRoute(FHttpPath(TEXT("/api/remove-variable")), EHttpServerRequestVerbs::VERB_POST,
QueuedHandler(TEXT("removeVariable")));
Router->BindRoute(FHttpPath(TEXT("/api/set-variable-metadata")), EHttpServerRequestVerbs::VERB_POST,
QueuedHandler(TEXT("setVariableMetadata")));
// Interface tools
Router->BindRoute(FHttpPath(TEXT("/api/add-interface")), EHttpServerRequestVerbs::VERB_POST,
QueuedHandler(TEXT("add_interface")));
Router->BindRoute(FHttpPath(TEXT("/api/remove-interface")), EHttpServerRequestVerbs::VERB_POST,
QueuedHandler(TEXT("remove_interface")));
Router->BindRoute(FHttpPath(TEXT("/api/list-interfaces")), EHttpServerRequestVerbs::VERB_POST,
QueuedHandler(TEXT("list_interfaces")));
// Event Dispatcher tools
Router->BindRoute(FHttpPath(TEXT("/api/add-event-dispatcher")), EHttpServerRequestVerbs::VERB_POST,
QueuedHandler(TEXT("addEventDispatcher")));
Router->BindRoute(FHttpPath(TEXT("/api/list-event-dispatchers")), EHttpServerRequestVerbs::VERB_POST,
QueuedHandler(TEXT("listEventDispatchers")));
// Function parameter tools
Router->BindRoute(FHttpPath(TEXT("/api/add-function-parameter")), EHttpServerRequestVerbs::VERB_POST,
QueuedHandler(TEXT("addFunctionParameter")));
// Component tools
Router->BindRoute(FHttpPath(TEXT("/api/add-component")), EHttpServerRequestVerbs::VERB_POST,
QueuedHandler(TEXT("addComponent")));
Router->BindRoute(FHttpPath(TEXT("/api/remove-component")), EHttpServerRequestVerbs::VERB_POST,
QueuedHandler(TEXT("removeComponent")));
Router->BindRoute(FHttpPath(TEXT("/api/list-components")), EHttpServerRequestVerbs::VERB_POST,
QueuedHandler(TEXT("listComponents")));
// Snapshot / Safety tools
Router->BindRoute(FHttpPath(TEXT("/api/snapshot-graph")), EHttpServerRequestVerbs::VERB_POST,
QueuedHandler(TEXT("snapshotGraph")));
Router->BindRoute(FHttpPath(TEXT("/api/diff-graph")), EHttpServerRequestVerbs::VERB_POST,
QueuedHandler(TEXT("diffGraph")));
Router->BindRoute(FHttpPath(TEXT("/api/restore-graph")), EHttpServerRequestVerbs::VERB_POST,
QueuedHandler(TEXT("restoreGraph")));
Router->BindRoute(FHttpPath(TEXT("/api/find-disconnected-pins")), EHttpServerRequestVerbs::VERB_POST,
QueuedHandler(TEXT("findDisconnectedPins")));
Router->BindRoute(FHttpPath(TEXT("/api/analyze-rebuild-impact")), EHttpServerRequestVerbs::VERB_POST,
QueuedHandler(TEXT("analyzeRebuildImpact")));
Router->BindRoute(FHttpPath(TEXT("/api/diff-blueprints")), EHttpServerRequestVerbs::VERB_POST,
QueuedHandler(TEXT("diff_blueprints")));
Router->BindRoute(FHttpPath(TEXT("/api/change_variable_type")), EHttpServerRequestVerbs::VERB_POST,
QueuedHandler(TEXT("change_variable_type")));
Router->BindRoute(FHttpPath(TEXT("/api/change_function_param_type")), EHttpServerRequestVerbs::VERB_POST,
QueuedHandler(TEXT("change_function_param_type")));
Router->BindRoute(FHttpPath(TEXT("/api/test_save")), EHttpServerRequestVerbs::VERB_GET,
QueuedHandler(TEXT("test_save")));
Router->BindRoute(FHttpPath(TEXT("/api/get_pin_info")), EHttpServerRequestVerbs::VERB_POST,
QueuedHandler(TEXT("get_pin_info")));
Router->BindRoute(FHttpPath(TEXT("/api/check_pin_compatibility")), EHttpServerRequestVerbs::VERB_POST,
QueuedHandler(TEXT("check_pin_compatibility")));
Router->BindRoute(FHttpPath(TEXT("/api/list_classes")), EHttpServerRequestVerbs::VERB_POST,
QueuedHandler(TEXT("list_classes")));
Router->BindRoute(FHttpPath(TEXT("/api/list_functions")), EHttpServerRequestVerbs::VERB_POST,
QueuedHandler(TEXT("list_functions")));
Router->BindRoute(FHttpPath(TEXT("/api/list_properties")), EHttpServerRequestVerbs::VERB_POST,
QueuedHandler(TEXT("list_properties")));
Router->BindRoute(FHttpPath(TEXT("/api/remove_function_parameter")), EHttpServerRequestVerbs::VERB_POST,
QueuedHandler(TEXT("remove_function_parameter")));
Router->BindRoute(FHttpPath(TEXT("/api/search_by_type")), EHttpServerRequestVerbs::VERB_GET,
QueuedHandler(TEXT("search_by_type")));
Router->BindRoute(FHttpPath(TEXT("/api/validate_blueprint")), EHttpServerRequestVerbs::VERB_POST,
QueuedHandler(TEXT("validate_blueprint")));
Router->BindRoute(FHttpPath(TEXT("/api/validate_all_blueprints")), EHttpServerRequestVerbs::VERB_POST,
QueuedHandler(TEXT("validate_all_blueprints")));
Router->BindRoute(FHttpPath(TEXT("/api/reparent_blueprint")), EHttpServerRequestVerbs::VERB_POST,
QueuedHandler(TEXT("reparent_blueprint")));
Router->BindRoute(FHttpPath(TEXT("/api/create_blueprint")), EHttpServerRequestVerbs::VERB_POST,
QueuedHandler(TEXT("create_blueprint")));
Router->BindRoute(FHttpPath(TEXT("/api/create_graph")), EHttpServerRequestVerbs::VERB_POST,
QueuedHandler(TEXT("create_graph")));
Router->BindRoute(FHttpPath(TEXT("/api/create_struct")), EHttpServerRequestVerbs::VERB_POST,
QueuedHandler(TEXT("create_struct")));
Router->BindRoute(FHttpPath(TEXT("/api/create_enum")), EHttpServerRequestVerbs::VERB_POST,
QueuedHandler(TEXT("create_enum")));
Router->BindRoute(FHttpPath(TEXT("/api/add_struct_property")), EHttpServerRequestVerbs::VERB_POST,
QueuedHandler(TEXT("add_struct_property")));
Router->BindRoute(FHttpPath(TEXT("/api/remove_struct_property")), EHttpServerRequestVerbs::VERB_POST,
QueuedHandler(TEXT("remove_struct_property")));
Router->BindRoute(FHttpPath(TEXT("/api/delete_graph")), EHttpServerRequestVerbs::VERB_POST,
QueuedHandler(TEXT("delete_graph")));
Router->BindRoute(FHttpPath(TEXT("/api/rename_graph")), EHttpServerRequestVerbs::VERB_POST,
QueuedHandler(TEXT("rename_graph")));
Router->BindRoute(FHttpPath(TEXT("/api/add_variable")), EHttpServerRequestVerbs::VERB_POST,
QueuedHandler(TEXT("add_variable")));
Router->BindRoute(FHttpPath(TEXT("/api/remove_variable")), EHttpServerRequestVerbs::VERB_POST,
QueuedHandler(TEXT("remove_variable")));
Router->BindRoute(FHttpPath(TEXT("/api/set_variable_metadata")), EHttpServerRequestVerbs::VERB_POST,
QueuedHandler(TEXT("set_variable_metadata")));
Router->BindRoute(FHttpPath(TEXT("/api/add_event_dispatcher")), EHttpServerRequestVerbs::VERB_POST,
QueuedHandler(TEXT("add_event_dispatcher")));
Router->BindRoute(FHttpPath(TEXT("/api/list_event_dispatchers")), EHttpServerRequestVerbs::VERB_POST,
QueuedHandler(TEXT("list_event_dispatchers")));
Router->BindRoute(FHttpPath(TEXT("/api/add_function_parameter")), EHttpServerRequestVerbs::VERB_POST,
QueuedHandler(TEXT("add_function_parameter")));
Router->BindRoute(FHttpPath(TEXT("/api/add_component")), EHttpServerRequestVerbs::VERB_POST,
QueuedHandler(TEXT("add_component")));
Router->BindRoute(FHttpPath(TEXT("/api/remove_component")), EHttpServerRequestVerbs::VERB_POST,
QueuedHandler(TEXT("remove_component")));
Router->BindRoute(FHttpPath(TEXT("/api/list_components")), EHttpServerRequestVerbs::VERB_POST,
QueuedHandler(TEXT("list_components")));
Router->BindRoute(FHttpPath(TEXT("/api/snapshot_graph")), EHttpServerRequestVerbs::VERB_POST,
QueuedHandler(TEXT("snapshot_graph")));
Router->BindRoute(FHttpPath(TEXT("/api/diff_graph")), EHttpServerRequestVerbs::VERB_POST,
QueuedHandler(TEXT("diff_graph")));
Router->BindRoute(FHttpPath(TEXT("/api/restore_graph")), EHttpServerRequestVerbs::VERB_POST,
QueuedHandler(TEXT("restore_graph")));
Router->BindRoute(FHttpPath(TEXT("/api/find_disconnected_pins")), EHttpServerRequestVerbs::VERB_POST,
QueuedHandler(TEXT("find_disconnected_pins")));
Router->BindRoute(FHttpPath(TEXT("/api/analyze_rebuild_impact")), EHttpServerRequestVerbs::VERB_POST,
QueuedHandler(TEXT("analyze_rebuild_impact")));
// Material read-only tools (Phase 1)
Router->BindRoute(FHttpPath(TEXT("/api/materials")), EHttpServerRequestVerbs::VERB_GET,
@@ -722,46 +670,46 @@ Router->BindRoute(FHttpPath(TEXT("/api/search-node-actions")), EHttpServerReques
return true;
}));
Router->BindRoute(FHttpPath(TEXT("/api/material")), EHttpServerRequestVerbs::VERB_GET,
QueuedHandler(TEXT("getMaterial")));
Router->BindRoute(FHttpPath(TEXT("/api/material-graph")), EHttpServerRequestVerbs::VERB_GET,
QueuedHandler(TEXT("getMaterialGraph")));
Router->BindRoute(FHttpPath(TEXT("/api/describe-material")), EHttpServerRequestVerbs::VERB_POST,
QueuedHandler(TEXT("describeMaterial")));
Router->BindRoute(FHttpPath(TEXT("/api/search-materials")), EHttpServerRequestVerbs::VERB_GET,
QueuedHandler(TEXT("searchMaterials")));
Router->BindRoute(FHttpPath(TEXT("/api/material-references")), EHttpServerRequestVerbs::VERB_POST,
QueuedHandler(TEXT("findMaterialReferences")));
QueuedHandler(TEXT("get_material")));
Router->BindRoute(FHttpPath(TEXT("/api/material_graph")), EHttpServerRequestVerbs::VERB_GET,
QueuedHandler(TEXT("get_material_graph")));
Router->BindRoute(FHttpPath(TEXT("/api/describe_material")), EHttpServerRequestVerbs::VERB_POST,
QueuedHandler(TEXT("describe_material")));
Router->BindRoute(FHttpPath(TEXT("/api/search_materials")), EHttpServerRequestVerbs::VERB_GET,
QueuedHandler(TEXT("search_materials")));
Router->BindRoute(FHttpPath(TEXT("/api/material_references")), EHttpServerRequestVerbs::VERB_POST,
QueuedHandler(TEXT("find_material_references")));
// Material mutation tools (Phase 2)
Router->BindRoute(FHttpPath(TEXT("/api/create-material")), EHttpServerRequestVerbs::VERB_POST,
QueuedHandler(TEXT("createMaterial")));
Router->BindRoute(FHttpPath(TEXT("/api/set-material-property")), EHttpServerRequestVerbs::VERB_POST,
QueuedHandler(TEXT("setMaterialProperty")));
Router->BindRoute(FHttpPath(TEXT("/api/add-material-expression")), EHttpServerRequestVerbs::VERB_POST,
QueuedHandler(TEXT("addMaterialExpression")));
Router->BindRoute(FHttpPath(TEXT("/api/delete-material-expression")), EHttpServerRequestVerbs::VERB_POST,
QueuedHandler(TEXT("deleteMaterialExpression")));
Router->BindRoute(FHttpPath(TEXT("/api/connect-material-pins")), EHttpServerRequestVerbs::VERB_POST,
QueuedHandler(TEXT("connectMaterialPins")));
Router->BindRoute(FHttpPath(TEXT("/api/disconnect-material-pin")), EHttpServerRequestVerbs::VERB_POST,
QueuedHandler(TEXT("disconnectMaterialPin")));
Router->BindRoute(FHttpPath(TEXT("/api/set-expression-value")), EHttpServerRequestVerbs::VERB_POST,
QueuedHandler(TEXT("setExpressionValue")));
Router->BindRoute(FHttpPath(TEXT("/api/move-material-expression")), EHttpServerRequestVerbs::VERB_POST,
QueuedHandler(TEXT("moveMaterialExpression")));
Router->BindRoute(FHttpPath(TEXT("/api/create_material")), EHttpServerRequestVerbs::VERB_POST,
QueuedHandler(TEXT("create_material")));
Router->BindRoute(FHttpPath(TEXT("/api/set_material_property")), EHttpServerRequestVerbs::VERB_POST,
QueuedHandler(TEXT("set_material_property")));
Router->BindRoute(FHttpPath(TEXT("/api/add_material_expression")), EHttpServerRequestVerbs::VERB_POST,
QueuedHandler(TEXT("add_material_expression")));
Router->BindRoute(FHttpPath(TEXT("/api/delete_material_expression")), EHttpServerRequestVerbs::VERB_POST,
QueuedHandler(TEXT("delete_material_expression")));
Router->BindRoute(FHttpPath(TEXT("/api/connect_material_pins")), EHttpServerRequestVerbs::VERB_POST,
QueuedHandler(TEXT("connect_material_pins")));
Router->BindRoute(FHttpPath(TEXT("/api/disconnect_material_pin")), EHttpServerRequestVerbs::VERB_POST,
QueuedHandler(TEXT("disconnect_material_pin")));
Router->BindRoute(FHttpPath(TEXT("/api/set_expression_value")), EHttpServerRequestVerbs::VERB_POST,
QueuedHandler(TEXT("set_expression_value")));
Router->BindRoute(FHttpPath(TEXT("/api/move_material_expression")), EHttpServerRequestVerbs::VERB_POST,
QueuedHandler(TEXT("move_material_expression")));
// Material instance tools (Phase 3)
Router->BindRoute(FHttpPath(TEXT("/api/create-material-instance")), EHttpServerRequestVerbs::VERB_POST,
QueuedHandler(TEXT("createMaterialInstance")));
Router->BindRoute(FHttpPath(TEXT("/api/set-material-instance-parameter")), EHttpServerRequestVerbs::VERB_POST,
QueuedHandler(TEXT("setMaterialInstanceParameter")));
Router->BindRoute(FHttpPath(TEXT("/api/material-instance-params")), EHttpServerRequestVerbs::VERB_GET,
QueuedHandler(TEXT("getMaterialInstanceParams")));
Router->BindRoute(FHttpPath(TEXT("/api/reparent-material-instance")), EHttpServerRequestVerbs::VERB_POST,
QueuedHandler(TEXT("reparentMaterialInstance")));
Router->BindRoute(FHttpPath(TEXT("/api/create_material_instance")), EHttpServerRequestVerbs::VERB_POST,
QueuedHandler(TEXT("create_material_instance")));
Router->BindRoute(FHttpPath(TEXT("/api/set_material_instance_parameter")), EHttpServerRequestVerbs::VERB_POST,
QueuedHandler(TEXT("set_material_instance_parameter")));
Router->BindRoute(FHttpPath(TEXT("/api/material_instance_params")), EHttpServerRequestVerbs::VERB_GET,
QueuedHandler(TEXT("get_material_instance_params")));
Router->BindRoute(FHttpPath(TEXT("/api/reparent_material_instance")), EHttpServerRequestVerbs::VERB_POST,
QueuedHandler(TEXT("reparent_material_instance")));
// Material function tools (Phase 4)
Router->BindRoute(FHttpPath(TEXT("/api/material-functions")), EHttpServerRequestVerbs::VERB_GET,
Router->BindRoute(FHttpPath(TEXT("/api/material_functions")), EHttpServerRequestVerbs::VERB_GET,
FHttpRequestHandler::CreateLambda(
[this](const FHttpServerRequest& Request, const FHttpResultCallback& OnComplete)
{
@@ -777,54 +725,60 @@ Router->BindRoute(FHttpPath(TEXT("/api/search-node-actions")), EHttpServerReques
OnComplete(MoveTemp(R));
return true;
}));
Router->BindRoute(FHttpPath(TEXT("/api/material-function")), EHttpServerRequestVerbs::VERB_GET,
QueuedHandler(TEXT("getMaterialFunction")));
Router->BindRoute(FHttpPath(TEXT("/api/create-material-function")), EHttpServerRequestVerbs::VERB_POST,
QueuedHandler(TEXT("createMaterialFunction")));
Router->BindRoute(FHttpPath(TEXT("/api/material_function")), EHttpServerRequestVerbs::VERB_GET,
QueuedHandler(TEXT("get_material_function")));
Router->BindRoute(FHttpPath(TEXT("/api/create_material_function")), EHttpServerRequestVerbs::VERB_POST,
QueuedHandler(TEXT("create_material_function")));
// Material snapshot/diff/restore (Phase 5)
Router->BindRoute(FHttpPath(TEXT("/api/snapshot-material-graph")), EHttpServerRequestVerbs::VERB_POST,
QueuedHandler(TEXT("snapshotMaterialGraph")));
Router->BindRoute(FHttpPath(TEXT("/api/diff-material-graph")), EHttpServerRequestVerbs::VERB_POST,
QueuedHandler(TEXT("diffMaterialGraph")));
Router->BindRoute(FHttpPath(TEXT("/api/restore-material-graph")), EHttpServerRequestVerbs::VERB_POST,
QueuedHandler(TEXT("restoreMaterialGraph")));
Router->BindRoute(FHttpPath(TEXT("/api/validate-material")), EHttpServerRequestVerbs::VERB_POST,
QueuedHandler(TEXT("validateMaterial")));
Router->BindRoute(FHttpPath(TEXT("/api/snapshot_material_graph")), EHttpServerRequestVerbs::VERB_POST,
QueuedHandler(TEXT("snapshot_material_graph")));
Router->BindRoute(FHttpPath(TEXT("/api/diff_material_graph")), EHttpServerRequestVerbs::VERB_POST,
QueuedHandler(TEXT("diff_material_graph")));
Router->BindRoute(FHttpPath(TEXT("/api/restore_material_graph")), EHttpServerRequestVerbs::VERB_POST,
QueuedHandler(TEXT("restore_material_graph")));
Router->BindRoute(FHttpPath(TEXT("/api/validate_material")), EHttpServerRequestVerbs::VERB_POST,
QueuedHandler(TEXT("validate_material")));
// Animation Blueprint tools
Router->BindRoute(FHttpPath(TEXT("/api/create-anim-blueprint")), EHttpServerRequestVerbs::VERB_POST,
QueuedHandler(TEXT("createAnimBlueprint")));
Router->BindRoute(FHttpPath(TEXT("/api/add-anim-state")), EHttpServerRequestVerbs::VERB_POST,
QueuedHandler(TEXT("addAnimState")));
Router->BindRoute(FHttpPath(TEXT("/api/remove-anim-state")), EHttpServerRequestVerbs::VERB_POST,
QueuedHandler(TEXT("removeAnimState")));
Router->BindRoute(FHttpPath(TEXT("/api/add-anim-transition")), EHttpServerRequestVerbs::VERB_POST,
QueuedHandler(TEXT("addAnimTransition")));
Router->BindRoute(FHttpPath(TEXT("/api/set-transition-rule")), EHttpServerRequestVerbs::VERB_POST,
QueuedHandler(TEXT("setTransitionRule")));
Router->BindRoute(FHttpPath(TEXT("/api/add-anim-node")), EHttpServerRequestVerbs::VERB_POST,
QueuedHandler(TEXT("addAnimNode")));
Router->BindRoute(FHttpPath(TEXT("/api/add-state-machine")), EHttpServerRequestVerbs::VERB_POST,
QueuedHandler(TEXT("addStateMachine")));
Router->BindRoute(FHttpPath(TEXT("/api/set-state-animation")), EHttpServerRequestVerbs::VERB_POST,
QueuedHandler(TEXT("setStateAnimation")));
Router->BindRoute(FHttpPath(TEXT("/api/list-anim-slots")), EHttpServerRequestVerbs::VERB_POST,
QueuedHandler(TEXT("listAnimSlots")));
Router->BindRoute(FHttpPath(TEXT("/api/list-sync-groups")), EHttpServerRequestVerbs::VERB_POST,
QueuedHandler(TEXT("listSyncGroups")));
Router->BindRoute(FHttpPath(TEXT("/api/create-blend-space")), EHttpServerRequestVerbs::VERB_POST,
QueuedHandler(TEXT("createBlendSpace")));
Router->BindRoute(FHttpPath(TEXT("/api/set-blend-space-samples")), EHttpServerRequestVerbs::VERB_POST,
QueuedHandler(TEXT("setBlendSpaceSamples")));
Router->BindRoute(FHttpPath(TEXT("/api/set-state-blend-space")), EHttpServerRequestVerbs::VERB_POST,
QueuedHandler(TEXT("setStateBlendSpace")));
Router->BindRoute(FHttpPath(TEXT("/api/create_anim_blueprint")), EHttpServerRequestVerbs::VERB_POST,
QueuedHandler(TEXT("create_anim_blueprint")));
Router->BindRoute(FHttpPath(TEXT("/api/add_anim_state")), EHttpServerRequestVerbs::VERB_POST,
QueuedHandler(TEXT("add_anim_state")));
Router->BindRoute(FHttpPath(TEXT("/api/remove_anim_state")), EHttpServerRequestVerbs::VERB_POST,
QueuedHandler(TEXT("remove_anim_state")));
Router->BindRoute(FHttpPath(TEXT("/api/add_anim_transition")), EHttpServerRequestVerbs::VERB_POST,
QueuedHandler(TEXT("add_anim_transition")));
Router->BindRoute(FHttpPath(TEXT("/api/set_transition_rule")), EHttpServerRequestVerbs::VERB_POST,
QueuedHandler(TEXT("set_transition_rule")));
Router->BindRoute(FHttpPath(TEXT("/api/add_anim_node")), EHttpServerRequestVerbs::VERB_POST,
QueuedHandler(TEXT("add_anim_node")));
Router->BindRoute(FHttpPath(TEXT("/api/add_state_machine")), EHttpServerRequestVerbs::VERB_POST,
QueuedHandler(TEXT("add_state_machine")));
Router->BindRoute(FHttpPath(TEXT("/api/set_state_animation")), EHttpServerRequestVerbs::VERB_POST,
QueuedHandler(TEXT("set_state_animation")));
Router->BindRoute(FHttpPath(TEXT("/api/list_anim_slots")), EHttpServerRequestVerbs::VERB_POST,
QueuedHandler(TEXT("list_anim_slots")));
Router->BindRoute(FHttpPath(TEXT("/api/list_sync_groups")), EHttpServerRequestVerbs::VERB_POST,
QueuedHandler(TEXT("list_sync_groups")));
Router->BindRoute(FHttpPath(TEXT("/api/create_blend_space")), EHttpServerRequestVerbs::VERB_POST,
QueuedHandler(TEXT("create_blend_space")));
Router->BindRoute(FHttpPath(TEXT("/api/set_blend_space_samples")), EHttpServerRequestVerbs::VERB_POST,
QueuedHandler(TEXT("set_blend_space_samples")));
Router->BindRoute(FHttpPath(TEXT("/api/set_state_blend_space")), EHttpServerRequestVerbs::VERB_POST,
QueuedHandler(TEXT("set_state_blend_space")));
// Register TMap dispatch handlers
RegisterHandlers();
// Build new-style handler registry from UMCPHandler subclasses
// Build new-style handler registry from UMCPHandler subclasses and bind routes for each
BuildMCPHandlerRegistry();
for (const auto& KV : MCPHandlerRegistry)
{
FString Path = FString::Printf(TEXT("/api/%s"), *KV.Key);
Router->BindRoute(FHttpPath(Path), EHttpServerRequestVerbs::VERB_POST,
QueuedHandler(KV.Key));
}
// Register old-style TMap dispatch handlers
RegisterHandlers();
HttpModule.StartAllListeners();
@@ -959,9 +913,9 @@ void FBlueprintMCPServer::RegisterHandlers()
// Mutation endpoints — wrapped in undo transactions by ProcessOneRequest()
MutationEndpoints = {
TEXT("replace_function_calls"),
TEXT("changeVariableType"),
TEXT("changeFunctionParamType"),
TEXT("removeFunctionParameter"),
TEXT("change_variable_type"),
TEXT("change_function_param_type"),
TEXT("remove_function_parameter"),
TEXT("delete_asset"),
TEXT("connect_pins"),
TEXT("disconnect_pin"),
@@ -974,47 +928,47 @@ void FBlueprintMCPServer::RegisterHandlers()
TEXT("spawn_node"),
TEXT("set_node_comment"),
TEXT("rename_asset"),
TEXT("reparentBlueprint"),
TEXT("reparent_blueprint"),
TEXT("set_blueprint_default"),
TEXT("createBlueprint"),
TEXT("createGraph"),
TEXT("deleteGraph"),
TEXT("renameGraph"),
TEXT("addVariable"),
TEXT("removeVariable"),
TEXT("setVariableMetadata"),
TEXT("create_blueprint"),
TEXT("create_graph"),
TEXT("delete_graph"),
TEXT("rename_graph"),
TEXT("add_variable"),
TEXT("remove_variable"),
TEXT("set_variable_metadata"),
TEXT("add_interface"),
TEXT("remove_interface"),
TEXT("addEventDispatcher"),
TEXT("addFunctionParameter"),
TEXT("addComponent"),
TEXT("removeComponent"),
TEXT("restoreGraph"),
TEXT("createStruct"),
TEXT("createEnum"),
TEXT("addStructProperty"),
TEXT("removeStructProperty"),
TEXT("createMaterial"),
TEXT("setMaterialProperty"),
TEXT("addMaterialExpression"),
TEXT("deleteMaterialExpression"),
TEXT("connectMaterialPins"),
TEXT("disconnectMaterialPin"),
TEXT("setExpressionValue"),
TEXT("moveMaterialExpression"),
TEXT("createMaterialInstance"),
TEXT("setMaterialInstanceParameter"),
TEXT("reparentMaterialInstance"),
TEXT("createMaterialFunction"),
TEXT("restoreMaterialGraph"),
TEXT("createAnimBlueprint"),
TEXT("addAnimState"),
TEXT("removeAnimState"),
TEXT("addAnimTransition"),
TEXT("setTransitionRule"),
TEXT("addAnimNode"),
TEXT("addStateMachine"),
TEXT("setStateAnimation"),
TEXT("add_event_dispatcher"),
TEXT("add_function_parameter"),
TEXT("add_component"),
TEXT("remove_component"),
TEXT("restore_graph"),
TEXT("create_struct"),
TEXT("create_enum"),
TEXT("add_struct_property"),
TEXT("remove_struct_property"),
TEXT("create_material"),
TEXT("set_material_property"),
TEXT("add_material_expression"),
TEXT("delete_material_expression"),
TEXT("connect_material_pins"),
TEXT("disconnect_material_pin"),
TEXT("set_expression_value"),
TEXT("move_material_expression"),
TEXT("create_material_instance"),
TEXT("set_material_instance_parameter"),
TEXT("reparent_material_instance"),
TEXT("create_material_function"),
TEXT("restore_material_graph"),
TEXT("create_anim_blueprint"),
TEXT("add_anim_state"),
TEXT("remove_anim_state"),
TEXT("add_anim_transition"),
TEXT("set_transition_rule"),
TEXT("add_anim_node"),
TEXT("add_state_machine"),
TEXT("set_state_animation"),
};
// All handlers have uniform signature: void(const FJsonObject&, FJsonObject&)
@@ -1028,95 +982,77 @@ void FBlueprintMCPServer::RegisterHandlers()
H(TEXT("graph"), &FBlueprintMCPServer::HandleGetGraph);
H(TEXT("search"), &FBlueprintMCPServer::HandleSearch);
H(TEXT("references"), &FBlueprintMCPServer::HandleFindReferences);
H(TEXT("testSave"), &FBlueprintMCPServer::HandleTestSave);
H(TEXT("searchByType"), &FBlueprintMCPServer::HandleSearchByType);
// replace_function_calls is now handled by UMCPHandler_ReplaceFunctionCalls (new-style registry)
H(TEXT("changeVariableType"), &FBlueprintMCPServer::HandleChangeVariableType);
H(TEXT("changeFunctionParamType"), &FBlueprintMCPServer::HandleChangeFunctionParamType);
H(TEXT("removeFunctionParameter"), &FBlueprintMCPServer::HandleRemoveFunctionParameter);
// delete_asset is now handled by UMCPHandler_DeleteAsset (new-style registry)
// connect_pins is now handled by UMCPHandler_ConnectPins (new-style registry)
// disconnect_pin is now handled by UMCPHandler_DisconnectPin (new-style registry)
// refresh_all_nodes is now handled by UMCPHandler_RefreshAllNodes (new-style registry)
// set_pin_default is now handled by UMCPHandler_SetPinDefault (new-style registry)
// move_node is now handled by UMCPHandler_MoveNode (new-style registry)
// get_node_comment is now handled by UMCPHandler_GetNodeComment (new-style registry)
// set_node_comment is now handled by UMCPHandler_SetNodeComment (new-style registry)
H(TEXT("getPinInfo"), &FBlueprintMCPServer::HandleGetPinInfo);
H(TEXT("checkPinCompatibility"), &FBlueprintMCPServer::HandleCheckPinCompatibility);
H(TEXT("listClasses"), &FBlueprintMCPServer::HandleListClasses);
H(TEXT("listFunctions"), &FBlueprintMCPServer::HandleListFunctions);
H(TEXT("listProperties"), &FBlueprintMCPServer::HandleListProperties);
// change_struct_node_type is now handled by UMCPHandler_ChangeStructNodeType (new-style registry)
// delete_node is now handled by UMCPHandler_DeleteNode (new-style registry)
// duplicate_nodes is now handled by UMCPHandler_DuplicateNodes (new-style registry)
H(TEXT("validateBlueprint"), &FBlueprintMCPServer::HandleValidateBlueprint);
H(TEXT("validateAllBlueprints"), &FBlueprintMCPServer::HandleValidateAllBlueprints);
// search_node_actions is now handled by UMCPHandler_SearchNodeActions (new-style registry)
// spawn_node is now handled by UMCPHandler_SpawnNode (new-style registry)
// rename_asset is now handled by UMCPHandler_RenameAsset (new-style registry)
H(TEXT("reparentBlueprint"), &FBlueprintMCPServer::HandleReparentBlueprint);
// set_blueprint_default is now handled by UMCPHandler_SetBlueprintDefault (new-style registry)
H(TEXT("createBlueprint"), &FBlueprintMCPServer::HandleCreateBlueprint);
H(TEXT("createGraph"), &FBlueprintMCPServer::HandleCreateGraph);
H(TEXT("deleteGraph"), &FBlueprintMCPServer::HandleDeleteGraph);
H(TEXT("renameGraph"), &FBlueprintMCPServer::HandleRenameGraph);
H(TEXT("addVariable"), &FBlueprintMCPServer::HandleAddVariable);
H(TEXT("removeVariable"), &FBlueprintMCPServer::HandleRemoveVariable);
H(TEXT("setVariableMetadata"), &FBlueprintMCPServer::HandleSetVariableMetadata);
// add_interface, remove_interface, list_interfaces now handled by new-style registry
H(TEXT("addEventDispatcher"), &FBlueprintMCPServer::HandleAddEventDispatcher);
H(TEXT("listEventDispatchers"), &FBlueprintMCPServer::HandleListEventDispatchers);
H(TEXT("addFunctionParameter"), &FBlueprintMCPServer::HandleAddFunctionParameter);
H(TEXT("addComponent"), &FBlueprintMCPServer::HandleAddComponent);
H(TEXT("removeComponent"), &FBlueprintMCPServer::HandleRemoveComponent);
H(TEXT("listComponents"), &FBlueprintMCPServer::HandleListComponents);
H(TEXT("snapshotGraph"), &FBlueprintMCPServer::HandleSnapshotGraph);
H(TEXT("diffGraph"), &FBlueprintMCPServer::HandleDiffGraph);
H(TEXT("restoreGraph"), &FBlueprintMCPServer::HandleRestoreGraph);
H(TEXT("findDisconnectedPins"), &FBlueprintMCPServer::HandleFindDisconnectedPins);
H(TEXT("analyzeRebuildImpact"), &FBlueprintMCPServer::HandleAnalyzeRebuildImpact);
// diff_blueprints is now handled by UMCPHandler_DiffBlueprints (new-style registry)
H(TEXT("createStruct"), &FBlueprintMCPServer::HandleCreateStruct);
H(TEXT("createEnum"), &FBlueprintMCPServer::HandleCreateEnum);
H(TEXT("addStructProperty"), &FBlueprintMCPServer::HandleAddStructProperty);
H(TEXT("removeStructProperty"), &FBlueprintMCPServer::HandleRemoveStructProperty);
H(TEXT("getMaterial"), &FBlueprintMCPServer::HandleGetMaterial);
H(TEXT("getMaterialGraph"), &FBlueprintMCPServer::HandleGetMaterialGraph);
H(TEXT("searchMaterials"), &FBlueprintMCPServer::HandleSearchMaterials);
H(TEXT("getMaterialInstanceParams"),&FBlueprintMCPServer::HandleGetMaterialInstanceParameters);
H(TEXT("getMaterialFunction"), &FBlueprintMCPServer::HandleGetMaterialFunction);
H(TEXT("describeMaterial"), &FBlueprintMCPServer::HandleDescribeMaterial);
H(TEXT("findMaterialReferences"), &FBlueprintMCPServer::HandleFindMaterialReferences);
H(TEXT("createMaterial"), &FBlueprintMCPServer::HandleCreateMaterial);
H(TEXT("setMaterialProperty"), &FBlueprintMCPServer::HandleSetMaterialProperty);
H(TEXT("addMaterialExpression"), &FBlueprintMCPServer::HandleAddMaterialExpression);
H(TEXT("deleteMaterialExpression"), &FBlueprintMCPServer::HandleDeleteMaterialExpression);
H(TEXT("connectMaterialPins"), &FBlueprintMCPServer::HandleConnectMaterialPins);
H(TEXT("disconnectMaterialPin"), &FBlueprintMCPServer::HandleDisconnectMaterialPin);
H(TEXT("setExpressionValue"), &FBlueprintMCPServer::HandleSetExpressionValue);
H(TEXT("moveMaterialExpression"), &FBlueprintMCPServer::HandleMoveMaterialExpression);
H(TEXT("createMaterialInstance"), &FBlueprintMCPServer::HandleCreateMaterialInstance);
H(TEXT("setMaterialInstanceParameter"), &FBlueprintMCPServer::HandleSetMaterialInstanceParameter);
H(TEXT("reparentMaterialInstance"), &FBlueprintMCPServer::HandleReparentMaterialInstance);
H(TEXT("createMaterialFunction"), &FBlueprintMCPServer::HandleCreateMaterialFunction);
H(TEXT("snapshotMaterialGraph"), &FBlueprintMCPServer::HandleSnapshotMaterialGraph);
H(TEXT("diffMaterialGraph"), &FBlueprintMCPServer::HandleDiffMaterialGraph);
H(TEXT("restoreMaterialGraph"), &FBlueprintMCPServer::HandleRestoreMaterialGraph);
H(TEXT("validateMaterial"), &FBlueprintMCPServer::HandleValidateMaterial);
H(TEXT("createAnimBlueprint"), &FBlueprintMCPServer::HandleCreateAnimBlueprint);
H(TEXT("addAnimState"), &FBlueprintMCPServer::HandleAddAnimState);
H(TEXT("removeAnimState"), &FBlueprintMCPServer::HandleRemoveAnimState);
H(TEXT("addAnimTransition"), &FBlueprintMCPServer::HandleAddAnimTransition);
H(TEXT("setTransitionRule"), &FBlueprintMCPServer::HandleSetTransitionRule);
H(TEXT("addAnimNode"), &FBlueprintMCPServer::HandleAddAnimNode);
H(TEXT("addStateMachine"), &FBlueprintMCPServer::HandleAddStateMachine);
H(TEXT("setStateAnimation"), &FBlueprintMCPServer::HandleSetStateAnimation);
H(TEXT("listAnimSlots"), &FBlueprintMCPServer::HandleListAnimSlots);
H(TEXT("listSyncGroups"), &FBlueprintMCPServer::HandleListSyncGroups);
H(TEXT("createBlendSpace"), &FBlueprintMCPServer::HandleCreateBlendSpace);
H(TEXT("setBlendSpaceSamples"), &FBlueprintMCPServer::HandleSetBlendSpaceSamples);
H(TEXT("setStateBlendSpace"), &FBlueprintMCPServer::HandleSetStateBlendSpace);
H(TEXT("test_save"), &FBlueprintMCPServer::HandleTestSave);
H(TEXT("search_by_type"), &FBlueprintMCPServer::HandleSearchByType);
H(TEXT("change_variable_type"), &FBlueprintMCPServer::HandleChangeVariableType);
H(TEXT("change_function_param_type"), &FBlueprintMCPServer::HandleChangeFunctionParamType);
H(TEXT("remove_function_parameter"), &FBlueprintMCPServer::HandleRemoveFunctionParameter);
H(TEXT("get_pin_info"), &FBlueprintMCPServer::HandleGetPinInfo);
H(TEXT("check_pin_compatibility"), &FBlueprintMCPServer::HandleCheckPinCompatibility);
H(TEXT("list_classes"), &FBlueprintMCPServer::HandleListClasses);
H(TEXT("list_functions"), &FBlueprintMCPServer::HandleListFunctions);
H(TEXT("list_properties"), &FBlueprintMCPServer::HandleListProperties);
H(TEXT("validate_blueprint"), &FBlueprintMCPServer::HandleValidateBlueprint);
H(TEXT("validate_all_blueprints"), &FBlueprintMCPServer::HandleValidateAllBlueprints);
H(TEXT("reparent_blueprint"), &FBlueprintMCPServer::HandleReparentBlueprint);
H(TEXT("create_blueprint"), &FBlueprintMCPServer::HandleCreateBlueprint);
H(TEXT("create_graph"), &FBlueprintMCPServer::HandleCreateGraph);
H(TEXT("delete_graph"), &FBlueprintMCPServer::HandleDeleteGraph);
H(TEXT("rename_graph"), &FBlueprintMCPServer::HandleRenameGraph);
H(TEXT("add_variable"), &FBlueprintMCPServer::HandleAddVariable);
H(TEXT("remove_variable"), &FBlueprintMCPServer::HandleRemoveVariable);
H(TEXT("set_variable_metadata"), &FBlueprintMCPServer::HandleSetVariableMetadata);
H(TEXT("add_event_dispatcher"), &FBlueprintMCPServer::HandleAddEventDispatcher);
H(TEXT("list_event_dispatchers"), &FBlueprintMCPServer::HandleListEventDispatchers);
H(TEXT("add_function_parameter"), &FBlueprintMCPServer::HandleAddFunctionParameter);
H(TEXT("add_component"), &FBlueprintMCPServer::HandleAddComponent);
H(TEXT("remove_component"), &FBlueprintMCPServer::HandleRemoveComponent);
H(TEXT("list_components"), &FBlueprintMCPServer::HandleListComponents);
H(TEXT("snapshot_graph"), &FBlueprintMCPServer::HandleSnapshotGraph);
H(TEXT("diff_graph"), &FBlueprintMCPServer::HandleDiffGraph);
H(TEXT("restore_graph"), &FBlueprintMCPServer::HandleRestoreGraph);
H(TEXT("find_disconnected_pins"), &FBlueprintMCPServer::HandleFindDisconnectedPins);
H(TEXT("analyze_rebuild_impact"), &FBlueprintMCPServer::HandleAnalyzeRebuildImpact);
H(TEXT("create_struct"), &FBlueprintMCPServer::HandleCreateStruct);
H(TEXT("create_enum"), &FBlueprintMCPServer::HandleCreateEnum);
H(TEXT("add_struct_property"), &FBlueprintMCPServer::HandleAddStructProperty);
H(TEXT("remove_struct_property"), &FBlueprintMCPServer::HandleRemoveStructProperty);
H(TEXT("get_material"), &FBlueprintMCPServer::HandleGetMaterial);
H(TEXT("get_material_graph"), &FBlueprintMCPServer::HandleGetMaterialGraph);
H(TEXT("search_materials"), &FBlueprintMCPServer::HandleSearchMaterials);
H(TEXT("get_material_instance_params"),&FBlueprintMCPServer::HandleGetMaterialInstanceParameters);
H(TEXT("get_material_function"), &FBlueprintMCPServer::HandleGetMaterialFunction);
H(TEXT("describe_material"), &FBlueprintMCPServer::HandleDescribeMaterial);
H(TEXT("find_material_references"), &FBlueprintMCPServer::HandleFindMaterialReferences);
H(TEXT("create_material"), &FBlueprintMCPServer::HandleCreateMaterial);
H(TEXT("set_material_property"), &FBlueprintMCPServer::HandleSetMaterialProperty);
H(TEXT("add_material_expression"), &FBlueprintMCPServer::HandleAddMaterialExpression);
H(TEXT("delete_material_expression"), &FBlueprintMCPServer::HandleDeleteMaterialExpression);
H(TEXT("connect_material_pins"), &FBlueprintMCPServer::HandleConnectMaterialPins);
H(TEXT("disconnect_material_pin"), &FBlueprintMCPServer::HandleDisconnectMaterialPin);
H(TEXT("set_expression_value"), &FBlueprintMCPServer::HandleSetExpressionValue);
H(TEXT("move_material_expression"), &FBlueprintMCPServer::HandleMoveMaterialExpression);
H(TEXT("create_material_instance"), &FBlueprintMCPServer::HandleCreateMaterialInstance);
H(TEXT("set_material_instance_parameter"), &FBlueprintMCPServer::HandleSetMaterialInstanceParameter);
H(TEXT("reparent_material_instance"), &FBlueprintMCPServer::HandleReparentMaterialInstance);
H(TEXT("create_material_function"), &FBlueprintMCPServer::HandleCreateMaterialFunction);
H(TEXT("snapshot_material_graph"), &FBlueprintMCPServer::HandleSnapshotMaterialGraph);
H(TEXT("diff_material_graph"), &FBlueprintMCPServer::HandleDiffMaterialGraph);
H(TEXT("restore_material_graph"), &FBlueprintMCPServer::HandleRestoreMaterialGraph);
H(TEXT("validate_material"), &FBlueprintMCPServer::HandleValidateMaterial);
H(TEXT("create_anim_blueprint"), &FBlueprintMCPServer::HandleCreateAnimBlueprint);
H(TEXT("add_anim_state"), &FBlueprintMCPServer::HandleAddAnimState);
H(TEXT("remove_anim_state"), &FBlueprintMCPServer::HandleRemoveAnimState);
H(TEXT("add_anim_transition"), &FBlueprintMCPServer::HandleAddAnimTransition);
H(TEXT("set_transition_rule"), &FBlueprintMCPServer::HandleSetTransitionRule);
H(TEXT("add_anim_node"), &FBlueprintMCPServer::HandleAddAnimNode);
H(TEXT("add_state_machine"), &FBlueprintMCPServer::HandleAddStateMachine);
H(TEXT("set_state_animation"), &FBlueprintMCPServer::HandleSetStateAnimation);
H(TEXT("list_anim_slots"), &FBlueprintMCPServer::HandleListAnimSlots);
H(TEXT("list_sync_groups"), &FBlueprintMCPServer::HandleListSyncGroups);
H(TEXT("create_blend_space"), &FBlueprintMCPServer::HandleCreateBlendSpace);
H(TEXT("set_blend_space_samples"), &FBlueprintMCPServer::HandleSetBlendSpaceSamples);
H(TEXT("set_state_blend_space"), &FBlueprintMCPServer::HandleSetStateBlendSpace);
}
void FBlueprintMCPServer::BuildMCPHandlerRegistry()

View File

@@ -132,14 +132,14 @@ public:
UPROPERTY(meta=(Description="Graph name (e.g. 'EventGraph')"))
FString Graph;
UPROPERTY(meta=(Description="Array of {actionName, posX, posY} objects. Use search_node_actions to find action names."))
UPROPERTY(meta=(Description="Array of {actionName, posX, posY} objects. Use search_node_types to find action names."))
FMCPJsonArray Nodes;
virtual FString GetDescription() const override
{
return TEXT("Create nodes in a Blueprint graph using the editor's action database. "
"Can create ANY node type that appears in the editor's right-click menu, including custom K2 nodes. "
"Use search_node_actions first to find the exact action name.");
"Use search_node_types first to find the exact action name.");
}
virtual void Handle(const FJsonObject* Json, FJsonObject* Result) override;
@@ -420,8 +420,8 @@ public:
virtual void Handle(const FJsonObject* Json, FJsonObject* Result) override;
};
UCLASS(meta=(ToolName="search_node_actions"))
class UMCPHandler_SearchNodeActions : public UMCPHandler
UCLASS(meta=(ToolName="search_node_types"))
class UMCPHandler_SearchNodeTypes : public UMCPHandler
{
GENERATED_BODY()