ue-mcp 0.4.0-alpha
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +21 -0
- package/README.md +89 -0
- package/dist/bridge.d.ts +25 -0
- package/dist/bridge.js +124 -0
- package/dist/bridge.js.map +1 -0
- package/dist/deployer.d.ts +18 -0
- package/dist/deployer.js +175 -0
- package/dist/deployer.js.map +1 -0
- package/dist/editor-control.d.ts +15 -0
- package/dist/editor-control.js +181 -0
- package/dist/editor-control.js.map +1 -0
- package/dist/github-app.d.ts +4 -0
- package/dist/github-app.js +94 -0
- package/dist/github-app.js.map +1 -0
- package/dist/index.d.ts +2 -0
- package/dist/index.js +125 -0
- package/dist/index.js.map +1 -0
- package/dist/init.d.ts +2 -0
- package/dist/init.js +290 -0
- package/dist/init.js.map +1 -0
- package/dist/instructions.d.ts +1 -0
- package/dist/instructions.js +150 -0
- package/dist/instructions.js.map +1 -0
- package/dist/project.d.ts +32 -0
- package/dist/project.js +175 -0
- package/dist/project.js.map +1 -0
- package/dist/tools/animation.d.ts +2 -0
- package/dist/tools/animation.js +62 -0
- package/dist/tools/animation.js.map +1 -0
- package/dist/tools/asset.d.ts +2 -0
- package/dist/tools/asset.js +128 -0
- package/dist/tools/asset.js.map +1 -0
- package/dist/tools/audio.d.ts +2 -0
- package/dist/tools/audio.js +24 -0
- package/dist/tools/audio.js.map +1 -0
- package/dist/tools/blueprint.d.ts +2 -0
- package/dist/tools/blueprint.js +64 -0
- package/dist/tools/blueprint.js.map +1 -0
- package/dist/tools/demo.d.ts +2 -0
- package/dist/tools/demo.js +10 -0
- package/dist/tools/demo.js.map +1 -0
- package/dist/tools/editor.d.ts +2 -0
- package/dist/tools/editor.js +133 -0
- package/dist/tools/editor.js.map +1 -0
- package/dist/tools/feedback.d.ts +2 -0
- package/dist/tools/feedback.js +44 -0
- package/dist/tools/feedback.js.map +1 -0
- package/dist/tools/foliage.d.ts +2 -0
- package/dist/tools/foliage.js +29 -0
- package/dist/tools/foliage.js.map +1 -0
- package/dist/tools/gameplay.d.ts +2 -0
- package/dist/tools/gameplay.js +101 -0
- package/dist/tools/gameplay.js.map +1 -0
- package/dist/tools/gas.d.ts +2 -0
- package/dist/tools/gas.js +43 -0
- package/dist/tools/gas.js.map +1 -0
- package/dist/tools/landscape.d.ts +2 -0
- package/dist/tools/landscape.js +32 -0
- package/dist/tools/landscape.js.map +1 -0
- package/dist/tools/level.d.ts +2 -0
- package/dist/tools/level.js +66 -0
- package/dist/tools/level.js.map +1 -0
- package/dist/tools/material.d.ts +2 -0
- package/dist/tools/material.js +59 -0
- package/dist/tools/material.js.map +1 -0
- package/dist/tools/networking.d.ts +2 -0
- package/dist/tools/networking.js +42 -0
- package/dist/tools/networking.js.map +1 -0
- package/dist/tools/niagara.d.ts +2 -0
- package/dist/tools/niagara.js +42 -0
- package/dist/tools/niagara.js.map +1 -0
- package/dist/tools/pcg.d.ts +2 -0
- package/dist/tools/pcg.js +39 -0
- package/dist/tools/pcg.js.map +1 -0
- package/dist/tools/project.d.ts +2 -0
- package/dist/tools/project.js +282 -0
- package/dist/tools/project.js.map +1 -0
- package/dist/tools/reflection.d.ts +2 -0
- package/dist/tools/reflection.js +26 -0
- package/dist/tools/reflection.js.map +1 -0
- package/dist/tools/widget.d.ts +2 -0
- package/dist/tools/widget.js +34 -0
- package/dist/tools/widget.js.map +1 -0
- package/dist/types.d.ts +21 -0
- package/dist/types.js +38 -0
- package/dist/types.js.map +1 -0
- package/package.json +76 -0
- package/plugin/ue_mcp_bridge/Source/UE_MCP_Bridge/Private/BridgeServer.cpp +746 -0
- package/plugin/ue_mcp_bridge/Source/UE_MCP_Bridge/Private/BridgeServer.h +81 -0
- package/plugin/ue_mcp_bridge/Source/UE_MCP_Bridge/Private/GameThreadExecutor.cpp +49 -0
- package/plugin/ue_mcp_bridge/Source/UE_MCP_Bridge/Private/GameThreadExecutor.h +37 -0
- package/plugin/ue_mcp_bridge/Source/UE_MCP_Bridge/Private/HandlerRegistry.cpp +75 -0
- package/plugin/ue_mcp_bridge/Source/UE_MCP_Bridge/Private/HandlerRegistry.h +50 -0
- package/plugin/ue_mcp_bridge/Source/UE_MCP_Bridge/Private/Handlers/AnimationHandlers.cpp +1418 -0
- package/plugin/ue_mcp_bridge/Source/UE_MCP_Bridge/Private/Handlers/AnimationHandlers.h +43 -0
- package/plugin/ue_mcp_bridge/Source/UE_MCP_Bridge/Private/Handlers/AssetHandlers.cpp +1773 -0
- package/plugin/ue_mcp_bridge/Source/UE_MCP_Bridge/Private/Handlers/AssetHandlers.h +48 -0
- package/plugin/ue_mcp_bridge/Source/UE_MCP_Bridge/Private/Handlers/AudioHandlers.cpp +289 -0
- package/plugin/ue_mcp_bridge/Source/UE_MCP_Bridge/Private/Handlers/AudioHandlers.h +18 -0
- package/plugin/ue_mcp_bridge/Source/UE_MCP_Bridge/Private/Handlers/BlueprintHandlers.cpp +1982 -0
- package/plugin/ue_mcp_bridge/Source/UE_MCP_Bridge/Private/Handlers/BlueprintHandlers.h +44 -0
- package/plugin/ue_mcp_bridge/Source/UE_MCP_Bridge/Private/Handlers/DemoHandlers.cpp +1217 -0
- package/plugin/ue_mcp_bridge/Source/UE_MCP_Bridge/Private/Handlers/DemoHandlers.h +71 -0
- package/plugin/ue_mcp_bridge/Source/UE_MCP_Bridge/Private/Handlers/DialogHandlers.cpp +465 -0
- package/plugin/ue_mcp_bridge/Source/UE_MCP_Bridge/Private/Handlers/DialogHandlers.h +49 -0
- package/plugin/ue_mcp_bridge/Source/UE_MCP_Bridge/Private/Handlers/EditorHandlers.cpp +1676 -0
- package/plugin/ue_mcp_bridge/Source/UE_MCP_Bridge/Private/Handlers/EditorHandlers.h +53 -0
- package/plugin/ue_mcp_bridge/Source/UE_MCP_Bridge/Private/Handlers/FoliageHandlers.cpp +876 -0
- package/plugin/ue_mcp_bridge/Source/UE_MCP_Bridge/Private/Handlers/FoliageHandlers.h +22 -0
- package/plugin/ue_mcp_bridge/Source/UE_MCP_Bridge/Private/Handlers/GameplayHandlers.cpp +2222 -0
- package/plugin/ue_mcp_bridge/Source/UE_MCP_Bridge/Private/Handlers/GameplayHandlers.h +54 -0
- package/plugin/ue_mcp_bridge/Source/UE_MCP_Bridge/Private/Handlers/GasHandlers.cpp +783 -0
- package/plugin/ue_mcp_bridge/Source/UE_MCP_Bridge/Private/Handlers/GasHandlers.h +24 -0
- package/plugin/ue_mcp_bridge/Source/UE_MCP_Bridge/Private/Handlers/LandscapeHandlers.cpp +898 -0
- package/plugin/ue_mcp_bridge/Source/UE_MCP_Bridge/Private/Handlers/LandscapeHandlers.h +24 -0
- package/plugin/ue_mcp_bridge/Source/UE_MCP_Bridge/Private/Handlers/LevelHandlers.cpp +1270 -0
- package/plugin/ue_mcp_bridge/Source/UE_MCP_Bridge/Private/Handlers/LevelHandlers.h +34 -0
- package/plugin/ue_mcp_bridge/Source/UE_MCP_Bridge/Private/Handlers/MaterialHandlers.cpp +2190 -0
- package/plugin/ue_mcp_bridge/Source/UE_MCP_Bridge/Private/Handlers/MaterialHandlers.h +53 -0
- package/plugin/ue_mcp_bridge/Source/UE_MCP_Bridge/Private/Handlers/NetworkingHandlers.cpp +554 -0
- package/plugin/ue_mcp_bridge/Source/UE_MCP_Bridge/Private/Handlers/NetworkingHandlers.h +29 -0
- package/plugin/ue_mcp_bridge/Source/UE_MCP_Bridge/Private/Handlers/NiagaraHandlers.cpp +601 -0
- package/plugin/ue_mcp_bridge/Source/UE_MCP_Bridge/Private/Handlers/NiagaraHandlers.h +25 -0
- package/plugin/ue_mcp_bridge/Source/UE_MCP_Bridge/Private/Handlers/PCGHandlers.cpp +1024 -0
- package/plugin/ue_mcp_bridge/Source/UE_MCP_Bridge/Private/Handlers/PCGHandlers.h +25 -0
- package/plugin/ue_mcp_bridge/Source/UE_MCP_Bridge/Private/Handlers/PhysicsHandlers.cpp +370 -0
- package/plugin/ue_mcp_bridge/Source/UE_MCP_Bridge/Private/Handlers/PhysicsHandlers.h +19 -0
- package/plugin/ue_mcp_bridge/Source/UE_MCP_Bridge/Private/Handlers/ReflectionHandlers.cpp +499 -0
- package/plugin/ue_mcp_bridge/Source/UE_MCP_Bridge/Private/Handlers/ReflectionHandlers.h +27 -0
- package/plugin/ue_mcp_bridge/Source/UE_MCP_Bridge/Private/Handlers/SequencerHandlers.cpp +426 -0
- package/plugin/ue_mcp_bridge/Source/UE_MCP_Bridge/Private/Handlers/SequencerHandlers.h +19 -0
- package/plugin/ue_mcp_bridge/Source/UE_MCP_Bridge/Private/Handlers/SplineHandlers.cpp +303 -0
- package/plugin/ue_mcp_bridge/Source/UE_MCP_Bridge/Private/Handlers/SplineHandlers.h +18 -0
- package/plugin/ue_mcp_bridge/Source/UE_MCP_Bridge/Private/Handlers/WidgetHandlers.cpp +985 -0
- package/plugin/ue_mcp_bridge/Source/UE_MCP_Bridge/Private/Handlers/WidgetHandlers.h +27 -0
- package/plugin/ue_mcp_bridge/Source/UE_MCP_Bridge/Private/JsonSerializer.cpp +181 -0
- package/plugin/ue_mcp_bridge/Source/UE_MCP_Bridge/Private/JsonSerializer.h +42 -0
- package/plugin/ue_mcp_bridge/Source/UE_MCP_Bridge/Private/UE_MCP_Bridge.cpp +39 -0
- package/plugin/ue_mcp_bridge/Source/UE_MCP_Bridge/Public/UE_MCP_BridgeModule.h +14 -0
- package/plugin/ue_mcp_bridge/Source/UE_MCP_Bridge/UE_MCP_Bridge.Build.cs +87 -0
- package/plugin/ue_mcp_bridge/UE_MCP_Bridge.uplugin +55 -0
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
#pragma once
|
|
2
|
+
|
|
3
|
+
#include "CoreMinimal.h"
|
|
4
|
+
#include "Dom/JsonValue.h"
|
|
5
|
+
#include "Dom/JsonObject.h"
|
|
6
|
+
|
|
7
|
+
class FWidgetHandlers
|
|
8
|
+
{
|
|
9
|
+
public:
|
|
10
|
+
static void RegisterHandlers(class FMCPHandlerRegistry& Registry);
|
|
11
|
+
|
|
12
|
+
private:
|
|
13
|
+
static TSharedPtr<FJsonValue> ListWidgetBlueprints(const TSharedPtr<FJsonObject>& Params);
|
|
14
|
+
static TSharedPtr<FJsonValue> CreateWidgetBlueprint(const TSharedPtr<FJsonObject>& Params);
|
|
15
|
+
static TSharedPtr<FJsonValue> ReadWidgetTree(const TSharedPtr<FJsonObject>& Params);
|
|
16
|
+
static TSharedPtr<FJsonValue> CreateEditorUtilityWidget(const TSharedPtr<FJsonObject>& Params);
|
|
17
|
+
static TSharedPtr<FJsonValue> CreateEditorUtilityBlueprint(const TSharedPtr<FJsonObject>& Params);
|
|
18
|
+
static TSharedPtr<FJsonValue> SearchWidgetByName(const TSharedPtr<FJsonObject>& Params);
|
|
19
|
+
static TSharedPtr<FJsonValue> GetWidgetProperties(const TSharedPtr<FJsonObject>& Params);
|
|
20
|
+
static TSharedPtr<FJsonValue> SetWidgetProperty(const TSharedPtr<FJsonObject>& Params);
|
|
21
|
+
static TSharedPtr<FJsonValue> ReadWidgetAnimations(const TSharedPtr<FJsonObject>& Params);
|
|
22
|
+
static TSharedPtr<FJsonValue> RunEditorUtilityWidget(const TSharedPtr<FJsonObject>& Params);
|
|
23
|
+
static TSharedPtr<FJsonValue> RunEditorUtilityBlueprint(const TSharedPtr<FJsonObject>& Params);
|
|
24
|
+
|
|
25
|
+
// Helper: recursively search for a widget by name in the tree
|
|
26
|
+
static class UWidget* FindWidgetByNameRecursive(class UWidget* Root, const FString& WidgetName);
|
|
27
|
+
};
|
|
@@ -0,0 +1,181 @@
|
|
|
1
|
+
#include "JsonSerializer.h"
|
|
2
|
+
#include "UObject/UnrealType.h"
|
|
3
|
+
#include "UObject/PropertyPortFlags.h"
|
|
4
|
+
#include "Dom/JsonObject.h"
|
|
5
|
+
#include "Dom/JsonValue.h"
|
|
6
|
+
|
|
7
|
+
TSharedPtr<FJsonValue> FMCPJsonSerializer::SerializeValue(const void* Value, FProperty* Property)
|
|
8
|
+
{
|
|
9
|
+
if (!Property || !Value)
|
|
10
|
+
{
|
|
11
|
+
return MakeShared<FJsonValueNull>();
|
|
12
|
+
}
|
|
13
|
+
|
|
14
|
+
return SerializePropertyValue(Value, Property);
|
|
15
|
+
}
|
|
16
|
+
|
|
17
|
+
TSharedPtr<FJsonValue> FMCPJsonSerializer::SerializeVector(const FVector& Vector)
|
|
18
|
+
{
|
|
19
|
+
TSharedPtr<FJsonObject> JsonObject = MakeShared<FJsonObject>();
|
|
20
|
+
JsonObject->SetNumberField(TEXT("x"), Vector.X);
|
|
21
|
+
JsonObject->SetNumberField(TEXT("y"), Vector.Y);
|
|
22
|
+
JsonObject->SetNumberField(TEXT("z"), Vector.Z);
|
|
23
|
+
return MakeShared<FJsonValueObject>(JsonObject);
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
TSharedPtr<FJsonValue> FMCPJsonSerializer::SerializeRotator(const FRotator& Rotator)
|
|
27
|
+
{
|
|
28
|
+
TSharedPtr<FJsonObject> JsonObject = MakeShared<FJsonObject>();
|
|
29
|
+
JsonObject->SetNumberField(TEXT("pitch"), Rotator.Pitch);
|
|
30
|
+
JsonObject->SetNumberField(TEXT("yaw"), Rotator.Yaw);
|
|
31
|
+
JsonObject->SetNumberField(TEXT("roll"), Rotator.Roll);
|
|
32
|
+
return MakeShared<FJsonValueObject>(JsonObject);
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
TSharedPtr<FJsonValue> FMCPJsonSerializer::SerializeTransform(const FTransform& Transform)
|
|
36
|
+
{
|
|
37
|
+
TSharedPtr<FJsonObject> JsonObject = MakeShared<FJsonObject>();
|
|
38
|
+
TSharedPtr<FJsonValue> TranslationValue = SerializeVector(Transform.GetTranslation());
|
|
39
|
+
TSharedPtr<FJsonValue> RotationValue = SerializeRotator(Transform.GetRotation().Rotator());
|
|
40
|
+
TSharedPtr<FJsonValue> ScaleValue = SerializeVector(Transform.GetScale3D());
|
|
41
|
+
JsonObject->SetObjectField(TEXT("translation"), TranslationValue->AsObject());
|
|
42
|
+
JsonObject->SetObjectField(TEXT("rotation"), RotationValue->AsObject());
|
|
43
|
+
JsonObject->SetObjectField(TEXT("scale"), ScaleValue->AsObject());
|
|
44
|
+
return MakeShared<FJsonValueObject>(JsonObject);
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
TSharedPtr<FJsonValue> FMCPJsonSerializer::SerializeLinearColor(const FLinearColor& Color)
|
|
48
|
+
{
|
|
49
|
+
TSharedPtr<FJsonObject> JsonObject = MakeShared<FJsonObject>();
|
|
50
|
+
JsonObject->SetNumberField(TEXT("r"), Color.R);
|
|
51
|
+
JsonObject->SetNumberField(TEXT("g"), Color.G);
|
|
52
|
+
JsonObject->SetNumberField(TEXT("b"), Color.B);
|
|
53
|
+
JsonObject->SetNumberField(TEXT("a"), Color.A);
|
|
54
|
+
return MakeShared<FJsonValueObject>(JsonObject);
|
|
55
|
+
}
|
|
56
|
+
|
|
57
|
+
TSharedPtr<FJsonValue> FMCPJsonSerializer::SerializeString(const FString& String)
|
|
58
|
+
{
|
|
59
|
+
return MakeShared<FJsonValueString>(String);
|
|
60
|
+
}
|
|
61
|
+
|
|
62
|
+
TSharedPtr<FJsonValue> FMCPJsonSerializer::SerializeObjectProperty(UObject* Object, FProperty* Property)
|
|
63
|
+
{
|
|
64
|
+
if (!Object || !Property)
|
|
65
|
+
{
|
|
66
|
+
return MakeShared<FJsonValueNull>();
|
|
67
|
+
}
|
|
68
|
+
|
|
69
|
+
const void* ValuePtr = Property->ContainerPtrToValuePtr<void>(Object);
|
|
70
|
+
return SerializePropertyValue(ValuePtr, Property);
|
|
71
|
+
}
|
|
72
|
+
|
|
73
|
+
TSharedPtr<FJsonObject> FMCPJsonSerializer::SerializeObject(UObject* Object)
|
|
74
|
+
{
|
|
75
|
+
if (!Object)
|
|
76
|
+
{
|
|
77
|
+
return MakeShared<FJsonObject>();
|
|
78
|
+
}
|
|
79
|
+
|
|
80
|
+
TSharedPtr<FJsonObject> JsonObject = MakeShared<FJsonObject>();
|
|
81
|
+
|
|
82
|
+
// Serialize basic object info
|
|
83
|
+
JsonObject->SetStringField(TEXT("name"), Object->GetName());
|
|
84
|
+
JsonObject->SetStringField(TEXT("class"), Object->GetClass()->GetName());
|
|
85
|
+
JsonObject->SetStringField(TEXT("path"), Object->GetPathName());
|
|
86
|
+
|
|
87
|
+
// Serialize properties
|
|
88
|
+
for (TFieldIterator<FProperty> PropIt(Object->GetClass()); PropIt; ++PropIt)
|
|
89
|
+
{
|
|
90
|
+
FProperty* Property = *PropIt;
|
|
91
|
+
if (Property && Property->HasAnyPropertyFlags(CPF_BlueprintVisible))
|
|
92
|
+
{
|
|
93
|
+
TSharedPtr<FJsonValue> PropValue = SerializeObjectProperty(Object, Property);
|
|
94
|
+
if (PropValue.IsValid())
|
|
95
|
+
{
|
|
96
|
+
JsonObject->SetField(Property->GetName(), PropValue);
|
|
97
|
+
}
|
|
98
|
+
}
|
|
99
|
+
}
|
|
100
|
+
|
|
101
|
+
return JsonObject;
|
|
102
|
+
}
|
|
103
|
+
|
|
104
|
+
TSharedPtr<FJsonValue> FMCPJsonSerializer::SerializePropertyValue(const void* Value, FProperty* Property)
|
|
105
|
+
{
|
|
106
|
+
if (!Property || !Value)
|
|
107
|
+
{
|
|
108
|
+
return MakeShared<FJsonValueNull>();
|
|
109
|
+
}
|
|
110
|
+
|
|
111
|
+
if (FStrProperty* StrProp = CastField<FStrProperty>(Property))
|
|
112
|
+
{
|
|
113
|
+
return MakeShared<FJsonValueString>(StrProp->GetPropertyValue(Value));
|
|
114
|
+
}
|
|
115
|
+
else if (FNameProperty* NameProp = CastField<FNameProperty>(Property))
|
|
116
|
+
{
|
|
117
|
+
return MakeShared<FJsonValueString>(NameProp->GetPropertyValue(Value).ToString());
|
|
118
|
+
}
|
|
119
|
+
else if (FTextProperty* TextProp = CastField<FTextProperty>(Property))
|
|
120
|
+
{
|
|
121
|
+
return MakeShared<FJsonValueString>(TextProp->GetPropertyValue(Value).ToString());
|
|
122
|
+
}
|
|
123
|
+
else if (FBoolProperty* BoolProp = CastField<FBoolProperty>(Property))
|
|
124
|
+
{
|
|
125
|
+
return MakeShared<FJsonValueBoolean>(BoolProp->GetPropertyValue(Value));
|
|
126
|
+
}
|
|
127
|
+
else if (FIntProperty* IntProp = CastField<FIntProperty>(Property))
|
|
128
|
+
{
|
|
129
|
+
return MakeShared<FJsonValueNumber>(IntProp->GetPropertyValue(Value));
|
|
130
|
+
}
|
|
131
|
+
else if (FInt64Property* Int64Prop = CastField<FInt64Property>(Property))
|
|
132
|
+
{
|
|
133
|
+
return MakeShared<FJsonValueNumber>(Int64Prop->GetPropertyValue(Value));
|
|
134
|
+
}
|
|
135
|
+
else if (FFloatProperty* FloatProp = CastField<FFloatProperty>(Property))
|
|
136
|
+
{
|
|
137
|
+
return MakeShared<FJsonValueNumber>(FloatProp->GetPropertyValue(Value));
|
|
138
|
+
}
|
|
139
|
+
else if (FDoubleProperty* DoubleProp = CastField<FDoubleProperty>(Property))
|
|
140
|
+
{
|
|
141
|
+
return MakeShared<FJsonValueNumber>(DoubleProp->GetPropertyValue(Value));
|
|
142
|
+
}
|
|
143
|
+
else if (FStructProperty* StructProp = CastField<FStructProperty>(Property))
|
|
144
|
+
{
|
|
145
|
+
if (StructProp->Struct == TBaseStructure<FVector>::Get())
|
|
146
|
+
{
|
|
147
|
+
return SerializeVector(*static_cast<const FVector*>(Value));
|
|
148
|
+
}
|
|
149
|
+
else if (StructProp->Struct == TBaseStructure<FRotator>::Get())
|
|
150
|
+
{
|
|
151
|
+
return SerializeRotator(*static_cast<const FRotator*>(Value));
|
|
152
|
+
}
|
|
153
|
+
else if (StructProp->Struct == TBaseStructure<FTransform>::Get())
|
|
154
|
+
{
|
|
155
|
+
return SerializeTransform(*static_cast<const FTransform*>(Value));
|
|
156
|
+
}
|
|
157
|
+
else if (StructProp->Struct == TBaseStructure<FLinearColor>::Get())
|
|
158
|
+
{
|
|
159
|
+
return SerializeLinearColor(*static_cast<const FLinearColor*>(Value));
|
|
160
|
+
}
|
|
161
|
+
}
|
|
162
|
+
else if (FArrayProperty* ArrayProp = CastField<FArrayProperty>(Property))
|
|
163
|
+
{
|
|
164
|
+
TArray<TSharedPtr<FJsonValue>> JsonArray;
|
|
165
|
+
FScriptArrayHelper ArrayHelper(ArrayProp, Value);
|
|
166
|
+
for (int32 i = 0; i < ArrayHelper.Num(); ++i)
|
|
167
|
+
{
|
|
168
|
+
const void* ItemValue = ArrayHelper.GetRawPtr(i);
|
|
169
|
+
TSharedPtr<FJsonValue> ItemJson = SerializePropertyValue(ItemValue, ArrayProp->Inner);
|
|
170
|
+
if (ItemJson.IsValid())
|
|
171
|
+
{
|
|
172
|
+
JsonArray.Add(ItemJson);
|
|
173
|
+
}
|
|
174
|
+
}
|
|
175
|
+
return MakeShared<FJsonValueArray>(JsonArray);
|
|
176
|
+
}
|
|
177
|
+
|
|
178
|
+
// Fallback: convert to string - use property name as fallback
|
|
179
|
+
FString StringValue = FString::Printf(TEXT("(%s)"), *Property->GetName());
|
|
180
|
+
return MakeShared<FJsonValueString>(StringValue);
|
|
181
|
+
}
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
#pragma once
|
|
2
|
+
|
|
3
|
+
#include "CoreMinimal.h"
|
|
4
|
+
#include "Dom/JsonValue.h"
|
|
5
|
+
#include "Dom/JsonObject.h"
|
|
6
|
+
#include "UObject/UnrealType.h"
|
|
7
|
+
|
|
8
|
+
class FMCPJsonSerializer
|
|
9
|
+
{
|
|
10
|
+
public:
|
|
11
|
+
// Serialize UE type to JSON value
|
|
12
|
+
static TSharedPtr<FJsonValue> SerializeValue(const void* Value, FProperty* Property);
|
|
13
|
+
|
|
14
|
+
// Serialize FVector to JSON
|
|
15
|
+
static TSharedPtr<FJsonValue> SerializeVector(const FVector& Vector);
|
|
16
|
+
|
|
17
|
+
// Serialize FRotator to JSON
|
|
18
|
+
static TSharedPtr<FJsonValue> SerializeRotator(const FRotator& Rotator);
|
|
19
|
+
|
|
20
|
+
// Serialize FTransform to JSON
|
|
21
|
+
static TSharedPtr<FJsonValue> SerializeTransform(const FTransform& Transform);
|
|
22
|
+
|
|
23
|
+
// Serialize FLinearColor to JSON
|
|
24
|
+
static TSharedPtr<FJsonValue> SerializeLinearColor(const FLinearColor& Color);
|
|
25
|
+
|
|
26
|
+
// Serialize FString to JSON
|
|
27
|
+
static TSharedPtr<FJsonValue> SerializeString(const FString& String);
|
|
28
|
+
|
|
29
|
+
// Serialize TArray to JSON
|
|
30
|
+
template<typename T>
|
|
31
|
+
static TSharedPtr<FJsonValue> SerializeArray(const TArray<T>& Array);
|
|
32
|
+
|
|
33
|
+
// Serialize UObject property to JSON
|
|
34
|
+
static TSharedPtr<FJsonValue> SerializeObjectProperty(UObject* Object, FProperty* Property);
|
|
35
|
+
|
|
36
|
+
// Serialize UObject to JSON (basic properties)
|
|
37
|
+
static TSharedPtr<FJsonObject> SerializeObject(UObject* Object);
|
|
38
|
+
|
|
39
|
+
private:
|
|
40
|
+
// Helper to serialize property value
|
|
41
|
+
static TSharedPtr<FJsonValue> SerializePropertyValue(const void* Value, FProperty* Property);
|
|
42
|
+
};
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
#include "UE_MCP_BridgeModule.h"
|
|
2
|
+
#include "Modules/ModuleManager.h"
|
|
3
|
+
#include "BridgeServer.h"
|
|
4
|
+
#include "Handlers/DialogHandlers.h"
|
|
5
|
+
#include "Misc/ConfigCacheIni.h"
|
|
6
|
+
|
|
7
|
+
DEFINE_LOG_CATEGORY(LogMCPBridge);
|
|
8
|
+
IMPLEMENT_MODULE(FUE_MCP_BridgeModule, UE_MCP_Bridge)
|
|
9
|
+
|
|
10
|
+
static TSharedPtr<FMCPBridgeServer> G_BridgeServer;
|
|
11
|
+
|
|
12
|
+
void FUE_MCP_BridgeModule::StartupModule()
|
|
13
|
+
{
|
|
14
|
+
// Create and start bridge server
|
|
15
|
+
G_BridgeServer = MakeShared<FMCPBridgeServer>(9877);
|
|
16
|
+
FDialogHandlers::InstallDialogHook();
|
|
17
|
+
|
|
18
|
+
if (G_BridgeServer->Start())
|
|
19
|
+
{
|
|
20
|
+
UE_LOG(LogMCPBridge, Log, TEXT("[UE-MCP] Bridge server started on port 9877"));
|
|
21
|
+
}
|
|
22
|
+
else
|
|
23
|
+
{
|
|
24
|
+
UE_LOG(LogMCPBridge, Warning, TEXT("[UE-MCP] Failed to start bridge server"));
|
|
25
|
+
}
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
void FUE_MCP_BridgeModule::ShutdownModule()
|
|
29
|
+
{
|
|
30
|
+
// Stop bridge server
|
|
31
|
+
FDialogHandlers::RemoveDialogHook();
|
|
32
|
+
|
|
33
|
+
if (G_BridgeServer.IsValid())
|
|
34
|
+
{
|
|
35
|
+
G_BridgeServer->Shutdown();
|
|
36
|
+
G_BridgeServer.Reset();
|
|
37
|
+
UE_LOG(LogMCPBridge, Log, TEXT("[UE-MCP] Bridge server stopped"));
|
|
38
|
+
}
|
|
39
|
+
}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
#pragma once
|
|
2
|
+
|
|
3
|
+
#include "CoreMinimal.h"
|
|
4
|
+
#include "Modules/ModuleManager.h"
|
|
5
|
+
|
|
6
|
+
DECLARE_LOG_CATEGORY_EXTERN(LogMCPBridge, Log, All);
|
|
7
|
+
|
|
8
|
+
class FUE_MCP_BridgeModule : public IModuleInterface
|
|
9
|
+
{
|
|
10
|
+
public:
|
|
11
|
+
/** IModuleInterface implementation */
|
|
12
|
+
virtual void StartupModule() override;
|
|
13
|
+
virtual void ShutdownModule() override;
|
|
14
|
+
};
|
|
@@ -0,0 +1,87 @@
|
|
|
1
|
+
using UnrealBuildTool;
|
|
2
|
+
|
|
3
|
+
public class UE_MCP_Bridge : ModuleRules
|
|
4
|
+
{
|
|
5
|
+
public UE_MCP_Bridge(ReadOnlyTargetRules Target) : base(Target)
|
|
6
|
+
{
|
|
7
|
+
PCHUsage = ModuleRules.PCHUsageMode.UseExplicitOrSharedPCHs;
|
|
8
|
+
|
|
9
|
+
PublicIncludePaths.AddRange(
|
|
10
|
+
new string[] {
|
|
11
|
+
}
|
|
12
|
+
);
|
|
13
|
+
|
|
14
|
+
PrivateIncludePaths.AddRange(
|
|
15
|
+
new string[] {
|
|
16
|
+
}
|
|
17
|
+
);
|
|
18
|
+
|
|
19
|
+
PublicDependencyModuleNames.AddRange(
|
|
20
|
+
new string[]
|
|
21
|
+
{
|
|
22
|
+
"Core",
|
|
23
|
+
"CoreUObject",
|
|
24
|
+
"Engine",
|
|
25
|
+
"Json",
|
|
26
|
+
"JsonUtilities",
|
|
27
|
+
"GameplayTags",
|
|
28
|
+
}
|
|
29
|
+
);
|
|
30
|
+
|
|
31
|
+
PrivateDependencyModuleNames.AddRange(
|
|
32
|
+
new string[]
|
|
33
|
+
{
|
|
34
|
+
"AIModule",
|
|
35
|
+
"AnimationEditor",
|
|
36
|
+
"AssetRegistry",
|
|
37
|
+
"AssetTools",
|
|
38
|
+
"AudioEditor",
|
|
39
|
+
"BlueprintGraph",
|
|
40
|
+
"Blutility",
|
|
41
|
+
"ContentBrowser",
|
|
42
|
+
"DataValidation",
|
|
43
|
+
"EditorScriptingUtilities",
|
|
44
|
+
"EditorStyle",
|
|
45
|
+
"EditorSubsystem",
|
|
46
|
+
"EditorWidgets",
|
|
47
|
+
"EnhancedInput",
|
|
48
|
+
"Foliage",
|
|
49
|
+
"GameplayAbilities",
|
|
50
|
+
"GameplayTasks",
|
|
51
|
+
"HTTP",
|
|
52
|
+
"InputCore",
|
|
53
|
+
"Kismet",
|
|
54
|
+
"KismetCompiler",
|
|
55
|
+
"Landscape",
|
|
56
|
+
"LevelEditor",
|
|
57
|
+
"LevelSequence",
|
|
58
|
+
"LiveCoding",
|
|
59
|
+
"MaterialEditor",
|
|
60
|
+
"MovieScene",
|
|
61
|
+
"MovieSceneTracks",
|
|
62
|
+
"NavigationSystem",
|
|
63
|
+
"Niagara",
|
|
64
|
+
"NiagaraEditor",
|
|
65
|
+
"PCG",
|
|
66
|
+
"PropertyEditor",
|
|
67
|
+
"PythonScriptPlugin",
|
|
68
|
+
"Sequencer",
|
|
69
|
+
"Slate",
|
|
70
|
+
"SlateCore",
|
|
71
|
+
"SubobjectDataInterface",
|
|
72
|
+
"ToolMenus",
|
|
73
|
+
"UMG",
|
|
74
|
+
"UMGEditor",
|
|
75
|
+
"UnrealEd",
|
|
76
|
+
"WebSockets",
|
|
77
|
+
"WorkspaceMenuStructure",
|
|
78
|
+
}
|
|
79
|
+
);
|
|
80
|
+
|
|
81
|
+
DynamicallyLoadedModuleNames.AddRange(
|
|
82
|
+
new string[]
|
|
83
|
+
{
|
|
84
|
+
}
|
|
85
|
+
);
|
|
86
|
+
}
|
|
87
|
+
}
|
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
{
|
|
2
|
+
"FileVersion": 3,
|
|
3
|
+
"Version": 1,
|
|
4
|
+
"VersionName": "0.3.0",
|
|
5
|
+
"FriendlyName": "UE MCP Bridge",
|
|
6
|
+
"Description": "C++ WebSocket bridge for UE-MCP, providing 185+ editor tools via MCP protocol",
|
|
7
|
+
"Category": "Developer Tools",
|
|
8
|
+
"CreatedBy": "UE-MCP",
|
|
9
|
+
"CreatedByURL": "",
|
|
10
|
+
"DocsURL": "",
|
|
11
|
+
"MarketplaceURL": "",
|
|
12
|
+
"SupportURL": "",
|
|
13
|
+
"EnabledByDefault": true,
|
|
14
|
+
"CanContainContent": false,
|
|
15
|
+
"IsBetaVersion": false,
|
|
16
|
+
"IsExperimentalVersion": false,
|
|
17
|
+
"Installed": false,
|
|
18
|
+
"Modules": [
|
|
19
|
+
{
|
|
20
|
+
"Name": "UE_MCP_Bridge",
|
|
21
|
+
"Type": "Editor",
|
|
22
|
+
"LoadingPhase": "Default"
|
|
23
|
+
}
|
|
24
|
+
],
|
|
25
|
+
"Plugins": [
|
|
26
|
+
{
|
|
27
|
+
"Name": "PythonScriptPlugin",
|
|
28
|
+
"Enabled": true
|
|
29
|
+
},
|
|
30
|
+
{
|
|
31
|
+
"Name": "DataValidation",
|
|
32
|
+
"Enabled": true
|
|
33
|
+
},
|
|
34
|
+
{
|
|
35
|
+
"Name": "EditorScriptingUtilities",
|
|
36
|
+
"Enabled": true
|
|
37
|
+
},
|
|
38
|
+
{
|
|
39
|
+
"Name": "EnhancedInput",
|
|
40
|
+
"Enabled": true
|
|
41
|
+
},
|
|
42
|
+
{
|
|
43
|
+
"Name": "GameplayAbilities",
|
|
44
|
+
"Enabled": true
|
|
45
|
+
},
|
|
46
|
+
{
|
|
47
|
+
"Name": "Niagara",
|
|
48
|
+
"Enabled": true
|
|
49
|
+
},
|
|
50
|
+
{
|
|
51
|
+
"Name": "PCG",
|
|
52
|
+
"Enabled": true
|
|
53
|
+
}
|
|
54
|
+
]
|
|
55
|
+
}
|