最近 MCP 这个词在 AIGC 圈子里的热度非常高。如果你用过 Claude Desktop、Cursor、Windsurf 这类 AI 工具大概率听过“MCP Server”“工具调用”这些概念。但一说到“把 MCP 接到虚幻引擎Unreal Engine里”网上的资料就开始各说各话有人讲插件安装有人讲 Python 脚本有人直接丢一个仓库链接让你自己看真正能把协议原理、调用链路和 UE 侧怎么对接讲清楚的很少。这篇文章就是来解决这个问题的。我会从 MCP 的概念开始逐步拆解它在虚幻引擎里的集成方式然后给出可运行的 MCP Server 代码、UE 编辑器侧的本地桥接脚本以及常见报错的排查思路。不管你是刚接触 UE 的新手还是已经写过一些编辑器插件的进阶开发者都可以按文章顺序把链路跑通。顺便说明一下本文标题写的 UE5.8但 MCP 的原理不绑定某个具体 UE 版本。如果你打开 Epic Launcher 发现用的是 UE5.4、UE5.5、UE5.6同样可以按本文思路操作差异主要在个别 Python API 的命名上文中会重点提示。1. 为什么在虚幻引擎中需要 MCP1.1 MCP 到底是什么MCP 的全称是 Model Context Protocol中文常翻译成“模型上下文协议”。它是由 Anthropic 提出的一个开放协议解决的问题很直接让大语言模型能够安全、标准化地调用外部工具和获取上下文数据。在 MCP 出现之前如果你想给 AI 加一个“查询天气”的能力通常需要自己写一个 HTTP 接口然后把接口地址、请求参数、返回格式全部告诉模型。不同的人写的接口风格完全不同模型接入成本很高。MCP 做的事情就是把这一层标准化。它定义了一套基于 JSON-RPC 2.0 的通信方式AI 客户端比如 Claude Desktop可以通过固定的几种方法发现某个服务端提供了哪些工具、调用某个工具、读取某些资源。你可以把 MCP 理解成“USB 接口”无论背后是什么设备只要接口规格统一就能即插即用。对应到虚幻引擎里就是让 AI 能“看到”当前关卡有哪些 Actor、能修改某个 Actor 的属性、能在输出日志里打印信息甚至能批量生成基础蓝图节点。1.2 UE 开发者使用 MCP 的典型场景在实际开发中MCP 接入 UE 后能做的事情大致分四类能力层典型动作实际价值信息查询查询关卡 Actor 数量、获取选中对象信息、列出资产路径AI 先了解场景再提供相对准确的建议资产操作重命名资产、批量设置材质参数、创建基础蓝图类减少重复性操作把 AI 当成“编辑器宏”场景生成批量摆放置物、生成静态网格体实体、设置 Transform快速搭白盒场景省去大量手动摆放时间自动化流程运行项目测试、触发命令letCommandlet、导出数据把 AI 接入到项目构建与验收流程中其中信息查询和日志打印是最容易落地的也是本文演示的重点。因为这两类操作风险低即使 AI 理解有偏差也不会对项目资产造成不可逆的破坏。1.3 没有 MCP 时怎么实现类似效果在 MCP 还没有流行起来的时候社区里也有过一些“AI 操作 UE”的方案常见的有直接把 UE 的 Python 脚本片段发给 AI让它生成完整代码。这种方式的问题是AI 不知道你项目里具体有什么资产、哪个 Actor 叫什么名字只能凭泛化知识猜。自己写一个 WebSocket 服务用自定义协议让 AI 调用。这种方式能跑通但协议是自己的换一个 AI 客户端就得重新适配。用编辑器插件内置大模型聊天窗口。功能很强但代码量大而且相关插件通常绑定某个特定 AI 服务商不够通用。MCP 的优势恰恰在于“通用”。你只需要维护一个 MCP Server 和一个 UE 侧桥接模块就能让任何支持 MCP 的客户端连接上来。1.4 MCP 给 UE 带来的能力边界需要注意的是MCP 不是“AI 自动做游戏”的万能钥匙。它只是一个工具调用协议AI 的决策质量仍然依赖模型能力、工具描述质量和 UE 侧封装的安全边界。在引入 MCP 时要分清什么适合交给 AI什么不适合适合查询场景信息、生成临时测试资产、批量执行低风险操作、把报错日志丢给 AI 分析。不适合在未备份的情况下删除资产、自动修改主关卡、调用会导致项目无法打开的高风险编辑器命令。理解了这一点之后再看 MCP 的架构就不会被各种花哨的功能带偏。2. MCP 与 UE 的集成架构2.1 MCP 的四个核心概念在动手写代码之前必须先搞清楚 MCP 里的几个角色和术语否则看文档容易一头雾水。Host宿主指运行 AI 模型的应用程序例如 Claude Desktop、Cursor、自研的聊天客户端。它是用户交互的入口。Client客户端在 Host 内部负责与 MCP Server 建立连接发送方法请求。你可以理解成“Host 里的协议适配层”。Server服务端提供具体能力的程序例如我们即将写的ue-demo-server。它暴露一批工具Tools、资源Resources和提示Prompts。Transport传输层MCP 支持多种传输方式最常见的是 stdio标准输入输出和 Streamable HTTP。编辑器内工具场景中 stdio 最方便因为它不需要开端口。到目前为止MCP 官方主要定义了三个原语原语作用类比Tools可被 AI 调用的函数由 AI 决定何时调用类似函数列表Function CallingResources可被读取的上下文数据例如文件内容、场景快照类似“给 AI 喂资料”Prompts预定义的提示模板方便复用常见指令类似“提示词模板”其中 Tools 是本文核心因为“让 AI 操作 UE”本质上就是让 AI 调用 UE 的封装函数。2.2 UE 接入 MCP 的推荐架构目前 Unreal Editor 官方还没有内置 MCP 按钮所以我们需要自己搭建一条桥。推荐的架构分三层1. AI 客户端Host 2. MCP Server独立 Python 进程 3. UE 侧桥接模块编辑器内运行的本地 HTTP/WebSocket 服务MCP Server 本身不直接调用 UE API而是把“UE 能执行的命令”封装成工具。当 AI 决定调用某个工具时MCP Server 通过本地 HTTP 请求把指令发送给 UE 编辑器内运行的桥接服务桥接服务再通过unrealPython 模块或 C 接口真正操作编辑器。为什么中间要隔一层原因有三个UE 内置 Python 不一定能安装第三方 MCP SDK。UE 使用的 Python 环境是引擎自带的直接安装mcp包会遇到很多兼容性问题。职责分离。MCP Server 只处理协议逻辑UE 侧只处理编辑器操作任何一侧出问题都好排查。安全控制更灵活。UE 桥接服务可以只绑定127.0.0.1并且只允许白名单指令降低 AI 误操作风险。这个架构也是目前社区大多数 UE MCP 插件采用的思路。2.3 数据流与调用链路解析一次完整的调用链路可以这样理解用户在 Claude Desktop 中输入“当前关卡有多少个 Actor”Claude 从系统提示中知道 MCP Server 提供了get_level_actor_count这个工具。Claude 发送一个内部调用请求由 Host 里的 Client 通过 MCP 协议发起tools/call。MCP Server 收到请求解析出工具名和参数。MCP Server 向 UE 本地桥接服务的http://127.0.0.1:8765发送{action: get_actor_count}。UE 桥接服务调用unreal.EditorActorSubsystem查询关卡中的所有 Actor。查询结果沿着原路返回最终展示给用户。链路不算短但每一层的职责都清晰排错时可以从任意一环断开验证。3. 环境准备与版本说明3.1 需要准备的工具本文的示例需要以下环境虚幻引擎UE 5.x 系列本文以 UE5.8 版本为背景描述但核心依赖的 Python API 在 UE5.1 之后基本一致。启用 Python 编辑器脚本插件在 UE 编辑器中点击菜单Edit - Plugins搜索 Python启用Python Editor Script Plugin然后重启编辑器。Python 3.10用于运行 MCP Server 的独立 Python建议至少 3.10MCP Python SDK 要求比较新的 Python 版本。MCP Python SDK执行pip install mcp[cli]安装。支持 MCP 的客户端Claude Desktop、Cline、自研客户端均可本文会用 Python 脚本做客户端验证不强依赖具体商业软件。本地代码编辑器VS Code 或任何你顺手的编辑器。3.2 版本差异说明以下是几个容易踩到的版本差异点差异点说明unreal.EditorActorSubsystemUE5.x 常见 API推荐使用旧版本如果找不到可改用unreal.EditorLevelLibrary.get_all_level_actors()MCP SDK 的FastMCP类不同版本初始化方式可能略有不同但mcp.tool()装饰器基本稳定Python 版本UE 内置 Python 与独立 Python 的版本可能不同桥接时尽量使用双方都支持的语法编辑器启用 Python新版 UE 的 Python 插件入口位置可能变化建议直接在 Plugins 面板搜索如果你的环境和本文不同先不要急着改代码优先对照版本差异调整 API 名称即可。3.3 一个最小可行目录结构建议按下面的结构组织代码ue-mcp-demo/ ├── mcp_ue_demo_server.py # MCP Server独立Python运行 ├── mcp_ue_demo_client.py # 测试客户端脚本 ├── ue_bridge.py # UE 编辑器内运行的本地桥接服务 ├── claude_desktop_config.json # 客户端配置示例可选 └── README.md这样分层的好处是MCP Server 可以脱离 UE 单独测试UE 桥接服务也可以单独用curl测试定位问题非常方便。4. 核心协议拆解JSON-RPC 与工具调用4.1 MCP 基于 JSON-RPC 2.0MCP 的通信协议建立在 JSON-RPC 2.0 之上。JSON-RPC 是一种很轻量的远程调用协议请求和响应都是 JSON 对象基本结构如下{ jsonrpc: 2.0, id: 1, method: 方法名, params: {} }响应则包含result或error。MCP 复用了这套模型定义了自己的方法集合。作为入门你不需要从头实现 JSON-RPC官方 SDK 已经处理好了底层通信但理解这个基础有助于看日志。4.2 三个关键方法在 MCP 协议里有三个方法必须理解第一个是initialize。当客户端连接 MCP Server 后第一件事就是握手。客户端告诉服务端自己的协议版本、客户端名称等服务端返回支持的协议版本和服务端信息。这个过程几乎被 SDK 透明处理但如果你自己抓包排查问题会经常看到它。第二个是tools/list。客户端询问“你这个 Server 提供哪些工具”。注意这里返回的是工具的名称、描述和参数格式JSON Schema并不是执行结果。AI 模型就是依赖这个列表来决定何时调用哪个工具。第三个是tools/call。客户端携带工具名和参数请求执行某个工具。服务端执行完毕后返回执行结果。这个结果会作为模型生成回答的上下文。下面是一段tools/call请求的简化示例{ jsonrpc: 2.0, id: 9, method: tools/call, params: { name: print_to_ue_log, arguments: { message: Hello UE } } }对应的响应{ jsonrpc: 2.0, id: 9, result: { content: [ { type: text, text: {\printed\: \Hello UE\} } ] } }在 MCP Server 的日志里看到这类结构时就可以快速判断是请求没收到、工具名不匹配还是参数校验失败。4.3 工具描述Tool Schema怎么写工具描述的准确性直接影响 AI 是否愿意调用它。同一个工具下面的写法差距很大。不够清晰的写法查询Actor数量较为清晰的写法查询当前UE关卡中的Actor总数用于评估场景复杂度后者包含了“当前关卡”“总数”“用于什么目的”这些信息。当 AI 面对“场景里对象多不多”这类模糊问题的时候更可能命中后者。参数 Schema 同样重要。比如我们设计一个“打印日志到 UE Output Log”的工具参数是message用 Python 的FastMCP写可以利用类型注解自动生成 Schemamcp.tool() def print_to_ue_log(message: str): 在UE输出日志中打印一条消息方便确认AI到UE的链路是否通畅。 ...这里message: str会让 SDK 自动生成{type: string}的 Schema。如果参数是整数、布尔值类型也要写清楚。4.4 一次完整工具调用的数据包示例为了让你在排查时不慌下面给出一次“查询 Actor 数量”的完整 JSON 交互示意但不要求手动构造这些数据理解即可。客户端发起tools/call{ jsonrpc: 2.0, id: 2, method: tools/call, params: { name: get_level_actor_count, arguments: {} } }服务端在 UE 桥接层拿到真实数量后返回给模型{ jsonrpc: 2.0, id: 2, result: { content: [ { type: text, text: {\ok\: true, \actor_count\: 345} } ] } }模型看到345之后才会组织自然语言回答用户“当前关卡共有 345 个 Actor。”到这里MCP 的协议原理就已经足够支撑我们写代码了。下面开始实战。5. 实战从零搭建 UE 的 MCP Server5.1 安装 MCP Python SDK在独立 Python 环境中执行pip install mcp[cli]安装完成后可以用下面的命令确认版本python -m mcp --version注意不要在 UE 内置 Python 环境里执行这个命令。UE 自带的 Python 环境通常不联网、缺少 pip 管理机制强行安装容易破坏引擎环境。这也是我们选择“MCP Server 独立运行 UE 本地桥接”方案的重要原因。5.2 编写第一个 MCP Server新建文件mcp_ue_demo_server.py内容如下# 文件路径ue-mcp-demo/mcp_ue_demo_server.py from mcp.server.fastmcp import FastMCP mcp FastMCP(ue-demo-server) mcp.tool() def get_level_actor_count(): 查询当前UE关卡中的Actor总数当前为演示数据。 # 后续会改成通过本地HTTP调用UE编辑器获取真实数据 return {actor_count: 0, source: demo} mcp.tool() def print_to_ue_log(message: str): 在UE输出日志中打印一条消息。 # 此处暂不真正连接UE只返回确认信息 return {printed: message, source: demo} if __name__ __main__: mcp.run()这段代码做了三件事创建了一个名为ue-demo-server的 MCP Server 实例。用mcp.tool()注册了两个工具分别是查询 Actor 数量和打印日志。调用mcp.run()启动服务默认使用 stdio 传输。mcp.run()默认在标准输入输出上监听请求。这样启动后它不会自己创建端口而是等着客户端把它当作子进程启动并读写标准流。好处是不需要担心端口冲突缺点是只能在 CLI 模式下用。5.3 用客户端脚本验证服务端为了确认 Server 能正常工作我们再写一个 Python 客户端。这个过程很重要因为如果连最基本的tools/list和tools/call都走不通后面接 UE 只会更乱。新建文件mcp_ue_demo_client.py# 文件路径ue-mcp-demo/mcp_ue_demo_client.py import asyncio import sys from mcp import ClientSession, StdioServerParameters from mcp.client.stdio import stdio_client async def main(): server_params StdioServerParameters( commandsys.executable, args[mcp_ue_demo_server.py], ) async with stdio_client(server_params) as (read, write): async with ClientSession(read, write) as session: await session.initialize() tools await session.list_tools() print(可用工具列表:, [tool.name for tool in tools]) result await session.call_tool( print_to_ue_log, {message: Hello UE}, ) print(调用结果:, result) if __name__ __main__: asyncio.run(main())运行python mcp_ue_demo_client.py预期输出大致是可用工具列表: [get_level_actor_count, print_to_ue_log] 调用结果: ...这里使用sys.executable作为启动命令可以避免多 Python 环境混在一起时选错解释器的问题。5.4 在 UE 编辑器内暴露真实 Actor 查询能力接下来写 UE 侧桥接服务。打开 UE 编辑器在菜单中找到Edit - Project Settings - Plugins - Python或者直接用编辑器内的 Python 脚本编辑器运行下面的代码。新建文件ue_bridge.py这个文件需要在 UE 内置 Python 中运行# 文件路径ue-mcp-demo/ue_bridge.py # 在 UE 编辑器的 Python 脚本编辑器中运行或者作为资产脚本运行 import http.server import json import threading import unreal class UERequestHandler(http.server.BaseHTTPRequestHandler): def do_POST(self): length int(self.headers.get(Content-Length, 0)) body json.loads(self.rfile.read(length).decode(utf-8)) action body.get(action) if action get_actor_count: response self._get_actor_count() elif action print_log: unreal.log(body.get(message, )) response {ok: True} else: response {ok: False, error: funknown action: {action}} data json.dumps(response).encode(utf-8) self.send_response(200) self.send_header(Content-Type, application/json) self.send_header(Content-Length, str(len(data))) self.end_headers() self.wfile.write(data) def _get_actor_count(self): try: subsystem unreal.EditorActorSubsystem() actors subsystem.get_all_level_actors() return {ok: True, actor_count: len(actors)} except Exception as exc: return {ok: False, error: str(exc)} def log_message(self, format, *args): # 避免HTTP访问日志刷屏 return def start_bridge(port8765): server http.server.HTTPServer((127.0.0.1, port), UERequestHandler) thread threading.Thread(targetserver.serve_forever, daemonTrue) thread.start() unreal.log(fUE MCP bridge started on http://127.0.0.1:{port}) return server if __name__ __main__: start_bridge()启动后UE 编辑器会运行一个只监听本机的 HTTP 服务。为了让 MCP Server 能访问需要让桥接服务持续运行所以用threading.Thread把它放到后台线程。几点注意127.0.0.1表示只允许本机访问不要让外网连进来。如果unreal.EditorActorSubsystem在你的 UE 版本里不存在改用unreal.EditorLevelLibrary.get_all_level_actors()。get_all_level_actors()返回的是关卡顶层 Actor 列表不包含子 Actor 层级初学者使用时要知道这个口径。5.5 让 MCP Server 调用 UE 本地桥接服务现在修改mcp_ue_demo_server.py让两个工具真正访问 UE。完整代码如下# 文件路径ue-mcp-demo/mcp_ue_demo_server.py import json import urllib.request from mcp.server.fastmcp import FastMCP UE_BRIDGE_URL http://127.0.0.1:8765 mcp FastMCP(ue-demo-server) def call_ue_bridge(payload: dict): data json.dumps(payload).encode(utf-8) req urllib.request.Request( UE_BRIDGE_URL, datadata, headers{Content-Type: application/json}, ) with urllib.request.urlopen(req, timeout3) as resp: return json.loads(resp.read().decode(utf-8)) mcp.tool() def get_level_actor_count(): 查询当前UE关卡中的Actor总数用于评估场景复杂度。 return call_ue_bridge({action: get_actor_count}) mcp.tool() def print_to_ue_log(message: str): 在UE输出日志中打印一条消息方便确认AI到UE的链路是否通畅。 return call_ue_bridge({action: print_log, message: message}) if __name__ __main__: mcp.run()此时运行客户端脚本实际效果是先由 MCP Server 请求 UE 桥接服务再通过unrealAPI 查询真实关卡数据。如果 UE 编辑器没有启动桥接服务MCP Server 会在urllib.request.urlopen处抛出连接拒绝异常这也是后面排查的重点。5.6 接入 Claude Desktop 等支持 MCP 的客户端如果你希望让 Claude Desktop 直接连接这个 MCP Server可以在claude_desktop_config.json中配置 MCP 服务。配置查找入口为 Claude Desktop 设置中的 Developer / MCP 栏目不同客户端入口不同。参考配置{ mcpServers: { ue-demo: { command: python, args: [D:/ue-mcp-demo/mcp_ue_demo_server.py] } } }关键点command最好写独立的 Python 解释器绝对路径例如C:/Python310/python.exe避免系统同时存在多个 Python 时选错。args中脚本路径建议写绝对路径。需要先启动 UE 编辑器内的桥接服务再打开客户端否则工具调用会失败。配置完成后你可以在客户端里直接问“当前关卡有多少个 Actor”AI 会先通过get_level_actor_count拿到真实数据再组织回答。这个 Demo 虽然简单但从“协议理解”到“UE 真实数据回传”的完整链路已经通了。6. 常见问题与排查思路先列出几个最常见的报错现场和对应处理方式问题现象常见原因解决思路MCP Client 连接后卡住tools/list超时MCP Server 启动失败或 Python 解释器路径不对先单独运行python mcp_ue_demo_server.py确认没有语法错误ConnectionRefusedErrorUE 桥接服务未启动或端口不一致在 UE 编辑器中运行ue_bridge.py确认输出日志里有 bridge started工具调用返回unknown actionUE 桥接收到的 JSON 缺少action字段打印请求 body检查 MCP Server 中call_ue_bridge参数拼写UE 侧找不到unreal.EditorActorSubsystemUE 版本较旧或 Python 插件未启用改用unreal.EditorLevelLibrary.get_all_level_actors()pip install mcp报错本机 Python 版本过低或安装到了错误的环境检查执行的是不是指定的 Python使用python -m pipUE 编辑器卡住或崩溃桥接服务在主线程阻塞或调用了不安全的编辑器 API改用线程启动 HTTP 服务复杂编辑器操作放到游戏线程AI 反复调用错误工具工具描述不清晰或参数 Schema 不匹配优化工具 description尽量在描述中写清楚适用场景下面展开几个重点问题的排查流程。第一个是“MCP Server 启动失败”。当你配置好 Claude Desktop 后客户端里可能只显示“工具加载失败”。此时应该脱离客户端直接手动运行python mcp_ue_demo_server.py。如果进程能挂住不退出说明 Server 本身没问题如果直接报错优先检查 Python 版本和 MCP SDK 安装状态。第二个是“UE 桥接服务没起来”。在 UE 编辑器里运行脚本后应该在 Output Log 看到UE MCP bridge started on http://127.0.0.1:8765。看不到说明脚本没有被执行先检查插件是否启用再看是否有 Python 语法错误。确认启动后可以用浏览器或curl测试curl -X POST http://127.0.0.1:8765 -H Content-Type: application/json -d {\action\:\get_actor_count\}如果返回 JSON 而不是 HTML 错误页面说明桥接服务在线。第三个是“线程安全问题”。很多初学者在 UE 内部写 HTTP 服务时直接在主线程serve_forever()导致编辑器界面无法刷新。本文的示例把服务放在daemonTrue的子线程里问题会缓解但子线程中直接调用unrealAPI 仍存在跨线程风险。临时验证没问题生产环境建议把请求塞入队列由编辑器主线程统一消费或者用unreal.CallInEditor之类的延迟调度机制。由于不同 UE 版本的调度 API 不完全一致这里不列出固定代码你需要在项目里按实际版本实现。7. 最佳实践与工程建议MCP 接入 UE 的价值很大但如果缺少工程约束风险同样很大。下面几条建议来自实际项目里最常见的翻车点。7.1 权限与安全边界永远记住一个原则AI 工具应该拥有最小必要权限。在 UE 桥接层建议在代码里维护一个“允许执行的操作白名单”。不要把所有请求都转发给unreal而是只开放你验证过的低风险指令。例如查询类操作默认放行删除资产、批量修改属性必须加二次确认参数。另外本地 HTTP 服务必须绑定127.0.0.1不要绑定0.0.0.0。如果你在公网服务器上跑 UE 编辑器还要在防火墙层面限制入站规则。建议给桥接请求增加一个 Token 头避免局域网内其他进程伪造请求。7.2 工具粒度设计工具并不是越细越好。太细的工具会让 AI 需要多次调用才能完成一件事增加错误概率太粗的工具又会让 AI 在一次调用里执行太多操作风险难以控制。比较合理的设计是查询类工具粒度可以偏细例如get_selected_actor_info、get_level_actor_count、get_material_list。操作类工具粒度要偏粗且语义明确例如duplicate_selected_actors、set_actors_visibility一次只做一类操作。危险操作单独归类例如delete_asset不仅要在描述里强调风险还要在参数里强制传入confirm: true。7.3 日志与调试MCP Server 运行在独立进程里UE 桥接运行在编辑器进程里两者日志分散必须统一管理。建议在 MCP Server 侧每次收到tools/call时打印完整的工具名和参数在 UE 桥接侧打印收到的action和响应耗时。这样即使 AI 表现奇怪也能通过日志判断是模型决策错了、协议传参错了还是 UE 执行失败了。7.4 会话控制与超时MCP Server 的urllib.request.urlopen需要设置timeout否则 UE 桥接服务卡死会导致 AI 客户端长时间无响应。示例里用了 3 秒超时实际项目中建议根据操作类型区分查询类操作2 到 3 秒。资产生成类操作根据项目规模设置 10 到 30 秒。涉及构建、导入大资产的操作不要用 HTTP 同步调用而是先触发异步任务再轮询任务状态。7.5 性能与稳定性建议如果查询的关卡特别大get_all_level_actors()返回的 Actor 列表会很长。不要直接把几万个 Actor 信息塞给 MCP 工具那会让 AI 的上下文迅速爆掉。建议工具返回统计信息和摘要细节信息按需查询。例如返回actor_count、visible_actor_count、selected_actor_count。只返回前 50 个 Actor 的名称和类型。提供get_actor_details(actor_name)来查单个对象详情。这样既能让 AI 了解全局又不会因为上下文过长而忽略关键信息。8. 总结与后续学习路线本文从 MCP 的协议概念讲起分析了它在虚幻引擎中的集成架构然后通过一个可运行的 Demo 把整条链路打通AI 客户端 - MCP Server - UE 本地桥接 -unrealPython API - 关卡 Actor 数据。整个过程中你既看到了 MCP 最核心的tools/list和tools/call也看到了 UE 侧暴露真实能力的封装方式。跑通这个 Demo 之后下一步可以尝试的方向有三个扩展查询类工具把选中 Actor 信息、地形大小、关卡内资产列表都封装成 MCP 工具让 AI 更了解你的项目。加入低风险操作类工具例如批量设置 Actor 可见性、批量调整缩放、自动命名选中对象先在小关卡里验证稳定性。搭建你自己的 AI 编辑器助手把 MCP Server 接入自研客户端与团队内部的资产规范、命名规则结合形成一套自动检查工具。需要特别提醒的是版本差异是这个领域最常见的坑。MCP SDK 更新很快UE 的 Python API 也在变化如果你在照着本文操作时遇到接口不存在或行为不一致的问题优先去查自己当前版本的官方文档而不是怀疑思路错了。协议本身是稳定的学会看协议日志和排查链路比死记某个版本 API 有用得多。如果你按本文把 Demo 跑通了建议先在自己的测试项目里把get_level_actor_count和print_to_ue_log玩熟再逐步加入更有风险的操作。保留一份备份项目会让后面的探索从容很多。