Play Command & Conquer Red Alert RTS — build bases, train armies, and defeat AI opponents using 48 MCP tools.
---
name: openra-rl
description: Play Command & Conquer Red Alert RTS — build bases, train armies, and defeat AI opponents using 48 MCP tools.
version: 1.1.0
metadata:
openclaw:
emoji: "🎮"
homepage: https://github.com/yxc20089/OpenRA-RL
requires:
bins:
- docker
env: []
install:
- kind: uv
package: openra-rl
bins: [openra-rl]
os: ["macos", "linux"]
---
# OpenRA-RL: Play Command & Conquer Red Alert
You are an AI agent playing **Command & Conquer: Red Alert**, a classic real-time strategy (RTS) game. You control one faction (Allied or Soviet) and must build a base, gather resources, train an army, and destroy the enemy.
The game runs in a Docker container. You interact through MCP tools that let you observe the battlefield, issue orders, and advance game time.
## Quick Start
### 1. Install
```bash
pip install openra-rl
```
### 2. Start the game server
```bash
openra-rl server start
```
This pulls the Docker image and starts the game server on port 8000. Verify with `openra-rl server status`.
### 3. Configure MCP
Add to your OpenClaw config (`~/.openclaw/openclaw.json`):
```json
{
"mcpServers": {
"openra-rl": {
"command": "openra-rl",
"args": ["mcp-server"]
}
}
}
```
### 4. Play
Tell your agent: *"Start a game of Red Alert and try to win."*
The agent will use the MCP tools listed below to observe and command.
---
## How the Game Works
- **Real-time**: The game runs continuously at ~25 ticks/second. Call `advance(ticks)` to let time pass.
- **Fog of war**: You can only see areas near your units/buildings. Scout to find the enemy.
- **Resources**: Harvest ore to earn credits. Credits buy buildings and units.
- **Power**: Buildings need power. Build Power Plants (`powr`) to stay powered. Low power slows production.
- **Tech tree**: Advanced buildings require prerequisites (e.g., War Factory needs Ore Refinery).
---
## MCP Tools Reference
### Observation (read the battlefield)
| Tool | Purpose |
|------|---------|
| `get_game_state` | Full snapshot: economy, units, buildings, enemies, production, military stats |
| `get_economy` | Cash, ore, power balance, harvester count |
| `get_units` | Your units with position, health, type, stance, speed, attack range |
| `get_buildings` | Your buildings with production queues, power, can_produce list |
| `get_enemies` | Visible enemy units and buildings (fog-of-war limited) |
| `get_production` | Current build queue + what you can build right now |
| `get_map_info` | Map name, dimensions |
| `get_exploration_status` | % explored, quadrant breakdown, whether enemy base found |
### Knowledge (learn the game)
| Tool | Purpose |
|------|---------|
| `lookup_unit(unit_type)` | Stats for a unit (e.g., `lookup_unit("e1")` → Rifle Infantry) |
| `lookup_building(building_type)` | Stats for a building (e.g., `lookup_building("weap")` → War Factory) |
| `lookup_tech_tree(faction)` | Full build order for `"allied"` or `"soviet"` |
| `lookup_faction(faction)` | All units and buildings for a faction |
| `get_faction_briefing()` | Comprehensive stats dump for YOUR faction |
| `get_map_analysis()` | Resource patches, water, terrain, strategic notes |
| `batch_lookup(queries)` | Multiple lookups in one call |
### Game Control
| Tool | Purpose |
|------|---------|
| `advance(ticks)` | **Critical** — advances the game by N ticks. Nothing happens without this. Use 25 ticks ≈ 1 second, 250 ticks ≈ 10 seconds. |
### Movement & Combat
| Tool | Purpose |
|------|---------|
| `move_units(unit_ids, target_x, target_y)` | Move units to a position |
| `attack_move(unit_ids, target_x, target_y)` | Move and engage enemies along the way |
| `attack_target(unit_ids, target_actor_id)` | Focus-fire a specific enemy |
| `stop_units(unit_ids)` | Halt movement and attacks |
| `guard_target(unit_ids, target_actor_id)` | Guard a unit or building |
| `set_stance(unit_ids, stance)` | Set to `"holdfire"`, `"returnfire"`, `"defend"`, or `"attackanything"` |
| `harvest(unit_id, cell_x, cell_y)` | Send harvester to ore field |
### Production
| Tool | Purpose |
|------|---------|
| `build_unit(unit_type, count)` | Train units (e.g., `build_unit("e1", 5)` → 5 Rifle Infantry) |
| `build_structure(building_type)` | Start constructing a building (needs manual placement) |
| `build_and_place(building_type, cell_x, cell_y)` | Build + auto-place when done (preferred) |
| `place_building(building_type, cell_x, cell_y)` | Place a completed building |
| `cancel_production(item_type)` | Cancel queued production |
| `get_valid_placements(building_type)` | Get valid locations to place a building |
### Building Management
| Tool | Purpose |
|------|---------|
| `deploy_unit(unit_id)` | Deploy MCV into Construction Yard |
| `sell_building(building_id)` | Sell for partial refund |
| `repair_building(building_id)` | Toggle auto-repair |
| `set_rally_point(building_id, cell_x, cell_y)` | New units go here |
| `power_down(building_id)` | Toggle power to save electricity |
| `set_primary(building_id)` | Set as primary production building |
### Unit Groups
| Tool | Purpose |
|------|---------|
| `assign_group(group_name, unit_ids)` | Create a named group |
| `add_to_group(group_name, unit_ids)` | Add units to existing group |
| `get_groups()` | List all groups |
| `command_group(group_name, command_type, ...)` | Command entire group |
### Compound Actions
| Tool | Purpose |
|------|---------|
| `batch(actions)` | Execute multiple actions in ONE tick (no time advance) |
| `plan(steps)` | Execute steps sequentially with state refresh between each |
### Utility
| Tool | Purpose |
|------|---------|
| `surrender()` | Give up the current game |
| `get_replay_path()` | Path to the replay file |
| `get_terrain_at(cell_x, cell_y)` | Terrain type at a cell |
### Planning Phase (optional)
| Tool | Purpose |
|------|---------|
| `start_planning_phase()` | Begin pre-game strategy planning |
| `get_opponent_intel()` | AI opponent profile and counters |
| `end_planning_phase(strategy)` | Commit strategy and start playing |
| `get_planning_status()` | Check planning state |
---
## How to Play (Strategy Guide)
### Step 1: Deploy your MCV
At game start you have a Mobile Construction Vehicle (MCV). Deploy it to create your Construction Yard:
```
1. Call get_units() to find your MCV (type "mcv")
2. Call deploy_unit(mcv_actor_id)
3. Call advance(50) to let it deploy
```
### Step 2: Build your base
Follow this build order:
| Order | Building | Type Code | Cost | Why |
|-------|----------|-----------|------|-----|
| 1 | Power Plant | `powr` | $300 | Powers everything |
| 2 | Barracks | `tent` (Allied) or `barr` (Soviet) | $300 | Infantry production |
| 3 | Ore Refinery | `proc` | $2000 | Income + free harvester |
| 4 | War Factory | `weap` | $2000 | Vehicle production (requires Refinery) |
| 5 | More Power | `powr` | $300 | Keep power positive |
Use `build_and_place()` — it auto-places when construction finishes:
```
1. Call get_valid_placements("powr") to find a good spot
2. Call build_and_place("powr", cell_x, cell_y)
3. Call advance(250) to let it build (~10 seconds)
4. Check get_production() to confirm completion
5. Repeat for next building
```
**Important**: Your faction may be Allied OR Soviet. Check `get_game_state()` → `faction` field. Barracks type depends on faction.
### Step 3: Train your army
```
1. Call build_unit("e1", 5) for 5 Rifle Infantry ($100 each)
2. Call advance(100) to let them train
3. Once War Factory is ready: build_unit("3tnk", 3) for Medium Tanks ($800 each)
4. Set rally point near base exit: set_rally_point(barracks_id, x, y)
```
**Key units by faction:**
| Unit | Code | Cost | Role |
|------|------|------|------|
| Rifle Infantry | `e1` | $100 | Cheap, fast |
| Rocket Soldier | `e3` | $300 | Anti-armor |
| Medium Tank | `3tnk` | $800 | Main battle tank |
| Heavy Tank | `4tnk` | $950 | Soviet heavy armor |
| Light Tank | `1tnk` | $700 | Fast flanker |
| Artillery | `arty` | $600 | Long range |
| V2 Launcher | `v2rl` | $700 | Soviet long range |
### Step 4: Scout the map
Send a cheap unit to explore:
```
1. Train one Rifle Infantry
2. Call attack_move([unit_id], far_x, far_y) toward unexplored areas
3. Call advance(500) to let it travel
4. Call get_enemies() to see what you've found
```
### Step 5: Attack the enemy
Once you have 8-10 combat units:
```
1. Call get_enemies() to find enemy buildings
2. Call attack_move(all_unit_ids, enemy_base_x, enemy_base_y)
3. Call advance(100), check get_game_state() for battle progress
4. If enemies visible: attack_target(unit_ids, enemy_id) to focus fire
5. Keep producing reinforcements while attacking
```
### Step 6: Macro (ongoing economy)
Throughout the game:
- Keep power positive (build Power Plants when needed)
- Keep producing units — never let production idle
- Build additional Ore Refineries for more income
- Replace lost harvesters
---
## Game Loop Pattern
A good agent loop looks like this:
```
1. get_game_state() → read the situation
2. Decide what to do based on:
- Economy: enough cash? Power positive?
- Production: anything building? Queue empty?
- Military: under attack? Ready to attack?
- Exploration: enemy found yet?
3. Issue orders (build, move, attack)
4. advance(50-250) → let time pass
5. Repeat until game is won or lost
```
Check `get_game_state()` → `done` field. When true, `result` will be `"win"` or `"loss"`.
---
## Tips
- **Always call `advance()`** after issuing orders. Orders don't execute until game time passes.
- **Use `batch()`** to issue multiple orders in one tick (e.g., build + move + set rally).
- **Check `available_production`** before building — it lists what you CAN build right now.
- **Don't let production idle** — keep queuing units. Idle production wastes time.
- **Build near your Construction Yard** — buildings must be placed adjacent to existing structures.
- **Power matters** — if power goes negative, production slows to a crawl.
- **Use `attack_move`** instead of `move` when heading toward enemies — units will engage threats.
- **A completed building blocks the queue** until placed. Always use `build_and_place()` to avoid this.
---
## Troubleshooting
| Problem | Solution |
|---------|----------|
| Server not running | `openra-rl server start` (needs Docker) |
| Can't build anything | Deploy MCV first with `deploy_unit()` |
| Building won't place | Use `get_valid_placements()` for valid spots |
| No money | Build Ore Refinery (`proc`) for harvesters |
| Production slow | Check power with `get_economy()` — build Power Plants |
| Can't find enemy | Scout with `attack_move` to unexplored quadrants |
## Links
- **GitHub**: https://github.com/yxc20089/OpenRA-RL
- **PyPI**: https://pypi.org/project/openra-rl/
- **Leaderboard**: https://huggingface.co/spaces/yxc20089/OpenRA-Bench
- **Discord**: https://discord.gg/openra-rl
don't have the plugin yet? install it then click "run inline in claude" again.