About UEEditorMCP
UEEditorMCP is an MCP server published by yangskin in the Developer Tools category.
The repository has 186 stars and 37 forks, with the last commit 6 months ago. Six months or more without a commit doesn't mean the server is broken, but check the open issues before depending on it in production.
Install
git clone https://github.com/yangskin/UEEditorMCPThis server has no ConduID identity, so agent calls to it are not receipted. Pin the version you install and review the source before granting it credentials.
Ask AI
Ask AI about UEEditorMCP
Powered by Claude · Grounded in docs
Security checks
- ✓README presentThe repository ships documentation.
5 checks have not been run yet.
README
UEEditorMCP
基于 lilklon/UEBlueprintMCP 修改扩展。
原项目采用 MIT 协议,本插件在其基础上进行了大量重构与功能增强,同样遵循 MIT 协议发布。
感谢 @lilklon 提供的架构基础。
一个面向 AI 辅助开发的 MCP 插件,用于 Unreal Engine 5.7+ 蓝图操作。
对外暴露 7 个固定 MCP 工具,由后端 动作注册表(Action Registry) 驱动,支持 141 个动作,提供持久 TCP 连接、多客户端支持与自动保存。
同时包含一个可选的独立日志 MCP 服务器(ue-editor-mcp-logs),暴露 unreal.logs.get、unreal.asset_thumbnail.get 和 unreal.asset_diff.get 三个工具。
仅限编辑器 — C++ 模块类型为
Editor,在所有游戏打包构建(Shipping、Development Game 等)中完全排除,不会对运行时性能或打包产物产生任何影响。
功能特性
- 7 个固定 MCP 工具 — 单一
ue-editor-mcp服务器,工具接口永远不变 - 141 个动作 — 蓝图、图节点、材质、UMG 控件、MVVM、增强输入、组件事件绑定、PIE 启停/状态查询、日志断言、Outliner 管理、资产缩略图提取、批量资产重命名及重定向修复、与版本控制仓库的差异对比 — 均可通过动作注册表动态发现
- 搜索 → 模式 → 执行 — AI 动态发现动作,无需记忆命令名
- 批量执行 —
ue_batch通过 C++batch_execute在单次 TCP 往返中执行最多 50 个动作 - 多客户端 TCP — 端口 55558,最多支持 8 路并发连接(每连接独立线程)
- 持久连接 — Socket 在命令间保持开启,支持心跳检测与自动重连
- 自动保存 — 每次成功操作后自动保存脏包
- 崩溃保护 — 动作执行管道启用了 SEH + C++ 异常防护
- 字符串解析 — 接受蓝图名称、资产路径或引擎类名
- 嵌入式文档 —
ue_resources_read将约定规范、错误码和补丁规范暴露给 AI
架构
VS Code / MCP 客户端(GitHub Copilot 等)
│
│ 7 个 MCP 工具(stdio)
▼
server_unified.py(动作注册表 + 分发器)
│
│ TCP/JSON(端口 55558,持久连接,长度前缀帧)
▼
C++ 插件(FMCPServer → 每连接一个 FMCPClientHandler)
│
│ 游戏线程分发
▼
FEditorAction 子类(~150 个处理器)→ 校验 → 执行 → 自动保存
│
▼
Unreal Editor
单一 Python 服务器进程与 C++ 服务器建立持久 TCP 连接。C++ 侧为每个连接派生独立的 FMCPClientHandler 线程,所有编辑器变更均被序列化到游戏线程以保证线程安全。
对于日志上下文场景,第二个轻量服务器(server_unreal_logs.py)可并行运行,提供:
unreal.logs.get(即使 UE 未运行也可通过Saved/Logs离线读取)unreal.asset_thumbnail.get(需要 UE 编辑器连接,以 PNG base64 格式返回资产缩略图)unreal.asset_diff.get(需要 UE 编辑器 + 源码控制连接,返回资产与仓库版本的结构化差异)
MCP 工具(7 个固定)
| # | 工具 | 用途 |
|---|---|---|
| 1 | ue_ping |
测试与 Unreal Engine 的连接,存活时返回 {pong: true} |
| 2 | ue_actions_search |
按关键字或标签搜索动作,返回排序后的动作 ID 列表及描述 |
| 3 | ue_actions_schema |
获取指定动作的完整输入模式、示例和元数据 |
| 4 | ue_actions_run |
执行单个带参数的动作 |
| 5 | ue_batch |
通过 C++ batch_execute 在单次 TCP 往返中执行多个动作,最多 50 个 |
| 6 | ue_resources_read |
读取嵌入式文档:conventions.md、error_codes.md、patch_spec.md |
| 7 | ue_logs_tail |
追踪近期日志(Python 命令日志 / 编辑器环形缓冲区 / 两者),支持分类和详细级别过滤 |
AI 工作流(快速路径 — 1 次往返)
# 当动作 ID 及参数已知时,直接跳过搜索/模式步骤:
ue_batch(actions=[
{action_id: "blueprint.create", params: {name: "BP_Player", parent_class: "Character"}},
{action_id: "variable.create", params: {blueprint_name: "BP_Player", variable_name: "Speed", variable_type: "Float"}},
{action_id: "blueprint.compile", params: {blueprint_name: "BP_Player"}}
])
→ 所有动作在 1 次 TCP 往返中完成
AI 工作流(发现路径 — 3 次往返)
第 1 步:ue_actions_search(query="create blueprint")
→ [{id: "blueprint.create", desc: "..."}, ...]
第 2 步:ue_actions_schema(action_id="blueprint.create")
→ {input_schema: {required: ["name","parent_class"], ...}, examples: [...]}
第 3 步:ue_actions_run(action_id="blueprint.create", params={name: "BP_Player", parent_class: "Character"})
→ {success: true, blueprint_name: "BP_Player", path: "/Game/Blueprints/BP_Player"}
动作域(核心)
| 域 | 数量 | 说明 | 示例 ID |
|---|---|---|---|
blueprint.* |
11 | 蓝图增删改查、组件、接口、完整快照 | blueprint.create、blueprint.compile、blueprint.add_component、blueprint.describe_full |
batch.* |
1 | 批量命令执行 | batch.execute |
component.* |
4 | 组件属性、网格体、物理、事件绑定 | component.set_property、component.set_static_mesh、component.bind_event |
editor.* |
18 | 关卡 Actor、视口、资产、日志、生命周期、源码控制差异 | editor.spawn_actor、editor.list_assets、editor.get_logs、editor.is_ready、editor.request_shutdown |
layout.* |
3 | 节点自动布局 | layout.auto_selected、layout.auto_subtree、layout.auto_blueprint |
node.* |
19 | 蓝图图节点创建 | node.add_event、node.add_function_call、node.add_branch |
variable.* |
8 | 变量增删改查、默认值、元数据 | variable.create、variable.add_getter、variable.set_default |
function.* |
4 | 函数创建、管理与重构 | function.create、function.call、function.delete、function.rename |
dispatcher.* |
4 | 事件派发器管理 | dispatcher.create、dispatcher.call、dispatcher.bind |
graph.* |
18 | 图连线、检视、注释、补丁、折叠重构 | graph.connect_nodes、graph.describe、graph.get_selected_nodes、graph.collapse_selection_to_function、graph.auto_comment、graph.apply_patch |
macro.* |
1 | 宏管理 | macro.rename |
material.* |
16 | 材质创建、编辑、编译诊断、图检视与布局、关卡应用、编辑器刷新 | material.create、material.add_expression、material.compile、material.get_summary、material.auto_layout、material.auto_comment、material.remove_expression、material.apply_to_component、material.apply_to_actor、material.refresh_editor |
widget.* |
21 | UMG 控件蓝图(24 种类型)+ MVVM | widget.create、widget.add_component、widget.mvvm_add_viewmodel、widget.mvvm_remove_viewmodel |
input.* |
4 | 增强输入系统 | input.create_action、input.create_mapping_context |
编译诊断(重要)
blueprint.compile返回状态及汇总计数(status、error_count、warning_count),但对某些 UMG/MVVM 编译失败可能不包含完整编译器文本。- 如需详细诊断,请调用
editor.get_logs(或带source="editor"的ue_logs_tail),并按category="LogBlueprint"+min_verbosity="Error"过滤。 - 推荐排查流程:
blueprint.compileeditor.get_logs(count=200, category="LogBlueprint", min_verbosity="Error")- 如需进一步扩展,可将过滤类别改为
category="LogOutputDevice"获取 Ensure/Fatal 上下文
材质编译诊断(Phase 5)
material.compile现已同步等待材质着色器编译完成,并返回真实编译诊断。- 响应中包含
error_count、warning_count以及errors[]列表。 errors[]的每一项包含:message、expression_name、expression_class、node_name(如可解析)。- 推荐排查流程:
material.compile- 若有需要,再结合
ue_logs_tail(source="editor", category="LogMaterial", min_verbosity="Error")查看上下文日志
蓝图编辑器自动布局命令
插件在蓝图编辑器菜单(编辑 → Auto Layout)中直接注册了自动布局命令,并提供默认快捷键:
Auto Layout:Ctrl+Alt+L
行为:
- 若有节点被选中,对当前选中节点执行布局
- 若无选中,对整个焦点图执行布局
这些是编辑器命令,可在 Unreal Editor 快捷键设置中重映射。
材质编辑器自动布局菜单(Phase 5)
插件在材质编辑器菜单(Edit)中注册了 Auto Layout 菜单项。
行为:
- 对当前焦点材质的
UMaterialGraph执行自动布局 - 与
material.auto_layout动作配套,便于在编辑器内直接整理材质图
安装与配置
第 1 步:编译 C++ 插件
插件已位于 Plugins/UEEditorMCP/,编译编辑器目标:
Engine\Build\BatchFiles\Build.bat p110_2Editor Win64 Development ${workspaceFolder:p110_2}\p110_2.uproject -waitmutex
或使用 VS Code 任务:p110_2Editor Win64 Development Build。
第 2 步:一键 Python 环境配置(使用 UE 引擎内置 Python)
无需安装外部 Python。 配置脚本会自动找到 Unreal Engine 内置的 Python 3.11,创建虚拟环境并安装 MCP 包。
PowerShell(推荐):
cd Plugins/UEEditorMCP
.\setup_mcp.ps1
# 或显式指定引擎路径:
.\setup_mcp.ps1 -EngineRoot "${workspaceFolder:UE5}"
命令提示符:
cd Plugins\UEEditorMCP
setup_mcp.bat
脚本将会:
- 自动检测 UE 引擎内置 Python(
Engine/Binaries/ThirdParty/Python3/Win64/python.exe) - 在
Python/.venv创建虚拟环境 - 安装
mcp包 - 在项目根目录生成
.vscode/mcp.json,并填入正确路径
如需手动配置或使用自定义 Python:
cd Plugins/UEEditorMCP/Python
python -m venv .venv
.venv\Scripts\activate # Windows
pip install -r requirements.txt
然后在项目根目录创建 .vscode/mcp.json:
{
"servers": {
"ue-editor-mcp": {
"command": "./Plugins/UEEditorMCP/Python/.venv/Scripts/python.exe",
"args": ["-m", "ue_editor_mcp.server_unified"],
"env": {
"PYTHONPATH": "./Plugins/UEEditorMCP/Python"
}
},
"ue-editor-mcp-logs": {
"command": "./Plugins/UEEditorMCP/Python/.venv/Scripts/python.exe",
"args": ["-m", "ue_editor_mcp.server_unreal_logs"],
"env": {
"PYTHONPATH": "./Plugins/UEEditorMCP/Python"
}
}
}
}
日志上下文工具(ue-editor-mcp-logs)
ue-editor-mcp-logs 暴露三个工具:
unreal.logs.get
mode:auto|live|saved(默认auto)tailLines:默认200(范围20..2000)maxBytes:默认65536(范围8192..1048576)cursor:增量游标(live:<seq>或file:<hash>:<offset>:<mtime_ns>:<size>)workspaceRoot:UE 不可达时的离线读取必填项
推荐用法:
- 首次调用:
mode=auto, tailLines=200, maxBytes=65536 - 保存返回的
cursor - 后续调用传入
cursor,仅获取增量日志,避免 token 爆炸
行为说明:
mode=auto:若日志在 2 秒内更新则优先读取实时环形缓冲区,否则回退到Saved/Logsmode=live:仅读取内存中的实时环形缓冲区,无文件 IOmode=saved:使用反向块读取方式追踪最新Saved/Logs文件- UE 不可达时:若提供
workspaceRoot则从磁盘返回offline_saved
unreal.asset_thumbnail.get
assetPath:可选,单个资产完整路径assetPaths:可选,多个完整路径assetIds/ids:可选,路径数组别名(批量)size:可选,缩略图尺寸(默认256,上限1..256)- 返回
thumbnails[](每个输入对应一项),并保留首项兼容字段image_base64 - 需要 UE 编辑器连接
unreal.asset_diff.get
assetPath(必填):完整资产路径(如/Game/P110_2/Blueprints/BP_Foo)revision(可选):指定版本号(默认最新版本)- 返回结构化差异数据:
hasDifferences、summary(新增/删除/修改/次要变更计数)、diffs[](类型、分类、显示字符串、所属图、节点/引脚名称) - 对于蓝图:逐图节点级别变更(NODE_ADDED、NODE_REMOVED、PIN_DEFAULT_VALUE、NODE_MOVED 等)
- 对于通用资产:属性级别差异(PropertyValueChanged、PropertyAddedToA/B)
- 包含
revisionInfo(版本号、日期、用户名、描述) - 需要 UE 编辑器运行且源码控制(SVN/Perforce/Git)已连接
第 3 步:启动
- 在编辑器中打开 Unreal 项目(插件自动在端口 55558 启动 TCP 服务器)
- 打开 VS Code —
ue-editor-mcp服务器通过 stdio 启动并连接到端口 55558 - 使用 GitHub Copilot Chat 或任意兼容 MCP 的客户端发出命令
新增动作
若要为插件扩展新能力:
第 1 步:C++ 侧 — 实现动作处理器
// Source/Public/Actions/MyActions.h
class FMyNewAction : public FBlueprintNodeAction
{
public:
FMyNewAction() : FBlueprintNodeAction(TEXT("my_new_action")) {}
FString Validate(const TSharedPtr<FJsonObject>& Params) override;
TSharedPtr<FJsonObject> ExecuteInternal(const TSharedPtr<FJsonObject>& Params) override;
};
在 MCPBridge.cpp 中注册:
ActionHandlers.Add(TEXT("my_new_action"), MakeShared<FMyNewAction>());
第 2 步:Python 侧 — 添加 ActionDef
在 registry/actions.py 中添加动作定义:
ActionDef(
id="domain.my_new_action",
command="my_new_action",
description="这个动作的用途说明",
tags=["domain", "keyword1", "keyword2"],
input_schema={
"type": "object",
"properties": {
"param1": {"type": "string", "description": "..."},
},
"required": ["param1"],
},
examples=[{"param1": "value"}],
)
第 3 步:编译与测试
Engine\Build\BatchFiles\Build.bat p110_2Editor Win64 Development ...
无需修改任何服务器代码 — ue_actions_search / ue_actions_run 将自动识别新动作。
编辑器专属安全保障
本插件通过三重机制保证永远不出现在打包构建中:
| 层级 | 机制 | 效果 |
|---|---|---|
.uplugin |
"Type": "Editor" |
UBT 对所有非编辑器目标跳过此模块 |
.Build.cs |
依赖 UnrealEd、BlueprintGraph、Kismet、UMGEditor 等 |
无法链接到游戏目标(这些模块在游戏构建中不存在) |
.uplugin |
"PlatformAllowList": ["Win64", "Mac", "Linux"] |
仅限桌面编辑器平台 |
TCP 服务器、所有 MCP 工具以及所有蓝图操作代码仅存在于编辑器 DLL 中。
技术细节
C++ 服务器(FMCPServer)
- 监听
127.0.0.1:55558(仅限本地,不对网络暴露) - Accept 循环为每个连接派生独立的
FMCPClientHandler(每个独立线程) ping和close直接在客户端线程处理(无需游戏线程)- 所有其他命令通过
AsyncTask+FEvent同步分发到游戏线程 - 客户端超时:120 秒无活动后断开
- 启用
SO_REUSEADDR,避免编辑器重启时端口冲突
Python 服务器(server_unified.py)
- 对外暴露 7 个固定工具的单一 MCP 服务器
- 动作注册表含 141 个 ActionDef 条目,支持关键字搜索和模式自省
- UMG 控件类型通过内部组件类型映射分发(支持 24 种控件类型)
ue_batch批量执行(每次最多 50 个动作)- 命令日志环形缓冲区,供
ue_logs_tail使用 - 通过
ue_resources_read暴露嵌入式资源文档
通信协议格式
[4 字节:消息长度(大端序)] [UTF-8 JSON 载荷]
请求:
{"type": "create_blueprint", "params": {"name": "BP_MyActor", "parent_class": "Actor"}}
响应:
{"success": true, "blueprint_name": "BP_MyActor", "path": "/Game/Blueprints/BP_MyActor"}
关键文件
| 文件 | 用途 |
|---|---|
Python/ue_editor_mcp/server_unified.py |
单一 MCP 服务器,7 个工具,动作分发 |
Python/ue_editor_mcp/registry/__init__.py |
ActionRegistry 类,关键字搜索引擎 |
Python/ue_editor_mcp/registry/actions.py |
141 个带模式/标签/示例的 ActionDef 条目 |
Python/ue_editor_mcp/resources/*.md |
供 ue_resources_read 使用的嵌入式文档 |
Python/ue_editor_mcp/connection.py |
PersistentUnrealConnection(TCP、心跳、自动重连) |
Source/Private/MCPServer.cpp |
TCP Accept 循环 + 每客户端处理线程 |
Source/Private/MCPBridge.cpp |
动作处理器注册表(~150 条命令) |
Source/Private/Actions/*.cpp |
FEditorAction 子类具体实现 |
环境要求
- Unreal Engine 5.7+(内置 Python 3.11,无需另行安装)
- Visual Studio 2022(插件编译所需)
- VS Code + GitHub Copilot(或任意兼容 MCP 的客户端)
开发路线
开发计划详见 DEVPLAN.md。当前状态:
阶段一:统一服务器 + 动作注册表 ✅
7 工具统一 MCP 服务器,动作注册表(141 个动作)、关键字搜索、批量执行、嵌入式文档和结构化日志——全部完成。
Phase 6: PIE / 日志断言 / Outliner ✅
| # | Feature | Description | Status |
|---|---|---|---|
| P6.1 | editor.start_pie / editor.stop_pie / editor.get_pie_state |
PIE 启动、停止与状态查询,支持自动化运行闭环 | ✅ |
| P6.2 | editor.clear_logs / editor.assert_log |
日志会话分段与断言验证,支持基于游标的自动化检查 | ✅ |
| P6.3 | Outliner 管理动作 | 支持 Actor 重命名、文件夹归类、选择与层级查询 | ✅ |
Phase 5: 材质系统增强(续)✅
| # | Feature | Description | Status |
|---|---|---|---|
| P5.1 | material.compile 诊断增强 |
同步等待编译完成,返回真实 errors[](错误文本 + 关联表达式信息)与准确计数 |
✅ |
| P5.2 | material.apply_to_component |
将材质应用到关卡 Actor 指定组件(支持 component_name、slot_index) |
✅ |
| P5.3 | 材质编辑器 Auto Layout 菜单 |
在材质编辑器 Edit 菜单注册布局命令,直接整理当前材质图 |
✅ |
| P5.4 | material.apply_to_actor |
将材质批量应用到 Actor 全部 UPrimitiveComponent |
✅ |
阶段二:C++ 增强 ✅
| # | 功能 | 说明 | 状态 |
|---|---|---|---|
| P2.1 | graph.describe |
完整图拓扑转储(所有节点、引脚、连接、位置) | ✅ |
| P2.2 | SEH 崩溃保护 | ExecuteWithCrashProtection() 中的 __try/__except 封装 |
✅ |
| P2.3 | editor.get_logs |
通过自定义 FOutputDevice 环形缓冲区进行结构化日志捕获 |
✅ |
| P2.4 | batch.execute(C++) |
单次 TCP 请求 → 串行游戏线程执行多条命令 | ✅ |
| P2.5 | Python 集成 | 新增 ActionDef + ue_logs_tail 编辑器日志桥接 |
✅ |
| P2.6 | 自定义日志分类 | 全动作范围内以 LogMCP 替换 LogTemp |
✅ |
阶段三:补丁系统 ✅
| # | 功能 | 说明 | 状态 |
|---|---|---|---|
| P3.1 | graph.describe_enhanced |
扩展拓扑信息(变量引用、完整 PinType、节点元数据);支持 compact 模式降低输出量 |
✅ |
| P3.2 | 补丁操作定义 | EPatchOpType 枚举 + FPatchOp 结构体(8 种操作类型) |
✅ |
| P3.3 | graph.apply_patch |
通过 JSON 补丁文档进行声明式图编辑 | ✅ |
| P3.4 | graph.validate_patch |
试运行校验 — 验证所有操作而不修改图 | ✅ |
| P3.5 | Python 补丁 ActionDef | 补丁动作的注册表条目、模式与示例 | ✅ |
| P3.6 | 补丁规范文档 | 更新 patch_spec.md,含完整操作参考 |
✅ |
Layout V2: Enhanced Auto-Layout ✅
layout.auto_selected/layout.auto_subtree/layout.auto_blueprint已完成 Enhanced Sugiyama 改造:最长路径分层、Barycenter 交叉优化、宽高感知间距、Pure Pin 对齐、周围节点避让、Comment 框调整。layer_spacing/row_spacing语义:>0固定间距,<=0自动间距(默认自动)。- 新参数(按动作范围):
horizontal_gap、vertical_gap、crossing_passes、pin_align_pure、avoid_surrounding、include_pure_deps、surrounding_margin、preserve_comments。
DevPlan 路径规则
- 插件开发计划唯一来源:
Plugins/UEEditorMCP/DEVPLAN.md。 - 其他临时计划文档在需求完成后应合并回该文件并移除,避免多份计划口径冲突。
Phase 4: 材质系统增强 ✅
| # | Feature | Description | Status |
|---|---|---|---|
| P4.1 | material.get_summary |
只读 Action,一次性返回材质图完整结构(表达式/连接/属性/注释) | ✅ |
| P4.2 | 通用连线方案 | 将 ConnectToExpressionInput() 从硬编码 Cast<> 重构为通用 GetInput(index) 方案 |
✅ |
| P4.3 | TextureParameter | ExpressionClassMap 新增 TextureParameter/TextureObjectParameter/TextureSampleParameter2D + create_instance 纹理覆写 |
✅ |
| P4.4 | material.auto_layout |
数据流拓扑排序分层布局 | ✅ |
| P4.5 | material.auto_comment |
包围盒注释 + 碰撞避让(60px gap, 5 iterations) | ✅ |
| P4.6 | material.remove_expression |
安全删除(断连 + ExpressionCollection 移除 + Context 反注册) | ✅ |
| P4.7 | StaticSwitchParameter | ExpressionClassMap 新增 StaticSwitchParameter/StaticComponentMaskParameter + create_instance switch 覆写 |
✅ |
| P4.8 | MaterialFunction 引用 | ExpressionClassMap 新增 MaterialFunctionCall + SetMaterialFunction() 绑定 |
✅ |
文档
- DEVPLAN.md — 详细开发计划(各阶段设计文档)
许可证
MIT
本项目基于 lilklon/UEBlueprintMCP(MIT 许可证)修改扩展。
原始代码版权归 @lilklon 所有。
README copy captured when this server was indexed; it may lag the repository. The original is authoritative.