Koskamo

Praetorium MCP

Provides read-only access to Warhammer 40K rules, datasheets, points, and missions. Supports agent workflows for roster planning, faction discovery, and combat simulation via HTTP API and MCP tools.

Endpoint and access

No sign-in to connect and list tools. Individual tools may still need a vendor account, credentials, or permissions; check the documented prerequisites.

Praetorium MCP logo, by PraetoriumCommunity listingStreamable HTTPNo sign-inEndpoint checked 2026-11-06Published by Praetorium
MCP endpoint (Streamable HTTP)
https://praetorium.gg/mcp
Vendor documentation

What its tools do

15 tools, grouped by the hints the server advertises. Hints are self-declared, not verified behavior.

15 of 15 have a description · 15 of 15 declare behavior hints · 3 of 12 with parameters document them all

Checks and signals

Each line is separate evidence, not a trust score.

  • Passed Endpoint answered the live check ·
  • Availability 1 of 1 checks passed in 30 days

What you can do with it

  • Discover available factions and unit datasheets
  • Search missions, deployments, terrain, and rules
  • Simulate combat outcomes with specific loadouts
  • Read unit costs, composition, and attachment limits

Source and maintenance

Community listingRegistry 1.2.0
Maintenance checked

Protocol and capabilities

Server
praetorium-reference 1.2.0
MCP protocol negotiated in check
2025-11-25
Tools
15 advertised
Resources
2 advertised
Resource templates
0 advertised
Prompts
2 advertised
Server-advertised capabilities
{
  "tools": {
    "listChanged": true
  },
  "prompts": {
    "listChanged": true
  },
  "resources": {
    "listChanged": true
  }
}

Server-provided instructions

Untrusted server output shown for inspection. It is not Koskamo guidance and is excluded from knowledge search.

Praetorium is a free and open source Warhammer 40,000 army builder, combat simulator and battle tracker. Public reference tools work without signing in. Account tools require OAuth sign-in; read and write access have separate scopes. Use list_reference to discover factions, rule documents, mission packs, kinds, and the active snapshot. For roster planning, call list_units once with the faction, battle size, and optional detachment to get unit-size costs, composition, attachments, limits, and detachment rules instead of reading every datasheet; for a large faction such as a Space Marine chapter, narrow it with query. To review a saved list, read get_my_roster’s summary instead of resolving its catalogue ids. To compare two units in combat, call simulate_combat with unit ids from list_units instead of calculating odds yourself; report refused or notCalculated rules rather than estimating them. Use search_reference to find a record by name or number, then get_reference or get_reference_record before answering. Fetch the textSources URLs when the answer depends on a rule’s exact wording. Use faction, pack, and document filters when names or rule numbers are ambiguous. Cite the canonical URL and preserve the result attribution. Say when the source does not provide an answer. Praetorium returns names, numbers, points, and computed results, never rules text. A record or section that withholds rules text lists textSources: the pinned upstream file, its source, and the record id to find in it. Fetch that file yourself if you need the wording. Missing, conflicting, or unavailable source facts remain explicit. They must not be repaired or guessed from model memory.

Tools

15 advertised

list_my_rosters — List my saved rosters
Advertised by the server during the last successful anonymous check.
Advertised read-only

Lists the rosters saved to the signed-in Praetorium account. Requires mcp:read.

list_my_rosters input schema
{
  "type": "object",
  "$schema": "http://json-schema.org/draft-07/schema#",
  "properties": {}
}
list_my_rosters annotations
{
  "title": "List my saved rosters",
  "readOnlyHint": true,
  "openWorldHint": false,
  "idempotentHint": true,
  "destructiveHint": false
}
get_my_roster — Read my saved roster
Advertised by the server during the last successful anonymous check.
Advertised read-only

Returns one roster owned by the signed-in player, by an id from list_my_rosters. summary names each unit with its points, models, wargear, enhancements, Warlord and attachments, and gives the total and any problems that stop the list being fielded; it is null while army data is unavailable. roster holds the saved choices by catalogue id, the shape save_roster takes. Requires mcp:read.

get_my_roster input schema
{
  "type": "object",
  "$schema": "http://json-schema.org/draft-07/schema#",
  "required": [
    "id"
  ],
  "properties": {
    "id": {
      "type": "string",
      "maxLength": 64,
      "minLength": 1
    }
  }
}
get_my_roster annotations
{
  "title": "Read my saved roster",
  "readOnlyHint": true,
  "openWorldHint": false,
  "idempotentHint": true,
  "destructiveHint": false
}
list_my_battles — List my battles
Advertised by the server during the last successful anonymous check.
Advertised read-only

Lists up to 25 battles with a cursor for the next page. Requires mcp:read.

list_my_battles input schema
{
  "type": "object",
  "$schema": "http://json-schema.org/draft-07/schema#",
  "properties": {
    "before": {
      "anyOf": [
        {
          "type": "object",
          "required": [
            "at",
            "id"
          ],
          "properties": {
            "at": {
              "type": "integer",
              "maximum": 9007199254740991,
              "minimum": 0
            },
            "id": {
              "type": "string",
              "maxLength": 64,
              "minLength": 1
            }
          }
        },
        {
          "type": "null"
        }
      ],
      "default": null
    }
  }
}
list_my_battles annotations
{
  "title": "List my battles",
  "readOnlyHint": true,
  "openWorldHint": false,
  "idempotentHint": true,
  "destructiveHint": false
}
get_my_battle — Read one of my battles
Advertised by the server during the last successful anonymous check.
Advertised read-only

Returns the current seated view of a battle for the signed-in player. Requires mcp:read.

get_my_battle input schema
{
  "type": "object",
  "$schema": "http://json-schema.org/draft-07/schema#",
  "required": [
    "token"
  ],
  "properties": {
    "token": {
      "type": "string",
      "maxLength": 64,
      "minLength": 1
    }
  }
}
get_my_battle annotations
{
  "title": "Read one of my battles",
  "readOnlyHint": true,
  "openWorldHint": false,
  "idempotentHint": true,
  "destructiveHint": false
}
save_roster — Create or edit my roster
Advertised by the server during the last successful anonymous check.
Advertised destructiveOpen-world

Saves a complete roster. Pass its id to edit an owned roster; omit id to create one. limit is the battle size (1000, 2000 or 3000 points, or 600 for King of the Colosseum), which sets detachment points, enhancement and unit limits. pointsBudget optionally replaces only its points total (500 to 10000, not King of the Colosseum); omit it to keep a saved budget, or send null for the standard total. Requires mcp:write.

save_roster input schema
{
  "type": "object",
  "$schema": "http://json-schema.org/draft-07/schema#",
  "required": [
    "name",
    "catalogueId",
    "detachmentIds",
    "disposition",
    "limit",
    "picks",
    "prep"
  ],
  "properties": {
    "id": {
      "type": "string",
      "maxLength": 64,
      "minLength": 1
    },
    "name": {
      "type": "string",
      "maxLength": 80
    },
    "prep": {
      "anyOf": [
        {
          "type": "object",
          "required": [
            "stratagems",
            "secondaries"
          ],
          "properties": {
            "reminders": {
              "type": "array",
              "items": {
                "type": "object",
                "required": [
                  "key",
                  "ability",
                  "description",
                  "timings"
                ],
                "properties": {
                  "key": {
                    "type": "string",
                    "maxLength": 240,
                    "minLength": 1
                  },
                  "unit": {
                    "type": "object",
                    "required": [
                      "index",
                      "name"
                    ],
                    "properties": {
                      "name": {
                        "type": "string",
                        "maxLength": 80,
                        "minLength": 1
                      },
                      "index": {
                        "type": "integer",
                        "maximum": 99,
                        "minimum": 0
                      }
                    }
                  },
                  "ability": {
                    "type": "string",
                    "maxLength": 80,
                    "minLength": 1
                  },
                  "timings": {
                    "type": "array",
                    "items": {
                      "oneOf": [
                        {
                          "type": "object",
                          "required": [
                            "moment",
                            "phase",
                            "turn"
                          ],
                          "properties": {
                            "turn": {
                              "enum": [
                                "your-turn",
                                "opponent-turn",
                                "either"
                              ],
                              "type": "string"
                            },
                            "phase": {
                              "enum": [
                                "command",
                                "movement",
                                "shooting",
                                "charge",
                                "fight",
                                "any"
                              ],
                              "type": "string"
                            },
                            "moment": {
                              "enum": [
                                "phase-start",
                                "phase-end"
                              ],
                              "type": "string"
                            },
                            "firstRoundOnly": {
                              "type": "boolean"
                            }
                          }
                        },
                        {
                          "type": "object",
                          "required": [
                            "moment",
                            "phase",
                            "turn"
                          ],
                          "properties": {
                            "turn": {
                              "enum": [
                                "your-turn",
                                "opponent-turn",
                                "either"
                              ],
                              "type": "string"
                            },
                            "phase": {
                              "type": "null"
                            },
                            "moment": {
                              "enum": [
                                "turn-start",
                                "turn-end"
                              ],
                              "type": "string"
                            },
                            "firstRoundOnly": {
                              "type": "boolean"
                            }
                          }
                        },
                        {
                          "type": "object",
                          "required": [
                            "moment",
                            "phase",
                            "turn"
                          ],
                          "properties": {
                            "turn": {
                              "type": "string",
                              "const": "either"
                            },
                            "phase": {
                              "type": "null"
                            },
                            "moment": {
                              "enum": [
                                "round-start",
                                "round-end"
                              ],
                              "type": "string"
                            },
                            "firstRoundOnly": {
                              "type": "boolean"
                            }
                          }
                        }
                      ]
                    },
                    "maxItems": 10,
                    "minItems": 1
                  },
                  "description": {
                    "type": "string",
                    "maxLength": 10000
                  },
                  "whileDestroyed": {
                    "type": "boolean"
                  }
                }
              },
              "maxItems": 200
            },
            "stratagems": {
              "type": "array",
              "items": {
                "type": "object",
                "required": [
                  "key",
                  "name",
                  "cp",
                  "limit"
                ],
                "properties": {
                  "cp": {
                    "type": "integer",
                    "maximum": 6,
                    "minimum": 0
                  },
                  "key": {
                    "type": "string",
                    "maxLength": 64,
                    "minLength": 1
                  },
                  "name": {
                    "type": "string",
                    "maxLength": 80,
                    "minLength": 1
                  },
                  "turn": {
                    "enum": [
                      "your-turn",
                      "opponent-turn",
                      "either"
                    ],
                    "type": "string"
                  },
                  "limit": {
                    "enum": [
                      "phase",
                      "turn",
                      "battle-round",
                      "battle",
                      "unlimited"
                    ],
                    "type": "string"
                  },
                  "phases": {
                    "type": "array",
                    "items": {
                      "enum": [
                        "command",
                        "movement",
                        "shooting",
                        "charge",
                        "fight",
                        "end"
                      ],
                      "type": "string"
                    },
                    "maxItems": 6
                  }
                }
              },
              "maxItems": 48
            },
            "secondaries": {
              "type": "array",
              "items": {
                "type": "object",
                "required": [
                  "key",
                  "name"
                ],
                "properties": {
                  "key": {
                    "type": "string",
                    "maxLength": 64,
                    "minLength": 1
                  },
                  "name": {
                    "type": "string",
                    "maxLength": 80,
                    "minLength": 1
                  }
                }
              },
              "maxItems": 6
            },
            "remindersEnabled": {
              "type": "boolean",
              "default": true
            }
          }
        },
        {
          "type": "null"
        }
      ]
    },
    "limit": {
      "type": "integer",
      "maximum": 10000,
      "minimum": 0
    },
    "picks": {
      "type": "array",
      "items": {
        "type": "object",
        "required": [
          "entryId"
        ],
        "properties": {
          "note": {
            "type": "string",
            "maxLength": 500
          },
          "models": {
            "type": "integer",
            "maximum": 60,
            "minimum": 1
          },
          "choices": {
            "type": "object",
            "propertyNames": {
              "type": "string",
              "maxLength": 400
            },
            "additionalProperties": {
              "type": "string",
              "maxLength": 64,
              "minLength": 1
            }
          },
          "entryId": {
            "type": "string",
            "maxLength": 64,
            "minLength": 1
          },
          "spreads": {
            "type": "object",
            "propertyNames": {
              "type": "string",
              "maxLength": 400
            },
            "additionalProperties": {
              "type": "object",
              "propertyNames": {
                "type": "string",
                "maxLength": 64
              },
              "additionalProperties": {
                "type": "integer",
                "maximum": 60,
                "minimum": 0
              }
            }
          },
          "toggles": {
            "type": "object",
            "propertyNames": {
              "type": "string",
              "maxLength": 400
            },
            "additionalProperties": {
              "type": "integer",
              "maximum": 1,
              "minimum": 0
            }
          },
          "nickname": {
            "type": "string",
            "maxLength": 40
          },
          "attachedTo": {
            "type": "integer",
            "maximum": 99,
            "minimum": 0
          },
          "embarkedIn": {
            "type": "integer",
            "maximum": 99,
            "minimum": 0
          },
          "catalogueId": {
            "type": "string",
            "maxLength": 64,
            "minLength": 1
          }
        }
      },
      "maxItems": 100
    },
    "source": {
      "enum": [
        "legacy",
        "editable",
        "praetorium",
        "battlebase",
        "newrecruit",
        "roster-file"
      ],
      "type": "string",
      "default": "editable"
    },
    "visibility": {
      "enum": [
        "private",
        "unlisted",
        "public"
      ],
      "type": "string",
      "default": "private"
    },
    "catalogueId": {
      "type": "string",
      "maxLength": 64,
      "minLength": 1
    },
    "disposition": {
      "anyOf": [
        {
          "type": "string",
          "maxLength": 64,
          "minLength": 1
        },
        {
          "type": "null"
        }
      ]
    },
    "waivedRules": {
      "type": "array",
      "items": {
        "enum": [
          "points-limit",
          "detachments",
          "detachment-points",
          "warlord",
          "kotc-infantry",
          "kotc-warlord",
          "kotc-epic-heroes",
          "kotc-toughness",
          "kotc-datasheet-copies"
        ],
        "type": "string"
      },
      "maxItems": 9
    },
    "pointsBudget": {
      "anyOf": [
        {
          "type": "integer",
          "maximum": 10000,
          "minimum": 500
        },
        {
          "type": "null"
        }
      ]
    },
    "detachmentIds": {
      "type": "array",
      "items": {
        "type": "string",
        "maxLength": 128,
        "minLength": 1
      },
      "maxItems": 3
    },
    "optionalRules": {
      "type": "array",
      "items": {
        "enum": [
          "kotc-borrowed-disposition"
        ],
        "type": "string"
      },
      "maxItems": 1
    },
    "borrowedDetachmentId": {
      "anyOf": [
        {
          "type": "string",
          "maxLength": 128,
          "minLength": 1
        },
        {
          "type": "null"
        }
      ],
      "default": null
    }
  }
}
save_roster annotations
{
  "title": "Create or edit my roster",
  "readOnlyHint": false,
  "openWorldHint": true,
  "idempotentHint": false,
  "destructiveHint": true
}
set_roster_visibility — Change my roster visibility
Advertised by the server during the last successful anonymous check.
Advertised destructiveOpen-world

Changes the visibility of an owned roster. Requires mcp:write.

set_roster_visibility input schema
{
  "type": "object",
  "$schema": "http://json-schema.org/draft-07/schema#",
  "required": [
    "id",
    "visibility"
  ],
  "properties": {
    "id": {
      "type": "string",
      "maxLength": 64,
      "minLength": 1
    },
    "visibility": {
      "enum": [
        "private",
        "unlisted",
        "public"
      ],
      "type": "string"
    }
  }
}
set_roster_visibility annotations
{
  "title": "Change my roster visibility",
  "readOnlyHint": false,
  "openWorldHint": true,
  "idempotentHint": false,
  "destructiveHint": true
}
create_battle — Create a battle
Advertised by the server during the last successful anonymous check.
Advertised destructiveOpen-world

Creates a battle with named player seats, using the same rules as the site. Requires mcp:write.

create_battle input schema
{
  "type": "object",
  "$schema": "http://json-schema.org/draft-07/schema#",
  "properties": {
    "limit": {
      "anyOf": [
        {
          "type": "integer",
          "maximum": 9007199254740991,
          "minimum": -9007199254740991
        },
        {
          "type": "null"
        }
      ]
    },
    "allyId": {
      "type": "string",
      "maxLength": 64,
      "minLength": 1
    },
    "casual": {
      "type": "boolean",
      "default": false
    },
    "manual": {
      "type": "boolean",
      "default": false
    },
    "fixture": {
      "type": "string",
      "maxLength": 300
    },
    "groupToken": {
      "type": "string",
      "maxLength": 64,
      "minLength": 1
    },
    "guestNames": {
      "type": "array",
      "items": {
        "type": "string",
        "maxLength": 48,
        "minLength": 1
      },
      "maxItems": 2,
      "minItems": 1
    },
    "opponentId": {
      "type": "string",
      "maxLength": 64,
      "minLength": 1
    },
    "opponentIds": {
      "type": "array",
      "items": {
        "type": "string",
        "maxLength": 64,
        "minLength": 1
      },
      "maxItems": 2,
      "minItems": 1
    },
    "missionPackId": {
      "anyOf": [
        {
          "type": "string",
          "maxLength": 64,
          "minLength": 1
        },
        {
          "type": "null"
        }
      ],
      "default": null
    }
  }
}
create_battle annotations
{
  "title": "Create a battle",
  "readOnlyHint": false,
  "openWorldHint": true,
  "idempotentHint": false,
  "destructiveHint": true
}
submit_battle_action — Record a battle action
Advertised by the server during the last successful anonymous check.
Advertised destructiveOpen-world

Appends a legal battle command only when expectedSeq matches the current log. Requires mcp:write.

submit_battle_action input schema
{
  "type": "object",
  "$schema": "http://json-schema.org/draft-07/schema#",
  "required": [
    "token",
    "expectedSeq",
    "command"
  ],
  "properties": {
    "token": {
      "type": "string",
      "maxLength": 64,
      "minLength": 1
    },
    "command": {
      "anyOf": [
        {
          "oneOf": [
            {
              "type": "object",
              "required": [
                "kind",
                "cardKey",
                "occurrence",
                "selection"
              ],
              "properties": {
                "kind": {
                  "type": "string",
                  "const": "select-mission"
                },
                "cardKey": {
                  "type": "string",
                  "maxLength": 64,
                  "minLength": 1
                },
                "playerId": {
                  "type": "string",
                  "maxLength": 64,
                  "minLength": 1
                },
                "selection": {
                  "oneOf": [
                    {
                      "type": "object",
                      "required": [
                        "kind",
                        "units",
                        "fallback",
                        "qualified"
                      ],
                      "properties": {
                        "kind": {
                          "type": "string",
                          "const": "punishment"
                        },
                        "units": {
                          "type": "array",
                          "items": {
                            "type": "object",
                            "required": [
                              "playerId",
                              "unitKey",
                              "rosterSeq"
                            ],
                            "properties": {
                              "unitKey": {
                                "type": "string",
                                "maxLength": 64,
                                "minLength": 1
                              },
                              "playerId": {
                                "type": "string",
                                "maxLength": 64,
                                "minLength": 1
                              },
                              "rosterSeq": {
                                "type": "integer",
                                "maximum": 9007199254740991,
                                "exclusiveMinimum": 0
                              }
                            }
                          },
                          "maxItems": 3
                        },
                        "fallback": {
                          "type": "boolean"
                        },
                        "qualified": {
                          "type": "boolean"
                        },
                        "unavailable": {
                          "type": "boolean",
                          "const": true
                        }
                      }
                    },
                    {
                      "type": "object",
                      "required": [
                        "kind",
                        "guards"
                      ],
                      "properties": {
                        "kind": {
                          "type": "string",
                          "const": "guards"
                        },
                        "guards": {
                          "type": "array",
                          "items": {
                            "type": "object",
                            "required": [
                              "objective",
                              "unit"
                            ],
                            "properties": {
                              "unit": {
                                "type": "object",
                                "required": [
                                  "playerId",
                                  "unitKey",
                                  "rosterSeq"
                                ],
                                "properties": {
                                  "unitKey": {
                                    "type": "string",
                                    "maxLength": 64,
                                    "minLength": 1
                                  },
                                  "playerId": {
                                    "type": "string",
                                    "maxLength": 64,
                                    "minLength": 1
                                  },
                                  "rosterSeq": {
                                    "type": "integer",
                                    "maximum": 9007199254740991,
                                    "exclusiveMinimum": 0
                                  }
                                }
                              },
                              "objective": {
                                "type": "object",
                                "required": [
                                  "key",
                                  "name"
                                ],
                                "properties": {
                                  "key": {
                                    "type": "string",
                                    "maxLength": 128,
                                    "minLength": 1
                                  },
                                  "name": {
                                    "type": "string",
                                    "maxLength": 80,
                                    "minLength": 1
                                  }
                                }
                              }
                            }
                          },
                          "maxItems": 20
                        }
                      }
                    },
                    {
                      "type": "object",
                      "required": [
                        "kind",
                        "objective"
                      ],
                      "properties": {
                        "kind": {
                          "type": "string",
                          "const": "tempting-target"
                        },
                        "objective": {
                          "type": "object",
                          "required": [
                            "key",
                            "name"
                          ],
                          "properties": {
                            "key": {
                              "type": "string",
                              "maxLength": 128,
                              "minLength": 1
                            },
                            "name": {
                              "type": "string",
                              "maxLength": 80,
                              "minLength": 1
                            }
                          }
                        }
                      }
                    },
                    {
                      "type": "object",
                      "required": [
                        "kind",
                        "unit",
                        "note"
                      ],
                      "properties": {
                        "kind": {
                          "type": "string",
                          "const": "beacon"
                        },
                        "note": {
                          "type": "string",
                          "maxLength": 200
                        },
                        "unit": {
                          "anyOf": [
                            {
                              "type": "object",
                              "required": [
                                "playerId",
                                "unitKey",
                                "rosterSeq"
                              ],
                              "properties": {
                                "unitKey": {
                                  "type": "string",
                                  "maxLength": 64,
                                  "minLength": 1
                                },
                                "playerId": {
                                  "type": "string",
                                  "maxLength": 64,
                                  "minLength": 1
                                },
                                "rosterSeq": {
                                  "type": "integer",
                                  "maximum": 9007199254740991,
                                  "exclusiveMinimum": 0
                                }
                              }
                            },
                            {
                              "type": "null"
                            }
                          ]
                        }
                      }
                    },
                    {
                      "type": "object",
                      "required": [
                        "kind",
                        "areas",
                        "outsideZone",
                        "allEligible"
                      ],
                      "properties": {
                        "kind": {
                          "type": "string",
                          "const": "locate-and-deny"
                        },
                        "areas": {
                          "type": "array",
                          "items": {
                            "type": "object",
                            "required": [
                              "key",
                              "name"
                            ],
                            "properties": {
                              "key": {
                                "type": "string",
                                "maxLength": 128,
                                "minLength": 1
                              },
                              "name": {
                                "type": "string",
                                "maxLength": 80,
                                "minLength": 1
                              }
                            }
                          },
                          "maxItems": 5
                        },
                        "allEligible": {
                          "type": "boolean"
                        },
                        "outsideZone": {
                          "type": "boolean"
                        }
                      }
                    },
                    {
                      "type": "object",
                      "required": [
                        "kind",
                        "marker",
                        "controlled"
                      ],
                      "properties": {
                        "kind": {
                          "type": "string",
                          "const": "sensor-sweep"
                        },
                        "marker": {
                          "type": "object",
                          "required": [
                            "key",
                            "name",
                            "playerId"
                          ],
                          "properties": {
                            "key": {
                              "type": "string",
                              "maxLength": 128,
                              "minLength": 1
                            },
                            "name": {
                              "type": "string",
                              "maxLength": 80,
                              "minLength": 1
                            },
                            "playerId": {
                              "type": "string",
                              "maxLength": 64,
                              "minLength": 1
                            }
                          }
                        },
                        "controlled": {
                          "type": "boolean"
                        }
                      }
                    },
                    {
                      "type": "object",
                      "required": [
                        "kind",
                        "consecrations",
                        "qualified",
                        "notHome"
                      ],
                      "properties": {
                        "kind": {
                          "type": "string",
                          "const": "consecrate"
                        },
                        "notHome": {
                          "type": "boolean"
                        },
                        "qualified": {
                          "type": "boolean"
                        },
                        "consecrations": {
                          "type": "array",
                          "items": {
                            "type": "object",
                            "required": [
                              "objective",
                              "unit"
                            ],
                            "properties": {
                              "unit": {
                                "type": "object",
                                "required": [
                                  "playerId",
                                  "unitKey",
                                  "rosterSeq"
                                ],
                                "properties": {
                                  "unitKey": {
                                    "type": "string",
                                    "maxLength": 64,
                                    "minLength": 1
                                  },
                                  "playerId": {
                                    "type": "string",
                                    "maxLength": 64,
                                    "minLength": 1
                                  },
                                  "rosterSeq": {
                                    "type": "integer",
                                    "maximum": 9007199254740991,
                                    "exclusiveMinimum": 0
                                  }
                                }
                              },
                              "objective": {
                                "type": "object",
                                "required": [
                                  "key",
                                  "name"
                                ],
                                "properties": {
                                  "key": {
                                    "type": "string",
                                    "maxLength": 128,
                                    "minLength": 1
                                  },
                                  "name": {
                                    "type": "string",
                                    "maxLength": 80,
                                    "minLength": 1
                                  }
                                }
                              }
                            }
                          },
                          "maxItems": 20
                        }
                      }
                    }
                  ]
                },
                "occurrence": {
                  "type": "integer",
                  "maximum": 9007199254740991,
                  "exclusiveMinimum": 0
                }
              }
            },
            {
              "type": "object",
              "required": [
                "kind",
                "limit",
                "missionPackId",
                "terrainLayoutId",
                "twistId",
                "clockLimitMinutes"
              ],
              "properties": {
                "kind": {
                  "type": "string",
                  "const": "configure-battle"
                },
                "limit": {
                  "anyOf": [
                    {
                      "type": "integer",
                      "maximum": 10000,
                      "minimum": 0
                    },
                    {
                      "type": "null"
                    }
                  ]
                },
                "manual": {
                  "type": "boolean"
                },
                "twistId": {
                  "anyOf": [
                    {
                      "type": "string",
                      "maxLength": 64,
                      "minLength": 1
                    },
                    {
                      "type": "null"
                    }
                  ]
                },
                "armyPoints": {
                  "anyOf": [
                    {
                      "type": "array",
                      "items": {
                        "type": "integer",
                        "maximum": 10000,
                        "minimum": 1
                      },
                      "maxItems": 2,
                      "minItems": 2
                    },
                    {
                      "type": "null"
                    }
                  ]
                },
                "teamBattle": {
                  "type": "boolean"
                },
                "playerCount": {
                  "anyOf": [
                    {
                      "type": "number",
                      "const": 2
                    },
                    {
                      "type": "number",
                      "const": 3
                    },
                    {
                      "type": "number",
                      "const": 4
                    }
                  ]
                },
                "missionPackId": {
                  "anyOf": [
                    {
                      "type": "string",
                      "maxLength": 64,
                      "minLength": 1
                    },
                    {
                      "type": "null"
                    }
                  ]
                },
                "terrainLayoutId": {
                  "anyOf": [
                    {
                      "type": "string",
                      "maxLength": 64,
                      "minLength": 1
                    },
                    {
                      "type": "null"
                    }
                  ]
                },
                "sharedArmyPoints": {
                  "type": "boolean"
                },
                "clockLimitMinutes": {
                  "anyOf": [
                    {
                      "type": "integer",
                      "maximum": 300,
                      "minimum": 5
                    },
                    {
                      "type": "null"
                    }
                  ]
                }
              }
            },
            {
              "type": "object",
              "required": [
                "kind"
              ],
              "properties": {
                "kind": {
                  "type": "string",
                  "const": "reset-setup"
                }
              }
            },
            {
              "type": "object",
              "required": [
                "kind",
                "groupId"
              ],
              "properties": {
                "kind": {
                  "type": "string",
                  "const": "set-battle-group"
                },
                "groupId": {
                  "anyOf": [
                    {
                      "type": "string",
                      "maxLength": 64,
                      "minLength": 1
                    },
                    {
                      "type": "null"
                    }
                  ]
                }
              }
            },
            {
              "type": "object",
              "required": [
                "kind"
              ],
              "properties": {
                "kind": {
                  "type": "string",
                  "const": "detach-roster"
                },
                "playerId": {
                  "type": "string",
                  "maxLength": 64,
                  "minLength": 1
                }
              }
            },
            {
              "type": "object",
              "required": [
                "kind",
                "sealedEventToken"
              ],
              "properties": {
                "kind": {
                  "type": "string",
                  "const": "lock-sealed-event-rosters"
                },
                "warlords": {
                  "type": "array",
                  "items": {
                    "type": "object",
                    "required": [
                      "side",
                      "playerId"
                    ],
                    "properties": {
                      "side": {
                        "type": "integer",
                        "maximum": 1,
                        "minimum": 0
                      },
                      "playerId": {
                        "type": "string",
                        "maxLength": 64,
                        "minLength": 1
                      }
                    }
                  },
                  "maxItems": 2
                },
                "eventToken": {
                  "type": "string",
                  "maxLength": 64,
                  "minLength": 1
                },
                "dispositions": {
                  "type": "array",
                  "items": {
                    "type": "object",
                    "required": [
                      "side",
                      "disposition"
                    ],
                    "properties": {
                      "side": {
                        "type": "integer",
                        "maximum": 1,
                        "minimum": 0
                      },
                      "disposition": {
                        "type": "string",
                        "maxLength": 64,
                        "minLength": 1
                      }
                    }
                  },
                  "maxItems": 2
                },
                "sealedEventToken": {
                  "type": "string",
                  "maxLength": 64,
                  "minLength": 1
                }
              }
            },
            {
              "type": "object",
              "required": [
                "kind",
                "step"
              ],
              "properties": {
                "kind": {
                  "type": "string",
                  "const": "set-setup-step"
                },
                "step": {
                  "type": "integer",
                  "maximum": 9,
                  "minimum": 0
                }
              }
            },
            {
              "type": "object",
              "required": [
                "kind",
                "step",
                "checked"
              ],
              "properties": {
                "kind": {
                  "type": "string",
                  "const": "set-setup-checked"
                },
                "step": {
                  "type": "integer",
                  "maximum": 9,
                  "minimum": 0
                },
                "checked": {
                  "type": "boolean"
                }
              }
            },
            {
              "type": "object",
              "required": [
                "kind",
                "attackerId"
              ],
              "properties": {
                "kind": {
                  "type": "string",
                  "const": "set-attacker"
                },
                "attackerId": {
                  "type": "string",
                  "maxLength": 64,
                  "minLength": 1
                }
              }
            },
            {
              "type": "object",
              "required": [
                "kind",
                "firstPlayerId"
              ],
              "properties": {
                "kind": {
                  "type": "string",
                  "const": "set-first-turn"
                },
                "firstPlayerId": {
                  "type": "string",
                  "maxLength": 64,
                  "minLength": 1
                }
              }
            },
            {
              "type": "object",
              "required": [
                "kind",
                "side",
                "disposition"
              ],
              "properties": {
                "kind": {
                  "type": "string",
                  "const": "set-side-disposition"
                },
                "side": {
                  "type": "integer",
                  "maximum": 1,
                  "minimum": 0
                },
                "disposition": {
                  "type": "string",
                  "maxLength": 64,
                  "minLength": 1
                }
              }
            },
            {
              "type": "object",
              "required": [
                "kind",
                "side",
                "playerId"
              ],
              "properties": {
                "kind": {
                  "type": "string",
                  "const": "set-side-warlord"
                },
                "side": {
                  "type": "integer",
                  "maximum": 1,
                  "minimum": 0
                },
                "playerId": {
                  "type": "string",
                  "maxLength": 64,
                  "minLength": 1
                }
              }
            },
            {
              "type": "object",
              "required": [
                "kind",
                "roster"
              ],
              "properties": {
                "kind": {
                  "type": "string",
                  "const": "attach-roster"
                },
                "prep": {
                  "anyOf": [
                    {
                      "type": "object",
                      "required": [
                        "stratagems",
                        "secondaries",
                        "primary",
                        "secondaryMode"
                      ],
                      "properties": {
                        "primary": {
                          "anyOf": [
                            {
                              "type": "object",
                              "required": [
                                "key",
                                "name"
                              ],
                              "properties": {
                                "key": {
                                  "type": "string",
                                  "maxLength": 64,
                                  "minLength": 1
                                },
                                "name": {
                                  "type": "string",
                                  "maxLength": 80,
                                  "minLength": 1
                                },
                                "awards": {
                                  "type": "array",
                                  "items": {
                                    "type": "object",
                                    "required": [
                                      "vp",
                                      "per",
                                      "mode",
                                      "max",
                                      "group",
                                      "cumulative",
                                      "criteria",
                                      "trigger"
                                    ],
                                    "properties": {
                                      "vp": {
                                        "type": "integer",
                                        "maximum": 100,
                                        "minimum": 0
                                      },
                                      "max": {
                                        "anyOf": [
                                          {
                                            "type": "integer",
                                            "maximum": 100,
                                            "minimum": 0
                                          },
                                          {
                                            "type": "null"
                                          }
                                        ]
                                      },
                                      "per": {
                                        "anyOf": [
                                          {
                                            "type": "string",
                                            "maxLength": 200
                                          },
                                          {
                                            "type": "null"
                                          }
                                        ]
                                      },
                                      "mode": {
                                        "anyOf": [
                                          {
                                            "type": "string",
                                            "maxLength": 40
                                          },
                                          {
                                            "type": "null"
                                          }
                                        ]
                                      },
                                      "group": {
                                        "anyOf": [
                                          {
                                            "type": "string",
                                            "maxLength": 100
                                          },
                                          {
                                            "type": "null"
                                          }
                                        ]
                                      },
                                      "trigger": {
                                        "type": "object",
                                        "required": [
                                          "timing",
                                          "phase",
                                          "playerTurn",
                                          "roundMin",
                                          "roundMax"
                                        ],
                                        "properties": {
                                          "phase": {
                                            "anyOf": [
                                              {
                                                "type": "string",
                                                "maxLength": 80
                                              },
                                              {
                                                "type": "null"
                                              }
                                            ]
                                          },
                                          "timing": {
                                            "anyOf": [
                                              {
                                                "type": "string",
                                                "maxLength": 80
                                              },
                                              {
                                                "type": "null"
                                              }
                                            ]
                                          },
                                          "roundMax": {
                                            "anyOf": [
                                              {
                                                "type": "integer",
                                                "maximum": 5,
                                                "minimum": 1
                                              },
                                              {
                                                "type": "null"
                                              }
                                            ]
                                          },
                                          "roundMin": {
                                            "anyOf": [
                                              {
                                                "type": "integer",
                                                "maximum": 5,
                                                "minimum": 1
                                              },
                                              {
                                                "type": "null"
                                              }
                                            ]
                                          },
                                          "playerTurn": {
                                            "anyOf": [
                                              {
                                                "type": "string",
                                                "maxLength": 80
                                              },
                                              {
                                                "type": "null"
                                              }
                                            ]
                                          }
                                        }
                                      },
                                      "criteria": {
                                        "anyOf": [
                                          {
                                            "type": "string",
                                            "maxLength": 2000
                                          },
                                          {
                                            "type": "null"
                                          }
                                        ]
                                      },
                                      "cumulative": {
                                        "type": "boolean"
                                      }
                                    }
                                  },
                                  "maxItems": 20
                                },
                                "selection": {
                                  "enum": [
                                    "punishment",
                                    "guards",
                                    "tempting-target",
                                    "beacon",
                                    "locate-and-deny",
                                    "sensor-sweep",
                                    "consecrate"
                                  ],
                                  "type": "string"
                                }
                              }
                            },
                            {
                              "type": "null"
                            }
                          ]
                        },
                        "stratagems": {
                          "type": "array",
                          "items": {
                            "type": "object",
                            "required": [
                              "key",
                              "name",
                              "cp",
                              "limit"
                            ],
                            "properties": {
                              "cp": {
                                "type": "integer",
                                "maximum": 6,
                                "minimum": 0
                              },
                              "key": {
                                "type": "string",
                                "maxLength": 64,
                                "minLength": 1
                              },
                              "name": {
                                "type": "string",
                                "maxLength": 80,
                                "minLength": 1
                              },
                              "turn": {
                                "enum": [
                                  "your-turn",
                                  "opponent-turn",
                                  "either"
                                ],
                                "type": "string"
                              },
                              "limit": {
                                "enum": [
                                  "phase",
                                  "turn",
                                  "battle-round",
                                  "battle",
                                  "unlimited"
                                ],
                                "type": "string"
                              },
                              "phases": {
                                "type": "array",
                                "items": {
                                  "enum": [
                                    "command",
                                    "movement",
                                    "shooting",
                                    "charge",
                                    "fight",
                                    "end"
                                  ],
                                  "type": "string"
                                },
                                "maxItems": 6
                              },
                              "detachment": {
                                "type": "string",
                                "maxLength": 249,
                                "minLength": 1
                              }
                            }
                          },
                          "maxItems": 48
                        },
                        "secondaries": {
                          "type": "array",
                          "items": {
                            "type": "object",
                            "required": [
                              "key",
                              "name"
                            ],
                            "properties": {
                              "key": {
                                "type": "string",
                                "maxLength": 64,
                                "minLength": 1
                              },
                              "name": {
                                "type": "string",
                                "maxLength": 80,
                                "minLength": 1
                              },
                              "awards": {
                                "type": "array",
                                "items": {
                                  "type": "object",
                                  "required": [
                                    "vp",
                                    "per",
                                    "mode",
                                    "max",
                                    "group",
                                    "cumulative",
                                    "criteria",
                                    "trigger"
                                  ],
                                  "properties": {
                                    "vp": {
                                      "type": "integer",
                                      "maximum": 100,
                                      "minimum": 0
                                    },
                                    "max": {
                                      "anyOf": [
                                        {
                                          "type": "integer",
                                          "maximum": 100,
                                          "minimum": 0
                                        },
                                        {
                                          "type": "null"
                                        }
                                      ]
                                    },
                                    "per": {
                                      "anyOf": [
                                        {
                                          "type": "string",
                                          "maxLength": 200
                                        },
                                        {
                                          "type": "null"
                                        }
                                      ]
                                    },
                                    "mode": {
                                      "anyOf": [
                                        {
                                          "type": "string",
                                          "maxLength": 40
                                        },
                                        {
                                          "type": "null"
                                        }
                                      ]
                                    },
                                    "group": {
                                      "anyOf": [
                                        {
                                          "type": "string",
                                          "maxLength": 100
                                        },
                                        {
                                          "type": "null"
                                        }
                                      ]
                                    },
                                    "trigger": {
                                      "type": "object",
                                      "required": [
                                        "timing",
                                        "phase",
                                        "playerTurn",
                                        "roundMin",
                                        "roundMax"
                                      ],
                                      "properties": {
                                        "phase": {
                                          "anyOf": [
                                            {
                                              "type": "string",
                                              "maxLength": 80
                                            },
                                            {
                                              "type": "null"
                                            }
                                          ]
                                        },
                                        "timing": {
                                          "anyOf": [
                                            {
                                              "type": "string",
                                              "maxLength": 80
                                            },
                                            {
                                              "type": "null"
                                            }
                                          ]
                                        },
                                        "roundMax": {
                                          "anyOf": [
                                            {
                                              "type": "integer",
                                              "maximum": 5,
                                              "minimum": 1
                                            },
                                            {
                                              "type": "null"
                                            }
                                          ]
                                        },
                                        "roundMin": {
                                          "anyOf": [
                                            {
                                              "type": "integer",
                                              "maximum": 5,
                                              "minimum": 1
                                            },
                                            {
                                              "type": "null"
                                            }
                                          ]
                                        },
                                        "playerTurn": {
                                          "anyOf": [
                                            {
                                              "type": "string",
                                              "maxLength": 80
                                            },
                                            {
                                              "type": "null"
                                            }
                                          ]
                                        }
                                      }
                                    },
                                    "criteria": {
                                      "anyOf": [
                                        {
                                          "type": "string",
                                          "maxLength": 2000
                                        },
                                        {
                                          "type": "null"
                                        }
                                      ]
                                    },
                                    "cumulative": {
                                      "type": "boolean"
                                    }
                                  }
                                },
                                "maxItems": 20
                              },
                              "selection": {
                                "enum": [
                                  "punishment",
                                  "guards",
                                  "tempting-target",
                                  "beacon",
                                  "locate-and-deny",
                                  "sensor-sweep",
                                  "consecrate"
                                ],
                                "type": "string"
                              }
                            }
                          },
                          "maxItems": 6
                        },
                        "secondaryDeck": {
                          "type": "array",
                          "items": {
                            "type": "object",
                            "required": [
                              "key",
                              "name"
                            ],
                            "properties": {
                              "key": {
                                "type": "string",
                                "maxLength": 64,
                                "minLength": 1
                              },
                              "name": {
                                "type": "string",
                                "maxLength": 80,
                                "minLength": 1
                              },
                              "awards": {
                                "type": "array",
                                "items": {
                                  "type": "object",
                                  "required": [
                                    "vp",
                                    "per",
                                    "mode",
                                    "max",
                                    "group",
                                    "cumulative",
                                    "criteria",
                                    "trigger"
                                  ],
                                  "properties": {
                                    "vp": {
                                      "type": "integer",
                                      "maximum": 100,
                                      "minimum": 0
                                    },
                                    "max": {
                                      "anyOf": [
                                        {
                                          "type": "integer",
                                          "maximum": 100,
                                          "minimum": 0
                                        },
                                        {
                                          "type": "null"
                                        }
                                      ]
                                    },
                                    "per": {
                                      "anyOf": [
                                        {
                                          "type": "string",
                                          "maxLength": 200
                                        },
                                        {
                                          "type": "null"
                                        }
                                      ]
                                    },
                                    "mode": {
                                      "anyOf": [
                                        {
                                          "type": "string",
                                          "maxLength": 40
                                        },
                                        {
                                          "type": "null"
                                        }
                                      ]
                                    },
                                    "group": {
                                      "anyOf": [
                                        {
                                          "type": "string",
                                          "maxLength": 100
                                        },
                                        {
                                          "type": "null"
                                        }
                                      ]
                                    },
                                    "trigger": {
                                      "type": "object",
                                      "required": [
                                        "timing",
                                        "phase",
                                        "playerTurn",
                                        "roundMin",
                                        "roundMax"
                                      ],
                                      "properties": {
                                        "phase": {
                                          "anyOf": [
                                            {
                                              "type": "string",
                                              "maxLength": 80
                                            },
                                            {
                                              "type": "null"
                                            }
                                          ]
                                        },
                                        "timing": {
                                          "anyOf": [
                                            {
                                              "type": "string",
                                              "maxLength": 80
                                            },
                                            {
                                              "type": "null"
                                            }
                                          ]
                                        },
                                        "roundMax": {
                                          "anyOf": [
                                            {
                                              "type": "integer",
                                              "maximum": 5,
                                              "minimum": 1
                                            },
                                            {
                                              "type": "null"
                                            }
                                          ]
                                        },
                                        "roundMin": {
                                          "anyOf": [
                                            {
                                              "type": "integer",
                                              "maximum": 5,
                                              "minimum": 1
                                            },
                                            {
                                              "type": "null"
                                            }
                                          ]
                                        },
                                        "playerTurn": {
                                          "anyOf": [
                                            {
                                              "type": "string",
                                              "maxLength": 80
                                            },
                                            {
                                              "type": "null"
                                            }
                                          ]
                                        }
                                      }
                                    },
                                    "criteria": {
                                      "anyOf": [
                                        {
                                          "type": "string",
                                          "maxLength": 2000
                                        },
                                        {
                                          "type": "null"
                                        }
                                      ]
                                    },
                                    "cumulative": {
                                      "type": "boolean"
                                    }
                                  }
                                },
                                "maxItems": 20
                              },
                              "selection": {
                                "enum": [
                                  "punishment",
                                  "guards",
                                  "tempting-target",
                                  "beacon",
                                  "locate-and-deny",
                                  "sensor-sweep",
                                  "consecrate"
                                ],
                                "type": "string"
                              }
                            }
                          },
                          "maxItems": 60
                        },
                        "secondaryMode": {
                          "enum": [
                            "tactical",
                            "fixed"
                          ],
                          "type": "string"
                        }
                      }
                    },
                    {
                      "type": "null"
                    }
                  ]
                },
                "roster": {
                  "type": "object",
                  "required": [
                    "name",
                    "text"
                  ],
                  "properties": {
                    "id": {
                      "type": "string",
                      "maxLength": 64,
                      "minLength": 1
                    },
                    "name": {
                      "type": "string",
                      "maxLength": 80
                    },
                    "text": {
                      "type": "string",
                      "maxLength": 20000
                    },
                    "built": {
                      "type": "object",
                      "required": [
                        "catalogueId",
                        "revision",
                        "limit",
                        "detachment",
                        "disposition",
                        "units"
                      ],
                      "properties": {
                        "limit": {
                          "type": "integer",
                          "maximum": 10000,
                          "minimum": 0
                        },
                        "picks": {
                          "type": "array",
                          "items": {
                            "type": "object",
                            "required": [
                              "entryId"
                            ],
                            "properties": {
                              "note": {
                                "type": "string",
                                "maxLength": 500
                              },
                              "models": {
                                "type": "integer",
                                "maximum": 60,
                                "minimum": 1
                              },
                              "choices": {
                                "type": "object",
                                "propertyNames": {
                                  "type": "string",
                                  "maxLength": 400
                                },
                                "additionalProperties": {
                                  "type": "string",
                                  "maxLength": 64,
                                  "minLength": 1
                                }
                              },
                              "entryId": {
                                "type": "string",
                                "maxLength": 64,
                                "minLength": 1
                              },
                              "spreads": {
                                "type": "object",
                                "propertyNames": {
                                  "type": "string",
                                  "maxLength": 400
                                },
                                "additionalProperties": {
                                  "type": "object",
                                  "propertyNames": {
                                    "type": "string",
                                    "maxLength": 64
                                  },
                                  "additionalProperties": {
                                    "type": "integer",
                                    "maximum": 60,
                                    "minimum": 0
                                  }
                                }
                              },
                              "toggles": {
                                "type": "object",
                                "propertyNames": {
                                  "type": "string",
                                  "maxLength": 400
                                },
                                "additionalProperties": {
                                  "type": "integer",
                                  "maximum": 1,
                                  "minimum": 0
                                }
                              },
                              "nickname": {
                                "type": "string",
                                "maxLength": 40
                              },
                              "attachedTo": {
                                "type": "integer",
                                "maximum": 99,
                                "minimum": 0
                              },
                              "embarkedIn": {
                                "type": "integer",
                                "maximum": 99,
                                "minimum": 0
                              },
                              "catalogueId": {
                                "type": "string",
                                "maxLength": 64,
                                "minLength": 1
                              }
                            }
                          },
                          "maxItems": 100
                        },
                        "units": {
                          "type": "array",
                          "items": {
                            "type": "object",
                            "required": [
                              "key",
                              "name",
                              "points",
                              "models"
                            ],
                            "properties": {
                              "key": {
                                "type": "string",
                                "maxLength": 64,
                                "minLength": 1
                              },
                              "name": {
                                "type": "string",
                                "maxLength": 80,
                                "minLength": 1
                              },
                              "note": {
                                "type": "string",
                                "maxLength": 500
                              },
                              "group": {
                                "enum": [
                                  "epic-hero",
                                  "character",
                                  "battleline",
                                  "infantry",
                                  "swarm",
                                  "mounted",
                                  "beast",
                                  "monster",
                                  "vehicle",
                                  "drone",
                                  "transport",
                                  "fortification",
                                  "other"
                                ],
                                "type": "string"
                              },
                              "joined": {
                                "type": "array",
                                "items": {
                                  "type": "object",
                                  "required": [
                                    "label",
                                    "name"
                                  ],
                                  "properties": {
                                    "name": {
                                      "type": "string",
                                      "maxLength": 80,
                                      "minLength": 1
                                    },
                                    "label": {
                                      "type": "string",
                                      "maxLength": 80,
                                      "minLength": 1
                                    }
                                  }
                                },
                                "maxItems": 20
                              },
                              "models": {
                                "type": "integer",
                                "maximum": 100,
                                "minimum": 0
                              },
                              "points": {
                                "type": "integer",
                                "maximum": 10000,
                                "minimum": 0
                              },
                              "wounds": {
                                "type": "integer",
                                "maximum": 100,
                                "minimum": 1
                              },
                              "entryId": {
                                "type": "string",
                                "maxLength": 64,
                                "minLength": 1
                              },
                              "wargear": {
                                "type": "array",
                                "items": {
                                  "type": "object",
                                  "required": [
                                    "name",
                                    "count"
                                  ],
                                  "properties": {
                                    "name": {
                                      "type": "string",
                                      "maxLength": 80,
                                      "minLength": 1
                                    },
                                    "count": {
                                      "type": "integer",
                                      "maximum": 100,
                                      "minimum": 1
                                    }
                                  }
                                },
                                "maxItems": 200
                              },
                              "warlord": {
                                "type": "boolean"
                              },
                              "keywords": {
                                "type": "array",
                                "items": {
                                  "type": "string",
                                  "maxLength": 100
                                },
                                "maxItems": 60
                              },
                              "nickname": {
                                "type": "string",
                                "maxLength": 40
                              },
                              "upgrades": {
                                "type": "array",
                                "items": {
                                  "type": "string",
                                  "maxLength": 80,
                                  "minLength": 1
                                },
                                "maxItems": 20
                              },
                              "transport": {
                                "type": "boolean"
                              },
                              "attachedTo": {
                                "type": "string",
                                "maxLength": 64,
                                "minLength": 1
                              },
                              "enhancements": {
                                "type": "array",
                                "items": {
                                  "type": "string",
                                  "maxLength": 80,
                                  "minLength": 1
                                },
                                "maxItems": 20
                              },
                              "embarkedSpace": {
                                "type": "integer",
                                "maximum": 1000,
                                "exclusiveMinimum": 0
                              },
                              "transportRule": {
                                "type": "string",
                                "maxLength": 4000
                              },
                              "prebattleRules": {
                                "type": "array",
                                "items": {
                                  "enum": [
                                    "infiltrators",
                                    "scouts"
                                  ],
                                  "type": "string"
                                },
                                "maxItems": 2
                              },
                              "warlordEligible": {
                                "type": "boolean"
                              },
                              "formationOptions": {
                                "type": "array",
                                "items": {
                                  "enum": [
                                    "battlefield",
                                    "strategic-reserves",
                                    "deep-strike",
                                    "embarked"
                                  ],
                                  "type": "string"
                                },
                                "maxItems": 4
                              },
                              "startsEmbarkedIn": {
                                "type": "string",
                                "maxLength": 64,
                                "minLength": 1
                              },
                              "transportCapacity": {
                                "type": "object",
                                "required": [
                                  "main",
                                  "instead",
                                  "conditions",
                                  "pools",
                                  "alternatives",
                                  "excluded",
                                  "space"
                                ],
                                "properties": {
                                  "main": {
                                    "type": "object",
                                    "required": [
                                      "capacity",
                                      "carries"
                                    ],
                                    "properties": {
                                      "units": {
                                        "type": "boolean",
                                        "const": true
                                      },
                                      "carries": {
                                        "type": "string",
                                        "maxLength": 200
                                      },
                                      "capacity": {
                                        "type": "integer",
                                        "maximum": 1000,
                                        "exclusiveMinimum": 0
                                      },
                                      "maxWounds": {
                                        "type": "integer",
                                        "maximum": 1000,
                                        "exclusiveMinimum": 0
                                      }
                                    }
                                  },
                                  "pools": {
                                    "type": "array",
                                    "items": {
                                      "type": "object",
                                      "required": [
                                        "capacity",
                                        "carries"
                                      ],
                                      "properties": {
                                        "units": {
                                          "type": "boolean",
                                          "const": true
                                        },
                                        "carries": {
                                          "type": "string",
                                          "maxLength": 200
                                        },
                                        "capacity": {
                                          "type": "integer",
                                          "maximum": 1000,
                                          "exclusiveMinimum": 0
                                        },
                                        "maxWounds": {
                                          "type": "integer",
                                          "maximum": 1000,
                                          "exclusiveMinimum": 0
                                        }
                                      }
                                    },
                                    "maxItems": 20
                                  },
                                  "space": {
                                    "type": "array",
                                    "items": {
                                      "type": "object",
                                      "required": [
                                        "size"
                                      ],
                                      "properties": {
                                        "size": {
                                          "type": "integer",
                                          "maximum": 1000,
                                          "exclusiveMinimum": 0
                                        },
                                        "keywords": {
                                          "type": "string",
                                          "maxLength": 200
                                        },
                                        "moreWoundsThan": {
                                          "type": "integer",
                                          "maximum": 1000,
                                          "minimum": 0
                                        }
                                      }
                                    },
                                    "maxItems": 20
                                  },
                                  "instead": {
                                    "anyOf": [
                                      {
                                        "type": "object",
                                        "required": [
                                          "capacity",
                                          "carries"
                                        ],
                                        "properties": {
                                          "units": {
                                            "type": "boolean",
                                            "const": true
                                          },
                                          "carries": {
                                            "type": "string",
                                            "maxLength": 200
                                          },
                                          "capacity": {
                                            "type": "integer",
                                            "maximum": 1000,
                                            "exclusiveMinimum": 0
                                          },
                                          "maxWounds": {
                                            "type": "integer",
                                            "maximum": 1000,
                                            "exclusiveMinimum": 0
                                          }
                                        }
                                      },
                                      {
                                        "type": "null"
                                      }
                                    ]
                                  },
                                  "excluded": {
                                    "type": "array",
                                    "items": {
                                      "type": "object",
                                      "required": [
                                        "keywords"
                                      ],
                                      "properties": {
                                        "except": {
                                          "type": "string",
                                          "maxLength": 200
                                        },
                                        "keywords": {
                                          "type": "string",
                                          "maxLength": 200
                                        }
                                      }
                                    },
                                    "maxItems": 20
                                  },
                                  "conditions": {
                                    "type": "array",
                                    "items": {
                                      "type": "object",
                                      "required": [
                                        "capacity",
                                        "carries",
                                        "wargear"
                                      ],
                                      "properties": {
                                        "units": {
                                          "type": "boolean",
                                          "const": true
                                        },
                                        "carries": {
                                          "type": "string",
                                          "maxLength": 200
                                        },
                                        "wargear": {
                                          "type": "string",
                                          "maxLength": 200
                                        },
                                        "capacity": {
                                          "type": "integer",
                                          "maximum": 1000,
                                          "exclusiveMinimum": 0
                                        },
                                        "maxWounds": {
                                          "type": "integer",
                                          "maximum": 1000,
                                          "exclusiveMinimum": 0
                                        }
                                      }
                                    },
                                    "maxItems": 20
                                  },
                                  "alternatives": {
                                    "type": "array",
                                    "items": {
                                      "type": "string",
                                      "maxLength": 200
                                    },
                                    "maxItems": 20
                                  }
                                }
                              },
                              "embarksWithBodyguard": {
                                "type": "boolean"
                              },
                              "strategicReserveExempt": {
                                "type": "boolean"
                              }
                            }
                          },
                          "maxItems": 200
                        },
                        "edition": {
                          "type": "object",
                          "required": [
                            "id",
                            "name",
                            "status"
                          ],
                          "properties": {
                            "id": {
                              "type": "string",
                              "pattern": "^[a-z0-9][a-z0-9-]{0,19}$"
                            },
                            "name": {
                              "type": "string",
                              "maxLength": 80,
                              "minLength": 1
                            },
                            "slug": {
                              "type": "string",
                              "pattern": "^[a-z0-9]+(?:-[a-z0-9]+)*$",
                              "maxLength": 80,
                              "minLength": 1
                            },
                            "status": {
                              "enum": [
                                "preview",
                                "released",
                                "retired"
                              ],
                              "type": "string"
                            },
                            "description": {
                              "type": "string",
                              "maxLength": 240,
                              "minLength": 1
                            }
                          }
                        },
                        "revision": {
                          "type": "string",
                          "maxLength": 64,
                          "minLength": 1
                        },
                        "detachment": {
                          "anyOf": [
                            {
                              "type": "string",
                              "maxLength": 80
                            },
                            {
                              "type": "null"
                            }
                          ]
                        },
                        "catalogueId": {
                          "type": "string",
                          "maxLength": 64,
                          "minLength": 1
                        },
                        "detachments": {
                          "type": "array",
                          "items": {
                            "type": "object",
                            "required": [
                              "name",
                              "points"
                            ],
                            "properties": {
                              "name": {
                                "type": "string",
                                "maxLength": 80
                              },
                              "points": {
                                "anyOf": [
                                  {
                                    "type": "integer",
                                    "maximum": 3,
                                    "minimum": 1
                                  },
                                  {
                                    "type": "null"
                                  }
                                ]
                              }
                            }
                          },
                          "maxItems": 3
                        },
                        "disposition": {
                          "anyOf": [
                            {
                              "type": "string",
                              "maxLength": 64
                            },
                            {
                              "type": "null"
                            }
                          ]
                        },
                        "waivedRules": {
                          "type": "array",
                          "items": {
                            "enum": [
                              "points-limit",
                              "detachments",
                              "detachment-points",
                              "warlord",
                              "kotc-infantry",
                              "kotc-warlord",
                              "kotc-epic-heroes",
                              "kotc-toughness",
                              "kotc-datasheet-copies"
                            ],
                            "type": "string"
                          },
                          "maxItems": 9
                        },
                        "dispositions": {
                          "type": "array",
                          "items": {
                            "type": "string",
                            "maxLength": 64
                          },
                          "maxItems": 16
                        },
                        "pointsBudget": {
                          "type": "integer",
                          "maximum": 10000,
                          "minimum": 500
                        },
                        "detachmentIds": {
                          "type": "array",
                          "items": {
                            "type": "string",
                            "maxLength": 128,
                            "minLength": 1
                          },
                          "maxItems": 3
                        },
                        "detachmentPointBudget": {
                          "anyOf": [
                            {
                              "type": "integer",
                              "maximum": 3,
                              "minimum": 0
                            },
                            {
                              "type": "null"
                            }
                          ]
                        },
                        "strategicReserveLimit": {
                          "type": "integer",
                          "maximum": 5000,
                          "minimum": 0
                        }
                      }
                    },
                    "lentBy": {
                      "type": "object",
                      "required": [
                        "id",
                        "name"
                      ],
                      "properties": {
                        "id": {
                          "type": "string",
                          "maxLength": 64,
                          "minLength": 1
                        },
                        "name": {
                          "type": "string",
                          "maxLength": 48
                        }
                      }
                    },
                    "reminders": {
                      "type": "array",
                      "items": {
                        "type": "object",
                        "required": [
                          "key",
                          "ability",
                          "description",
                          "timings"
                        ],
                        "properties": {
                          "key": {
                            "type": "string",
                            "maxLength": 240,
                            "minLength": 1
                          },
                          "unit": {
                            "type": "object",
                            "required": [
                              "index",
                              "name"
                            ],
                            "properties": {
                              "name": {
                                "type": "string",
                                "maxLength": 80,
                                "minLength": 1
                              },
                              "index": {
                                "type": "integer",
                                "maximum": 99,
                                "minimum": 0
                              }
                            }
                          },
                          "ability": {
                            "type": "string",
                            "maxLength": 80,
                            "minLength": 1
                          },
                          "timings": {
                            "type": "array",
                            "items": {
                              "oneOf": [
                                {
                                  "type": "object",
                                  "required": [
                                    "moment",
                                    "phase",
                                    "turn"
                                  ],
                                  "properties": {
                                    "turn": {
                                      "enum": [
                                        "your-turn",
                                        "opponent-turn",
                                        "either"
                                      ],
                                      "type": "string"
                                    },
                                    "phase": {
                                      "enum": [
                                        "command",
                                        "movement",
                                        "shooting",
                                        "charge",
                                        "fight",
                                        "any"
                                      ],
                                      "type": "string"
                                    },
                                    "moment": {
                                      "enum": [
                                        "phase-start",
                                        "phase-end"
                                      ],
                                      "type": "string"
                                    },
                                    "firstRoundOnly": {
                                      "type": "boolean"
                                    }
                                  }
                                },
                                {
                                  "type": "object",
                                  "required": [
                                    "moment",
                                    "phase",
                                    "turn"
                                  ],
                                  "properties": {
                                    "turn": {
                                      "enum": [
                                        "your-turn",
                                        "opponent-turn",
                                        "either"
                                      ],
                                      "type": "string"
                                    },
                                    "phase": {
                                      "type": "null"
                                    },
                                    "moment": {
                                      "enum": [
                                        "turn-start",
                                        "turn-end"
                                      ],
                                      "type": "string"
                                    },
                                    "firstRoundOnly": {
                                      "type": "boolean"
                                    }
                                  }
                                },
                                {
                                  "type": "object",
                                  "required": [
                                    "moment",
                                    "phase",
                                    "turn"
                                  ],
                                  "properties": {
                                    "turn": {
                                      "type": "string",
                                      "const": "either"
                                    },
                                    "phase": {
                                      "type": "null"
                                    },
                                    "moment": {
                                      "enum": [
                                        "round-start",
                                        "round-end"
                                      ],
                                      "type": "string"
                                    },
                                    "firstRoundOnly": {
                                      "type": "boolean"
                                    }
                                  }
                                }
                              ]
                            },
                            "maxItems": 10,
                            "minItems": 1
                          },
                          "description": {
                            "type": "string",
                            "maxLength": 10000
                          },
                          "whileDestroyed": {
                            "type": "boolean"
                          }
                        }
                      },
                      "maxItems": 200
                    },
                    "remindersEnabled": {
                      "type": "boolean"
                    }
                  }
                },
                "painted": {
                  "type": "boolean"
                },
                "playerId": {
                  "type": "string",
                  "maxLength": 64,
                  "minLength": 1
                }
              }
            },
            {
              "type": "object",
              "required": [
                "kind",
                "unitKey",
                "destroyed"
              ],
              "properties": {
                "kind": {
                  "type": "string",
                  "const": "set-unit"
                },
                "unitKey": {
                  "type": "string",
                  "maxLength": 64,
                  "minLength": 1
                },
                "playerId": {
                  "type": "string",
                  "maxLength": 64,
                  "minLength": 1
                },
                "destroyed": {
                  "type": "boolean"
                }
              }
            },
            {
              "type": "object",
              "required": [
                "kind",
                "stratagems",
                "secondaries",
                "primary",
                "secondaryMode"
              ],
              "properties": {
                "kind": {
                  "type": "string",
                  "const": "set-prep"
                },
                "primary": {
                  "anyOf": [
                    {
                      "type": "object",
                      "required": [
                        "key",
                        "name"
                      ],
                      "properties": {
                        "key": {
                          "type": "string",
                          "maxLength": 64,
                          "minLength": 1
                        },
                        "name": {
                          "type": "string",
                          "maxLength": 80,
                          "minLength": 1
                        },
                        "awards": {
                          "type": "array",
                          "items": {
                            "type": "object",
                            "required": [
                              "vp",
                              "per",
                              "mode",
                              "max",
                              "group",
                              "cumulative",
                              "criteria",
                              "trigger"
                            ],
                            "properties": {
                              "vp": {
                                "type": "integer",
                                "maximum": 100,
                                "minimum": 0
                              },
                              "max": {
                                "anyOf": [
                                  {
                                    "type": "integer",
                                    "maximum": 100,
                                    "minimum": 0
                                  },
                                  {
                                    "type": "null"
                                  }
                                ]
                              },
                              "per": {
                                "anyOf": [
                                  {
                                    "type": "string",
                                    "maxLength": 200
                                  },
                                  {
                                    "type": "null"
                                  }
                                ]
                              },
                              "mode": {
                                "anyOf": [
                                  {
                                    "type": "string",
                                    "maxLength": 40
                                  },
                                  {
                                    "type": "null"
                                  }
                                ]
                              },
                              "group": {
                                "anyOf": [
                                  {
                                    "type": "string",
                                    "maxLength": 100
                                  },
                                  {
                                    "type": "null"
                                  }
                                ]
                              },
                              "trigger": {
                                "type": "object",
                                "required": [
                                  "timing",
                                  "phase",
                                  "playerTurn",
                                  "roundMin",
                                  "roundMax"
                                ],
                                "properties": {
                                  "phase": {
                                    "anyOf": [
                                      {
                                        "type": "string",
                                        "maxLength": 80
                                      },
                                      {
                                        "type": "null"
                                      }
                                    ]
                                  },
                                  "timing": {
                                    "anyOf": [
                                      {
                                        "type": "string",
                                        "maxLength": 80
                                      },
                                      {
                                        "type": "null"
                                      }
                                    ]
                                  },
                                  "roundMax": {
                                    "anyOf": [
                                      {
                                        "type": "integer",
                                        "maximum": 5,
                                        "minimum": 1
                                      },
                                      {
                                        "type": "null"
                                      }
                                    ]
                                  },
                                  "roundMin": {
                                    "anyOf": [
                                      {
                                        "type": "integer",
                                        "maximum": 5,
                                        "minimum": 1
                                      },
                                      {
                                        "type": "null"
                                      }
                                    ]
                                  },
                                  "playerTurn": {
                                    "anyOf": [
                                      {
                                        "type": "string",
                                        "maxLength": 80
                                      },
                                      {
                                        "type": "null"
                                      }
                                    ]
                                  }
                                }
                              },
                              "criteria": {
                                "anyOf": [
                                  {
                                    "type": "string",
                                    "maxLength": 2000
                                  },
                                  {
                                    "type": "null"
                                  }
                                ]
                              },
                              "cumulative": {
                                "type": "boolean"
                              }
                            }
                          },
                          "maxItems": 20
                        },
                        "selection": {
                          "enum": [
                            "punishment",
                            "guards",
                            "tempting-target",
                            "beacon",
                            "locate-and-deny",
                            "sensor-sweep",
                            "consecrate"
                          ],
                          "type": "string"
                        }
                      }
                    },
                    {
                      "type": "null"
                    }
                  ]
                },
                "playerId": {
                  "type": "string",
                  "maxLength": 64,
                  "minLength": 1
                },
                "stratagems": {
                  "type": "array",
                  "items": {
                    "type": "object",
                    "required": [
                      "key",
                      "name",
                      "cp",
                      "limit"
                    ],
                    "properties": {
                      "cp": {
                        "type": "integer",
                        "maximum": 6,
                        "minimum": 0
                      },
                      "key": {
                        "type": "string",
                        "maxLength": 64,
                        "minLength": 1
                      },
                      "name": {
                        "type": "string",
                        "maxLength": 80,
                        "minLength": 1
                      },
                      "turn": {
                        "enum": [
                          "your-turn",
                          "opponent-turn",
                          "either"
                        ],
                        "type": "string"
                      },
                      "limit": {
                        "enum": [
                          "phase",
                          "turn",
                          "battle-round",
                          "battle",
                          "unlimited"
                        ],
                        "type": "string"
                      },
                      "phases": {
                        "type": "array",
                        "items": {
                          "enum": [
                            "command",
                            "movement",
                            "shooting",
                            "charge",
                            "fight",
                            "end"
                          ],
                          "type": "string"
                        },
                        "maxItems": 6
                      },
                      "detachment": {
                        "type": "string",
                        "maxLength": 249,
                        "minLength": 1
                      }
                    }
                  },
                  "maxItems": 48
                },
                "secondaries": {
                  "type": "array",
                  "items": {
                    "type": "object",
                    "required": [
                      "key",
                      "name"
                    ],
                    "properties": {
                      "key": {
                        "type": "string",
                        "maxLength": 64,
                        "minLength": 1
                      },
                      "name": {
                        "type": "string",
                        "maxLength": 80,
                        "minLength": 1
                      },
                      "awards": {
                        "type": "array",
                        "items": {
                          "type": "object",
                          "required": [
                            "vp",
                            "per",
                            "mode",
                            "max",
                            "group",
                            "cumulative",
                            "criteria",
                            "trigger"
                          ],
                          "properties": {
                            "vp": {
                              "type": "integer",
                              "maximum": 100,
                              "minimum": 0
                            },
                            "max": {
                              "anyOf": [
                                {
                                  "type": "integer",
                                  "maximum": 100,
                                  "minimum": 0
                                },
                                {
                                  "type": "null"
                                }
                              ]
                            },
                            "per": {
                              "anyOf": [
                                {
                                  "type": "string",
                                  "maxLength": 200
                                },
                                {
                                  "type": "null"
                                }
                              ]
                            },
                            "mode": {
                              "anyOf": [
                                {
                                  "type": "string",
                                  "maxLength": 40
                                },
                                {
                                  "type": "null"
                                }
                              ]
                            },
                            "group": {
                              "anyOf": [
                                {
                                  "type": "string",
                                  "maxLength": 100
                                },
                                {
                                  "type": "null"
                                }
                              ]
                            },
                            "trigger": {
                              "type": "object",
                              "required": [
                                "timing",
                                "phase",
                                "playerTurn",
                                "roundMin",
                                "roundMax"
                              ],
                              "properties": {
                                "phase": {
                                  "anyOf": [
                                    {
                                      "type": "string",
                                      "maxLength": 80
                                    },
                                    {
                                      "type": "null"
                                    }
                                  ]
                                },
                                "timing": {
                                  "anyOf": [
                                    {
                                      "type": "string",
                                      "maxLength": 80
                                    },
                                    {
                                      "type": "null"
                                    }
                                  ]
                                },
                                "roundMax": {
                                  "anyOf": [
                                    {
                                      "type": "integer",
                                      "maximum": 5,
                                      "minimum": 1
                                    },
                                    {
                                      "type": "null"
                                    }
                                  ]
                                },
                                "roundMin": {
                                  "anyOf": [
                                    {
                                      "type": "integer",
                                      "maximum": 5,
                                      "minimum": 1
                                    },
                                    {
                                      "type": "null"
                                    }
                                  ]
                                },
                                "playerTurn": {
                                  "anyOf": [
                                    {
                                      "type": "string",
                                      "maxLength": 80
                                    },
                                    {
                                      "type": "null"
                                    }
                                  ]
                                }
                              }
                            },
                            "criteria": {
                              "anyOf": [
                                {
                                  "type": "string",
                                  "maxLength": 2000
                                },
                                {
                                  "type": "null"
                                }
                              ]
                            },
                            "cumulative": {
                              "type": "boolean"
                            }
                          }
                        },
                        "maxItems": 20
                      },
                      "selection": {
                        "enum": [
                          "punishment",
                          "guards",
                          "tempting-target",
                          "beacon",
                          "locate-and-deny",
                          "sensor-sweep",
                          "consecrate"
                        ],
                        "type": "string"
                      }
                    }
                  },
                  "maxItems": 6
                },
                "secondaryDeck": {
                  "type": "array",
                  "items": {
                    "type": "object",
                    "required": [
                      "key",
                      "name"
                    ],
                    "properties": {
                      "key": {
                        "type": "string",
                        "maxLength": 64,
                        "minLength": 1
                      },
                      "name": {
                        "type": "string",
                        "maxLength": 80,
                        "minLength": 1
                      },
                      "awards": {
                        "type": "array",
                        "items": {
                          "type": "object",
                          "required": [
                            "vp",
                            "per",
                            "mode",
                            "max",
                            "group",
                            "cumulative",
                            "criteria",
                            "trigger"
                          ],
                          "properties": {
                            "vp": {
                              "type": "integer",
                              "maximum": 100,
                              "minimum": 0
                            },
                            "max": {
                              "anyOf": [
                                {
                                  "type": "integer",
                                  "maximum": 100,
                                  "minimum": 0
                                },
                                {
                                  "type": "null"
                                }
                              ]
                            },
                            "per": {
                              "anyOf": [
                                {
                                  "type": "string",
                                  "maxLength": 200
                                },
                                {
                                  "type": "null"
                                }
                              ]
                            },
                            "mode": {
                              "anyOf": [
                                {
                                  "type": "string",
                                  "maxLength": 40
                                },
                                {
                                  "type": "null"
                                }
                              ]
                            },
                            "group": {
                              "anyOf": [
                                {
                                  "type": "string",
                                  "maxLength": 100
                                },
                                {
                                  "type": "null"
                                }
                              ]
                            },
                            "trigger": {
                              "type": "object",
                              "required": [
                                "timing",
                                "phase",
                                "playerTurn",
                                "roundMin",
                                "roundMax"
                              ],
                              "properties": {
                                "phase": {
                                  "anyOf": [
                                    {
                                      "type": "string",
                                      "maxLength": 80
                                    },
                                    {
                                      "type": "null"
                                    }
                                  ]
                                },
                                "timing": {
                                  "anyOf": [
                                    {
                                      "type": "string",
                                      "maxLength": 80
                                    },
                                    {
                                      "type": "null"
                                    }
                                  ]
                                },
                                "roundMax": {
                                  "anyOf": [
                                    {
                                      "type": "integer",
                                      "maximum": 5,
                                      "minimum": 1
                                    },
                                    {
                                      "type": "null"
                                    }
                                  ]
                                },
                                "roundMin": {
                                  "anyOf": [
                                    {
                                      "type": "integer",
                                      "maximum": 5,
                                      "minimum": 1
                                    },
                                    {
                                      "type": "null"
                                    }
                                  ]
                                },
                                "playerTurn": {
                                  "anyOf": [
                                    {
                                      "type": "string",
                                      "maxLength": 80
                                    },
                                    {
                                      "type": "null"
                                    }
                                  ]
                                }
                              }
                            },
                            "criteria": {
                              "anyOf": [
                                {
                                  "type": "string",
                                  "maxLength": 2000
                                },
                                {
                                  "type": "null"
                                }
                              ]
                            },
                            "cumulative": {
                              "type": "boolean"
                            }
                          }
                        },
                        "maxItems": 20
                      },
                      "selection": {
                        "enum": [
                          "punishment",
                          "guards",
                          "tempting-target",
                          "beacon",
                          "locate-and-deny",
                          "sensor-sweep",
                          "consecrate"
                        ],
                        "type": "string"
                      }
                    }
                  },
                  "maxItems": 60
                },
                "secondaryMode": {
                  "enum": [
                    "tactical",
                    "fixed"
                  ],
                  "type": "string"
                }
              }
            },
            {
              "type": "object",
              "required": [
                "kind",
                "unitKey",
                "deployed"
              ],
              "properties": {
                "kind": {
                  "type": "string",
                  "const": "deploy-unit"
                },
                "unitKey": {
                  "type": "string",
                  "maxLength": 64,
                  "minLength": 1
                },
                "deployed": {
                  "type": "boolean"
                },
                "playerId": {
                  "type": "string",
                  "maxLength": 64,
                  "minLength": 1
                }
              }
            },
            {
              "type": "object",
              "required": [
                "kind",
                "unitKey",
                "formation"
              ],
              "properties": {
                "kind": {
                  "type": "string",
                  "const": "set-unit-formation"
                },
                "unitKey": {
                  "type": "string",
                  "maxLength": 64,
                  "minLength": 1
                },
                "playerId": {
                  "type": "string",
                  "maxLength": 64,
                  "minLength": 1
                },
                "formation": {
                  "enum": [
                    "battlefield",
                    "strategic-reserves",
                    "deep-strike",
                    "embarked"
                  ],
                  "type": "string"
                },
                "transportKey": {
                  "type": "string",
                  "maxLength": 64,
                  "minLength": 1
                }
              }
            },
            {
              "type": "object",
              "required": [
                "kind",
                "painted"
              ],
              "properties": {
                "kind": {
                  "type": "string",
                  "const": "set-painted"
                },
                "painted": {
                  "type": "boolean"
                },
                "playerId": {
                  "type": "string",
                  "maxLength": 64,
                  "minLength": 1
                }
              }
            },
            {
              "type": "object",
              "required": [
                "kind",
                "unitKey",
                "delta"
              ],
              "properties": {
                "kind": {
                  "type": "string",
                  "const": "wound-unit"
                },
                "delta": {
                  "type": "integer",
                  "maximum": 9007199254740991,
                  "minimum": -9007199254740991
                },
                "unitKey": {
                  "type": "string",
                  "maxLength": 64,
                  "minLength": 1
                },
                "playerId": {
                  "type": "string",
                  "maxLength": 64,
                  "minLength": 1
                }
              }
            },
            {
              "type": "object",
              "required": [
                "kind",
                "unitKey",
                "delta"
              ],
              "properties": {
                "kind": {
                  "type": "string",
                  "const": "damage-unit"
                },
                "delta": {
                  "type": "integer",
                  "maximum": 9007199254740991,
                  "minimum": -9007199254740991
                },
                "unitKey": {
                  "type": "string",
                  "maxLength": 64,
                  "minLength": 1
                },
                "playerId": {
                  "type": "string",
                  "maxLength": 64,
                  "minLength": 1
                }
              }
            },
            {
              "type": "object",
              "required": [
                "kind",
                "patternId"
              ],
              "properties": {
                "kind": {
                  "type": "string",
                  "const": "set-deployment"
                },
                "patternId": {
                  "anyOf": [
                    {
                      "type": "string",
                      "maxLength": 64,
                      "minLength": 1
                    },
                    {
                      "type": "null"
                    }
                  ]
                }
              }
            },
            {
              "type": "object",
              "required": [
                "kind",
                "patternId",
                "terrainLayoutId"
              ],
              "properties": {
                "kind": {
                  "type": "string",
                  "const": "set-battlefield"
                },
                "patternId": {
                  "type": "string",
                  "maxLength": 64,
                  "minLength": 1
                },
                "terrainLayoutId": {
                  "type": "string",
                  "maxLength": 64,
                  "minLength": 1
                }
              }
            },
            {
              "type": "object",
              "required": [
                "kind",
                "key"
              ],
              "properties": {
                "cp": {
                  "type": "integer",
                  "maximum": 6,
                  "minimum": 0
                },
                "key": {
                  "type": "string",
                  "maxLength": 64,
                  "minLength": 1
                },
                "kind": {
                  "type": "string",
                  "const": "use-stratagem"
                },
                "missed": {
                  "type": "object",
                  "required": [
                    "round",
                    "phase",
                    "turn"
                  ],
                  "properties": {
                    "turn": {
                      "type": "string",
                      "maxLength": 64,
                      "minLength": 1
                    },
                    "phase": {
                      "enum": [
                        "command",
                        "movement",
                        "shooting",
                        "charge",
                        "fight",
                        "end"
                      ],
                      "type": "string"
                    },
                    "round": {
                      "type": "integer",
                      "maximum": 5,
                      "minimum": 1
                    }
                  }
                },
                "playerId": {
                  "type": "string",
                  "maxLength": 64,
                  "minLength": 1
                }
              }
            },
            {
              "type": "object",
              "required": [
                "kind",
                "stratagemKey",
                "secondaryKey",
                "secondary"
              ],
              "properties": {
                "cp": {
                  "type": "integer",
                  "maximum": 6,
                  "minimum": 0
                },
                "kind": {
                  "type": "string",
                  "const": "use-new-orders"
                },
                "playerId": {
                  "type": "string",
                  "maxLength": 64,
                  "minLength": 1
                },
                "secondary": {
                  "type": "object",
                  "required": [
                    "key",
                    "name"
                  ],
                  "properties": {
                    "key": {
                      "type": "string",
                      "maxLength": 64,
                      "minLength": 1
                    },
                    "name": {
                      "type": "string",
                      "maxLength": 80,
                      "minLength": 1
                    },
                    "awards": {
                      "type": "array",
                      "items": {
                        "type": "object",
                        "required": [
                          "vp",
                          "per",
                          "mode",
                          "max",
                          "group",
                          "cumulative",
                          "criteria",
                          "trigger"
                        ],
                        "properties": {
                          "vp": {
                            "type": "integer",
                            "maximum": 100,
                            "minimum": 0
                          },
                          "max": {
                            "anyOf": [
                              {
                                "type": "integer",
                                "maximum": 100,
                                "minimum": 0
                              },
                              {
                                "type": "null"
                              }
                            ]
                          },
                          "per": {
                            "anyOf": [
                              {
                                "type": "string",
                                "maxLength": 200
                              },
                              {
                                "type": "null"
                              }
                            ]
                          },
                          "mode": {
                            "anyOf": [
                              {
                                "type": "string",
                                "maxLength": 40
                              },
                              {
                                "type": "null"
                              }
                            ]
                          },
                          "group": {
                            "anyOf": [
                              {
                                "type": "string",
                                "maxLength": 100
                              },
                              {
                                "type": "null"
                              }
                            ]
                          },
                          "trigger": {
                            "type": "object",
                            "required": [
                              "timing",
                              "phase",
                              "playerTurn",
                              "roundMin",
                              "roundMax"
                            ],
                            "properties": {
                              "phase": {
                                "anyOf": [
                                  {
                                    "type": "string",
                                    "maxLength": 80
                                  },
                                  {
                                    "type": "null"
                                  }
                                ]
                              },
                              "timing": {
                                "anyOf": [
                                  {
                                    "type": "string",
                                    "maxLength": 80
                                  },
                                  {
                                    "type": "null"
                                  }
                                ]
                              },
                              "roundMax": {
                                "anyOf": [
                                  {
                                    "type": "integer",
                                    "maximum": 5,
                                    "minimum": 1
                                  },
                                  {
                                    "type": "null"
                                  }
                                ]
                              },
                              "roundMin": {
                                "anyOf": [
                                  {
                                    "type": "integer",
                                    "maximum": 5,
                                    "minimum": 1
                                  },
                                  {
                                    "type": "null"
                                  }
                                ]
                              },
                              "playerTurn": {
                                "anyOf": [
                                  {
                                    "type": "string",
                                    "maxLength": 80
                                  },
                                  {
                                    "type": "null"
                                  }
                                ]
                              }
                            }
                          },
                          "criteria": {
                            "anyOf": [
                              {
                                "type": "string",
                                "maxLength": 2000
                              },
                              {
                                "type": "null"
                              }
                            ]
                          },
                          "cumulative": {
                            "type": "boolean"
                          }
                        }
                      },
                      "maxItems": 20
                    },
                    "selection": {
                      "enum": [
                        "punishment",
                        "guards",
                        "tempting-target",
                        "beacon",
                        "locate-and-deny",
                        "sensor-sweep",
                        "consecrate"
                      ],
                      "type": "string"
                    }
                  }
                },
                "secondaryKey": {
                  "type": "string",
                  "maxLength": 64,
                  "minLength": 1
                },
                "stratagemKey": {
                  "type": "string",
                  "maxLength": 64,
                  "minLength": 1
                }
              }
            },
            {
              "type": "object",
              "required": [
                "kind",
                "key",
                "delta"
              ],
              "properties": {
                "key": {
                  "type": "string",
                  "maxLength": 64,
                  "minLength": 1
                },
                "kind": {
                  "type": "string",
                  "const": "score-secondary"
                },
                "delta": {
                  "type": "integer",
                  "maximum": 9007199254740991,
                  "minimum": -9007199254740991
                },
                "playerId": {
                  "type": "string",
                  "maxLength": 64,
                  "minLength": 1
                }
              }
            },
            {
              "type": "object",
              "required": [
                "kind",
                "scores"
              ],
              "properties": {
                "kind": {
                  "type": "string",
                  "const": "score-settlement"
                },
                "round": {
                  "type": "integer",
                  "maximum": 5,
                  "minimum": 1
                },
                "missed": {
                  "type": "object",
                  "required": [
                    "round",
                    "phase",
                    "turn"
                  ],
                  "properties": {
                    "turn": {
                      "type": "string",
                      "maxLength": 64,
                      "minLength": 1
                    },
                    "phase": {
                      "enum": [
                        "command",
                        "movement",
                        "shooting",
                        "charge",
                        "fight",
                        "end"
                      ],
                      "type": "string"
                    },
                    "round": {
                      "type": "integer",
                      "maximum": 5,
                      "minimum": 1
                    }
                  }
                },
                "scores": {
                  "type": "array",
                  "items": {
                    "oneOf": [
                      {
                        "type": "object",
                        "required": [
                          "category",
                          "delta"
                        ],
                        "properties": {
                          "delta": {
                            "type": "integer",
                            "maximum": 9007199254740991,
                            "exclusiveMinimum": 0
                          },
                          "final": {
                            "type": "object",
                            "required": [
                              "claims",
                              "delta"
                            ],
                            "properties": {
                              "delta": {
                                "type": "integer",
                                "maximum": 9007199254740991,
                                "exclusiveMinimum": 0
                              },
                              "claims": {
                                "type": "array",
                                "items": {
                                  "type": "integer",
                                  "maximum": 100,
                                  "minimum": 0
                                },
                                "maxItems": 20
                              }
                            }
                          },
                          "category": {
                            "type": "string",
                            "const": "primary"
                          }
                        }
                      },
                      {
                        "type": "object",
                        "required": [
                          "category",
                          "key",
                          "delta"
                        ],
                        "properties": {
                          "key": {
                            "type": "string",
                            "maxLength": 64,
                            "minLength": 1
                          },
                          "delta": {
                            "type": "integer",
                            "maximum": 9007199254740991,
                            "exclusiveMinimum": 0
                          },
                          "status": {
                            "type": "string",
                            "const": "achieved"
                          },
                          "category": {
                            "type": "string",
                            "const": "secondary"
                          }
                        }
                      }
                    ]
                  },
                  "maxItems": 31,
                  "minItems": 1
                },
                "playerId": {
                  "type": "string",
                  "maxLength": 64,
                  "minLength": 1
                }
              }
            },
            {
              "type": "object",
              "required": [
                "kind",
                "key",
                "status"
              ],
              "properties": {
                "key": {
                  "type": "string",
                  "maxLength": 64,
                  "minLength": 1
                },
                "kind": {
                  "type": "string",
                  "const": "set-secondary-status"
                },
                "status": {
                  "enum": [
                    "active",
                    "achieved",
                    "discarded",
                    "returned"
                  ],
                  "type": "string"
                },
                "playerId": {
                  "type": "string",
                  "maxLength": 64,
                  "minLength": 1
                }
              }
            },
            {
              "type": "object",
              "required": [
                "kind",
                "secondary"
              ],
              "properties": {
                "kind": {
                  "type": "string",
                  "const": "draw-secondary"
                },
                "playerId": {
                  "type": "string",
                  "maxLength": 64,
                  "minLength": 1
                },
                "secondary": {
                  "type": "object",
                  "required": [
                    "key",
                    "name"
                  ],
                  "properties": {
                    "key": {
                      "type": "string",
                      "maxLength": 64,
                      "minLength": 1
                    },
                    "name": {
                      "type": "string",
                      "maxLength": 80,
                      "minLength": 1
                    },
                    "awards": {
                      "type": "array",
                      "items": {
                        "type": "object",
                        "required": [
                          "vp",
                          "per",
                          "mode",
                          "max",
                          "group",
                          "cumulative",
                          "criteria",
                          "trigger"
                        ],
                        "properties": {
                          "vp": {
                            "type": "integer",
                            "maximum": 100,
                            "minimum": 0
                          },
                          "max": {
                            "anyOf": [
                              {
                                "type": "integer",
                                "maximum": 100,
                                "minimum": 0
                              },
                              {
                                "type": "null"
                              }
                            ]
                          },
                          "per": {
                            "anyOf": [
                              {
                                "type": "string",
                                "maxLength": 200
                              },
                              {
                                "type": "null"
                              }
                            ]
                          },
                          "mode": {
                            "anyOf": [
                              {
                                "type": "string",
                                "maxLength": 40
                              },
                              {
                                "type": "null"
                              }
                            ]
                          },
                          "group": {
                            "anyOf": [
                              {
                                "type": "string",
                                "maxLength": 100
                              },
                              {
                                "type": "null"
                              }
                            ]
                          },
                          "trigger": {
                            "type": "object",
                            "required": [
                              "timing",
                              "phase",
                              "playerTurn",
                              "roundMin",
                              "roundMax"
                            ],
                            "properties": {
                              "phase": {
                                "anyOf": [
                                  {
                                    "type": "string",
                                    "maxLength": 80
                                  },
                                  {
                                    "type": "null"
                                  }
                                ]
                              },
                              "timing": {
                                "anyOf": [
                                  {
                                    "type": "string",
                                    "maxLength": 80
                                  },
                                  {
                                    "type": "null"
                                  }
                                ]
                              },
                              "roundMax": {
                                "anyOf": [
                                  {
                                    "type": "integer",
                                    "maximum": 5,
                                    "minimum": 1
                                  },
                                  {
                                    "type": "null"
                                  }
                                ]
                              },
                              "roundMin": {
                                "anyOf": [
                                  {
                                    "type": "integer",
                                    "maximum": 5,
                                    "minimum": 1
                                  },
                                  {
                                    "type": "null"
                                  }
                                ]
                              },
                              "playerTurn": {
                                "anyOf": [
                                  {
                                    "type": "string",
                                    "maxLength": 80
                                  },
                                  {
                                    "type": "null"
                                  }
                                ]
                              }
                            }
                          },
                          "criteria": {
                            "anyOf": [
                              {
                                "type": "string",
                                "maxLength": 2000
                              },
                              {
                                "type": "null"
                              }
                            ]
                          },
                          "cumulative": {
                            "type": "boolean"
                          }
                        }
                      },
                      "maxItems": 20
                    },
                    "selection": {
                      "enum": [
                        "punishment",
                        "guards",
                        "tempting-target",
                        "beacon",
                        "locate-and-deny",
                        "sensor-sweep",
                        "consecrate"
                      ],
                      "type": "string"
                    }
                  }
                }
              }
            },
            {
              "type": "object",
              "required": [
                "kind",
                "secondaries"
              ],
              "properties": {
                "kind": {
                  "type": "string",
                  "const": "draw-secondaries"
                },
                "playerId": {
                  "type": "string",
                  "maxLength": 64,
                  "minLength": 1
                },
                "selected": {
                  "type": "boolean",
                  "const": true
                },
                "secondaries": {
                  "type": "array",
                  "items": {
                    "type": "object",
                    "required": [
                      "key",
                      "name"
                    ],
                    "properties": {
                      "key": {
                        "type": "string",
                        "maxLength": 64,
                        "minLength": 1
                      },
                      "name": {
                        "type": "string",
                        "maxLength": 80,
                        "minLength": 1
                      },
                      "awards": {
                        "type": "array",
                        "items": {
                          "type": "object",
                          "required": [
                            "vp",
                            "per",
                            "mode",
                            "max",
                            "group",
                            "cumulative",
                            "criteria",
                            "trigger"
                          ],
                          "properties": {
                            "vp": {
                              "type": "integer",
                              "maximum": 100,
                              "minimum": 0
                            },
                            "max": {
                              "anyOf": [
                                {
                                  "type": "integer",
                                  "maximum": 100,
                                  "minimum": 0
                                },
                                {
                                  "type": "null"
                                }
                              ]
                            },
                            "per": {
                              "anyOf": [
                                {
                                  "type": "string",
                                  "maxLength": 200
                                },
                                {
                                  "type": "null"
                                }
                              ]
                            },
                            "mode": {
                              "anyOf": [
                                {
                                  "type": "string",
                                  "maxLength": 40
                                },
                                {
                                  "type": "null"
                                }
                              ]
                            },
                            "group": {
                              "anyOf": [
                                {
                                  "type": "string",
                                  "maxLength": 100
                                },
                                {
                                  "type": "null"
                                }
                              ]
                            },
                            "trigger": {
                              "type": "object",
                              "required": [
                                "timing",
                                "phase",
                                "playerTurn",
                                "roundMin",
                                "roundMax"
                              ],
                              "properties": {
                                "phase": {
                                  "anyOf": [
                                    {
                                      "type": "string",
                                      "maxLength": 80
                                    },
                                    {
                                      "type": "null"
                                    }
                                  ]
                                },
                                "timing": {
                                  "anyOf": [
                                    {
                                      "type": "string",
                                      "maxLength": 80
                                    },
                                    {
                                      "type": "null"
                                    }
                                  ]
                                },
                                "roundMax": {
                                  "anyOf": [
                                    {
                                      "type": "integer",
                                      "maximum": 5,
                                      "minimum": 1
                                    },
                                    {
                                      "type": "null"
                                    }
                                  ]
                                },
                                "roundMin": {
                                  "anyOf": [
                                    {
                                      "type": "integer",
                                      "maximum": 5,
                                      "minimum": 1
                                    },
                                    {
                                      "type": "null"
                                    }
                                  ]
                                },
                                "playerTurn": {
                                  "anyOf": [
                                    {
                                      "type": "string",
                                      "maxLength": 80
                                    },
                                    {
                                      "type": "null"
                                    }
                                  ]
                                }
                              }
                            },
                            "criteria": {
                              "anyOf": [
                                {
                                  "type": "string",
                                  "maxLength": 2000
                                },
                                {
                                  "type": "null"
                                }
                              ]
                            },
                            "cumulative": {
                              "type": "boolean"
                            }
                          }
                        },
                        "maxItems": 20
                      },
                      "selection": {
                        "enum": [
                          "punishment",
                          "guards",
                          "tempting-target",
                          "beacon",
                          "locate-and-deny",
                          "sensor-sweep",
                          "consecrate"
                        ],
                        "type": "string"
                      }
                    }
                  },
                  "maxItems": 2,
                  "minItems": 1
                }
              }
            },
            {
              "type": "object",
              "required": [
                "kind"
              ],
              "properties": {
                "kind": {
                  "type": "string",
                  "const": "acknowledge-draw"
                },
                "playerId": {
                  "type": "string",
                  "maxLength": 64,
                  "minLength": 1
                }
              }
            },
            {
              "type": "object",
              "required": [
                "kind"
              ],
              "properties": {
                "kind": {
                  "type": "string",
                  "const": "acknowledge-scoring"
                },
                "playerId": {
                  "type": "string",
                  "maxLength": 64,
                  "minLength": 1
                }
              }
            },
            {
              "type": "object",
              "required": [
                "kind",
                "secondary"
              ],
              "properties": {
                "kind": {
                  "type": "string",
                  "const": "select-secret"
                },
                "playerId": {
                  "type": "string",
                  "maxLength": 64,
                  "minLength": 1
                },
                "secondary": {
                  "type": "object",
                  "required": [
                    "key",
                    "name"
                  ],
                  "properties": {
                    "key": {
                      "type": "string",
                      "maxLength": 64,
                      "minLength": 1
                    },
                    "name": {
                      "type": "string",
                      "maxLength": 80,
                      "minLength": 1
                    },
                    "awards": {
                      "type": "array",
                      "items": {
                        "type": "object",
                        "required": [
                          "vp",
                          "per",
                          "mode",
                          "max",
                          "group",
                          "cumulative",
                          "criteria",
                          "trigger"
                        ],
                        "properties": {
                          "vp": {
                            "type": "integer",
                            "maximum": 100,
                            "minimum": 0
                          },
                          "max": {
                            "anyOf": [
                              {
                                "type": "integer",
                                "maximum": 100,
                                "minimum": 0
                              },
                              {
                                "type": "null"
                              }
                            ]
                          },
                          "per": {
                            "anyOf": [
                              {
                                "type": "string",
                                "maxLength": 200
                              },
                              {
                                "type": "null"
                              }
                            ]
                          },
                          "mode": {
                            "anyOf": [
                              {
                                "type": "string",
                                "maxLength": 40
                              },
                              {
                                "type": "null"
                              }
                            ]
                          },
                          "group": {
                            "anyOf": [
                              {
                                "type": "string",
                                "maxLength": 100
                              },
                              {
                                "type": "null"
                              }
                            ]
                          },
                          "trigger": {
                            "type": "object",
                            "required": [
                              "timing",
                              "phase",
                              "playerTurn",
                              "roundMin",
                              "roundMax"
                            ],
                            "properties": {
                              "phase": {
                                "anyOf": [
                                  {
                                    "type": "string",
                                    "maxLength": 80
                                  },
                                  {
                                    "type": "null"
                                  }
                                ]
                              },
                              "timing": {
                                "anyOf": [
                                  {
                                    "type": "string",
                                    "maxLength": 80
                                  },
                                  {
                                    "type": "null"
                                  }
                                ]
                              },
                              "roundMax": {
                                "anyOf": [
                                  {
                                    "type": "integer",
                                    "maximum": 5,
                                    "minimum": 1
                                  },
                                  {
                                    "type": "null"
                                  }
                                ]
                              },
                              "roundMin": {
                                "anyOf": [
                                  {
                                    "type": "integer",
                                    "maximum": 5,
                                    "minimum": 1
                                  },
                                  {
                                    "type": "null"
                                  }
                                ]
                              },
                              "playerTurn": {
                                "anyOf": [
                                  {
                                    "type": "string",
                                    "maxLength": 80
                                  },
                                  {
                                    "type": "null"
                                  }
                                ]
                              }
                            }
                          },
                          "criteria": {
                            "anyOf": [
                              {
                                "type": "string",
                                "maxLength": 2000
                              },
                              {
                                "type": "null"
                              }
                            ]
                          },
                          "cumulative": {
                            "type": "boolean"
                          }
                        }
                      },
                      "maxItems": 20
                    },
                    "selection": {
                      "enum": [
                        "punishment",
                        "guards",
                        "tempting-target",
                        "beacon",
                        "locate-and-deny",
                        "sensor-sweep",
                        "consecrate"
                      ],
                      "type": "string"
                    }
                  }
                }
              }
            },
            {
              "type": "object",
              "required": [
                "kind"
              ],
              "properties": {
                "kind": {
                  "type": "string",
                  "const": "reveal-secret"
                },
                "playerId": {
                  "type": "string",
                  "maxLength": 64,
                  "minLength": 1
                }
              }
            },
            {
              "type": "object",
              "required": [
                "kind",
                "firstPlayerId"
              ],
              "properties": {
                "kind": {
                  "type": "string",
                  "const": "begin-battle"
                },
                "attackerId": {
                  "type": "string",
                  "maxLength": 64,
                  "minLength": 1
                },
                "firstPlayerId": {
                  "type": "string",
                  "maxLength": 64,
                  "minLength": 1
                }
              }
            },
            {
              "type": "object",
              "required": [
                "kind",
                "delta"
              ],
              "properties": {
                "kind": {
                  "type": "string",
                  "const": "adjust-cp"
                },
                "delta": {
                  "type": "integer",
                  "maximum": 9007199254740991,
                  "minimum": -9007199254740991
                },
                "missed": {
                  "type": "object",
                  "required": [
                    "round",
                    "phase",
                    "turn"
                  ],
                  "properties": {
                    "turn": {
                      "type": "string",
                      "maxLength": 64,
                      "minLength": 1
                    },
                    "phase": {
                      "enum": [
                        "command",
                        "movement",
                        "shooting",
                        "charge",
                        "fight",
                        "end"
                      ],
                      "type": "string"
                    },
                    "round": {
                      "type": "integer",
                      "maximum": 5,
                      "minimum": 1
                    }
                  }
                },
                "playerId": {
                  "type": "string",
                  "maxLength": 64,
                  "minLength": 1
                }
              }
            },
            {
              "type": "object",
              "required": [
                "kind"
              ],
              "properties": {
                "keys": {
                  "type": "array",
                  "items": {
                    "type": "string",
                    "maxLength": 64,
                    "minLength": 1
                  }
                },
                "kind": {
                  "type": "string",
                  "const": "resolve-tactical-hand"
                },
                "gainCp": {
                  "type": "boolean"
                },
                "playerId": {
                  "type": "string",
                  "maxLength": 64,
                  "minLength": 1
                }
              }
            },
            {
              "type": "object",
              "required": [
                "kind",
                "category",
                "delta"
              ],
              "properties": {
                "kind": {
                  "type": "string",
                  "const": "score"
                },
                "delta": {
                  "type": "integer",
                  "maximum": 9007199254740991,
                  "minimum": -9007199254740991
                },
                "category": {
                  "enum": [
                    "primary",
                    "secondary"
                  ],
                  "type": "string"
                },
                "playerId": {
                  "type": "string",
                  "maxLength": 64,
                  "minLength": 1
                }
              }
            },
            {
              "type": "object",
              "required": [
                "kind",
                "playerId",
                "resource",
                "delta"
              ],
              "properties": {
                "kind": {
                  "type": "string",
                  "const": "correct-player"
                },
                "delta": {
                  "type": "integer",
                  "maximum": 9007199254740991,
                  "minimum": -9007199254740991
                },
                "playerId": {
                  "type": "string",
                  "maxLength": 64,
                  "minLength": 1
                },
                "resource": {
                  "enum": [
                    "cp",
                    "primary",
                    "secondary"
                  ],
                  "type": "string"
                }
              }
            },
            {
              "type": "object",
              "required": [
                "kind"
              ],
              "properties": {
                "kind": {
                  "type": "string",
                  "const": "settle-opponent-turn"
                }
              }
            },
            {
              "type": "object",
              "required": [
                "kind"
              ],
              "properties": {
                "kind": {
                  "type": "string",
                  "const": "request-advance"
                },
                "playerId": {
                  "type": "string",
                  "maxLength": 64,
                  "minLength": 1
                }
              }
            },
            {
              "type": "object",
              "required": [
                "kind"
              ],
              "properties": {
                "kind": {
                  "type": "string",
                  "const": "cancel-advance"
                },
                "playerId": {
                  "type": "string",
                  "maxLength": 64,
                  "minLength": 1
                }
              }
            },
            {
              "type": "object",
              "required": [
                "kind"
              ],
              "properties": {
                "kind": {
                  "type": "string",
                  "const": "advance"
                },
                "playerId": {
                  "type": "string",
                  "maxLength": 64,
                  "minLength": 1
                }
              }
            },
            {
              "type": "object",
              "required": [
                "kind"
              ],
              "properties": {
                "kind": {
                  "type": "string",
                  "const": "pause-clock"
                }
              }
            },
            {
              "type": "object",
              "required": [
                "kind"
              ],
              "properties": {
                "kind": {
                  "type": "string",
                  "const": "resume-clock"
                }
              }
            },
            {
              "type": "object",
              "required": [
                "kind"
              ],
              "properties": {
                "kind": {
                  "type": "string",
                  "const": "end-battle"
                },
                "reason": {
                  "enum": [
                    "completed",
                    "finished-early",
                    "conceded"
                  ],
                  "type": "string"
                },
                "concededBy": {
                  "type": "string",
                  "maxLength": 64,
                  "minLength": 1
                }
              }
            },
            {
              "type": "object",
              "required": [
                "kind"
              ],
              "properties": {
                "kind": {
                  "type": "string",
                  "const": "reopen-battle"
                }
              }
            },
            {
              "type": "object",
              "required": [
                "kind",
                "text"
              ],
              "properties": {
                "kind": {
                  "type": "string",
                  "const": "add-note"
                },
                "text": {
                  "type": "string",
                  "maxLength": 500
                }
              }
            },
            {
              "type": "object",
              "required": [
                "kind",
                "target"
              ],
              "properties": {
                "kind": {
                  "type": "string",
                  "const": "undo"
                },
                "target": {
                  "type": "integer",
                  "maximum": 9007199254740991,
                  "exclusiveMinimum": 0
                }
              }
            }
          ]
        },
        {
          "type": "object",
          "required": [
            "kind",
            "rosterId"
          ],
          "properties": {
            "kind": {
              "type": "string",
              "const": "attach-saved-roster"
            },
            "playerId": {
              "type": "string",
              "maxLength": 64,
              "minLength": 1
            },
            "rosterId": {
              "type": "string",
              "maxLength": 64,
              "minLength": 1
            }
          },
          "additionalProperties": false
        },
        {
          "type": "object",
          "required": [
            "kind",
            "draft"
          ],
          "properties": {
            "kind": {
              "type": "string",
              "const": "attach-draft-roster"
            },
            "draft": {
              "type": "object",
              "required": [
                "name",
                "catalogueId",
                "detachmentIds",
                "disposition",
                "limit",
                "picks",
                "prep"
              ],
              "properties": {
                "id": {
                  "type": "string",
                  "maxLength": 64,
                  "minLength": 1
                },
                "name": {
                  "type": "string",
                  "maxLength": 80
                },
                "prep": {
                  "anyOf": [
                    {
                      "type": "object",
                      "required": [
                        "stratagems",
                        "secondaries"
                      ],
                      "properties": {
                        "reminders": {
                          "type": "array",
                          "items": {
                            "type": "object",
                            "required": [
                              "key",
                              "ability",
                              "description",
                              "timings"
                            ],
                            "properties": {
                              "key": {
                                "type": "string",
                                "maxLength": 240,
                                "minLength": 1
                              },
                              "unit": {
                                "type": "object",
                                "required": [
                                  "index",
                                  "name"
                                ],
                                "properties": {
                                  "name": {
                                    "type": "string",
                                    "maxLength": 80,
                                    "minLength": 1
                                  },
                                  "index": {
                                    "type": "integer",
                                    "maximum": 99,
                                    "minimum": 0
                                  }
                                }
                              },
                              "ability": {
                                "type": "string",
                                "maxLength": 80,
                                "minLength": 1
                              },
                              "timings": {
                                "type": "array",
                                "items": {
                                  "oneOf": [
                                    {
                                      "type": "object",
                                      "required": [
                                        "moment",
                                        "phase",
                                        "turn"
                                      ],
                                      "properties": {
                                        "turn": {
                                          "enum": [
                                            "your-turn",
                                            "opponent-turn",
                                            "either"
                                          ],
                                          "type": "string"
                                        },
                                        "phase": {
                                          "enum": [
                                            "command",
                                            "movement",
                                            "shooting",
                                            "charge",
                                            "fight",
                                            "any"
                                          ],
                                          "type": "string"
                                        },
                                        "moment": {
                                          "enum": [
                                            "phase-start",
                                            "phase-end"
                                          ],
                                          "type": "string"
                                        },
                                        "firstRoundOnly": {
                                          "type": "boolean"
                                        }
                                      }
                                    },
                                    {
                                      "type": "object",
                                      "required": [
                                        "moment",
                                        "phase",
                                        "turn"
                                      ],
                                      "properties": {
                                        "turn": {
                                          "enum": [
                                            "your-turn",
                                            "opponent-turn",
                                            "either"
                                          ],
                                          "type": "string"
                                        },
                                        "phase": {
                                          "type": "null"
                                        },
                                        "moment": {
                                          "enum": [
                                            "turn-start",
                                            "turn-end"
                                          ],
                                          "type": "string"
                                        },
                                        "firstRoundOnly": {
                                          "type": "boolean"
                                        }
                                      }
                                    },
                                    {
                                      "type": "object",
                                      "required": [
                                        "moment",
                                        "phase",
                                        "turn"
                                      ],
                                      "properties": {
                                        "turn": {
                                          "type": "string",
                                          "const": "either"
                                        },
                                        "phase": {
                                          "type": "null"
                                        },
                                        "moment": {
                                          "enum": [
                                            "round-start",
                                            "round-end"
                                          ],
                                          "type": "string"
                                        },
                                        "firstRoundOnly": {
                                          "type": "boolean"
                                        }
                                      }
                                    }
                                  ]
                                },
                                "maxItems": 10,
                                "minItems": 1
                              },
                              "description": {
                                "type": "string",
                                "maxLength": 10000
                              },
                              "whileDestroyed": {
                                "type": "boolean"
                              }
                            }
                          },
                          "maxItems": 200
                        },
                        "stratagems": {
                          "type": "array",
                          "items": {
                            "type": "object",
                            "required": [
                              "key",
                              "name",
                              "cp",
                              "limit"
                            ],
                            "properties": {
                              "cp": {
                                "type": "integer",
                                "maximum": 6,
                                "minimum": 0
                              },
                              "key": {
                                "type": "string",
                                "maxLength": 64,
                                "minLength": 1
                              },
                              "name": {
                                "type": "string",
                                "maxLength": 80,
                                "minLength": 1
                              },
                              "turn": {
                                "enum": [
                                  "your-turn",
                                  "opponent-turn",
                                  "either"
                                ],
                                "type": "string"
                              },
                              "limit": {
                                "enum": [
                                  "phase",
                                  "turn",
                                  "battle-round",
                                  "battle",
                                  "unlimited"
                                ],
                                "type": "string"
                              },
                              "phases": {
                                "type": "array",
                                "items": {
                                  "enum": [
                                    "command",
                                    "movement",
                                    "shooting",
                                    "charge",
                                    "fight",
                                    "end"
                                  ],
                                  "type": "string"
                                },
                                "maxItems": 6
                              }
                            }
                          },
                          "maxItems": 48
                        },
                        "secondaries": {
                          "type": "array",
                          "items": {
                            "type": "object",
                            "required": [
                              "key",
                              "name"
                            ],
                            "properties": {
                              "key": {
                                "type": "string",
                                "maxLength": 64,
                                "minLength": 1
                              },
                              "name": {
                                "type": "string",
                                "maxLength": 80,
                                "minLength": 1
                              }
                            }
                          },
                          "maxItems": 6
                        },
                        "remindersEnabled": {
                          "type": "boolean",
                          "default": true
                        }
                      }
                    },
                    {
                      "type": "null"
                    }
                  ]
                },
                "limit": {
                  "type": "integer",
                  "maximum": 10000,
                  "minimum": 0
                },
                "picks": {
                  "type": "array",
                  "items": {
                    "type": "object",
                    "required": [
                      "entryId"
                    ],
                    "properties": {
                      "note": {
                        "type": "string",
                        "maxLength": 500
                      },
                      "models": {
                        "type": "integer",
                        "maximum": 60,
                        "minimum": 1
                      },
                      "choices": {
                        "type": "object",
                        "propertyNames": {
                          "type": "string",
                          "maxLength": 400
                        },
                        "additionalProperties": {
                          "type": "string",
                          "maxLength": 64,
                          "minLength": 1
                        }
                      },
                      "entryId": {
                        "type": "string",
                        "maxLength": 64,
                        "minLength": 1
                      },
                      "spreads": {
                        "type": "object",
                        "propertyNames": {
                          "type": "string",
                          "maxLength": 400
                        },
                        "additionalProperties": {
                          "type": "object",
                          "propertyNames": {
                            "type": "string",
                            "maxLength": 64
                          },
                          "additionalProperties": {
                            "type": "integer",
                            "maximum": 60,
                            "minimum": 0
                          }
                        }
                      },
                      "toggles": {
                        "type": "object",
                        "propertyNames": {
                          "type": "string",
                          "maxLength": 400
                        },
                        "additionalProperties": {
                          "type": "integer",
                          "maximum": 1,
                          "minimum": 0
                        }
                      },
                      "nickname": {
                        "type": "string",
                        "maxLength": 40
                      },
                      "attachedTo": {
                        "type": "integer",
                        "maximum": 99,
                        "minimum": 0
                      },
                      "embarkedIn": {
                        "type": "integer",
                        "maximum": 99,
                        "minimum": 0
                      },
                      "catalogueId": {
                        "type": "string",
                        "maxLength": 64,
                        "minLength": 1
                      }
                    }
                  },
                  "maxItems": 100
                },
                "source": {
                  "enum": [
                    "legacy",
                    "editable",
                    "praetorium",
                    "battlebase",
                    "newrecruit",
                    "roster-file"
                  ],
                  "type": "string",
                  "default": "editable"
                },
                "visibility": {
                  "enum": [
                    "private",
                    "unlisted",
                    "public"
                  ],
                  "type": "string",
                  "default": "private"
                },
                "catalogueId": {
                  "type": "string",
                  "maxLength": 64,
                  "minLength": 1
                },
                "disposition": {
                  "anyOf": [
                    {
                      "type": "string",
                      "maxLength": 64,
                      "minLength": 1
                    },
                    {
                      "type": "null"
                    }
                  ]
                },
                "waivedRules": {
                  "type": "array",
                  "items": {
                    "enum": [
                      "points-limit",
                      "detachments",
                      "detachment-points",
                      "warlord",
                      "kotc-infantry",
                      "kotc-warlord",
                      "kotc-epic-heroes",
                      "kotc-toughness",
                      "kotc-datasheet-copies"
                    ],
                    "type": "string"
                  },
                  "maxItems": 9
                },
                "pointsBudget": {
                  "anyOf": [
                    {
                      "type": "integer",
                      "maximum": 10000,
                      "minimum": 500
                    },
                    {
                      "type": "null"
                    }
                  ]
                },
                "detachmentIds": {
                  "type": "array",
                  "items": {
                    "type": "string",
                    "maxLength": 128,
                    "minLength": 1
                  },
                  "maxItems": 3
                },
                "optionalRules": {
                  "type": "array",
                  "items": {
                    "enum": [
                      "kotc-borrowed-disposition"
                    ],
                    "type": "string"
                  },
                  "maxItems": 1
                },
                "borrowedDetachmentId": {
                  "anyOf": [
                    {
                      "type": "string",
                      "maxLength": 128,
                      "minLength": 1
                    },
                    {
                      "type": "null"
                    }
                  ],
                  "default": null
                }
              }
            },
            "reminders": {
              "type": "array",
              "items": {
                "type": "object",
                "required": [
                  "key",
                  "ability",
                  "description",
                  "timings"
                ],
                "properties": {
                  "key": {
                    "type": "string",
                    "maxLength": 240,
                    "minLength": 1
                  },
                  "ability": {
                    "type": "string",
                    "maxLength": 80,
                    "minLength": 1
                  },
                  "timings": {
                    "type": "array",
                    "items": {
                      "oneOf": [
                        {
                          "type": "object",
                          "required": [
                            "moment",
                            "phase",
                            "turn"
                          ],
                          "properties": {
                            "turn": {
                              "enum": [
                                "your-turn",
                                "opponent-turn",
                                "either"
                              ],
                              "type": "string"
                            },
                            "phase": {
                              "enum": [
                                "command",
                                "movement",
                                "shooting",
                                "charge",
                                "fight",
                                "any"
                              ],
                              "type": "string"
                            },
                            "moment": {
                              "enum": [
                                "phase-start",
                                "phase-end"
                              ],
                              "type": "string"
                            },
                            "firstRoundOnly": {
                              "type": "boolean"
                            }
                          }
                        },
                        {
                          "type": "object",
                          "required": [
                            "moment",
                            "phase",
                            "turn"
                          ],
                          "properties": {
                            "turn": {
                              "enum": [
                                "your-turn",
                                "opponent-turn",
                                "either"
                              ],
                              "type": "string"
                            },
                            "phase": {
                              "type": "null"
                            },
                            "moment": {
                              "enum": [
                                "turn-start",
                                "turn-end"
                              ],
                              "type": "string"
                            },
                            "firstRoundOnly": {
                              "type": "boolean"
                            }
                          }
                        },
                        {
                          "type": "object",
                          "required": [
                            "moment",
                            "phase",
                            "turn"
                          ],
                          "properties": {
                            "turn": {
                              "type": "string",
                              "const": "either"
                            },
                            "phase": {
                              "type": "null"
                            },
                            "moment": {
                              "enum": [
                                "round-start",
                                "round-end"
                              ],
                              "type": "string"
                            },
                            "firstRoundOnly": {
                              "type": "boolean"
                            }
                          }
                        }
                      ]
                    },
                    "maxItems": 10,
                    "minItems": 1
                  },
                  "description": {
                    "type": "string",
                    "maxLength": 10000
                  },
                  "whileDestroyed": {
                    "type": "boolean"
                  }
                }
              },
              "maxItems": 200
            }
          },
          "additionalProperties": false
        }
      ]
    },
    "expectedSeq": {
      "type": "integer",
      "maximum": 9007199254740991,
      "minimum": 0
    }
  }
}
submit_battle_action annotations
{
  "title": "Record a battle action",
  "readOnlyHint": false,
  "openWorldHint": true,
  "idempotentHint": false,
  "destructiveHint": true
}
search_reference — Search the Praetorium game reference
Advertised by the server during the last successful anonymous check.
Advertised read-only

Searches Praetorium’s missions, rules, detachments, and datasheets by name, number, keyword, and value. Returns bounded excerpts with canonical URLs, source revisions, and attribution. Rules text is not included; records point to it upstream.

search_reference input schema
{
  "type": "object",
  "$schema": "http://json-schema.org/draft-07/schema#",
  "required": [
    "query"
  ],
  "properties": {
    "pack": {
      "type": "string",
      "maxLength": 160,
      "minLength": 1
    },
    "kinds": {
      "type": "array",
      "items": {
        "enum": [
          "datasheet",
          "deployment",
          "detachment",
          "mission",
          "rule",
          "terrain"
        ],
        "type": "string"
      },
      "maxItems": 6
    },
    "limit": {
      "type": "integer",
      "default": 10,
      "maximum": 25,
      "minimum": 1
    },
    "query": {
      "type": "string",
      "maxLength": 120,
      "minLength": 2,
      "description": "A name, a printed rule number, an ability, a weapon, or a keyword."
    },
    "cursor": {
      "type": "string"
    },
    "faction": {
      "type": "string",
      "maxLength": 160,
      "minLength": 1
    },
    "document": {
      "type": "string",
      "maxLength": 160,
      "minLength": 1
    }
  }
}
search_reference output schema
{
  "type": "object",
  "$schema": "http://json-schema.org/draft-07/schema#",
  "required": [
    "query",
    "results",
    "revisions",
    "nextCursor"
  ],
  "properties": {
    "query": {
      "type": "string"
    },
    "results": {
      "type": "array",
      "items": {
        "type": "object",
        "required": [
          "id",
          "kind",
          "title",
          "faction",
          "url",
          "section",
          "excerpt",
          "revisions",
          "attribution"
        ],
        "properties": {
          "id": {
            "type": "string"
          },
          "url": {
            "type": "string"
          },
          "kind": {
            "enum": [
              "datasheet",
              "deployment",
              "detachment",
              "mission",
              "rule",
              "terrain"
            ],
            "type": "string"
          },
          "title": {
            "type": "string"
          },
          "excerpt": {
            "type": "string",
            "maxLength": 322
          },
          "faction": {
            "type": [
              "string",
              "null"
            ]
          },
          "section": {
            "type": "object",
            "required": [
              "id",
              "title",
              "url"
            ],
            "properties": {
              "id": {
                "type": "string"
              },
              "url": {
                "type": "string"
              },
              "title": {
                "type": "string"
              },
              "textSources": {
                "type": "array",
                "items": {
                  "type": "object",
                  "required": [
                    "source",
                    "url"
                  ],
                  "properties": {
                    "id": {
                      "type": "string"
                    },
                    "url": {
                      "type": "string",
                      "format": "uri"
                    },
                    "source": {
                      "enum": [
                        "bsdata",
                        "game-datacards"
                      ],
                      "type": "string"
                    }
                  },
                  "additionalProperties": false
                },
                "description": "Where withheld rules text lives upstream: the pinned file, its source, and the id of the record holding it there when the file has one. Fetch it there if you need the wording."
              }
            },
            "additionalProperties": false
          },
          "revisions": {
            "type": "object",
            "propertyNames": {
              "type": "string"
            },
            "additionalProperties": {
              "type": "string"
            }
          },
          "attribution": {
            "type": "array",
            "items": {
              "type": "string"
            }
          }
        },
        "additionalProperties": false
      },
      "maxItems": 25
    },
    "revisions": {
      "type": "object",
      "propertyNames": {
        "type": "string"
      },
      "additionalProperties": {
        "type": "string"
      }
    },
    "nextCursor": {
      "type": [
        "string",
        "null"
      ]
    }
  },
  "additionalProperties": false
}
search_reference annotations
{
  "title": "Search the Praetorium game reference",
  "readOnlyHint": true,
  "openWorldHint": false,
  "idempotentHint": true,
  "destructiveHint": false
}
get_reference — Read one Praetorium reference result
Advertised by the server during the last successful anonymous check.
Advertised read-only

Reads the complete bounded document returned by search_reference, with its revisions and attribution. A section that withholds rules text lists textSources: the pinned upstream file and record id to fetch if you need the wording.

get_reference input schema
{
  "type": "object",
  "$schema": "http://json-schema.org/draft-07/schema#",
  "required": [
    "id"
  ],
  "properties": {
    "id": {
      "type": "string",
      "maxLength": 400,
      "minLength": 1,
      "description": "A reference id such as datasheet:necrons:necron-warriors: a result id from search_reference, a mission pack id from list_reference, or a referenceId from list_units or simulate_combat. Names, URLs, and unit ids are not reference ids."
    }
  }
}
get_reference output schema
{
  "type": "object",
  "$schema": "http://json-schema.org/draft-07/schema#",
  "required": [
    "id",
    "kind",
    "title",
    "faction",
    "url",
    "sections",
    "revisions",
    "attribution"
  ],
  "properties": {
    "id": {
      "type": "string"
    },
    "url": {
      "type": "string"
    },
    "kind": {
      "enum": [
        "datasheet",
        "deployment",
        "detachment",
        "mission",
        "rule",
        "terrain"
      ],
      "type": "string"
    },
    "title": {
      "type": "string"
    },
    "faction": {
      "type": [
        "string",
        "null"
      ]
    },
    "sections": {
      "type": "array",
      "items": {
        "type": "object",
        "required": [
          "id",
          "title",
          "text",
          "url"
        ],
        "properties": {
          "id": {
            "type": "string"
          },
          "url": {
            "type": "string"
          },
          "text": {
            "type": "string"
          },
          "title": {
            "type": "string"
          },
          "textSources": {
            "type": "array",
            "items": {
              "type": "object",
              "required": [
                "source",
                "url"
              ],
              "properties": {
                "id": {
                  "type": "string"
                },
                "url": {
                  "type": "string",
                  "format": "uri"
                },
                "source": {
                  "enum": [
                    "bsdata",
                    "game-datacards"
                  ],
                  "type": "string"
                }
              },
              "additionalProperties": false
            },
            "description": "Where withheld rules text lives upstream: the pinned file, its source, and the id of the record holding it there when the file has one. Fetch it there if you need the wording."
          }
        },
        "additionalProperties": false
      }
    },
    "revisions": {
      "type": "object",
      "propertyNames": {
        "type": "string"
      },
      "additionalProperties": {
        "type": "string"
      }
    },
    "attribution": {
      "type": "array",
      "items": {
        "type": "string"
      }
    }
  },
  "additionalProperties": false
}
get_reference annotations
{
  "title": "Read one Praetorium reference result",
  "readOnlyHint": true,
  "openWorldHint": false,
  "idempotentHint": true,
  "destructiveHint": false
}
get_reference_record — Read structured Praetorium reference data
Advertised by the server during the last successful anonymous check.
Advertised read-only

Returns the structured record behind a search result, including mission cards, deployments, terrain geometry, detachments, and datasheets. Records that withhold rules text carry textSources pointing at the pinned upstream file and record id.

get_reference_record input schema
{
  "type": "object",
  "$schema": "http://json-schema.org/draft-07/schema#",
  "required": [
    "id"
  ],
  "properties": {
    "id": {
      "type": "string",
      "maxLength": 400,
      "minLength": 1,
      "description": "A reference id such as datasheet:necrons:necron-warriors: a result id from search_reference, a mission pack id from list_reference, or a referenceId from list_units or simulate_combat. Names, URLs, and unit ids are not reference ids."
    }
  }
}
get_reference_record output schema
{
  "type": "object",
  "$schema": "http://json-schema.org/draft-07/schema#",
  "required": [
    "document",
    "data"
  ],
  "properties": {
    "data": {},
    "document": {
      "type": "object",
      "required": [
        "id",
        "kind",
        "title",
        "faction",
        "url",
        "sections",
        "revisions",
        "attribution"
      ],
      "properties": {
        "id": {
          "type": "string"
        },
        "url": {
          "type": "string"
        },
        "kind": {
          "enum": [
            "datasheet",
            "deployment",
            "detachment",
            "mission",
            "rule",
            "terrain"
          ],
          "type": "string"
        },
        "title": {
          "type": "string"
        },
        "faction": {
          "type": [
            "string",
            "null"
          ]
        },
        "sections": {
          "type": "array",
          "items": {
            "type": "object",
            "required": [
              "id",
              "title",
              "text",
              "url"
            ],
            "properties": {
              "id": {
                "type": "string"
              },
              "url": {
                "type": "string"
              },
              "text": {
                "type": "string"
              },
              "title": {
                "type": "string"
              },
              "textSources": {
                "type": "array",
                "items": {
                  "type": "object",
                  "required": [
                    "source",
                    "url"
                  ],
                  "properties": {
                    "id": {
                      "type": "string"
                    },
                    "url": {
                      "type": "string",
                      "format": "uri"
                    },
                    "source": {
                      "enum": [
                        "bsdata",
                        "game-datacards"
                      ],
                      "type": "string"
                    }
                  },
                  "additionalProperties": false
                },
                "description": "Where withheld rules text lives upstream: the pinned file, its source, and the id of the record holding it there when the file has one. Fetch it there if you need the wording."
              }
            },
            "additionalProperties": false
          }
        },
        "revisions": {
          "type": "object",
          "propertyNames": {
            "type": "string"
          },
          "additionalProperties": {
            "type": "string"
          }
        },
        "attribution": {
          "type": "array",
          "items": {
            "type": "string"
          }
        }
      },
      "additionalProperties": false
    }
  },
  "additionalProperties": false
}
get_reference_record annotations
{
  "title": "Read structured Praetorium reference data",
  "readOnlyHint": true,
  "openWorldHint": false,
  "idempotentHint": true,
  "destructiveHint": false
}
list_factions — List factions in the Praetorium reference
Advertised by the server during the last successful anonymous check.
Advertised read-only

Lists the factions that can be used to narrow reference searches.

list_factions input schema
{
  "type": "object",
  "$schema": "http://json-schema.org/draft-07/schema#",
  "properties": {}
}
list_factions output schema
{
  "type": "object",
  "$schema": "http://json-schema.org/draft-07/schema#",
  "required": [
    "factions",
    "revisions"
  ],
  "properties": {
    "factions": {
      "type": "array",
      "items": {
        "type": "object",
        "required": [
          "id",
          "slug",
          "name",
          "datasheets",
          "detachments"
        ],
        "properties": {
          "id": {
            "type": "string"
          },
          "name": {
            "type": "string"
          },
          "slug": {
            "type": "string"
          },
          "datasheets": {
            "type": "integer",
            "maximum": 9007199254740991,
            "minimum": 0
          },
          "detachments": {
            "type": "integer",
            "maximum": 9007199254740991,
            "minimum": 0
          }
        },
        "additionalProperties": false
      }
    },
    "revisions": {
      "type": "object",
      "propertyNames": {
        "type": "string"
      },
      "additionalProperties": {
        "type": "string"
      }
    }
  },
  "additionalProperties": false
}
list_factions annotations
{
  "title": "List factions in the Praetorium reference",
  "readOnlyHint": true,
  "openWorldHint": false,
  "idempotentHint": true,
  "destructiveHint": false
}
list_reference — List the Praetorium reference catalogue
Advertised by the server during the last successful anonymous check.
Advertised read-only

Discovers available factions, mission packs, rule documents, reference kinds, and active source revisions.

list_reference input schema
{
  "type": "object",
  "$schema": "http://json-schema.org/draft-07/schema#",
  "properties": {}
}
list_reference output schema
{
  "type": "object",
  "$schema": "http://json-schema.org/draft-07/schema#",
  "required": [
    "corpusRevision",
    "revisions",
    "kinds",
    "factions",
    "missionPacks",
    "ruleDocuments"
  ],
  "properties": {
    "kinds": {
      "type": "object",
      "propertyNames": {
        "type": "string"
      },
      "additionalProperties": {
        "type": "integer",
        "maximum": 9007199254740991,
        "minimum": 0
      }
    },
    "factions": {
      "type": "array",
      "items": {
        "type": "object",
        "required": [
          "id",
          "slug",
          "name",
          "datasheets",
          "detachments"
        ],
        "properties": {
          "id": {
            "type": "string"
          },
          "name": {
            "type": "string"
          },
          "slug": {
            "type": "string"
          },
          "datasheets": {
            "type": "integer",
            "maximum": 9007199254740991,
            "minimum": 0
          },
          "detachments": {
            "type": "integer",
            "maximum": 9007199254740991,
            "minimum": 0
          }
        },
        "additionalProperties": false
      }
    },
    "revisions": {
      "type": "object",
      "propertyNames": {
        "type": "string"
      },
      "additionalProperties": {
        "type": "string"
      }
    },
    "missionPacks": {
      "type": "array",
      "items": {
        "type": "object",
        "required": [
          "id",
          "title",
          "url"
        ],
        "properties": {
          "id": {
            "type": "string"
          },
          "url": {
            "type": "string"
          },
          "title": {
            "type": "string"
          }
        },
        "additionalProperties": false
      }
    },
    "ruleDocuments": {
      "type": "array",
      "items": {
        "type": "object",
        "required": [
          "id",
          "slug",
          "title",
          "sections",
          "url"
        ],
        "properties": {
          "id": {
            "type": "string"
          },
          "url": {
            "type": "string"
          },
          "slug": {
            "type": "string"
          },
          "title": {
            "type": "string"
          },
          "sections": {
            "type": "integer",
            "maximum": 9007199254740991,
            "minimum": 0
          }
        },
        "additionalProperties": false
      }
    },
    "corpusRevision": {
      "type": "string"
    }
  },
  "additionalProperties": false
}
list_reference annotations
{
  "title": "List the Praetorium reference catalogue",
  "readOnlyHint": true,
  "openWorldHint": false,
  "idempotentHint": true,
  "destructiveHint": false
}
list_units — List compact faction units for roster planning
Advertised by the server during the last successful anonymous check.
Advertised read-only

Returns every pickable unit in one bounded response with unit-size costs, composition, attachment relationships, roster limits, roles, keywords, and links. Include a detachment, including one a chapter takes from its codex, to list only the units it allows and receive its rules, enhancements, upgrades, and stratagems by name, cost, and timing without opening every unit page. Their rules text is at each record’s textSources. A unit’s points is what its smallest size costs in this battle size and detachment, including any wargear or enhancement the detachment makes it take; costs is the Munitorum Field Manual table for every size. Legends and Crucible datasheets are left out unless nonMatchedPlay is true. A large faction such as a Space Marine chapter can exceed what an assistant reads at once, so pass query to list only the units whose name or keywords contain it.

list_units input schema
{
  "type": "object",
  "$schema": "http://json-schema.org/draft-07/schema#",
  "required": [
    "faction"
  ],
  "properties": {
    "query": {
      "type": "string",
      "maxLength": 160,
      "minLength": 1,
      "description": "List only units whose name or keywords contain this text, such as Terminator or Character."
    },
    "faction": {
      "type": "string",
      "maxLength": 160,
      "minLength": 1,
      "description": "Faction id, URL slug, or display name from list_reference."
    },
    "battleSize": {
      "type": "integer",
      "maximum": 10000,
      "minimum": 1,
      "description": "Battle size in points for size-dependent limits."
    },
    "detachment": {
      "type": "string",
      "maxLength": 160,
      "minLength": 1,
      "description": "Detachment id, slug, or display name."
    },
    "nonMatchedPlay": {
      "type": "boolean",
      "default": false,
      "description": "Also list Legends and Crucible datasheets, which matched play does not allow."
    }
  }
}
list_units output schema
{
  "type": "object",
  "$schema": "http://json-schema.org/draft-07/schema#",
  "required": [
    "faction",
    "battleSize",
    "nonMatchedPlay",
    "query",
    "detachment",
    "units",
    "revisions"
  ],
  "properties": {
    "query": {
      "type": [
        "string",
        "null"
      ]
    },
    "units": {
      "type": "array",
      "items": {
        "type": "object",
        "required": [
          "id",
          "slug",
          "name",
          "group",
          "allied",
          "alliedFaction",
          "points",
          "limit",
          "keywords",
          "composition",
          "costs",
          "canLead",
          "canSupport",
          "canBeLedBy",
          "canBeSupportedBy",
          "url",
          "referenceId"
        ],
        "properties": {
          "id": {
            "type": "string"
          },
          "url": {
            "type": [
              "string",
              "null"
            ]
          },
          "name": {
            "type": "string"
          },
          "slug": {
            "type": "string"
          },
          "costs": {
            "type": "array",
            "items": {
              "type": "object",
              "required": [
                "models",
                "cost"
              ],
              "properties": {
                "cost": {
                  "type": "string"
                },
                "copies": {
                  "type": "string"
                },
                "models": {
                  "type": "string"
                },
                "faction": {
                  "type": "string"
                },
                "keyword": {
                  "type": "string"
                },
                "detachment": {
                  "type": "string"
                }
              },
              "additionalProperties": false
            }
          },
          "group": {
            "type": "string"
          },
          "limit": {
            "anyOf": [
              {
                "type": "integer",
                "maximum": 9007199254740991,
                "minimum": 0
              },
              {
                "type": "null"
              }
            ]
          },
          "allied": {
            "type": "boolean"
          },
          "points": {
            "type": [
              "number",
              "null"
            ]
          },
          "canLead": {
            "type": "array",
            "items": {
              "type": "string"
            }
          },
          "keywords": {
            "type": "array",
            "items": {
              "type": "string"
            }
          },
          "canBeLedBy": {
            "type": "array",
            "items": {
              "type": "string"
            }
          },
          "canSupport": {
            "type": "array",
            "items": {
              "type": "string"
            }
          },
          "composition": {
            "type": "array",
            "items": {
              "type": "string"
            }
          },
          "referenceId": {
            "type": [
              "string",
              "null"
            ]
          },
          "alliedFaction": {
            "type": [
              "string",
              "null"
            ]
          },
          "canBeSupportedBy": {
            "type": "array",
            "items": {
              "type": "string"
            }
          }
        },
        "additionalProperties": false
      }
    },
    "faction": {
      "type": "object",
      "required": [
        "id",
        "slug",
        "name",
        "datasheets",
        "detachments"
      ],
      "properties": {
        "id": {
          "type": "string"
        },
        "name": {
          "type": "string"
        },
        "slug": {
          "type": "string"
        },
        "datasheets": {
          "type": "integer",
          "maximum": 9007199254740991,
          "minimum": 0
        },
        "detachments": {
          "type": "integer",
          "maximum": 9007199254740991,
          "minimum": 0
        }
      },
      "additionalProperties": false
    },
    "revisions": {
      "type": "object",
      "propertyNames": {
        "type": "string"
      },
      "additionalProperties": {
        "type": "string"
      }
    },
    "battleSize": {
      "anyOf": [
        {
          "type": "integer",
          "maximum": 9007199254740991,
          "minimum": -9007199254740991
        },
        {
          "type": "null"
        }
      ]
    },
    "detachment": {
      "anyOf": [
        {},
        {
          "type": "null"
        }
      ]
    },
    "nonMatchedPlay": {
      "type": "boolean"
    }
  },
  "additionalProperties": false
}
list_units annotations
{
  "title": "List compact faction units for roster planning",
  "readOnlyHint": true,
  "openWorldHint": false,
  "idempotentHint": true,
  "destructiveHint": false
}
simulate_combat — Estimate combat between two units
Advertised by the server during the last successful anonymous check.
Advertised read-only

Runs Praetorium's exact combat simulator for one attacking unit, with any attached leaders, against one defending unit at full strength: shooting, melee, and shooting followed by melee. Returns expected models destroyed, expected wounds lost, the chance to destroy the unit, cumulative odds, weapons used, the rule and weapon-mode choices each side can change, datasheet citations, and a simulator link. Passive datasheet rules apply by default; stratagems and conditional rules stay off until chosen. Rules the simulator cannot calculate are never approximated: a phase it cannot estimate has status refused with its reasons, and recognised rules it leaves out are listed under notCalculated, so explain those gaps rather than retrying. Errors are reserved for unknown factions or units, illegal unit sizes or attachments, and unavailable reference data. It uses default loadouts, and a side fields a detachment's rules and offers its stratagems only when its detachment is named; unit sizes and attachments must be legal.

simulate_combat input schema
{
  "type": "object",
  "$schema": "http://json-schema.org/draft-07/schema#",
  "required": [
    "attacker",
    "defender"
  ],
  "properties": {
    "attacker": {
      "type": "object",
      "required": [
        "faction",
        "unit"
      ],
      "properties": {
        "unit": {
          "type": "string",
          "maxLength": 400,
          "minLength": 1,
          "description": "Unit id, slug, name, or referenceId from list_units."
        },
        "rules": {
          "type": "object",
          "description": "Rule choices by rule id from a previous result: 0 turns a rule off and n selects its nth option.",
          "propertyNames": {
            "type": "string",
            "maxLength": 400
          },
          "additionalProperties": {
            "type": "integer",
            "maximum": 20,
            "minimum": 0
          }
        },
        "models": {
          "type": "integer",
          "maximum": 60,
          "minimum": 1,
          "description": "Model count; must be a legal unit size. Defaults to the minimum size."
        },
        "faction": {
          "type": "string",
          "maxLength": 160,
          "minLength": 1,
          "description": "Faction id, URL slug, or display name from list_reference or list_units."
        },
        "attached": {
          "type": "array",
          "items": {
            "type": "object",
            "required": [
              "unit"
            ],
            "properties": {
              "unit": {
                "type": "string",
                "maxLength": 400,
                "minLength": 1,
                "description": "Unit id, slug, name, or referenceId from list_units."
              },
              "models": {
                "type": "integer",
                "maximum": 60,
                "minimum": 1,
                "description": "Model count; must be a legal unit size. Defaults to the minimum size."
              },
              "faction": {
                "type": "string",
                "maxLength": 160,
                "minLength": 1,
                "description": "Defaults to the unit's faction."
              }
            }
          },
          "maxItems": 2,
          "description": "Leaders or support units joined to the unit, from its canBeLedBy and canBeSupportedBy. A unit that joins one of these instead, such as Nork Deddog joining a Cadian Command Squad, goes after it."
        },
        "detachment": {
          "type": "string",
          "maxLength": 160,
          "minLength": 1,
          "description": "Detachment id, slug, or name from list_units, to field its rules and offer its stratagems; omit it for none."
        }
      }
    },
    "defender": {
      "type": "object",
      "required": [
        "faction",
        "unit"
      ],
      "properties": {
        "unit": {
          "type": "string",
          "maxLength": 400,
          "minLength": 1,
          "description": "Unit id, slug, name, or referenceId from list_units."
        },
        "rules": {
          "type": "object",
          "description": "Rule choices by rule id from a previous result: 0 turns a rule off and n selects its nth option.",
          "propertyNames": {
            "type": "string",
            "maxLength": 400
          },
          "additionalProperties": {
            "type": "integer",
            "maximum": 20,
            "minimum": 0
          }
        },
        "models": {
          "type": "integer",
          "maximum": 60,
          "minimum": 1,
          "description": "Model count; must be a legal unit size. Defaults to the minimum size."
        },
        "faction": {
          "type": "string",
          "maxLength": 160,
          "minLength": 1,
          "description": "Faction id, URL slug, or display name from list_reference or list_units."
        },
        "attached": {
          "type": "array",
          "items": {
            "type": "object",
            "required": [
              "unit"
            ],
            "properties": {
              "unit": {
                "type": "string",
                "maxLength": 400,
                "minLength": 1,
                "description": "Unit id, slug, name, or referenceId from list_units."
              },
              "models": {
                "type": "integer",
                "maximum": 60,
                "minimum": 1,
                "description": "Model count; must be a legal unit size. Defaults to the minimum size."
              },
              "faction": {
                "type": "string",
                "maxLength": 160,
                "minLength": 1,
                "description": "Defaults to the unit's faction."
              }
            }
          },
          "maxItems": 2,
          "description": "Leaders or support units joined to the unit, from its canBeLedBy and canBeSupportedBy. A unit that joins one of these instead, such as Nork Deddog joining a Cadian Command Squad, goes after it."
        },
        "detachment": {
          "type": "string",
          "maxLength": 160,
          "minLength": 1,
          "description": "Detachment id, slug, or name from list_units, to field its rules and offer its stratagems; omit it for none."
        }
      }
    },
    "modifiers": {
      "type": "object",
      "properties": {
        "all": {
          "type": "object",
          "properties": {
            "cover": {
              "type": "boolean"
            },
            "heavy": {
              "type": "boolean"
            },
            "lethal": {
              "type": "boolean"
            },
            "charged": {
              "type": "boolean"
            },
            "halfRange": {
              "type": "boolean"
            },
            "hitReroll": {
              "enum": [
                "none",
                "ones",
                "failed"
              ],
              "type": "string"
            },
            "hitModifier": {
              "type": "integer",
              "maximum": 100,
              "minimum": -100
            },
            "woundReroll": {
              "enum": [
                "none",
                "ones",
                "failed"
              ],
              "type": "string"
            },
            "indirectFire": {
              "enum": [
                "direct",
                "unobserved",
                "spotted"
              ],
              "type": "string"
            },
            "commandReroll": {
              "enum": [
                "attacks",
                "hit",
                "wound",
                "save",
                "damage"
              ],
              "type": "string"
            },
            "singleRerolls": {
              "type": "array",
              "items": {
                "enum": [
                  "hit",
                  "wound"
                ],
                "type": "string"
              },
              "maxItems": 4
            },
            "woundModifier": {
              "type": "integer",
              "maximum": 100,
              "minimum": -100
            },
            "psychicHitModifier": {
              "type": "integer",
              "maximum": 100,
              "minimum": 0
            },
            "positiveWoundModifier": {
              "type": "integer",
              "maximum": 100,
              "minimum": -100
            }
          }
        },
        "melee": {
          "type": "object",
          "properties": {
            "cover": {
              "type": "boolean"
            },
            "heavy": {
              "type": "boolean"
            },
            "lethal": {
              "type": "boolean"
            },
            "charged": {
              "type": "boolean"
            },
            "halfRange": {
              "type": "boolean"
            },
            "hitReroll": {
              "enum": [
                "none",
                "ones",
                "failed"
              ],
              "type": "string"
            },
            "hitModifier": {
              "type": "integer",
              "maximum": 100,
              "minimum": -100
            },
            "woundReroll": {
              "enum": [
                "none",
                "ones",
                "failed"
              ],
              "type": "string"
            },
            "indirectFire": {
              "enum": [
                "direct",
                "unobserved",
                "spotted"
              ],
              "type": "string"
            },
            "commandReroll": {
              "enum": [
                "attacks",
                "hit",
                "wound",
                "save",
                "damage"
              ],
              "type": "string"
            },
            "singleRerolls": {
              "type": "array",
              "items": {
                "enum": [
                  "hit",
                  "wound"
                ],
                "type": "string"
              },
              "maxItems": 4
            },
            "woundModifier": {
              "type": "integer",
              "maximum": 100,
              "minimum": -100
            },
            "psychicHitModifier": {
              "type": "integer",
              "maximum": 100,
              "minimum": 0
            },
            "positiveWoundModifier": {
              "type": "integer",
              "maximum": 100,
              "minimum": -100
            }
          }
        },
        "ranged": {
          "type": "object",
          "properties": {
            "cover": {
              "type": "boolean"
            },
            "heavy": {
              "type": "boolean"
            },
            "lethal": {
              "type": "boolean"
            },
            "charged": {
              "type": "boolean"
            },
            "halfRange": {
              "type": "boolean"
            },
            "hitReroll": {
              "enum": [
                "none",
                "ones",
                "failed"
              ],
              "type": "string"
            },
            "hitModifier": {
              "type": "integer",
              "maximum": 100,
              "minimum": -100
            },
            "woundReroll": {
              "enum": [
                "none",
                "ones",
                "failed"
              ],
              "type": "string"
            },
            "indirectFire": {
              "enum": [
                "direct",
                "unobserved",
                "spotted"
              ],
              "type": "string"
            },
            "commandReroll": {
              "enum": [
                "attacks",
                "hit",
                "wound",
                "save",
                "damage"
              ],
              "type": "string"
            },
            "singleRerolls": {
              "type": "array",
              "items": {
                "enum": [
                  "hit",
                  "wound"
                ],
                "type": "string"
              },
              "maxItems": 4
            },
            "woundModifier": {
              "type": "integer",
              "maximum": 100,
              "minimum": -100
            },
            "psychicHitModifier": {
              "type": "integer",
              "maximum": 100,
              "minimum": 0
            },
            "positiveWoundModifier": {
              "type": "integer",
              "maximum": 100,
              "minimum": -100
            }
          }
        },
        "target": {
          "type": "object",
          "properties": {
            "save": {
              "type": "integer",
              "maximum": 10,
              "minimum": -10
            },
            "toughness": {
              "type": "integer",
              "maximum": 10,
              "minimum": -10
            },
            "saveReroll": {
              "enum": [
                "ones",
                "failed"
              ],
              "type": "string"
            },
            "halveDamage": {
              "type": "boolean"
            },
            "invulnerable": {
              "anyOf": [
                {
                  "type": "integer",
                  "maximum": 6,
                  "minimum": 2
                },
                {
                  "type": "null"
                }
              ]
            },
            "damageReduction": {
              "type": "boolean"
            }
          }
        },
        "weapons": {
          "type": "object",
          "properties": {
            "all": {
              "type": "object",
              "properties": {
                "ap": {
                  "type": "integer",
                  "maximum": 10,
                  "minimum": -10
                },
                "skill": {
                  "type": "integer",
                  "maximum": 10,
                  "minimum": -10
                },
                "damage": {
                  "type": "integer",
                  "maximum": 10,
                  "minimum": -10
                },
                "lethal": {
                  "type": "boolean"
                },
                "attacks": {
                  "type": "integer",
                  "maximum": 10,
                  "minimum": -10
                },
                "strength": {
                  "type": "integer",
                  "maximum": 10,
                  "minimum": -10
                },
                "sustained": {
                  "anyOf": [
                    {
                      "type": "integer",
                      "maximum": 100,
                      "minimum": 0
                    },
                    {
                      "type": "object",
                      "required": [
                        "dice",
                        "sides",
                        "bonus"
                      ],
                      "properties": {
                        "dice": {
                          "type": "integer",
                          "maximum": 10,
                          "minimum": 0
                        },
                        "bonus": {
                          "type": "integer",
                          "maximum": 100,
                          "minimum": 0
                        },
                        "sides": {
                          "anyOf": [
                            {
                              "type": "number",
                              "const": 3
                            },
                            {
                              "type": "number",
                              "const": 6
                            }
                          ]
                        }
                      }
                    }
                  ]
                },
                "criticalHit": {
                  "type": "integer",
                  "maximum": 6,
                  "minimum": 2
                },
                "devastating": {
                  "type": "boolean"
                },
                "damageReroll": {
                  "type": "boolean"
                },
                "criticalWound": {
                  "type": "integer",
                  "maximum": 6,
                  "minimum": 2
                }
              }
            },
            "melee": {
              "type": "object",
              "properties": {
                "ap": {
                  "type": "integer",
                  "maximum": 10,
                  "minimum": -10
                },
                "skill": {
                  "type": "integer",
                  "maximum": 10,
                  "minimum": -10
                },
                "damage": {
                  "type": "integer",
                  "maximum": 10,
                  "minimum": -10
                },
                "lethal": {
                  "type": "boolean"
                },
                "attacks": {
                  "type": "integer",
                  "maximum": 10,
                  "minimum": -10
                },
                "strength": {
                  "type": "integer",
                  "maximum": 10,
                  "minimum": -10
                },
                "sustained": {
                  "anyOf": [
                    {
                      "type": "integer",
                      "maximum": 100,
                      "minimum": 0
                    },
                    {
                      "type": "object",
                      "required": [
                        "dice",
                        "sides",
                        "bonus"
                      ],
                      "properties": {
                        "dice": {
                          "type": "integer",
                          "maximum": 10,
                          "minimum": 0
                        },
                        "bonus": {
                          "type": "integer",
                          "maximum": 100,
                          "minimum": 0
                        },
                        "sides": {
                          "anyOf": [
                            {
                              "type": "number",
                              "const": 3
                            },
                            {
                              "type": "number",
                              "const": 6
                            }
                          ]
                        }
                      }
                    }
                  ]
                },
                "criticalHit": {
                  "type": "integer",
                  "maximum": 6,
                  "minimum": 2
                },
                "devastating": {
                  "type": "boolean"
                },
                "damageReroll": {
                  "type": "boolean"
                },
                "criticalWound": {
                  "type": "integer",
                  "maximum": 6,
                  "minimum": 2
                }
              }
            },
            "ranged": {
              "type": "object",
              "properties": {
                "ap": {
                  "type": "integer",
                  "maximum": 10,
                  "minimum": -10
                },
                "skill": {
                  "type": "integer",
                  "maximum": 10,
                  "minimum": -10
                },
                "damage": {
                  "type": "integer",
                  "maximum": 10,
                  "minimum": -10
                },
                "lethal": {
                  "type": "boolean"
                },
                "attacks": {
                  "type": "integer",
                  "maximum": 10,
                  "minimum": -10
                },
                "strength": {
                  "type": "integer",
                  "maximum": 10,
                  "minimum": -10
                },
                "sustained": {
                  "anyOf": [
                    {
                      "type": "integer",
                      "maximum": 100,
                      "minimum": 0
                    },
                    {
                      "type": "object",
                      "required": [
                        "dice",
                        "sides",
                        "bonus"
                      ],
                      "properties": {
                        "dice": {
                          "type": "integer",
                          "maximum": 10,
                          "minimum": 0
                        },
                        "bonus": {
                          "type": "integer",
                          "maximum": 100,
                          "minimum": 0
                        },
                        "sides": {
                          "anyOf": [
                            {
                              "type": "number",
                              "const": 3
                            },
                            {
                              "type": "number",
                              "const": 6
                            }
                          ]
                        }
                      }
                    }
                  ]
                },
                "criticalHit": {
                  "type": "integer",
                  "maximum": 6,
                  "minimum": 2
                },
                "devastating": {
                  "type": "boolean"
                },
                "damageReroll": {
                  "type": "boolean"
                },
                "criticalWound": {
                  "type": "integer",
                  "maximum": 6,
                  "minimum": 2
                }
              }
            }
          }
        },
        "feelNoPain": {
          "anyOf": [
            {
              "type": "integer",
              "maximum": 6,
              "minimum": 2
            },
            {
              "type": "null"
            }
          ]
        }
      },
      "description": "Situational modifiers the simulator page offers, such as { \"all\": { \"cover\": true, \"hitModifier\": -1 } }, { \"melee\": { \"charged\": true } }, or { \"target\": { \"invulnerable\": 4 } }. commandReroll spends one Command Re-roll per phase on the first failed hit, wound, or save roll, or the first single-die Attacks roll below its average; compare with a run without it to judge the CP."
    },
    "weaponModes": {
      "type": "object",
      "description": "Weapon mode choices by key from a previous result, such as a frag or krak profile.",
      "propertyNames": {
        "type": "string",
        "maxLength": 400
      },
      "additionalProperties": {
        "type": "string",
        "maxLength": 200
      }
    }
  }
}
simulate_combat annotations
{
  "title": "Estimate combat between two units",
  "readOnlyHint": true,
  "openWorldHint": false,
  "idempotentHint": true,
  "destructiveHint": false
}

Prompts

2 advertised

answer_rules_question — Answer a game-rules question

Advertised by the server during the last successful anonymous check.

Search the verified reference and answer with source URLs without guessing.

question
No description (required)
faction
No description
explain_mission_matchup — Explain a mission matchup

Advertised by the server during the last successful anonymous check.

Resolve a force-disposition pairing and explain its mission, scoring, deployment, and terrain.

pack
No description (required)
yourDisposition
No description (required)
opponentDisposition
No description (required)

Resources

2 advertised

praetorium-guide — How Praetorium works

Advertised by the server during the last successful anonymous check.

Product capabilities, privacy boundaries, data trust model, and efficient agent workflow.

praetorium-guide URI
praetorium://guide

MIME type: text/markdown

reference-status — Praetorium reference status

Advertised by the server during the last successful anonymous check.

Active snapshot revisions and the available public reference catalogue.

reference-status URI
praetorium://reference-status

MIME type: application/json

90-day uptime

A lightweight connection check about every six hours, sampled on hosts with many listings. It shows the server answered, not that its tools work.

Too few checks for a percentage yet (1 of 1 answered).

  1. 2026-11-07: 1 of 1 checks answered

30-day availability

Aggregated from read-only remote checks; this is not a tool-execution or security guarantee.

Successful checks
1 of 1 (100%)
Average latency
2089 ms
95th percentile latency
2089 ms

Maintenance history

Public check and source-refresh events. Editorial and ownership records remain private.

  • · probe · passed · 2089 ms · metadata changed · 15 tool(s), 2 resource(s), 0 resource template(s), 2 prompt(s)

Connect from your client

Each snippet registers the same endpoint; pick the client you use.

This server is operated by the named third party. Listing and endpoint checks are not an endorsement or a security audit. Review the operator's permissions, terms, and data handling before connecting. How listings are checked and corrected.

Claude Code

Run this once in a terminal. It registers the remote server. Use --scope project to write .mcp.json for the repo.
Claude Code configuration
claude mcp add --transport http praetorium-mcp https://praetorium.gg/mcp

Codex

Run this once. Codex stores MCP servers in ~/.codex/config.toml (or .codex/config.toml in a trusted project).
Codex configuration
codex mcp add praetorium-mcp --url https://praetorium.gg/mcp

Cursor

Merge this server into .cursor/mcp.json in your project, then enable praetorium-mcp in your MCP settings.
Cursor configuration
{
  "mcpServers": {
    "praetorium-mcp": {
      "url": "https://praetorium.gg/mcp"
    }
  }
}

Cline

Merge this into cline_mcp_settings.json (Cline → MCP Servers → Configure).
Cline configuration
{
  "mcpServers": {
    "praetorium-mcp": {
      "type": "streamableHttp",
      "url": "https://praetorium.gg/mcp",
      "disabled": false
    }
  }
}

VS Code

Merge this server into .vscode/mcp.json. Use MCP: List Servers to start praetorium-mcp and inspect its tools.
VS Code configuration
{
  "servers": {
    "praetorium-mcp": {
      "type": "http",
      "url": "https://praetorium.gg/mcp"
    }
  }
}

Gemini CLI

Run this once. It writes .gemini/settings.json in the current project; pass --scope user for ~/.gemini/settings.json.
Gemini CLI configuration
gemini mcp add --transport http praetorium-mcp https://praetorium.gg/mcp

Claude Desktop

Open Claude Settings > Connectors > Add custom connector, enter this server URL and enable it for the conversation. This is a manual remote-connector handoff, not a desktop JSON configuration.
Claude Desktop configuration
https://praetorium.gg/mcp

Windsurf

Merge this into ~/.codeium/windsurf/mcp_config.json, then refresh MCP in Cascade. Windsurf remote servers use serverUrl, not url.
Windsurf configuration
{
  "mcpServers": {
    "praetorium-mcp": {
      "serverUrl": "https://praetorium.gg/mcp"
    }
  }
}

Let your agent find its tools

Find servers like Praetorium MCP from your agent. Add Koskamo once to search the index for endpoints, access requirements, and client setup. Public discovery needs no key.