UE5.8 MCP Toolsets 分析
总体架构
所有Toolset都位于 Engine\Plugins\Experimental\Toolsets,共18个插件。它们通过 ToolsetRegistry 插件(核心基础设施)将 AI-callable 工具暴露给 MCP 系统(如 UnrealMCP)。
功能维度总览
核心编辑器操作
资产与资源管理
Gameplay
Sequence
动画系统
特效系统 (Niagara)
PCG
测试与配置
插件与功能管理
其他工具
以上 3 个工具集均有 Python 实现,C++ 模块仅负责加载插件,实际逻辑和工具注册均在 Python 侧完成。
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 delegate,60秒发现超时,递归收集报告树叶子节点
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/TFuture,SHA-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 实现的 Toolset(C++ 模块仅为加载器)
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 桥接
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
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 实时推送长时间操作进度 |
| 生命周期 |
外部进程需独立启动/停止 |
编辑器启动即自动运行 |
技术优势对比
- 第三方方案优势
- 开发速度快:Python 工具可在数分钟内添加,无需 C++ 编译
- 零插件可选:runreal 和 runeape-sats 只需启用内置引擎插件即可工作
- Python 生态:可引入任意 Python 库(requests、mss 截图等)
- 独立演化:MCP Server 和 UE 插件可独立更新,不受引擎版本约束
- 入门门槛低:Python/TypeScript 开发者即可贡献,无需 C++ 知识
- 第三方方案劣势
- 协议脆弱:每个仓库都自己实现 TCP 帧协议,缓冲区处理和断线重连无标准
- 双进程管理:外部进程 + UE 插件需要同时监控,调试困难
- 无类型安全:参数以原始字典/字符串传递,手动校验,Schema 漂移风险高
- 无标准工具发现:工具列表硬编码在源码中,运行时无动态注册机制
- 线程安全脆弱:多数通过
register_slate_post_tick_callback 切回主线程
- 官方方案优势
- 工程级集成:引擎内运行,零 IPC 开销,无外部进程管理
- 反射驱动类型安全:C++ USTRUCT 自动生成 JSON Schema,始终与实现同步
- 插件化可扩展:第三方可通过发布 UE 插件注册自定义 Toolset
- 原生多会话:SSE 流式推送 + Session ID 管理,支持并发 AI 客户端
- 标准协议:符合 MCP 规范的 JSON-RPC 2.0,任何 MCP 客户端可直接连接
- 官方方案劣势
- 高入门门槛:需要 C++ 知识创建新 Toolset
- 编译周期长:任何工具变更需要 C++ 重编译
- 生态受限:不能直接使用 Python 第三方库
- 版本锁定:紧耦合引擎版本
功能缺口分析:第三方有而官方没有 / 官方有而第三方没有
第三方 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
类体系
核心数据结构
FAgentSkillDetails(返回给 AI 的 DTO)
UAgentSkill 关键属性
| 属性 |
类型 |
说明 |
Description |
FString |
简短描述,用于 ListSkills 的摘要 |
Instructions |
FString |
详细指令(原始),会被 GeneratePrompt 处理 |
Toolsets |
TArray<TSoftClassPtr<UToolsetDefinition>> |
依赖的工具集软引用 |
关键方法解析
GetDetails() — AgentSkill.cpp:21
关键点:GetDetails 不是简单返回存储的值,而是通过 GeneratePrompt(Instructions) 对指令进行动态处理后才返回。这允许子类在运行时注入额外上下文。
GeneratePrompt() — AgentSkill.h:47
这是一个 Template Method 模式的核心。基类提供默认的直通实现,子类通过重写来丰富 prompt。
子类 Prompt 生成对比
UAgentSkillBestPractices — 追加编写规范 (AgentSkill.cpp:42):
UAgentSkill_NiagaraBase — 前置 Niagara 知识 (NiagaraToolset_Info.cpp:128):
UAgentSkillCustomPrompt(测试)— 后缀追加 (AgentSkillsTest.h:17):
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
完整流程:
- 校验
FolderPath 和 AssetName
- 使用
UBlueprintFactory 以 UAgentSkill 为父类创建 Blueprint 资产
- 调用
UpdateSkill 设置描述、指令和工具集依赖
- 如果 UpdateSkill 失败,回滚删除已创建的 Blueprint
- 返回生成的类路径(如
/Game/Skills/MySkill.MySkill_C)
UpdateSkill(...) — AgentSkill.cpp:139
- 加载并校验类必须是
UAgentSkill 子类
- 通过
ToolsetRegistrySubsystem->ToolsetRegistry.Find(ToolsetName) 校验所有依赖的 toolset 名称有效
- 更新
Description、Instructions、Toolsets
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 生态的关系
核心区别:
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 提供任务工作流指引 |