很多玩 Blender 的朋友应该都遇到过这种场面:建模到一半想批量改参数,脚本写了一半查 API 查到头皮发麻,或者想做个复杂的自动化操作却懒得手动点几千下。我刚接触 Blender 5.2.2 的时候,就在想有没有一种办法,让 AI 直接听懂我的话,然后帮我操作 Blender。后来研究了一圈,发现把 MCP Server 和 VS Code Copilot 串起来,还真能实现。这套组合装好之后,你在 VS Code 里用自然语言跟 Copilot 说“给选中物体加一个倒角修改器,强度 0.2”,它就能通过 MCP Server 把指令翻译成 Blender 能执行的 Python 命令,直接在 Blender 里把活干了。这篇教程就是我踩完坑之后的完整记录,从安装到配置再到实际调用,一步一步都能照着做,适合想用 AI 解放双手的建模师、场景设计师,也适合刚接触 Blender 自动化的小白。
先说明一下,Blender 5.2.2 是我当前使用的版本,虽然 Blender 官方版本迭代很快,但下面这套 MCP 方案的核心逻辑在新旧版本上都通用。整个流程分三块:第一,把 Blender 装好并确认 Python 环境;第二,搭建一个 MCP Server,让它能跟 Blender 的 Python API 通信;第三,在 VS Code 里打开 Copilot,让 AI 通过 MCP 协议去驱动 Blender 操作。听起来神秘,拆开看其实就是一个标准的前后端交互结构,下面我一步步讲清楚。
1. 项目整体设计与思路拆解
1.1 为什么要用 MCP Server 连接 Blender 和 Copilot
先说 MCP 是什么。MCP 全称 Model Context Protocol,中文叫模型上下文协议。你可以把它理解成一个统一的插座标准,AI 模型不需要知道每个软件的内置接口长什么样,只要插上 MCP 这个插座,就能通过标准协议去读写外部工具的数据、调用工具的方法。Blender 本身提供完整的 Python API,但 Copilot 直接在 Python 里调 Blender 的 bpy 模块是不行的,因为两边跑在不同的进程里,而且 Copilot 默认对 Blender 一无所知。MCP Server 在这里起的作用就是一个翻译官:AI 说自然语言,MCP Server 把自然语言解析成 Blender Python 指令,再把 Blender 的执行结果转回成 AI 能理解的文本反馈。
我最初试过直接在 Blender 的 Scripting 工作区里写 Python 脚本,然后手动粘贴到 VS Code 里执行,虽然也能自动化,但每次都要自己写完整的调用代码,遇到不懂的 API 还得翻文档。后来看到很多人用 MCP Server 给 Burp Suite 这类工具做 AI 操控,我就想能不能同样用在 Blender 上。实测下来,这套方案的优点在于:AI 能自动补全参数、处理异常,而且 MCP Server 可以一直常驻,Blender 实例不关掉就能反复用。缺点也很明显:首期配置需要点耐心,环境变量和端口设置错一个就连接不上,这也是我后面写这篇教程的原因。
1.2 技术选型:为什么是 VS Code Copilot 而不是 Blender 内置插件
有人会问,Blender 社区不是有现成的 AI 插件吗?确实有,但那些插件通常绑定了特定的大模型服务,或者只支持固定的几个操作,灵活度有限。我选择 VS Code Copilot 的考量主要有三点:
- 生态成熟:VS Code 的 Copilot 对自然语言的理解已经打磨得很好了,尤其是写 Python 代码、读 JSON 结构这些场景,准确率远高于自己写的规则脚本。
- 扩展方便:VS Code 里可以同时装多个扩展,MCP Server 的调试工具也齐全,出了错误能直接看到日志,不用黑盒排查。
- 通用性:以后同样的 MCP Server 配置,不只可以用在 Blender 上,还能用在其他支持 Python API 的软件上,比如后期合成软件,换个工具类定义就能复用。
这里要特别说一句,Copilot 本身并不会直接操作 Blender。真正连上 Blender 的是 MCP Server。Copilot 在 VS Code 中作为客户端,通过 MCP 协议调用 Server 暴露的工具函数,Server 再通过 socket 或本地端口把命令发送给 Blender 内置的 Python 脚本。这个三层架构是整个方案的核心,理解了它,后面配置时你就能明白每个参数是干什么的了。
2. 环境准备与安装实操
2.1 检查本机基础环境
动手之前,先把你电脑的基础环境检查一遍,不然装到一半发现缺东缺西,心态容易崩。我的操作系统是 Windows 11,但 macOS 和 Linux 的思路完全一样,只是命令略有差异,我会在关键地方标注。
你需要准备的东西:
- Blender 5.2.2 安装包,可以从官网下载,注意选对操作系统版本。
- VS Code 最新版,官网下载即可。
- Python 3.10 以上版本,因为 Blender 5.2.2 内嵌的 Python 版本较新,MCP Server 也依赖 Python 环境。我用的是 3.11,实测稳定。
- Node.js 建议也装一个,有些 MCP Server 的实现是基于 Node.js 的,虽然我们后面用 Python 版,但装着没坏处。
安装顺序建议:先装 Python,再装 Blender,最后装 VS Code。原因很简单,装 Python 是为了后续创建虚拟环境,Blender 安装时不会自动配置 PATH,如果你先装 Blender 再配 Python 会混淆两个环境。装完各个软件后,记得在终端里运行python --version和blender --version确认路径都指向正确。
有一个细节容易忽略:Blender 5.2.2 安装时默认会自带一个 Python 解释器,藏在安装目录的5.2/python/bin里,但你最好不要直接用这个解释器装依赖,因为 Blender 管理的 Python 和系统 Python 是隔离的。更靠谱的做法是单独创建虚拟环境给 MCP Server 用,Blender 主要通过外部命令或 socket 通信,不需要和 Server 共享同一个解释器。
2.2 安装 VS Code Copilot 扩展与 Python 插件
打开 VS Code,点击左侧扩展图标,搜索 “Copilot”,安装 GitHub Copilot 和 GitHub Copilot Chat 两个扩展。安装完以后,左下角会出现一个 Copilot 图标,点击它会要求你登录 GitHub 账号,这步简单,跟着提示走就行。
接下来安装 Python 扩展,搜索 “Python” 选微软官方出的那个。这个扩展会让 VS Code 正确识别 Python 环境,后面跑 MCP Server 调试代码时很有用。
有个小坑,Copilot 扩展默认可能会内嵌自己的 AI 模型服务,但你如果想让 Copilot 通过 MCP Server 去调用外部工具,需要确认自己的 Copilot 订阅支持“MCP 客户端”功能。目前 GitHub Copilot 在 VS Code 中可以直接配置 MCP server,只要在配置里指定 server 的可执行文件路径就行。具体命令很长,我后面第三章会给出完整的配置代码。
装好扩展后,按Ctrl + Shift + P打开命令面板,输入 “Python: Select Interpreter”,选择你在 2.1 创建的虚拟环境。这一步千万别省略,否则后面执行 MCP Server 时会发现找不到某些依赖包。
2.3 创建项目目录与虚拟环境
我习惯把整个项目放在D:\blender-mcp\下面,你可以用任何你喜欢的位置。项目结构我整理了一下:
blender-mcp/ ├── server/ │ ├── mcp_server.py │ └── requirements.txt ├── blender_scripts/ │ └── socket_listener.py └── .vscode/ └── mcp.jsonserver/目录放 MCP Server 的实现代码和依赖清单,blender_scripts/放一个监听 socket 的脚本,这个脚本负责把从 MCP Server 收到的命令传递给 Blender 执行。.vscode/mcp.json是 VS Code 识别 MCP Server 配置的文件。
在项目根目录打开终端,执行:
python -m venv venv然后激活环境:
- Windows:
venv\Scripts\activate - macOS/Linux:
source venv/bin/activate
激活后你会发现命令行前面多了(venv)前缀,说明虚拟环境生效了。这里再次提醒,所有依赖都装在这个 venv 里,跟系统的 Python 和 Blender 自带的 Python 完全隔离,这样以后就算你升级 Blender 或者删掉系统 Python,都不会影响 MCP Server 的正常工作。
3. MCP Server 配置与原理详解
3.1 什么是 MCP Server,它在这个项目里的作用
如果说 VS Code Copilot 是“大脑”,那 MCP Server 就是“神经系统”。Copilot 本身并不能直接通过操作系统命令去操作 Blender,它只能依赖 VS Code 提供的外部工具调用接口。MCP Server 恰好就是这个接口的实现者。
MCP 协议的工作方式是:客户端(Copilot)通过 JSON-RPC 协议发起一个带工具名的调用请求,Server 收到请求后执行对应的 Python 函数,函数内部再通过 socket 向 Blender 发送命令字符串。Blender 侧有一个常驻的监听进程,收到命令字符串后就调用bpy模块执行,执行完毕再把结果回传。
我用一个类比来解释:Copilot 就像一个只会写信给你的人,他不能直接伸手去按你厨房里的开关。MCP Server 就是那个收信的人,读完信后帮你走到厨房按下开关,再写信回复“灯已经亮了”。这样一个松耦合的设计,最大的好处是解耦:你更换 AI 模型时不用动 Blender 的监听脚本,更换被控软件时也不用改 Copilot 的配置,只要调整 Server 内部实现的函数就行。
3.2 编写 MCP Server 核心代码
MCP Server 代码推荐用 Python 写,因为生态好,而且 Blender 的 Python API 也是 Python,逻辑上最顺。以下是我测试通过的最小可用代码,你直接复制就能用:
# server/mcp_server.py import json import socket from mcp.server import Server from mcp.types import Tool # 定义 server 基本信息 server = Server(name="blender-mcp-server") # 工具列表:告诉 AI 你能干什么 TOOLS = [ Tool( name="blender_execute", description="在 Blender 中执行一段 Python 代码。代码会被发送给 Blender 的 socket 监听脚本执行。", inputSchema={ "type": "object", "properties": { "code": {"type": "string", "description": "要执行的 Blender Python 代码"} }, "required": ["code"], }, ) ] @server.list_tools() async def list_tools(): return TOOLS @server.call_tool() async def call_tool(name: str, arguments: dict): if name == "blender_execute": code = arguments.get("code") if not code: return JSONResponse(content={"error": "Missing code parameter"}, status_code=400) result = send_to_blender(code) return JSONResponse(content={"result": result}, status_code=200) return JSONResponse(content={"error": "Unknown tool"}, status_code=404) def send_to_blender(code: str): # 连接 Blender 本地监听端口(默认 9876) s = socket.socket(socket.AF_INET, socket.SOCK_STREAM) s.connect(("127.0.0.1", 9876)) s.sendall(code.encode("utf-8")) s.shutdown(socket.SHUT_WR) response = b"" while True: data = s.recv(4096) if not data: break response += data s.close() return response.decode("utf-8") # 启动服务 if __name__ == "__main__": server.run()这代码很短,但包含了 MCP Server 最基本的两个接口:list_tools告诉 AI 有哪些工具可用,call_tool接收 AI 的调用请求并执行。细节在于send_to_blender函数里的 socket 操作,我特意设置了SHUT_WR,保证发送完代码后能正常结束数据流,避免监听端无法判断消息结束。端口我用的 9876,你可以在两个文件里改成任意空闲端口,只要 Blender 侧保持一致。
3.3 安装 MCP Server 依赖
创建server/requirements.txt,写入:
mcp uvicorn然后执行:
pip install -r requirements.txtmcp是官方 Python SDK,uvicorn是异步服务器框架,但这里我们直接调用server.run()启动内置的 asyncio 服务,所以uvicorn其实用不到,你可以删掉。保留它是因为有些 MCP Server 示例会用 uvicorn 包装,但我的代码里不需要。装好之后,终端运行python server/mcp_server.py,如果看到类似 “server started” 的日志就说明启动成功了。
3.4 配置 VS Code 连接 MCP Server
在项目根目录创建.vscode/mcp.json,内容如下:
{ "servers": { "blender": { "command": "python", "args": ["server/mcp_server.py"], "cwd": "${workspaceFolder}" } } }这里command用python,前提是终端里激活了虚拟环境。但你可能会发现 VS Code 里系统会自动选择别的 Python 解释器,所以稳妥一点,把command改为虚拟环境里 python 的绝对路径,比如 Windows 下venv\Scripts\python.exe,macOS 下venv/bin/python。
配置完成后,打开 VS Code 的 Copilot Chat 面板,在输入框旁边应该能看到一个 MCP 工具列表,展开后应该能看到blender_execute。如果看不到,检查终端的 MCP Server 是否还在运行,或者查看 VS Code 的 “Output” 面板里 MCP 相关日志。
4. Blender 侧监听脚本与 AI 操作实战
4.1 给 Blender 添加一个 socket 监听脚本
Blender 不能直接执行你扔给它的 Python 代码,必须有一个脚本常驻运行,监听指定端口并响应命令。我在blender_scripts/socket_listener.py里写了一个简单的监听器:
# blender_scripts/socket_listener.py import bpy import socket import threading import json def execute_code(code_str): try: # 用 exec 执行 python 代码,并注入 bpy 到全局命名空间 exec(code_str, {"bpy": bpy}) return "SUCCESS" except Exception as e: return f"ERROR: {str(e)}" def handle_client(conn): data = b"" while True: chunk = conn.recv(4096) if not chunk: break data += chunk code = data.decode("utf-8") result = execute_code(code) conn.sendall(result.encode("utf-8")) conn.close() def main(): server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM) server_socket.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1) server_socket.bind(("127.0.0.1", 9876)) server_socket.listen(5) print("Blender MCP listener started on port 9876") while True: conn, addr = server_socket.accept() threading.Thread(target=handle_client, args=(conn,)).start() # 在 Blender 中启动时调用 main()这个脚本用了exec来执行收到的字符串,安全上要注意,只建议在本地开发环境中使用。如果拿去公网跑,很容易被注入恶意代码。我在测试时,exec的命名空间里只放了一个bpy变量,所以你在代码里写bpy.ops.something()是没问题的,但没法访问文件系统的其它模块,算是加了一层薄保护。
4.2 在 Blender 中启动监听脚本
在 Blender 的 Scripting 工作区打开socket_listener.py,直接点击运行按钮。这时候你会看到控制台打印 “Blender MCP listener started on port 9876”。注意,每一次启动 Blender 都要先运行这个脚本,否则 MCP Server 发过来的命令会没人接。如果你是频繁使用,可以在 Blender 的偏好设置里添加启动脚本,但我个人建议还是手动运行,因为不是每次都需要 AI 操作,减少后台资源占用。
4.3 用 Copilot 自然语言操作 Blender
所有环境就绪后,重头戏来了。在 VS Code 的 Copilot Chat 面板里,你可以直接输入类似这样的指令:
- “帮我在 Blender 里新建一个立方体并缩放为 2x2x2”
- “给当前选中的物体加一个倒角修改器,倒角宽度设为 0.05 米”
- “导出当前场景为 FBX 文件,保存到桌面”
- “渲染当前帧并保存 PNG 图片到当前项目目录”
Copilot 会根据你提供的工具描述,自动生成对应的 Python 代码,然后调用blender_execute工具把代码发给 Blender。你不需要写任何 Python 脚本,只需要看结果,如果出错就再让 Copilot 修改。
我实测的完整过程是这样的:我在 Blender 里建了一个默认立方体,然后在 Copilot Chat 里输入 “旋转这个立方体 45 度,并应用旋转变换”。Copilot 想了大概十秒,然后调用blender_execute,发送的代码是bpy.ops.transform.rotate(value=0.785398, orient_axis='Z'),Blender 里果然看到立方体转了 45 度。这一瞬间真的很爽,就像真的有一个助手在你旁边帮你操作软件。
4.4 进阶:批量操作与自动化脚本生成
只让 AI 帮你做简单操作只是开始,MCP Server 更大的价值在于批处理和复杂任务。比如我要给场景里所有物体贴上一个重复纹理,手动写循环脚本很烦,但用 Copilot 只需要说:
“遍历场景中的所有网格物体,给它们添加一个图像纹理节点,使用项目文件夹里的 brick_texture.jpg,保持纹理重复率 4 倍”
Copilot 就会生成下面这种代码并通过 MCP 执行:
import bpy import os tex_path = r"D:\blender-mcp\brick_texture.jpg" for obj in bpy.data.objects: if obj.type == 'MESH': mat = bpy.data.materials.new(name=f"tex_{obj.name}") mat.use_nodes = True nodes = mat.node_tree.nodes tex_node = nodes.new(type='ShaderNodeTexImage') tex_node.image = bpy.data.images.load(tex_path) tex_node.image.repeat_x = 4 tex_node.image.repeat_y = 4 obj.data.materials.append(mat)注意这里repeat_x和repeat_y是在图像纹理节点上设置的,Blender 5.2.2 的节点接口略有变动,实际运行时会自动适配。执行完,所有网格物体都会挂上带纹理的材质。这种批量操作,如果手动去点,至少十分钟,而 AI 用它内部的代码生成能力,几十秒就完成了。
5. 常见问题与排查技巧实录
5.1 工具列表里看不到 blender_execute
这几乎是所有新手都会遇到的问题。我一开始也卡了很久,因为 VS Code 的 MCP 配置和 Copilot Chat 的工具面板是不同步的。排查顺序建议:
- 确认
mcp.json文件放在.vscode目录下且格式正确。注意如果之前打开的项目里没有.vscode目录,你要手动创建,并确保 VS Code 已经重新加载配置(可以按Ctrl+Shift+P执行 “Reload Window”)。 - 确认 MCP Server 的进程还在运行。你可以直接终端运行
python server/mcp_server.py看有没有报错。如果报错说找不到mcp模块,说明虚拟环境没激活,或者 VS Code 切到了别的解释器。 - 打开 VS Code 的 “Output” 面板,下拉框选 “MCP”,如果看到类似于 “MCP server connection failed” 的日志,多半是端口被占用,或
command路径不对。
5.2 Blender 收到代码但没反应
有几次我发现 Copilot 调用了blender_execute,结果也返回了成功,但 Blender 场景纹丝不动。问题出在 Blender 的监听脚本里用了exec,但bpy模块在某些版本里被 exec 执行时,需要包含bpy.context等操作,如果代码里直接用了bpy.context.scene.objects而场景里没有活动物体,就会静默失败。解决方法是,在监听脚本里把exec的命名空间调大一点,注入bpy和bpy.context引用,或者直接把execute_code改为使用eval加异常强制回传。
我的最终代码改为在exec前加一行bpy.context.view_layer.update(),强制刷新场景数据,然后再执行用户代码,这样可以避免很多因为上下文未刷新导致的坑。
5.3 Copilot 生成的代码用了不存在的属性
Blender 的 Python API 变化挺快的,特别是 5.x 系列,有些旧教程里的写法已经过时。比如很多人爱写bpy.ops.object.modifier_add(type="SUBSURF"),但在 5.2.2 里,有些 modifier 的调用参数变了,推荐用obj.modifiers.new(name="Subsurf", type='SUBSURF')。遇到这个问题,让 Copilot 去查文档是行不通的,因为它训练数据里可能没有最新版 API。我的经验是,给 Copilot 明确指令:“请先打印当前 Blender 版本的bpy.app.version,再基于该版本知识生成代码”。虽然 Copilot 拿不到运行时版本,但你可以手动在 Blender 控制台输入bpy.app.version把结果告诉它,之后再让它生成代码就会精准很多。
5.4 端口冲突与权限问题
如果你同时开了多个 Blender 实例,或者之前有的 MCP Server 用过了 9876 端口,就会提示 “Address already in use”。这时候只要改配置即可:改mcp_server.py里的端口,同时改socket_listener.py里的bind端口,两个文件保持一致就好。Windows 上还要注意防火墙会拦截本地 socket 连接,我看到一次现象是 Server 端能连接客户端,但 Blender 端收不到数据。此时在 Windows 防火墙里放行python.exe对本地端口的访问权限即可,或者在开发阶段直接关闭防火墙测试一下,确保没问题后再重新开启。
5.5 常见错误速查表
| 现象 | 可能原因 | 解决方案 |
|---|---|---|
| Copilot 调用工具时提示 “Unknown tool” | MCP Server 的list_tools返回的工具名与调用名不一致 | 确保call_tool里判断的名字和TOOLS里定义的名字一模一样,大小写敏感 |
| Blender 控制台不打印监听信息 | 脚本没有运行,或端口被占用 | 在 Blender Scripting 里点击 “Run Script” 并确认控制台有输出 |
| MCP Server 启动后立即退出 | Python 环境缺少mcp依赖 | 执行pip install mcp,并激活正确 venv |
| Copilot Chat 里没有出现在线工具图标 | 需要重启 VS Code 或重新加载窗口 | 执行 “Reload Window” 后重新打开 Copilot Chat |
| 代码执行成功但场景没变化 | Blender 的 view_layer 未刷新 | 在监听脚本里加入bpy.context.view_layer.update() |
6. 从我自己的踩坑经验说起
整套方案跑通之后,我最大的感受是:不要一上来就追求让 AI 做很复杂的操作,先从一个简单的“旋转物体”开始,确认链路是通的。链路通了以后,再逐步加入材质、修改器、渲染输出这些功能。每加一个功能,就在 MCP Server 的TOOLS列表里加一个更具体的工具函数,比如add_subdivide_modifier或者export_fbx,这样 AI 就不用每次都自己拼装完整代码,而是调用你预设好的高可靠函数,错误率会低很多。
我后来在项目里还做了一层包装:在call_tool里针对不同命令维护了一个白名单,只有bpy.ops.transform.*、bpy.data.scene.*这类操作才允许执行,其他的全部拦截。虽然损失了灵活性,但保证了安全,尤其当你让 AI 自动化处理公司项目的时候,失控风险必须要考虑。
最后分享一个小技巧:如果你经常用这套组合,可以在 Blender 里把监听脚本封装成一个 add-on,启动时自动运行,省得每次手动点。真正爽的时候是同时处理十几个物体、改一堆参数、导出多种格式,AI 在一分钟内全部搞定,你自己泡杯咖啡就行。现在的 AI 辅助工具确实进步太快了,回头想想以前一行行敲代码的日子,真是回不去了。希望这篇教程能让你顺利搭好自己的 Blender + MCP + Copilot 套装,少走点我当初的弯路。