rpgmaker-mv-mcp
RPG Maker MV Ultimate — AI copilot (MCP) for RPG Maker MV: generate maps, edit the database and events, and understand your project — validate broken references, explain why an event never fires, critique maps, and search names and dialogue offline.
npm · fingerprint a4581f751a62a04ef96a545f · repository · RSS
What changed
Changed between 8 October 2026 and 13 October 2026 (first seen 2026-10-13 14:23 UTC)
1 schema or annotation change with the description left byte-identical.
--- pinned/analyze_project +++ observed/analyze_project { "annotations": { "destructiveHint": false, - "description": "view \"search\": free-text query, e.g. \"the blacksmith\", \"dark forest\"", + "description": "view \"search\": Unicode text matching over names/dialogue/notes, e.g. \"the blacksmith\". Offline lexical search, no synonym or translation expansion. Check complete, skippedFiles and warnings.", "type": "string" }, "severity": {
Changed 2026-10-07 13:35 UTC
5 descriptions rewritten, 1 schema or annotation change with the description left byte-identical.
--- pinned/analyze_project +++ observed/analyze_project { "annotations": { "destructiveHint": false, - "description": "Read-only project intelligence over an in-memory model of the whole project, cached until data files change. Nothing is written. `view` selects the lens: \"overview\" (default) title, counts, a health summary with the top issues, and maps unreachable from the start map; \"index\" maps with event counts, common events, named switches/variables; \"validate\" every consistency check (transfers to missing maps, missing map files, references to missing common events/items/weapons/armors/troops/animations, duplicate IDs, unused named switches/variables, bad start position, unreachable maps, autotiles the engine cannot draw) as {issueCount, bySeverity, issues[]}, filter with `severity`; \"graph\" the map transfer network and reachability; \"usage\" every event, common event and troop that uses `kind` (switch/variable/common_event/item/weapon/armor/troop/animation/actor/state/map) `id`, with read/write roles; \"explain\" `target` \"switch\"/\"variable\" + `id`: whether it is set, read, gated, a dead write or never set (why a door never opens); `target` \"map\" + `id`: incoming transfers and what becomes unreachable without it; \"ast\" one event page (mapId, eventId, page?) or common event (commonEventId) as a logical tree with an outline; \"plugins\" js/plugins.js merged with each plugin's header (@plugindesc/@param/@command/@help), flagging missing files; \"critique\" a designer's review of one map (`mapId`) with suggestions and a rough score; \"metrics\" measurements of one map (`mapId`): reachability from the real entry (unreachable tiles and events are softlocks), dead space against `expected` (interior/dungeon/exterior), walkable skeleton (loops, critical path, linearity), tile entropy, and steps to a shop/inn/save when the map has encounters; \"balance\" each skill/weapon/armor/enemy against its peers (damage per MP, gold per stat point, HP per EXP), leaving each out of its own statistics; `category`, `thresholdSd` (default 2); formulas are parsed, never executed, and unreadable ones are listed; \"refactor\" command sequences copy-pasted across events, to extract into a common event; \"search\" ranks names, dialogue, descriptions and notes against a free-text `query`.", + "description": "Read-only project intelligence over an in-memory model of the whole project, cached until data files change. Nothing is written. `view` selects the lens: \"overview\" (default) title, counts, a health summary with the top issues, and maps unreachable from the start map; \"index\" maps with event counts, common events, named switches/variables; \"validate\" every consistency check (transfers to missing maps, missing map files, references to missing common events/items/weapons/armors/troops/animations, duplicate IDs, unused named switches/variables, bad start position, unreachable maps, autotiles the engine cannot draw, image/audio files missing from img/ and audio/) as {issueCount, bySeverity, issues[]}, filter with `severity`; \"graph\" the map transfer network and reachability; \"usage\" every event, common event and troop that uses `kind` (switch/variable/common_event/item/weapon/armor/troop/animation/actor/state/map) `id`, with read/write roles; \"explain\" `target` \"switch\"/\"variable\" + `id`: whether it is set, read, gated, a dead write or never set (why a door never opens); `target` \"map\" + `id`: incoming transfers and what becomes unreachable without it; \"ast\" one event page (mapId, eventId, page?) or common event (commonEventId) as a logical tree with an outline; \"plugins\" js/plugins.js merged with each plugin's header (@plugindesc/@param/@command/@help), flagging missing files; \"critique\" a designer's review of one map (`mapId`) with suggestions and a rough score; \"metrics\" measurements of one map (`mapId`): reachability from the real entry (unreachable tiles and events are softlocks), dead space against `expected` (interior/dungeon/exterior), walkable skeleton (loops, critical path, linearity), tile entropy, and steps to a shop/inn/save when the map has encounters; \"balance\" each skill/weapon/armor/enemy against its peers (damage per MP, gold per stat point, HP per EXP), leaving each out of its own statistics; `category`, `thresholdSd` (default 2); formulas are parsed, never executed, and unreadable ones are listed; \"refactor\" command sequences copy-pasted across events, to extract into a common event; \"search\" ranks names, dialogue, descriptions and notes against a free-text `query`.", "inputSchema": { "properties": { "category": {
--- pinned/create_database_entry +++ observed/create_database_entry { "annotations": { "destructiveHint": false, - "description": "Entry fields. Raw entries: same properties as the RPG Maker database (name, note, traits, params...; effects for items/skills, members [{enemyId,x,y}] for troops, trigger/switchId/list for common_events). Presets: the recipe fields listed in the description", + "description": "Entry fields. Raw entries: same properties as the RPG Maker database (name, note, traits, params...; effects for items/skills, members [{enemyId,x,y}] for troops, trigger/switchId/list for common_events). Presets: the recipe fields listed in the description. Give `data` or `entries`", "type": "object" }, "entity": { + "entries": { + "description": "Instead of `data`: up to 200 data objects, created one after another with the same entity/preset; returns {count, created[]}. A failing entry stops the run and the error names the entries already created", + "items": { + "type": "object" + }, + "type": "array" + }, "preset": { "description": "Recipe for common content; see the tool description for each preset's required data fields. Omit for a raw entry", "enum": [ - "required": [ - "data" - ], + "required": [], "type": "object" }, "name": "create_database_entry"
--- pinned/generate_map +++ observed/generate_map { "annotations": { "destructiveHint": false, - "description": "Create a new map file (next free map ID, registered in MapInfos.json; both files written immediately). `mode` selects the generator: \"blank\" makes an empty map you paint later (edit_map fill_layer); \"themed\" generates a simple tile layout for a theme using the tileset's real tiles; \"procedural\" is the full generator — for themes with matching RTP reference templates (town, dungeon, interior, castle, world, etc.) it CLONES a hand-authored template from the 106 bundled maps (real 3D buildings, walls, furniture), auto-picking the closest size; for themes without templates (beach, swamp, etc.) it generates procedurally (Perlin terrain, BSP dungeons, cellular caves). Same seed + params = same map. Pass templateId to force a specific template, or useTemplate:false to force procedural. 21 themes incl. snow, volcano, sewer, space_interior; \"batch\" generates several procedural maps in one call from `batch` specs; \"duplicate\" copies an existing map (transfer events still point at their ORIGINAL destinations — review them); \"template\" instantiates one of the 106 bundled reference maps by templateId (list them with get_project_context detail \"templates\"); \"semantic\" is the tileset-independent generator — it lays out a MISSION (entrance, key, locked door, treasure, boss, exit, side rooms) as a graph and only then paints it, asking the tileset profile which tile plays each role, so the layout works on ANY tileset including DLC and third-party packs, and the key is always reachable before the door it opens. It returns `markers` naming the cell of every mission role, which is where to place events next. Run manage_system action \"mine_templates\" first so the profile comes from tiles this project actually uses; pass a mined `templateId` (like \"mined-3\") to re-materialise one of the project OWN maps onto a different tileset instead of generating a new mission. Returns {mapId, ...} — procedural also returns the seed; batch returns all mapIds keyed for edit_map \"connect\". Fails with an error on unknown theme/template or unwritable files.", + "description": "Create a new map file (next free map ID, registered in MapInfos.json; both files written immediately). `mode` selects the generator: \"blank\" makes an empty map you paint later (edit_map fill_layer); \"themed\" generates a simple tile layout for a theme using the tileset's real tiles; \"procedural\" is the full generator — for themes with matching RTP reference templates (town, dungeon, interior, castle, world, etc.) it CLONES a hand-authored template from the 106 bundled maps (real 3D buildings, walls, furniture), auto-picking the closest size; for themes without templates (beach, swamp, etc.) it generates procedurally (Perlin terrain, BSP dungeons, cellular caves). Same seed + params = same map. Every mode except blank and duplicate also returns `walkability` per map (walkable tiles, main area, cut-off tiles) and `warnings` when the map is barely walkable or has unreachable pockets. Pass templateId to force a specific template, or useTemplate:false to force procedural. 21 themes incl. snow, volcano, sewer, space_interior; \"batch\" generates several procedural maps in one call from `batch` specs; \"duplicate\" copies an existing map (transfer events still point at their ORIGINAL destinations — review them); \"template\" instantiates one of the 106 bundled reference maps by templateId (list them with get_project_context detail \"templates\"); \"semantic\" is the tileset-independent generator — it lays out a MISSION (entrance, key, locked door, treasure, boss, exit, side rooms) as a graph and only then paints it, asking the tileset profile which tile plays each role, so the layout works on ANY tileset including DLC and third-party packs, and the key is always reachable before the door it opens. It returns `markers` naming the cell of every mission role, which is where to place events next. Run manage_system action \"mine_templates\" first so the profile comes from tiles this project actually uses; pass a mined `templateId` (like \"mined-3\") to re-materialise one of the project OWN maps onto a different tileset instead of generating a new mission. Returns {mapId, ...} — procedural also returns the seed; batch returns all mapIds keyed for edit_map \"connect\". Fails with an error on unknown theme/template or unwritable files.", "inputSchema": { "properties": { "addEvents": {
--- pinned/manage_map_event +++ observed/manage_map_event { "annotations": { "destructiveHint": true, - "description": "Create, change or remove map events; the map file is written immediately. action \"create\" without `preset` makes a bare event at x/y (empty page unless `pages`; then use add_command or insert_event_commands). With `preset` it builds a ready event: \"npc\" {name, dialogues[], characterName?, characterIndex?}; \"chest\" one-time loot {items: [{type item|weapon|armor, id, amount}]}; \"teleport\" walk-on transfer {destMapId, destX, destY, trigger?}; \"door\" action-button warp {destMapId, destX, destY, characterName?, characterIndex?, trigger?, lockedSwitchId?, lockedMessage?}, locked until that switch is ON; \"shop\" {goods: [[type 0 item/1 weapon/2 armor, id, priceType 0 standard/1 custom, price]]}; \"inn\" {cost?}; \"boss\" {troopId} one-time battle, game over on loss; \"puzzle_switch\" {switchX, switchY, doorX, doorY, gameSwitchId, switchName?, doorName?} makes two linked events. IDs and destinations are not validated (check with query_database and query_map). \"update\" overwrites only `fields`. \"convert\" keeps an event's id, position, name and sprite but replaces its behaviour via `kind`: \"merchant\" (options.goods, or options.items [{type, id}], options.greeting?), \"inn\" (options.cost?), \"sign\" (options.text). \"delete\" removes it (destructive). \"add_command\" appends one command before a page's end. \"populate\" scatters N npc/chest/boss events at random positions (walkability not checked; check with query_map \"ascii\"). Returns the event(s) with ids; fails if the map or event does not exist.", + "description": "Create, change or remove map events; the map file is written immediately. action \"create\" without `preset` makes a bare event at x/y (empty page unless `pages`; then use add_command or insert_event_commands). With `preset` it builds a ready event: \"npc\" {name, dialogues[], characterName?, characterIndex?}; \"chest\" one-time loot {items: [{type item|weapon|armor, id, amount}]}; \"teleport\" walk-on transfer {destMapId, destX, destY, trigger?}; \"door\" action-button warp {destMapId, destX, destY, characterName?, characterIndex?, trigger?, lockedSwitchId?, lockedMessage?}, locked until that switch is ON; \"shop\" {goods: [[type 0 item/1 weapon/2 armor, id, priceType 0 standard/1 custom, price]]}; \"inn\" {cost?}; \"boss\" {troopId} one-time battle, game over on loss; \"puzzle_switch\" {switchX, switchY, doorX, doorY, gameSwitchId, switchName?, doorName?} makes two linked events. A missing destination map, troop, item or switch is refused; an unwalkable or occupied tile is created anyway and listed in `warnings`. \"update\" overwrites only `fields`. \"convert\" keeps an event's id, position, name and sprite but replaces its behaviour via `kind`: \"merchant\" (options.goods, or options.items [{type, id}], options.greeting?), \"inn\" (options.cost?), \"sign\" (options.text). \"delete\" removes it (destructive). \"add_command\" appends one command before a page's end. \"populate\" scatters N npc/chest/boss events on random free tiles of the main walkable area of the map (explicit opts.x/opts.y are used as given). Returns the event(s) with ids; fails if the map or event does not exist.", "inputSchema": { "properties": { "action": {
--- pinned/manage_system +++ observed/manage_system { "annotations": { "destructiveHint": false, - "description": "Project-wide settings in data/System.json (writes are immediate), project lifecycle, and the live playtest bridge. action \"get\" returns `section`: \"full\" (large), \"switches\"/\"variables\" (names by ID; empty means free) or \"title\". \"set_title\" sets the game title. \"name_switch\"/\"name_variable\" label one by ID (names only). \"set_starting_position\" {mapId, x, y} for new games (not validated; check with query_map \"infos\"). \"create_plugin\" writes js/plugins/<name>.js with a proper header (and a pluginCommand hook when `commands` are given) and registers it in js/plugins.js (order is load order); the same `name` replaces it. \"scaffold_project\" creates a new editor-openable project at `destPath` from NewData (never overwrites; does not switch the active project). \"playtest\" runs the active project in the bundled nwjs; \"open_editor\" opens it in RPGMV.exe, repairing a missing Game.rpgproject (Windows; engine from `install`, RPGMAKER_MV_INSTALL or the Steam path). \"mine_templates\" learns layouts and tile roles from this project for semantic generation. \"export_web\" builds an HTML5 folder and zip for itch.io (see outDir, zip, prune). Live bridge: \"install_bridge_plugin\" writes js/plugins/McpBridge.js (active only in playtest); \"bridge_start\" opens the loopback socket and its handshake; \"bridge_status\" says whether the game is connected, and why not in lastAuthError; \"bridge_telemetry\" drains exceptions, logs, scene changes, player position and executing commands (filter `types`, `peek` keeps them); \"bridge_command\" sends reload_map, reload_database, get_state, teleport_player, interact, press_button or ping; \"take_screenshot\" captures the live game (\"bridge_screenshot\" is an alias); \"bridge_stop\" closes it.", + "description": "Project-wide settings in data/System.json (writes are immediate), project lifecycle, and the live playtest bridge. action \"get\" returns `section`: \"full\" (large), \"switches\"/\"variables\" (names by ID; empty means free) or \"title\". \"set_title\" sets the game title. \"name_switch\"/\"name_variable\" label one by ID (names only). \"resize_list\" {section, size} sets the highest valid switch/variable id (MV ignores ids past it, silently). \"list_backups\" {file?} and \"restore_backup\" {file, backup?} list and restore the copies kept in .mcp-backups before every write; the newest undoes the last write. \"set_starting_position\" {mapId, x, y} for new games; a tile the player cannot stand on is moved to the nearest walkable one (`relocated`). \"create_plugin\" writes js/plugins/<name>.js with a proper header (and a pluginCommand hook when `commands` are given) and registers it in js/plugins.js (order is load order); the same `name` replaces it. \"scaffold_project\" creates a new editor-openable project at `destPath` from NewData (never overwrites; does not switch the active project). \"playtest\" runs the active project in the bundled nwjs and first closes the game an earlier playtest of it started (`keepRunning` leaves it open); \"stop_playtest\" closes that game; \"open_editor\" opens it in RPGMV.exe, repairing a missing Game.rpgproject (Windows; engine from `install`, RPGMAKER_MV_INSTALL or the Steam path). \"mine_templates\" learns layouts and tile roles from this project for semantic generation. \"export_web\" builds an HTML5 folder and zip for itch.io (see outDir, zip, prune). Live bridge: \"install_bridge_plugin\" writes js/plugins/McpBridge.js (active only in playtest); \"bridge_start\" opens the loopback socket and its handshake; \"bridge_status\" says whether the game is connected, and why not in lastAuthError; \"bridge_telemetry\" drains exceptions, logs, scene changes, player position and executing commands (filter `types`, `peek` keeps them); \"bridge_command\" sends reload_map, reload_database, get_state, teleport_player, interact, press_button or ping; \"take_screenshot\" captures the live game (\"bridge_screenshot\" is an alias); \"bridge_stop\" closes it.", "inputSchema": { "properties": { "action": { + "resize_list", + "list_backups", + "restore_backup", "set_starting_position", "create_plugin", "scaffold_project", + "stop_playtest", "open_editor", "mine_templates", "install_bridge_plugin", + "backup": { + "description": "restore_backup: a backup id from list_backups (default: the newest, which undoes the last write)", + "type": "string" + }, "body": { "description": "create_plugin: custom JS body; omit for a safe generated skeleton", "type": "string" - "description": "bridge_command \"reload_database\": the data file to re-read, e.g. \"Skills.json\"", + "description": "bridge_command \"reload_database\": the data file to re-read, e.g. \"Skills.json\". list_backups/restore_backup: a data file name such as \"Map002.json\" or \"plugins.js\"", "type": "string" }, + "force": { + "description": "resize_list: allow shrinking past names that are in use", + "type": "boolean" + }, "help": { "description": "create_plugin: @help text (multi-line allowed)", "type": "string" + "keepRunning": { + "description": "playtest: do not close the game a previous playtest started (default false)", + "type": "boolean" + }, "limit": { "description": "bridge_telemetry: return at most this many of the most recent frames. mine_templates: keep at most this many layouts, largest maps first", "type": [ + "size": { + "description": "resize_list: the highest valid switch or variable id (1-5000); `section` picks which", + "type": [ + "number", + "string" + ] + }, "sourcePath": { "description": "scaffold_project: a blank-project (NewData) folder to clone; defaults to the RPGMAKER_MV_INSTALL env var or the standard Steam install", "type": "string"
--- pinned/take_screenshot +++ observed/take_screenshot { "annotations": { "destructiveHint": false, - "description": "Capture the current RPG Maker MV playtest frame through the authenticated MCP bridge and save it as a PNG under `.mcp-cache/screenshots/`. Returns `{path, bytes, mimeType, name}` so the image can be inspected or attached as QA evidence without shell commands. Requires `manage_system` actions `install_bridge_plugin`, `bridge_start`, and `playtest` first. Optional `name` becomes a safe filename prefix; each capture keeps a timestamp. `manage_system {action:\"bridge_screenshot\"}` remains available as a compatibility alias.", + "description": "Capture the current RPG Maker MV playtest frame through the authenticated MCP bridge and save it as a PNG under `.mcp-cache/screenshots/`. Returns `{path, bytes, mimeType, name}` and the PNG itself as an image block (up to 1.5 MB; RPGMV_INLINE_IMAGES=0 turns that off), so you can look at it. Requires `manage_system` actions `install_bridge_plugin`, `bridge_start`, and `playtest` first. Optional `name` becomes a safe filename prefix; each capture keeps a timestamp. `manage_system {action:\"bridge_screenshot\"}` remains available as a compatibility alias.", "inputSchema": { "properties": { "mapId": {
Current tools
Show all 18 tool fingerprints
Watch this server yourself
If you run this server, put the proxy in front of it. It pins these exact fingerprints on first connect and stops the session if they move.
npx -y mcp-pin@0.2.3 -- <your rpgmaker-mv-mcp command>
Or subscribe to this page's RSS feed to be told when it changes.
Badge
The badge states one fact about time and nothing else. It never claims a server is safe.
[](https://mcp-pin.gautamkhosla.com/servers/2baa11f3078ad06f.html)