分享一个用于 Cocos Creator 的 MCP 桥接插件

我研究一下

不是一个 你说这个只支持3.x版本

对呀,他问的就是3.x的MCP

当移除一个节点(mcp创建的节点)时会卡住编辑器

感谢反馈,有没有完整的日志或者复现步骤

2026-02-26T01:55:34.239Z - success: preview server running at http://localhost:7456
2026-02-26T01:55:34.793Z - normal: Initializing Cocos2d
2026-02-26T01:55:35.151Z - normal: Initializing engine extends
2026-02-26T01:55:35.949Z - normal: Loading packages
2026-02-26T01:55:35.952Z - normal: Run Application
2026-02-26T01:55:36.112Z - info: Cocos Service load base data!
2026-02-26T01:55:38.374Z - error: TypeError: Cannot read property 'a' of undefined
    at CCClass._invoke (D:\ProgramData\cocos\editors\Creator\2.4.13\resources\engine\bin\.cache\dev\cocos2d\core\component-scheduler.js:245:10)
    at CCClass.invoke (D:\ProgramData\cocos\editors\Creator\2.4.13\resources\engine\bin\.cache\dev\cocos2d\core\node-activator.js:82:10)
    at CCClass.activateNode (D:\ProgramData\cocos\editors\Creator\2.4.13\resources\engine\bin\.cache\dev\cocos2d\core\node-activator.js:266:20)
    at cc_Scene._activate (D:\ProgramData\cocos\editors\Creator\2.4.13\resources\engine\bin\.cache\dev\cocos2d\core\CCScene.js:114:32)
    at Object.runSceneImmediate (D:\ProgramData\cocos\editors\Creator\2.4.13\resources\engine\bin\.cache\dev\cocos2d\core\CCDirector.js:492:11)
    at D:\ProgramData\cocos\editors\Creator\2.4.13\resources\app.asar\editor\page\scene-utils\utils\scene.ccc:1:4051
    at D:\ProgramData\cocos\editors\Creator\2.4.13\resources\engine\bin\.cache\dev\cocos2d\core\asset-manager\utilities.js:406:9
    at D:\ProgramData\cocos\editors\Creator\2.4.13\resources\engine\bin\.cache\dev\cocos2d\core\platform\utils.js:74:9
    at processTicksAndRejections (internal/process/task_queues.js:75:11)
2026-02-26T01:55:38.748Z - success: cloud-function unloaded
2026-02-26T01:57:08.806Z - error: TypeError: this.node._removeComponent is not a function
    at cc_Label._onPreDestroy (D:\ProgramData\cocos\editors\Creator\2.4.13\resources\engine\bin\.cache\dev\cocos2d\core\components\CCComponent.js:539:15)
    at cc_Label._destroyImmediate (D:\ProgramData\cocos\editors\Creator\2.4.13\resources\engine\bin\.cache\dev\cocos2d\core\platform\CCObject.js:517:10)
    at cc_Node._onPreDestroy [as _onPreDestroyBase] (D:\ProgramData\cocos\editors\Creator\2.4.13\resources\engine\bin\.cache\dev\cocos2d\core\utils\base-node.js:1328:17)
    at cc_Node._onPreDestroy (D:\ProgramData\cocos\editors\Creator\2.4.13\resources\engine\bin\.cache\dev\cocos2d\core\CCNode.js:1805:32)
    at cc_Node._destroyImmediate (D:\ProgramData\cocos\editors\Creator\2.4.13\resources\engine\bin\.cache\dev\cocos2d\core\platform\CCObject.js:517:10)
    at Immediate.deferredDestroy (D:\ProgramData\cocos\editors\Creator\2.4.13\resources\engine\bin\.cache\dev\cocos2d\core\platform\CCObject.js:202:11)
    at processImmediate (internal/timers.js:461:21)

插件面板的日志方便也一起发一下嘛

编辑重启了,具体的复现步骤是:

  1. mcp 自动创建的 Label ,手动调整了位置(此时没有报错)。
  2. 然后使用 mcp 对话内再次调整了Label的位置(未生效)。
  3. 回到编辑器内尝试手动调整Y坐标,此时就出现了问题,文本没有跟随node 节点移动
  4. 尝试删除这个Label 也无法删除

好,我看看

可以加群沟通更方便一些:788307395

有微信群么,QQ不使用了 :rofl:

看了仓库,更新频率高高滴呀 :+1:

编辑器体验与容错增强 (2026-02-28)

1. SpriteFrame 智能识别与自动转换

  • 问题 : 当 AI 大模型尝试给 cc.Sprite 等组件的 spriteFrame 属性赋值时,常常会错误传递为其父级 Texture2D (原图) 的 UUID。Cocos 引擎由于类型不匹配会导致赋值无效,且静默失败(或陷入 IPC 死锁导致编辑器卡死)。
  • 优化 : 在 scene-script.js 中的 applyProperties 环节新增了类型容错机制。当识别到传入的 UUID 对应 Texture2D 但该属性(例如含 sprite 关键字)需要 SpriteFrame 时,脚本会利用 Node.js fs 直接读取对应的 .meta 文件,提取出实际子资源 ( SpriteFrame ) 的正确 UUID,从而实现自动转换与安全赋值。
  • 降级 : 若自动转换失败(如 meta 结构改变或读取失败),则会通过 Editor.warn 在控制台明确提示类型错误,拦截强制赋值操作,彻底消除潜在的隐性崩溃。
1赞

真不错:+1:先mark了

引用查找与资源 UUID 自动解析 (2026-03-01)

1. 新增 find_references 工具

  • 功能: 查找当前场景中引用了指定节点或资源的所有位置。支持节点引用 (cc.Node) 和资源引用 (cc.Prefab, cc.SpriteFrame, sp.SkeletonData 等)。
  • 实现:
    • src/scene-script.js 中新增 find-references IPC 处理函数,递归遍历场景所有节点的所有组件属性,检查属性值是否引用了目标对象。
    • 支持直接属性值、数组元素、EventHandler.target 的深层检查。
    • src/main.js 中新增工具定义和路由。
  • 返回结构: 包含 targetIdtargetType (检测类型)、referenceCount (引用计数) 和详细的 references 数组,每项包含引用所在节点、组件类型、属性名等信息。

2. UUID 格式自动规范化

  • 问题: Cocos Creator 2.x 中 cc.Asset._uuid 使用 22 位压缩格式,而 Editor.assetdb 返回标准 36 位带连字符格式,直接字符串比较无法匹配。
  • 修复: 在 find-references 处理函数中通过 Editor.Utils.UuidUtils 预计算目标 UUID 的压缩和解压格式,将所有变体存入 targetVariants 数组进行全量匹配。

3. Texture2D -> SpriteFrame 子资源 UUID 自动解析

  • 问题: AI 传入图片 (Texture2D) 的 UUID 时,cc.Sprite.spriteFrame 实际引用的是该图片的子资源 SpriteFrame(具有不同的 UUID),导致直接查找返回空结果。
  • 修复: 在 src/main.jsfind_references 路由中,调用 scene-script 前自动读取目标 UUID 对应资源的 .meta 文件,提取所有 subMetas 中的子资源 UUID (如 SpriteFrame),作为 additionalIds 传递给 scene-script。scene-script 将这些额外 UUID 及其压缩/解压变体一并加入匹配列表,实现 “传入 Texture2D UUID 也能查到 SpriteFrame 引用” 的透明体验。

节点变换属性修复与数据增强 (2026-03-01)

1. update-node-transform 属性设置方式修复 (src/scene-script.js)

  • 问题: update-node-transformx, y, width, height, scaleX, scaleY 六个属性通过异步 IPC Editor.Ipc.sendToPanel("scene", "scene:set-property", ...) 设置,存在 fire-and-forget 问题,函数在属性实际生效前就已返回成功回复。导致宽高不生效(Sprite 的 sizeMode 可能在异步消息到达前重置)、坐标不生效(异步 IPC 竞态条件)、批量操作属性丢失等问题。
  • 修复: 将所有属性设置统一改为在 scene-script(渲染进程)中直接对节点属性同步赋值(如 node.x = Number(x)),与 set-propertycreate-node 中的处理方式保持一致。color 同步改为直接赋值 node.color = new cc.Color().fromHEX(color)
  • 已验证: 全部 7 个属性(x, y, width, height, scaleX, scaleY, color)批量设置后均即时生效。

2. update_node_transform 工具参数扩展 (src/main.js + src/scene-script.js)

  • 问题: 编辑器属性面板中的 Rotation、Anchor、Opacity、Skew 四类属性无法通过 update_node_transform MCP 工具设置和获取。
  • 修复:
    • src/main.js 的工具 inputSchema 中新增 rotation, anchorX, anchorY, opacity, skewX, skewY 六个参数定义。
    • src/scene-script.jsupdate-node-transform 处理函数中新增对应的直接赋值逻辑(node.angle, node.anchorX, node.anchorY, node.opacity, node.skewX, node.skewY)。
  • 已验证: 全部 13 个属性(x, y, rotation, width, height, scaleX, scaleY, anchorX, anchorY, color, opacity, skewX, skewY)批量设置后均即时生效。

3. get_scene_hierarchy 节点详情数据增强 (src/scene-script.js)

  • 问题: includeDetails 模式仅返回 position, scale, size 三类数据,缺少 rotation, anchor, color, opacity, skew, group 信息,无法通过 API 完整验证节点属性。
  • 修复: 在 dumpNodes 函数的 includeDetails 分支中新增六个返回字段:
    • rotation: node.angle
    • anchor: { x: node.anchorX, y: node.anchorY }
    • color: { r: node.color.r, g: node.color.g, b: node.color.b }
    • opacity: node.opacity
    • skew: { x: node.skewX, y: node.skewY }
    • group: node.group
  • 效果: includeDetails 现在返回与编辑器属性面板完全一致的所有节点属性。

4. Scene 面板未就绪友好提示 (src/main.js)

  • 问题: 插件重载或场景切换期间调用 scene-script 方法时,原始错误 Error: ipc failed to send, panel not found 信息晦涩,容易让用户误以为插件出现严重故障。
  • 修复: 在 callSceneScriptWithTimeout 的回调中检测 panel not found 错误,自动替换为友好中文提示:场景面板尚未就绪(可能正在重载插件或切换场景),请等待几秒后重试。日志级别从 error 降为 warn

大佬很快啊,,

预制体序列化格式修复 (2026-03-02)

1. create-prefab 序列化输出格式修复 (src/scene-script.js)

  • 问题: 通过 create_prefab 工具创建的预制体虽然不报错,但文件内容格式不正确,导致在编辑器中打开或使用时出现异常行为。

  • 原因: Editor.serialize(node) 输出的是场景格式而非预制体格式,具体表现为:

    1. :x: 数组首元素为 cc.Node 而非 cc.Prefab 包装器。

    2. :x: 包含 cc.Scene 对象,根节点 _parent 指向 Scene。

    3. :x: 所有节点的 _prefab 字段为 null,缺少 cc.PrefabInfo

    4. :x: 节点保留了运行时 _id 值(如 "f6WlEh4IdCcKIheBW4zwk5"),而预制体中应为空字符串。

  • 修复: 在 src/scene-script.js 中重写 create-prefab 处理器,增加 9 步后处理管线将场景格式数据转换为标准预制体格式:

    1. 解析 Editor.serialize() 返回的 JSON。

    2. 识别并移除 cc.Scene 对象。

    3. 构建旧索引到新索引的映射表。

    4. 添加 cc.Prefab 根包装器(索引 0,data 指向根节点)。

    5. 更新所有 __id__ 引用为新索引。

    6. 修复根节点 _parentnull

    7. 清空所有节点的 _id 为空字符串。

    8. 为每个 cc.Node 生成 cc.PrefabInfo(含唯一 fileIdroot 指向根节点、asset 指向 cc.Prefab)。

    9. 序列化为 JSON 字符串返回。

  • 验证: 创建的预制体文件结构与编辑器原生拖拽创建的预制体完全一致,可正常打开编辑、实例化使用,控制台零报错。

ps: 感谢 @亮仔:joy: :grin: :chicken:否? 提供的反馈以及操作日志

库拉牛逼!

牛!!!!!!!!!!!!!!!

性能优化与防御性增强 (2026-03-04)

1. JSON 响应压缩输出 (src/main.js)

  • 问题: MCP 工具调用返回结果时使用 JSON.stringify(result, null, 2) 格式化输出,凭空增加约 20-40% 的响应体积,消耗额外 Token 且对 AI 工具毫无意义。
  • 修复: 移除缩进参数,改为 JSON.stringify(result) 压缩输出。
  • 效果: 响应体积减少 20-40%,直接降低 AI 模型的 Token 消耗成本。

2. 指令队列长度限制 (src/main.js)

  • 问题: commandQueue 数组无最大长度限制,理论上在极端情况下可能无限增长。
  • 修复: 新增 MAX_QUEUE_LENGTH = 100 常量。enqueueCommand 入口检查队列长度,超限时直接 reject 并返回 HTTP 429 状态码,同时记录告警日志。
  • 保护: 在 enqueueCommand 调用处补充 .catch() 处理 reject,确保 HTTP 响应正常关闭,避免 unhandled promise rejection。

3. 层级树子节点数量上限 (src/scene-script.js)

  • 问题: get-hierarchydumpNodes 递归遍历子节点时无数量限制,若某个节点下有数百个同级子节点,返回数据量巨大。
  • 修复: 新增 MAX_CHILDREN_PER_LEVEL = 50 安全上限。每层最多返回 50 个子节点,超出部分在返回数据中通过 childrenTruncated 字段标注被截断的数量,帮助 AI 知悉还有更多子节点未列出。