Skip to content
verify mcp Beta VerifyMCP is currently in beta. If you notice any issues, get in touch and we’ll put it right.

RPG Maker MV Ultimate MCP

NPM · RPGMAKER-MV-MCP

RPG Maker MV Ultimate: AI copilot to generate, edit and understand RPG Maker MV projects (MCP)

Available components

0 this week 75 Trust /100

Last scanned (5 hours ago)

Scores higher than 50% of npm servers

Category Design and Media

Trust breakdown (7 categories)

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 zod 3.25.76, a direct dependency. A fixed version is available. View diagnostics → Fail
  • No install/post-install scripts declared.Pass
  • 30 of 126 dependencies flagged as unhealthy. View diagnostics → Partial
Provenance & Transparency45
Schema Quality & AI Usability57
  • AI-judged instruction clarity (excellent).Pass
  • Context-footprint check failed: tool/resource definitions use about 11577 tokens (~643/item across 18 items; 18 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 Management100
  • No destabilizing schema changes in the last 30 days.Pass
Tool Coverage95
  • 100% of tools have a non-trivial description (not blank, and not just the tool's name).Pass
  • 86% of tool parameters carry a description.Partial
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 18 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
Changelog

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.

  • 4 Nov 26 0
    • Stability: 0.97 → pass security
  • 3 Nov 26 0
    • Stability: pass → 0.97 functional
  • 28 Oct 26 0
    • Stability: 0.97 → pass security
  • 27 Oct 26 0
    • Stability: pass → 0.97 functional
  • 24 Oct 26 −6
    • CVE-2023-54404 affects this package: high ▼ security
    • Known CVEs: pass → fail ▼ security
  • 21 Oct 26 +1
    • Stability: 0.97 → pass security
  • 20 Oct 26 −1
    • Stability: pass → 0.97 functional
  • 17 Oct 26 +3
    • Stability: 0.83 → pass security
Diagnostics

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 5 Nov 2026 · Analysed npm/rpgmaker-mv-mcp@5.21.0

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 1 finding
ID CVE Severity Vector Fix available
GHSA-mrhx-c7xc-m3w5 CVE-2023-54404 high CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:N/I:N/A:H yes

Background: What a vulnerability scan can and cannot prove →

Dependencies 126 packages
Packages resolved 126
Stale 30
Tree resolution Complete

Background: SBOMs and build attestations, explained →

MCP tools · 18 exposed · ~11,577 tokens

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 →

Tool Tokens
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.

NameTypeReqDescription
base64PNGstring–modes "grid"/"colors": raw base64 PNG data (no data: URL prefix)
imagePathstring–mode "ai": image path RELATIVE to the project root, e.g. "img/tilesets/Outside.png"; paths outside the project are rejected
modestring–ai = Vision API on a project file; grid/colors = offline analysis of a provided base64 PNG. Default "ai"
promptstring–mode "ai": custom analysis question (default: thorough RPG-Maker-specific analysis)
resizeMaxnumber|string–mode "ai": max width in px before upload (default 1024; lower = fewer tokens)

No output schema declared.

No examples provided.

analyze_project ~901

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…

NameTypeReqDescription
categorystring–view "balance": analyse one category instead of all four (default "all")
commonEventIdnumber|string–view "ast": parse this common event instead of a map event
eventIdnumber|string–view "ast": the event on `mapId` to parse
expectedstring–view "metrics": what kind of space this map is meant to be, which sets the dead-space band (default "exterior")
idnumber|string–views "usage"/"explain": numeric id of the switch/variable/map/entity to inspect
kindstring–view "usage": what kind of entity `id` refers to
limitnumber|string–view "search": max results (default 20)
mapIdnumber|string–view "ast": the map holding the event to parse
minLennumber|string–view "refactor": minimum shared command-run length to report (default 4)
pagenumber|string–view "ast": which page of the event (0-based, default 0)
querystring–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.
severitystring–view "validate": keep only issues of this severity
targetstring–view "explain": what `id` refers to (default "switch")
thresholdSdnumber|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)
viewstring–Which lens to apply (default "overview")

No output schema declared.

No examples provided.

build_event_commands ~1,668

Build a validated RPG Maker MV event-command fragment without writing files or requiring a selected project. Returns {commands, warnings?}; feed commands to insert_event_commands, or nest them in a choice/conditional builder. kind selects the command; only fields belonging to that kind are accepted. Troop-only kinds: enemy_appear, change_enemy_state, abort_battle. Fragments omit the root end marker; complete branches include their required nested end markers. MV Show Text has four parameters (no MZ speakerName); plugin_command emits MV code 356, never MZ 357. IDs accept integers or whole decimal integer strings; constants accept finite numbers. Supported game references are checked when inserting into a project.

NameTypeReqDescription
actionstring–flow: wait requires frames; label/jump_to_label require name.
actorIdinteger|string–change_party_member/name_input: actor ID. change_actor: actor ID, 0 = entire party (or use actorVariableId).
actorVariableIdinteger|string––
allowDeathboolean––
amountinteger|string–change_gold/change_items/change_actor hp|mp|exp|level: constant amount. Give amount or amountVariableId.
amountVariableIdinteger|string–Use this variable's value as the amount.
animationIdinteger|string––
backgroundstring–Text/choice window background.
balloonIdinteger|string–1-15 as in the editor list (1 exclamation).
blendstring––
branchesarray–show_choices: one command fragment per choice. Omit for empty branches.
canEscapeboolean––
canLoseboolean––
cancelBrancharray–show_choices: commands for a separate cancel branch.
cancelTypeinteger|string–show_choices: -1 disables cancel; -2 or choices.length selects the separate cancel branch; otherwise a zero-based choice index.
channelstring–play_audio.
characterIdinteger|string–show_animation/show_balloon/move_route: -1 player, 0 this event (default), n map event n.
choicesarray––
colorarray––
commonEventIdinteger|string––
conditionobject–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,…
decreaseboolean–Subtract instead of add. Default false.
defaultTypeinteger|string–show_choices: selected choice index, or -1 for none.
designationstring–transfer_player/show_picture: whether the coordinates are literal values or variable IDs.
directionstring––
durationinteger|string–screen_effect: frames, default 60.
effectstring–screen_effect. tint: color [r,g,b,gray] -255..255; flash: color [r,g,b,strength] 0..255; shake: power, speed 1-9.
elseBrancharray––
endIdinteger|string–control_switch/control_variable: inclusive final ID; defaults to the starting ID.
enemyIndexinteger|string–Troop slot from 0; change_enemy_state also accepts -1 for the entire troop.
escapeBrancharray––
faceIndexinteger|string–show_text: face slot 0-7, default 0.
faceNamestring–show_text: face image basename, default empty.
fadestring––
framesinteger|string––
goodsarray–shop_processing: goods in order; omit price to use the database price.
includeEquipboolean–change_items weapon/armor: also remove equipped copies.
indentinteger|string–Base indentation, default 0. Nested branch bodies are rebased without mutating their inputs.
initializeboolean–change_party_member: reset the actor when adding.
itemIdinteger|string––
itemTypestring–change_items, default item.
kindstringyes–
linesarray–show_text: message lines. MV does not wrap; long lines are warned about unless wrap is set.
loseBrancharray––
mapIdinteger|string––
maxLengthinteger|string–name_input: 1-16, default 8.
namestring–control_switch self_switch: A-D; flow label/jump_to_label: label text; play_audio: file name without extension (empty stops the channel); show_picture: picture file.
opacityinteger|string––
operandobject–control_variable: {type:"constant",value}; {type:"variable",variableId}; {type:"random",min,max}; or {type:"game_data",dataType:0..7,param1?,param2?}. MZ game-data type 8 is rejected.
operationstring––
originstring––
paninteger|string––
pictureIdinteger|string–show_picture/erase_picture: slot 1-100.
pitchinteger|string––
positionstring–show_text: top/middle/bottom; show_choices: left/middle/right.
powerinteger|string––
purchaseOnlyboolean––
randomEncounterboolean––
removeboolean–change_party_member, change_actor state, change_enemy_state: remove instead of add.
repeatboolean–move_route: loop the route. Default false.
scaleXinteger|string––
scaleYinteger|string––
scopestring–control_switch: switch requires switchId; self_switch requires name A-D.
showLevelUpboolean––
skippableboolean–move_route: skip a step that cannot be performed. Default false.
speedinteger|string––
statstring–change_actor: hp takes allowDeath; exp/level take showLevelUp; state takes stateId and remove.
stateIdinteger|string––
stepsarray–move_route: steps in order; times repeats one. toward/away are relative to the player. Parameters: jump x,y; wait frames; switch_on/off switchId; change_speed value 1-6; change_freq value 1-5; change…
switchIdinteger|string––
textstring–plugin_command: full MV command string, e.g. "DoorCtl open 1".
thenBrancharray––
troopIdinteger|string–battle_processing: give troopId, troopVariableId, or randomEncounter: true.
troopVariableIdinteger|string––
valuestring–control_switch: default on.
variableIdinteger|string––
volumeinteger|string––
waitboolean–Wait for the effect, animation, balloon or move route to finish (move_route default true).
winBrancharray–battle_processing: result branches, only when canEscape or canLose.
wrapboolean|string–show_text: true reflows all lines as one paragraph, "hard" keeps each line as a break; both split into 4-line boxes. Width ~55 chars, ~38 with a face.
wrapWidthinteger|string–show_text: override the wrap width in characters.
xinteger|string––
yinteger|string––

No output schema declared.

No examples provided.

create_database_entry ~452

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.

NameTypeReqDescription
dataobject–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…
entitystring–Which database receives the new entry. Optional when preset is given (the preset implies it)
entriesarray–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 cre…
presetstring–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 ~264

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). The delete is refused while anything still references the entry, listing every place: events, common events, troop pages, page conditions, map encounters, the starting party, actor classes and starting equipment, class learnings, enemy actions and drops, troop members, traits, item and skill effects, animations. Fix those first, pass dryRun:true to preview the list, or force:true to delete anyway (the result then lists brokenReferences). References are never cleaned up automatically. 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.

NameTypeReqDescription
entitystringyesWhich database contains the entry to delete
forceboolean–Delete even though something still references it (default false)
idnumber|stringyesID of the entry to delete (never skill 1/2 or state 1)

No output schema declared.

No examples provided.

edit_map ~758

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). "paint" writes one tile into cells or a rect of one layer; an autotile is written as its kind and the painted cells and their neighbours get the shapes the editor would give them, so shorelines and walls join up, while the rest of the map keeps its saved shapes. "repair_autotiles" fixes only autotile cells whose shape the engine cannot draw (analyze_project validate reports them as invalid-autotile). For event-level work use manage_map_event.

NameTypeReqDescription
actionstringyesWhich edit to perform; see the tool description
cellsarray–action "paint": [[x, y], ...] cells to paint (or give rect)
encounterStepnumber|string–action "set_encounters": average steps between random battles (default 30)
encountersarray–action "set_encounters": [{troopId, weight?, regionSet?}] random-battle entries; troopId must exist (create via create_database_entry "troops")
foldersarray–action "organize_tree": [{mapId, parentId}] — parentId 0 means root level
layernumber|string–actions "paint", "fill_layer": layer 0-3 tiles, 5 regions (fill_layer also 4)
mapIdnumber|string–actions "paint", "repair_autotiles", "fill_layer": map to modify
mapIdAnumber|string–action "connect": first map ID
mapIdBnumber|string–action "connect": second map ID
namesarray–action "set_display_names": [{mapId, name}] — name is what the player sees on map entry
posAobject–action "connect": transfer event position on map A {x, y, trigger} (trigger 1=walk-on default, 0=action button for doors)
posBobject–action "connect": transfer event position on map B {x, y, trigger}
rectobject–action "paint": {x, y, width, height} rectangle to paint (or give cells)
tileIdnumber|string–actions "paint", "fill_layer": tile ID (0 = clear); on layer 5 a region id 0-255

No output schema declared.

No examples provided.

generate_map ~1,315

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 m…

NameTypeReqDescription
addEventsboolean–procedural: also place themed NPCs/chests/bosses/transfers (default true)
batcharray–mode "batch" only: one spec per map [{key, name, theme, width, height, tilesetId, seed, parentId}]; key is echoed back to match returned mapIds
bgmNamestring–Audio file from audio/bgm/ to autoplay on entry
displayNamestring–Location name briefly shown to the player on entry
encountersboolean–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…
enterableHousesboolean–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…
heightnumber|string–Map height in tiles (defaults: blank/themed 13, procedural 25)
keepEventsboolean–mode "template" only: also copy the template's events (default true)
keepPropsboolean–mode "semantic" with a mined templateId: paint the original decorations even onto a different tileset (they may not exist there)
lockedboolean–mode "semantic": put a key and a locked door on the path (default true when there are 4+ rooms)
loopboolean–mode "semantic": add one extra corridor so the map has a loop instead of being a tree (default true)
modestring–Which generator to use; see the tool description. Default "procedural"
namestring–Internal map name for the editor tree (required for mode "duplicate")
notestring–Free-form note field for plugin metadata
parentIdnumber|string–Map tree folder to nest the new map under (0 = root)
roomsnumber|string–mode "semantic": rooms on the critical path (default 5)
seednumber|string–procedural/batch: random seed for reproducible output (omit for random; returned in the result)
sideRoomsnumber|string–mode "semantic": dead-end rooms hung off the path, the first holding treasure (default 2)
sourceMapIdnumber|string–mode "duplicate" only: existing map ID to copy (unchanged by the operation)
templateIdnumber|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
themestring–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…
tilesetIdnumber|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…
useTemplateboolean–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…
widthnumber|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.

NameTypeReqDescription
categorystring–detail "templates": filter by template category
detailstring–How much and what kind of context; see the tool description. Default "full"
themestring–detail "templates": filter by template theme
tilesetIdnumber|string–detail "tileset": which tileset to categorize

No output schema declared.

No examples provided.

insert_event_commands ~358

Insert a complete event-command fragment into a map event page, common event, or troop battle page. Validates the fragment, insertion boundary, resulting list, and supported references before writing. Invalid data refuses the write. Omit position to append before the root end marker; an explicit position must be a safe command boundary (not inside a text continuation or between a block header and its branches). Fragments are rebased to the target indentation. dryRun:true validates and previews without writing or creating backups. Normal writes use the existing atomic backup-protected project writer. Returns target identity, insertion count, the resulting list length and its command codes (listCodes), and warnings; pass verbose:true to also get the full before/after lists. Existing unknown extension commands are advisory; known MZ-only commands are rejected.

NameTypeReqDescription
commandsarrayyesA complete fragment, typically returned by build_event_commands. A supplied final root terminator is normalized; the target always retains exactly one.
commonEventIdinteger|string–common_event target ID.
dryRunboolean–Preview the validated change without writing. Default false.
eventIdinteger|string–map_event target event ID.
mapIdinteger|string–map_event target map ID.
pageIndexinteger|string–map_event/troop_page: zero-based page, default 0.
positioninteger|string–Zero-based insertion index in the existing command list. Out-of-range or unsafe boundaries are rejected.
targetstring–Defaults to map_event.
troopIdinteger|string–troop_page target troop ID.
verboseboolean–Include the full before/after command lists in the result. Default false.

No output schema declared.

No examples provided.

manage_map_event ~1,308

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.

NameTypeReqDescription
actionstringyesWhat to do; see the tool description. Default "create"
characterIndexnumber|string–Which of the 8 characters in the sheet (0-7)
characterNamestring–Sprite sheet from img/characters/ without extension; list options with get_project_context
commandobject–action "add_command": event command {code, indent, parameters}; e.g. 201=Transfer Player [0, mapId, x, y, dir, fade]
costnumber|string–preset "inn": gold charged for a full recovery (default 50)
countnumber|string–action "populate": how many events (default 3)
destMapIdnumber|string–preset "teleport"/"door": destination map ID
destXnumber|string–preset "teleport"/"door": destination tile X (should be walkable)
destYnumber|string–preset "teleport"/"door": destination tile Y
dialoguesarray–preset "npc": dialogue lines, each becomes one text box
doorNamestring–preset "puzzle_switch": editor name for the door event (default "Door")
doorXnumber|string–preset "puzzle_switch": door tile X
doorYnumber|string–preset "puzzle_switch": door tile Y
eventIdnumber|string–Existing event ID (update/delete/add_command); find it with query_map view "events"
eventTypestring–action "populate": kind of events to scatter — "npc", "chest" or "boss"
fieldsobject–action "update": properties to overwrite, e.g. {"x": 5, "y": 9} or {"pages": [...]} (replaces all pages)
gameSwitchIdnumber|string–preset "puzzle_switch": game switch linking switch and door — pick an unused ID via manage_system get switches
goodsarray–preset "shop": wares [[type, id, priceType, price]] — priceType 1 uses the custom price, 0 the database price
itemsarray–preset "chest": loot [{type: "item"|"weapon"|"armor", id, amount}]
kindstring–action "convert": what to turn the existing event into
lockedMessagestring–preset "door": message shown while locked (default "It's locked.")
lockedSwitchIdnumber|string–preset "door": if set, the door shows lockedMessage until this game switch is ON, then warps
mapIdnumber|stringyesMap the event lives on (always required)
namestring–Event name shown in the editor
optionsobject–action "convert": kind-specific settings — merchant {goods|items, greeting?}, inn {cost?}, sign {text}
optsobject–action "populate": overrides {name, troopId, x, y}
pageIndexnumber|string–action "add_command": which page receives the command (0-based, default 0)
pagesarray–action "create" without preset: full event page objects (optional)
presetstring–action "create" only: ready-made event recipe; omit for a low-level empty event
switchNamestring–preset "puzzle_switch": editor name for the switch event (default "Switch")
switchXnumber|string–preset "puzzle_switch": floor-switch tile X
switchYnumber|string–preset "puzzle_switch": floor-switch tile Y
triggernumber|string–How the event activates: 0=action button, 1=player touch, 2=event touch, 3=autorun, 4=parallel
troopIdnumber|string–preset "boss" / populate boss: troop to battle (create it first via create_database_entry preset encounter_troop)
xnumber|string–Tile X position (0-based; create/presets except puzzle_switch)
ynumber|string–Tile Y position (0-based)

No output schema declared.

No examples provided.

manage_system ~1,657

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,…

NameTypeReqDescription
actionstringyesWhat to do; see the tool description. Default "get"
authorstring–create_plugin: @author name
backupstring–restore_backup: a backup id from list_backups (default: the newest, which undoes the last write)
bodystring–create_plugin: custom JS body; omit for a safe generated skeleton
buttonstring–bridge_command "press_button": safe RPG Maker input to press
commandstring–bridge_command: which safe instruction to send to the running game
commandsarray–create_plugin: plugin command names to document (@command) and wire a pluginCommand handler stub for
descriptionstring–create_plugin: @plugindesc short description
destPathstring–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
directionnumber|string–bridge_command "teleport_player": facing after the transfer (2 down, 4 left, 6 right, 8 up)
durationMsnumber|string–bridge_command "press_button": hold duration in milliseconds (default 80, range 30-1000)
filestring–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"
forceboolean–resize_list: allow shrinking past names that are in use
helpstring–create_plugin: @help text (multi-line allowed)
idnumber|string–name_switch/name_variable: switch or variable ID to label (1-based)
installstring–playtest/open_editor: RPG Maker MV install root (contains nwjs-win/ and RPGMV.exe); defaults to RPGMAKER_MV_INSTALL or the standard Steam install
keepRunningboolean–playtest: do not close the game a previous playtest started (default false)
limitnumber|string–bridge_telemetry: return at most this many of the most recent frames. mine_templates: keep at most this many layouts, largest maps first
mapIdnumber|string–set_starting_position: map where new games start (must exist)
minDistinctTilesnumber|string–mine_templates: a map needs at least this many distinct tiles to count as content rather than scratch (default 10)
namestring–name_switch/name_variable: descriptive label. create_plugin: the plugin name (bare token — letters/digits/_/-, becomes js/plugins/<name>.js)
outDirstring–export_web: folder for the HTML5 build, outside the project (absolute, or relative to it). It must be new, empty, or a previous export_web folder; <outDir>.zip is written beside it unless zip:false.…
paramsarray–create_plugin: @param definitions [{name, type?, desc?, default?}] surfaced in js/plugins.js
peekboolean–bridge_telemetry: leave the frames in the buffer instead of consuming them
portnumber|string–bridge_start/install_bridge_plugin: loopback port for the live bridge (default 32123, or RPGMV_BRIDGE_PORT)
pruneboolean–export_web: drop img/audio/movies files no data or script references (default false; assets a plugin names only at runtime would be lost)
screenshotNamestring–take_screenshot: optional safe filename prefix (letters, numbers, _ and -, up to 64 characters)
sectionstring–action "get": which part of System.json to return (default "full")
sizenumber|string–resize_list: the highest valid switch or variable id (1-5000); `section` picks which
sourcePathstring–scaffold_project: a blank-project (NewData) folder to clone; defaults to the RPGMAKER_MV_INSTALL env var or the standard Steam install
statusboolean–create_plugin: enable the plugin in js/plugins.js (default true)
telemetryIntervalnumber|string–install_bridge_plugin: frames between player-position frames (default 30; 60 = once per second)
testboolean–playtest: run in playtest/test mode (default true; false runs it as a normal launch)
timeoutMsnumber|string–bridge_command/take_screenshot: how long to wait for the answer (default 8000, screenshots 15000)
titlestring–action "set_title": new game title
typesarray–bridge_telemetry: only return these frame types, e.g. ["exception","log"]
waitboolean–bridge_command: wait for the game to answer (default true; false is fire-and-forget)
xnumber|string–set_starting_position: starting tile X (should be walkable)
ynumber|string–set_starting_position: starting tile Y
zipboolean–export_web: also write <outDir>.zip with index.html at its root (default true)

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.

NameTypeReqDescription
entitystringyesWhich database to read: actors, classes, skills, items (consumables), weapons, armors, enemies, states (status conditions), troops (enemy formations), tilesets, common_events, animations
idnumber|string–Fetch a single entry by its database ID (1-based). Omit to list or search
querystring–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.

NameTypeReqDescription
eventIdnumber|string–Event ID within the map (required for view "event")
layernumber|string–view "ascii" only: tile layer to draw, 0=ground (default) or 2=upper decorations
mapIdnumber|string–Map ID (required for every view except "infos"); map 1 is Map001.json
querystring–view "events" only: case-insensitive substring filter on event names
showEventsboolean–view "ascii" only: overlay event markers (default true)
showRegionsboolean–view "ascii" only: also return the region-ID layer as a second grid (default false)
viewstringyesWhat to read; see the tool description for each view

No output schema declared.

No examples provided.

record_video ~235

Start or stop recording the live RPG Maker MV playtest canvas through the authenticated MCP bridge. `action:"start"` begins a silent WebM capture inside the game runtime; `action:"stop"` saves it under `.mcp-cache/recordings/` and returns `{path, bytes, mimeType, durationMs, name}`. This captures only the game canvas, not the desktop or credentials. Requires the bridge plugin, a running bridge, and a connected playtest. Optional `name`, `fps` (default 30), and `bitrateKbps` (default 2500) control the artifact.

NameTypeReqDescription
actionstringyesStart a new capture or stop and save the active capture
bitrateKbpsnumber|string–Video bitrate in kbps, 250-10000 (default 2500)
fpsnumber|string–Capture frame rate, 1-60 (default 30)
namestring–Safe filename prefix used when stopping
timeoutMsnumber|string–How long to wait for start/stop result (defaults 15000/60000)

No output schema declared.

No examples provided.

run_playtest ~356

Play the game headless from a script of steps and report what happened: does the door transfer, does the NPC say the right line, does the choice branch, is a tile blocked. Boots the project in Chromium with the real engine; no editor or running game needed, and project data is never changed (screenshots go to .mcp-cache/renders/). Steps by action: load {mapId,x,y,direction?,party?,level?,gold?,switches?,variables?,selfSwitches?,items?,equip?,encounters?} starts a fresh game there; startEvent {eventId} runs a map event until it shows text or goes idle; advanceText {maxMs?} presses OK until idle, stopping at choices or battle, and returns the lines shown; choose {index}; walk {direction,steps?} reports where the player ended or which tile blocked; press {button,times?}; wait {ms}; autoBattle {troopId?,canEscape?,canLose?,maxMs?} fights on auto until the battle ends; screenshot {name?}; eval {script} returns a JS expression evaluated in the game page. The result lists each step with ok, a finalState and page problems (errors, missing files). Runs can take minutes: send a progressToken to get progress notifications. Needs the optional playwright-core and a cached Chromium (npx playwright install chromium-headless-shell, or RPGMAKER_MCP_CHROMIUM).

NameTypeReqDescription
realtimeboolean–Play battles at real speed (default false: fast-forwarded, about 10-20x quicker)
stepsarrayyesThe script, run in order. Fields per action are listed in the tool description.

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.

NameTypeReqDescription
pathstringyesAbsolute path to an RPG Maker MV project root (the folder containing data/System.json and img/)

No output schema declared.

No examples provided.

take_screenshot ~371

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.

NameTypeReqDescription
mapIdnumber|string–Render this map headless as the engine draws it, with no game running (PNG under .mcp-cache/renders/). Needs the optional playwright-core and a cached Chromium (npx playwright install chromium-headle…
namestring–Optional safe filename prefix, e.g. boss-room or collision-proof
runEventsboolean–mapId: let autorun/parallel events run before the shot (default false)
showEventsboolean–mapId: draw event sprites (default true)
showPlayerboolean–mapId: draw the player (default: hidden for the whole map, shown for a view)
switchesarray–mapId: switch IDs to turn ON first, to see later event pages
timeoutMsnumber|string–How long to wait for the game response in milliseconds (default 15000)
xnumber|string–mapId: with y, a normal screen view centred on this tile instead of the whole map
ynumber|string––

No output schema declared.

No examples provided.

update_database_entry ~485

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 + `addPage` inserts one battle-event page from a compact trigger. 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.

NameTypeReqDescription
addEnemyIdnumber|string–troops only: enemy ID to append as a new member at an auto-computed screen position
addPageobject–troops only: append a battle-event page without resending the others. when (at least one, ANDed): turn [a, b] = turn a + b*X (b 0: only turn a); enemyHpBelow [troopSlot from 0, pct]; actorHpBelow [ac…
appendCommandobject–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
entitystringyesWhich database contains the entry
fieldsobject–Subset of properties to overwrite, e.g. {"name": "Hero", "price": 250}. Not needed when using appendCommand/addEnemyId/addPage
idnumber|stringyesID of the entry to modify (must exist; find it with query_database)

No output schema declared.

No examples provided.

Install

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

# add to Claude Code
claude mcp add diegolopez0208-rpgmaker-mv-ultimate -- npx -y rpgmaker-mv-mcp
Common questions

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 1 known advisory against it as of 5 November 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 18 tools: build_event_commands, insert_event_commands, query_database, create_database_entry, update_database_entry, and 13 more. Their descriptions and schemas cost roughly 11,577 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 5 November 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.