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.

io.github.Redseb/rpgmaker-mz-mcp

NPM · RPGMAKER-MZ-MCP

MCP server for RPG Maker MZ: maps, tile painting, events, database editing, and validation.

Available components

0 this week 81 Trust /100

Last scanned (8 hours ago)

Scores higher than 69% of npm servers

Category Developer Tools

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 Security98
  • No malware found by supply-chain analysis.Pass
  • No known CVEs affecting this package version or its production dependencies.Pass
  • No install/post-install scripts declared.Pass
  • 30 of 93 dependencies flagged as unhealthy. View diagnostics → Partial
Provenance & Transparency45
Schema Quality & AI Usability66
  • AI-judged instruction clarity (excellent).Pass
  • Context-footprint check failed: tool/resource definitions use about 24829 tokens (~193/item across 128 items; 128 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 Coverage99
  • 100% of tools have a non-trivial description (not blank, and not just the tool's name).Pass
  • 97% of tool parameters carry a description.Partial
Tool Safety75
  • No prompt-injection markers were found in the server instructions, tool names or descriptions we captured.Pass
  • 0 of 5 tool(s) whose name or description implies an irreversible operation declare an MCP destructiveHint annotation; "delete_map" implies "delete" and declares no destructiveHint at all, which the MCP spec reads as destructive by default. See how to fix → Fail
  • An AI judge read all 128 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.

  • 1 Nov 26 +1
    • Stability: 0.97 → pass security
  • 31 Oct 26 −1
    • Stability: pass → 0.97 functional
  • 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
    • Package version: 1.2.0 → 1.4.0 functional
  • 15 Oct 26 −3
    • Stability: pass → 0.80 functional
  • 14 Oct 26 +1
    • Stability: 0.97 → pass security
  • 12 Oct 26 +1
    • Security disclosure: unverified → fail ▼ functional
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-mz-mcp@1.4.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 →

Dependencies 93 packages
Packages resolved 93
Stale 30
Tree resolution Complete

Background: SBOMs and build attestations, explained →

MCP tools · 128 exposed · ~24,829 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
create_transfer ~428

Create a complete, placed map-transfer event in one call, using whichever of the two working idioms you pick. `idiom: "action_button"` (default) makes a priority-`same` event the player faces and presses — the right shape for a solid landmark (building, dungeon mouth, door); `idiom: "player_touch"` makes an invisible priority-`below` doormat the player walks onto — for interior exits and map-edge gaps. `direction` is the facing the player lands with, `fade` the screen transition. Throws if the destination map does not exist; warns if the destination tile is outside that map, if the characterName is unknown, or if the event can never fire from where it sits.

NameTypeReqDescription
characterIndexinteger–Sprite index 0-7 in the sheet
characterNamestring–Optional sprite basename (a doormat is normally left invisible)
directionstring–Facing after the transfer; default "retain"
dryRunboolean–Preview only: return a diff of what would change without writing to disk.
fadestring–Screen fade during the transfer; default "black"
forceboolean–Write even if validation finds structural problems (wrong parameter count, unterminated command list). Off by default: such a write is refused and nothing is written. Advisory warnings never block re…
idiomstring–action_button = face a solid landmark and press (priority same, default); player_touch = walk onto a doormat (priority below)
mapIdintegeryesThe ID of the map the trigger is placed on
namestring–Event name (editor label); default "Transfer"
targetMapIdintegeryesThe ID of the destination map
targetXintegeryesX tile the player lands on
targetYintegeryesY tile the player lands on
xintegeryesX tile position of the trigger
yintegeryesY tile position of the trigger

No output schema declared.

No examples provided.

create_troop ~265

Create a new troop (enemy battle group) in data/Troops.json. `name` is required; `members` defaults to empty and `pages` to one blank battle-event page. Every member.enemyId must reference an existing enemy. A structurally invalid battle-event page refuses the write (nothing is saved) — pass force: true to override.

NameTypeReqDescription
dryRunboolean–Preview only: return a diff of what would change without writing to disk.
forceboolean–Write even if validation finds structural problems (wrong parameter count, unterminated command list). Off by default: such a write is refused and nothing is written. Advisory warnings never block re…
membersarray–Placed enemies; each references an existing enemyId
namestringyesTroop name shown in the database
pagesarray–Battle-event pages { conditions, list, span }; defaults to one blank page
verboseboolean–Echo the full written record instead of the default summary. Off by default: the response reports identity, counts and command-list shape, which is what you would assert on, and omits the parameters/…

No output schema declared.

No examples provided.

create_weapon ~236

Create a new weapon in data/Weapons.json. Only `name` is required; omitted fields use the editor's new-weapon defaults (Weapon equip slot, no stat bonuses). `params` is a flat 8-length stat bonus [maxHP, maxMP, atk, def, mat, mdf, agi, luk]. Allocates and returns the next unused weapon id.

NameTypeReqDescription
animationIdinteger–Attack animation id
descriptionstring–In-game description text
dryRunboolean–Preview only: return a diff of what would change without writing to disk.
iconIndexinteger–Icon index (IconSet.png)
namestringyesWeapon name
notestring–Note field
paramsarray–8 flat stat bonuses [maxHP, maxMP, atk, def, mat, mdf, agi, luk]
priceinteger–Buy price
traitsarray–Trait objects { code, dataId, value }
wtypeIdinteger–Weapon type id (System.json weaponTypes)

No output schema declared.

No examples provided.

delete_map ~106

Delete a map: remove its entry from the map tree (MapInfos.json) and delete its data/MapNNN.json file. The deleted map's direct children are reparented onto its parent (not deleted), so removing one node doesn't wipe a whole sub-tree. Does not touch System.json.

NameTypeReqDescription
dryRunboolean–Preview only: return a diff of what would change without writing to disk.
mapIdintegeryesThe ID of the map to delete

No output schema declared.

No examples provided.

delete_map_event ~66

Delete an event from a map by ID

NameTypeReqDescription
dryRunboolean–Preview only: return a diff of what would change without writing to disk.
eventIdintegeryesThe ID of the event
mapIdintegeryesThe ID of the map

No output schema declared.

No examples provided.

delete_record ~307

Delete one database record (actor, class, skill, item, weapon, armor, enemy, troop, state, or common_event) by nulling its slot — ids never shift, so nothing else is renumbered. Reports every reference the deletion would leave dangling (an actor's class, a troop member, a Change Items / Shop / Battle Processing command, a skill effect, the starting party, …; found with the same audit validate_references runs, see `coverage` in the response) and REFUSES, writing nothing, when there are any — pass force: true to delete anyway, or dryRun: true to preview the references without throwing. Deleting skill 1 (Attack), skill 2 (Guard) or state 1 (Knockout) is always reported, since the engine hard-codes them. Returns { type, deleted: { id, name }, referenceCount, references[], coverage }.

NameTypeReqDescription
dryRunboolean–Preview only: return a diff of what would change without writing to disk.
forceboolean–Write even if validation finds structural problems (wrong parameter count, unterminated command list). Off by default: such a write is refused and nothing is written. Advisory warnings never block re…
idintegeryesThe id of the record to delete
typestringyesWhich database table: actor, class, skill, item, weapon, armor, enemy, troop, state, or common_event

No output schema declared.

No examples provided.

describe_tile ~195

Decode a raw RPG Maker MZ tile id into its tileset sheet (A1–A5, B–E), and for autotiles its kind + shape slot (0–47) and autotile geometry (floor/wall/waterfall). Read-only inspection helper — raw tile ids are opaque integers, this makes one legible. Returns { tileId, empty, sheet, sheetIndex, autotile, kind?, shape?, autotileType? }. Pass `tilesetId` to also inspect the sheet PNG and report `transparent` (true = the tile is see-through and needs an opaque base tile on a lower layer; painting it on layer 0 alone shows the map void) + `transparentPercent`.

NameTypeReqDescription
tileIdintegeryesThe raw tile id to decode
tilesetIdinteger–Tileset id — when given, also report the tile transparency (needs-a-base) flag

No output schema declared.

No examples provided.

export_web ~346

Export a pruned HTML5 web deployment (for itch.io or any static host): copies index.html, js/, css/, fonts/, icon/ and data/*.json, plus only the img/audio/movies files the game references (every string in data/*.json, string literals in the core js and plugins, plugin @default annotations; img/system is always kept) and only the effects/*.efkefc Effekseer effects actually referenced (an animation's effectName, a Plugin Command argument, or a plugin parameter/string — not other data strings) together with the textures/models they list internally. Writes the folder to outDir and, by default, <outDir>.zip with index.html at the archive root. Returns file/byte counts, kept/dropped asset counts (+ dropped paths), the screen size from System.advanced (the itch embed size), and warnings for itch's 1000-file / 200 MB-per-file limits. Writes nothing inside the project; outDir must be outside the project's copied folders, and an existing non-empty outDir is only replaced if it was a previous export_web output. Follow up with a playtest of the exported build.

NameTypeReqDescription
outDirstringyesFolder to write the deployment into (absolute, or relative to the project root). Must not be the project folder or inside its img/audio/data/js/… folders.
pruneboolean–Drop img/audio/movies/effects files nothing references (default true). Set false to copy every asset — the escape hatch if a plugin builds asset names at runtime.
zipboolean–Also write <outDir>.zip with index.html at the archive root (default true).

No output schema declared.

No examples provided.

fill_area ~204

Fill a rectangular area of a map with one tile id, with automatic autotiling — a filled autotile region borders itself correctly (and re-borders any same-kind tiles it touches). Flat tiles fill uniformly. Defaults to the lower ground layer (0). For region ids, fill layer 5 with the region number as tileId.

NameTypeReqDescription
dryRunboolean–Preview only: return a diff of what would change without writing to disk.
heightintegeryesRectangle height in tiles
layerinteger–Z-layer 0-5 (default 0 = lower ground; 5 = region id)
mapIdintegeryesThe ID of the map
tileIdintegeryesTile id to fill with (autotile base or raw)
widthintegeryesRectangle width in tiles
xintegeryesLeft tile position of the rectangle
yintegeryesTop tile position of the rectangle

No output schema declared.

No examples provided.

find_tile ~378

Find tiles in a tileset by a case-insensitive SUBSTRING match on their catalog name — a quick bridge from a name fragment like 'grass' or 'forest' to a paintable tile id. This is a literal substring match, NOT synonym/semantic search: 'water' matches 'Endless Waterfall' but not 'Sea' or 'Pond' (their names lack the substring). To browse the actual tile names first, use get_tile_catalog with a `sheet` filter, then search a fragment you see. Set `searchDescriptions: true` to also match the free-text description a project catalog carries (custom sheets named by the tileset-catalog skill — their names are terse, the descriptions say what the tile looks like); built-in RPG Maker entries have no description, so this only widens the search over custom sheets. Returns matching catalog entries (name, sheet, tile id, autotile kind, `source`, `matchedIn` [which fields matched], `transparent` [true = needs an opaque base on a lower layer], plus `description`/`confidence`/`manual` for project catalog drafts). Covers the default RPG Maker tilesets, non-default sheets with a .txt name sidecar in img/tilesets/ (DLC packs ship these; loaded automatically, `source: 'sidecar'`), plus custom sheets cataloged into data/tilecatalog/ (via the tileset-catalog skill). Read-only.

NameTypeReqDescription
querystringyesSubstring to match, e.g. 'grass' or 'forest' (literal substring, no synonyms)
searchDescriptionsboolean–Also match project-catalog tile descriptions, not just names (default false — names only)
tilesetIdintegeryesTileset id (from Tilesets.json / the map)

No output schema declared.

No examples provided.

get_database ~193

Read a database table in full: actors, classes, items, weapons, armors, skills, enemies, troops, states, or common_events. Returns the raw 1-indexed array (slot 0 is null), or — with `id` — that single record, or null if no such record exists. These are full records: prefer list_names for an id→name index, or search_actors/search_items/search_skills to find records by name, and reach for this only when you need every field. Maps and tilesets are not here: use get_map_infos/get_map and get_tilesets/get_tile_flags. Read-only.

NameTypeReqDescription
idinteger–Return just this record (null if missing); omitted = the whole table
typestringyesWhich table to read: actors, classes, items, weapons, armors, skills, enemies, troops, states, or common_events.

No output schema declared.

No examples provided.

get_game_title ~14

Get the game title

Input schema present but exposes no named parameters.

No output schema declared.

No examples provided.

get_map ~133

Get map data by ID. The tile `data` array can be huge on a painted map (width*height*6 ints) and blow the MCP token limit, so pass includeData:false to omit it (you get dataTileCount instead) and read tiles with get_map_region when needed. includeData defaults to true for backward compatibility.

NameTypeReqDescription
includeDataboolean–Include the full tile `data` array (default true). Pass false to omit it (returns dataTileCount) and avoid the token cost of a big painted map.
mapIdintegeryesThe ID of the map to retrieve

No output schema declared.

No examples provided.

get_map_dimensions ~35

Get the width and height (in tiles) of a map

NameTypeReqDescription
mapIdintegeryesThe ID of the map

No output schema declared.

No examples provided.

get_map_event ~43

Get a specific event from a map

NameTypeReqDescription
eventIdintegeryesThe ID of the event
mapIdintegeryesThe ID of the map

No output schema declared.

No examples provided.

get_map_events ~30

Get all events from a specific map

NameTypeReqDescription
mapIdintegeryesThe ID of the map

No output schema declared.

No examples provided.

get_map_infos ~15

Get information about all maps

Input schema present but exposes no named parameters.

No output schema declared.

No examples provided.

get_map_region ~196

Read the raw tile ids in a rectangular window of one map layer — a token-cheap alternative to get_map for inspecting part of a painted map. Returns `tiles` as a 2D array (rows top→bottom, each left→right) of raw engine tile ids. The rectangle must lie fully within the map bounds (throws otherwise). layer defaults to 0 (see set_map_tile for the z-layer meanings).

NameTypeReqDescription
heightintegeryesWindow height in tiles
layerinteger–Z-layer 0-5 (0-1 lower, 2-3 upper, 4 shadow, 5 region); default 0
mapIdintegeryesThe ID of the map
widthintegeryesWindow width in tiles
xintegeryesLeft edge of the window (tile column)
yintegeryesTop edge of the window (tile row)

No output schema declared.

No examples provided.

get_party ~38

Get the starting party — the actor ids the game begins with. Returns `{ partyMembers }`, rhyming with set_party's input/output shape.

Input schema present but exposes no named parameters.

No output schema declared.

No examples provided.

get_project ~40

Get the project directory the server is currently operating on: its path, whether it is a valid RPG Maker MZ project, and the game title it holds.

Input schema present but exposes no named parameters.

No output schema declared.

No examples provided.

get_starting_position ~23

Get the game starting position ({ mapId, x, y })

Input schema present but exposes no named parameters.

No output schema declared.

No examples provided.

get_switches ~15

Get all game switch names

Input schema present but exposes no named parameters.

No output schema declared.

No examples provided.

get_system ~12

Get system data

Input schema present but exposes no named parameters.

No output schema declared.

No examples provided.

get_terms ~40

Get the game vocabulary/terms: the `basic`, `commands`, `params` string arrays and the `messages` map (menu labels, system messages).

Input schema present but exposes no named parameters.

No output schema declared.

No examples provided.

get_tile_catalog ~451

Get the semantic tile catalog for a tileset: the named tiles (e.g. 'Grassland A', 'Forest', 'Sea') in each of its image sheets, each with its representative tile id and a `source` ('builtin' = RPG Maker's own labels; 'sidecar' = authoritative names from an img/tilesets/<Sheet>.txt file shipped next to a non-default sheet, as DLC packs do; 'project' = a data/tilecatalog/ entry — a vision-bootstrap draft, or a human-verified `manual` one, which outranks a sidecar name). Project (custom-sheet) entries also carry the skill's `description`, `confidence` ('high'/'medium'/'low'), and `manual` (true = a human verified it) so you can gauge how trustworthy a draft name is. Autotile entries (A1–A4) return the kind's base tile id — feed it to a paint command, which recomputes the shape from neighbours. Covers the default RPG Maker tilesets, any non-default sheet with a .txt name sidecar in img/tilesets/ (loaded automatically), plus custom sheets cataloged into data/tilecatalog/ (via the tileset-catalog skill); still-uncovered sheets are omitted. **Called WITHOUT `sheet` it returns only a per-sheet index (name + entry count) to stay within the tool-output limit — a full tileset can hold thousands of named tiles. Pass `sheet` (filename 'World_A2' or slot role 'A2') to list one sheet's actual tile entries.** Sheet-filtered entries also carry `transparent` (true = the tile is see-through and needs an opaque base tile on a lower layer — painting it on layer 0 alone shows the map void; e.g. trees/objects/overlays). Read-only.

NameTypeReqDescription
sheetstring–Restrict to one sheet by filename ('World_A2') or role ('A2'). Omit to get a per-sheet summary (counts only) instead of every entry.
tilesetIdintegeryesTileset id (from Tilesets.json / the map)

No output schema declared.

No examples provided.

get_tile_flags ~164

Decode a tileset's flag word for a single tile id into a legible view: 4-direction passability (down/left/right/up — true = walkable that way), the [*] 'star' overlay bit, ladder/bush/counter/damage-floor flags, and terrain tag (0–7). Read-only inspection of data/Tilesets.json flags[]. Note passability here is for the tile in isolation; a real cell's passability layers its stacked tiles — use check_passability for that. Returns { tilesetId, tileId, tile, flags }.

NameTypeReqDescription
tileIdintegeryesThe raw tile id whose flags to decode
tilesetIdintegeryesTileset id (from Tilesets.json / the map)

No output schema declared.

No examples provided.

get_tilesets ~131

List every tileset in the project with its id, name, mode (0 world / 1 area), and the image sheets it uses (labelled A1–A4, A5, B–E; empty slots omitted). Use this to discover valid tilesetId values (needed by find_tile, get_tile_catalog, paint_tiles, fill_area, place_object, get_tile_flags, set_tile_flags, check_passability) and to see which sheets each tileset is built from. For a plain id→name list, list_names(type:"tilesets") is even cheaper. Read-only.

Input schema present but exposes no named parameters.

No output schema declared.

No examples provided.

get_title_screen ~75

Get the title screen settings: title1Name/title2Name (background layers, from list_assets("titles1"/"titles2") — title2Name draws over title1Name), titleBgm (the AudioFile that plays while it is shown), and drawTitle (whether the game title text is drawn over the art).

Input schema present but exposes no named parameters.

No output schema declared.

No examples provided.

get_types ~53

Get one System.json type-name array — the named lists other data references by index: elements, skillTypes, weaponTypes, armorTypes, or equipTypes.

NameTypeReqDescription
categorystringyesWhich type-name array to read

No output schema declared.

No examples provided.

get_variables ~14

Get all game variable names

Input schema present but exposes no named parameters.

No output schema declared.

No examples provided.

insert_event_commands ~500

Insert a pre-built sequence of event commands (from the build_* builders) into any of the three command lists an MZ project has — the mutating companion to the read-only builders. Splices before the list’s end marker (or at `position`). target "map_event" (the default) needs mapId + eventId + pageIndex; "common_event" needs commonEventId; "troop_page" needs troopId + pageIndex. The resulting list is validated before writing: a structural problem (wrong parameter count for a command code, a list left unterminated) refuses the write and saves nothing — pass force: true to override. Advisory findings (unrecognized code, over-long text line) are returned as `warnings` and never block. Returns { target, id, listLength, listCodes, warnings? } — the resulting list as its length and its command CODES, which is what you verify a splice against; pass verbose: true for the full list with parameters, or read it back with get_map_event.

NameTypeReqDescription
commandsarrayyesThe event commands to insert (e.g. the `commands` from a build_* tool)
commonEventIdinteger–target "common_event": the common event id
dryRunboolean–Preview only: return a diff of what would change without writing to disk.
eventIdinteger–target "map_event": the event id
forceboolean–Write even if validation finds structural problems (wrong parameter count, unterminated command list). Off by default: such a write is refused and nothing is written. Advisory warnings never block re…
mapIdinteger–target "map_event": the map id
pageIndexinteger–target "map_event"/"troop_page": zero-based page index
positioninteger–Insertion index; defaults to the end of the list
targetstring–Which command list to insert into (default map_event)
troopIdinteger–target "troop_page": the troop id
verboseboolean–Echo the full written record instead of the default summary. Off by default: the response reports identity, counts and command-list shape, which is what you would assert on, and omits the parameters/…

No output schema declared.

No examples provided.

list_allocated_ids ~233

Show which switch / variable / common-event IDs are already spoken for, derived from the project's own JSON (never a hand-maintained list, which would drift the moment someone edited in the RPG Maker editor). An id counts as allocated if it is declared (a System.json label, a CommonEvents row) OR referenced anywhere — event page conditions and command lists, common events, troop pages, and Common Event skill/item effects. Use this before reusing an id, and pass `id` to answer "where is switch 23 actually used?" before touching it. Returns { count, highest, gaps, declaredCapacity, allocated[], coverage }. Read-only. To claim a fresh id instead, use next_free_id.

NameTypeReqDescription
idinteger–Report just this id — whether it is allocated, its label, and every place it is referenced. Omitted = the whole namespace.
typestringyesWhich id namespace: switch, variable, or common_event. Database rows (actors, items, …) are not here — create_*/batch_create assign those ids, and list_names shows what exists.

No output schema declared.

No examples provided.

list_assets ~141

List the available asset filenames (extension stripped) for one asset kind — the exact names RPG Maker's data references (a sprite/face/tileset/audio name). Use it to validate a graphic or audio name before wiring it into an event; a wrong filename fails silently at runtime. Fails soft: an unused asset directory returns an empty list.

NameTypeReqDescription
typestringyesAsset kind to list. Images: characters, faces, tilesets, pictures, parallaxes, battlebacks1, battlebacks2, enemies, sv_actors, sv_enemies, titles1, titles2, system. Audio: bgm, bgs, me, se.

No output schema declared.

No examples provided.

list_names ~98

Cheap names-only index for a database table. Returns { id, name } entries instead of full records — use it to look up or sanity-check IDs before wiring them into events, without paying the token cost of a full get_*/search_* dump.

NameTypeReqDescription
typestringyesWhich table to index: actors, classes, items, weapons, armors, skills, enemies, troops, states, common_events, tilesets, or maps.

No output schema declared.

No examples provided.

list_plugin_commands ~118

List every plugin command create_plugin_command can validate (plugin filename → command key → args): the plugins this project actually ships, scanned from their js/plugins/*.js annotations, merged over a small built-in allowlist. Pass pluginName to narrow to one plugin. Read-only. Use scan_plugins for the richer per-project view (arg types/defaults, enabled state); an unlisted plugin command can still be built, it just isn’t validated.

NameTypeReqDescription
pluginNamestring–Optional: restrict to one plugin (its filename without .js)

No output schema declared.

No examples provided.

next_free_id ~238

Reserve the next unallocated switch / variable / common-event ID(s) instead of picking one by hand. Ids are handed out strictly above every id already declared or referenced, so two sessions editing the same project over time cannot silently claim the same switch — a collision that never crashes and only surfaces hours into a playtest as a door that is inexplicably already open. Pass `reuseGaps: true` to fill holes below the highest id first (off by default: a hole is often an id claimed in notes but not yet written). Read-only — it suggests ids, it does not write them; name what you take with set_switch_name / set_variable_name so the next session sees the claim.

NameTypeReqDescription
countinteger–How many consecutive free ids to return (default 1)
reuseGapsboolean–Fill unallocated holes below the highest id first (default false)
typestringyesWhich id namespace: switch, variable, or common_event. Database rows (actors, items, …) are not here — create_*/batch_create assign those ids, and list_names shows what exists.

No output schema declared.

No examples provided.

object_tiles ~207

Expand a top-left flat tile id + a width×height size into the grid of tile ids that object occupies on the sheet — feed the returned `tiles` straight into place_object. This handles the flat sheets' two-half-column layout, where the tile below id N is NOT N+16 (indices 0–127 are the left half of the sheet, 128–255 the right), which is otherwise painful to compute by hand. Get the top-left id from find_tile/get_tile_catalog. Read-only. Throws if topLeftId isn't a flat id or the rectangle runs off the 16×16 sheet; warns if the tileset lacks that sheet.

NameTypeReqDescription
heightintegeryesObject height in tiles
tilesetIdintegeryesThe tileset id the object belongs to
topLeftIdintegeryesRaw flat tile id of the object's top-left cell (from find_tile/get_tile_catalog)
widthintegeryesObject width in tiles

No output schema declared.

No examples provided.

paint_blueprint ~570

Paint a whole map area from an ASCII blueprint in ONE call and one write. `rows` are equal-length strings (one glyph per cell); `legend` maps each glyph to what that cell holds: `[[layer, tile], ...]` pairs (multi-layer cells, e.g. ground on 0 + fence on 1); a bare string = a catalog tile name on layer 0; `{ wall: { top, side?, faceHeight?, layer? }, tiles?: [...] }` = an A4 wall (or A3 roof) — every cell gets the wall-top kind and the bottom `faceHeight` (default 1) cell(s) of each vertical run get the wall-side kind (derived as top + 8 kinds = +384 ids unless `side` is given; a run continuing off the map's bottom edge gets no face); or `null` = leave the cell untouched. Tiles may be ids or catalog names (exact name, else a unique substring — unknown/ambiguous names are an error). Row lengths, unknown glyphs, names and fit are all validated before anything is written. With `clearUpperLayers` (default true) each painted cell zeroes the tile layers (0-3) above its lowest specified layer that it does not specify, so stale objects vanish (`[]` erases the cell). Autotiling is recomputed once per layer, as in paint_tiles. Returns cells painted per layer, cleared count, wall faces made, and a passability overview of the rectangle, judged like the engine's canPass (a step needs the source to allow leaving and the target to allow entry): `rows` with `#` = impassable — a cell with no walkable direction (face, water, solid object) or part of a region whose own edge flags refuse entry from the walkable cells around it (an A4 wall-top mass, a stair-less plateau) — and `.` = walkable ground, plus the impassable [x, y] cells. Stamp multi-tile B/C objects afterwards with place_object.

NameTypeReqDescription
clearUpperLayersboolean–Zero the tile layers above each cell's lowest specified layer that it does not specify (default true)
dryRunboolean–Preview only: return a diff of what would change without writing to disk.
legendobjectyesGlyph → cell contents (see the tool description for the value forms)
mapIdintegeryesThe ID of the map
originarray–[x, y] map position of the blueprint's top-left cell (default [0, 0])
rowsarrayyesBlueprint rows, top to bottom; every row the same length, one glyph per cell

No output schema declared.

No examples provided.

paint_tiles ~190

Paint specific tiles onto a map, with automatic autotiling. Each cell is set to its tile id; if that id is an autotile (A1-A4, e.g. a catalog 'kind' base from find_tile), its shape and its neighbours' shapes are recomputed from same-kind adjacency so borders/corners line up. Flat tiles are painted as-is. Defaults to the lower ground layer (0). Higher-level than set_map_tile, which is a single raw tile with no autotiling.

NameTypeReqDescription
dryRunboolean–Preview only: return a diff of what would change without writing to disk.
layerinteger–Z-layer 0-5 (default 0 = lower ground; 0-3 tiles, 4 shadow, 5 region id)
mapIdintegeryesThe ID of the map
tilesarrayyesCells to paint

No output schema declared.

No examples provided.

place_object ~318

Place a multi-tile B/C object (a house, tree, fountain, …) on a map and report its passability. `tiles` is the object's block of flat tile ids as rows (top to bottom), each row left to right; a 0 leaves that cell untouched so L-shaped/irregular objects work. Stamped onto the upper tile layer (2) by default so it draws over the ground. Unlike paint_tiles this does NOT autotile (objects are flat sheet tiles) — instead it uses the tileset flags to warn when a footprint cell sits on impassable terrain or overwrites an existing tile, and returns the resulting per-cell passability plus the `collision` cells the object turns into a solid obstacle. Warn-by-default: never refuses a placement. Get tile ids from find_tile/get_tile_catalog.

NameTypeReqDescription
dryRunboolean–Preview only: return a diff of what would change without writing to disk.
layerinteger–Z-layer 0-3 to stamp onto (default 2 = upper tile layer, drawn over the ground)
mapIdintegeryesThe ID of the map
tilesarrayyesThe object as a rectangular grid of tile ids: rows top→bottom, each row left→right. 0 = a transparent cell (left untouched).
xintegeryesLeft (top-left) tile x of where the object is placed
yintegeryesTop (top-left) tile y of where the object is placed

No output schema declared.

No examples provided.

render_map ~398

Screenshot a map as the game actually draws it: boots the project headless, starts a new game on the map, and saves a PNG. Validators prove structure, not looks — use this to catch wrong wall/autotile kinds, void (unbased transparent tiles), odd sprites or missing images. Default renders the WHOLE map (canvas resized to width×height×48px, player hidden, autorun/parallel events frozen, map-name banner off); pass x+y for a normal 816×624 game-screen view centred on that tile. Returns the PNG path plus `problems` — console errors, page errors and HTTP 404s (missing assets — a missing image is drawn blank instead of stopping the engine on its load-error retry screen). Read-only. Needs the optional dependency playwright-core and a Chromium from the Playwright cache (`npx playwright install chromium-headless-shell`) or the RPGMAKER_MCP_CHROMIUM env var.

NameTypeReqDescription
inlineboolean–Also return the PNG(s) as image content in the response (default false: paths only — read the file to view it).
mapIdintegeryesMap to render.
outstring–Output .png path, or a directory. Default: <os tmpdir>/rpgmaker-mz-mcp/renders.
runEventsboolean–Let autorun/parallel events run before the shot (default false: resting map).
showEventsboolean–Draw event sprites (default true). false = bare tiles only.
showPlayerboolean–Draw the player (default: hidden for a whole-map render, shown for a view).
switchesarray–Switch ids to turn ON first, to see event pages of a later story state.
xinteger–With y: render a normal screen view centred on this tile instead of the whole map.
yinteger––

No output schema declared.

No examples provided.

reset_table ~313

Clear a whole database table (actor, class, skill, item, weapon, armor, enemy, troop, state, or common_event) except the ids in `keep` — e.g. reset_table('skill', { keep: [1, 2] }) wipes the RTP skills but keeps Attack/Guard, the usual first step before authoring your own database with batch_create. Kept records stay at their own id; the rest become null and trailing empty slots are trimmed (the table is [null] when nothing is kept). Like delete_record it REFUSES, writing nothing, when the removal would leave references dangling (map events giving removed items, troops of removed enemies, …) unless force: true; use dryRun: true first to see what disappears and what would break. Returns { type, kept[], removedCount, removed[], referenceCount, references[], coverage } (lists are capped at 100).

NameTypeReqDescription
dryRunboolean–Preview only: return a diff of what would change without writing to disk.
forceboolean–Write even if validation finds structural problems (wrong parameter count, unterminated command list). Off by default: such a write is refused and nothing is written. Advisory warnings never block re…
keeparray–Ids to keep (each must exist); omitted = remove every record
typestringyesWhich database table: actor, class, skill, item, weapon, armor, enemy, troop, state, or common_event

No output schema declared.

No examples provided.

resize_map ~210

Resize a map to new width/height, safely repadding every z-layer of its tile data (existing tiles kept where the old and new grids overlap; new cells blank; shrinking crops). This is the ONLY safe way to change a map's dimensions — update_map refuses a width/height change because it would not resize the tile array. Warns about any event left outside the new bounds.

NameTypeReqDescription
dryRunboolean–Preview only: return a diff of what would change without writing to disk.
heightintegeryesNew height in tiles
mapIdintegeryesThe ID of the map to resize
verboseboolean–Echo the full written record instead of the default summary. Off by default: the response reports identity, counts and command-list shape, which is what you would assert on, and omits the parameters/…
widthintegeryesNew width in tiles

No output schema declared.

No examples provided.

run_playtest ~794

Play the game headless from a script of steps and report what happened — the runtime check validators cannot do (does the door transfer, does the NPC say the right thing, does the choice branch, is there an invisible wall). One browser session runs the whole script; each step reports its outcome and the run stops at the first failing step. Steps: `load` {mapId,x,y,direction?,party?,level?,gold?,switches?,variables?,selfSwitches?,items?,equip?,encounters?} starts a fresh game there (random encounters off unless encounters:true); `startEvent` {eventId} starts a map event as if triggered and lets it run until it shows text or goes idle (waiting out any transfer — reported as `transferredTo`); `advanceText` {maxMs?} presses OK until the event is idle, STOPPING at an open choice list/battle — returns the map message `lines` shown and any open choices (text shown during a battle comes back separately as `battleLines`); `choose` {index} picks a 0-based choice; `walk` {direction, steps?} walks tile by tile, reporting where it ended (`to`); if a tile refused entry, `stoppedAt` (the player's tile) and `blockedTile` (the refused one); when a step fires a touch event (a door) it stops, waits out the transfer and reports `transferredTo` {mapId,x,y}, plus `eventRunning`/`messageOpen` if the event is still going; `press` {button, times?}; `wait` {ms}; `autoBattle` {troopId?, canEscape?, canLose?, maxMs? (default 60000)} fights (a started or new battle) on auto AI until it ends, returning the battle's message `lines` (troop events, victory text). Battles are fast-forwarded (20 engine frames per drawn frame: same logic, same odds, a 10-turn boss fight in seconds) unless the run sets realtime: true; `screenshot` {name?} saves a PNG; `eval` {script} evaluates a JS expression in the game page and returns its value (e.g. "$gameSwitches.value(3)"). Reported text reads as the message window shows it: \V[n]/\N[n]/\P[n]/\G expanded, control codes (\C[n], \I[n], \., \| …) removed. Every ste…

NameTypeReqDescription
inlineboolean–Also return the PNG(s) as image content in the response (default false: paths only — read the file to view it).
outstring–Directory for screenshot PNGs. Default: <os tmpdir>/rpgmaker-mz-mcp/renders.
realtimeboolean–Play battles at real-time speed (default false: battles are fast-forwarded). Real time takes ~10-20x longer — raise autoBattle maxMs to match.
stepsarrayyesThe script, run in order.

No output schema declared.

No examples provided.

scan_plugins ~209

Discover the plugin commands this project actually has, by parsing the @command/@arg annotations in js/plugins/*.js and the enabled/disabled state in js/plugins.js. Use it to find out what create_plugin_command can call and with which args — it reports every command's key, label, description and args (name/type/default), plus whether the plugin is enabled in the editor's Plugin Manager (a disabled plugin's commands never run). create_plugin_command validates against this scan automatically, so you don't need to call this first; it's for discovery. Pass pluginName to narrow to one plugin, or enabledOnly:true to skip plugins that are installed but switched off. Read-only. NOTE: MZ has no 'required argument' annotation, so scanned args are checked for unknown names only, never for missing ones.

NameTypeReqDescription
enabledOnlyboolean–Only report plugins enabled in js/plugins.js (default false)
pluginNamestring–Optional: restrict to one plugin (its filename without .js)

No output schema declared.

No examples provided.

search_actors ~30

Search actors by name or nickname

NameTypeReqDescription
searchTermstringyesThe search term to find actors

No output schema declared.

No examples provided.

search_enemies ~32

Search enemies by name (case-insensitive)

NameTypeReqDescription
searchTermstringyesThe search term to find enemies

No output schema declared.

No examples provided.

search_items ~29

Search items by name or description

NameTypeReqDescription
searchTermstringyesThe search term to find items

No output schema declared.

No examples provided.

search_map_events ~44

Search events on a map by name

NameTypeReqDescription
mapIdintegeryesThe ID of the map
searchTermstringyesThe search term to find events

No output schema declared.

No examples provided.

search_skills ~26

Search skills by name or description

NameTypeReqDescription
searchTermstringyesSearch term

No output schema declared.

No examples provided.

Install

How do I install the io.github.Redseb/rpgmaker-mz-mcp server?

io.github.Redseb/rpgmaker-mz-mcp runs locally as an npm package, launched with npx -y rpgmaker-mz-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-mz-mcp

# add to Claude Code
claude mcp add redseb-rpgmaker-mz-mcp -- npx -y rpgmaker-mz-mcp
Common questions

What is the io.github.Redseb/rpgmaker-mz-mcp server?

io.github.Redseb/rpgmaker-mz-mcp is listed in the public MCP registry as io.github.Redseb/rpgmaker-mz-mcp. MCP server for RPG Maker MZ: maps, tile painting, events, database editing, and validation. This page covers its npm package (rpgmaker-mz-mcp).

Is the io.github.Redseb/rpgmaker-mz-mcp server safe to use?

io.github.Redseb/rpgmaker-mz-mcp scores 81 out of 100 on VerifyMCP. We found no known CVEs affecting 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 io.github.Redseb/rpgmaker-mz-mcp server expose?

io.github.Redseb/rpgmaker-mz-mcp exposes 128 tools: get_project, set_project, update_actor, create_actor, search_actors, and 123 more. Their descriptions and schemas cost roughly 24,829 tokens of context every time the server is loaded.

Is the io.github.Redseb/rpgmaker-mz-mcp server still maintained?

io.github.Redseb/rpgmaker-mz-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 io.github.Redseb/rpgmaker-mz-mcp server under?

io.github.Redseb/rpgmaker-mz-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.