Files
BlueRoseNote/07-Other/AI/AI Agent/UnrealEngine/UnrealMcp/UE5.8 MCP.md

745 lines
43 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# UE5.8 MCP Toolsets 分析
## 总体架构
所有Toolset都位于 `Engine\Plugins\Experimental\Toolsets`共18个插件。它们通过 `ToolsetRegistry` 插件(核心基础设施)将 AI-callable 工具暴露给 MCP 系统(如 UnrealMCP
### 功能维度总览
#### 核心编辑器操作
| Toolset | 核心功能 |
| ------------------------------------------------------------------------------ | ---------------------------------------- |
| [[#11. SlateInspectorToolset —— UI 自动化Playwright 风格)\|SlateInspectorToolset]] | Playwright 风格 UI 自动化点击、输入、截图、widget 树快照 |
| [[#六、MCP 运行时实际检测\|EditorAppToolset]] | 控制台变量、资产成像、Actor/资产选择、视口相机、内容浏览器导航 |
| [[#六、MCP 运行时实际检测\|LogsToolset]] | 输出日志读取、日志类别详细级别控制 |
| [[#六、MCP 运行时实际检测\|SceneTools]] | 关卡加载/放置/移除 Actor、相机、Outliner 文件夹管理 |
| [[#六、MCP 运行时实际检测\|PrimitiveTools]] | 图元几何组件(球体、立方体等)添加 |
| [[#6. LiveCodingToolset —— 热编译\|LiveCodingToolset]] | 编辑器运行时 C++ 热编译 |
#### 资产与资源管理
| Toolset | 核心功能 |
|---------|----------|
| [[#六、MCP 运行时实际检测\|AssetTools]] | 资产搜索/加载/保存/删除/移动/复制,文件读写 |
| [[#六、MCP 运行时实际检测\|ObjectTools]] | UObject / UClass 属性检查/修改,子类发现 |
| [[#六、MCP 运行时实际检测\|BlueprintTools]] | Blueprint 蓝图操作 |
| [[#六、MCP 运行时实际检测\|MaterialTools]] | Material 创建/编辑及表达式图 |
| [[#六、MCP 运行时实际检测\|MaterialInstanceTools]] | MaterialInstanceConstant 创建/修改 |
| [[#六、MCP 运行时实际检测\|TextureTools]] | Texture 资产操作 |
| [[#六、MCP 运行时实际检测\|StaticMeshTools]] | 静态网格检查与修改 |
| [[#六、MCP 运行时实际检测\|SkeletalMeshTools]] | 骨骼网格检查与修改(网格/材质/骨骼/插槽) |
| [[#六、MCP 运行时实际检测\|CurveTableTools]] | CurveTable 创建/编辑 |
| [[#六、MCP 运行时实际检测\|DataTableTools]] | DataTable 创建/编辑 |
| [[#六、MCP 运行时实际检测\|DataAssetTools]] | DataAsset 操作 |
| [[#六、MCP 运行时实际检测\|StringTableTools]] | StringTable 创建/编辑 |
| [[#12. UMGToolSet —— UMG Widget 蓝图\|UMGToolSet]] | UMG Widget Blueprint 创建/修改/编译 |
#### Gameplay
| Toolset | 核心功能 |
|---------|----------|
| [[#4. GASToolsets —— Gameplay Ability System 工具集 (3合1)\|GASToolsets]] | GAS 运行时检测 + AttributeSet 发现 + GameplayCue 管理 |
| [[#5. GameplayTagsToolset —— GameplayTag 管理\|GameplayTagsToolset]] | GameplayTag 增删改查 + 引用者搜索 |
| [[#13. WorldConditionsToolset —— 世界条件检查\|WorldConditionsToolset]] | 世界条件查询/条件描述 |
| [[#六、MCP 运行时实际检测\|ActorTools]] | Actor 变换/标签/父子关系/组件检查修改 |
| [[#9. PhysicsToolsets —— 物理资产\|PhysicsToolsets]] | 物理资产:碰撞体、形状、约束创建/编辑 |
| [[#16. ConversationToolset\|ConversationToolset]] | 对话图资产检查Python 实现) |
| [[#17. StateTreeToolset\|StateTreeToolset]] | StateTree 结构检查与导航Python 实现) |
#### Sequence
| Toolset | 核心功能 |
|---------|----------|
| [[#10. SequencerAnimMixerToolset —— Sequencer 动画混合器\|SequencerAnimMixerToolset]] | Sequencer 动画混合器:层/动画内容/过渡/装饰 |
#### 动画系统
| Toolset | 核心功能 |
|---------|----------|
| [[#15. AnimationAssistantToolset\|AnimationAssistantToolset]] | Control Rig + Sequencer 全套动画工具(超大 Python 实现8 类 100+ 工具) |
#### 特效系统 (Niagara)
| Toolset | 核心功能 |
|---------|----------|
| [[#8. NiagaraToolsets —— Niagara 粒子系统 (4合1)\|NiagaraToolsets]] | Niagara 系统/发射器/模块/渲染器 CRUD + 编译诊断 + 组件操作 |
#### PCG
| Toolset | 核心功能 |
|---------|----------|
| [[#2. DataflowAgent —— Dataflow 图编辑\|DataflowAgent]] | Dataflow 图编辑Geometry Collection 破坏系统) |
#### 测试与配置
| Toolset | 核心功能 |
|---------|----------|
| [[#1. AutomationTestToolset —— 自动化测试\|AutomationTestToolset]] | 自动化测试框架:发现、列出、运行、结果获取 |
#### 插件与功能管理
| Toolset | 核心功能 |
|---------|----------|
| [[#3. GameFeaturesToolset —— 游戏功能插件管理\|GameFeaturesToolset]] | GameFeature 插件列出/检查/创建 |
| [[#7. MCPClientToolset —— MCP 客户端桥接\|MCPClientToolset]] | 外部 MCP 服务器桥接SSE/StreamableHTTP/OAuth |
#### 其他工具
| Toolset | 核心功能 |
|---------|----------|
| [[#六、MCP 运行时实际检测\|ProgrammaticToolset]] | 沙盒 Python 脚本执行,可编排调用其他工具 |
| [[#六、MCP 运行时实际检测\|AgentSkillToolset]] | Agent Skill 的列表/读取/创建/更新 |
| [[#14. AIModuleToolset\|AIModuleToolset]] | 行为树检查与导航Python 实现) |
> 以上 3 个工具集均有 Python 实现C++ 模块仅负责加载插件,实际逻辑和工具注册均在 Python 侧完成。
### MCP 服务器连接配置
```json
{
"mcpServers": {
"ue-mcp": {
"type": "http",
"url": "http://localhost:8000/mcp"
}
}
}
```
### MCP 核心工具 (3个)
| 工具 | 功能 |
|------|------|
| `list_toolsets` | 列出所有可用工具集及其描述 |
| `describe_toolset` | 获取工具集的详细信息(工具名、描述、输入 schema|
| `load_toolset` | 加载工具集,将其工具注册为原生 MCP 工具(下一轮生效)|
### 核心概念
- **UToolsetDefinition**: 所有工具集的基类,定义了一组 AI-callable 工具的接口
- **meta=(AICallable)**: UFUNCTION 标记,被 ToolsetRegistry 识别并暴露为 MCP 工具
- **UToolsetRegistry::RegisterToolsetClass**: 运行时注册工具集
- **FToolsetJsonConverter**: 自定义 JSON 序列化/反序列化器,用于非标准类型
- **UAgentSkill**: 为 AI 提供 prompt 上下文的辅助类
- **UToolCallAsyncResult** / **UToolCallAsyncResultString**: 长时间异步操作的结果包装
### 实现模式分类
| 模式 | 使用方 |
|------|--------|
| **UToolsetDefinition + 静态 AICallable 函数** | 几乎所有已实现的工具集 |
| **EditorSubsystem 生命周期管理** | AutomationTest, LiveCoding, SlateInspector, MCPClient |
| **多工具集模块注册** | GASToolsets (3个), NiagaraToolsets (4个) |
| **ON_SCOPE_EXIT 回滚保护** | GameFeaturesToolset |
| **纯 Python 实现 (C++ 模块仅作加载器)** | AIModuleToolset, AnimationAssistant, ConversationToolset, StateTreeToolset |
| **Python + C++ 混合实现** | SequencerAnimMixerToolset (仅 Python), NiagaraToolsets (C++ + Python 注册)
---
## 一、已完整实现的 Toolset
### 1. AutomationTestToolset —— 自动化测试
- **功能**: 暴露 UE5 自动化测试框架,发现、列出、过滤、运行测试,获取结果
- **模块**: `AutomationTestToolset` + `AutomationTestToolsetTests`
- **架构**: `UAutomationTestToolset` (静态工具类) + `UAutomationTestToolsetSubsystem` (EditorSubsystem 管理 IAutomationControllerManager 生命周期)
- **AI 工具 (6个)**:
- `DiscoverTests()` - 初始化 worker 发现 (异步)
- `ListTests(NameFilter, TagFilter, Limit)` - 列出测试路径 JSON
- `RunTests(TestNames)` - 运行指定测试 (异步)
- `GetTestResults()` - 获取结果 JSON (状态/耗时/错误/警告)
- `GetTestStatus()` - 轻量状态查询
- `StopTests()` - 停止当前运行
- **关键实现**: 订阅 `OnTestsRefreshed` delegate60秒发现超时递归收集报告树叶子节点
### 2. DataflowAgent —— Dataflow 图编辑
- **功能**: 完整的 Dataflow 图(用于破坏/模拟,如 Geometry Collection编辑18个 MCP 工具
- **模块**: `DataflowAgent` (Editor)
- **架构**: `UDataflowAgentToolset` + `UDataflowGraphEditingSkill` (AgentSkill)
- **AI 工具 (17个)**:
- **图**: `CreateGraph`, `GetGraphStructure`
- **节点类型**: `ListNodeTypes`, `GetNodeTypeSchema`
- **节点操作**: `AddNode`, `UpdateNode`, `GetNodeInfo`, `RepositionNode`, `RemoveNode`
- **连接**: `ConnectNodePins`, `DisconnectNodePins`
- **变量**: `ListVariables`, `AddVariable`, `RemoveVariable`, `SetVariable`
- **注释**: `AddCommentBox`, `RemoveCommentBox`
- **关键实现**: `FScopedTransaction` 撤销支持,`FJsonObjectConverter::JsonValueToUProperty` 类型转换,变量类型系统支持基础类型/结构体/对象
### 3. GameFeaturesToolset —— 游戏功能插件管理
- **功能**: 列出、检查、创建 Game Feature 插件
- **模块**: `GameFeaturesToolset` (Editor)
- **架构**: `UGameFeaturesToolset` (静态工具类)
- **AI 工具 (5个)**:
- `ListGameFeatures()` - 列出所有 GFP
- `FindGameFeatureData(PluginName)` - 加载 UGameFeatureData 资产
- `GetPluginName(Data)` - 获取插件名
- `GetActions(Data)` - 获取所有 UGameFeatureAction
- `CreateGameFeaturePlugin(PluginName, Description)` - 完整创建流程
- **关键实现**: `ON_SCOPE_EXIT` + `bCommitted` 标志的回滚模式7步目录→.uplugin→挂载→资产→保存验证仅允许字母数字和下划线
### 4. GASToolsets —— Gameplay Ability System 工具集 (3合1)
- **功能**: GAS 运行时检测 + 属性集发现 + GameplayCue 完整生命周期管理
- **模块**: `GASToolsets` (Editor)包含3个独立工具集
- **架构**: 模块注册三个 UToolsetDefinition 子类
#### 4a. UAbilitySystemInspectorToolset (4个工具)
- `GetAttributeValues(Actor)` - 获取所有属性的 Base/Current 值
- `GetActiveEffects(Actor)` - 活跃效果 (堆栈/持续时间/剩余/标签)
- `GetGrantedAbilities(Actor)` - 已授予的技能
- `GetActiveTags(Actor)` - 拥有的 GameplayTag
#### 4b. UAttributeSetToolset (2个工具)
- `FindAttributeSetClasses()` - 发现所有 AttributeSet 子类及其属性
- `ListAttributes(ClassName)` - 列出特定类的属性
#### 4c. UGameplayCueToolset (8个工具)
- `ListCues(ParentTag)` - 列出派生 Cue 标签
- `GetCueInfo(CueTag)` - 获取通知资产路径
- `ExecuteCueOnSelectedActor(...)` - 在选中 Actor 上触发 Cue
- `FindCueNotifyAssets(ParentTag)` - 查找通知资产
- `CreateCueNotifyAsset(...)` - 创建 Blueprint GCN 资产
- `AddCueTag(CueTag, Comment)` - 添加 Cue 标签到 INI
- `RemoveCueTag(CueTag)` - 移除标签
- `FindCueTagsWithoutNotifies()` - 查找缺少通知资产的标签
### 5. GameplayTagsToolset —— GameplayTag 管理
- **功能**: 完整的 GameplayTag 管理(增删改查 + 引用者搜索)
- **模块**: `GameplayTagsToolset` (Editor)
- **AI 工具 (6个)**:
- `ListTags(ParentTag)` - BFS 遍历子标签
- `GetTagInfo(TagName)` - 注释/来源/子标签
- `AddTag`, `RemoveTag`, `RenameTag` - 需用户权限确认
- `FindReferencersByTag(TagName)` - 资产引用搜索
### 6. LiveCodingToolset —— 热编译
- **功能**: 触发 Live Coding 编译,收集编译日志和错误
- **模块**: `LiveCodingToolset` (Editor)
- **AI 工具 (1个)**:
- `CompileLiveCoding()` - 触发编译并返回结果 + MSVC 诊断
- **关键实现**: 线程安全日志捕获 (`FLiveCodingOutputCollector` 实现 `FOutputDevice`),时间戳检测 UBT Log.txt`#if WITH_LIVE_CODING` 守卫
### 7. MCPClientToolset —— MCP 客户端桥接
- **功能**: 将 Unreal Editor 连接到外部 MCP 服务器,将其工具呈现给 AI
- **模块**: `MCPClientToolset` (Editor)
- **架构**: `FMCPClientToolset` (FToolset 子类) + `UMCPClientToolsetSubsystem` + `UMCPToolsetSettings` (DeveloperSettings)
- **AI 工具**: 动态,取决于连接的外部 MCP 服务器
- **传输协议**:
- Legacy SSE: GET `/sse` + POST `/message`
- Streamable HTTP: 单一 POST 端点
- OAuth 2.0 + PKCE: 完整 OAuth 流程
- **关键实现**: SPSC 队列跨线程流式传输JSON-RPC 2.0 与 TPromise/TFutureSHA-256 实现用于 PKCE
### 8. NiagaraToolsets —— Niagara 粒子系统 (4合1)
- **功能**: Niagara 系统/发射器/模块/渲染器的完整 CRUD + 运行时组件操作 + 编译诊断
- **模块**: `NiagaraToolsets` (Editor)
- **架构**: 基类 `UNiagaraToolset` + 4个专用子工具集 + 2个 JSON 转换器 + 1个 AgentSkill
#### 8a. UNiagaraToolset_Info
- `UEnum_Info` - 枚举查找
- `GetAssetDiscoveryInfo` - 资产发现路径
- `UAgentSkill_NiagaraBase` - AI prompt 增强
#### 8b. UNiagaraToolset_System (最大的工具集)
- **Schema**: GetSystemSchema, GetEmitterSchema, GetRendererSchema, GetDataInterfaceSchema, GetStackInputSchema, GetModuleSchema, GetDynamicInputSchema (+ 基于资产的变体)
- **Topology**: GetSystemTopology, GetScriptStackTopology, GetEmitterTopology, GetModuleTopology, GetStackInputTopology
- **Data**: GetUserVariables, GetSystemData, GetEmitterData, GetRendererData, GetStackInputData
- **Edit**: SetSystemData, SetEmitterData, SetRendererData, AddUserVariables, RemoveUserVariables, AddEmitter, RemoveEmitter, AddRenderer, RemoveRenderer, AddModule, RemoveModule, SetModuleEnabled, AddSetParametersModule, AddSetParameterEntry, RemoveSetParameterEntry, SetStackInputData
- **Diagnostics**: GetSystemCompileState, GetStackIssues, ApplyStackIssueFix (全部异步)
#### 8c. UNiagaraToolset_Component
- `SetSystem`, `GetUserVariables`, `SetVariable`, `GetVariable`
#### 8d. UNiagaraToolset_Blueprint
- `ConstructNiagaraBPWrapperFromSystem`, `ConstructNiagaraBPWrapperFromComponent`
### 9. PhysicsToolsets —— 物理资产
- **功能**: 创建和操作物理资产(碰撞体、形状、约束)
- **模块**: `PhysicsToolsets` (Editor)
- **架构**: `UPhysicsAssetToolset`
- **AI 工具 (14个)**:
- **形状**: SetSphere, SetCapsule, SetBox, RemoveShape (upsert 模式)
- **体 CRUD**: AddBody, RemoveBody, GetBodyNames
- **体属性**: Get/SetBodyPhysicsMode, Get/SetBodyMassScale
- **约束**: GetConstraints, AddConstraint, SetConstraintLimits, RemoveConstraint
- **创建**: CreateFromMesh
- **关键实现**: 使用 Chaos 物理引擎类型Modify() 撤销支持RemoveBody 级联删除约束
### 10. SequencerAnimMixerToolset —— Sequencer 动画混合器
- **功能**: Sequencer 动画混合器轨道管理(纯 Python 实现)
- **模块**: 无 C++ 模块,纯 Python (`Content/Python/`)
- **架构**: Python 类 `SequencerAnimMixerTools` 装饰为 `unreal.ToolsetDefinition`
- **AI 工具 (20个)**:
- **Layers & Content (11个)**: get_mixer_layers, get_mixer_layer_count, add_mixer_layer, insert_mixer_layer, add_animation_to_mixer, add_child_track_to_layer, get/set_layer_name, get_layer_sections, get_layer_index, is_layer_empty
- **Transitions (5个)**: get_transitions_for_section, get_transition_between, get_transition_info, change_transition_type, get_transition_name
- **Decorations (5个)**: get_compatible_decorations, get_decorations, find_decoration, add_decoration, remove_decoration
### 11. SlateInspectorToolset —— UI 自动化Playwright 风格)
- **功能**: Slate UI 检查和自动化AI 可驱动编辑器界面的点击/输入/截图
- **模块**: `SlateInspectorToolset` (Editor) + `SlateInspectorToolsetTests`
- **架构**: `USlateInspectorToolset` + 3个支持系统:
- **RefCache**: SWidget ↔ ref string 双向映射,按角色前缀计数器分配 (如 "b1", "b2")
- **SnapshotRenderer**: DFS 遍历 widget 树,缩进文本快照,结构容器省略
- **ObserverManager**: ~100ms 间隔连续子树观察,缓存快照
- **AI 工具 (14个)**:
- **检查**: Snapshot, Observe/Unobserve/ListObservers, Screenshot, WaitFor
- **交互**: Click (左右中/修饰符/双击), Hover, Type (逐字符+提交), PressKey (组合键), SelectOption (下拉选择), Drag (鼠标拖动), FillForm (批量表单)
- **窗口**: Windows (列表/选择/关闭)
- **关键实现**: 使用直接 Slate 事件 API 而非 AutomationDriver避免死锁SelectOption 打开下拉→Tick两次→搜索文本→点击
### 12. UMGToolSet —— UMG Widget 蓝图
- **功能**: 通过反射创建和操作 UMG Widget Blueprint
- **模块**: `UMGToolSet` (EditorNoCommandlet)
- **架构**: `UUMGToolSet`
- **AI 工具 (11个)**:
- **创建**: CreateWidgetBlueprint, AddWidget, SetNamedSlotContent
- **查询**: GetWidgets (深度优先树), GetNamedSlots, ListWidgetBlueprints, ListWidgetClasses
- **修改**: MoveWidget, RemoveWidget, RenameWidget, SetWidgetAsVariable, ReparentWidgetBlueprint
- **生命周期**: CompileWidgetBlueprint
- **关键实现**: BindWidget 属性验证ContentWidget 单子容器检测GUID 管理,编译错误收集(图节点 + MessageLog类路径解析
### 13. WorldConditionsToolset —— 世界条件检查
- **功能**: 获取世界条件查询和人可读描述
- **模块**: `WorldConditionsToolset` (Editor)
- **架构**: `UWorldConditionTools` + `FWorldConditionQueryConverter` (JSON 转换器)
- **AI 工具 (2个)**:
- `GetQueryDescription(FWorldConditionQueryDefinition)` - 查询描述
- `GetConditionDescription(FInstancedStruct)` - 条件描述
---
## 二、Python 实现的 ToolsetC++ 模块仅为加载器)
### 14. AIModuleToolset —— 行为树 AI 工具
- **功能**: 行为树检查和导航Python 实现)
- **C++ 模块**: `AIModuleToolset` (Editor, PostEngineInit) — 空 `StartupModule`,仅负责加载插件
- **Python 实现**: `Content/Python/aimodule_toolset/toolsets/behavior_tree.py`
- **注册方式**: `Registration([BehaviorTreeTools])`
- **AI 工具 (7个)**:
- `get_blackboard(behavior_tree)` - 获取 BlackboardData 资产
- `get_root_decorators(behavior_tree)` - 根级 BTDecorator
- `list_nodes(behavior_tree)` - DFS 遍历所有 BTNode
- `get_node_depth(behavior_tree, node_index)` - 节点在树中的深度
- `get_node_depths(behavior_tree)` - 所有节点深度
- `get_children(composite)` - Composite 节点的直接子节点
- `get_subtree(node)` - RunBehavior 任务引用的子 BT
### 15. AnimationAssistantToolset —— 动画与 Sequencer 工具集(超大型 Python 实现)
- **功能**: 最庞大的工具集,覆盖 Control Rig、Sequencer、关键帧、大纲、条件、自定义绑定、导入导出
- **C++ 模块**: `AnimationAssistantToolset` (Editor, PostEngineInit) — 空 `StartupModule`
- **Python 实现**: `Content/Python/animation_toolset/toolsets/` (21 个文件,~5000+ 行代码)
- **注册方式**: `init_unreal.py` 直接调用 `register_toolset_class()` 注册 8 个类
- **8 个子工具集**:
| 类 | 领域 | 工具数 |
|----|------|--------|
| `ControlRigTools` | 层级管理、图操作、节点/Pin 管理、变量 | 30+ |
| `SequencerTools` | Level Sequence 生命周期、回放、绑定、轨道、段、文件夹、复制粘贴、标签、烘焙 | 70+ |
| `SequencerKeyframingTools` | 关键帧增删、float/bool/int/string 通道、插值、默认值 | |
| `SequencerControlRigTools` | Sequencer 中 CR 控制值读写、关键帧、烘焙、空间切换 | |
| `SequencerOutlinerTools` | 大纲树检查、选择、折叠/展开、静音/独奏/锁定 | |
| `SequencerConditionTools` | 轨道/段运行时条件(平台/蓝图/组条件) | |
| `SequencerCustomBindingTools` | 转换 possessable/spawnable/自定义绑定,修改 Actor 模板类 | |
| `SequencerImportExportTools` | FBX 导入/导出、AnimSequence 导出 | |
### 16. ConversationToolset —— 对话图检查
- **功能**: 检查 Conversation Graph (UConversationDatabase) 对话资产Python 实现)
- **C++ 模块**: `ConversationToolset` (Editor, PostEngineInit) — 空 `StartupModule`
- **Python 实现**: `Content/Python/conversation_toolset/toolsets/conversation.py`
- **注册方式**: `Registration([ConversationTools])`
- **AI 工具 (7个)**:
- `list_entry_points(conversation)` - 入口点列表
- `list_speakers(conversation)` - 说话者/参与者信息
- `get_all_nodes(conversation)` - 所有可达 ConversationNode
- `get_node_guids(conversation)` - 所有节点 GUID
- `get_node_by_guid(conversation, guid)` - 按 GUID 查找节点
- `get_node_connections(node)` - 输出连接 GUID (需要 ConversationNodeWithLinks)
- `get_sub_nodes(node)` - 任务节点的子节点
### 17. StateTreeToolset —— 状态树检查
- **功能**: StateTree 状态树结构检查和导航Python 实现)
- **C++ 模块**: `StateTreeToolset` (Editor, PostEngineInit) — 空 `StartupModule`
- **Python 实现**: `Content/Python/state_tree_toolset/toolsets/state_tree.py`
- **注册方式**: `Registration([StateTreeTools])`
- **AI 工具 (8个)**:
- `get_editor_data(state_tree)` - 获取 StateTreeEditorData
- `get_root_states(state_tree)` - 顶级状态
- `get_children(state)` - 状态子节点
- `get_tasks(state)` - 状态上的任务
- `get_enter_conditions(state)` - 进入条件
- `get_transitions(state)` - 状态转换
- `get_global_tasks(state_tree)` - 全局任务
- `get_evaluators(state_tree)` - 全局求值器
- `get_node_description(state_tree, node)` - 节点可读描述
---
## 三、启用工具集的建议配置
根据实际需求选择:
| 场景 | 需要的工具集 |
| ----------------------- | ------------------------- |
| C++ 编译辅助 | LiveCodingToolset |
| 自动化测试 | AutomationTestToolset |
| Gameplay Ability System | GASToolsets |
| Gameplay 标签管理 | GameplayTagsToolset |
| Niagara 粒子/特效 | NiagaraToolsets |
| 物理资产 | PhysicsToolsets |
| Dataflow/破坏系统 | DataflowAgent |
| UMG UI 构建 | UMGToolSet |
| Sequencer 动画混合 | SequencerAnimMixerToolset |
| 编辑器 UI 自动化 | SlateInspectorToolset |
| 外部 MCP 服务器 | MCPClientToolset |
| GameFeature 插件 | GameFeaturesToolset |
| 世界条件 | WorldConditionsToolset |
| 行为树 AI | AIModuleToolset |
| Sequencer + Control Rig | AnimationAssistantToolset |
| 对话系统 | ConversationToolset |
| 状态树 | StateTreeToolset |
---
# 第三方 MCP 比较
## 概述
调研了 8 个第三方 Unreal MCP 开源仓库,均为 GitHub 社区项目。它们与官方 UE5.8 ToolsetRegistry 在架构理念、传输协议和实现方式上有本质差异。
## 各仓库速览
| 仓库 | 连接方式 | 需要插件? | 传输 | 语言 | 工具数 | UE 版本 | 核心定位 |
|------|---------|----------|------|------|--------|---------|---------|
| appleweed_UnrealMCPBridge | TCP | C++ 插件 | TCP :9000 | Python | ~35 | 5.5+ | 编辑器自动化 + Insights 性能追踪 |
| ChiR24_Unreal_mcp | HTTP 原生 / TCP | C++ 插件 (超大) | HTTP :3000 或 TCP :8091 | TS 或纯 C++ | 23 父工具(数百子动作) | 5.0-5.8 | **第三方中最全面** |
| chongdashu_unreal-mcp | TCP | C++ 插件 | TCP :55557 | Python | ~25 | 5.5+ | Blueprint + Actor 开发 |
| mcpanalyzer_UnrealMCP | **不连接 UE** | **无** | stdio | Python | 41 | 不限 | C++ 源码静态分析 |
| prajwalshettydev_UnrealGenAISupport | TCP | C++ 插件 | TCP :9877 | Python | ~25 | 5.4-5.7+ | LLM API 集成(主) + MCP(辅) |
| runeape-sats_unreal-mcp | HTTP | **无** (用 Remote Control API) | HTTP :30010 | Python | ~15 | 5.3 | 场景搭建 + TLA+ 形式化验证 |
| runreal_unreal-mcp | UDP + TCP | **无** (用 Python Remote Exec) | UDP 多播 + TCP | TypeScript | 19 | 5.4+ | 最快迭代,零插件 |
| winyunq_UnrealMotionGraphicsMCP | TCP 异步 | C++ UMG 插件 | TCP 异步 | Python | ~30 | 5.6+ | UMG / Material / Sequencer 设计 |
## 架构差异
### 第三方主流模式:外部进程 + TCP 桥接
```
Claude Desktop → Python MCP Server (FastMCP) → TCP Socket → C++ Plugin (UE 内部)
```
6/8 的仓库都采用此模式appleweed、ChiR24 (Option B)、chongdashu、prajwalshettydev、winyunq。外部进程运行 MCP 协议,通过自定义 JSON 帧协议将命令转发到 UE 内部的 C++ TCP 服务器。
- 特例
- **runeape-sats**:直接 HTTP 调用 UE 内置的 Remote Control API (`/remote/object/call`),无需任何 C++ 代码
- **runreal**:通过 UE 内置的 Python Remote Execution (UDP 发现 + TCP 命令),所有工具本质是生成 Python 代码字符串在编辑器内执行
- **mcpanalyzer**:完全不连接运行中的编辑器,静态索引 C++ 源代码文件,提供 `ue_search_class``ue_parse_ufunction``ue_compile_project` 等代码分析工具
### 官方模式:引擎内原生 HTTP
```
Claude Desktop → JSON-RPC over HTTP/SSE → UE 引擎内部 MCP Server (C++)
```
TLS/SSE、会话管理、反射 Schema 生成全部在引擎进程内完成,无外部依赖。
## 架构对比表
| 维度 | 第三方主流方案 | 官方 UE5.8 ToolsetRegistry |
|------|--------------|--------------------------|
| **运行位置** | 外部 Python/Node.js 进程 + C++ 插件 | 所有逻辑在引擎进程内 |
| **传输协议** | 自定义 JSON-over-TCP各仓库自造轮子 | JSON-RPC 2.0 over Streamable HTTP (MCP 标准) |
| **类型安全** | Python type hints 或 Zod手动校验 | C++ USTRUCT 反射自动生成 JSON Schema |
| **工具发现** | 装饰器或硬编码注册 | `UToolsetRegistry` 自动扫描注册 |
| **会话管理** | 单会话为主(仅 ChiR24 支持多会话) | 原生多会话 + SSE 流式推送 |
| **错误处理** | 各仓库不一致 (`status:error` vs `success:false`) | 标准 JSON-RPC 错误码 |
| **流式传输** | 无(全为请求-响应模式) | SSE 实时推送长时间操作进度 |
| **生命周期** | 外部进程需独立启动/停止 | 编辑器启动即自动运行 |
## 技术优势对比
- 第三方方案优势
1. **开发速度快**Python 工具可在数分钟内添加,无需 C++ 编译
2. **零插件可选**runreal 和 runeape-sats 只需启用内置引擎插件即可工作
3. **Python 生态**:可引入任意 Python 库requests、mss 截图等)
4. **独立演化**MCP Server 和 UE 插件可独立更新,不受引擎版本约束
5. **入门门槛低**Python/TypeScript 开发者即可贡献,无需 C++ 知识
- 第三方方案劣势
1. **协议脆弱**:每个仓库都自己实现 TCP 帧协议,缓冲区处理和断线重连无标准
2. **双进程管理**:外部进程 + UE 插件需要同时监控,调试困难
3. **无类型安全**:参数以原始字典/字符串传递手动校验Schema 漂移风险高
4. **无标准工具发现**:工具列表硬编码在源码中,运行时无动态注册机制
5. **线程安全脆弱**:多数通过 `register_slate_post_tick_callback` 切回主线程
- 官方方案优势
1. **工程级集成**:引擎内运行,零 IPC 开销,无外部进程管理
2. **反射驱动类型安全**C++ USTRUCT 自动生成 JSON Schema始终与实现同步
3. **插件化可扩展**:第三方可通过发布 UE 插件注册自定义 Toolset
4. **原生多会话**SSE 流式推送 + Session ID 管理,支持并发 AI 客户端
5. **标准协议**:符合 MCP 规范的 JSON-RPC 2.0,任何 MCP 客户端可直接连接
- 官方方案劣势
1. **高入门门槛**:需要 C++ 知识创建新 Toolset
2. **编译周期长**:任何工具变更需要 C++ 重编译
3. **生态受限**:不能直接使用 Python 第三方库
4. **版本锁定**:紧耦合引擎版本
---
## 功能缺口分析:第三方有而官方没有 / 官方有而第三方没有
### 第三方 MCP 有,官方 UE5.8 MCP 没有
| 功能 | 来源仓库 | 说明 |
| ------------------------ | -------------------- | -------------------------------------------------------------------------------------- |
| **C++ 源码静态分析** | mcpanalyzer | 搜索 UCLASS/USTRUCT/UFUNCTION、反射解析、AST 分析、Build 编译、最佳实践检查——完全不需要运行编辑器 |
| **Unreal Insights 性能追踪** | appleweed | 启动/停止/分析 Unreal Insights trace、CSV profiling |
| **战斗/背包/网络/AI 系统** | ChiR24 | `manage_combat``manage_inventory``manage_networking``manage_ai`——GaAS 层面的完整系统管理 |
| **PCG 管理** | ChiR24 | `manage_pcg`——程序化生成工具 |
| **音频管理** | ChiR24 | `manage_audio`——SoundCue/Metasound 操作 |
| **HLSL 代码编辑** | winyunq | `hlsl_set_target``hlsl_get``hlsl_set``hlsl_compile`——直接在 MCP 中编辑 Material 的 HLSL 节点 |
| **HTML 转 UMG** | winyunq | 将 HTML 结构自动转换为 UMG Widget 树 |
| **LLM API 内置集成** | prajwalshettydev | 在 UE 编辑器内直接调用 OpenAI/Anthropic/DeepSeek API主功能MCP 为副) |
| **TLA+ 形式化验证** | runeape-sats | 城堡搭建工作流的 TLA+ 形式化规格 |
| **OS 级截图** | prajwalshettydev | 使用 Python `mss` 库截取整个屏幕,用于 AI 看图理解编辑器状态 |
| **Blueprint 图节点级编辑** | appleweed/chongdashu | 获取 Blueprint 节点 ID、Pin 详情、连接 Pin、添加事件/函数节点——粒度比官方 BlueprintTools 更细 |
| **Arbitrary Python 执行** | runreal | `editor_run_python`——在编辑器内执行任意 Python 代码,给了 AI 无限的引擎 API 访问能力 |
| **系统控制** | ChiR24 | `system_control`——编辑器进程层面的控制(重启、退出等) |
| **环境搭建** | ChiR24 | `build_environment`——构建环境管理 |
### 官方 UE5.8 MCP 有,第三方 MCP 没有
| 功能 | 来源 Toolset | 说明 |
|------|-------------|------|
| **Slate UI 自动化 (Playwright 风格)** | SlateInspectorToolset | 快照、观察者、截图、点击/拖拽/Hover/输入/表单填充——以 AI Agent 视角驱动编辑器 UI |
| **Dataflow 图编辑** | DataflowAgent | Geometry Collection 破坏系统的节点图完整编辑17 个工具) |
| **GAS 运行时检测** | GASToolsets | 实时检测 AbilitySystemComponent 的属性值、活跃效果、技能、标签 |
| **GameplayCue 管理** | GASToolsets | GameplayCue 标签增删、通知资产创建、缺少通知资产的标签发现 |
| **GameplayTag 管理** | GameplayTagsToolset | 完整的增删改查 + 资产引用者搜索 |
| **Live Coding 热编译** | LiveCodingToolset | 触发编译 + 收集 MSVC 诊断 + 线程安全日志捕获 |
| **MCP 客户端桥接** | MCPClientToolset | 接入外部 MCP 服务器SSE/StreamableHTTP/OAuth+PKCE聚合第三方工具 |
| **GameFeature 插件创建** | GameFeaturesToolset | 完整的 GFP 创建流程(目录→.uplugin→挂载→资产→保存带 ON_SCOPE_EXIT 回滚 |
| **WorldConditions 检查** | WorldConditionsToolset | 查询/条件描述 + 自定义 JSON 转换器 |
| **Conversation Graph 检查** | ConversationToolset | 对话资产节点遍历、入口点、说话者、GUID 查找 |
| **StateTree 检查** | StateTreeToolset | 状态树结构导航、任务/条件/转换/求值器查询 |
| **CurveTable / DataTable / StringTable** | Core Python 模块 | 专门的表格数据资产创建/编辑工具 |
| **ProgrammaticToolset** | Core Python 模块 | 沙盒 Python 脚本编排——在同一脚本中调用多个 MCP 工具并编写自定义逻辑 |
| **AgentSkill 系统** | AgentSkillToolset | Agent Skill 的列表/读取/创建/更新——AI Agent 的 prompt 上下文管理 |
| **EditorAppToolset** | Core Python 模块 | 控制台变量管理、资产缩略图成像、内容浏览器导航 |
| **LogsToolset** | Core Python 模块 | 输出日志类别动态控制、日志读取 |
| **C++ JSON Schema 自动生成** | 架构层 | 从 USTRUCT 反射自动生成工具参数 Schema永远与实现同步 |
| **原生多会话 SSE 流式推送** | 架构层 | 支持多个 AI 客户端同时连接,长时间操作进度实时推送 |
| **插件化 Toolset 扩展** | 架构层 | 第三方只需发布 UE 插件并注册 UToolsetDefinition无需适配任何外部进程 |
| **标准 JSON-RPC 2.0** | 架构层 | 完全符合 MCP 协议规范,任何 MCP 客户端可直连 |
### 差距总结
| 对比维度 | 第三方领先 | 官方领先 |
|---------|-----------|---------|
| **代码分析** | mcpanalyzer 独有 | — |
| **性能分析** | appleweed 的 Insights 集成 | — |
| **Gameplay 高级系统** | ChiR24 的 combat/inventory/AI/PCG/audio | GAS 运行时检测 + GameplayCue 官方更深入 |
| **UI 自动化** | — | SlateInspectorToolset 独有 |
| **资产表格** | — | CurveTable/DataTable/StringTable 独有 |
| **容器/编排** | runreal 的任意 Python 执行 | ProgrammaticToolset 沙盒编排 |
| **工程架构** | — | 反射 Schema、多会话 SSE、插件化扩展、标准协议 |
| **部署复杂度** | runreal/runeape-sats 零 C++ 即可用 | 需引擎编译,但启动即运行 |
**核心结论**:第三方 MCP 在**广度**上占优(覆盖了更多非编辑器核心的领域),官方 MCP 在**深度和工程品质**上占优(单个领域的工具细粒度、类型安全、协议标准、可扩展性)。两者并非替代关系——各有独特优势,可以互补使用。
---
# UAgentSkill 子系统分析
## 概述
`UAgentSkill` 是 UE5.8 ToolsetRegistry 中的一个子系统,用于为 AI Agent 提供**上下文和提示词增强**prompt enrichment而非功能性的执行工具。它类似于 Claude Code 的 Skill 系统——两者都在 prompt 层面为 AI 提供领域知识和操作指引。
核心文件位置:
- 头文件:`ToolsetRegistry\Public\ToolsetRegistry\AgentSkill.h`
- 实现:`ToolsetRegistry\Private\ToolsetRegistry\AgentSkill.cpp`
- 测试:`ToolsetRegistry\Private\Tests\AgentSkillsTest.cpp` + `AgentSkillsTest.h`
- Niagara 示例:`NiagaraToolsets\Private\NiagaraToolset_Info.h` + `.cpp`
## 类体系
```
UObject
├── UAgentSkill (AgentSkill.h)
│ ├── UAgentSkillBestPractices (AgentSkill.h) — 追加技能编写最佳实践
│ ├── UAgentSkill_NiagaraBase (NiagaraToolset_Info.h) — 追加 Niagara 概述 + 资产发现
│ └── UAgentSkillCustomPrompt (AgentSkillsTest.h) — 测试用子类
├── UToolsetDefinition
│ └── UAgentSkillToolset (AgentSkill.h) — MCP CRUD 工具暴露
└── FAgentSkillDetails (AgentSkill.h) — DTO 数据结构
```
## 核心数据结构
### FAgentSkillDetails返回给 AI 的 DTO
```cpp
USTRUCT(BlueprintType)
struct FAgentSkillDetails
{
TArray<FString> Toolsets; // 技能依赖的 toolset 完整名称
FString Instructions; // 经过 GeneratePrompt 处理后的最终指令
};
```
### UAgentSkill 关键属性
| 属性 | 类型 | 说明 |
|------|------|------|
| `Description` | `FString` | 简短描述,用于 ListSkills 的摘要 |
| `Instructions` | `FString` | 详细指令(原始),会被 GeneratePrompt 处理 |
| `Toolsets` | `TArray<TSoftClassPtr<UToolsetDefinition>>` | 依赖的工具集软引用 |
## 关键方法解析
### GetDetails() — `AgentSkill.cpp:21`
```cpp
FAgentSkillDetails UAgentSkill::GetDetails() const
{
FAgentSkillDetails SkillDetails;
SkillDetails.Instructions = GeneratePrompt(Instructions); // 🔑 调用可重写的生成方法
for (const auto& Toolset : Toolsets)
{
UClass* ToolsetClass = Toolset.Get();
FString ToolsetName = FFunctionLibraryToolset::GetToolsetClassName(ToolsetClass);
SkillDetails.Toolsets.Add(ToolsetName); // 转换为字符串形式
}
return SkillDetails;
}
```
**关键点**`GetDetails` 不是简单返回存储的值,而是通过 `GeneratePrompt(Instructions)` 对指令进行**动态处理**后才返回。这允许子类在运行时注入额外上下文。
### GeneratePrompt() — `AgentSkill.h:47`
```cpp
UFUNCTION(BlueprintNativeEvent)
FString GeneratePrompt(const FString& InitialInstructions) const;
// 默认实现:原样返回
virtual FString GeneratePrompt_Implementation(const FString& InitialInstructions) const
{
return InitialInstructions;
}
```
这是一个 **Template Method 模式**的核心。基类提供默认的直通实现,子类通过重写来丰富 prompt。
### 子类 Prompt 生成对比
**UAgentSkillBestPractices** — 追加编写规范 (`AgentSkill.cpp:42`)
```cpp
return InitialInstructions + TEXT(
"- Skills should focus on providing essential info the LLM doesn't know...\n"
"- Skills should be written like a brief to a colleague...\n"
"- Shorter skills are more context efficient...\n"
// ... 共6条最佳实践
);
```
**UAgentSkill_NiagaraBase** — 前置 Niagara 知识 (`NiagaraToolset_Info.cpp:128`)
```cpp
TStringBuilder<16384> PromptBuilder;
PromptBuilder << NiagaraOverview; // ~100 行的 Niagara 概念概述
// 遍历依赖的 toolsets调用 GetToolsetPrompt() 获取其专属提示
for (const auto& SoftToolset : Toolsets) {
if (UFunction* PromptFunction = ToolsetClass->FindFunctionByName(TEXT("GetToolsetPrompt")))
PromptBuilder << /* result */;
}
PromptBuilder << InitialInstructions; // 原始指令放在后面
// 附加资产发现信息
for (const auto& Group : AssetDiscoveryGroups)
PromptBuilder << Group.Description << Group.Paths;
```
**UAgentSkillCustomPrompt**(测试)— 后缀追加 (`AgentSkillsTest.h:17`)
```cpp
return InitialInstructions + FString(TEXT("BishBosh")); // 测试验证用
```
## UAgentSkillToolset — MCP CRUD 操作
这是暴露给 AI 的 4 个工具:
### ListSkills() — `AgentSkill.cpp:53`
- 通过 `UToolsetLibrary::GetDerivedClasses(UAgentSkill::StaticClass())` 发现所有派生类(包括 C++ 和 Blueprint
- 加载每个类的 CDO收集 `Description`
- 返回 `TMap<FString, FString>`**路径 → 描述**
### GetSkills(SkillPaths) — `AgentSkill.cpp:76`
- 按路径列表批量加载 UAgentSkill 类
- 调用 `GetDetails()` 获取经过 prompt 生成的详细信息
- 返回 `TMap<FString, FAgentSkillDetails>`**路径 → 详情**
### CreateSkill(...) — `AgentSkill.cpp:94`
完整流程:
1. 校验 `FolderPath``AssetName`
2. 使用 `UBlueprintFactory``UAgentSkill` 为父类创建 Blueprint 资产
3. 调用 `UpdateSkill` 设置描述、指令和工具集依赖
4. 如果 UpdateSkill 失败,回滚删除已创建的 Blueprint
5. 返回生成的类路径(如 `/Game/Skills/MySkill.MySkill_C`
### UpdateSkill(...) — `AgentSkill.cpp:139`
1. 加载并校验类必须是 `UAgentSkill` 子类
2. 通过 `ToolsetRegistrySubsystem->ToolsetRegistry.Find(ToolsetName)` 校验所有依赖的 toolset 名称有效
3. 更新 `Description``Instructions``Toolsets`
4. `Modify()` + `MarkPackageDirty()` 标记保存
## 测试覆盖 — `AgentSkillsTest.cpp`
| 测试用例 | 验证内容 |
|---------|---------|
| Can create skills | 创建后 CDO 的 Description/Instructions/Toolsets 正确 |
| Won't create when given bad folder paths | 空路径、空名称、不存在路径均返回空 |
| Can update skills | 更新后 Description/Instructions/Toolsets 正确覆盖 |
| Won't update when class does not exist | 不存在路径返回 false |
| Won't update when class is not a skill | 非 UAgentSkill 类返回 false |
| Won't update when given bad tools | 无效 toolset 名称返回 false原有属性不变原子性 |
| List skill summaries | 同时发现 C++ 原生和 BP 派生的 AgentSkill |
| Get skill details | GetDetails 返回内容与原始属性一致 |
| Can't load non-existant skills | 不存在路径返回空 map |
| Can customize prompt generation | 子类重写 GeneratePrompt 确实生效 |
## 与 ToolsetRegistry 生态的关系
```
ToolsetRegistry (核心注册表)
┌─────────────┼─────────────┐
│ │ │
UToolsetDefinition UAgentSkill FToolset (运行时)
(功能工具集基类) (上下文/技能) (工具集实例)
│ │
Static AICallable ──────────→ 由 FToolset 包装注册
UFUNCTIONs 到 ToolsetRegistry
UAgentSkill.Toolsets ──→ 声明依赖关系,告诉系统
(TSoftClassPtr) 加载 skill 时需同时加载哪些 toolset
```
**核心区别**
- `UToolsetDefinition` 提供**可调用的工具函数**AICallable UFUNCTIONs
- `UAgentSkill` 提供**给 AI 的上下文知识**prompt 增强),并声明"使用我时需要哪些 toolset"
- 加载一个 skill 时,系统会根据其 `Toolsets` 字段自动加载对应的 functional toolsets
## 设计模式总结
| 模式 | 应用 |
|------|------|
| **Template Method** | `GeneratePrompt()` — 基类定义框架,子类丰富内容 |
| **CDO as Template** | Skill 的 Description/Instructions 存在 CDO 中,运行时通过 GetDefaultObject 读取 |
| **Soft Reference** | `TSoftClassPtr<UToolsetDefinition>` 避免硬加载依赖 |
| **Factory Pattern** | `CreateSkill` 内部使用 `UBlueprintFactory` |
| **DTO** | `FAgentSkillDetails` 作为 AI ↔ 引擎的数据传输对象 |
| **Atomic Update** | `UpdateSkill` 先校验所有 toolset 名称再修改,失败时原有属性不变 |
## 与 Claude Code Skill 系统的类比
| 维度 | UE5.8 UAgentSkill | Claude Code Skill |
|------|-------------------|-------------------|
| **存储方式** | Blueprint 资产 / CDO 属性 | Markdown 文件 |
| **加载机制** | `GetDerivedClasses` + `GetDefaultObject` | 文件系统读取 |
| **prompt 生成** | `GeneratePrompt()` 虚函数动态生成 | 静态 Markdown 内容 |
| **依赖声明** | `Toolsets` 属性显式声明 | 无skill 间独立) |
| **创建方式** | AI 通过 MCP 工具调用 `CreateSkill` | 文件写入 |
| **分发** | 作为 UE 插件内容分发 | 作为文件/插件分发 |
| **核心目的** | 为 AI 提供领域上下文 + 绑定 toolset | 为 AI 提供任务工作流指引 |