rpgmaker-mv-mcp — independently scanned and version-tracked by SaferSkills.
SaferSkills independently audited rpgmaker-mv-mcp (Agent Skill) and scored it 100/100 (green). The audit ran 55 deterministic rules across Security, Supply Chain, Maintenance, Transparency, and Community; it found 0 high-severity and 0 lower-severity findings. The full rule-by-rule trace and per-finding evidence are below. Free, methodology-open.
Findings & checks · 0 flagged
Every scanned point with the score it earned and what moved between them.
First recorded scan — no prior version to compare against.
The primary manifest — the file an agent reads to learn what this artifact does.
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.
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.
full) — ALWAYS first. Returns every database id+name, switch/variable names, starting position, and the sprite filenames available per img/ folder. This is your source of truth; read it before creating anything.generate_map (default mode:"procedural", which is knowledge-driven):theme (town, village, forest, dungeon, cave, world, interior, castle, beach, desert, snow, …) and omit tilesetId — 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.get_project_context detail:"templates", then generate_map mode:"template" templateId:<id> (or pass templateId in procedural mode to force that one). Force pure procedural generation with useTemplate:false. Same seed + params → the same map.town/village auto-create enterable house interiors with two-way warps (returned in interiorMapIds); opt out with enterableHouses:false.edit_map action:"connect" (bidirectional) or manage_map_event preset:"door" / "teleport".manage_map_event presets (each builds a complete, working event):npc {dialogues[], characterName?, characterIndex?} — characterName must be a real sprite from get_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.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.manage_system for title, switch/variable names, and set_starting_position (validate the map exists first).Three things are required — generation does them for you, but if you do it by hand:
create_database_entry entity:"enemies" (or preset boss_enemy). The MCP assigns a real battler sprite automatically.create_database_entry preset:"encounter_troop" {enemyIds:[…]}.edit_map action:"set_encounters" {mapId, encounters:[{troopId, weight?}]}. Without this, walking triggers no battles. generate_map does this automatically for dungeon/cave/world/fortress/sewer/volcano.!Chest (with the !), doors !Door1, etc. Use names from get_project_context; the MCP auto-corrects/blanks unknown ones, so prefer letting presets/generation choose.get_project_context detail:"tileset"/"assets", and prefer generate_map/edit_map fill_layer over manual placement.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> }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.python3 -m http.server) and open index.html in a browser; move with arrow keys, confirm/cancel with z/x.~30 seconds. Free. No account. Every finding cites a rule and a line of evidence.