RPG Maker MV Ultimate MCP
NPM · RPGMAKER-MV-MCP · SCANNED SEP 20
RPG Maker MV Ultimate: AI copilot to generate, edit and understand RPG Maker MV projects (MCP)
Available components
How this component scores in each security and reliability category. Every signal is checked automatically from public evidence about the published package, including repeated runs of it in an isolated sandbox, and we only credit what we can confirm. How we score → Why this is hard to score →
Supply Chain Security81
- No malware found by supply-chain analysis.Pass
- CVE check failed: a known high-severity CVE affects sharp 0.33.5, a direct dependency. A fixed version is available. View diagnostics → Fail
- No install/post-install scripts declared.Pass
- 31 of 126 dependencies flagged as unhealthy. View diagnostics → Partial
Provenance & Transparency45
- Source repository is publicly reachable at the declared URL. View diagnostics → Pass
- Provenance check failed: no build-provenance attestation is published. See how to fix → View diagnostics → Fail
- Clear OSI-approved license (MIT).Pass
- Actively maintained (last published 11 days ago).Pass
- Disclosure check failed: no security disclosure policy was found in the source repository. See how to fix → Fail
Schema Quality & AI Usability59
- AI-judged instruction clarity (excellent).Pass
- Context-footprint check failed: tool/resource definitions use about 8755 tokens (~673/item across 13 items; 13 tools + 0 resources), over budget; trim descriptions and params. See how to fix → Fail
- Usage-examples check failed: none of the tools include examples. See how to fix → Fail
Stability & Change Management90
- Stability observed for 27 of 30 days with no destabilising changes; credit accrues until the full window elapses.Partial
Tool Coverage100
- 100% of tools have a non-trivial description (not blank, and not just the tool's name).Pass
- 100% of tool parameters carry a description.Pass
Tool Safety100
- No prompt-injection markers were found in the server instructions, tool names or descriptions we captured.Pass
- All 1 tool(s) whose name or description implies an irreversible operation declare an MCP destructiveHint annotation.Pass
- An AI judge read all 13 captured unit(s) of tool text and found none that tries to manipulate the model reading it.Pass
Capabilities100
- Implements a supported MCP spec version (2025-11-25); the latest is 2026-07-28.Pass
How do I install the RPG Maker MV Ultimate MCP server?
RPG Maker MV Ultimate MCP runs locally as an npm package, launched with npx -y rpgmaker-mv-mcp. Ready-made configuration for Claude, Cursor, VS Code, Codex and 5 more is on this page, copied from each client's own documentation.
npm · rpgmaker-mv-mcp
claude mcp add diegolopez0208-rpgmaker-mv-ultimate -- npx -y rpgmaker-mv-mcp
{
"mcpServers": {
"diegolopez0208-rpgmaker-mv-ultimate": {
"command": "npx",
"args": [
"-y",
"rpgmaker-mv-mcp"
]
}
}
} {
"servers": {
"diegolopez0208-rpgmaker-mv-ultimate": {
"command": "npx",
"args": [
"-y",
"rpgmaker-mv-mcp"
]
}
}
} codex mcp add diegolopez0208-rpgmaker-mv-ultimate -- npx -y rpgmaker-mv-mcp
{
"$schema": "https://opencode.ai/config.json",
"mcp": {
"diegolopez0208-rpgmaker-mv-ultimate": {
"type": "local",
"command": [
"npx",
"-y",
"rpgmaker-mv-mcp"
],
"enabled": true
}
}
} openclaw mcp add diegolopez0208-rpgmaker-mv-ultimate --command npx --arg -y --arg rpgmaker-mv-mcp
mcp_servers:
diegolopez0208-rpgmaker-mv-ultimate:
command: "npx"
args: ["-y", "rpgmaker-mv-mcp"] {
"McpServers": {
"diegolopez0208-rpgmaker-mv-ultimate": {
"Transport": "stdio",
"Command": "npx",
"Arguments": [
"-y",
"rpgmaker-mv-mcp"
]
}
}
} assistant mcp add diegolopez0208-rpgmaker-mv-ultimate -t stdio -c npx -a -y rpgmaker-mv-mcp
{
"mcpServers": {
"diegolopez0208-rpgmaker-mv-ultimate": {
"command": "npx",
"args": [
"-y",
"rpgmaker-mv-mcp"
]
}
}
} Every change we have recorded for this component, newest first. Security-relevant changes are always shown. ▲ marks a change for the better, ▼ a change for the worse; unmarked changes are neutral.
- 20 Sept 26 +1
No change was recorded against any check on this day. Stability & Change Management went from 87 to 90. That category is still filling its 30-day observation window: 26 days of observed history at the previous scan, 27 at this one. The score rises as the window fills, whether or not the server changes.
- 18 Sept 26 +1
No change was recorded against any check on this day. Stability & Change Management went from 80 to 83. That category is still filling its 30-day observation window: 24 days of observed history at the previous scan, 25 at this one. The score rises as the window fills, whether or not the server changes.
- 17 Sept 26 −3
- Security disclosure: unverified → fail ▼ functional
- Stability: pass → 0.80 functional
- 16 Sept 26 0
- Stability: 0.97 → pass security
- Security disclosure: fail → unverified ▼ functional
- 15 Sept 26 +1
No change was recorded against any check on this day. Stability & Change Management went from 93 to 97. That category is still filling its 30-day observation window: 28 days of observed history at the previous scan, 29 at this one. The score rises as the window fills, whether or not the server changes.
- 13 Sept 26 +1
No change was recorded against any check on this day. Stability & Change Management went from 87 to 90. That category is still filling its 30-day observation window: 26 days of observed history at the previous scan, 27 at this one. The score rises as the window fills, whether or not the server changes.
- 11 Sept 26 +1
No change was recorded against any check on this day. Stability & Change Management went from 80 to 83. That category is still filling its 30-day observation window: 24 days of observed history at the previous scan, 25 at this one. The score rises as the window fills, whether or not the server changes.
- 10 Sept 26 −3
- Stability: pass → 0.80 functional
Diagnostic detail from the automated scan of this channel: what the scanner observed at each step, so you can see exactly where a check passed or failed. It is informational only and never changes the trust score.
Captured 20 Sept 2026 · Analysed npm/rpgmaker-mv-mcp@5.16.1
Provenance No attestation
The registry publishes no build provenance for this version, so there is nothing to verify.
| Result | No attestation |
|---|---|
| Ecosystem | npm |
Background: How many MCP packages publish verified provenance →
Vulnerabilities 2 findings
| ID | CVE | Severity | Vector | Fix available |
|---|---|---|---|---|
| GHSA-f88m-g3jw-g9cj | high | yes | ||
| GHSA-rgj7-g3m4-5g8c | high | yes |
Background: What a vulnerability scan can and cannot prove →
Dependencies 126 packages
| Packages resolved | 126 |
|---|---|
| Stale | 31 |
| Tree resolution | Complete |
Background: SBOMs and build attestations, explained →
The tools this component advertises to a client, with an estimated token cost for each. Expand a tool to see its parameters and schema. The per-tool counts are indicative and are not scored directly; the schema's total context footprint is one signal in Schema Quality & AI Usability. A tool's description is untrusted text the model reads on every call, which is what makes this list a security surface and not just an inventory: how tool poisoning works →
analyze_image ~335
Analyze images related to the project. mode "ai" sends a project image file (tileset, character sheet, map screenshot, battler) to an external OpenAI-compatible Vision API and returns {analysis, model, tokens_used} — NETWORK SIDE EFFECT: the resized JPEG leaves your machine to the endpoint configured via VISION_API_URL / VISION_API_KEY / VISION_MODEL env vars; fails if the path escapes the project, the file is missing, or the API is unreachable/times out (120 s). mode "grid" measures a base64 PNG tileset offline and returns its 48px grid {cols, rows, totalTiles}. mode "colors" returns the average RGB of a base64 PNG's four quadrants offline (a crude what-is-on-screen check). For precise offline map layout, query_map view "ascii" is usually better than any image analysis.
| Name | Type | Req | Description |
|---|---|---|---|
| base64PNG | string | – | modes "grid"/"colors": raw base64 PNG data (no data: URL prefix) |
| imagePath | string | – | mode "ai": image path RELATIVE to the project root, e.g. "img/tilesets/Outside.png"; paths outside the project are rejected |
| mode | string | – | ai = Vision API on a project file; grid/colors = offline analysis of a provided base64 PNG. Default "ai" |
| prompt | string | – | mode "ai": custom analysis question (default: thorough RPG-Maker-specific analysis) |
| resizeMax | number|string | – | mode "ai": max width in px before upload (default 1024; lower = fewer tokens) |
No output schema declared.
No examples provided.
analyze_project ~1,298
Read-only project intelligence: builds (and caches) an in-memory model of the WHOLE project so you can reason about it instead of re-reading files. `view` selects the lens: "overview" (default) returns game title, entity/map/event counts, a health summary (errors/warnings/info) with the top issues, and any maps unreachable from the start map — the fastest way to understand a project you did not build; "index" returns the structured digest (every map with its event count, common events, and only the NAMED switches/variables); "validate" runs every consistency check (broken transfers to non-existent maps, MapInfos entries whose Map file is missing, events that call missing common events / items / weapons / armors / troops / animations, duplicate database IDs, named-but-unused switches/variables, bad starting position, unreachable maps) returning {issueCount, bySeverity, issues[]}, optionally filtered by `severity`; "graph" returns the map transfer network (nodes, directed edges) plus reachability from the start map; "usage" answers "what uses X?" — pass `kind` (switch/variable/common_event/item/weapon/armor/troop/animation/actor/state/map) and `id` to get every event, common event and troop that references it, with read/write roles for switches/variables; "explain" reasons about one thing — `target` "switch"/"variable" + `id` tells you whether it is set, read, gated, a dead write, or never-set (the usual reason a door/event never triggers), and `target` "map" + `id` reports incoming transfers, what becomes unreachable if it is deleted, and whether it is the start map; "ast" parses one event page (mapId + eventId, optional page) or a common event (commonEventId) into a logical tree with a readable outline; "plugins" fuses js/plugins.js with each plugin file's @plugindesc/@author/@param/@command/@help header so you can adapt to the project's OWN systems instead of emitting vanilla events (and flags configured plugins whose file is missing); "critique" reviews ONE map (…
| Name | Type | Req | Description |
|---|---|---|---|
| category | string | – | view "balance": analyse one category instead of all four (default "all") |
| commonEventId | number|string | – | view "ast": parse this common event instead of a map event |
| eventId | number|string | – | view "ast": the event on `mapId` to parse |
| expected | string | – | view "metrics": what kind of space this map is meant to be, which sets the dead-space band (default "exterior") |
| id | number|string | – | views "usage"/"explain": numeric id of the switch/variable/map/entity to inspect |
| kind | string | – | view "usage": what kind of entity `id` refers to |
| limit | number|string | – | view "search": max results (default 20) |
| mapId | number|string | – | view "ast": the map holding the event to parse |
| minLen | number|string | – | view "refactor": minimum shared command-run length to report (default 4) |
| page | number|string | – | view "ast": which page of the event (0-based, default 0) |
| query | string | – | view "search": free-text query, e.g. "the blacksmith", "dark forest" |
| severity | string | – | view "validate": keep only issues of this severity |
| target | string | – | view "explain": what `id` refers to (default "switch") |
| thresholdSd | number|string | – | view "balance": how many standard deviations from its peers an entry must sit before it is flagged (default 2; raise to see only the worst) |
| view | string | – | Which lens to apply (default "overview") |
No output schema declared.
No examples provided.
create_database_entry ~393
Create a new entry in an RPG Maker MV database with the next free ID; the data file is written immediately. Returns the complete created object including its new id. Two forms: with `entity` + `data` it creates a raw entry (omitted fields get engine defaults; data.name is expected); with `preset` it builds a ready-to-use entry from a recipe — damage_skill {name, mpCost, scope, formula, element?, animationId?}, healing_skill {name, mpCost, scope, formula}, buff_skill {name, mpCost, scope, paramId 0-7, turns}, state_skill {name, mpCost, scope, stateId, chance 0-1}, boss_enemy {name, battlerName?, specialSkillId?, params?}, encounter_troop {name, enemyIds[]}. Presets validate their required fields and fail with a validation error when missing. Class entries: data.params accepts 8 stat seeds [HP,MP,ATK,DEF,MAT,MDF,AGI,LUK] expanded to full level 1-99 curves automatically. Not supported for tilesets/animations (author those in the editor). Referenced IDs (classId, stateId, enemyIds...) are NOT validated — confirm them with query_database first.
| Name | Type | Req | Description |
|---|---|---|---|
| data | object | yes | 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_eve… |
| entity | string | – | Which database receives the new entry. Optional when preset is given (the preset implies it) |
| preset | string | – | Recipe for common content; see the tool description for each preset's required data fields. Omit for a raw entry |
No output schema declared.
No examples provided.
delete_database_entry ~218
DESTRUCTIVE: delete a database entry by nulling it out in its data file (written immediately; not undoable — re-create it if needed; IDs are never reused). References elsewhere are NOT cleaned up and will break at runtime: actors in the starting party, classes assigned to actors, skills in class learnings/enemy actions, items in chests/shops, enemies in troops, states in skill effects, troops in map encounters — check and update those first with query_database/update_database_entry. NEVER delete skill 1 (Attack), skill 2 (Guard) or state 1 (KO); the engine uses them directly. Supported entities: actors, classes, skills, items, weapons, armors, enemies, states, troops, animations. Returns the deleted object for reference; fails with an error if the ID does not exist.
| Name | Type | Req | Description |
|---|---|---|---|
| entity | string | yes | Which database contains the entry to delete |
| id | number|string | yes | ID of the entry to delete (never skill 1/2 or state 1) |
No output schema declared.
No examples provided.
edit_map ~586
Modify existing maps; the affected map files / MapInfos.json are written immediately. `action` selects the edit: "fill_layer" overwrites an ENTIRE tile layer with one tile ID (destructive, not undoable; layers: 0-1 ground, 2-3 upper, 4 shadow bits 0-15, 5 region IDs 0-255; tileId 0 clears; find valid IDs with get_project_context detail "tileset"); "set_display_names" sets the player-visible displayName of several maps at once (entries whose map file is missing are reported in `skipped`, not errors); "organize_tree" re-parents maps in the editor tree (purely organizational, gameplay unaffected); "connect" creates a bidirectional pair of transfer events between two maps so the player can walk both ways; "set_encounters" sets the map's random-battle list so enemies appear while walking — `encounters` is [{troopId, weight?, regionSet?}] (weight default 5; regionSet [] = whole map; troopId must exist) plus optional `encounterStep`. WITHOUT encounters set, a map has no random battles. Returns a per-action summary. Fails with an error if a referenced map does not exist (except set_display_names, which skips). For event-level work use manage_map_event.
| Name | Type | Req | Description |
|---|---|---|---|
| action | string | yes | Which edit to perform; see the tool description |
| encounterStep | number|string | – | action "set_encounters": average steps between random battles (default 30) |
| encounters | array | – | action "set_encounters": [{troopId, weight?, regionSet?}] random-battle entries; troopId must exist (create via create_database_entry "troops") |
| folders | array | – | action "organize_tree": [{mapId, parentId}] — parentId 0 means root level |
| layer | number|string | – | action "fill_layer": layer index 0-5 |
| mapId | number|string | – | action "fill_layer": map to modify |
| mapIdA | number|string | – | action "connect": first map ID |
| mapIdB | number|string | – | action "connect": second map ID |
| names | array | – | action "set_display_names": [{mapId, name}] — name is what the player sees on map entry |
| posA | object | – | action "connect": transfer event position on map A {x, y, trigger} (trigger 1=walk-on default, 0=action button for doors) |
| posB | object | – | action "connect": transfer event position on map B {x, y, trigger} |
| tileId | number|string | – | action "fill_layer": tile ID to write into every cell (0 = clear) |
No output schema declared.
No examples provided.
generate_map ~1,273
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…
| Name | Type | Req | Description |
|---|---|---|---|
| addEvents | boolean | – | procedural: also place themed NPCs/chests/bosses/transfers (default true) |
| batch | array | – | mode "batch" only: one spec per map [{key, name, theme, width, height, tilesetId, seed, parentId}]; key is echoed back to match returned mapIds |
| bgmName | string | – | Audio file from audio/bgm/ to autoplay on entry |
| displayName | string | – | Location name briefly shown to the player on entry |
| encounters | boolean | – | procedural combat themes (dungeon/cave/world/fortress/sewer/volcano): auto-populate the map's random encounters from the project's existing troops so enemies appear while walking. Default true (no-op… |
| enterableHouses | boolean | – | procedural town/village only: also auto-generate an interior map per house with a two-way warp (action-button door outside → interior, walk-on mat inside → back to the street). Default true; the new… |
| height | number|string | – | Map height in tiles (defaults: blank/themed 13, procedural 25) |
| keepEvents | boolean | – | mode "template" only: also copy the template's events (default true) |
| keepProps | boolean | – | mode "semantic" with a mined templateId: paint the original decorations even onto a different tileset (they may not exist there) |
| locked | boolean | – | mode "semantic": put a key and a locked door on the path (default true when there are 4+ rooms) |
| loop | boolean | – | mode "semantic": add one extra corridor so the map has a loop instead of being a tree (default true) |
| mode | string | – | Which generator to use; see the tool description. Default "procedural" |
| name | string | – | Internal map name for the editor tree (required for mode "duplicate") |
| note | string | – | Free-form note field for plugin metadata |
| parentId | number|string | – | Map tree folder to nest the new map under (0 = root) |
| rooms | number|string | – | mode "semantic": rooms on the critical path (default 5) |
| seed | number|string | – | procedural/batch: random seed for reproducible output (omit for random; returned in the result) |
| sideRooms | number|string | – | mode "semantic": dead-end rooms hung off the path, the first holding treasure (default 2) |
| sourceMapId | number|string | – | mode "duplicate" only: existing map ID to copy (unchanged by the operation) |
| templateId | number|string | – | mode "template": bundled template ID. mode "procedural": OPTIONAL — force a specific template ID (from get_project_context detail "templates") instead of auto-picking by theme+size |
| theme | string | – | Required for themed/procedural. themed: forest, dungeon, town, castle, cave, village, swamp, desert, ruins, interior, beach. procedural adds: snow, harbor, volcano, sewer, fortress, magic_forest, mag… |
| tilesetId | number|string | – | Tileset to render with. Defaults to the one matching the theme (Outside=2, Inside=3, Dungeon=4, Overworld=1), so you normally omit it — only set it to override. A mismatched tileset renders the map a… |
| useTemplate | boolean | – | procedural: when true (default), clone an RTP template for themes that have one (town, dungeon, interior, etc.) instead of generating procedurally. Set false to force procedural generation even when… |
| width | number|string | – | Map width in tiles (defaults: blank/themed 17, procedural 30; template uses the template's size) |
No output schema declared.
No examples provided.
get_project_context ~382
Read-only: pre-digested project knowledge — CALL THIS FIRST in a session. `detail` selects the depth: "full" (default) returns id+name lists for every database, switch/variable names, starting position, and available sprite filenames per img/ folder — everything needed to create content without inventing broken references; "summary" is a cheap health check (entry counts per data file); "assets" scans img/ and Tilesets.json into a complete index (sheet dimensions, autotile kinds, categorized usable tiles, all PNG names); "tileset" returns the categorized usable tile IDs of ONE tileset (ground/water/walls/roof/decoration) for edit_map "fill_layer" — guessing tile IDs produces glitched maps; "templates" lists the 106 bundled reference maps (id, category, theme) usable with generate_map mode "template", optionally filtered by category/theme. Returns one structured object (or array for templates). GOLDEN RULES for good results: (1) build whole maps with generate_map (it stamps real houses/trees and wires encounters) and add content with the manage_map_event presets — do NOT hand-paint tiles or place decorations one tile at a time; (2) never invent tile IDs or sprite/troop/skill IDs — take them from this tool; (3) for enemies to appear, create troops then set encounters (edit_map "set_encounters"), which generate_map does automatically for combat themes.
| Name | Type | Req | Description |
|---|---|---|---|
| category | string | – | detail "templates": filter by template category |
| detail | string | – | How much and what kind of context; see the tool description. Default "full" |
| theme | string | – | detail "templates": filter by template theme |
| tilesetId | number|string | – | detail "tileset": which tileset to categorize |
No output schema declared.
No examples provided.
manage_map_event ~1,432
Create, modify or remove events on a map; the map file is written immediately. action "create" without preset makes a low-level event at x/y (empty page unless `pages` given; add behavior later with add_command). action "create" WITH preset builds a complete, ready-to-play event: "npc" (2-page dialogue NPC: {name, dialogues[], characterName?, characterIndex?}), "chest" (one-time loot: {items: [{type: item|weapon|armor, id, amount}]} — IDs not validated, confirm with query_database), "teleport" (one-way walk-on transfer zone: {destMapId, destX, destY, trigger?} — destination not validated), "door" (action-button warp into another map, e.g. a house entrance: {destMapId, destX, destY, characterName?, characterIndex?, trigger?, lockedSwitchId?, lockedMessage?}; with lockedSwitchId it shows a "locked" message until that game switch is ON), "shop" ({goods: [[type 0=item/1=weapon/2=armor, id, priceType 0=standard/1=custom, price]]}), "inn" ({cost?} full-recovery flow with gold check), "boss" ({troopId} one-time battle, game over on loss), "puzzle_switch" ({switchX, switchY, doorX, doorY, gameSwitchId, switchName?, doorName?} creates TWO linked events). action "update" overwrites only `fields` on an event; action "convert" RE-PURPOSES an existing event in place — keeping its id, position, name and sprite but replacing its behaviour — via `kind`: "merchant" (a working shop; pass `options.goods` [[type,id,priceType,price]] or the friendly `options.items` [{type,id}], plus optional `options.greeting`), "inn" (`options.cost?` full-recovery flow with gold check), "sign" (`options.text` string or string[] read-only message); ideal for "turn this NPC into a merchant" without re-placing it; "delete" removes it permanently (DESTRUCTIVE); "add_command" appends one command before a page's terminator; "populate" scatters N events of a kind (npc/chest/boss) at random positions (walkability not checked — validate with query_map "ascii"). Returns the created/updated event(s) with ids. Fa…
| Name | Type | Req | Description |
|---|---|---|---|
| action | string | yes | What to do; see the tool description. Default "create" |
| characterIndex | number|string | – | Which of the 8 characters in the sheet (0-7) |
| characterName | string | – | Sprite sheet from img/characters/ without extension; list options with get_project_context |
| command | object | – | action "add_command": event command {code, indent, parameters}; e.g. 201=Transfer Player [0, mapId, x, y, dir, fade] |
| cost | number|string | – | preset "inn": gold charged for a full recovery (default 50) |
| count | number|string | – | action "populate": how many events (default 3) |
| destMapId | number|string | – | preset "teleport"/"door": destination map ID |
| destX | number|string | – | preset "teleport"/"door": destination tile X (should be walkable) |
| destY | number|string | – | preset "teleport"/"door": destination tile Y |
| dialogues | array | – | preset "npc": dialogue lines, each becomes one text box |
| doorName | string | – | preset "puzzle_switch": editor name for the door event (default "Door") |
| doorX | number|string | – | preset "puzzle_switch": door tile X |
| doorY | number|string | – | preset "puzzle_switch": door tile Y |
| eventId | number|string | – | Existing event ID (update/delete/add_command); find it with query_map view "events" |
| eventType | string | – | action "populate": kind of events to scatter — "npc", "chest" or "boss" |
| fields | object | – | action "update": properties to overwrite, e.g. {"x": 5, "y": 9} or {"pages": [...]} (replaces all pages) |
| gameSwitchId | number|string | – | preset "puzzle_switch": game switch linking switch and door — pick an unused ID via manage_system get switches |
| goods | array | – | preset "shop": wares [[type, id, priceType, price]] — priceType 1 uses the custom price, 0 the database price |
| items | array | – | preset "chest": loot [{type: "item"|"weapon"|"armor", id, amount}] |
| kind | string | – | action "convert": what to turn the existing event into |
| lockedMessage | string | – | preset "door": message shown while locked (default "It's locked.") |
| lockedSwitchId | number|string | – | preset "door": if set, the door shows lockedMessage until this game switch is ON, then warps |
| mapId | number|string | yes | Map the event lives on (always required) |
| name | string | – | Event name shown in the editor |
| options | object | – | action "convert": kind-specific settings — merchant {goods|items, greeting?}, inn {cost?}, sign {text} |
| opts | object | – | action "populate": overrides {name, troopId, x, y} |
| pageIndex | number|string | – | action "add_command": which page receives the command (0-based, default 0) |
| pages | array | – | action "create" without preset: full event page objects (optional) |
| preset | string | – | action "create" only: ready-made event recipe; omit for a low-level empty event |
| switchName | string | – | preset "puzzle_switch": editor name for the switch event (default "Switch") |
| switchX | number|string | – | preset "puzzle_switch": floor-switch tile X |
| switchY | number|string | – | preset "puzzle_switch": floor-switch tile Y |
| trigger | number|string | – | How the event activates: 0=action button, 1=player touch, 2=event touch, 3=autorun, 4=parallel |
| troopId | number|string | – | preset "boss" / populate boss: troop to battle (create it first via create_database_entry preset encounter_troop) |
| x | number|string | – | Tile X position (0-based; create/presets except puzzle_switch) |
| y | number|string | – | Tile Y position (0-based) |
No output schema declared.
No examples provided.
manage_system ~1,751
Read or edit project-wide settings in data/System.json (writes are immediate). action "get" returns the requested `section`: "full" (everything — large), "switches" or "variables" (name arrays indexed by ID; unnamed entries are empty strings — use these to find free IDs), or "title". action "set_title" changes the game title shown on the title screen. "name_switch"/"name_variable" label a switch/variable by ID — documentation only, runtime values are untouched, but good names keep event logic readable. "set_starting_position" sets where new games begin {mapId, x, y} — NOT validated against existing maps, verify with query_map "infos" first; does not affect saved games. "create_plugin" authors a new plugin: it writes js/plugins/<name>.js with a correct @plugindesc/@author/@param/@help header (and a classic-MV Game_Interpreter.pluginCommand hook when `commands` are given) and registers it in js/plugins.js (array order = load order). Re-authoring the same `name` overwrites the file and replaces its manifest entry in place. Pair with analyze_project view "plugins" to inspect the project's existing plugins first. "scaffold_project" creates a NEW, separate RPG Maker MV project by cloning the engine's blank template (NewData) into `destPath` and rewriting its title (`title`) and start position (`mapId`/`x`/`y`); the source install is `sourcePath` or the RPGMAKER_MV_INSTALL env var or the default Steam location, and it refuses to overwrite a directory that already holds a project. This does NOT switch the active project — use set_project_path afterwards. "playtest" launches the ACTIVE project through the engine's bundled nwjs runtime (like the editor's Playtest button) so you can actually see a change running — a game window opens (the user closes it); returns the launched process info. "open_editor" opens the active project in the RPGMV.exe editor (best-effort). Both locate the engine via `install` / RPGMAKER_MV_INSTALL / the default Steam path and are Windows-only. THE L…
| Name | Type | Req | Description |
|---|---|---|---|
| action | string | yes | What to do; see the tool description. Default "get" |
| author | string | – | create_plugin: @author name |
| body | string | – | create_plugin: custom JS body; omit for a safe generated skeleton |
| command | string | – | bridge_command: which instruction to send to the running game |
| commands | array | – | create_plugin: plugin command names to document (@command) and wire a pluginCommand handler stub for |
| description | string | – | create_plugin: @plugindesc short description |
| destPath | string | – | scaffold_project: directory for the NEW project (must be empty of a project). title/mapId/x/y set the new game's title and start position |
| direction | number|string | – | bridge_command "teleport_player": facing after the transfer (2 down, 4 left, 6 right, 8 up) |
| file | string | – | bridge_command "reload_database": the data file to re-read, e.g. "Skills.json" |
| help | string | – | create_plugin: @help text (multi-line allowed) |
| id | number|string | – | name_switch/name_variable: switch or variable ID to label (1-based) |
| install | string | – | playtest/open_editor: RPG Maker MV install root (contains nwjs-win/ and RPGMV.exe); defaults to RPGMAKER_MV_INSTALL or the standard Steam install |
| limit | number|string | – | bridge_telemetry: return at most this many of the most recent frames. mine_templates: keep at most this many layouts, largest maps first |
| mapId | number|string | – | set_starting_position: map where new games start (must exist) |
| minDistinctTiles | number|string | – | mine_templates: a map needs at least this many distinct tiles to count as content rather than scratch (default 10) |
| name | string | – | name_switch/name_variable: descriptive label. create_plugin: the plugin name (bare token — letters/digits/_/-, becomes js/plugins/<name>.js) |
| params | array | – | create_plugin: @param definitions [{name, type?, desc?, default?}] surfaced in js/plugins.js |
| peek | boolean | – | bridge_telemetry: leave the frames in the buffer instead of consuming them |
| port | number|string | – | bridge_start/install_bridge_plugin: loopback port for the live bridge (default 32123, or RPGMV_BRIDGE_PORT) |
| section | string | – | action "get": which part of System.json to return (default "full") |
| sourcePath | string | – | scaffold_project: a blank-project (NewData) folder to clone; defaults to the RPGMAKER_MV_INSTALL env var or the standard Steam install |
| status | boolean | – | create_plugin: enable the plugin in js/plugins.js (default true) |
| telemetryInterval | number|string | – | install_bridge_plugin: frames between player-position frames (default 30; 60 = once per second) |
| test | boolean | – | playtest: run in playtest/test mode (default true; false runs it as a normal launch) |
| timeoutMs | number|string | – | bridge_command/bridge_screenshot: how long to wait for the answer (default 8000, screenshots 15000) |
| title | string | – | action "set_title": new game title |
| types | array | – | bridge_telemetry: only return these frame types, e.g. ["exception","log"] |
| wait | boolean | – | bridge_command: wait for the game to answer (default true; false is fire-and-forget) |
| x | number|string | – | set_starting_position: starting tile X (should be walkable) |
| y | number|string | – | set_starting_position: starting tile Y |
No output schema declared.
No examples provided.
query_database ~251
Read-only: query any RPG Maker MV database (data/*.json). Three forms depending on arguments: no id/query lists every non-null entry of the entity; `id` fetches one entry (returns null, not an error, if it does not exist); `query` does a case-insensitive name search (items/weapons/armors/skills also match descriptions). Returns an array (list/search) or a single object/null (id). Use this to discover valid IDs before create/update/delete or before wiring references (class learnings, troop members, chest loot). For maps use query_map; for a digest of everything at once use get_project_context.
| Name | Type | Req | Description |
|---|---|---|---|
| entity | string | yes | Which database to read: actors, classes, skills, items (consumables), weapons, armors, enemies, states (status conditions), troops (enemy formations), tilesets, common_events, animations |
| id | number|string | – | Fetch a single entry by its database ID (1-based). Omit to list or search |
| query | string | – | Case-insensitive substring to match against entry names (and descriptions for items/weapons/armors/skills). Ignored when id is given |
No output schema declared.
No examples provided.
query_map ~369
Read-only: inspect maps. `view` selects what you get: "infos" lists the map tree from MapInfos.json (ids, names, folder parentIds — no mapId needed); "full" returns one complete MapNNN.json (dimensions, 6-layer tile data, events — can be large); "events" lists a map's events (with `query`, filters by name, case-insensitive); "event" returns one event by eventId (null if absent); "validate" lints a map (invalid tile IDs per layer, missing page terminators, transfers to map 0, Self Switch OFF where ON was likely meant) returning {issueCount, issues[]}; "ascii" renders the map as a character grid with event markers and a legend — the cheapest way to "see" a layout and pick coordinates, entirely offline. Fails with an error if the map file does not exist. For player-visible images use analyze_image instead.
| Name | Type | Req | Description |
|---|---|---|---|
| eventId | number|string | – | Event ID within the map (required for view "event") |
| layer | number|string | – | view "ascii" only: tile layer to draw, 0=ground (default) or 2=upper decorations |
| mapId | number|string | – | Map ID (required for every view except "infos"); map 1 is Map001.json |
| query | string | – | view "events" only: case-insensitive substring filter on event names |
| showEvents | boolean | – | view "ascii" only: overlay event markers (default true) |
| showRegions | boolean | – | view "ascii" only: also return the region-ID layer as a second grid (default false) |
| view | string | yes | What to read; see the tool description for each view |
No output schema declared.
No examples provided.
set_project_path ~112
Switch this server to a DIFFERENT RPG Maker MV project directory for all subsequent tool calls (session-wide side effect; persists until changed again or the server restarts). Validates that the path contains data/System.json and fails with an error otherwise, leaving the previous project active. Returns the new active path. Without this tool, the RPGMAKER_PROJECT_PATH environment variable set at startup applies.
| Name | Type | Req | Description |
|---|---|---|---|
| path | string | yes | Absolute path to an RPG Maker MV project root (the folder containing data/System.json and img/) |
No output schema declared.
No examples provided.
update_database_entry ~355
Partially update an existing database entry: only the keys in `fields` are overwritten (arrays like traits/learnings/actions are replaced wholesale, not merged); the data file is written immediately and there is no undo, so fetch current values with query_database first if you may revert. Returns the full entry after the update. Fails with an error if the ID does not exist. Special append forms that do not need `fields`: common_events + `appendCommand` inserts one event command before the list terminator; troops + `addEnemyId` adds a member at an auto-computed battle position. Troops and animations also support plain `fields` updates now (e.g. rename a troop, replace its members/pages, or relabel an animation). Class params in fields accept 8 seeds (expanded to full curves) or 8 arrays of 100 per-level values. Editing tilesets affects every map using them; malformed flags break passability project-wide.
| Name | Type | Req | Description |
|---|---|---|---|
| addEnemyId | number|string | – | troops only: enemy ID to append as a new member at an auto-computed screen position |
| appendCommand | object | – | common_events only: one event command {code, indent, parameters} appended before the terminator. Common codes: 101+401=Show Text, 121=Control Switches, 122=Control Variables |
| entity | string | yes | Which database contains the entry |
| fields | object | – | Subset of properties to overwrite, e.g. {"name": "Hero", "price": 250}. Not needed when using appendCommand/addEnemyId |
| id | number|string | yes | ID of the entry to modify (must exist; find it with query_database) |
No output schema declared.
No examples provided.
What is the RPG Maker MV Ultimate MCP server?
RPG Maker MV Ultimate MCP is listed in the public MCP registry as io.github.DiegoLopez0208/rpgmaker-mv-ultimate. RPG Maker MV Ultimate: AI copilot to generate, edit and understand RPG Maker MV projects (MCP). This page covers its npm package (rpgmaker-mv-mcp).
Is the RPG Maker MV Ultimate MCP server safe to use?
RPG Maker MV Ultimate MCP scores 75 out of 100 on VerifyMCP. We recorded 2 known advisories against it as of 20 September 2026. It declares no install or post-install scripts. That is a record of what we were able to check automatically, not an endorsement. The category breakdown on this page shows every signal behind the number, including the ones we could not confirm.
What tools does the RPG Maker MV Ultimate MCP server expose?
RPG Maker MV Ultimate MCP exposes 13 tools: query_database, create_database_entry, update_database_entry, delete_database_entry, query_map, and 8 more. Their descriptions and schemas cost roughly 8,755 tokens of context every time the server is loaded.
Is the RPG Maker MV Ultimate MCP server still maintained?
RPG Maker MV Ultimate MCP is still listed as active in the MCP registry. We last reached this channel on 20 September 2026. Those dates come from our own scans of the registry and the channel itself, not from anything the publisher announced.
What licence is the RPG Maker MV Ultimate MCP server under?
RPG Maker MV Ultimate MCP declares the MIT licence, which is OSI-approved. That covers the source only, and says nothing about the cost of any service it calls.