openrct2-mcp
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., "@openrct2-mcpList rides by excitement"
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.
OpenRCT2 MCP AI Park Control
Bridge a running OpenRCT2 game to Cursor (or any MCP client) so AI agents can read park state, optimize parks, and build roller coasters.
Quick links: License · Issues · Third-party notices
Prerequisites
OpenRCT2 0.5.x with RCT2 game files installed
Python 3.11+
Node.js 18+ (plugin packaging only)
This repo was tested against OpenRCT2 v0.5.1 on macOS.
Related MCP server: game-mcp
Quick setup
# 1. Install Python deps + openrct2-bridge plugin
chmod +x scripts/*.sh
./scripts/install-bridge.sh
# 2. Install ride-builder coaster plugin
./scripts/build-plugins.sh
# 3. Launch OpenRCT2, load a park save
# Check the in-game console for:
# - Bridge port (starts at 20020)
# - Ride-builder port (starts at 20021)
# 4. Verify connections (with OpenRCT2 running and a park loaded)
./scripts/check-connection.sh
# Optional: automated headless smoke test
.venv/bin/python scripts/verify-e2e.pyCursor MCP
Project MCP config lives at .cursor/mcp.json (portable template: .cursor/mcp.json.example). Paths use ${workspaceFolder} and set PYTHONPATH to mcp-server/ so python -m openrct2_mcp resolves without a global install. Copy or adapt the example if your editor does not expand ${workspaceFolder}.
Reload MCP servers in Cursor after OpenRCT2 is running with a loaded park.
Note: End-to-end tools (live park mutations, vision capture, coaster placement) require a running OpenRCT2 instance with plugins loaded. CI runs offline unit tests only.
Example prompts:
"Use openrct2_status, then get_park_overview and suggest three improvements."
"List rides sorted by excitement and close the worst performer."
"Build a small wooden coaster: coaster_create, then loop coaster_get_valid_pieces / coaster_place_piece until the circuit completes."
Architecture
Cursor AI --MCP--> Python MCP server --TCP--> openrct2-bridge (park ops)
`--TCP--> ride-builder (coasters)Component | Role |
82 game actions, 77 state queries via pyrct2 | |
| Coaster-specific TCP API (valid pieces, place track, test ratings) |
| Curated MCP tools wrapping both plugins |
MCP tools
Park optimization
Tool | Description |
| Connection health for bridge + ride-builder |
| Rating, guests, cash, scenario objective |
| All rides with ratings and profit (fast per-ride queries) |
| One ride by id |
| Complaints and awards |
| One guest by entity id |
| Guest count by default; |
| Place flat rides (e.g. |
| Place stalls (e.g. |
| Paths, queues, benches, bins |
| Hire staff, list, set patrol/orders (by staff_id) |
| Per-staff patrol management |
| Patrol box covering path tiles |
| Hire + assign staff along main paths |
| Complaints, low satisfaction, recommendations |
| Park-scale spatial grids |
| Path graph and build surveys |
| Theme along paths (see |
| Decoration and terrain |
| Ride operations |
| Rank rides needing refurbish by downtime and reliability (Maintenance tab metrics) |
| Renew a ride (resets age/reliability; closes and waits for guests by default) |
| Entrance fee, open/close park |
| Step simulation ticks |
| Research state |
Coaster building
Tool | Description |
| Start a new coaster shell |
| Legal next track pieces |
| Place validated track ( |
| Place next piece from valid endpoint (Z-safe) |
| Build flexible perimeter loop along guide ring (detours around obstacles) |
| Perimeter obstacle heatmap (paths, track, scenery, slopes, unowned ring stats) |
| Dry-run simulate route (probe+undo, no permanent build) |
| Beam search 2–4 pieces ahead |
| Buy/clear/flatten along guide corridor ( |
| Endpoint context with height + collisions |
| Ground |
| Z vs ground; per-piece collision probe |
| Create coaster + BeginStation at surveyed tile |
| Rank pieces by clearance, height fit, and collisions |
| Remove last piece |
| Place entrance/exit |
| Test ride and return ratings |
| Current excitement/intensity/nausea |
| Demolish coaster |
| Valid ride object indices |
Coaster workflow
list_loaded_ride_objects— pick a validride_objectindexcoaster_site_survey_tool(x, y)— find flattile_zand nearby obstaclescoaster_start_track_tool(x, y)orcoaster_create+ manual station placementLoop:
coaster_rank_next_pieces_toolorcoaster_probe_piece_tool→coaster_place_next_pieceWhen circuit completes:
coaster_finish_station→coaster_test
Use get_tile_height_tool for a single tile; coaster_height_context_tool for endpoint Z vs ground.
Perimeter coaster workflow
coaster_obstacle_map_tool(inset=18)— survey ring clearance and unowned tiles on the guide ringcoaster_plan_route_tool(inset=18)— simulate trace without buildingOptional:
coaster_prepare_corridor_tool(dry_run=true)then apply withconfirm_destructive=truecoaster_build_perimeter(dry_run=true)→coaster_build_perimeter— execute build
Terminal debug (no MCP): .venv/bin/python scripts/plan-coaster-route.py --simulate --inset 18
Vision (screenshots + spatial context)
The MCP server can see the park window while also returning structured map data.
Tool | What it does |
| Screenshot of the OpenRCT2 window (returned as an MCP image) |
| ASCII path/queue grid + nearby rides + optional screenshot |
Recommended build loop:
inspect_area_at_tile(39, 44)— Triple Corkscrew entrance area (example)Plan paths / queue / ride placement from ASCII map + screenshot
Apply changes via
manage_paths,place_stall,coaster_*, etc.capture_game_view— verify visually
macOS setup: System Settings → Privacy & Security → Screen Recording → enable Cursor (and Terminal if testing from CLI). Without this, tools fall back to text-only context.
Set OPENRCT2_VISION_MAX_WIDTH=1280 (default) to limit screenshot size.
Agent skill
See skills/openrct2-park-director/SKILL.md for orchestration workflows (perimeter coasters, cute themes, staff patrol).
Reload ride-builder after updates: ./scripts/build-plugins.sh then restart OpenRCT2 (plugin loads at launch).
Ride operations (P6)
Tool | Description |
| Inspection every 10–120 minutes |
| Throughput tuning |
| Composite fix for struggling rides ( |
| Demolish any ride ( |
| Now supports |
Land, finance, guests (P7–P9)
Tool | Description |
| Land survey and terraforming |
| Business loop |
| Research and objectives |
| Guest intelligence |
Advanced building and safety (P10–P11)
Tool | Description |
| Path-following coasters, clipboard designs |
| Smart placement |
| Safety checkpoints and action journal |
Destructive tools | Require |
Performance
Large parks (1000+ guests, many rides) make bulk bridge queries slow or prone to timeout.
The MCP server avoids the worst patterns:
Slow (avoid) | Fast (used instead) |
|
|
|
|
| Scalar |
Tile-by-tile map scans | Not exposed via MCP (too many round-trips) |
Footpath scan (fill benches/bins) |
|
list_guests defaults to guest count only. Pass full_scan=true only if you accept a long wait.
Reload the MCP server after pulling performance updates.
Configuration
Environment variables (set in .cursor/mcp.json):
Variable | Default | Purpose |
|
| Bridge plugin TCP port |
|
| Ride-builder TCP port |
|
| Per-request bridge timeout (seconds) |
|
| Per-request ride-builder timeout (seconds) |
OpenRCT2 config.ini recommendations:
macOS:
~/Library/Application Support/OpenRCT2/config.iniLinux:
~/.config/OpenRCT2/config.ini
Override the user data directory with OPENRCT2_USER_PATH (used by install-bridge.sh).
[plugin]
enable_hot_reloading = trueinstall-bridge.sh enables hot reloading automatically.
Contributing
./scripts/install-bridge.sh— Python venv, bridge plugin, hot reload./scripts/build-plugins.sh— ride-builder pluginpytest mcp-server/tests -q— offline unit tests (no OpenRCT2 required).venv/bin/python scripts/verify-e2e.py— optional smoke test with OpenRCT2 running
Development
# Run MCP server manually
export PYTHONPATH=mcp-server
.venv/bin/python -m openrct2_mcp
# Rebuild ride-builder after edits
./scripts/build-plugins.sh
# Reload plugin in-game (hot reload) or restart OpenRCT2Safety notes
Building tools pause the game before mutations.
build_in_pause_modecheat is enabled on connect for automation.Coaster tools require the ride-builder plugin; park tools require openrct2-bridge.
License
MIT. See NOTICE for third-party attribution. Ride-builder plugin derived from openrct2-ridecreation-api.
This server cannot be deployed
Maintenance
Related MCP Connectors
MCP server for OpenMM — exposes market data, account, trading, and strategy tools to AI agents
- FensoryOAuthcom.fensory
Trading MCP server for AI agents, with live market data, account reads and controlled execution.
A comprehensive Model Context Protocol (MCP) server that enables AI assistants to control Unreal E…
Live competitive-game predictions, meta data and decision tools for AI agents.
Related MCP Servers
- AlicenseBqualityCmaintenanceA bridge between Unity and AI assistants that enables AI to interact with Unity game environments through a standardized interface for code execution, scene analysis, and runtime debugging.355 npm7MIT
- AlicenseNot gradedqualityDmaintenanceBridges AI assistants to running game instances for testing, debugging, and verification. Works with any game engine via a simple TCP protocol.11 npmMIT
- AlicenseNot gradedqualityAmaintenanceA local MCP bridge between AI applications and the Potassium Roblox client.46 npm1Apache 2.0
- FlicenseNot gradedqualityBmaintenanceEnables an agent to sidecar-manage an OpenRCT2 park while you play: reading park state, adjusting prices, staff, marketing, loans, taking screenshots, and controlling game time, with management-only actions that never build.-