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.
This server does not currently have a deployable release on Glama. Follow the repository's setup instructions to install and configure it for your MCP client, including any required credentials and local dependencies.
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.
Shared memory MCP server for Claude Code, Codex, Gemini CLI and Cursor. Cited, editable.
1Make games with AI: one MCP server that connects your agent to Unity, Unreal and Godot editors. Additionally you can use AI Game Dev app (https://ai-game.dev) to generate images, video, audio, 3D, rig, animation and much more.
A comprehensive Model Context Protocol (MCP) server that enables AI assistants to control Unreal E…
Related MCP Servers
- AlicenseNot gradedqualityFmaintenanceEnables 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.20 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.20 npm3MIT
- FlicenseNot gradedqualityDmaintenanceEnables AI clients to control Cocos Creator editor projects, scenes, nodes, components, assets, Prefabs, building, and diagnostics via the MCP protocol.-
- AlicenseNot gradedqualityCmaintenanceEnables AI clients to inspect and operate the Cocos Creator project currently open, including scenes, nodes, assets, animations, and editor workflows via MCP.MIT