genshin-miliastra-mcp
Summary: This MCP server lets an AI build, script, test, and prepare Genshin Impact Miliastra Wonderland levels by reading/writing local saves and driving the real editor/game.
Discover capabilities and saves: inspect server features, list/inspect maps, node docs, level settings, windows, and editor state.
Build scenes: search 2,468 assets with thumbnails, place blocks/assets, build/import asset packs, remove entities, set spawn/respawn/camera/classes/factions/environments/lights.
Create gameplay objects: make prefabs, add components (collision triggers, option tabs, variables, motions, follow, nameplates, bubbles, hurt boxes, abilities, projectiles, hit detection, loot, launchers, force fields).
Script logic: add graph types, write/compile Genshin-TS graphs, define signals, skills, creature skills/logic, currencies, items, shops, timers, unit statuses, card selectors.
Build UI and client Lua: add progress bars, text boxes, images, buttons, timer displays, client control trees/templates/scripts; read back and check client UI/scripts.
Playtest automatically: import/run saves, script inputs (keys, clicks, text, teleports, camera turns), take screenshots/bursts, record video/audio, read logs/screen text, track player, bake navigation, verify expectations.
Inspect results: poll playtest status, stitch frame sheets, read screenshots/log output.
Use knowledge and examples: search/read offline official guides, tutorials, sample dissections, transcripts, and worked examples.
Prepare publishing: generate a cover, screenshots, title/description/tags, and an official-requirements checklist.
Automate editor interaction: capture/focus windows and send mouse/keyboard input.
Batch operations: run multiple scene-editing steps in one call.
Provides tools for creating levels in Genshin Impact's Miliastra Wonderland (千星奇域) UGC editor/沙箱: searching the official 2468-prop catalogue and placing scene objects, building mechanisms, creatures, skills, items, shops and currencies, generating node graphs compiled from TypeScript, writing client-side Lua UI, configuring environment/lighting/spawn points, and running scripted in-game playtests that return logs, screenshots and recordings. Also ships offline knowledge bases (official guides and 48 disassembled tutorial saves) plus catalogues of effects, sounds, music and UI images, and helps produce covers, titles and descriptions ahead of publishing in-game.
genshin-miliastra-mcp · 原神千星奇域游戏制作 MCP 服务器
让 AI 替你做千星奇域的关卡。 Miliastra Wonderland MCP Server for Genshin Impact UGC · English
给支持 MCP(Model Context Protocol)的 AI 用的《原神》千星奇域创作工具。你在自己的电脑上开着千星奇域的编辑器(千星沙箱),Claude、Cursor、Codex 这类 AI 接上这套工具替你搭关卡:搜物件摆场景、设关卡、写节点图(TypeScript,用 Genshin-TS 0.2.2 编译)、自动试玩并拿回日志和截图。
|
|
|
上面三局是三个没参与过开发的 AI 各自只拿到这套工具、从空白地图做出来并按脚本打通的(经过和它们卡在哪)。
AI 自己进游戏试玩。 下面这段是工具录的:一局用客户端 Lua 写的翻牌配对(examples/pairs),工具把它写进存档、打开游戏、照脚本点暂停、继续、翻完十二张牌,一直打到游戏自己的胜利画面,再把日志和画面拿回来对照。没有人碰鼠标。

它能做什么
搭场景:2468 种官方物件的图鉴,按名字搜、看缩略图,一次导入一百个物件;锁定视角、出生点、复苏点、昼夜和灯光。
做机关和怪:元件、碰撞触发器、按 F 交互、移动平台、弹跳垫、力场、隐形墙、投射物和命中检测、会自己找敌人打的复杂造物、技能、道具、商店、货币;NPC 头顶的对话气泡、名字、血条。


用积木捏东西:平台没有的角色、宠物、载具、雕像,用白盒形状(球、圆锥、长方体、圆柱、棱柱……)拼出来,每块单独上色,整个是一个元件,节点图一句话生成、跟随运动器带着走。拼的时候不用开游戏:工具一秒钟画出四个方向的预览图,看着改。下面是 39 块积木拼的派蒙,出场打招呼,然后一路跟在角色旁边(examples/paimon)。

做界面:进度条(横条、竖条、圆环)、图片(约 1600 张平台自带的图)、计时器、按钮、卡牌选择器(三选一)。
写客户端 Lua(游戏 7.1 的新能力):会动、能收鼠标和按键的界面,甚至整局 2D 小游戏;脚本的打印和节点图的打印一起从试玩里拿回来。

写规则:节点图用 TypeScript 写,一次编译几十张图写进存档;自带节点文档、特效(3195 条)、音效(1997 条)、音乐(188 条)的中文目录。
自己试玩:按脚本按键、点鼠标、把玩家放到指定位置,截图、连拍、录音、录像,读回日志;AI 靠这个知道做出来的东西在游戏里到底对不对。
发布前的准备:出封面、截图、标题和简介。发布本身由你在游戏里点。
离线知识库:官方综合指南、教程、48 份官方教学存档的拆解,加上一份实测出来的平台规则,AI 设计玩法前先查。
Related MCP server: Hayba
自带的图鉴:缩略图和编号
千星奇域里的物件、特效、音效、图片,在存档和节点图里都是靠编号引用的。编号在编辑器里看得到,但本地数据里没有现成的表可查。这个仓库把它们整理成了图鉴,大部分是从编辑器里一样一样读出来、拍下来的,AI 按中文名字就能查到编号、看到长相再挑:

图鉴 | 数量 | 内容 | 文件 |
物件 | 2468 种,其中 2398 种有缩略图 | 编号、名字、分组、尺寸(名单和尺寸来自 qianxing-format-docs,CC BY 4.0);缩略图是摆进编辑器里逐个实拍的 |
|
特效 | 3195 条(限时 1986、循环 1209) | 编号、名字、每条在资产库里的小图;87 个循环特效另有挂在角色身上的实拍 |
|
音效 | 1997 条 | 编号、名字、分类;其中 73 条录下来量过时长和响度 |
|
背景音乐 | 188 首 | 编号、名字、分类 |
|
界面图片 | 1590 张,15 类 | 图标、底板、分隔线、技能、道具、造物头像等;图库逐页的照片,每张图下面标着编号 |
|
复杂造物的动画 | 18 种造物 296 条 | 名字、编号、时长、是否循环;逐帧看过的动作写了手里拿什么、哪一毫秒出手 |
|
机关的预设状态 | 45 个机关 | 宝箱开合、拉杆、活板门这些状态的编号和取值 |
|
官方教学存档 | 48 份 | 逐份拆成 JSON,加上做法的归纳 |
|

这些都是普通的 JSON 和 JPG,不接 MCP 也可以直接拿去用(比如手写 Genshin-TS 时查编号)。游戏更新后重新抄一遍的办法在 scripts/dev/README.md。
说明和现状
这是爱好者做的非官方项目,和米哈游 / HoYoverse 没有关系。它只读写你本机的千星奇域存档、像人一样操作你自己打开的编辑器窗口,不修改游戏程序,不读写游戏内存,不拦截网络。游戏更新以后存档格式或界面可能变,工具要跟着改。用之前请自己确认符合游戏的用户协议和千星奇域的创作规范。
当前是 0.1.0 预览版:只在 Windows、国服中文客户端上验证过。
从哪看起:现状和限制 · 平台规则(实测出来的坑)· 千星奇域是怎么搭游戏的 · 范例。接上服务器以后,资源 miliastra://workflow 讲每一步用哪个工具,AI 会自己读。
需要什么
Windows 10 或 11,装着原神(中文客户端),账号能进千星奇域的编辑器(千星沙箱)。
Node.js 22.12 或更高。
Python 3.10 或更高。自动试玩和截图还要
pip install -r requirements-capture.txt(Pillow 和 rapidocr-onnxruntime)。一个支持 stdio MCP 的 AI 客户端(Claude Code、Claude Desktop、Cursor、Codex CLI 等)。本服务自己不调用大模型,不需要 API Key。
试玩时显示器要开着(没有显示器游戏出不了画面),窗口 16:9 全屏;工具会占用鼠标和键盘,这段时间别同时操作电脑。
安装
git clone https://github.com/8itlab/genshin-miliastra-mcp.git
cd genshin-miliastra-mcp
npm ci
npm run build:core
pip install -r requirements-capture.txt
npm run doctornpm run doctor 检查 Node、Python 和可选的截图依赖是不是齐了。
接到 AI 客户端
在客户端的 MCP 配置里加一项(把路径换成你自己的;examples/mcp.example.json 是同一份):
{
"mcpServers": {
"miliastra": {
"command": "node",
"args": ["C:/path/to/genshin-miliastra-mcp/src/server.mjs"],
"env": {
"MILIASTRA_WORKSPACE": "C:/path/to/genshin-miliastra-mcp/workspace",
"MILIASTRA_ALLOW_LIVE_WRITE": "0"
}
}
}
}Claude Code 可以用一条命令加:
claude mcp add miliastra -e MILIASTRA_WORKSPACE=C:/path/to/genshin-miliastra-mcp/workspace -e MILIASTRA_ALLOW_LIVE_WRITE=0 -- node C:/path/to/genshin-miliastra-mcp/src/server.mjsMILIASTRA_WORKSPACE:工具放项目副本、截图和日志的文件夹。MILIASTRA_ALLOW_LIVE_WRITE:0时只写存档的副本(试玩时再导入成一份新存档),不动你的正式存档。MILIASTRA_PYTHON/MILIASTRA_PLAYTEST_PYTHON:Python 不在 PATH 里,或者想用单独的环境时填解释器的绝对路径。MILIASTRA_SAVE_ROOTS:存档不在默认位置时填(绝对路径数组的 JSON 字符串)。默认从当前 Windows 用户的AppData/LocalLow/miHoYo/原神/BeyondLocal和国际服对应目录找,只扫账号下的Beyond_Local_Save_Level。
服务用 stdio 说话,不是网页。多个客户端可以同时连同一个工作区(配置要一样);它们共用一个后台进程,全部断开后自己退出。运行时的凭据在当前用户的 LocalAppData/MiliastraMCP/runtime/,不要把里面的 core.json 发给别人。
如果你是替用户安装的 AI:照上面“安装”的六条命令做,把 MCP 配置里的两处路径换成克隆下来的实际位置,让用户重启客户端;接上以后先读资源 miliastra://workflow 和 miliastra://platform-rules 再动手。仓库根目录的 llms.txt 是给你看的摘要。
第一次用
在游戏里“我的奇域 → 新建存档”(超限模式),进编辑器存一次,记住存档名。
对 AI 说类似这样的话:
使用 miliastra MCP。先读资源
miliastra://workflow和miliastra://platform-rules。在我的空白存档「XXX」上做一个一分钟的小游戏:捡齐五个金币就赢,倒计时走完就输。做完用playtest_start按脚本各打一遍赢和输,把结算画面的截图给我看;分别告诉我哪些是编译通过、哪些是在游戏里真的验证过的。
AI 做出来的东西写在存档的副本里;试玩时工具把副本导入成一份新存档并打开。发布由你自己在游戏里点,工具不点。
玩法代码是 Genshin-TS 支持的 TypeScript 子集;物件、特效、音效的编号都从工具自带的图鉴里查,不用自己找。
工具
工具 | 作用 |
| 版本、功能、限制、路径、写入开关 |
| 存档发现、真实图 ID、名称、类型、节点数;同名的存档会标出来 |
| 搜索依赖自带的中英文节点定义( |
| 平台自带的特效(限时 1986、循环 1209)、音效(1997)、背景音乐(188):按中文名字查编号,特效带缩略图,结果里有节点图里的用法。名字和编号是从编辑器的资产库里抄下来的 |
| 2468 种官方物件的图鉴:按名字查( |
| 做元件(图里 |
| 给元件加平台自带的组件:碰撞触发器、选项卡(按 F 交互,可带布尔过滤器)、自定义变量、基础运动器(直线、路径)、跟随运动器、小地图标识、文本气泡(NPC 头顶一句接一句的话)、铭牌(头顶的名字、图标、跟着变量走的条、血条,以及离远了指路的导航指示器)、自定义挂接点、受击盒、能力单元、弹射器( |
| 新建一张空图并挂好:关卡实体、元件(可一图挂多个元件)、玩家模板、角色模板;也能建客户端的技能图、过滤器图和道具图 |
| 信号(全关卡广播),可带好几个参数:整数、浮点数、布尔值、字符串、三维向量、实体、GUID、元件 ID、配置 ID 和它们的列表(编辑器给的十八种类型);节点图之间、Lua 脚本发给节点图、节点图发给 Lua 脚本、客户端节点图发给服务器四条路都上机验过( |
| 全局计时器(倒计时或正计时)和屏幕上显示它的计时器控件 |
| 复杂造物(“怪物(AI版)”那 48 种):定义造物技能(一段或几段动画加一张技能图,可设自动面向目标),给造物元件绑上决策图和技能表(每个技能的冷却),设它多远发现敌人、多远放弃、领地多大。配合三种造物图( |
| 复杂造物的动画表:名字、编号、时长、是否循环(读了 18 种 296 条)。造物技能按名字或编号选动画。造物的模型都是空手的:表里还写了每种造物手里能拿什么、上机逐帧看过的那些动作是什么样、哪一毫秒算数( |
| 技能:瞬发,或带一段角色动画的普通技能(可在某一毫秒触发技能图、手里挂武器);技能图里打攻击盒就能打到怪和带受击盒的物件 |
| 货币,以及角色身上的背包 |
| 道具(材料,或带道具节点图、能在背包里使用的消耗品);把元件做成商店(平台自带的买卖界面) |
| 屏幕上的进度条(跟着玩家变量走;可以是横条、竖条、圆环,可以直接显示当前值的数字,颜色可改)、交互按钮(按数字键触发,玩家模板上的图收事件)和图片(平台自带的图,或一块纯色的底板:不靠文字也能把话说清楚);控件可以一开始隐藏,由节点图开关 |
| 屏幕上的文本框:文字,或跟着自定义变量走的数字(“金币:{1:ps.coins}”)。要奇匠 Lv.2 以上的账号才显示 |
| 卡牌选择器:平台自带的“几选一”窗口(每张卡有图标、标题、描述;单人关卡里打开时游戏暂停),节点图用 |
| 单位状态:描边、透视、加生命上限;图里加减 |
| 固定时刻的环境配置(昼夜靠两套配置切换;按编辑器的写法写,白天不会过曝)和属于某套配置的点光源 |
| 客户端界面(游戏 7.1):把 Lua 5.3 脚本放进存档,在屏幕上摆一棵由它控制的客户端控件树(十一种:图片、光标检测区域、容器、网格视窗、模板引用、预设按钮、按键提示、文本框等),还能做脚本运行时照着造的控件模板。界面可以每帧在动、收鼠标和按键,整局 2D 玩法也能做;和节点图靠自定义变量和信号互通(节点图也能直接给脚本发信号: |
| 界面图片控件能用的全部图片(约 1600 张,15 类:功能图标、玩法图标、装饰图案、底板、分隔线、特殊字符、技能、道具、造物头像):按分类返回编辑器图库的照片,每张图下面是编号 |
| 用积木拼一个元件:一串零件,每块是白盒形状(长方体、球体、平面、三棱柱、五棱柱、三棱锥、五棱锥、圆柱、圆锥和两种线框)或任意物件模型,各有位置、旋转、尺寸(米)和颜色;写成“空模型加 N 个装饰物”,整个是一个实体。 |
| 把已经导入场景的物件从存档副本里拿掉(按名字或名字前缀):导入只能加,摆错的靠它减 |
| 职业:角色能不能跳、冲刺、攀爬、滑翔,用哪个镜头模板;角色的等级和基础生命、攻击、防御、体力(新地图默认一万血,打不死) |
| 出生点和图里按编号读取的命名位置 |
| 复苏点(角色倒下后回来的地方;配合图里的激活复苏点做存档点);复苏的规则:等几秒、自动复苏还是弹复苏界面、几条命、回来时几成血;关卡收几个人(发布单人游戏要设成 1 到 1) |
| 一键试玩:导入存档、订阅日志、按脚本按键 / 点鼠标 / 点屏幕上的字、截图(可以隔零点几秒连拍, |
| 把一次试玩里某一段的截图裁到同一块区域、标上秒数、拼成一张图:逐帧看动作(武器在不在手上、落刀和伤害数字对不对得上、飞刀是不是手松开时出去的)。打印看不出这些 |
| 发布前的准备:从试玩截图里出封面和四张图(1600×900)、标题、描述、标签和一张对照官方要求的检查表,放进一个文件夹。真正的发布由创作者自己在游戏里做 |
| 离线搜索官方综合指南、教程、常见问题、48 份官方教学存档的拆解和教学视频文字稿( |
| 读关卡设置:仇恨类型、仇恨转移倍率、关卡时钟的起始时刻和流速(改用 |
| 一次调用里依次做一串 |
| 写节点图:一次调用把一张或多张图的源码类型检查、编译、写进存档副本(三十七张图约二十秒),返回可以试玩的存档和每张图的节点数;哪张编译不过就停在哪张并报出错误;只改了几张就只发那几张。早先分五步做的那组工具(建项目、改源码、构建、预览、写入)默认不再列出,要用时设环境变量 |
| 枚举原神与千星沙箱窗口、实际窗口 ID 和坐标 |
| 返回 MCP 内联 PNG、原图文件、缩放比例和质量提示 |
| 将指定编辑器窗口置于前台并返回新截图 |
| 基于截图执行一次点击、按键、文字、滚动或拖拽,再返回新截图 |
资源 miliastra://workflow 提供面向 AI 的工作流与限制说明;miliastra://knowledge 是知识库的总结和索引。
上表里的工具哪些在游戏里走通过、还有哪些限制,见 现状和限制。用它们从零搭出并按脚本走通的游戏和一批单项验证关在 examples/。
一键试玩
写完代码、构建出候选存档后,用 playtest_start 让它自己玩一遍,再用 playtest_status 取结果。中间不需要 AI 一步步点界面。
{
"mapPath": "D:\\\\work\\\\candidate.gil",
"graphName": "_GSTS_MyGraph",
"durationSeconds": 120,
"screenshotsAt": [10, 60, 110],
"inputs": [{"at": 30, "key": "D", "holdMs": 3000}]
}它会依次做:导入这个存档(生成一个新的官方存档)、打开并保存、在沙箱日志窗口订阅 graphName、开始试玩、按时间点截图和按键、到时间后退出试玩、取回这一场的官方日志。playtest_status 返回每一步的进度、日志里的打印(t 是关卡时钟的秒数)和截图。不传 mapPath 就直接试玩编辑器里已经打开的存档。
使用条件:
原神开着就行:停在主世界、千星奇域大厅、存档列表或编辑器里都可以,工具会自己走到存档列表。运行期间它会占用鼠标和键盘,不要同时操作这台电脑。
中文客户端。按钮靠识别界面文字来找,不依赖分辨率;只有左上角菜单和左下角退出两个纯图标按钮按窗口比例定位,目前只在 16:9 全屏下测过。
Python 需要
pip install -r requirements-capture.txt(Pillow 和 rapidocr-onnxruntime)。如果想用单独的 Python 环境,把解释器路径放进环境变量MILIASTRA_PLAYTEST_PYTHON。游戏如果以管理员身份运行,MCP 所在的程序也要以管理员身份运行,否则按键发不进去。
一轮的固定开销约两分钟(导入、打开、订阅、加载),加上试玩时长。
试玩跑完只代表关卡被玩了这么久。玩法对不对,要看返回的打印和截图自己判断。设计关卡和测试前先读 平台规则,里面是实测出来的坑,比如造物离玩家太远就不行动。
搭场景
场景可以写成一份方块清单,由工具生成官方资产包再导进编辑器。导进去的是能选中、能手调的真实物件。
scene_block_catalog:看有哪些方块可用(箱子、立方体、墙体等 21 种),各自的颜色和原始尺寸。scene_build_blocks:给出每个物件的模板(方块名或物件编号)、位置和旋转(度),再给尺寸(米,拉伸到正好这么大)或缩放(1 是模型原大小)。方块能任意拉伸,一块就可以是一整面墙或一片地板。它会生成.gia并放进编辑器的导入目录。scene_import_assets:在编辑器里打开目标存档后调用,它自己走完“资产导入导出管理”里的加载、选中、转存和保存,再拉远镜头拍一张总览。结果用playtest_status取。
{"name": "Camp", "blocks": [
{"template": "积木立方体(木色)", "name": "Floor", "position": [0, 0.1, 0], "size": [12, 0.2, 8]},
{"template": "石质墙体(灰)", "name": "Wall", "position": [6, 1.5, 0], "size": [1, 3, 8]},
{"template": "火质立方体", "name": "Fire", "position": [0, 0.5, 0], "size": [0.6, 0.6, 0.6], "rotation": [0, 45, 0]}
]}注意:
新建空存档的地面高度是 y=0。方块的位置是它的中心;树、房屋、围栏这类成品模型的位置是底部中心,填 y=0 就站在地面上。
要特效先查
effect_catalog(按名字,如“烟花”“受击 火”“提示”),要声音查sound_catalog,要音乐查music_catalog;结果里有节点图里的写法。每个玩家动作都该有声音和画面的回应,做法见knowledge/notes/feedback.zh-CN.md。先定镜头再摆景。
scene_list_cameras读出存档里镜头离角色多远、视角多大,scene_set_camera可以改(写到存档副本),fixedView把视角锁死(侧视、俯视的游戏都要锁,否则玩家一动鼠标镜头就转走)。画面在角色处的高度约为 2×距离×tan(视角/2):6 米、45° 只有 5 米高,房子都装不下;14 米约 11.6 米高,适合横版远景。镜头一开始在角色背后,横版游戏要在开局用teleportPlayer把角色传送成面朝 +z(朝向 [0,0,0]),镜头才会在 −z 一侧横着看;yawRange定不住这个方向。王国样例的完整做法见examples/kingdom/gen_kv3_scene.py开头的说明。游戏过程中才出现的东西(金币、买下后出现的城墙、跟着玩家走的标记)用元件:
scene_add_prefab把任意物件按指定缩放做成元件,节点图用f.createPrefab(元件编号, 位置, …)在任意位置生成,大小就是设定的大小;scene_list_prefabs列出存档里的元件。会被招募、会被生成的造物也用元件:先在场景里摆一只不创建的怪,再用scene_add_prefab的fromEntity把它做成元件。全新的空白地图也能直接开工:
scene_add_graph在存档里建一张空的服务器节点图并挂到关卡实体(新地图没有节点图,write_graphs需要一张来写)。完整例子见scripts/dev/fresh_map_round.mjs。各个范例都是整套从空白地图搭起的(见 examples)。谁打谁由阵营决定:
scene_list_factions看存档里的阵营和敌对关系,scene_set_faction_hostility改。新地图里玩家、物件、造物三个阵营两两敌对,己方造物会去打节点图生成的物件;多数玩法应该改成只让玩家和造物敌对(hostilePairs: [[1,3]])。要指挥怪去打谁、往哪儿走:
scene_set_level_settings把关卡的仇恨类型改成自定义(aggroMode: "custom"),节点图里用f.setTheAggroValueOfSpecifiedEntity(目标, 怪, 数值)下指令,怪会从远处直接跑向目标(玩家角色、己方单位、物件都可以)。沿路径巡逻的做法在 2026-10-09 游戏更新后失效了(导入存档时巡逻模板被清空),对应的工具已经拿掉。物件图鉴里同名的很多(光“乔木”就有几十种)。
scene_search_assets的结果带hasImage;选型前用scene_asset_images按编号取缩略图看一眼(一次最多 12 个,返回名字、分组、尺寸和图)。图里每个物件都缩放到差不多大,只用来看长相,真实大小看尺寸。少数物件没有图(拍不出来的),工具会明说,这时再把候选导进练手存档看。每次导入都是新增,同一个包导两次会多出一份。反复调整时先在一个练手存档里做。
拉伸方块时贴图也跟着拉伸,很大的面近看会糊。
实测过 100 个方块一次导入,更大的数量还没测。
场景和节点图怎么接起来
节点图要用到场景里的东西(夜里放出来的怪、付款后出现的墙)时,按这个顺序走,全程只用 MCP 工具:
editor_open_map:把要用的存档导入并在编辑器里打开(已经开着目标存档就跳过)。scene_build_blocks+scene_import_assets:导入场景。要“之后再出现”的物件加createAtStart:false。scene_list_entities:按名字读回实体编号。导入时编辑器会重新分配编号,包里写的不作数。返回的mapPath就是刚保存的那个存档。write_graphs(mapPath用上一步的存档,graphs里是每张图的编号和源码):类型检查、编译、写进存档副本,返回可以试玩的存档。playtest_start(mapPath用write_graphs返回的存档)→playtest_status。
节点图里:f.createEntity(new guid(编号), [] as bigint[]) 把没创建的物件创建出来。
scripts/dev/mcp_round.mjs 是照这个顺序把王国样例从头做一遍的客户端,可以当参考。
Windows 10 兼容截图
截图是可选功能,在核心 Python 环境之外还需要 Pillow。本机 Python 3.10 / Pillow 12.0.0 已验证;其他电脑可执行:
python -m pip install -r requirements-capture.txt
npm run test:captureMCP 配置中的 MILIASTRA_PYTHON 可指定 Python 可执行文件的绝对路径;未指定时使用 PATH 中的 python。截图不使用 Windows.Graphics.Capture,不调用 Windows 10 Build 19045 缺失的 IsBorderRequired。
AI 调用顺序:
list_editor_windows取得新鲜的windowId(窗口句柄与 PID 组合)。capture_editor_window({windowId, method: "window"}),收到标准 MCPimage/png内容和结构化元数据。目视检查图像。背景窗口可尝试
window模式;PrintWindow 对部分 GPU 程序可能返回旧帧或黑屏,不能只以返回成功判断画面正确。必要时用
method: "screen"。此模式要求目标位于前台,且没有检测到其他应用窗口覆盖;工具不会自动抢焦点。
原图保存在 workspace/captures。返回的图片预览默认不超过 1600×1200,width/height 是原图尺寸,previewToImageScale 用于预览坐标到原图坐标的换算。imageOffsetInWindow 表示截图区域相对窗口左上角的物理像素偏移。
只允许截图及操作 YuanShen.exe、GenshinImpact.exe 和 BeyondEditor.exe。拒绝失效窗口、最小化窗口、不可访问或受保护的桌面;后台 screen 截图会返回具体错误码。截图工具本身不发送输入,也不改变窗口焦点。
实际 Windows 10 19045 上已经通过 MCP 拍到千星沙箱(3264×2160)和原神编辑场景(3840×2160),并检查到可辨认的节点图管理器、地形与石块。原有桌面插件自身的截图错误未被修改;现在使用的是独立兼容后端。
鼠标和键盘
先 list_editor_windows,再 focus_editor_window,检查返回的图片。取图片元数据中的 captureId,调用一次 editor_input:
{"captureId":"刚返回的 UUID","kind":"click","x":430,"y":190,"button":"left","clickCount":1}坐标必须根据当前图片选取,示例数字不能直接当成你的界面坐标。其他动作示例(每行是独立请求):
{"captureId":"刚返回的 UUID","kind":"key","key":"Ctrl+A"}
{"captureId":"刚返回的 UUID","kind":"text","text":"_GSTS_MCP_Test"}
{"captureId":"刚返回的 UUID","kind":"scroll","x":500,"y":400,"delta":-120}
{"captureId":"刚返回的 UUID","kind":"drag","x":500,"y":400,"toX":700,"toY":500}每次动作后重新查看结果图片;用新返回的
captureId执行下一步。凭据仅在同一个 MCP 服务进程有效,120 秒过期,输入或切焦点后旧凭据全部失效。输入检查窗口标题、位置、前台所属关系和点击位置遮挡。部分失败也会消耗凭据;不要重复使用。
右键菜单可能是独立的无标题窗口。通过
list_editor_windows发现,必要时method: screen拍摄;菜单和主窗口共享前台关系。菜单在操作后关闭时,工具尝试返回同进程前台编辑器的新截图。inputSent: true只证明发送过输入。检查图片或存档才能判断功能生效;POST_INPUT_CAPTURE_FAILED表示已发送但截图失败,不能盲目重试。文本使用 Unicode SendInput,不改剪贴板。Enter/Tab 通过
key发送。Windows 键、系统切换和关闭组合键不提供。若
FOCUS_FAILED,需要手动选择目标窗口。若INPUT_FAILED,可能涉及目标进程完整性级别或部分输入未送达;工具不会更改系统安全设置。
npm run test:input-guards 检查截图凭据、缺失参数和越界坐标拒绝,不发送实际输入。tests/editor-session.mjs 是本地开发调试桥,使用随机口令,仅监听 loopback;不属于 MCP 发布服务。实际操作轨迹位于 workspace/editor-live-trace.json。
实验和验证
npm test
npm run test:localnpm test:使用明确标记的合成 GIL,启动独立 MCP 服务和 SDK 客户端,实际执行握手、工具调用、代码错误修复、编译、冲突拒绝、写入和逐字节恢复;检查未知 protobuf 字段保留。合成文件不代表能在游戏中加载。npm run test:local:使用显式配置的真实存档及摘要,创建副本,通过 MCP 编译最小逻辑。无目标图时验证MISSING_GRAPH,不修改原存档;不自动选择最新存档。本机测试证据写入
workspace/mcp-smoke-report.json和workspace/synthetic-smoke-report.json,包含工具参数和结果。
实现范围和限制
只在 Windows、国服中文客户端、16:9 全屏下验证过;游戏更新后界面文字或存档格式变了,工具可能要跟着改。
固定 Genshin-TS 版本并复用其编译/解析;自己写的存档读写只改对着编辑器存出来的样本确认过的字段,其余数据原样保留。来源见
THIRD_PARTY_NOTICES.md。AI 提交的代码会经过上游编译执行流程;这是本地可信开发工具,不是不可信代码沙箱。不应直接暴露给公网或不可信调用方。
哈希检查可以发现预览后的外部保存;与编辑器同时写文件仍存在极短竞争窗口。实时修改时应先切出目标地图,重载后再保存。单服务内部操作串行化;不要启动多个服务同时修改同一工作区。
导入、烘焙、试玩都要开着编辑器。工具不会仅凭文件构建成功就说游戏可玩:编译通过、写进存档、在游戏里验证过是三件事,返回里分开报告。
更多限制和还没做的事见 现状和限制。
和其他千星奇域工具的关系
社区里千星奇域的工具很多,游戏 7.1 加了客户端 Lua 以后,2D + Lua 这条线上尤其多。它们几乎都停在同一个地方:进真游戏验证这一步交给人(“模拟器通过不等于真机通过”“试玩按钮只能人点”“生成的文件没在真机验证过”,这些是它们自己写的)。本项目的位置就是这一步:让 AI 在真实的编辑器和游戏里把一整关做出来,自己点试玩、自己读日志和截图。
项目 | 侧重 | 和本项目 |
用 TypeScript 写节点图,编译并注入存档 | 本项目编译节点图用的就是它。只想自己手写代码、不需要 AI 操作编辑器的,直接用它 | |
读写节点图文件、代码和节点图互转、节点数据 | Genshin-TS 内含它的成果,本项目间接用到 | |
用 Python 写节点图,离线校验、自动排版,有给人看的预览界面 | 想要 Python 工作流和节点图预览界面的选它;本项目没有给人看的界面 | |
游戏之外跑客户端 Lua 和界面,几秒一轮;五种画布、多人模拟、录制回放;有网页编辑器和七步制作流程 | 它的工程可以一步导进本项目上真机: | |
DeepSeek Harness 插件:把脚本投进存档旁的活文件、读运行日志、截图、探针、界面规范检查 | 思路相近(都在真机的文件上干活),它面向 Harness、试玩由人点;本项目自己点试玩,也写存档本身 | |
给 AI 的技能和提示词包:Lua 静态检查、离线 Lua 沙箱、像素画和图元拟合出图、分步流程 | 出图(像素画、帧动画、图元拟合)本项目没有,用它们的;流程类的可以和本项目的工具一起用 | |
官方文档和社区经验的知识库问答,有在线 MCP | 可以和本项目同时接:它回答“怎么做”,本项目动手做 | |
网页版节点图编辑器,不开游戏就能画节点图 | 画节点图原型用 | |
查官方教程和节点文档的 MCP | 本项目自带一份离线的官方指南,功能有重叠 | |
存档和导出文件格式的文档 | 本项目的物件名单和尺寸来自前者(CC BY 4.0) |
只有本项目有的:
真机上的自动试玩:导入存档、勾日志、点试玩、按键点鼠标、截图、读回打印,全程没有人。给出预期的打印,试玩自己回答通过没有。
真机上一分钟一轮的 Lua:只改脚本时不重新导入存档,实测 74 秒一轮。
写进去之前先对名字:脚本里的控件名、信号名、变量名、接口名、模板和图片音效编号,对着存档、节点图、图鉴和官方接口逐个查;信号带的参数,Lua 和节点图两边的个数、类型、顺序也对着定义查;界面写进去时直接说哪些控件在手机上出了屏幕。这个平台上名字对不上不报错、只是没反应。
真编辑器画的多设备预览:电脑、手机、主机十种画布各截一张,是编辑器自己画的,不是近似。
整关都在存档里:场景和 3D 玩法(摆景、复杂造物的战斗、投射物、机关)、节点图、普通界面、客户端界面,写出的记录和编辑器手配的逐字节相同。
带缩略图的物件、特效、音效、界面图片编号图鉴。
本项目没有的:游戏之外的模拟器(最快也是一分钟一轮,模拟器是几秒)、多人模拟(所有范例都是单人)、出图工具、给人看的界面、一行命令安装(现在要克隆仓库)、Windows 以外的平台。
以上是按各项目 README 的自述整理的,如有不准确请提 issue。
常见问题
能让 AI 自动做千星奇域的地图 / 关卡吗? 能。这个仓库就是干这个的:AI 通过 MCP 调这里的工具,从一张空白存档搭出场景、写好节点图、自己进游戏试玩。三个没见过这个仓库的 AI 各自做出了一局能打通的游戏,记录在 盲测。好不好玩还是要人来判断和调。
支持哪些 AI 客户端? 任何支持 stdio MCP 的客户端:Claude Code、Claude Desktop、Cursor、Codex CLI、Cline 等。开发时用的是 Claude Code 和 Codex。服务自己不调用模型,不需要 API Key。
我不会写节点图 / 不会写代码,能用吗? 能。你用中文说想要什么玩法,AI 写节点图的 TypeScript 源码并编译进存档;你在编辑器里看到的是普通的节点图,可以接着手改。
千星奇域的节点图可以用代码写吗? 可以。本项目用 Genshin-TS 把 TypeScript 编译成节点图,并在它上面加了写进存档、挂到实体和元件、一次编译多张图这些步骤。
国际服(Miliastra Wonderland 英文客户端)能用吗? 没验证过。存档读写不分语言,但自动试玩靠识别屏幕上的中文按钮,英文界面下大概率要改。
会不会弄坏我的存档? 默认只写存档的副本,试玩时把副本导入成一份新存档;正式存档要显式打开开关才会写,写之前比对哈希并备份。
创作账号等级低有什么影响? 奇匠 Lv.1 的账号,自定义的文字不显示:文本框是空的,选项卡只有图标没有字。升到 Lv.2 以后都正常显示,头顶的气泡和铭牌也是在 Lv.2 上验证的(都是实测)。工具两种做法都有:用文字的,和不靠文字的(图片控件、进度条、图标、标记特效);工具说明会提醒 AI,不确定账号等级时先放一个文本框试玩看一眼。
游戏更新以后工具坏了怎么办?
提 issue,说明游戏版本和出错的工具。图鉴是从编辑器里抄出来的,重抄的办法在 scripts/dev/README.md。
许可和来源
代码按 MIT 许可。用到的第三方软件见 THIRD_PARTY_NOTICES.md。
《原神》、千星奇域以及仓库里出现的游戏画面、物件和图标的缩略图、官方指南和教学存档的内容,权利属于米哈游 / HoYoverse;放在这里只是为了让工具能按名字查到平台自带的东西、让测试有样本可比。本项目不隶属于也未获得米哈游的认可。权利方如认为其中内容不妥,请提 issue,会及时处理。
Available Tools
85 toolscapture_editor_windowARead-only
Capture a freshly discovered game/editor window and return an inline PNG plus original file and coordinate metadata. window mode uses PrintWindow; GPU content may be blank/stale. screen mode requires foreground; fully covered edges are cropped, interior other-app overlaps are rejected. Does not focus windows or send input. Inspect the image before assuming it is usable.
| Name | Required | Description | Default |
|---|---|---|---|
| method | No | window | |
| maxWidth | No | ||
| windowId | Yes | ||
| maxHeight | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already state readOnly/non-destructive/closed-world, and the description adds what they do not: PrintWindow can yield blank or stale GPU content, screen mode requires a foreground window, covered edges are cropped, interior overlaps with other apps are rejected, and the tool neither focuses windows nor sends input. These failure modes and the absence of side effects are exactly the context an agent needs to avoid trusting a bad capture.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Four dense sentences, each carrying distinct information, with the output promise front-loaded. It is tight, though the mode caveats pile up quickly and could be split for easier scanning.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
There is no output schema, and the description does state the return shape (inline PNG, original file, coordinate metadata) and the main trust caveats. What is missing is how to obtain a valid windowId and how the sizing parameters affect the result, which matters for a 4-parameter tool with 0% schema documentation.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 0%, so the description has to carry the parameter burden, and it only partially does. It explains the two method values in behavioral terms, but it never covers maxWidth/maxHeight (defaults 1600x1200 with min/max bounds) or the windowId format (^\d+:\d+$). The phrase 'freshly discovered window' hints that windowId comes from a listing tool without saying so.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description gives a specific verb (capture) and resource (game/editor window) and states what comes back: an inline PNG plus original file and coordinate metadata. It reads differently from siblings such as list_editor_windows, focus_editor_window, and playtest_frames, but it never names those siblings or tells the agent how they relate.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It gives real guidance on choosing between the two modes: 'window mode uses PrintWindow; GPU content may be blank/stale', while 'screen mode requires foreground'. It also warns 'Inspect the image before assuming it is usable.' It leaves out when to prefer this tool over playtest_frames or other capture paths, but the within-tool mode choice is clear.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
creature_animationsARead-only
The animations of the complex creatures (the assets of the group "怪物(AI版)"), by creature: id, name, length in seconds and whether it loops. A creature skill (scene_add_creature_skill) plays one or several of them, which is everything a complex creature does besides walking: swing, shoot, dig, look around, talk, laugh. The models come with empty hands, and an attack only looks right with the thing in the hand its animation was made for: inItsHands says what a creature can hold, and the animations that were looked at in play say what happens in them (what) and at which millisecond the blow lands or the hand opens (atMs: the graphAtMs of the skill). Without creature it lists the creatures whose animations are known (with query, those that have a matching one: 挖矿 digging, 攻击 attacks, 待机 standing, 交谈 talking). Names and ids were read from the editor on 2026-10-11. Read-only.
| Name | Required | Description | Default |
|---|---|---|---|
| query | No | ||
| creature | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare read-only, non-destructive, closed-world behavior, and the description adds useful context beyond that: data was read from the editor on a specific date and the records include domain-specific fields such as inItsHands and atMs. It does not cover errors, pagination, or rate limits, but it adds meaningful transparency for a catalog tool.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The purpose is front-loaded, but the description is a long, dense sequence of run-on sentences with parentheticals and Chinese terms. Much of the domain detail is useful, but the parameter behavior is buried rather than structured, making the definition harder to scan than necessary.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema, the description does a substantial amount of work by naming returned fields and explaining the relationship to creature skills and animation timing. It is still somewhat ambiguous about the full output shape and the interaction between the two parameters, but it is largely complete for its use case.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 0%, so the description must carry parameter meaning. It explains that omitting creature lists creatures and that query filters to creatures with matching animations, with useful examples like digging and attacks, but it never clearly states that the creature input is an integer creature id or how query behaves when creature is also supplied.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description identifies the resource as the animations of complex creatures and states the returned fields (id, name, length, loops), plus the no-creature mode that lists creatures. It distinguishes the tool from the sibling that consumes animations (scene_add_creature_skill), though it never uses a crisp verb like 'list' and the phrase 'by creature' is slightly ambiguous.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It explains the practical context: creature skills play these animations, and querying without a creature returns which creatures have known animations. It does not explicitly say when not to use it or name a competing catalog tool, but the intended discovery workflow is clear.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
editor_inputADestructive
Send ONE click, key chord, literal Unicode text, scroll or drag to the window from a fresh captureId, then return a new screenshot. Coordinates are pixels of the returned preview image, not the original PNG. Capture IDs are single-use and expire after 120 seconds. Requires target foreground, unchanged rect/title, unobscured click point. Check the fresh image to verify effects. Use positive scroll delta to scroll up, negative to scroll down.
| Name | Required | Description | Default |
|---|---|---|---|
| x | No | ||
| y | No | ||
| key | No | ||
| toX | No | ||
| toY | No | ||
| kind | Yes | ||
| text | No | ||
| delta | No | ||
| button | No | left | |
| holdMs | No | ||
| captureId | Yes | ||
| clickCount | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Beyond the annotations, it discloses single-use capture IDs with a 120s expiry, that coordinates are in the returned preview image rather than the original PNG, that only ONE action is sent per call, the scroll sign convention, and foreground/rect/unobscured requirements. That is rich operational context an agent cannot infer elsewhere.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the core action and result, then constraints and coordinate system in dense, waste-free sentences. Every sentence earns its place.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a 12-parameter mutation tool with no output schema, the description covers the workflow, safety prerequisites, and return value well. It is still thin on failure behavior and the semantics of several input parameters.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, so the description must carry the load. It usefully explains x/y (preview pixels, not original PNG), delta sign, and captureId expiry, but leaves key chord syntax, text vs. literal Unicode handling, button, holdMs, clickCount and toX/toY for drag undocumented.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb (send ONE click, key chord, text, scroll or drag) and resource (the window), and clarifies the one-action-per-call scope plus that it returns a new screenshot. No sibling tool provides input synthesis, so the distinction is unambiguous.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives clear preconditions: a fresh captureId, target foreground, unchanged rect/title, unobscured click point, and verifying the fresh image. It implies the capture_editor_window workflow but does not explicitly name alternatives or when not to use it.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
editor_open_mapADestructive
Import a .gil as a new save and leave it open in the editor, without playing it. Do this before scene_import_assets when the scene should go into a particular map. Needs the game running (main world, Miliastra lobby, save list or editor) and takes over mouse and keyboard for about 80 seconds. Returns a runId; poll playtest_status until it succeeds (officialSave is the new save file).
| Name | Required | Description | Default |
|---|---|---|---|
| mapPath | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Goes well beyond the annotations: prerequisite game states (main world, Miliastra lobby, save list, editor), a blocking side effect ('takes over mouse and keyboard for about 80 seconds'), and an async job contract (runId + poll playtest_status, officialSave is the result). It doesn't clarify what the destructiveHint actually endangers — e.g. whether an existing save is ever overwritten — though 'as a new save' implicitly suggests it does not.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Four short sentences, front-loaded with the action and scope, then prerequisite, then cost, then return contract. Dense and purposeful; the parenthetical list of game states is slightly clunky but earns its place.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
No output schema exists, yet the description supplies the return value (runId), the polling follow-up (playtest_status), and how to extract the useful artifact (officialSave). Combined with the prerequisite and blocking-duration notes, an agent has everything needed to invoke and drive it correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 0%, so the single parameter mapPath is undocumented in the schema; the description only implies it is a path to a .gil file. It adds no detail on path form (absolute/relative), expected location, or failure behavior for an invalid path, so it only partially compensates for the coverage gap.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Import a .gil as a new save') plus the crucial scope qualifier 'leave it open in the editor, without playing it', which separates it from playtest_start. An agent can distinguish it from the many scene_* siblings without opening a schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly prescribes ordering against a named sibling: 'Do this before scene_import_assets when the scene should go into a particular map.' That is both a when-to-use and an implicit when-not (assets importing into the default map need not call this).
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
editor_preview_interfaceADestructive
Show what the interface of a save looks like on other devices, in the editor itself, and return a picture of each canvas: a computer (1600 x 900), a phone (1280 x 720, also 19.5:9 and 4:3), a console (1920 x 1080, also 21:9), a phone with a gamepad. Most players are on phones, and the same numbers put a control elsewhere on each canvas (what stands 700 to the side on a computer is off a phone's screen): this is the look to take before saying an interface is done. It is the editor's own interface manager that draws the pictures, with the platform's own controls of that device around yours (the touch buttons of a phone, the key hints of a computer), so a control that lies under one of them shows. With mapPath the save is imported and opened first (or, when it is the one the last playtest left open, used as it is); without, the save that is open is shown. Client controls are drawn as the save has them, before any script ran: what a script draws at run time is not there. Takes over mouse and keyboard for about 30 seconds (90 with an import). Returns a runId; playtest_status gives the pictures.
| Name | Required | Description | Default |
|---|---|---|---|
| mapPath | No | ||
| canvases | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare destructiveHint=true and readOnlyHint=false, and the description substantiates that with concrete side effects: it takes over mouse and keyboard for ~30s (90 with import), and with mapPath the save is imported and opened. It also pre-empts a real trap by noting client controls are drawn pre-script, not as the runtime renders them. It does not explicitly say what persists or is altered by the import, which keeps it short of a 5.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The core purpose is front-loaded, but the run-on parentheticals ('(what stands 700 to the side on a computer is off a phone's screen)', '(1600 x 900)...(1920 x 1080, also 21:9)') make it hard to scan, and the 'Most players are on phones' rationale is padding. Several genuinely load-bearing facts (runId, input takeover) are buried late in the paragraph.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema, the description correctly explains how results are retrieved ('Returns a runId; playtest_status gives the pictures') and discloses the timing cost and the pre-script rendering limitation. For a two-parameter preview tool that is essentially complete, with only default/bound handling of canvases left undocumented.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, so the description must carry the load, and it largely does: it maps the device families and resolutions to the canvases enum values and explains mapPath's import/reuse semantics precisely. It is silent on the default set ([pc, mobile, console]) and the minItems/maxItems bounds, leaving minor gaps.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb and resource ('Show what the interface of a save looks like on other devices, in the editor itself, and return a picture of each canvas') and enumerates the device targets. It distinguishes itself from capture_editor_window and playtest_* by emphasizing that it renders device-specific canvases via the editor's own interface manager. The prose is convoluted, so an agent must read carefully, but the purpose lands.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
'This is the look to take before saying an interface is done' implies the use case, and the mapPath sentence explains the two entry conditions (import a save vs. show the open one). There is no explicit when-not guidance or a named sibling to use instead of this tool, so the agent must infer the boundaries against scene_check_client or capture_editor_window.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
effect_catalogARead-only
The special effects of the platform that a node graph can show, by name: 1986 one-off effects (限时特效: a flash, dust where something appears or vanishes, a hit, an explosion, a warning circle, fireworks) and 1209 looping ones (循环特效: glows, markers and arrows that point at something, auras, shields, flying projectiles, question and exclamation signs over a head). Feedback is what makes a level feel like a game: give every action of the player one (picked up, bought, refused, hit, built, lost). query: words of the Chinese name (烟花, 受击 火, 提示); kind: "timed" or "looping"; the first rows come with the small picture the editor shows for them. ids: look at those effects, one picture each. page: contact sheets of the first 84 looping effects photographed on a character in play. queries: several searches in one call, one list each and no pictures (then look at the ones you chose with ids). The result says how to play and clear an effect in graph code. The names and ids were read from the editor's own lists on 2026-10-11. Read-only.
| Name | Required | Description | Default |
|---|---|---|---|
| ids | No | ||
| kind | No | ||
| page | No | ||
| limit | No | ||
| query | No | ||
| offset | No | ||
| queries | No | ||
| pictures | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already cover safety (readOnly, non-destructive, closed-world), yet the description still adds real value: row counts, that first rows include the editor thumbnail, that ids returns one picture per effect, that page serves contact sheets of the first 84 looping effects photographed on a character, that queries omits pictures, and that the result explains how to play and clear the effect in graph code. Provenance ("read from the editor's own lists on 2026-10-11") further grounds the data; only pagination/limit behavior is undisclosed.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The purpose is front-loaded, but the middle is a semicolon-chained run-on that mixes parameter documentation into prose, and parenthetical example lists (fireworks, glows, question marks) pad rather than inform. Readable but not tight.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For an 8-parameter, no-output-schema tool this is close: return content, provenance, and most modes are covered. Gaps remain on pagination/limit semantics and the pictures parameter, which an agent must guess from defaults.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, so the description carries the load and does explain query (Chinese name words), kind ("timed"/"looping"), ids, page, and queries. But limit, offset, and pictures (default 12, 0-30) are never explained, leaving three of eight parameters undocumented in both places.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The opening sentence states the resource precisely: a named catalog of platform special effects a node graph can show, split into 1986 one-off (限时) and 1209 looping (循环) effects with concrete examples of each. That is enough to separate it from sound_catalog/image_catalog without opening schemas, though it never names a sibling explicitly.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
"Feedback is what makes a level feel like a game: give every action of the player one (picked up, bought, refused, hit, built, lost)" gives a clear use context, and the mode phrases (query, kind, ids, page, queries) show which entry point to pick. It stops short of any when-not guidance or explicit routing away from alternative catalogs.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
focus_editor_windowADestructive
Bring an observed game/editor window to the foreground and return a fresh screenshot. Windows may deny focus; do not proceed if it fails.
| Name | Required | Description | Default |
|---|---|---|---|
| windowId | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Adds real behavior beyond the annotations: the operation may be denied by the OS and the agent should abort rather than continue, and a screenshot is returned as a side effect. It does not reconcile the surprising destructiveHint=true annotation by explaining what state is altered (foreground/z-order), which would have earned a 5.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two short sentences, front-loaded with the action and its effect, followed by the failure caveat. No wasted words.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
No output schema exists, so the description rightly mentions the returned screenshot, but it leaves open how to obtain the windowId, what "observed" means, and why a focus operation is flagged destructive. Adequate to call the tool, incomplete for an agent that needs to chain it correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
One parameter with 0% description coverage; the schema's pattern ^\d+:\d+$ conveys the id format but nothing about provenance. The word "observed" hints the id must come from a prior listing call, which is marginal added meaning over the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
A specific verb and resource ("Bring an observed game/editor window to the foreground") plus a stated side effect (returns a fresh screenshot). It is distinguishable from list_editor_windows and capture_editor_window, though it does not explicitly say when to prefer it over the sibling capture tool that also returns screenshots.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description gives a failure-path instruction ("do not proceed if it fails"), which is useful, but it never states when to call this instead of capture_editor_window or list_editor_windows, and it does not say how a window becomes "observed" in the first place. Usage is implied rather than specified.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_capabilitiesARead-only
Discover supported operations, limitations, version, configured paths and recommended workflow.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already establish that this is a safe, read-only, closed-world operation. The description adds value by saying the response includes limitations and a recommended workflow, but it does not state whether the tool should be called before mutations or how current/authoritative the capability data is.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
A single sentence with no filler, and the most important term ('Discover supported operations') is front-loaded. Every phrase maps to a concrete piece of returned information.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With zero parameters, full annotation coverage, and no output schema, the description is nearly complete. It lists the main categories of returned information, though it could briefly clarify the response shape or call timing for an agent unfamiliar with the server.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The tool takes zero parameters, so there is no parameter semantics burden. The description does not need to explain inputs, and the schema is empty as expected.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The verb 'Discover' is specific, and the description enumerates the exact resources the tool surfaces: operations, limitations, version, configured paths, and recommended workflow. It is clearly a meta-capability endpoint, though it does not explicitly contrast itself with the knowledge/search siblings.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The phrase 'recommended workflow' hints that this tool should be used for orientation, but there is no explicit statement of when to call it, when not to call it, or how it relates to siblings such as read_knowledge or search_knowledge. Usage is implied rather than prescribed.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
image_catalogBRead-only
The pictures a screen can show (图片资源库 of the image control): icons of what a player does (功能图标, 玩法图标: elements, flags, swords, shields, hearts of the platform), decorations in colour (stars, crowns, balloons, coins, fruit, animals, clouds), plates and frames to put things on, plain shapes, dividers, special characters, skill and talent icons, items (potions, keys, chests, books, weapons) and portraits of creatures. Without arguments it lists the categories with the range of ids each holds; with a category it returns photographs of the editor's own grid, four sheets to a page, each picture with its id under it. Look at the sheets and read the id of the picture that fits: it is the image of scene_add_image. There are no names to search by, so choose by eye. This is how a screen without words gets its meaning: a heart beside the health bar, a key that appears when the key is found, a sword on the attack button.
| Name | Required | Description | Default |
|---|---|---|---|
| page | No | ||
| category | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The read-only annotations already establish the safety profile. The description adds useful return-format context ('four sheets to a page, each picture with its id under it') but omits the 20-page cap and does not clarify whether page is ignored when category is omitted.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a long single paragraph with poetic framing ('This is how a screen without words gets its meaning') and extensive example lists. The operative no-argument/with-category instructions are buried mid-paragraph rather than front-loaded.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a two-parameter tool with no output schema, it covers the browsing workflow and return format reasonably well. It still leaves the page maximum and category validation unstated, so it is callable but not fully complete.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, so the description must compensate. It explains that category selects a category and that page refers to sheets of four, but it never states page's 1–20 bound or category validation rules; it does at least explain that valid categories are listed by calling without arguments.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with the resource ('The pictures a screen can show...') and identifies it as the image catalog for the image control, then specifies the no-argument and with-category behaviors. It never names adjacent tools such as scene_asset_images or scene_search_assets, so sibling differentiation is only implicit.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It explains the two modes clearly: no arguments lists categories with id ranges, and a category returns grid sheets to read ids from for use with scene_add_image. It also warns there are no names to search by, so browsing by eye is necessary. However, it gives no explicit when-not or direct alternative among the sibling asset/search tools.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
inspect_mapARead-only
Read GIL header and actual node graph IDs, names, types and counts (nodeCount, and editorCount: the size the editor counts against its limit of 3000).
| Name | Required | Description | Default |
|---|---|---|---|
| mapPath | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
It provides valuable technical context by specifically mentioning reading the 'GIL header' and defining 'editorCount' relative to the 3000 limit. This adds specific behavioral traits about the underlying file structure and constraints that goes beyond standard annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is dense and efficient, using one sentence to pack a large amount of information about the data being retrieved, making very little wasted space.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given that there is no output schema, this description is highly complete for providing context on the returned data structure (e.g., knowing that 'nodeCount' and 'editorCount' will be present). It tells the agent exactly what kind of payload to expect.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 0%, meaning the description is critical. However, since there is only one parameter (`mapPath`), and the description doesn't add unique semantic meaning to how that path should be formatted or constrained, it meets the baseline adequacy.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool reads structural data from a map file, including GIL headers, IDs, names, types, and various counts. This is specific about *what* data is extracted, helping distinguish it from tools that might only list entities.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Usage is only implied by the action (inspect). It doesn't explicitly state that this tool should be used for validation or status checks, nor does it explain when a user might need to inspect versus listing entities or modifying the map.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_editor_windowsARead-only
List visible Genshin and Miliastra editor windows with current windowId, PID, physical rect, foreground and minimized state. Read-only Windows 10 compatible backend.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint/non-destructive/non-openWorld, so the 'read-only' clause adds little; the genuine additions are the Windows 10 platform requirement and the 'visible' filter that scopes the result set. Returned fields are listed, which tells the agent what a call yields, though nothing is said about empty results or how 'physical rect' is encoded.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two sentences, zero filler, and the highest-value content (what is listed, and the returned identifiers) is front-loaded. The platform/read-only caveat is correctly relegated to the tail.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a zero-parameter, read-only tool with no output schema, the description carries the return-value burden and does so by naming each field. It falls just short of complete because it says nothing about behavior when no editor windows exist.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The tool takes zero parameters, so there is nothing for the description to disambiguate. Baseline 4 applies; the description correctly avoids inventing arguments.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Specific verb ('List') plus a precisely scoped resource ('visible Genshin and Miliastra editor windows'), and it enumerates the fields returned (windowId, PID, rect, foreground, minimized). It never names a sibling, so an agent must infer on its own that the windowId feeds capture_editor_window / focus_editor_window.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Usage is only implied: given siblings like capture_editor_window and focus_editor_window, this is the discovery step that yields a windowId. There is no explicit 'use this first' statement, no when-not-to-use, and no named alternative.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_mapsARead-only
List the saves in the game's save list, newest first: the name the creator sees, id, path, size and when it was last written. Excludes temporary and downloaded runtime maps. Every import (editor_open_map, playtest_start with a mapPath) adds a save named after the imported file.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already cover the safety profile (readOnly, non-destructive, closed-world), so the description correctly spends its space on things annotations cannot express: newest-first ordering, the returned fields, the exclusion of temporary and downloaded runtime maps, and the fact that imports silently add saves. The last point is genuinely non-obvious behavioral context; only pagination or size limits are missing.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the action and ordering, followed by the fields returned and then the exclusion/side-effect caveat. Three sentences, each earning its place, though the field enumeration could be compressed slightly.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema, the description fully compensates by naming the returned fields (name, id, path, size, last-written) plus ordering and exclusions. For a zero-argument, read-only list tool this is essentially everything an agent needs to call and interpret it correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The tool takes zero parameters, so the baseline is 4. The description correctly does not invent parameter text and instead spends the space on return-shape semantics, which matters more here.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb and resource ('List the saves in the game's save list') and clarifies that 'maps' means saves, which resolves the mild name/description mismatch. It stops short of differentiating from nearby siblings like inspect_map, which inspect a single map rather than enumerate them.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Usage is implied by the enumeration semantics, but the description never says when to pick this over inspect_map or editor_open_map, nor any prerequisites. An agent can infer it is the discovery step, but the guidance is left to inference.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
music_catalogARead-only
The background music of the platform: 188 pieces with id, title, length in seconds and category (探索音乐 calm, 战斗音乐 tense, 任务音乐 story, 其他需求 events). A graph sets the music of a player at any moment with f.modifyPlayerBackgroundMusic: one piece for the day and another for the night, a tense one for the last wave, and so on; the result shows the call. query: words of the title; category: one of the four. Read from the editor's music library on 2026-10-11. Read-only.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | ||
| query | No | ||
| offset | No | ||
| category | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, openWorldHint=false and destructiveHint=false, so the trailing 'Read-only' is redundant. What the description does add is the snapshot provenance ('Read from the editor's music library on 2026-10-11') and the fixed catalog size, but it omits pagination behavior despite limit/offset parameters.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with what the catalog is, then filtering, then provenance — a sensible order. One clause ('the result shows the call') is vague filler, but overall there is little waste.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema, the description usefully enumerates the returned fields and gives the category taxonomy, which is essential for building a valid filter. The main gap is pagination semantics for limit/offset on a 188-record catalog.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 0%, so the description must carry the load, and it does for the two meaningful filters: query is 'words of the title' and category is one of four values (探索音乐 calm, 战斗音乐 tense, 任务音乐 story, 其他需求 events) that appear nowhere in the schema. limit and offset are left undocumented, which keeps it below a 5.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Identifies the resource precisely as the platform's background music library, including its size (188 pieces) and record fields (id, title, length, category). It is distinguishable from sound_catalog by the 'background music' framing, though it never names that sibling explicitly.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explains how the returned pieces are consumed downstream (setting day/night/last-wave music via f.modifyPlayerBackgroundMusic), which implies the lookup context. But it gives no explicit when-to-use-this-vs-alternatives guidance, and never mentions sound_catalog or scene_search_assets as the paths for non-music audio.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
playtest_framesARead-only
Put the screenshots of a finished playtest side by side in one picture, each cut to the same part of the screen and labelled with its play second: the way to look at motion. Whether an attack is right does not show in prints: is the weapon in the hand, does the blow land when the number comes up, does the knife leave when the hand opens, does a creature stop where it should. Take screenshots a quarter or half a second apart over the seconds that matter (playtest_start screenshotsAt takes fractions of a second, up to 120 of them; screenshotWidth up to 3840 keeps more detail), bring the camera close (scene_set_camera) or cut the picture with crop, then look at the sheet: left to right, top to bottom. fromSeconds and toSeconds pick the span (play seconds, the clock of the screenshots), every takes each n-th, crop is [x0, y0, x1, y1] as fractions of the screen, columns and width (pixels of the whole sheet) set the size of a frame. Several sheets of one run are fine: a wide one to find the moment, a close one of two seconds around it. Read-only.
| Name | Required | Description | Default |
|---|---|---|---|
| crop | No | ||
| every | No | ||
| runId | Yes | ||
| width | No | ||
| columns | No | ||
| maxFrames | No | ||
| toSeconds | No | ||
| fromSeconds | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, destructiveHint=false, openWorldHint=false, and the description's closing 'Read-only' merely restates that. It does add real context beyond annotations: the tool consumes pre-existing screenshots from a finished run and returns a single sheet ordered left-to-right, top-to-bottom. However, it omits what happens when no screenshots exist or when maxFrames truncates the selection.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the core function in the first sentence, then use case, then parameter semantics. Length is justified by eight undocumented parameters, though the parenthetical probe list ('is the weapon in the hand, does the blow land...') is stylistically loose and adds bulk.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For an 8-parameter tool with zero schema descriptions and no output schema, the definition supplies most of what an agent needs: units, ranges hinted externally, layout order, and preparation steps. Gaps remain around maxFrames' truncation behavior and failure modes (missing or too few screenshots).
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
With 0% schema coverage the description carries the full load and mostly succeeds: fromSeconds/toSeconds are 'play seconds, the clock of the screenshots', every is 'each n-th', crop is [x0,y0,x1,y1] as screen fractions, columns and width are sheet layout in pixels. It also cites external limits (screenshotsAt up to 120, screenshotWidth up to 3840). maxFrames and runId are left undocumented, keeping it short of a 5.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a concrete verb and resource: 'Put the screenshots of a finished playtest side by side in one picture, each cut to the same part of the screen and labelled with its play second.' The framing 'the way to look at motion' makes the tool's role unmistakable and distinct from any sibling, none of which produces composite frame sheets.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives a clear triggering condition (verifying motion, e.g. does the blow land when the number comes up) and concrete preparatory guidance: shoot a quarter/half second apart via playtest_start's screenshotsAt, zoom with scene_set_camera or rely on crop. It also advises iterating with two sheets (a wide one to find the moment, a close two-second one). No explicit 'when not to use' or named alternative tool for this function.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
playtest_startADestructive
Run one full playtest through the official UI without further calls: optionally import a candidate .gil as a new save, subscribe the debug log for graphName (or for every graph in graphNames when the level is several graphs: only ticked graphs show their prints, and the log window lets at most 10 be ticked, so leave out the graphs that print nothing), start the playtest, take screenshots and press keys at the given seconds, leave after durationSeconds and collect the official log. screenshotsAt takes fractions of a second (a screenshot costs about a third of a second, so a quarter second apart is as close as it gets): a run of them over an attack, put side by side by playtest_frames, shows the motion frame by frame; screenshotWidth (default 1600) keeps them larger for that. An input is a key ({at, key, holdMs}: a tap of 120 ms unless holdMs says otherwise; hold a movement key for as long as the walk takes, up to a minute; keys overlap, so a character walks with one key held while another strikes; repeat {every, until} presses the key again every so many seconds until that second, which is how a fight of three minutes is scripted: {at: 5, key: "e", repeat: {every: 1.2, until: 170}}; up to 400 inputs; keys that were sent more than 0.3 s after their moment are listed in inputsLate of playtest_status, which is where to look first when a scripted walk ended in the wrong place), a mouse click at a place of the game window ({at, click: [x, y]} as fractions from the top left), held down for holdMs when that is given above 150 (a screenshot taken in between shows what a button looks like while pressed) or a click on a word that is on the screen ({at, clickText: "购买"}; words not found are listed in inputsMissed): the clicks are for screens with a free cursor, such as a shop. A place can be reached without walking: {at, teleport: [x, y, z], yaw} puts the player there at that second of the play (no earlier than 2.5), which is how a script stands exactly at a stall or in a doorway instead of guessing how long to hold a key; {at, look: [right, down]} moves the mouse that many pixels with no button held, as a player turns the camera (the way to check that a locked view stays locked); walking is still what a real player does, so walk where the walk itself is being tested. The level itself does the teleports, on a timer, so none is lost and none takes the place of another; half a second after each the probe looks where the player is, and probe.teleports of playtest_status says for every one whether it arrived (a teleport does not take while the character is down). Two teleports are at least a second apart, and a playtest takes up to 200 of them. trackPlayer (seconds between samples, 0.5 is a good value) records where the player is: playerTrack in playtest_status lists [playSeconds, x, y, z], from which the speed of a walk and the place of every event can be read. Both add a small probe to a copy of the level (three graphs, a skill on skill slot 4, which is the Z key on a PC, the player variables PT_step, PT_tp, PT_t0 and PT_turn; two more graphs in the log window, so name at most eight of your own); with it playtest_status also dates every print in play seconds (playSeconds beside t), which is the clock of the screenshots and the inputs: the level clock t starts a few seconds earlier, a different few every run, and falls behind when the level is busy (two seconds in three minutes on a level of 585 nodes): the runner presses the key of the probe at second 1 and every half minute after, and each press ties the two clocks together anew; probe.levelClockFellBehind says by how much they parted. A timer of the platform also runs slow by itself, about 4.5 % at 60 frames a second (a moment set at 50 s came at 52): the teleports of a script are set earlier by that much and counted from the latest press, and probe.teleports gives the play second each really happened; leave a second of margin around them. A graph of your own that counts seconds with a timer is slow in the same way: a round of 180 timer seconds lasts about 188 on the wall. startValues gives custom variables other start values for this one run ([{prefab: "player", variables: [{name: "wave", value: 5}]}], or entity for the placed things of one name; the type is taken from the variable that is there): the way to try the last minute of a level of three minutes without playing the first two, when the level keeps its clock or its stage in a variable. The values go into a copy; playtest_status says startValues were used, and such a run shows how that part plays, not that the level as built can be won. The track shows where the player stands, not a jump: the height it records stays the same while the character is in the air for an ordinary jump (look at screenshots for that). The probe uses skill slot 4 (Z) and timers named PT_ on the character and the stage entity: a level with a skill of its own on slot 4 cannot be probed. A character that is in the middle of another skill does not hear the key of the probe: keep the keys of your script that use a skill (an attack on E, say) away from seconds 1, 31, 61, 91 and so on by a second on either side, or the teleports of the half minute that follows do not happen (probe.teleports then says so for each). readTextAt reads the text on the screen at those seconds (screenTexts in playtest_status), which tells what a shop or a dialog shows without looking at an image. recordVideo {from, to} records the game between two seconds of the play with the Xbox Game Bar of Windows (it has to be switched on: 设置 > 游戏 > Xbox Game Bar); playtest_status then has video.file, an .mp4 for the listing of a published level (the official advice is ten to thirty seconds of the best moment). recordAudio records what the machine plays during the level: playtest_status then has audio with the .wav, how loud each second was and the seconds at which a sound began, which is how a script learns that its sounds and music play (nobody is listening). bakeNavigation bakes the navigation mesh of the level in the editor before playing (关卡设置 > 地形导航 > 开始烘焙; a minute or two, more on a big scene): a level with complex creatures needs it, or the tactics that choose their own points (wandering, pursuit, fleeing) find none and the creature stands still. bursts photographs stretches of the play several times a second ({from, to, everyMs}, 125 ms apart unless said, at most 600 frames a run; a 4K screen cannot be read faster than about eight times a second, and a frame whose turn comes too late is left out so that keys stay on time): what is needed to see when a stroke lands, when a hand opens or how far an attack carries a creature, which two screenshots a second cannot show. The frames are not returned as images: playtest_status says how many there are and how far apart they really came (burstFrames), and playtest_frames {runId, fromSeconds, toSeconds, crop} puts a stretch of them side by side, each labelled with its play second to a hundredth. Needs the game running (main world, Miliastra lobby, save list or editor) and the monitor of the computer switched on (with no display attached nothing the game draws is shown: the run then fails at once and says so), and takes over mouse and keyboard until it finishes. A failure that says the game window does not answer means the game has to be closed and started again. A level that reaches its result screen before durationSeconds ends the run six seconds later (endedEarly), so durationSeconds can be generous. Returns at once with a runId; read the outcome with playtest_status. Omit mapPath to replay the save already open in the editor. The first playtest of a workspace imports the candidate as a new save into the save list of the game; later ones write the candidate over that same save and open it again (replaceSave, on unless switched off), so that a night of playtests leaves one save in the list and not thirty. The save editor_open_map opened (the one the scene was imported into) is never written over: the playtest after an editor_open_map imports a save of its own. A candidate that differs from the save still open only in the text of its client scripts (Lua) is not imported either: the scripts are written into the files the editor keeps beside the save, which are what the game runs, and the play starts (a round on the Lua is about 70 seconds instead of five minutes; playtest_status says shortWay). expect {prints: [...], absent: [...]} says what the run has to print, in order: playtest_status then answers with expectations {passed, firstNotMet}, and a round ends in a yes or in the one line that is missing. When the save holds client scripts, what they name is checked before anything is started (scene_check_client): a script that does not compile stops the call at once, the rest comes back as clientCheck. A playtest of the very same candidate as the last one (same file, same teleports and trackPlayer; other keys, screenshots or bursts) while the editor still has it open skips importing and opening altogether and starts about two minutes sooner (step same-save-still-open): the way to look at one moment again from closer. Read miliastra://platform-rules before designing a test: creatures far from every player do not act and report stale positions.
| Name | Required | Description | Default |
|---|---|---|---|
| bursts | No | ||
| expect | No | ||
| inputs | No | ||
| mapPath | No | ||
| graphName | No | ||
| burstWidth | No | ||
| graphNames | No | ||
| readTextAt | No | ||
| recordAudio | No | ||
| recordVideo | No | ||
| replaceSave | No | ||
| startValues | No | ||
| trackPlayer | No | ||
| screenshotsAt | No | ||
| bakeNavigation | No | ||
| clientScriptLog | No | ||
| durationSeconds | No | ||
| screenshotWidth | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description discloses far more than the annotations: it takes over mouse and keyboard, requires a monitor, imports or overwrites saves (replaceSave), injects a probe into a copy of the level, uses skill slot 4 (Z), has timing quirks in the editor and platform timers, limits teleports to 200, and describes several failure modes. This is consistent with destructiveHint=true and readOnlyHint=false.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is extremely long and poorly structured, with a massive first sentence and nested parentheticals that bury key details. While much of the content is useful, it is not front-loaded or scannable, and the density makes it hard for an agent to extract the most important guidance quickly.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the tool's complexity, the absence of an output schema, and the minimal annotations, the description is remarkably complete. It covers prerequisites, save import behavior, probe side effects, timing and clock differences, failure handling, output consumption through playtest_status, and many edge cases an agent must know before calling.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, so the description must carry parameter meaning, and it does so for most of the 18 parameters: inputs, teleport, look, click, clickText, holdMs, repeat, screenshotsAt, screenshotWidth, trackPlayer, startValues, expect, bursts, recordVideo, recordAudio, bakeNavigation, durationSeconds, mapPath, replaceSave, graphName(s), and readTextAt are all explained. However, a few parameters such as burstWidth, clientScriptLog, and noScriptErrors inside expect are not mentioned, leaving some gaps.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The opening clause 'Run one full playtest through the official UI without further calls' gives a specific verb and resource, and the description distinguishes the tool from playtest_status and playtest_frames by explaining that it returns a runId immediately and that outcomes are read separately. An agent can identify the core operation despite the sentence's length.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description gives extensive when-to-use guidance: teleport for precise positioning versus walking when movement itself is under test, bursts for fast motion versus ordinary screenshots, readTextAt for reading UI, startValues for jumping into a late section, and expect for print assertions. It also names alternatives like playtest_status and playtest_frames and points to platform rules before designing a test.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
playtest_statusARead-only
Progress or outcome of a playtest_start or scene_import_assets run: completed steps, log prints (t is the level clock in seconds) and the screenshots as images. At most 8 screenshots come as images, spread evenly over the run (imagesShown names their play seconds); screenshotsFrom and screenshotsTo (play seconds) pick a span to take the eight from instead. screenshots lists every one with its file and playSeconds, and playtest_frames shows any span of them side by side in one picture (the way to look at a stretch closely). Filter prints with prefix or graphId. Look at the screenshots yourself; a succeeded run only means the level was played, not that the gameplay is right. When the level reached its result screen before the planned time, levelEndedAt is the play second it was first seen; when the server ended the level for load, serverMessage holds the line it showed and warning explains the usual cause. waitSeconds (up to 45) holds the answer back until the run has ended or that many seconds have passed: call it again while state is still "running", which is four or five calls for a playtest instead of forty.
| Name | Required | Description | Default |
|---|---|---|---|
| runId | Yes | ||
| prefix | No | ||
| graphId | No | ||
| maxPrints | No | ||
| waitSeconds | No | ||
| screenshotsTo | No | ||
| screenshotsFrom | No | ||
| includeScreenshots | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already cover the safety profile (readOnlyHint=true, destructiveHint=false, openWorldHint=false), so the bar is lower. The description adds real behavioral detail beyond them: the max-8-image cap with even spreading, the 45-second blocking wait, and the levelEndedAt/serverMessage/warning fallbacks, but the behavioral layer here is mostly parameter mechanics rather than new information about side effects.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Purpose is front-loaded in the first clause and nearly every sentence carries operational information. It is, however, dense and parenthesis-heavy – 'imagesShown names their play seconds', 'the way to look at a stretch closely' – which slows parsing on an otherwise well-structured description.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema, the description correctly takes on the job of describing the return shape: images, screenshots list with file and playSeconds, prints, levelEndedAt, serverMessage, warning. It is nearly complete for an 8-parameter polling tool, with the gaps being maxPrints and includeScreenshots.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
With schema description coverage at 0%, the description does the heavy lifting for prefix, graphId, waitSeconds, screenshotsFrom and screenshotsTo, including units and the clamping limit. It leaves maxPrints and includeScreenshots wholly unexplained and only implies runId, so three of eight parameters remain undocumented.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific resource and outcome ('Progress or outcome of a playtest_start or scene_import_assets run') and enumerates what comes back: completed steps, log prints, screenshots. It also separates itself from the sibling playtest_frames by naming what that tool does instead ('shows any span of them side by side in one picture').
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives concrete operating instructions: poll with waitSeconds while state is still "running", expect four or five calls instead of forty, use screenshotsFrom/screenshotsTo to retarget the eight images, and use playtest_frames to inspect a stretch closely. It also warns that a succeeded run does not mean the gameplay is right, which reframes how to interpret the result.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
publish_kitARead-only
Put together what a level is published with, from playtests that were already run: a cover and four more pictures cut to 16:9 at 1600 x 900 (each is the screenshot nearest to a play second of a run: {runId, playSeconds}), the title, the description, the tags, an optional video file, and a checklist of what the official guide to publishing asks for (a title of at most ten Chinese characters or twenty Latin ones; five different pictures; what matters on the cover in the middle or on the right, because a tag may hide its left side on the home page; a description that says what you do, what is special and one hint; how many players the level takes; whether there is a respawn point). Everything goes into one folder, /publish/, with a listing.md to copy from; the cover comes back as an image to look at. Take the screenshots for it on purpose: a playtest with screenshotsAt at the best moments (a fight in full swing, the whole scene, the win), without debug markers on the screen. This tool does not publish: that is done by the creator in the game (我的奇域 > the save > 上传存档 > 预览信息), under their own name.
| Name | Required | Description | Default |
|---|---|---|---|
| name | Yes | ||
| tags | No | ||
| cover | Yes | ||
| title | Yes | ||
| video | No | ||
| images | Yes | ||
| mapPath | No | ||
| description | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description says the operation writes to <workspace>/publish/<name> and creates a listing.md, which is a filesystem side effect. That directly contradicts readOnlyHint=true, so this is an annotation contradiction despite the otherwise rich workflow details.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The purpose is front-loaded, but much of the description is one very long nested sentence with parentheticals and checklist details. The content is useful, yet the dense run-on structure makes it harder to scan than necessary.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a complex 8-parameter tool with no output schema, it explains the output folder, listing.md, returned cover image, and screenshot expectations. The unmentioned mapPath parameter and unresolved read-only/write contradiction keep it from being fully complete.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
With 0% schema description coverage, the description compensates by explaining cover and images as {runId, playSeconds} screenshots, plus title, description, tags, optional video, and name via the folder path. It leaves mapPath and some length/array constraints unmentioned, but much of the 8-parameter surface is semantically grounded.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific action: assemble a publish kit for a level from existing playtests, including cover, images, title, description, tags, optional video, and checklist. It explicitly says it does not publish, distinguishing it from the in-game publishing step.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Says to use playtests that were already run and to deliberately capture screenshots at the best moments without debug markers. It also clarifies that this tool does not publish, but it does not name a sibling tool for creating the needed playtest or give explicit exclusion conditions.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
read_knowledgeARead-only
Read one knowledge-base page by the id that search_knowledge returned, optionally only the sections whose heading contains heading. Image links are stripped unless images is true (the official CDN screenshots of node graphs and editor panels are in them).
| Name | Required | Description | Default |
|---|---|---|---|
| id | Yes | ||
| images | No | ||
| heading | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnly, non-destructive, closed-world behavior, so the description's job is to add context—which it does by disclosing that image links are stripped by default and that 'images' restores CDN screenshots of node graphs and editor panels. It doesn't mention response format or error behavior for bad ids, but the key default-off behavior is surfaced.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
One front-loaded sentence with no filler; the id source appears before the optional modifiers. The parenthetical about CDN screenshots is useful but makes the sentence slightly dense.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a 3-parameter read tool with no output schema, it covers the required id source, both optional parameters, and the default image-stripping behavior. Return shape (markdown vs JSON) and invalid-id behavior are unstated, a minor gap given the read-only annotations.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 0%, so the description must carry parameter meaning—and it does for all three: id comes from search_knowledge, heading filters sections by heading substring, and images toggles image-link inclusion (default stripped). That is meaningfully more than the bare types in the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Read one knowledge-base page') and ties the required id back to a named sibling tool, search_knowledge. An agent can distinguish this from search tools without inspecting the schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The id provenance ('the id that search_knowledge returned') implicitly routes the agent to search first, and the optional heading filter is described. It doesn't explicitly say when not to use this or name alternative read paths, so it stops short of a full 5.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
scene_add_buttonADestructive
Put an interaction button (交互按钮) on the screen in a copy of a save: a round button the player clicks (or presses with its key), at any time and anywhere, unlike an option tab that needs the character next to something. Pressing it raises whenUiControlGroupIsTriggered in a graph on the player template (scene_add_graph attachToPrefab "player"); evt.eventSourceEntity is the player that pressed, and evt.uiControlGroupIndex is the controlGroupIndex this tool returns for the button. position is [x, y] from the screen centre on a 1600 x 900 canvas, y up; size [width, height]; key is the number key that presses it (1 by default: give each button its own). On a computer the button is pressed with its key, which is shown under it: the mouse cursor belongs to the camera during play. The button has the editor's default settings otherwise (no cooldown, no use limit, the default icon, a question mark); with key 1 the three records written are byte for byte those of the button in the official sample 界面控件. Verified in play on 2026-10-11 (examples/buttons): two buttons, keys 1 and 2, each raised the event with its own index, on an account of 奇匠 level 1. Writes a new .gil in the workspace; the official save is not touched.
| Name | Required | Description | Default |
|---|---|---|---|
| key | No | ||
| name | Yes | ||
| size | No | ||
| mapPath | No | ||
| position | No | ||
| outputName | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With annotations already declaring destructiveHint=true, the description adds rich context beyond them: it writes a new .gil in the workspace without touching the official save, discloses the defaults applied (no cooldown, no use limit, default icon, question mark), names the event raised (whenUiControlGroupIsTriggered) and its evt fields, and warns that each button needs its own key.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the core action, then organized into event mechanism, coordinate semantics, defaults, and verification. It is dense and slightly long, but nearly every sentence adds a fact an agent would otherwise get wrong; minor redundancy around the key/coordinate explanations.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
No output schema exists, and the description fills that gap by explaining the file output, the raised event, and its evt fields. For a 6-param mutation tool it is nearly complete, with the only shortfall being the undocumented mapPath and outputName params.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, so the description carries the burden and does so well for the most consequential params: position is [x,y] from screen centre on a 1600x900 canvas with y up, size is [width,height], and key is the number key that presses it (default 1, and should be unique per button). It leaves mapPath and outputName undocumented in both schema and description, so it does not fully compensate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Put an interaction button on the screen in a copy of a save') and immediately differentiates the concept from an option tab. The distinction from sibling widgets (progress bar, text box, client UI) is implicit through the event/behavior description, so an agent can identify it without opening a schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives clear context for when this is the right widget: a round button the player clicks 'at any time and anywhere, unlike an option tab that needs the character next to something.' This is a useful use-case contrast. It does not name sibling tools as alternatives or give explicit exclusions, which keeps it below a 5.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
scene_add_card_selectorADestructive
Add a card selector (卡牌选择器) to a copy of a save: the platform's own window in which a player picks one or more cards out of a few, each with an icon, a title and a description (three upgrades to choose from after a wave, a reward, a class at the start); in a level for one player the game stands still while it is open. cards is the library of cards the window can show, {title, description, icon, label} each, or {unknown: true, label} for a card that hides what it is. A graph opens the window for a player with f.invokeDeckSelector, saying which cards of the library to show this time and what value each gives back, and the choice comes to a graph on the player template as whenDeckSelectorIsComplete; the answer of this tool gives both lines. seconds is the time to choose in (the graph may give another). canGiveUp: false takes the button 放弃选择 away (the player has to choose), canFold: false the button that folds the window away, pauseWhenAlone: false lets the game run on behind it, showTime: false hides the countdown; all four are on unless said. The selector stands in no layout: it shows only when a graph opens it, and not in the first seconds of a level (opened at level second 3 it did not show and the choice came back as the default twenty seconds later; at second 14 it showed: open it some seconds in, or on something the player did). The window has a title, a countdown, the cards in a row, 放弃选择 and 确认选择; a playtest picks a card with an input {clickText: its label} and then {clickText: "确认选择"}. Icons seen in the official sample: 91001 a sword (the one a card has when none is given), 91011 a polearm, 91016 a catalyst, 92001 to 92003 dishes. The records are those of the official sample 卡牌选择器, byte for byte; seen in play 2026-10-14 (examples/cards). Its words show on an account of 奇匠 level 2 and up. Writes a new .gil in the workspace.
| Name | Required | Description | Default |
|---|---|---|---|
| name | Yes | ||
| cards | Yes | ||
| title | No | ||
| canFold | No | ||
| mapPath | No | ||
| seconds | No | ||
| showTime | No | ||
| canGiveUp | No | ||
| outputName | No | ||
| warnSeconds | No | ||
| revealUnknown | No | ||
| pauseWhenAlone | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Far exceeds the annotations: annotations only say destructive/not-read-only, while the description discloses that it writes a new .gil, the exact window contents (title, countdown, cards row, 放弃选择/确认选择), the two graph hook points for input and completion, the default-on nature of the four flags, the level-start timing bug, playtest click sequences, and an account-level gating requirement ('奇匠 level 2 and up'). This is unusually rich behavioral context with no contradiction of the destructiveHint.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The content is largely valuable but delivered as a dense run-on with parenthetical Chinese terms, dated sample references, byte-for-byte provenance and an icon catalog that will rarely affect a call. It is front-loaded with the core purpose, but the middle paragraphs bury operational rules (graph hooks, timing bug) inside prose rather than organizing them.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a 12-param mutation tool with no output schema and no schema descriptions, the description covers the important behavior: what gets written, how the selector is driven by graphs, when it fails to appear, and default flag values. The only notable omissions are the auxiliary params (outputName, mapPath, warnSeconds, revealUnknown) that affect file placement and warning timing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 0%, so the description must carry the load, and it does explain cards (the {title, description, icon, label} vs {unknown:true, label} shapes), seconds, canGiveUp, canFold, pauseWhenAlone and showTime. However, five parameters — name, title, mapPath, outputName, warnSeconds and revealUnknown — are never explained in prose, leaving a substantial gap toward the 12-param surface.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Add a card selector ... to a copy of a save') and immediately scopes what the selector is (a platform window where a player picks cards). It is distinct from every sibling in the list (no other deck/card tool exists), so an agent can identify it unambiguously.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives concrete usage conditions: the selector 'stands in no layout', only appears when a graph opens it via f.invokeDeckSelector, and must not be opened in the first seconds of a level (with empirical evidence of the failure at second 3 vs success at second 14). No explicit alternatives are named, but there are no rival card-selector tools, so the guidance is functionally complete.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
scene_add_client_templateBDestructive
Add a template of client controls (客户端控件模板) to a copy of a save: one control, with children when it is a container, kept beside the screen. A script makes copies of it at run time (game.InstantiateClientUIControl(templateIndex, parent), game.DestroyClientUIControl(control)): bullets, cards, rows of a list, anything whose number is not known beforehand. A grid of scene_add_client_ui makes its items from one (itemTemplate), a reference shows one (template). template is a control as scene_add_client_ui takes one (its name is the name of the template; a container with children, an image, a preset button with its states, scripts of its own that start with every copy); the result gives its templateIndex for the script. Add the template before the interface that uses it. Writes a new .gil in the workspace. The records are byte for byte those of two templates saved in the editor; not yet seen in play.
| Name | Required | Description | Default |
|---|---|---|---|
| mapPath | No | ||
| replace | No | ||
| template | Yes | ||
| outputName | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare a write operation with destructiveHint=true, and the description adds useful file-level context: it writes a new .gil in the workspace and the records are byte-for-byte copies of editor-saved templates, not yet tested in play. However, it never explains what the replace parameter destroys or overwrites, which is the key destructive behavior an agent needs to know.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The content is front-loaded but delivered in dense, run-on sentences with interrupting parentheticals (the Chinese term, the runtime API calls, the templateIndex aside). It is difficult to scan and would benefit from shorter sentences or a structured breakdown of parameters and caveats.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a four-parameter tool with a deeply nested schema and no output schema, the description usefully explains the template concept, runtime instantiation model, and the return templateIndex. It is incomplete regarding the working map/output target and replace semantics, and it does not address destructive behavior despite the annotation.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, so the description must carry parameter meaning. It covers the template object fairly well (control kinds, children, name semantics, scripts that start with every copy) and notes the result gives templateIndex, but it says nothing about mapPath, replace, or outputName semantics, leaving three of four top-level parameters undocumented.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The first sentence states a specific verb and resource: adding a client-control template into a copied save. It also distinguishes the tool from scene_add_client_ui by explaining that grids use a template for itemTemplate and references use one for template. The purpose is clear, though the sentence is tangled enough that an agent must parse it carefully.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It gives clear usage context: templates are for runtime-spawned items whose count is unknown (bullets, cards, list rows) and must be added before the interface that uses them. It links to scene_add_client_ui via itemTemplate/template usage. It does not state when not to use this tool or name alternative ways to achieve the same effect.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
scene_add_client_uiADestructive
Put a tree of client controls (客户端控件) on the screen, in a copy of a save: a container that fills the screen, with the controls given under it and the client script (scene_set_client_script, by name) on its root. A control is {name, kind, position, size, children}: kind "image" (a picture: give image, an id from image_catalog, and colour and opacity here, or let the script give it one with control:SetImage(Enum.ImageSource.StaticReference, id) and control.imageColor = Color(r, g, b, a); fill: {shape: horizontal | vertical | radial90 | radial180 | radial360, from, amount 0 to 1} shows a part of it, which is a bar or a cooldown ring with no script drawing it, feather softens its edge and invertMask shows the rest instead), "grid" (网格视窗: a scrolling list whose items are copies of a template, itemTemplate: its name; the script fills it), "reference" (模板引用控件: shows a template, template: its name), "presetButton" (预设按钮), "keyHint" (按键提示: the key of the device in use), "textWindow" (文本视窗: a text box that scrolls), "animation" and "fullscreenAnimation" (界面动效), "cursorArea" (an area that hears the mouse: area:AddCursorEventListener(Enum.CursorEventType.CursorClick, fn); the root needs showCursor = true for the cursor to be there), "container" (holds other controls in children, and moves them with it), "text" (a text box; shown on an account of 奇匠 level 2 and up, seen in play 2026-10-13, and nothing of it on level 1). position is [x, y] of the control's centre from the centre of what holds it, y up, in units of the canvas; size [width, height]. The canvas is 1600 x 900 on a computer, 1280 x 720 on a phone, 1920 x 1080 on a console: the same numbers are used on all of them unless devices says otherwise, so a control more than 640 to the side or 360 up or down is off a phone's screen; hang what belongs at an edge on that edge with anchor, or give devices {mobile: {position, size}, console, mobileGamepad} where the layout must differ. The answer names what would be off a phone as given (offPhoneCanvas: the control and by how much on which side). Beyond what is said here the controls are written the way the editor makes a new one: what each shows, and every change after, is the script's to make (SetAnchoredPosition, SetSizeDelta, SetVisible, SetActive). A control takes more than this when wanted (the schema lists it): scale, rotation, pivot and anchors; active false and visible false for a start out of sight; a script of its own, and values of its own for that script's public variables (script: {name, values: {variable: value}}; a variable of type controlId takes the name of a control); navigation {left, right, up, down} saying which control the stick of a gamepad goes to (by name, or "none"); text {content, fontSize, colour, align...} on a text box (scrollable and scrollbar on a text window); grid {columns or rows, itemSize, spacing, padding}; states {normal, hover, pressed, disabled} naming the children a preset button shows (give hover as well as normal, or the button shows nothing under the cursor); key for a key hint; effect for an interface effect; and on the interface itself showCursor, blockKeys, blockCursor, hidden (out of sight, its scripts not started, until a graph switches it on by containerId), scripts (several on the root). A script finds a control by its name, so the names of one holder must differ. Controls are drawn in the order given, later ones over earlier ones, and over the whole of the ordinary interface when they cover it. Client controls are destroyed and made anew when the player is teleported or reconnects: a script must be able to draw its state again from the custom variables. Writes a new .gil in the workspace. Byte for byte the official sample 客户端脚本 when given what that sample holds, and every kind and every setting byte for byte what the editor writes for it; seen in play on 2026-10-13 (examples clientui, clientgame, clientlist, clientmenu, clientcheck, clientvars), text and the text window on 2026-10-13 on an account of 奇匠 level 2 (example clienttext; level 1 shows no custom text), all but what only another device shows (devices, navigation: this was played on a computer with mouse and keyboard; editor_preview_interface shows the other canvases).
| Name | Required | Description | Default |
|---|---|---|---|
| name | Yes | ||
| hidden | No | ||
| script | No | ||
| mapPath | No | ||
| replace | No | ||
| scripts | No | ||
| controls | No | ||
| blockKeys | No | ||
| outputName | No | ||
| showCursor | No | ||
| blockCursor | No | ||
| isolateNavigation | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already flag destructiveHint=true and readOnlyHint=false, and the description adds real value beyond that: it states the tool 'Writes a new .gil in the workspace' and that client controls are destroyed and recreated on teleport/reconnect, which a script must be able to redraw. It omits what the `replace` flag does to existing UI, which is the main residual gap for a destructive write.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The core action is front-loaded, but the body is a single wall of run-on text with heavily nested parentheses that is hard to parse and well past what an agent needs in one pass. Nearly every clause carries information, yet structure and scannability suffer badly.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a very complex, no-output-schema tool, this covers the model (canvas sizes, positioning units, control tree, per-device overrides) and even describes the returned offPhoneCanvas field. Only the effects of `replace`/`outputName` and a few device-preview behaviors are left implicit.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0% across 12 top-level params and a deep nested control schema, so the description carries the whole burden — and it explains a great deal: kind semantics, position/size coordinate system, anchor, devices overrides, script/values, states, text, grid, fill, feather, showCursor, blockKeys, blockCursor, hidden. It leaves several schema-only fields (mapPath, replace, outputName, isolateNavigation, sound, padKey, below, mask, focusable) unexplained, so not a 5.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Opens with a concrete verb and resource: 'Put a tree of client controls on the screen, in a copy of a save,' and enumerates every control kind it can build. An agent knows exactly what the tool produces. It does not, however, distinguish itself from narrow siblings like scene_add_text_box, scene_add_button, or scene_add_progress_bar, which apparently build single controls.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It references related tools by name (scene_set_client_script, image_catalog, editor_preview_interface) and explains that controls behave as the editor's defaults unless overridden, which is useful context. But it never says when to prefer scene_add_client_ui over the single-control sibling tools, nor any prerequisite/exclusion, so the routing guidance is only implied.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
scene_add_componentsADestructive
Give a prefab (and every placed copy of it) or the placed entities of one name the platform's own components, in a copy of a save. This is how interaction is done on this platform, instead of comparing positions on a timer. collisionTriggers: zones that raise whenEnteringCollisionTrigger / whenExitingCollisionTrigger in a graph attached to the same prefab or entity when a character (or object, creature) walks in or out: pickups, pressure plates, shop areas, "inside the base". The enter event comes once for each entity, at the moment it walks in: a thing that has to act again while the entity stays inside (a tower that reloads, a shop with a cooldown) asks again itself when it is ready, with f.getAllEntitiesWithinTheCollisionTrigger(self, triggerIndex) (examples/kingdom5 does this for its archery range). A zone that lies on the ground has to stand at least 0.45 m high to catch a standing character: one of 0.3 m passed under a character that stood still, eight times out of eight (the shape of a character that triggers does not reach its feet). For a thing to be jumped over make it 0.45 to 0.6 m; from 0.8 m a jump does not clear it. Areas grow with the scale of the prefab. When a hazard is meant to be dodged, check both halves in play: that it hits a player who does nothing, and that it misses one who dodges. optionTab: the native "walk up and press F" prompt with one or several options; choosing one raises whenTabIsSelected with the option id: paying, opening, talking, switching. variables: custom variables (自定义变量) with a type and a start value, the place where an entity keeps its own state; any graph reads and writes them by name, and whenCustomVariableChanges fires on the entity that holds them. motions: basic motion devices (基础运动器) that a graph starts by name with f.activateBasicMotionDevice, or that run from the moment the piece appears (active true). Either a straight move, {name, move: [x, y, z] metres, seconds} (a gate that rises, a wall that comes up; the metres are those of the world, whatever the scale of the piece; a motion can be started again after it has run, so a gate with the motions open, [0, 4, 0], and close, [0, -4, 0], opens and closes as often as a graph starts them in turn: examples/doors, seen in play 2026-10-13), or a path, {name, path: [{position relative to the piece, rotation in degrees, seconds from the point before}...], loop}: loop "backAndForth" with one waypoint and active true is the moving platform of platform games (it goes there and back for ever), "restart" with waypoints that only turn ([0,180,0] then [0,360,0]) spins a thing on the spot, "once" stops at the end. Objects only, creatures move by themselves. follow: a follow motion device (跟随运动器), "attach" to stick to a target or "chase" to fly to it, for things carried by or drawn to a player; a graph names the target. minimapMarker: an icon for the entity on the minimap, with a name and a description (the icon shows where to go without any text on screen). textBubbles: what the thing says, words over it shown a line after another to a character who comes within radius: [{lines: [{text, seconds}], above, active, loop, endEvent, radius, fontSize}]; above is how many metres over the foot of the thing it hangs (before the scale of the prefab; give it: at the foot the thing itself hides the bubble); the first shows from the start when active is true, a graph switches to another with f.switchActiveTextBubble(entity, its number from 1); the lines are said again and again unless loop is false, and endEvent: true tells the graph of the thing when the last was said (whenTextBubbleIsCompleted). nameplates: what stands over the thing, [{items: [...], above, radius, active}], an item being {text} (a label; {1:s.NAME} in it is a custom variable of the thing, {2:HpCur} and {2:HpMax} its health), {icon: id}, {bar: {current, min, max}} (a bar that follows three custom variables of the thing) or {health: true} (the health bar of the thing: {numbers: true} writes the numbers on it, {colour: red} colours it), each with size and an offset in screen units from where the nameplate hangs (a second item 40 lower: offset [0, -40]); indicator: {text, icon, min, max} adds the navigation indicator, a mark that points to the thing from wherever the character looks while the thing is between min and max metres away, with words of its own ({2:PDist} in them is the distance) and an icon: where to go next; f.setEntityActiveNameplate(entity, f.assemblyList([1n], 'config_id')) says which show. attachPoints: [{name, offset: [x, y, z]}] names places on the thing, in metres from its foot, that a bubble or a nameplate hangs on by attach: the name (above makes such a point by itself). Both are the platform's own way to label an NPC or an enemy (the player's own character too: prefab "character"); seen in play 2026-10-14 (examples/talk), and their words show on an account of 奇匠 level 2 and up. hurtBox: the areas where the piece can be hit; an object has none of its own, so a wall, a target or a crate that enemies or players should be able to attack needs one. abilityUnits: ready-made abilities the piece owns, each with a name a graph uses it by: attack {coefficient, added} hits a target for coefficient x the attack of the piece plus the added damage (a thorn bush, a trap), heal restores an amount of health (a spring); this list replaces the units the piece had. What the target loses is less than that number: the attack of an ability unit is not absolute damage (是否是绝对伤害 is off), so the defence of the target takes its share: a creature or an object of level 1 with the attributes it comes with loses 0.45 of it (measured with coefficient 0: +80 takes 36, +55 takes 24 or 25, +40 takes 18). A hit box triggered from a skill graph with absoluteDamage true takes exactly its increment. The tool cannot switch absolute damage on for an ability unit yet (no official sample has one to copy the field from): give the unit 2.2 times the damage that is wanted, or use a hit box. solid false lets characters walk through the piece (pickups). motions (straight and path), follow, minimapMarker, the attack kind of abilityUnits and a trigger for creatures were verified in play on 2026-10-10; hurtBox was verified on 2026-10-11 (examples/strike: a crate with a hurt box is hit and broken by the hit box of a sword skill, which passes through objects without one); the heal kind of abilityUnits too (f.recoverHp(character, 1500, unitName, false, source): the health on the screen went from 8492 to 9992 and whenHpIsRecovered fired on the character with 1500; the attack unit of 1 x attack + 3000 before it took 1508, less the character's defence). projectile makes the thing fly from the moment it is created (a bullet, an arrow, a thrown stone): {type: "straight", velocity: [x, y, z] metres a second in its own axes with z forward and y up, acceleration, accelerationSeconds}, {type: "parabola", velocity, gravity (9.8)} or {type: "tracking", velocity, turnDegreesPerSecond (9999: it turns at once), targetAttachPoint (the point of the target it flies at: "GI_RootNode" its feet; creatures also have "GI_ChestMark"), snapRange and snapSeconds (within that many metres it closes in on the target in that time; 1 and 1)}: an arrow or a spell that follows whoever it was shot at, so that a target that walks is still hit; a graph launches one with f.createProjectile(prefabId, position, rotation, owner, target, false, 1n, [] as bigint[]), the fifth argument being the entity a tracking one follows. hitDetection tells when it touches something: {areas, trigger: "once" or "oncePerEntity", delaySeconds: how long after it appears it starts to detect, so that it does not hit whoever shot it, abilityUnit: the name of one of this prefab's abilityUnits, launched at what it hits, layers: what counts as a touch, of hurtBox, scene and objectCollision (all three when left out; ["hurtBox"] for a bullet that should only notice things that can be hurt), factions: "hostile" for one that only notices enemies of its own faction, so that it flies past friends (give the thing its shooter's faction with f.modifyEntityFaction), continuous: {speedAbove, radius} switches on continuous detection (连续碰撞检测) above that speed, for a fast thing that would otherwise be on one side of a target in one moment and on the other in the next}; whenOnHitDetectionIsTriggered fires in a graph on the prefab. Both records are byte for byte those of the official sample 投射运动器; verified in play on 2026-10-11 (examples/shoot: a bolt shot by a skill breaks a crate with two hits; do not remove the bolt in the very moment it hits, or that hit does no damage: remove it a third of a second later). loot is what the thing leaves behind when it is destroyed: {dropPrefab: a drop prefab from scene_add_prefab {drop}, items: [{item, amount}]} (the platform's way to have a defeated creature or a broken crate drop something; verified in play on 2026-10-11 with a chest that a graph destroys: the drop appears where it stood and gives the items listed here). An area is a box {size: metres or [x,y,z], offset} or a sphere {radius, offset}, relative to the entity. Called again on the same target, each kind that is given replaces what the target had of that kind (the whole collisionTriggers list, the option tab, the motions and so on: to change the size of one trigger give the whole list again), kinds that are not given stay as they are, and variables are merged by name (one given again gets the new start value). Target: prefab (name or id, or "player" / "character" for the built-in templates, which take variables only) or entity (a placed name). Static pieces carry no components. Writes a new .gil in the workspace; the official save is not touched. launcher {areas, speed, direction}: makes the thing fling the characters that touch it (the platform's 角色扰动装置, kind 弹射器): a character entering an area gets that many metres a second of extra speed in the direction ([0, 1, 0], straight up, when left out: a bounce pad; sideways: a bumper or a gust that pushes off a ledge). The official bounce mushroom is {areas: [{radius: 1.5, offset: [0, 0.5, 0]}], speed: 7}. It works by itself, without a graph, and only on characters that walk into the area (one teleported into it is not flung). Verified in play on 2026-10-12 (examples/walls): a flat pad of speed 14 threw the player 8.6 m up, again each time it came down on it. The direction of a launcher may also be "away": the character is pushed straight away from the piece, wherever it touched it, which is what a bumper, a swinging hammer or a blast does; holdSeconds is how long the push lasts at full strength (0.25) and fadeSeconds how long it then takes to fade (0) (verified in play on 2026-10-13, examples/hazards: a big coin with speed 10 threw a player who kept walking into it back two or three metres every time). extraCollision {areas}: shapes that stop characters and creatures whatever the model looks like (the platform's 额外碰撞). On a prefab of the empty model (asset 10005018, 空模型, which shows nothing) it is a wall nobody sees: {areas: [{size: [0.5, 4, 12]}]} is a pane four metres high and twelve long, the way to keep players inside an arena or on a path without building a visible wall. Verified in play on 2026-10-13 (examples/hazards): the player stopped 0.2 m before the pane with nothing to be seen there. A blind test walled an arena this way that night: with its top 2.0 m above the ground a wall was still climbed over, with 2.4 m and more it held (3.2 m where a bale of 0.8 m stood beside it). The camera of the game does not pass through it either: when such a wall comes between the camera and the character, the camera jumps close to the character (seen with a camera that looks down from the south at a player by the south wall), so keep the walls on the side the camera looks from further out than the play needs, or let that side be open ground with a visible edge. "toward" pulls the character to the piece instead. forceField {areas, direction, speed}: the same component in its other kind (力场器), which pushes for as long as a character is inside instead of once on entering: a wind across a bridge, a current, a conveyor; innerRadius and outerRadius with innerSpeed and outerSpeed make the push differ between the core of its sphere and beyond it. A piece carries a launcher or a force field, not both. Both were read from devices configured by hand on 2026-10-13. The force field was tried in play that night (examples/hazards, second lane): walking through a field of radius 2.5 that blows sideways at 6 m/s put the player three metres off its line. "toward" pulled in the same run: on entering the area the player was carried 2.3 m towards the piece (speed 8, holdSeconds 0.3), once, like every launcher. The areas of a component grow with the scale of the prefab: on a piece of scale 2.5 an area of radius 3 reached 7.5 m, so the pull came much earlier than where the area was thought to be.
| Name | Required | Description | Default |
|---|---|---|---|
| loot | No | ||
| solid | No | ||
| entity | No | ||
| follow | No | ||
| prefab | No | ||
| hurtBox | No | ||
| mapPath | No | ||
| motions | No | ||
| launcher | No | ||
| optionTab | No | ||
| variables | No | ||
| forceField | No | ||
| nameplates | No | ||
| outputName | No | ||
| projectile | No | ||
| textBubbles | No | ||
| abilityUnits | No | ||
| attachPoints | No | ||
| hitDetection | No | ||
| minimapMarker | No | ||
| extraCollision | No | ||
| collisionTriggers | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description adds substantial behavior beyond the annotations: it says it writes a new .gil in the workspace and leaves the official save untouched, explains replacement and merge semantics, and documents many verified play-test caveats and failure modes. These details are fully consistent with readOnlyHint=false and destructiveHint=true; there is no contradiction.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single enormous block of prose, roughly thousands of words, with many narrative asides and repeated verification dates. It front-loads the purpose, but the length and lack of structure make it far from concise and hard to scan.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given a 22-parameter nested schema, no output schema, and destructive write behavior, the description is more than complete enough: it covers targets, replacement semantics, persistence, component behavior, and practical caveats an agent needs to invoke the tool correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
With 22 nested parameters and 0% schema description coverage, the description carries the full semantic burden and largely succeeds, explaining collisionTriggers, motions, nameplates, textBubbles, projectiles, hitDetection, loot, launcher, forceField, and many others with units, examples and defaults. While a few parameters such as mapPath and outputName are not explicitly explained, the overall compensation for the schema gap is exceptional.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The opening sentence gives a specific verb and resource: adding the platform's own components to a prefab or placed entity in a copy of a save. It is unambiguous about scope, though it does not explicitly distinguish itself from sibling tools such as scene_update_prefab or scene_add_prefab.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It explains the intended usage pattern extensively, including that this is how interaction is done instead of comparing positions on a timer, that static pieces carry no components, and that calling it again replaces each supplied component kind while leaving other kinds intact. It lacks explicit when-not-to-use guidance versus sibling tools, so it stops short of a 5.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
scene_add_creature_skillADestructive
Define a skill of a complex creature (造物技能) in a copy of a save: an animation of that creature and a client graph that runs at a chosen moment of it. A complex creature (an asset of the group "怪物(AI版)": scene_search_assets {group:"怪物(AI版)"}) does nothing by itself; what it can do beyond walking is its skills: swing and hit, shoot, dig, hammer at a wall, look around. creature is the asset id of the creature the skill is for (a skill plays the animations of one model and can only be given to that creature). animation is one of its animations, by id or by name ("近战攻击_01"): creature_animations {creature} lists them with their lengths; animations gives several, played one after another (a wind-up, a loop, a recovery). graphId is a graph made with scene_add_graph {kind:"creatureSkill"}; it runs graphAtMs milliseconds into the skill (the moment the weapon lands, the arrow leaves): there it triggers a hit box, fires a projectile or tells a server graph (f.notifyServerNodeGraph, heard as whenSkillNodeIsCalled by a server graph on the creature's own prefab). graphAtMs may be a list of moments, and the graph then runs at each of them: the three strokes of a triple stroke ([350, 900, 1700] for 单手武器_三连击) each trigger its hit box (seen in play; the graph cannot tell which of the moments it is). faceTarget (自动面向目标) turns the creature to its target while the skill plays; interrupts (可打断其他技能) lets the skill cut off another one. effect shows an effect on an attachment point of the creature for part of the animation: the thing the creature holds only while it does this (a pickaxe on GI_WeaponR while it digs, the knife in its hand until it is thrown; what is carried all the time is mounted by a server graph instead, f.mountLoopingSpecialEffect). animationPortion plays only the first part of the animation (0.62 leaves out the two seconds 盗宝团·斥候 just stands at the end of its throw). creature_animations says for the animations that were looked at in play which moment counts and what belongs in the hand; the result repeats it (hint) when graphAtMs is far from that moment. Give the skill to a creature with scene_set_creature_logic, which also sets its cooldown. Writes a new .gil in the workspace; the official save is not touched. A skill of one animation is byte for byte the skill of the official sample 复杂造物; several animations and the two switches are written as the editor saved them on 2026-10-11.
| Name | Required | Description | Default |
|---|---|---|---|
| name | Yes | ||
| effect | No | ||
| graphId | Yes | ||
| mapPath | No | ||
| creature | Yes | ||
| animation | No | ||
| graphAtMs | No | ||
| animations | No | ||
| faceTarget | No | ||
| interrupts | No | ||
| outputName | No | ||
| animationPortion | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations declare destructiveHint=true, but the description clarifies the actual blast radius: 'Writes a new .gil in the workspace; the official save is not touched,' which changes how an agent should weigh the destructive hint. It also discloses that the graph cannot tell which of several graphAtMs moments it is running at, and that the result repeats a hint when graphAtMs is far from the moment observed in play. It stops short of covering failure modes or mapPath/outputName effects.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The purpose is front-loaded and nearly every parenthetical earns its place by disambiguating a Chinese asset name or giving a concrete value. However, the sentences are extremely long and the closing note about byte-for-byte compatibility with the 2026-10-11 editor save is trivia that slows a reader without changing a call decision.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a 12-parameter mutation tool with a nested object, no output schema and zero schema annotations, the description supplies the graph semantics, the animation-selection model, the effect lifecycle, the downstream consumer (scene_set_creature_logic for cooldown) and the write target. An agent could call this correctly without any other source.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
With 0% schema description coverage, the description carries the full burden and does so: creature must match the animation's model, animation accepts id or name, animations is a played-in-sequence list, graphAtMs may be a scalar or up to eight moments with a concrete triple-stroke example, effect takes an attachment point like GI_WeaponR, and animationPortion=0.62 trims the trailing idle. Only mapPath and outputName go unexplained.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource: 'Define a skill of a complex creature ... in a copy of a save: an animation of that creature and a client graph that runs at a chosen moment of it.' It immediately distinguishes itself from the sibling scene_add_skill by scoping to complex creatures and from scene_add_graph by naming graphId as an input to this tool.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It routes the agent explicitly: find the creature with scene_search_assets {group:"怪物(AI版)"}, list animations with creature_animations {creature}, build the graph with scene_add_graph {kind:"creatureSkill"}, then attach the finished skill via scene_set_creature_logic. It also draws a real exclusion line – items held permanently must be mounted by a server graph (f.mountLoopingSpecialEffect) rather than passed as effect.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
scene_add_currencyADestructive
Define a currency (货币) in a copy of a save and give every character a backpack that can hold it, optionally with a starting amount. Currency is the platform's own money: a graph reads and changes it with f.getInventoryCurrencyQuantity(character, currencyId) and f.modifyInventoryCurrencyQuantity(character, currencyId, change), whenTheQuantityOfInventoryCurrencyChanges fires on the character, and shops, item prices and drops are all counted in it. The holder is the character entity (the backpack component is put on the character template), not the player entity. If the map has no backpack template, one of ten slots is made. icon is the number of a currency icon (100001 is the default one, 100007 the Mora coin). The records written are byte for byte those of the official sample 货币与商店. Writes a new .gil in the workspace; the official save is not touched. Verified in play on 2026-10-10: the starting amount is there, and the change event also fires once when the level starts, for the starting amount.
| Name | Required | Description | Default |
|---|---|---|---|
| icon | No | ||
| name | Yes | ||
| mapPath | No | ||
| outputName | No | ||
| startAmount | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description adds substantial behavior beyond the annotations: it writes a new .gil in the workspace, leaves the official save untouched, places the backpack on the character template for every character, creates a ten-slot backpack when needed, and notes that the change event fires at level start. It also discloses runtime APIs and event behavior, which is unusually rich for an agent deciding whether and how to invoke it.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is front-loaded with the core action and affected entities, and most sentences carry useful domain or runtime information. It is somewhat overpacked with API signatures, sample parity, and a verification date, but remains readable and well ordered.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a mutation tool with no output schema and low schema description coverage, the description is largely complete on effects, target entity, backpack behavior, file output, and event semantics. The main remaining gap is that two parameters, mapPath and outputName, are not explained.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, so the description must carry parameter meaning. It explains icon in detail and gestures at name and startAmount, but mapPath and outputName are not described at all, leaving important invocation details undocumented.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb and resource: define a currency in a save copy and equip characters with a currency-holding backpack. It also distinguishes the concept from player entities and ties it to shops, item prices, drops, and character inventory, so an agent can tell exactly what this tool creates.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Usage context is clear: use this when defining platform currency for a copied save, including optional starting amounts. However, it does not explicitly name alternatives such as scene_list_currencies or state when not to use it, so routing guidance is strong but not complete.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
scene_add_environmentADestructive
Add a second sky to a copy of a save: an environment configuration (环境配置) fixed at one hour, with stars, the milky way and clouds as asked. This is how night is done on this platform: changing the level clock alone does not darken the sky that is in force, a graph switches the players to another environment configuration with f.modifyEnvironmentSettings(environmentId, players, false, 0n), and back with the id of the map's own. The new configuration applies to nobody until a graph switches to it. hour is 0 to 23 (0 is midnight). Returns environmentId. Writes a new .gil in the workspace; the official save is not touched. Verified in play on 2026-10-10: a midnight configuration is dark with stars, and stars and clouds follow their switches. On a map of the current version the sky is written the way the editor fixes one at an hour (the 34 brightness and colour curves of the map's own sky, each taken at that hour), so a day sky looks like the sky of the map at that hour and not brighter (seen in play on 2026-10-13, examples/hazards/hazards_sky.json; until that day a day sky came out washed out). For day and night make two, one for the night and one for the day (hour 11, stars and milkyWay false), and switch between them: the map's own configuration follows a clock that stays at the hour of the last fixed one, so going back to it after a night stays dark.
| Name | Required | Description | Default |
|---|---|---|---|
| hour | No | ||
| name | Yes | ||
| stars | No | ||
| clouds | No | ||
| mapPath | No | ||
| milkyWay | No | ||
| outputName | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Highly transparent about side effects: writes a new .gil in the workspace, the official save is not touched, the new configuration applies to nobody until a graph switches to it, and it returns environmentId. The only minor gap is that it doesn't reconcile the destructiveHint=true warning with its 'official save is not touched' framing, though writing a new file is consistent with a mutation.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with what the tool does before the rationale and workflow, and most sentences add real value. Slightly overlong with some editorial detail (the 2026-10-13 washed-out-sky anecdote) that could be trimmed without losing meaning.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a 7-param, no-output-schema mutation tool, it covers the key behavior, side effects, return value, and the night/day workflow. It falls short on explaining the name/mapPath/outputName parameters, but the operational picture is otherwise complete.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 0%, so the description must carry all 7 params, but it only clarifies hour (0-23, 0 is midnight), stars, milkyWay, and clouds. It leaves name (required, 1-30 chars), mapPath, and outputName undocumented, so roughly half the parameters remain unspecified.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb (add) and resource (an environment configuration / second sky) on a copy of a save, and explicitly distinguishes it from just changing the level clock. Combined with the mention of f.modifyEnvironmentSettings, an agent knows exactly what this produces vs. scene_set_level_settings.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explains the core use case (night sky), why the alternative (level clock) fails, and gives an explicit workflow: make two configs, one for night and one for day (hour 11, stars/milkyWay false), and switch between them. It even warns that the map's own config follows a clock stuck at the last fixed hour, so going back after night stays dark.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
scene_add_global_timerADestructive
Define a global timer (全局计时器) in a copy of a save and give it to the player template (holder "player", one per player) or to the stage entity (holder "stage", one for the level): a countdown of some seconds, or a stopwatch with countdown false. A graph starts it with f.startGlobalTimer(holder entity, name); when a countdown ends, a graph on the holder hears whenGlobalTimerIsTriggered. Use it for the length of a round or of a day, instead of counting ticks in a graph: it can also be shown on the screen with scene_add_timer_display. Writes a new .gil in the workspace; the official save is not touched. Verified in play on 2026-10-10: a timer held by the stage starts counting by itself when the level loads (several seconds before the graphs start), whenGlobalTimerIsTriggered fires when it reaches zero, and f.startGlobalTimer starts it again after that.
| Name | Required | Description | Default |
|---|---|---|---|
| name | Yes | ||
| holder | No | player | |
| mapPath | No | ||
| seconds | Yes | ||
| countdown | No | ||
| outputName | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations only declare write/destructive/openWorld flags; the description adds the crucial scope qualifier that the official save is untouched and only a new .gil is written. It also discloses runtime lifecycle behavior — a stage-held timer counts down on level load before graphs start, fires whenGlobalTimerIsTriggered at zero, and can be restarted via f.startGlobalTimer — which an agent could not infer from any structured field.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Purpose and holder distinction are front-loaded, and each clause carries information. It is dense and the trailing verification sentence, while genuinely useful, is long enough to dilute the core instruction.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a write tool with annotations, 6 params and no output schema, it covers safety scope, runtime behavior, and the companion display tool. Remaining gap: two parameters (mapPath, outputName) are undocumented anywhere, so an agent must guess what outputName controls in a workspace that already writes a new .gil.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
With 0% schema description coverage across 6 params, the description carries the load: it explains holder values ('player' vs 'stage'), what countdown=false means (stopwatch), and how name is referenced by f.startGlobalTimer. It leaves mapPath and outputName entirely unexplained, and seconds is only loosely defined ('a countdown of some seconds') despite a 86400 maximum in the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource (define a global timer in a copy of a save) and immediately distinguishes the two holder variants: player template (one per player) vs stage entity (one for the level). An agent can tell this apart from scene_list_global_timers and scene_add_timer_display without opening any schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives an explicit use case ('the length of a round or of a day'), an explicit alternative to avoid ('instead of counting ticks in a graph'), and names the follow-on tool (scene_add_timer_display) plus the graph calls (f.startGlobalTimer, whenGlobalTimerIsTriggered) that consume the timer. Routing is fully specified.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
scene_add_graphADestructive
Add an empty node graph to a copy of a save and, for a server graph, attach it. The platform is event driven and its games are many small graphs, each on the entity it is about: attachToPrefab puts the graph on a prefab (元件) so that every copy of it, placed or created later, runs its own instance and receives its own events (a coin that is picked up, a pay station, a door); attachToPrefab "player" puts it on the player template (per-player state such as score) and "character" on the character template; attachTo names one placed entity (default 关卡实体, the stage entity: level-wide things such as the clock, and the only place that hears whenEntityIsDestroyed of objects and creatures). An entity can run several graphs, and one graph can sit on several prefabs that behave alike (attachToPrefab as a list: a wooden and a stone wall, three kinds of coin). kind makes another kind of graph instead, none of which is attached to an entity: boolFilter, a client graph with a yes/no test that an option of an option tab can name so that it shows only to players for whom it is true (scene_add_components filterGraphId; verified in play); characterSkill, the client graph a skill runs (scene_add_skill names it; verified in play); item, a server graph that hears the events of one item, such as its being used from the backpack (scene_add_item useGraphId names it; verified in play); creatureSkill, creatureStatus, creatureDecision, the client graphs of complex creatures: what a skill of the creature does, one of its behaviours (a list of tactics and skills), and the graph that picks the behaviour (scene_add_creature_skill and scene_set_creature_logic wire them to a creature; verified in play, read_knowledge {id:"example-brain"}). A new map has no node graph, and write_graphs needs one to write into: call this, then use the returned graphId as targetGraphId. The name gets the prefix GSTS if it lacks it (graphs with that prefix are the ones these tools may overwrite). Writes a new .gil in the workspace and returns its path; the official save is not touched.
| Name | Required | Description | Default |
|---|---|---|---|
| kind | No | server | |
| name | No | ||
| mapPath | No | ||
| attachTo | No | ||
| outputName | No | ||
| attachToPrefab | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Beyond the annotations, the description discloses that it writes a new .gil in the workspace, that the official save is not touched, that names receive the _GSTS_ prefix, and that graphs with that prefix are the ones these tools may overwrite. This adds concrete operational context not captured by destructiveHint/readOnlyHint alone.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is long and dense, but that length is largely justified by the complexity of seven graph kinds and multiple attachment modes. It front-loads the core action and usage condition, though some sentences are run-on and could be more clearly structured.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the complex behavior, zero schema descriptions, and no output schema, the description is substantially complete: it explains the workflow, attachment semantics, file-writing behavior, and returned graphId/path. The remaining gap is that mapPath and outputName are not explicitly described.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, so the description must carry parameter meaning. It explains kind at length for all seven enum values, and explains attachToPrefab, attachTo, and the name-prefix behavior, but it does not directly explain mapPath or outputName, leaving a gap for two of the six parameters.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb and resource: add an empty node graph to a copy of a save, and attach it when it is a server graph. It explicitly distinguishes this tool from write_graphs by explaining that write_graphs needs a graph created here first.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It gives an explicit when-to-use condition: a new map has no node graph and write_graphs needs one, so call this then use the returned graphId as targetGraphId. It also explains the attachment alternatives and the non-attached kind options with their downstream wiring tools.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
scene_add_imageADestructive
Put an image (图片) on the screen, in a copy of a save: a plain rectangle in a colour (image 100001, the default: a panel behind bars, a coloured mark, a frame for the corner of the screen) or one of the pictures of the platform by its id. This is how a screen says something without words, which matters on an account of 奇匠 level 1, where custom text does not show. colour is "#rrggbb" (it tints a picture; white leaves it as it is), opacity 0 to 1 (0.5 with black is the dark panel the official samples put behind their controls). position is [x, y] from the screen centre on a 1600 x 900 canvas (y up), size [width, height]. image_catalog shows every picture of the platform with its id (about 1600, in fifteen categories): choose there. knownImages of scene_list_interface names 22 of them in words (plain discs, an arrow, a question mark, a sword and shield, fruit, gift boxes, round birds, a rank letter). Controls are drawn in the order they were added, so add the panel before what lies on it. A graph takes an image off the screen and puts it back with f.modifyUiControlStatusWithinTheInterfaceLayout(player, controlId, UIControlGroupStatus.Off or .On) (a row of discs as lives: examples/images/images_lives.json, seen in play); hidden true starts it off the screen. Verified in play on 2026-10-13 on an account of 奇匠 level 1 (examples/images): panel, pictures and coloured rectangles all show.
| Name | Required | Description | Default |
|---|---|---|---|
| name | Yes | ||
| size | No | ||
| image | No | ||
| colour | No | #ffffff | |
| hidden | No | ||
| mapPath | No | ||
| opacity | No | ||
| position | No | ||
| outputName | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Beyond the annotations, the description discloses important behavior: insertion into a copy of a save, drawing order, hidden controls starting off-screen, and graph-based toggling via modifyUiControlStatusWithinTheInterfaceLayout. It also notes play verification and the level-1 text limitation, which materially helps an agent understand consequences.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is front-loaded with a clear purpose, but the single dense paragraph is overlong and packed with parenthetical examples and verification notes. Much of it is useful, yet it could be structured and trimmed for faster agent parsing.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a complex 9-parameter UI mutation tool with no output schema, the description covers purpose, visual parameters, related selection tools, and behavioral caveats well. It is not fully complete because name, mapPath, and outputName are not explained and return behavior is not addressed.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, so the description must carry parameter meaning. It explains image, colour, opacity, position, size, and hidden well, but omits the required name parameter and the optional mapPath and outputName parameters, leaving important semantics undocumented.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb and resource: putting an image on the screen in a save copy, including default rectangle and platform-picture variants. It distinguishes the tool from text-based UI and points to scene_list_interface and image_catalog for related choices.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It gives clear usage context, including the key case where custom text is unavailable and this tool supplies visual meaning instead. It also tells the agent to choose images via image_catalog or knownImages from scene_list_interface, though it does not explicitly name when not to use this tool or contrast it directly with scene_add_text_box.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
scene_add_itemADestructive
Define an item (道具) in a copy of a save: a thing a character holds in its backpack in numbers (fruit, wood, a key), which a shop can sell or buy. Define a currency first (scene_add_currency gives every character the backpack). value is what one of it is worth in a currency (the currency by name or id); icon is the number of an item icon (90001 an apple, 90015 fowl meat). A graph gives and takes it with f.modifyInventoryItemQuantity(character, itemId, change) and reads f.getInventoryItemQuantity(character, itemId). The events about an item (whenItemIsAddedToInventory, whenItemIsLostFromInventory, whenTheQuantityOfInventoryItemChanges, whenItemsInTheInventoryAreUsed) arrive only in the item's own item graph (useGraphId), not in a graph on the character or the player; only the currency event goes to the holder. The record written is byte for byte the item of the official sample 货币与商店. Verified in play on 2026-10-11 (bought and sold in a shop, counted by a graph). category "consumable" with useGraphId makes it an item the player uses from the backpack: useGraphId is an item graph (scene_add_graph {kind: "item"}, source g.server({id, name, type:'item'}).on('whenItemsInTheInventoryAreUsed', ...)), the record being that of the fowl meat of the official sample 掉落物、道具、背包; evt.itemOwnerEntity is the character that used it and evt.amountToUse how many. The player presses B for the backpack, clicks the item, 使用 and 确认; useCooldownSeconds is how long the item then waits before it can be used again (10 when left out). Verified in play on 2026-10-11 (examples/potion). Equipment is not made; the drop that lies on the ground is scene_add_prefab {drop}. Writes a new .gil in the workspace; the official save is not touched.
| Name | Required | Description | Default |
|---|---|---|---|
| icon | No | ||
| name | Yes | ||
| value | No | ||
| mapPath | No | ||
| category | No | material | |
| outputName | No | ||
| stackLimit | No | ||
| useGraphId | No | ||
| description | No | ||
| useCooldownSeconds | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Beyond the annotations it discloses the write target and blast radius ('Writes a new .gil in the workspace; the official save is not touched') and non-obvious event semantics (item events arrive only in the item's own item graph, not the character's or player's). It does not address what happens on duplicate names or overwriting an existing outputName, which is the main remaining gap.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
It is a single run-on block that mixes the core definition, graph-script API signatures, event routing, UI click instructions ('presses B ... clicks the item, 使用 and 确认'), and repeated verification dates. The important content is front-loaded, but splitting the graph/event detail from the definition would make it far more scannable.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a 10-parameter, no-output-schema mutation tool this covers the creation semantics, the currency prerequisite, the consumable/useGraphId path, and the script-facing API. Only the secondary parameters (stackLimit, outputName, mapPath, description) are left to the schema, which is a minor gap given how much context is supplied.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 0%, so the description must carry the load, and it does for the hard parameters: value (currency by name or id), icon (numeric ids with examples 90001/90015), category ("consumable" activates use), useGraphId (must be an item graph from scene_add_graph), and useCooldownSeconds (default 10). stackLimit, outputName, mapPath, and description still receive no mention, keeping it from a 5.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The first sentence gives a specific verb and resource ('Define an item (道具) in a copy of a save') and immediately bounds the concept: a thing held in a backpack in numbers, sellable in a shop. It explicitly disambiguates from siblings by naming scene_add_currency, scene_add_prefab {drop}, and stating 'Equipment is not made'.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It gives an explicit prerequisite ordering ('Define a currency first'), names the alternative tool for ground drops (scene_add_prefab {drop}), excludes equipment, and explains the conditional path (category "consumable" with useGraphId) that changes how the item behaves. An agent can choose between item, currency, and prefab without further inference.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
scene_add_lightADestructive
Add a point light that belongs to one environment configuration (环境配置), in a copy of a save: a lamp that is lit at night. A light shines only while a player is under the environment configuration it belongs to, so lamps for the night go on the night configuration made with scene_add_environment. environment is that configuration's name or id; position is [x, y, z]; radius is how far the light reaches (metres), intensity its strength, range the distance it is drawn from. Writes a new .gil in the workspace; the official save is not touched. Verified in play on 2026-10-10: the lamp is lit under its own configuration and off under any other.
| Name | Required | Description | Default |
|---|---|---|---|
| name | Yes | ||
| range | No | ||
| radius | No | ||
| mapPath | No | ||
| position | Yes | ||
| intensity | No | ||
| outputName | No | ||
| environment | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Goes well beyond the annotations: it says a new .gil is written into the workspace, the official save is untouched, and discloses the runtime conditional (lit under its own configuration, off under any other), backed by a playtest verification date. This meaningfully clarifies the destructiveHint=true annotation by scoping what is actually modified.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loads what the tool does and then layers in semantics and the sibling dependency; nearly every clause carries information. It is slightly run-on, and the verification-date sentence, while useful as a trust signal, is the most expendable part.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given 8 parameters, no output schema and no schema descriptions, the definition covers the core behavior, the owning-configuration model and the save-copy side effect. The remaining gap is the three undocumented parameters (name, mapPath, outputName), which an agent must infer.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
With 0% schema description coverage across 8 parameters, the description carries the load and explains environment (name or id), position ([x, y, z]), radius (metres of reach), intensity (strength) and range (draw distance). It leaves name, mapPath and outputName undocumented beyond the hint that a .gil is written, so it compensates substantially but not completely.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Add a point light') plus its scope constraint (belongs to one environment configuration, written into a copy of a save). It explicitly distinguishes itself from the sibling scene_add_environment, which it names as the tool that creates the configuration the light attaches to.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Provides a clear usage condition: a light only shines while a player is under its owning environment configuration, so night lamps must be added to the night configuration created via scene_add_environment. It routes the agent to the prerequisite sibling, but gives no explicit 'do not use this when...' exclusion.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
scene_add_prefabADestructive
Make a prefab (元件) in a copy of a save, so that a node graph can create that thing at run time wherever it wants and at the size you chose: small coins, a wall that appears when it is bought, markers that follow the player, units that are recruited. Two ways: asset (an object asset id or unique name from scene_search_assets) with a scale; or fromEntity (the name of something already placed in the save, from scene_list_entities) to make a prefab of that very thing, which is how creature prefabs are made: place one creature with createAtStart false, import, then make the prefab from it. scale is a number or [x, y, z], 1 = natural size; with fromEntity it defaults to the entity's own scale. (Created by its bare asset id with f.createPrefab a thing always has its natural size.) Mechanism assets (group 交互机关: chests, levers, doors, the bounce mushroom) have a preset status (预设状态), a built-in animation: the prefab is given the asset's status id, the result names it, and a graph plays it with f.setPresetStatus(entity, statusId, 1n): the chest opens, the lever goes down, the door swings. presetStatusValue is the value it starts at (default 0). presetStatusId registers an id of your own for an asset that is not in the table of verified ones (for most mechanisms of group 交互机关 the id is (asset id - 4000) x 10): an id the asset does not have fails the editor's check before a playtest, and the failure names the prefab (playtest_status gives the text), so a playtest that starts means the id exists. health is the base health of the thing (an object has 10 when it is left out, which one hit of a sword skill breaks; the target dummy of the official attack lesson has 300; on a creature it replaces the base health the placed creature has, which the game multiplies by several for the creature's level: a hilichurl of base 13.6 falls to two or three hits of 50, one of base 40 stood after three): it matters once something can hit the thing, which for an object needs a hurtBox (scene_add_components); verified in play on 2026-10-11 (examples/raid: a crate of 100 takes two hits of 50). drop makes the prefab a drop (掉落物): the thing that lies on the ground and gives the character that picks it up an item into its backpack, {item: name or id from scene_add_item, amount, pickupSize: the side of the box around it, in metres, within which the prompt to pick up shows (1 when left out, which asks the player to stand just beside it; 6 was comfortable in examples/raid)}; a graph creates it like any prefab, and a thing with the loot component (scene_add_components) leaves it behind when destroyed. Verified in play on 2026-10-11 (examples/drops): the prompt to pick up (F) shows when the character is about 0.6 m from the drop, not from further than a metre and not while standing on it. A creature created from such a prefab acts like a placed one (verified in play): to send it at something in custom aggro mode, the target has to be its enemy (a wall goes on the players' side with f.modifyEntityFaction first) and the order has to come a moment after it appears, not in its own whenEntityIsCreated. Returns the new prefabId and a new .gil in the workspace; the official save is not touched.
| Name | Required | Description | Default |
|---|---|---|---|
| drop | No | ||
| name | No | ||
| asset | No | ||
| scale | No | ||
| health | No | ||
| mapPath | No | ||
| fromEntity | No | ||
| outputName | No | ||
| presetStatusId | No | ||
| presetStatusValue | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare destructiveHint=true and readOnlyHint=false; the description adds the crucial scope caveat that work happens 'in a copy of a save' and 'the official save is not touched', plus the return contract (new prefabId and a new .gil in the workspace) and playtest-verification notes. It does not say why the operation is destructive (existing prefab overwrite? workspace file replacement?), so it stops short of fully covering the destructive hint.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The purpose is front-loaded, but the body is a single sprawling run-on riddled with nested parentheses and digressions (the target dummy's 300 health, verification dates). Most facts are substantive, yet the density and lack of segmentation make it hard to scan for the one branch an agent needs.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a 10-parameter, zero-coverage, no-output-schema tool, it covers the mechanism/preset system, health semantics, drop semantics, the return shape and playtest-validation loop. What is missing is any statement of what happens when neither asset nor fromEntity is given, and the roles of name, mapPath and outputName.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, so the description must carry all meaning — and it does for asset, scale (number or [x,y,z], 1 = natural size, defaults to entity scale with fromEntity), fromEntity, health (with concrete damage examples), presetStatusId/presetStatusValue, and the nested drop object (item, amount, pickupSize). However name, mapPath and outputName are never mentioned, leaving three of ten parameters unexplained anywhere.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Opens with a specific verb and resource: making a prefab (元件) in a copy of the save so a node graph can instantiate it at run time. It is clearly distinguishable from scene_list_prefabs, scene_update_prefab and scene_import_assets, and even explains the alternative in-graph route (f.createPrefab with a bare asset id).
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly routes between the two creation paths — 'asset (an object asset id or unique name from scene_search_assets)' versus 'fromEntity (the name of something already placed, from scene_list_entities)' — and gives the concrete creature-prefab recipe (place with createAtStart false, import, then prefab from it). It also flags when health matters (needs a hurtBox) and when drop applies (loot component).
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
scene_add_preset_pointADestructive
Add a named preset point (预设点) to a copy of a save: a position and a rotation a graph reads by id with f.queryPresetPointPositionRotation(pointId), so that places (a waiting room, the arena, where the boss appears) live in the map and not as numbers inside graphs. Returns pointId. Writes a new .gil in the workspace; the official save is not touched. Verified in play on 2026-10-10.
| Name | Required | Description | Default |
|---|---|---|---|
| name | Yes | ||
| mapPath | No | ||
| position | Yes | ||
| rotation | No | ||
| outputName | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations only declare that this is a write with destructiveHint=true; the description adds the critical qualifier that it writes a new .gil into the workspace and leaves the official save untouched, which materially changes the agent's risk assessment. It also discloses the return value (pointId) and provenance ('Verified in play on 2026-10-10'). Not a 5 because the size/limits of the new file and overwrite behavior for an existing preset name are unstated.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the action and resource, then the motivation, then the side effect and return value—a sensible ordering. The single very long sentence with embedded parentheticals and Chinese gloss makes it denser than necessary, but nothing is padding.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
It covers purpose, side effect, and return value, which is most of what a 5-parameter mutation without an output schema needs. The gap is that two of five parameters (mapPath, outputName) are left entirely to a bare schema with no descriptions, so an agent cannot confidently supply them.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0% across 5 parameters, so the description must carry the semantic load. It clarifies name, position, and rotation (and their role in graph lookups) but says nothing about mapPath or outputName, which are exactly the parameters an agent would guess wrong on.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Add a named preset point ... to a copy of a save') and immediately explains what that resource is: a position and rotation readable by graphs via f.queryPresetPointPositionRotation(pointId). This is concrete enough to separate it from scene_list_preset_points or scene_set_spawn without opening a schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives a clear rationale for when to use it ('so that places ... live in the map and not as numbers inside graphs'), which tells the agent the design intent behind choosing this tool. It does not explicitly name an alternative or a when-not-to-use case, so it falls short of a 5.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
scene_add_progress_barADestructive
Put a bar on the player's screen that follows one of the player's custom variables, in a copy of a save: a purse, a countdown, the health of the thing to defend, progress towards a goal. It is the way to show a number to the player on an account whose 奇匠 level is 1, where text boxes show nothing in play (measured) but bars do, with the fill and a percentage, or with the number itself (shows "value"). variable is an integer custom variable of the player (made with start value min if the player template does not have it); min and max are the ends of the bar. position is [x, y] from the screen centre on a 1600 x 900 canvas with y up (top centre is about [0, 380], top left [-600, 380]); size is [width, height]. A graph moves the bar with f.setCustomVariable(player, variable, value, true). How it looks: shape "horizontal" (as it comes), "vertical" or "ring" (a circle that fills clockwise from the top: a cooldown, a charge); shows "percent" (as it comes), "value" (the number itself: 7 coins read as 7, on an account of 奇匠 level 1 too, since the bar writes it, not a text box), "ratio" or "nothing" (a clean bar); colour of the fill and backColour behind it ("#rrggbb", backOpacity 0.5 unless said), textColour, fontSize. hidden true leaves the bar off the screen until a graph switches it on with f.modifyUiControlStatusWithinTheInterfaceLayout(player, controlId, UIControlGroupStatus.On). The style fields were read from three bars restyled by hand in the editor on 2026-10-13 and seen in play that morning (examples/images/images_lives.json): a red bar reading 6.0, a blue ring filled to six tenths, an upright bar reading 6.0 / 10.0, and a picture that came on when the graph switched it on. Writes a new .gil in the workspace; the official save is not touched.
| Name | Required | Description | Default |
|---|---|---|---|
| max | Yes | ||
| min | No | ||
| name | Yes | ||
| size | No | ||
| shape | No | ||
| shows | No | ||
| colour | No | ||
| hidden | No | ||
| mapPath | No | ||
| fontSize | No | ||
| position | No | ||
| variable | Yes | ||
| backColour | No | ||
| outputName | No | ||
| textColour | No | ||
| backOpacity | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Adds real context beyond the annotations: it clarifies that a new .gil is written to the workspace and the official save is not touched, which bounds the scary destructiveHint=true. It also discloses the hidden-until-switched-on lifecycle and names the runtime calls (f.setCustomVariable, f.modifyUiControlStatusWithinTheInterfaceLayout) needed to drive or reveal the bar. It does not say what happens if outputName collides with an existing file.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The core purpose is front-loaded, which is good, but the body is a dense run-on with stacked parentheticals ('(measured)', '(shows "value")') and provenance trivia about bars restyled on 2026-10-13 and an examples/images file that adds little for an agent. It is informative but hard to scan, and the style guidance could be bulleted or trimmed.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a 16-parameter, no-output-schema tool, the description covers behaviour, coordinate conventions, enum semantics and side effects well enough to call it correctly. Gaps remain around name/outputName/mapPath and around what the call returns or where the .gil lands, which matter because outputName looks like it controls the artifact name.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
With 0% schema description coverage across 16 parameters, the description carries the load well: it explains variable (integer custom variable, auto-created with start value min), min/max, the position coordinate system with concrete examples, size, all three shape values, all four shows values, colour/backColour/textColour/fontSize and the backOpacity 0.5 default. It leaves name, mapPath and outputName (the file-naming parameter) completely unexplained.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The opening sentence gives a concrete verb and resource — 'Put a bar on the player's screen that follows one of the player's custom variables, in a copy of a save' — and lists concrete uses (purse, countdown, health of the thing to defend). It implicitly separates itself from scene_add_text_box by explaining that text boxes render nothing in play on level-1 accounts while bars do.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It states a clear triggering condition: use this when you need to show a number to the player on an account whose 奇匠 level is 1, where text boxes show nothing. The alternative (text boxes) is named by contrast, though no explicit 'do not use when…' exclusion or reference to sibling tools like scene_add_text_box is given.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
scene_add_respawn_pointBDestructive
Add a respawn point (复苏点) in a copy of a save: where a character that went down comes back. The platform has the whole of dying and coming back built in: when a character's health reaches 0 its player gets the revive screen (wait, then 复苏) and the character returns at a respawn point of that player; a character that falls out of the world is put back at once and loses part of its health. Without a respawn point there is nowhere to come back to. Give position (and rotation; a preset point is made there) or point (the id or name of a preset point that exists). The point is added to the level settings and to the list of the player template. A graph makes points usable or not while the game runs, which is how checkpoints are made: f.activateRevivePoint(player, respawnId) for the one just reached, f.deactivateRevivePoint(player, respawnId) for the one before. Lives are f.setPlayerRemainingRevives(player, n); f.setPlayerReviveTime(player, seconds) sets the wait; f.reviveCharacter(character) revives at once; f.allowForbidPlayerToRevive(player, false) ends it; whenTheCharacterIsDown, whenCharacterRevives and whenAllPlayerSCharactersAreDown tell a graph what happened. The records are those of the official samples (角色设置, 基础运动), byte for byte; verified in play on 2026-10-13 (examples/hazards).
| Name | Required | Description | Default |
|---|---|---|---|
| name | No | ||
| point | No | ||
| mapPath | No | ||
| position | No | ||
| rotation | No | ||
| outputName | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description adds substantial behavioral context beyond the annotations: the revive flow, falling out of the world, addition to level settings and the player template list, and graph-controlled activation/deactivation. It does not explicitly describe overwrite behavior, reversibility, or permission requirements, but the destructiveHint=true annotation already flags mutation risk.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The purpose is front-loaded, but the description is overlong and includes extensive game-system detail and API function names that are not necessary for invoking this specific tool. Much of the latter half does not earn its place in a tool description.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The description provides rich domain context for a complex mutation tool and covers the core revive behavior. However, with six undocumented parameters, no output schema, and only broad annotations, it still omits important invocation details such as mapPath, outputName, name semantics, and explicit sibling alternatives.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, so the description must carry parameter meaning. It explains position, rotation, and point (id or name of a preset point), but it leaves name, mapPath, and outputName undocumented, even though the schema has six parameters.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb and resource: 'Add a respawn point (复苏点) in a copy of a save: where a character that went down comes back.' It clarifies the point's gameplay role and distinguishes position-based vs preset-point-based creation, but it does not explicitly differentiate the tool from siblings such as scene_add_preset_point or scene_set_revive.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Usage is implied by 'Without a respawn point there is nowhere to come back to' and by the instruction to provide either position/rotation or point. However, there is no explicit guidance on when to use this tool instead of related siblings like scene_add_preset_point, scene_set_spawn, or scene_set_revive, and no when-not guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
scene_add_shopADestructive
Make a prefab a shop (商店) in a copy of a save: the platform's own buying and selling screen, which moves items and currency between the shop and the backpack of the character without any graph. sell lists what the shop sells to the player, buy what it buys from the player; each line is {item, currency, price} with the item and the currency by name or id (scene_add_item, scene_add_currency), and a line of sell may give stock (how many the shop has; 1 when left out, as in the official lesson). prefab is the stall, a prefab from scene_add_prefab. A graph opens the shop for a player with f.openShop(player, the stall entity, 1), in the official lesson when a character enters the stall's collision trigger, and f.closeShop(player) closes it; whenCustomShopItemIsSold (the shop sold something) and whenSellingItemsToTheShop (the player sold something) fire in a graph on the stall. The shop template and the shop component written are byte for byte those of the official sample 货币与商店 (which has one line in each list). Verified in play on 2026-10-11 (examples/shop): the screen shows the shelf on the left with each line's icon, stock and price, and the backpack on the right; a click on a line and on 购买 buys (the currency goes down, the item goes into the backpack, a sold-out line is marked 已售罄); 批量出售, a click on an item of the backpack and 出售 sells at the price of the buy list, not at the item's value. It works on an account of 奇匠 level 1. To play it by script, playtest_start takes click and clickText inputs. Writes a new .gil in the workspace; the official save is not touched.
| Name | Required | Description | Default |
|---|---|---|---|
| buy | No | ||
| name | Yes | ||
| sell | No | ||
| prefab | Yes | ||
| mapPath | No | ||
| outputName | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Beyond the annotations, the description discloses that it writes a new .gil in the workspace and leaves the official save untouched, which is important for a destructiveHint=true tool. It also describes runtime behavior, events fired in graphs, and what was verified in playtest, giving the agent substantial behavioral context.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is front-loaded with the core purpose and contains useful detail, but it is a single dense paragraph with extended playtest and UI verification notes. Those details add transparency, but the lack of structure and some repetition make it less concise than it could be.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a complex shop-creation tool with nested buy/sell arrays, no output schema, and destructive annotations, the description is largely complete: it explains the write effect, events, graph integration, and playtest behavior. The main remaining gap is that mapPath and outputName are not described, which leaves some operational context unspecified.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
With schema description coverage at 0%, the description compensates for some parameters: it explains sell and buy line structure {item, currency, price}, name-or-id item/currency references, the optional stock field defaulting to 1, and that prefab is a stall prefab from scene_add_prefab. However, it does not explain the name, mapPath, or outputName parameters, so parameter semantics remain incomplete.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description uses a specific verb and resource: make a prefab a shop that provides the platform's buying/selling screen. It distinguishes the tool from data-creation siblings by explaining that the shop moves items and currency without a graph, and it names related tools such as scene_add_item, scene_add_currency, and scene_add_prefab.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description explains how sell and buy lists are used, what prefab should be, and how a graph opens the shop with f.openShop and closes it with f.closeShop. It gives clear usage context but does not explicitly state when not to use this tool or name a direct alternative for the same outcome.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
scene_add_signalADestructive
Define a signal (信号) in a copy of a save: a level-wide broadcast with a name. One graph sends it with f.sendSignal('name') and any number of graphs on any entities hear it with .onSignal('name', (evt, f) => {...}). It is the platform's way to let one thing tell many without knowing them: night falls and the lamps, the gates and the enemies each react in their own graph. parameter gives the signal one string to carry (its name; the sender passes the string as second argument of f.sendSignal, the listeners read it from the event): which lever, which team. parameters gives it several values of any of the eighteen types the editor offers, [{name, type}] with type one of integer, float, boolean, string, vector3, entity, guid, prefabId, configId or a list of one of them (integerList ...): a score as an integer, where something happened as a vector3, who did it as an entity. The answer says how graphs and client scripts send and read them (defineSignal in a graph, AddInt and the like in Lua). The same signal reaches the client scripts (Lua) of one player when a graph sends it as f.sendSignal('client:name', player) (and the string after the player when it carries one): that is the node 发送客户端脚本信号 of game 7.1, which the compiler does not know and this server puts in when it writes the graph; a script hears it with script:RegisterServerSignalHandler("name", function(name, params) ... end). A name cannot begin with "client:". Writes a new .gil in the workspace; the official save is not touched. Verified in play on 2026-10-10, without and with a parameter; to client scripts on 2026-10-13 (example clientsignal).
| Name | Required | Description | Default |
|---|---|---|---|
| name | Yes | ||
| mapPath | No | ||
| parameter | No | ||
| outputName | No | ||
| parameters | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already flag destructiveHint=true and readOnlyHint=false; the description adds real value on top by stating 'Writes a new .gil in the workspace; the official save is not touched', by disclosing the 'client:' name prefix restriction, and by explaining the compiler-unknown client-signal node the server injects. It does not say what happens if a signal with the same name already exists (overwrite vs duplicate), which matters for a destructive write.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
It is front-loaded with the purpose, which is good, but the body is a dense run-on with parenthetical glosses in three scripts and at least one awkward sentence ('The answer says how graphs and client scripts send and read them...'). Substantive information is present, but the signal-to-noise ratio is mediocre.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a mutating, no-output-schema tool this covers the conceptual model, the client-script path, and the write target, which is substantial. However it leaves mapPath/outputName undefined and never addresses overwrite behavior or what a caller gets back beyond the vague 'The answer says how graphs and client scripts send and read them'.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 0%, so the description must carry the load, and it does well for three of five parameters: name (including the 'client:' constraint absent from the schema), parameter (single string with sender/listener mechanics), and parameters (the {name,type} shape and the eighteen types). mapPath and outputName are never mentioned, leaving the file-selection and output-naming parameters undocumented anywhere.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description gives a specific verb and resource ('Define a signal (信号) in a copy of a save') and explains conceptually what a signal is: a named, level-wide broadcast. That makes it unmistakable versus other scene_add_* tools. It does not explicitly differentiate from the sibling scene_list_signals, but the create-vs-list split is implicit.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The night/lamps/gates/enemies example conveys exactly when a signal is the right mechanism (one sender, many unknown listeners), which is strong contextual guidance. There are no explicit exclusions or named alternatives, and no statement about when to prefer a direct reference instead.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
scene_add_skillADestructive
Define a skill (技能) in a copy of a save: the platform's way for a player to act beyond walking and the "press F" prompt. A key press runs the skill's client graph, which tells the server, and a server graph on the character does the work. Two types are made. "instant" (瞬发技能, the default): no animation, the graph runs the moment the key is pressed. "normal" (普通技能): the character plays one animation (animation = its id: 1001 one-handed sword attack, 1006 raking the ground, 1023 watering, 1025 reaching out a hand; these are the ones the official samples use) and the graph runs at the start of it or graphAtMs milliseconds in (a sword swing that hits when the blade comes down); animationPortion is the number the editor stores for the clip (1 in most samples; the three tools of the farming sample have 0.167, 0.96 and 0.25); effect shows an effect asset at an attach point of the character for some milliseconds of the animation (the official attack skills show the sword 10002152 at "GI_WeaponR" for 1833 ms). The long-press, combo and aiming types, cooldowns and use counts are not made. To make the skill hit things, its client graph triggers a hit box, f.triggerSectorHitboxAtSpecificLocation(...) at the character's own place and rotation: read_knowledge {id:"example-strike"} has the call with the values of the official attack (a sector 3 m long, 50 damage, once per target); it damages creatures, and objects that have a hurtBox (scene_add_components). graphId is a client skill graph made first with scene_add_graph {kind: "characterSkill"}; its source is g.characterSkill({id, name, prefix:false}).on('start',(evt,f)=>{f.notifyServerNodeGraph('word','','');}) (a client graph cannot create or change things). A server graph hands the skill to a character at run time, f.addCharacterSkill(character, skillId, CharacterSkillSlot.Skill1E, TopOfStackSkillDestructionType.Destroy): slots are NormalAttack (the attack button), Skill1E, Skill2Q, Skill3R, Skill4T and CustomSkillSlot1 to 15; f.deleteCharacterSkillBySlot takes it away. A server graph on the character template (scene_add_graph attachToPrefab "character") hears whenSkillNodeIsCalled with evt.callerEntity and evt.parameter1 to 3. The records written are byte for byte those of the official samples: the instant skill 放下工具 and the normal skill 耙子-开垦 of 耕种-采集流程, and the timed attack with a sword of 命中与受击. Writes a new .gil in the workspace; the official save is not touched. Verified in play: the instant type on 2026-10-10 (given on the E key, pressed, heard by the character graph); the normal type on 2026-10-11 (examples/skills: the three animations play, the sword shows in the hand, each graph reaches the server; the sword attack carries the character 0.65 m forward and the raking 0.55 m). A skill has no cooldown of its own here; a graph gives it one: when the skill has been used (whenSkillNodeIsCalled on the character's graph), f.setCharacterSkillCd(character, CharacterSkillSlot.Skill1E, seconds, false) makes the slot wait that long, and a press during the wait is refused (verified in play on 2026-10-12, examples/skills/skills_cd_test.json; with the last argument true nothing happens, because the skill has no longest cooldown to be held to). Slots on a PC: Skill1E the E key, Skill2Q Q, Skill3R R, Skill4T the Z key (not T).
| Name | Required | Description | Default |
|---|---|---|---|
| name | Yes | ||
| type | No | instant | |
| effect | No | ||
| graphId | Yes | ||
| mapPath | No | ||
| animation | No | ||
| graphAtMs | No | ||
| outputName | No | ||
| animationPortion | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With annotations marking this as destructive and non-read-only, the description adds critical context: it writes a new .gil in the workspace and does not touch the official save. It also discloses client/server graph behavior, slot assignment, animation behavior, effect display, and cooldown mechanics with verified examples.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The purpose is front-loaded, but the description is a very long single block dense with sample names, exact dates, slot key mappings, and verification details. Much of it is useful for a complex tool, but it exceeds what is needed for concise selection and invocation.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a complex 9-parameter mutation tool with no output schema, the description covers the creation flow, graph requirements, hit-box integration, server-side skill assignment, cooldown behavior, and output artifact. An agent has enough information to call it correctly and understand its side effects.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, so the description must carry parameter meaning; it explains type, graphId, animation, graphAtMs, animationPortion, and the nested effect fields with concrete examples. It leaves mapPath, outputName, and name semantics largely unexplained, so it does not fully compensate for the coverage gap.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with a specific verb and resource: 'Define a skill (技能) in a copy of a save.' It also scopes the tool to player/character skills, distinguishing it conceptually from creature-skill siblings even though it does not name them directly.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It explains the two supported skill types and explicitly excludes long-press, combo, aiming, cooldowns, and use counts. It also states the prerequisite that graphId must be a client skill graph made first with scene_add_graph. It does not explicitly name when to use this versus scene_add_creature_skill or scene_list_skills.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
scene_add_text_boxADestructive
Put a text box (文本框) on the screen, in a copy of a save: words, numbers that follow custom variables, or both. A variable is written into the text as {1:ps.name} for a custom variable of the player who sees it, {1:lv.name} for one of the stage entity, {1:p1.name} to {1:p8.name} for one of that player: "金币:{1:ps.coins}" shows the number as a graph changes it. position is [x, y] from the screen centre on a 1600 x 900 canvas (y up), size [width, height], fontSize the size of the letters. IMPORTANT: custom text is shown only on accounts whose 奇匠 level is 2 or higher (seen in play on level 2, 2026-10-13: the number follows the variable); on a level 1 account the box is there and shows nothing (measured with the official sample itself). Before a game relies on text, put one box in and look at a playtest screenshot; if nothing shows, say what has to be said without words (scene_add_progress_bar, markers, effects: read_knowledge {id: "feedback.zh-CN"}). The three records are byte for byte those of the official sample 界面控件.
| Name | Required | Description | Default |
|---|---|---|---|
| name | Yes | ||
| size | No | ||
| text | Yes | ||
| mapPath | No | ||
| fontSize | No | ||
| position | No | ||
| outputName | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Discloses a significant non-obvious behavioral trait: text only renders on accounts with 奇匠 level 2+, and level-1 accounts show an empty box. Annotations already flag readOnly=false/destructive=true, and 'in a copy of a save' hints at the save-copy scope, though it doesn't spell out what the destruction entails.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The variable-format and level-gating details are valuable, but the prose is rambling with run-on sentences, embedded Chinese, and parentheticals (e.g. the 2026-10-13 measurement note) that dilute the front-loaded core instruction.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a 7-param mutation tool with no output schema, it covers the critical rendering and coordinate semantics well, but omits what name/mapPath/outputName do and what 'a copy of a save' implies for side effects, leaving gaps an agent would need filled on first invocation.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
With 0% schema coverage, the description carries the full burden and delivers on the hardest params: variable syntax for text, position as [x,y] from screen centre on a 1600x900 y-up canvas, size as [width,height], and fontSize. It leaves name, mapPath, and outputName undocumented, so it doesn't fully compensate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb+resource ('Put a text box on the screen') and explains the content it can carry (words, numbers following custom variables). It's clear what it does, though it doesn't explicitly differentiate itself from the sibling scene_add_progress_bar except as a fallback when text fails to render.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives concrete usage context: test one box before relying on text, and if nothing shows, use scene_add_progress_bar, markers, or effects instead. No explicit 'when not to use' beyond the level-2 caveat, but the conditional guidance is actionable.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
scene_add_timer_displayADestructive
Put a clock on the player's screen that shows a global timer (made with scene_add_global_timer) running, in a copy of a save. It shows digits, not custom text, so it is a way to show time left on an account whose 奇匠 level is 1. position is [x, y] from the screen centre on a 1600 x 900 canvas with y up; size is [width, height]. Writes a new .gil in the workspace; the official save is not touched. Verified in play on 2026-10-10.
| Name | Required | Description | Default |
|---|---|---|---|
| name | Yes | ||
| size | No | ||
| timer | Yes | ||
| mapPath | No | ||
| position | No | ||
| outputName | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint false and destructiveHint true. The description adds meaningful behavior: it writes a new .gil in the workspace and does not touch the official save, plus coordinate-system details and a verification note. It does not clarify overwrite behavior for outputName, but it substantially supplements the annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The purpose is front-loaded in the first clause, and the paragraph is compact. The closing verification sentence is minor metadata but does not significantly hurt readability.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a write tool with six parameters and no output schema, the description covers the core action and file-output safety, but it omits enough parameter detail (especially timer, mapPath, and outputName) that an agent would still need to inspect the schema and may misunderstand how to call it correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0% and there are six parameters. The description explains position ([x, y] from screen centre, 1600x900 canvas with y up) and size ([width, height]), but leaves name, timer, mapPath, and outputName undocumented, including the required timer parameter.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource: 'Put a clock on the player's screen that shows a global timer'. It explicitly ties itself to the sibling tool scene_add_global_timer and distinguishes itself from custom-text displays, so an agent can identify its role without opening the schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It implies a use case ('a way to show time left on an account whose 奇匠 level is 1') and notes a limitation ('shows digits, not custom text'), but it never says when not to use it or points to alternatives like scene_add_text_box or scene_add_progress_bar.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
scene_add_unit_statusADestructive
Define a unit status (单位状态) in a copy of a save: an effect that a graph puts on an entity and takes off again. outline draws a coloured edge around the entity, the platform's usual way to say "you can interact with this" or to mark a team, and it needs no text; seeThrough shows the entity through walls in a colour; maxHealth raises maximum health by a number per stack. Colours: green or white (or a colour code of the editor as a number; only those two are mapped). The status lasts until it is removed. Returns statusId for f.addUnitStatus / f.removeUnitStatus. Writes a new .gil in the workspace; the official save is not touched. Verified in play on 2026-10-10: a green outline on an object and a white one on a character, put on with f.addUnitStatus(character that walked in, target, statusId, 1n, dictionary) and taken off with f.removeUnitStatus (the applier, the first argument, is the character, as in the official sample). More effects, which may be combined in one status: speedPercent (movement speed of a character or a creature, a whole percentage up to +40, which is as far as the editor goes; negative slows), invincible true (takes no damage and does not hear attacks), superJump [horizontal, vertical] (the multipliers of a character's jump: [1.5, 2] jumps half again as far and twice as high), rooted true (the player's character cannot be moved with the keys: a stun, a trap). These are what pickups and hazards are made of: a boot that speeds up for some seconds, a star that makes invincible, tar that slows, a snare that holds. seconds makes the status end by itself after that long (left out it stays until a graph removes it). The effect ids were read from a status configured by hand in the editor on 2026-10-13. Verified in play that day (examples/hazards): after a pickup of speedPercent 40 the player covered 9.4 m in the next 1.2 s (5.2 m/s without), one of rooted with seconds 2 held the player on the spot for two seconds with the movement key down; with invincible on, an attack of 2000 that had taken a thousand health a moment before took none; with superJump [1, 2.5] a jump on the spot rose three metres (hazards_test2.json).
| Name | Required | Description | Default |
|---|---|---|---|
| name | Yes | ||
| rooted | No | ||
| mapPath | No | ||
| outline | No | ||
| seconds | No | ||
| maxHealth | No | ||
| superJump | No | ||
| invincible | No | ||
| outputName | No | ||
| seeThrough | No | ||
| stackLimit | No | ||
| speedPercent | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Adds substantial context beyond the annotations: it writes a new .gil in the workspace while leaving the official save untouched, the status lasts until removed unless seconds is set, and it returns statusId for use with add/removeUnitStatus. Play-verified numbers (9.4 m in 1.2 s at speedPercent 40, two-second root, 2000 damage absorbed) give the agent concrete behavioural expectations the annotations cannot convey.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the core definition, which is good, but the body sprawls into dated verification anecdotes and exact metrics that dilute the essential parameter guidance. It is informative but over-long for a tool description; several sentences could be compressed without loss.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a 12-parameter mutating tool with no output schema, the description covers purpose, side effects, runtime return value, effect semantics and duration behaviour thoroughly. The gaps are the three unmention ed structural parameters (mapPath, outputName, stackLimit), which an agent must infer from the schema alone.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 0%, so the description must carry the load, and it explains most parameters well: outline/seeThrough colour semantics and the unmapped-code caveat, maxHealth per-stack, speedPercent's +40 editor ceiling and negative slowdown, invincible, superJump [horizontal, vertical], rooted, and seconds. It leaves stackLimit, mapPath and outputName unexplained, so not a 5.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Define a unit status (单位状态) in a copy of a save: an effect that a graph puts on an entity and takes off again'), immediately distinguishing it from listing tools like scene_list_unit_statuses. The conceptual framing of what a status is makes the resource unambiguous.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives clear usage context ('what pickups and hazards are made of: a boot that speeds up, a star that makes invincible, tar that slows, a snare that holds') and the runtime pairing (f.addUnitStatus / f.removeUnitStatus). It stops short of explicit when-not-to-use guidance or naming a sibling alternative, so it lands at 4 rather than 5.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
scene_asset_imagesARead-only
Look at assets before placing them: returns a small photo of each asset id (from scene_search_assets), with its name, group and model size. Use it to choose between assets that share a name (there are dozens of different 乔木) or to check what an unfamiliar asset is. The photos show every asset scaled to a similar size, so judge the look from the photo and the real size from sizeMetres. Assets that could not be photographed are reported as having no image. Read-only.
| Name | Required | Description | Default |
|---|---|---|---|
| ids | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare read-only/non-destructive, and the description's 'Read-only' merely restates that. It adds real value beyond the annotations: photos are normalized to a similar scale, so visual look and true sizeMetres must be judged separately, and failed captures are reported as having no image. It doesn't say how images are delivered (inline/base64 vs. reference), a minor gap.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Four tight sentences ordered by importance: what it returns, when to use it, how to interpret the photos, and the failure case. No filler; the only redundancy is the trailing 'Read-only' already covered by annotations.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a single-parameter tool with no output schema, the description covers return fields, interpretation guidance, and the missing-image edge case. What's absent is the 12-id batch limit and the image transport mechanism, both of which matter when actually invoking it.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 0%, so the description must compensate: it does explain that ids are asset ids from scene_search_assets and that each is echoed back with name/group/size. However, it omits the schema's hard constraints (1–12 items, positive integers), which an agent could violate when batching a long result list.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a concrete verb and resource ('returns a small photo of each asset id') and names its upstream sibling scene_search_assets, which is exactly how an agent would obtain the ids. It is clearly distinguishable from catalog/search siblings like scene_search_assets and image_catalog.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives explicit selection scenarios: disambiguating assets that share a name (the 'dozens of 乔木' example) and inspecting unfamiliar assets, plus the precondition that ids come from scene_search_assets. An agent knows both when to call it and what input to feed it.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
scene_batchADestructive
Run a list of scene_* tool calls in one call, each on the save the one before returned: steps is [{tool, args}], args as that tool takes them without mapPath. A value of an earlier step is named as "$.", counting from 0: {tool: "scene_add_skill", args: {name: "swing", graphId: "$3.graphId", type: "normal", animation: 1001}} takes the graphId step 3 returned. It stops at the first step that fails and says which and why; mapPath is then the save with the steps before it done, and the call can be repeated on it with the rest. Returns the last mapPath and, for every step, what it returned without the explanations (ids, names, sizes). For the tools that change a save: scene_add_*, scene_set_*, scene_update_prefab, scene_remove_entities. Not for the ones that drive the editor (scene_import_assets, editor_open_map), the ones that only read, or write_graphs (which already takes all graphs in one call).
| Name | Required | Description | Default |
|---|---|---|---|
| steps | Yes | ||
| mapPath | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations only say destructive/not read-only; the description adds the failure model (stops at first failing step and reports which and why), the resumability contract (mapPath holds the partially-applied save and can be re-run with the remaining steps), and the return shape. This is exactly the context annotations cannot carry for a destructive batch operation.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the core action, then reference syntax, then failure semantics, then scope. The inline example and sibling lists are dense but each earns its place by removing ambiguity that would otherwise cause malformed calls.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
No output schema, but the description specifies returns (the last mapPath plus each step's returned fields minus explanations). Combined with the failure and resumption rules, an agent has everything needed to invoke, chain, and recover correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 0%, so the description carries the full burden and does: steps is [{tool, args}] with args as the target tool accepts them minus mapPath, plus the "$<step>.<field>" cross-step reference syntax with a worked example and zero-based indexing. It also explains mapPath's resumption role, which the schema only types as a string.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb+resource: run a list of scene_* tool calls in one call, chaining each on the save the previous returned. It names precisely which sibling tools it wraps (scene_add_*, scene_set_*, scene_update_prefab, scene_remove_entities), so it cannot be confused with any single scene_* tool.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly enumerates when to use it (the save-mutating tools), when not to (read-only tools, editor drivers like scene_import_assets and editor_open_map), and calls out an alternative for graph writes (write_graphs, which already batches). Both inclusion and exclusion criteria are stated.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
scene_block_catalogARead-only
List the building blocks scene_build_blocks can place: name, template ID, approximate colour and native size. Read this before designing a scene.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnly/closed-world/non-destructive, so the safety profile is covered. The description adds value by disclosing the shape of the result — the four fields and that colour is only approximate and size is native — which matters when an agent previews layout before building.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two short sentences: the first states contents, the second states the action to take. The 'read this before' directive is appropriately placed at the end as the call-to-action, with zero filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema, the description correctly compensates by naming the returned fields and their approximate nature. It could go slightly further (e.g. whether the template IDs are the exact values scene_build_blocks expects, and whether the catalog is static or map-dependent), but an agent has enough to call it correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The tool takes zero parameters, so there is nothing to disambiguate beyond the schema's empty object; baseline for a 0-param tool is 4. No parameter guidance is needed or missing.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Specific verb (List) plus specific resource (building blocks placeable by scene_build_blocks), and it enumerates the exact fields returned: name, template ID, approximate colour, native size. It also implicitly separates itself from the other catalog siblings (image_catalog, effect_catalog, sound_catalog) by naming the consuming tool.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
'Read this before designing a scene' gives a clear trigger and names the downstream tool (scene_build_blocks) whose inputs come from here. There is no explicit exclusion (e.g. when to prefer image_catalog or scene_search_assets instead), so it stops short of full when/when-not guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
scene_build_blocksADestructive
Turn a list of pieces into an official asset pack (.gia) and put it in the editor’s import folder. template is a block name from scene_block_catalog or any asset id from scene_search_assets. position is in metres; rotation in degrees per axis. Give size (metres per axis: the piece is stretched to exactly that; blocks default to 1,1,1) or scale (1 = the model’s own size, the default for non-block assets). For blocks position is the centre in x and z and the bottom in y (measured in play: a block at y 0.5 and 1 high has its top at 1.5); other models are anchored at their base. Monsters (group 怪物) are imported alive with their official AI parameters. createAtStart:false places a piece without creating it, so a node graph can create it later by GUID (the editor assigns new GUIDs on import; read them from the save). patrol (monsters only) makes the creature walk a path that already exists in the map while it has no target: templates:[{pathId,waypointIds}] with ids from inspect_level_paths; since the game update of 2026-10-09 the importer drops the template list, so a patrol written here does not reach the game: steer creatures with custom aggro instead. offset [x, y, z] is added to every position: the same list of pieces on ground of another height (a new empty save has its ground at y=0) or as a second copy elsewhere. Returns the pack’s bounds. Nothing changes in the game until scene_import_assets runs. solid false switches the native collision (原生碰撞) of a piece off, for a thing that is to be walked through; left out it is on. A character walks over low things by itself (a fence of 1.56 m, with jumping allowed and no key pressed, 2026-10-12): what keeps a player in is a wall of at least 2.4 m and a class that may not climb.
| Name | Required | Description | Default |
|---|---|---|---|
| name | Yes | ||
| blocks | Yes | ||
| offset | No | ||
| install | No | ||
| entityIdStart | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Goes far beyond the annotations: createAtStart:false defers creation to a node graph by GUID, the editor reassigns GUIDs on import, solid:false disables native collision, and patrol is flagged as non-functional since the 2026-10-09 importer change. This is exactly the mutation-side context an agent needs on a destructiveHint=true tool.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Purpose and core parameters are front-loaded, but the text sprawls into a semi-colon chain and ends on a tangent about a 1.56 m fence and a 2.4 m wall that is level-design lore rather than tool semantics. Those sentences do not earn their place in a tool definition.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a 5-parameter, nested-array mutation tool with no output schema, the description does the heavy lifting and even promises a return value ('the pack's bounds'). The gaps are the unexplained `install` and `entityIdStart` parameters, which an agent cannot infer from the schema alone.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
With 0% schema coverage the description carries the load, and it does well: units for position/rotation, the size-vs-scale distinction, the anchor-point difference between blocks and other models, and offset semantics are all explained. However `name`, `install`, and `entityIdStart` get no mention at all, so coverage is incomplete.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Opens with a concrete verb and artifact: 'Turn a list of pieces into an official asset pack (.gia) and put it in the editor's import folder.' That is clearly distinguishable from the import sibling it later names, and the scope of the tool is unambiguous.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It explicitly routes template lookup to scene_block_catalog or scene_search_assets and states 'Nothing changes in the game until scene_import_assets runs', making the two-step pipeline clear. What is missing is an explicit statement of when NOT to use this (e.g. modifying an existing pack, or a single piece).
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
scene_check_clientARead-only
Check what the client scripts (Lua) of a save name against what there is, in a moment and without the game. On this platform a name that does not match is not an error: the control is not found, the signal is not heard, the variable reads nil, and nothing says so. This parses every script and looks up each name it writes as a literal: its syntax; the functions of game, the methods of script and every Enum value (the official API page); the controls it asks for (GetChild, FindChild) among the controls under the ones that carry it; the signals it sends and hears, among the signals of the save and the graphs that hear and send them, and the values it adds to a signal before sending it (AddInt, AddString ...) against what the signal carries, in order; the custom variables it reads, on the player and character templates; its own variables (GetParam); templates by index, pictures and sounds by id. Each problem comes with script, line, what is wrong and the nearest name there is. An error will not work; a warning may be on purpose (a signal no graph sends yet). scene_set_client_script, scene_add_client_ui and playtest_start run the same check on what they are given and report it; call this after the graphs are written, when everything is in the save. Read-only. It sees only literals: a name put together while the script runs is not checked, and neither is what the script does (the playtest is for that).
| Name | Required | Description | Default |
|---|---|---|---|
| mapPath | No | ||
| scripts | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint/openWorldHint/destructiveHint=false, and the description reinforces 'Read-only.' It adds genuinely non-obvious context: a missing name is not an error on this platform (silent nil/no-op), problems come back with script, line, issue and nearest-name suggestion, and errors vs warnings are distinguished (a signal no graph sends yet may be intentional). The one gap is that it never says what happens with the scripts parameter or how many results to expect.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The purpose and the 'what it checks' enumeration are front-loaded, which is good, but the middle is a long comma-chained catalogue and the opening clause ('Check what the client scripts (Lua) of a save name against what there is') is grammatically tangled. Most sentences earn their place, but the prose could be tightened considerably.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
No output schema exists, and the description compensates by explaining the shape of each reported problem and the error/warning distinction, plus the literal-only limitation. For a read-only diagnostic tool this is close to complete; the missing piece is parameter behavior (mapPath vs scripts scoping).
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0% and the two parameters (mapPath, scripts array up to 40 entries) are never explained in the description. 'the client scripts (Lua) of a save name' gestures vaguely at the target but does not say what mapPath is or what restricting via scripts does versus checking all scripts in the save.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource: statically checking a save's client Lua scripts against actual API names (syntax, game/script functions, Enum values, controls, signals, templates, assets). It also distinguishes itself from siblings that perform the same check on partial input (scene_set_client_script, scene_add_client_ui, playtest_start) and from playtest_start which covers runtime behavior.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicit sequencing guidance: 'call this after the graphs are written, when everything is in the save.' It names the sibling tools that already run the same check on partial input, and states the exclusion clearly: only literals are checked, runtime composition and behavior are the playtest's job.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
scene_get_client_uiARead-only
Read a client interface (ui: its name) or a template of client controls (template: its name) back out of a save, whole: every control with its kind, rectangle (and where it differs on a phone or a console), switches, text, picture and colour, grid layout, button states, the scripts on it and the values it gives their variables, where the stick of a gamepad goes. What comes back under interface (or template) is exactly what scene_add_client_ui (scene_add_client_template) takes, so changing an interface is: read it, change what is to change, write it with replace: true. An interface made by hand in the editor is read the same way (the saves configured by hand that the tests keep are read and written back byte for byte). ids gives the id of every control by its path. Read-only.
| Name | Required | Description | Default |
|---|---|---|---|
| ui | No | ||
| mapPath | No | ||
| template | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Beyond the readOnlyHint annotation, it describes the detailed output shape (controls, rectangles, scripts, variable values, etc.), that the output matches what the add tools expect, and that editor‑saved interfaces round‑trip byte‑for‑byte. It doesn't cover edge cases like missing ui/template, but adds substantial behavioral context.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The purpose is front‑loaded, but the description is a dense paragraph with a parenthetical about tests that doesn't help an agent decide or call the tool. It could be tightened and structured more clearly.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The output contents and workflow are well described, but the tool has three parameters with zero schema coverage; the absence of any mention of mapPath and the unclear 'ids' statement leave gaps for an agent trying to invoke it correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, so the description must compensate. It clarifies ui and template as the two alternative read modes, but completely omits the mapPath parameter, leaving one of three parameters with no semantic explanation.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb (Read) and resource (client interface / template of client controls), and scopes it as 'whole'. It explicitly links to the write counterparts (scene_add_client_ui, scene_add_client_template), making the read-vs-write distinction clear.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Provides a clear read‑modify‑write workflow ('read it, change what is to change, write it with replace: true') and notes that hand‑made editor interfaces are read the same way. It doesn't mention when to use this vs. scene_list_interface, but the context is strong.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
scene_get_level_settingsARead-only
Read the level settings of a map that decide how creatures choose targets: aggroMode (default or custom), the aggro transfer multiplier, and the hour and speed of the level clock. Without mapPath it reads the newest official save. Read-only.
| Name | Required | Description | Default |
|---|---|---|---|
| mapPath | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true and destructiveHint=false, so the description's 'Read-only' adds nothing. Where it does add value is the fallback behavior: without mapPath it silently resolves to the newest official save, which is non-obvious and would otherwise surprise an agent.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two compact sentences with no filler: the first front-loads what is read and which fields it returns, the second carries the default-path behavior and read-only note. Nothing could be cut without losing information.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
There is no output schema, so the description correctly compensates by naming the returned settings, and it covers the default resolution path. Only the mapPath value format is left unspecified, a minor gap given list_maps exists as a sibling.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 0%, so the description must carry the only parameter's meaning, and it does: mapPath is optional and defaulting to the newest official save is spelled out. It does not say what form a mapPath takes (absolute path, map name, or ID), which is the remaining gap.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource (read level settings) and enumerates exactly what is returned: aggroMode, aggro transfer multiplier, level clock hour and speed. This distinguishes it cleanly from the sibling scene_set_level_settings, which writes the same settings.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives one useful usage rule — omit mapPath to read the newest official save — which tells the agent when the parameter can be skipped. It does not explain when to prefer this tool over related inspection tools such as inspect_map, nor any exclusions, so guidance is implied rather than explicit.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
scene_import_assetsADestructive
Import asset packs built by scene_build_blocks into the save that is open in the editor, through the official 资产导入导出管理 screen, then save. Takes over mouse and keyboard for about 45 seconds. Returns a runId; read the outcome and an overview screenshot with playtest_status. Every import adds new entities, so importing a pack twice duplicates it.
| Name | Required | Description | Default |
|---|---|---|---|
| packs | Yes | ||
| overview | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations declare destructiveHint=true, and the description earns its keep by explaining why: every import adds new entities and importing twice duplicates content. It also discloses a significant operational trait not in the schema — roughly 45 seconds of exclusive mouse/keyboard control — and the async runId pattern.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Four short sentences, front-loaded with the action and destination, then the blocking cost, then the return contract, then the duplicate hazard. No filler and each sentence adds distinct operational information.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema, the description correctly explains the async return (runId) and where to read results. The remaining gap is the pack-name/limit constraint, which matters because a rejected import is silent until playtest_status is polled.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, so the description had room to compensate. It implies 'packs' is a list and that the overview screenshot is toggled by the overview flag, but it never mentions the 1–5 item limit or the pack-name pattern the schema enforces. Partial compensation only.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb (import), a specific resource (asset packs built by scene_build_blocks), and the destination (the save open in the editor) plus the UI path used. An agent can distinguish this from scene_build_blocks (producer) and scene_import_simulator without opening any schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It gives the precondition (packs must have been built by scene_build_blocks), the follow-up step (read outcome via playtest_status), and an explicit warning that re-importing a pack duplicates entities. It does not contrast against the nearest sibling, scene_import_simulator, so it stops short of full alternative routing.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
scene_import_simulatorADestructive
Bring a project of the 千星沙箱模拟器 (miliastra-beyond-simulator, the simulator outside the game for 2D + Lua levels) into a copy of a save, in one call, so that it can be played in the game itself: what passes in a simulator has not passed in the game. save is the simulator's full save (the .json it writes with 导出 → 完整存档; format "qxqy-simulator-save"). Everything it holds is written with the tools of this server: its Lua scripts (the text in the save, or the file beside it), its templates of client controls, its interface with the scripts on the controls that carried them, the rectangles of each device where they differ; the signals its scripts and its server rules name are defined, the variables its rules set are added to the player; and its server rules (when a signal comes from a script: set variables, send signals back) are written as the source of a node graph on the level entity and compiled. Template indices are the save's own after this, so every number in the Lua that was the index of a template in the simulator is put to the new index (only numbers of the Lua itself, never inside a string or a comment). The result says what was written, what could not be (notes: a look of a button the game has no state for, a parameter a rule reads and no script adds; the fill, soft edge and inverted mask of an image come over, and so do signals with several values, typed after what the scripts add), and what scene_check_client finds in the scripts against the finished save. Then playtest_start {mapPath} plays it. Reads the file format only; none of the simulator's code is used. Writes a new .gil in the workspace.
| Name | Required | Description | Default |
|---|---|---|---|
| save | Yes | ||
| mapPath | No | ||
| outputName | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations only mark destructiveHint=true; the description adds real behavioral context beyond them: it writes a NEW .gil in the workspace (rather than mutating the input save), remaps template indices in Lua text but never inside strings/comments, and reports a limitations list (missing button states, parameters read by rules but never set). It also discloses what does and does not carry over (image fill/soft edge/inverted mask come over; multi-value signals are typed from scripts).
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The purpose is front-loaded in the first clause, which is good, but the remainder is a dense chain of semicolon-separated clauses and nested parentheticals that is hard to parse in one pass. Some of the enumeration (individual UI-state notes) could be trimmed without losing decision-relevant information.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a complex import tool with no output schema, the description covers what gets written, what gets reported back, and what to do next, which is most of what an agent needs. The gaps — the meaning of outputName and the role of mapPath for this tool itself — keep it short of complete.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, so the description must compensate. It documents `save` thoroughly (full simulator save, the .json written via 导出 → 完整存档, format 'qxqy-simulator-save'), but `mapPath` is only referenced incidentally through playtest_start and `outputName` is never explained at all, leaving two of three parameters opaque.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description names a specific verb+resource ('bring a project of the 千星沙箱模拟器 ... into a copy of a save') and disambiguates from siblings by describing an end-to-end import-and-write workflow, clearly distinct from the granular scene_add_* / scene_set_* tools. The parenthetical identifiers (miliastra-beyond-simulator, qxqy-simulator-save) make the target unambiguous.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It states the condition that motivates the tool ('what passes in a simulator has not passed in the game') and names the follow-up tools (scene_check_client against the finished save, then playtest_start {mapPath}). It does not state when NOT to use it, e.g. whether re-importing over an already-imported save is safe or idempotent.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
scene_list_camerasARead-only
List the camera templates saved in a map (主镜头管理): name, distance from the character in metres, vertical field of view in degrees, the yaw and pitch ranges within which the player can turn the camera, and fixedView when the view is locked (scene_set_camera). Without mapPath it reads the newest official save. Read-only.
| Name | Required | Description | Default |
|---|---|---|---|
| mapPath | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint/destructiveHint=false, so the closing "Read-only" is largely redundant, but the description earns credit for disclosing the fallback behavior (newest official save when mapPath is omitted) and the meaning of each returned field. That default-resolution rule is behavior an agent could not infer from annotations or schema.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
One front-loaded sentence that opens with the verb and resource, then layers return fields and the fallback rule. The long comma-separated field list is dense but each item is informative; the trailing "Read-only" is the only wasted clause.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema, the description usefully enumerates the returned fields and their units, and the single optional parameter is fully explained. An agent has everything needed to invoke and interpret the call; only explicit guidance on choosing among the many other scene_list_* tools is absent.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 0%, so the description must carry the parameter, and it does: omitting mapPath selects the newest official save, which is the only meaningful semantic of the single optional argument. Units on the returned distance and angle fields (metres, degrees) add meaning not present in the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ("List the camera templates saved in a map") and immediately enumerates what each entry contains, so the agent knows the exact payload shape before calling. The parenthetical pointer to scene_set_camera draws the boundary from the sibling that mutates cameras rather than listing them.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
"Without mapPath it reads the newest official save" gives an explicit default-mode condition that an agent can act on. It clarifies the read/write split with scene_set_camera but stops short of stating when-not to use this tool or what other listing tools would be preferable for related data.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
scene_list_classesARead-only
List the classes (职业) of a save: for each, the camera template and screen layout it uses and whether its character may jump, sprint, climb and glide. Read-only.
| Name | Required | Description | Default |
|---|---|---|---|
| mapPath | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint and destructiveHint=false, so the closing 'Read-only.' is partly redundant, but the description adds real value by disclosing the shape of the result: one entry per class with camera template, layout, and four capability booleans. That compensates for the absent output schema.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
One compact sentence that front-loads the resource and then the per-item fields. Every clause carries information; nothing is wasted.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Good coverage of return contents, which matters since there is no output schema, but it omits the only input parameter's meaning and gives no hint about how to obtain a valid mapPath. Adequate for the read path, incomplete on the input side.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The single parameter mapPath has 0% schema description coverage and the description never mentions it, leaving the agent to guess whether it is a path on disk, an identifier from list_maps/inspect_map, or optional. With 1 undocumented param, the description fails to compensate for the coverage gap.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb (List) and resource (classes of a save), and enumerates the per-class fields returned (camera template, screen layout, jump/sprint/climb/glide flags). This lets an agent distinguish it from the mutating sibling scene_set_class without opening either schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The read-only framing and the 'of a save' phrasing imply it's the inspection counterpart to scene_set_class, but no sentence explicitly says when to use this versus that sibling or what prerequisite context (a loaded/inspected map) is needed. Usage is implied rather than stated.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
scene_list_client_scriptsBRead-only
List the client scripts (Lua) of a save: name, file, number of lines, its variables (name, type, whether public), the controls each is on, and with includeSource the Lua itself. Read-only.
| Name | Required | Description | Default |
|---|---|---|---|
| mapPath | No | ||
| includeSource | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already cover the safety profile (readOnlyHint, destructiveHint=false, openWorldHint=false), so the bar is lower. The description adds useful detail that the payload can be large when includeSource is set and that it enumerates structure down to variable publicity and controls, but does not mention size limits, permissions, or performance implications of pulling full Lua source.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
One front-loaded sentence that packs the resource, the returned fields, and the key flag with zero filler. The dense enumeration is slightly hard to scan but every clause carries information.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema, the description does well to sketch the return shape, but it leaves gaps an agent needs: what mapPath means, what happens if it is omitted (0 required params), and whether the source payload is bounded. Adequate but incomplete for a two-parameter discovery tool.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, so the description must carry the parameter burden. It explains includeSource clearly ('with includeSource the Lua itself', defaulting to false per schema), but mapPath is only implied by 'of a save' and never named or described, leaving one of two parameters uninterpretable from text.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Specific verb+resource ('List the client scripts (Lua) of a save') with an enumeration of the returned fields (name, file, line count, variables, controls, source). It implicitly separates itself from the write sibling scene_set_client_script by being a 'list' operation, but no sibling is named explicitly.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
No indication of when to use this versus alternatives such as scene_check_client or scene_set_client_script, and no prerequisites (e.g., whether a map must be open). 'Read-only' is a restatement of annotation flags rather than usage guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
scene_list_componentsBRead-only
Read what a prefab (and its placed copies) or the placed entities of one name carry: number of collision triggers, the options of the option tab, custom variables, and the ids of the node graphs they run. Read-only.
| Name | Required | Description | Default |
|---|---|---|---|
| entity | No | ||
| prefab | No | ||
| mapPath | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, destructiveHint=false and openWorldHint=false, so 'Read-only.' is largely a restatement. The description does add value by disclosing which data categories come back (counts, options, variables, graph ids). It says nothing about what happens when no arguments are supplied, how mapPath scopes the read, or the shape of a miss (empty result vs. error).
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
A single compact sentence with the verb front-loaded, plus a short safety tag. Every clause carries content, though 'Read-only.' duplicates structured annotation data and the nested parenthetical costs a little readability for no gain.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Absent an output schema, the description usefully enumerates the returned fields, which is the main thing an agent needs to know. But for a 3-parameter, all-optional tool with no schema descriptions, it leaves real gaps: the role of mapPath, whether prefab and entity are mutually exclusive, and behavior when args are omitted.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 0% and all three parameters are optional with no descriptions, so the description must carry the full burden. It gestures at `prefab` and `entity` implicitly ('a prefab... or the placed entities of one name') but never names them, and `mapPath` is not mentioned at all. The zero-required-parameter case (what a call with no arguments does) is entirely unexplained.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Specific verb ('Read') plus a concrete resource (a prefab, its placed copies, or placed entities of one name) and an enumeration of what is returned (collision trigger counts, option-tab options, custom variables, node graph ids). It is distinguishable from scene_list_prefabs and scene_list_entities because it reports component payload rather than listings. The parenthetical '(and its placed copies)' makes the sentence slightly tangled but the intent survives.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
There is no statement of when to pick this over scene_list_prefabs, scene_list_entities, or scene_update_prefab. The only routing-like signal is the distinction between reading a prefab vs. reading placed entities by name, which is buried in the object of the sentence rather than framed as selection guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
scene_list_creature_skillsBRead-only
List the creature skills (造物技能) defined in a save: id, name, the creature they belong to, their animation and graph. Read-only.
| Name | Required | Description | Default |
|---|---|---|---|
| mapPath | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, destructiveHint=false, and openWorldHint=false, so the trailing 'Read-only.' largely repeats structured data rather than adding context. Beyond the field list, it discloses nothing about ordering, volume, or behavior when the save contains no creature skills; with annotations present the bar is lower, so a 3 fits.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
One compact sentence that front-loads the verb and resource, then lists output fields; nothing is wasted. Slightly list-like punctuation, but efficient overall.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema, the description usefully enumerates returned fields, which is the right compensation. However, the sole input parameter remains unexplained and there is no note on empty results, making it only adequate for an agent to call correctly in all cases.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0% for the single parameter mapPath, and the description only vaguely gestures at it via 'defined in a save'. It never states that mapPath identifies the save/map, whether it's optional, or what happens if omitted, so the parameter is effectively undocumented.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description names a specific verb and resource (list creature skills) and scopes it to 'a save', plus enumerates the returned fields (id, name, creature, animation, graph). It's clearly distinguishable from the write-side sibling scene_add_creature_skill, but it never explicitly names or contrasts that sibling.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Usage is only implied: 'defined in a save' suggests inspection of existing skill definitions, and the read-only tag implies the counterpart to scene_add_creature_skill. There is no explicit when-to-use, when-not-to-use, or prerequisite statement.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
scene_list_currenciesBRead-only
List the currencies defined in a save, its backpack templates, and what the character template's backpack holds at the start (null when characters carry no backpack).
| Name | Required | Description | Default |
|---|---|---|---|
| mapPath | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, destructiveHint=false, and openWorldHint=false, so the safety profile is covered structurally. The description adds useful return-content context — that results span save currencies, backpack templates, and starting backpack contents, with null meaning no backpack. It says nothing about ordering, pagination, or error behavior if no save is loaded.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
A single sentence with the core action front-loaded and no filler. The embedded parenthetical listing three result categories is dense but each clause carries information; slightly smoother phrasing would earn a 5.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema, the description carries the burden of explaining return values, and it does partially by naming the three currency sources and null semantics. However, the sole input parameter is left entirely unexplained, leaving the definition incomplete for correct invocation.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 0% and 'mapPath' has no description anywhere, yet the description never mentions it — the agent cannot tell whether it targets a specific map, whether it is optional, or what happens when omitted. With only one parameter and no compensating text, the semantic gap is the whole schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Opens with a specific verb+resource ('List the currencies') and scopes it to save-defined currencies, backpack templates, and the character template's starting backpack. This clearly separates it from the sibling 'scene_add_currency'. The trailing parenthetical about null backpacks is slightly convoluted but does not obscure the purpose.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
There is no statement of when to use this versus alternatives — the obvious sibling 'scene_add_currency' is never referenced, nor is any prerequisite (e.g., whether a map must be loaded). The agent can infer it is the read companion to scene_add_currency, but nothing in the text guides that choice.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
scene_list_entitiesARead-only
List entities placed in a save by name: GUID, asset id, position, whether it is created at level start, and kind (static, dynamic, creature). The editor assigns new GUIDs when it imports a pack, so after scene_import_assets read the GUIDs here before writing them into a node graph. Without mapPath it reads the save the editor wrote last (the one just imported into). Read-only.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | ||
| mapPath | No | ||
| namePrefix | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint/destructiveHint=false, so the trailing 'Read-only' is redundant, but the description adds genuine behavioral context: the editor assigns new GUIDs on pack import, and without mapPath it reads the last save the editor wrote. Those are non-obvious semantics an agent could not infer from the schema.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three sentences, all front-loaded with the returned-field list first and the workflow caveat second. Dense and mostly waste-free, though the field enumeration and the 'Read-only' clause overlap slightly with structured data.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema, the description correctly enumerates what is returned, and it explains the default-save behavior that a caller needs. The remaining gap is the undocumented limit/namePrefix parameters, which is minor for what is otherwise a well-covered read tool.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, so the description carries the burden and only covers mapPath (default target when omitted). The limit and namePrefix parameters are left completely unexplained in both schema and description, so the compensation is partial.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('List entities placed in a save by name') and immediately enumerates the returned fields (GUID, asset id, position, level-start flag, kind), which distinguishes it from the nearby scene_list_components, scene_list_prefabs and scene_list_signals siblings.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives a concrete workflow condition: after scene_import_assets, read GUIDs here before writing them into a node graph, because the editor reassigns GUIDs on import. That is real when-to-use guidance, though it doesn't state exclusions or name an alternative tool for other listing needs.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
scene_list_environmentsBRead-only
List the environment configurations (环境配置, the skies) of a save: id, name, fixed hour, whether it follows the level clock, stars, milky way, clouds. Read-only.
| Name | Required | Description | Default |
|---|---|---|---|
| mapPath | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, openWorldHint=false and destructiveHint=false, so 'Read-only.' adds no new information. The only added behavioral context is the phrase 'of a save', hinting at a loaded-save dependency, with no mention of ordering, empty results, or pagination.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
One front-loaded sentence that leaves no filler; the only waste is the trailing 'Read-only.' which duplicates the annotations. The parenthetical gloss adds minor noise but aids disambiguation.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The field enumeration usefully substitutes for the missing output schema, so an agent knows what comes back. However, the undocumented mapPath parameter and the unexplained save/map prerequisite leave the call contract incomplete for a tool invoked from a scene-editing workflow.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The single parameter mapPath has 0% schema description coverage and is not mentioned anywhere in the description, so an agent cannot tell whether it is optional, what form a path takes, or which map/save it selects. With low coverage the description should compensate and does not.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource (list environment configurations) plus the scope ('of a save') and enumerates the returned fields. It is clearly a read of environments versus the mutating sibling scene_add_environment, though it doesn't name that sibling explicitly.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The read-only listing intent and the implied pairing with scene_add_environment are inferable from the name and field list, but the description never says when to call this vs. get_level_settings or scene_list_preset_points, nor what prerequisites (a loaded save/map) are needed.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
scene_list_factionsARead-only
List the factions (阵营) of a map and, for each, which factions it is hostile to and which it is friendly to. This decides who attacks whom: a creature attacks entities of a hostile faction that have combat attributes. A new map has three factions, players 1, objects 2 and creatures 3, each hostile to the other two, so allies of the player attack objects a graph creates (coins, walls, markers) and seem to swing at nothing. Without mapPath it reads the newest official save. Read-only.
| Name | Required | Description | Default |
|---|---|---|---|
| mapPath | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, but the description adds meaningful behavioral context: the default source when mapPath is omitted, the default three-faction setup on a new map, and how hostility determines combat targeting. It does not explain error behavior or return shape in detail.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is front-loaded with the core list operation and remains mostly efficient, though the new-map example is lengthy and could be tightened. The final read-only note is useful but slightly redundant with annotations.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema and minimal annotations beyond read-only, the description provides enough conceptual return information by stating that it returns factions and their hostile/friendly relationships. It is nearly complete, though it could say more about response structure.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 0% for the single optional mapPath parameter. The description partially compensates by stating that without mapPath the newest official save is read, but it does not describe path format, valid values, or how mapPath is resolved.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description gives a specific verb and resource: it lists the factions of a map and reports each faction's hostile and friendly relationships. That scope is precise enough to separate it from sibling mutation tools like scene_set_faction_hostility.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Usage is implied by the faction-listing purpose and the note that omitting mapPath reads the newest official save, but the description does not explicitly say when to use this instead of scene_set_faction_hostility or other scene inspection tools.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
scene_list_global_timersBRead-only
List the global timers (全局计时器) defined in a save: name, seconds, countdown or stopwatch. Read-only.
| Name | Required | Description | Default |
|---|---|---|---|
| mapPath | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, destructiveHint=false, and openWorldHint=false, and the trailing "Read-only" merely restates that. The genuinely additive part is the disclosure of the returned shape (name, seconds, countdown vs stopwatch), which matters because there is no output schema.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
One compact sentence with the resource and return fields front-loaded, plus a two-word safety note. No filler, though the parenthetical Chinese gloss consumes space without adding selection value for most agents.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Returning the field list is helpful given there is no output schema, but the definition leaves the one real unknown — how mapPath selects the save — unresolved. For a single-parameter tool that is the only gap an agent actually needs closed.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0% for the single parameter mapPath, so the description must carry the burden and it does not. "Defined in a save" vaguely gestures at the target, but never says whether mapPath is a filesystem path, a map identifier, optional (required=0), or what happens when omitted.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Clear verb+resource ("List the global timers defined in a save") with the returned fields enumerated (name, seconds, countdown or stopwatch). It doesn't explicitly contrast with the sibling scene_add_global_timer or the timer-display tools, but the read/list framing is unambiguous.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
No guidance on when to call this versus scene_add_global_timer or scene_add_timer_display, and no stated prerequisites (e.g. must a map be open first?). The only contextual cue is the phrase "defined in a save," which implies scope but does not route an agent.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
scene_list_interfaceBRead-only
List the screen layouts of a save and the controls on each: the built-in HUD pieces and the custom controls (progress bars, text boxes, timers, scoreboards, containers of client controls), and under clientInterfaces the trees of client controls with the Lua script each carries. Read-only.
| Name | Required | Description | Default |
|---|---|---|---|
| mapPath | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, destructiveHint=false and openWorldHint=false, and the trailing 'Read-only' merely restates them. What the description does add beyond the annotations is the shape of the result (nested clientInterfaces with per-control Lua scripts), but it discloses nothing about defaults, pagination, failure modes, or how the save/map is resolved.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
One dense sentence, front-loaded with the verb and result scope, followed by a short safety tag. It is long but every clause enumerates a distinct returned category, so little is wasted; the controls list could be tightened slightly.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema, the description does useful work by sketching the return structure (built-in HUD pieces vs. custom controls vs. clientInterfaces trees with Lua scripts). But for a tool whose only parameter is undocumented and whose output is a nested tree, missing details on mapPath resolution and result size/shape leave real gaps.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0% for the single optional mapPath parameter, so the description carries the full burden — yet it never mentions mapPath or explains which save/map is read when it is omitted. 'Of a save' is the only hint, and it does not resolve the default-behavior question an agent must answer before calling.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description names a specific verb and resource ('List the screen layouts of a save and the controls on each') and enumerates the content types returned (HUD pieces, progress bars, text boxes, timers, scoreboards, containers, clientInterfaces trees with Lua scripts). This clearly separates it from siblings such as scene_list_components or scene_get_client_ui, though it never names an alternative directly.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Usage is only implied: 'List the screen layouts of a save' plus 'Read-only' suggests an inventory/inspection use case. There is no explicit statement of when to prefer this tool over scene_get_client_ui, scene_list_client_scripts, or editor_preview_interface, nor any exclusions.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
scene_list_itemsBRead-only
List the items defined in a save (id, name, icon, value in a currency) and its shop templates (what each sells and buys, at what price).
| Name | Required | Description | Default |
|---|---|---|---|
| mapPath | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, destructiveHint=false and openWorldHint=false, so the safety profile is covered. The description usefully adds scope (items AND embedded shop templates, with pricing) but says nothing about what 'a save' means, whether a missing mapPath yields defaults, or how large the result can get.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
A single dense sentence that front-loads the verb and resource and spends its remaining words on return contents rather than filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema, the description responsibly enumerates the payload (id, name, icon, currency value, shop buy/sell prices). The remaining gap is the sole parameter's semantics and the behavior with an absent/incorrect mapPath.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
There is one parameter (mapPath) at 0% schema coverage, and the description never mentions it. 'The items defined in a save' loosely hints that a path selects the target save, but it does not clarify whether mapPath is required, what form it takes, or what happens when omitted.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Specific verb 'List' with a well-scoped resource: items defined in a save, plus their shop templates. It also enumerates the returned fields (id, name, icon, value, buy/sell prices), which makes it distinguishable from mutators like scene_add_item and scene_add_shop, though it doesn't name a sibling explicitly.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Usage is only implied: an agent can infer this is the inspection step before scene_add_item/scene_add_shop, but the description states no when-to-use condition, no prerequisites (e.g. must a save exist?), and names no alternative.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
scene_list_prefabsARead-only
List the prefabs (元件) saved in a map: prefab id, name, the asset it is made of, object or creature, and its scale. A node graph creates prefabs at run time, anywhere, with f.createPrefab(prefabId, ...). Without mapPath it reads the newest official save. Read-only.
| Name | Required | Description | Default |
|---|---|---|---|
| mapPath | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The annotations already declare readOnlyHint=true, destructiveHint=false, and openWorldHint=false, so the 'Read-only' sentence is redundant. However, the description adds real behavioral context beyond the annotations: it explains the fallback to the newest official save when mapPath is omitted, and notes that node graphs create prefabs at run time via f.createPrefab, implying this tool surfaces saved prefabs rather than runtime-spawned ones.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the purpose, then returned fields, then the default-source caveat, then a short script note. Every sentence carries information, though the f.createPrefab sentence is somewhat tangential to the act of listing and could be trimmed.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a one-optional-parameter read tool with no output schema, the description covers purpose, returned fields, and default behavior well. The remaining gaps, such as behavior on a missing or invalid map and whether the result can be empty, are minor for a simple list operation.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, so the description must carry the parameter's meaning. It does define what omitting mapPath does (reads the newest official save), which the bare string-typed schema does not. It still doesn't say what mapPath expects (file path format, absolute vs relative, what happens on an invalid path), so it falls short of a 5.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('List the prefabs saved in a map') and enumerates the returned fields (id, name, asset, object/creature, scale). This clearly separates it from siblings like scene_add_prefab and scene_update_prefab, which mutate prefabs.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The 'Without mapPath it reads the newest official save' sentence tells the agent the default source, which is useful context. But it never explicitly says when to call this versus scene_add_prefab/scene_update_prefab, nor does it state preconditions beyond the default path behavior.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
scene_list_preset_pointsBRead-only
List the preset points (预设点) of a save: id, name, position, rotation, and which one players start at. Read-only.
| Name | Required | Description | Default |
|---|---|---|---|
| mapPath | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint/destructiveHint=false, so 'Read-only' is largely redundant. However, the description does add genuine value by disclosing the exact fields returned — including which preset point players spawn at — which matters because there is no output schema. It stops short of noting ordering or pagination.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
A single front-loaded sentence that states the action, the resource, the returned fields, and the safety profile with no filler. Nothing repeats or pads.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Return shape is covered and annotations handle safety, which is good for a simple one-parameter list tool. But the description never addresses the optional mapPath argument — whether omitting it lists the current map — which is the one behavioral question an agent will actually have.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0% for mapPath, so the description must compensate and it does not: it never explains what mapPath should contain (map name vs. file path) or what happens when it is omitted (it is not required). 'Of a save' actually adds confusion rather than clarifying the parameter.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Names a specific verb and resource ('List the preset points') and even enumerates the returned fields (id, name, position, rotation, spawn point), which clearly separates it from scene_add_preset_point. The only wrinkle is 'of a save', which doesn't line up cleanly with the single mapPath parameter, leaving mild ambiguity about what scope is being listed.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description tells you it is read-only but never says when to call this versus siblings such as scene_list_respawn_points or scene_list_entities, nor what to do first. Usage is only inferable from the tool name; there are no stated conditions or alternatives.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
scene_list_respawn_pointsCRead-only
List the respawn points of a save (number, preset point, place) and how many players the level takes (the group of the level settings).
| Name | Required | Description | Default |
|---|---|---|---|
| mapPath | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The annotations already declare readOnlyHint=true and destructiveHint=false, so safety is covered. The description adds modest value by naming the returned fields (number, preset point, place) and player count, but does not clarify scoping, defaults, or why player count comes along with respawn points.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
A single sentence, front-loaded with the verb, which is good. But the two nested parentheticals make it dense and the combined return contents are hard to parse at a glance.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
No output schema exists, so the description carries the return-value burden, which it partly shoulders by listing fields. It still omits what mapPath defaults to, whether it targets the open map, and how the player-count data relates to respawn points, leaving real gaps for a read tool.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 0% and the single optional mapPath parameter is never mentioned in the description. Worse, 'of a save' actively conflicts with the mapPath-centric parameter, so the one parameter an agent must decide on is left unexplained.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb (list) and resource (respawn points), and names the returned fields. However, it awkwardly bundles a second unrelated output (player count / level group) into the same tool, and 'of a save' is confusing next to the mapPath parameter, so the tool's true scope is muddled rather than crisp.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
No guidance on when to use this versus the obvious siblings scene_list_preset_points, scene_set_spawn, or scene_get_level_settings. The agent gets no conditions or alternatives to select from.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
scene_list_signalsBRead-only
List the names of the signals (信号) defined in a save, and what each carries (parameters: name and type, in order). Read-only.
| Name | Required | Description | Default |
|---|---|---|---|
| mapPath | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, and the description restates 'Read-only', which adds little. It does add useful output context (each signal's parameters with name and type, in order), but says nothing about behavior when no signals exist or about scope beyond 'a save'.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
A single, front-loaded sentence with no wasted words; the parenthetical clarifying return shape is efficiently integrated. Slightly compressed to the point that the mapPath semantics get lost.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema, the description usefully sketches the return value (names plus parameter name/type in order), which is the main thing an agent needs. It is incomplete on the input side, leaving the only parameter and its optionality unexplained.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
There is one parameter, mapPath, with 0% schema description coverage, and the description never mentions it — 'defined in a save' is the only oblique hint. With a real undocumented parameter, the description needed to explain whether the path is optional or what defaults to the active map.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('List the names of the signals defined in a save, and what each carries') and implies the returned shape. It is distinguishable from the sibling scene_add_signal, though it never names a sibling or the read-only counterpart explicitly.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The read-only framing implies this is the inspection tool for signals, but there is no explicit statement of when to use it versus scene_add_signal or other scene_list_* tools, and no prerequisites or exclusions are given.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
scene_list_skillsARead-only
List the skills defined in a save: id, name, type (instant or animated), the client graph it runs and, for an animated one, the ids of its animation clips.
| Name | Required | Description | Default |
|---|---|---|---|
| mapPath | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, destructiveHint=false and openWorldHint=false, so the safety profile is covered. The description adds real value by enumerating the shape of each returned record, which matters because there is no output schema; it stops short of covering pagination, empty results, or ordering.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
One dense sentence with the verb and resource front-loaded followed by the returned fields; there is no filler or redundant restatement of the tool name.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple read-only listing tool, the annotations plus the field enumeration make the description largely sufficient. The remaining gap is the unexplained mapPath parameter, which is the only input and is left entirely to inference.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0% and the single parameter mapPath is never mentioned in the description. The phrase 'defined in a save' hints that the path selects the save, but nothing clarifies whether mapPath is optional (it is not required), what format it takes, or what happens when it is omitted.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description gives a specific verb (List) and resource (skills defined in a save) and even enumerates the returned fields (id, name, type, client graph, animation clip ids). This clearly separates it from write siblings like scene_add_skill and from scene_list_creature_skills, which is scoped to creatures rather than the save's skill definitions.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
There is no explicit when-to-use or when-not-to-use guidance and no named alternative. The closest sibling, scene_list_creature_skills, is not mentioned, so an agent must infer the distinction between save-level skills and creature-level skills on its own.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
scene_list_unit_statusesBRead-only
List the unit statuses (单位状态) defined in a save: id, name and effects. Read-only.
| Name | Required | Description | Default |
|---|---|---|---|
| mapPath | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, destructiveHint=false and openWorldHint=false, so 'Read-only' is largely redundant. The description does add useful return-shape context (id, name, effects), but says nothing about ordering, pagination, or what happens when the save has no statuses.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
One front-loaded sentence with the verb, resource, output fields and safety note; nothing wasted.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
This is a simple one-parameter read tool with full annotation coverage, so it is nearly adequate. The gaps are the undocumented mapPath parameter and the ambiguous save-vs-map framing, which an agent would need to resolve before calling.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0% for the single parameter 'mapPath', and the description never mentions it. Worse, the description frames the data as coming from 'a save' while the parameter is named mapPath, leaving the relationship between the two unexplained and whether the parameter is optional (it is not required) unclear.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Specific verb ('List') plus resource ('unit statuses') and the returned fields (id, name, effects), which separates it from sibling scene_add_unit_status. It does not name a sibling explicitly, but the read/write distinction is unmistakable.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
'defined in a save' implies the context in which to call it and read-only usage is stated, so the intent is inferable. However there is no explicit when-to-use, no exclusions, and no pointer to alternatives such as scene_add_unit_status for creating statuses.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
scene_remove_clientADestructive
Take a client interface (ui: the name given to scene_add_client_ui), a template of client controls (template) or a client script (script) out of a copy of a save; one of the three in a call. To change an interface or a template that is there, this is not needed: scene_get_client_ui reads it, and scene_add_client_ui (scene_add_client_template) with replace: true puts the changed one in its place under the same ids; a script alone is changed with scene_set_client_script. A script that controls still carry and a template a grid or a reference still names are refused, with the names of what holds them. Writes a new .gil in the workspace.
| Name | Required | Description | Default |
|---|---|---|---|
| ui | No | ||
| script | No | ||
| mapPath | No | ||
| template | No | ||
| outputName | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Beyond the annotations (destructiveHint=true, readOnly=false), the description discloses concrete behavioral facts: it writes a new .gil into the workspace, and it refuses removal when a script is still held by controls or a template is named by a grid/reference—returning the holder names. This is exactly the extra context annotations can't convey.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loads the core action and constraints, with each sentence adding real value (alternatives, refusal rules, output artifact). It is dense with parenthetical nesting, which slightly hurts scannability, but no sentence is wasted.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a destructive, non-output-schema removal tool it covers what an agent needs: what gets removed, the one-of-three constraint, dependency refusals, and that a new .gil is written. The only gap is the unexplained mapPath/outputName parameters, which prevents a top score.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 0%, so the description must carry parameter meaning. It clarifies that ui is the name from scene_add_client_ui, that template is a template of client controls, and that script is a client script—useful semantics for three params—but mapPath and outputName are left entirely unexplained, so compensation is only partial.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb (take out/remove) applied to three concrete resources—client interface (ui), template of client controls, and client script—and explicitly scopes it as 'one of the three in a call.' It also names the sibling tools that manipulate the same resources (scene_get_client_ui, scene_add_client_ui, scene_set_client_script), so an agent can distinguish it without opening any schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly describes when NOT to use it ('To change an interface or a template that is there, this is not needed') and routes the agent to the correct alternatives (get+add with replace:true for UI/template, scene_set_client_script for scripts). The one-of-three constraint and dependency-refusal condition are stated directly.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
scene_remove_entitiesADestructive
Take things that were placed in the scene out of a copy of a save: a floor piece that was laid in the wrong place, a row of fences that turned out not to be needed, the pieces of a version of the scene that is being replaced. names is a list of entity names (each exactly, as scene_list_entities gives them; every entity of that name goes), or namePrefix takes all whose names begin with it (at least two characters). Importing a scene can only add; this is how to take away without starting over from the base map. The entities every map has by itself (the stage entity, the player slots) are refused. A graph that looks a removed thing up by its GUID finds nothing afterwards. Returns a new .gil; the official save is not touched, so go on from the copy. Seen in the game on 2026-10-13: a level with three of its wall pieces removed opened in the editor and played, the walls gone and the rest as before.
| Name | Required | Description | Default |
|---|---|---|---|
| names | No | ||
| mapPath | No | ||
| namePrefix | No | ||
| outputName | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already flag destructive/non-readonly, and the description adds meaningful context beyond them: the official save is untouched, a new .gil is produced, base-map entities are refused, and graphs resolving a removed GUID afterwards find nothing. The in-game verification note further vouches for the destructive operation's actual effects.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Long but front-loaded: purpose, examples, parameter behavior, mutation semantics, then the verification anecdote. The closing playtest note is somewhat expendable, but the rest of the prose earns its place.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
No output schema exists, and the description does state the return ('a new .gil') plus the safety model (official save untouched). The main gap is the unexplained mapPath/outputName inputs on a 4-parameter destructive tool, which leaves an agent guessing about where input comes from and where output lands.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, so the description must carry parameter meaning. It explains names well (exact names as scene_list_entities reports, all entities of that name removed) and namePrefix (minimum two characters, prefix match), but mapPath and outputName are never named or explained, leaving half the parameters undocumented.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource (remove previously placed entities from a copy of a save) and gives concrete examples (floor piece, fences, replaced scene pieces). It also explicitly separates itself from the add-direction siblings and from importing a scene, so an agent can tell what it does without opening the schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives clear context for when to reach for it: 'Importing a scene can only add; this is how to take away without starting over from the base map.' It also states a hard exclusion (stage entity and player slots are refused). It does not address overlap between names and namePrefix or multi-scene workflows, but the primary usage framing is clear.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
scene_search_assetsARead-only
Search the full catalog of 2468 official placeable assets (trees, houses, fences, tents, props, mechanisms, monsters) by words in the Chinese name or icon name, optionally by group and by longest side in metres. Returns id, name, group, icon, model size and hasImage, and presetStatus for mechanism assets whose built-in animation is known (chests that open, levers, doors: group 交互机关). Many assets share a name; look at them with scene_asset_images before choosing. Use the id as template in scene_build_blocks. The id of an asset as query finds that asset (its size, its group). queries: several searches in one call (queries: ["围栏", "拱门", "火盆", "石地板"]), one list each: the things of a whole scene are found in one or two calls instead of twenty. A query that finds nothing comes back with didYouMean, names of the catalog that share most of its characters.
| Name | Required | Description | Default |
|---|---|---|---|
| group | No | ||
| limit | No | ||
| query | No | ||
| offset | No | ||
| maxSize | No | ||
| minSize | No | ||
| queries | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already cover the safety profile (readOnly, non-destructive, closed world), and the description adds real value beyond them: it enumerates the returned fields (id, name, group, icon, model size, hasImage, presetStatus), explains what presetStatus means for 交互机关 assets, warns that names are duplicated, and documents the didYouMean fallback on empty results. Pagination/limit-default behavior is left unmentioned, which keeps it from a 5.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The purpose is front-loaded in the first sentence, but the remainder is a run-on stream joined by semicolons, mixing return fields, dedupe advice, id usage, batching, and didYouMean with no paragraphing. The clause 'The id of an asset as query finds that asset (its size, its group)' is garbled and costs the reader effort.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a 7-parameter, 0%-documented, output-schema-less catalog search over 2468 entries, the description supplies most of what an agent needs: what matches, the multi-query pattern, the ambiguous-name pitfall, what comes back, and what to do on zero hits. Only pagination (limit/offset) and explicit min/max size naming are missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, so the description must carry the params, and it partially does: `query` (words in Chinese or icon name), `queries` (multi-search with a literal example array), `group`, and size in metres via 'longest side'. `limit` and `offset` are never mentioned, and minSize/maxSize are only implied by 'by longest side in metres' rather than named.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Opens with a specific verb and resource: 'Search the full catalog of 2468 official placeable assets (trees, houses, fences...)' and names the matching dimensions (Chinese name/icon name, group, longest side in metres). The examples of asset types and the pointer to scene_asset_images / scene_build_blocks make it distinguishable from catalog siblings like scene_block_catalog and image_catalog.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives concrete workflow guidance: 'look at them with scene_asset_images before choosing' and 'Use the id as template in scene_build_blocks', plus the batching advice that one or two calls with `queries` replace twenty. It never states when NOT to use it (e.g. blocks vs. assets, or when scene_block_catalog is the right catalog), so it stops short of explicit exclusions.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
scene_set_cameraADestructive
Change how far the play camera stands from the character, its field of view, and whether the player can turn it, in a copy of a save. fixedView {yaw, pitch, ignoreCollision} locks the view (the 2.5D camera of the editor, 2.5D镜头): the camera looks from one horizontal angle (yaw 0 looks towards +z from the -z side, so that A and D walk along x; 90 turns it a quarter round) at one pitch (positive looks down: 20 to 25 for a side view, 50 to 60 for a view from above), the player cannot turn it with the mouse, the zoom is held at the distance, and with ignoreCollision (on unless switched off) the camera does not jump close when a wall or an invisible wall comes between it and the character. Every game that is built for one direction of view (a side-scroller, an arena seen from above, a lane) needs this: without it the first movement of the mouse turns the camera and D no longer walks along the lane. Read from a template switched to that mode by hand in the editor on 2026-10-13 and written the same way; seen in play that day (examples/hazards/hazards_fixed_view.json: the same mouse movements that swing the free camera right round leave the fixed view where it is; hazards_free_view.json is the comparison). Without fixedView: The picture shows about 2distancetan(fieldOfView/2) metres of height at the character and 16/9 of that across (at 45 degrees: 14 m shows about 20.6 m across, 18 m about 26.5 m; in a side-view game whatever stands further from the character than half of that is off the screen): 6 m at 45 degrees is a close shot (5 m tall, large buildings are cut off), 14 m shows about 11.6 m and whole buildings with sky above them. yawRange and pitchRange ([min, max] in degrees) limit how far the player can turn the camera; a new template allows everything (-180..180, -89..89). The camera starts behind the character, wherever the character faces: set the facing with scene_set_spawn (rotation [0,0,0] faces +z, so the camera looks from the -z side and A and D walk along x; turned 90 degrees, D no longer walks along x). yawRange did not fix the starting direction in playtests, and a yawRange of [0, 0] is dropped when the editor saves; pitchRange [55, 55] does give a top-down view. The camera template must already exist (create it once in the editor). Writes a new .gil in the workspace and returns its path; the official save is not touched.
| Name | Required | Description | Default |
|---|---|---|---|
| name | No | ||
| mapPath | No | ||
| distance | No | ||
| yawRange | No | ||
| fixedView | No | ||
| outputName | No | ||
| pitchRange | No | ||
| fieldOfView | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Goes well beyond the destructiveHint=true annotation: it discloses that a new .gil is written to the workspace, that the official save is untouched, that the returned value is its path, that yawRange [0,0] is dropped on save, and that yawRange did not fix starting direction in playtests. These are non-obvious engine behaviors an agent could not infer elsewhere.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loads the core action, but the body sprawls with editor provenance ('Read from a template switched to that mode by hand in the editor on 2026-10-13'), dated notes, and example filenames that do not help an agent invoke the tool. Several sentences could be compressed without losing meaning.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For an 8-parameter mutation with nested objects and no output schema, the description supplies prerequisites, side effects, return value, and the semantics of the risky fixedView mode. Only the naming/path parameters are left to the schema, so it is nearly complete.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
With 0% schema coverage the description carries the burden, and it does so for most parameters: distance is tied to a metres-of-visible-height formula with worked examples, fieldOfView to frame height, fixedView's yaw/pitch/ignoreCollision each get meaning plus recommended values (20-25 side view, 50-60 top-down), and both ranges get units and failure notes. name, mapPath, and outputName are left unexplained, keeping it short of a 5.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Change how far the play camera stands from the character, its field of view, and whether the player can turn it, in a copy of a save') and clearly separates itself from siblings like scene_list_cameras and scene_set_spawn by naming the latter for facing setup. An agent can identify the tool without opening the schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives a concrete when-to-use trigger ('Every game that is built for one direction of view ... needs this') and explains the failure mode without it. It also states a prerequisite ('The camera template must already exist'), but never routes to alternatives such as scene_list_cameras to inspect existing cameras or when to prefer a plain free camera over fixedView.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
scene_set_classADestructive
Change what a class (职业) lets the player's character do, in a copy of a save: allowJump, allowSprint, allowClimb, allowGlide, and cameraTemplateId (a camera from scene_list_cameras) so that this class plays with that camera. On this platform the character's abilities and its camera belong to the class, not to node graphs: a side-scroller or a top-down game gives its class the right camera and switches off what the game does not use. name picks the class when the save has several. Writes a new .gil in the workspace; the official save is not touched. allowJump false and allowClimb false were verified in play on 2026-10-11 (space pressed, the character stayed on the ground; pushed against a wall 2.4 m high it stopped, where with climbing on it climbed over); allowSprint too (with it off, two seconds of shift and D covered the 10.5 m that walking does; with it on, 17.4 m). allowGlide too (walking off a tower 12 m high and pressing space in the air: about a second to the ground with it off; with it on the character glides down at 2 m a second). health, attack, defence and stamina are the base combat attributes of the class and level the level a player starts it at (the character's real numbers are the base ones times the multiplier its level has on the growth curve of the class): a new map gives the character a base health of 10000, attack 500 and defence 500, which no ordinary enemy wears down, so a game in which the player can lose a fight sets a health to match its enemies. Read from the official samples (a class of health 1, a swordsman of health 100); health verified in play on 2026-10-12 (set to 300, the bar of a level 1 character reads 300 / 300).
| Name | Required | Description | Default |
|---|---|---|---|
| name | No | ||
| level | No | ||
| attack | No | ||
| health | No | ||
| defence | No | ||
| mapPath | No | ||
| stamina | No | ||
| allowJump | No | ||
| allowClimb | No | ||
| allowGlide | No | ||
| outputName | No | ||
| allowSprint | No | ||
| cameraTemplateId | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With destructiveHint=true declared, the description adds genuinely mitigating context: it writes a NEW .gil into the workspace and leaves the official save untouched, so the agent can reason about risk. It also discloses that health/attack/defence/stamina are base values multiplied by a growth curve at the given level, and cites play verification. It never says what happens to fields that are omitted (all 13 params are optional), which is the main behavioral blind spot.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Purpose and key fields are front-loaded in the first sentence, which is good structure. But the body is bloated with dated playtest forensics (specific meter distances, a 12 m tower, a 2.4 m wall, verification dates) that convey semantics at far more length than an agent needs, pushing the definition past 250 words.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a 13-parameter mutating tool with no annotations beyond hints and no output schema, the description supplies rich domain context: class-based ability model, combat-attribute math, camera sourcing, and output safety. The gaps are the unexplained mapPath and outputName, and the absence of any statement about defaults or required arguments when errors occur.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 0%, so the description carries the full burden and does most of it: allowJump/allowSprint/allowClimb/allowGlide are explained with concrete observed effects and units (17.4 m vs 10.5 m, 2 m/s glide), cameraTemplateId is tied to scene_list_cameras, name is tied to disambiguating among several classes, and level/health/attack/defence/stamina are explained relationally. mapPath and outputName are never mentioned, leaving two of thirteen parameters unexplained.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The first sentence names a specific verb (change) and resource (a class's abilities/camera) and enumerates the exact fields it controls, so an agent knows precisely what the tool mutates. It also draws the boundary against graph-based work ('abilities and camera belong to the class, not to node graphs'), which separates it from the graph-building siblings.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It gives real situational guidance: use it when a side-scroller or top-down game needs the right camera and unused abilities switched off, and it warns that a new map's default 10000 health makes the player invincible so games with losing fights must tune health. It names scene_list_cameras as the source for cameraTemplateId, but offers no explicit exclusions or pointer to scene_list_classes / scene_set_level_settings as alternatives.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
scene_set_client_scriptADestructive
Put a client script (客户端脚本) into a copy of a save, or replace the one of that name: Lua 5.3 that runs on the player's own machine and drives client controls (scene_add_client_ui puts those on the screen and says which script their root carries). This is the way to an interface that moves and answers the mouse and any key, to a menu, to a whole 2D game on the screen; a node graph cannot do these. The game calls the functions OnInit(), OnStart(), OnEnable(), OnDisable(), OnDestroy() when the script defines them, and OnUpdate(dt) every frame once the script has called script:EnableUpdate(true) (not before: seen in play). variables gives the script values it reads with script:GetParam(name): any of the twenty types the editor offers (integer, float, boolean, string, vector3, the ids guid, configId, prefabId and controlId, entity, and a list of each); one marked public can be given another value by each control that carries the script (scene_add_client_ui, script: {name, values}), which is how one script serves several controls. script.object is the control the script is on; control:GetChild(name) finds a control under it. From the level a script reads custom variables (game.GetGlobalCustomVariableValue(Enum.CustomVariableEntityType.PlayerSelf | Level | AvatarSelf, name), and script:RegisterCustomVariableChangedHandler to hear a change), so a graph tells the screen something that lasts by setting a variable; a graph sends the scripts of one player a message of the moment with f.sendSignal('client:NAME', player) (a signal of scene_add_signal; the script hears it with script:RegisterServerSignalHandler("NAME", function(name, params) ... end)); to the level a script sends a signal (game.ServerSignal(name):SendSignal()). Not available in this Lua: coroutine, io, load, loadfile, dofile, package, most of os and debug (refused here). require is there: require("NAME") runs the script whose file is NAME.lua (another script of the save, put there with this tool and carried by no control) once and gives what it returns, so a level can be several files; the name is the file name without .lua, letter for letter. Color(r, g, b, a) takes 0 to 255 (fractions give black), and the fill of an image (a bar that grows, a cooldown ring: SetFillHorizontal, SetFillRadial360, fillAmount) shows only on an image whose mask is on (mask: true in scene_add_client_ui, or control.enableMask = true): the result says so when the script looks like either mistake, as it does for an OnUpdate that was never enabled and a tween that was never played. A script that does not compile is refused here at once, with line and column; names it gets wrong (a function game does not have, an Enum value, a signal or a variable the save lacks) come back as problems, each with the nearest name there is; a fault while it runs comes back in the prints of the playtest with a traceback. read_knowledge {id:"client-lua.zh-CN"} is the page on writing one, with a worked script; the whole API is the official page (search_knowledge "客户端控件API文档"). Replacing a script keeps its id: the controls that carry it need no change, so a round of work on the Lua is this call and a playtest, and that playtest takes about a minute: when the save the last playtest opened is still open and nothing but the text of the scripts differs, playtest_start writes the Lua into the files the editor keeps beside the save (the game runs those) and plays, without importing anything. Writes a new .gil in the workspace; the official save is not touched.
| Name | Required | Description | Default |
|---|---|---|---|
| file | No | ||
| name | Yes | ||
| source | No | ||
| mapPath | No | ||
| variables | No | ||
| outputName | No | ||
| sourceFile | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations only say destructive=true, readOnly=false; the description adds what actually happens: a new .gil is written, the official save is not touched, replacing keeps the script id so controls need no change, and non-compiling scripts are refused immediately with line/column. It further discloses runtime error reporting via playtest prints and precisely which Lua features are unavailable.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Purpose is front-loaded, but the body is a dense, digressive run-on with heavy parentheticals (Color fractions, mask/fill gotchas, require naming rules, enumeration of the twenty types) that belong in the referenced read_knowledge page. Valuable content, but far beyond what earns a place in a tool definition.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a 7-parameter mutation tool with no output schema, the description covers behavior, lifecycle callbacks, validation, error surfacing and the playtest round-trip thoroughly. Only the file/path/output-naming parameters are left unexplained, which is a minor residual gap.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, so the description must carry the parameter burden. It thoroughly explains variables (the twenty types, script:GetParam, the public per-control flag), the name/replacement semantics and the source text, but file, mapPath, outputName and sourceFile are never explained — over half the parameters remain undocumented anywhere.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a precise verb+resource: writes a client Lua 5.3 script into a copy of a save or replaces the one with that name. It explicitly distinguishes itself from siblings: client UI is scene_add_client_ui's job, the script is what drives it, and 'a node graph cannot do these' separates it from scene_add_graph.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicit when-to-use rules: use scripts when the interface must move, respond to input, or host menus/2D games — something a graph cannot do. It also names the alternatives for cross-domain communication (graph sets a custom variable, graph sends f.sendSignal) and states the replace-vs-new behavior and the required follow-up playtest.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
scene_set_creature_logicADestructive
Give a complex creature its behaviour, in a copy of a save: the decision graph it runs all the time, the skills it can use and how it notices enemies. This is how a unit is made to do things on this platform (walk to a place, wander, work, flee, fight): an ordinary creature only reacts to enemies the way its asset was built to, a complex creature (an asset of the group "怪物(AI版)") does what its graphs say. prefab is a creature prefab made from a placed complex creature (scene_add_prefab {fromEntity}); every placed copy is changed too; entity names placed creatures instead. decisionGraphId is a graph made with scene_add_graph {kind:"creatureDecision"}: it looks at the situation and switches to one of several status graphs (kind "creatureStatus"), each a short list of tactics and skills with a condition on each: move to a point or to an entity, wander, stand still, pursue, flee, patrol, turn, execute a skill. These graphs read custom variables, so a server graph steers the creature by writing variables on it (where to go, what its job is, whether it is night). skills lists creature skills (scene_add_creature_skill) by name or id; they get the numbers 1, 2, ... in this order, which a status graph passes to f.executeSkill. cooldownSeconds of a skill is the wait after one use before the next, a number or [from, to] for a random wait (the editor's default is [0, 3]); firstCooldownSeconds the wait before its first use in a fight; sharedCooldownSeconds the wait every skill of the creature shares. logic is how the creature comes to fight (自主逻辑参数): noticeRadius, metres around it within which it notices an enemy whichever way it looks (范围感知; off when left out); sightDistance, how far it sees in front of it (视锥距离, 10); leaveCombatDistance, the distance to its target beyond which it gives up (脱战距离; the editor's 5 is less than its sight, so with logic it defaults to the larger of the two distances plus 6); leaveCombatDelaySeconds; territoryRadius, metres around the place it was created that it does not leave (领地, 50); chainRadius, within which its fellows join the fight (连锁入战距离). An enemy it notices becomes its aggro target (TargetEntity.AggroTarget in its graphs; f.queryIfEntityIsOnTheField tells whether there is one). Without logic the creature keeps its templates; one without any gets the template the editor makes. Writes a new .gil in the workspace; the official save is not touched. Without cooldowns and logic, byte for byte the two creatures of the official sample 复杂造物; the cooldown and logic numbers were each changed in the editor and read back on 2026-10-11.
| Name | Required | Description | Default |
|---|---|---|---|
| logic | No | ||
| entity | No | ||
| prefab | No | ||
| skills | No | ||
| mapPath | No | ||
| outputName | No | ||
| decisionGraphId | Yes | ||
| sharedCooldownSeconds | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already flag destructive=true and openWorld=false, and the description adds far more: every placed copy of the prefab is changed too, a NEW .gil is written to the workspace, and the official save is untouched. It also surfaces non-obvious consequences (graph numbering of skills drives f.executeSkill indices, editor-vs-tool defaults for leaveCombatDistance and cooldown [0,3]) that no annotation or schema conveys.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
It is front-loaded correctly — the first clause says what the tool does — but the body is a single dense run-on paragraph mixing parameter semantics, domain theory about decision/status graphs, and editor defaults. The closing provenance sentence (byte-for-byte comparison against the official sample, read back on 2026-10-11) is testing evidence rather than guidance an agent can act on.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a destructive 8-parameter mutation with nested objects and no output schema, the description covers the critical unknowns: it writes a new save file rather than mutating the official one, changes propagate to all placed copies, and unit-bearing numbers have stated defaults. It is thin on how to target a map/output and on failure modes when the prefab or graph id is invalid.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
With 0% schema description coverage the description carries the full burden, and it defines most parameters well: decisionGraphId's required graph kind, prefab vs entity addressing, skill identifiers and how they become indices 1, 2, ..., and all six logic fields with units, defaults and semantics. Two parameters (mapPath, outputName) are never explained, so the coverage is strong but not complete.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The opening states a specific verb and resource: it assigns behaviour to a complex creature by setting its decision graph, skill list and perception/combat logic, and it distinguishes complex creatures (group "怪物(AI版)") from ordinary asset-driven ones. That makes the tool's effect unambiguous despite the name suggesting only 'logic'. It loses a point only because the name/title mismatch (it also sets skills, prefab/entity targeting and output naming) takes a few sentences to untangle.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It explicitly scopes applicability ('a complex creature ... does what its graphs say', prefab must come from scene_add_prefab {fromEntity}, graph must come from scene_add_graph {kind:"creatureDecision"}), which tells the agent the prerequisites. It also says what happens if logic is omitted (creature keeps its templates). It never states a negative case, e.g. what to do for ordinary creatures, so there is no true when-not-to-use rule.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
scene_set_faction_hostilityADestructive
Set which factions fight each other, in a copy of a save. hostilePairs is the complete list of pairs that are hostile, e.g. [[1,3]] for "players and creatures fight, objects are left alone by everyone"; every pair not listed becomes friendly (友善), so neither side attacks the other. Use it when creatures attack things they should ignore (display objects, walls, scenery created at run time) or ignore things they should attack. Writes a new .gil in the workspace and returns its path; the official save is not touched.
| Name | Required | Description | Default |
|---|---|---|---|
| mapPath | No | ||
| outputName | No | ||
| hostilePairs | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Adds substantial context beyond the annotations: it writes a new .gil into the workspace and returns its path, and the official save is not touched — clarifying the blast radius implied by destructiveHint=true. It also discloses the non-obvious semantics that hostilePairs is the COMPLETE list and every unlisted pair becomes friendly, which no structured field conveys.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the operation, then semantics, then use case, then side effects — good ordering and no filler. Minor deductions for the redundant non-English gloss '友善' and for the slightly dense single-sentence hostilePairs explanation that packs example and consequence together.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a 3-param mutation tool with no output schema and no annotation detail, the description covers the essential risks (writes a copy, original untouched, whitelist semantics). It stops short of saying where hostilePairs IDs and mapPath are sourced from, which is the remaining gap an agent would hit in practice.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, so the description must compensate. It does so well for the required hostilePairs parameter — explaining completeness semantics, the pair format, and giving a worked example [[1,3]] with a behavioral reading. However mapPath and outputName are left entirely unexplained (outputName's pattern exists only in the schema), so coverage is partial.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb+resource ('Set which factions fight each other') plus the operating scope ('in a copy of a save'). An agent can immediately distinguish this from scene_list_factions or scene_set_class without opening the schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives concrete triggering symptoms: 'Use it when creatures attack things they should ignore ... or ignore things they should attack.' This is clear when-to-use guidance, but it never names an alternative tool or says where faction IDs come from (scene_list_factions is a sibling), so routing/exclusion guidance is incomplete.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
scene_set_level_settingsADestructive
Change level settings in a copy of a save. aggroMode "custom" switches the level to 自定义仇恨: the aggro nodes (setTheAggroValueOfSpecifiedEntity, tauntTarget, removeTargetEntityFromAggroList, clearSpecifiedTargetSAggroList) then work, so a graph can tell each creature whom to go for; "default" leaves target choice to the creatures. loadTier is the 负载需求档位 of the level: "low" (a new map; 1000) or "high" (4000; the editor warns that phones and consoles may not run such a level). Writes a new .gil in the workspace and returns its path; the official save is not touched.
| Name | Required | Description | Default |
|---|---|---|---|
| mapPath | No | ||
| loadTier | No | ||
| aggroMode | No | ||
| outputName | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already flag destructiveHint=true, and the description adds genuinely useful scope: it writes a NEW .gil into the workspace and leaves the official save untouched, which materially reassures the agent about what is at risk. It stops short of stating permission/auth needs or whether an existing outputName is overwritten.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Purpose is front-loaded in the first clause, and every subsequent sentence conveys operational detail rather than filler. It is a dense single paragraph and the switching between Chinese field labels (自定义仇恨, 负载需求档位) and English costs a little readability.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
No output schema exists, and the description still tells the agent what comes back (a new .gil path) and that the source save is unaffected. For a four-parameter, non-required, annotation-covered mutation tool, that covers everything needed to invoke it correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, so the description must carry the load; it explains the two enum parameters in real depth (aggro-node behavior, load tier values 1000/4000 and device warnings). mapPath and outputName are left completely unaddressed, and no defaults are stated despite nothing being required.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
"Change level settings in a copy of a save" states a specific verb and resource, and the aggroMode/loadTier explanations make the scope concrete. It never names scene_get_level_settings, so the read/write split with that sibling must be inferred from "Change" alone.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It gives strong guidance for choosing enum values ("custom" when a graph should direct each creature, "default" to leave it to creatures; "low" for a new map, "high" with a platform warning). It gives no guidance on when to call this versus scene_get_level_settings, nor on when all four parameters can be omitted given required=0.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
scene_set_player_countADestructive
Set how many players the level takes (关卡设置 > 人数设置) in a copy of a save: {min, max}, up to 8. A new map says 1 to 8, which is what the lobby and matchmaking go by once the level is published: a game made for one player says {min: 1, max: 1}. A playtest from the editor is one player whatever this says. Written as the official samples have it for 1 to 8 and 1 to 4.
| Name | Required | Description | Default |
|---|---|---|---|
| max | Yes | ||
| min | No | ||
| mapPath | No | ||
| outputName | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare a non-read-only, destructive mutation, and the description adds genuinely useful behavior: a new map defaults to 1–8, playtests always run as one player regardless, and published levels feed lobby/matchmaking. However, it never explains what 'a copy of a save' means or what existing data the destructiveHint implies gets overwritten, which is the key risk for a write tool.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The operative constraint (min/max, up to 8) is front-loaded and every clause carries information; the UI path parenthetical is a useful locator. It runs long as a single dense sentence-chain and the trailing 'official samples' remark is the least essential part.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
No output schema and four parameters, half of which are undocumented, plus an ambiguous 'copy of a save' target — for a destructive write tool this leaves real gaps. The behavioral notes about playtest and publishing are strong, but an agent still cannot confidently construct a call that specifies where the result is written.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
With 0% schema coverage, the description does compensate well for min/max — the 'up to 8' ceiling, the {min, max} pairing, the min:1/max:1 single-player example, and the 1–8/1–4 official-sample conventions. But mapPath and outputName are never defined; 'in a copy of a save' is the only oblique hint at what those two string parameters target.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Set how many players the level takes') and even anchors it to the editor UI location (关卡设置 > 人数设置). An agent can tell this configures player-count bounds rather than other level settings, and the min/max semantics are unambiguous.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Usage is only implied: the example values and the lobby/matchmaking note suggest when the setting matters, but the description never names an alternative such as scene_set_level_settings or scene_get_level_settings, nor states prerequisites like 'publish the level first'. An agent must infer routing from the sibling names alone.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
scene_set_reviveADestructive
Set how a player's character comes back after going down (the revive settings of the player template), in a copy of a save: seconds (the wait before reviving, 10 on a new map), auto (true: it revives by itself when the wait is over), showScreen (false: the platform's revive screen with its button does not come up), lives (how many times a player may revive, 10 on a new map), healthPercent (the health a revived character has, 40), fallLossPercent (the share of its greatest health a character loses when it falls out of the world and is put back, 10). An arcade respawn is {seconds: 2, auto: true, showScreen: false}; three lives is {lives: 3}, and a graph hears whenAllPlayerSCharactersAreDown when they are used up. The level needs a respawn point (scene_add_respawn_point). scene_list_respawn_points shows the settings. The fields were read by changing each in the editor on 2026-10-13. Verified in play that day (examples/hazards): with {seconds: 2, auto: true, showScreen: false} a player knocked down by f.defeatAllPlayerSCharacters got no revive screen and stood at the respawn point about five seconds later.
| Name | Required | Description | Default |
|---|---|---|---|
| auto | No | ||
| lives | No | ||
| mapPath | No | ||
| seconds | No | ||
| outputName | No | ||
| showScreen | No | ||
| healthPercent | No | ||
| fallLossPercent | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations declare destructiveHint=true, so the description does not need to establish that this is a mutation; it does add useful context per field, including defaults on a new map, and the note that an arcade respawn is a concrete field combination. It never says what happens to fields that are omitted or what existing settings are replaced, which is the main behavioral gap for a destructive write.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The opening sentence front-loads purpose and semantics well. The tail, however, is dominated by provenance metadata (the editor read on 2026-10-13, an examples/hazards playtest anecdote with an engine call name), which costs space without helping an agent decide whether to call the tool or how to fill the schema.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With 8 parameters, 0% schema coverage and no output schema, the description does most of the semantic work but leaves mapPath and outputName undefined and leaves unclear whether a partial object overwrites or merges with existing revive settings. Those omissions matter for a destructive write on a save copy.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 0%, so the description has to carry the parameter meaning, and it does for six of the eight fields: it gives units and defaults for seconds, lives, healthPercent and fallLossPercent, and the boolean polarity for auto and showScreen. mapPath and outputName are never explained, even though outputName is presumably the name of the save copy.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource: it sets how a player's character comes back after going down, i.e. the player-template revive settings, and it does so in a copy of a save. An agent can tell this apart from scene_set_spawn, scene_add_respawn_point and scene_list_respawn_points, all of which are named or implied as separate concerns.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It gives a precondition (a respawn point must exist, added via scene_add_respawn_point) and names scene_list_respawn_points as the read counterpart, which amounts to clear usage context. It does not explicitly exclude or contrast with scene_set_spawn, which is the nearest sibling an agent might confuse it with.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
scene_set_spawnADestructive
Set where players start and which way they face, in a copy of a save: the position and rotation ([x, y, z], rotation in degrees, y is the heading) of the preset point the level's spawn point uses. This is the platform's way to place the player at the start; a graph does not have to teleport anyone when the level begins. Stay on the ground: the flat ground of a new empty map ends about 32 m from its middle (a player teleported to x=32 fell out of the world), so keep the start, everything a creature is to walk to and every place a graph creates something within 30 m, or bring floor pieces of your own. The camera starts behind the character, so the heading also decides the first view (for a side view along x, face across the lane). Writes a new .gil in the workspace; the official save is not touched. Verified in play on 2026-10-10.
| Name | Required | Description | Default |
|---|---|---|---|
| mapPath | No | ||
| position | No | ||
| rotation | No | ||
| outputName | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description discloses critical behavior beyond the annotations: it writes a new .gil in the workspace while leaving the official save untouched. It also explains coordinate semantics, camera behavior, and a concrete failure mode (falling out of the world beyond ~32 m), which is valuable for safe invocation.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is front-loaded with the core purpose and then layers in practical constraints. It is somewhat long for a four-parameter tool, and the verification date is not essential, but most sentences contribute actionable context.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a tool with no output schema and no schema parameter descriptions, the definition covers the main behavior, safety implications, and spatial constraints well. It is still incomplete on mapPath and outputName semantics, which an agent would need to infer.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, so the description must carry the parameter burden. It explains the position and rotation arrays well, including degrees and that y is the heading, but it does not explicitly document mapPath or outputName, leaving two of four parameters only implied.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb and resource: it sets the player spawn position and rotation in a copy of a save. It also distinguishes the tool from graph-based teleporting by explaining that this is the platform's way to place the player at level start.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It gives clear usage context: use this to place the player at start instead of having a graph teleport them, and stay within about 30 m of the map center unless adding floor pieces. It does not explicitly compare against siblings like scene_add_respawn_point, so it stops short of full when/when-not guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
scene_update_prefabADestructive
Change a prefab that already exists, in a copy of a save: its scale, the asset it shows, or its health. The prefab keeps its id, its components (triggers, option tabs, variables, hurt boxes) and the graphs attached to it, so nothing has to be made or attached again and the graphs that create it stay as they are: the way to make a wall thicker, a coin smaller, or to give a station another look after seeing it in a playtest. prefab is its name or id (scene_list_prefabs). scale is a number or [x, y, z] (1 = the natural size of the asset; the result gives the size in metres). asset swaps the model of an object prefab for another object asset (id or unique name from scene_search_assets); mechanism assets, the ones with a preset status, and creatures cannot be swapped in or out. health is the base health, as in scene_add_prefab. The areas of the triggers and option tabs of a prefab grow with its scale, so look at them again after a change of scale. Entities that were placed in the editor from this prefab keep their own scale.
| Name | Required | Description | Default |
|---|---|---|---|
| asset | No | ||
| scale | No | ||
| health | No | ||
| prefab | Yes | ||
| mapPath | No | ||
| outputName | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Goes well beyond the destructiveHint=true annotation: the prefab keeps its id, components and attached graphs, trigger and option-tab areas grow with scale, editor-placed entities retain their own scale, and mechanism assets and creatures cannot be swapped. These are non-obvious side effects an agent could not infer from the schema.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the change operation, then progressively deeper detail; nearly every clause carries a constraint or example. The colon-chained sentence structure makes it denser than it needs to be, but little is wasted.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a destructive six-parameter mutation with no output schema, the description covers preservation semantics and side effects thoroughly. The gap is that mapPath and outputName — presumably how the modified save copy is written — are entirely unexplained, which matters for a tool that writes state.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
With 0% schema coverage the description must carry the load, and it explains four of six parameters richly — '1 = natural size of the asset', scale accepts a scalar or [x,y,z], asset accepts an id or unique name, health is the base health as in scene_add_prefab. mapPath and outputName are never mentioned, leaving the destination of the 'copy of a save' ambiguous.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Specific verb plus resource ('Change a prefab that already exists') with the mutable facets enumerated (scale, asset, health) and the scope narrowed to a copy of a save. It is immediately distinguishable from scene_add_prefab by the 'already exists' framing.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Usage context is concrete — 'the way to make a wall thicker, a coin smaller, or to give a station another look after seeing it in a playtest' — and it points at scene_list_prefabs and scene_search_assets for the id/name lookups. It implies but never states the negative case (use scene_add_prefab when the prefab does not exist yet).
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
search_knowledgeARead-only
Full-text search of the offline knowledge base: the official Miliastra guide (every component, level setting, UI control, class, item/currency/shop system and node, 219 pages), the official course (84 lessons with step-by-step editor configuration), the FAQ, dissections of 48 official sample saves (which graphs hang on which entities, which events they use) and transcripts of the official videos. Use it before inventing a mechanic: the platform usually already has a component for it (collision trigger, option tab, timer, custom variable, currency, shop, UI text). Chinese or English words separated by spaces; hits come back as the best matching sections. section limits to guide / course / faq / samples / transcripts / notes / examples. The examples section holds our own worked levels, each recorded from a real run made with these tools only: every tool call in order with its arguments, and the source of every node graph (read_knowledge {id: "example-events"} is the small one to copy, "example-kingdom4" a whole game with a day and night and enemies, "example-hop" a platform course with a moving platform, a lever and gate, a skill and a countdown, "example-farm" a grow-and-sell loop with plots that keep their own state, tools, a signal that carries a string and currency, "example-checks" one use of each newer tool, "example-skills" three animated skills on three keys, "example-shop" a stall with the platform's shop screen, bought from and sold to by a script that clicks, "example-drops" a drop picked up and a chest that leaves loot, "example-buttons" two buttons on the screen, "example-strike" a sword attack that hits a crate and a creature, which leave loot, "example-raid" a fourth game: fight, pick up the loot, sell it, buy a key, open the gate, "example-potion" an item used from the backpack, "example-shoot" a bolt shot by a skill).
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | ||
| query | Yes | ||
| section | No | all |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already establish readOnlyHint=true, openWorldHint=false, and destructiveHint=false. The description reinforces the offline nature of the knowledge base and explains that hits come back as best matching sections, but does not discuss pagination, rate limits, or exact result shape.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Purpose and usage are front-loaded, but the description is extremely long, especially the exhaustive enumeration of example IDs and their contents. That enumeration could be compressed or moved to documentation without losing the call-critical information.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The description covers the knowledge-base scope, query syntax, and section choices well. However, with no output schema it only vaguely states that hits are 'best matching sections', and it leaves the limit parameter undocumented, so it is not fully complete for an agent that needs predictable results.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
With 0% schema description coverage, the description must carry parameter meaning. It explains query tokenization ('Chinese or English words separated by spaces') and lists the section values, including detailed examples content, but never explains the limit parameter.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource — 'Full-text search of the offline knowledge base' — and enumerates the corpora it covers, distinguishing it from scene-authoring siblings. The examples section is clearly described as a distinct searchable corpus.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives a clear usage trigger: 'Use it before inventing a mechanic', because the platform usually already has a component. It does not explicitly compare itself with read_knowledge or search_node_docs, so the alternative-routing guidance is incomplete.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
search_node_docsARead-only
Find what a server node graph can call and listen to. Each hit is a node method or an event with its signature, what it does and what every parameter (or event field) means, in English and Chinese. Search by words from the name or the description in either language: "createPrefab", "特效", "patrol", "hp loss", "when timer". query "*" lists every node and event name, which is the quickest way to see what the platform offers. Hits beyond limit are listed by name in otherMatches. scope "raw" greps all bundled definition files instead (client graphs, enum members). queries: [...] asks up to 30 searches in one call (a level needs thirty or forty nodes, and one call for each was the slowest part of writing a graph in a blind test): each gets its own results, limit then counts for each query (three or four is enough when you know the names).
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | ||
| query | No | ||
| scope | No | server | |
| queries | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare read-only, so the extra value here is real: it discloses truncation behavior (overflow hits appear by name in otherMatches), per-query limit semantics in batch mode, and that scope "raw" bypasses structured search to grep bundled files including client graphs and enum members. It does not say what happens if neither query nor queries is supplied, which is the main remaining behavioral gap.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Purpose is front-loaded, but the body is one dense run-on paragraph mixing search syntax, wildcard behavior, raw scope, batch mode and editorial asides ('the slowest part of writing a graph in a blind test', 'three or four is enough'). The content is mostly useful; the packaging would benefit from line breaks or short labeled clauses.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema, the description does the job of describing returns: hit shape, bilingual content, otherMatches overflow, and per-query results in batch mode. Only the empty-argument behavior and the relationship to sibling knowledge tools are left unstated.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 0%, so the prose must carry all four parameters, and it largely does: limit's role via otherMatches and per-query counting, scope 'server' vs 'raw', queries as up to 30 batched searches. It never names the parameters explicitly or explains the optional-both case, so mapping prose to field names takes a small inference step.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource — search the node graph API docs — and describes exactly what a hit contains (method/event signature, behavior, per-parameter meaning, bilingual). It is clear about its domain, but never names the sibling search_knowledge/read_knowledge tools, so an agent must infer which search to reach for.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives concrete usage advice: query "*" to enumerate everything, scope "raw" for grepping bundled definition files, and queries[] batching for levels needing 30-40 nodes with 'three or four is enough' per query. No exclusions or when-not-to-use guidance relative to the sibling knowledge-search tools.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
sound_catalogARead-only
The sound effects of the platform, by name and category (环境 surroundings, 生物敌人叫声 creature voices, 角色动作 character moves, 战斗 fighting, 物件 objects, 界面音效 interface sounds such as clicks, confirmations, errors and rewards, 操控对象 vehicles). A graph plays one for a player with f.playerPlaysOneShot2dSoundEffect, or gives an entity a looping one with f.addSoundEffectPlayer; the result shows both calls. A level without sound feels like a prototype: give every action of the player a sound (picked up, bought, refused, hit, built, night falls, lost, won). query: words of the Chinese name; queries: several searches in one call, one list each; category: one of the categories. Names and ids were read from the editor's sound library on 2026-10-11; names longer than its list is wide end in …. Read-only.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | ||
| query | No | ||
| offset | No | ||
| queries | No | ||
| category | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true and destructiveHint=false, and the description's "Read-only." merely repeats them. It does add genuinely useful non-annotation context: the data snapshot date (2026-10-11) and the truncation convention ("names longer than its list is wide end in …"), but says nothing about pagination behavior despite limit/offset existing.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The purpose and category list are front-loaded, which is good, but the sentence about levels feeling like prototypes and the eight-example list in parentheses (picked up, bought, refused, hit...) is decorative padding, and "Read-only." duplicates the annotation.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
There is no output schema, and the description only loosely indicates what comes back (names and ids, category); it mentions the result "shows both calls" in the graph, which hints at rendered snippet output but doesn't define fields. Pagination semantics for limit/offset are also absent, leaving meaningful gaps for a 5-parameter search tool.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, so the description must carry the load; it explains query (Chinese name words), queries (multiple searches, one list each) and category (one of the listed categories), which is real added meaning. Limit and offset — with a default of 40 and a cap of 300 — are left completely unexplained, so the gap is only partly compensated.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Opens with a specific resource and its indexing keys ("The sound effects of the platform, by name and category") and enumerates the categories, so an agent knows exactly what domain this covers. It never explicitly names music_catalog or effect_catalog as the siblings it is not, which is the only thing keeping it off a 5.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives concrete trigger context ("A level without sound feels like a prototype") plus the enumeration of events that should each get a sound, which tells an agent when this catalog is needed. It stops short of exclusions, e.g. when to prefer music_catalog or effect_catalog instead.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
write_graphsADestructive
Write the source of node graphs into a copy of a save, one graph or many in one call: each {graphId, code} is type-checked, compiled and written in place of that graph, and the save with all of them is returned. graphId is a graph that exists in the save (scene_add_graph returned it; inspect_map lists them), code its whole Genshin-TS source. Returns the mapPath of the save with all of them written, and for each graph the size the editor will count (limits) and any warnings. If one does not compile it stops there: failed names the graph and carries the compiler's errors, mapPath is the save with the graphs written before it, and the call can be repeated with the corrected graph and the ones after it on that mapPath. A level of ten graphs is one call instead of fifty. The graphs of one call are type-checked and compiled together, which takes about as long as one graph alone (thirty-seven graphs: a quarter of a minute; one by one they took four and a half): send all the graphs of a level, or all that changed, in one call. After a change to a few graphs, send only those, on the mapPath that has the others. A defineSignal that does not agree with the signal in the save (other types, another order or count; for client:NAME the player first) is refused with the declaration to use (SIGNAL_PARAMETERS_DIFFER): the values travel by their place and the compiler would take any.
| Name | Required | Description | Default |
|---|---|---|---|
| graphs | Yes | ||
| mapPath | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Goes well beyond the annotations (which only flag destructive=true): it discloses that writes go into a copy of the save, that graphs are type-checked and compiled before writing, partial-failure semantics ('if one does not compile it stops there', failed names the graph, mapPath holds prior writes), the per-graph size/limits and warnings returned, and a distinct refusal case (SIGNAL_PARAMETERS_DIFFER) with its cause. That is dense, non-obvious behavioral context an agent could not infer from structured fields.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the core action and returned value before the failure and performance details, and every paragraph adds operational value. It is slightly bloated though: the batching rationale is stated twice ('A level of ten graphs is one call instead of fifty' and the thirty-seven-graphs timing anecdote), and the final defineSignal sentence is a long run-on.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
There is no output schema, and the description compensates by explaining the return shape (mapPath, editor-counted size per graph, warnings) and the error shape (failed graph name plus compiler errors). For a batched mutation tool with nested objects and no annotation richness beyond destructive=true, nothing needed to invoke it correctly is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, so the description must carry the load and it does: graphId is documented as 'a graph that exists in the save' with provenance ('scene_add_graph returned it; inspect_map lists them'), code as 'its whole Genshin-TS source', and mapPath implicitly as the save copy carried between calls for incremental retries. This compensates fully for two undocumented schema properties.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Write the source of node graphs into a copy of a save') plus the batched shape ('one graph or many in one call'). It also disambiguates from the closest siblings by naming them: 'scene_add_graph returned it; inspect_map lists them' establishes that this tool consumes existing graph IDs rather than creating graphs.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives explicit prescriptive guidance: 'send all the graphs of a level, or all that changed, in one call' and 'After a change to a few graphs, send only those, on the mapPath that has the others.' It also documents the failure-retry path (repeat with the corrected graph and the ones after it on that mapPath), so the agent knows exactly what to do both before and after an error.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
Tool Schema Changelog
Recent tool additions, removals, and schema changes observed during successful MCP inspections.
85 tool updates
v0.1.0- First observed
capture_editor_window - First observed
creature_animations - First observed
editor_input - First observed
editor_open_map - First observed
editor_preview_interface - First observed
effect_catalog - First observed
focus_editor_window - First observed
get_capabilities - First observed
image_catalog - First observed
inspect_map - First observed
list_editor_windows - First observed
list_maps - First observed
music_catalog - First observed
playtest_frames - First observed
playtest_start - First observed
playtest_status - First observed
publish_kit - First observed
read_knowledge - First observed
scene_add_button - First observed
scene_add_card_selector - First observed
scene_add_client_template - First observed
scene_add_client_ui - First observed
scene_add_components - First observed
scene_add_creature_skill - First observed
scene_add_currency - First observed
scene_add_environment - First observed
scene_add_global_timer - First observed
scene_add_graph - First observed
scene_add_image - First observed
scene_add_item - First observed
scene_add_light - First observed
scene_add_prefab - First observed
scene_add_preset_point - First observed
scene_add_progress_bar - First observed
scene_add_respawn_point - First observed
scene_add_shop - First observed
scene_add_signal - First observed
scene_add_skill - First observed
scene_add_text_box - First observed
scene_add_timer_display - First observed
scene_add_unit_status - First observed
scene_asset_images - First observed
scene_batch - First observed
scene_block_catalog - First observed
scene_build_blocks - First observed
scene_check_client - First observed
scene_get_client_ui - First observed
scene_get_level_settings - First observed
scene_import_assets - First observed
scene_import_simulator - First observed
scene_list_cameras - First observed
scene_list_classes - First observed
scene_list_client_scripts - First observed
scene_list_components - First observed
scene_list_creature_skills - First observed
scene_list_currencies - First observed
scene_list_entities - First observed
scene_list_environments - First observed
scene_list_factions - First observed
scene_list_global_timers - First observed
scene_list_interface - First observed
scene_list_items - First observed
scene_list_prefabs - First observed
scene_list_preset_points - First observed
scene_list_respawn_points - First observed
scene_list_signals - First observed
scene_list_skills - First observed
scene_list_unit_statuses - First observed
scene_remove_client - First observed
scene_remove_entities - First observed
scene_search_assets - First observed
scene_set_camera - First observed
scene_set_class - First observed
scene_set_client_script - First observed
scene_set_creature_logic - First observed
scene_set_faction_hostility - First observed
scene_set_level_settings - First observed
scene_set_player_count - First observed
scene_set_revive - First observed
scene_set_spawn - First observed
scene_update_prefab - First observed
search_knowledge - First observed
search_node_docs - First observed
sound_catalog - First observed
write_graphs
TDQS
Scored across 85 tools
The set is large but the scene_/editor_/playtest_ prefixes and add/list/set/remove verbs make nearly every tool target a distinct resource+action (e.g. scene_add_skill vs scene_add_creature_skill vs scene_list_skills). A few pairs blur: scene_add_image / scene_add_text_box / scene_add_client_ui all put things on screen, and scene_set_camera / scene_set_class both touch cameras, though the long descriptions spell out the boundaries.
Most tools follow a consistent snake_case verb_noun pattern with a domain prefix (scene_add_*, scene_list_*, scene_set_*, playtest_*). Deviations are minor: catalog tools are noun-only (effect_catalog, sound_catalog, creature_animations) and a few top-level tools lack prefixes (list_maps, inspect_map, write_graphs).
85 tools is far beyond a comfortable surface for an agent to reason over, even for a rich game-editor domain spanning scene building, UI, scripting, playtests and publishing. scene_batch and playtest_start consolidate some workflows, but selection overhead and description volume remain heavy.
Coverage is strong across the lifecycle: create/read/update for prefabs, components, skills, items, currencies, shops, signals, timers, UI and scripts, plus read-only listers for nearly every resource and a full playtest/publish loop. Gaps are minor but real: no deletion/update tools for items, currencies, skills or signals, and some skill/item features (combos, cooldowns on definitions, equipment) are explicitly not supported.
Maintenance
Related MCP Connectors
Make games with AI: one MCP server that connects your agent to Unity, Unreal and Godot editors.
MCP server for Hailuo (MiniMax) AI video generation
MCP server for ByteDance Seedream AI image generation
Hosted Screenshots MCP server for Claude, ChatGPT and Cursor, with each action switched per account.
Related MCP Servers
- AlicenseAqualityAmaintenanceA TypeScript MCP server that lets AI assistants interact with the Godot 4.x game engine: not just editing files, but playing the game.391,176 npm96MIT
- AlicenseNot gradedqualityBmaintenanceAn MCP server enabling AI agents to author Unreal Engine 5 scenes directly, with tools for spawning actors, building PCG graphs, validating physics, generating terrain, and more through a single MCP connection.12MIT
- AlicenseNot gradedqualityCmaintenanceAn AI-native game engine MCP server that enables AI agents to create, modify, and run games using 53 tools for scene creation, physics, audio, 3D rendering, and AI-generated images and music.1MIT
- AlicenseBqualityCmaintenanceAn MCP server that lets an AI agent drive Unreal Engine 5: create projects, import assets, build levels and Blueprints, configure replication, compile C++, run Play In Editor and package the game.100105 PyPI5MIT


