Skip to main content
Glama
README.md
# Battle Arena MCP Server

An MCP (Model Context Protocol) server that connects AI agents to the **Battle Arena - AI Strategy Competition** game. Run battles, tournaments, and analyze strategies programmatically.

## What is this?

This MCP server wraps the Battle Arena REST API, giving any MCP-compatible AI agent (like Manus) direct access to:

- **List strategies** — See all available student and example fighters
- **Get strategy code** — Read the source code of any strategy
- **Run battles** — Pit two strategies against each other with configurable HP
- **Run tournaments** — Round-robin competition with leaderboard
- **Get game rules** — All damage values, ranges, and mechanics

## Quick Start

### Option 1: Use with Manus (Custom MCP Connector)

1. In your Manus project, go to **Settings → Connectors → Custom MCP**
2. Add this server with the command:
   ```
   npx battle-arena-mcp
   ```
3. Set the environment variable (optional, defaults to the hosted arena):
   ```
   BATTLE_ARENA_URL=https://battle-arena.manus.space
   ```

### Option 2: Run Locally

```bash
# Clone and install
git clone https://github.com/Oscarlight/battle-arena-mcp.git
cd battle-arena-mcp
npm install
npm run build

# Run
node dist/index.js
```

### Option 3: npx (no install)

```bash
npx battle-arena-mcp
```

## Environment Variables

| Variable | Default | Description |
|----------|---------|-------------|
| `BATTLE_ARENA_URL` | `https://battle-arena.manus.space` | Base URL of the Battle Arena API |

## Available Tools

### `list_strategies`

Lists all available strategies with their IDs, names, and fighting styles.

**Example response:**
```json
{
  "strategies": [
    { "id": "jayden", "name": "Jayden", "style": "Balanced adaptive", "source": "student" },
    { "id": "rushdown_rex", "name": "Rushdown Rex", "style": "Aggressive pressure", "source": "example" }
  ],
  "total": 23
}
```

### `get_strategy_code`

Returns the JavaScript source code of a strategy.

**Parameters:**
- `id` (required): Strategy ID from `list_strategies`

### `run_battle`

Runs a 1v1 battle. Provide strategies by ID or custom code.

**Parameters:**
- `strategyIdA` / `strategyA`: Strategy A (by ID or code)
- `strategyIdB` / `strategyB`: Strategy B (by ID or code)
- `hp` (optional): HP value, 50-1000. Default: 100. Tournament: 250.
- `includeTurnLog` (optional): Include full turn-by-turn data

**Example response:**
```json
{
  "winner": "Jayden",
  "winnerSide": "A",
  "nameA": "Jayden",
  "nameB": "80 Year Old Grandpa",
  "finalHpA": 48,
  "finalHpB": 0,
  "totalTurns": 55,
  "hp": 250
}
```

### `run_tournament`

Runs a round-robin tournament between 2-20 strategies.

**Parameters:**
- `strategyIds` (optional): Array of strategy IDs
- `strategies` (optional): Array of custom strategies with `code` and optional `id`
- `hp` (optional): HP for all matches

**Example response:**
```json
{
  "hp": 250,
  "totalMatches": 6,
  "leaderboard": [
    { "id": "jayden", "name": "Jayden", "wins": 2, "losses": 1, "winRate": 67 }
  ],
  "matches": [...]
}
```

### `get_game_rules`

Returns all game constants (damage, ranges, stamina, etc.).

## Writing Custom Strategies

A strategy is a JavaScript function that receives game state and returns an action:

```javascript
// Strategy Name: My Fighter
// Strategy Style: Aggressive rushdown

function strategy(state) {
  // Available state:
  // state.myHp, state.enemyHp, state.distanceToEnemy
  // state.myStamina, state.isInLightRange, state.isInHeavyRange
  // state.turn, state.myIsRecovering, state.enemyIsRecovering
  // state.mustAttackSoon, state.mustMoveSoon
  
  // Available actions:
  // "move_up", "move_down", "move_left", "move_right"
  // "dash_toward", "dash_away"
  // "light_attack", "heavy_attack"
  // "block", "grab", "special"
  
  if (state.distanceToEnemy > 2) return "dash_toward";
  if (state.isInHeavyRange) return "heavy_attack";
  return "light_attack";
}
```

## REST API (Direct Access)

The MCP server wraps these public endpoints:

| Method | Endpoint | Description |
|--------|----------|-------------|
| GET | `/api/strategies` | List all strategies |
| GET | `/api/strategies/:id/code` | Get strategy source code |
| POST | `/api/simulate` | Run a single battle |
| POST | `/api/tournament` | Run a round-robin tournament |
| GET | `/api/rules` | Get game constants |

No authentication required. Rate limited to 30 requests/minute.

## License

MIT

TDQS

A4.1/5.0

Scored across 5 tools

Disambiguation5/5

Each tool has a clearly distinct purpose: rules, strategy code retrieval, listing strategies, single battle, and tournament. No ambiguity.

Naming Consistency5/5

All tools follow a consistent verb_noun pattern (get_game_rules, get_strategy_code, list_strategies, run_battle, run_tournament).

Tool Count5/5

5 tools is well-scoped for a battle arena server, covering essential actions without unnecessary bloat.

Completeness4/5

Core battle lifecycle is covered, but missing strategy creation/modification tools and persistent result storage are missing, assuming strategies are externally defined.

Maintenance

ActivityStale
ResponsivenessNo issues