Skip to main content
Glama

Analyze team synergy

analyze_team
Read-onlyIdempotent

Assess team synergy by checking per-type weaknesses, resistances, immunities, coverage, and speed; get a 0-100 score, threat coverage, and four-to-bring picks against an opponent.

Instructions

Analyze a whole team’s type synergy: per-type weak, resist, and immune counts with the types at risk, super-effective coverage from STAB and supplied moves, speed placement, and a transparent 0-100 heuristic score — a quick signal, not a metagame rating. With regulation it also reports threatCoverage: how the team fares against that regulation’s most-used sets, each threat’s real nature, EVs and Mega form included, listing the threats nothing on the team hits super-effectively. With opponent it reports bringFour: which four of your six to bring against that team, scored on the types team preview shows, plus the types that leaves stacked. Use get_type_matchup or get_type for one matchup. Each entry is a species with optional moves, nature, evs/championsPoints and item; unknown moves are collected into unknownMoves, unknown species error. Read-only and offline over the bundled dataset.

Input Schema

TableJSON Schema
NameRequiredDescriptionDefault
teamYesTeam of up to 6 members, each a species with optional moves and a set.
opponentNoOptional opponent team as species names, e.g. ["Salamence", "Sneasler", "Kingambit"]; the reply then recommends which four of your six to bring. This is what team preview gives you — species only, no sets — so the read is type-based. Unknown names return an isError.
regulationNoOptional regulation set id, e.g. "m-c"; when given, the reply also lists legal threats whose base speed beats your fastest member. Unknown ids return an isError.

Output Schema

TableJSON Schema
NameRequiredDescriptionDefault
teamYesThe analysed team in the order it was supplied, each member with the typing actually used for the analysis.
scoreYesTransparent heuristic 0-100 scoring of the team.
speedYesWhere the team sits on the speed spectrum, plus legal faster threats when a regulation was given.
bringFourNoWhich four of the six to bring; present only when `opponent` was supplied.
atRiskTypesYesThe stacked-weakness types: at least two members weak to it and nobody resisting or immune. Empty means no such hole.
unknownMovesNoDeduplicated move names that were not found in the dataset and so contributed no coverage; omitted entirely when every move resolved.
threatCoverageNoHow the team fares against the regulation’s most-used sets; present only when a regulation with a usage-derived threat list was supplied.
offensiveCoverageYesSuper-effective coverage of all 18 defending types.
defensiveWeaknessesYesOne entry for each of the 18 classic types (keyed by type name, e.g. "Fire"), tallying how the team fares defensively against that type.

Schema Changelog

Changes observed during successful MCP inspections.

  1. Changed15 schema fields changedv3.2.0
    • addedInput schema / properties / opponent
      Added value: +{
      +  "description": "Optional opponent team as species names, e.g. [\"Salamence\", \"Sneasler\", \"Kingambit\"]; the reply then recommends which four of your six to bring. This is what team preview gives you — species only, no sets — so the read is type-based. Unknown names return an isError.",
      +  "items": {
      +    "type": "string"
      +  },
      +  "maxItems": 6,
      +  "minItems": 1,
      +  "type": "array"
      +}
    • changedInput schema / properties / team / description
      Previous value: -"Team of up to 6 members, each a species with optional Tera type and moves."New value: +"Team of up to 6 members, each a species with optional moves and a set."
    • removedInput schema / properties / team / items / properties / teraType
      Removed value: -{
      -  "description": "Optional Tera type, e.g. \"Steel\"; when set it replaces the member’s defensive typing in the weakness tally.",
      -  "type": "string"
      -}
    • addedOutput schema / properties / bringFour
      Added value: +{
      +  "additionalProperties": false,
      +  "description": "Which four of the six to bring; present only when `opponent` was supplied.",
      +  "properties": {
      +    "atRiskTypes": {
      +      "description": "Types at least two of the recommended four are weak to with none of them resisting or immune — the cost of the cut, worth knowing before you commit to it.",
      +      "items": {
      +        "type": "string"
      +      },
      +      "type": "array"
      +    },
      +    "leftBehind": {
      +      "description": "The members not recommended; empty when the team has four or fewer.",
      +      "items": {
      +        "additionalProperties": false,
      +        "properties": {
      +          "defensive": {
      +            "description": "Opponent species that hit this member super-effectively on their STAB alone — team preview shows no sets.",
      +            "maximum": 9007199254740991,
      +            "minimum": -9007199254740991,
      +            "type": "integer"
      +          },
      +          "offensive": {
      +            "description": "Opponent species this member hits super-effectively, from STAB or a supplied move.",
      +            "maximum": 9007199254740991,
      +            "minimum": -9007199254740991,
      +            "type": "integer"
      +          },
      +          "score": {
      +            "description": "`offensive` minus `defensive`: the ranking key.",
      +            "maximum": 9007199254740991,
      +            "minimum": -9007199254740991,
      +            "type": "integer"
      +          },
      +          "species": {
      +            "description": "Species name of the member.",
      +            "type": "string"
      +          }
      +        },
      +        "required": [
      +          "species",
      +          "offensive",
      +          "defensive",
      +          "score"
      +        ],
      +        "type": "object"
      +      },
      +      "type": "array"
      +    },
      +    "note": {
      +      "description": "How the pick is scored, and what it cannot see.",
      +      "type": "string"
      +    },
      +    "opponent": {
      +      "description": "The opponent team as resolved species names, in the order supplied.",
      +      "items": {
      +        "type": "string"
      +      },
      +      "type": "array"
      +    },
      +    "picks": {
      +      "description": "Up to four members to bring, best first — fewer only when the team itself has fewer than four.",
      +      "items": {
      +        "additionalProperties": false,
      +        "properties": {
      +          "defensive": {
      +            "description": "Opponent species that hit this member super-effectively on their STAB alone — team preview shows no sets.",
      +            "maximum": 9007199254740991,
      +            "minimum": -9007199254740991,
      +            "type": "integer"
      +          },
      +          "offensive": {
      +            "description": "Opponent species this member hits super-effectively, from STAB or a supplied move.",
      +            "maximum": 9007199254740991,
      +            "minimum": -9007199254740991,
      +            "type": "integer"
      +          },
      +          "score": {
      +            "description": "`offensive` minus `defensive`: the ranking key.",
      +            "maximum": 9007199254740991,
      +            "minimum": -9007199254740991,
      +            "type": "integer"
      +          },
      +          "species": {
      +            "description": "Species name of the member.",
      +            "type": "string"
      +          }
      +        },
      +        "required": [
      +          "species",
      +          "offensive",
      +          "defensive",
      +          "score"
      +        ],
      +        "type": "object"
      +      },
      +      "type": "array"
      +    }
      +  },
      +  "required": [
      +    "opponent",
      +    "picks",
      +    "leftBehind",
      +    "atRiskTypes",
      +    "note"
      +  ],
      +  "type": "object"
      +}
    • changedOutput schema / properties / defensiveWeaknesses / description
      Previous value: -"One entry for each of the 18 classic types (keyed by type name, e.g. \"Fire\"), tallying how the team fares defensively against that type. A member is counted on its Tera type instead of its own types when a Tera type was supplied."New value: +"One entry for each of the 18 classic types (keyed by type name, e.g. \"Fire\"), tallying how the team fares defensively against that type."
    • changedOutput schema / properties / offensiveCoverage / properties / coveredBy / description
      Previous value: -"One entry for each of the 18 classic types (keyed by the defending type), listing the team members that hit it super-effectively from STAB, Tera type, or a supplied move type; an empty array means nobody does."New value: +"One entry for each of the 18 classic types (keyed by the defending type), listing the team members that hit it super-effectively from STAB or a supplied move type; an empty array means nobody does."
    • changedOutput schema / properties / speed / properties / fasterThreatCount / description
      Previous value: -"How many legal species outspeed the fastest member; present only when `regulation` was supplied."New value: +"How many legal species have a higher base Speed than the team’s fastest member; present only when `regulation` was supplied. A base-stat count only — `threatCoverage` applies each threat’s real nature, EVs and Mega form."
    • removedOutput schema / properties / speed / properties / fasterThreats
      Removed value: -{
      -  "description": "Up to 20 of those threats, fastest first, cut off at that limit; present only when `regulation` was supplied — compare with `fasterThreatCount` for the full total.",
      -  "items": {
      -    "additionalProperties": false,
      -    "properties": {
      -      "baseSpe": {
      -        "description": "Its base Speed stat, higher than the team’s fastest.",
      -        "maximum": 9007199254740991,
      -        "minimum": -9007199254740991,
      -        "type": "integer"
      -      },
      -      "species": {
      -        "description": "Legal species name.",
      -        "type": "string"
      -      }
      -    },
      -    "required": [
      -      "species",
      -      "baseSpe"
      -    ],
      -    "type": "object"
      -  },
      -  "type": "array"
      -}
    • removedOutput schema / properties / speed / properties / note
      Removed value: -{
      -  "description": "Caveat that threats are base-speed comparisons only; present only when `regulation` was supplied.",
      -  "type": "string"
      -}
    • removedOutput schema / properties / team / items / properties / teraType
      Removed value: -{
      -  "description": "Tera type supplied for this member; when set it replaces the member’s typing defensively and is added to its attacking types. Absent when none was given.",
      -  "type": "string"
      -}
    • addedOutput schema / properties / threatCoverage / properties / fastestSpeed
      Added value: +{
      +  "description": "Your fastest member’s Speed at level 50 with the sets you supplied — the value every `outspeed` below is judged against.",
      +  "maximum": 9007199254740991,
      +  "minimum": -9007199254740991,
      +  "type": "integer"
      +}
    • removedOutput schema / properties / threatCoverage / properties / threats / items / properties / fastestSpeed
      Removed value: -{
      -  "description": "Your fastest member’s Speed at level 50 with the sets you supplied.",
      -  "maximum": 9007199254740991,
      -  "minimum": -9007199254740991,
      -  "type": "integer"
      -}
    • changedOutput schema / properties / threatCoverage / properties / threats / items / properties / hitMultiplier / description
      Previous value: -"Best type multiplier your team has against it, from STAB, Tera type and supplied moves; 0 when nothing can hit it at all."New value: +"Best type multiplier your team has against it, from STAB and supplied moves; 0 when nothing can hit it at all."
    • changedOutput schema / properties / threatCoverage / properties / threats / items / required
      Previous value: -[
      -  "species",
      -  "usage",
      -  "threatSpeed",
      -  "fastestSpeed",
      -  "outspeed",
      -  "hitMultiplier",
      -  "answered"
      -]New value: +[
      +  "species",
      +  "usage",
      +  "threatSpeed",
      +  "outspeed",
      +  "hitMultiplier",
      +  "answered"
      +]
    • changedOutput schema / properties / threatCoverage / required
      Previous value: -[
      -  "regulation",
      -  "sourceAsOf",
      -  "threats",
      -  "unanswered",
      -  "unansweredCount",
      -  "note"
      -]New value: +[
      +  "regulation",
      +  "sourceAsOf",
      +  "fastestSpeed",
      +  "threats",
      +  "unanswered",
      +  "unansweredCount",
      +  "note"
      +]
  2. Changed5 schema fields changedv2.0.2
    • addedInput schema / properties / team / items / properties / championsPoints
      Added value: +{
      +  "additionalProperties": {
      +    "type": "number"
      +  },
      +  "description": "Optional Champions stat points, e.g. { spe: 32 }; only Speed affects this analysis, and it is an alternative to `evs`.",
      +  "propertyNames": {
      +    "type": "string"
      +  },
      +  "type": "object"
      +}
    • addedInput schema / properties / team / items / properties / evs
      Added value: +{
      +  "additionalProperties": {
      +    "type": "number"
      +  },
      +  "description": "Optional spread in the 0-252 scale; only Speed affects this analysis.",
      +  "propertyNames": {
      +    "type": "string"
      +  },
      +  "type": "object"
      +}
    • addedInput schema / properties / team / items / properties / item
      Added value: +{
      +  "description": "Optional held item, e.g. \"Choice Scarf\"; Choice Scarf multiplies the member’s Speed by 1.5 in the threat coverage.",
      +  "type": "string"
      +}
    • addedInput schema / properties / team / items / properties / nature
      Added value: +{
      +  "description": "Optional nature, e.g. \"Jolly\"; with a spread it sets the member’s real Speed for the threat coverage, otherwise Speed is left neutral and uninvested.",
      +  "type": "string"
      +}
    • addedOutput schema / properties / threatCoverage
      Added value: +{
      +  "additionalProperties": false,
      +  "description": "How the team fares against the regulation’s most-used sets; present only when a regulation with a usage-derived threat list was supplied.",
      +  "properties": {
      +    "note": {
      +      "description": "How the comparison is made, and what it does not model.",
      +      "type": "string"
      +    },
      +    "regulation": {
      +      "description": "Display name of the regulation whose threat list was used, e.g. \"Regulation Set M-C\".",
      +      "type": "string"
      +    },
      +    "sourceAsOf": {
      +      "description": "ISO date of the newest data point behind that threat list.",
      +      "type": "string"
      +    },
      +    "threats": {
      +      "description": "One entry per threat in the regulation’s list, most used first.",
      +      "items": {
      +        "additionalProperties": false,
      +        "properties": {
      +          "answered": {
      +            "description": "True when the team has a super-effective (≥2x) hit on it.",
      +            "type": "boolean"
      +          },
      +          "fastestSpeed": {
      +            "description": "Your fastest member’s Speed at level 50 with the sets you supplied.",
      +            "maximum": 9007199254740991,
      +            "minimum": -9007199254740991,
      +            "type": "integer"
      +          },
      +          "hitBy": {
      +            "description": "The member providing that best hit; absent when nothing hits it super-effectively.",
      +            "type": "string"
      +          },
      +          "hitMultiplier": {
      +            "description": "Best type multiplier your team has against it, from STAB, Tera type and supplied moves; 0 when nothing can hit it at all.",
      +            "type": "number"
      +          },
      +          "hitVia": {
      +            "description": "The attacking type providing it; absent when nothing hits it super-effectively.",
      +            "type": "string"
      +          },
      +          "outspeed": {
      +            "description": "True when your fastest member moves first.",
      +            "type": "boolean"
      +          },
      +          "species": {
      +            "description": "The threat as the meta plays it, e.g. \"Salamence-Mega\".",
      +            "type": "string"
      +          },
      +          "threatSpeed": {
      +            "description": "Its Speed at level 50 with its own nature, EVs and Mega form.",
      +            "maximum": 9007199254740991,
      +            "minimum": -9007199254740991,
      +            "type": "integer"
      +          },
      +          "usage": {
      +            "description": "Share of the sampled teams carrying it, in percent.",
      +            "type": "number"
      +          }
      +        },
      +        "required": [
      +          "species",
      +          "usage",
      +          "threatSpeed",
      +          "fastestSpeed",
      +          "outspeed",
      +          "hitMultiplier",
      +          "answered"
      +        ],
      +        "type": "object"
      +      },
      +      "type": "array"
      +    },
      +    "unanswered": {
      +      "description": "Threats with no super-effective hit from this team — the coverage holes to fix first.",
      +      "items": {
      +        "type": "string"
      +      },
      +      "type": "array"
      +    },
      +    "unansweredCount": {
      +      "description": "How many threats are unanswered.",
      +      "maximum": 9007199254740991,
      +      "minimum": -9007199254740991,
      +      "type": "integer"
      +    }
      +  },
      +  "required": [
      +    "regulation",
      +    "sourceAsOf",
      +    "threats",
      +    "unanswered",
      +    "unansweredCount",
      +    "note"
      +  ],
      +  "type": "object"
      +}
  3. Changed6 schema fields changedv1.1.1
    • addedInput schema / properties / regulation / description
      Added value: +"Optional regulation set id, e.g. \"m-c\"; when given, the reply also lists legal threats whose base speed beats your fastest member. Unknown ids return an isError."
    • addedInput schema / properties / team / description
      Added value: +"Team of up to 6 members, each a species with optional Tera type and moves."
    • addedInput schema / properties / team / items / properties / moves / description
      Added value: +"Optional move names, e.g. [\"Knock Off\"]; their types widen offensive coverage. Unknown names are reported, not fatal."
    • addedInput schema / properties / team / items / properties / species / description
      Added value: +"Species name as it appears in Showdown, e.g. \"Incineroar\", \"Garchomp\"."
    • addedInput schema / properties / team / items / properties / teraType / description
      Added value: +"Optional Tera type, e.g. \"Steel\"; when set it replaces the member’s defensive typing in the weakness tally."
    • changedOutput schema / (root)
      Previous value: -nullNew value: +{
      +  "$schema": "http://json-schema.org/draft-07/schema#",
      +  "additionalProperties": false,
      +  "properties": {
      +    "atRiskTypes": {
      +      "description": "The stacked-weakness types: at least two members weak to it and nobody resisting or immune. Empty means no such hole.",
      +      "items": {
      +        "type": "string"
      +      },
      +      "type": "array"
      +    },
      +    "defensiveWeaknesses": {
      +      "additionalProperties": {
      +        "additionalProperties": false,
      +        "properties": {
      +          "immune": {
      +            "description": "How many members are immune to it.",
      +            "maximum": 9007199254740991,
      +            "minimum": -9007199254740991,
      +            "type": "integer"
      +          },
      +          "resist": {
      +            "description": "How many members resist it (damage below neutral).",
      +            "maximum": 9007199254740991,
      +            "minimum": -9007199254740991,
      +            "type": "integer"
      +          },
      +          "weak": {
      +            "description": "How many members take super-effective damage from this attacking type.",
      +            "maximum": 9007199254740991,
      +            "minimum": -9007199254740991,
      +            "type": "integer"
      +          },
      +          "weakBy": {
      +            "description": "Species names of the members weak to it, in team order; empty when none are.",
      +            "items": {
      +              "type": "string"
      +            },
      +            "type": "array"
      +          }
      +        },
      +        "required": [
      +          "weak",
      +          "resist",
      +          "immune",
      +          "weakBy"
      +        ],
      +        "type": "object"
      +      },
      +      "description": "One entry for each of the 18 classic types (keyed by type name, e.g. \"Fire\"), tallying how the team fares defensively against that type. A member is counted on its Tera type instead of its own types when a Tera type was supplied.",
      +      "propertyNames": {
      +        "type": "string"
      +      },
      +      "type": "object"
      +    },
      +    "offensiveCoverage": {
      +      "additionalProperties": false,
      +      "description": "Super-effective coverage of all 18 defending types.",
      +      "properties": {
      +        "coveredBy": {
      +          "additionalProperties": {
      +            "items": {
      +              "type": "string"
      +            },
      +            "type": "array"
      +          },
      +          "description": "One entry for each of the 18 classic types (keyed by the defending type), listing the team members that hit it super-effectively from STAB, Tera type, or a supplied move type; an empty array means nobody does.",
      +          "propertyNames": {
      +            "type": "string"
      +          },
      +          "type": "object"
      +        },
      +        "note": {
      +          "description": "Reminder of which attacking types this coverage was computed from.",
      +          "type": "string"
      +        },
      +        "uncoveredSuperEffectively": {
      +          "description": "Defending types no member hits super-effectively.",
      +          "items": {
      +            "type": "string"
      +          },
      +          "type": "array"
      +        }
      +      },
      +      "required": [
      +        "coveredBy",
      +        "uncoveredSuperEffectively",
      +        "note"
      +      ],
      +      "type": "object"
      +    },
      +    "score": {
      +      "additionalProperties": false,
      +      "description": "Transparent heuristic 0-100 scoring of the team.",
      +      "properties": {
      +        "coverage": {
      +          "description": "0-100 share of the 18 types the team hits super-effectively.",
      +          "maximum": 9007199254740991,
      +          "minimum": -9007199254740991,
      +          "type": "integer"
      +        },
      +        "defensive": {
      +          "description": "0-100 score penalising stacked weaknesses, floored at 0.",
      +          "maximum": 9007199254740991,
      +          "minimum": -9007199254740991,
      +          "type": "integer"
      +        },
      +        "note": {
      +          "description": "What each component means and the reminder that this is a heuristic, not a metagame rating.",
      +          "type": "string"
      +        },
      +        "overall": {
      +          "description": "Rounded mean of the component scores, 0-100.",
      +          "maximum": 9007199254740991,
      +          "minimum": -9007199254740991,
      +          "type": "integer"
      +        },
      +        "speed": {
      +          "description": "0-100 score dropping 2 points per legal faster threat; present only when `regulation` was supplied.",
      +          "maximum": 9007199254740991,
      +          "minimum": -9007199254740991,
      +          "type": "integer"
      +        }
      +      },
      +      "required": [
      +        "overall",
      +        "defensive",
      +        "coverage",
      +        "note"
      +      ],
      +      "type": "object"
      +    },
      +    "speed": {
      +      "additionalProperties": false,
      +      "description": "Where the team sits on the speed spectrum, plus legal faster threats when a regulation was given.",
      +      "properties": {
      +        "fasterThreatCount": {
      +          "description": "How many legal species outspeed the fastest member; present only when `regulation` was supplied.",
      +          "maximum": 9007199254740991,
      +          "minimum": -9007199254740991,
      +          "type": "integer"
      +        },
      +        "fasterThreats": {
      +          "description": "Up to 20 of those threats, fastest first, cut off at that limit; present only when `regulation` was supplied — compare with `fasterThreatCount` for the full total.",
      +          "items": {
      +            "additionalProperties": false,
      +            "properties": {
      +              "baseSpe": {
      +                "description": "Its base Speed stat, higher than the team’s fastest.",
      +                "maximum": 9007199254740991,
      +                "minimum": -9007199254740991,
      +                "type": "integer"
      +              },
      +              "species": {
      +                "description": "Legal species name.",
      +                "type": "string"
      +              }
      +            },
      +            "required": [
      +              "species",
      +              "baseSpe"
      +            ],
      +            "type": "object"
      +          },
      +          "type": "array"
      +        },
      +        "fastest": {
      +          "additionalProperties": false,
      +          "description": "The fastest member of the team.",
      +          "properties": {
      +            "baseSpe": {
      +              "description": "Its base Speed stat.",
      +              "maximum": 9007199254740991,
      +              "minimum": -9007199254740991,
      +              "type": "integer"
      +            },
      +            "species": {
      +              "description": "Species name of the team’s fastest member by base Speed.",
      +              "type": "string"
      +            }
      +          },
      +          "required": [
      +            "species",
      +            "baseSpe"
      +          ],
      +          "type": "object"
      +        },
      +        "note": {
      +          "description": "Caveat that threats are base-speed comparisons only; present only when `regulation` was supplied.",
      +          "type": "string"
      +        },
      +        "regulation": {
      +          "description": "Display name of the regulation that was checked; present only when `regulation` was supplied.",
      +          "type": "string"
      +        },
      +        "slowest": {
      +          "additionalProperties": false,
      +          "description": "The slowest member of the team.",
      +          "properties": {
      +            "baseSpe": {
      +              "description": "Its base Speed stat.",
      +              "maximum": 9007199254740991,
      +              "minimum": -9007199254740991,
      +              "type": "integer"
      +            },
      +            "species": {
      +              "description": "Species name of the team’s slowest member by base Speed.",
      +              "type": "string"
      +            }
      +          },
      +          "required": [
      +            "species",
      +            "baseSpe"
      +          ],
      +          "type": "object"
      +        }
      +      },
      +      "required": [
      +        "fastest",
      +        "slowest"
      +      ],
      +      "type": "object"
      +    },
      +    "team": {
      +      "description": "The analysed team in the order it was supplied, each member with the typing actually used for the analysis.",
      +      "items": {
      +        "additionalProperties": false,
      +        "properties": {
      +          "baseSpe": {
      +            "description": "Base Speed stat of the species, used for the speed placement below.",
      +            "maximum": 9007199254740991,
      +            "minimum": -9007199254740991,
      +            "type": "integer"
      +          },
      +          "moveTypes": {
      +            "description": "Types of the supplied moves that were recognised, e.g. [\"Dark\"]; unrecognised move names are left out here and listed in `unknownMoves`.",
      +            "items": {
      +              "type": "string"
      +            },
      +            "type": "array"
      +          },
      +          "species": {
      +            "description": "Resolved species name, e.g. \"Great Tusk\".",
      +            "type": "string"
      +          },
      +          "teraType": {
      +            "description": "Tera type supplied for this member; when set it replaces the member’s typing defensively and is added to its attacking types. Absent when none was given.",
      +            "type": "string"
      +          },
      +          "types": {
      +            "description": "The species’ types as the dataset defines them, e.g. [\"Ground\", \"Fighting\"].",
      +            "items": {
      +              "type": "string"
      +            },
      +            "type": "array"
      +          }
      +        },
      +        "required": [
      +          "species",
      +          "types",
      +          "baseSpe",
      +          "moveTypes"
      +        ],
      +        "type": "object"
      +      },
      +      "type": "array"
      +    },
      +    "unknownMoves": {
      +      "description": "Deduplicated move names that were not found in the dataset and so contributed no coverage; omitted entirely when every move resolved.",
      +      "items": {
      +        "type": "string"
      +      },
      +      "type": "array"
      +    }
      +  },
      +  "required": [
      +    "team",
      +    "defensiveWeaknesses",
      +    "atRiskTypes",
      +    "offensiveCoverage",
      +    "speed",
      +    "score"
      +  ],
      +  "type": "object"
      +}
  4. First observedv0.1.0

TDQS

A4.9/5.0
Behavior5/5

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

The description discloses important behaviors beyond the annotations: it is read-only and offline, unknown moves are collected into `unknownMoves`, unknown species or regulation ids produce errors, Speed-related set details affect coverage, and the score is explicitly 'a quick signal, not a metagame rating.' This is unusually transparent.

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

Conciseness4/5

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

The purpose is front-loaded and every clause adds useful information, but the description is a single dense run-on paragraph. Better paragraph breaks would improve scanability without adding length.

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?

For a complex analysis tool, the description covers inputs, optional modes, error behavior, limitation of the score, and read-only/offline nature. With an output schema present, nothing essential is left unexplained.

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

Parameters5/5

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

Even though schema coverage is 100%, the description adds real meaning to all three parameters: `regulation` triggers `threatCoverage`, `opponent` triggers `bringFour`, and team entries allow optional moves/set details whose unknown values are handled gracefully. It also clarifies that only Speed matters for EV/nature/item effects.

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 the specific resource ('a whole team') and the analysis performed: per-type weak/resist/immune counts, coverage, speed placement, and a 0-100 heuristic score. It further distinguishes optional modes for regulation and opponent, and explicitly contrasts itself with get_type_matchup/get_type for single matchups.

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?

It says directly to use `get_type_matchup` or `get_type` for one matchup, implying this tool is for whole-team analysis. It also explains when the `regulation` and `opponent` parameters change the report, giving an agent clear situational routing.

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