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,81 @@
|
|
|
1
|
+
#pragma once
|
|
2
|
+
|
|
3
|
+
#include "CoreMinimal.h"
|
|
4
|
+
#include "Dom/JsonValue.h"
|
|
5
|
+
#include "Dom/JsonObject.h"
|
|
6
|
+
#include "HandlerRegistry.h"
|
|
7
|
+
#include "GameThreadExecutor.h"
|
|
8
|
+
#include "HAL/Runnable.h"
|
|
9
|
+
#include "HAL/RunnableThread.h"
|
|
10
|
+
#include "HAL/ThreadSafeBool.h"
|
|
11
|
+
#include "Containers/Queue.h"
|
|
12
|
+
|
|
13
|
+
#if PLATFORM_WINDOWS
|
|
14
|
+
#include "Windows/AllowWindowsPlatformTypes.h"
|
|
15
|
+
#include <winsock2.h>
|
|
16
|
+
#include "Windows/HideWindowsPlatformTypes.h"
|
|
17
|
+
#endif
|
|
18
|
+
|
|
19
|
+
class FMCPBridgeServer : public FRunnable
|
|
20
|
+
{
|
|
21
|
+
public:
|
|
22
|
+
FMCPBridgeServer(int32 Port = 9877);
|
|
23
|
+
~FMCPBridgeServer();
|
|
24
|
+
|
|
25
|
+
// Start the server
|
|
26
|
+
bool Start();
|
|
27
|
+
|
|
28
|
+
// FRunnable interface
|
|
29
|
+
virtual bool Init() override;
|
|
30
|
+
virtual uint32 Run() override;
|
|
31
|
+
virtual void Stop() override;
|
|
32
|
+
virtual void Exit() override;
|
|
33
|
+
|
|
34
|
+
// Public stop method (calls FRunnable::Stop)
|
|
35
|
+
void Shutdown();
|
|
36
|
+
|
|
37
|
+
// Get handler registry
|
|
38
|
+
FMCPHandlerRegistry& GetHandlerRegistry() { return HandlerRegistry; }
|
|
39
|
+
|
|
40
|
+
// Process a JSON-RPC message
|
|
41
|
+
FString ProcessMessage(const FString& Message);
|
|
42
|
+
|
|
43
|
+
private:
|
|
44
|
+
// Server port
|
|
45
|
+
int32 ServerPort;
|
|
46
|
+
|
|
47
|
+
// Thread management
|
|
48
|
+
FRunnableThread* ServerThread;
|
|
49
|
+
FThreadSafeBool bShouldStop;
|
|
50
|
+
FThreadSafeBool bIsRunning;
|
|
51
|
+
|
|
52
|
+
// Handler registry
|
|
53
|
+
FMCPHandlerRegistry HandlerRegistry;
|
|
54
|
+
|
|
55
|
+
// Game thread executor
|
|
56
|
+
FMCPGameThreadExecutor GameThreadExecutor;
|
|
57
|
+
|
|
58
|
+
// JSON-RPC processing
|
|
59
|
+
TSharedPtr<FJsonObject> ParseJsonRpcRequest(const FString& Message);
|
|
60
|
+
FString CreateJsonRpcResponse(const TSharedPtr<FJsonObject>& Request, const TSharedPtr<FJsonValue>& Result);
|
|
61
|
+
FString CreateJsonRpcError(const TSharedPtr<FJsonObject>& Request, int32 ErrorCode, const FString& ErrorMessage);
|
|
62
|
+
|
|
63
|
+
// WebSocket connection handling
|
|
64
|
+
#if PLATFORM_WINDOWS
|
|
65
|
+
void HandleWebSocketConnection(SOCKET ClientSocketFD);
|
|
66
|
+
FString PerformWebSocketHandshake(SOCKET ClientSocketFD);
|
|
67
|
+
void ProcessWebSocketMessages(SOCKET ClientSocketFD);
|
|
68
|
+
FString ReadHttpRequest(SOCKET SocketFD);
|
|
69
|
+
#else
|
|
70
|
+
void HandleWebSocketConnection(int32 ClientSocketFD);
|
|
71
|
+
FString PerformWebSocketHandshake(int32 ClientSocketFD);
|
|
72
|
+
void ProcessWebSocketMessages(int32 ClientSocketFD);
|
|
73
|
+
FString ReadHttpRequest(int32 SocketFD);
|
|
74
|
+
#endif
|
|
75
|
+
FString CreateWebSocketAcceptKey(const FString& ClientKey);
|
|
76
|
+
TArray<uint8> CreateWebSocketFrame(const FString& Message);
|
|
77
|
+
FString ParseWebSocketFrame(const TArray<uint8>& Data);
|
|
78
|
+
|
|
79
|
+
// Server socket (will use platform-specific implementation)
|
|
80
|
+
void* ServerSocket;
|
|
81
|
+
};
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
#include "GameThreadExecutor.h"
|
|
2
|
+
#include "HAL/PlatformProcess.h"
|
|
3
|
+
#include "Async/Async.h"
|
|
4
|
+
|
|
5
|
+
FMCPGameThreadExecutor::FMCPGameThreadExecutor()
|
|
6
|
+
{
|
|
7
|
+
}
|
|
8
|
+
|
|
9
|
+
FMCPGameThreadExecutor::~FMCPGameThreadExecutor()
|
|
10
|
+
{
|
|
11
|
+
}
|
|
12
|
+
|
|
13
|
+
bool FMCPGameThreadExecutor::IsGameThread()
|
|
14
|
+
{
|
|
15
|
+
return IsInGameThread();
|
|
16
|
+
}
|
|
17
|
+
|
|
18
|
+
TSharedPtr<FJsonValue> FMCPGameThreadExecutor::ExecuteOnGameThread(FHandlerFunction Handler, const TSharedPtr<FJsonObject>& Params, float TimeoutSeconds)
|
|
19
|
+
{
|
|
20
|
+
if (IsGameThread())
|
|
21
|
+
{
|
|
22
|
+
// Already on game thread, execute directly
|
|
23
|
+
return Handler(Params);
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
// Execute on game thread via AsyncTask
|
|
27
|
+
TSharedPtr<TFuture<TSharedPtr<FJsonValue>>> Future = MakeShared<TFuture<TSharedPtr<FJsonValue>>>(
|
|
28
|
+
Async(EAsyncExecution::TaskGraphMainThread, [Handler, Params]() -> TSharedPtr<FJsonValue>
|
|
29
|
+
{
|
|
30
|
+
return Handler(Params);
|
|
31
|
+
})
|
|
32
|
+
);
|
|
33
|
+
|
|
34
|
+
// Wait for result with timeout
|
|
35
|
+
double StartTime = FPlatformTime::Seconds();
|
|
36
|
+
while (!Future->IsReady())
|
|
37
|
+
{
|
|
38
|
+
if (FPlatformTime::Seconds() - StartTime > TimeoutSeconds)
|
|
39
|
+
{
|
|
40
|
+
// Timeout
|
|
41
|
+
TSharedPtr<FJsonObject> ErrorObject = MakeShared<FJsonObject>();
|
|
42
|
+
ErrorObject->SetStringField(TEXT("error"), TEXT("Handler execution timed out"));
|
|
43
|
+
return MakeShared<FJsonValueObject>(ErrorObject);
|
|
44
|
+
}
|
|
45
|
+
FPlatformProcess::Sleep(0.01f); // 10ms sleep
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
return Future->Get();
|
|
49
|
+
}
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
#pragma once
|
|
2
|
+
|
|
3
|
+
#include "CoreMinimal.h"
|
|
4
|
+
#include "Dom/JsonValue.h"
|
|
5
|
+
#include "Dom/JsonObject.h"
|
|
6
|
+
#include "Async/Async.h"
|
|
7
|
+
#include "HAL/PlatformProcess.h"
|
|
8
|
+
|
|
9
|
+
class FMCPGameThreadExecutor
|
|
10
|
+
{
|
|
11
|
+
public:
|
|
12
|
+
// Handler function signature
|
|
13
|
+
using FHandlerFunction = TFunction<TSharedPtr<FJsonValue>(const TSharedPtr<FJsonObject>& Params)>;
|
|
14
|
+
|
|
15
|
+
FMCPGameThreadExecutor();
|
|
16
|
+
~FMCPGameThreadExecutor();
|
|
17
|
+
|
|
18
|
+
// Execute handler on game thread with timeout
|
|
19
|
+
TSharedPtr<FJsonValue> ExecuteOnGameThread(FHandlerFunction Handler, const TSharedPtr<FJsonObject>& Params, float TimeoutSeconds = 30.0f);
|
|
20
|
+
|
|
21
|
+
// Check if we're on game thread
|
|
22
|
+
static bool IsGameThread();
|
|
23
|
+
|
|
24
|
+
private:
|
|
25
|
+
// Pending execution info
|
|
26
|
+
struct FPendingExecution
|
|
27
|
+
{
|
|
28
|
+
FHandlerFunction Handler;
|
|
29
|
+
TSharedPtr<FJsonObject> Params;
|
|
30
|
+
TSharedPtr<TFuture<TSharedPtr<FJsonValue>>> Future;
|
|
31
|
+
double StartTime;
|
|
32
|
+
float TimeoutSeconds;
|
|
33
|
+
};
|
|
34
|
+
|
|
35
|
+
TArray<FPendingExecution> PendingExecutions;
|
|
36
|
+
FCriticalSection ExecutionMutex;
|
|
37
|
+
};
|
|
@@ -0,0 +1,75 @@
|
|
|
1
|
+
#include "HandlerRegistry.h"
|
|
2
|
+
#include "HAL/PlatformFilemanager.h"
|
|
3
|
+
#include "Misc/FileHelper.h"
|
|
4
|
+
#include "Misc/Paths.h"
|
|
5
|
+
|
|
6
|
+
FMCPHandlerRegistry::FMCPHandlerRegistry()
|
|
7
|
+
{
|
|
8
|
+
}
|
|
9
|
+
|
|
10
|
+
FMCPHandlerRegistry::~FMCPHandlerRegistry()
|
|
11
|
+
{
|
|
12
|
+
Clear();
|
|
13
|
+
}
|
|
14
|
+
|
|
15
|
+
void FMCPHandlerRegistry::RegisterHandler(const FString& MethodName, FHandlerFunction Handler)
|
|
16
|
+
{
|
|
17
|
+
CppHandlers.Add(MethodName, Handler);
|
|
18
|
+
}
|
|
19
|
+
|
|
20
|
+
void FMCPHandlerRegistry::RegisterPythonHandler(const FString& MethodName, const FString& PythonScriptPath)
|
|
21
|
+
{
|
|
22
|
+
FPythonHandlerInfo Info;
|
|
23
|
+
Info.ScriptPath = PythonScriptPath;
|
|
24
|
+
Info.HandlerName = MethodName;
|
|
25
|
+
PythonHandlers.Add(MethodName, Info);
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
TSharedPtr<FJsonValue> FMCPHandlerRegistry::ExecuteHandler(const FString& MethodName, const TSharedPtr<FJsonObject>& Params)
|
|
29
|
+
{
|
|
30
|
+
// Try C++ handler first
|
|
31
|
+
if (CppHandlers.Contains(MethodName))
|
|
32
|
+
{
|
|
33
|
+
return CppHandlers[MethodName](Params);
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
// Try Python handler
|
|
37
|
+
if (PythonHandlers.Contains(MethodName))
|
|
38
|
+
{
|
|
39
|
+
return ExecutePythonHandler(MethodName, Params);
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
// Handler not found - return nullptr so BridgeServer sends "Unknown method" error
|
|
43
|
+
return nullptr;
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
bool FMCPHandlerRegistry::HasHandler(const FString& MethodName) const
|
|
47
|
+
{
|
|
48
|
+
return CppHandlers.Contains(MethodName) || PythonHandlers.Contains(MethodName);
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
TArray<FString> FMCPHandlerRegistry::GetHandlerNames() const
|
|
52
|
+
{
|
|
53
|
+
TArray<FString> Names;
|
|
54
|
+
CppHandlers.GetKeys(Names);
|
|
55
|
+
|
|
56
|
+
TArray<FString> PythonNames;
|
|
57
|
+
PythonHandlers.GetKeys(PythonNames);
|
|
58
|
+
Names.Append(PythonNames);
|
|
59
|
+
|
|
60
|
+
return Names;
|
|
61
|
+
}
|
|
62
|
+
|
|
63
|
+
void FMCPHandlerRegistry::Clear()
|
|
64
|
+
{
|
|
65
|
+
CppHandlers.Empty();
|
|
66
|
+
PythonHandlers.Empty();
|
|
67
|
+
}
|
|
68
|
+
|
|
69
|
+
TSharedPtr<FJsonValue> FMCPHandlerRegistry::ExecutePythonHandler(const FString& MethodName, const TSharedPtr<FJsonObject>& Params)
|
|
70
|
+
{
|
|
71
|
+
// TODO: Implement Python handler execution
|
|
72
|
+
// For now, return empty result
|
|
73
|
+
// Will be implemented when Python plugin system is added
|
|
74
|
+
return MakeShared<FJsonValueObject>(MakeShared<FJsonObject>());
|
|
75
|
+
}
|
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
#pragma once
|
|
2
|
+
|
|
3
|
+
#include "CoreMinimal.h"
|
|
4
|
+
#include "Dom/JsonValue.h"
|
|
5
|
+
#include "Dom/JsonObject.h"
|
|
6
|
+
|
|
7
|
+
class FMCPHandlerRegistry
|
|
8
|
+
{
|
|
9
|
+
public:
|
|
10
|
+
// Handler function signature: takes params JSON object, returns result JSON value
|
|
11
|
+
using FHandlerFunction = TFunction<TSharedPtr<FJsonValue>(const TSharedPtr<FJsonObject>& Params)>;
|
|
12
|
+
|
|
13
|
+
// Python handler info
|
|
14
|
+
struct FPythonHandlerInfo
|
|
15
|
+
{
|
|
16
|
+
FString ScriptPath;
|
|
17
|
+
FString HandlerName;
|
|
18
|
+
};
|
|
19
|
+
|
|
20
|
+
FMCPHandlerRegistry();
|
|
21
|
+
~FMCPHandlerRegistry();
|
|
22
|
+
|
|
23
|
+
// Register a C++ handler
|
|
24
|
+
void RegisterHandler(const FString& MethodName, FHandlerFunction Handler);
|
|
25
|
+
|
|
26
|
+
// Register a Python handler
|
|
27
|
+
void RegisterPythonHandler(const FString& MethodName, const FString& PythonScriptPath);
|
|
28
|
+
|
|
29
|
+
// Execute a handler
|
|
30
|
+
TSharedPtr<FJsonValue> ExecuteHandler(const FString& MethodName, const TSharedPtr<FJsonObject>& Params);
|
|
31
|
+
|
|
32
|
+
// Check if handler exists
|
|
33
|
+
bool HasHandler(const FString& MethodName) const;
|
|
34
|
+
|
|
35
|
+
// Get all registered handler names
|
|
36
|
+
TArray<FString> GetHandlerNames() const;
|
|
37
|
+
|
|
38
|
+
// Clear all handlers
|
|
39
|
+
void Clear();
|
|
40
|
+
|
|
41
|
+
private:
|
|
42
|
+
// C++ handlers
|
|
43
|
+
TMap<FString, FHandlerFunction> CppHandlers;
|
|
44
|
+
|
|
45
|
+
// Python handlers
|
|
46
|
+
TMap<FString, FPythonHandlerInfo> PythonHandlers;
|
|
47
|
+
|
|
48
|
+
// Execute Python handler
|
|
49
|
+
TSharedPtr<FJsonValue> ExecutePythonHandler(const FString& MethodName, const TSharedPtr<FJsonObject>& Params);
|
|
50
|
+
};
|