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.
https://praetorium.gg/mcpWhat its tools do
15 tools, grouped by the hints the server advertises. Hints are self-declared, not verified behavior.
Read-only (11)
Can change data (4)
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
- 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
{
"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.
Tools
15 advertised
list_my_rosters — List my saved rosters
Lists the rosters saved to the signed-in Praetorium account. Requires mcp:read.
{
"type": "object",
"$schema": "http://json-schema.org/draft-07/schema#",
"properties": {}
}{
"title": "List my saved rosters",
"readOnlyHint": true,
"openWorldHint": false,
"idempotentHint": true,
"destructiveHint": false
}get_my_roster — Read my saved roster
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.
{
"type": "object",
"$schema": "http://json-schema.org/draft-07/schema#",
"required": [
"id"
],
"properties": {
"id": {
"type": "string",
"maxLength": 64,
"minLength": 1
}
}
}{
"title": "Read my saved roster",
"readOnlyHint": true,
"openWorldHint": false,
"idempotentHint": true,
"destructiveHint": false
}list_my_battles — List my battles
Lists up to 25 battles with a cursor for the next page. Requires mcp:read.
{
"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
}
}
}{
"title": "List my battles",
"readOnlyHint": true,
"openWorldHint": false,
"idempotentHint": true,
"destructiveHint": false
}get_my_battle — Read one of my battles
Returns the current seated view of a battle for the signed-in player. Requires mcp:read.
{
"type": "object",
"$schema": "http://json-schema.org/draft-07/schema#",
"required": [
"token"
],
"properties": {
"token": {
"type": "string",
"maxLength": 64,
"minLength": 1
}
}
}{
"title": "Read one of my battles",
"readOnlyHint": true,
"openWorldHint": false,
"idempotentHint": true,
"destructiveHint": false
}save_roster — Create or edit my roster
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.
{
"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
}
}
}{
"title": "Create or edit my roster",
"readOnlyHint": false,
"openWorldHint": true,
"idempotentHint": false,
"destructiveHint": true
}set_roster_visibility — Change my roster visibility
Changes the visibility of an owned roster. Requires mcp:write.
{
"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"
}
}
}{
"title": "Change my roster visibility",
"readOnlyHint": false,
"openWorldHint": true,
"idempotentHint": false,
"destructiveHint": true
}create_battle — Create a battle
Creates a battle with named player seats, using the same rules as the site. Requires mcp:write.
{
"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
}
}
}{
"title": "Create a battle",
"readOnlyHint": false,
"openWorldHint": true,
"idempotentHint": false,
"destructiveHint": true
}submit_battle_action — Record a battle action
Appends a legal battle command only when expectedSeq matches the current log. Requires mcp:write.
{
"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
}
}
}{
"title": "Record a battle action",
"readOnlyHint": false,
"openWorldHint": true,
"idempotentHint": false,
"destructiveHint": true
}search_reference — Search the Praetorium game reference
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.
{
"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
}
}
}{
"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
}{
"title": "Search the Praetorium game reference",
"readOnlyHint": true,
"openWorldHint": false,
"idempotentHint": true,
"destructiveHint": false
}get_reference — Read one Praetorium reference result
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.
{
"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."
}
}
}{
"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
}{
"title": "Read one Praetorium reference result",
"readOnlyHint": true,
"openWorldHint": false,
"idempotentHint": true,
"destructiveHint": false
}get_reference_record — Read structured Praetorium reference data
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.
{
"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."
}
}
}{
"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
}{
"title": "Read structured Praetorium reference data",
"readOnlyHint": true,
"openWorldHint": false,
"idempotentHint": true,
"destructiveHint": false
}list_factions — List factions in the Praetorium reference
Lists the factions that can be used to narrow reference searches.
{
"type": "object",
"$schema": "http://json-schema.org/draft-07/schema#",
"properties": {}
}{
"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
}{
"title": "List factions in the Praetorium reference",
"readOnlyHint": true,
"openWorldHint": false,
"idempotentHint": true,
"destructiveHint": false
}list_reference — List the Praetorium reference catalogue
Discovers available factions, mission packs, rule documents, reference kinds, and active source revisions.
{
"type": "object",
"$schema": "http://json-schema.org/draft-07/schema#",
"properties": {}
}{
"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
}{
"title": "List the Praetorium reference catalogue",
"readOnlyHint": true,
"openWorldHint": false,
"idempotentHint": true,
"destructiveHint": false
}list_units — List compact faction units for roster planning
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.
{
"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."
}
}
}{
"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
}{
"title": "List compact faction units for roster planning",
"readOnlyHint": true,
"openWorldHint": false,
"idempotentHint": true,
"destructiveHint": false
}simulate_combat — Estimate combat between two units
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.
{
"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
}
}
}
}{
"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
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
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
Product capabilities, privacy boundaries, data trust model, and efficient agent workflow.
praetorium://guidereference-status — Praetorium reference status
Active snapshot revisions and the available public reference catalogue.
praetorium://reference-status90-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.
- 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.
Claude Code
claude mcp add --transport http praetorium-mcp https://praetorium.gg/mcpCodex
codex mcp add praetorium-mcp --url https://praetorium.gg/mcpCursor
{
"mcpServers": {
"praetorium-mcp": {
"url": "https://praetorium.gg/mcp"
}
}
}Cline
{
"mcpServers": {
"praetorium-mcp": {
"type": "streamableHttp",
"url": "https://praetorium.gg/mcp",
"disabled": false
}
}
}VS Code
{
"servers": {
"praetorium-mcp": {
"type": "http",
"url": "https://praetorium.gg/mcp"
}
}
}Gemini CLI
gemini mcp add --transport http praetorium-mcp https://praetorium.gg/mcpClaude Desktop
https://praetorium.gg/mcpWindsurf
{
"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.