CheatMaker 论坛

注册

 

发新话题 回复该主题

Mesen Lua Bridge MCP 使用指南 [复制链接]

1#
官网/源代码:
https://github.com/gareve/mesen-lua-bridge-mcp

# Mesen Lua Bridge MCP 使用指南

这个 MCP(Model Context Protocol)服务器让你能够通过 LLM(如 Claude)向正在运行的 **Mesen 2** 模拟器发送任意 Lua 代码并得到执行结果。它非常适合用来辅助逆向工程、游戏修改、内存分析等任务。

下面我会一步步带你完成从安装到使用的全过程。

---

## 1. 前提条件

- **操作系统**:macOS、Linux 或 Windows(桥接脚本使用系统临时目录,如 `/tmp`、`TEMP` 等)。
- **Node.js**:版本 ≥ 18(推荐 22)。
- **Mesen 2**:从 [mesen.ca](https://www.mesen.ca/) 下载并安装。
- **一个 ROM**:任何 Mesen 支持的平台的游戏 ROM(用于加载和测试)。

---

## 2. 一次性 Mesen 配置

在 Mesen 中需要修改几项设置,让桥接脚本能正常工作:

1. 启动 Mesen,**加载任意一个 ROM**(先随便开一个游戏)。
2. 打开 **Tools → Script Window**(脚本窗口)。
3. 在脚本窗口里,点击 **齿轮图标** 或找到 **Settings** 菜单。
4. 启用 **"Allow access to I/O and OS functions"**(允许 I/O 和操作系统访问)。**注意**:“Allow network access” 不需要打开。
5. 把 **"Script timeout"**(脚本超时)从默认的 1 秒 **提高到 10 秒**(或更大)。因为一些逆向操作(如内存扫描)可能耗时较长,1 秒太短。
6. 其他设置("Auto-start script on load" 等)保持默认(全部开启),这样在切换 ROM 或重启 Mesen 时桥接脚本会自动重载。

配置完成后,关闭设置窗口,脚本窗口先留着(下一步要用)。

---

## 3. 安装 MCP 服务器

在你的电脑上找一个目录,克隆仓库并安装依赖:

```bash
git clone https://github.com/gareve/mesen-lua-bridge-mcp.git
cd mesen-lua-bridge-mcp
npm install
```

---

## 4. 在 Mesen 中加载桥接脚本

在 Mesen 的 **Script Window** 中:

1. 点击 **File → Open**,选择你克隆下来的仓库中的 `lua/mesen_bridge.lua` 文件。
2. 点击 **Run**(运行)。

你应该会在脚本控制台中看到一行类似:
```
[mesen-mcp] bridge registered; waiting for an MCP server to claim <tmp>/mesen-mcp/active
```
(如果 MCP 服务器已经启动,则可能显示 `bound to session ...`)

这意味着桥接已经在等待 MCP 服务器连接了。**请保持脚本窗口打开,不要关闭**。

---

## 5. 配置 MCP 客户端(以 Claude Code 为例)

这个仓库自带了一个项目级的 `.mcp.json` 文件,所以如果你在项目目录下运行 `claude`,它会自动识别。你可以先验证一下:

```bash
claude mcp list
```

应该能看到 `mesen` 这个工具。

如果你想把它安装为**用户级**(在任何目录都可用),在项目目录内执行:

```bash
claude mcp add mesen --cwd "$(pwd)" -- npx tsx src/server.ts
```

对于**其他 MCP 客户端**(如 ChatGPT、Cursor、Cline、Zed、Continue 等),这是一个标准的 stdio MCP 服务器。你需要在你的客户端配置中指定命令为 `npx tsx src/server.ts`,并且工作目录设置为这个仓库的根目录。

---

## 6. 快速验证(冒烟测试)

在 MCP 客户端(例如 Claude)中,向 Mesen 发送一个最简单的 Lua 命令:

> 使用 mesen 工具执行 `return 1 + 1`

你应该会得到 `2` 的返回值。

再试一个真实的读内存操作(假设是 SNES 的 WRAM 地址):

> 使用 mesen 工具执行 `return emu.read(0x7E0000)`

你应该会得到一个 0~255 的数字(该地址的字节值)。

如果这两步都正常,说明整个链路已经通了。

---

## 7. 日常使用流程

一旦设置完成,你平时的使用流程就是:

1. **启动 Mesen**,加载你想研究的 ROM。
2. **打开 Script Window**,加载 `mesen_bridge.lua` 并运行(如果之前已经加载并且勾选了自动启动,可能它会自动运行)。
3. **启动你的 MCP 客户端**(如 Claude Code),然后直接在聊天中给 LLM 下达指令。

LLM 可以自由查阅 Mesen 的 [Lua API 文档](https://www.mesen.ca/docs/apireference.html),然后通过 `execute_lua` 工具执行任意代码。你不需要预先把所有 API 编码到 MCP 命令中,灵活性极高。

---

## 8. 高级特性:回调管理

桥接脚本包装了 `emu.addEventCallback` 和 `emu.addMemoryCallback`,允许 LLM 注册回调函数(比如每帧执行、内存写入时触发)。**注意:注册回调时必须提供一个 label(标签)**,例如:

```lua
-- 第三参数是 label
emu.addEventCallback(fn, emu.eventType.endFrame, "frame counter")

-- 第六参数是 label
emu.addMemoryCallback(fn, emu.callbackType.write, 0x7E0010, 0x7E0010, emu.memType.snesMemory, "hp watcher")
```

MCP 服务器提供了 `clear_callbacks` 工具,用于清理这些回调:

```
clear_callbacks({ label: "frame counter" })   # 只删除该标签的回调
clear_callbacks({})                           # 删除所有已跟踪的回调
```

建议在每次新会话开始时先执行 `clear_callbacks({})`,避免之前会话残留的回调干扰。

---

## 9. 故障排查常见问题

### ① “timeout: no response from Mesen Lua bridge”

这个超时提示信息里已经列出了常见原因,大多是:
- **“Allow access to I/O and OS functions” 没有开启** → 桥接无法写入文件,去设置里打开。
- **桥接脚本没有被加载**(或者被停止了)→ 重新加载并运行。
- **没有加载任何 ROM** → 桥接需要 ROM 运行才能响应(因为它是靠 `endFrame` 事件轮询的)。
- **你执行的 Lua 代码本身超时** → 超过了 Mesen 设置里的 Script timeout(我们之前设成了 10 秒),请缩短代码执行时间或增大超时。

### ② “Error from Mesen Lua: ... attempt to call a nil value”

说明你的 Lua 代码调用了当前系统不支持的 API。查阅 [Mesen API 参考](https://www.mesen.ca/docs/apireference.html),确认函数是否存在,并注意有些函数是平台相关的。

### ③ 客户端看不到 `mesen` 工具

- 对于 Claude Code:运行 `claude mcp list` 确认是否列出。检查你是否在项目目录下启动 `claude`(或者是否已添加用户级配置)。
- 对于其他客户端:检查启动命令和工作目录是否正确(必须为仓库根目录)。

### ④ 关于错误计数

每次 `execute_lua` 的响应末尾都会包含类似:
```
---
bridge_errors: 3
```
这是从桥接脚本加载以来累计的 Lua 错误次数。如果 LLM 看到这个数字增加,就知道可能有操作失败了(即使最后一次调用成功)。所有错误也会在 Mesen 脚本控制台和 `/tmp/mesen-mcp/mesen_errors.log` 中记录。

---

## 10. 一些注意事项

- **并发请求**:目前只支持单个请求排队执行(内部有互斥锁),对交互式逆向工作来说足够。
- **返回值类型**:Lua 表(table)会被转为 `table: 0x...` 的形式,如果返回嵌套结构,可以考虑在 Lua 中用 `json.encode` 等序列化后返回。
- **`print()` 输出**:脚本中的 `print()` 只会输出到 Mesen 脚本控制台,不会返回给 LLM。如果需要捕获输出,可以写到会话目录下的日志文件里。

---

## 11. 进一步学习

- 查看项目提供的 [演示视频](https://github.com/gareve/mesen-lua-bridge-mcp) 了解实际工作流。
- 你可以让 LLM 直接查阅 Mesen 的 [Lua API 文档](https://www.mesen.ca/docs/apireference.html) 并生成代码,它会自动尝试调用。

---

按照以上步骤,你应该可以在几分钟内建立起完整的开发环境。如果在使用过程中遇到任何问题,可以查看项目 README 的 “Troubleshooting” 部分,或者提交 Issue。

祝你逆向愉快!🎮
分享 转发
我来人间一趟 奔着自由与光
TOP
发新话题 回复该主题