Skip to main content
Glama

Calculate final stats

calculate_stats
Read-onlyIdempotent

Compute a Pokémon's final six stats at any level from nature, IVs, and EVs, returning the full stat table, base stats, and BST.

Instructions

Compute one Pokémon’s final six stats at a level from its nature, IVs, and EVs, returning the stat table plus base stats and BST. Stats only, never a battle: use calculate_damage or calculate_matchups for damage rolls, check_speed to place the Speed stat against a regulation roster, and optimize_evs when the spread must be derived from a goal. EVs are 0-252 per stat with a 510 total cap, IVs 0-31, level defaults to 50 and nature to Serious. Read-only and offline; unknown species or nature names return an isError.

Input Schema

TableJSON Schema
NameRequiredDescriptionDefault
evsNoEVs 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.
ivsNoIVs keyed by stat id (hp, atk, def, spa, spd, spe), each 0-31; omitted stats default to 31.
levelNoLevel 1-100; default 50.
natureNoNature name, e.g. "Jolly", "Modest"; default Serious (raises and lowers nothing).
speciesYesSpecies or form name, e.g. "Garchomp", "Ogerpon-Wellspring".
championsPointsNoPoké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.

Output Schema

TableJSON Schema
NameRequiredDescriptionDefault
bstYesBase stat total: the sum of the six base stats, a rough measure of the species’ overall power.
evsYesThe EVs actually used per stat; all six keys are present, 0 for stats the call left uninvested.
ivsYesThe IVs actually used per stat; all six keys are present, defaulting to 31.
levelYesLevel the stats were computed at, 1-100.
statsYesThe six in-game stats this species reaches at this level, nature, IVs, and EVs; `hp` is the full HP stat, not a percentage.
natureYesNature applied to the non-HP stats, e.g. "Jolly"; Serious when the call omitted one.
speciesYesCanonical species name the stats belong to, e.g. "Garchomp".
baseStatsYesThe species’ unmodified base stats, the same for every set of that species.
championsPointsYesThe spread as Pokémon Champions stat points (whole numbers, at most 32 in a stat, 66 total) — what the game’s training screen takes; stats left uninvested are omitted and a maxed stat reads 32. The two systems budget differently (510 EVs against 66 points), so a spread trimmed to fit the EV cap reads back a point or two under what was asked: this is the nearest point spread for the stats actually computed, not a copy of the input.

Schema Changelog

Changes observed during successful MCP inspections.

  1. Changed3 schema fields changedv3.2.0
    • removedInput schema / properties / generation
      Removed value: -{
      -  "default": 9,
      -  "description": "Generation whose data to use, 1-9 (default 9). Earlier generations omit moves, items, abilities, and forms that did not exist yet.",
      -  "maximum": 9,
      -  "minimum": 1,
      -  "type": "integer"
      -}
    • removedOutput schema / properties / generation
      Removed value: -{
      -  "description": "Generation whose base stats and mechanics were used, 1-9.",
      -  "maximum": 9007199254740991,
      -  "minimum": -9007199254740991,
      -  "type": "integer"
      -}
    • changedOutput schema / required
      Previous value: -[
      -  "species",
      -  "generation",
      -  "level",
      -  "nature",
      -  "baseStats",
      -  "bst",
      -  "evs",
      -  "championsPoints",
      -  "ivs",
      -  "stats"
      -]New value: +[
      +  "species",
      +  "level",
      +  "nature",
      +  "baseStats",
      +  "bst",
      +  "evs",
      +  "championsPoints",
      +  "ivs",
      +  "stats"
      +]
  2. Changed3 schema fields changedv2.0.2
    • addedInput schema / properties / championsPoints
      Added 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"
      +}
    • addedOutput schema / properties / championsPoints
      Added value: +{
      +  "additionalProperties": {
      +    "type": "number"
      +  },
      +  "description": "The spread as Pokémon Champions stat points (whole numbers, at most 32 in a stat, 66 total) — what the game’s training screen takes; stats left uninvested are omitted and a maxed stat reads 32. The two systems budget differently (510 EVs against 66 points), so a spread trimmed to fit the EV cap reads back a point or two under what was asked: this is the nearest point spread for the stats actually computed, not a copy of the input.",
      +  "propertyNames": {
      +    "type": "string"
      +  },
      +  "type": "object"
      +}
    • changedOutput schema / required
      Previous value: -[
      -  "species",
      -  "generation",
      -  "level",
      -  "nature",
      -  "baseStats",
      -  "bst",
      -  "evs",
      -  "ivs",
      -  "stats"
      -]New value: +[
      +  "species",
      +  "generation",
      +  "level",
      +  "nature",
      +  "baseStats",
      +  "bst",
      +  "evs",
      +  "championsPoints",
      +  "ivs",
      +  "stats"
      +]
  3. Changed7 schema fields changedv1.1.1
    • addedInput schema / properties / evs / description
      Added 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."
    • addedInput schema / properties / generation / description
      Added value: +"Generation whose data to use, 1-9 (default 9). Earlier generations omit moves, items, abilities, and forms that did not exist yet."
    • addedInput schema / properties / ivs / description
      Added value: +"IVs keyed by stat id (hp, atk, def, spa, spd, spe), each 0-31; omitted stats default to 31."
    • addedInput schema / properties / level / description
      Added value: +"Level 1-100; default 50."
    • addedInput schema / properties / nature / description
      Added value: +"Nature name, e.g. \"Jolly\", \"Modest\"; default Serious (raises and lowers nothing)."
    • addedInput schema / properties / species / description
      Added value: +"Species or form name, e.g. \"Garchomp\", \"Ogerpon-Wellspring\"."
    • changedOutput schema / (root)
      Previous value: -nullNew value: +{
      +  "$schema": "http://json-schema.org/draft-07/schema#",
      +  "additionalProperties": false,
      +  "properties": {
      +    "baseStats": {
      +      "additionalProperties": false,
      +      "description": "The species’ unmodified base stats, the same for every set of that species.",
      +      "properties": {
      +        "atk": {
      +          "description": "Base Attack: the stat behind physical damage dealt.",
      +          "type": "number"
      +        },
      +        "def": {
      +          "description": "Base Defense: the stat behind physical damage taken.",
      +          "type": "number"
      +        },
      +        "hp": {
      +          "description": "Base HP: hit points, which decide how much damage the set can take.",
      +          "type": "number"
      +        },
      +        "spa": {
      +          "description": "Base Special Attack: the stat behind special damage dealt.",
      +          "type": "number"
      +        },
      +        "spd": {
      +          "description": "Base Special Defense: the stat behind special damage taken.",
      +          "type": "number"
      +        },
      +        "spe": {
      +          "description": "Base Speed: turn order; the higher Speed moves first.",
      +          "type": "number"
      +        }
      +      },
      +      "required": [
      +        "hp",
      +        "atk",
      +        "def",
      +        "spa",
      +        "spd",
      +        "spe"
      +      ],
      +      "type": "object"
      +    },
      +    "bst": {
      +      "description": "Base stat total: the sum of the six base stats, a rough measure of the species’ overall power.",
      +      "type": "number"
      +    },
      +    "evs": {
      +      "additionalProperties": false,
      +      "description": "The EVs actually used per stat; all six keys are present, 0 for stats the call left uninvested.",
      +      "properties": {
      +        "atk": {
      +          "description": "EV applied to Attack: the stat behind physical damage dealt.",
      +          "type": "number"
      +        },
      +        "def": {
      +          "description": "EV applied to Defense: the stat behind physical damage taken.",
      +          "type": "number"
      +        },
      +        "hp": {
      +          "description": "EV applied to HP: hit points, which decide how much damage the set can take.",
      +          "type": "number"
      +        },
      +        "spa": {
      +          "description": "EV applied to Special Attack: the stat behind special damage dealt.",
      +          "type": "number"
      +        },
      +        "spd": {
      +          "description": "EV applied to Special Defense: the stat behind special damage taken.",
      +          "type": "number"
      +        },
      +        "spe": {
      +          "description": "EV applied to Speed: turn order; the higher Speed moves first.",
      +          "type": "number"
      +        }
      +      },
      +      "required": [
      +        "hp",
      +        "atk",
      +        "def",
      +        "spa",
      +        "spd",
      +        "spe"
      +      ],
      +      "type": "object"
      +    },
      +    "generation": {
      +      "description": "Generation whose base stats and mechanics were used, 1-9.",
      +      "maximum": 9007199254740991,
      +      "minimum": -9007199254740991,
      +      "type": "integer"
      +    },
      +    "ivs": {
      +      "additionalProperties": false,
      +      "description": "The IVs actually used per stat; all six keys are present, defaulting to 31.",
      +      "properties": {
      +        "atk": {
      +          "description": "Individual value for Attack: the stat behind physical damage dealt.",
      +          "type": "number"
      +        },
      +        "def": {
      +          "description": "Individual value for Defense: the stat behind physical damage taken.",
      +          "type": "number"
      +        },
      +        "hp": {
      +          "description": "Individual value for HP: hit points, which decide how much damage the set can take.",
      +          "type": "number"
      +        },
      +        "spa": {
      +          "description": "Individual value for Special Attack: the stat behind special damage dealt.",
      +          "type": "number"
      +        },
      +        "spd": {
      +          "description": "Individual value for Special Defense: the stat behind special damage taken.",
      +          "type": "number"
      +        },
      +        "spe": {
      +          "description": "Individual value for Speed: turn order; the higher Speed moves first.",
      +          "type": "number"
      +        }
      +      },
      +      "required": [
      +        "hp",
      +        "atk",
      +        "def",
      +        "spa",
      +        "spd",
      +        "spe"
      +      ],
      +      "type": "object"
      +    },
      +    "level": {
      +      "description": "Level the stats were computed at, 1-100.",
      +      "maximum": 9007199254740991,
      +      "minimum": -9007199254740991,
      +      "type": "integer"
      +    },
      +    "nature": {
      +      "description": "Nature applied to the non-HP stats, e.g. \"Jolly\"; Serious when the call omitted one.",
      +      "type": "string"
      +    },
      +    "species": {
      +      "description": "Canonical species name the stats belong to, e.g. \"Garchomp\".",
      +      "type": "string"
      +    },
      +    "stats": {
      +      "additionalProperties": false,
      +      "description": "The six in-game stats this species reaches at this level, nature, IVs, and EVs; `hp` is the full HP stat, not a percentage.",
      +      "properties": {
      +        "atk": {
      +          "description": "Final Attack: the stat behind physical damage dealt.",
      +          "type": "number"
      +        },
      +        "def": {
      +          "description": "Final Defense: the stat behind physical damage taken.",
      +          "type": "number"
      +        },
      +        "hp": {
      +          "description": "Final HP: hit points, which decide how much damage the set can take.",
      +          "type": "number"
      +        },
      +        "spa": {
      +          "description": "Final Special Attack: the stat behind special damage dealt.",
      +          "type": "number"
      +        },
      +        "spd": {
      +          "description": "Final Special Defense: the stat behind special damage taken.",
      +          "type": "number"
      +        },
      +        "spe": {
      +          "description": "Final Speed: turn order; the higher Speed moves first.",
      +          "type": "number"
      +        }
      +      },
      +      "required": [
      +        "hp",
      +        "atk",
      +        "def",
      +        "spa",
      +        "spd",
      +        "spe"
      +      ],
      +      "type": "object"
      +    }
      +  },
      +  "required": [
      +    "species",
      +    "generation",
      +    "level",
      +    "nature",
      +    "baseStats",
      +    "bst",
      +    "evs",
      +    "ivs",
      +    "stats"
      +  ],
      +  "type": "object"
      +}
  4. First observedv0.1.0

TDQS

A4.5/5.0
Behavior4/5

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

Annotations already cover read-only, idempotent, and non-destructive behavior. The description adds valuable context beyond the annotations: the tool is offline, unknown species or nature names return an isError, and constraints like the 510 EV cap are enforced. This enriches the behavioral profile without contradicting the annotations.

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?

The description is three sentences with a clear structure: purpose/output first, sibling routing second, constraints and behavior last. Every sentence carries necessary information, and there is no fluff or repetition that weakens the message.

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

Completeness5/5

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

Given the rich input schema, output schema, and annotations, the description covers everything needed to select and invoke the tool correctly: purpose, exclusions, parameter constraints, defaults, error behavior, and offline/read-only guarantees. Nothing essential is missing.

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

Parameters3/5

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

Schema description coverage is 100%, so the schema already fully documents all six parameters, including the championsPoints alternative and its relationship to EVs. The description reiterates caps and defaults (EVs 0-252, IVs 0-31, level 50, nature Serious) but adds no meaning beyond the schema, so the baseline 3 is appropriate.

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 opens with a specific verb and resource: 'Compute one Pokémon’s final six stats at a level from its nature, IVs, and EVs.' It also states the output ('stat table plus base stats and BST') and explicitly distinguishes itself from battle-focused siblings with 'Stats only, never a battle.'

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

Usage Guidelines5/5

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

The description gives explicit when-to-use and when-not-to-use guidance, naming sibling tools: calculate_damage/calculate_matchups for damage rolls, check_speed for Speed placement, and optimize_evs when deriving a spread from a goal. This leaves no ambiguity about tool selection.

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