GameMod MCP
Server Configuration
Describes the environment variables required to run the server.
| Name | Required | Description | Default |
|---|---|---|---|
| PYTHONPATH | Yes | Path to the GameModMCP 'src' directory, needed so the server script can import the gamemod_mcp package (e.g. "C:/path/to/GameModMCP/src"). | |
| PYTHONUTF8 | No | Set to "1" to force UTF-8 mode for the Python process (the project's sources and outputs contain non-ASCII text). | 1 |
| GAMEMOD_DEBUG_LOG | No | Turn the tool-call log stream on/off for this server process: "1" to enable, "0" to disable. Can also be set per client. Default: off. | |
| GAMEMOD_DEBUG_LOG_PATH | No | Path of the tool-call log stream file. Default: ~/.gamemod/debug/calls.jsonl | |
| GAMEMOD_DEBUG_LOG_MAX_BYTES | No | Maximum size of a single log file before it is rotated. Default: 8 MB | |
| GAMEMOD_DEBUG_LOG_MAX_FILES | No | Number of log files to keep, including the current one. Default: 4 |
Instructions
Guidance the server publishes about itself, which clients place ahead of the tool catalog so the model reads it before choosing anything.
This server publishes no instructions, or was last inspected before Glama recorded them.
Capabilities
Features and capabilities supported by this server
Protocol revision2025-11-25
| Capability | Details |
|---|---|
| tools | {
"listChanged": false
} |
| prompts | {
"listChanged": false
} |
| resources | {
"subscribe": false,
"listChanged": false
} |
| experimental | {} |
Tools
Functions exposed to the LLM to take actions
| Name | Description | ||||||||||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| find_game_processesA | 列出正在运行的游戏进程,并识别其运行时(il2cpp / mono / 其它)。 Args: name_filter: 进程名子串过滤(大小写不敏感)。 only_games: 只要看起来像游戏的进程(默认 True)。 Returns:
{ok, count, processes: [{pid, name, exe_path, window_title,
runtime, is_64}]}
| ||||||||||||||||||
| inspect_gameA | 探测一个游戏目录:识别引擎、找出主程序与关键文件。 本项目的使用方式是「一次只针对一个游戏项目目录」, 所以不必去扫全机有哪些游戏 —— 直接把目录传进来即可。 Args: game_dir: 游戏安装目录。 Returns: {ok, engine, main_exe, il2cpp/mono/ue 的关键路径, ...} | ||||||||||||||||||
| inspect_binaryA | 分析 PE 文件(exe/dll):架构、节区、导出表、导入表、运行时类型。 用于判断游戏是否加壳、是否托管、以及找出可 Hook 的导出函数。 关键结论(architecture / runtime / export_count / section_count)
会同时提到顶层与 Args: path: 可执行文件或 DLL 路径。 | ||||||||||||||||||
| open_gameA | 选定游戏,并构建(或复用)它的元数据索引(跨引擎自动识别)。 之后所有查询工具都以这个游戏为上下文。切换游戏会重置会话 (已注入的运行时会被安全卸载)。 支持三种引擎,会自动识别: · IL2CPP — 元数据是 global-metadata.dat,逻辑在 GameAssembly.dll · Mono — 元数据是托管 dll(通常是 Assembly-CSharp.dll) · UE — 无集中元数据(能力以 get_diagnostics 报告为准) 重复调用同一个游戏不会重建(返回 reused=true,通常 10ms 内返回)。 Args: game_dir: 游戏安装目录(推荐;会自动识别引擎并定位元数据文件)。 metadata_path: 直接指定元数据文件(IL2CPP 用 global-metadata.dat, Mono 用某个 .dll;目录结构不标准时用)。 engine: 强制指定引擎(il2cpp / mono / ue),一般不用填。 cache_dir: 索引缓存目录,默认 ~/.gamemod/cache。 force_rebuild: 强制重建索引(怀疑缓存损坏时用)。 Returns: {ok, engine, engine_label, metadata_path, index: {type_count, method_count, field_count, capabilities...}, elapsed, reused} | ||||||||||||||||||
| get_sessionA | 查看当前会话状态:选中的游戏、索引统计、运行时注入情况。 排查「为什么查不到类 / Hook 不上」时,先看这个。 | ||||||||||||||||||
| close_sessionA | 关闭当前会话:卸载所有 Hook、断开注入、关闭索引。只有真的恢复原状才 任一步失败会 做完了就调用它,把游戏恢复原状(卸载 Hook 后游戏行为回到未修改状态)。 只有真的恢复成功才返回 | ||||||||||||||||||
| search_classesA | 搜索游戏里的类、结构体、枚举 —— Mod 开发最主要的入口。支持按基类与程序集过滤。 返回结果里带 下游工具该用哪个名字:用 Args: pattern: 名称子串(大小写不敏感)。空表示不过滤。 subtype_of: 只要继承自该类型的(如 "UnityEngine.MonoBehaviour")。 assembly: 按程序集名过滤(子串,如 "TeamTapas")。 only_enums: 只要枚举(找游戏常量表很有用)。 limit: 本页最多返回多少条(上限 2000)。 Returns: {ok, handle, total, returned, has_more, items: [{full_name, nested_name, namespace, method_count, field_count, is_enum, image, token}]} | ||||||||||||||||||
| class_detailA | 查看一个类的完整信息:字段(含类型)、方法(含 token)、继承链;给 这是定位 Hook 落点的核心工具:方法的 token 由这里给出, 再配合 runtime_class_info / find_hook_target 就能拿到真实的运行时地址。 重要:静态元数据里没有字段偏移、也没有方法地址(只有 token)。 字段偏移与方法真实地址必须靠注入后的运行时工具取。 同类名跨程序集时会拒绝并列出候选( 查嵌套类型时, Args: full_name: 类的完整名(如 "PresetLoaderV2"、 "TeamTapas.ProjectR.UserDatas.Service.UserData_Service", 或嵌套类型的 "Outer.Inner")。 include_inherited: 是否包含继承来的字段/方法。 method_name: 只关心某个方法时填这里。填了就只返回该方法的 全部重载(含 token / 参数表 / 是否静态), 等价于旧的 get_method_source,省一轮往返。 assembly: 同名类消歧用(子串匹配,如 "TeamTapas")。留空则 名字必须唯一,否则报错并给出候选。 Returns:
{ok, full_name, nested_name, namespace, image, token, ..., fields,
methods, parent, base_chain, derived_count, derived, derived_returned,
derived_has_more}
| ||||||||||||||||||
| search_fieldsA | 按名字搜索字段,返回所属类与字段类型。按字段名搜(定位「金币」「血量」这类目标的首选入口)。
Args: pattern: 字段名子串(大小写不敏感)。 offset: 跳过前多少条(配合 total / has_more 翻页)。 limit: 本页最多返回多少条(上限 2000)。 owner: 限定在某一个类里搜。接受完整类名或短名,但短名必须唯一: 若命中多个同名类(常见于不同程序集),本工具会拒绝并返回 candidates,此时请改用完整类名或用 assembly 消歧。 为什么不猜:把两个无关类的字段混在一起返回,ok 仍是 true, 但算出来的偏移必然错,且要到运行时才暴露。 assembly: 程序集名子串,仅用于在 owner 命中多个类时消歧。 Returns:
{ok, handle, total, offset, limit, returned, has_more, items}
| ||||||||||||||||||
| search_methodsA | 按名字搜索方法,返回所属类、返回类型与 token。 Args: pattern: 方法名子串(大小写不敏感)。 offset: 跳过前多少条(配合 total / has_more 翻页)。 limit: 本页最多返回多少条(上限 2000)。 owner: 限定在某一个类里搜,语义与 search_fields 一致 (短名必须唯一,否则拒绝并给 candidates)。 assembly: 程序集名子串,仅用于 owner 消歧。 Returns:
{ok, handle, total, offset, limit, returned, has_more, items}
| ||||||||||||||||||
| class_hierarchyA | 查看类的继承体系(向上找基类、向下找派生类)。 同类名跨程序集时会拒绝并给出候选(与 Args: full_name: 类完整名。 direction: up / down / both。 depth: 向下递归深度。 assembly: 同名类消歧用(子串匹配,如 "TeamTapas")。 | ||||||||||||||||||
| find_derived_classesA | 找出所有继承自某个基类的类型(含间接继承);配
两个最常见的用法: · 找游戏自己写的 MonoBehaviour 脚本(Mod 最常 Hook 的目标):
基类不必在当前索引的程序集里(如 UnityEngine.MonoBehaviour 属于框架程序集),这种情况结果依然有效,并在 note 里如实说明。
Args:
base_full_name: 基类完整名,如 "UnityEngine.MonoBehaviour"。
assembly: 只看该程序集(子串匹配,如 "TeamTapas")。留空不限。
limit: 最多返回多少条( Returns: {ok, found, base, total, returned, has_more, items: [{index, full_name, image, field_count, method_count}]} | ||||||||||||||||||
| analyze_dependencyA | 分析一个类型引用了哪些其它类型(字段/父类/方法返回类型)。近似,非精确调用图。
用来判断「改这个类会不会牵连很多地方」。 同类名跨程序集时会拒绝并给出候选(与 Args: full_name: 类完整名。 assembly: 同名类消歧用(子串匹配,如 "TeamTapas")。 | ||||||||||||||||||
| list_imagesA | 列出游戏里的程序集(dll)及各自的类型数量。支持 用来判断「游戏逻辑主要在哪个 dll」,从而缩小搜索范围。 Args:
pattern: 名称子串过滤(如 "TeamTapas")。
offset: 从第几条开始(翻页用)。
limit: 本页最多几条。被截断时 | ||||||||||||||||||
| decompileA | 反编译 Mono/.NET 程序集,拿到真正的 C# 源码(薄封装 给 为什么需要它:静态元数据只能给出「有哪些类/字段/方法、签名如何」, 但给不出方法体逻辑。想知道「这个方法到底怎么算伤害的」, 就要反编译看源码 —— 这是元数据索引与运行时 Hook 都替代不了的一环。 只支持 Mono/.NET。IL2CPP 的 GameAssembly.dll 里没有托管元数据, 传进来会明确报错(IL2CPP 的 C# 反编译需要先造 DummyDll,本项目暂未实现)。 两种粒度,用参数区分(故意只做一个工具,避免让你猜该用哪个): Args:
assembly: 程序集路径(.dll / .exe)。Mono 游戏通常是
| ||||||||||||||||||
| read_query_resultA | 按句柄翻页读取之前某次查询的完整结果;给了 列表类工具单次只返回一页,但完整结果留在句柄里。
(原先独立的
Args: handle: search_classes 等返回的 handle。 offset: 起始位置。 limit: 本页条数(上限 2000)。 pattern: 在结果集内二次过滤的子串;留空表示不过滤(纯翻页)。 | ||||||||||||||||||
| inject_processA | 把运行时探针注入正在运行的游戏进程。目标换了游戏时会把会话身份与索引一起换过去,并在返回里给 注入后才能使用 runtime_* / hook_* / drain_events 等在线工具。 同一个进程只会注入一次(重复调用会复用,不会重复 Hook)。 会话上下文会自动跟随目标:注入的进程若属于另一个游戏,会话身份
(game_dir / engine / metadata_path)与静态索引会一起切过去,返回里给
权限:不需要管理员。实测(2026-10)普通用户权限注入 IL2CPP 游戏
成功(本进程与游戏进程的完整性级别都是 Args: pid: 目标进程号。留空则自动找当前游戏的主程序。 auto_find: 没给 pid 时是否自动查找。 preferred_module: IL2CPP 模块名,默认自动识别 (GameAssembly.dll / libil2cpp.so)。 Returns: {ok, pid, init: {module, base, api_available, api_missing, fallbacks}, context_switched?, context_warning?} | ||||||||||||||||||
| launch_gameA | 启动游戏并在游戏初始化之前注入探针(能抢在初始化前挂钩)。 同名进程已在跑时直接拒绝(避免白等 60 秒再报「IL2CPP 未就绪」);
比先手动开游戏再 inject_process 更强:能在对象被创建之前就装好 Hook, 适合拦截只执行一次的初始化逻辑。 会话上下文会自动跟随 Args:
exe: 游戏可执行文件路径。留空则用当前会话识别出的主程序。
args: 附加命令行参数。按 Windows 习惯拆:空白分隔,双引号内保留空白
(所以含空格的路径要写成 | ||||||||||||||||||
| runtime_infoA | 查看已注入游戏的探针状态:IL2CPP 模块、映像数量、可用 API。含静态/运行时一致性自检( 一致性自检: | ||||||||||||||||||
| runtime_class_infoA | 查类的运行时实况:真实字段偏移与方法真实地址(RVA)。 嵌套类型请传完整嵌套名( 与静态 class_detail 的区别(很重要): · 静态元数据里的字段没有偏移(偏移是运行时泛型实例化后才定的) · 静态元数据里的方法只有 token,没有地址 · 这里给出的是运行时真实值 —— 这才是能直接用来 Hook 的落点 嵌套类型请传完整嵌套名:IL2CPP 的 namespace 只属于最外层类型,
嵌套类型(状态机 State、协程体 d__0、私有内部类)的命名空间是空的、
只有短名。实测 IL2CPP 样本 20,072 个类型里 7,056 个(35%)是嵌套类型,
名为 State 的类型有 131 个而只有 1 个是顶层。所以查嵌套类型时 Args:
name: 类名(短名;嵌套类型请传完整嵌套名)。
namespace: 命名空间(可选)。不给也能用:会按短名在顶层类型
里解析,唯一才采用;命中多个则返回 Returns: {ok, full_name, fields: [{name, type, offset, is_static}], methods: [{name, token, pointer, rva_hex, in_module, param_count}]} | ||||||||||||||||||
| find_instancesA | 枚举类的活对象实例(拿 为什么需要它: 实现走 GC liveness(Unity 自家内存分析器用的那套导出)。
注意: 引擎差异(都是如实声明,不是缺陷):
两个明确的限制:
⚠️ 返回的实例包含派生类(这是最容易踩的坑):
所以返回里带 ⚠️ 拿到的指针只在游戏继续运行时有意义:对象可能随时被 GC 回收, 或随场景切换失效。应当立即使用(读字段 / 写字段 / 下 Hook), 不要跨多个步骤长期保存。 Args:
name: 类名(嵌套类型传完整嵌套名,同 Returns:
{ok, class, engine, count, pointers: [...],
instances: [{pointer, class_name}],
exact_class_count, derived_count, class_name_counts, overflow}
也可能带 | ||||||||||||||||||
| find_hook_targetA | 定位某个方法可 Hook 的地址(含 RVA 与 token)。同样支持完整嵌套名,歧义时拒绝。 这是「从静态元数据到 Hook 落点」的关键一步: 先用 search_classes/class_detail 从元数据确认目标方法(拿到 token), 再用本工具在运行时把类实体化,拿到真实地址; 最后用返回的 token 与静态 token 比对,确认挂的是同一个方法。 返回的每个 candidate 里 Args:
name: 类名(短名即可;嵌套类型传完整嵌套名)。
method: 方法名(重载时看 candidates 的 param_count 区分)。
namespace: 命名空间(可选)。不给时按短名在顶层类型里解析,
唯一才采用,多个则返回 | ||||||||||||||||||
| hook_methodA | 在目标方法上安装 Hook,捕获它的调用(参数、调用来源、返回值)。用 风险:Hook 会改变游戏运行行为,且错误的参数类型可能崩溃游戏。 建议先用 find_hook_target 确认落点与 token。 重载:同名方法可能有多个重载,token 各不相同。若目标方法有多个
重载而你又没给 Args:
name: 类名。
method: 方法名。
namespace: 命名空间。
image: 程序集名。
args_type: 参数类型列表,逗号分隔,用于解析参数值。
可选:int/uint/long/ulong/bool/float/double/ptr/string/cstring
例:"ptr,int,float"。留空则不解析参数值。
写错规格名会直接报错(不再静默按指针读)。
实例方法的第一个整型位置是 Returns: {ok, hook_id, class, method, chosen: {pointer, rva_hex, token}, retval_type, return_type, candidate_count, usable_count} 失败时 {ok: false, error, candidates: [...]}。 | ||||||||||||||||||
| hook_addressA | 在任意地址安装 Hook(不限于托管方法)。适用于原生函数、系统 API、以及「模块基址 + RVA」算出的地址。 适用于:原生游戏函数、系统 API、以及从静态分析里算出的地址 (模块基址 + RVA)。 Args:
address: 目标地址,十六进制(如 "0x7ffa05f7f050")。
args_type: 参数类型列表,逗号分隔(同 hook_method)。
写错规格名会直接报错。
retval_type: 返回值类型(int/uint/float/double/ptr/string/bool)。
max_calls: 最多记录多少次。
backtrace: 是否记录调用栈。
override_retval: 受控改写返回值(默认空串 = 只观察不改)。语义与
取值规则同 | ||||||||||||||||||
| unhookA | 卸载 Hook。hook_id 留空则卸载全部。 卸载后游戏行为恢复原状。收尾时务必调用(或用 close_session)。 | ||||||||||||||||||
| hook_statusA | 列出当前所有 Hook 及其触发次数。 触发次数可以用来判断「Hook 装对了没」: 如果挂的是每帧调用的方法却始终 0 次,多半是落点不对。 | ||||||||||||||||||
| drain_eventsA | 取走探针缓冲的 Hook 事件(调用记录)。 不匹配的事件会原序留在队列里,不会被吞;超出 语义与 AiMod 的 /v1/events?after= 一致:取走即消费。 想持续观察就每隔一会儿调用一次,累加统计即可。
Args: limit: 本次最多取多少条。 kind: 只取某类事件(如 "hook" / "notice" / "log")。 Returns: {ok, returned, pending_approx, dropped, events: [...]} 事件形如 {type, id, label, phase: enter/leave, seq, thread, from, args, retval} | ||||||||||||||||||
| read_memoryA | 读取游戏进程内存(十六进制返回)。 用于:确认字段偏移对不对、读对象原始字节、观察内存变化。 Args: address: 地址(十六进制,如 "0x1a2b3c4d")。 size: 读取字节数(上限 16 MB)。 | ||||||||||||||||||
| write_memoryA | 写游戏进程内存。 ⚠️ 危险操作:写错地址会立刻崩溃游戏。 写之前务必先用 read_memory 确认地址内容符合预期。 建议只改浮点数/整数这类简单值,并先备份原值。 不要写已装 Hook 的函数入口:Frida 的 Interceptor 拥有那几字节
(它在那里写了跳转指令),绕过它直接 Args: address: 地址(十六进制)。 hex_data: 要写入的字节,十六进制串(如 "0000803f" 表示 float 1.0)。 force: 明知目标被 Hook 覆盖仍要写(默认 False = 拒绝)。 | ||||||||||||||||||
| read_field_valueA | 读取某个实例或静态字段的原始值(静态字段传 自动完成三步:运行时查字段偏移 → 算出字段地址 → 读内存。 读几个字节由字段类型决定( 返回里 局限:只适合基础类型字段(int/float/bool/enum 等)。 引用类型字段读到的是指针,要读内容需再解引用(用 read_memory)。 静态字段:把 Args:
instance: 对象指针(十六进制)。可从 Hook 事件的 args[0] 里拿到。
传 | ||||||||||||||||||
| set_field_valueA | 写对象字段值( ⚠️ 危险操作:写错地址或写错值会立刻让游戏崩溃或行为异常。
写之前务必先 与 写几个字节由字段类型决定(与读取同一张表):bool 1、int16 2、
int32/float 4、long/double/引用类型 8。溢出直接报错,不静默截断 ——
把 300 写进 1 字节字段如果截成 44,你会看到 引用类型字段(class/string/数组)会被拒绝: 静态字段:把 Args:
instance: 对象指针(十六进制)。可用 Returns: {ok, class, field, instance, offset, field_address, wrote_hex, write_width, write_kind, value_before?, read_back?...} | ||||||||||||||||||
| scan_patternA | 在游戏模块里做 AOB(特征码)扫描。这是兜底手段 —— 优先用元数据 + RVA 定位。 ⚠️ 这是兜底手段。优先用元数据 + RVA 定位: 本工具集的核心优势就是「不用扫内存也能找到 Hook 落点」。 只有当符号被剥离、或目标是原生代码时,才用扫描。 Args: pattern: 十六进制特征码,支持通配符 "??"。 例:"48 8B ?? ?? E8"。 module: 限定模块名(默认当前 IL2CPP 模块)。 max_results: 最多返回多少个命中。 | ||||||||||||||||||
| eval_scriptA | 在游戏进程内执行任意 Frida JS 代码 —— 应急逃生舱。 与 AiMod 的 eval_script 同定位:当预置工具不够用时, 直接下发 JS 探测。 可用全局对象: 返回值必须是可 JSON 序列化的(字符串/数字/布尔/数组/普通对象)。 示例: "Process.arch" "mod.base.add(0x1000).toString()" "(function(){ return Process.enumerateModules().length; })()" "typeof monoFuncs.mono_get_root_domain" Args: code: JS 表达式或语句块。 | ||||||||||||||||||
| gc_controlA | 暂停/恢复游戏的 GC(垃圾回收)。 Hook 期间建议暂停 GC,避免正在观察的对象被回收掉。 观察结束后务必恢复(disable=False),否则游戏内存会持续增长。 标注上 Args: disable: True 暂停 GC,False 恢复。 | ||||||||||||||||||
| capture_screenA | 截屏 / 截窗口存盘并返回路径(不回 base64)。截图是证据、不是判据;窗口找不到会如实失败,不静默改截整屏。 ⚠️ 截图不是判据,只是证据。要判断「现在在哪个界面」请用 不返回 base64:本项目任何返回都不超过 256 KB,而一张 2560x1440 的 PNG base64 会直接把它撑爆。图落在磁盘上,返回路径。 典型用途:验收失败时留证据(配合 Args: region: "x,y,w,h" 屏幕绝对坐标;不传则截整个主屏。 window: 窗口标题子串;给了就用该窗口的矩形(优先于 region)。 找不到会如实失败,不会静默退化成截整屏。 save_path: 保存路径;不传则落临时目录(返回里给路径)。 max_side: 证据图最长边上限(等比缩小,默认 1920);0 = 不缩放。 只影响存盘的证据图,不影响坐标语义。 Returns: {ok, path, width, height, backend, region, coordinate_space, ...} | ||||||||||||||||||
| ocrA | OCR 识别文本并给屏幕绝对坐标(可直接用于点击)。只对给定 ROI 做(实测整屏 4.1s vs ROI 数十 ms)。
这是「弱视觉」的主力:验收时绝大多数判断只需要 「屏幕上有没有这几个字、它在哪」。 只对给定的区域做 OCR(实测整屏 2560x1440 要 4.1 秒,而 ROI 通常几十毫秒)—— 这也是同类项目的标配做法。 坐标一律是屏幕绝对坐标,可直接喂给点击; 匹配 Args:
region: "x,y,w,h" 屏幕绝对坐标;与 Returns: {ok, engine, count, results: [{text, score, box, center, click_point}], texts, matched, matched_count, best_match, click_point, coordinate_space: "screen_absolute", image, ...} | ||||||||||||||||||
| probe_logA | 读游戏日志尾部并按正则过滤(编码自动 utf-8/gbk)。只读、不消费,可反复轮询。 同类 Bot 项目普遍没有这条「用日志确认结果」的通道。 为什么单独做这件事:调研的 7 个游戏自动化 Bot 项目里, 没有一个用游戏日志判断结果 —— 它们靠视觉、注册表或 CDP。 而「通过日志确认结果」恰恰是最可靠的验收通道之一 (Mod 自己的输出、游戏自己的报错都在日志里),所以这里补上。 做法刻意保守:
· 只读尾部 ⚠️ 它是只读的,不消费日志(不像 Args: path: 日志文件路径。 pattern: 正则;只返回匹配行。留空返回尾部所有行。 max_lines: 最多返回多少行(默认 200,取最后 N 行)。 tail_bytes: 从文件末尾读多少字节(默认 262144)。 Returns: {ok, path, size, encoding, total_lines_in_tail, returned, lines: [{line_no, text}], matched_count?, has_more?, truncated_head} | ||||||||||||||||||
| wait_forA | 轮询等待条件成立并给出证据包(验收闭环里「等到可以判了」那一步)。五种条件: 为什么必须有它:游戏是异步的 —— 点完按钮要等界面出来、场景加载要
等几秒。不等待就直接断言,会得到大量假失败(其实只是还没加载完)。
同类工具(MaaFramework)把它写成一句伪代码:
支持的条件(
返回值就是证据包(不是光秃秃的布尔):
· Args:
kind: 上面五种之一。
target: Returns: {ok, verdict, kind, polls, elapsed_ms, evidence, last, hint?} | ||||||||||||||||||
| verify_stateA | 出一份可证伪的验收结论:每条断言独立求值,并要求足够多的独立证据才判成立。 为什么必须有它(这是从 |
写法 | 含义 |
| 日志里有匹配行(只读不消费) |
| 屏幕上 OCR 到该文本 |
| 存在该窗口 |
| 该字段当前等于期望值 |
| 该类活实例数达到下限 |
示例(双证据验收 Mod 生效):
verify_state(checks="log=D:\\Game\\UE4SS.log#已修改 精核,"
"ocr=精核")返回
· verdict —— pass / fail / unverifiable(三态,与 wait_for 同源)
pass要求:成立条数 >= require_independent,且这些成立的条目 来自 >= require_independent 条不同的信号通道全部条件都成立但只有 1 条 → 判
fail并说明「证据不足」, 不是 pass —— 这正是「单条证据不得静默提升」多条成立但全是同一条通道(如两条
ocr=)→ 同样判fail, 并说明「同源,缺独立第 2 通道」—— 同一张截图上的两条断言会一起 对、也会一起错,不是「互相独立」的证据 ·evidence—— 每条断言各自的{check, hit, detail}·independent_count—— 成立的不同通道数(按 kind 去重), 与passed(成立的条数)不同;independent_kinds列出是哪几种 ·require_independent/verdict_reason—— 门槛值与判定理由
Args:
checks: 逗号分隔的断言列表,见上表。
require_independent: 判 pass 所需的成立条数下限(默认 2)。
设 1 会退化成「单条证据即通过」—— 只在确实只有一个可靠来源时用。
Returns: {ok, verdict, verdict_reason, evidence, independent_count, require_independent, passed, unverifiable_count}
判断一个 exe 是否为 Unreal 引擎游戏,并给出可核查的证据与置信度。
只判定这一个程序,不做全机扫描。
UE 版本号拿不到是正常的:实测两个样本中 exe 内 UE 版本模式 0 命中, Engine/Build/Build.version 也不存在。此时返回空串 + 原因,不猜测。
Args: exe: 游戏可执行文件路径。留空则用当前会话的主程序。
UE 游戏概况:容器、清单、脚本模块。汇总一个 Unreal 游戏的可提取信息(资源容器、清单、脚本对象)。
包含每个 .pak/.utoc 的文件数、目录数、以及条目样例。 全量条目可能非常大(实测某样本 18,956 条 → JSON 15.8 MB), 所以默认只给样例与计数;要完整清单用 ue_list_entries。
Args: exe: 游戏可执行文件路径。留空则用当前会话的主程序。 output_path: 可选,把完整 profile 写成 JSON 文件的路径。
列出 .pak / .utoc 里打包了哪些资产(可按名字过滤、翻页)。返回 returned/has_more;翻页空页会说明是哪一种「空」。
这是 UE 游戏上最实用的一步:想知道「这游戏有哪些资源、 本地化文本在哪个文件里」,就靠它。
Args: container: .pak 或 .utoc 文件路径。 kind: auto / pak / utoc。默认按扩展名自动判断。 pattern: 名字子串过滤(大小写不敏感)。 limit: 最多返回多少条。 offset: 从第几条开始(配合 total 翻页)。
从 UE 游戏 exe 里提取 /Script/ 模块名与对象路径。失败时按契约给 ok=false + error。
这是字符串证据,不是反射元数据:能告诉你游戏大致有哪些系统 (如 /Script/Engine、/Script/GameplayAbilities), 但拿不到父类链和属性偏移——那需要运行时。
Args: exe: 游戏可执行文件路径。留空则用当前会话的主程序。 limit: 每类最多返回多少条。
读取 UE 的打包清单 Manifest_*Files*.txt。支持 offset/limit 并有 has_more。
清单是打包时生成的「应该有哪些文件」的真值, 常用来校验从 pak/utoc 解析出的文件清单是否正确。
Args:
path: 清单文件路径。留空则自动在 game_dir 里找。
game_dir: 游戏安装目录(path 留空时用)。
pattern: 路径子串过滤。
offset: 从第几条开始(翻页用)。
limit: 本页最多多少条。被截断时 has_more 为 true。
检查运行环境:Python、Frida、各引擎解析器是否可用。默认不扫本机进程(见 scan_processes)。
开始工作前建议先调一次,明确「这台机器上能做什么」。 如果某项显示不可用,对应的工具会失败——这是环境问题,不是工具 bug。
Args:
scan_processes: 是否顺带列出本机正在运行的游戏。默认 False。
该扫描实测耗时约 2.7 秒,且与 find_game_processes 职责重复,
所以默认不扫 —— 要列运行中的游戏请直接调 find_game_processes。
Prompts
Interactive templates invoked by user choice
| Name | Description |
|---|---|
No prompts | |
Resources
Contextual data attached and managed by the client
| Name | Description |
|---|---|
| gamemod_guide | 本 MCP 的完整工作流说明(与 skills/gamemod-mod/SKILL.md 同源)。 |
TDQS
Scored across 45 tools
Most tools target clearly distinct stages (static metadata, runtime inspection, hooking, memory/field access, verification), and descriptions explicitly distinguish close pairs like read_memory vs read_field_value and write_memory vs set_field_value. A few boundaries remain fuzzy, especially inspect_game vs detect_ue vs ue_profile, and class_hierarchy(down) vs find_derived_classes, but the descriptions provide enough guidance to choose correctly.
The set is consistently snake_case and mostly follows verb_noun or noun_action patterns (search_classes, hook_method, read_field_value, verify_state). A handful of bare nouns and imperatives (class_detail, decompile, unhook, ocr, wait_for) break the pattern slightly but remain readable and predictable.
At 45 tools, the surface is heavy for a single MCP server even given the broad game-modding and multi-engine scope. Many tools are individually justified, but the overall count raises selection cost and makes overlap more likely; a more tightly grouped interface would be easier to use.
Coverage is broad across static indexing, runtime inspection, hooking, memory/field mutation, UE asset inspection, OCR/log verification, and session lifecycle. The main gaps are input automation (OCR returns click points but no click/keypress tool) and full IL2CPP decompilation, which agents may need to work around.