From 3e6fb21b7bd4beba9e618e69a56f3c0e9a2b4c43 Mon Sep 17 00:00:00 2001 From: jyelon Date: Sun, 8 Mar 2026 22:00:29 -0400 Subject: [PATCH] Get rid of meta toolname for MCP handlers --- .../Handlers/MCPHandlers_AnimMutation.h | 20 +++--- .../Handlers/MCPHandlers_AssetMutation.h | 8 +-- .../Private/Handlers/MCPHandlers_Components.h | 6 +- .../Handlers/MCPHandlers_DiffBlueprints.h | 2 +- .../Private/Handlers/MCPHandlers_Discovery.h | 25 ++++--- .../Handlers/MCPHandlers_Dispatchers.h | 4 +- .../Private/Handlers/MCPHandlers_Graphs.h | 18 ++--- .../Private/Handlers/MCPHandlers_Interfaces.h | 6 +- .../Handlers/MCPHandlers_MaterialInstance.h | 12 ++-- .../Handlers/MCPHandlers_MaterialMutation.h | 30 ++++----- .../Handlers/MCPHandlers_MaterialRead.h | 34 +++++----- .../Private/Handlers/MCPHandlers_Mutation.h | 22 +++---- .../Private/Handlers/MCPHandlers_Params.h | 8 +-- .../Handlers/MCPHandlers_PinMutation.h | 6 +- .../Private/Handlers/MCPHandlers_Read.h | 28 ++++---- .../Handlers/MCPHandlers_StateMachine.h | 24 +++---- .../Private/Handlers/MCPHandlers_UserTypes.h | 12 ++-- .../Private/Handlers/MCPHandlers_Validation.h | 2 +- .../Private/Handlers/MCPHandlers_Variables.h | 16 ++--- .../Source/BlueprintMCP/Private/MCPServer.cpp | 9 +-- .../Source/BlueprintMCP/Private/MCPUtils.cpp | 17 ++++- .../Source/BlueprintMCP/Public/MCPUtils.h | 2 + tools/mcp-test.py | 66 ------------------- 23 files changed, 161 insertions(+), 216 deletions(-) delete mode 100755 tools/mcp-test.py diff --git a/Plugins/BlueprintMCP/Source/BlueprintMCP/Private/Handlers/MCPHandlers_AnimMutation.h b/Plugins/BlueprintMCP/Source/BlueprintMCP/Private/Handlers/MCPHandlers_AnimMutation.h index 7f2fb97c..97bab034 100644 --- a/Plugins/BlueprintMCP/Source/BlueprintMCP/Private/Handlers/MCPHandlers_AnimMutation.h +++ b/Plugins/BlueprintMCP/Source/BlueprintMCP/Private/Handlers/MCPHandlers_AnimMutation.h @@ -21,8 +21,8 @@ // --------------------------------------------------------------------------- // --------------------------------------------------------------------------- -UCLASS(meta=(ToolName="create_anim_blueprint_asset")) -class UMCPHandler_CreateAnimBlueprint : public UObject, public IMCPHandler +UCLASS() +class UMCPHandler_CreateAnimBlueprintAsset : public UObject, public IMCPHandler { GENERATED_BODY() @@ -135,8 +135,8 @@ public: // --------------------------------------------------------------------------- // --------------------------------------------------------------------------- -UCLASS(meta=(ToolName="list_anim_slot_names")) -class UMCPHandler_ListAnimSlots : public UObject, public IMCPHandler +UCLASS() +class UMCPHandler_ListAnimSlotNames : public UObject, public IMCPHandler { GENERATED_BODY() @@ -193,8 +193,8 @@ public: // --------------------------------------------------------------------------- // --------------------------------------------------------------------------- -UCLASS(meta=(ToolName="list_anim_sync_groups")) -class UMCPHandler_ListSyncGroups : public UObject, public IMCPHandler +UCLASS() +class UMCPHandler_ListAnimSyncGroups : public UObject, public IMCPHandler { GENERATED_BODY() @@ -251,8 +251,8 @@ public: // --------------------------------------------------------------------------- // --------------------------------------------------------------------------- -UCLASS(meta=(ToolName="create_blend_space_asset")) -class UMCPHandler_CreateBlendSpace : public UObject, public IMCPHandler +UCLASS() +class UMCPHandler_CreateBlendSpaceAsset : public UObject, public IMCPHandler { GENERATED_BODY() @@ -347,8 +347,8 @@ struct FBlendSpaceSampleEntry float Y = 0.0f; }; -UCLASS(meta=(ToolName="set_blend_space_sample_points")) -class UMCPHandler_SetBlendSpaceSamples : public UObject, public IMCPHandler +UCLASS() +class UMCPHandler_SetBlendSpaceSamplePoints : public UObject, public IMCPHandler { GENERATED_BODY() diff --git a/Plugins/BlueprintMCP/Source/BlueprintMCP/Private/Handlers/MCPHandlers_AssetMutation.h b/Plugins/BlueprintMCP/Source/BlueprintMCP/Private/Handlers/MCPHandlers_AssetMutation.h index b073b2b4..87209516 100644 --- a/Plugins/BlueprintMCP/Source/BlueprintMCP/Private/Handlers/MCPHandlers_AssetMutation.h +++ b/Plugins/BlueprintMCP/Source/BlueprintMCP/Private/Handlers/MCPHandlers_AssetMutation.h @@ -19,7 +19,7 @@ // --------------------------------------------------------------------------- // --------------------------------------------------------------------------- -UCLASS(meta=(ToolName="delete_asset")) +UCLASS() class UMCPHandler_DeleteAsset : public UObject, public IMCPHandler { GENERATED_BODY() @@ -169,7 +169,7 @@ public: // --------------------------------------------------------------------------- // --------------------------------------------------------------------------- -UCLASS(meta=(ToolName="rename_asset")) +UCLASS() class UMCPHandler_RenameAsset : public UObject, public IMCPHandler { GENERATED_BODY() @@ -247,7 +247,7 @@ public: // --------------------------------------------------------------------------- // --------------------------------------------------------------------------- -UCLASS(meta=(ToolName="backup_asset")) +UCLASS() class UMCPHandler_BackupAsset : public UObject, public IMCPHandler { GENERATED_BODY() @@ -286,7 +286,7 @@ public: // --------------------------------------------------------------------------- // --------------------------------------------------------------------------- -UCLASS(meta=(ToolName="restore_asset")) +UCLASS() class UMCPHandler_RestoreAsset : public UObject, public IMCPHandler { GENERATED_BODY() diff --git a/Plugins/BlueprintMCP/Source/BlueprintMCP/Private/Handlers/MCPHandlers_Components.h b/Plugins/BlueprintMCP/Source/BlueprintMCP/Private/Handlers/MCPHandlers_Components.h index 85f5e4f1..c459928d 100644 --- a/Plugins/BlueprintMCP/Source/BlueprintMCP/Private/Handlers/MCPHandlers_Components.h +++ b/Plugins/BlueprintMCP/Source/BlueprintMCP/Private/Handlers/MCPHandlers_Components.h @@ -16,7 +16,7 @@ // --------------------------------------------------------------------------- // --------------------------------------------------------------------------- -UCLASS(meta=(ToolName="list_blueprint_components")) +UCLASS() class UMCPHandler_ListBlueprintComponents : public UObject, public IMCPHandler { GENERATED_BODY() @@ -107,7 +107,7 @@ public: // --------------------------------------------------------------------------- // --------------------------------------------------------------------------- -UCLASS(meta=(ToolName="add_blueprint_component")) +UCLASS() class UMCPHandler_AddBlueprintComponent : public UObject, public IMCPHandler { GENERATED_BODY() @@ -272,7 +272,7 @@ public: // --------------------------------------------------------------------------- // --------------------------------------------------------------------------- -UCLASS(meta=(ToolName="remove_blueprint_component")) +UCLASS() class UMCPHandler_RemoveBlueprintComponent : public UObject, public IMCPHandler { GENERATED_BODY() diff --git a/Plugins/BlueprintMCP/Source/BlueprintMCP/Private/Handlers/MCPHandlers_DiffBlueprints.h b/Plugins/BlueprintMCP/Source/BlueprintMCP/Private/Handlers/MCPHandlers_DiffBlueprints.h index 58e9ae37..9b146523 100644 --- a/Plugins/BlueprintMCP/Source/BlueprintMCP/Private/Handlers/MCPHandlers_DiffBlueprints.h +++ b/Plugins/BlueprintMCP/Source/BlueprintMCP/Private/Handlers/MCPHandlers_DiffBlueprints.h @@ -15,7 +15,7 @@ // --------------------------------------------------------------------------- // --------------------------------------------------------------------------- -UCLASS(meta=(ToolName="diff_two_blueprints")) +UCLASS() class UMCPHandler_DiffTwoBlueprints : public UObject, public IMCPHandler { GENERATED_BODY() diff --git a/Plugins/BlueprintMCP/Source/BlueprintMCP/Private/Handlers/MCPHandlers_Discovery.h b/Plugins/BlueprintMCP/Source/BlueprintMCP/Private/Handlers/MCPHandlers_Discovery.h index 15235732..f4ea0e0e 100644 --- a/Plugins/BlueprintMCP/Source/BlueprintMCP/Private/Handlers/MCPHandlers_Discovery.h +++ b/Plugins/BlueprintMCP/Source/BlueprintMCP/Private/Handlers/MCPHandlers_Discovery.h @@ -20,8 +20,8 @@ // HandleGetPinInfo — detailed information about a specific pin // ============================================================ -UCLASS(meta=(ToolName="get_pin_details")) -class UMCPHandler_GetPinInfo : public UObject, public IMCPHandler +UCLASS() +class UMCPHandler_GetPinDetails : public UObject, public IMCPHandler { GENERATED_BODY() @@ -133,8 +133,8 @@ public: // HandleCheckPinCompatibility — pre-flight check for connect_pins // ============================================================ -UCLASS(meta=(ToolName="check_pin_connection_compatibility")) -class UMCPHandler_CheckPinCompatibility : public UObject, public IMCPHandler +UCLASS() +class UMCPHandler_CheckPinConnectionCompatibility : public UObject, public IMCPHandler { GENERATED_BODY() @@ -255,8 +255,8 @@ public: // HandleListClasses — discover available UClasses // ============================================================ -UCLASS(meta=(ToolName="search_unreal_classes")) -class UMCPHandler_ListClasses : public UObject, public IMCPHandler +UCLASS() +class UMCPHandler_SearchUnrealClasses : public UObject, public IMCPHandler { GENERATED_BODY() @@ -378,8 +378,8 @@ public: // HandleListFunctions — list Blueprint-callable functions on a class // ============================================================ -UCLASS(meta=(ToolName="list_class_functions")) -class UMCPHandler_ListFunctions : public UObject, public IMCPHandler +UCLASS() +class UMCPHandler_ListClassFunctions : public UObject, public IMCPHandler { GENERATED_BODY() @@ -495,8 +495,8 @@ public: // HandleListProperties — list properties on a class // ============================================================ -UCLASS(meta=(ToolName="list_class_properties")) -class UMCPHandler_ListProperties : public UObject, public IMCPHandler +UCLASS() +class UMCPHandler_ListClassProperties : public UObject, public IMCPHandler { GENERATED_BODY() @@ -583,7 +583,7 @@ public: // --------------------------------------------------------------------------- // --------------------------------------------------------------------------- -UCLASS(meta=(ToolName="show_commands")) +UCLASS() class UMCPHandler_ShowCommands : public UObject, public IMCPHandler { GENERATED_BODY() @@ -607,8 +607,7 @@ public: if (Class->HasAnyClassFlags(CLASS_Abstract)) continue; const IMCPHandler* Handler = Cast(Class->GetDefaultObject()); if (!Handler) continue; - const FString& ToolName = Class->GetMetaData(TEXT("ToolName")); - if (ToolName.IsEmpty()) continue; + FString ToolName = MCPUtils::GetToolName(Class); Handlers.Add({ToolName, Class}); } Handlers.Sort(); diff --git a/Plugins/BlueprintMCP/Source/BlueprintMCP/Private/Handlers/MCPHandlers_Dispatchers.h b/Plugins/BlueprintMCP/Source/BlueprintMCP/Private/Handlers/MCPHandlers_Dispatchers.h index 632a1293..e138fca6 100644 --- a/Plugins/BlueprintMCP/Source/BlueprintMCP/Private/Handlers/MCPHandlers_Dispatchers.h +++ b/Plugins/BlueprintMCP/Source/BlueprintMCP/Private/Handlers/MCPHandlers_Dispatchers.h @@ -28,7 +28,7 @@ struct FDispatcherParamEntry FString Type; }; -UCLASS(meta=(ToolName="add_event_dispatcher")) +UCLASS() class UMCPHandler_AddEventDispatcher : public UObject, public IMCPHandler { GENERATED_BODY() @@ -161,7 +161,7 @@ public: // --------------------------------------------------------------------------- // --------------------------------------------------------------------------- -UCLASS(meta=(ToolName="list_event_dispatchers")) +UCLASS() class UMCPHandler_ListEventDispatchers : public UObject, public IMCPHandler { GENERATED_BODY() diff --git a/Plugins/BlueprintMCP/Source/BlueprintMCP/Private/Handlers/MCPHandlers_Graphs.h b/Plugins/BlueprintMCP/Source/BlueprintMCP/Private/Handlers/MCPHandlers_Graphs.h index 89c2ad40..f03b1362 100644 --- a/Plugins/BlueprintMCP/Source/BlueprintMCP/Private/Handlers/MCPHandlers_Graphs.h +++ b/Plugins/BlueprintMCP/Source/BlueprintMCP/Private/Handlers/MCPHandlers_Graphs.h @@ -18,7 +18,7 @@ // --------------------------------------------------------------------------- // --------------------------------------------------------------------------- -UCLASS(meta=(ToolName="reparent_blueprint")) +UCLASS() class UMCPHandler_ReparentBlueprint : public UObject, public IMCPHandler { GENERATED_BODY() @@ -119,8 +119,8 @@ public: // --------------------------------------------------------------------------- // --------------------------------------------------------------------------- -UCLASS(meta=(ToolName="create_blueprint_asset")) -class UMCPHandler_CreateBlueprint : public UObject, public IMCPHandler +UCLASS() +class UMCPHandler_CreateBlueprintAsset : public UObject, public IMCPHandler { GENERATED_BODY() @@ -249,8 +249,8 @@ public: // --------------------------------------------------------------------------- // --------------------------------------------------------------------------- -UCLASS(meta=(ToolName="create_blueprint_graph")) -class UMCPHandler_CreateGraph : public UObject, public IMCPHandler +UCLASS() +class UMCPHandler_CreateBlueprintGraph : public UObject, public IMCPHandler { GENERATED_BODY() @@ -369,8 +369,8 @@ public: // --------------------------------------------------------------------------- // --------------------------------------------------------------------------- -UCLASS(meta=(ToolName="delete_blueprint_graph")) -class UMCPHandler_DeleteGraph : public UObject, public IMCPHandler +UCLASS() +class UMCPHandler_DeleteBlueprintGraph : public UObject, public IMCPHandler { GENERATED_BODY() @@ -458,8 +458,8 @@ public: // --------------------------------------------------------------------------- // --------------------------------------------------------------------------- -UCLASS(meta=(ToolName="rename_blueprint_graph")) -class UMCPHandler_RenameGraph : public UObject, public IMCPHandler +UCLASS() +class UMCPHandler_RenameBlueprintGraph : public UObject, public IMCPHandler { GENERATED_BODY() diff --git a/Plugins/BlueprintMCP/Source/BlueprintMCP/Private/Handlers/MCPHandlers_Interfaces.h b/Plugins/BlueprintMCP/Source/BlueprintMCP/Private/Handlers/MCPHandlers_Interfaces.h index 6777853a..b8593b50 100644 --- a/Plugins/BlueprintMCP/Source/BlueprintMCP/Private/Handlers/MCPHandlers_Interfaces.h +++ b/Plugins/BlueprintMCP/Source/BlueprintMCP/Private/Handlers/MCPHandlers_Interfaces.h @@ -15,7 +15,7 @@ // --------------------------------------------------------------------------- // --------------------------------------------------------------------------- -UCLASS(meta=(ToolName="list_blueprint_interfaces")) +UCLASS() class UMCPHandler_ListBlueprintInterfaces : public UObject, public IMCPHandler { GENERATED_BODY() @@ -71,7 +71,7 @@ public: // --------------------------------------------------------------------------- // --------------------------------------------------------------------------- -UCLASS(meta=(ToolName="add_blueprint_interface")) +UCLASS() class UMCPHandler_AddBlueprintInterface : public UObject, public IMCPHandler { GENERATED_BODY() @@ -210,7 +210,7 @@ public: // --------------------------------------------------------------------------- // --------------------------------------------------------------------------- -UCLASS(meta=(ToolName="remove_blueprint_interface")) +UCLASS() class UMCPHandler_RemoveBlueprintInterface : public UObject, public IMCPHandler { GENERATED_BODY() diff --git a/Plugins/BlueprintMCP/Source/BlueprintMCP/Private/Handlers/MCPHandlers_MaterialInstance.h b/Plugins/BlueprintMCP/Source/BlueprintMCP/Private/Handlers/MCPHandlers_MaterialInstance.h index f141f00d..19ae363d 100644 --- a/Plugins/BlueprintMCP/Source/BlueprintMCP/Private/Handlers/MCPHandlers_MaterialInstance.h +++ b/Plugins/BlueprintMCP/Source/BlueprintMCP/Private/Handlers/MCPHandlers_MaterialInstance.h @@ -21,8 +21,8 @@ // --------------------------------------------------------------------------- // --------------------------------------------------------------------------- -UCLASS(meta=(ToolName="create_material_instance_asset")) -class UMCPHandler_CreateMaterialInstance : public UObject, public IMCPHandler +UCLASS() +class UMCPHandler_CreateMaterialInstanceAsset : public UObject, public IMCPHandler { GENERATED_BODY() @@ -127,7 +127,7 @@ public: // --------------------------------------------------------------------------- // --------------------------------------------------------------------------- -UCLASS(meta=(ToolName="set_material_instance_parameter")) +UCLASS() class UMCPHandler_SetMaterialInstanceParameter : public UObject, public IMCPHandler { GENERATED_BODY() @@ -366,8 +366,8 @@ public: // --------------------------------------------------------------------------- // --------------------------------------------------------------------------- -UCLASS(meta=(ToolName="dump_material_instance_parameters")) -class UMCPHandler_GetMaterialInstanceParameters : public UObject, public IMCPHandler +UCLASS() +class UMCPHandler_DumpMaterialInstanceParameters : public UObject, public IMCPHandler { GENERATED_BODY() @@ -611,7 +611,7 @@ public: // --------------------------------------------------------------------------- // --------------------------------------------------------------------------- -UCLASS(meta=(ToolName="reparent_material_instance")) +UCLASS() class UMCPHandler_ReparentMaterialInstance : public UObject, public IMCPHandler { GENERATED_BODY() diff --git a/Plugins/BlueprintMCP/Source/BlueprintMCP/Private/Handlers/MCPHandlers_MaterialMutation.h b/Plugins/BlueprintMCP/Source/BlueprintMCP/Private/Handlers/MCPHandlers_MaterialMutation.h index 7525b542..31c8b16a 100644 --- a/Plugins/BlueprintMCP/Source/BlueprintMCP/Private/Handlers/MCPHandlers_MaterialMutation.h +++ b/Plugins/BlueprintMCP/Source/BlueprintMCP/Private/Handlers/MCPHandlers_MaterialMutation.h @@ -58,8 +58,8 @@ extern int32 TryAddMaterialExpressionSEH( // --------------------------------------------------------------------------- // --------------------------------------------------------------------------- -UCLASS(meta=(ToolName="create_material_asset")) -class UMCPHandler_CreateMaterial : public UObject, public IMCPHandler +UCLASS() +class UMCPHandler_CreateMaterialAsset : public UObject, public IMCPHandler { GENERATED_BODY() @@ -177,7 +177,7 @@ public: // --------------------------------------------------------------------------- // --------------------------------------------------------------------------- -UCLASS(meta=(ToolName="set_material_property")) +UCLASS() class UMCPHandler_SetMaterialProperty : public UObject, public IMCPHandler { GENERATED_BODY() @@ -387,7 +387,7 @@ public: // --------------------------------------------------------------------------- // --------------------------------------------------------------------------- -UCLASS(meta=(ToolName="add_material_expression")) +UCLASS() class UMCPHandler_AddMaterialExpression : public UObject, public IMCPHandler { GENERATED_BODY() @@ -579,7 +579,7 @@ public: // --------------------------------------------------------------------------- // --------------------------------------------------------------------------- -UCLASS(meta=(ToolName="delete_material_expression")) +UCLASS() class UMCPHandler_DeleteMaterialExpression : public UObject, public IMCPHandler { GENERATED_BODY() @@ -712,8 +712,8 @@ public: // --------------------------------------------------------------------------- // --------------------------------------------------------------------------- -UCLASS(meta=(ToolName="connect_material_expression_pins")) -class UMCPHandler_ConnectMaterialPins : public UObject, public IMCPHandler +UCLASS() +class UMCPHandler_ConnectMaterialExpressionPins : public UObject, public IMCPHandler { GENERATED_BODY() @@ -880,8 +880,8 @@ public: // --------------------------------------------------------------------------- // --------------------------------------------------------------------------- -UCLASS(meta=(ToolName="disconnect_material_expression_pin")) -class UMCPHandler_DisconnectMaterialPin : public UObject, public IMCPHandler +UCLASS() +class UMCPHandler_DisconnectMaterialExpressionPin : public UObject, public IMCPHandler { GENERATED_BODY() @@ -1010,8 +1010,8 @@ public: // --------------------------------------------------------------------------- // --------------------------------------------------------------------------- -UCLASS(meta=(ToolName="set_material_expression_property")) -class UMCPHandler_SetExpressionValue : public UObject, public IMCPHandler +UCLASS() +class UMCPHandler_SetMaterialExpressionProperty : public UObject, public IMCPHandler { GENERATED_BODY() @@ -1293,8 +1293,8 @@ public: // --------------------------------------------------------------------------- // --------------------------------------------------------------------------- -UCLASS(meta=(ToolName="set_material_expression_position")) -class UMCPHandler_MoveMaterialExpression : public UObject, public IMCPHandler +UCLASS() +class UMCPHandler_SetMaterialExpressionPosition : public UObject, public IMCPHandler { GENERATED_BODY() @@ -1413,8 +1413,8 @@ public: // --------------------------------------------------------------------------- // --------------------------------------------------------------------------- -UCLASS(meta=(ToolName="create_material_function_asset")) -class UMCPHandler_CreateMaterialFunction : public UObject, public IMCPHandler +UCLASS() +class UMCPHandler_CreateMaterialFunctionAsset : public UObject, public IMCPHandler { GENERATED_BODY() diff --git a/Plugins/BlueprintMCP/Source/BlueprintMCP/Private/Handlers/MCPHandlers_MaterialRead.h b/Plugins/BlueprintMCP/Source/BlueprintMCP/Private/Handlers/MCPHandlers_MaterialRead.h index 8b19036e..5686d462 100644 --- a/Plugins/BlueprintMCP/Source/BlueprintMCP/Private/Handlers/MCPHandlers_MaterialRead.h +++ b/Plugins/BlueprintMCP/Source/BlueprintMCP/Private/Handlers/MCPHandlers_MaterialRead.h @@ -39,8 +39,8 @@ // --------------------------------------------------------------------------- // --------------------------------------------------------------------------- -UCLASS(meta=(ToolName="list_material_assets")) -class UMCPHandler_ListMaterials : public UObject, public IMCPHandler +UCLASS() +class UMCPHandler_ListMaterialAssets : public UObject, public IMCPHandler { GENERATED_BODY() @@ -87,8 +87,8 @@ public: // --------------------------------------------------------------------------- // --------------------------------------------------------------------------- -UCLASS(meta=(ToolName="dump_material")) -class UMCPHandler_GetMaterial : public UObject, public IMCPHandler +UCLASS() +class UMCPHandler_DumpMaterial : public UObject, public IMCPHandler { GENERATED_BODY() @@ -343,8 +343,8 @@ public: // --------------------------------------------------------------------------- // --------------------------------------------------------------------------- -UCLASS(meta=(ToolName="dump_material_expression_graph")) -class UMCPHandler_GetMaterialGraph : public UObject, public IMCPHandler +UCLASS() +class UMCPHandler_DumpMaterialExpressionGraph : public UObject, public IMCPHandler { GENERATED_BODY() @@ -401,8 +401,8 @@ public: // --------------------------------------------------------------------------- // --------------------------------------------------------------------------- -UCLASS(meta=(ToolName="describe_material_in_english")) -class UMCPHandler_DescribeMaterial : public UObject, public IMCPHandler +UCLASS() +class UMCPHandler_DescribeMaterialInEnglish : public UObject, public IMCPHandler { GENERATED_BODY() @@ -609,8 +609,8 @@ public: // --------------------------------------------------------------------------- // --------------------------------------------------------------------------- -UCLASS(meta=(ToolName="search_within_materials")) -class UMCPHandler_SearchMaterials : public UObject, public IMCPHandler +UCLASS() +class UMCPHandler_SearchWithinMaterials : public UObject, public IMCPHandler { GENERATED_BODY() @@ -710,7 +710,7 @@ public: // --------------------------------------------------------------------------- // --------------------------------------------------------------------------- -UCLASS(meta=(ToolName="find_material_references")) +UCLASS() class UMCPHandler_FindMaterialReferences : public UObject, public IMCPHandler { GENERATED_BODY() @@ -758,8 +758,8 @@ public: // --------------------------------------------------------------------------- // --------------------------------------------------------------------------- -UCLASS(meta=(ToolName="list_material_function_assets")) -class UMCPHandler_ListMaterialFunctions : public UObject, public IMCPHandler +UCLASS() +class UMCPHandler_ListMaterialFunctionAssets : public UObject, public IMCPHandler { GENERATED_BODY() @@ -795,8 +795,8 @@ public: // --------------------------------------------------------------------------- // --------------------------------------------------------------------------- -UCLASS(meta=(ToolName="dump_material_function")) -class UMCPHandler_GetMaterialFunction : public UObject, public IMCPHandler +UCLASS() +class UMCPHandler_DumpMaterialFunction : public UObject, public IMCPHandler { GENERATED_BODY() @@ -886,8 +886,8 @@ public: // --------------------------------------------------------------------------- // --------------------------------------------------------------------------- -UCLASS(meta=(ToolName="compile_material")) -class UMCPHandler_ValidateMaterial : public UObject, public IMCPHandler +UCLASS() +class UMCPHandler_CompileMaterial : public UObject, public IMCPHandler { GENERATED_BODY() diff --git a/Plugins/BlueprintMCP/Source/BlueprintMCP/Private/Handlers/MCPHandlers_Mutation.h b/Plugins/BlueprintMCP/Source/BlueprintMCP/Private/Handlers/MCPHandlers_Mutation.h index 4c7948a2..5fd22d6b 100644 --- a/Plugins/BlueprintMCP/Source/BlueprintMCP/Private/Handlers/MCPHandlers_Mutation.h +++ b/Plugins/BlueprintMCP/Source/BlueprintMCP/Private/Handlers/MCPHandlers_Mutation.h @@ -70,7 +70,7 @@ struct FMoveNodeEntry }; -UCLASS(meta=(ToolName="set_node_positions")) +UCLASS() class UMCPHandler_SetNodePositions : public UObject, public IMCPHandler { GENERATED_BODY() @@ -138,7 +138,7 @@ public: // --------------------------------------------------------------------------- // --------------------------------------------------------------------------- -UCLASS(meta=(ToolName="duplicate_nodes_in_graph")) +UCLASS() class UMCPHandler_DuplicateNodesInGraph : public UObject, public IMCPHandler { GENERATED_BODY() @@ -302,7 +302,7 @@ struct FSpawnNodeEntry }; -UCLASS(meta=(ToolName="spawn_nodes_in_graph")) +UCLASS() class UMCPHandler_SpawnNodesInGraph : public UObject, public IMCPHandler { GENERATED_BODY() @@ -429,7 +429,7 @@ public: // --------------------------------------------------------------------------- // --------------------------------------------------------------------------- -UCLASS(meta=(ToolName="get_node_comment")) +UCLASS() class UMCPHandler_GetNodeComment : public UObject, public IMCPHandler { GENERATED_BODY() @@ -468,7 +468,7 @@ public: // --------------------------------------------------------------------------- // --------------------------------------------------------------------------- -UCLASS(meta=(ToolName="set_node_comment")) +UCLASS() class UMCPHandler_SetNodeComment : public UObject, public IMCPHandler { GENERATED_BODY() @@ -524,7 +524,7 @@ public: // --------------------------------------------------------------------------- // --------------------------------------------------------------------------- -UCLASS(meta=(ToolName="delete_node_from_graph")) +UCLASS() class UMCPHandler_DeleteNodeFromGraph : public UObject, public IMCPHandler { GENERATED_BODY() @@ -610,7 +610,7 @@ public: // --------------------------------------------------------------------------- // --------------------------------------------------------------------------- -UCLASS(meta=(ToolName="replace_function_calls_in_blueprint")) +UCLASS() class UMCPHandler_ReplaceFunctionCallsInBlueprint : public UObject, public IMCPHandler { GENERATED_BODY() @@ -861,7 +861,7 @@ public: // --------------------------------------------------------------------------- // --------------------------------------------------------------------------- -UCLASS(meta=(ToolName="refresh_all_nodes_in_graph")) +UCLASS() class UMCPHandler_RefreshAllNodesInGraph : public UObject, public IMCPHandler { GENERATED_BODY() @@ -960,7 +960,7 @@ public: // --------------------------------------------------------------------------- // --------------------------------------------------------------------------- -UCLASS(meta=(ToolName="change_struct_node_type")) +UCLASS() class UMCPHandler_ChangeStructNodeType : public UObject, public IMCPHandler { GENERATED_BODY() @@ -1187,7 +1187,7 @@ public: // --------------------------------------------------------------------------- // --------------------------------------------------------------------------- -UCLASS(meta=(ToolName="set_class_default_value")) +UCLASS() class UMCPHandler_SetClassDefaultValue : public UObject, public IMCPHandler { GENERATED_BODY() @@ -1354,7 +1354,7 @@ public: // --------------------------------------------------------------------------- // --------------------------------------------------------------------------- -UCLASS(meta=(ToolName="search_spawnable_node_types")) +UCLASS() class UMCPHandler_SearchSpawnableNodeTypes : public UObject, public IMCPHandler { GENERATED_BODY() diff --git a/Plugins/BlueprintMCP/Source/BlueprintMCP/Private/Handlers/MCPHandlers_Params.h b/Plugins/BlueprintMCP/Source/BlueprintMCP/Private/Handlers/MCPHandlers_Params.h index 39540b32..f9ca9bad 100644 --- a/Plugins/BlueprintMCP/Source/BlueprintMCP/Private/Handlers/MCPHandlers_Params.h +++ b/Plugins/BlueprintMCP/Source/BlueprintMCP/Private/Handlers/MCPHandlers_Params.h @@ -17,8 +17,8 @@ // --------------------------------------------------------------------------- // --------------------------------------------------------------------------- -UCLASS(meta=(ToolName="change_function_parameter_type")) -class UMCPHandler_ChangeFunctionParamType : public UObject, public IMCPHandler +UCLASS() +class UMCPHandler_ChangeFunctionParameterType : public UObject, public IMCPHandler { GENERATED_BODY() @@ -208,7 +208,7 @@ public: // --------------------------------------------------------------------------- // --------------------------------------------------------------------------- -UCLASS(meta=(ToolName="remove_function_parameter")) +UCLASS() class UMCPHandler_RemoveFunctionParameter : public UObject, public IMCPHandler { GENERATED_BODY() @@ -347,7 +347,7 @@ public: // --------------------------------------------------------------------------- // --------------------------------------------------------------------------- -UCLASS(meta=(ToolName="add_function_parameter")) +UCLASS() class UMCPHandler_AddFunctionParameter : public UObject, public IMCPHandler { GENERATED_BODY() diff --git a/Plugins/BlueprintMCP/Source/BlueprintMCP/Private/Handlers/MCPHandlers_PinMutation.h b/Plugins/BlueprintMCP/Source/BlueprintMCP/Private/Handlers/MCPHandlers_PinMutation.h index 36ac29a0..cf49e8d1 100644 --- a/Plugins/BlueprintMCP/Source/BlueprintMCP/Private/Handlers/MCPHandlers_PinMutation.h +++ b/Plugins/BlueprintMCP/Source/BlueprintMCP/Private/Handlers/MCPHandlers_PinMutation.h @@ -35,7 +35,7 @@ struct FSetPinDefaultEntry }; -UCLASS(meta=(ToolName="set_pin_default_values")) +UCLASS() class UMCPHandler_SetPinDefaultValues : public UObject, public IMCPHandler { GENERATED_BODY() @@ -154,7 +154,7 @@ struct FConnectPinsEntry }; -UCLASS(meta=(ToolName="connect_blueprint_pins")) +UCLASS() class UMCPHandler_ConnectBlueprintPins : public UObject, public IMCPHandler { GENERATED_BODY() @@ -274,7 +274,7 @@ struct FDisconnectPinEntry }; -UCLASS(meta=(ToolName="disconnect_blueprint_pins")) +UCLASS() class UMCPHandler_DisconnectBlueprintPins : public UObject, public IMCPHandler { GENERATED_BODY() diff --git a/Plugins/BlueprintMCP/Source/BlueprintMCP/Private/Handlers/MCPHandlers_Read.h b/Plugins/BlueprintMCP/Source/BlueprintMCP/Private/Handlers/MCPHandlers_Read.h index 8644781e..56186fe6 100644 --- a/Plugins/BlueprintMCP/Source/BlueprintMCP/Private/Handlers/MCPHandlers_Read.h +++ b/Plugins/BlueprintMCP/Source/BlueprintMCP/Private/Handlers/MCPHandlers_Read.h @@ -26,8 +26,8 @@ // --------------------------------------------------------------------------- // --------------------------------------------------------------------------- -UCLASS(meta=(ToolName="list_blueprint_assets")) -class UMCPHandler_List : public UObject, public IMCPHandler +UCLASS() +class UMCPHandler_ListBlueprintAssets : public UObject, public IMCPHandler { GENERATED_BODY() @@ -93,8 +93,8 @@ public: // --------------------------------------------------------------------------- // --------------------------------------------------------------------------- -UCLASS(meta=(ToolName="dump_blueprint")) -class UMCPHandler_GetBlueprint : public UObject, public IMCPHandler +UCLASS() +class UMCPHandler_DumpBlueprint : public UObject, public IMCPHandler { GENERATED_BODY() @@ -121,8 +121,8 @@ public: // --------------------------------------------------------------------------- // --------------------------------------------------------------------------- -UCLASS(meta=(ToolName="dump_blueprint_graph")) -class UMCPHandler_GetGraph : public UObject, public IMCPHandler +UCLASS() +class UMCPHandler_DumpBlueprintGraph : public UObject, public IMCPHandler { GENERATED_BODY() @@ -177,8 +177,8 @@ public: // --------------------------------------------------------------------------- // --------------------------------------------------------------------------- -UCLASS(meta=(ToolName="search_within_blueprints")) -class UMCPHandler_Search : public UObject, public IMCPHandler +UCLASS() +class UMCPHandler_SearchWithinBlueprints : public UObject, public IMCPHandler { GENERATED_BODY() @@ -313,8 +313,8 @@ public: // HandleTestSave — load a Blueprint and save it unmodified (diagnostic) // ============================================================ -UCLASS(meta=(ToolName="test_save_blueprint_package")) -class UMCPHandler_TestSave : public UObject, public IMCPHandler +UCLASS() +class UMCPHandler_TestSaveBlueprintPackage : public UObject, public IMCPHandler { GENERATED_BODY() @@ -356,8 +356,8 @@ public: // HandleFindReferences — find all Blueprints referencing an asset // ============================================================ -UCLASS(meta=(ToolName="find_asset_references")) -class UMCPHandler_FindReferences : public UObject, public IMCPHandler +UCLASS() +class UMCPHandler_FindAssetReferences : public UObject, public IMCPHandler { GENERATED_BODY() @@ -417,8 +417,8 @@ public: // HandleSearchByType — find all usages of a type across blueprints // ============================================================ -UCLASS(meta=(ToolName="search_type_usage_in_blueprints")) -class UMCPHandler_SearchByType : public UObject, public IMCPHandler +UCLASS() +class UMCPHandler_SearchTypeUsageInBlueprints : public UObject, public IMCPHandler { GENERATED_BODY() diff --git a/Plugins/BlueprintMCP/Source/BlueprintMCP/Private/Handlers/MCPHandlers_StateMachine.h b/Plugins/BlueprintMCP/Source/BlueprintMCP/Private/Handlers/MCPHandlers_StateMachine.h index 281492ed..ca6dc035 100644 --- a/Plugins/BlueprintMCP/Source/BlueprintMCP/Private/Handlers/MCPHandlers_StateMachine.h +++ b/Plugins/BlueprintMCP/Source/BlueprintMCP/Private/Handlers/MCPHandlers_StateMachine.h @@ -23,8 +23,8 @@ // --------------------------------------------------------------------------- // --------------------------------------------------------------------------- -UCLASS(meta=(ToolName="add_anim_state_to_machine")) -class UMCPHandler_AddAnimState : public UObject, public IMCPHandler +UCLASS() +class UMCPHandler_AddAnimStateToMachine : public UObject, public IMCPHandler { GENERATED_BODY() @@ -119,8 +119,8 @@ public: // --------------------------------------------------------------------------- // --------------------------------------------------------------------------- -UCLASS(meta=(ToolName="remove_anim_state_from_machine")) -class UMCPHandler_RemoveAnimState : public UObject, public IMCPHandler +UCLASS() +class UMCPHandler_RemoveAnimStateFromMachine : public UObject, public IMCPHandler { GENERATED_BODY() @@ -187,8 +187,8 @@ public: // --------------------------------------------------------------------------- // --------------------------------------------------------------------------- -UCLASS(meta=(ToolName="add_anim_state_transition")) -class UMCPHandler_AddAnimTransition : public UObject, public IMCPHandler +UCLASS() +class UMCPHandler_AddAnimStateTransition : public UObject, public IMCPHandler { GENERATED_BODY() @@ -276,8 +276,8 @@ public: // --------------------------------------------------------------------------- // --------------------------------------------------------------------------- -UCLASS(meta=(ToolName="set_anim_transition_rule")) -class UMCPHandler_SetTransitionRule : public UObject, public IMCPHandler +UCLASS() +class UMCPHandler_SetAnimTransitionRule : public UObject, public IMCPHandler { GENERATED_BODY() @@ -379,8 +379,8 @@ public: // --------------------------------------------------------------------------- // --------------------------------------------------------------------------- -UCLASS(meta=(ToolName="set_anim_state_animation")) -class UMCPHandler_SetStateAnimation : public UObject, public IMCPHandler +UCLASS() +class UMCPHandler_SetAnimStateAnimation : public UObject, public IMCPHandler { GENERATED_BODY() @@ -460,8 +460,8 @@ public: // --------------------------------------------------------------------------- // --------------------------------------------------------------------------- -UCLASS(meta=(ToolName="set_anim_state_blend_space")) -class UMCPHandler_SetStateBlendSpace : public UObject, public IMCPHandler +UCLASS() +class UMCPHandler_SetAnimStateBlendSpace : public UObject, public IMCPHandler { GENERATED_BODY() diff --git a/Plugins/BlueprintMCP/Source/BlueprintMCP/Private/Handlers/MCPHandlers_UserTypes.h b/Plugins/BlueprintMCP/Source/BlueprintMCP/Private/Handlers/MCPHandlers_UserTypes.h index a26a2d26..56978006 100644 --- a/Plugins/BlueprintMCP/Source/BlueprintMCP/Private/Handlers/MCPHandlers_UserTypes.h +++ b/Plugins/BlueprintMCP/Source/BlueprintMCP/Private/Handlers/MCPHandlers_UserTypes.h @@ -33,8 +33,8 @@ struct FStructPropertyEntry FString Type; }; -UCLASS(meta=(ToolName="create_struct_asset")) -class UMCPHandler_CreateStruct : public UObject, public IMCPHandler +UCLASS() +class UMCPHandler_CreateStructAsset : public UObject, public IMCPHandler { GENERATED_BODY() @@ -142,8 +142,8 @@ public: // --------------------------------------------------------------------------- // --------------------------------------------------------------------------- -UCLASS(meta=(ToolName="create_enum_asset")) -class UMCPHandler_CreateEnum : public UObject, public IMCPHandler +UCLASS() +class UMCPHandler_CreateEnumAsset : public UObject, public IMCPHandler { GENERATED_BODY() @@ -220,7 +220,7 @@ public: // --------------------------------------------------------------------------- // --------------------------------------------------------------------------- -UCLASS(meta=(ToolName="add_struct_field")) +UCLASS() class UMCPHandler_AddStructField : public UObject, public IMCPHandler { GENERATED_BODY() @@ -286,7 +286,7 @@ public: // --------------------------------------------------------------------------- // --------------------------------------------------------------------------- -UCLASS(meta=(ToolName="remove_struct_field")) +UCLASS() class UMCPHandler_RemoveStructField : public UObject, public IMCPHandler { GENERATED_BODY() diff --git a/Plugins/BlueprintMCP/Source/BlueprintMCP/Private/Handlers/MCPHandlers_Validation.h b/Plugins/BlueprintMCP/Source/BlueprintMCP/Private/Handlers/MCPHandlers_Validation.h index 505afb6f..9786241c 100644 --- a/Plugins/BlueprintMCP/Source/BlueprintMCP/Private/Handlers/MCPHandlers_Validation.h +++ b/Plugins/BlueprintMCP/Source/BlueprintMCP/Private/Handlers/MCPHandlers_Validation.h @@ -15,7 +15,7 @@ // --------------------------------------------------------------------------- // --------------------------------------------------------------------------- -UCLASS(meta=(ToolName="compile_blueprint")) +UCLASS() class UMCPHandler_CompileBlueprint : public UObject, public IMCPHandler { GENERATED_BODY() diff --git a/Plugins/BlueprintMCP/Source/BlueprintMCP/Private/Handlers/MCPHandlers_Variables.h b/Plugins/BlueprintMCP/Source/BlueprintMCP/Private/Handlers/MCPHandlers_Variables.h index 91891a63..adba1d6c 100644 --- a/Plugins/BlueprintMCP/Source/BlueprintMCP/Private/Handlers/MCPHandlers_Variables.h +++ b/Plugins/BlueprintMCP/Source/BlueprintMCP/Private/Handlers/MCPHandlers_Variables.h @@ -16,8 +16,8 @@ // --------------------------------------------------------------------------- // --------------------------------------------------------------------------- -UCLASS(meta=(ToolName="change_blueprint_variable_type")) -class UMCPHandler_ChangeVariableType : public UObject, public IMCPHandler +UCLASS() +class UMCPHandler_ChangeBlueprintVariableType : public UObject, public IMCPHandler { GENERATED_BODY() @@ -200,8 +200,8 @@ public: // --------------------------------------------------------------------------- // --------------------------------------------------------------------------- -UCLASS(meta=(ToolName="add_blueprint_variable")) -class UMCPHandler_AddVariable : public UObject, public IMCPHandler +UCLASS() +class UMCPHandler_AddBlueprintVariable : public UObject, public IMCPHandler { GENERATED_BODY() @@ -288,8 +288,8 @@ public: // --------------------------------------------------------------------------- // --------------------------------------------------------------------------- -UCLASS(meta=(ToolName="remove_blueprint_variable")) -class UMCPHandler_RemoveVariable : public UObject, public IMCPHandler +UCLASS() +class UMCPHandler_RemoveBlueprintVariable : public UObject, public IMCPHandler { GENERATED_BODY() @@ -359,8 +359,8 @@ public: // --------------------------------------------------------------------------- // --------------------------------------------------------------------------- -UCLASS(meta=(ToolName="set_blueprint_variable_metadata")) -class UMCPHandler_SetVariableMetadata : public UObject, public IMCPHandler +UCLASS() +class UMCPHandler_SetBlueprintVariableMetadata : public UObject, public IMCPHandler { GENERATED_BODY() diff --git a/Plugins/BlueprintMCP/Source/BlueprintMCP/Private/MCPServer.cpp b/Plugins/BlueprintMCP/Source/BlueprintMCP/Private/MCPServer.cpp index aacf1c52..22504650 100644 --- a/Plugins/BlueprintMCP/Source/BlueprintMCP/Private/MCPServer.cpp +++ b/Plugins/BlueprintMCP/Source/BlueprintMCP/Private/MCPServer.cpp @@ -420,15 +420,10 @@ void FMCPServer::BuildMCPHandlerRegistry() { continue; } - const FString& ToolName = Class->GetMetaData(TEXT("ToolName")); - if (ToolName.IsEmpty()) - { - UE_LOG(LogTemp, Warning, TEXT("BlueprintMCP: %s has no ToolName meta — skipping."), *Class->GetName()); - continue; - } + FString ToolName = MCPUtils::GetToolName(Class); if (MCPHandlerRegistry.Contains(ToolName)) { - UE_LOG(LogTemp, Warning, TEXT("BlueprintMCP: Duplicate ToolName '%s' on %s — skipping."), *ToolName, *Class->GetName()); + UE_LOG(LogTemp, Warning, TEXT("BlueprintMCP: Duplicate tool name '%s' on %s — skipping."), *ToolName, *Class->GetName()); continue; } MCPHandlerRegistry.Add(ToolName, Class); diff --git a/Plugins/BlueprintMCP/Source/BlueprintMCP/Private/MCPUtils.cpp b/Plugins/BlueprintMCP/Source/BlueprintMCP/Private/MCPUtils.cpp index c6ffedfb..b64f66fa 100644 --- a/Plugins/BlueprintMCP/Source/BlueprintMCP/Private/MCPUtils.cpp +++ b/Plugins/BlueprintMCP/Source/BlueprintMCP/Private/MCPUtils.cpp @@ -1499,6 +1499,21 @@ bool MCPUtils::PopulateFromJson( return true; } +// ============================================================ +// GetToolName — derive tool name from handler class name +// ============================================================ + +FString MCPUtils::GetToolName(UClass* HandlerClass) +{ + FString Name = HandlerClass->GetName(); + int32 UnderscoreIdx; + if (Name.FindChar(TEXT('_'), UnderscoreIdx)) + { + return Name.Mid(UnderscoreIdx + 1); + } + return Name; +} + // ============================================================ // FormatPropertyType — human-readable type name for a UPROPERTY // ============================================================ @@ -1527,7 +1542,7 @@ void MCPUtils::FormatCommandHelp(UClass* HandlerClass, FStringBuilderBase& Resul const IMCPHandler* Handler = Cast(HandlerClass->GetDefaultObject()); if (!Handler) return; - const FString& ToolName = HandlerClass->GetMetaData(TEXT("ToolName")); + FString ToolName = GetToolName(HandlerClass); // Command signature line Result.Append(ToolName); diff --git a/Plugins/BlueprintMCP/Source/BlueprintMCP/Public/MCPUtils.h b/Plugins/BlueprintMCP/Source/BlueprintMCP/Public/MCPUtils.h index 09974fd1..6f02bef7 100644 --- a/Plugins/BlueprintMCP/Source/BlueprintMCP/Public/MCPUtils.h +++ b/Plugins/BlueprintMCP/Source/BlueprintMCP/Public/MCPUtils.h @@ -200,6 +200,8 @@ public: static bool PopulateFromJson(UStruct* StructType, void* Container, const FJsonObject* Json, MCPErrorCallback Error); // ----- Command help ----- + // Derive tool name from handler class name: "MCPHandler_FooBar" → "FooBar" + static FString GetToolName(UClass* HandlerClass); static FString FormatPropertyType(FProperty* Prop); static void FormatCommandHelp(UClass* HandlerClass, FStringBuilderBase& Result); diff --git a/tools/mcp-test.py b/tools/mcp-test.py deleted file mode 100755 index a53a9639..00000000 --- a/tools/mcp-test.py +++ /dev/null @@ -1,66 +0,0 @@ -#!/usr/bin/env python3 -""" -Human-friendly MCP test client. - -Usage: python3 tools/mcp-test.py command=show_commands - python3 tools/mcp-test.py command=list_blueprint_assets filter=lx - python3 tools/mcp-test.py command=show_commands verbose=true -""" - -import sys -import json -import socket - -HOST = "localhost" -PORT = 9847 -TIMEOUT = 120 - -def main(): - msg = {} - for arg in sys.argv[1:]: - key, _, value = arg.partition("=") - if value.lower() == "true": - value = True - elif value.lower() == "false": - value = False - else: - try: - value = int(value) - except ValueError: - pass - msg[key] = value - - if not msg: - print("Usage: python3 tools/mcp-test.py command=show_commands") - sys.exit(1) - - sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM) - sock.settimeout(TIMEOUT) - try: - sock.connect((HOST, PORT)) - except (ConnectionRefusedError, socket.timeout, OSError) as e: - print(f"Cannot connect to {HOST}:{PORT} — is the editor running?") - sys.exit(1) - - sock.sendall((json.dumps(msg) + "\n").encode()) - - result = b"" - while True: - chunk = sock.recv(65536) - if not chunk: - break - result += chunk - if b"\0" in result: - break - - sock.close() - result = result[:result.index(b"\0")].decode() if b"\0" in result else result.decode() - - try: - parsed = json.loads(result) - print(json.dumps(parsed, indent=2)) - except json.JSONDecodeError: - print(result) - -if __name__ == "__main__": - main()