UnrealMCP
虚幻引擎最全面的MCP服务器。 87工具, 45种蓝图节点类型, 16个类别 --通过AI控制整个虚幻编辑器。
一个混合的Python+C++系统,允许AI助手(Claude、Cursor、Windsurf)创建蓝图、操纵节点图、管理参与者、编辑材料、构建UI小部件、设置动画状态机、调试带有断点的蓝图、填充数据表、配置增强输入——所有这些都可以通过自然语言通过 模型上下文协议.
专为虚幻引擎5.6+打造。
为什么是不现实的CP?
| UnrealMCP | Epic的内置MCP | 其他解决方案 |
|---|
| 工具 | 87 | 基本编辑器操作 | ~20-30 |
| 蓝图节点类型 | 45 | 有限 | 基本 |
| 类别 | 16 | 少量 | 3-4 |
| C++命令处理程序 | 82 | 不适用 | 不适用 |
| 蓝图调试 | 是 | 否 | 否 |
| 动画蓝图 | 是 | 否 | 否 |
| 小部件蓝图 | 是 | 否 | 否 |
| DataTable编辑 | 是 | 否 | 否 |
| 增强输入设置 | 是 | 否 | 否 |
| 生产状态 | 生产等级 | 基本 | 实验 |
建筑
AI Client ──stdio──> Python MCP Server ──TCP:55555──> C++ UE5 Editor Plugin
(87 tools) (82 command handlers)
mcp-server/ plugin/UnrealMCP/
- Python MCP服务器 --通过stdio实现MCP协议。将工具调用转换为TCP命令。
- C++UE5插件 --在虚幻编辑器中运行。监听TCP端口55555,使用本机UE5 C++API在游戏线程上执行命令。
- 协议 --4字节大端序长度前缀+JSON有效载荷。基于UUID的请求/响应匹配。支持高达10MB的有效载荷(用于截图)。
在端口55557上与Epic的内置MCP一起运行,两者独立运行,没有冲突。
快速设置
1.安装Python MCP服务器
cd mcp-server
python -m venv .venv
.venv/Scripts/activate # Windows
pip install -e .
2.安装UE5插件
复制 plugin/UnrealMCP/ 进入UE5项目 Plugins/ 文件夹并编译。通过检查输出日志进行验证:
UnrealMCP: Listening on port 55555
3.配置您的AI客户端
添加到您的 .claude.json (或使用 claude mcp add):
{
"mcpServers": {
"UnrealMCP": {
"command": "
/mcp-server/.venv/Scripts/python.exe",
"args": ["-m", "unreal_mcp.server"],
"cwd": "
/mcp-server"
}
}
}
你能用它做什么?
- 人工智能辅助游戏原型 --用自然语言描述游戏机制,让人工智能创建具有正确节点和连接的蓝图
- 自动化蓝图构建 --以编程方式构建复杂的节点图(健康系统、库存、人工智能行为)并自动布局它们
- 关卡设计 --创建/加载/保存地图,管理流媒体子级别,生成角色,设置变换,分配材质
- 运行时测试 --在编辑器会话中启动播放、暂停/恢复游戏、读取日志、在运行时使用断点调试蓝图
- UI原型设计 --使用17种小部件类型创建小部件蓝图,设置属性,构建完整的UMG层次结构
- 动画设置 --创建动画蓝图、状态机、过渡、混合空间和蒙太奇
- 数据驱动设计 --为物品、统计数据、对话、战利品创建和填充数据表;从CSV导入
- 输入配置 --创建InputActions和InputMappingContexts,使用修饰符和触发器配置WASD/游戏手柄绑定
- 批量操作 --生成数十个参与者,添加许多节点,或在单个工具调用中连接整个图形
工具参考
蓝图工具(11)
| 工具 | 说明 | 关键参数 |
|---|
create_blueprint | 创建新的Blueprint类或接口 | name, parent_class (演员、爪子、角色、GameModeBase、玩家控制器、演员组件、场景组件), path, blueprint_type (正常,接口) |
list_blueprints | 列出目录中的所有Blueprint资产 | path, recursive |
get_blueprint_info | 获取完整的蓝图结构 | asset_path --返回变量、函数、组件、事件图、父类 |
compile_blueprint | 使用详细的错误诊断进行编译 | asset_path --返回状态、错误计数、警告计数、每个节点的错误详细信息 |
delete_blueprint | 删除蓝图资产 | asset_path |
add_blueprint_variable | 添加类型化成员变量 | asset_path, variable_name, variable_type (布尔、整数、浮点、双精度、字符串、向量、旋转器、变换、对象:类名等), default_value, category, is_instance_editable |
remove_blueprint_variable | 删除成员变量 | asset_path, variable_name |
add_blueprint_component | 向层次结构中添加组件 | asset_path, component_class, component_name, parent_component, location, rotation, scale |
set_blueprint_component_defaults | 在BP组件模板上设置默认属性 | asset_path, component_name, property_name, property_value |
remove_blueprint_component | 从SCS层次结构中删除组件 | asset_path, component_name, promote_children |
implement_interface | 向蓝图添加蓝图接口 | asset_path, interface_path |
节点图工具(9)
| 工具 | 说明 | 关键参数 |
|---|
add_node | 将节点添加到蓝图图中 | asset_path, node_type (45种——见下文), function_name, target_class, node_position, params |
get_graph_nodes | 获取所有具有引脚和连接的节点 | asset_path, graph_name --返回节点ID、类、位置、引脚详细信息、连接图 |
connect_pins | 将输出引脚连接到输入引脚 | asset_path, source_node_id, source_pin_name, target_node_id, target_pin_name |
disconnect_pins | 断开引脚上的所有连接 | asset_path, node_id, pin_name |
delete_node | 从图中删除节点 | asset_path, node_id |
set_pin_value | 设置引脚的默认值 | asset_path, node_id, pin_name, value |
create_function | 创建新的函数图 | asset_path, function_name, inputs, outputs |
delete_function | 从蓝图中删除函数 | asset_path, function_name |
arrange_graph | 使用分层图算法自动布局所有节点 | asset_path, graph_name, horizontal_spacing, vertical_spacing |
45 Supported Node Types (click to expand)
| 类别 | 节点类型 | 描述 | 必填参数 |
|---|
| 函数 | CallFunction | 呼叫任何UFUNCTION | function_name, target_class |
| CommutativeAssociativeBinaryOperator | 可扩展数学(加法、乘法…) | function_name, target_class |
| 事件 | Event | 内置事件 | 参数: event_name |
| CustomEvent | 自定义事件 | 参数: event_name |
| EnhancedInputAction | 增强输入事件 | 参数: input_action_path |
| Self | 自我参照 | -- |
| 变量 | VariableGet | 获取变量 | params: variable_name |
| VariableSet | 设置变量 | params: variable_name |
| 流量控制 | Branch | If/else | -- |
| Sequence | 执行顺序 | 参数: num_outputs |
| MultiGate | 多个执行输出 | -- |
| Select | 按索引选择 | -- |
| DoOnceMultiInput | 多输入DoOnce | -- |
| MacroInstance | 标准宏(ForLoop、DoOnce、WhileLoop、ForEachLoop、Gate、FlipFlop、DoN、IsValid) | 参数: macro_name |
| ForEachElementInEnum | 循环枚举值 | 参数: enum_name |
| 开关 | SwitchInteger | 打开int | -- |
| SwitchString | 打开字符串 | -- |
| SwitchName | 打开FName | -- |
| SwitchEnum | 打开枚举 | 参数: enum_name |
| 铸造 | DynamicCast | 转换为 | params: target_class |
| ClassDynamicCast | 类转换 | 参数: target_class |
| 结构体 | MakeStruct | 制作结构 | params: struct_type |
| BreakStruct | 断开结构 | 参数: struct_type |
| SetFieldsInStruct | 设置结构字段 | params: struct_type |
| 容器 | MakeArray | 使数组变为文字 | num_inputs |
| MakeMap | 使地图文字化 | -- |
| MakeSet | 设置文字 | -- |
| GetArrayItem | 数组索引访问 | -- |
| 产卵 | SpawnActorFromClass | 生成演员节点 | -- |
| GenericCreateObject | 构造对象 | -- |
| AddComponentByClass | 添加组件 | -- |
| CreateWidget | 创建小部件 | 参数: widget_class |
| 代表 | CreateDelegate | 创建委托绑定 | -- |
| AddDelegate | 绑定到调度器 | params: delegate_name |
| RemoveDelegate | 解除与调度程序 | 参数的绑定: delegate_name |
| CallDelegate | 消防调度员 | 参数: delegate_name |
| ClearDelegate | 清除所有绑定 | 参数: delegate_name |
| 文本 | FormatText | 设置带通配符的文本格式 | -- |
| EnumLiteral | 枚举值文字 | params: enum_name |
| 杂项 | Timeline | 时间线 | 参数: timeline_name |
| Knot | 重新路由节点 | -- |
| LoadAsset | 异步加载资产 | -- |
| EaseFunction | 缓动/插值 | -- |
| GetClassDefaults | 获取类默认值 | -- |
| GetDataTableRow | 数据表查找 | -- |
示例:
PrintString → node_type="CallFunction", function_name="PrintString", target_class="KismetSystemLibrary"
Delay → node_type="CallFunction", function_name="Delay", target_class="KismetSystemLibrary"
Branch → node_type="Branch"
For Loop → node_type="MacroInstance", params={"macro_name": "ForLoop"}
Cast To Actor → node_type="DynamicCast", params={"target_class": "Character"}
Make Vector → node_type="MakeStruct", params={"struct_type": "Vector"}
Spawn Actor → node_type="SpawnActorFromClass"
Timeline → node_type="Timeline", params={"timeline_name": "DoorTimeline"}
Input Action → node_type="EnhancedInputAction", params={"input_action_path": "/Game/Input/IA_Jump"}
演员工具(6)
| 工具 | 说明 | 关键参数 |
|---|
spawn_actor | 生成一个actor或Blueprint实例 | actor_class, name, location, rotation, scale, blueprint_path |
delete_actor | 从级别中删除演员 | actor_name |
set_actor_transform | 设置位置、旋转和/或比例 | actor_name, location, rotation, scale |
get_actors_in_level | 列出所有演员(世界大纲视图) | class_filter, name_filter, tag_filter |
find_actors | 按名称模式搜索演员 | query |
duplicate_actor | 用偏移量复制演员 | actor_name, new_name, location_offset |
属性工具(5)
| 工具 | 说明 | 关键参数 |
|---|
get_object_properties | 读取所有属性(相当于详细信息面板) | object_path, category_filter, include_inherited |
set_object_property | 设置带有编辑器通知的属性 | object_path, property_name (支持点符号: RelativeLocation.X), property_value |
get_component_hierarchy | 获取组件树 | actor_name |
get_class_defaults | 获取类默认对象属性 | class_name |
set_component_property | 在特定组件上设置属性 | actor_name, component_name, property_name, property_value |
材料工具(4)
| 工具 | 说明 | 关键参数 |
|---|
create_material | 创建具有初始值的材质 | name, path, base_color, roughness, metallic |
assign_material | 将材质应用于网格组件 | actor_name, material_path, slot, component_name |
modify_material | 更新材料属性 | asset_path, base_color, roughness, metallic, scalar_params, vector_params |
get_material_info | 获取物料参数和元数据 | asset_path |
水平工具(7)
| 工具 | 说明 | 关键参数 |
|---|
get_level_info | 获取世界名称、持久级别和流媒体子级别 | -- |
create_level | 创建新的空白地图或从模板创建 | save_path, template_path |
save_level | 保存当前地图或保存所有脏包 | asset_path, save_all |
load_level | 打开现有地图 | map_path |
add_streaming_level | 添加流媒体子级别 | package_name, streaming_class, location, rotation, create_new |
remove_streaming_level | 删除流媒体子级别 | package_name |
set_level_visibility | 显示/隐藏子级别 | package_name, visible, make_current |
资产工具(5)
| 工具 | 说明 | 关键参数 |
|---|
import_asset | 导入FBX、OBJ、PNG、WAV等格式。 | file_path, destination_path, asset_name |
search_assets | 按类型和名称搜索内容浏览器 | path, type, name_pattern, recursive |
get_asset_info | 获取详细的资产元数据 | asset_path |
delete_asset | 通过参照检查删除资产 | asset_path, force |
rename_asset | 重命名或移动资产 | asset_path, new_path |
视口工具(2)
| 工具 | 说明 | 关键参数 |
|---|
take_screenshot | 将编辑器窗口捕获为PNG格式 | width, height, filename |
focus_viewport | 移动编辑器相机 | target, location, rotation, distance |
控制台工具(3)
| 工具 | 说明 | 关键参数 |
|---|
get_console_logs | 阅读最近的日志消息 | count, verbosity_filter, category_filter |
execute_console_command | 运行控制台命令 | command, target (编辑器或馅饼) |
batch_execute | 在一次TCP往返中执行多个命令 | commands, stop_on_error |
PIE工具(4)
| 工具 | 说明 | 关键参数 |
|---|
start_pie | 在编辑器中开始播放 | mode (视口、new_window、模拟) |
stop_pie | 停止PIE会话 | -- |
get_pie_status | 获取PIE状态 | -- |
set_pie_paused | 暂停或继续 | paused |
批处理工具(3)
| 工具 | 说明 | 关键参数 |
|---|
batch_add_nodes | 在一次调用中添加多个节点 | asset_path, nodes, stop_on_error |
batch_pin_operations | 在一次调用中连接引脚并设置值 | asset_path, connections, pin_values |
batch_spawn_actors | 在一次通话中培养多个演员 | actors, stop_on_error |
小工具(5)
| 工具 | 说明 | 关键参数 |
|---|
create_widget_blueprint | 创建UMG小部件蓝图 | name, path, root_widget_type |
add_widget | 添加一个小部件(17种类型:按钮、文本块、图像、进度条等) | asset_path, widget_type, widget_name, parent_name, slot_properties |
set_widget_property | 设置小部件属性 | asset_path, widget_name, property_name, property_value |
get_widget_tree | 获取完整的小部件层次结构 | asset_path |
remove_widget | 删除小部件 | asset_path, widget_name |
动画工具(7)
| 工具 | 说明 | 关键参数 |
|---|
create_anim_blueprint | 创建动画蓝图 | name, skeleton_path, path |
add_anim_state | 向AnimGraph状态机添加状态 | asset_path, state_name, animation_asset |
add_anim_transition | 添加状态之间的转换 | asset_path, source_state, target_state, duration, blend_mode |
set_anim_transition_rule | 设置转换条件 | asset_path, source_state, target_state, rule_type |
add_blend_space | 创建BlendSpace资源 | name, skeleton_path, axis_x_name, axis_y_name, samples |
add_anim_montage | 创建动画蒙太奇 | name, animation_path, slot_name |
get_anim_graph | 获取状态机结构 | asset_path |
调试工具(5)
| 工具 | 说明 | 关键参数 |
|---|
set_breakpoint | 在节点上设置/切换断点 | asset_path, node_id, graph_name, enabled |
get_breakpoints | 列出蓝图中的所有断点 | asset_path |
get_watch_values | 读取观察到的引脚值(暂停PIE) | asset_path |
step_execution | Step蓝图调试器 | step_type (进入、结束、退出、简历) |
get_call_stack | 暂停时获取执行跟踪 | -- |
DataTable工具(6)
| 工具 | 说明 | 关键参数 |
|---|
create_data_table | 使用行结构创建DataTable | asset_name, package_path, row_struct |
add_data_table_row | 添加一行字段值 | asset_path, row_name, values |
modify_data_table_row | 更新一行中的特定字段 | asset_path, row_name, values |
delete_data_table_row | 删除一行 | asset_path, row_name |
get_data_table_rows | 获取所有具有字段值的行 | asset_path, row_name |
import_data_table_csv | 从CSV字符串导入行 | asset_path, csv_data, append |
增强型输入工具(5)
| 工具 | 说明 | 关键参数 |
|---|
create_input_action | 创建增强的输入操作资产 | asset_name, package_path, value_type (布尔值、轴1D、轴2D、轴3D) |
create_input_mapping_context | 创建输入映射上下文 | asset_name, package_path |
add_input_mapping | 将键映射到具有修饰符和触发器的InputAction | context_path, action_path, key, modifiers, triggers |
remove_input_mapping | 删除映射 | context_path, action_path, key |
get_input_mapping_context | 从上下文中读取所有映射 | context_path |
技术细节
使用UE5 C++API
- 蓝图:
FKismetEditorUtilities::CreateBlueprint(), FBlueprintEditorUtils::AddMemberVariable(), CompileBlueprint() - 节点图:
UK2Node_CallFunction, UK2Node_Event, UK2Node_IfThenElse, UEdGraphSchema_K2::TryCreateConnection() - 属性:
FProperty::ImportText_Direct() / ExportTextItem_Direct(), PreEditChange() / PostEditChangeProperty() - 材料:
UMaterialFactoryNew::FactoryCreateNew(), UMaterial::GetEditorOnlyData(), UMaterialEditingLibrary - 等级:
UEditorLoadingAndSavingUtils, UEditorLevelUtils, FEditorFileUtils - 资产:
UAutomatedAssetImportData, ImportAssetsAutomated(), IAssetRegistry::GetAssets() - 馅饼:
GEditor->RequestPlaySession(), RequestEndPlayMap(), SetPIEWorldsPaused() - 数据表:
UDataTableFactory, FDataTableEditorUtils::AddRow(), CreateTableFromCSVString() - 增强输入:
UInputAction, UInputMappingContext::MapKey(),修饰符和触发器 - 截图:Win32
PrintWindow(), IImageWrapper PNG编码 - 线程安全:所有命令通过以下方式在游戏线程上执行
AsyncTask(ENamedThreads::GameThread),通过以下方式撤消支持 FScopedTransaction
项目结构
UnrealMCP/
mcp-server/ # Python MCP server
src/unreal_mcp/
server.py # Entry point, FastMCP setup
connection.py # TCP client (4-byte prefix protocol)
tools/ # Tool definitions by category
blueprint.py # 11 Blueprint tools
node_graph.py # 9 Node Graph tools
actor.py # 6 Actor tools
property.py # 5 Property tools
material.py # 4 Material tools
viewport.py # 2 Viewport tools
console.py # 3 Console tools
level.py # 7 Level tools
asset.py # 5 Asset tools
pie.py # 4 PIE tools
batch.py # 3 Batch tools
widget.py # 5 Widget tools
anim.py # 7 Animation tools
debug.py # 5 Debug tools
datatable.py # 6 DataTable tools
input.py # 5 Input tools
plugin/UnrealMCP/ # C++ UE5 editor plugin
Source/UnrealMCP/
Private/
MCPTCPServer.cpp # TCP listener, command dispatch
Commands/ # 82 command handlers by category
Public/
Commands/ # Header files
需求
- 虚幻引擎5.6+
- Python 3.10+
- MCP SDK 1.0+(
pip install mcp) - Windows(主要;macOS/Linux未测试)
- Visual Studio 2022(用于插件编译)
- MCP兼容的AI客户端(克劳德代码、克劳德桌面、光标、Windsurf等)
贡献
欢迎捐款。看 进展.md 关于路线图和已知问题。
许可证
麻省理工学院