cocos-mcp
Provides tools for driving the Cocos Creator 3.8.x editor and project files directly, including scene and node management (create, move, delete, transform, transaction with automatic rollback), component add/remove/set/list, asset operations (create, move, delete, query, import, reimport), build start/status/platforms, editor console logs, previews, preferences, and mouse reference images. Also supports offline editing of .prefab and .anim files (querying trees/tracks/keyframes and declarative batch modification with all-or-nothing transaction semantics) without the editor running, plus a knowledge base of Cocos component properties, coordinate systems, layouts and known pitfalls.
Click on "Deploy Server".
Wait a few minutes for the server to deploy. Once ready, it will show a "Started" state.
In the chat, type
@followed by the MCP server name and your instructions, e.g., "@cocos-mcpcreate a Player node in the current scene and add a Sprite component"
That's it! The server will respond to your query, and you can continue using it as needed.
Here is a step-by-step guide with screenshots.
cocos-mcp
给 Cocos Creator 3.8.x 的 MCP(Model Context Protocol)服务。 让 Claude Code / Cursor / Codex / 任何 MCP 客户端直接操控 Cocos Creator 编辑器与项目文件。
设计依据:全网 8 个开源 Cocos MCP 项目的逆向解构 + 对 Cocos Creator 3.8.8 真机二进制的交叉验证。 完整调研报告见
research/逆向调研报告.md。
来源与致谢
本项目没有复制任何第三方代码 —— 这一点经过机械核查(逐行求交集),
详见 SOURCES.md。那里完整列出了:
调研过的 8 个开源项目 + 1 个闭源商业产品,各自的地址与许可证;
代码原创性核查数据(与参考仓库的字面重合 2.64%,且全部是
require('fs')这类通用样板);逐条设计借鉴对照表(我们借鉴了谁的哪个做法、做了什么改动);
许可证合规说明,以及哪些项目没有许可证(因此未使用其代码)。
同时,本项目与 Cocos 官方无隶属关系;Cocos Creator 是 Beijing Hode Information Technology 的商标。接口信息来自 Cocos Creator 3.8.8 随包发布的公开类型契约。
Related MCP server: Cocos MCP Server
它解决什么问题
现存的 Cocos MCP 实现有三个通病,我们逐个修掉了:
通病 | 真实表现 | 本项目 |
工具注册成功但一调用就报错 | harady 的 10 个 | 114 条消息白名单,全部经 3.8.8 包体二进制扫描验证;模型照旧教程调用时会收到「正确名是 X」而不是 not found |
多步写操作中途失败留下半改场景 | listar 虽有 |
|
任意网页能驱动你的编辑器 | DaxianLee 绑 127.0.0.1 + CORS | Bearer token + Host/Origin 校验 + 4MiB 限额;不提供任意 eval |
安装
1. 装扩展到你的 Cocos 工程
node scripts/install-extension.js ~/Documents/MyGame或手动把 extension/ 目录复制到 <项目>/extensions/cocos-mcp。
2. 打开 Cocos Creator
装完扩展后重开编辑器(或用扩展菜单里的「重启 Bridge」)。 面板显示「Bridge 已启动」即表示编辑器侧就绪。
3. 配 MCP 客户端
{
"mcpServers": {
"cocos-mcp": {
"command": "node",
"args": ["/绝对路径/cocos-mcp/hub/bin.js"]
}
}
}零依赖、零配置:不需要 npm install,不需要起 HTTP 服务,不需要配 token。
4. 自检
node hub/bin.js --probe # 看是否连上编辑器
node hub/bin.js --print-tools # 看完整工具清单架构
Claude Code / Cursor / Codex
│ stdio + JSON-RPC(MCP 2025-06-18)
▼
┌────────────────────────────────────────────┐
│ hub/bin.js │
│ ├─ MCP 协议层(手写,零依赖,完整实现) │
│ ├─ 多编辑器聚合(短名前缀隔离 + 心跳 + 重连) │
│ ├─ 安全策略(read / write / danger 三级) │
│ ├─ 知识库(组件属性表 / 坐标系 / 布局 / 踩坑) │
│ └─ 离线 prefab / animation 编辑器(35 op) │
└───────────────┬────────────────────────────┘
│ HTTP + Bearer token(仅 127.0.0.1)
▼
┌────────────────────────────────────────────┐
│ Cocos Creator 扩展 │
│ ├─ Bridge:私有 JSON-RPC(不是 MCP endpoint)│
│ ├─ 消息白名单 + 别名纠错 │
│ ├─ 节点三态解析(uuid / 层级路径 / 名字) │
│ ├─ 属性值类型自动推断 │
│ └─ 属性解包(IProperty → 普通值) │
└───────────────┬────────────────────────────┘
│ Editor.Message.request(channel, message, ...)
▼
Cocos Creator 3.8.x为什么 Bridge 不是 MCP endpoint:MCP 协议只在 hub 实现一次。多编辑器的聚合、工具面、安全策略全在 hub,编辑器侧只做一条窄通道。这样加工具不用改编辑器,重启编辑器不会掉 MCP 连接。
关于 notifications/cancelled:MCP 规范里它是 SHOULD(不是 MUST)让接收方停止处理。
本项目的实现是收到即忽略 —— 也就是「客户端不再等结果,但操作照常执行完」。
这是有意为之:半途取消一个写操作(比如在 scene.open 提交到一半时中止)
比「让它跑完」更容易留下不一致的工程状态。
代价是:取消一个耗时调用(比如最长 90 秒的 scene.open)并不会真的停下来,
它仍会跑完并产生副作用。若要真正中止,需要在 hub↔Bridge 之间加取消协议,
目前没做 —— 这一点写在这里,免得被当成「取消 = 回滚」。
带 id 的 notification:按 JSON-RPC 2.0,带 id 就是一个请求,服务器必须回响应
(不回 ⇒ 客户端永远等那个 id,既没有错误也没有超时,就是挂住)。
所以 notifications/cancelled / notifications/progress / notifications/roots/list_changed
这三个方法如果带 id 发过来,hub 会回一个 -32600 Invalid Request
并说明「notification 方法不该带 id」。
正常客户端发的 notification 不带 id,按规范不产生任何响应。
工具清单(70 个)
全局工具(与编辑器实例无关,始终无前缀)
工具 | 说明 |
| 直接调用一条已验证存在的 Cocos 编辑器消息(白名单外一律拒绝并给出正确名)。 |
| 查询 Cocos Creator 3.8.x 的实操知识,避免反复试错。topic 取值: |
| 直接读 .prefab 文件(不需要编辑器运行)。 |
| 声明式批量修改 .prefab 文件。所有 op 全部成功才会落盘,任一失败磁盘零写入(事务语义)。 |
| 从 JSON 文件读取 ops 后批量编辑。opsJsonPath 是 JSON 文件的绝对路径(单文件或 {"files":[...]} 多文件形态)。 |
| 列出 cocos_prefab_edit / cocos_prefab_batch 支持的全部 prefab op、必填参数与可选参数。不确定某个操作叫什么名字时先查这里。动画相关 op 见 cocos_anim_ops。不需要参数。 |
| 列出 cocos_anim_batch 支持的全部 动画 op、必填参数与可选参数。prefab 相关 op 见 cocos_prefab_ops。不需要参数。 |
| 读 .anim 文件(不需要编辑器运行)。selector 取值:tree(轨道树)/ node(某节点的轨道)/ find(按名字找)/ field(查属性)。 |
| 批量修改 .anim 文件的轨道与关键帧。op 支持 offset-curve(整体平移曲线)与 set-keyframe-value(改关键帧值)。 |
编辑器工具(单实例时无前缀,多实例时 <短名>__ 前缀)
域 | 工具 |
asset |
|
build |
|
component |
|
editor |
|
node |
|
preferences |
|
preview |
|
project |
|
reference |
|
scene |
|
view |
|
危险操作(
node.delete/component.remove/asset.delete/cocos_message) 必须在同一次调用里显式传confirm: true,confirm已写进工具 schema 的必填项,模型无法绕过。
典型用法
搭一个 UI
1. cocos_knowledge(topic="components") → 确认 cc.Label / cc.Button 的属性名
2. scene.tree → 看当前场景结构
3. scene.transaction(ops=[
{op:"node.create", args:{parent:"Canvas", name:"StartBtn", components:["cc.UITransform","cc.Button"]}},
{op:"node.create", args:{parent:"StartBtn", name:"Title", components:["cc.UITransform","cc.Label"]}},
{op:"component.set", args:{node:"Title", component:"cc.Label", property:"string", value:"开始游戏"}}
]) → 失败自动回滚
4. scene.save
5. editor.logs(level=["error"]) → 自检离线批量改 prefab(编辑器关着也行)
1. cocos_prefab_ops → 看可用 op
2. cocos_prefab_query(filePath=".../Card.prefab", selector="tree")
3. cocos_prefab_edit(filePath="...", ops=[...], dryRun=true) → 先看 diff
4. cocos_prefab_edit(filePath="...", ops=[...]) → 正式执行
5. asset.reimport(url="db://assets/...") → 通知编辑器安全模型
等级 | 工具 | 行为 |
| 全部只读工具 | 直接执行 |
| 改场景/资源 | 直接执行,可撤销 |
|
| 必须同一次调用传 |
另外:
路径护栏:所有离线文件操作强制落在已注册的 Cocos 项目目录内,越界直接拒绝并说明允许的项目根。
无任意代码执行:不提供
new Function/ eval 通道。场景进程脚本只导出固定白名单方法。Bridge 鉴权:Bearer token +
timingSafeEqual、Host 必须 loopback、拒绝浏览器 Origin、请求体 4MiB 上限。
多编辑器并行
每个编辑器实例向 ~/.cocos-mcp/editors/<pid>.json 写心跳。hub 扫描目录发现实例,
按短名隔离工具(短名 = 项目目录名;同名冲突时自动加后缀)。
只开一个项目 → 工具名是
scene.tree同时开两个 → 工具名变成
forest__scene.tree/card__scene.tree
hub 会在实例数量变化时发 notifications/tools/list_changed,客户端自动刷新工具列表。
改扩展代码后不用重启编辑器
echo "restart-package" > <你的项目>/.dev/refresh扩展会禁用再启用自己,整个沙箱重建,所有 JS 重新加载。
开发与验证
npm test # 全部单测(离线编辑器 + 事务回滚 + 一致性 + Bridge op 逐个冒烟)
npm run test:e2e # 端到端(需要 Cocos Creator 开着并装了扩展)
npm run test:smoke # 全工具冒烟(每一个工具都真跑一遍)
npm run test:real # 真机行为验证(把「必须真机才能定论」的条目跑清楚)⚠️
node --test <目录>在 Node 22.22 上会把目录当模块加载而失败,必须用文件通配符。 (这个坑现存开源项目里也踩过,README 里都没写。) ⚠️ 后三个脚本需要真机(Cocos Creator 开着 + 装了扩展),不能当普通单测跑。
三层验证
层 | 脚本 | 覆盖 | 最近一次实测 |
单测 |
| 离线 prefab/anim 读写、事务 undo 日志、文档/清单一致性、逐个调用全部 Bridge op、场景频道健康闸门、原型链守卫、批量两阶段提交、护栏接线、退出码语义、真机前置守卫 | 236/236 |
端到端 |
| MCP 握手 → 工具面 → 真实读取 → 真实写入闭环 → 事务失败真回滚 → 安全护栏 → Resources → 离线能力 → 路径护栏 → 多编辑器前缀隔离 | 60/60(编辑器频道中毒时退出 2 = 环境不可用,不是回归) |
全工具冒烟 |
| 每一个工具都真跑一遍 + 工具面静态自检 | 覆盖全部 70 个工具;退出码语义见下方表格 —— 引擎缺陷导致的跳过与残留都单独列出,不冒充通过 |
真机行为 |
| 把「代码看不出对错、必须真机才能定论」的条目逐条跑清楚:剪切→粘贴闭环、组件真被摘掉、越界写被拦、20 并发、事务回滚、未导入场景前置拦截、离线写盘事务 | 53/53 |
上面这一列是运行结果,会随迭代变化 —— 以实际跑出来的输出为准。 README 里的工具数(70)由一致性测试守着,改了代码没改文档会直接报错。
退出码怎么读(CI 该怎么看):
码 | 含义 | CI 该怎么处理 |
0 | 全部通过 | 通过 |
1 | 有真失败(真回归) | 必须红 —— 这是要查的 |
2 | 有跳过:本轮没跑完(引擎侧 scene 频道中毒/正忙) | 黄色/待重试 —— 不是回归,重启编辑器重跑 |
3 | 有残留:文件留在用户工程里,需要人工清理 | 黄色 + 要有人看一眼(通常也是引擎缺陷的连带) |
4 | 测试自身中断(崩溃) | 脚本坏了 —— 看日志 |
⚠️ 之所以要把 2 / 3 / 4 从 1 里拆出来,是因为「引擎缺陷」和「本项目回归」 如果共用同一个红灯,CI 就会被引擎缺陷染成常态红 —— 常态红的信号等于没有信号。 真机脚本(e2e / 真机行为)同样用 2 表示「环境不可用(编辑器没开/频道中毒)」。
退出码的唯一真相是
test/exit-codes.js;所有真机脚本必须引用它 (test/exit-codes.test.js会守着「有没有绕过词汇表写裸数字」)。
⚠️ 真机脚本(
test/e2e.js/test/tool-smoke.js/test/real-behavior.js) 带着NODE_TEST_CONTEXT守卫:被node --test(不带路径)自动发现时会立刻退出。 因为node --test会把test/下所有 .js 都当测试文件跑起来 —— 没有这道守卫,一次手滑的node --test就会连上本机开着的 Cocos Creator、动用户的工程。
⏱ 后两层要连真机 Cocos Creator,耗时以分钟计 —— Cocos 的场景导入本身就要几十秒 (新建场景 → 导入 → 打开 ≈ 40-70s,这是引擎行为不是我们慢)。
CI:.github/workflows/ci.yml 跑单测 + 三项静态检查(Node 22 / 24 矩阵,
macos-latest)。真机三层不在 CI 里 —— 它们要开着 Cocos Creator 3.8.8。
矩阵里只放实测跑通的 Node 版本:放没验过的版本进去,一旦不兼容就是「常态红灯」,
而常态红的信号等于没有信号(比没有 CI 更糟)。
为什么要单独做「全工具冒烟」:现存开源实现最大的问题就是工具注册成功但一调用就报错。 声明 ≠ 能用。逐个真跑一遍,才知道工具面是真是假。 本项目的
test/tool-smoke.js就是为此写的 —— 它在本轮就抓出了 4 个真缺陷(见下)。
本轮「仔细检查」抓出的真缺陷(已全部修掉)
缺陷 | 影响 | 修法 |
| 工具注册成功但一调用就报错 | 改用官方 |
8 个已实现的 Bridge 操作没暴露成 MCP 工具 | 有能不用 | 补 |
| 查组件类返回空数组 | 改为 |
声称「 | 回滚是假的 | 实测 snapshot-abort / cancel-recording 都不回滚 → 改为自带 undo 日志( |
路径护栏无法放宽 | 改不了项目外的美术资源库 | 新增 |
| 复制出来的配置无效 | hub 端实现过滤 |
| 调用方干等到客户端超时 | Bridge 侧自己兜超时(单次 90s,不重试),并把「资源可能还没导入完」写进错误信息 |
一次 | 后面所有场景操作全部挂住,错误信息只是一堆没信息量的「超时」 | 加频道健康闸门:每次场景操作前用 |
| 报 | 引擎拒绝时明确报错,并说明「切换场景直接用 scene.open,不需要先关」 |
删掉当前打开的场景资源 | 编辑器留下指向已删除资源的引用,之后打开任何场景都挂死 | Bridge 守卫拦下,提示先 |
打开一个还没导入完的场景 | 发出 | 打开前先查本地库产物文件( |
删根节点 / 删不存在的组件 / 删不存在的资源返回"成功" | 假成功比报错更危险 | 三处都改成明确拦截或明确报错 |
缺少必填参数时编辑器只回一句 | 模型不知道是自己少传了东西 | Bridge 层前置参数校验,回中文明确错误 |
实测到的 Cocos 3.8.8 引擎行为(详见调研报告)
scene:snapshot/snapshot-abort/begin-recording/cancel-recording全都不回滚任何修改, 尽管官方 i18n 描述写着 "for undo"。→ 事务必须自己实现 undo 日志。scene:open-scene失败时不 resolve 也不 reject → 必须自己兜超时。一组节点操作(建/复制/移动/剪贴板)之后,下一次打开场景必挂死 → 引擎自身的问题,只能靠超时 + 健康闸门兜住。
它挂死一次,整个 scene 频道就中毒了(
query-node-tree永远不返回,bridge/ping却正常)→ 必须有健康闸门。打开场景实测要 26~54 秒(资产库做 auto refresh 时引擎会等它)→ 超时设短了会把「慢但成功」误判成失败, 而失败后的重试是在引擎半开着的状态下继续折腾,才真的把频道搞死。宁可一次给足 90s,也不要重试。
「导入完成」的可靠判据是本地库产物文件
<项目>/library/<uuid前2位>/<uuid>.json是否存在;query-asset-info在资源刚创建时就立刻返回非空、其imported字段也是 true —— 那是假信号。console:query消息不存在,读控制台只能用Editor.Logger.query()。scene:query-classes的参数是{extends, excludeSelf},传{}返回空数组。scene:query-node-tree不含__comps__→ 树里不能输出components: [](会误导模型)。短 uuid 是 base64 字符集(含
g/x/k等非十六进制字符),不能按 hex 判。
目录结构
cocos-mcp/
├── hub/
│ ├── bin.js # stdio MCP Server 入口
│ └── src/
│ ├── mcp/server.js # MCP 协议实现(零依赖)
│ ├── registry.js # 编辑器实例发现 / 短名去重
│ ├── editor-client.js # Bridge HTTP 客户端
│ ├── tools/
│ │ ├── editor-tools.js # 编辑器侧工具(48 个里的编辑器部分)
│ │ ├── global-tools.js # 知识库 + 离线工具
│ │ └── index.js # 工具装配与调度(含安全策略)
│ ├── knowledge/
│ │ ├── cocos-knowledge.json # 组件属性表 / 坐标系 / 布局 / 踩坑
│ │ └── editor-messages.json # 114 条已验证消息清单
│ └── offline/ # 离线 prefab / animation 编辑器(35 op)
├── extension/
│ ├── package.json # Cocos 扩展清单
│ ├── main.js # 扩展主进程(Bridge + 心跳 + .dev/refresh)
│ ├── scene.js # 场景进程脚本(白名单方法)
│ ├── bridge/
│ │ ├── server.js # Bridge HTTP 服务(鉴权)
│ │ ├── handlers.js # 操作层(消息白名单 / 节点解析 / 类型推断 / 解包)
│ │ └── messages.js # ★ 114 条已验证消息白名单 + 别名纠错
│ └── panels/default/index.js # 面板
├── scripts/install-extension.js
├── test/
│ ├── e2e.js # 端到端(真机 Cocos)
│ └── tool-smoke.js # 全工具冒烟(逐个真跑)
├── research/
│ └── 逆向调研报告.md # 8 个项目的解构 + 引擎行为实测
├── SOURCES.md # ★ 来源与致谢:调研对象 / 原创性核查 / 设计借鉴对照
├── NOTICE
├── LICENSE
└── package.json环境要求
Cocos Creator 3.8.0+(在 3.8.8 上实测)
Node.js 18+(开发用 22.x)
macOS / Windows / Linux(编辑器侧随平台;hub 侧纯 Node,跨平台)
License
MIT
This server cannot be deployed
Maintenance
Related MCP Connectors
Remote MCP server for AI.TV creators — delegate account operations to your AI agent over MCP.
A comprehensive Model Context Protocol (MCP) server that enables AI assistants to control Unreal E…
Remote MCP server exposing your Node Command fleet (files, shell, processes, browser) to AI hosts.
Build, run and publish 3D games in the Zero engine from Claude Code, Cursor or Codex, over MCP.
Related MCP Servers
- AlicenseNot gradedqualityDmaintenanceEnables AI assistants to directly control the Cocos Creator 3.8.x editor via MCP protocol, providing over 130 tools for scene, node, component, asset, and project operations.8 npm44MIT
- AlicenseNot gradedqualityDmaintenanceEnables AI assistants to directly control the Cocos Creator game editor via MCP protocol, supporting scene management, node manipulation, component attachment, and asset management.8 npm3MIT
- AlicenseNot gradedqualityDmaintenanceA comprehensive MCP server for Cocos Creator 3.8+ that enables AI assistants to interact with the editor via 50+ tools for scene, node, component, prefab, asset, and project management.8 npm1MIT
- FlicenseNot gradedqualityDmaintenanceEnables AI clients to control Cocos Creator editor projects, scenes, nodes, components, assets, Prefabs, building, and diagnostics via the MCP protocol.-