rct2-agent
Click on "Deploy Server".
Wait a few minutes for the server to deploy. Once ready, it will show a "Started" state.
In the chat, type
@followed by the MCP server name and your instructions, e.g., "@rct2-agentCheck the park's finances and recommend the best ride price changes."
That's it! The server will respond to your query, and you can continue using it as needed.
Here is a step-by-step guide with screenshots.
rct2-agent
An MCP server + OpenRCT2 plugin that lets an agent sidecar-manage your park while you play: read the state, act on the business (prices, staff, marketing, loans), lay footpaths, put up shops and build rides, see the park (screenshots), and control time.
Building stops short of track. The agent can place footpaths, stalls and facilities, and flat rides — merry-go-round, ferris wheel, dodgems, haunted house and the rest, each a single track piece it can drop whole, with its entrance and exit. Tracked rides (roller coasters, transport rides) are still hands-off: they are built segment by segment, and there is no tool for that.
How it fits together
Claude Code (WSL)
│ stdio (MCP)
▼
MCP server ── dist/server.mjs, run by Windows node.exe
│ TCP 127.0.0.1:7860 (newline-delimited JSON)
▼
Plugin (intransient) ── loaded inside OpenRCT2, LISTENS on the port
│
▼
OpenRCT2 gameThe server runs under Windows node.exe (there is no node in WSL), so both
the server and the plugin sit on the same Windows localhost — no WSL↔Windows
networking involved. The plugin listens (it's intransient, so it stays alive
across park loads); the server dials in and reconnects as needed.
Related MCP server: Roblox Executor MCP
Requirements
OpenRCT2 0.5.4+ (QuickJS engine — needed for Promises/ES2023).
Windows Node.js (found here at
C:\Program Files\nodejs\node.exe).
Build & install
From WSL, using the Windows toolchain:
# helper wrappers (or just call node.exe / npm-cli.js directly)
NODE="/mnt/c/Program Files/nodejs/node.exe"
NPM=("$NODE" "C:\\Program Files\\nodejs\\node_modules\\npm\\bin\\npm-cli.js")
"${NPM[@]}" install
"${NPM[@]}" run build # builds dist/rct2-agent.plugin.js + dist/server.mjs
"${NPM[@]}" run install:plugin # copies the plugin into your OpenRCT2 plugin folderinstall:plugin copies to
C:\Users\casey\OneDrive\Documents\OpenRCT2\plugin\rct2-agent.plugin.js
(override with RCT2_PLUGIN_DIR).
Wire up the MCP server
A ready-to-use project config is in .mcp.json. In Claude Code, from the project
directory, it will be picked up automatically (approve it when prompted), or add
it explicitly:
claude mcp add rct2-agent --scope project \
-- "/mnt/c/Program Files/nodejs/node.exe" \
"C:\\Users\\casey\\OneDrive\\Desktop\\dead code projects\\rct2-agent\\dist\\server.mjs"Run
Launch OpenRCT2 and load a scenario. Confirm the plugin loaded — the in-game console shows
[rct2-agent] listening on 127.0.0.1:7860.Start Claude Code in this folder. The MCP server connects on first tool call.
Ask the agent to manage the park. The core loop is measure → act → wait → measure: read baselines, make changes,
advance_days(7), re-measure.
Tools
Read (eyes): get_park_summary, get_finance_report, list_rides,
get_ride, list_shops, get_guest_overview, sample_guest_thoughts,
list_staff, get_scenario
Act (hands): set_ride_price, set_shop_price, set_park_entry_fee,
set_park_open, open_ride, close_ride, set_inspection_interval,
start_marketing_campaign, set_research_funding, hire_staff, fire_staff,
set_staff_patrol, set_loan
Build — survey: inspect_area, get_tile_detail, check_ride_access
Build — footpaths: list_path_styles, place_path, remove_path
Build — shops & facilities: list_shop_types, build_shop, remove_shop
Build — flat rides: list_ride_types, build_ride, build_ride_entrance,
remove_ride
See (vision): capture_view, capture_ride, find_location,
find_park_entrance
Time: get_clock, set_game_speed, pause, resume, advance_days
Save: snapshot, list_snapshots
Notes on behavior
Money is in plain dollars at the tool boundary; internally OpenRCT2 stores tenths, converted in
src/shared/protocol.ts(MONEY_FACTOR). If a value looks off by 10×, that's the one knob to check.Coordinates in
capture_view/set_staff_patrol/find_locationare in tiles (converted to map units internally).advance_daysunpauses, runs at max speed, and auto-pauses when the target date is reached — then returns the new clock. It blocks until done.Snapshots save to
save/agent__<play>__<label>.park, flat in the save root so they appear in the in-game Load Game menu —context.saveGamesilently refuses any filename with a path separator, so subfolders are not possible. Restoring is a manual Load in-game — the plugin API can save but not load a park.Writes go through game actions, so the game's own limits apply (e.g. the ride price cap). A rejected action comes back as a tool error.
Paths are one tile per call.
place_pathreports what the new tile actually connected to and, more usefully, which neighbours it missed and by how much — a path one land level off its neighbour looks like a finished route from above and is not walkable.Shops are entered from one side. A stall or facility has no entrance element; guests use it from the single neighbouring tile it faces.
build_shopturns the shop toward an adjacent path automatically, so building the path first is the easy order. Build it the other way round and you must passdirectionyourself — there is no rotate action, so a shop facing the wrong way has to be removed and rebuilt.check_ride_accessreports the facing side for shops and all four neighbours, so a mistake is visible.Facilities are shops here. Toilets, first aid, the cash machine and the information kiosk build exactly like a food stall and go through the same
list_shop_types/build_shop/remove_shoptools. The information kiosk is the one that sits on a different track piece and can be entered from all four sides, so its facing does not matter (usableFromAnySideincheck_ride_access).A new shop opens closed and priced at 0 —
build_shopsays so in its result. Follow up withset_shop_priceandopen_ride.Flat rides cover a block, not a tile.
list_ride_typesgives each type'sfootprintandoriginOffset; the x,y passed tobuild_rideis the piece's origin, which for every 3x3 ride is the centre tile, so a merry-go-round at (50,50) covers (49,49)–(51,51). All of it must be owned, clear and level.Only some sides of a ride will hold an entrance. Which ones is fixed by the track piece. The game accepts a
rideentranceexitplaceon any tile and then silently deletes an entrance on a disallowed side the next time it validates the ride, sobuild_ridepicks from the legal sides only — preferring one a footpath already reaches — andcheck_ride_accessreports them asentranceSiteswhen a piece is missing. The table of legal sides per piece lives inFLAT_PIECESin the plugin, mirroring OpenRCT2's ownTED.FlatRide.h.A new ride opens closed and priced at 0, same as a shop, and
open_riderefuses until the entrance and exit are both built and reachable. Guests reach the entrance over itsconnectAttile, and that wants a queue line (place_pathwithqueue: true); a plain path at the exit'sconnectAtis enough.There is no rotate action for rides either —
remove_rideand build again with a differentdirection.
Dev
npm run typecheck— tsc, no emit.node scripts/smoke.mjs— loads the built plugin into a stubbed game and exercises the handlers over a real socket.node scripts/mcp-smoke.mjs— spawns the built MCP server and drives it with real MCP JSON-RPC against a fake plugin.
Layout
src/shared/protocol.ts wire protocol + money conversion + method names
src/plugin/main.ts the intransient in-game plugin (TCP listener + handlers)
src/server/rct-client.ts reconnecting TCP client to the plugin
src/server/index.ts MCP server: tool definitions -> plugin methods
esbuild.mjs builds both bundles
scripts/ install + smoke testsThis server cannot be deployed
Maintenance
Related MCP Connectors
MCP server for OpenMM — exposes market data, account, trading, and strategy tools to AI agents
MCP server exposing the Backtest360 engine API as tools for AI agents.
Nifty's MCP server — exposes tasks, projects, messages, and files as tools for AI agents.
A comprehensive Model Context Protocol (MCP) server that enables AI assistants to control Unreal E…
Related MCP Servers
- AlicenseNot gradedqualityBmaintenanceBridges a running OpenRCT2 game to AI agents, enabling them to read park state, optimize parks, and build roller coasters.1MIT
- AlicenseNot gradedqualityAmaintenanceEnables AI agents to interact with a running Roblox game client to execute Lua code, inspect scripts, spy on remotes, and more.56 npm216MIT
- AlicenseAqualityBmaintenanceEnables AI agents to execute Lua code, inspect scripts, spy on remotes, and interact with a running Roblox game client through an MCP interface.62256 npm1MIT
- AlicenseBqualityAmaintenanceEnables AI agents and scripts to inspect objects, call functions, and run Lua in a running UE4SS game via MCP, with no sockets or admin rights required.14MIT