#pragma once #include "CoreMinimal.h" #include "MCPServer.h" #include "MCPHandler.h" #include "MCPAssets.h" #include "MCPUtils.h" #include "MCPTypes.h" #include "Engine/Blueprint.h" #include "Engine/World.h" #include "Blueprint_Search.generated.h" // --------------------------------------------------------------------------- // --------------------------------------------------------------------------- // --------------------------------------------------------------------------- UCLASS() class UMCP_Blueprint_Search : public UObject, public IMCPHandler { GENERATED_BODY() public: UPROPERTY(meta=(Optional, Description="Substring filter for blueprint name or path")) FString Query; UPROPERTY(meta=(Optional, Description="Filter by parent class name (exact match, case-insensitive)")) FString ParentClass; virtual FString GetDescription() const override { return TEXT("List all Blueprint assets in the project, with optional filtering by name, parent class, or type."); } virtual void Handle() override { MCPAssets Assets; Assets.Scan().Substring(Query).Limit(500); if (!Assets.Info()) return; UClass *Parent = nullptr; if (!ParentClass.IsEmpty()) { Parent = UMCPTypes::TextToOneObjectType(ParentClass); if (!Parent) return; } int32 Count = 0; for (const FAssetData& Asset : Assets.AllData()) { // Extract parent class name from asset tags FString ParentClassName; Asset.GetTagValue(FName(TEXT("ParentClass")), ParentClassName); int32 DotIndex; if (ParentClassName.FindLastChar('.', DotIndex)) { ParentClassName = ParentClassName.Mid(DotIndex + 1); } ParentClassName.RemoveFromEnd(TEXT("'")); // Apply parent class filter if (!ParentClass.IsEmpty()) { if (!ParentClassName.Equals(ParentClass, ESearchCase::IgnoreCase)) { continue; } } UMCPServer::Printf(TEXT("%30s %s\n"), *ParentClassName, *Asset.PackageName.ToString()); Count++; } if (Count == 0) { UMCPServer::Print(TEXT("No blueprint assets found.\n")); } } };