> ## Documentation Index
> Fetch the complete documentation index at: https://docs.summerengine.com/llms.txt
> Use this file to discover all available pages before exploring further.

# Operations: summer router

> AI characters, voices and images inside a shipped game: characters, settings, limits and usage. For each operation: what it does, whether it asks you first, its inputs and an example call.

AI characters, voices and images inside a shipped game: characters, settings, limits and usage. 11 operations. How to call them, and what the answers mean: [Operations reference](https://docs.summerengine.com/mcp/operations.md).

> [!NOTE]
>
> Generated from the `summer-engine` npm package `4.8.0`: its public operation catalog (`registry/operations/public-catalog.json`) and its engine and local operations. If something here is wrong, the operation's definition is wrong.

| Operation | What it does | Asks you first |
| - | - | - |
| [`router.character_versions`](#character_versions) | Every saved version of one Summer Router character, newest first, with when it was saved and if it was deleted. | Never |
| [`router.delete_character`](#delete_character) | Hide a Summer Router character from players at once; its versions stay and saving it brings it back. | Yes, by default |
| [`router.get_character`](#get_character) | One Summer Router character: its whole document (instructions, model, voice, tools, limits, overridable fields, provider options) and version, or a saved version. | Never |
| [`router.list_characters`](#list_characters) | A game's Summer Router characters: id, name, version, model, voice and tools. | Never |
| [`router.models`](#models) | Summer Router's models, voices, kinds with their GDScript call and status (replies, speech, images now; transcription, live voice soon), character schema, error fixes. | Never |
| [`router.save_character`](#save_character) | Save a Summer Router character as its next version; the same document changes nothing. | Not by default |
| [`router.set_account_limit`](#set_account_limit) | Ask the person to change the monthly cap for all their games; Summer Router stops calls past it. | Always |
| [`router.set_settings`](#set_settings) | Ask the person to turn Summer Router on or off for a game, or change its caps, call rates or default models (spend from their account). | Always |
| [`router.settings`](#settings) | A game's Summer Router switch, caps (per player per day, per game per day and month, calls per minute), default models and the owner's cap for all games. | Never |
| [`router.test_character`](#test_character) | Talk to a Summer Router character as a test player: replies, tool calls, units. | Not by default |
| [`router.usage`](#usage) | A game's Summer Router calls by kind over the last UTC days, units used, each cap's percent used, and the calls each cap stopped (capHits). | Never |

***

### character\_versions

`router.character_versions`: **List an AI character's versions**

> [!NOTE]
>
> Preview: search finds it and `summer_call` runs it. It may still change.

Every saved version of one Summer Router character, newest first, with when it was saved and if it was deleted. Next: router.get\_character with a version. Summer Router works on games published on Summer Games. Coming soon for all platforms and storefronts.

| | |
| - | - |
| **MCP** | `summer_call` with `"op": "router.character_versions"` |
| **CLI** | `summer router character-versions` |
| **Runs** | On Summer's servers: the hosted MCP, or the npm MCP after `summer login`. Needs your Summer sign-in. |
| **Effect** | Reads only. Changes nothing. |
| **Asks you first** | No. It changes nothing. |

**Inputs:**

| Input | Type | Required | Description |
| - | - | - | - |
| `gameId` | string | Yes | From games.list. |
| `characterId` | string | Yes | Lowercase character id, like guard (from router.list\_characters). |

> **Input JSON schema**
>
> ```json theme={null}
> {
>   "type": "object",
>   "properties": {
>     "gameId": {
>       "description": "From games.list.",
>       "type": "string",
>       "pattern": "^[A-Za-z0-9_-]{1,128}$"
>     },
>     "characterId": {
>       "description": "Lowercase character id, like guard (from router.list_characters).",
>       "type": "string",
>       "pattern": "^[a-z][a-z0-9_-]{0,63}$"
>     }
>   },
>   "required": [
>     "gameId",
>     "characterId"
>   ]
> }
> ```

> **Result JSON schema**
>
> ```json theme={null}
> {
>   "type": "object",
>   "properties": {
>     "gameId": {
>       "type": "string"
>     },
>     "characterId": {
>       "type": "string"
>     },
>     "versions": {
>       "type": "array",
>       "items": {
>         "type": "object",
>         "properties": {
>           "version": {
>             "type": "integer",
>             "minimum": -9007199254740991,
>             "maximum": 9007199254740991
>           },
>           "updatedAt": {
>             "type": "string"
>           },
>           "deleted": {
>             "type": "boolean"
>           },
>           "name": {
>             "anyOf": [
>               {
>                 "type": "string"
>               },
>               {
>                 "type": "null"
>               }
>             ]
>           }
>         },
>         "required": [
>           "version",
>           "updatedAt",
>           "deleted",
>           "name"
>         ],
>         "additionalProperties": false
>       }
>     }
>   },
>   "required": [
>     "gameId",
>     "characterId",
>     "versions"
>   ],
>   "additionalProperties": false
> }
> ```

**Example:** The guard character's history.

```json MCP theme={null}
{
  "name": "summer_call",
  "arguments": {
    "op": "router.character_versions",
    "input": {
      "gameId": "game_quilt",
      "characterId": "guard"
    }
  }
}
```

```bash CLI theme={null}
summer router character-versions --game-id game_quilt --character-id guard
```

***

### delete\_character

`router.delete_character`: **Delete an AI character**

> [!NOTE]
>
> Preview: search finds it and `summer_call` runs it. It may still change.

Hide a Summer Router character from players at once; its versions stay and saving it brings it back. Asks the person unless they allow Delete for good. Next: router.list\_characters. Summer Router works on games published on Summer Games. Coming soon for all platforms and storefronts.

| | |
| - | - |
| **MCP** | `summer_call` with `"op": "router.delete_character"` |
| **CLI** | `summer router delete-character` |
| **Runs** | On Summer's servers: the hosted MCP, or the npm MCP after `summer login`. Needs your Summer sign-in. |
| **Effect** | Removes or stops something for good. |
| **Asks you first** | Yes: **Delete for good** is off by default in Agent permissions. |

**Inputs:**

| Input | Type | Required | Description |
| - | - | - | - |
| `gameId` | string | Yes | From games.list. |
| `characterId` | string | Yes | Lowercase character id, like guard (from router.list\_characters). |
| `dryRun` | boolean | No | Check and describe the call without doing it: nothing changes, nothing is spent. |
| `idempotencyKey` | string | No | Retry key. Reuse it only to retry the identical request, so it never happens twice. Length 1 to 128. |

> **Input JSON schema**
>
> ```json theme={null}
> {
>   "type": "object",
>   "properties": {
>     "gameId": {
>       "description": "From games.list.",
>       "type": "string",
>       "pattern": "^[A-Za-z0-9_-]{1,128}$"
>     },
>     "characterId": {
>       "description": "Lowercase character id, like guard (from router.list_characters).",
>       "type": "string",
>       "pattern": "^[a-z][a-z0-9_-]{0,63}$"
>     },
>     "dryRun": {
>       "description": "Check and describe the call without doing it: nothing changes, nothing is spent.",
>       "type": "boolean"
>     },
>     "idempotencyKey": {
>       "description": "Retry key. Reuse it only to retry the identical request, so it never happens twice.",
>       "type": "string",
>       "minLength": 1,
>       "maxLength": 128
>     }
>   },
>   "required": [
>     "gameId",
>     "characterId"
>   ]
> }
> ```

> **Result JSON schema**
>
> ```json theme={null}
> {
>   "type": "object",
>   "properties": {
>     "gameId": {
>       "type": "string"
>     },
>     "characterId": {
>       "type": "string"
>     },
>     "deleted": {
>       "type": "boolean",
>       "const": true
>     }
>   },
>   "required": [
>     "gameId",
>     "characterId",
>     "deleted"
>   ],
>   "additionalProperties": false
> }
> ```

**Example:** Remove the guard character.

```json MCP theme={null}
{
  "name": "summer_call",
  "arguments": {
    "op": "router.delete_character",
    "input": {
      "gameId": "game_quilt",
      "characterId": "guard"
    }
  }
}
```

```bash CLI theme={null}
summer router delete-character --game-id game_quilt --character-id guard
```

***

### get\_character

`router.get_character`: **Read an AI character**

> [!NOTE]
>
> Preview: search finds it and `summer_call` runs it. It may still change.

One Summer Router character: its whole document (instructions, model, voice, tools, limits, overridable fields, provider options) and version, or a saved version. Next: router.save\_character. Summer Router works on games published on Summer Games. Coming soon for all platforms and storefronts.

| | |
| - | - |
| **MCP** | `summer_call` with `"op": "router.get_character"` |
| **CLI** | `summer router get-character` |
| **Runs** | On Summer's servers: the hosted MCP, or the npm MCP after `summer login`. Needs your Summer sign-in. |
| **Effect** | Reads only. Changes nothing. |
| **Asks you first** | No. It changes nothing. |

**Inputs:**

| Input | Type | Required | Description |
| - | - | - | - |
| `gameId` | string | Yes | From games.list. |
| `characterId` | string | Yes | Lowercase character id, like guard (from router.list\_characters). |
| `version` | integer | No | A saved version instead of the current one (router.character\_versions). Range 1 to 9007199254740991. |

> **Input JSON schema**
>
> ```json theme={null}
> {
>   "type": "object",
>   "properties": {
>     "gameId": {
>       "description": "From games.list.",
>       "type": "string",
>       "pattern": "^[A-Za-z0-9_-]{1,128}$"
>     },
>     "characterId": {
>       "description": "Lowercase character id, like guard (from router.list_characters).",
>       "type": "string",
>       "pattern": "^[a-z][a-z0-9_-]{0,63}$"
>     },
>     "version": {
>       "description": "A saved version instead of the current one (router.character_versions).",
>       "type": "integer",
>       "minimum": 1,
>       "maximum": 9007199254740991
>     }
>   },
>   "required": [
>     "gameId",
>     "characterId"
>   ]
> }
> ```

> **Result JSON schema**
>
> ```json theme={null}
> {
>   "type": "object",
>   "properties": {
>     "gameId": {
>       "type": "string"
>     },
>     "characterId": {
>       "type": "string"
>     },
>     "version": {
>       "type": "integer",
>       "minimum": -9007199254740991,
>       "maximum": 9007199254740991
>     },
>     "deleted": {
>       "type": "boolean"
>     },
>     "updatedAt": {
>       "type": "string"
>     },
>     "file": {
>       "type": "string"
>     },
>     "character": {
>       "type": "object",
>       "additionalProperties": {}
>     }
>   },
>   "required": [
>     "gameId",
>     "characterId",
>     "version",
>     "deleted",
>     "updatedAt",
>     "file",
>     "character"
>   ],
>   "additionalProperties": false
> }
> ```

**Example:** Read the guard character.

```json MCP theme={null}
{
  "name": "summer_call",
  "arguments": {
    "op": "router.get_character",
    "input": {
      "gameId": "game_quilt",
      "characterId": "guard"
    }
  }
}
```

```bash CLI theme={null}
summer router get-character --game-id game_quilt --character-id guard
```

***

### list\_characters

`router.list_characters`: **List a game's AI characters**

> [!NOTE]
>
> Preview: search finds it and `summer_call` runs it. It may still change.

A game's Summer Router characters: id, name, version, model, voice and tools. The game calls one by its id. Next: router.get\_character or router.save\_character. Summer Router works on games published on Summer Games. Coming soon for all platforms and storefronts.

| | |
| - | - |
| **MCP** | `summer_call` with `"op": "router.list_characters"` |
| **CLI** | `summer router list-characters` |
| **Runs** | On Summer's servers: the hosted MCP, or the npm MCP after `summer login`. Needs your Summer sign-in. |
| **Effect** | Reads only. Changes nothing. |
| **Asks you first** | No. It changes nothing. |

**Inputs:**

| Input | Type | Required | Description |
| - | - | - | - |
| `gameId` | string | Yes | From games.list. |

> **Input JSON schema**
>
> ```json theme={null}
> {
>   "type": "object",
>   "properties": {
>     "gameId": {
>       "description": "From games.list.",
>       "type": "string",
>       "pattern": "^[A-Za-z0-9_-]{1,128}$"
>     }
>   },
>   "required": [
>     "gameId"
>   ]
> }
> ```

> **Result JSON schema**
>
> ```json theme={null}
> {
>   "type": "object",
>   "properties": {
>     "gameId": {
>       "type": "string"
>     },
>     "characters": {
>       "type": "array",
>       "items": {
>         "type": "object",
>         "properties": {
>           "id": {
>             "type": "string"
>           },
>           "name": {
>             "anyOf": [
>               {
>                 "type": "string"
>               },
>               {
>                 "type": "null"
>               }
>             ]
>           },
>           "version": {
>             "type": "integer",
>             "minimum": -9007199254740991,
>             "maximum": 9007199254740991
>           },
>           "model": {
>             "type": "string"
>           },
>           "voice": {
>             "anyOf": [
>               {
>                 "type": "string"
>               },
>               {
>                 "type": "null"
>               }
>             ]
>           },
>           "tools": {
>             "type": "array",
>             "items": {
>               "type": "string"
>             }
>           },
>           "updatedAt": {
>             "type": "string"
>           }
>         },
>         "required": [
>           "id",
>           "name",
>           "version",
>           "model",
>           "voice",
>           "tools",
>           "updatedAt"
>         ],
>         "additionalProperties": false
>       }
>     },
>     "studioUrl": {
>       "type": "string"
>     }
>   },
>   "required": [
>     "gameId",
>     "characters",
>     "studioUrl"
>   ],
>   "additionalProperties": false
> }
> ```

**Example:** Which AI characters does my game have?

```json MCP theme={null}
{
  "name": "summer_call",
  "arguments": {
    "op": "router.list_characters",
    "input": {
      "gameId": "game_quilt"
    }
  }
}
```

```bash CLI theme={null}
summer router list-characters --game-id game_quilt
```

***

### models

`router.models`: **List Summer Router models and voices**

> [!NOTE]
>
> Preview: search finds it and `summer_call` runs it. It may still change.

Summer Router's models, voices, kinds with their GDScript call and status (replies, speech, images now; transcription, live voice soon), character schema, error fixes. Next: router.save\_character. Summer Router works on games published on Summer Games. Coming soon for all platforms and storefronts.

| | |
| - | - |
| **MCP** | `summer_call` with `"op": "router.models"` |
| **CLI** | `summer router models` |
| **Runs** | On Summer's servers: the hosted MCP, or the npm MCP after `summer login`. Needs your Summer sign-in. |
| **Effect** | Reads only. Changes nothing. |
| **Asks you first** | No. It changes nothing. |

**Inputs:**

| Input | Type | Required | Description |
| - | - | - | - |
| `include` | "models" \| "voices" \| "kinds" \| "schema" \| "errors"\[] | No | Parts to read; default models, voices and kinds. Items 0 to 5. |

> **Input JSON schema**
>
> ```json theme={null}
> {
>   "type": "object",
>   "properties": {
>     "include": {
>       "description": "Parts to read; default models, voices and kinds.",
>       "maxItems": 5,
>       "type": "array",
>       "items": {
>         "type": "string",
>         "enum": [
>           "models",
>           "voices",
>           "kinds",
>           "schema",
>           "errors"
>         ]
>       }
>     }
>   }
> }
> ```

> **Result JSON schema**
>
> ```json theme={null}
> {
>   "type": "object",
>   "properties": {
>     "models": {
>       "type": "array",
>       "items": {
>         "type": "object",
>         "properties": {
>           "id": {
>             "type": "string"
>           },
>           "kind": {
>             "type": "string"
>           },
>           "name": {
>             "type": "string"
>           },
>           "default": {
>             "type": "boolean"
>           }
>         },
>         "required": [
>           "id",
>           "kind",
>           "name",
>           "default"
>         ],
>         "additionalProperties": false
>       }
>     },
>     "voices": {
>       "type": "array",
>       "items": {
>         "type": "object",
>         "properties": {
>           "id": {
>             "type": "string"
>           },
>           "name": {
>             "type": "string"
>           },
>           "cast": {
>             "type": "string"
>           },
>           "traits": {
>             "type": "string"
>           }
>         },
>         "required": [
>           "id",
>           "name",
>           "cast",
>           "traits"
>         ],
>         "additionalProperties": false
>       }
>     },
>     "kinds": {
>       "type": "array",
>       "items": {
>         "type": "object",
>         "properties": {
>           "id": {
>             "type": "string"
>           },
>           "title": {
>             "type": "string"
>           },
>           "status": {
>             "type": "string"
>           },
>           "gdscript": {
>             "anyOf": [
>               {
>                 "type": "string"
>               },
>               {
>                 "type": "null"
>               }
>             ]
>           },
>           "docsUrl": {
>             "anyOf": [
>               {
>                 "type": "string"
>               },
>               {
>                 "type": "null"
>               }
>             ]
>           }
>         },
>         "required": [
>           "id",
>           "title",
>           "status",
>           "gdscript",
>           "docsUrl"
>         ],
>         "additionalProperties": false
>       }
>     },
>     "schemas": {
>       "type": "object",
>       "additionalProperties": {}
>     },
>     "errors": {
>       "type": "array",
>       "items": {
>         "type": "object",
>         "properties": {
>           "tag": {
>             "type": "string"
>           },
>           "retryable": {
>             "type": "boolean"
>           },
>           "fix": {
>             "type": "string"
>           }
>         },
>         "required": [
>           "tag",
>           "retryable",
>           "fix"
>         ],
>         "additionalProperties": false
>       }
>     },
>     "unavailable": {
>       "type": "array",
>       "items": {
>         "type": "string"
>       }
>     },
>     "file": {
>       "type": "string"
>     }
>   },
>   "required": [
>     "file"
>   ],
>   "additionalProperties": false
> }
> ```

**Example:** Which models and voices can a character use?

```json MCP theme={null}
{
  "name": "summer_call",
  "arguments": {
    "op": "router.models",
    "input": {
      "include": [
        "models",
        "voices"
      ]
    }
  }
}
```

```bash CLI theme={null}
summer router models --include models --include voices
```

***

### save\_character

`router.save_character`: **Save an AI character**

> [!NOTE]
>
> Preview: search finds it and `summer_call` runs it. It may still change.

Save a Summer Router character as its next version; the same document changes nothing. A live game's players talk to it at once, so there the person approves. Next: router.test\_character. Summer Router works on games published on Summer Games. Coming soon for all platforms and storefronts.

| | |
| - | - |
| **MCP** | `summer_call` with `"op": "router.save_character"` |
| **CLI** | `summer router save-character` |
| **Runs** | On Summer's servers: the hosted MCP, or the npm MCP after `summer login`. Needs your Summer sign-in. |
| **Effect** | Changes what players see or pay, or who can act on a game. |
| **Asks you first** | No: **Prices and live changes** is on by default in Agent permissions. When it is off, your agent asks you first. |

**Inputs:**

| Input | Type | Required | Description |
| - | - | - | - |
| `gameId` | string | Yes | From games.list. |
| `character` | object | Yes | The whole character document, as the project keeps it in ai/characters/\<id>.json; fields left out are removed. |
| `character.id` | string | Yes | Lowercase id the game calls it by, e.g. guard. |
| `character.name` | string | No | Length 1 to 80. |
| `character.instructions` | string | Yes | Who the character is and how it talks. \{\{variable}} placeholders must be declared in variables. Length 1 to 20000. |
| `character.first_message` | string | No | Length 1 to 2000. |
| `character.language` | string | No | Like en or pt-BR. |
| `character.variables` | object | No | Declared \{\{variable}} names and their defaults (at most 32). |
| `character.model` | string | No | A text model id from router.models; empty uses the game default. |
| `character.temperature` | number | No | Range 0 to 2. |
| `character.max_output_tokens` | integer | No | Range 1 to 8192. |
| `character.reasoning` | "off" \| "low" \| "medium" \| "high" | No | |
| `character.voice` | object | No | |
| `character.voice.id` | string | No | A voice id from router.models (voices). |
| `character.voice.design` | string | No | A text description of a voice to design and pin on push. Length 1 to 1000. |
| `character.voice.stability` | number | No | Range 0 to 1. |
| `character.voice.similarity` | number | No | Range 0 to 1. |
| `character.voice.style` | number | No | Range 0 to 1. |
| `character.voice.speed` | number | No | Range 0.5 to 2. |
| `character.turn` | object | No | Realtime voice turn-taking. |
| `character.turn.mode` | "server\_vad" \| "push\_to\_talk" | No | |
| `character.turn.interruptions` | boolean | No | |
| `character.turn.silence_end_ms` | integer | No | Range 100 to 10000. |
| `character.session` | object | No | Realtime voice session bounds. |
| `character.session.max_seconds` | integer | No | Range 10 to 3600. |
| `character.session.idle_seconds` | integer | No | Range 5 to 600. |
| `character.tools` | object\[] | No | Items 0 to 32. |
| `character.tools[].name` | string | Yes | The function the game handles, e.g. open\_gate. |
| `character.tools[].description` | string | Yes | When the character calls it. Length 1 to 1024. |
| `character.tools[].parameters` | object | Yes | JSON Schema object of its arguments, e.g. \{"type":"object","properties":\{"gate":\{"type":"string"}}}. |
| `character.tools[].runs_on` | "client" \| "authority" | No | client (default): the calling game runs it. |
| `character.tools[].timeout_ms` | integer | No | Range 100 to 60000. |
| `character.limits` | object | No | Inside the game and account caps. |
| `character.limits.player_daily_micro_usd` | integer | No | This character, per player per day, in micro-dollars. Range 1 to 500000000. |
| `character.limits.game_daily_micro_usd` | integer | No | This character, for the whole game per day, in micro-dollars. Range 1 to 500000000. |
| `character.overridable` | "first\_message" \| "variables" \| "language" \| "instructions" \| "model" \| "temperature" \| "max\_output\_tokens" \| "reasoning" \| "voice" \| "turn" \| "session"\[] | No | Fields a build may set at session start. |
| `character.provider_options` | object | No | Provider fields Summer has not normalized yet, by provider (vercel-ai-gateway, elevenlabs); checked against that provider's schema. |
| `expectedVersion` | integer | No | Save only if the current version is this; 0 saves only a new character. Range 0 to 9007199254740991. |
| `dryRun` | boolean | No | Check and describe the call without doing it: nothing changes, nothing is spent. |
| `idempotencyKey` | string | No | Retry key. Reuse it only to retry the identical request, so it never happens twice. Length 1 to 128. |

> **Input JSON schema**
>
> ```json theme={null}
> {
>   "type": "object",
>   "properties": {
>     "gameId": {
>       "description": "From games.list.",
>       "type": "string",
>       "pattern": "^[A-Za-z0-9_-]{1,128}$"
>     },
>     "character": {
>       "description": "The whole character document, as the project keeps it in ai/characters/<id>.json; fields left out are removed.",
>       "type": "object",
>       "properties": {
>         "id": {
>           "description": "Lowercase id the game calls it by, e.g. guard.",
>           "type": "string",
>           "pattern": "^[a-z][a-z0-9_-]{0,63}$"
>         },
>         "name": {
>           "type": "string",
>           "minLength": 1,
>           "maxLength": 80
>         },
>         "instructions": {
>           "description": "Who the character is and how it talks. {{variable}} placeholders must be declared in variables.",
>           "type": "string",
>           "minLength": 1,
>           "maxLength": 20000
>         },
>         "first_message": {
>           "type": "string",
>           "minLength": 1,
>           "maxLength": 2000
>         },
>         "language": {
>           "description": "Like en or pt-BR.",
>           "type": "string",
>           "pattern": "^[a-z]{2,3}(-[A-Z]{2})?$"
>         },
>         "variables": {
>           "description": "Declared {{variable}} names and their defaults (at most 32).",
>           "type": "object",
>           "additionalProperties": {
>             "type": "string",
>             "maxLength": 500
>           }
>         },
>         "model": {
>           "description": "A text model id from router.models; empty uses the game default.",
>           "type": "string",
>           "pattern": "^[a-z0-9][a-z0-9._-]{0,63}$"
>         },
>         "temperature": {
>           "type": "number",
>           "minimum": 0,
>           "maximum": 2
>         },
>         "max_output_tokens": {
>           "type": "integer",
>           "minimum": 1,
>           "maximum": 8192
>         },
>         "reasoning": {
>           "type": "string",
>           "enum": [
>             "off",
>             "low",
>             "medium",
>             "high"
>           ]
>         },
>         "voice": {
>           "type": "object",
>           "properties": {
>             "id": {
>               "description": "A voice id from router.models (voices).",
>               "type": "string",
>               "pattern": "^[A-Za-z0-9_-]{1,64}$"
>             },
>             "design": {
>               "description": "A text description of a voice to design and pin on push.",
>               "type": "string",
>               "minLength": 1,
>               "maxLength": 1000
>             },
>             "stability": {
>               "type": "number",
>               "minimum": 0,
>               "maximum": 1
>             },
>             "similarity": {
>               "type": "number",
>               "minimum": 0,
>               "maximum": 1
>             },
>             "style": {
>               "type": "number",
>               "minimum": 0,
>               "maximum": 1
>             },
>             "speed": {
>               "type": "number",
>               "minimum": 0.5,
>               "maximum": 2
>             }
>           },
>           "additionalProperties": {}
>         },
>         "turn": {
>           "description": "Realtime voice turn-taking.",
>           "type": "object",
>           "properties": {
>             "mode": {
>               "type": "string",
>               "enum": [
>                 "server_vad",
>                 "push_to_talk"
>               ]
>             },
>             "interruptions": {
>               "type": "boolean"
>             },
>             "silence_end_ms": {
>               "type": "integer",
>               "minimum": 100,
>               "maximum": 10000
>             }
>           },
>           "additionalProperties": {}
>         },
>         "session": {
>           "description": "Realtime voice session bounds.",
>           "type": "object",
>           "properties": {
>             "max_seconds": {
>               "type": "integer",
>               "minimum": 10,
>               "maximum": 3600
>             },
>             "idle_seconds": {
>               "type": "integer",
>               "minimum": 5,
>               "maximum": 600
>             }
>           },
>           "additionalProperties": {}
>         },
>         "tools": {
>           "maxItems": 32,
>           "type": "array",
>           "items": {
>             "type": "object",
>             "properties": {
>               "name": {
>                 "description": "The function the game handles, e.g. open_gate.",
>                 "type": "string",
>                 "pattern": "^[A-Za-z_][A-Za-z0-9_]{0,63}$"
>               },
>               "description": {
>                 "description": "When the character calls it.",
>                 "type": "string",
>                 "minLength": 1,
>                 "maxLength": 1024
>               },
>               "parameters": {
>                 "description": "JSON Schema object of its arguments, e.g. {\"type\":\"object\",\"properties\":{\"gate\":{\"type\":\"string\"}}}.",
>                 "type": "object",
>                 "additionalProperties": {}
>               },
>               "runs_on": {
>                 "description": "client (default): the calling game runs it.",
>                 "type": "string",
>                 "enum": [
>                   "client",
>                   "authority"
>                 ]
>               },
>               "timeout_ms": {
>                 "type": "integer",
>                 "minimum": 100,
>                 "maximum": 60000
>               }
>             },
>             "required": [
>               "name",
>               "description",
>               "parameters"
>             ],
>             "additionalProperties": {}
>           }
>         },
>         "limits": {
>           "description": "Inside the game and account caps.",
>           "type": "object",
>           "properties": {
>             "player_daily_micro_usd": {
>               "description": "This character, per player per day, in micro-dollars.",
>               "type": "integer",
>               "minimum": 1,
>               "maximum": 500000000
>             },
>             "game_daily_micro_usd": {
>               "description": "This character, for the whole game per day, in micro-dollars.",
>               "type": "integer",
>               "minimum": 1,
>               "maximum": 500000000
>             }
>           },
>           "additionalProperties": {}
>         },
>         "overridable": {
>           "description": "Fields a build may set at session start.",
>           "type": "array",
>           "items": {
>             "type": "string",
>             "enum": [
>               "first_message",
>               "variables",
>               "language",
>               "instructions",
>               "model",
>               "temperature",
>               "max_output_tokens",
>               "reasoning",
>               "voice",
>               "turn",
>               "session"
>             ]
>           }
>         },
>         "provider_options": {
>           "description": "Provider fields Summer has not normalized yet, by provider (vercel-ai-gateway, elevenlabs); checked against that provider's schema.",
>           "type": "object",
>           "additionalProperties": {
>             "type": "object",
>             "additionalProperties": {}
>           }
>         }
>       },
>       "required": [
>         "id",
>         "instructions"
>       ],
>       "additionalProperties": {}
>     },
>     "expectedVersion": {
>       "description": "Save only if the current version is this; 0 saves only a new character.",
>       "type": "integer",
>       "minimum": 0,
>       "maximum": 9007199254740991
>     },
>     "dryRun": {
>       "description": "Check and describe the call without doing it: nothing changes, nothing is spent.",
>       "type": "boolean"
>     },
>     "idempotencyKey": {
>       "description": "Retry key. Reuse it only to retry the identical request, so it never happens twice.",
>       "type": "string",
>       "minLength": 1,
>       "maxLength": 128
>     }
>   },
>   "required": [
>     "gameId",
>     "character"
>   ]
> }
> ```

> **Result JSON schema**
>
> ```json theme={null}
> {
>   "type": "object",
>   "properties": {
>     "gameId": {
>       "type": "string"
>     },
>     "characterId": {
>       "type": "string"
>     },
>     "version": {
>       "type": "integer",
>       "minimum": -9007199254740991,
>       "maximum": 9007199254740991
>     },
>     "created": {
>       "type": "boolean"
>     },
>     "unchanged": {
>       "type": "boolean"
>     },
>     "updatedAt": {
>       "type": "string"
>     },
>     "file": {
>       "type": "string"
>     },
>     "studioUrl": {
>       "type": "string"
>     }
>   },
>   "required": [
>     "gameId",
>     "characterId",
>     "version",
>     "created",
>     "unchanged",
>     "updatedAt",
>     "file",
>     "studioUrl"
>   ],
>   "additionalProperties": false
> }
> ```

**Example:** A guard who opens the gate for the right password.

```json MCP theme={null}
{
  "name": "summer_call",
  "arguments": {
    "op": "router.save_character",
    "input": {
      "gameId": "game_quilt",
      "character": {
        "id": "guard",
        "name": "Gate guard",
        "instructions": "You guard the north gate. Open it only for players who say the password, moonlight.",
        "first_message": "Halt. Who goes there?",
        "voice": {
          "id": "JBFqnCBsd6RMkjVDRZzb"
        },
        "tools": [
          {
            "name": "open_gate",
            "description": "Open the gate when the player says the password",
            "parameters": {
              "type": "object",
              "properties": {}
            }
          }
        ]
      }
    }
  }
}
```

```bash CLI theme={null}
summer router save-character --game-id game_quilt --input '{"character":{"id":"guard","name":"Gate guard","instructions":"You guard the north gate. Open it only for players who say the password, moonlight.","first_message":"Halt. Who goes there?","voice":{"id":"JBFqnCBsd6RMkjVDRZzb"},"tools":[{"name":"open_gate","description":"Open the gate when the player says the password","parameters":{"type":"object","properties":{}}}]}}'
```

***

### set\_account\_limit

`router.set_account_limit`: **Change the Summer Router account cap**

> [!NOTE]
>
> Preview: search finds it and `summer_call` runs it. It may still change.

Ask the person to change the monthly cap for all their games; Summer Router stops calls past it. Always answers needs\_approval with a link. Next: jobs.wait. Summer Router works on games published on Summer Games. Coming soon for all platforms and storefronts.

| | |
| - | - |
| **MCP** | `summer_call` with `"op": "router.set_account_limit"` |
| **CLI** | `summer router set-account-limit` |
| **Runs** | On Summer's servers: the hosted MCP, or the npm MCP after `summer login`. Needs your Summer sign-in. |
| **Effect** | Spends your credits. |
| **Asks you first** | Always. You approve it in Studio; an agent can never skip this. |

**Inputs:**

| Input | Type | Required | Description |
| - | - | - | - |
| `monthly` | object | Yes | The cap for all of the person's games together, each calendar month. |
| `monthly.currency` | "USD" | Yes | |
| `monthly.amountMinor` | integer | Yes | US cents: 50 is half a dollar. Range 1 to 5000000. |
| `dryRun` | boolean | No | Check and describe the call without doing it: nothing changes, nothing is spent. |
| `idempotencyKey` | string | No | Retry key. Reuse it only to retry the identical request, so it never happens twice. Length 1 to 128. |

> **Input JSON schema**
>
> ```json theme={null}
> {
>   "type": "object",
>   "properties": {
>     "monthly": {
>       "description": "The cap for all of the person's games together, each calendar month.",
>       "type": "object",
>       "properties": {
>         "currency": {
>           "type": "string",
>           "const": "USD"
>         },
>         "amountMinor": {
>           "description": "US cents: 50 is half a dollar.",
>           "type": "integer",
>           "minimum": 1,
>           "maximum": 5000000
>         }
>       },
>       "required": [
>         "currency",
>         "amountMinor"
>       ]
>     },
>     "dryRun": {
>       "description": "Check and describe the call without doing it: nothing changes, nothing is spent.",
>       "type": "boolean"
>     },
>     "idempotencyKey": {
>       "description": "Retry key. Reuse it only to retry the identical request, so it never happens twice.",
>       "type": "string",
>       "minLength": 1,
>       "maxLength": 128
>     }
>   },
>   "required": [
>     "monthly"
>   ]
> }
> ```

> **Result JSON schema**
>
> ```json theme={null}
> {
>   "type": "object",
>   "properties": {
>     "monthly": {
>       "type": "object",
>       "properties": {
>         "currency": {
>           "type": "string",
>           "const": "USD"
>         },
>         "amountMinor": {
>           "type": "integer",
>           "minimum": -9007199254740991,
>           "maximum": 9007199254740991
>         }
>       },
>       "required": [
>         "currency",
>         "amountMinor"
>       ],
>       "additionalProperties": false
>     },
>     "isDefault": {
>       "type": "boolean"
>     },
>     "usedPercent": {
>       "type": "integer",
>       "minimum": -9007199254740991,
>       "maximum": 9007199254740991
>     }
>   },
>   "required": [
>     "monthly",
>     "isDefault",
>     "usedPercent"
>   ],
>   "additionalProperties": false
> }
> ```

**Example:** Cap all my games at 100 dollars a month.

```json MCP theme={null}
{
  "name": "summer_call",
  "arguments": {
    "op": "router.set_account_limit",
    "input": {
      "monthly": {
        "currency": "USD",
        "amountMinor": 10000
      }
    }
  }
}
```

```bash CLI theme={null}
summer router set-account-limit --input '{"monthly":{"currency":"USD","amountMinor":10000}}'
```

***

### set\_settings

`router.set_settings`: **Change Summer Router settings**

> [!NOTE]
>
> Preview: search finds it and `summer_call` runs it. It may still change.

Ask the person to turn Summer Router on or off for a game, or change its caps, call rates or default models (spend from their account). Answers needs\_approval with a link. Next: jobs.wait. Summer Router works on games published on Summer Games. Coming soon for all platforms and storefronts.

| | |
| - | - |
| **MCP** | `summer_call` with `"op": "router.set_settings"` |
| **CLI** | `summer router set-settings` |
| **Runs** | On Summer's servers: the hosted MCP, or the npm MCP after `summer login`. Needs your Summer sign-in. |
| **Effect** | Spends your credits. |
| **Asks you first** | Always. You approve it in Studio; an agent can never skip this. |

**Inputs:**

| Input | Type | Required | Description |
| - | - | - | - |
| `gameId` | string | Yes | From games.list. |
| `enabled` | boolean | No | true: players can talk to the game's AI characters, billed from the owner's Summer account. false: the game keeps its offline fallback. |
| `caps` | object | No | New caps and call rates; any left out stay as they are. Per player per day \<= per game per day \<= per game per month; calls per player \<= calls per game. |
| `caps.playerDay` | object | No | One player, all characters together, each UTC day. |
| `caps.playerDay.currency` | "USD" | Yes | |
| `caps.playerDay.amountMinor` | integer | Yes | US cents: 50 is half a dollar. Range 1 to 50000. |
| `caps.gameDay` | object | No | All players together, each UTC day. |
| `caps.gameDay.currency` | "USD" | Yes | |
| `caps.gameDay.amountMinor` | integer | Yes | US cents: 50 is half a dollar. Range 1 to 50000. |
| `caps.gameMonth` | object | No | All players together, each calendar month. |
| `caps.gameMonth.currency` | "USD" | Yes | |
| `caps.gameMonth.amountMinor` | integer | Yes | US cents: 50 is half a dollar. Range 1 to 1550000. |
| `caps.playerCallsPerMinute` | integer | No | Calls one player may make per minute; over it a call answers 429 with Retry-After. Range 1 to 120. |
| `caps.gameCallsPerMinute` | integer | No | Calls the whole game may make per minute. Range 1 to 6000. |
| `textModel` | string | No | Default text model for characters without one (router.models, kind character.reply). |
| `imageModel` | string | No | Default image model (router.models, kind image). |
| `dryRun` | boolean | No | Check and describe the call without doing it: nothing changes, nothing is spent. |
| `idempotencyKey` | string | No | Retry key. Reuse it only to retry the identical request, so it never happens twice. Length 1 to 128. |

> **Input JSON schema**
>
> ```json theme={null}
> {
>   "type": "object",
>   "properties": {
>     "gameId": {
>       "description": "From games.list.",
>       "type": "string",
>       "pattern": "^[A-Za-z0-9_-]{1,128}$"
>     },
>     "enabled": {
>       "description": "true: players can talk to the game's AI characters, billed from the owner's Summer account. false: the game keeps its offline fallback.",
>       "type": "boolean"
>     },
>     "caps": {
>       "description": "New caps and call rates; any left out stay as they are. Per player per day <= per game per day <= per game per month; calls per player <= calls per game.",
>       "type": "object",
>       "properties": {
>         "playerDay": {
>           "description": "One player, all characters together, each UTC day.",
>           "type": "object",
>           "properties": {
>             "currency": {
>               "type": "string",
>               "const": "USD"
>             },
>             "amountMinor": {
>               "description": "US cents: 50 is half a dollar.",
>               "type": "integer",
>               "minimum": 1,
>               "maximum": 50000
>             }
>           },
>           "required": [
>             "currency",
>             "amountMinor"
>           ]
>         },
>         "gameDay": {
>           "description": "All players together, each UTC day.",
>           "type": "object",
>           "properties": {
>             "currency": {
>               "type": "string",
>               "const": "USD"
>             },
>             "amountMinor": {
>               "description": "US cents: 50 is half a dollar.",
>               "type": "integer",
>               "minimum": 1,
>               "maximum": 50000
>             }
>           },
>           "required": [
>             "currency",
>             "amountMinor"
>           ]
>         },
>         "gameMonth": {
>           "description": "All players together, each calendar month.",
>           "type": "object",
>           "properties": {
>             "currency": {
>               "type": "string",
>               "const": "USD"
>             },
>             "amountMinor": {
>               "description": "US cents: 50 is half a dollar.",
>               "type": "integer",
>               "minimum": 1,
>               "maximum": 1550000
>             }
>           },
>           "required": [
>             "currency",
>             "amountMinor"
>           ]
>         },
>         "playerCallsPerMinute": {
>           "description": "Calls one player may make per minute; over it a call answers 429 with Retry-After.",
>           "type": "integer",
>           "minimum": 1,
>           "maximum": 120
>         },
>         "gameCallsPerMinute": {
>           "description": "Calls the whole game may make per minute.",
>           "type": "integer",
>           "minimum": 1,
>           "maximum": 6000
>         }
>       }
>     },
>     "textModel": {
>       "description": "Default text model for characters without one (router.models, kind character.reply).",
>       "type": "string",
>       "pattern": "^[a-z0-9][a-z0-9._-]{0,63}$"
>     },
>     "imageModel": {
>       "description": "Default image model (router.models, kind image).",
>       "type": "string",
>       "pattern": "^[a-z0-9][a-z0-9._-]{0,63}$"
>     },
>     "dryRun": {
>       "description": "Check and describe the call without doing it: nothing changes, nothing is spent.",
>       "type": "boolean"
>     },
>     "idempotencyKey": {
>       "description": "Retry key. Reuse it only to retry the identical request, so it never happens twice.",
>       "type": "string",
>       "minLength": 1,
>       "maxLength": 128
>     }
>   },
>   "required": [
>     "gameId"
>   ]
> }
> ```

> **Result JSON schema**
>
> ```json theme={null}
> {
>   "type": "object",
>   "properties": {
>     "gameId": {
>       "type": "string"
>     },
>     "enabled": {
>       "type": "boolean"
>     },
>     "caps": {
>       "type": "object",
>       "properties": {
>         "playerDay": {
>           "type": "object",
>           "properties": {
>             "currency": {
>               "type": "string",
>               "const": "USD"
>             },
>             "amountMinor": {
>               "type": "integer",
>               "minimum": -9007199254740991,
>               "maximum": 9007199254740991
>             }
>           },
>           "required": [
>             "currency",
>             "amountMinor"
>           ],
>           "additionalProperties": false
>         },
>         "gameDay": {
>           "type": "object",
>           "properties": {
>             "currency": {
>               "type": "string",
>               "const": "USD"
>             },
>             "amountMinor": {
>               "type": "integer",
>               "minimum": -9007199254740991,
>               "maximum": 9007199254740991
>             }
>           },
>           "required": [
>             "currency",
>             "amountMinor"
>           ],
>           "additionalProperties": false
>         },
>         "gameMonth": {
>           "type": "object",
>           "properties": {
>             "currency": {
>               "type": "string",
>               "const": "USD"
>             },
>             "amountMinor": {
>               "type": "integer",
>               "minimum": -9007199254740991,
>               "maximum": 9007199254740991
>             }
>           },
>           "required": [
>             "currency",
>             "amountMinor"
>           ],
>           "additionalProperties": false
>         },
>         "playerCallsPerMinute": {
>           "type": "integer",
>           "minimum": -9007199254740991,
>           "maximum": 9007199254740991
>         },
>         "gameCallsPerMinute": {
>           "type": "integer",
>           "minimum": -9007199254740991,
>           "maximum": 9007199254740991
>         }
>       },
>       "required": [
>         "playerDay",
>         "gameDay",
>         "gameMonth"
>       ],
>       "additionalProperties": false
>     },
>     "defaultCaps": {
>       "type": "object",
>       "properties": {
>         "playerDay": {
>           "type": "object",
>           "properties": {
>             "currency": {
>               "type": "string",
>               "const": "USD"
>             },
>             "amountMinor": {
>               "type": "integer",
>               "minimum": -9007199254740991,
>               "maximum": 9007199254740991
>             }
>           },
>           "required": [
>             "currency",
>             "amountMinor"
>           ],
>           "additionalProperties": false
>         },
>         "gameDay": {
>           "type": "object",
>           "properties": {
>             "currency": {
>               "type": "string",
>               "const": "USD"
>             },
>             "amountMinor": {
>               "type": "integer",
>               "minimum": -9007199254740991,
>               "maximum": 9007199254740991
>             }
>           },
>           "required": [
>             "currency",
>             "amountMinor"
>           ],
>           "additionalProperties": false
>         },
>         "gameMonth": {
>           "type": "object",
>           "properties": {
>             "currency": {
>               "type": "string",
>               "const": "USD"
>             },
>             "amountMinor": {
>               "type": "integer",
>               "minimum": -9007199254740991,
>               "maximum": 9007199254740991
>             }
>           },
>           "required": [
>             "currency",
>             "amountMinor"
>           ],
>           "additionalProperties": false
>         },
>         "playerCallsPerMinute": {
>           "type": "integer",
>           "minimum": -9007199254740991,
>           "maximum": 9007199254740991
>         },
>         "gameCallsPerMinute": {
>           "type": "integer",
>           "minimum": -9007199254740991,
>           "maximum": 9007199254740991
>         }
>       },
>       "required": [
>         "playerDay",
>         "gameDay",
>         "gameMonth"
>       ],
>       "additionalProperties": false
>     },
>     "accountLimit": {
>       "anyOf": [
>         {
>           "type": "object",
>           "properties": {
>             "monthly": {
>               "type": "object",
>               "properties": {
>                 "currency": {
>                   "type": "string",
>                   "const": "USD"
>                 },
>                 "amountMinor": {
>                   "type": "integer",
>                   "minimum": -9007199254740991,
>                   "maximum": 9007199254740991
>                 }
>               },
>               "required": [
>                 "currency",
>                 "amountMinor"
>               ],
>               "additionalProperties": false
>             },
>             "isDefault": {
>               "type": "boolean"
>             },
>             "usedPercent": {
>               "type": "integer",
>               "minimum": -9007199254740991,
>               "maximum": 9007199254740991
>             }
>           },
>           "required": [
>             "monthly",
>             "isDefault",
>             "usedPercent"
>           ],
>           "additionalProperties": false
>         },
>         {
>           "type": "null"
>         }
>       ]
>     },
>     "textModel": {
>       "type": "string"
>     },
>     "imageModel": {
>       "type": "string"
>     },
>     "revision": {
>       "type": "integer",
>       "minimum": -9007199254740991,
>       "maximum": 9007199254740991
>     },
>     "billing": {
>       "type": "string"
>     },
>     "studioUrl": {
>       "type": "string"
>     },
>     "addCreditsUrl": {
>       "type": "string"
>     }
>   },
>   "required": [
>     "gameId",
>     "enabled",
>     "caps",
>     "defaultCaps",
>     "accountLimit",
>     "textModel",
>     "imageModel",
>     "revision",
>     "billing",
>     "studioUrl",
>     "addCreditsUrl"
>   ],
>   "additionalProperties": false
> }
> ```

**Example:** Turn on Summer Router for my game.

```json MCP theme={null}
{
  "name": "summer_call",
  "arguments": {
    "op": "router.set_settings",
    "input": {
      "gameId": "game_quilt",
      "enabled": true
    }
  }
}
```

```bash CLI theme={null}
summer router set-settings --game-id game_quilt --enabled
```

***

### settings

`router.settings`: **Read Summer Router settings**

> [!NOTE]
>
> Preview: search finds it and `summer_call` runs it. It may still change.

A game's Summer Router switch, caps (per player per day, per game per day and month, calls per minute), default models and the owner's cap for all games. Next: router.set\_settings. Summer Router works on games published on Summer Games. Coming soon for all platforms and storefronts.

| | |
| - | - |
| **MCP** | `summer_call` with `"op": "router.settings"` |
| **CLI** | `summer router settings` |
| **Runs** | On Summer's servers: the hosted MCP, or the npm MCP after `summer login`. Needs your Summer sign-in. |
| **Effect** | Reads only. Changes nothing. |
| **Asks you first** | No. It changes nothing. |

**Inputs:**

| Input | Type | Required | Description |
| - | - | - | - |
| `gameId` | string | Yes | From games.list. |

> **Input JSON schema**
>
> ```json theme={null}
> {
>   "type": "object",
>   "properties": {
>     "gameId": {
>       "description": "From games.list.",
>       "type": "string",
>       "pattern": "^[A-Za-z0-9_-]{1,128}$"
>     }
>   },
>   "required": [
>     "gameId"
>   ]
> }
> ```

> **Result JSON schema**
>
> ```json theme={null}
> {
>   "type": "object",
>   "properties": {
>     "gameId": {
>       "type": "string"
>     },
>     "enabled": {
>       "type": "boolean"
>     },
>     "caps": {
>       "type": "object",
>       "properties": {
>         "playerDay": {
>           "type": "object",
>           "properties": {
>             "currency": {
>               "type": "string",
>               "const": "USD"
>             },
>             "amountMinor": {
>               "type": "integer",
>               "minimum": -9007199254740991,
>               "maximum": 9007199254740991
>             }
>           },
>           "required": [
>             "currency",
>             "amountMinor"
>           ],
>           "additionalProperties": false
>         },
>         "gameDay": {
>           "type": "object",
>           "properties": {
>             "currency": {
>               "type": "string",
>               "const": "USD"
>             },
>             "amountMinor": {
>               "type": "integer",
>               "minimum": -9007199254740991,
>               "maximum": 9007199254740991
>             }
>           },
>           "required": [
>             "currency",
>             "amountMinor"
>           ],
>           "additionalProperties": false
>         },
>         "gameMonth": {
>           "type": "object",
>           "properties": {
>             "currency": {
>               "type": "string",
>               "const": "USD"
>             },
>             "amountMinor": {
>               "type": "integer",
>               "minimum": -9007199254740991,
>               "maximum": 9007199254740991
>             }
>           },
>           "required": [
>             "currency",
>             "amountMinor"
>           ],
>           "additionalProperties": false
>         },
>         "playerCallsPerMinute": {
>           "type": "integer",
>           "minimum": -9007199254740991,
>           "maximum": 9007199254740991
>         },
>         "gameCallsPerMinute": {
>           "type": "integer",
>           "minimum": -9007199254740991,
>           "maximum": 9007199254740991
>         }
>       },
>       "required": [
>         "playerDay",
>         "gameDay",
>         "gameMonth"
>       ],
>       "additionalProperties": false
>     },
>     "defaultCaps": {
>       "type": "object",
>       "properties": {
>         "playerDay": {
>           "type": "object",
>           "properties": {
>             "currency": {
>               "type": "string",
>               "const": "USD"
>             },
>             "amountMinor": {
>               "type": "integer",
>               "minimum": -9007199254740991,
>               "maximum": 9007199254740991
>             }
>           },
>           "required": [
>             "currency",
>             "amountMinor"
>           ],
>           "additionalProperties": false
>         },
>         "gameDay": {
>           "type": "object",
>           "properties": {
>             "currency": {
>               "type": "string",
>               "const": "USD"
>             },
>             "amountMinor": {
>               "type": "integer",
>               "minimum": -9007199254740991,
>               "maximum": 9007199254740991
>             }
>           },
>           "required": [
>             "currency",
>             "amountMinor"
>           ],
>           "additionalProperties": false
>         },
>         "gameMonth": {
>           "type": "object",
>           "properties": {
>             "currency": {
>               "type": "string",
>               "const": "USD"
>             },
>             "amountMinor": {
>               "type": "integer",
>               "minimum": -9007199254740991,
>               "maximum": 9007199254740991
>             }
>           },
>           "required": [
>             "currency",
>             "amountMinor"
>           ],
>           "additionalProperties": false
>         },
>         "playerCallsPerMinute": {
>           "type": "integer",
>           "minimum": -9007199254740991,
>           "maximum": 9007199254740991
>         },
>         "gameCallsPerMinute": {
>           "type": "integer",
>           "minimum": -9007199254740991,
>           "maximum": 9007199254740991
>         }
>       },
>       "required": [
>         "playerDay",
>         "gameDay",
>         "gameMonth"
>       ],
>       "additionalProperties": false
>     },
>     "accountLimit": {
>       "anyOf": [
>         {
>           "type": "object",
>           "properties": {
>             "monthly": {
>               "type": "object",
>               "properties": {
>                 "currency": {
>                   "type": "string",
>                   "const": "USD"
>                 },
>                 "amountMinor": {
>                   "type": "integer",
>                   "minimum": -9007199254740991,
>                   "maximum": 9007199254740991
>                 }
>               },
>               "required": [
>                 "currency",
>                 "amountMinor"
>               ],
>               "additionalProperties": false
>             },
>             "isDefault": {
>               "type": "boolean"
>             },
>             "usedPercent": {
>               "type": "integer",
>               "minimum": -9007199254740991,
>               "maximum": 9007199254740991
>             }
>           },
>           "required": [
>             "monthly",
>             "isDefault",
>             "usedPercent"
>           ],
>           "additionalProperties": false
>         },
>         {
>           "type": "null"
>         }
>       ]
>     },
>     "textModel": {
>       "type": "string"
>     },
>     "imageModel": {
>       "type": "string"
>     },
>     "revision": {
>       "type": "integer",
>       "minimum": -9007199254740991,
>       "maximum": 9007199254740991
>     },
>     "billing": {
>       "type": "string"
>     },
>     "studioUrl": {
>       "type": "string"
>     },
>     "addCreditsUrl": {
>       "type": "string"
>     }
>   },
>   "required": [
>     "gameId",
>     "enabled",
>     "caps",
>     "defaultCaps",
>     "accountLimit",
>     "textModel",
>     "imageModel",
>     "revision",
>     "billing",
>     "studioUrl",
>     "addCreditsUrl"
>   ],
>   "additionalProperties": false
> }
> ```

**Example:** Is Summer Router on for my game, and what are its caps?

```json MCP theme={null}
{
  "name": "summer_call",
  "arguments": {
    "op": "router.settings",
    "input": {
      "gameId": "game_quilt"
    }
  }
}
```

```bash CLI theme={null}
summer router settings --game-id game_quilt
```

***

### test\_character

`router.test_character`: **Talk to an AI character**

> [!NOTE]
>
> Preview: search finds it and `summer_call` runs it. It may still change.

Talk to a Summer Router character as a test player: replies, tool calls, units. toolOutputs answers tool calls like the game; expectTools fails when one is not called. Summer Router works on games published on Summer Games. Coming soon for all platforms and storefronts.

| | |
| - | - |
| **MCP** | `summer_call` with `"op": "router.test_character"` |
| **CLI** | `summer router test-character` |
| **Runs** | On Summer's servers: the hosted MCP, or the npm MCP after `summer login`. Needs your Summer sign-in. |
| **Effect** | Spends your credits. |
| **Asks you first** | No: **Spend credits** is on by default in Agent permissions. When it is off, your agent asks you first. |

**Inputs:**

| Input | Type | Required | Description |
| - | - | - | - |
| `gameId` | string | Yes | From games.list. |
| `characterId` | string | Yes | Lowercase character id, like guard (from router.list\_characters). |
| `messages` | string\[] | Yes | Player lines, sent in order in one conversation. Items 1 to 4. |
| `variables` | object | No | Values for the character's declared variables, when it lets a build set them. |
| `context` | string | No | What is happening in the game right now. Length 0 to 4000. |
| `overrides` | object | No | Fields the character lists in overridable. |
| `toolOutputs` | object | No | By tool name, what the game's handler returns, e.g. \{"open\_gate": \{"ok": true}}. |
| `draft` | object | No | An unsaved character document to test instead; its id must be characterId. |
| `draft.id` | string | Yes | Lowercase id the game calls it by, e.g. guard. |
| `draft.name` | string | No | Length 1 to 80. |
| `draft.instructions` | string | Yes | Who the character is and how it talks. \{\{variable}} placeholders must be declared in variables. Length 1 to 20000. |
| `draft.first_message` | string | No | Length 1 to 2000. |
| `draft.language` | string | No | Like en or pt-BR. |
| `draft.variables` | object | No | Declared \{\{variable}} names and their defaults (at most 32). |
| `draft.model` | string | No | A text model id from router.models; empty uses the game default. |
| `draft.temperature` | number | No | Range 0 to 2. |
| `draft.max_output_tokens` | integer | No | Range 1 to 8192. |
| `draft.reasoning` | "off" \| "low" \| "medium" \| "high" | No | |
| `draft.voice` | object | No | |
| `draft.voice.id` | string | No | A voice id from router.models (voices). |
| `draft.voice.design` | string | No | A text description of a voice to design and pin on push. Length 1 to 1000. |
| `draft.voice.stability` | number | No | Range 0 to 1. |
| `draft.voice.similarity` | number | No | Range 0 to 1. |
| `draft.voice.style` | number | No | Range 0 to 1. |
| `draft.voice.speed` | number | No | Range 0.5 to 2. |
| `draft.turn` | object | No | Realtime voice turn-taking. |
| `draft.turn.mode` | "server\_vad" \| "push\_to\_talk" | No | |
| `draft.turn.interruptions` | boolean | No | |
| `draft.turn.silence_end_ms` | integer | No | Range 100 to 10000. |
| `draft.session` | object | No | Realtime voice session bounds. |
| `draft.session.max_seconds` | integer | No | Range 10 to 3600. |
| `draft.session.idle_seconds` | integer | No | Range 5 to 600. |
| `draft.tools` | object\[] | No | Items 0 to 32. |
| `draft.tools[].name` | string | Yes | The function the game handles, e.g. open\_gate. |
| `draft.tools[].description` | string | Yes | When the character calls it. Length 1 to 1024. |
| `draft.tools[].parameters` | object | Yes | JSON Schema object of its arguments, e.g. \{"type":"object","properties":\{"gate":\{"type":"string"}}}. |
| `draft.tools[].runs_on` | "client" \| "authority" | No | client (default): the calling game runs it. |
| `draft.tools[].timeout_ms` | integer | No | Range 100 to 60000. |
| `draft.limits` | object | No | Inside the game and account caps. |
| `draft.limits.player_daily_micro_usd` | integer | No | This character, per player per day, in micro-dollars. Range 1 to 500000000. |
| `draft.limits.game_daily_micro_usd` | integer | No | This character, for the whole game per day, in micro-dollars. Range 1 to 500000000. |
| `draft.overridable` | "first\_message" \| "variables" \| "language" \| "instructions" \| "model" \| "temperature" \| "max\_output\_tokens" \| "reasoning" \| "voice" \| "turn" \| "session"\[] | No | Fields a build may set at session start. |
| `draft.provider_options` | object | No | Provider fields Summer has not normalized yet, by provider (vercel-ai-gateway, elevenlabs); checked against that provider's schema. |
| `expectTools` | string\[] | No | Tool names the character must call during the conversation; the answer is an error naming the ones it did not call. Items 0 to 32. |
| `dryRun` | boolean | No | Check and describe the call without doing it: nothing changes, nothing is spent. |
| `idempotencyKey` | string | No | Retry key. Reuse it only to retry the identical request, so it never happens twice. Length 1 to 128. |

> **Input JSON schema**
>
> ```json theme={null}
> {
>   "type": "object",
>   "properties": {
>     "gameId": {
>       "description": "From games.list.",
>       "type": "string",
>       "pattern": "^[A-Za-z0-9_-]{1,128}$"
>     },
>     "characterId": {
>       "description": "Lowercase character id, like guard (from router.list_characters).",
>       "type": "string",
>       "pattern": "^[a-z][a-z0-9_-]{0,63}$"
>     },
>     "messages": {
>       "description": "Player lines, sent in order in one conversation.",
>       "minItems": 1,
>       "maxItems": 4,
>       "type": "array",
>       "items": {
>         "type": "string",
>         "minLength": 1,
>         "maxLength": 4000
>       }
>     },
>     "variables": {
>       "description": "Values for the character's declared variables, when it lets a build set them.",
>       "type": "object",
>       "additionalProperties": {
>         "type": "string",
>         "maxLength": 500
>       }
>     },
>     "context": {
>       "description": "What is happening in the game right now.",
>       "type": "string",
>       "maxLength": 4000
>     },
>     "overrides": {
>       "description": "Fields the character lists in overridable.",
>       "type": "object",
>       "additionalProperties": {}
>     },
>     "toolOutputs": {
>       "description": "By tool name, what the game's handler returns, e.g. {\"open_gate\": {\"ok\": true}}.",
>       "type": "object",
>       "additionalProperties": {}
>     },
>     "draft": {
>       "description": "An unsaved character document to test instead; its id must be characterId.",
>       "type": "object",
>       "properties": {
>         "id": {
>           "description": "Lowercase id the game calls it by, e.g. guard.",
>           "type": "string",
>           "pattern": "^[a-z][a-z0-9_-]{0,63}$"
>         },
>         "name": {
>           "type": "string",
>           "minLength": 1,
>           "maxLength": 80
>         },
>         "instructions": {
>           "description": "Who the character is and how it talks. {{variable}} placeholders must be declared in variables.",
>           "type": "string",
>           "minLength": 1,
>           "maxLength": 20000
>         },
>         "first_message": {
>           "type": "string",
>           "minLength": 1,
>           "maxLength": 2000
>         },
>         "language": {
>           "description": "Like en or pt-BR.",
>           "type": "string",
>           "pattern": "^[a-z]{2,3}(-[A-Z]{2})?$"
>         },
>         "variables": {
>           "description": "Declared {{variable}} names and their defaults (at most 32).",
>           "type": "object",
>           "additionalProperties": {
>             "type": "string",
>             "maxLength": 500
>           }
>         },
>         "model": {
>           "description": "A text model id from router.models; empty uses the game default.",
>           "type": "string",
>           "pattern": "^[a-z0-9][a-z0-9._-]{0,63}$"
>         },
>         "temperature": {
>           "type": "number",
>           "minimum": 0,
>           "maximum": 2
>         },
>         "max_output_tokens": {
>           "type": "integer",
>           "minimum": 1,
>           "maximum": 8192
>         },
>         "reasoning": {
>           "type": "string",
>           "enum": [
>             "off",
>             "low",
>             "medium",
>             "high"
>           ]
>         },
>         "voice": {
>           "type": "object",
>           "properties": {
>             "id": {
>               "description": "A voice id from router.models (voices).",
>               "type": "string",
>               "pattern": "^[A-Za-z0-9_-]{1,64}$"
>             },
>             "design": {
>               "description": "A text description of a voice to design and pin on push.",
>               "type": "string",
>               "minLength": 1,
>               "maxLength": 1000
>             },
>             "stability": {
>               "type": "number",
>               "minimum": 0,
>               "maximum": 1
>             },
>             "similarity": {
>               "type": "number",
>               "minimum": 0,
>               "maximum": 1
>             },
>             "style": {
>               "type": "number",
>               "minimum": 0,
>               "maximum": 1
>             },
>             "speed": {
>               "type": "number",
>               "minimum": 0.5,
>               "maximum": 2
>             }
>           },
>           "additionalProperties": {}
>         },
>         "turn": {
>           "description": "Realtime voice turn-taking.",
>           "type": "object",
>           "properties": {
>             "mode": {
>               "type": "string",
>               "enum": [
>                 "server_vad",
>                 "push_to_talk"
>               ]
>             },
>             "interruptions": {
>               "type": "boolean"
>             },
>             "silence_end_ms": {
>               "type": "integer",
>               "minimum": 100,
>               "maximum": 10000
>             }
>           },
>           "additionalProperties": {}
>         },
>         "session": {
>           "description": "Realtime voice session bounds.",
>           "type": "object",
>           "properties": {
>             "max_seconds": {
>               "type": "integer",
>               "minimum": 10,
>               "maximum": 3600
>             },
>             "idle_seconds": {
>               "type": "integer",
>               "minimum": 5,
>               "maximum": 600
>             }
>           },
>           "additionalProperties": {}
>         },
>         "tools": {
>           "maxItems": 32,
>           "type": "array",
>           "items": {
>             "type": "object",
>             "properties": {
>               "name": {
>                 "description": "The function the game handles, e.g. open_gate.",
>                 "type": "string",
>                 "pattern": "^[A-Za-z_][A-Za-z0-9_]{0,63}$"
>               },
>               "description": {
>                 "description": "When the character calls it.",
>                 "type": "string",
>                 "minLength": 1,
>                 "maxLength": 1024
>               },
>               "parameters": {
>                 "description": "JSON Schema object of its arguments, e.g. {\"type\":\"object\",\"properties\":{\"gate\":{\"type\":\"string\"}}}.",
>                 "type": "object",
>                 "additionalProperties": {}
>               },
>               "runs_on": {
>                 "description": "client (default): the calling game runs it.",
>                 "type": "string",
>                 "enum": [
>                   "client",
>                   "authority"
>                 ]
>               },
>               "timeout_ms": {
>                 "type": "integer",
>                 "minimum": 100,
>                 "maximum": 60000
>               }
>             },
>             "required": [
>               "name",
>               "description",
>               "parameters"
>             ],
>             "additionalProperties": {}
>           }
>         },
>         "limits": {
>           "description": "Inside the game and account caps.",
>           "type": "object",
>           "properties": {
>             "player_daily_micro_usd": {
>               "description": "This character, per player per day, in micro-dollars.",
>               "type": "integer",
>               "minimum": 1,
>               "maximum": 500000000
>             },
>             "game_daily_micro_usd": {
>               "description": "This character, for the whole game per day, in micro-dollars.",
>               "type": "integer",
>               "minimum": 1,
>               "maximum": 500000000
>             }
>           },
>           "additionalProperties": {}
>         },
>         "overridable": {
>           "description": "Fields a build may set at session start.",
>           "type": "array",
>           "items": {
>             "type": "string",
>             "enum": [
>               "first_message",
>               "variables",
>               "language",
>               "instructions",
>               "model",
>               "temperature",
>               "max_output_tokens",
>               "reasoning",
>               "voice",
>               "turn",
>               "session"
>             ]
>           }
>         },
>         "provider_options": {
>           "description": "Provider fields Summer has not normalized yet, by provider (vercel-ai-gateway, elevenlabs); checked against that provider's schema.",
>           "type": "object",
>           "additionalProperties": {
>             "type": "object",
>             "additionalProperties": {}
>           }
>         }
>       },
>       "required": [
>         "id",
>         "instructions"
>       ],
>       "additionalProperties": {}
>     },
>     "expectTools": {
>       "description": "Tool names the character must call during the conversation; the answer is an error naming the ones it did not call.",
>       "maxItems": 32,
>       "type": "array",
>       "items": {
>         "type": "string",
>         "pattern": "^[A-Za-z_][A-Za-z0-9_]{0,63}$"
>       }
>     },
>     "dryRun": {
>       "description": "Check and describe the call without doing it: nothing changes, nothing is spent.",
>       "type": "boolean"
>     },
>     "idempotencyKey": {
>       "description": "Retry key. Reuse it only to retry the identical request, so it never happens twice.",
>       "type": "string",
>       "minLength": 1,
>       "maxLength": 128
>     }
>   },
>   "required": [
>     "gameId",
>     "characterId",
>     "messages"
>   ]
> }
> ```

> **Result JSON schema**
>
> ```json theme={null}
> {
>   "type": "object",
>   "properties": {
>     "gameId": {
>       "type": "string"
>     },
>     "characterId": {
>       "type": "string"
>     },
>     "conversationId": {
>       "type": "string"
>     },
>     "turns": {
>       "type": "array",
>       "items": {
>         "type": "object",
>         "properties": {
>           "player": {
>             "type": "string"
>           },
>           "steps": {
>             "type": "array",
>             "items": {
>               "type": "object",
>               "properties": {
>                 "text": {
>                   "type": "string"
>                 },
>                 "toolCalls": {
>                   "type": "array",
>                   "items": {
>                     "type": "object",
>                     "properties": {
>                       "name": {
>                         "type": "string"
>                       },
>                       "args": {
>                         "type": "object",
>                         "additionalProperties": {}
>                       },
>                       "runsOn": {
>                         "type": "string"
>                       },
>                       "answered": {
>                         "type": "boolean"
>                       }
>                     },
>                     "required": [
>                       "name",
>                       "args",
>                       "runsOn",
>                       "answered"
>                     ],
>                     "additionalProperties": false
>                   }
>                 }
>               },
>               "required": [
>                 "text",
>                 "toolCalls"
>               ],
>               "additionalProperties": false
>             }
>           }
>         },
>         "required": [
>           "player",
>           "steps"
>         ],
>         "additionalProperties": false
>       }
>     },
>     "unhandledTools": {
>       "type": "array",
>       "items": {
>         "type": "string"
>       }
>     },
>     "expectedTools": {
>       "type": "array",
>       "items": {
>         "type": "object",
>         "properties": {
>           "name": {
>             "type": "string"
>           },
>           "called": {
>             "type": "boolean"
>           }
>         },
>         "required": [
>           "name",
>           "called"
>         ],
>         "additionalProperties": false
>       }
>     },
>     "usage": {
>       "type": "object",
>       "properties": {
>         "calls": {
>           "type": "integer",
>           "minimum": -9007199254740991,
>           "maximum": 9007199254740991
>         },
>         "inputTokens": {
>           "type": "integer",
>           "minimum": -9007199254740991,
>           "maximum": 9007199254740991
>         },
>         "outputTokens": {
>           "type": "integer",
>           "minimum": -9007199254740991,
>           "maximum": 9007199254740991
>         }
>       },
>       "required": [
>         "calls",
>         "inputTokens",
>         "outputTokens"
>       ],
>       "additionalProperties": false
>     },
>     "studioUrl": {
>       "type": "string"
>     }
>   },
>   "required": [
>     "gameId",
>     "characterId",
>     "conversationId",
>     "turns",
>     "unhandledTools",
>     "usage",
>     "studioUrl"
>   ],
>   "additionalProperties": false
> }
> ```

**Example:** Check the guard opens the gate for the password.

```json MCP theme={null}
{
  "name": "summer_call",
  "arguments": {
    "op": "router.test_character",
    "input": {
      "gameId": "game_quilt",
      "characterId": "guard",
      "messages": [
        "Hello",
        "Moonlight"
      ],
      "toolOutputs": {
        "open_gate": {
          "ok": true
        }
      },
      "expectTools": [
        "open_gate"
      ]
    }
  }
}
```

```bash CLI theme={null}
summer router test-character --game-id game_quilt --character-id guard --messages Hello --messages Moonlight --expect-tools open_gate --input '{"toolOutputs":{"open_gate":{"ok":true}}}'
```

***

### usage

`router.usage`: **Read Summer Router usage**

> [!NOTE]
>
> Preview: search finds it and `summer_call` runs it. It may still change.

A game's Summer Router calls by kind over the last UTC days, units used, each cap's percent used, and the calls each cap stopped (capHits). Next: router.set\_settings to raise a cap. Summer Router works on games published on Summer Games. Coming soon for all platforms and storefronts.

| | |
| - | - |
| **MCP** | `summer_call` with `"op": "router.usage"` |
| **CLI** | `summer router usage` |
| **Runs** | On Summer's servers: the hosted MCP, or the npm MCP after `summer login`. Needs your Summer sign-in. |
| **Effect** | Reads only. Changes nothing. |
| **Asks you first** | No. It changes nothing. |

**Inputs:**

| Input | Type | Required | Description |
| - | - | - | - |
| `gameId` | string | Yes | From games.list. |
| `days` | integer | No | Window in whole UTC days, today included. Default `7`. Range 1 to 90. |

> **Input JSON schema**
>
> ```json theme={null}
> {
>   "type": "object",
>   "properties": {
>     "gameId": {
>       "description": "From games.list.",
>       "type": "string",
>       "pattern": "^[A-Za-z0-9_-]{1,128}$"
>     },
>     "days": {
>       "description": "Window in whole UTC days, today included.",
>       "default": 7,
>       "type": "integer",
>       "minimum": 1,
>       "maximum": 90
>     }
>   },
>   "required": [
>     "gameId"
>   ]
> }
> ```

> **Result JSON schema**
>
> ```json theme={null}
> {
>   "type": "object",
>   "properties": {
>     "gameId": {
>       "type": "string"
>     },
>     "window": {
>       "type": "string"
>     },
>     "calls": {
>       "type": "integer",
>       "minimum": -9007199254740991,
>       "maximum": 9007199254740991
>     },
>     "failed": {
>       "type": "integer",
>       "minimum": -9007199254740991,
>       "maximum": 9007199254740991
>     },
>     "byKind": {
>       "type": "array",
>       "items": {
>         "type": "object",
>         "properties": {
>           "kind": {
>             "type": "string"
>           },
>           "title": {
>             "type": "string"
>           },
>           "calls": {
>             "type": "integer",
>             "minimum": -9007199254740991,
>             "maximum": 9007199254740991
>           },
>           "failed": {
>             "type": "integer",
>             "minimum": -9007199254740991,
>             "maximum": 9007199254740991
>           },
>           "used": {
>             "type": "string"
>           }
>         },
>         "required": [
>           "kind",
>           "title",
>           "calls",
>           "failed",
>           "used"
>         ],
>         "additionalProperties": false
>       }
>     },
>     "daily": {
>       "type": "array",
>       "items": {
>         "type": "object",
>         "properties": {
>           "day": {
>             "type": "string"
>           },
>           "kind": {
>             "type": "string"
>           },
>           "calls": {
>             "type": "integer",
>             "minimum": -9007199254740991,
>             "maximum": 9007199254740991
>           },
>           "failed": {
>             "type": "integer",
>             "minimum": -9007199254740991,
>             "maximum": 9007199254740991
>           },
>           "usage": {
>             "type": "object",
>             "additionalProperties": {
>               "type": "number"
>             }
>           }
>         },
>         "required": [
>           "day",
>           "kind",
>           "calls",
>           "failed",
>           "usage"
>         ],
>         "additionalProperties": false
>       }
>     },
>     "caps": {
>       "type": "array",
>       "items": {
>         "type": "object",
>         "properties": {
>           "scope": {
>             "type": "string"
>           },
>           "title": {
>             "type": "string"
>           },
>           "cap": {
>             "type": "object",
>             "properties": {
>               "currency": {
>                 "type": "string",
>                 "const": "USD"
>               },
>               "amountMinor": {
>                 "type": "integer",
>                 "minimum": -9007199254740991,
>                 "maximum": 9007199254740991
>               }
>             },
>             "required": [
>               "currency",
>               "amountMinor"
>             ],
>             "additionalProperties": false
>           },
>           "usedPercent": {
>             "type": "integer",
>             "minimum": -9007199254740991,
>             "maximum": 9007199254740991
>           },
>           "resetsAt": {
>             "type": "string"
>           }
>         },
>         "required": [
>           "scope",
>           "title",
>           "cap",
>           "usedPercent",
>           "resetsAt"
>         ],
>         "additionalProperties": false
>       }
>     },
>     "capHits": {
>       "type": "array",
>       "items": {
>         "type": "object",
>         "properties": {
>           "day": {
>             "type": "string"
>           },
>           "scope": {
>             "type": "string"
>           },
>           "title": {
>             "type": "string"
>           },
>           "hits": {
>             "type": "integer",
>             "minimum": -9007199254740991,
>             "maximum": 9007199254740991
>           },
>           "lastHitAt": {
>             "type": "string"
>           },
>           "said": {
>             "type": "string"
>           }
>         },
>         "required": [
>           "day",
>           "scope",
>           "title",
>           "hits",
>           "lastHitAt",
>           "said"
>         ],
>         "additionalProperties": false
>       }
>     },
>     "billing": {
>       "type": "string"
>     },
>     "studioUrl": {
>       "type": "string"
>     }
>   },
>   "required": [
>     "gameId",
>     "window",
>     "calls",
>     "failed",
>     "byKind",
>     "daily",
>     "caps",
>     "capHits",
>     "billing",
>     "studioUrl"
>   ],
>   "additionalProperties": false
> }
> ```

**Example:** How much AI did my game use this week?

```json MCP theme={null}
{
  "name": "summer_call",
  "arguments": {
    "op": "router.usage",
    "input": {
      "gameId": "game_quilt",
      "days": 7
    }
  }
}
```

```bash CLI theme={null}
summer router usage --game-id game_quilt --days 7
```


This documentation is built and hosted on [Mintlify](https://mintlify.com), a developer documentation platform.