修改项目
在 editor 和 full profile 下,服务器会修改项目。每次修改都是一个写入日志的事务,无论改的是什么,规则都一样。
每次写入都遵守的规则
- 写明它要替换什么。 替换、修补、移动或删除文件时,要用
expectedSha256写明文件当前的 SHA-256,可以用project.files.list或file.get读到。创建文件要求路径空着。哈希过期会答复conflict,什么都不写,所以基于旧副本做的修改永远不会覆盖更新的内容。 - 先写进日志。 意图在执行之前落盘,结果在执行之后落盘。中途进程退出的事务会在下一次启动时被核清:要么证明改动已经发生,要么证明没有发生,要么把事务隔离起来,在修复之前阻止所有写入(见恢复)。
- 可以放心重复。 每次写入都带
idempotencyId,重复调用返回记录下来的结果,不会再写一次。 - 可以先预览。
dryRun: true会校验改动并返回差异,但什么都不写。 - 不离开项目。 离开项目根目录、经过符号链接,或者伸进服务器自己
.godot-mcp/状态目录的路径,都会在任何操作发生之前被拒绝。
文件与脚本
| 工具 | 作用 |
|---|---|
file.get | 读取一个文件及其 SHA-256 |
file.create、script.create | 在空着的路径上创建文件或 GDScript 脚本 |
file.patch、script.patch | 以下面三种方式之一修改文件:整体替换、按行编辑或统一差异格式 |
file.move、file.delete | 移动或删除文件,每次都对照它的 SHA-256 |
script.create 和 script.patch 还会解析结果:有解析错误的脚本会被拒绝,除非调用设置了 allowParseErrors;诊断信息无论如何都会返回。它们不执行任何东西,要得到引擎的结论请用 script.check。
场景与资源
scene.create、scene.batch.apply、resource.create 和 resource.batch.apply 通过一个无窗口的 Godot 进程修改文本格式的场景和资源,所以需要 Godot;resource.update 按 Godot 的写法重新保存一个资源。一批改动是一串类型化的操作——添加、实例化、删除、重命名、移动或复制节点,设置或清除属性,挂载脚本,连接或断开信号,添加分组,设置子资源——按顺序作为一个事务执行:只要有一个操作被拒绝,就什么都不发布。节点用从场景根开始的路径来指定,或者用 scene.tree.get 给它的 handle;来自旧字节的 handle 会被当作冲突拒绝。属性值是带类型的 {type, value} 对象,所以 Vector2 或 Color 永远不会被误当成字符串。
如果场景正在通过插件连接的编辑器里打开,同样的调用会在编辑器里执行,并成为那里的一次可撤销操作(见编辑器插件)。
设置与资产
project.settings.patch 通过类型化操作修改 project.godot:主场景、自动加载、输入动作及其事件、插件以及单项设置。asset.put 写入二进制资产,较大的文件可以分块上传,对照整个文件的 SHA-256;asset.status 和 asset.delete 用来查看和删除资产。project.uid.update 通过 Godot 的重新保存,为一个文本资源注册或修复 UID。
编辑器占着文件时
无窗口的写入会以 conflict 拒绝已连接的编辑器占着的路径:任何打开的场景,以及编辑器缓冲区与文件不一致的打开的脚本。请先在编辑器里保存或关闭它,或者通过会经由编辑器执行的 scene.batch.apply 修改场景。