RPG Maker MV Copilot MCP
This MCP server lets an AI agent inspect, edit, validate, generate, and playtest a real RPG Maker MV project on disk through 18 consolidated tools.
Build and insert validated MV event commands into map events, common events, and troop battle pages.
Query, create, update, and delete database entries (actors, classes, skills, items, weapons, armors, enemies, states, troops, tilesets, common events, animations).
Inspect maps, generate new maps (blank/themed/procedural/template/semantic/batch/duplicate), edit tiles, connect maps, set encounters, and manage map events with presets (NPC, chest, door, shop, inn, boss, puzzle switch).
Manage project settings: title, switch/variable names, starting position, backups, plugin creation, project scaffolding, and HTML5 export.
Run live playtests via the bridge: install plugin, start/stop bridge, stream telemetry, send safe commands, take screenshots, and record video.
Run headless playtest scripts with load, event interaction, text advance, choices, walking, battles, screenshots, and eval steps.
Analyze the project offline: overview, validation, graph, usage, explain, AST, plugins, critique, metrics, balance, refactor, and search.
Get project context (database IDs, switches/variables, assets, tilesets, templates), switch project paths, and optionally analyze images with a Vision API or offline grid/color tools.
Enables AI-driven analysis of project images (tilesets, screenshots, etc.) using NVIDIA's vision models via the analyze_screenshot tool.
Enables AI-driven analysis of project images (tilesets, screenshots, etc.) using Ollama's vision models via the analyze_screenshot tool.
Enables AI-driven analysis of project images (tilesets, screenshots, etc.) using OpenAI's vision models via the analyze_screenshot tool.
๐ฎ RPG Maker MV Copilot MCP
Find why an MV event never fires โ then verify the fix in the real engine
30-second silent workflow: a visual replay of verified MCP calls and a real MV 1.6.1 playtest. Inspect the evidence.
Quick start ยท First useful result ยท Map generation ยท Live bridge ยท Intelligence ยท Tools
A Model Context Protocol server that lets an AI agent inspect and edit a real RPG Maker MV project on disk through 18 consolidated tools. Find broken references and switch conditions, build events with MV-compatible commands, and run repeatable playtests. Generated data still needs validation in your game's tilesets and plugins.
It does three things that are usually missing:
๐๏ธ Builds | Generates maps that look hand-made, wires events from presets, and edits every database with real IDs instead of invented ones. |
๐ง Understands | Reads the whole project and answers why the door never opens, which map nobody can reach, which skill breaks the game. |
๐ Watches | Runs the game and reports back: exceptions, player position, screenshots โ and reloads a map you just edited without losing the save. |
โก Quick start
Install Node.js 20.19.0 or newer, and close the MV editor before asking the agent to edit project files. Start with a copy of your project.
For containers and directory hosting, see Docker and Glama build configuration.
Windows x64 MCPB bundle: download v5.21.0 for a compatible MCPB client. See bundle requirements and verification. The npm setup below works across supported operating systems.
Find the project on itch.io and Smithery.
Check the environment before adding the server (PowerShell on Windows):
npx.cmd -y rpgmaker-mv-mcp --doctor "C:/path/to/your/RPGMakerMV/project"coreReady: true means Node and System data checks pass. headlessReady: true additionally means Playwright and Chromium are available. The check does not start a browser or certify assets/plugins. Bridge warnings do not block offline queries. Missing Chromium: run npx.cmd playwright install chromium-headless-shell, or set RPGMAKER_MCP_CHROMIUM to your Chrome executable.
1 โ Add it to your MCP client. No clone needed; the package ships an executable.
Configuration
{
"mcpServers": {
"rpgmaker-mv": {
"command": "npx",
"args": ["-y", "rpgmaker-mv-mcp"],
"env": {
"RPGMAKER_PROJECT_PATH": "C:/path/to/your/RPGMakerMV/project"
}
}
}
}# Claude Code, user scope
claude mcp add rpgmaker --scope user \
--env RPGMAKER_PROJECT_PATH="C:/path/to/project" \
-- npx -y rpgmaker-mv-mcp# From source
git clone https://github.com/DiegoLopez0208/RpgMakerMVUltimate-MCP
cd RpgMakerMVUltimate-MCP
npm install && npm run build
RPGMAKER_PROJECT_PATH=/path/to/your/project npm startMCP clients load tool definitions once at startup, so restart the client after adding or upgrading the server.
2 โ Point it at a project. RPGMAKER_PROJECT_PATH is the folder containing data/, js/ and index.html. The server starts without it; call set_project_path at runtime instead if you prefer.
3 โ Let the agent look around first.
get_project_context { detail: "full" } โ what exists, with real IDs
analyze_project { view: "overview" } โ health, counts, unreachable mapsWorks with Claude Desktop, Claude Code, opencode, and any MCP-compatible client.
For Codex CLI, use codex mcp add rpgmaker --env RPGMAKER_PROJECT_PATH=C:/path/to/project -- npx -y rpgmaker-mv-mcp. In Windows clients that cannot launch npx, use the command cmd with arguments ["/c", "npx", "-y", "rpgmaker-mv-mcp"]. Restart the client, then try the three first-result recipes.
Related MCP server: RPG Maker MZ MCP Server
๐งญ What it does
flowchart LR
A["๐ค Agent"] -->|"generate_map ยท manage_map_event"| B["๐ Project on disk"]
B -->|"validate ยท balance ยท metrics"| A
B -->|"playtest"| C["๐ฎ Running game"]
C -->|"exceptions ยท position ยท screenshots"| A
A -->|"reload_map"| CThe bottom half of that loop is what the bridge adds. Before it, the agent wrote files and hoped.
๐บ๏ธ Map generation
Two paths, both behind generate_map. Pick by whether your project uses RTP art.
|
| |
How | Clones a hand-authored map from the 106 bundled RTP templates, closest size first | Lays out a mission graph, then paints it through a tileset profile |
Looks like | Real multi-tile buildings, walls, furniture | Rooms and corridors shaped by what the space is for |
Tilesets | RTP, or close to it | Any โ DLC, itch.io, custom |
Guarantees | Same | Same |
The knowledge-driven path
{ "mode": "procedural", "theme": "town", "name": "Riverbend", "width": 40, "height": 30 }Themes with a matching template โ town, village, dungeon, interior, castle, world and more โ clone a real map instead of painting tile noise. Themes without one (beach, swamp, desertโฆ) fall back to Perlin terrain, BSP dungeons and cellular caves. Combat themes auto-wire random encounters from your existing troops; town and village auto-create enterable house interiors with two-way warps.
Themes ยท
foresttownvillagecastledungeoncavebeachdesertswampruinsinteriorsnowharborvolcanosewerfortressmagic_forestmagic_interiorspace_interiorspace_exteriorworld
Other modes: blank (empty canvas), themed (simple layout), template (one specific bundled map), batch (many at once), duplicate (copy an existing map).
The tileset-independent path
The bundled templates are raw MV map JSON, so their tile IDs only mean anything on RTP sheets. Change the tileset and the map turns to noise. semantic keeps the layout abstract until the last moment:
manage_system { action: "mine_templates" } # learn from THIS project
generate_map { mode: "semantic", tilesetId: 5, rooms: 6, seed: 42 }Mining reads every map you already made and derives semantic layouts (ground / wall / water / prop / door, multi-tile props kept whole), a tileset profile naming the concrete tile your project uses for each role, and token adjacency counts. Nothing in the project is modified โ everything lands in
.mcp-cache/.Generating builds the mission first โ entrance โ key โ locked door โ treasure โ boss โ exit, plus side rooms โ as a graph whose edges are the only ways through, then paints it. Because the lock is an edge and the key sits on the entrance side of it, the map is solvable by construction. Autotile shapes are recomputed at the end from the finished neighbourhood, never guessed cell by cell.
The result includes
markersnaming the cell of every mission role, which is where to put events withmanage_map_event.Pass a mined
templateId(e.g."mined-3") to re-materialise one of your own maps onto a different tileset.
๐ The live bridge
playtest on its own is fire-and-forget: the game opens and nothing comes back. The bridge closes the loop.
manage_system { action: "install_bridge_plugin" } # once per project
manage_system { action: "bridge_start" } # opens ws://127.0.0.1:32123
manage_system { action: "playtest" } # the game connects on its own
manage_system { action: "bridge_telemetry", types: ["exception", "log"] }sequenceDiagram
participant A as ๐ค Agent
participant S as ๐ฅ๏ธ MCP server
participant G as ๐ฎ Game (nwjs)
A->>S: edit_map
S->>S: atomic write to Map002.json
A->>S: bridge_command reload_map
S->>G: reload_map
G->>G: reserveTransfer + _needsMapReload
G-->>S: reload_complete
A->>S: take_screenshot
S->>G: capture_screenshot
G-->>S: PNG in base64
S-->>A: path for analyze_image
A->>S: record_video start / stop
S->>G: MediaRecorder on the game canvas
G-->>S: WebM in base64
S-->>A: path for video evidence๐ก Telemetry โ exceptions with stack traces,
console.error/warn, scene changes, player position, which event command is executing (so a hung event can be pinpointed), FPS and heap. Frames are consumed as you read them unless you passpeek.โป๏ธ Hot reload โ
reload_mapre-reads the currentMapXXX.jsonand rebuilds the scene without losing party state: it reserves a transfer to the player's own position with_needsMapReload, the engine's own reload seam, rather than rebuildingSpriteset_Mapby hand.reload_databasere-reads one data file;System.jsonandTilesets.jsonneed a fresh playtest and are refused with an explanation.๐ธ Screenshots โ
take_screenshot { name: "collision-proof" }captures the live playtest through the MCP plugin, saves a timestamped PNG under.mcp-cache/screenshots/, and returns its path for inspection or QA evidence. No shell screenshot command is involved.manage_system { action: "bridge_screenshot" }remains as a compatibility alias.๐ฅ Video evidence โ
record_video { action: "start", name: "npc-dialogue" }begins a silent WebM capture of the live game canvas;record_video { action: "stop" }saves it under.mcp-cache/recordings/and returns its path. Agents can stage repeatable scenes with the allowlistedinteractcommand and fixed-buttonpress_buttoninputโthere is still no arbitrary script orevalcommand.
๐ Security
The plugin returns before anything else runs unless the game is under NW.js and was launched with a
testargument. A deployed build a player double-clicks never reaches the socket code, or evenrequire('fs').It checks every argument rather than only
argv[0]the wayUtils.isOptionValiddoes, becauseplaytestpasses the project path first. So a deployed build deliberately launched with a literaltestargument would get past the guard โ and then find no handshake file, and never connect.The server binds
127.0.0.1only, refuses any upgrade carrying a browserOrigin(cross-site WebSocket hijacking), and requires the session token from.mcp-bridge.jsonโ compared in constant time โ within 5 seconds or the connection is dropped.The command surface is a fixed allowlist with no
evalprimitive.
๐ Project intelligence
analyze_project is read-only and fully offline. It models the whole project once, so an agent can reason about a game it did not build.
View | Answers |
| Call this first. Counts, health summary, maps unreachable from the start |
| Every consistency problem at once โ see below |
| Why does this never happen? e.g. "Switch 12 is gated in 3 places but never set ON" |
| Every event, common event and troop that touches a switch/variable/item, with read-write roles |
| The map transfer network and what is reachable |
| One event's logic as a readable tree |
| What plugins the project uses, their parameters and commands |
| A designer's opinion on one map: dead space, clutter, event spread, monotony |
| The same map measured โ see below |
| Database entries that are out of line with their peers โ see below |
| Command sequences copy-pasted across events, worth extracting into a Common Event |
| Offline Unicode text matching across names, dialogue, descriptions and notes; no synonym or translation expansion |
| The structured digest the other views are built on |
Broken transfers, missing map files, dangling common-event/item/troop references, duplicate IDs, named-but-unused switches and variables, a bad starting position, unreachable maps โ and actor names written into dialogue as \N[id] that do not resolve.
That last one is worth its own sentence: the engine resolves \N[id] at draw time, not from any structural parameter, so a bad id passes every other check and the editor shows nothing wrong. The line just renders in-game with a hole where the name should be, and a player finds it before you do.
Reachability โ flood fill from the real entry point. Walkable tiles the player can never get to, and events with no reachable tile beside them, are softlocks rather than style notes.
Dead space โ the unreachable share of the rectangle, against a band for
expected(interior/dungeon/exterior).Shape โ the walkable area thinned to a one-cell skeleton and read as a graph: endpoints, junctions, cycles, critical path, linearity. Linearity near 1 is a corridor with no choice to make.
Variety โ Shannon entropy over 5ร5 tile windows: the monotonous-floor problem, measured.
Tension โ for maps with random encounters, how many steps the player is from a shop, inn or save point.
A skill dealing 400 damage is fine in a game where everything does, and broken in one where nothing else breaks 60. So each entry is scored on a power metric and compared against the others in its category: damage per MP for skills, gold per point of ATK+MAT for weapons, gold per DEF+MDF for armors, HP per EXP for enemies.
The comparison is leave-one-out โ an entry is judged against statistics it had no hand in creating. Included in its own numbers, a badly broken entry drags the mean toward itself until it stops looking unusual at all.
Damage formulas are parsed, never executed (tokenise โ shunting-yard โ evaluate). One that cannot be read statically is listed under unreadableFormulas rather than scored as zero damage, which would pull every average down and hide the very outliers you were looking for.
Narrow with category, loosen or tighten with thresholdSd (default 2).
When a search returns nothing
Search returns searchMode: "lexical", complete, indexedFiles, skippedFiles and warnings. complete: false means some data could not be read; it does not mean the game contains no matching content. An empty result includes noResultsReason. Use a name or phrase actually present in the project: herrero does not translate into Blacksmith. Unicode names, including Japanese, are supported. A database query for an absent ID can return null; inspect it before using that ID.
Index, overview, validation, graph, usage, explain and refactor also report incomplete input. Unreadable files appear as validation errors.
Offline map inspection
query_map { view: "ascii", mapId }โ render a map as a character grid with event markers. The cheapest way to see a layout and pick coordinates.query_map { view: "validate", mapId }โ lint one map for invalid tile IDs, broken transfers and missing event terminators.
Tools
The server exposes 18 consolidated tools. The legacy aliases are optional.
Tool | Purpose |
| Read-only MV dialogue, choices, conditions, switches, variables, transfers, common-event, flow, and plugin-command builders |
| Validated insertion into map/common/troop event lists, with before/after previews and safe nested boundaries |
| List / get by ID / search any database (actors, classes, skills, items, weapons, armors, enemies, states, troops, tilesets, common events, animations) |
| Create entries, with presets: |
| Partial updates (incl. troops & animations); append commands to common events; add enemies to troops |
| Delete entries with reference-breakage warnings |
| Map tree, full map data, events, single event, lint, offline ASCII render |
| Knowledge-driven, semantic, procedural, blank, themed, template, batch or duplicate |
| Fill tile layers, set display names, organize the map tree, connect two maps, set encounters |
| Create (presets: npc, chest, teleport, door, shop, inn, boss, puzzle_switch), update, convert an NPC into a merchant/inn/sign in place, delete, add commands, bulk-populate |
| Title, switch/variable names, starting position, author a plugin, scaffold an editor-openable project, playtest, open/repair in editor, mine templates, and the live bridge |
| Capture and name a live playtest PNG through the authenticated MCP bridge, or with |
| Play a script of steps headless (load, start an event, read its text, choose, walk, battle, screenshot) and report what happened |
| Start or stop a named live playtest WebM recording through the authenticated MCP bridge |
| The read-only intelligence layer above |
| Project digest, asset index, per-tileset tile IDs, bundled-template catalog |
| Switch projects at runtime |
| Optional Vision-AI image analysis, plus offline tileset grid measurement and quadrant colors |
The 101 fine-grained v4 tool names still work as call aliases. Set RPGMV_LEGACY_TOOLS=1 to advertise them too.
๐ก๏ธ Write safety
For composed event logic, use build_event_commands followed by
insert_event_commands with dryRun:true. The preview includes the exact old and
proposed command lists. See Event command authoring for
the supported kinds, nesting rules, MV-specific differences, and verification.
Atomic. Every write goes to a temp file and is renamed over the target, so an interrupted call can never leave half-written JSON.
Backed up. Rotated timestamped copies under
.mcp-backups/(last N,RPGMV_BACKUP_KEEP, default 10). A backup failure aborts replacement. Writes use unique temporary files and exclusive per-file locks; changes detected since a data read are refused. Close the editor: it does not honor MCP locks, and multi-file operations are not transactions.Previewable. Pass
dryRun: trueto any mutating tool to see exactly what it would write, without touching disk.
โ ๏ธ Close the RPG Maker editor while an agent is working. The editor holds the project in memory and will overwrite changes when it saves.
โ๏ธ Configuration
Variable | Required | Description |
| recommended | The project folder (the one with |
| for playtest | Engine install root, for |
| optional | Loopback port for the live bridge (default |
| optional | Backups kept per file (default |
| optional |
|
| optional | Chromium executable for headless renders and |
| optional | Advertise only some tool groups, e.g. |
| to enable vision | Base URL of an OpenAI-compatible vision endpoint. Unset = vision disabled |
| optional | Bearer token; only sent when set |
| optional | Model name (default |
| optional | Endpoint path (default |
analyze_image { mode: "ai" } sends a project image (tileset, sprite, screenshot, battler) to any OpenAI-compatible endpoint. Nothing is sent anywhere unless you configure it; the grid and colors modes and every other tool work fully offline.
# OpenAI
VISION_API_URL=https://api.openai.com VISION_API_KEY=sk-... VISION_MODEL=gpt-4o npm start
# Ollama (local, no key)
VISION_API_URL=http://localhost:11434 VISION_MODEL=llava npm startWorks with OpenAI, Ollama, LocalAI, NVIDIA NIM, vLLM, LiteLLM, or any OpenAI-compatible proxy.
๐ Agent Skill
A portable Agent Skill teaches any model the crash-free workflow โ build maps with generate_map, add content with manage_map_event presets, never hand-paint tiles or guess IDs. It lives at skill/rpgmaker-mv-mcp/SKILL.md.
# Claude Code / Claude.ai
npx degit DiegoLopez0208/RpgMakerMVUltimate-MCP/skill/rpgmaker-mv-mcp ~/.claude/skills/rpgmaker-mv-mcp
# opencode
npx degit DiegoLopez0208/RpgMakerMVUltimate-MCP/skill/rpgmaker-mv-mcp ~/.opencode/skills/rpgmaker-mv-mcpAlso listed in awesome-claude-skills.
๐ Knowledge base
File | Content |
| Tile ID ranges, autotile formula, sheet descriptions, layer meanings |
| Flag bits, common flags, passage check logic |
| ~140 event command codes with parameter schemas |
| Scope, occasion, hitType, damageType, restriction, and the rest |
| Trait codes 11-64, effect codes 11-45 |
| Full schemas for every MV data type |
|
|
| Index of the 106 bundled reference maps |
| Mined multi-tile object stamps (trees, props) per tileset |
| The 106 RTP reference map JSONs used for template cloning |
๐ง Known limitations & roadmap
Decoration semantics are best-effort in the RTP-template path; rare multi-tile objects may land as single tiles. The mined path keeps multi-tile props whole.
Town and dungeon layouts keep improving โ planned: a central plaza or well as a landmark, houses in rows facing roads, fences and yards, richer road networks, more room variety.
mode: "semantic"currently generates dungeon-shaped missions. Town and open-world mission grammars are next, as is using the mined adjacency counts to decorate rather than only to describe.balancecompares like with like inside a category, so a boss will legitimately look like an outlier next to random encounters. Read the flag, not the verdict.The bridge is Windows/nwjs playtest only and needs its plugin installed in the project.
Vision AI requires your own endpoint.
๐ ๏ธ Development
npm install
npm run build # tsc compile (+ copies knowledge/ into dist/)
npm test # vitest
npm run typecheck
npm run dev # tsx watch modeWhere | What |
| Tool handlers and MCP transport |
| The 13-tool surface and its routing |
| Per-domain CRUD |
| Template cloning and procedural generation |
| Mission graphs and the semantic compiler |
| The loopback WebSocket and the in-game plugin |
| The read-only layer behind |
| Static reference data and bundled maps |
๐ฌ Feedback
Actively developed, and feedback is very welcome โ bug reports, weird maps, missing tools, ideas. Open a GitHub Issue with what you asked the agent to do and what you got; an exported map JSON or a screenshot helps a lot.
MIT ยท Built for RPG Maker MV
Available Tools
18 toolsanalyze_imageARead-onlyIdempotent
Analyze images related to the project. mode "ai" sends a project image file (tileset, character sheet, map screenshot, battler) to an external OpenAI-compatible Vision API and returns {analysis, model, tokens_used} โ NETWORK SIDE EFFECT: the resized JPEG leaves your machine to the endpoint configured via VISION_API_URL / VISION_API_KEY / VISION_MODEL env vars; fails if the path escapes the project, the file is missing, or the API is unreachable/times out (120 s). mode "grid" measures a base64 PNG tileset offline and returns its 48px grid {cols, rows, totalTiles}. mode "colors" returns the average RGB of a base64 PNG's four quadrants offline (a crude what-is-on-screen check). For precise offline map layout, query_map view "ascii" is usually better than any image analysis.
| Name | Required | Description | Default |
|---|---|---|---|
| mode | No | ai = Vision API on a project file; grid/colors = offline analysis of a provided base64 PNG. Default "ai" | |
| prompt | No | mode "ai": custom analysis question (default: thorough RPG-Maker-specific analysis) | |
| base64PNG | No | modes "grid"/"colors": raw base64 PNG data (no data: URL prefix) | |
| imagePath | No | mode "ai": image path RELATIVE to the project root, e.g. "img/tilesets/Outside.png"; paths outside the project are rejected | |
| resizeMax | No | mode "ai": max width in px before upload (default 1024; lower = fewer tokens) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description discloses network side effects (image sent to external API), required env vars, and failure modes. Annotations already state readOnly, safe, idempotent, open-world; description adds critical behavioral context without contradiction.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is fairly long but well-structured with clear mode breakdowns. Every sentence provides necessary info; minor verbosity in the 'ai' mode explanation but overall earns its space.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a complex tool with three modes, network side effects, and offline analysis, the description covers all important aspects: return values, failure modes, environment dependencies, and alternatives. No output schema but return format is described per mode.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema descriptions cover all 5 parameters, but the description adds significant value by explaining mode-specific usage, defaults (resizeMax=1024), and constraints (base64PNG must be raw). This goes beyond the schema's basic descriptions.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool analyzes images with three distinct modes (ai, grid, colors), each with specific functionality. It distinguishes itself from sibling tool query_map by noting that query_map's 'ascii' view is better for precise map layout.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides explicit when-to-use guidance for each mode, including failure conditions (path escapes, missing file, API timeout) and a clear alternative (query_map for map layout). This helps the agent decide correctly.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
analyze_projectARead-onlyIdempotent
Read-only project intelligence over an in-memory model of the whole project, cached until data files change. Nothing is written. view selects the lens: "overview" (default) title, counts, a health summary with the top issues, and maps unreachable from the start map; "index" maps with event counts, common events, named switches/variables; "validate" every consistency check (transfers to missing maps, missing map files, references to missing common events/items/weapons/armors/troops/animations, duplicate IDs, unused named switches/variables, bad start position, unreachable maps, autotiles the engine cannot draw, image/audio files missing from img/ and audio/) as {issueCount, bySeverity, issues[]}, filter with severity; "graph" the map transfer network and reachability; "usage" every event, common event and troop that uses kind (switch/variable/common_event/item/weapon/armor/troop/animation/actor/state/map) id, with read/write roles; "explain" target "switch"/"variable" + id: whether it is set, read, gated, a dead write or never set (why a door never opens); target "map" + id: incoming transfers and what becomes unreachable without it; "ast" one event page (mapId, eventId, page?) or common event (commonEventId) as a logical tree with an outline; "plugins" js/plugins.js merged with each plugin's header (@plugindesc/@param/@command/@help), flagging missing files; "critique" a designer's review of one map (mapId) with suggestions and a rough score; "metrics" measurements of one map (mapId): reachability from the real entry (unreachable tiles and events are softlocks), dead space against expected (interior/dungeon/exterior), walkable skeleton (loops, critical path, linearity), tile entropy, and steps to a shop/inn/save when the map has encounters; "balance" each skill/weapon/armor/enemy against its peers (damage per MP, gold per stat point, HP per EXP), leaving each out of its own statistics; category, thresholdSd (default 2); formulas are parsed, never executed, and unreadable ones are listed; "refactor" command sequences copy-pasted across events, to extract into a common event; "search" ranks names, dialogue, descriptions and notes against a free-text query.
| Name | Required | Description | Default |
|---|---|---|---|
| id | No | views "usage"/"explain": numeric id of the switch/variable/map/entity to inspect | |
| kind | No | view "usage": what kind of entity `id` refers to | |
| page | No | view "ast": which page of the event (0-based, default 0) | |
| view | No | Which lens to apply (default "overview") | |
| limit | No | view "search": max results (default 20) | |
| mapId | No | view "ast": the map holding the event to parse | |
| query | No | view "search": Unicode text matching over names/dialogue/notes, e.g. "the blacksmith". Offline lexical search, no synonym or translation expansion. Check complete, skippedFiles and warnings. | |
| minLen | No | view "refactor": minimum shared command-run length to report (default 4) | |
| target | No | view "explain": what `id` refers to (default "switch") | |
| eventId | No | view "ast": the event on `mapId` to parse | |
| category | No | view "balance": analyse one category instead of all four (default "all") | |
| expected | No | view "metrics": what kind of space this map is meant to be, which sets the dead-space band (default "exterior") | |
| severity | No | view "validate": keep only issues of this severity | |
| thresholdSd | No | view "balance": how many standard deviations from its peers an entry must sit before it is flagged (default 2; raise to see only the worst) | |
| commonEventId | No | view "ast": parse this common event instead of a map event |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare read-only, idempotent, and non-destructive behavior, but the description adds valuable context: the in-memory cache invalidates when data files change, formulas are parsed but never executed, unreadable formulas are listed, and search is offline lexical with no synonym expansion. These details exceed the annotation coverage and no annotation contradiction exists.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is front-loaded with the core purpose and caching behavior, which is good. However, the remainder is a single dense run-on sentence enumerating thirteen views, which harms scannability and could be better structured with bullets or shorter sentences.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given no output schema, the description fully explains what each view returnsโfrom validate's {issueCount, bySeverity, issues[]} to ast's logical tree and outline. Annotations cover the safety profile, and the schema covers all 15 parameters, leaving no critical gap for correct invocation.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the baseline is 3. The description goes further by explaining the semantics of each `view` enum value in detailโwhat 'validate' checks, what 'metrics' measures, what 'balance' comparesโadding meaning beyond the schema's terse enum labels and short parameter descriptions.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with a precise verb and resource: 'Read-only project intelligence over an in-memory model of the whole project, cached until data files change.' It then enumerates every analysis lens, making the tool's scope unmistakable and clearly distinct from mutating siblings like edit_map or create_database_entry.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description gives clear guidance on which `view` to choose for each analytical need (e.g., 'validate' for consistency checks, 'metrics' for map measurements), effectively serving as when-to-use guidance for the tool's modes. It does not, however, explicitly name sibling tools or state when not to use this tool versus alternatives like query_map or get_project_context.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
build_event_commandsARead-onlyIdempotent
Build a validated RPG Maker MV event-command fragment without writing files or requiring a selected project. Returns {commands, warnings?}; feed commands to insert_event_commands, or nest them in a choice/conditional builder. kind selects the command; only fields belonging to that kind are accepted. Troop-only kinds: enemy_appear, change_enemy_state, abort_battle. Fragments omit the root end marker; complete branches include their required nested end markers. MV Show Text has four parameters (no MZ speakerName); plugin_command emits MV code 356, never MZ 357. IDs accept integers or whole decimal integer strings; constants accept finite numbers. Supported game references are checked when inserting into a project.
| Name | Required | Description | Default |
|---|---|---|---|
| x | No | ||
| y | No | ||
| pan | No | ||
| fade | No | ||
| kind | Yes | ||
| name | No | control_switch self_switch: A-D; flow label/jump_to_label: label text; play_audio: file name without extension (empty stops the channel); show_picture: picture file. | |
| stat | No | change_actor: hp takes allowDeath; exp/level take showLevelUp; state takes stateId and remove. | |
| text | No | plugin_command: full MV command string, e.g. "DoorCtl open 1". | |
| wait | No | Wait for the effect, animation, balloon or move route to finish (move_route default true). | |
| wrap | No | show_text: true reflows all lines as one paragraph, "hard" keeps each line as a break; both split into 4-line boxes. Width ~55 chars, ~38 with a face. | |
| blend | No | ||
| color | No | ||
| endId | No | control_switch/control_variable: inclusive final ID; defaults to the starting ID. | |
| goods | No | shop_processing: goods in order; omit price to use the database price. | |
| lines | No | show_text: message lines. MV does not wrap; long lines are warned about unless wrap is set. | |
| mapId | No | ||
| pitch | No | ||
| power | No | ||
| scope | No | control_switch: switch requires switchId; self_switch requires name A-D. | |
| speed | No | ||
| steps | No | move_route: steps in order; times repeats one. toward/away are relative to the player. Parameters: jump x,y; wait frames; switch_on/off switchId; change_speed value 1-6; change_freq value 1-5; change_image name,index; change_opacity value 0-255; change_blend_mode value 0-3; play_se name,volume?,pitch?,pan?; script text. | |
| value | No | control_switch: default on. | |
| action | No | flow: wait requires frames; label/jump_to_label require name. | |
| amount | No | change_gold/change_items/change_actor hp|mp|exp|level: constant amount. Give amount or amountVariableId. | |
| effect | No | screen_effect. tint: color [r,g,b,gray] -255..255; flash: color [r,g,b,strength] 0..255; shake: power, speed 1-9. | |
| frames | No | ||
| indent | No | Base indentation, default 0. Nested branch bodies are rebased without mutating their inputs. | |
| itemId | No | ||
| origin | No | ||
| remove | No | change_party_member, change_actor state, change_enemy_state: remove instead of add. | |
| repeat | No | move_route: loop the route. Default false. | |
| scaleX | No | ||
| scaleY | No | ||
| volume | No | ||
| actorId | No | change_party_member/name_input: actor ID. change_actor: actor ID, 0 = entire party (or use actorVariableId). | |
| canLose | No | ||
| channel | No | play_audio. | |
| choices | No | ||
| opacity | No | ||
| operand | No | control_variable: {type:"constant",value}; {type:"variable",variableId}; {type:"random",min,max}; or {type:"game_data",dataType:0..7,param1?,param2?}. MZ game-data type 8 is rejected. | |
| stateId | No | ||
| troopId | No | battle_processing: give troopId, troopVariableId, or randomEncounter: true. | |
| branches | No | show_choices: one command fragment per choice. Omit for empty branches. | |
| decrease | No | Subtract instead of add. Default false. | |
| duration | No | screen_effect: frames, default 60. | |
| faceName | No | show_text: face image basename, default empty. | |
| itemType | No | change_items, default item. | |
| position | No | show_text: top/middle/bottom; show_choices: left/middle/right. | |
| switchId | No | ||
| balloonId | No | 1-15 as in the editor list (1 exclamation). | |
| canEscape | No | ||
| condition | No | conditional_branch: switch {type,switchId,value?}; self_switch {type,name,value?}; variable {type,variableId,comparison,constant? OR variableOperand?}; actor_in_party {type,actorId}; gold {type,gold,compare?}; item {type,itemId}. Only keys for the selected type are allowed. | |
| direction | No | ||
| faceIndex | No | show_text: face slot 0-7, default 0. | |
| maxLength | No | name_input: 1-16, default 8. | |
| operation | No | ||
| pictureId | No | show_picture/erase_picture: slot 1-100. | |
| skippable | No | move_route: skip a step that cannot be performed. Default false. | |
| winBranch | No | battle_processing: result branches, only when canEscape or canLose. | |
| wrapWidth | No | show_text: override the wrap width in characters. | |
| allowDeath | No | ||
| background | No | Text/choice window background. | |
| cancelType | No | show_choices: -1 disables cancel; -2 or choices.length selects the separate cancel branch; otherwise a zero-based choice index. | |
| elseBranch | No | ||
| enemyIndex | No | Troop slot from 0; change_enemy_state also accepts -1 for the entire troop. | |
| initialize | No | change_party_member: reset the actor when adding. | |
| loseBranch | No | ||
| thenBranch | No | ||
| variableId | No | ||
| animationId | No | ||
| characterId | No | show_animation/show_balloon/move_route: -1 player, 0 this event (default), n map event n. | |
| defaultType | No | show_choices: selected choice index, or -1 for none. | |
| designation | No | transfer_player/show_picture: whether the coordinates are literal values or variable IDs. | |
| showLevelUp | No | ||
| cancelBranch | No | show_choices: commands for a separate cancel branch. | |
| escapeBranch | No | ||
| includeEquip | No | change_items weapon/armor: also remove equipped copies. | |
| purchaseOnly | No | ||
| commonEventId | No | ||
| actorVariableId | No | ||
| randomEncounter | No | ||
| troopVariableId | No | ||
| amountVariableId | No | Use this variable's value as the amount. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare the safe pure-function profile (readOnly, idempotent, non-destructive, closed-world), so the bar is lower, yet the description still adds substantial context beyond them: no file writes, no project selection needed, the return shape {commands, warnings?}, the end-marker convention for fragments vs branches, and that game-reference validation is deferred to insert time.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Appropriately sized for an 83-parameter tool and front-loaded with the core purpose and routing before the finer MV/MZ semantics. It is a dense single paragraph with no wasted sentence, though the lack of any structural breaks makes the later constraints harder to scan.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
No output schema exists, but the description does explain the return value ({commands, warnings?}), which is the key gap it needed to close. Combined with the fragment/branch nesting rules and MV-vs-MZ caveats, it is largely complete for this complexity, though the 46% of undocumented parameters leave some functional territory uncovered.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is only 54% across 83 parameters, so the description must compensate, and it does add real cross-parameter semantics: 'kind selects the command; only fields belonging to that kind are accepted,' the troop-only kind list, the MV Show Text four-parameter rule, plugin_command emitting code 356, and the integer-or-decimal-string ID rule. It still leaves many individual parameters undocumented, so not a 5.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb+resource (build an RPG Maker MV event-command fragment) and immediately scopes it against the sibling that actually writes ('without writing files or requiring a selected project'). An agent can distinguish this from insert_event_commands without opening either schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly routes the agent: 'feed commands to insert_event_commands, or nest them in a choice/conditional builder,' which names the downstream alternative and the compose-vs-insert choice. It does not state any when-not condition or prerequisites for this tool itself, so it stops short of a full 5.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
create_database_entryA
Create a new entry in an RPG Maker MV database with the next free ID; the data file is written immediately. Returns the complete created object including its new id. Two forms: with entity + data it creates a raw entry (omitted fields get engine defaults; data.name is expected); with preset it builds a ready-to-use entry from a recipe โ damage_skill {name, mpCost, scope, formula, element?, animationId?}, healing_skill {name, mpCost, scope, formula}, buff_skill {name, mpCost, scope, paramId 0-7, turns}, state_skill {name, mpCost, scope, stateId, chance 0-1}, boss_enemy {name, battlerName?, specialSkillId?, params?}, encounter_troop {name, enemyIds[]}. Presets validate their required fields and fail with a validation error when missing. Class entries: data.params accepts 8 stat seeds [HP,MP,ATK,DEF,MAT,MDF,AGI,LUK] expanded to full level 1-99 curves automatically. Not supported for tilesets/animations (author those in the editor). Referenced IDs (classId, stateId, enemyIds...) are NOT validated โ confirm them with query_database first.
| Name | Required | Description | Default |
|---|---|---|---|
| data | No | Entry fields. Raw entries: same properties as the RPG Maker database (name, note, traits, params...; effects for items/skills, members [{enemyId,x,y}] for troops, trigger/switchId/list for common_events). Presets: the recipe fields listed in the description. Give `data` or `entries` | |
| entity | No | Which database receives the new entry. Optional when preset is given (the preset implies it) | |
| preset | No | Recipe for common content; see the tool description for each preset's required data fields. Omit for a raw entry | |
| entries | No | Instead of `data`: up to 200 data objects, created one after another with the same entity/preset; returns {count, created[]}. A failing entry stops the run and the error names the entries already created |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already cover write/read and idempotency, but the description adds crucial context: immediate file write, automatic ID assignment, preset validation behavior, class params curve expansion, unsupported entities, and lack of ID validation. It omits permission requirements or rollback behavior on batch failures, but provides rich operational detail beyond the annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is dense and front-loads the core purpose, but the middle section listing all preset fields and edge cases is a long run-on that could be structured better. It remains informative but is not optimally concise.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the complexity (4 params, nested data objects, no output schema), the description covers creation modes, ID behavior, validation, and caveats well. It omits what happens if the file write fails or how to handle large batch failures beyond a simple error note, but is largely complete for an agent to call it correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the schema documents the four parameters well. The description adds significant value by enumerating preset recipe fields, explaining data.name expectations, the 8-stat seed expansion for classes, and the entries batch behavior. It goes beyond the schema's high-level descriptions.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states the exact verb and resource ('Create a new entry in an RPG Maker MV database'), specifies the ID assignment behavior ('next free ID'), and explains both creation modes (raw vs preset) in detail. It clearly distinguishes itself from update_database_entry and query_database by defining the creation scope.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description implicitly guides when to use raw vs preset forms and even names query_database as a prerequisite for ID validation ('confirm them with query_database first'). However, it does not explicitly compare against update_database_entry or state when not to use this tool.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
delete_database_entryADestructiveIdempotent
DESTRUCTIVE: delete a database entry by nulling it out in its data file (written immediately; not undoable โ re-create it if needed; IDs are never reused). The delete is refused while anything still references the entry, listing every place: events, common events, troop pages, page conditions, map encounters, the starting party, actor classes and starting equipment, class learnings, enemy actions and drops, troop members, traits, item and skill effects, animations. Fix those first, pass dryRun:true to preview the list, or force:true to delete anyway (the result then lists brokenReferences). References are never cleaned up automatically. NEVER delete skill 1 (Attack), skill 2 (Guard) or state 1 (KO); the engine uses them directly. Supported entities: actors, classes, skills, items, weapons, armors, enemies, states, troops, animations. Returns the deleted object for reference; fails with an error if the ID does not exist.
| Name | Required | Description | Default |
|---|---|---|---|
| id | Yes | ID of the entry to delete (never skill 1/2 or state 1) | |
| force | No | Delete even though something still references it (default false) | |
| entity | Yes | Which database contains the entry to delete |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Beyond the annotations (destructiveHint=true, readOnlyHint=false), it discloses that the change is written immediately, not undoable, that IDs are never reused, that references are never cleaned up automatically, and that the delete is refused while references exist. It also enumerates every reference category checked and lists the result shape on forced deletes. This is unusually rich behavioral context.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is front-loaded with the DESTRUCTIVE warning and every sentence carries substantive information with no filler. However, it is a single dense paragraph for a complex topic, and itemizing the reference list or options would have improved scanability.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema, the description supplies the return shape ('Returns the deleted object') and the error behavior ('fails with an error if the ID does not exist'), and it covers the auth/safety profile through both annotations and explicit warnings. An agent has everything needed to call this correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the baseline is 3. The description mostly restates schema semantics for id, force, and entity, and it introduces a 'dryRun:true' parameter that does not appear anywhere in the input schema, which is a potential inconsistency rather than added clarity.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a precise verb and resource ('delete a database entry'), names the mechanism ('nulling it out in its data file'), and lists the exact supported entity types. This clearly distinguishes it from siblings like update_database_entry and create_database_entry without the agent needing to open any schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It gives explicit conditions for use and non-use: refusal while references exist, fixing references first, using dryRun to preview, or force to override. It also names hard exclusions (never skill 1/2 or state 1). It does not, however, direct the agent to any sibling tool as an alternative, which keeps it short of a 5.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
edit_mapADestructiveIdempotent
Modify existing maps; the affected map files / MapInfos.json are written immediately. action selects the edit: "fill_layer" overwrites an ENTIRE tile layer with one tile ID (destructive, not undoable; layers: 0-1 ground, 2-3 upper, 4 shadow bits 0-15, 5 region IDs 0-255; tileId 0 clears; find valid IDs with get_project_context detail "tileset"); "set_display_names" sets the player-visible displayName of several maps at once (entries whose map file is missing are reported in skipped, not errors); "organize_tree" re-parents maps in the editor tree (purely organizational, gameplay unaffected); "connect" creates a bidirectional pair of transfer events between two maps so the player can walk both ways; "set_encounters" sets the map's random-battle list so enemies appear while walking โ encounters is [{troopId, weight?, regionSet?}] (weight default 5; regionSet [] = whole map; troopId must exist) plus optional encounterStep. WITHOUT encounters set, a map has no random battles. Returns a per-action summary. Fails with an error if a referenced map does not exist (except set_display_names, which skips). "paint" writes one tile into cells or a rect of one layer; an autotile is written as its kind and the painted cells and their neighbours get the shapes the editor would give them, so shorelines and walls join up, while the rest of the map keeps its saved shapes. "repair_autotiles" fixes only autotile cells whose shape the engine cannot draw (analyze_project validate reports them as invalid-autotile). For event-level work use manage_map_event.
| Name | Required | Description | Default |
|---|---|---|---|
| posA | No | action "connect": transfer event position on map A {x, y, trigger} (trigger 1=walk-on default, 0=action button for doors) | |
| posB | No | action "connect": transfer event position on map B {x, y, trigger} | |
| rect | No | action "paint": {x, y, width, height} rectangle to paint (or give cells) | |
| cells | No | action "paint": [[x, y], ...] cells to paint (or give rect) | |
| layer | No | actions "paint", "fill_layer": layer 0-3 tiles, 5 regions (fill_layer also 4) | |
| mapId | No | actions "paint", "repair_autotiles", "fill_layer": map to modify | |
| names | No | action "set_display_names": [{mapId, name}] โ name is what the player sees on map entry | |
| action | Yes | Which edit to perform; see the tool description | |
| mapIdA | No | action "connect": first map ID | |
| mapIdB | No | action "connect": second map ID | |
| tileId | No | actions "paint", "fill_layer": tile ID (0 = clear); on layer 5 a region id 0-255 | |
| folders | No | action "organize_tree": [{mapId, parentId}] โ parentId 0 means root level | |
| encounters | No | action "set_encounters": [{troopId, weight?, regionSet?}] random-battle entries; troopId must exist (create via create_database_entry "troops") | |
| encounterStep | No | action "set_encounters": average steps between random battles (default 30) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Goes well beyond the annotations: files are written immediately, fill_layer is destructive and not undoable, missing-map entries are reported in `skipped` rather than erroring for set_display_names, and connect creates bidirectional transfer events. The idempotentHint=true is slightly at odds with event-appending actions like connect, but the description's disclosure quality is high.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loads the key mutation warning (immediate write) and then organizes each action as a labeled clause. Dense but every clause carries an action-specific fact; the enumeration could be tighter but little is wasted.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a 7-action, 14-parameter mutation tool with no output schema, the description covers each action's semantics, error behavior, and return shape (per-action summary). Nothing critical for correct invocation is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the baseline is 3, but the description adds real meaning: layer numbering (0-1 ground, 2-3 upper, 4 shadow, 5 region 0-255), tileId 0 clears, weight default 5, regionSet [] = whole map, and posA trigger semantics.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb (Modify) and resource (existing maps) and then enumerates each action with its exact effect. It explicitly differentiates from siblings by routing event-level work to manage_map_event.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Per-action guidance is concrete: it names which action to use for which goal, points to get_project_context detail "tileset" for valid tile IDs, and directs event work to manage_map_event. It also states an exclusion (maps have no random battles without set_encounters).
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
generate_mapA
Create a new map file (next free map ID, registered in MapInfos.json; both files written immediately). mode selects the generator: "blank" makes an empty map you paint later (edit_map fill_layer); "themed" generates a simple tile layout for a theme using the tileset's real tiles; "procedural" is the full generator โ for themes with matching RTP reference templates (town, dungeon, interior, castle, world, etc.) it CLONES a hand-authored template from the 106 bundled maps (real 3D buildings, walls, furniture), auto-picking the closest size; for themes without templates (beach, swamp, etc.) it generates procedurally (Perlin terrain, BSP dungeons, cellular caves). Same seed + params = same map. Every mode except blank and duplicate also returns walkability per map (walkable tiles, main area, cut-off tiles) and warnings when the map is barely walkable or has unreachable pockets. Pass templateId to force a specific template, or useTemplate:false to force procedural. 21 themes incl. snow, volcano, sewer, space_interior; "batch" generates several procedural maps in one call from batch specs; "duplicate" copies an existing map (transfer events still point at their ORIGINAL destinations โ review them); "template" instantiates one of the 106 bundled reference maps by templateId (list them with get_project_context detail "templates"); "semantic" is the tileset-independent generator โ it lays out a MISSION (entrance, key, locked door, treasure, boss, exit, side rooms) as a graph and only then paints it, asking the tileset profile which tile plays each role, so the layout works on ANY tileset including DLC and third-party packs, and the key is always reachable before the door it opens. It returns markers naming the cell of every mission role, which is where to place events next. Run manage_system action "mine_templates" first so the profile comes from tiles this project actually uses; pass a mined templateId (like "mined-3") to re-materialise one of the project OWN maps onto a different tileset instead of generating a new mission. Returns {mapId, ...} โ procedural also returns the seed; batch returns all mapIds keyed for edit_map "connect". Fails with an error on unknown theme/template or unwritable files.
| Name | Required | Description | Default |
|---|---|---|---|
| loop | No | mode "semantic": add one extra corridor so the map has a loop instead of being a tree (default true) | |
| mode | No | Which generator to use; see the tool description. Default "procedural" | |
| name | No | Internal map name for the editor tree (required for mode "duplicate") | |
| note | No | Free-form note field for plugin metadata | |
| seed | No | procedural/batch: random seed for reproducible output (omit for random; returned in the result) | |
| batch | No | mode "batch" only: one spec per map [{key, name, theme, width, height, tilesetId, seed, parentId}]; key is echoed back to match returned mapIds | |
| rooms | No | mode "semantic": rooms on the critical path (default 5) | |
| theme | No | Required for themed/procedural. themed: forest, dungeon, town, castle, cave, village, swamp, desert, ruins, interior, beach. procedural adds: snow, harbor, volcano, sewer, fortress, magic_forest, magic_interior, space_interior, space_exterior, world | |
| width | No | Map width in tiles (defaults: blank/themed 17, procedural 30; template uses the template's size) | |
| height | No | Map height in tiles (defaults: blank/themed 13, procedural 25) | |
| locked | No | mode "semantic": put a key and a locked door on the path (default true when there are 4+ rooms) | |
| bgmName | No | Audio file from audio/bgm/ to autoplay on entry | |
| parentId | No | Map tree folder to nest the new map under (0 = root) | |
| addEvents | No | procedural: also place themed NPCs/chests/bosses/transfers (default true) | |
| keepProps | No | mode "semantic" with a mined templateId: paint the original decorations even onto a different tileset (they may not exist there) | |
| sideRooms | No | mode "semantic": dead-end rooms hung off the path, the first holding treasure (default 2) | |
| tilesetId | No | Tileset to render with. Defaults to the one matching the theme (Outside=2, Inside=3, Dungeon=4, Overworld=1), so you normally omit it โ only set it to override. A mismatched tileset renders the map as garbage | |
| encounters | No | procedural combat themes (dungeon/cave/world/fortress/sewer/volcano): auto-populate the map's random encounters from the project's existing troops so enemies appear while walking. Default true (no-op if the project has no troops yet) | |
| keepEvents | No | mode "template" only: also copy the template's events (default true) | |
| templateId | No | mode "template": bundled template ID. mode "procedural": OPTIONAL โ force a specific template ID (from get_project_context detail "templates") instead of auto-picking by theme+size | |
| displayName | No | Location name briefly shown to the player on entry | |
| sourceMapId | No | mode "duplicate" only: existing map ID to copy (unchanged by the operation) | |
| useTemplate | No | procedural: when true (default), clone an RTP template for themes that have one (town, dungeon, interior, etc.) instead of generating procedurally. Set false to force procedural generation even when templates exist | |
| enterableHouses | No | procedural town/village only: also auto-generate an interior map per house with a two-way warp (action-button door outside โ interior, walk-on mat inside โ back to the street). Default true; the new interior map IDs are returned in interiorMapIds |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnly=false, idempotent=false, destructive=false, and openWorld=false. The description adds substantial behavior: files are written immediately, failures occur on unknown themes/templates or unwritable files, duplicate mode leaves events pointing at original destinations, and non-blank modes return walkability and warnings.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The opening is front-loaded and useful, but the body is a dense, run-on enumeration of modes and examples. Some details repeat the schema's theme and template enumerations, and the text could be more scannable for a tool with seven modes and twenty-four parameters.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema, the description still covers return shapes such as mapId, seed, markers, walkability, warnings, and batch mapIds. It also states prerequisites, side effects, and failure conditions, making it complete for a highly complex map-generation tool.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, but the mode parameter's schema explicitly says 'see the tool description', so the description supplies essential semantics for mode selection and side effects. It also clarifies cross-parameter behavior for templateId, useTemplate, batch, and duplicate, though other parameter explanations largely mirror the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Starts with a specific verb and resource: 'Create a new map file', then states that both the file and MapInfos.json are written immediately. It distinguishes itself from siblings like edit_map and query_map by explaining the creation pipeline and mode-specific behavior without requiring the schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly routes the agent by mode, states prerequisites such as running manage_system action 'mine_templates' first, and names alternatives including edit_map fill_layer and get_project_context. When-not conditions are not exhaustively enumerated, but the mode-by-mode guidance is exceptionally clear.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_project_contextARead-onlyIdempotent
Read-only: pre-digested project knowledge โ CALL THIS FIRST in a session. detail selects the depth: "full" (default) returns id+name lists for every database, switch/variable names, starting position, and available sprite filenames per img/ folder โ everything needed to create content without inventing broken references; "summary" is a cheap health check (entry counts per data file); "assets" scans img/ and Tilesets.json into a complete index (sheet dimensions, autotile kinds, categorized usable tiles, all PNG names); "tileset" returns the categorized usable tile IDs of ONE tileset (ground/water/walls/roof/decoration) for edit_map "fill_layer" โ guessing tile IDs produces glitched maps; "templates" lists the 106 bundled reference maps (id, category, theme) usable with generate_map mode "template", optionally filtered by category/theme. Returns one structured object (or array for templates). GOLDEN RULES for good results: (1) build whole maps with generate_map (it stamps real houses/trees and wires encounters) and add content with the manage_map_event presets โ do NOT hand-paint tiles or place decorations one tile at a time; (2) never invent tile IDs or sprite/troop/skill IDs โ take them from this tool; (3) for enemies to appear, create troops then set encounters (edit_map "set_encounters"), which generate_map does automatically for combat themes.
| Name | Required | Description | Default |
|---|---|---|---|
| theme | No | detail "templates": filter by template theme | |
| detail | No | How much and what kind of context; see the tool description. Default "full" | |
| category | No | detail "templates": filter by template category | |
| tilesetId | No | detail "tileset": which tileset to categorize |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already indicate readOnlyHint=true, destructiveHint=false, idempotentHint=true. Description adds valuable behavioral context: warns against inventing tile IDs ('guessing tile IDs produces glitched maps'), explains return types, and details what each mode outputs. No contradictions.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Well-structured with clear ordering: main purpose, detail modes, golden rules. Every sentence adds value, though the description is lengthy due to the tool's complexity. Could be slightly tighter, but still efficient.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Completely covers all aspects: explains every detail mode, parameters, return types, and golden rules for correct usage. Even without an output schema, the description makes it clear what to expect. No gaps for an agent to misuse the tool.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Input schema has 100% coverage, but description adds meaning beyond schema: explains what each enum value of 'detail' returns, and for tilesetId, category, theme, it specifies their role in filtering. Schema defers to description for full semantics.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Explicitly states it is 'read-only: pre-digested project knowledge' and advises 'CALL THIS FIRST'. Clearly distinguishes each detail mode (full, summary, assets, tileset, templates) with specific use cases, differentiating it from sibling tools like query_map and generate_map.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Provides explicit when-to-use instructions: 'CALL THIS FIRST'. Golden rules guide proper usage: use generate_map for maps, never invent IDs, set encounters correctly. Details when to use each detail mode (e.g., 'tileset' for edit_map 'fill_layer').
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
insert_event_commandsA
Insert a complete event-command fragment into a map event page, common event, or troop battle page. Validates the fragment, insertion boundary, resulting list, and supported references before writing. Invalid data refuses the write. Omit position to append before the root end marker; an explicit position must be a safe command boundary (not inside a text continuation or between a block header and its branches). Fragments are rebased to the target indentation. dryRun:true validates and previews without writing or creating backups. Normal writes use the existing atomic backup-protected project writer. Returns target identity, insertion count, the resulting list length and its command codes (listCodes), and warnings; pass verbose:true to also get the full before/after lists. Existing unknown extension commands are advisory; known MZ-only commands are rejected.
| Name | Required | Description | Default |
|---|---|---|---|
| mapId | No | map_event target map ID. | |
| dryRun | No | Preview the validated change without writing. Default false. | |
| target | No | Defaults to map_event. | |
| eventId | No | map_event target event ID. | |
| troopId | No | troop_page target troop ID. | |
| verbose | No | Include the full before/after command lists in the result. Default false. | |
| commands | Yes | A complete fragment, typically returned by build_event_commands. A supplied final root terminator is normalized; the target always retains exactly one. | |
| position | No | Zero-based insertion index in the existing command list. Out-of-range or unsafe boundaries are rejected. | |
| pageIndex | No | map_event/troop_page: zero-based page, default 0. | |
| commonEventId | No | common_event target ID. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Goes well beyond the annotations: it discloses pre-write validation, that invalid data refuses the write, safety rules for explicit positions, fragment rebasing to target indentation, atomic backup-protected writing, unknown vs MZ-only extension command handling, and exactly what the result contains. This is unusually rich behavioral disclosure for a mutation tool.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Content is front-loaded with purpose and validation, then flows into position semantics, dryRun, writer behavior, and return values. It is dense and slightly long, but nearly every sentence carries distinct information and no sentence is pure filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Despite having no output schema, the description enumerates the return payload (target identity, insertion count, resulting list length, listCodes, warnings, and verbose before/after lists), so an agent knows what to expect. Combined with the validation and safety rules, nothing needed to invoke it correctly is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the baseline is 3, but the description adds meaning the schema lacks: the safe-boundary constraint on position, the append-before-root-end behavior when position is omitted, dryRun's write-and-backup suppression, and verbose's effect on the result shape.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb (Insert) and resource (event-command fragment) with explicit scope across three target types (map event page, common event, troop battle page). It also implicitly distinguishes itself from build_event_commands by noting fragments are 'typically returned by build_event_commands', so an agent can tell the two apart without opening the schemas.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives clear operational context: omit position to append before the root end marker, use dryRun:true to preview without writing, and pass verbose:true for full lists. It does not explicitly state when to prefer this over sibling writers like edit_map or manage_map_event, which keeps it out of 5 territory.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
manage_map_eventADestructive
Create, change or remove map events; the map file is written immediately. action "create" without preset makes a bare event at x/y (empty page unless pages; then use add_command or insert_event_commands). With preset it builds a ready event: "npc" {name, dialogues[], characterName?, characterIndex?}; "chest" one-time loot {items: [{type item|weapon|armor, id, amount}]}; "teleport" walk-on transfer {destMapId, destX, destY, trigger?}; "door" action-button warp {destMapId, destX, destY, characterName?, characterIndex?, trigger?, lockedSwitchId?, lockedMessage?}, locked until that switch is ON; "shop" {goods: [[type 0 item/1 weapon/2 armor, id, priceType 0 standard/1 custom, price]]}; "inn" {cost?}; "boss" {troopId} one-time battle, game over on loss; "puzzle_switch" {switchX, switchY, doorX, doorY, gameSwitchId, switchName?, doorName?} makes two linked events. A missing destination map, troop, item or switch is refused; an unwalkable or occupied tile is created anyway and listed in warnings. "update" overwrites only fields. "convert" keeps an event's id, position, name and sprite but replaces its behaviour via kind: "merchant" (options.goods, or options.items [{type, id}], options.greeting?), "inn" (options.cost?), "sign" (options.text). "delete" removes it (destructive). "add_command" appends one command before a page's end. "populate" scatters N npc/chest/boss events on random free tiles of the main walkable area of the map (explicit opts.x/opts.y are used as given). Returns the event(s) with ids; fails if the map or event does not exist.
| Name | Required | Description | Default |
|---|---|---|---|
| x | No | Tile X position (0-based; create/presets except puzzle_switch) | |
| y | No | Tile Y position (0-based) | |
| cost | No | preset "inn": gold charged for a full recovery (default 50) | |
| kind | No | action "convert": what to turn the existing event into | |
| name | No | Event name shown in the editor | |
| opts | No | action "populate": overrides {name, troopId, x, y} | |
| count | No | action "populate": how many events (default 3) | |
| destX | No | preset "teleport"/"door": destination tile X (should be walkable) | |
| destY | No | preset "teleport"/"door": destination tile Y | |
| doorX | No | preset "puzzle_switch": door tile X | |
| doorY | No | preset "puzzle_switch": door tile Y | |
| goods | No | preset "shop": wares [[type, id, priceType, price]] โ priceType 1 uses the custom price, 0 the database price | |
| items | No | preset "chest": loot [{type: "item"|"weapon"|"armor", id, amount}] | |
| mapId | Yes | Map the event lives on (always required) | |
| pages | No | action "create" without preset: full event page objects (optional) | |
| action | Yes | What to do; see the tool description. Default "create" | |
| fields | No | action "update": properties to overwrite, e.g. {"x": 5, "y": 9} or {"pages": [...]} (replaces all pages) | |
| preset | No | action "create" only: ready-made event recipe; omit for a low-level empty event | |
| command | No | action "add_command": event command {code, indent, parameters}; e.g. 201=Transfer Player [0, mapId, x, y, dir, fade] | |
| eventId | No | Existing event ID (update/delete/add_command); find it with query_map view "events" | |
| options | No | action "convert": kind-specific settings โ merchant {goods|items, greeting?}, inn {cost?}, sign {text} | |
| switchX | No | preset "puzzle_switch": floor-switch tile X | |
| switchY | No | preset "puzzle_switch": floor-switch tile Y | |
| trigger | No | How the event activates: 0=action button, 1=player touch, 2=event touch, 3=autorun, 4=parallel | |
| troopId | No | preset "boss" / populate boss: troop to battle (create it first via create_database_entry preset encounter_troop) | |
| doorName | No | preset "puzzle_switch": editor name for the door event (default "Door") | |
| destMapId | No | preset "teleport"/"door": destination map ID | |
| dialogues | No | preset "npc": dialogue lines, each becomes one text box | |
| eventType | No | action "populate": kind of events to scatter โ "npc", "chest" or "boss" | |
| pageIndex | No | action "add_command": which page receives the command (0-based, default 0) | |
| switchName | No | preset "puzzle_switch": editor name for the switch event (default "Switch") | |
| gameSwitchId | No | preset "puzzle_switch": game switch linking switch and door โ pick an unused ID via manage_system get switches | |
| characterName | No | Sprite sheet from img/characters/ without extension; list options with get_project_context | |
| lockedMessage | No | preset "door": message shown while locked (default "It's locked.") | |
| characterIndex | No | Which of the 8 characters in the sheet (0-7) | |
| lockedSwitchId | No | preset "door": if set, the door shows lockedMessage until this game switch is ON, then warps |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations declare destructiveHint=true and non-idempotent, and the description corroborates with 'the map file is written immediately' and 'delete removes it (destructive)'. It also discloses behaviours annotations could not: missing destination/troop/item/switch are refused, unwalkable or occupied tiles are still created but reported in `warnings`, and create/update/convert/delete vs. append semantics differ per action. Minor gap: it doesn't state permissions or whether changes are reversible.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
It is one enormous run-on sentence-plus-prose block that front-loads the verb but then buries every preset recipe, refusal rule, and action semantic in a single dense paragraph. It is informative but poorly partitioned; scanning for a specific preset or action requires re-reading the whole block, and a bullet/table structure would serve the agent far better.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a 36-parameter, high-complexity mutation tool with no output schema, the description covers the essential decision space: which action to pick, what each preset builds, update vs. overwrite-only-fields, convert's preserved vs. replaced attributes, delete's destructiveness, and the warnings channel. What it omits โ return value shape beyond 'events with ids', authorization/rate-limit context โ is minor given annotations and schema coverage.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100% and the schema already documents each parameter, including the enum meanings for action and preset and the shape of nested goods/items. The description restates the per-preset payload shapes (npc, chest, shop, door, puzzle_switch, boss) and adds cross-references like create_database_entry preset encounter_troop and manage_system get switches, but this largely echoes structured data, so baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Opens with a specific verb set plus resource ('Create, change or remove map events') and immediately names the file side effect. It also enumerates every action verb (create/update/convert/delete/add_command/populate) and every preset recipe, so it is unmistakably distinct from siblings like edit_map, generate_map, and insert_event_commands.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives clear conditional guidance throughout: when to omit `preset` vs. supply one, when to follow a bare event with add_command/insert_event_commands, what 'convert' preserves vs. replaces, and what 'populate' scatters. It notably routes the agent toward the sibling insert_event_commands, but it does not contrast itself against edit_map or query_map view 'events' for locating event ids beyond one passing mention.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
manage_systemBIdempotent
Project-wide settings in data/System.json (writes are immediate), project lifecycle, and the live playtest bridge. action "get" returns section: "full" (large), "switches"/"variables" (names by ID; empty means free) or "title". "set_title" sets the game title. "name_switch"/"name_variable" label one by ID (names only). "resize_list" {section, size} sets the highest valid switch/variable id (MV ignores ids past it, silently). "list_backups" {file?} and "restore_backup" {file, backup?} list and restore the copies kept in .mcp-backups before every write; the newest undoes the last write. "set_starting_position" {mapId, x, y} for new games; a tile the player cannot stand on is moved to the nearest walkable one (relocated). "create_plugin" writes js/plugins/.js with a proper header (and a pluginCommand hook when commands are given) and registers it in js/plugins.js (order is load order); the same name replaces it. "scaffold_project" creates a new editor-openable project at destPath from NewData (never overwrites; does not switch the active project). "playtest" runs the active project in the bundled nwjs and first closes the game an earlier playtest of it started (keepRunning leaves it open); "stop_playtest" closes that game; "open_editor" opens it in RPGMV.exe, repairing a missing Game.rpgproject (Windows; engine from install, RPGMAKER_MV_INSTALL or the Steam path). "mine_templates" learns layouts and tile roles from this project for semantic generation. "export_web" builds an HTML5 folder and zip for itch.io (see outDir, zip, prune). Live bridge: "install_bridge_plugin" writes js/plugins/McpBridge.js (active only in playtest); "bridge_start" opens the loopback socket and its handshake; "bridge_status" says whether the game is connected, and why not in lastAuthError; "bridge_telemetry" drains exceptions, logs, scene changes, player position and executing commands (filter types, peek keeps them); "bridge_command" sends reload_map, reload_database, get_state, teleport_player, interact, press_button or ping; "take_screenshot" captures the live game ("bridge_screenshot" is an alias); "bridge_stop" closes it.
| Name | Required | Description | Default |
|---|---|---|---|
| x | No | set_starting_position: starting tile X (should be walkable) | |
| y | No | set_starting_position: starting tile Y | |
| id | No | name_switch/name_variable: switch or variable ID to label (1-based) | |
| zip | No | export_web: also write <outDir>.zip with index.html at its root (default true) | |
| body | No | create_plugin: custom JS body; omit for a safe generated skeleton | |
| file | No | bridge_command "reload_database": the data file to re-read, e.g. "Skills.json". list_backups/restore_backup: a data file name such as "Map002.json" or "plugins.js" | |
| help | No | create_plugin: @help text (multi-line allowed) | |
| name | No | name_switch/name_variable: descriptive label. create_plugin: the plugin name (bare token โ letters/digits/_/-, becomes js/plugins/<name>.js) | |
| peek | No | bridge_telemetry: leave the frames in the buffer instead of consuming them | |
| port | No | bridge_start/install_bridge_plugin: loopback port for the live bridge (default 32123, or RPGMV_BRIDGE_PORT) | |
| size | No | resize_list: the highest valid switch or variable id (1-5000); `section` picks which | |
| test | No | playtest: run in playtest/test mode (default true; false runs it as a normal launch) | |
| wait | No | bridge_command: wait for the game to answer (default true; false is fire-and-forget) | |
| force | No | resize_list: allow shrinking past names that are in use | |
| limit | No | bridge_telemetry: return at most this many of the most recent frames. mine_templates: keep at most this many layouts, largest maps first | |
| mapId | No | set_starting_position: map where new games start (must exist) | |
| prune | No | export_web: drop img/audio/movies files no data or script references (default false; assets a plugin names only at runtime would be lost) | |
| title | No | action "set_title": new game title | |
| types | No | bridge_telemetry: only return these frame types, e.g. ["exception","log"] | |
| action | Yes | What to do; see the tool description. Default "get" | |
| author | No | create_plugin: @author name | |
| backup | No | restore_backup: a backup id from list_backups (default: the newest, which undoes the last write) | |
| button | No | bridge_command "press_button": safe RPG Maker input to press | |
| outDir | No | export_web: folder for the HTML5 build, outside the project (absolute, or relative to it). It must be new, empty, or a previous export_web folder; <outDir>.zip is written beside it unless zip:false. Copies js, fonts, data and assets, keeps encrypted assets as they are, never copies saves or backups. Returns file counts, bytes and the screen size for an itch.io embed. | |
| params | No | create_plugin: @param definitions [{name, type?, desc?, default?}] surfaced in js/plugins.js | |
| status | No | create_plugin: enable the plugin in js/plugins.js (default true) | |
| command | No | bridge_command: which safe instruction to send to the running game | |
| install | No | playtest/open_editor: RPG Maker MV install root (contains nwjs-win/ and RPGMV.exe); defaults to RPGMAKER_MV_INSTALL or the standard Steam install | |
| section | No | action "get": which part of System.json to return (default "full") | |
| commands | No | create_plugin: plugin command names to document (@command) and wire a pluginCommand handler stub for | |
| destPath | No | scaffold_project: directory for the NEW project (must be empty of a project). title/mapId/x/y set the new game's title and start position | |
| direction | No | bridge_command "teleport_player": facing after the transfer (2 down, 4 left, 6 right, 8 up) | |
| timeoutMs | No | bridge_command/take_screenshot: how long to wait for the answer (default 8000, screenshots 15000) | |
| durationMs | No | bridge_command "press_button": hold duration in milliseconds (default 80, range 30-1000) | |
| sourcePath | No | scaffold_project: a blank-project (NewData) folder to clone; defaults to the RPGMAKER_MV_INSTALL env var or the standard Steam install | |
| description | No | create_plugin: @plugindesc short description | |
| keepRunning | No | playtest: do not close the game a previous playtest started (default false) | |
| screenshotName | No | take_screenshot: optional safe filename prefix (letters, numbers, _ and -, up to 64 characters) | |
| minDistinctTiles | No | mine_templates: a map needs at least this many distinct tiles to count as content rather than scratch (default 10) | |
| telemetryInterval | No | install_bridge_plugin: frames between player-position frames (default 30; 60 = once per second) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With annotations present, the description still adds meaningful behavior: "writes are immediate", backups are "kept in .mcp-backups before every write" with "the newest undoes the last write", MV "ignores ids past it, silently", and prune can lose "assets a plugin names only at runtime". These disclose side effects and failure modes beyond the readOnly/destructive hints, though return shapes and error conditions are largely unstated.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The definition is a single dense paragraph packing three unrelated topics into the opening sentence and then embedding all 22 actions mid-sentence without line breaks or grouping. While most content is relevant, the wall-of-text structure makes it hard to scan and the front-loaded summary sentence is muddled rather than orienting.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a 22-action, 40-parameter tool with no output schema, the description covers the semantics of most actions and mentions a few return details (`section` values, `lastAuthError`, `relocated`, export file counts). But return values, error behavior and prerequisites for many actions are left unstated, so it is adequate rather than complete for a tool of this scope.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100% and there are 40 well-annotated parameters, so the schema carries the semantic load and a 3 is the baseline. The description does add a little cross-action meaning (e.g. the prune caveat, the silent MV id truncation, `relocated` on set_starting_position) but for most parameters it only restates what the schema already documents.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description names a specific verb+resource for each of the 22 actions (e.g. "set_title sets the game title", "scaffold_project creates a new editor-openable project at destPath"), so an agent can tell what each action does. However, the tool as a whole is a heterogeneous grab-bag and the description never distinguishes it from overlapping siblings such as `run_playtest` or the standalone `take_screenshot` tool, which it partially duplicates.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description explains what each action does but gives no when-to-use vs when-not guidance and no routing to alternatives. It does not say, for example, why an agent would call action "playtest" here rather than the sibling `run_playtest`, or action "take_screenshot" rather than the sibling `take_screenshot`. Selection is left entirely to inference.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
query_databaseARead-onlyIdempotent
Read-only: query any RPG Maker MV database (data/*.json). Three forms depending on arguments: no id/query lists every non-null entry of the entity; id fetches one entry (returns null, not an error, if it does not exist); query does a case-insensitive name search (items/weapons/armors/skills also match descriptions). Returns an array (list/search) or a single object/null (id). Use this to discover valid IDs before create/update/delete or before wiring references (class learnings, troop members, chest loot). For maps use query_map; for a digest of everything at once use get_project_context.
| Name | Required | Description | Default |
|---|---|---|---|
| id | No | Fetch a single entry by its database ID (1-based). Omit to list or search | |
| query | No | Case-insensitive substring to match against entry names (and descriptions for items/weapons/armors/skills). Ignored when id is given | |
| entity | Yes | Which database to read: actors, classes, skills, items (consumables), weapons, armors, enemies, states (status conditions), troops (enemy formations), tilesets, common_events, animations |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already indicate read-only, non-destructive, idempotent. Description adds key behaviors: returns null for missing id (not error), case-insensitive search, description matching for certain entities. No contradictions.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Concise and well-structured: starts with read-only safety emphasis, then enumerates three usage forms, provides usage guidance, and ends with sibling differentiation. Every sentence adds value without redundancy.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Despite no output schema, description explains return types (array vs single object/null) and covers all three modes. Provides complete context for usage, parameter interactions, and relationship to sibling tools. Fully sufficient for an AI agent.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
100% schema coverage with descriptions, but description adds crucial semantics: explains that omitting id and query lists all entries, id returns null on missing, query is case-insensitive and also matches descriptions for items/weapons/armors/skills. Significantly enriches understanding.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool queries RPG Maker MV database files, specifies three forms (list, fetch by id, search), and distinguishes from siblings (query_map, get_project_context). Verb 'query' and resource 'database' are explicit.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly advises using before create/update/delete operations to discover IDs, and directs to query_map for maps and get_project_context for a full digest. Provides clear when-to-use and when-not-to-use guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
query_mapARead-onlyIdempotent
Read-only: inspect maps. view selects what you get: "infos" lists the map tree from MapInfos.json (ids, names, folder parentIds โ no mapId needed); "full" returns one complete MapNNN.json (dimensions, 6-layer tile data, events โ can be large); "events" lists a map's events (with query, filters by name, case-insensitive); "event" returns one event by eventId (null if absent); "validate" lints a map (invalid tile IDs per layer, missing page terminators, transfers to map 0, Self Switch OFF where ON was likely meant) returning {issueCount, issues[]}; "ascii" renders the map as a character grid with event markers and a legend โ the cheapest way to "see" a layout and pick coordinates, entirely offline. Fails with an error if the map file does not exist. For player-visible images use analyze_image instead.
| Name | Required | Description | Default |
|---|---|---|---|
| view | Yes | What to read; see the tool description for each view | |
| layer | No | view "ascii" only: tile layer to draw, 0=ground (default) or 2=upper decorations | |
| mapId | No | Map ID (required for every view except "infos"); map 1 is Map001.json | |
| query | No | view "events" only: case-insensitive substring filter on event names | |
| eventId | No | Event ID within the map (required for view "event") | |
| showEvents | No | view "ascii" only: overlay event markers (default true) | |
| showRegions | No | view "ascii" only: also return the region-ID layer as a second grid (default false) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already provide readOnlyHint and idempotentHint; description adds specifics like failure on missing file, offline nature of ascii view, and validation behavior, adding value beyond annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Efficient and front-loaded with 'Read-only: inspect maps.' Each sentence serves a purpose, but the description is somewhat dense; could be slightly shorter.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given 7 parameters, 1 required, and no output schema, the description thoroughly explains each view's return format, failure cases, and even provides a cheap way to 'see' layout via ASCII. Complete for the tool's complexity.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
While schema has 100% coverage, the description adds meaning by explaining what each view returns (e.g., 'full' returns dimensions and tile data, 'validate' returns issueCount and issues). This compensates for the lack of output schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states it is a read-only tool to inspect maps, with specific verbs like 'inspect' and lists each view. It distinguishes itself from siblings like edit_map and generate_map by emphasizing read-only nature.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Provides explicit when-to-use for each view and mentions an alternative tool (analyze_image) for player-visible images. Could be more explicit about when not to use, but context is clear.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
record_videoA
Start or stop recording the live RPG Maker MV playtest canvas through the authenticated MCP bridge. action:"start" begins a silent WebM capture inside the game runtime; action:"stop" saves it under .mcp-cache/recordings/ and returns {path, bytes, mimeType, durationMs, name}. This captures only the game canvas, not the desktop or credentials. Requires the bridge plugin, a running bridge, and a connected playtest. Optional name, fps (default 30), and bitrateKbps (default 2500) control the artifact.
| Name | Required | Description | Default |
|---|---|---|---|
| fps | No | Capture frame rate, 1-60 (default 30) | |
| name | No | Safe filename prefix used when stopping | |
| action | Yes | Start a new capture or stop and save the active capture | |
| timeoutMs | No | How long to wait for start/stop result (defaults 15000/60000) | |
| bitrateKbps | No | Video bitrate in kbps, 250-10000 (default 2500) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare the mutation profile (readOnlyHint=false, idempotentHint=false, destructiveHint=false), yet the description adds real value: capture scope ('only the game canvas, not the desktop or credentials'), the output path, the returned payload shape, and required runtime preconditions.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Four dense sentences with no filler; purpose and the start/stop semantics are front-loaded, and the return payload and defaults follow the core intent.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
No output schema exists, but the description compensates by naming the returned fields and save location, and it lists the runtime prerequisites for a non-read-only operation. Minor gaps remain, such as behavior when a capture is already active or how timeoutMs interacts with the defaults.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the schema already documents all five parameters with ranges and defaults. The description restates name/fps/bitrate defaults but says nothing extra about timeoutMs, so it sits at the baseline for full schema coverage.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb+resource ('Start or stop recording the live RPG Maker MV playtest canvas') and scopes it precisely via the action enum. It is clearly distinguishable from siblings like take_screenshot or run_playtest.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explains the two modes and lists prerequisites (bridge plugin, running bridge, connected playtest). It does not explicitly contrast with the sibling take_screenshot, so the alternative-selection guidance stops short of a 5.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
run_playtestA
Play the game headless from a script of steps and report what happened: does the door transfer, does the NPC say the right line, does the choice branch, is a tile blocked. Boots the project in Chromium with the real engine; no editor or running game needed, and project data is never changed (screenshots go to .mcp-cache/renders/). Steps by action: load {mapId,x,y,direction?,party?,level?,gold?,switches?,variables?,selfSwitches?,items?,equip?,encounters?} starts a fresh game there; startEvent {eventId} runs a map event until it shows text or goes idle; advanceText {maxMs?} presses OK until idle, stopping at choices or battle, and returns the lines shown; choose {index}; walk {direction,steps?} reports where the player ended or which tile blocked; press {button,times?}; wait {ms}; autoBattle {troopId?,canEscape?,canLose?,maxMs?} fights on auto until the battle ends; screenshot {name?}; eval {script} returns a JS expression evaluated in the game page. The result lists each step with ok, a finalState and page problems (errors, missing files). Runs can take minutes: send a progressToken to get progress notifications. Needs the optional playwright-core and a cached Chromium (npx playwright install chromium-headless-shell, or RPGMAKER_MCP_CHROMIUM).
| Name | Required | Description | Default |
|---|---|---|---|
| steps | Yes | The script, run in order. Fields per action are listed in the tool description. | |
| realtime | No | Play battles at real speed (default false: fast-forwarded, about 10-20x quicker) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=false and destructiveHint=false, and the description adds genuinely non-obvious behavior: project data is never changed, screenshots land in .mcp-cache/renders/, runs can take minutes, a progressToken is needed for progress, and optional chromium/playwright prerequisites are required. This is exactly the added context annotations cannot carry, and it is consistent with (not contradictory to) the annotation set.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Purpose and safety/execution notes are front-loaded, and the dense semicolon-delimited action catalogue is information-dense rather than padded. The single long step sentence is heavy but each clause earns its place by defining a distinct action; it is appropriately sized for the tool's complexity, if somewhat unwieldy to scan.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Despite covering a complex, multi-action tool with no output schema, the description explains the result shape (each step with ok, a finalState, page problems such as errors and missing files), the prerequisites, and the timing/progress mechanisms. An agent has everything it needs to invoke it correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the baseline is 3, but the description goes further by mapping which fields belong to which action (e.g. load {mapId,x,y,direction?,party?...}, advanceText {maxMs?}, walk {direction,steps?}), a correlation the schema's flat property list does not express. It adds real meaning for a polymorphic steps array, though it does not document every field exhaustively.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with a specific verb+resource ('Play the game headless from a script of steps') and concretely frames the outcome ('report what happened'), even giving example assertions like door transfers, NPC lines, and choice branches. This clearly distinguishes it from siblings such as take_screenshot, record_video, and analyze_project.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It gives strong context for when to use it ('no editor or running game needed', headless Chromium boot) and enumerates the exact action vocabulary an agent must choose from. It stops short of naming alternatives or explicit when-not-to-use cases, so it is clear but not fully routing-aware.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
set_project_pathAIdempotent
Switch this server to a DIFFERENT RPG Maker MV project directory for all subsequent tool calls (session-wide side effect; persists until changed again or the server restarts). Validates that the path contains data/System.json and fails with an error otherwise, leaving the previous project active. Returns the new active path. Without this tool, the RPGMAKER_PROJECT_PATH environment variable set at startup applies.
| Name | Required | Description | Default |
|---|---|---|---|
| path | Yes | Absolute path to an RPG Maker MV project root (the folder containing data/System.json and img/) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations provide idempotentHint=true, readOnlyHint=false, destructiveHint=false. The description adds behavioral details: session-wide side effect, path validation (checks for data/System.json), error behavior (fails leaving previous active), and return value (new active path). No contradictions.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three sentences front-load the purpose, then side effect, then return/alternative. No wasted words; every sentence adds value.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the tool's simplicity (one parameter, no output schema), the description covers purpose, side effects, validation, return value, and the alternative (environment variable). No missing critical details.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema covers 100% of parameters with a clear description. The description adds validation context (must contain data/System.json) and emphasizes absolute path, which enhances understanding beyond the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool's purpose: switching to a different RPG Maker MV project directory. It specifies the action (switch), the resource (project directory), and distinguishes from the startup environment variable, making it unique among siblings.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description explains when to use the tool (to change the project directory) and notes the alternative (environment variable at startup). It implies persistence until changed or restart, but doesn't explicitly mention when not to use it or compare with other tools.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
take_screenshotA
Capture the current RPG Maker MV playtest frame through the authenticated MCP bridge and save it as a PNG under .mcp-cache/screenshots/. Returns {path, bytes, mimeType, name} and the PNG itself as an image block (up to 1.5 MB; RPGMV_INLINE_IMAGES=0 turns that off), so you can look at it. Requires manage_system actions install_bridge_plugin, bridge_start, and playtest first. Optional name becomes a safe filename prefix; each capture keeps a timestamp. manage_system {action:"bridge_screenshot"} remains available as a compatibility alias.
| Name | Required | Description | Default |
|---|---|---|---|
| x | No | mapId: with y, a normal screen view centred on this tile instead of the whole map | |
| y | No | ||
| name | No | Optional safe filename prefix, e.g. boss-room or collision-proof | |
| mapId | No | Render this map headless as the engine draws it, with no game running (PNG under .mcp-cache/renders/). Needs the optional playwright-core and a cached Chromium (npx playwright install chromium-headless-shell, or RPGMAKER_MCP_CHROMIUM). | |
| switches | No | mapId: switch IDs to turn ON first, to see later event pages | |
| runEvents | No | mapId: let autorun/parallel events run before the shot (default false) | |
| timeoutMs | No | How long to wait for the game response in milliseconds (default 15000) | |
| showEvents | No | mapId: draw event sprites (default true) | |
| showPlayer | No | mapId: draw the player (default: hidden for the whole map, shown for a view) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations declare non-read-only, non-idempotent, non-destructive, so the description appropriately adds the details they cannot: authenticated bridge requirement, the 1.5 MB inline-image cap with RPGMV_INLINE_IMAGES=0 opt-out, timestamped per-capture filenames, and the returned shape. It doesn't say where files accumulate over time or whether repeated captures collide, a minor gap.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The core action, output, and prerequisites are front-loaded in the first two sentences, and nothing is padded. The prose is dense with clauses and parentheticals, but each sentence still carries usable information.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema, the description compensates by naming the return shape {path, bytes, mimeType, name} and the inline image block, plus the full prerequisite sequence. For a 9-parameter tool with two modes (playtest capture vs headless mapId render), the description is largely complete, though the mode split between screenshots/ and renders/ destinations could be stated more cleanly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 89%, so the schema already documents all nine parameters including the mapId mode, switches, showEvents, and showPlayer semantics. The description only adds that `name` becomes a safe filename prefix and that captures keep a timestamp, which is marginal added meaning over a high-coverage schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a precise verb+resource scoped to RPG Maker MV playtest frames captured through the MCP bridge, and names the output artifact (.mcp-cache/screenshots/ PNG). It is clearly distinguishable from siblings like record_video, analyze_image, or query_map without opening schemas.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives an explicit prerequisite chain (manage_system actions install_bridge_plugin, bridge_start, playtest) and notes the compatibility alias manage_system {action:"bridge_screenshot"}. It stops short of stating when NOT to use it (e.g., versus record_video for motion capture), so it falls just under full routing guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
update_database_entryADestructiveIdempotent
Partially update an existing database entry: only the keys in fields are overwritten (arrays like traits/learnings/actions are replaced wholesale, not merged); the data file is written immediately and there is no undo, so fetch current values with query_database first if you may revert. Returns the full entry after the update. Fails with an error if the ID does not exist. Special append forms that do not need fields: common_events + appendCommand inserts one event command before the list terminator; troops + addEnemyId adds a member at an auto-computed battle position; troops + addPage inserts one battle-event page from a compact trigger. Troops and animations also support plain fields updates now (e.g. rename a troop, replace its members/pages, or relabel an animation). Class params in fields accept 8 seeds (expanded to full curves) or 8 arrays of 100 per-level values. Editing tilesets affects every map using them; malformed flags break passability project-wide.
| Name | Required | Description | Default |
|---|---|---|---|
| id | Yes | ID of the entry to modify (must exist; find it with query_database) | |
| entity | Yes | Which database contains the entry | |
| fields | No | Subset of properties to overwrite, e.g. {"name": "Hero", "price": 250}. Not needed when using appendCommand/addEnemyId/addPage | |
| addPage | No | troops only: append a battle-event page without resending the others. when (at least one, ANDed): turn [a, b] = turn a + b*X (b 0: only turn a); enemyHpBelow [troopSlot from 0, pct]; actorHpBelow [actorId, pct]; switchId; turnEnd true. span battle|turn|moment (default battle). commands: event commands, e.g. from build_event_commands. position: page index to insert at. | |
| addEnemyId | No | troops only: enemy ID to append as a new member at an auto-computed screen position | |
| appendCommand | No | common_events only: one event command {code, indent, parameters} appended before the terminator. Common codes: 101+401=Show Text, 121=Control Switches, 122=Control Variables |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Adds substantial context beyond the annotations: immediate write, no undo, replace-not-merge for arrays, error on nonexistent ID, full-entry return, and cross-cutting side effects (tilesets affect every map; malformed flags break passability project-wide). However, it conflicts mildly with idempotentHint=true, since appendCommand/addEnemyId/addPage are explicitly additive and would duplicate on repeat calls.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the core partial-update and no-undo semantics, and every sentence carries weight for a 6-param, nested-object tool. It is dense to the point of being a wall of text, mixing core behavior with edge cases in one paragraph, which slightly hurts scannability.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Despite no output schema, it states the return ('the full entry after the update') and the failure mode (error if the ID does not exist), and covers all three special append modes plus entity-specific caveats. Nothing an agent needs to call it correctly is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is already 100%, so the 3 baseline applies, but the description genuinely adds meaning: that `fields` is unnecessary with the append parameters, that appendCommand picks up build_event_commands output, and that class params accept 8 seeds or 8 arrays of 100 per-level values. This goes beyond restating the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a precise verb+resource+scope: 'Partially update an existing database entry', with the partial/overwrite semantics spelled out (only keys in `fields` are overwritten; arrays replaced wholesale). An agent can immediately distinguish this from create_database_entry, delete_database_entry, and query_database without opening a schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives concrete when-to-use guidance ('fetch current values with query_database first if you may revert') and routes the special append workflows by entity ('common_events + appendCommand', 'troops + addEnemyId/addPage'). It never states a when-not-to-use condition (e.g. use create_database_entry for new entries), so it stops short of the top band.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
Tool Schema Changelog
Recent tool additions, removals, and schema changes observed during successful MCP inspections.
1 tool update
v5.21.0- Changed
analyze_project1 field changed- changed
Input schema / properties / query / descriptionPrevious value: -"view \"search\": free-text query, e.g. \"the blacksmith\", \"dark forest\""New value: +"view \"search\": Unicode text matching over names/dialogue/notes, e.g. \"the blacksmith\". Offline lexical search, no synonym or translation expansion. Check complete, skippedFiles and warnings."
2 tool updates
v5.19.1- Changed
create_database_entry3 fields changed- changed
Input schema / properties / data / descriptionPrevious value: -"Entry fields. Raw entries: same properties as the RPG Maker database (name, note, traits, params...; effects for items/skills, members [{enemyId,x,y}] for troops, trigger/switchId/list for common_events). Presets: the recipe fields listed in the description"New value: +"Entry fields. Raw entries: same properties as the RPG Maker database (name, note, traits, params...; effects for items/skills, members [{enemyId,x,y}] for troops, trigger/switchId/list for common_events). Presets: the recipe fields listed in the description. Give `data` or `entries`" - added
Input schema / properties / entriesAdded value: +{ + "description": "Instead of `data`: up to 200 data objects, created one after another with the same entity/preset; returns {count, created[]}. A failing entry stops the run and the error names the entries already created", + "items": { + "type": "object" + }, + "type": "array" +} - changed
Input schema / requiredPrevious value: -[ - "data" -]New value: +[]
- Changed
manage_system6 fields changed- changed
Input schema / properties / action / enumPrevious value: -[ - "get", - "set_title", - "name_switch", - "name_variable", - "set_starting_position", - "create_plugin", - "scaffold_project", - "playtest", - "open_editor", - "mine_templates", - "install_bridge_plugin", - "bridge_start", - "bridge_stop", - "bridge_status", - "bridge_telemetry", - "bridge_command", - "take_screenshot", - "bridge_screenshot", - "export_web" -]New value: +[ + "get", + "set_title", + "name_switch", + "name_variable", + "resize_list", + "list_backups", + "restore_backup", + "set_starting_position", + "create_plugin", + "scaffold_project", + "playtest", + "stop_playtest", + "open_editor", + "mine_templates", + "install_bridge_plugin", + "bridge_start", + "bridge_stop", + "bridge_status", + "bridge_telemetry", + "bridge_command", + "take_screenshot", + "bridge_screenshot", + "export_web" +] - added
Input schema / properties / backupAdded value: +{ + "description": "restore_backup: a backup id from list_backups (default: the newest, which undoes the last write)", + "type": "string" +} - changed
Input schema / properties / file / descriptionPrevious value: -"bridge_command \"reload_database\": the data file to re-read, e.g. \"Skills.json\""New value: +"bridge_command \"reload_database\": the data file to re-read, e.g. \"Skills.json\". list_backups/restore_backup: a data file name such as \"Map002.json\" or \"plugins.js\"" - added
Input schema / properties / forceAdded value: +{ + "description": "resize_list: allow shrinking past names that are in use", + "type": "boolean" +} - added
Input schema / properties / keepRunningAdded value: +{ + "description": "playtest: do not close the game a previous playtest started (default false)", + "type": "boolean" +} - added
Input schema / properties / sizeAdded value: +{ + "description": "resize_list: the highest valid switch or variable id (1-5000); `section` picks which", + "type": [ + "number", + "string" + ] +}
11 tool updates
v5.19.0- Changed
analyze_project4 fields changed- added
Input schema / properties / categoryAdded value: +{ + "description": "view \"balance\": analyse one category instead of all four (default \"all\")", + "enum": [ + "skills", + "weapons", + "armors", + "enemies", + "all" + ], + "type": "string" +} - added
Input schema / properties / expectedAdded value: +{ + "description": "view \"metrics\": what kind of space this map is meant to be, which sets the dead-space band (default \"exterior\")", + "enum": [ + "interior", + "dungeon", + "exterior" + ], + "type": "string" +} - added
Input schema / properties / thresholdSdAdded value: +{ + "description": "view \"balance\": how many standard deviations from its peers an entry must sit before it is flagged (default 2; raise to see only the worst)", + "type": [ + "number", + "string" + ] +} - changed
Input schema / properties / view / enumPrevious value: -[ - "overview", - "index", - "validate", - "graph", - "usage", - "explain", - "ast", - "plugins", - "critique", - "refactor", - "search" -]New value: +[ + "overview", + "index", + "validate", + "graph", + "usage", + "explain", + "ast", + "plugins", + "critique", + "metrics", + "balance", + "refactor", + "search" +]
- Added
build_event_commands - Changed
delete_database_entry2 fields changed- changed
Input schema / properties / entity / enumPrevious value: -[ - "actors", - "classes", - "skills", - "items", - "weapons", - "armors", - "enemies", - "states" -]New value: +[ + "actors", + "classes", + "skills", + "items", + "weapons", + "armors", + "enemies", + "states", + "troops", + "animations" +] - added
Input schema / properties / forceAdded value: +{ + "description": "Delete even though something still references it (default false)", + "type": "boolean" +}
- Changed
edit_map6 fields changed- changed
Input schema / properties / action / enumPrevious value: -[ - "fill_layer", - "set_display_names", - "organize_tree", - "connect", - "set_encounters" -]New value: +[ + "paint", + "repair_autotiles", + "fill_layer", + "set_display_names", + "organize_tree", + "connect", + "set_encounters" +] - added
Input schema / properties / cellsAdded value: +{ + "description": "action \"paint\": [[x, y], ...] cells to paint (or give rect)", + "items": { + "items": { + "type": "integer" + }, + "maxItems": 2, + "minItems": 2, + "type": "array" + }, + "type": "array" +} - changed
Input schema / properties / layer / descriptionPrevious value: -"action \"fill_layer\": layer index 0-5"New value: +"actions \"paint\", \"fill_layer\": layer 0-3 tiles, 5 regions (fill_layer also 4)" - changed
Input schema / properties / mapId / descriptionPrevious value: -"action \"fill_layer\": map to modify"New value: +"actions \"paint\", \"repair_autotiles\", \"fill_layer\": map to modify" - added
Input schema / properties / rectAdded value: +{ + "description": "action \"paint\": {x, y, width, height} rectangle to paint (or give cells)", + "properties": { + "height": { + "type": "integer" + }, + "width": { + "type": "integer" + }, + "x": { + "type": "integer" + }, + "y": { + "type": "integer" + } + }, + "type": "object" +} - changed
Input schema / properties / tileId / descriptionPrevious value: -"action \"fill_layer\": tile ID to write into every cell (0 = clear)"New value: +"actions \"paint\", \"fill_layer\": tile ID (0 = clear); on layer 5 a region id 0-255"
- Changed
generate_map6 fields changed- added
Input schema / properties / keepPropsAdded value: +{ + "description": "mode \"semantic\" with a mined templateId: paint the original decorations even onto a different tileset (they may not exist there)", + "type": "boolean" +} - added
Input schema / properties / lockedAdded value: +{ + "description": "mode \"semantic\": put a key and a locked door on the path (default true when there are 4+ rooms)", + "type": "boolean" +} - added
Input schema / properties / loopAdded value: +{ + "description": "mode \"semantic\": add one extra corridor so the map has a loop instead of being a tree (default true)", + "type": "boolean" +} - changed
Input schema / properties / mode / enumPrevious value: -[ - "blank", - "themed", - "procedural", - "batch", - "duplicate", - "template" -]New value: +[ + "blank", + "themed", + "procedural", + "batch", + "duplicate", + "template", + "semantic" +] - added
Input schema / properties / roomsAdded value: +{ + "description": "mode \"semantic\": rooms on the critical path (default 5)", + "type": [ + "number", + "string" + ] +} - added
Input schema / properties / sideRoomsAdded value: +{ + "description": "mode \"semantic\": dead-end rooms hung off the path, the first holding treasure (default 2)", + "type": [ + "number", + "string" + ] +}
- Added
insert_event_commands - Changed
manage_system30 fields changed- changed
Input schema / properties / action / enumPrevious value: -[ - "get", - "set_title", - "name_switch", - "name_variable", - "set_starting_position" -]New value: +[ + "get", + "set_title", + "name_switch", + "name_variable", + "set_starting_position", + "create_plugin", + "scaffold_project", + "playtest", + "open_editor", + "mine_templates", + "install_bridge_plugin", + "bridge_start", + "bridge_stop", + "bridge_status", + "bridge_telemetry", + "bridge_command", + "take_screenshot", + "bridge_screenshot", + "export_web" +] - added
Input schema / properties / authorAdded value: +{ + "description": "create_plugin: @author name", + "type": "string" +} - added
Input schema / properties / bodyAdded value: +{ + "description": "create_plugin: custom JS body; omit for a safe generated skeleton", + "type": "string" +} - added
Input schema / properties / buttonAdded value: +{ + "description": "bridge_command \"press_button\": safe RPG Maker input to press", + "enum": [ + "ok", + "cancel", + "menu", + "up", + "down", + "left", + "right" + ], + "type": "string" +} - added
Input schema / properties / commandAdded value: +{ + "description": "bridge_command: which safe instruction to send to the running game", + "enum": [ + "ping", + "get_state", + "reload_map", + "reload_database", + "capture_screenshot", + "teleport_player", + "interact", + "press_button" + ], + "type": "string" +} - added
Input schema / properties / commandsAdded value: +{ + "description": "create_plugin: plugin command names to document (@command) and wire a pluginCommand handler stub for", + "items": { + "type": "string" + }, + "type": "array" +} - added
Input schema / properties / descriptionAdded value: +{ + "description": "create_plugin: @plugindesc short description", + "type": "string" +} - added
Input schema / properties / destPathAdded value: +{ + "description": "scaffold_project: directory for the NEW project (must be empty of a project). title/mapId/x/y set the new game's title and start position", + "type": "string" +} - added
Input schema / properties / directionAdded value: +{ + "description": "bridge_command \"teleport_player\": facing after the transfer (2 down, 4 left, 6 right, 8 up)", + "type": [ + "number", + "string" + ] +} - added
Input schema / properties / durationMsAdded value: +{ + "description": "bridge_command \"press_button\": hold duration in milliseconds (default 80, range 30-1000)", + "type": [ + "number", + "string" + ] +} - added
Input schema / properties / fileAdded value: +{ + "description": "bridge_command \"reload_database\": the data file to re-read, e.g. \"Skills.json\"", + "type": "string" +} - added
Input schema / properties / helpAdded value: +{ + "description": "create_plugin: @help text (multi-line allowed)", + "type": "string" +} - added
Input schema / properties / installAdded value: +{ + "description": "playtest/open_editor: RPG Maker MV install root (contains nwjs-win/ and RPGMV.exe); defaults to RPGMAKER_MV_INSTALL or the standard Steam install", + "type": "string" +} - added
Input schema / properties / limitAdded value: +{ + "description": "bridge_telemetry: return at most this many of the most recent frames. mine_templates: keep at most this many layouts, largest maps first", + "type": [ + "number", + "string" + ] +} - added
Input schema / properties / minDistinctTilesAdded value: +{ + "description": "mine_templates: a map needs at least this many distinct tiles to count as content rather than scratch (default 10)", + "type": [ + "number", + "string" + ] +} - changed
Input schema / properties / name / descriptionPrevious value: -"name_switch/name_variable: descriptive label, e.g. \"BridgeRepaired\""New value: +"name_switch/name_variable: descriptive label. create_plugin: the plugin name (bare token โ letters/digits/_/-, becomes js/plugins/<name>.js)" - added
Input schema / properties / outDirAdded value: +{ + "description": "export_web: folder for the HTML5 build, outside the project (absolute, or relative to it). It must be new, empty, or a previous export_web folder; <outDir>.zip is written beside it unless zip:false. Copies js, fonts, data and assets, keeps encrypted assets as they are, never copies saves or backups. Returns file counts, bytes and the screen size for an itch.io embed.", + "type": "string" +} - added
Input schema / properties / paramsAdded value: +{ + "description": "create_plugin: @param definitions [{name, type?, desc?, default?}] surfaced in js/plugins.js", + "items": { + "type": "object" + }, + "type": "array" +} - added
Input schema / properties / peekAdded value: +{ + "description": "bridge_telemetry: leave the frames in the buffer instead of consuming them", + "type": "boolean" +} - added
Input schema / properties / portAdded value: +{ + "description": "bridge_start/install_bridge_plugin: loopback port for the live bridge (default 32123, or RPGMV_BRIDGE_PORT)", + "type": [ + "number", + "string" + ] +} - added
Input schema / properties / pruneAdded value: +{ + "description": "export_web: drop img/audio/movies files no data or script references (default false; assets a plugin names only at runtime would be lost)", + "type": "boolean" +} - added
Input schema / properties / screenshotNameAdded value: +{ + "description": "take_screenshot: optional safe filename prefix (letters, numbers, _ and -, up to 64 characters)", + "type": "string" +} - added
Input schema / properties / sourcePathAdded value: +{ + "description": "scaffold_project: a blank-project (NewData) folder to clone; defaults to the RPGMAKER_MV_INSTALL env var or the standard Steam install", + "type": "string" +} - added
Input schema / properties / statusAdded value: +{ + "description": "create_plugin: enable the plugin in js/plugins.js (default true)", + "type": "boolean" +} - added
Input schema / properties / telemetryIntervalAdded value: +{ + "description": "install_bridge_plugin: frames between player-position frames (default 30; 60 = once per second)", + "type": [ + "number", + "string" + ] +} - added
Input schema / properties / testAdded value: +{ + "description": "playtest: run in playtest/test mode (default true; false runs it as a normal launch)", + "type": "boolean" +} - added
Input schema / properties / timeoutMsAdded value: +{ + "description": "bridge_command/take_screenshot: how long to wait for the answer (default 8000, screenshots 15000)", + "type": [ + "number", + "string" + ] +} - added
Input schema / properties / typesAdded value: +{ + "description": "bridge_telemetry: only return these frame types, e.g. [\"exception\",\"log\"]", + "items": { + "type": "string" + }, + "type": "array" +} - added
Input schema / properties / waitAdded value: +{ + "description": "bridge_command: wait for the game to answer (default true; false is fire-and-forget)", + "type": "boolean" +} - added
Input schema / properties / zipAdded value: +{ + "description": "export_web: also write <outDir>.zip with index.html at its root (default true)", + "type": "boolean" +}
- Added
record_video - Added
run_playtest - Added
take_screenshot - Changed
update_database_entry3 fields changed- added
Input schema / properties / addPageAdded value: +{ + "additionalProperties": false, + "description": "troops only: append a battle-event page without resending the others. when (at least one, ANDed): turn [a, b] = turn a + b*X (b 0: only turn a); enemyHpBelow [troopSlot from 0, pct]; actorHpBelow [actorId, pct]; switchId; turnEnd true. span battle|turn|moment (default battle). commands: event commands, e.g. from build_event_commands. position: page index to insert at.", + "properties": { + "commands": { + "items": { + "type": "object" + }, + "type": "array" + }, + "position": { + "type": "integer" + }, + "span": { + "enum": [ + "battle", + "turn", + "moment" + ], + "type": "string" + }, + "when": { + "additionalProperties": false, + "properties": { + "actorHpBelow": { + "items": { + "type": "integer" + }, + "maxItems": 2, + "minItems": 2, + "type": "array" + }, + "enemyHpBelow": { + "items": { + "type": "integer" + }, + "maxItems": 2, + "minItems": 2, + "type": "array" + }, + "switchId": { + "type": "integer" + }, + "turn": { + "items": { + "type": "integer" + }, + "maxItems": 2, + "minItems": 2, + "type": "array" + }, + "turnEnd": { + "type": "boolean" + } + }, + "type": "object" + } + }, + "required": [ + "when" + ], + "type": "object" +} - changed
Input schema / properties / entity / enumPrevious value: -[ - "actors", - "classes", - "skills", - "items", - "weapons", - "armors", - "enemies", - "states", - "tilesets", - "common_events", - "troops" -]New value: +[ + "actors", + "classes", + "skills", + "items", + "weapons", + "armors", + "enemies", + "states", + "tilesets", + "common_events", + "troops", + "animations" +] - changed
Input schema / properties / fields / descriptionPrevious value: -"Subset of properties to overwrite, e.g. {\"name\": \"Hero\", \"price\": 250}. Not needed when using appendCommand/addEnemyId"New value: +"Subset of properties to overwrite, e.g. {\"name\": \"Hero\", \"price\": 250}. Not needed when using appendCommand/addEnemyId/addPage"
2 tool updates
v5.12.2- Added
analyze_project - Changed
manage_map_event3 fields changed- changed
Input schema / properties / action / enumPrevious value: -[ - "create", - "update", - "delete", - "add_command", - "populate" -]New value: +[ + "create", + "update", + "convert", + "delete", + "add_command", + "populate" +] - added
Input schema / properties / kindAdded value: +{ + "description": "action \"convert\": what to turn the existing event into", + "enum": [ + "merchant", + "inn", + "sign" + ], + "type": "string" +} - added
Input schema / properties / optionsAdded value: +{ + "description": "action \"convert\": kind-specific settings โ merchant {goods|items, greeting?}, inn {cost?}, sign {text}", + "type": "object" +}
1 tool update
v5.8.1- Changed
generate_map2 fields changed- changed
Input schema / properties / templateId / descriptionPrevious value: -"mode \"template\" only: bundled template ID from get_project_context detail \"templates\""New value: +"mode \"template\": bundled template ID. mode \"procedural\": OPTIONAL โ force a specific template ID (from get_project_context detail \"templates\") instead of auto-picking by theme+size" - added
Input schema / properties / useTemplateAdded value: +{ + "description": "procedural: when true (default), clone an RTP template for themes that have one (town, dungeon, interior, etc.) instead of generating procedurally. Set false to force procedural generation even when templates exist", + "type": "boolean" +}
109 tool updates
v5.8.0- Removed
add_common_event_command - Removed
add_enemy_to_troop - Removed
add_event_command - Added
analyze_image - Removed
analyze_screenshot - Removed
analyze_tileset_image - Removed
connect_maps - Removed
create_armor - Removed
create_boss_enemy - Removed
create_boss_event - Removed
create_buff_skill - Removed
create_chest - Removed
create_class - Removed
create_common_event - Removed
create_damage_skill - Added
create_database_entry - Removed
create_enemy - Removed
create_healing_skill - Removed
create_inn - Removed
create_item - Removed
create_map - Removed
create_map_event - Removed
create_npc - Removed
create_puzzle_switch - Removed
create_random_encounter_troop - Removed
create_shop - Removed
create_skill - Removed
create_state - Removed
create_state_skill - Removed
create_teleport_event - Removed
create_troop - Removed
create_weapon - Removed
delete_actor - Removed
delete_class - Added
delete_database_entry - Removed
delete_enemy - Removed
delete_item - Removed
delete_map_event - Removed
delete_skill - Removed
delete_state - Removed
duplicate_map - Added
edit_map - Removed
fill_map_layer - Added
generate_map - Removed
generate_map_batch - Removed
generate_map_v3 - Removed
get_all_skills - Removed
get_animation - Removed
get_animations - Removed
get_armors - Removed
get_class - Removed
get_classes - Removed
get_common_events - Removed
get_enemies - Removed
get_enemy - Removed
get_game_title - Removed
get_items - Removed
get_map - Removed
get_map_event - Removed
get_map_events - Removed
get_map_infos - Changed
get_project_context4 fields changed- added
Input schema / properties / categoryAdded value: +{ + "description": "detail \"templates\": filter by template category", + "type": "string" +} - added
Input schema / properties / detailAdded value: +{ + "description": "How much and what kind of context; see the tool description. Default \"full\"", + "enum": [ + "full", + "summary", + "assets", + "tileset", + "templates" + ], + "type": "string" +} - added
Input schema / properties / themeAdded value: +{ + "description": "detail \"templates\": filter by template theme", + "type": "string" +} - added
Input schema / properties / tilesetIdAdded value: +{ + "description": "detail \"tileset\": which tileset to categorize", + "type": [ + "number", + "string" + ] +}
- Removed
get_project_summary - Removed
get_skill - Removed
get_skills - Removed
get_state - Removed
get_states - Removed
get_switches - Removed
get_system - Removed
get_tile_ids_for_tileset - Removed
get_tileset - Removed
get_tilesets - Removed
get_troop - Removed
get_troops - Removed
get_variables - Removed
get_weapons - Added
manage_map_event - Added
manage_system - Removed
organize_map_tree - Removed
populate_map_events - Added
query_database - Added
query_map - Removed
read_screenshot - Removed
render_map_ascii - Removed
scan_project_assets - Removed
search_actors - Removed
search_classes - Removed
search_enemies - Removed
search_items - Removed
search_map_events - Removed
search_skills - Removed
search_states - Removed
set_map_display_names - Changed
set_project_path1 field changed- changed
Input schema / properties / path / descriptionPrevious value: -"Absolute path to the new RPG Maker MV project directory"New value: +"Absolute path to an RPG Maker MV project root (the folder containing data/System.json and img/)"
- Removed
set_switch_name - Removed
set_variable_name - Removed
update_actor - Removed
update_class - Removed
update_common_event - Added
update_database_entry - Removed
update_enemy - Removed
update_game_title - Removed
update_item - Removed
update_map_event - Removed
update_skill - Removed
update_starting_position - Removed
update_state - Removed
update_tileset - Removed
validate_map
99 tool updates
v1.0.0- First observed
add_common_event_command - First observed
add_enemy_to_troop - First observed
add_event_command - First observed
analyze_screenshot - First observed
analyze_tileset_image - First observed
connect_maps - First observed
create_armor - First observed
create_boss_enemy - First observed
create_boss_event - First observed
create_buff_skill - First observed
create_chest - First observed
create_class - First observed
create_common_event - First observed
create_damage_skill - First observed
create_enemy - First observed
create_healing_skill - First observed
create_inn - First observed
create_item - First observed
create_map - First observed
create_map_event - First observed
create_npc - First observed
create_puzzle_switch - First observed
create_random_encounter_troop - First observed
create_shop - First observed
create_skill - First observed
create_state - First observed
create_state_skill - First observed
create_teleport_event - First observed
create_troop - First observed
create_weapon - First observed
delete_actor - First observed
delete_class - First observed
delete_enemy - First observed
delete_item - First observed
delete_map_event - First observed
delete_skill - First observed
delete_state - First observed
duplicate_map - First observed
fill_map_layer - First observed
generate_map_batch - First observed
generate_map_v3 - First observed
get_all_skills - First observed
get_animation - First observed
get_animations - First observed
get_armors - First observed
get_class - First observed
get_classes - First observed
get_common_events - First observed
get_enemies - First observed
get_enemy - First observed
get_game_title - First observed
get_items - First observed
get_map - First observed
get_map_event - First observed
get_map_events - First observed
get_map_infos - First observed
get_project_context - First observed
get_project_summary - First observed
get_skill - First observed
get_skills - First observed
get_state - First observed
get_states - First observed
get_switches - First observed
get_system - First observed
get_tile_ids_for_tileset - First observed
get_tileset - First observed
get_tilesets - First observed
get_troop - First observed
get_troops - First observed
get_variables - First observed
get_weapons - First observed
organize_map_tree - First observed
populate_map_events - First observed
read_screenshot - First observed
render_map_ascii - First observed
scan_project_assets - First observed
search_actors - First observed
search_classes - First observed
search_enemies - First observed
search_items - First observed
search_map_events - First observed
search_skills - First observed
search_states - First observed
set_map_display_names - First observed
set_project_path - First observed
set_switch_name - First observed
set_variable_name - First observed
update_actor - First observed
update_class - First observed
update_common_event - First observed
update_enemy - First observed
update_game_title - First observed
update_item - First observed
update_map_event - First observed
update_skill - First observed
update_starting_position - First observed
update_state - First observed
update_tileset - First observed
validate_map
TDQS
Scored across 18 tools
Most tools are distinguishable by name, but there is real overlap among the read-only intelligence tools: analyze_project, get_project_context, query_map, and query_database all expose project/asset inspection, and validation/search appears in both analyze_project and query_map. Transfer-event creation also exists in both edit_map ('connect') and manage_map_event ('teleport'/'door'), and take_screenshot duplicates manage_system's bridge_screenshot alias. Descriptions disambiguate somewhat, but an agent can plausibly misselect.
Every tool follows a clean snake_case verb_noun pattern (query_database, create_database_entry, edit_map, manage_map_event, take_screenshot, set_project_path). Verbs are used consistently and predictably (query/get/analyze for reads, create/update/delete for writes, manage/edit for mutation). No mixed conventions.
18 tools is reasonable for a full RPG Maker MV authoring suite spanning analysis, database CRUD, map generation/editing, events, system settings, playtest, and media capture. The count is slightly inflated in practice because several tools (analyze_project, manage_system, edit_map, manage_map_event, generate_map) bundle many internal actions/views, but the top-level surface stays well-scoped.
Coverage is broad: full database CRUD, map generate/edit/query, event presets and command building/insertion, system settings, playtest, screenshots, video, and image analysis โ a genuinely complete authoring lifecycle with backups. Minor gaps remain, notably no delete/rename-map operation (only create/edit/query) and no direct tile/plugin removal, though these are largely workable via other tools.
Maintenance
Related MCP Connectors
A comprehensive Model Context Protocol (MCP) server that enables AI assistants to interact with yoโฆ
Nifty's MCP server โ exposes tasks, projects, messages, and files as tools for AI agents.
MCP Server for Slima - AI Writing IDE for Novel Authors with AI Beta Reader.
A comprehensive Model Context Protocol (MCP) server that enables AI assistants to control Unreal Eโฆ
Related MCP Servers
- AlicenseBqualityDmaintenanceEnables AI agents to directly manipulate RPG Maker MZ projects through natural language commands, allowing creation and modification of game assets like items, weapons, enemies, maps, and plugins without manually editing game files.36192 npm2MIT
- AlicenseCqualityDmaintenanceEnables AI models to develop and automate RPG Maker MZ projects by creating maps, events, and plugins through natural language commands. It provides comprehensive tools for database management, asset integrity checks, and direct map tile manipulation.284 npm1ISC
- AlicenseCqualityDmaintenanceA Model Context Protocol server that enables management of RPG Maker MZ and MV project data, including actors, items, maps, and events. It allows users to create, update, and search game assets through natural language integration with MCP-compatible clients.372MIT
- AlicenseNot gradedqualityCmaintenanceA local, file-based bridge that lets an AI client read, draft, validate, and safely write content into an RPG Maker MV project.3MIT