关于 Rpgmakermvultimate Mcp
面向 RPG Maker MV 项目的 MCP 服务,让 AI Agent 检查并编辑磁盘上的游戏数据、验证项目并运行测试。它结合地图与事件生成、全项目分析和游戏内遥测,帮助定位问题并验证修改。
主要功能
- 01生成地图并设置事件
- 02编辑数据库与事件
- 03检查引用及地图可达性
- 04分析事件逻辑与地图
- 05运行测试并收集遥测
- 06热重载地图并截取画面
适用场景
- 01查找事件不触发的原因
- 02发现损坏引用和无法到达的地图
- 03为项目生成带任务结构的地图
- 04测试修改并查看异常与玩家位置
MCP 相关
作为 MCP 服务向兼容客户端提供 18 个工具,用于读取和编辑 RPG Maker MV 项目、分析数据并控制测试桥接。游戏桥接可返回异常、位置和截图等信息。
配置
本地服务的配置在各客户端中通用,复制后粘贴到客户端的 MCP 配置文件即可。
npx -y rpgmaker-mv-mcpRPGMAKER_PROJECT_PATHAbsolute path to the RPG Maker MV project to edit (the folder with data/ and js/). The server starts without it; needed for real editing, or call set_project_path at runtime.VISION_API_URLBase URL of an OpenAI-compatible vision endpoint to enable analyze_image mode "ai" (e.g. https://api.openai.com or http://localhost:11434). Unset = vision disabled; every other tool works offline.VISION_API_KEY密钥Bearer token for the vision endpoint (only sent when set).VISION_MODELVision model name to request (e.g. gpt-4o, llava). Defaults to meta/llama-3.2-90b-vision-instruct.RPGMV_LEGACY_TOOLSSet to 1 to also advertise the 101 legacy v4 tool names (they remain callable regardless of this flag).本地服务需要在你的电脑上安装运行环境(如 Node.js 18+)。各客户端的配置文件位置不同,请参考客户端文档。
工具
18收录的工具列表 · 更新于 3 周前
| 参数 | 类型 | 必填 | 说明 |
|---|---|---|---|
| x | integer|string | 否 | |
| y | integer|string | 否 | |
| pan | integer|string | 否 | |
| fade | enum | 否 | black | white | none |
| kind | enum | 是 | show_text | show_choices | conditional_branch | control_switch | control_variable | transfer_player | common_event | flow | plugin_command | change_gold | change_items | change_party_member | change_actor | play_audio | screen_effect | show_picture | erase_picture | show_animation | show_balloon | battle_processing | shop_processing | name_input | enemy_appear | change_enemy_state | abort_battle | move_route |
| name | string | 否 | control_switch self_switch:A-D;flow label/jump_to_label:标签文本;play_audio:不含扩展名的文件名(为空时停止频道);show_picture:图片文件。 |
| stat | enum | 否 | change_actor:hp 使用 allowDeath;exp/level 使用 showLevelUp;state 使用 stateId 和 remove。hp | mp | exp | level | state | recover_all |
| text | string | 否 | plugin_command:完整的 MV 命令字符串,例如 "DoorCtl open 1"。 |
| wait | boolean | 否 | 等待效果、动画、气球或移动路线完成(move_route 默认值为 true)。 |
| wrap | enum | 否 | show_text:true 会将所有行重新排版为一个段落,"hard" 会保留每行的换行;两者都会拆分为每框 4 行。宽度约为 55 个字符,有头像时约为 38 个字符。true | false | hard |
| blend | enum | 否 | normal | additive | multiply | screen |
| color | array | 否 | |
| endId | integer|string | 否 | control_switch/control_variable:包含末尾 ID;默认与起始 ID 相同。 |
| goods | array | 否 | shop_processing:按顺序排列的 goods;省略 price 时使用数据库价格。 |
| lines | array | 否 | show_text:消息行。MV 不会自动换行;除非设置 wrap,否则会对过长的行发出警告。 |
| mapId | integer|string | 否 | |
| pitch | integer|string | 否 | |
| power | integer|string | 否 | |
| scope | enum | 否 | control_switch:switch 需要 switchId;self_switch 需要名称 A-D。switch | self_switch |
| speed | integer|string | 否 | |
| steps | array | 否 | move_route:按顺序排列的 steps;times 表示重复次数。toward/away 相对于玩家。参数:jump x,y;wait 帧数;switch_on/off switchId;change_speed 值 1-6;change_freq 值 1-5;change_image name,index;change_opacity 值 0-255;change_blend_mode 值 0-3;play_se name,volume?,pitch?,pan?;script 文本。 |
| value | enum | 否 | control_switch:默认值为 on。on | off |
| action | enum | 否 | flow:wait 需要 frames;label/jump_to_label 需要 name。wait | exit_event | label | jump_to_label |
| amount | integer|string | 否 | change_gold/change_items/change_actor hp|mp|exp|level:固定数量。指定 amount 或 amountVariableId。 |
| effect | enum | 否 | screen_effect。tint:颜色 [r,g,b,gray],范围 -255..255;flash:颜色 [r,g,b,strength],范围 0..255;shake:power、speed,范围 1-9。fadeout | fadein | tint | flash | shake |
| frames | integer|string | 否 | |
| indent | integer|string | 否 | 基础缩进,默认值为 0。嵌套分支主体会重新设定缩进,不会修改其输入。 |
| itemId | integer|string | 否 | |
| origin | enum | 否 | upper_left | center |
| remove | boolean | 否 | change_party_member、change_actor state、change_enemy_state:移除而非添加。 |
| repeat | boolean | 否 | move_route:循环执行路线。默认值为 false。 |
| scaleX | integer|string | 否 | |
| scaleY | integer|string | 否 | |
| volume | integer|string | 否 | |
| actorId | integer|string | 否 | change_party_member/name_input:actor ID。change_actor:actor ID,0 = 整个队伍(或使用 actorVariableId)。 |
| canLose | boolean | 否 | |
| channel | enum | 否 | play_audio。bgm | bgs | me | se |
| choices | array | 否 | |
| opacity | integer|string | 否 | |
| operand | object | 否 | control_variable:{type:"constant",value};{type:"variable",variableId};{type:"random",min,max};或 {type:"game_data",dataType:0..7,param1?,param2?}。不接受 MZ 的游戏数据类型 8。 |
| operand.max | integer|string | 否 | |
| operand.min | integer|string | 否 | |
| operand.type | enum | 是 | constant | variable | random | game_data |
| operand.value | number|string | 否 | |
| operand.param1 | integer|string | 否 | |
| operand.param2 | integer|string | 否 | |
| operand.dataType | integer|string | 否 | |
| operand.variableId | integer|string | 否 | |
| stateId | integer|string | 否 | |
| troopId | integer|string | 否 | battle_processing:提供 troopId、troopVariableId,或 randomEncounter: true。 |
| branches | array | 否 | show_choices:每个选项对应一个命令片段。分支为空时省略。 |
| decrease | boolean | 否 | 改为减去而非相加。默认值为 false。 |
| duration | integer|string | 否 | screen_effect:帧数,默认值为 60。 |
| faceName | string | 否 | show_text:脸图文件名(不含扩展名),默认值为空。 |
| itemType | enum | 否 | change_items,默认值为 item。item | weapon | armor |
| position | enum | 否 | show_text:top/middle/bottom;show_choices:left/middle/right。top | middle | bottom | left | right |
| switchId | integer|string | 否 | |
| balloonId | integer|string | 否 | 使用编辑器列表中的 1-15(1 为感叹号)。 |
| canEscape | boolean | 否 | |
| condition | object | 否 | conditional_branch:switch {type,switchId,value?};self_switch {type,name,value?};variable {type,variableId,comparison,constant? OR variableOperand?};actor_in_party {type,actorId};gold {type,gold,compare?};item {type,itemId}。仅允许使用所选类型对应的键。 |
| condition.gold | number|string | 否 | |
| condition.name | enum | 否 | A | B | C | D |
| condition.type | enum | 是 | switch | self_switch | variable | actor_in_party | gold | item |
| condition.value | enum | 否 | on | off |
| condition.itemId | integer|string | 否 | |
| condition.actorId | integer|string | 否 | |
| condition.compare | enum | 否 | >= | <= | < |
| condition.constant | number|string | 否 | |
| condition.switchId | integer|string | 否 | |
| condition.comparison | enum | 否 | == | >= | <= | > | < | != |
| condition.variableId | integer|string | 否 | |
| condition.variableOperand | integer|string | 否 | |
| direction | enum | 否 | retain | down | left | right | up |
| faceIndex | integer|string | 否 | show_text:脸图槽位 0-7,默认值为 0。 |
| maxLength | integer|string | 否 | name_input:1-16,默认值为 8。 |
| operation | enum | 否 | set | add | sub | mul | div | mod |
| pictureId | integer|string | 否 | show_picture/erase_picture:槽位 1-100。 |
| skippable | boolean | 否 | move_route:跳过无法执行的步骤。默认值为 false。 |
| winBranch | array | 否 | battle_processing:结果分支,仅在 canEscape 或 canLose 时使用。 |
| wrapWidth | integer|string | 否 | show_text:覆盖字符数形式的换行宽度。 |
| allowDeath | boolean | 否 | |
| background | enum | 否 | 文本/选项窗口背景。window | dim | transparent |
| cancelType | integer|string | 否 | show_choices:-1 禁用取消;-2 或 choices.length 表示使用单独的取消分支;其他值表示从 0 开始的选项索引。 |
| elseBranch | array | 否 | |
| enemyIndex | integer|string | 否 | 从 0 开始的队伍槽位;change_enemy_state 也接受 -1,表示整个队伍。 |
| initialize | boolean | 否 | change_party_member:添加时重置角色。 |
| loseBranch | array | 否 | |
| thenBranch | array | 否 | |
| variableId | integer|string | 否 | |
| animationId | integer|string | 否 | |
| characterId | integer|string | 否 | show_animation/show_balloon/move_route:-1 为玩家,0 为当前事件(默认值),n 为地图事件 n。 |
| defaultType | integer|string | 否 | show_choices:所选选项的索引;若未选择则为 -1。 |
| designation | enum | 否 | transfer_player/show_picture:坐标是字面值还是变量 ID。direct | variable |
| showLevelUp | boolean | 否 | |
| cancelBranch | array | 否 | show_choices:单独取消分支的命令。 |
| escapeBranch | array | 否 | |
| includeEquip | boolean | 否 | change_items weapon/armor:同时移除已装备的副本。 |
| purchaseOnly | boolean | 否 | |
| commonEventId | integer|string | 否 | |
| actorVariableId | integer|string | 否 | |
| randomEncounter | boolean | 否 | |
| troopVariableId | integer|string | 否 | |
| amountVariableId | integer|string | 否 | 使用此变量的值作为数量。 |
详细介绍
🎮 RPG Maker MV Copilot MCP
找出 MV 事件为何始终不触发,然后在真实引擎中验证修复
30 秒静音工作流:重放已验证的 MCP 调用,并在真实的 MV 1.6.1 中进行游戏测试。查看证据。
一个 Model Context Protocol 服务,可让 AI Agent 通过 18 个整合工具检查和编辑磁盘上的真实 RPG Maker MV 项目。查找损坏的引用和开关条件,使用 MV 兼容的指令构建事件,并执行可重复的游戏测试。生成的数据仍需在游戏的图块集和插件中验证。
它提供了通常缺少的三项功能:
| 🏗️ 构建 | 生成看起来像手工制作的地图,使用预设配置事件,并以真实 ID 而非虚构 ID 编辑所有数据库。 |
| 🧠 理解 | 读取整个项目并回答门为什么打不开、哪些地图无人可达、哪个技能会破坏游戏。 |
| 👀 监控 | 运行游戏并报告异常、玩家位置和截图;还能重新加载你刚编辑的地图,同时保留存档。 |
⚡ 快速入门
安装 Node.js 20.19.0 或更高版本,并在让 Agent 编辑项目文件前关闭 MV 编辑器。请从项目副本开始操作。
如需了解容器和目录托管,请参阅 Docker 和 Glama 构建配置。
**Windows x64 MCPB 包:**为兼容的 MCPB 客户端下载 v5.21.0。请参阅软件包要求和验证。下面的 npm 配置适用于受支持的各种操作系统。
添加服务前先检查环境(Windows 上使用 PowerShell):
npx.cmd -y rpgmaker-mv-mcp --doctor "C:/path/to/your/RPGMakerMV/project"
coreReady: true 表示 Node 和 System 数据检查已通过。headlessReady: true 还表示 Playwright 和 Chromium 已就绪。该检查不会启动浏览器,也不会验证资源或插件。桥接警告不会阻止离线查询。若缺少 Chromium,请运行 npx.cmd playwright install chromium-headless-shell,或将 RPGMAKER_MCP_CHROMIUM 设置为 Chrome 可执行文件的路径。
1 — 将它添加到 MCP 客户端。 无需克隆;此软件包自带可执行文件。
配置
{
"mcpServers": {
"rpgmaker-mv": {
"command": "npx",
"args": ["-y", "rpgmaker-mv-mcp"],
"env": {
"RPGMAKER_PROJECT_PATH": "C:/path/to/your/RPGMakerMV/project"
}
}
}
}
Claude Code 单行命令,以及从源代码运行
# Claude Code, user scope
claude mcp add rpgmaker --scope user \
--env RPGMAKER_PROJECT_PATH="C:/path/to/project" \
-- npx -y rpgmaker-mv-mcp
# From source
git clone https://github.com/DiegoLopez0208/RpgMakerMVUltimate-MCP
cd RpgMakerMVUltimate-MCP
npm install && npm run build
RPGMAKER_PROJECT_PATH=/path/to/your/project npm start
MCP 客户端会在启动时加载工具定义,因此添加或升级服务后,请重启客户端。
2 — 指定一个项目。 RPGMAKER_PROJECT_PATH 是包含 data/、js/ 和 index.html 的文件夹。服务无需此路径也能启动;如果愿意,也可以在运行时调用 set_project_path。
3 — 先让 Agent 四处查看。
get_project_context { detail: "full" } → what exists, with real IDs
analyze_project { view: "overview" } → health, counts, unreachable maps
兼容 Claude Desktop、Claude Code、opencode 以及任何兼容 MCP 的客户端。
对于 Codex CLI,请使用 codex mcp add rpgmaker --env RPGMAKER_PROJECT_PATH=C:/path/to/project -- npx -y rpgmaker-mv-mcp。在无法启动 npx 的 Windows 客户端中,请使用命令 cmd,并传入参数 ["/c", "npx", "-y", "rpgmaker-mv-mcp"]。重启客户端,然后尝试三个首次生成配方。
🧭 功能
flowchart LR
A["🤖 Agent"] -->|"generate_map · manage_map_event"| B["📁 Project on disk"]
B -->|"validate · balance · metrics"| A
B -->|"playtest"| C["🎮 Running game"]
C -->|"exceptions · position · screenshots"| A
A -->|"reload_map"| C
桥接器补上了这个循环的后半部分。在此之前,Agent 只能写入文件,然后寄希望于结果正确。
🗺️ 地图生成
generate_map 提供两种路径。根据项目是否使用 RTP 美术资源来选择。
mode: "procedural" (默认) | mode: "semantic" | |
|---|---|---|
| 方式 | 从 106 个内置 RTP 模板中克隆手工制作的地图,优先选择尺寸最接近的模板 | 先构建任务图,再通过图块集配置绘制地图 |
| 效果 | 真实的多图块建筑、墙壁和家具 | 根据空间的用途构造房间和走廊 |
| 图块集 | RTP 或与其接近的图块集 | 任意图块集——DLC、itch.io、自定义图块集 |
| 保证 | 相同的 seed → 相同的地图 | 相同的 seed → 相同的地图,且钥匙始终可在其开启的门之前取得 |
知识驱动路径
{ "mode": "procedural", "theme": "town", "name": "Riverbend", "width": 40, "height": 30 }
有匹配模板的主题——town、village、dungeon、interior、castle、world 等——会克隆真实地图,而不是绘制杂乱的图块。没有匹配模板的主题(beach、swamp、desert…)则会回退到 Perlin 地形、BSP 地牢和细胞洞穴。战斗主题会自动为现有部队配置随机遇敌;town 和 village 会自动创建可进入的房屋内部,并设置双向传送。
主题 ·
foresttownvillagecastledungeoncavebeachdesertswampruinsinteriorsnowharborvolcanosewerfortressmagic_forestmagic_interiorspace_interiorspace_exteriorworld
其他模式:blank(空白画布)、themed(简单布局)、template(指定一个内置地图)、batch(一次生成多张地图)、duplicate(复制现有地图)。
与图块集无关的路径
内置模板是原始 MV 地图 JSON,因此其中的图块 ID 只在 RTP 图块表上有意义。更换图块集后,地图就会变成杂乱的图块。semantic 会让布局保持抽象,直到最后一步才进行具体绘制:
manage_system { action: "mine_templates" } # learn from THIS project
generate_map { mode: "semantic", tilesetId: 5, rooms: 6, seed: 42 }
- 挖掘会读取你已创建的所有地图,并推导出语义布局(地面/墙壁/水域/道具/门,保持多图块道具的完整性)、图块集配置(标明项目中各角色所用的具体图块),以及令牌相邻计数。不会修改项目中的任何内容——所有数据都会写入
.mcp-cache/。 - 生成会先构建任务——入口 → 钥匙 → 锁门 → 宝藏 → Boss → 出口,以及侧边房间——将其表示为一张图,图中的边是通行的唯一路径,然后再绘制地图。由于锁是图中的一条边,而钥匙位于该边的入口一侧,因此地图在构造时就保证可通关。最后会根据完成后的邻近图块重新计算自动图块形状,而不是逐格猜测。
- 结果包含
markers,用于标明每个任务角色所在的格子;这些位置就是使用manage_map_event放置事件的地方。 - 传入挖掘得到的
templateId(例如"mined-3"),即可将你自己的地图重新绘制到另一种图块集上。
## 🔌 实时桥接
playtest 本身是发后即忘:游戏会启动,但不会返回任何信息。桥接让整个流程闭环。
manage_system { action: "install_bridge_plugin" } # once per project
manage_system { action: "bridge_start" } # opens ws://127.0.0.1:32123
manage_system { action: "playtest" } # the game connects on its own
manage_system { action: "bridge_telemetry", types: ["exception", "log"] }
sequenceDiagram
participant A as 🤖 Agent
participant S as 🖥️ MCP server
participant G as 🎮 Game (nwjs)
A->>S: edit_map
S->>S: atomic write to Map002.json
A->>S: bridge_command reload_map
S->>G: reload_map
G->>G: reserveTransfer + _needsMapReload
G-->>S: reload_complete
A->>S: take_screenshot
S->>G: capture_screenshot
G-->>S: PNG in base64
S-->>A: path for analyze_image
A->>S: record_video start / stop
S->>G: MediaRecorder on the game canvas
G-->>S: WebM in base64
S-->>A: path for video evidence
- 📡 遥测 — 异常及其堆栈跟踪、
console.error/warn、场景变更、玩家位置、当前正在执行的事件指令(可据此定位卡住的事件)、FPS 和堆内存。读取帧时会同时将其消费,除非传入peek。 - ♻️ 热重载 —
reload_map会重新读取当前的MapXXX.json并重建场景,且不会丢失队伍状态:它通过引擎自身的重载接口_needsMapReload,预留一次转移到玩家当前位置的操作,而不是手动重建Spriteset_Map。reload_database会重新读取一个数据文件;需要重新启动 playtest 的System.json和Tilesets.json会被拒绝,并附上说明。 - 📸 截图 —
take_screenshot { name: "collision-proof" }通过 MCP 插件捕获实时 playtest 画面,将带时间戳的 PNG 保存到.mcp-cache/screenshots/,并返回其路径,供检查或作为 QA 证据。此操作不涉及 shell 截图命令。manage_system { action: "bridge_screenshot" }仍作为兼容别名保留。 - 🎥 视频证据 —
record_video { action: "start", name: "npc-dialogue" }开始无声录制实时游戏画布,并生成 WebM;record_video { action: "stop" }会将视频保存到.mcp-cache/recordings/并返回其路径。Agent 可以通过允许列表中的interact命令和固定按钮输入press_button,搭建可重复的场景——仍然没有任意脚本或eval命令。
🔒 安全性
除非游戏运行在 NW.js 下,并且启动时带有
test参数,否则插件会在运行任何其他代码之前立即返回。玩家双击启动的已部署版本永远不会执行套接字代码,甚至不会执行require('fs')。它会检查每个参数,而不只是像
Utils.isOptionValid那样检查argv[0],因为playtest会先传入项目路径。因此,如果有人刻意用字面值test参数启动已部署版本,它会通过这一检查——但随后找不到握手文件,也永远不会连接。服务仅绑定到
127.0.0.1,拒绝任何携带浏览器Origin的升级请求(防止跨站 WebSocket 劫持),并要求在 5 秒内提供来自.mcp-bridge.json的会话令牌(通过恒定时间比较),否则会断开连接。命令接口采用固定的允许列表,不包含
eval原语。
## 🔍 项目智能分析
analyze_project 只读且完全离线。它会对整个项目建模一次,让 Agent 能够分析自己并未制作的游戏。
| 视图 | 回答的问题 |
|---|---|
overview | 先调用此视图。 统计数据、健康状况摘要、从起点无法抵达的地图 |
validate | 一次列出所有一致性问题——见下文 |
explain | 为什么这永远不会发生? 例如:“开关 12 在 3 处设有门控,但从未设为 ON” |
usage | 所有涉及开关、变量或物品的事件、公共事件和敌群,以及读写角色 |
graph | 地图传送网络及可抵达范围 |
ast | 将单个事件的逻辑显示为易读的树 |
plugins | 项目使用的插件及其参数和命令 |
critique | 设计师对单张地图的看法:空置区域、杂乱程度、事件分布、单调性 |
metrics | 对同一张地图进行测量——见下文 |
balance | 与同类条目相比偏离常态的数据库条目——见下文 |
refactor | 多个事件中重复粘贴的命令序列,值得提取为公共事件 |
search | 离线 Unicode 文本匹配,搜索名称、对话、描述和备注;不会扩展同义词或翻译 |
index | 其他视图基于其构建的结构化摘要 |
validate — 编辑器从不提醒的问题
传送目标损坏、地图文件缺失、公共事件/物品/敌群引用悬空、ID 重复、已命名但未使用的开关和变量、错误的起始位置、无法抵达的地图,以及对话中无法解析的角色名称引用 \N[id]。
最后一项值得单独说明:引擎会在绘制时解析 \N[id],而不是从任何结构化参数中读取,因此错误的 ID 能通过其他所有检查,编辑器也不会显示异常。游戏中那一行只会在名字应出现的位置留下空缺,玩家会比你更早发现问题。
metrics — 测量,不评判
- 可达性 — 从实际入口开始进行洪水填充。玩家永远无法抵达的可通行地块,以及旁边没有可达地块的事件,属于软锁,而不是风格问题。
- 空置区域 — 矩形范围内无法抵达的区域所占比例,并与
expected(interior/dungeon/exterior)对应的范围比较。 - 形状 — 将可通行区域细化为单格骨架,再作为图读取:端点、交叉点、环路、关键路径、线性度。线性度接近 1,意味着这是一条没有选择余地的走廊。
- 多样性 — 对 5×5 地块窗口计算香农熵,量化单调地板问题。
- 紧张度 — 对有随机遇敌的地图,计算玩家距离商店、旅店或存档点的步数。
balance — 与同类条目比较的异常值,而非相对于臆造阈值
在一款所有技能都造成 400 点伤害的游戏里,这很正常;但如果其他技能造成的伤害都不超过 60 点,那就不平衡。因此,每个条目都会根据一项强度指标评分,并与其类别中的其他条目比较:技能看每 MP 的伤害,武器看每点 ATK+MAT 的金币数,护甲看每点 DEF+MDF 的金币数,敌人看每点 EXP 的 HP。
比较采用留一法——每个条目都只与自己未参与生成的统计数据进行比较。如果把条目自身也纳入统计,一个严重失衡的条目就会将平均值拉向自己,最终看起来一点也不异常。
伤害公式只会解析,绝不执行(分词 → 调度场算法 → 求值)。无法静态读取的公式会列在 unreadableFormulas 中,而不会被计为零伤害;否则就会拉低所有平均值,掩盖你要找的异常值。
使用 category 缩小范围,使用 thresholdSd 调整宽严度(默认为 2)。
搜索会返回 searchMode: "lexical"、complete、indexedFiles、skippedFiles 和 warnings。complete: false 表示部分数据无法读取;这并不意味着游戏中没有匹配内容。空结果会包含 noResultsReason。请使用项目中实际存在的名称或短语:herrero 不会翻译成 Blacksmith。支持包括日语在内的 Unicode 名称。查询不存在的 ID 时,数据库可能会返回 null;使用该 ID 前请先检查。
索引、概览、验证、图谱、用法、解释和重构也会报告输入不完整。无法读取的文件会显示为验证错误。
离线地图检查
query_map { view: "ascii", mapId }— 将地图渲染为带事件标记的字符网格。这是查看布局并选择坐标的最简便方式。query_map { view: "validate", mapId }— 检查单张地图中的无效图块 ID、失效的传送设置以及缺失的事件终止符。
工具
该服务提供 18 个整合工具。旧版别名为可选项。
点击展开完整列表
| 工具 | 用途 |
|---|---|
build_event_commands | 只读地构建 MV 对话、选项、条件、开关、变量、传送、公共事件、流程和插件命令 |
insert_event_commands | 经验证后插入地图/公共事件/战斗事件列表,并提供前后预览和安全的嵌套边界 |
query_database | 列出/按 ID 获取/搜索任意数据库(角色、职业、技能、物品、武器、防具、敌人、状态、战斗队伍、图块集、公共事件、动画) |
create_database_entry | 创建条目,提供预设:damage_skill、healing_skill、buff_skill、state_skill、boss_enemy、encounter_troop |
update_database_entry | 部分更新(包括战斗队伍和动画);向公共事件追加命令;向战斗队伍添加敌人 |
delete_database_entry | 删除条目并发出引用失效警告 |
query_map | 地图树、完整地图数据、事件、单个事件、检查、离线 ASCII 渲染 |
generate_map | 基于知识、语义、程序生成、空白、主题、模板、批量生成或复制地图 |
edit_map | 填充图块层、设置显示名称、整理地图树、连接两张地图、设置遭遇战 |
manage_map_event | 创建(预设:npc、宝箱、传送、门、商店、旅店、Boss、谜题开关)、更新、就地将 NPC 转换为商人/旅店/告示牌、删除、添加命令、批量填充 |
manage_system | 标题、开关/变量名称、初始位置、编写插件、搭建可在编辑器中打开的项目、试玩、在编辑器中打开/修复、挖掘模板以及实时桥接 |
take_screenshot | 通过经过身份验证的 MCP 桥接捕获并命名实时试玩 PNG;也可使用 mapId 在无游戏运行时以无头模式按引擎的绘制方式渲染地图 |
run_playtest | 无头模式下运行一系列试玩步骤(加载、开始事件、读取事件文本、选择、行走、战斗、截图),并报告发生的情况 |
record_video | 通过经过身份验证的 MCP 桥接开始或停止命名的实时试玩 WebM 录制 |
analyze_project | 上述只读智能分析层 |
get_project_context | 项目摘要、资源索引、各图块集的图块 ID、捆绑模板目录 |
set_project_path | 在运行时切换项目 |
analyze_image | 可选的视觉 AI 图像分析,以及离线图块集网格测量和象限颜色分析 |
101 个细粒度的 v4 工具名称仍可用作调用别名。设置 RPGMV_LEGACY_TOOLS=1 也会将它们公布出来。
## 🛡️ 写入安全
对于组合事件逻辑,请先使用 build_event_commands,然后使用 insert_event_commands 并设置
dryRun:true。预览会显示完整的旧命令列表和拟写入的命令列表。有关支持的类型、
嵌套规则、MV 专属差异和验证方法,请参阅事件命令编写。
- 原子性。 每次写入都会先写入临时文件,再将其重命名覆盖目标文件,因此调用中断也不会留下只写入一半的 JSON。
- 有备份。 在
.mcp-backups/下保留带时间戳的轮换副本(最近 N 份,RPGMV_BACKUP_KEEP,默认值为 10)。备份失败时会中止替换。写入使用唯一临时文件和每个文件独占的锁;如果检测到自读取数据后发生了更改,则会拒绝写入。请关闭编辑器:它不会遵守 MCP 锁,而且多文件操作并非事务。 - 可预览。 对任何会修改数据的工具传入
dryRun: true,即可准确查看它将写入的内容,而不会触碰磁盘。
⚠️ Agent 工作期间请关闭 RPG Maker 编辑器。 编辑器会将项目保存在内存中,并在保存时覆盖更改。
⚙️ 配置
| 变量 | 必需 | 描述 |
|---|---|---|
RPGMAKER_PROJECT_PATH | 建议设置 | 项目文件夹(包含 data/ 和 js/ 的文件夹)。可选 — set_project_path 可在运行时设置 |
RPGMAKER_MV_INSTALL | 运行游戏测试时需要 | 引擎安装根目录,用于 playtest / open_editor / scaffold_project。默认使用标准 Steam 路径 |
RPGMV_BRIDGE_PORT | 可选 | 实时桥接的环回端口(默认值为 32123) |
RPGMV_BACKUP_KEEP | 可选 | 每个文件保留的备份数(默认值为 10) |
RPGMV_LEGACY_TOOLS | 可选 | 1 还会公布 101 个旧版工具名称 |
RPGMAKER_MCP_CHROMIUM | 可选 | 用于无头渲染和 run_playtest 的 Chromium 可执行文件。未设置时会使用 Playwright 缓存中最新的浏览器(npx playwright install chromium-headless-shell)。无头工具还需要可选依赖 playwright-core。 |
RPGMV_TOOLSET | 可选 | 仅公布部分工具组,例如 events,media。core(项目、数据库、地图、事件、系统、分析)始终启用;其他工具组包括 events(构建/插入事件命令)、mapgen(generate_map)和 media(截图、视频、图像分析、无头游戏测试)。未设置或设置为 all 时会列出所有工具。仅使用 core 约占 11k 个 token,而非 18k。 |
VISION_API_URL | 启用视觉功能时需要 | 与 OpenAI 兼容的视觉端点基础 URL。未设置 = 禁用视觉功能 |
VISION_API_KEY | 可选 | Bearer 令牌;仅在设置后发送 |
VISION_MODEL | 可选 | 模型名称(默认值为 meta/llama-3.2-90b-vision-instruct) |
VISION_API_PATH | 可选 | 端点路径(默认值为 /v1/chat/completions) |
视觉 AI 为可选启用
analyze_image { mode: "ai" } 会将项目图像(图块集、精灵、截图、战斗角色)发送到任意与 OpenAI 兼容的端点。除非你进行配置,否则不会向任何地方发送数据;grid 和 colors 模式以及其他所有工具均可完全离线运行。
# OpenAI
VISION_API_URL=https://api.openai.com VISION_API_KEY=sk-... VISION_MODEL=gpt-4o npm start
# Ollama (local, no key)
VISION_API_URL=http://localhost:11434 VISION_MODEL=llava npm start
兼容 OpenAI、Ollama、LocalAI、NVIDIA NIM、vLLM、LiteLLM 或任何与 OpenAI 兼容的代理。
🎓 Agent 技能
便携式 Agent 技能可教会任何模型无崩溃工作流——使用 generate_map 构建地图,使用 manage_map_event 预设添加内容,绝不手动绘制图块或猜测 ID。文件位于 skill/rpgmaker-mv-mcp/SKILL.md。
# Claude Code / Claude.ai
npx degit DiegoLopez0208/RpgMakerMVUltimate-MCP/skill/rpgmaker-mv-mcp ~/.claude/skills/rpgmaker-mv-mcp
# opencode
npx degit DiegoLopez0208/RpgMakerMVUltimate-MCP/skill/rpgmaker-mv-mcp ~/.opencode/skills/rpgmaker-mv-mcp
也已收录于 awesome-claude-skills。
## 📚 知识库
从 MV 核心脚本提取的静态参考数据
| 文件 | 内容 |
|---|---|
tile-ids.json | 图块 ID 范围、自自动图块公式、图块表说明、图层含义 |
passage-flags.json | 标志位、常见标志、通行检查逻辑 |
event-commands.json | 约 140 个事件指令代码及其参数架构 |
enums.json | Scope、occasion、hitType、damageType、restriction 等 |
trait-effect-codes.json | 特性代码 11-64、效果代码 11-45 |
database-schemas.json | 每种 MV 数据类型的完整架构 |
image-paths.json | img/ 目录、图块集插槽、命名约定 |
map-templates.json | 106 张内置参考地图的索引 |
stamps.json | 按图块集整理的挖掘所得多图块物件印章(树木、道具) |
maps/ | 用于模板克隆的 106 个 RTP 参考地图 JSON 文件 |
🚧 已知限制与路线图
- RTP 模板路径中的装饰语义尽力而为;少数多图块物件可能会以单个图块的形式放置。挖掘路径会保留多图块道具的整体结构。
- 城镇和地牢布局会持续改进——计划包括:以中央广场或水井作为地标、房屋成排并朝向道路、添加围栏和庭院、构建更丰富的道路网络,以及增加更多房间类型。
mode: "semantic"目前会生成地牢形状的任务。接下来将支持城镇和开放世界任务语法,并使用挖掘所得的邻接计数来进行装饰,而不只是描述。balance会在同一类别中比较相似对象,因此,与随机遭遇相比,首领理应显得像个离群值。请查看标志,而非结论。- 桥接功能仅支持在 Windows/nwjs 上进行游戏测试,并且需要在项目中安装其插件。
- 视觉 AI 需要使用你自己的端点。
🛠️ 开发
npm install
npm run build # tsc compile (+ copies knowledge/ into dist/)
npm test # vitest
npm run typecheck
npm run dev # tsx watch mode
| 位置 | 内容 |
|---|---|
src/server.ts | 工具处理器和 MCP 传输 |
src/toolDefinitions.ts + src/router.ts | 13 个工具的接口及其路由 |
src/tools/* | 各领域的 CRUD |
src/utils/mapGenerator.ts | 模板克隆和程序化生成 |
src/utils/graphGenerator.ts + src/utils/materialize.ts | 任务图和语义编译器 |
src/bridge/* | 环回 WebSocket 和游戏内插件 |
src/intel/* | analyze_project 背后的只读层 |
knowledge/ | 静态参考数据和内置地图 |
💬 反馈
项目正在积极开发中,非常欢迎反馈——无论是错误报告、奇怪的地图、缺少的工具,还是各种想法。请提交 GitHub Issue,说明你让 Agent 执行了什么,以及实际得到的结果;导出的地图 JSON 或截图会很有帮助。
评论
一个开放协议,规定了 AI 应用如何以统一方式连接外部工具与数据源。客户端负责与模型对话,MCP 服务负责提供工具、资源和提示模板,两者通过标准消息通信,同一个服务可以被不同客户端复用。
