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
Last scanned (8 hours ago)
Scores higher than 69% of npm servers
Category Developer Tools
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
- Source repository is publicly reachable at the declared URL. View diagnostics → Pass
- Provenance check failed: no build-provenance attestation is published. See how to fix → View diagnostics → Fail
- Clear OSI-approved license (MIT).Pass
- Actively maintained (last published 40 days ago).Pass
- Disclosure check failed: no security disclosure policy was found in the source repository. See how to fix → Fail
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
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
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 →
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 →
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.
| Name | Type | Req | Description |
|---|---|---|---|
| characterIndex | integer | – | Sprite index 0-7 in the sheet |
| characterName | string | – | Optional sprite basename (a doormat is normally left invisible) |
| direction | string | – | Facing after the transfer; default "retain" |
| dryRun | boolean | – | Preview only: return a diff of what would change without writing to disk. |
| fade | string | – | Screen fade during the transfer; default "black" |
| force | boolean | – | 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… |
| idiom | string | – | action_button = face a solid landmark and press (priority same, default); player_touch = walk onto a doormat (priority below) |
| mapId | integer | yes | The ID of the map the trigger is placed on |
| name | string | – | Event name (editor label); default "Transfer" |
| targetMapId | integer | yes | The ID of the destination map |
| targetX | integer | yes | X tile the player lands on |
| targetY | integer | yes | Y tile the player lands on |
| x | integer | yes | X tile position of the trigger |
| y | integer | yes | Y 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.
| Name | Type | Req | Description |
|---|---|---|---|
| dryRun | boolean | – | Preview only: return a diff of what would change without writing to disk. |
| force | boolean | – | 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… |
| members | array | – | Placed enemies; each references an existing enemyId |
| name | string | yes | Troop name shown in the database |
| pages | array | – | Battle-event pages { conditions, list, span }; defaults to one blank page |
| verbose | boolean | – | 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.
| Name | Type | Req | Description |
|---|---|---|---|
| animationId | integer | – | Attack animation id |
| description | string | – | In-game description text |
| dryRun | boolean | – | Preview only: return a diff of what would change without writing to disk. |
| iconIndex | integer | – | Icon index (IconSet.png) |
| name | string | yes | Weapon name |
| note | string | – | Note field |
| params | array | – | 8 flat stat bonuses [maxHP, maxMP, atk, def, mat, mdf, agi, luk] |
| price | integer | – | Buy price |
| traits | array | – | Trait objects { code, dataId, value } |
| wtypeId | integer | – | 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.
| Name | Type | Req | Description |
|---|---|---|---|
| dryRun | boolean | – | Preview only: return a diff of what would change without writing to disk. |
| mapId | integer | yes | The 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
| Name | Type | Req | Description |
|---|---|---|---|
| dryRun | boolean | – | Preview only: return a diff of what would change without writing to disk. |
| eventId | integer | yes | The ID of the event |
| mapId | integer | yes | The 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 }.
| Name | Type | Req | Description |
|---|---|---|---|
| dryRun | boolean | – | Preview only: return a diff of what would change without writing to disk. |
| force | boolean | – | 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… |
| id | integer | yes | The id of the record to delete |
| type | string | yes | Which 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`.
| Name | Type | Req | Description |
|---|---|---|---|
| tileId | integer | yes | The raw tile id to decode |
| tilesetId | integer | – | 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.
| Name | Type | Req | Description |
|---|---|---|---|
| outDir | string | yes | Folder 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. |
| prune | boolean | – | 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. |
| zip | boolean | – | 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.
| Name | Type | Req | Description |
|---|---|---|---|
| dryRun | boolean | – | Preview only: return a diff of what would change without writing to disk. |
| height | integer | yes | Rectangle height in tiles |
| layer | integer | – | Z-layer 0-5 (default 0 = lower ground; 5 = region id) |
| mapId | integer | yes | The ID of the map |
| tileId | integer | yes | Tile id to fill with (autotile base or raw) |
| width | integer | yes | Rectangle width in tiles |
| x | integer | yes | Left tile position of the rectangle |
| y | integer | yes | Top 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.
| Name | Type | Req | Description |
|---|---|---|---|
| query | string | yes | Substring to match, e.g. 'grass' or 'forest' (literal substring, no synonyms) |
| searchDescriptions | boolean | – | Also match project-catalog tile descriptions, not just names (default false — names only) |
| tilesetId | integer | yes | Tileset 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.
| Name | Type | Req | Description |
|---|---|---|---|
| id | integer | – | Return just this record (null if missing); omitted = the whole table |
| type | string | yes | Which 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.
| Name | Type | Req | Description |
|---|---|---|---|
| includeData | boolean | – | 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. |
| mapId | integer | yes | The 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
| Name | Type | Req | Description |
|---|---|---|---|
| mapId | integer | yes | The ID of the map |
No output schema declared.
No examples provided.
get_map_event ~43
Get a specific event from a map
| Name | Type | Req | Description |
|---|---|---|---|
| eventId | integer | yes | The ID of the event |
| mapId | integer | yes | The ID of the map |
No output schema declared.
No examples provided.
get_map_events ~30
Get all events from a specific map
| Name | Type | Req | Description |
|---|---|---|---|
| mapId | integer | yes | The 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).
| Name | Type | Req | Description |
|---|---|---|---|
| height | integer | yes | Window height in tiles |
| layer | integer | – | Z-layer 0-5 (0-1 lower, 2-3 upper, 4 shadow, 5 region); default 0 |
| mapId | integer | yes | The ID of the map |
| width | integer | yes | Window width in tiles |
| x | integer | yes | Left edge of the window (tile column) |
| y | integer | yes | Top 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.
| Name | Type | Req | Description |
|---|---|---|---|
| sheet | string | – | Restrict to one sheet by filename ('World_A2') or role ('A2'). Omit to get a per-sheet summary (counts only) instead of every entry. |
| tilesetId | integer | yes | Tileset 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 }.
| Name | Type | Req | Description |
|---|---|---|---|
| tileId | integer | yes | The raw tile id whose flags to decode |
| tilesetId | integer | yes | Tileset 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.
| Name | Type | Req | Description |
|---|---|---|---|
| category | string | yes | Which 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.
| Name | Type | Req | Description |
|---|---|---|---|
| commands | array | yes | The event commands to insert (e.g. the `commands` from a build_* tool) |
| commonEventId | integer | – | target "common_event": the common event id |
| dryRun | boolean | – | Preview only: return a diff of what would change without writing to disk. |
| eventId | integer | – | target "map_event": the event id |
| force | boolean | – | 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… |
| mapId | integer | – | target "map_event": the map id |
| pageIndex | integer | – | target "map_event"/"troop_page": zero-based page index |
| position | integer | – | Insertion index; defaults to the end of the list |
| target | string | – | Which command list to insert into (default map_event) |
| troopId | integer | – | target "troop_page": the troop id |
| verbose | boolean | – | 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.
| Name | Type | Req | Description |
|---|---|---|---|
| id | integer | – | Report just this id — whether it is allocated, its label, and every place it is referenced. Omitted = the whole namespace. |
| type | string | yes | Which 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.
| Name | Type | Req | Description |
|---|---|---|---|
| type | string | yes | Asset 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.
| Name | Type | Req | Description |
|---|---|---|---|
| type | string | yes | Which 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.
| Name | Type | Req | Description |
|---|---|---|---|
| pluginName | string | – | 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.
| Name | Type | Req | Description |
|---|---|---|---|
| count | integer | – | How many consecutive free ids to return (default 1) |
| reuseGaps | boolean | – | Fill unallocated holes below the highest id first (default false) |
| type | string | yes | Which 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.
| Name | Type | Req | Description |
|---|---|---|---|
| height | integer | yes | Object height in tiles |
| tilesetId | integer | yes | The tileset id the object belongs to |
| topLeftId | integer | yes | Raw flat tile id of the object's top-left cell (from find_tile/get_tile_catalog) |
| width | integer | yes | Object 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.
| Name | Type | Req | Description |
|---|---|---|---|
| clearUpperLayers | boolean | – | Zero the tile layers above each cell's lowest specified layer that it does not specify (default true) |
| dryRun | boolean | – | Preview only: return a diff of what would change without writing to disk. |
| legend | object | yes | Glyph → cell contents (see the tool description for the value forms) |
| mapId | integer | yes | The ID of the map |
| origin | array | – | [x, y] map position of the blueprint's top-left cell (default [0, 0]) |
| rows | array | yes | Blueprint 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.
| Name | Type | Req | Description |
|---|---|---|---|
| dryRun | boolean | – | Preview only: return a diff of what would change without writing to disk. |
| layer | integer | – | Z-layer 0-5 (default 0 = lower ground; 0-3 tiles, 4 shadow, 5 region id) |
| mapId | integer | yes | The ID of the map |
| tiles | array | yes | Cells 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.
| Name | Type | Req | Description |
|---|---|---|---|
| dryRun | boolean | – | Preview only: return a diff of what would change without writing to disk. |
| layer | integer | – | Z-layer 0-3 to stamp onto (default 2 = upper tile layer, drawn over the ground) |
| mapId | integer | yes | The ID of the map |
| tiles | array | yes | The object as a rectangular grid of tile ids: rows top→bottom, each row left→right. 0 = a transparent cell (left untouched). |
| x | integer | yes | Left (top-left) tile x of where the object is placed |
| y | integer | yes | Top (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.
| Name | Type | Req | Description |
|---|---|---|---|
| inline | boolean | – | Also return the PNG(s) as image content in the response (default false: paths only — read the file to view it). |
| mapId | integer | yes | Map to render. |
| out | string | – | Output .png path, or a directory. Default: <os tmpdir>/rpgmaker-mz-mcp/renders. |
| runEvents | boolean | – | Let autorun/parallel events run before the shot (default false: resting map). |
| showEvents | boolean | – | Draw event sprites (default true). false = bare tiles only. |
| showPlayer | boolean | – | Draw the player (default: hidden for a whole-map render, shown for a view). |
| switches | array | – | Switch ids to turn ON first, to see event pages of a later story state. |
| x | integer | – | With y: render a normal screen view centred on this tile instead of the whole map. |
| y | integer | – | – |
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).
| Name | Type | Req | Description |
|---|---|---|---|
| dryRun | boolean | – | Preview only: return a diff of what would change without writing to disk. |
| force | boolean | – | 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… |
| keep | array | – | Ids to keep (each must exist); omitted = remove every record |
| type | string | yes | Which 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.
| Name | Type | Req | Description |
|---|---|---|---|
| dryRun | boolean | – | Preview only: return a diff of what would change without writing to disk. |
| height | integer | yes | New height in tiles |
| mapId | integer | yes | The ID of the map to resize |
| verbose | boolean | – | 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/… |
| width | integer | yes | New 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…
| Name | Type | Req | Description |
|---|---|---|---|
| inline | boolean | – | Also return the PNG(s) as image content in the response (default false: paths only — read the file to view it). |
| out | string | – | Directory for screenshot PNGs. Default: <os tmpdir>/rpgmaker-mz-mcp/renders. |
| realtime | boolean | – | Play battles at real-time speed (default false: battles are fast-forwarded). Real time takes ~10-20x longer — raise autoBattle maxMs to match. |
| steps | array | yes | The 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.
| Name | Type | Req | Description |
|---|---|---|---|
| enabledOnly | boolean | – | Only report plugins enabled in js/plugins.js (default false) |
| pluginName | string | – | 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
| Name | Type | Req | Description |
|---|---|---|---|
| searchTerm | string | yes | The search term to find actors |
No output schema declared.
No examples provided.
search_enemies ~32
Search enemies by name (case-insensitive)
| Name | Type | Req | Description |
|---|---|---|---|
| searchTerm | string | yes | The search term to find enemies |
No output schema declared.
No examples provided.
search_items ~29
Search items by name or description
| Name | Type | Req | Description |
|---|---|---|---|
| searchTerm | string | yes | The search term to find items |
No output schema declared.
No examples provided.
search_map_events ~44
Search events on a map by name
| Name | Type | Req | Description |
|---|---|---|---|
| mapId | integer | yes | The ID of the map |
| searchTerm | string | yes | The search term to find events |
No output schema declared.
No examples provided.
search_skills ~26
Search skills by name or description
| Name | Type | Req | Description |
|---|---|---|---|
| searchTerm | string | yes | Search term |
No output schema declared.
No examples provided.
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
claude mcp add redseb-rpgmaker-mz-mcp -- npx -y rpgmaker-mz-mcp
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.