Driving the RPG Maker MV MCP correctly
SkillDatabases & dataUse when building, editing or reasoning about an RPG Maker MV game through the RpgMakerMVUltimate MCP server (tools prefixed rpgmaker_* / the 13 consolidated tools: query_database, create_database_entry, generate_map, manage_map_event, analyze_project, etc.). Covers the correct workflow so maps, NPCs, chests, shops, doors, enemies and battles actually work in-engine, plus analyze_project to understand/validate/critique a project. Trigger: RPG Maker MV, RPGMV, generate map, town/dungeon, troops/encounters, events, tilesets, validate project, why doesn't this work, ProjectR.
Available today. Use it from your connected AI after setup.
No other account needed.
Connect ahel once, and every AI you use reads what you have installed.
Then ask your AI: use the Driving the RPG Maker MV MCP correctly skill
What this skill tells your AI
The instructions your AI receives, as published by diegolopez0208/rpgmakermvultimate-mcp in skill/rpgmaker-mv-mcp/SKILL.md and read by ahel’s review.
This MCP edits a real RPG Maker MV project on disk (data/*.json, validated against the actual engine). It is powerful but the engine is unforgiving: a wrong tile ID, a sprite that doesn't exist, or a missing field crashes the game. Follow this workflow and you produce coherent, playable content; ignore it and you produce "random tiles everywhere" and Loading-Error crashes.
The one rule that prevents 90% of bad output
Do NOT hand-paint tiles or place objects one tile at a time, and never invent IDs. Build maps with generate_map and add content with the manage_map_event presets. generate_map is knowledge-driven: for most themes it clones a real hand-authored reference map from the 106 bundled templates (real multi-tile houses, walls, furniture) instead of painting tiles procedurally, so the output looks like a real RPG Maker map and only uses IDs that exist. When you do need an ID (tile, sprite, troop, skill, item), get it from get_project_context — never guess.
Standard workflow
get_project_context(detailfull) — ALWAYS first. Returns every database id+name, switch/variable names, starting position, and the sprite filenames available perimg/folder. This is your source of truth; read it before creating anything.- Build the world with
generate_map(defaultmode:"procedural", which is knowledge-driven):- Pick a
theme(town, village, forest, dungeon, cave, world, interior, castle, beach, desert, snow, …) and omittilesetId— it auto-selects the right tileset. For themes with a bundled reference map (town, village, dungeon, interior, castle, world, …) it clones a real hand-authored map from the knowledge base, adapted to your tilesets; for themes without one (beach, swamp, desert) it generates procedurally. Combat themes auto-wire random encounters from existing troops. - Want a specific reference map? List them with
get_project_context detail:"templates", thengenerate_map mode:"template" templateId:<id>(or passtemplateIdin procedural mode to force that one). Force pure procedural generation withuseTemplate:false. Sameseed+ params → the same map. town/villageauto-create enterable house interiors with two-way warps (returned ininteriorMapIds); opt out withenterableHouses:false.- To connect maps, use
edit_map action:"connect"(bidirectional) ormanage_map_event preset:"door"/"teleport".
- Pick a
- Populate with
manage_map_eventpresets (each builds a complete, working event):npc{dialogues[], characterName?, characterIndex?}— characterName must be a real sprite fromget_project_context(e.g.People1); omit for invisible.chest{items:[{type:item|weapon|armor,id,amount}]}— IDs must exist (check first).shop{goods:[[type,id,priceType,price]]},inn{cost},boss{troopId},teleport/door{destMapId,destX,destY},puzzle_switch.
- Database via
create_database_entry/update_database_entry/query_database(entity = actors/classes/skills/items/weapons/armors/enemies/states/troops/common_events). Presets exist for skills (damage_skill,healing_skill, …),boss_enemy,encounter_troop. - System:
manage_systemfor title, switch/variable names, andset_starting_position(validate the map exists first).
Making enemies actually appear and work
Three things are required — generation does them for you, but if you do it by hand:
- Enemies exist and are visible:
create_database_entry entity:"enemies"(or presetboss_enemy). The MCP assigns a real battler sprite automatically. - A troop with members:
create_database_entry preset:"encounter_troop" {enemyIds:[…]}. - Random encounters on the map:
edit_map action:"set_encounters" {mapId, encounters:[{troopId, weight?}]}. Without this, walking triggers no battles.generate_mapdoes this automatically for dungeon/cave/world/fortress/sewer/volcano.
Things that crash the game (the MCP guards these, don't fight it)
- Sprites that don't exist → fatal "Loading Error". Chest sprite is
!Chest(with the!), doors!Door1, etc. Use names fromget_project_context; the MCP auto-corrects/blanks unknown ones, so prefer letting presets/generation choose. - Guessed tile IDs → glitched/water maps. Only use tile IDs from
get_project_context detail:"tileset"/"assets", and prefergenerate_map/edit_map fill_layerover manual placement. - Class params must be 8 stat curves; pass 8 seed values and the MCP expands them — never write a flat array.
Worked examples
A starting town with enterable houses, a shop and a guide NPC:
get_project_context
generate_map { mode:"procedural", theme:"town", name:"Riverbend", width:40, height:30 } // returns mapId + interiorMapIds
manage_map_event { action:"create", preset:"shop", mapId:<id>, x:12, y:10, goods:[[0,1,0,0]] }
manage_map_event { action:"create", preset:"npc", mapId:<id>, x:15, y:12, name:"Guide", dialogues:["Welcome!"], characterName:"People1", characterIndex:0 }
manage_system { action:"set_starting_position", mapId:<id>, x:20, y:20 }
A dungeon with real battles and loot:
create_database_entry { entity:"enemies", data:{ name:"Cave Bat", params:[80,0,12,8,8,8,12,10] } } // id 1, gets a battler
create_database_entry { preset:"encounter_troop", data:{ name:"Bats", enemyIds:[1,1] } } // troop id
generate_map { mode:"procedural", theme:"dungeon", name:"Shadow Depths", width:40, height:30 } // auto-wires encounters
manage_map_event { action:"create", preset:"chest", mapId:<id>, x:8, y:8, items:[{type:"item",id:1,amount:2}] }
manage_map_event { action:"create", preset:"boss", mapId:<id>, x:30, y:6, troopId:<troopId> }
Verify your work
query_map { view:"ascii", mapId }renders the map offline as a character grid — the cheapest way to "see" a layout.query_map { view:"validate", mapId }lints for broken tiles / transfers.- For a real visual check, run the game from the project root with a static server (
python3 -m http.server) and openindex.htmlin a browser; move with arrow keys, confirm/cancel withz/x.
Signals
- GitHub stars
- 25
- Forks
- 3
- Last commit
- Sep 2026
Advanced
- Catalog kind
- skill
- Gateway key
rpgmaker-mv-mcp- Source
- github.com/diegolopez0208/rpgmakermvultimate-mcp