Genshin Miliastra MCP

Lets an AI assistant build levels for Miliastra Wonderland, the UGC editor of Genshin Impact: place scenes from a catalogue of 2,468 official props, write node graphs in TypeScript, then playtest automatically and read back logs and screenshots. Windows only.

Documentation

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 用千星奇域 MCP 做的竞技场清怪游戏AI 用千星奇域 MCP 做的机关逃脱游戏AI 用千星奇域 MCP 做的躲避生存游戏

上面三局是三个没参与过开发的 AI 各自只拿到这套工具、从空白地图做出来并按脚本打通的(经过和它们卡在哪)。

AI 自己进游戏试玩。 下面这段是工具录的:一局用客户端 Lua 写的翻牌配对(examples/pairs),工具把它写进存档、打开游戏、照脚本点暂停、继续、翻完十二张牌,一直打到游戏自己的胜利画面,再把日志和画面拿回来对照。没有人碰鼠标。

AI 通过 MCP 在原神千星奇域里自动试玩一局 Lua 写的翻牌配对游戏

它能做什么

  • 搭场景:2468 种官方物件的图鉴,按名字搜、看缩略图,一次导入一百个物件;锁定视角、出生点、复苏点、昼夜和灯光。

  • 做机关和怪:元件、碰撞触发器、按 F 交互、移动平台、弹跳垫、力场、隐形墙、投射物和命中检测、会自己找敌人打的复杂造物、技能、道具、商店、货币;NPC 头顶的对话气泡、名字、血条。

    NPC 头顶的名字、血条、图标、进度条和对话气泡战斗里跟着掉的血条
  • 做界面:进度条(横条、竖条、圆环)、图片(约 1600 张平台自带的图)、计时器、按钮、卡牌选择器(三选一)。

    卡牌选择器:三张卡里选一张
  • 写客户端 Lua(游戏 7.1 的新能力):会动、能收鼠标和按键的界面,甚至整局 2D 小游戏;脚本的打印和节点图的打印一起从试玩里拿回来。

    工具做的客户端界面:静态图片、网格列表、运行时造的圆点

  • 写规则:节点图用 TypeScript 写,一次编译几十张图写进存档;自带节点文档、特效(3195 条)、音效(1997 条)、音乐(188 条)的中文目录。

  • 自己试玩:按脚本按键、点鼠标、把玩家放到指定位置,截图、连拍、录音、录像,读回日志;AI 靠这个知道做出来的东西在游戏里到底对不对。

  • 发布前的准备:出封面、截图、标题和简介。发布本身由你在游戏里点。

  • 离线知识库:官方综合指南、教程、48 份官方教学存档的拆解,加上一份实测出来的平台规则,AI 设计玩法前先查。

自带的图鉴:缩略图和编号

千星奇域里的物件、特效、音效、图片,在存档和节点图里都是靠编号引用的。编号在编辑器里看得到,但本地数据里没有现成的表可查。这个仓库把它们整理成了图鉴,大部分是从编辑器里一样一样读出来、拍下来的,AI 按中文名字就能查到编号、看到长相再挑:

千星奇域物件图鉴:缩略图、编号和名字

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

千星奇域界面图片库的一页:每张图下面是编号

这些都是普通的 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 doctor

npm 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.mjs
  • MILIASTRA_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 是给你看的摘要。

第一次用

  1. 在游戏里“我的奇域 → 新建存档”(超限模式),进编辑器存一次,记住存档名。
  2. 对 AI 说类似这样的话:

使用 miliastra MCP。先读资源 miliastra://workflow 和 miliastra://platform-rules。在我的空白存档「XXX」上做一个一分钟的小游戏:捡齐五个金币就赢,倒计时走完就输。做完用 playtest_start 按脚本各打一遍赢和输,把结算画面的截图给我看;分别告诉我哪些是编译通过、哪些是在游戏里真的验证过的。

AI 做出来的东西写在存档的副本里;试玩时工具把副本导入成一份新存档并打开。发布由你自己在游戏里点,工具不点。

玩法代码是 Genshin-TS 支持的 TypeScript 子集;物件、特效、音效的编号都从工具自带的图鉴里查,不用自己找。

工具

工具作用
get_capabilities版本、功能、限制、路径、写入开关
list_maps / inspect_map存档发现、真实图 ID、名称、类型、节点数;同名的存档会标出来
search_node_docs搜索依赖自带的中英文节点定义(queries 一次查多个词)
effect_catalog / sound_catalog / music_catalog平台自带的特效(限时 1986、循环 1209)、音效(1997)、背景音乐(188):按中文名字查编号,特效带缩略图,结果里有节点图里的用法。名字和编号是从编辑器的资产库里抄下来的
scene_search_assets / scene_asset_images2468 种官方物件的图鉴:按名字查(queries 一次查多个词,查不到会给相近的名字)、按编号看缩略图
scene_add_prefab / scene_update_prefab / scene_list_prefabs做元件(图里 createPrefab 造出来的东西):物件、由摆好的怪做成的造物、掉落物(drop);机关物件带预设状态(宝箱开合、拉杆、活板门,45 个已对上),health 定生命值;scene_update_prefab 改已有元件的缩放、模型、生命值,编号、组件和挂的图都不变
scene_add_components / scene_list_components给元件加平台自带的组件:碰撞触发器、选项卡(按 F 交互,可带布尔过滤器)、自定义变量、基础运动器(直线、路径)、跟随运动器、小地图标识、文本气泡(NPC 头顶一句接一句的话)、铭牌(头顶的名字、图标、跟着变量走的条、血条,以及离远了指路的导航指示器)、自定义挂接点、受击盒、能力单元、弹射器(launcher:碰到的角色被弹出去,弹跳垫、推人的机关)、战利品、投射运动器(直线、抛物线、追踪目标)和命中检测(子弹;可只碰敌对阵营、可开连续碰撞检测)。范例 examples/events
scene_add_graph新建一张空图并挂好:关卡实体、元件(可一图挂多个元件)、玩家模板、角色模板;也能建客户端的技能图、过滤器图和道具图
scene_add_signal / scene_list_signals信号(全关卡广播),可带好几个参数:整数、浮点数、布尔值、字符串、三维向量、实体、GUID、元件 ID、配置 ID 和它们的列表(编辑器给的十八种类型);节点图之间、Lua 脚本发给节点图、节点图发给 Lua 脚本、客户端节点图发给服务器四条路都上机验过(examples/signalparams、examples/brain)
scene_add_global_timer / scene_list_global_timers / scene_add_timer_display全局计时器(倒计时或正计时)和屏幕上显示它的计时器控件
scene_add_creature_skill / scene_list_creature_skills / scene_set_creature_logic复杂造物(“怪物(AI版)”那 48 种):定义造物技能(一段或几段动画加一张技能图,可设自动面向目标),给造物元件绑上决策图和技能表(每个技能的冷却),设它多远发现敌人、多远放弃、领地多大。配合三种造物图(scene_add_graph 的 creatureDecision / creatureStatus / creatureSkill),单位就能按图走位、闲逛、干活、自己发现敌人、追上去打。做法见 knowledge/notes/complex-creatures.zh-CN.md,范例 examples/brain、examples/skirmish,整个游戏见 examples/kingdom6
creature_animations复杂造物的动画表:名字、编号、时长、是否循环(读了 18 种 296 条)。造物技能按名字或编号选动画。造物的模型都是空手的:表里还写了每种造物手里能拿什么、上机逐帧看过的那些动作是什么样、哪一毫秒算数(atMs,直接当技能的 graphAtMs)
scene_add_skill / scene_list_skills技能:瞬发,或带一段角色动画的普通技能(可在某一毫秒触发技能图、手里挂武器);技能图里打攻击盒就能打到怪和带受击盒的物件
scene_add_currency / scene_list_currencies货币,以及角色身上的背包
scene_add_item / scene_add_shop / scene_list_items道具(材料,或带道具节点图、能在背包里使用的消耗品);把元件做成商店(平台自带的买卖界面)
scene_add_progress_bar / scene_add_button / scene_add_image / scene_list_interface屏幕上的进度条(跟着玩家变量走;可以是横条、竖条、圆环,可以直接显示当前值的数字,颜色可改)、交互按钮(按数字键触发,玩家模板上的图收事件)和图片(平台自带的图,或一块纯色的底板:不靠文字也能把话说清楚);控件可以一开始隐藏,由节点图开关
scene_add_card_selector卡牌选择器:平台自带的“几选一”窗口(每张卡有图标、标题、描述;单人关卡里打开时游戏暂停),节点图用 f.invokeDeckSelector 唤起、玩家模板上的图收到选了哪张。记录和官方样例“卡牌选择器”逐字节相同
scene_add_unit_status / scene_list_unit_statuses单位状态:描边、透视、加生命上限;图里加减
scene_add_environment / scene_list_environments / scene_add_light固定时刻的环境配置(昼夜靠两套配置切换;按编辑器的写法写,白天不会过曝)和属于某套配置的点光源
scene_set_client_script / scene_add_client_ui / scene_add_client_template / scene_remove_client / scene_list_client_scripts客户端界面(游戏 7.1):把 Lua 5.3 脚本放进存档,在屏幕上摆一棵由它控制的客户端控件树(十一种:图片、光标检测区域、容器、网格视窗、模板引用、预设按钮、按键提示、文本框等),还能做脚本运行时照着造的控件模板。界面可以每帧在动、收鼠标和按键,整局 2D 玩法也能做;和节点图靠自定义变量和信号互通(节点图也能直接给脚本发信号:f.sendSignal('client:名字', 玩家))。脚本变量二十种类型都能定,同一个脚本挂在几个控件上可以各给各的值;控件能按设备(电脑、手机、主机)给不同的位置,能指定手柄摇杆往哪走。图片能直接带填充(横、竖、四分之一圈、半圈、整圈)、边缘羽化和遮罩反转,进度条和冷却圈不用脚本画;scene_get_client_ui 把已有的界面读回成参数,改完 replace: true 原位换回去。做法见 knowledge/notes/client-lua.zh-CN.md,脚本写进存档时当场查:语法错直接拒绝并给出行列,写死的控件名、信号名、变量名、接口名、图片和音效编号逐个对存档、节点图和图鉴(scene_check_client),对不上的给出行号和最接近的名字;运行时的错带着调用栈从试玩日志里回来。只改 Lua 的一轮不重新导入存档,真机上大约一分钟一轮。editor_preview_interface 让编辑器把界面画在手机、主机的画布上各截一张;scene_import_simulator 把千星沙箱模拟器的工程整个写进存档上真机。范例 examples/clientui、examples/clientgame、examples/clientlist、examples/clientmenu、examples/clientcheck、examples/clientvars、examples/clientsignal、examples/clientapi、examples/clienttext,以及整局游戏 examples/pairs
image_catalog界面图片控件能用的全部图片(约 1600 张,15 类:功能图标、玩法图标、装饰图案、底板、分隔线、特殊字符、技能、道具、造物头像):按分类返回编辑器图库的照片,每张图下面是编号
scene_remove_entities把已经导入场景的物件从存档副本里拿掉(按名字或名字前缀):导入只能加,摆错的靠它减
scene_list_classes / scene_set_class职业:角色能不能跳、冲刺、攀爬、滑翔,用哪个镜头模板;角色的等级和基础生命、攻击、防御、体力(新地图默认一万血,打不死)
scene_set_spawn / scene_add_preset_point / scene_list_preset_points出生点和图里按编号读取的命名位置
scene_add_respawn_point / scene_list_respawn_points / scene_set_player_count复苏点(角色倒下后回来的地方;配合图里的复苏次数、激活复苏点做命数和存档点);关卡收几个人(发布单人游戏要设成 1 到 1)
playtest_start / playtest_status一键试玩:导入存档、订阅日志、按脚本按键 / 点鼠标 / 点屏幕上的字、截图(可以隔零点几秒连拍,screenshotWidth 调大留细节)、读屏幕文字、收日志;recordAudio 把这一局的声音录下来,报告每秒的响度和每个声音开始的时刻;bakeNavigation 试玩前在编辑器里烘焙寻路网格(复杂造物的闲逛、追击需要)。电脑的显示器要开着,没有显示器时游戏出不了画面,工具会直接报出来。输入里的 teleport 把玩家放到指定位置(每次之后报人到没到)、trackPlayer 记录玩家的位置并把每条打印换算成试玩秒数(往存档副本里加一个小探针);startValues 给自定义变量另设这一轮的初值(从关卡后半段开始验);同一份存档接着玩会跳过导入;playtest_status 的 waitSeconds 等到这一轮结束再回话;recordVideo 用系统的 Xbox Game Bar 录一段视频
playtest_frames把一次试玩里某一段的截图裁到同一块区域、标上秒数、拼成一张图:逐帧看动作(武器在不在手上、落刀和伤害数字对不对得上、飞刀是不是手松开时出去的)。打印看不出这些
publish_kit发布前的准备:从试玩截图里出封面和四张图(1600×900)、标题、描述、标签和一张对照官方要求的检查表,放进一个文件夹。真正的发布由创作者自己在游戏里做
search_knowledge / read_knowledge离线搜索官方综合指南、教程、常见问题、48 份官方教学存档的拆解和教学视频文字稿(knowledge/);总结见 千星奇域是怎么搭游戏的
write_graphs写节点图:一次调用把一张或多张图的源码类型检查、编译、写进存档副本(三十七张图约二十秒),返回可以试玩的存档和每张图的节点数;哪张编译不过就停在哪张并报出错误;只改了几张就只发那几张。早先分五步做的那组工具(建项目、改源码、构建、预览、写入)默认不再列出,要用时设环境变量 MILIASTRA_STEP_TOOLS=1
list_editor_windows枚举原神与千星沙箱窗口、实际窗口 ID 和坐标
capture_editor_window返回 MCP 内联 PNG、原图文件、缩放比例和质量提示
focus_editor_window将指定编辑器窗口置于前台并返回新截图
editor_input基于截图执行一次点击、按键、文字、滚动或拖拽,再返回新截图

资源 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 所在的程序也要以管理员身份运行,否则按键发不进去。

一轮的固定开销约两分钟(导入、打开、订阅、加载),加上试玩时长。

试玩跑完只代表关卡被玩了这么久。玩法对不对,要看返回的打印和截图自己判断。设计关卡和测试前先读 平台规则,里面是实测出来的坑,比如造物离玩家太远就不行动。

搭场景

场景可以写成一份方块清单,由工具生成官方资产包再导进编辑器。导进去的是能选中、能手调的真实物件。

  1. scene_block_catalog:看有哪些方块可用(箱子、立方体、墙体等 21 种),各自的颜色和原始尺寸。
  2. scene_build_blocks:给出每个物件的模板(方块名或物件编号)、位置和旋转(度),再给尺寸(米,拉伸到正好这么大)或缩放(1 是模型原大小)。方块能任意拉伸,一块就可以是一整面墙或一片地板。它会生成 .gia 并放进编辑器的导入目录。
  3. 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 工具:

  1. editor_open_map:把要用的存档导入并在编辑器里打开(已经开着目标存档就跳过)。
  2. scene_build_blocks + scene_import_assets:导入场景。要“之后再出现”的物件加 createAtStart:false。
  3. scene_list_entities:按名字读回实体编号。导入时编辑器会重新分配编号,包里写的不作数。返回的 mapPath 就是刚保存的那个存档。
  4. write_graphs(mapPath 用上一步的存档,graphs 里是每张图的编号和源码):类型检查、编译、写进存档副本,返回可以试玩的存档。
  5. 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:capture

MCP 配置中的 MILIASTRA_PYTHON 可指定 Python 可执行文件的绝对路径;未指定时使用 PATH 中的 python。截图不使用 Windows.Graphics.Capture,不调用 Windows 10 Build 19045 缺失的 IsBorderRequired。

AI 调用顺序:

  1. list_editor_windows 取得新鲜的 windowId(窗口句柄与 PID 组合)。
  2. capture_editor_window({windowId, method: "window"}),收到标准 MCP image/png 内容和结构化元数据。
  3. 目视检查图像。背景窗口可尝试 window 模式;PrintWindow 对部分 GPU 程序可能返回旧帧或黑屏,不能只以返回成功判断画面正确。
  4. 必要时用 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:local
  • npm 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 在真实的编辑器和游戏里把一整关做出来,自己点试玩、自己读日志和截图。

项目侧重和本项目
Genshin-TS用 TypeScript 写节点图,编译并注入存档本项目编译节点图用的就是它。只想自己手写代码、不需要 AI 操作编辑器的,直接用它
千星奇域节点图工具集读写节点图文件、代码和节点图互转、节点数据Genshin-TS 内含它的成果,本项目间接用到
Ayaya_Miliastra_Editor用 Python 写节点图,离线校验、自动排版,有给人看的预览界面想要 Python 工作流和节点图预览界面的选它;本项目没有给人看的界面
千星沙箱模拟器游戏之外跑客户端 Lua 和界面,几秒一轮;五种画布、多人模拟、录制回放;有网页编辑器和七步制作流程它的工程可以一步导进本项目上真机:scene_import_simulator 读它的完整存档,把脚本、模板、界面、信号、变量和服务端规则都写进存档,模板编号在 Lua 里自动对上,然后自动试玩。几秒一轮地调用它,上真机用这里
dsh-miliastraDeepSeek Harness 插件:把脚本投进存档旁的活文件、读运行日志、截图、探针、界面规范检查思路相近(都在真机的文件上干活),它面向 Harness、试玩由人点;本项目自己点试玩,也写存档本身
miliastra-ugc、MiliastraAgent、genshin-qianxing-2d-game给 AI 的技能和提示词包:Lua 静态检查、离线 Lua 沙箱、像素画和图元拟合出图、分步流程出图(像素画、帧动画、图元拟合)本项目没有,用它们的;流程类的可以和本项目的工具一起用
千星奇域工具箱官方文档和社区经验的知识库问答,有在线 MCP可以和本项目同时接:它回答“怎么做”,本项目动手做
WebMiliastraNodesEditor网页版节点图编辑器,不开游戏就能画节点图画节点图原型用
genshin-starcraft-mcp查官方教程和节点文档的 MCP本项目自带一份离线的官方指南,功能有重叠
qianxing-format-docs、genshin-miliastra-file-format存档和导出文件格式的文档本项目的物件名单和尺寸来自前者(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 的账号,自定义文本框和选项文字不显示。工具为此准备了不靠文字的做法:图片控件、进度条、图标、标记特效。

游戏更新以后工具坏了怎么办? 提 issue,说明游戏版本和出错的工具。图鉴是从编辑器里抄出来的,重抄的办法在 scripts/dev/README.md。

许可和来源

代码按 MIT 许可。用到的第三方软件见 THIRD_PARTY_NOTICES.md。

《原神》、千星奇域以及仓库里出现的游戏画面、物件和图标的缩略图、官方指南和教学存档的内容,权利属于米哈游 / HoYoverse;放在这里只是为了让工具能按名字查到平台自带的东西、让测试有样本可比。本项目不隶属于也未获得米哈游的认可。权利方如认为其中内容不妥,请提 issue,会及时处理。