Skip to main content
Glama

Calculate

calculate
Read-onlyIdempotent

Run competitive Pokémon battle calculations: final stats, single-attack damage, matchups against multiple defenders, Speed benchmarks, or minimal EV spreads that meet survive, outspeed, and KO goals.

Instructions

Pokémon Champions battle calculation, dispatching on mode: "stats" for a final stat table, "damage" for a full single-attack simulation, "matchups" to test one attacker against many defenders, "speed" to place a Speed stat against a regulation roster, and "optimize_evs" to derive a minimal spread from goals (survive, outspeed, KO). Each mode carries the same documented fields the dedicated calc tools had. Read-only and offline; deterministic. Give one spread scale per member: evs (0-252 each, 510 total) or championsPoints (the Champions CP economy: 8 EVs = 1 CP, each stat 0-32, 66 CP total, e.g. 252 HP / 252 Atk / 4 SpD = 32 / 32 / 1 CP); giving both is rejected.

Input Schema

TableJSON Schema
NameRequiredDescriptionDefault
evsNo
ivsNo
itemNo
killNoAdd a KO goal: minimizes Atk or SpA so that even the lowest damage roll reaches the per-hit HP threshold.
modeYesWhich operation to run: "stats", "damage", "matchups", "speed", "optimize_evs".
moveNo
fieldNo
levelNo
boostsNoStat stages; only `spe` (-6..+6) is applied, e.g. { spe: 1 } for a +1 Speed stage.
detailNoHow much detail to return: "compact" (default) gives conclusions and the numbers needed to reason; "evidence" adds ranges, benchmarks and per-row detail; "debug" adds provenance and every intermediate. Ask for more only when the reasoning actually needs it — model context is the expensive resource.
natureNo
abilityNoAbility assumed active while solving, e.g. "Intimidate", "Protosynthesis".
speciesNo
surviveNoAdd a "always live this hit" goal: the search minimizes HP plus the relevant Defense EVs that keep the worst roll below max HP.
attackerNo
defenderNoThe defending Pokémon, same fields as `attacker`; its Defense/SpD, HP, typing, and ability drive the result.
maximizeNoStat that receives leftover EVs after the goals are met, capped at 252 (default spe); EVs are added in steps of 4.spe
outspeedNoAdd an outspeed goal: supply `target` or `speed` (one is required here, otherwise that goal errors).
defendersNo1-30 defender sets, each with the same fields as `attacker`; every entry is scored against the same attacker, move set, and field.
regulationNoRegulation Set name or id from `list_regulations` to compare against, e.g. "Regulation Set G"; omit to get the raw Speed only.
championsPointsNo

Schema Changelog

Changes observed during successful MCP inspections.

  1. Changed13 schema fields changedv8.0.4
    • changedInput schema / properties / attacker / anyOf
      Previous value: -[
      -  {
      -    "description": "The attacking Pokémon: species plus optional level, nature, IVs, EVs, item, ability, boosts, status, and current HP.",
      -    "properties": {
      -      "ability": {
      -        "description": "Ability name, e.g. \"Intimidate\", \"Protosynthesis\"; defaults to the species’ default ability.",
      -        "type": "string"
      -      },
      -      "abilityOn": {
      -        "description": "Force the ability on (true) or off (false), e.g. to compare Protosynthesis active vs not; omitted leaves it to the calc.",
      -        "type": "boolean"
      -      },
      -      "boosts": {
      -        "additionalProperties": {
      -          "type": "number"
      -        },
      -        "description": "Stat stages keyed by stat id (hp, atk, def, spa, spd, spe), each -6..+6; omitted stats are 0 (e.g. { atk: 2 } = +2 Attack).",
      -        "propertyNames": {
      -          "type": "string"
      -        },
      -        "type": "object"
      -      },
      -      "championsPoints": {
      -        "additionalProperties": {
      -          "type": "number"
      -        },
      -        "description": "Pokémon Champions stat points keyed by stat id (hp, atk, def, spa, spd, spe): whole numbers, each 0-32, totalling at most 66. This is the spread the game’s training screen takes, and an alternative to `evs` — give one or the other, not both. One point is worth 8 EVs, so a converted spread is trimmed from its largest stats to fit the 510 EV cap the calculator enforces.",
      -        "propertyNames": {
      -          "type": "string"
      -        },
      -        "type": "object"
      -      },
      -      "curHP": {
      -        "description": "Current HP when entering damaged, e.g. 120; defaults to full HP.",
      -        "type": "number"
      -      },
      -      "evs": {
      -        "additionalProperties": {
      -          "type": "number"
      -        },
      -        "description": "EVs keyed by stat id (hp, atk, def, spa, spd, spe), each 0-252 in steps of 4; omitted stats are 0, and a total above 510 is rejected.",
      -        "propertyNames": {
      -          "type": "string"
      -        },
      -        "type": "object"
      -      },
      -      "item": {
      -        "description": "Held item name, e.g. \"Choice Band\", \"Assault Vest\", \"Leftovers\"; the calc applies its damage, Speed, or bulk effect.",
      -        "type": "string"
      -      },
      -      "ivs": {
      -        "additionalProperties": {
      -          "type": "number"
      -        },
      -        "description": "IVs keyed by stat id (hp, atk, def, spa, spd, spe), each 0-31; omitted stats default to 31.",
      -        "propertyNames": {
      -          "type": "string"
      -        },
      -        "type": "object"
      -      },
      -      "level": {
      -        "description": "Level 1-100; defaults to 100 in the damage tools and 50 in the stat/speed tools.",
      -        "maximum": 100,
      -        "minimum": 1,
      -        "type": "integer"
      -      },
      -      "moves": {
      -        "description": "Moveset names, e.g. [\"Earthquake\", \"Dragon Claw\"]; used by `calculate_matchups` to pick the hardest-hitting move per defender.",
      -        "items": {
      -          "type": "string"
      -        },
      -        "type": "array"
      -      },
      -      "nature": {
      -        "description": "Nature name, e.g. \"Jolly\", \"Modest\", \"Adamant\"; defaults to Serious (neutral) when omitted.",
      -        "type": "string"
      -      },
      -      "species": {
      -        "description": "Species or form name, e.g. \"Garchomp\", \"Ogerpon-Wellspring\".",
      -        "type": "string"
      -      },
      -      "status": {
      -        "description": "Pre-existing status such as \"brn\", \"par\", or \"tox\"; burn halves physical damage, paralysis cuts Speed.",
      -        "type": "string"
      -      }
      -    },
      -    "required": [
      -      "species"
      -    ],
      -    "type": "object"
      -  },
      -  {
      -    "description": "The single attacking Pokémon; set `moves` to let the tool choose the best move against each defender.",
      -    "properties": {
      -      "ability": {
      -        "description": "Ability name, e.g. \"Intimidate\", \"Protosynthesis\"; defaults to the species’ default ability.",
      -        "type": "string"
      -      },
      -      "abilityOn": {
      -        "description": "Force the ability on (true) or off (false), e.g. to compare Protosynthesis active vs not; omitted leaves it to the calc.",
      -        "type": "boolean"
      -      },
      -      "boosts": {
      -        "additionalProperties": {
      -          "type": "number"
      -        },
      -        "description": "Stat stages keyed by stat id (hp, atk, def, spa, spd, spe), each -6..+6; omitted stats are 0 (e.g. { atk: 2 } = +2 Attack).",
      -        "propertyNames": {
      -          "type": "string"
      -        },
      -        "type": "object"
      -      },
      -      "championsPoints": {
      -        "additionalProperties": {
      -          "type": "number"
      -        },
      -        "description": "Pokémon Champions stat points keyed by stat id (hp, atk, def, spa, spd, spe): whole numbers, each 0-32, totalling at most 66. This is the spread the game’s training screen takes, and an alternative to `evs` — give one or the other, not both. One point is worth 8 EVs, so a converted spread is trimmed from its largest stats to fit the 510 EV cap the calculator enforces.",
      -        "propertyNames": {
      -          "type": "string"
      -        },
      -        "type": "object"
      -      },
      -      "curHP": {
      -        "description": "Current HP when entering damaged, e.g. 120; defaults to full HP.",
      -        "type": "number"
      -      },
      -      "evs": {
      -        "additionalProperties": {
      -          "type": "number"
      -        },
      -        "description": "EVs keyed by stat id (hp, atk, def, spa, spd, spe), each 0-252 in steps of 4; omitted stats are 0, and a total above 510 is rejected.",
      -        "propertyNames": {
      -          "type": "string"
      -        },
      -        "type": "object"
      -      },
      -      "item": {
      -        "description": "Held item name, e.g. \"Choice Band\", \"Assault Vest\", \"Leftovers\"; the calc applies its damage, Speed, or bulk effect.",
      -        "type": "string"
      -      },
      -      "ivs": {
      -        "additionalProperties": {
      -          "type": "number"
      -        },
      -        "description": "IVs keyed by stat id (hp, atk, def, spa, spd, spe), each 0-31; omitted stats default to 31.",
      -        "propertyNames": {
      -          "type": "string"
      -        },
      -        "type": "object"
      -      },
      -      "level": {
      -        "description": "Level 1-100; defaults to 100 in the damage tools and 50 in the stat/speed tools.",
      -        "maximum": 100,
      -        "minimum": 1,
      -        "type": "integer"
      -      },
      -      "moves": {
      -        "description": "Moveset names, e.g. [\"Earthquake\", \"Dragon Claw\"]; used by `calculate_matchups` to pick the hardest-hitting move per defender.",
      -        "items": {
      -          "type": "string"
      -        },
      -        "type": "array"
      -      },
      -      "nature": {
      -        "description": "Nature name, e.g. \"Jolly\", \"Modest\", \"Adamant\"; defaults to Serious (neutral) when omitted.",
      -        "type": "string"
      -      },
      -      "species": {
      -        "description": "Species or form name, e.g. \"Garchomp\", \"Ogerpon-Wellspring\".",
      -        "type": "string"
      -      },
      -      "status": {
      -        "description": "Pre-existing status such as \"brn\", \"par\", or \"tox\"; burn halves physical damage, paralysis cuts Speed.",
      -        "type": "string"
      -      }
      -    },
      -    "required": [
      -      "species"
      -    ],
      -    "type": "object"
      -  }
      -]New value: +[
      +  {
      +    "description": "The attacking Pokémon: species plus optional level, nature, IVs, EVs, item, ability, boosts, status, and current HP.",
      +    "properties": {
      +      "ability": {
      +        "description": "Ability name, e.g. \"Intimidate\", \"Protosynthesis\"; defaults to the species’ default ability.",
      +        "type": "string"
      +      },
      +      "abilityOn": {
      +        "description": "Force the ability on (true) or off (false), e.g. to compare Protosynthesis active vs not; omitted leaves it to the calc.",
      +        "type": "boolean"
      +      },
      +      "boosts": {
      +        "additionalProperties": {
      +          "type": "number"
      +        },
      +        "description": "Stat stages keyed by stat id (hp, atk, def, spa, spd, spe), each -6..+6; omitted stats are 0 (e.g. { atk: 2 } = +2 Attack).",
      +        "propertyNames": {
      +          "type": "string"
      +        },
      +        "type": "object"
      +      },
      +      "championsPoints": {
      +        "additionalProperties": {
      +          "type": "number"
      +        },
      +        "description": "Pokémon Champions stat points keyed by stat id (hp, atk, def, spa, spd, spe): whole numbers, each 0-32, totalling at most 66. This is the spread the game’s training screen takes, and an alternative to `evs` — give one or the other, not both. The CP economy is 8 EVs = 1 CP, so a 252 HP / 252 Atk / 4 SpD spread is 32 / 32 / 1 CP (65 of 66); a converted spread is trimmed from its largest stats to fit the 510 EV cap the calculator enforces.",
      +        "propertyNames": {
      +          "type": "string"
      +        },
      +        "type": "object"
      +      },
      +      "curHP": {
      +        "description": "Current HP when entering damaged, e.g. 120; defaults to full HP.",
      +        "type": "number"
      +      },
      +      "evs": {
      +        "additionalProperties": {
      +          "type": "number"
      +        },
      +        "description": "EVs keyed by stat id (hp, atk, def, spa, spd, spe), each 0-252 in steps of 4; omitted stats are 0, and a total above 510 is rejected. Give this or `championsPoints` (the Champions 0-32 scale, 8 EVs = 1 CP, 66 total), never both.",
      +        "propertyNames": {
      +          "type": "string"
      +        },
      +        "type": "object"
      +      },
      +      "item": {
      +        "description": "Held item name, e.g. \"Choice Band\", \"Assault Vest\", \"Leftovers\"; the calc applies its damage, Speed, or bulk effect.",
      +        "type": "string"
      +      },
      +      "ivs": {
      +        "additionalProperties": {
      +          "type": "number"
      +        },
      +        "description": "IVs keyed by stat id (hp, atk, def, spa, spd, spe), each 0-31; omitted stats default to 31.",
      +        "propertyNames": {
      +          "type": "string"
      +        },
      +        "type": "object"
      +      },
      +      "level": {
      +        "description": "Level 1-100; defaults to 100 in the damage tools and 50 in the stat/speed tools.",
      +        "maximum": 100,
      +        "minimum": 1,
      +        "type": "integer"
      +      },
      +      "moves": {
      +        "description": "Moveset names, e.g. [\"Earthquake\", \"Dragon Claw\"]; used by `calculate_matchups` to pick the hardest-hitting move per defender.",
      +        "items": {
      +          "type": "string"
      +        },
      +        "type": "array"
      +      },
      +      "nature": {
      +        "description": "Nature name, e.g. \"Jolly\", \"Modest\", \"Adamant\"; defaults to Serious (neutral) when omitted.",
      +        "type": "string"
      +      },
      +      "species": {
      +        "description": "Species or form name, e.g. \"Garchomp\", \"Ogerpon-Wellspring\".",
      +        "type": "string"
      +      },
      +      "status": {
      +        "description": "Pre-existing status such as \"brn\", \"par\", or \"tox\"; burn halves physical damage, paralysis cuts Speed.",
      +        "type": "string"
      +      }
      +    },
      +    "required": [
      +      "species"
      +    ],
      +    "type": "object"
      +  },
      +  {
      +    "description": "The single attacking Pokémon; set `moves` to let the tool choose the best move against each defender.",
      +    "properties": {
      +      "ability": {
      +        "description": "Ability name, e.g. \"Intimidate\", \"Protosynthesis\"; defaults to the species’ default ability.",
      +        "type": "string"
      +      },
      +      "abilityOn": {
      +        "description": "Force the ability on (true) or off (false), e.g. to compare Protosynthesis active vs not; omitted leaves it to the calc.",
      +        "type": "boolean"
      +      },
      +      "boosts": {
      +        "additionalProperties": {
      +          "type": "number"
      +        },
      +        "description": "Stat stages keyed by stat id (hp, atk, def, spa, spd, spe), each -6..+6; omitted stats are 0 (e.g. { atk: 2 } = +2 Attack).",
      +        "propertyNames": {
      +          "type": "string"
      +        },
      +        "type": "object"
      +      },
      +      "championsPoints": {
      +        "additionalProperties": {
      +          "type": "number"
      +        },
      +        "description": "Pokémon Champions stat points keyed by stat id (hp, atk, def, spa, spd, spe): whole numbers, each 0-32, totalling at most 66. This is the spread the game’s training screen takes, and an alternative to `evs` — give one or the other, not both. The CP economy is 8 EVs = 1 CP, so a 252 HP / 252 Atk / 4 SpD spread is 32 / 32 / 1 CP (65 of 66); a converted spread is trimmed from its largest stats to fit the 510 EV cap the calculator enforces.",
      +        "propertyNames": {
      +          "type": "string"
      +        },
      +        "type": "object"
      +      },
      +      "curHP": {
      +        "description": "Current HP when entering damaged, e.g. 120; defaults to full HP.",
      +        "type": "number"
      +      },
      +      "evs": {
      +        "additionalProperties": {
      +          "type": "number"
      +        },
      +        "description": "EVs keyed by stat id (hp, atk, def, spa, spd, spe), each 0-252 in steps of 4; omitted stats are 0, and a total above 510 is rejected. Give this or `championsPoints` (the Champions 0-32 scale, 8 EVs = 1 CP, 66 total), never both.",
      +        "propertyNames": {
      +          "type": "string"
      +        },
      +        "type": "object"
      +      },
      +      "item": {
      +        "description": "Held item name, e.g. \"Choice Band\", \"Assault Vest\", \"Leftovers\"; the calc applies its damage, Speed, or bulk effect.",
      +        "type": "string"
      +      },
      +      "ivs": {
      +        "additionalProperties": {
      +          "type": "number"
      +        },
      +        "description": "IVs keyed by stat id (hp, atk, def, spa, spd, spe), each 0-31; omitted stats default to 31.",
      +        "propertyNames": {
      +          "type": "string"
      +        },
      +        "type": "object"
      +      },
      +      "level": {
      +        "description": "Level 1-100; defaults to 100 in the damage tools and 50 in the stat/speed tools.",
      +        "maximum": 100,
      +        "minimum": 1,
      +        "type": "integer"
      +      },
      +      "moves": {
      +        "description": "Moveset names, e.g. [\"Earthquake\", \"Dragon Claw\"]; used by `calculate_matchups` to pick the hardest-hitting move per defender.",
      +        "items": {
      +          "type": "string"
      +        },
      +        "type": "array"
      +      },
      +      "nature": {
      +        "description": "Nature name, e.g. \"Jolly\", \"Modest\", \"Adamant\"; defaults to Serious (neutral) when omitted.",
      +        "type": "string"
      +      },
      +      "species": {
      +        "description": "Species or form name, e.g. \"Garchomp\", \"Ogerpon-Wellspring\".",
      +        "type": "string"
      +      },
      +      "status": {
      +        "description": "Pre-existing status such as \"brn\", \"par\", or \"tox\"; burn halves physical damage, paralysis cuts Speed.",
      +        "type": "string"
      +      }
      +    },
      +    "required": [
      +      "species"
      +    ],
      +    "type": "object"
      +  }
      +]
    • changedInput schema / properties / championsPoints / anyOf
      Previous value: -[
      -  {
      -    "additionalProperties": {
      -      "type": "number"
      -    },
      -    "description": "Pokémon Champions stat points keyed by stat id (hp, atk, def, spa, spd, spe): whole numbers, each 0-32, totalling at most 66. This is the spread the game’s training screen takes, and an alternative to `evs` — give one or the other, not both. One point is worth 8 EVs, so a converted spread is trimmed from its largest stats to fit the 510 EV cap the calculator enforces.",
      -    "propertyNames": {
      -      "type": "string"
      -    },
      -    "type": "object"
      -  },
      -  {
      -    "additionalProperties": {
      -      "type": "number"
      -    },
      -    "description": "The same Speed investment in Pokémon Champions stat points, e.g. { spe: 32 } for a maxed Speed stat; give this or `evs`, not both.",
      -    "propertyNames": {
      -      "type": "string"
      -    },
      -    "type": "object"
      -  }
      -]New value: +[
      +  {
      +    "additionalProperties": {
      +      "type": "number"
      +    },
      +    "description": "Pokémon Champions stat points keyed by stat id (hp, atk, def, spa, spd, spe): whole numbers, each 0-32, totalling at most 66. This is the spread the game’s training screen takes, and an alternative to `evs` — give one or the other, not both. The CP economy is 8 EVs = 1 CP, so a 252 HP / 252 Atk / 4 SpD spread is 32 / 32 / 1 CP (65 of 66); a converted spread is trimmed from its largest stats to fit the 510 EV cap the calculator enforces.",
      +    "propertyNames": {
      +      "type": "string"
      +    },
      +    "type": "object"
      +  },
      +  {
      +    "additionalProperties": {
      +      "type": "number"
      +    },
      +    "description": "The same Speed investment in Pokémon Champions stat points, e.g. { spe: 32 } for a maxed Speed stat; give this or `evs`, never both; 8 EVs = 1 CP.",
      +    "propertyNames": {
      +      "type": "string"
      +    },
      +    "type": "object"
      +  }
      +]
    • changedInput schema / properties / defender / properties / championsPoints / description
      Previous value: -"Pokémon Champions stat points keyed by stat id (hp, atk, def, spa, spd, spe): whole numbers, each 0-32, totalling at most 66. This is the spread the game’s training screen takes, and an alternative to `evs` — give one or the other, not both. One point is worth 8 EVs, so a converted spread is trimmed from its largest stats to fit the 510 EV cap the calculator enforces."New value: +"Pokémon Champions stat points keyed by stat id (hp, atk, def, spa, spd, spe): whole numbers, each 0-32, totalling at most 66. This is the spread the game’s training screen takes, and an alternative to `evs` — give one or the other, not both. The CP economy is 8 EVs = 1 CP, so a 252 HP / 252 Atk / 4 SpD spread is 32 / 32 / 1 CP (65 of 66); a converted spread is trimmed from its largest stats to fit the 510 EV cap the calculator enforces."
    • changedInput schema / properties / defender / properties / evs / description
      Previous value: -"EVs keyed by stat id (hp, atk, def, spa, spd, spe), each 0-252 in steps of 4; omitted stats are 0, and a total above 510 is rejected."New value: +"EVs keyed by stat id (hp, atk, def, spa, spd, spe), each 0-252 in steps of 4; omitted stats are 0, and a total above 510 is rejected. Give this or `championsPoints` (the Champions 0-32 scale, 8 EVs = 1 CP, 66 total), never both."
    • changedInput schema / properties / defenders / items / properties / championsPoints / description
      Previous value: -"Pokémon Champions stat points keyed by stat id (hp, atk, def, spa, spd, spe): whole numbers, each 0-32, totalling at most 66. This is the spread the game’s training screen takes, and an alternative to `evs` — give one or the other, not both. One point is worth 8 EVs, so a converted spread is trimmed from its largest stats to fit the 510 EV cap the calculator enforces."New value: +"Pokémon Champions stat points keyed by stat id (hp, atk, def, spa, spd, spe): whole numbers, each 0-32, totalling at most 66. This is the spread the game’s training screen takes, and an alternative to `evs` — give one or the other, not both. The CP economy is 8 EVs = 1 CP, so a 252 HP / 252 Atk / 4 SpD spread is 32 / 32 / 1 CP (65 of 66); a converted spread is trimmed from its largest stats to fit the 510 EV cap the calculator enforces."
    • changedInput schema / properties / defenders / items / properties / evs / description
      Previous value: -"EVs keyed by stat id (hp, atk, def, spa, spd, spe), each 0-252 in steps of 4; omitted stats are 0, and a total above 510 is rejected."New value: +"EVs keyed by stat id (hp, atk, def, spa, spd, spe), each 0-252 in steps of 4; omitted stats are 0, and a total above 510 is rejected. Give this or `championsPoints` (the Champions 0-32 scale, 8 EVs = 1 CP, 66 total), never both."
    • changedInput schema / properties / evs / anyOf
      Previous value: -[
      -  {
      -    "additionalProperties": {
      -      "type": "number"
      -    },
      -    "description": "EVs keyed by stat id (hp, atk, def, spa, spd, spe), each 0-252 in steps of 4; omitted stats are 0, and a total above 510 is rejected.",
      -    "propertyNames": {
      -      "type": "string"
      -    },
      -    "type": "object"
      -  },
      -  {
      -    "additionalProperties": {
      -      "type": "number"
      -    },
      -    "description": "EVs keyed by stat id; only `spe` (0-252) changes the result, e.g. { spe: 252 }.",
      -    "propertyNames": {
      -      "type": "string"
      -    },
      -    "type": "object"
      -  }
      -]New value: +[
      +  {
      +    "additionalProperties": {
      +      "type": "number"
      +    },
      +    "description": "EVs keyed by stat id (hp, atk, def, spa, spd, spe), each 0-252 in steps of 4; omitted stats are 0, and a total above 510 is rejected. Give this or `championsPoints` (the Champions 0-32 scale, 8 EVs = 1 CP, 66 total), never both.",
      +    "propertyNames": {
      +      "type": "string"
      +    },
      +    "type": "object"
      +  },
      +  {
      +    "additionalProperties": {
      +      "type": "number"
      +    },
      +    "description": "EVs keyed by stat id; only `spe` (0-252) changes the result, e.g. { spe: 252 }.",
      +    "propertyNames": {
      +      "type": "string"
      +    },
      +    "type": "object"
      +  }
      +]
    • changedInput schema / properties / kill / properties / target / properties / championsPoints / description
      Previous value: -"Pokémon Champions stat points keyed by stat id (hp, atk, def, spa, spd, spe): whole numbers, each 0-32, totalling at most 66. This is the spread the game’s training screen takes, and an alternative to `evs` — give one or the other, not both. One point is worth 8 EVs, so a converted spread is trimmed from its largest stats to fit the 510 EV cap the calculator enforces."New value: +"Pokémon Champions stat points keyed by stat id (hp, atk, def, spa, spd, spe): whole numbers, each 0-32, totalling at most 66. This is the spread the game’s training screen takes, and an alternative to `evs` — give one or the other, not both. The CP economy is 8 EVs = 1 CP, so a 252 HP / 252 Atk / 4 SpD spread is 32 / 32 / 1 CP (65 of 66); a converted spread is trimmed from its largest stats to fit the 510 EV cap the calculator enforces."
    • changedInput schema / properties / kill / properties / target / properties / evs / description
      Previous value: -"EVs keyed by stat id (hp, atk, def, spa, spd, spe), each 0-252 in steps of 4; omitted stats are 0, and a total above 510 is rejected."New value: +"EVs keyed by stat id (hp, atk, def, spa, spd, spe), each 0-252 in steps of 4; omitted stats are 0, and a total above 510 is rejected. Give this or `championsPoints` (the Champions 0-32 scale, 8 EVs = 1 CP, 66 total), never both."
    • changedInput schema / properties / outspeed / properties / target / properties / championsPoints / description
      Previous value: -"Pokémon Champions stat points keyed by stat id (hp, atk, def, spa, spd, spe): whole numbers, each 0-32, totalling at most 66. This is the spread the game’s training screen takes, and an alternative to `evs` — give one or the other, not both. One point is worth 8 EVs, so a converted spread is trimmed from its largest stats to fit the 510 EV cap the calculator enforces."New value: +"Pokémon Champions stat points keyed by stat id (hp, atk, def, spa, spd, spe): whole numbers, each 0-32, totalling at most 66. This is the spread the game’s training screen takes, and an alternative to `evs` — give one or the other, not both. The CP economy is 8 EVs = 1 CP, so a 252 HP / 252 Atk / 4 SpD spread is 32 / 32 / 1 CP (65 of 66); a converted spread is trimmed from its largest stats to fit the 510 EV cap the calculator enforces."
    • changedInput schema / properties / outspeed / properties / target / properties / evs / description
      Previous value: -"EVs keyed by stat id (hp, atk, def, spa, spd, spe), each 0-252 in steps of 4; omitted stats are 0, and a total above 510 is rejected."New value: +"EVs keyed by stat id (hp, atk, def, spa, spd, spe), each 0-252 in steps of 4; omitted stats are 0, and a total above 510 is rejected. Give this or `championsPoints` (the Champions 0-32 scale, 8 EVs = 1 CP, 66 total), never both."
    • changedInput schema / properties / survive / properties / attacker / properties / championsPoints / description
      Previous value: -"Pokémon Champions stat points keyed by stat id (hp, atk, def, spa, spd, spe): whole numbers, each 0-32, totalling at most 66. This is the spread the game’s training screen takes, and an alternative to `evs` — give one or the other, not both. One point is worth 8 EVs, so a converted spread is trimmed from its largest stats to fit the 510 EV cap the calculator enforces."New value: +"Pokémon Champions stat points keyed by stat id (hp, atk, def, spa, spd, spe): whole numbers, each 0-32, totalling at most 66. This is the spread the game’s training screen takes, and an alternative to `evs` — give one or the other, not both. The CP economy is 8 EVs = 1 CP, so a 252 HP / 252 Atk / 4 SpD spread is 32 / 32 / 1 CP (65 of 66); a converted spread is trimmed from its largest stats to fit the 510 EV cap the calculator enforces."
    • changedInput schema / properties / survive / properties / attacker / properties / evs / description
      Previous value: -"EVs keyed by stat id (hp, atk, def, spa, spd, spe), each 0-252 in steps of 4; omitted stats are 0, and a total above 510 is rejected."New value: +"EVs keyed by stat id (hp, atk, def, spa, spd, spe), each 0-252 in steps of 4; omitted stats are 0, and a total above 510 is rejected. Give this or `championsPoints` (the Champions 0-32 scale, 8 EVs = 1 CP, 66 total), never both."
  2. Changed23 schema fields changedv8.0.2
    • addedInput schema / $schema
      Added value: +"http://json-schema.org/draft-07/schema#"
    • addedInput schema / properties / ability
      Added value: +{
      +  "description": "Ability assumed active while solving, e.g. \"Intimidate\", \"Protosynthesis\".",
      +  "type": "string"
      +}
    • addedInput schema / properties / attacker
      Added value: +{
      +  "anyOf": [
      +    {
      +      "description": "The attacking Pokémon: species plus optional level, nature, IVs, EVs, item, ability, boosts, status, and current HP.",
      +      "properties": {
      +        "ability": {
      +          "description": "Ability name, e.g. \"Intimidate\", \"Protosynthesis\"; defaults to the species’ default ability.",
      +          "type": "string"
      +        },
      +        "abilityOn": {
      +          "description": "Force the ability on (true) or off (false), e.g. to compare Protosynthesis active vs not; omitted leaves it to the calc.",
      +          "type": "boolean"
      +        },
      +        "boosts": {
      +          "additionalProperties": {
      +            "type": "number"
      +          },
      +          "description": "Stat stages keyed by stat id (hp, atk, def, spa, spd, spe), each -6..+6; omitted stats are 0 (e.g. { atk: 2 } = +2 Attack).",
      +          "propertyNames": {
      +            "type": "string"
      +          },
      +          "type": "object"
      +        },
      +        "championsPoints": {
      +          "additionalProperties": {
      +            "type": "number"
      +          },
      +          "description": "Pokémon Champions stat points keyed by stat id (hp, atk, def, spa, spd, spe): whole numbers, each 0-32, totalling at most 66. This is the spread the game’s training screen takes, and an alternative to `evs` — give one or the other, not both. One point is worth 8 EVs, so a converted spread is trimmed from its largest stats to fit the 510 EV cap the calculator enforces.",
      +          "propertyNames": {
      +            "type": "string"
      +          },
      +          "type": "object"
      +        },
      +        "curHP": {
      +          "description": "Current HP when entering damaged, e.g. 120; defaults to full HP.",
      +          "type": "number"
      +        },
      +        "evs": {
      +          "additionalProperties": {
      +            "type": "number"
      +          },
      +          "description": "EVs keyed by stat id (hp, atk, def, spa, spd, spe), each 0-252 in steps of 4; omitted stats are 0, and a total above 510 is rejected.",
      +          "propertyNames": {
      +            "type": "string"
      +          },
      +          "type": "object"
      +        },
      +        "item": {
      +          "description": "Held item name, e.g. \"Choice Band\", \"Assault Vest\", \"Leftovers\"; the calc applies its damage, Speed, or bulk effect.",
      +          "type": "string"
      +        },
      +        "ivs": {
      +          "additionalProperties": {
      +            "type": "number"
      +          },
      +          "description": "IVs keyed by stat id (hp, atk, def, spa, spd, spe), each 0-31; omitted stats default to 31.",
      +          "propertyNames": {
      +            "type": "string"
      +          },
      +          "type": "object"
      +        },
      +        "level": {
      +          "description": "Level 1-100; defaults to 100 in the damage tools and 50 in the stat/speed tools.",
      +          "maximum": 100,
      +          "minimum": 1,
      +          "type": "integer"
      +        },
      +        "moves": {
      +          "description": "Moveset names, e.g. [\"Earthquake\", \"Dragon Claw\"]; used by `calculate_matchups` to pick the hardest-hitting move per defender.",
      +          "items": {
      +            "type": "string"
      +          },
      +          "type": "array"
      +        },
      +        "nature": {
      +          "description": "Nature name, e.g. \"Jolly\", \"Modest\", \"Adamant\"; defaults to Serious (neutral) when omitted.",
      +          "type": "string"
      +        },
      +        "species": {
      +          "description": "Species or form name, e.g. \"Garchomp\", \"Ogerpon-Wellspring\".",
      +          "type": "string"
      +        },
      +        "status": {
      +          "description": "Pre-existing status such as \"brn\", \"par\", or \"tox\"; burn halves physical damage, paralysis cuts Speed.",
      +          "type": "string"
      +        }
      +      },
      +      "required": [
      +        "species"
      +      ],
      +      "type": "object"
      +    },
      +    {
      +      "description": "The single attacking Pokémon; set `moves` to let the tool choose the best move against each defender.",
      +      "properties": {
      +        "ability": {
      +          "description": "Ability name, e.g. \"Intimidate\", \"Protosynthesis\"; defaults to the species’ default ability.",
      +          "type": "string"
      +        },
      +        "abilityOn": {
      +          "description": "Force the ability on (true) or off (false), e.g. to compare Protosynthesis active vs not; omitted leaves it to the calc.",
      +          "type": "boolean"
      +        },
      +        "boosts": {
      +          "additionalProperties": {
      +            "type": "number"
      +          },
      +          "description": "Stat stages keyed by stat id (hp, atk, def, spa, spd, spe), each -6..+6; omitted stats are 0 (e.g. { atk: 2 } = +2 Attack).",
      +          "propertyNames": {
      +            "type": "string"
      +          },
      +          "type": "object"
      +        },
      +        "championsPoints": {
      +          "additionalProperties": {
      +            "type": "number"
      +          },
      +          "description": "Pokémon Champions stat points keyed by stat id (hp, atk, def, spa, spd, spe): whole numbers, each 0-32, totalling at most 66. This is the spread the game’s training screen takes, and an alternative to `evs` — give one or the other, not both. One point is worth 8 EVs, so a converted spread is trimmed from its largest stats to fit the 510 EV cap the calculator enforces.",
      +          "propertyNames": {
      +            "type": "string"
      +          },
      +          "type": "object"
      +        },
      +        "curHP": {
      +          "description": "Current HP when entering damaged, e.g. 120; defaults to full HP.",
      +          "type": "number"
      +        },
      +        "evs": {
      +          "additionalProperties": {
      +            "type": "number"
      +          },
      +          "description": "EVs keyed by stat id (hp, atk, def, spa, spd, spe), each 0-252 in steps of 4; omitted stats are 0, and a total above 510 is rejected.",
      +          "propertyNames": {
      +            "type": "string"
      +          },
      +          "type": "object"
      +        },
      +        "item": {
      +          "description": "Held item name, e.g. \"Choice Band\", \"Assault Vest\", \"Leftovers\"; the calc applies its damage, Speed, or bulk effect.",
      +          "type": "string"
      +        },
      +        "ivs": {
      +          "additionalProperties": {
      +            "type": "number"
      +          },
      +          "description": "IVs keyed by stat id (hp, atk, def, spa, spd, spe), each 0-31; omitted stats default to 31.",
      +          "propertyNames": {
      +            "type": "string"
      +          },
      +          "type": "object"
      +        },
      +        "level": {
      +          "description": "Level 1-100; defaults to 100 in the damage tools and 50 in the stat/speed tools.",
      +          "maximum": 100,
      +          "minimum": 1,
      +          "type": "integer"
      +        },
      +        "moves": {
      +          "description": "Moveset names, e.g. [\"Earthquake\", \"Dragon Claw\"]; used by `calculate_matchups` to pick the hardest-hitting move per defender.",
      +          "items": {
      +            "type": "string"
      +          },
      +          "type": "array"
      +        },
      +        "nature": {
      +          "description": "Nature name, e.g. \"Jolly\", \"Modest\", \"Adamant\"; defaults to Serious (neutral) when omitted.",
      +          "type": "string"
      +        },
      +        "species": {
      +          "description": "Species or form name, e.g. \"Garchomp\", \"Ogerpon-Wellspring\".",
      +          "type": "string"
      +        },
      +        "status": {
      +          "description": "Pre-existing status such as \"brn\", \"par\", or \"tox\"; burn halves physical damage, paralysis cuts Speed.",
      +          "type": "string"
      +        }
      +      },
      +      "required": [
      +        "species"
      +      ],
      +      "type": "object"
      +    }
      +  ]
      +}
    • addedInput schema / properties / boosts
      Added value: +{
      +  "additionalProperties": {
      +    "type": "number"
      +  },
      +  "description": "Stat stages; only `spe` (-6..+6) is applied, e.g. { spe: 1 } for a +1 Speed stage.",
      +  "propertyNames": {
      +    "type": "string"
      +  },
      +  "type": "object"
      +}
    • addedInput schema / properties / championsPoints
      Added value: +{
      +  "anyOf": [
      +    {
      +      "additionalProperties": {
      +        "type": "number"
      +      },
      +      "description": "Pokémon Champions stat points keyed by stat id (hp, atk, def, spa, spd, spe): whole numbers, each 0-32, totalling at most 66. This is the spread the game’s training screen takes, and an alternative to `evs` — give one or the other, not both. One point is worth 8 EVs, so a converted spread is trimmed from its largest stats to fit the 510 EV cap the calculator enforces.",
      +      "propertyNames": {
      +        "type": "string"
      +      },
      +      "type": "object"
      +    },
      +    {
      +      "additionalProperties": {
      +        "type": "number"
      +      },
      +      "description": "The same Speed investment in Pokémon Champions stat points, e.g. { spe: 32 } for a maxed Speed stat; give this or `evs`, not both.",
      +      "propertyNames": {
      +        "type": "string"
      +      },
      +      "type": "object"
      +    }
      +  ]
      +}
    • addedInput schema / properties / defender
      Added value: +{
      +  "description": "The defending Pokémon, same fields as `attacker`; its Defense/SpD, HP, typing, and ability drive the result.",
      +  "properties": {
      +    "ability": {
      +      "description": "Ability name, e.g. \"Intimidate\", \"Protosynthesis\"; defaults to the species’ default ability.",
      +      "type": "string"
      +    },
      +    "abilityOn": {
      +      "description": "Force the ability on (true) or off (false), e.g. to compare Protosynthesis active vs not; omitted leaves it to the calc.",
      +      "type": "boolean"
      +    },
      +    "boosts": {
      +      "additionalProperties": {
      +        "type": "number"
      +      },
      +      "description": "Stat stages keyed by stat id (hp, atk, def, spa, spd, spe), each -6..+6; omitted stats are 0 (e.g. { atk: 2 } = +2 Attack).",
      +      "propertyNames": {
      +        "type": "string"
      +      },
      +      "type": "object"
      +    },
      +    "championsPoints": {
      +      "additionalProperties": {
      +        "type": "number"
      +      },
      +      "description": "Pokémon Champions stat points keyed by stat id (hp, atk, def, spa, spd, spe): whole numbers, each 0-32, totalling at most 66. This is the spread the game’s training screen takes, and an alternative to `evs` — give one or the other, not both. One point is worth 8 EVs, so a converted spread is trimmed from its largest stats to fit the 510 EV cap the calculator enforces.",
      +      "propertyNames": {
      +        "type": "string"
      +      },
      +      "type": "object"
      +    },
      +    "curHP": {
      +      "description": "Current HP when entering damaged, e.g. 120; defaults to full HP.",
      +      "type": "number"
      +    },
      +    "evs": {
      +      "additionalProperties": {
      +        "type": "number"
      +      },
      +      "description": "EVs keyed by stat id (hp, atk, def, spa, spd, spe), each 0-252 in steps of 4; omitted stats are 0, and a total above 510 is rejected.",
      +      "propertyNames": {
      +        "type": "string"
      +      },
      +      "type": "object"
      +    },
      +    "item": {
      +      "description": "Held item name, e.g. \"Choice Band\", \"Assault Vest\", \"Leftovers\"; the calc applies its damage, Speed, or bulk effect.",
      +      "type": "string"
      +    },
      +    "ivs": {
      +      "additionalProperties": {
      +        "type": "number"
      +      },
      +      "description": "IVs keyed by stat id (hp, atk, def, spa, spd, spe), each 0-31; omitted stats default to 31.",
      +      "propertyNames": {
      +        "type": "string"
      +      },
      +      "type": "object"
      +    },
      +    "level": {
      +      "description": "Level 1-100; defaults to 100 in the damage tools and 50 in the stat/speed tools.",
      +      "maximum": 100,
      +      "minimum": 1,
      +      "type": "integer"
      +    },
      +    "moves": {
      +      "description": "Moveset names, e.g. [\"Earthquake\", \"Dragon Claw\"]; used by `calculate_matchups` to pick the hardest-hitting move per defender.",
      +      "items": {
      +        "type": "string"
      +      },
      +      "type": "array"
      +    },
      +    "nature": {
      +      "description": "Nature name, e.g. \"Jolly\", \"Modest\", \"Adamant\"; defaults to Serious (neutral) when omitted.",
      +      "type": "string"
      +    },
      +    "species": {
      +      "description": "Species or form name, e.g. \"Garchomp\", \"Ogerpon-Wellspring\".",
      +      "type": "string"
      +    },
      +    "status": {
      +      "description": "Pre-existing status such as \"brn\", \"par\", or \"tox\"; burn halves physical damage, paralysis cuts Speed.",
      +      "type": "string"
      +    }
      +  },
      +  "required": [
      +    "species"
      +  ],
      +  "type": "object"
      +}
    • addedInput schema / properties / defenders
      Added value: +{
      +  "description": "1-30 defender sets, each with the same fields as `attacker`; every entry is scored against the same attacker, move set, and field.",
      +  "items": {
      +    "properties": {
      +      "ability": {
      +        "description": "Ability name, e.g. \"Intimidate\", \"Protosynthesis\"; defaults to the species’ default ability.",
      +        "type": "string"
      +      },
      +      "abilityOn": {
      +        "description": "Force the ability on (true) or off (false), e.g. to compare Protosynthesis active vs not; omitted leaves it to the calc.",
      +        "type": "boolean"
      +      },
      +      "boosts": {
      +        "additionalProperties": {
      +          "type": "number"
      +        },
      +        "description": "Stat stages keyed by stat id (hp, atk, def, spa, spd, spe), each -6..+6; omitted stats are 0 (e.g. { atk: 2 } = +2 Attack).",
      +        "propertyNames": {
      +          "type": "string"
      +        },
      +        "type": "object"
      +      },
      +      "championsPoints": {
      +        "additionalProperties": {
      +          "type": "number"
      +        },
      +        "description": "Pokémon Champions stat points keyed by stat id (hp, atk, def, spa, spd, spe): whole numbers, each 0-32, totalling at most 66. This is the spread the game’s training screen takes, and an alternative to `evs` — give one or the other, not both. One point is worth 8 EVs, so a converted spread is trimmed from its largest stats to fit the 510 EV cap the calculator enforces.",
      +        "propertyNames": {
      +          "type": "string"
      +        },
      +        "type": "object"
      +      },
      +      "curHP": {
      +        "description": "Current HP when entering damaged, e.g. 120; defaults to full HP.",
      +        "type": "number"
      +      },
      +      "evs": {
      +        "additionalProperties": {
      +          "type": "number"
      +        },
      +        "description": "EVs keyed by stat id (hp, atk, def, spa, spd, spe), each 0-252 in steps of 4; omitted stats are 0, and a total above 510 is rejected.",
      +        "propertyNames": {
      +          "type": "string"
      +        },
      +        "type": "object"
      +      },
      +      "item": {
      +        "description": "Held item name, e.g. \"Choice Band\", \"Assault Vest\", \"Leftovers\"; the calc applies its damage, Speed, or bulk effect.",
      +        "type": "string"
      +      },
      +      "ivs": {
      +        "additionalProperties": {
      +          "type": "number"
      +        },
      +        "description": "IVs keyed by stat id (hp, atk, def, spa, spd, spe), each 0-31; omitted stats default to 31.",
      +        "propertyNames": {
      +          "type": "string"
      +        },
      +        "type": "object"
      +      },
      +      "level": {
      +        "description": "Level 1-100; defaults to 100 in the damage tools and 50 in the stat/speed tools.",
      +        "maximum": 100,
      +        "minimum": 1,
      +        "type": "integer"
      +      },
      +      "moves": {
      +        "description": "Moveset names, e.g. [\"Earthquake\", \"Dragon Claw\"]; used by `calculate_matchups` to pick the hardest-hitting move per defender.",
      +        "items": {
      +          "type": "string"
      +        },
      +        "type": "array"
      +      },
      +      "nature": {
      +        "description": "Nature name, e.g. \"Jolly\", \"Modest\", \"Adamant\"; defaults to Serious (neutral) when omitted.",
      +        "type": "string"
      +      },
      +      "species": {
      +        "description": "Species or form name, e.g. \"Garchomp\", \"Ogerpon-Wellspring\".",
      +        "type": "string"
      +      },
      +      "status": {
      +        "description": "Pre-existing status such as \"brn\", \"par\", or \"tox\"; burn halves physical damage, paralysis cuts Speed.",
      +        "type": "string"
      +      }
      +    },
      +    "required": [
      +      "species"
      +    ],
      +    "type": "object"
      +  },
      +  "maxItems": 30,
      +  "minItems": 1,
      +  "type": "array"
      +}
    • addedInput schema / properties / detail
      Added value: +{
      +  "description": "How much detail to return: \"compact\" (default) gives conclusions and the numbers needed to reason; \"evidence\" adds ranges, benchmarks and per-row detail; \"debug\" adds provenance and every intermediate. Ask for more only when the reasoning actually needs it — model context is the expensive resource.",
      +  "enum": [
      +    "compact",
      +    "evidence",
      +    "debug"
      +  ],
      +  "type": "string"
      +}
    • addedInput schema / properties / evs
      Added value: +{
      +  "anyOf": [
      +    {
      +      "additionalProperties": {
      +        "type": "number"
      +      },
      +      "description": "EVs keyed by stat id (hp, atk, def, spa, spd, spe), each 0-252 in steps of 4; omitted stats are 0, and a total above 510 is rejected.",
      +      "propertyNames": {
      +        "type": "string"
      +      },
      +      "type": "object"
      +    },
      +    {
      +      "additionalProperties": {
      +        "type": "number"
      +      },
      +      "description": "EVs keyed by stat id; only `spe` (0-252) changes the result, e.g. { spe: 252 }.",
      +      "propertyNames": {
      +        "type": "string"
      +      },
      +      "type": "object"
      +    }
      +  ]
      +}
    • addedInput schema / properties / field
      Added value: +{
      +  "anyOf": [
      +    {
      +      "description": "Battlefield conditions applied to the calc; omit it for a neutral Singles field with no weather, terrain, or hazards.",
      +      "properties": {
      +        "attackerSide": {
      +          "additionalProperties": {},
      +          "description": "Attacker-side flags, e.g. { isHelpingHand: true, isTailwind: true, spikes: 2 }.",
      +          "propertyNames": {
      +            "type": "string"
      +          },
      +          "type": "object"
      +        },
      +        "defenderSide": {
      +          "additionalProperties": {},
      +          "description": "Defender-side flags, e.g. { isReflect: true, isLightScreen: true, isAuroraVeil: true, isSR: true }.",
      +          "propertyNames": {
      +            "type": "string"
      +          },
      +          "type": "object"
      +        },
      +        "gameType": {
      +          "description": "Doubles spreads damage across targets; default Singles.",
      +          "enum": [
      +            "Singles",
      +            "Doubles"
      +          ],
      +          "type": "string"
      +        },
      +        "terrain": {
      +          "description": "Terrain: \"Electric\", \"Grassy\", \"Psychic\", or \"Misty\"; default none.",
      +          "type": "string"
      +        },
      +        "weather": {
      +          "description": "Weather: \"Sand\", \"Sun\", \"Rain\", \"Hail\", \"Snow\", \"Harsh Sunshine\", \"Heavy Rain\", or \"Strong Winds\"; default none.",
      +          "type": "string"
      +        }
      +      },
      +      "type": "object"
      +    },
      +    {
      +      "description": "Shared battlefield conditions for every matchup; omit for a neutral Singles field. Side hazards and screens are only available on `calculate_damage`.",
      +      "properties": {
      +        "gameType": {
      +          "description": "Doubles spreads damage across targets; default Singles.",
      +          "enum": [
      +            "Singles",
      +            "Doubles"
      +          ],
      +          "type": "string"
      +        },
      +        "terrain": {
      +          "description": "Terrain: \"Electric\", \"Grassy\", \"Psychic\", or \"Misty\"; default none.",
      +          "type": "string"
      +        },
      +        "weather": {
      +          "description": "Weather: \"Sand\", \"Sun\", \"Rain\", \"Hail\", \"Snow\", \"Harsh Sunshine\", \"Heavy Rain\", or \"Strong Winds\"; default none.",
      +          "type": "string"
      +        }
      +      },
      +      "type": "object"
      +    },
      +    {
      +      "description": "Battlefield conditions applied while testing the survive and kill goals; omit for a neutral Singles field.",
      +      "properties": {
      +        "gameType": {
      +          "description": "Doubles spreads damage across targets; default Singles.",
      +          "enum": [
      +            "Singles",
      +            "Doubles"
      +          ],
      +          "type": "string"
      +        },
      +        "terrain": {
      +          "description": "Terrain for the survive/kill calcs: \"Electric\", \"Grassy\", \"Psychic\", or \"Misty\"; default none.",
      +          "type": "string"
      +        },
      +        "weather": {
      +          "description": "Weather for the survive/kill calcs, e.g. \"Sun\", \"Rain\", \"Sand\"; default none.",
      +          "type": "string"
      +        }
      +      },
      +      "type": "object"
      +    }
      +  ]
      +}
    • addedInput schema / properties / item
      Added value: +{
      +  "anyOf": [
      +    {
      +      "description": "Held item, e.g. \"Choice Scarf\"; only Choice Scarf multiplies Speed (×1.5), other items are listed as speed-neutral.",
      +      "type": "string"
      +    },
      +    {
      +      "description": "Item held while solving, e.g. \"Assault Vest\"; it changes the bulk or Speed the goals are tested against.",
      +      "type": "string"
      +    }
      +  ]
      +}
    • addedInput schema / properties / ivs
      Added value: +{
      +  "anyOf": [
      +    {
      +      "additionalProperties": {
      +        "type": "number"
      +      },
      +      "description": "IVs keyed by stat id (hp, atk, def, spa, spd, spe), each 0-31; omitted stats default to 31.",
      +      "propertyNames": {
      +        "type": "string"
      +      },
      +      "type": "object"
      +    },
      +    {
      +      "additionalProperties": {
      +        "type": "number"
      +      },
      +      "description": "IVs keyed by stat id; only `spe` (0-31) changes the result, and it defaults to 31.",
      +      "propertyNames": {
      +        "type": "string"
      +      },
      +      "type": "object"
      +    },
      +    {
      +      "additionalProperties": {
      +        "type": "number"
      +      },
      +      "description": "IVs to hold fixed while searching, keyed by stat id; omitted stats default to 31 (use 0 for a Trick Room Speed IV).",
      +      "propertyNames": {
      +        "type": "string"
      +      },
      +      "type": "object"
      +    }
      +  ]
      +}
    • addedInput schema / properties / kill
      Added value: +{
      +  "description": "Add a KO goal: minimizes Atk or SpA so that even the lowest damage roll reaches the per-hit HP threshold.",
      +  "properties": {
      +    "hits": {
      +      "default": 1,
      +      "description": "Number of hits the move must KO in, 1-4 (default 1); each hit must reach target max HP / hits.",
      +      "maximum": 4,
      +      "minimum": 1,
      +      "type": "integer"
      +    },
      +    "move": {
      +      "description": "Move used for the KO, e.g. \"Knock Off\"; its category decides whether Atk or SpA EVs are minimized.",
      +      "type": "string"
      +    },
      +    "target": {
      +      "description": "The defender that must be KOed, including its bulk EVs, item, and ability; give it the same `level` as the optimized Pokémon, since a nested set defaults to level 100.",
      +      "properties": {
      +        "ability": {
      +          "description": "Ability name, e.g. \"Intimidate\", \"Protosynthesis\"; defaults to the species’ default ability.",
      +          "type": "string"
      +        },
      +        "abilityOn": {
      +          "description": "Force the ability on (true) or off (false), e.g. to compare Protosynthesis active vs not; omitted leaves it to the calc.",
      +          "type": "boolean"
      +        },
      +        "boosts": {
      +          "additionalProperties": {
      +            "type": "number"
      +          },
      +          "description": "Stat stages keyed by stat id (hp, atk, def, spa, spd, spe), each -6..+6; omitted stats are 0 (e.g. { atk: 2 } = +2 Attack).",
      +          "propertyNames": {
      +            "type": "string"
      +          },
      +          "type": "object"
      +        },
      +        "championsPoints": {
      +          "additionalProperties": {
      +            "type": "number"
      +          },
      +          "description": "Pokémon Champions stat points keyed by stat id (hp, atk, def, spa, spd, spe): whole numbers, each 0-32, totalling at most 66. This is the spread the game’s training screen takes, and an alternative to `evs` — give one or the other, not both. One point is worth 8 EVs, so a converted spread is trimmed from its largest stats to fit the 510 EV cap the calculator enforces.",
      +          "propertyNames": {
      +            "type": "string"
      +          },
      +          "type": "object"
      +        },
      +        "curHP": {
      +          "description": "Current HP when entering damaged, e.g. 120; defaults to full HP.",
      +          "type": "number"
      +        },
      +        "evs": {
      +          "additionalProperties": {
      +            "type": "number"
      +          },
      +          "description": "EVs keyed by stat id (hp, atk, def, spa, spd, spe), each 0-252 in steps of 4; omitted stats are 0, and a total above 510 is rejected.",
      +          "propertyNames": {
      +            "type": "string"
      +          },
      +          "type": "object"
      +        },
      +        "item": {
      +          "description": "Held item name, e.g. \"Choice Band\", \"Assault Vest\", \"Leftovers\"; the calc applies its damage, Speed, or bulk effect.",
      +          "type": "string"
      +        },
      +        "ivs": {
      +          "additionalProperties": {
      +            "type": "number"
      +          },
      +          "description": "IVs keyed by stat id (hp, atk, def, spa, spd, spe), each 0-31; omitted stats default to 31.",
      +          "propertyNames": {
      +            "type": "string"
      +          },
      +          "type": "object"
      +        },
      +        "level": {
      +          "description": "Level 1-100; defaults to 100 in the damage tools and 50 in the stat/speed tools.",
      +          "maximum": 100,
      +          "minimum": 1,
      +          "type": "integer"
      +        },
      +        "moves": {
      +          "description": "Moveset names, e.g. [\"Earthquake\", \"Dragon Claw\"]; used by `calculate_matchups` to pick the hardest-hitting move per defender.",
      +          "items": {
      +            "type": "string"
      +          },
      +          "type": "array"
      +        },
      +        "nature": {
      +          "description": "Nature name, e.g. \"Jolly\", \"Modest\", \"Adamant\"; defaults to Serious (neutral) when omitted.",
      +          "type": "string"
      +        },
      +        "species": {
      +          "description": "Species or form name, e.g. \"Garchomp\", \"Ogerpon-Wellspring\".",
      +          "type": "string"
      +        },
      +        "status": {
      +          "description": "Pre-existing status such as \"brn\", \"par\", or \"tox\"; burn halves physical damage, paralysis cuts Speed.",
      +          "type": "string"
      +        }
      +      },
      +      "required": [
      +        "species"
      +      ],
      +      "type": "object"
      +    }
      +  },
      +  "required": [
      +    "target",
      +    "move"
      +  ],
      +  "type": "object"
      +}
    • addedInput schema / properties / level
      Added value: +{
      +  "anyOf": [
      +    {
      +      "default": 50,
      +      "description": "Level 1-100; default 50.",
      +      "maximum": 100,
      +      "minimum": 1,
      +      "type": "integer"
      +    },
      +    {
      +      "default": 50,
      +      "description": "Level 1-100; default 50, matching VGC play.",
      +      "maximum": 100,
      +      "minimum": 1,
      +      "type": "integer"
      +    },
      +    {
      +      "default": 50,
      +      "description": "Level 1-100; default 50 (VGC), where bulk and Speed benchmarks are tightest.",
      +      "maximum": 100,
      +      "minimum": 1,
      +      "type": "integer"
      +    }
      +  ]
      +}
    • addedInput schema / properties / maximize
      Added value: +{
      +  "default": "spe",
      +  "description": "Stat that receives leftover EVs after the goals are met, capped at 252 (default spe); EVs are added in steps of 4.",
      +  "enum": [
      +    "atk",
      +    "spa",
      +    "spe",
      +    "hp",
      +    "def",
      +    "spd"
      +  ],
      +  "type": "string"
      +}
    • addedInput schema / properties / mode
      Added value: +{
      +  "description": "Which operation to run: \"stats\", \"damage\", \"matchups\", \"speed\", \"optimize_evs\".",
      +  "enum": [
      +    "stats",
      +    "damage",
      +    "matchups",
      +    "speed",
      +    "optimize_evs"
      +  ],
      +  "type": "string"
      +}
    • addedInput schema / properties / move
      Added value: +{
      +  "anyOf": [
      +    {
      +      "description": "Move used by the attacker, e.g. \"Earthquake\", \"Make It Rain\"; must be a real move name.",
      +      "type": "string"
      +    },
      +    {
      +      "description": "Pin the matchup to this one move, e.g. \"Close Combat\"; when omitted, `attacker.moves` is searched instead.",
      +      "type": "string"
      +    }
      +  ]
      +}
    • addedInput schema / properties / nature
      Added value: +{
      +  "anyOf": [
      +    {
      +      "description": "Nature name, e.g. \"Jolly\", \"Modest\"; default Serious (raises and lowers nothing).",
      +      "type": "string"
      +    },
      +    {
      +      "description": "Nature name, e.g. \"Jolly\", \"Timid\"; default Serious (neutral Speed).",
      +      "type": "string"
      +    },
      +    {
      +      "description": "Nature used for every stat calculation, e.g. \"Adamant\", \"Calm\"; default Serious. Change it to trade one stat for another.",
      +      "type": "string"
      +    }
      +  ]
      +}
    • addedInput schema / properties / outspeed
      Added value: +{
      +  "description": "Add an outspeed goal: supply `target` or `speed` (one is required here, otherwise that goal errors).",
      +  "properties": {
      +    "speed": {
      +      "description": "Raw Speed number to beat when there is no full target set, e.g. 189.",
      +      "maximum": 9007199254740991,
      +      "minimum": 1,
      +      "type": "integer"
      +    },
      +    "target": {
      +      "description": "Set to outspeed, e.g. {\"species\": \"Dragapult\", \"nature\": \"Jolly\", \"evs\": {\"spe\": 252}}; its computed Speed becomes the benchmark. Give it the same `level` as the optimized Pokémon, since a nested set defaults to level 100.",
      +      "properties": {
      +        "ability": {
      +          "description": "Ability name, e.g. \"Intimidate\", \"Protosynthesis\"; defaults to the species’ default ability.",
      +          "type": "string"
      +        },
      +        "abilityOn": {
      +          "description": "Force the ability on (true) or off (false), e.g. to compare Protosynthesis active vs not; omitted leaves it to the calc.",
      +          "type": "boolean"
      +        },
      +        "boosts": {
      +          "additionalProperties": {
      +            "type": "number"
      +          },
      +          "description": "Stat stages keyed by stat id (hp, atk, def, spa, spd, spe), each -6..+6; omitted stats are 0 (e.g. { atk: 2 } = +2 Attack).",
      +          "propertyNames": {
      +            "type": "string"
      +          },
      +          "type": "object"
      +        },
      +        "championsPoints": {
      +          "additionalProperties": {
      +            "type": "number"
      +          },
      +          "description": "Pokémon Champions stat points keyed by stat id (hp, atk, def, spa, spd, spe): whole numbers, each 0-32, totalling at most 66. This is the spread the game’s training screen takes, and an alternative to `evs` — give one or the other, not both. One point is worth 8 EVs, so a converted spread is trimmed from its largest stats to fit the 510 EV cap the calculator enforces.",
      +          "propertyNames": {
      +            "type": "string"
      +          },
      +          "type": "object"
      +        },
      +        "curHP": {
      +          "description": "Current HP when entering damaged, e.g. 120; defaults to full HP.",
      +          "type": "number"
      +        },
      +        "evs": {
      +          "additionalProperties": {
      +            "type": "number"
      +          },
      +          "description": "EVs keyed by stat id (hp, atk, def, spa, spd, spe), each 0-252 in steps of 4; omitted stats are 0, and a total above 510 is rejected.",
      +          "propertyNames": {
      +            "type": "string"
      +          },
      +          "type": "object"
      +        },
      +        "item": {
      +          "description": "Held item name, e.g. \"Choice Band\", \"Assault Vest\", \"Leftovers\"; the calc applies its damage, Speed, or bulk effect.",
      +          "type": "string"
      +        },
      +        "ivs": {
      +          "additionalProperties": {
      +            "type": "number"
      +          },
      +          "description": "IVs keyed by stat id (hp, atk, def, spa, spd, spe), each 0-31; omitted stats default to 31.",
      +          "propertyNames": {
      +            "type": "string"
      +          },
      +          "type": "object"
      +        },
      +        "level": {
      +          "description": "Level 1-100; defaults to 100 in the damage tools and 50 in the stat/speed tools.",
      +          "maximum": 100,
      +          "minimum": 1,
      +          "type": "integer"
      +        },
      +        "moves": {
      +          "description": "Moveset names, e.g. [\"Earthquake\", \"Dragon Claw\"]; used by `calculate_matchups` to pick the hardest-hitting move per defender.",
      +          "items": {
      +            "type": "string"
      +          },
      +          "type": "array"
      +        },
      +        "nature": {
      +          "description": "Nature name, e.g. \"Jolly\", \"Modest\", \"Adamant\"; defaults to Serious (neutral) when omitted.",
      +          "type": "string"
      +        },
      +        "species": {
      +          "description": "Species or form name, e.g. \"Garchomp\", \"Ogerpon-Wellspring\".",
      +          "type": "string"
      +        },
      +        "status": {
      +          "description": "Pre-existing status such as \"brn\", \"par\", or \"tox\"; burn halves physical damage, paralysis cuts Speed.",
      +          "type": "string"
      +        }
      +      },
      +      "required": [
      +        "species"
      +      ],
      +      "type": "object"
      +    }
      +  },
      +  "type": "object"
      +}
    • addedInput schema / properties / regulation
      Added value: +{
      +  "description": "Regulation Set name or id from `list_regulations` to compare against, e.g. \"Regulation Set G\"; omit to get the raw Speed only.",
      +  "type": "string"
      +}
    • addedInput schema / properties / species
      Added value: +{
      +  "anyOf": [
      +    {
      +      "description": "Species or form name, e.g. \"Garchomp\", \"Ogerpon-Wellspring\".",
      +      "type": "string"
      +    },
      +    {
      +      "description": "Species or form name, e.g. \"Dragapult\", \"Ogerpon-Wellspring\".",
      +      "type": "string"
      +    },
      +    {
      +      "description": "Species or form name to optimize, e.g. \"Garchomp\", \"Incineroar\".",
      +      "type": "string"
      +    }
      +  ]
      +}
    • addedInput schema / properties / survive
      Added value: +{
      +  "description": "Add a \"always live this hit\" goal: the search minimizes HP plus the relevant Defense EVs that keep the worst roll below max HP.",
      +  "properties": {
      +    "attacker": {
      +      "description": "The attacker whose move must be survived; the calc picks Defense or SpD from the move’s category. Set its `level` to match the optimized Pokémon’s, since a nested set defaults to level 100.",
      +      "properties": {
      +        "ability": {
      +          "description": "Ability name, e.g. \"Intimidate\", \"Protosynthesis\"; defaults to the species’ default ability.",
      +          "type": "string"
      +        },
      +        "abilityOn": {
      +          "description": "Force the ability on (true) or off (false), e.g. to compare Protosynthesis active vs not; omitted leaves it to the calc.",
      +          "type": "boolean"
      +        },
      +        "boosts": {
      +          "additionalProperties": {
      +            "type": "number"
      +          },
      +          "description": "Stat stages keyed by stat id (hp, atk, def, spa, spd, spe), each -6..+6; omitted stats are 0 (e.g. { atk: 2 } = +2 Attack).",
      +          "propertyNames": {
      +            "type": "string"
      +          },
      +          "type": "object"
      +        },
      +        "championsPoints": {
      +          "additionalProperties": {
      +            "type": "number"
      +          },
      +          "description": "Pokémon Champions stat points keyed by stat id (hp, atk, def, spa, spd, spe): whole numbers, each 0-32, totalling at most 66. This is the spread the game’s training screen takes, and an alternative to `evs` — give one or the other, not both. One point is worth 8 EVs, so a converted spread is trimmed from its largest stats to fit the 510 EV cap the calculator enforces.",
      +          "propertyNames": {
      +            "type": "string"
      +          },
      +          "type": "object"
      +        },
      +        "curHP": {
      +          "description": "Current HP when entering damaged, e.g. 120; defaults to full HP.",
      +          "type": "number"
      +        },
      +        "evs": {
      +          "additionalProperties": {
      +            "type": "number"
      +          },
      +          "description": "EVs keyed by stat id (hp, atk, def, spa, spd, spe), each 0-252 in steps of 4; omitted stats are 0, and a total above 510 is rejected.",
      +          "propertyNames": {
      +            "type": "string"
      +          },
      +          "type": "object"
      +        },
      +        "item": {
      +          "description": "Held item name, e.g. \"Choice Band\", \"Assault Vest\", \"Leftovers\"; the calc applies its damage, Speed, or bulk effect.",
      +          "type": "string"
      +        },
      +        "ivs": {
      +          "additionalProperties": {
      +            "type": "number"
      +          },
      +          "description": "IVs keyed by stat id (hp, atk, def, spa, spd, spe), each 0-31; omitted stats default to 31.",
      +          "propertyNames": {
      +            "type": "string"
      +          },
      +          "type": "object"
      +        },
      +        "level": {
      +          "description": "Level 1-100; defaults to 100 in the damage tools and 50 in the stat/speed tools.",
      +          "maximum": 100,
      +          "minimum": 1,
      +          "type": "integer"
      +        },
      +        "moves": {
      +          "description": "Moveset names, e.g. [\"Earthquake\", \"Dragon Claw\"]; used by `calculate_matchups` to pick the hardest-hitting move per defender.",
      +          "items": {
      +            "type": "string"
      +          },
      +          "type": "array"
      +        },
      +        "nature": {
      +          "description": "Nature name, e.g. \"Jolly\", \"Modest\", \"Adamant\"; defaults to Serious (neutral) when omitted.",
      +          "type": "string"
      +        },
      +        "species": {
      +          "description": "Species or form name, e.g. \"Garchomp\", \"Ogerpon-Wellspring\".",
      +          "type": "string"
      +        },
      +        "status": {
      +          "description": "Pre-existing status such as \"brn\", \"par\", or \"tox\"; burn halves physical damage, paralysis cuts Speed.",
      +          "type": "string"
      +        }
      +      },
      +      "required": [
      +        "species"
      +      ],
      +      "type": "object"
      +    },
      +    "move": {
      +      "description": "Move being survived, e.g. \"Close Combat\"; a valid move name is required.",
      +      "type": "string"
      +    }
      +  },
      +  "required": [
      +    "attacker",
      +    "move"
      +  ],
      +  "type": "object"
      +}
    • addedInput schema / required
      Added value: +[
      +  "mode"
      +]
  3. Addedv6.2.2

TDQS

A4.4/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint, idempotentHint, and destructiveHint, so the safety profile is covered. The description adds useful behavior beyond annotations: the tool is offline and deterministic, and supplying both evs and championsPoints is rejected. This is meaningful context, though it does not describe full output behavior.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Three dense, front-loaded sentences. The mode list and the EV/CP exclusion rule are the most decision-relevant facts and appear first. Every sentence earns its place with no filler or repetition of annotation content.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a complex 21-parameter tool with nested objects and no output schema, the description covers mode selection, the spread-scale constraint, and the read-only/offline/deterministic nature. The schema carries per-field details. A minor gap is the lack of explicit return-value shape per mode, but each mode's purpose is described well enough to invoke correctly.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is only 52%, so the description carries some parameter-semantics burden. It compensates by explaining the critical `mode` parameter's five values and the mutually exclusive evs/championsPoints spread scales with a concrete CP conversion example. The schema's own individual property descriptions handle the remaining fields in detail.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description names a specific verb+resource ('battle calculation' on 'Pokémon Champions') and explicitly enumerates the five dispatch modes with their outputs (stats table, damage simulation, matchups, speed placement, EV optimization). This clearly differentiates it from sibling tools like analyze_team or optimize_team, which address different concerns.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The mode list gives clear context for when to call this tool: if you need stats, damage, matchups, speed, or optimized EV spreads. 'Read-only and offline; deterministic' sets expectations for safety and repeatability. However, it does not explicitly state when not to use it or name alternatives such as the 'dedicated calc tools' it references.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.