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 | Every saved version of one Summer Router character, newest first, with when it was saved and if it was deleted. | Never |
router.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 | 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 | A game’s Summer Router characters: id, name, version, model, voice and tools. | Never |
router.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 a Summer Router character as its next version; the same document changes nothing. | Not by default |
router.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 | 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 | 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 | Talk to a Summer Router character as a test player: replies, tool calls, units. | Not by default |
router.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
Preview: search finds it and
summer_call runs it. It may still change.| 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. |
| 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
Input JSON schema
{
"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
Result JSON schema
{
"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
}
{
"name": "summer_call",
"arguments": {
"op": "router.character_versions",
"input": {
"gameId": "game_quilt",
"characterId": "guard"
}
}
}
summer router character-versions --game-id game_quilt --character-id guard
delete_character
router.delete_character: Delete an AI character
Preview: search finds it and
summer_call runs it. It may still change.| 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. |
| 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
Input JSON schema
{
"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
Result JSON schema
{
"type": "object",
"properties": {
"gameId": {
"type": "string"
},
"characterId": {
"type": "string"
},
"deleted": {
"type": "boolean",
"const": true
}
},
"required": [
"gameId",
"characterId",
"deleted"
],
"additionalProperties": false
}
{
"name": "summer_call",
"arguments": {
"op": "router.delete_character",
"input": {
"gameId": "game_quilt",
"characterId": "guard"
}
}
}
summer router delete-character --game-id game_quilt --character-id guard
get_character
router.get_character: Read an AI character
Preview: search finds it and
summer_call runs it. It may still change.| 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. |
| 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
Input JSON schema
{
"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
Result JSON schema
{
"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
}
{
"name": "summer_call",
"arguments": {
"op": "router.get_character",
"input": {
"gameId": "game_quilt",
"characterId": "guard"
}
}
}
summer router get-character --game-id game_quilt --character-id guard
list_characters
router.list_characters: List a game’s AI characters
Preview: search finds it and
summer_call runs it. It may still change.| 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. |
| Input | Type | Required | Description |
|---|---|---|---|
gameId | string | Yes | From games.list. |
Input JSON schema
Input JSON schema
{
"type": "object",
"properties": {
"gameId": {
"description": "From games.list.",
"type": "string",
"pattern": "^[A-Za-z0-9_-]{1,128}$"
}
},
"required": [
"gameId"
]
}
Result JSON schema
Result JSON schema
{
"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
}
{
"name": "summer_call",
"arguments": {
"op": "router.list_characters",
"input": {
"gameId": "game_quilt"
}
}
}
summer router list-characters --game-id game_quilt
models
router.models: List Summer Router models and voices
Preview: search finds it and
summer_call runs it. It may still change.| 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. |
| 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
Input JSON schema
{
"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
Result JSON schema
{
"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
}
{
"name": "summer_call",
"arguments": {
"op": "router.models",
"input": {
"include": [
"models",
"voices"
]
}
}
}
summer router models --include models --include voices
save_character
router.save_character: Save an AI character
Preview: search finds it and
summer_call runs it. It may still change.| 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. |
| 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
Input JSON schema
{
"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
Result JSON schema
{
"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
}
{
"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": {}
}
}
]
}
}
}
}
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
Preview: search finds it and
summer_call runs it. It may still change.| 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. |
| 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
Input JSON schema
{
"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
Result JSON schema
{
"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
}
{
"name": "summer_call",
"arguments": {
"op": "router.set_account_limit",
"input": {
"monthly": {
"currency": "USD",
"amountMinor": 10000
}
}
}
}
summer router set-account-limit --input '{"monthly":{"currency":"USD","amountMinor":10000}}'
set_settings
router.set_settings: Change Summer Router settings
Preview: search finds it and
summer_call runs it. It may still change.| 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. |
| 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
Input JSON schema
{
"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
Result JSON schema
{
"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
}
{
"name": "summer_call",
"arguments": {
"op": "router.set_settings",
"input": {
"gameId": "game_quilt",
"enabled": true
}
}
}
summer router set-settings --game-id game_quilt --enabled
settings
router.settings: Read Summer Router settings
Preview: search finds it and
summer_call runs it. It may still change.| 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. |
| Input | Type | Required | Description |
|---|---|---|---|
gameId | string | Yes | From games.list. |
Input JSON schema
Input JSON schema
{
"type": "object",
"properties": {
"gameId": {
"description": "From games.list.",
"type": "string",
"pattern": "^[A-Za-z0-9_-]{1,128}$"
}
},
"required": [
"gameId"
]
}
Result JSON schema
Result JSON schema
{
"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
}
{
"name": "summer_call",
"arguments": {
"op": "router.settings",
"input": {
"gameId": "game_quilt"
}
}
}
summer router settings --game-id game_quilt
test_character
router.test_character: Talk to an AI character
Preview: search finds it and
summer_call runs it. It may still change.| 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. |
| 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
Input JSON schema
{
"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
Result JSON schema
{
"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
}
{
"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"
]
}
}
}
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
Preview: search finds it and
summer_call runs it. It may still change.| 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. |
| 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
Input JSON schema
{
"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
Result JSON schema
{
"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
}
{
"name": "summer_call",
"arguments": {
"op": "router.usage",
"input": {
"gameId": "game_quilt",
"days": 7
}
}
}
summer router usage --game-id game_quilt --days 7

