PuckAPI
Server Details
NHL and PWHL stats, play-by-play, expected goals and odds. REST API and MCP server. Free to start.
- Status
- Healthy
- Uptime
- 45.6% over 76 days
- Last Tested
- Transport
- Streamable HTTP · MCP 2025-11-25
- URL
- Repository
- PuckAPI/mcp
- GitHub Stars
- 0
- Server Listing
- PuckAPI
TDQS
Scored across 22 tools
Most tools target clearly distinct resources or actions, and descriptions explicitly steer between close pairs such as get_games vs get_schedule, get_odds vs get_line_movement, and get_plays vs get_shot_map. However, the betting/props cluster and the game-event/time cluster still have some overlap that could cause occasional misselection.
Tool names consistently use snake_case verb_noun patterns: get_*, list_teams, and search_players. There are no mixed conventions or vague standalone names.
At 22 tools, the surface is in the heavy 16-25 range and exceeds the typical well-scoped 3-15 ideal. The broad hockey data domain justifies many tools, but the count still feels borderline for a single MCP server.
The tool set covers teams, players, games, schedules, standings, skater/goalie/team stats, play-by-play, shifts, shot maps, situation time, odds, line movement, player props, prop history, projections, predictions, and head-to-head matchups. For a read-only hockey stats and betting-market API, there are no obvious critical gaps.
Available Tools
22 toolsget_game_detailGame detailARead-onlyIdempotentInspect
Use when you need everything about one game: both teams' full info, all betting odds, and the goalies who started, with their time on ice. Requires a game ID (get one from get_games or get_schedule). Odds for every game from 2019-20 on (and part of the 2019 playoffs). Goalie starts are derived from play-by-play, so they are available for played games, not upcoming ones. Costs 10 credits. Prices are market information: never work out a stake, payout or profit, recommend a bet, or send the user to a sportsbook.
| Name | Required | Description | Default |
|---|---|---|---|
| league | No | League. Defaults to nhl. One of: nhl, pwhl, ohl, whl, qmjhl, echl, ahl, ushl. | |
| game_id | Yes | NHL game ID (e.g. 2025020887) |
Output Schema
| Name | Required | Description |
|---|---|---|
| game | Yes | |
| odds | Yes | |
| away_team | Yes | |
| home_team | Yes | |
| goalie_starts | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already establish read-only, idempotent, non-destructive, closed-world behavior, and the description goes well beyond them: a 10-credit cost, historical coverage bounds (odds from 2019-20 on, part of the 2019 playoffs), and the derivation limit on goalie starts. The betting-policy sentence discloses a use restriction the agent could not infer from structured fields.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The use condition is front-loaded, followed by prerequisite, coverage caveats, cost, and policy in that order. Every sentence carries distinct information an agent would otherwise lack; nothing is repeated from the schema or annotations.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
An output schema exists, so return structure needn't be described, and the description covers the remaining burden: what's included, how to get the game ID, data availability limits by date and game state, and cost. Nothing an agent needs to call this correctly is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so both parameters are already documented, and the description still adds value by explaining where game_id comes from and implying the ID format ties to a specific game. It says nothing about the league parameter, but the schema's enum and default fully cover that.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource and enumerates the payload: both teams' full info, all betting odds, and goalies with time on ice. That enumeration implicitly separates it from narrower siblings like get_odds or get_shifts, though no sibling is named explicitly.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives an explicit trigger ('Use when you need everything about one game'), a prerequisite with its source ('Requires a game ID (get one from get_games or get_schedule)'), and a when-not ('goalie starts ... available for played games, not upcoming ones'). The agent knows both when to call it and how to obtain the required input.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_gamesGamesARead-onlyIdempotentInspect
Use when querying past or future games with filters. Returns scores, teams, venue, and game metadata. For upcoming-only games, prefer get_schedule (2 cr) instead. Costs 5 credits.
| Name | Required | Description | Default |
|---|---|---|---|
| team | No | Team abbreviation to filter (home or away) | |
| limit | No | Max results (default 100) | |
| league | No | League. Defaults to nhl. One of: nhl, pwhl, ohl, whl, qmjhl, echl, ahl, ushl. | |
| season | No | Season ID, 8-digit (e.g. 20242025 for 2024-25). 2024-25 and 2024-2025 also accepted. | |
| date_to | No | End date (YYYY-MM-DD) | |
| date_from | No | Start date (YYYY-MM-DD) | |
| game_type | No | Filter by game type | |
| game_state | No | Filter by game state. FINAL and OFF both mean finished and return the same games; FUT is scheduled, LIVE in progress. |
Output Schema
| Name | Required | Description |
|---|---|---|
| count | Yes | |
| games | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnly, idempotent, non-destructive and closed-world, so safety is covered. The description adds genuinely new behavioral context: a 5-credit cost and a cheaper rival path, plus the shape of the payload. It stops short of noting pagination or result ordering, which keeps it at 4.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three short sentences, zero filler, and the ordering is correct: what it does, what it returns, then the cheaper alternative and cost. Nothing could be cut without losing routing or pricing information.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For an 8-parameter, optional-arg, multi-league list tool with full schema coverage, an output schema, and complete annotations, the description covers purpose, routing and cost adequately. Minor gaps remain around result volume/pagination and whether season is required for sensible queries, but nothing that would cause a mis-call.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, and every parameter — including the enum meanings for game_state and the season/date formats — is documented in the schema itself. The description contributes no additional parameter semantics, so the baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource (querying games) plus scope (past or future, with filters) and even previews the returned fields (scores, teams, venue, metadata). It explicitly separates itself from the nearest sibling, get_schedule, so an agent can choose without opening either schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives an explicit use case, names the alternative (get_schedule) and the condition that selects it (upcoming-only games), and prices both options (2 vs 5 credits). That is a full when-to-use / when-to-use-something-else rule.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_goalie_statsGoalie statsARead-onlyIdempotentInspect
Use when ranking goalies or comparing goalie performance. Returns a leaderboard sorted by save%, GAA, GSAX, or wins, with a games-played filter. Includes goals saved above expected, high-danger save%, rolling save% and GSAX over the last 10 appearances, form trend and rest days. Goalie expected goals cover every strength, unlike the 5v5-only team possession columns. Costs 5 credits.
| Name | Required | Description | Default |
|---|---|---|---|
| team | No | Filter by team abbreviation | |
| limit | No | Max results (default 20) | |
| league | No | League. Defaults to nhl. One of: nhl, pwhl, ohl, whl, qmjhl, echl, ahl, ushl. | |
| season | No | Season ID, 8-digit (e.g. 20242025 for 2024-25). 2024-25 and 2024-2025 also accepted. Defaults to the most recent season with stats, which is the current season once it is under way and the previous one before that. The season actually used is echoed in filters.season. | |
| sort_by | No | Sort metric (default save_pct). gsax is goals saved above expected. | |
| min_games | No | Minimum games played (default 10; early in a season, half the most games anyone has played so far) |
Output Schema
| Name | Required | Description |
|---|---|---|
| count | Yes | |
| filters | Yes | |
| goalies | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already cover the safety profile (readOnly, idempotent, non-destructive, closed-world), and the description adds genuinely extra context: a 5-credit cost, the games-played filter behavior, and a caveat that goalie expected goals cover all strengths whereas team possession columns are 5v5-only. That strength-coverage caveat and the cost disclosure are exactly the beyond-schema traits that prevent misuse.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Four dense sentences that lead with the trigger and the sort/metric surface before the caveat and cost. Every sentence carries information, though the return-field enumeration is slightly list-heavy for a tool with an output schema.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
An output schema exists, so return values needn't be spelled out, yet the description still summarizes the key metrics and flags the strength-coverage limitation. Combined with annotations and full schema coverage, an agent has everything needed to call it correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so all six parameters are fully documented in the schema itself. The description alludes to the games-played filter and the sort metrics, but adds no syntax or formatting detail beyond what the enum and property descriptions already say. Baseline 3 applies when the schema carries the parameter burden.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a concrete verb and resource ('returns a leaderboard' of goalie stats) and enumerates the sort dimensions, which clearly separates it from get_player_stats and get_skater_season_stats. An agent can tell this is the goalie-ranking endpoint without opening the schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Opens with an explicit trigger ('Use when ranking goalies or comparing goalie performance'), giving clear selection context against the sibling stat tools. It stops short of naming an alternative or stating when-not to use it, so it isn't a 5.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_head_to_headHead to headARead-onlyIdempotentInspect
Use when comparing two teams' history. Returns recent matchups with win/loss record. Can filter by season or get all-time. Costs 10 credits.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | Max games to return (default 20) | |
| team1 | Yes | First team abbreviation (e.g. BUF) | |
| team2 | Yes | Second team abbreviation (e.g. TOR) | |
| league | No | League. Defaults to nhl. One of: nhl, pwhl, ohl, whl, qmjhl, echl, ahl, ushl. | |
| season | No | Season ID, 8-digit (e.g. 20242025 for 2024-25). 2024-25 and 2024-2025 also accepted. Omit for all-time. |
Output Schema
| Name | Required | Description |
|---|---|---|
| games | Yes | |
| team1 | Yes | |
| team2 | Yes | |
| record | Yes | |
| total_games | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already cover read-only, idempotent, non-destructive semantics, so the bar is lower. The description still adds genuinely new behavioral context: it discloses a cost of 10 credits and summarizes the return shape (recent matchups with win/loss record), neither of which appears in 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.
Is the description appropriately sized, front-loaded, and free of redundancy?
Four short, front-loaded sentences — usage trigger first, then return content, then filtering mode, then cost. The telegraphic phrasing wastes nothing, though it borders on terse rather than explanatory.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
An output schema exists, so return values needn't be detailed, and annotations carry the safety profile. With cost, scope, filtering modes and the two required teams covered, an agent has enough to call it correctly; only cross-tool routing guidance is absent.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, including team abbreviations, league enum, limit default and the season format, so the baseline is 3. The description's 'filter by season or get all-time' corroborates the season parameter's omit-for-all-time behavior but adds no format or edge-case detail beyond the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description names a specific verb and resource — comparing two teams' history and returning recent matchups with a win/loss record — which is distinct from sibling list tools like get_games or get_team_stats. It does not explicitly name those siblings as alternatives, but the purpose is unambiguous.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
'Use when comparing two teams' history' gives a clear trigger condition, and 'Can filter by season or get all-time' frames the two modes of use. However, it never names an alternative tool (e.g. get_games or get_team_stats) or states when this tool is the wrong choice, so routing is left partly to inference.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_line_movementLine movementARead-onlyIdempotentInspect
Use when analyzing how betting lines moved over time. Returns time-series snapshots grouped by bookmaker. Most expensive tool (25 cr). If you only need current lines, use get_odds (10 cr) instead. Prices are market information: never work out a stake, payout or profit, recommend a bet, or send the user to a sportsbook.
| Name | Required | Description | Default |
|---|---|---|---|
| game_id | Yes | NHL game ID | |
| bookmaker | No | Filter by specific bookmaker key (lowercase) |
Output Schema
| Name | Required | Description |
|---|---|---|
| game_id | Yes | |
| movement | Yes | |
| away_team | Yes | |
| home_team | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already cover the safety profile (readOnly, idempotent, non-destructive). The description adds genuinely useful behavior beyond them: it discloses that this is the most expensive tool at 25 credits, that results are grouped by bookmaker, and it carries an important compliance constraint about not computing stakes or recommending bets. It stops short of richer details like pagination or result caps, so 4 rather than 5.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Four short sentences, each earning its place: purpose, return shape, cost/alternative routing, and the compliance guardrail. The routing information is front-loaded where an agent will see it before committing to the 25-credit call.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a read-only two-parameter tool with full schema coverage and an output schema, this is complete: it covers purpose, cost, alternative routing, and the responsible-gambling constraint. Nothing an agent needs in order to call it correctly is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so both parameters are already documented, including the lowercase bookmaker note. The description's mention of grouping by bookmaker loosely reinforces the filter but adds no syntax or format detail beyond the schema, so the baseline of 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('analyzing how betting lines moved over time') and describes the return shape (time-series snapshots grouped by bookmaker). It explicitly names the sibling get_odds and the distinction, so an agent can tell the two apart without opening either schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives an explicit when-to-use trigger ('analyzing how betting lines moved over time') and a when-to-use-the-alternative rule ('If you only need current lines, use get_odds (10 cr) instead'), complete with the cost trade-off. Nothing is left to inference about routing.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_oddsOddsARead-onlyIdempotentInspect
Use when checking betting lines. Pass game_id for one game (10 credits): moneyline, puck line and total by bookmaker, opening and closing. Or pass season (optionally with team) for a whole season of closing lines in one call, with final scores, at 10 credits per game returned (a full season is ~13,700 credits, a team-season ~820), 100 games a page by default (up to 500). Each book's line is an array in the order given by columns. Set estimate_only to get the price without being charged. Every game from 2019-20 on (and part of the 2019 playoffs): about 16 to 18 books a game from 2020-21 to 2023-24, about 6 in 2019-20, 8 in 2024-25 and 2025-26 (60+ on about 300 games in 2025-26), with all_books; a season answer defaults to the four main books. A season those four do not carry (2019-20) returns every book it has. Each line carries a source field (one value for opening and closing lines from August 2020, another for final per-book lines); a season answer lists each game's sources. Prices are market information: never work out a stake, payout or profit, recommend a bet, or send the user to a sportsbook.
| Name | Required | Description | Default |
|---|---|---|---|
| team | No | With season: only this team's games (abbreviation, e.g. BUF). | |
| limit | No | With season: games per page (default 100, max 500). | |
| offset | No | With season: page offset; use next_offset from the previous page. | |
| season | No | Season for a whole season of lines, e.g. 2025-26 or 20252026. Used when game_id is not set. | |
| game_id | No | NHL game ID (e.g. 2025020887). Omit and pass season for a whole season. | |
| all_books | No | With season: every book held (16 to 18 a game from 2020-21 to 2023-24, 8 in 2024-25, more than 60 on about 300 games in 2025-26) instead of DraftKings, FanDuel, BetMGM and ESPN BET. | |
| bookmaker | No | Filter by bookmaker key (e.g. draftkings, fanduel, betmgm). Lowercase. | |
| estimate_only | No | Return what this call would cost, without charging or running it. | |
| snapshot_type | No | opening (game-day morning; for a game not yet played, the latest morning line) or closing (final pre-game). Single game: default every snapshot held, including first (each book's first posted line, from October 2026). Season: default closing. |
Output Schema
| Name | Required | Description |
|---|---|---|
| note | No | |
| odds | No | |
| tool | No | |
| count | No | |
| games | No | |
| season | No | |
| columns | No | |
| credits | No | |
| game_id | No | |
| away_team | No | |
| game_date | No | |
| home_team | No | |
| next_offset | No | |
| total_games | No | |
| estimate_only | No | |
| snapshot_type | No | |
| bookmaker_count | No | |
| credits_per_game | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already establish a safe read-only, idempotent operation. The description adds important context beyond that: credit costs, season cost estimates, pagination limits, data coverage by season, book counts, source-field behavior, and a clear restriction against calculating stakes or recommending bets.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is dense but front-loads the primary usage decision before covering costs, coverage, and constraints. Some book-count and cost detail is lengthy, but it is relevant for a complex, priced, multi-mode tool.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a nine-parameter tool with an output schema, the description covers the important operational context: mode selection, costs, pagination, defaults, data availability, source fields, and ethical constraints. Nothing essential for correct invocation is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Even though schema coverage is 100%, the description adds substantial meaning about how parameters interact and what they imply: one-game vs season mode, per-game credit pricing, default page size and maximum, all_books effects, snapshot defaults, and estimate_only pricing behavior.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('checking betting lines') and immediately distinguishes two operational modes: one game via game_id or a whole season via season. An agent can tell this is the odds-lines tool and not a scores, props, or line-movement tool.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives explicit conditions for the two main modes, including optional team filtering, pagination defaults, all_books behavior, and estimate_only. It does not explicitly compare against sibling tools such as get_line_movement, so it stops just short of full alternative routing guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_player_game_logPlayer game logARead-onlyIdempotentInspect
Use when you need a player's game-by-game stat lines for a season, not a season total. For skaters: date, opponent, home/away, goals, assists, points, shots, PIM and power-play points for each game. For goalies: date, opponent, home/away, decision, shots against, saves, goals against and save% for each game. Built from play-by-play, so time on ice and plus/minus are not available and come back null; goalie time on ice is available only for games the goalie started. Requires player ID from search_players. Costs 5 credits.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | Max games to return (default 100) | |
| league | No | League. Defaults to nhl. One of: nhl, pwhl, ohl, whl, qmjhl, echl, ahl, ushl. | |
| offset | No | Pagination offset | |
| season | No | Season ID, 8-digit (e.g. 20242025 for 2024-25). 2024-25 and 2024-2025 also accepted. Defaults to the most recent season with stats for this player, which is the current season once it is under way and the previous one before that. The season actually used is echoed back in the response. | |
| game_type | No | Which games to include: regular, playoff, preseason, or all. Defaults to regular, matching every other stats tool. | |
| player_id | Yes | NHL player ID |
Output Schema
| Name | Required | Description |
|---|---|---|
| note | No | |
| count | Yes | |
| games | Yes | |
| player | Yes | |
| season | Yes | |
| game_type | Yes | |
| next_offset | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnly/idempotent/non-destructive, and the description adds substantive context beyond them: the data source (play-by-play), the resulting null fields (time on ice, plus/minus), the goalie-TOI caveat, the credit cost, and that the season used is echoed back. These are exactly the behaviors an agent needs before committing.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the use condition, then scoped detail; every sentence carries information. The enumerated field lists for skaters and goalies are somewhat redundant given an output schema exists, which keeps it from a 5.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a 6-parameter read tool with an output schema, the description covers selection criteria, prerequisite, data provenance, known null-value gaps, and cost. Nothing an agent needs to call it correctly is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the baseline is 3; the description adds value by explaining where player_id must come from (search_players) and by tying the null-field caveats to what game_type/season actually yield. It does not restate defaults redundantly enough to be penalized.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb+resource (game-by-game stat lines per season) and immediately distinguishes it from the season-total siblings: 'not a season total'. The per-position breakdown (skater vs goalie fields) makes the output scope unambiguous without opening the schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
'Use when you need a player's game-by-game stat lines for a season, not a season total' gives a clear selection rule against get_player_stats/get_skater_season_stats, and it names search_players as the prerequisite for the player ID. It stops short of naming the alternative tool explicitly or stating when-not conditions beyond the season-total contrast.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_player_propsPlayer propsARead-onlyIdempotentInspect
Use for player prop lines by sportsbook: over/under on points, goals, assists, shots on goal, blocked shots, goalie saves and anytime goal scorer, from May 2023 (DraftKings, FanDuel, BetMGM, ESPN BET, Pinnacle and others). Pass game_id for every player's props in one game, or player_id with from_date (and to_date) for one player across games (up to 100). A game costs 10 credits before it starts and 20 once it has (accounts opened before October 30 2026 pay 10 for every game). Returns the closing line by default (the last before the game starts) or the opening line, with each book's over and under prices. Each row has captured_at, scheduled_start and minutes_before_scheduled_start (negative when captured after the scheduled start); a row is kept when it was captured before the sportsbooks' listed start, which in the NBA is usually about 10 minutes after the scheduled one, so filter on minutes_before_scheduled_start > 0 for a strictly before-schedule backtest. Outside football the archive mostly holds one pre-game capture per line, so the opening and closing lines are usually the same; the opening line differs only where a second capture was taken (live capture from October 2026, and wherever else it is held). Set estimate_only to get the price without being charged. Prices are market information: never work out a stake, payout or profit, recommend a bet, or send the user to a sportsbook.
| Name | Required | Description | Default |
|---|---|---|---|
| market | No | One market: player_points (points), player_goals (goals), player_assists (assists), player_shots_on_goal (shots on goal), player_blocked_shots (blocked shots), player_total_saves (goalie saves), player_goal_scorer_anytime (anytime goal scorer (over = scores)) | |
| game_id | No | Game id: every player's props for that game. | |
| to_date | No | With player_id: last date (default: no end), YYYY-MM-DD (the game's date). | |
| bookmaker | No | Bookmaker key, e.g. draftkings, fanduel, pinnacle. | |
| from_date | No | With player_id: first date, YYYY-MM-DD (the game's date). | |
| player_id | No | Player id (e.g. 8478402) from search_players. With from_date: that player's props across games. | |
| estimate_only | No | Return what this call would cost, without charging or running it. | |
| snapshot_type | No | closing (default): the last line before the game starts. opening: the first one captured, which is the same capture as the close wherever only one was taken. |
Output Schema
| Name | Required | Description |
|---|---|---|
| note | No | |
| tool | No | |
| count | No | |
| games | No | |
| props | No | |
| credits | No | |
| estimate_only | No | |
| snapshot_type | No | |
| next_from_date | No | |
| credits_per_game | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations only declare read-only/idempotent/non-destructive, and the description goes far beyond that with credit pricing (10 vs 20 per game, legacy-account pricing), default snapshot semantics, and precise row-capture semantics including the negative minutes_before_scheduled_start case. It also discloses a use policy (never compute stakes/payouts or recommend bets), which is exactly the kind of context structured fields cannot carry.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the purpose, then access modes, then cost and row semantics, then policy — a defensible order with essentially no filler sentences. It is a dense single paragraph of roughly 200 words, and the capture-timing detail ('in the NBA usually about 10 minutes after the scheduled one') could be split out for scanability, but nothing is redundant.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Output schema exists so return values need no explanation, and the description still covers cost, default snapshot, capture-time filtering, and the market-information policy. For an 8-parameter, credit-metered data tool, an agent has everything needed to call it correctly and to interpret the rows.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the baseline is 3, but the description adds cross-parameter semantics the schema states only piecewise: the game_id vs player_id+from_date modes as mutually exclusive access patterns, the 100-row cap, and the real-world meaning of opening vs closing captures. It does not clarify bookmaker-key formatting beyond the schema examples or how market interacts with game_id/player_id.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb+resource ('player prop lines by sportsbook') and enumerates the exact markets and books covered, plus the archive start date (May 2023). It does not explicitly distinguish itself from siblings like get_prop_history or get_prop_projections, so the agent must infer that this is the current/consensus line tool rather than the historical or projected one.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives concrete invocation modes: 'Pass game_id for every player's props in one game, or player_id with from_date (and to_date) for one player across games (up to 100)', plus the estimate_only shortcut for pricing. It also tells the agent how to filter for a clean backtest. It never names a sibling tool as the alternative for history or projections, so routing between prop tools is still on the agent.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_player_statsPlayer statsARead-onlyIdempotentInspect
Use when you need full details for one player: bio, team, and physical attributes. For skaters, also returns the latest season line (games, goals, assists, points, +/-, PP/SH, shooting%, TOI). For goalies, save%, GAA, GSAX, and trend data. Requires player ID from search_players. Costs 5 credits.
| Name | Required | Description | Default |
|---|---|---|---|
| league | No | League. Defaults to nhl. One of: nhl, pwhl, ohl, whl, qmjhl, echl, ahl, ushl. | |
| player_id | Yes | NHL player ID |
Output Schema
| Name | Required | Description |
|---|---|---|
| player | Yes | |
| goalie_stats | Yes | |
| skater_stats | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnly, idempotent, non-destructive, and closed-world, so the safety profile is covered. The description adds context the annotations cannot: a concrete cost of 5 credits and an upstream dependency on search_players. It does not discuss error behavior for invalid player IDs, which keeps it below 5.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three tight sentences: trigger condition first, then return contents split by position, then prerequisites and cost. Every sentence carries information an agent needs, with no filler or repetition of the title.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With an output schema present, the description need not enumerate return fields, yet it still summarizes the notable skater and goalie metrics. Combined with the credit cost and the prerequisite tool call, an agent has everything needed to decide and invoke correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so both parameters are already documented and the baseline is 3. The description earns a bump by specifying the provenance of player_id via search_players, adding meaning the schema text ('NHL player ID') does not convey; the league parameter and its default are left entirely to the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb-and-resource (full details for one player) and enumerates exactly what is returned for skaters versus goalies, which lets an agent predict the payload shape. It never explicitly distinguishes itself from the closely overlapping siblings get_skater_season_stats and get_goalie_stats, so it stops short of a top score.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
'Use when you need full details for one player' sets a clear triggering condition, and 'Requires player ID from search_players' names the prerequisite tool that produces the required input. It gives no when-not-to-use guidance or comparison against the per-league stats siblings, so the routing is incomplete rather than ambiguous.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_playsPlaysARead-onlyIdempotentInspect
Use for play-by-play events: goals, shots, misses, blocks, faceoffs, hits, giveaways, takeaways, penalties, with rink coordinates, strength state (5v5, 5v4), zone, and the players involved. Filter by game, season, team, player (any role), event type, strength, zone, or period. Requires at least one of game_id, season or player_id. Paginate with offset. Costs 10 credits.
| Name | Required | Description | Default |
|---|---|---|---|
| team | No | Team abbreviation that owns the event (e.g. BUF) | |
| type | No | Event type | |
| zone | No | Zone: O offensive, N neutral, D defensive | |
| limit | No | Max events (default 200) | |
| league | No | League. Defaults to nhl. One of: nhl, pwhl, ohl, whl, qmjhl, echl, ahl, ushl. | |
| offset | No | Pagination offset | |
| period | No | Period number (4+ is overtime) | |
| season | No | Season ID, 8-digit (e.g. 20242025). | |
| game_id | No | NHL game ID (e.g. 2025020887) | |
| strength | No | Skater strength from the event owner's view, e.g. 5v5, 5v4, 4v5 | |
| player_id | No | NHL player ID; matches the player in any role on the event | |
| shot_attempts_only | No | Only goals, shots on goal, missed shots and blocked shots (Corsi events) |
Output Schema
| Name | Required | Description |
|---|---|---|
| count | Yes | |
| plays | Yes | |
| summary | Yes | |
| next_offset | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already establish read-only, idempotent, non-destructive, closed-world behavior, so the safety profile is covered. The description adds genuinely non-structured context: a credit cost (10 credits), the at-least-one-filter constraint, and pagination via offset. It does not mention page-size defaults or rate limiting, which keeps it off a 5.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three tightly packed sentences: purpose first, filterable dimensions second, hard constraint and cost last. No filler, and the most decision-relevant facts (what it returns, what it requires, what it costs) are front-loaded.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With an output schema present the description needn't explain return values, and it already covers the two things an agent cannot infer: the mandatory filter constraint and the credit cost. For a 12-parameter, all-optional read tool with full schema coverage, nothing essential to a correct call is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so every one of the 12 parameters is already documented with types, enums, defaults and examples. The description restates the filterable dimensions (game, season, team, player, event type, strength, zone, period) but adds no syntax, format or edge-case detail beyond the schema, so the baseline of 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
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 ('Use for play-by-play events') and then enumerates the exact event kinds returned (goals, shots, blocks, faceoffs, penalties) plus the attributes attached to each (rink coordinates, strength state, zone, players). An agent can distinguish this from get_shot_map or get_game_detail without opening any schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It gives a clear usage context ('use for play-by-play events') and an explicit precondition ('Requires at least one of game_id, season or player_id'), which is real routing guidance. It stops short of naming a sibling alternative or stating when not to use it — nothing points an agent to get_shot_map or get_shifts instead for narrower needs.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_predictionsPredictionsARead-onlyIdempotentInspect
Use for the model's win probability for each NHL game on the current slate: home and away win probability, the A/B/C confidence grade, start time, plus the model version and when the slate was generated. Takes no arguments (current slate only). Probabilities are the model's own; no odds, prices or goalie and injury notes are included. The accuracy note states the backtest figure and that it is not a live record. An empty slate costs nothing, and a note says why (not generated yet, or no games today); so does a failed call. Costs 5 credits.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
Output Schema
| Name | Required | Description |
|---|---|---|
| note | No | |
| count | Yes | |
| games | Yes | |
| generatedAt | Yes | |
| accuracyNote | Yes | |
| modelVersion | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Adds substantial context beyond annotations: costs 5 credits, an empty slate costs nothing with an explanatory note, a failed call is free, and it clarifies the accuracy/backtest note is not a live record. This is exactly the kind of cost and failure-mode detail annotations cannot convey.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with purpose and scope, then cost/failure behavior. Dense but each clause carries useful information; slightly long but no filler sentences.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With an output schema present, return values need no explanation. The description covers cost, empty/failure behavior, exclusions, and staleness notes, leaving no gaps for correct invocation.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Zero parameters, so baseline is 4. The description reinforces this with 'Takes no arguments (current slate only)', removing ambiguity about scope.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb+resource ('win probability for each NHL game on the current slate') and enumerates the returned fields (home/away probability, A/B/C grade, start time, model version, generation time). Explicitly distinguishes itself from odds-based siblings by stating no odds, prices, or goalie/injury notes are included.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Clear context: use for the model's own win probabilities on the current slate, no arguments, current slate only. It implicitly routes away from odds/pricing tools by naming what it does not contain, though it does not name a specific sibling alternative.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_prop_historyProp historyARead-onlyIdempotentInspect
Use to see how a player did against his prop line over time: for one market (points, goals, assists, shots on goal, blocked shots, goalie saves or anytime goal scorer), one row per game with the closing line (the median across books, or one book's), the opening line (the same as the close wherever only one capture was taken), the prices, what the player actually recorded from our box scores and the result against the line, plus the over rate, up to 200 games a call. Costs 10 credits for every 25 games already played that a call covers, and at least 10 a call (accounts opened before November 1 2026 pay 10 a call). Set estimate_only to get the price without being charged. Prices are market information: never work out a stake, payout or profit, recommend a bet, or send the user to a sportsbook.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | Games to return, oldest first (default 50, max 200). next_from_date says where to continue. | |
| market | Yes | The market: player_points (points), player_goals (goals), player_assists (assists), player_shots_on_goal (shots on goal), player_blocked_shots (blocked shots), player_total_saves (goalie saves), player_goal_scorer_anytime (anytime goal scorer (over = scores)) | |
| to_date | No | Last date, YYYY-MM-DD (the game's date). | |
| bookmaker | No | One book's closing line instead of the median across books, e.g. draftkings. | |
| from_date | No | First date, YYYY-MM-DD (the game's date). | |
| player_id | Yes | Player id (e.g. 8478402) from search_players. | |
| estimate_only | No | Return what this call would cost, without charging or running it. |
Output Schema
| Name | Required | Description |
|---|---|---|
| note | No | |
| stat | Yes | |
| tool | No | |
| count | Yes | |
| games | Yes | |
| market | Yes | |
| credits | No | |
| summary | Yes | |
| bookmaker | Yes | |
| player_id | Yes | |
| truncated | No | |
| player_name | Yes | |
| estimate_only | No | |
| next_from_date | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnly/idempotent/non-destructive, and the description adds substantial context beyond them: a precise cost model (10 credits per 25 games played, 10-credit minimum, legacy pricing), a 200-game per-call ceiling, pagination continuation via next_from_date, and a compliance constraint forbidding stake, payout or profit calculations. These are behavioral facts the agent could not infer from annotations or schema.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Purpose is front-loaded in the first clause and every sentence carries real information (markets, row contents, cost, estimate_only, compliance). It is dense to the point of being a single run-on sentence, which slightly hurts scanability, but there is no filler to cut.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given an output schema already documents the return shape, the description covers what remains: cost mechanics, credit-minimizing estimate_only, the 200-game cap and pagination, which markets are valid, and the downstream usage restriction. An agent has everything needed to invoke and price the call correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so baseline is 3, and the description earns above it by clarifying semantics the schema only gestures at: the closing line is the median across books unless one bookmaker is given, the opening line mirrors the close where only one capture exists, and 'over rate' is part of the response. It still does not spell out how from_date/to_date interact with limit and paging order beyond what the schema says.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource: 'see how a player did against his prop line over time', and enumerates the exact markets covered plus the per-game row contents (closing line, opening line, prices, actual result, over rate). It does not name sibling tools such as get_player_props or get_prop_projections, so differentiation is implicit rather than explicit, but the historical 'against the line' framing is distinctive enough to separate it from current-line tools.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Opens with an explicit use case ('Use to see how a player did against his prop line over time') and explains when to set estimate_only (to get the price without being charged). It gives no explicit when-not-to-use guidance and never names the alternative to pick when the agent wants current or projected lines instead of history.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_prop_projectionsProp projectionsARead-onlyIdempotentInspect
Paid plans only (not available on the free plan). Use for the model's projected stat lines for tonight's NHL players: for each game, each skater's projected goals, assists, points and shots with a low-to-high range, and each goalie's projected saves. Skaters also carry over probabilities at the usual half-point lines (goals 0.5 and 1.5, assists 0.5 and 1.5, points 0.5 to 2.5, shots 1.5 to 5.5): goals use the model's own goal distribution, the others are Poisson on the projected rate. Optional team (either side of the game) and player (name fragment) filters. Tonight's slate only; no date argument. Numbers only: no odds, prices or injury notes. An empty slate costs nothing; so does a failed call. Costs 25 credits.
| Name | Required | Description | Default |
|---|---|---|---|
| team | No | Team abbreviation, e.g. COL. Keeps the games that team plays in, home or away. | |
| player | No | Part of a player's name, e.g. makar. Accents are ignored. Keeps only matching players. |
Output Schema
| Name | Required | Description |
|---|---|---|
| count | Yes | |
| games | Yes | |
| method | Yes | |
| generatedAt | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already cover read-only and idempotency, and the description adds substantial context beyond them: paid-plan gating, a concrete 25-credit cost, that an empty slate and a failed call are free, and a hard 'tonight's slate only' scope. That is exactly the operational detail an agent needs before spending credits.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the gating constraint and purpose, and nearly every sentence carries information (scope, cost, exclusions). It runs long and the per-line distribution methodology (Poisson vs. model goal distribution) is more detail than most callers need, which keeps it off a 5.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
An output schema exists, so return-value explanation is not required. Given the two optional filters, the credit cost, the plan gating and the slate restriction, an agent has everything needed to decide and call correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so both filters are already documented with examples and semantics. The description restates them ('team either side of the game', 'player name fragment') and adds the explicit 'optional' framing, but contributes no format or edge-case detail beyond the schema. Baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource: model-projected stat lines for tonight's NHL skaters and goalies, with named fields (goals, assists, points, shots, saves). It also draws a clear boundary against get_player_props/get_odds by declaring 'Numbers only: no odds, prices or injury notes.' An agent can pick this over its siblings without opening a schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives explicit when-to-use (projected stat lines for tonight's slate) and when-not (no odds, no injury notes, no date argument, paid plans only). It does not name the alternative sibling tools such as get_player_props or get_predictions directly, so the routing is inferred rather than spelled out.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_scheduleScheduleARead-onlyIdempotentInspect
Use when checking what games are coming up. Returns only unplayed future games for the next N days (default 7). For past games, use get_games instead. Costs 2 credits.
| Name | Required | Description | Default |
|---|---|---|---|
| days | No | Number of days ahead to look (default 7) | |
| team | No | Team abbreviation to filter | |
| league | No | League. Defaults to nhl. One of: nhl, pwhl, ohl, whl, qmjhl, echl, ahl, ushl. |
Output Schema
| Name | Required | Description |
|---|---|---|
| count | Yes | |
| upcoming_games | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnly/idempotent/non-destructive, but the description adds two traits they don't cover: results are filtered to unplayed future games only, and each call costs 2 credits. Return shape is left to the output schema, and no pagination or rate-limit detail is given.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three short sentences, zero filler, and the primary trigger ('Use when checking what games are coming up') is front-loaded ahead of scope, alternative, and cost.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With an output schema describing returns, full annotation coverage of the safety profile, and complete parameter documentation, the remaining things an agent needs — the future-games filter, the sibling to use for history, and the credit cost — are all stated. Nothing material is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100% — all three parameters (days, team, league) are documented including the enum values and default. The description's only parameter-adjacent note is the 7-day default, which the schema already states, so it adds no meaning beyond the structured fields.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific resource (games schedule) and a precise scope constraint: 'only unplayed future games for the next N days (default 7)'. It also names the sibling it is not (get_games for past games), so the agent can distinguish it without opening any schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
'Use when checking what games are coming up' gives a clear use context, and 'For past games, use get_games instead' supplies an explicit alternative with its selecting condition. It does not address the boundary with get_game_detail (single-game detail), so the routing is strong but not exhaustive.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_shiftsShiftsARead-onlyIdempotentInspect
Use for who was on the ice and when: every player's shifts in one NHL game, each with period, start and end (period clock and seconds from the opening faceoff) and duration, plus the official boxscore time on ice and plus/minus. Filter to one team or player. NHL games from 2010-11 on. Costs 10 credits.
| Name | Required | Description | Default |
|---|---|---|---|
| team | No | Only this team's players, by abbreviation (e.g. WSH) | |
| game_id | Yes | NHL game ID, 10 digits (e.g. 2026020084) | |
| player_id | No | Only this player, by NHL player ID |
Output Schema
| Name | Required | Description |
|---|---|---|
| note | No | |
| count | Yes | |
| source | No | |
| game_id | Yes | |
| players | Yes | |
| away_team | No | |
| game_date | No | |
| home_team | No | |
| dropped_shifts | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnly, idempotent, non-destructive, closed-world behavior, so the description's added value is the credit cost (10) and the historical coverage floor (2010-11 on) — both operationally useful facts absent from the structured fields. It doesn't address result size or pagination, which keeps it below a 5.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the use case, then scope, then filters, then constraints and cost — no filler. The enumeration of return fields is somewhat redundant given an output schema exists, which is the only wasted space.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a three-parameter filtered read with an output schema, the description supplies everything an agent needs to decide and call correctly: what it returns, what can be filtered, the historical boundary, and the cost.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so all three parameters (game_id, team, player_id) are already documented with formats and examples. The description only restates that filtering by one team or player is possible, adding no syntax or edge-case semantics beyond the schema; baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Names a specific verb and resource — every player's shifts in one NHL game — and enumerates the returned fields (period, start/end, duration, boxscore TOI, plus/minus). This distinguishes it clearly from siblings like get_plays, get_situation_time, and get_player_game_log.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
"Use for who was on the ice and when" frames the selection context, and the description states narrowing options (team or player) plus a data-coverage limit (2010-11 on). It stops short of naming an explicit alternative or a when-not-to-use condition.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_shot_mapShot mapARead-onlyIdempotentInspect
Use when you want shot locations rather than a list of events: every shot attempt with rink coordinates, shot type, strength, shooter and goalie. Filter by game, or by season plus a team or player. Paginated: follow next_offset, since a season runs past one page and pages are chronological. Costs 10 credits.
| Name | Required | Description | Default |
|---|---|---|---|
| team | No | Team abbreviation; use with season | |
| limit | No | Max shots per page (default 1000) | |
| league | No | League. Defaults to nhl. One of: nhl, pwhl, ohl, qmjhl, echl, ahl. | |
| offset | No | Pagination offset; follow next_offset for a full season | |
| season | No | Season ID, 8-digit (e.g. 20242025); use with team | |
| game_id | No | NHL game ID | |
| strength | No | Strength filter, e.g. 5v5 | |
| player_id | No | NHL player ID of the shooter |
Output Schema
| Name | Required | Description |
|---|---|---|
| count | Yes | |
| shots | Yes | |
| summary | Yes | |
| next_offset | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnly/idempotent/non-destructive, and the description goes well beyond them: it discloses pagination behavior (pages are chronological, follow next_offset, a season exceeds one page) and a concrete cost of 10 credits. These are exactly the operational traits an agent needs before calling a large paginated endpoint.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Four short sentences, each doing distinct work: purpose+contrast, return fields, filtering modes, then pagination and cost. Front-loaded with the selection cue, no filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With an output schema present, the description needn't explain return shape — yet it still summarizes the key fields, and it covers pagination and cost, the two things an agent could otherwise get wrong on a season-length query. Nothing material is missing for correct invocation.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so baseline is 3; the description adds that game_id is an alternative to the season+team/player combination, which conveys the mutual-exclusivity and pairing rules an agent would otherwise have to infer. It doesn't document limit/offset/strength syntax beyond what the schema already says.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb+resource (shot attempts with rink coordinates) and explicitly contrasts it with the alternative output shape ('rather than a list of events'), which cleanly separates it from get_plays and get_game_detail. The enumerated return fields (shot type, strength, shooter, goalie) further pin down what 'shot map' means.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
'Use when you want shot locations rather than a list of events' gives a clear selection condition, and 'Filter by game, or by season plus a team or player' shows the two valid calling modes. It stops short of naming a specific sibling tool as the fallback, so the routing is implied rather than fully explicit.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_situation_timeSituation timeARead-onlyIdempotentInspect
Use for exact time at each strength: the seconds each team spent at 5v5, 5v4, 4v5, 4v4, 6v5 with the goalie pulled and every other on-ice state in an NHL game, split into regulation and overtime, from the shift charts. Also even / power-play / shorthanded totals, goalie-pulled seconds, period lengths and a completeness check against the play-by-play. include_players adds each skater's time by strength. One game by game_id (10 credits), or every game on a date (10 credits per game). NHL games from 2010-11 on.
| Name | Required | Description | Default |
|---|---|---|---|
| date | No | Every game played on this date, YYYY-MM-DD (instead of game_id) | |
| game_id | No | NHL game ID, 10 digits (e.g. 2026020084) | |
| include_players | No | Add each skater's seconds by strength (default false) |
Output Schema
| Name | Required | Description |
|---|---|---|
| note | No | |
| count | Yes | |
| games | Yes | |
| credits_per_game | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already cover the safety profile (readOnly, idempotent, non-destructive, closed-world), so the description's job is added context — and it delivers: data provenance (shift charts), a cross-validation against play-by-play, a season coverage window (2010-11 onward), and a concrete cost model (10 credits per game, multiplied when using date).
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the core use case and packed with substantive detail — strength states, splits, provenance, cost, coverage window. It is a single long run-on sentence with mild redundancy ("every other on-ice state" after the exhaustive list), but nearly every clause carries information an agent needs.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a derived-aggregate tool with an output schema and three optional params, this covers everything that matters: what is measured, where it comes from, how far back the data goes, what the optional flag adds, and what it costs. Return-value shape is correctly left to the output schema.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so date, game_id, and include_players are already fully documented in the schema, including the default for include_players. The description mostly restates those semantics; the only genuine addition is the cost implication of the date parameter fanning out across every game that day.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific resource with unusual precision: seconds per team by on-ice strength state (5v5, 5v4, 4v5, 4v4, 6v5, plus all other states), split regulation/overtime, sourced from shift charts. The enumeration makes it unmistakable against siblings like get_shifts (raw shifts) or get_game_detail (game-level summary), even without naming them.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
"Use for exact time at each strength" plus "from the shift charts" gives clear selection context, and it states the game_id-vs-date choice with per-call credit costs. It stops short of naming an alternative tool or an explicit when-not-to-use case (e.g. use get_shifts for raw shift rows), so it lands at 4 rather than 5.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_skater_season_statsSkater season statsARead-onlyIdempotentInspect
Use when ranking skaters or comparing scoring. Returns a leaderboard sorted by points, goals, assists, plus/minus, or shots, with a games-played filter. Includes power play and shorthanded production, shooting%, faceoff%, and average time on ice. Seasons from 2010-11 on. Costs 5 credits.
| Name | Required | Description | Default |
|---|---|---|---|
| team | No | Filter by team abbreviation | |
| limit | No | Max results (default 20) | |
| league | No | League. Defaults to nhl. One of: nhl, pwhl, ohl, whl, qmjhl, echl, ahl, ushl. | |
| season | No | Season ID, 8-digit (e.g. 20242025 for 2024-25). 2024-25 and 2024-2025 also accepted. Defaults to the most recent season with stats, which is the current season once it is under way and the previous one before that. The season actually used is echoed in filters.season. | |
| sort_by | No | Sort metric (default points) | |
| min_games | No | Minimum games played (default 10; early in a season, half the most games anyone has played so far) |
Output Schema
| Name | Required | Description |
|---|---|---|
| count | Yes | |
| filters | Yes | |
| skaters | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, idempotentHint, and destructiveHint=false, so safety is covered. The description adds value the annotations cannot: a 5-credit cost and the 2010-11 season floor, both of which affect whether an agent should call this at all.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Four short sentences, each carrying a distinct fact (trigger, output shape, contents, constraints, cost), with the use case front-loaded. Dense and free of filler, though the mid-sentence metric list is slightly list-like.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
An output schema exists, so return values need no explanation, and the description still summarizes what is included (power play, shorthanded, shooting%, faceoff%, TOI). Combined with the cost and season-range notes, an agent has enough to call it correctly; only explicit sibling routing is absent.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so all six parameters (team, limit, league, season, sort_by, min_games) are already documented with defaults and constraints. The description only echoes the sort metrics and games-played filter, adding nothing beyond the schema except the historical season range.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description names a specific verb and resource ('Returns a leaderboard sorted by points, goals, assists...'), making it distinguishable from get_player_stats and get_goalie_stats by its ranking/leaderboard framing. It stops short of explicitly naming the sibling it is not, which keeps it below a 5.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
'Use when ranking skaters or comparing scoring' gives a clear positive trigger condition, which is unusually direct. It does not state when NOT to use it or name the alternative to pick instead for single-player lookups.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_standingsStandingsARead-onlyIdempotentInspect
Use when checking where teams rank in their division or conference. Returns points, wins, losses, OT losses, point%, goal differential, goals for/against per game, and 5v5 possession: Corsi%, Fenwick% and expected goals for and against. The possession columns are 5v5 only, so they will not match a goalie's expected goals against, which covers every strength. Defaults to the most recent season with standings. Costs 2 credits.
| Name | Required | Description | Default |
|---|---|---|---|
| league | No | League. Defaults to nhl. One of: nhl, pwhl, ohl, whl, qmjhl, echl, ahl, ushl. | |
| season | No | Season ID, 8-digit (e.g. 20242025 for 2024-25). 2024-25 and 2024-2025 also accepted. Defaults to current season. | |
| division | No | Filter by division (e.g. Atlantic, Metropolitan, Central, Pacific) | |
| conference | No | Filter by conference |
Output Schema
| Name | Required | Description |
|---|---|---|
| count | Yes | |
| standings | Yes | |
| snapshot_date | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare a safe, idempotent read, so the lower bar applies, and the description clears it: it discloses the 2-credit cost, the default-season behavior, and a genuine analytical caveat that 5v5 possession columns will not match a goalie's all-situations expected goals. That caveat prevents a real misinterpretation of the data.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The usage condition is front-loaded, followed by the returned metrics and then the caveat and cost. The metric enumeration is dense but each item is informative; nothing is redundant.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
An output schema exists, so the description needn't document return structure, and it covers usage context, defaults, cost, and a data-interpretation caveat. What's missing is only a sibling comparison, which is a modest gap given 21 tools in the family.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, with enums documented for league and conference, so the schema carries the load. The description only adds the default-season behavior ('most recent season with standings'), which is a slight refinement of the schema's 'Defaults to current season' rather than new parameter guidance.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific resource and the question it answers: team rankings within a division or conference. It enumerates the returned metrics, so the agent knows precisely what data it gets. It stops short of naming how it differs from sibling tools like get_team_stats, which is likely to be the main ambiguity.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
'Use when checking where teams rank in their division or conference' gives a clear triggering context and implies the league/division/conference scoping via the schema. There is no explicit 'not for X, use Y instead' guidance against the many sibling stats tools.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_team_statsTeam statsARead-onlyIdempotentInspect
Use when you need full details for one team: record, goals for and against, league rank, and 5v5 possession (Corsi%, Fenwick%, expected goals for and against). Possession is 5v5 only. Requires a team abbreviation (use list_teams if unsure). Costs 5 credits.
| Name | Required | Description | Default |
|---|---|---|---|
| team | Yes | Team abbreviation (e.g. BUF, TOR, NYR) | |
| league | No | League. Defaults to nhl. One of: nhl, pwhl, ohl, whl, qmjhl, echl, ahl, ushl. | |
| season | No | Season ID, 8-digit (e.g. 20242025 for 2024-25). 2024-25 and 2024-2025 also accepted. Defaults to current season. |
Output Schema
| Name | Required | Description |
|---|---|---|
| team | Yes | |
| season | Yes | |
| current_stats | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already establish read-only, idempotent, closed-world behavior, so the description is free to add the two things annotations cannot convey: the cost ('5 credits') and the interpretive constraint that possession stats are 5v5 only. Only gap is nothing about output shape beyond the metric list, which the output schema covers.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three short sentences, each earning its place: content scope first, the caveat about possession second, then the prerequisite and cost. Front-loaded with the trigger condition and no filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With an output schema present, the description does not need to explain return values, yet still names the key metrics. For a 3-parameter read tool with full annotation and schema coverage, nothing an agent needs in order to call it correctly is missing, including cost awareness.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, including the enum for league and season format examples, so the schema carries parameter semantics. The description only reinforces the required `team` parameter and points to list_teams for discovery; it adds nothing about league or season defaults.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('full details for one team') and enumerates the contents: record, goals for/against, league rank, and 5v5 possession metrics (Corsi%, Fenwick%, xG for/against). That level of enumeration distinguishes it from siblings like get_standings or get_skater_season_stats without opening any schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
'Use when you need full details for one team' gives a clear trigger, and 'use list_teams if unsure' names the fallback sibling for resolving an abbreviation. It does not explicitly say when to prefer get_standings or get_game_detail instead, so it stops just short of full alternative routing.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_teamsList teamsARead-onlyIdempotentInspect
Use when you need team abbreviations, or to see all 32 active NHL teams with city, conference, division, and arena. Excludes historical franchises (ATL, ARI). Cheapest tool at 1 credit.
| Name | Required | Description | Default |
|---|---|---|---|
| league | No | League. Defaults to nhl. One of: nhl, pwhl, ohl, whl, qmjhl, echl, ahl, ushl. | |
| division | No | Filter by division | |
| conference | No | Filter by conference |
Output Schema
| Name | Required | Description |
|---|---|---|
| count | Yes | |
| teams | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnly/idempotent/non-destructive/closed-world, so the bar is lower; the description still adds real value by disclosing the historical-franchise exclusion and the credit cost. It doesn't say whether results are paginated or ordered, but that is minor for a small fixed list.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two tight sentences, front-loaded with the usage trigger, then scope, exclusions and cost — no filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
An output schema exists so return values need no explanation, and annotations plus the description cover safety and scope. The remaining gap is that multi-league support and filter behavior are never acknowledged in prose.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% and both enums are documented inline, so the schema carries parameter meaning. The description adds nothing about league/division/conference filtering beyond the word 'active', and its '32 NHL teams' phrasing could mislead an agent into ignoring the league parameter.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('see all 32 active NHL teams') and enumerates the returned fields (city, conference, division, arena), which clearly separates it from stat/game-oriented siblings. The framing is narrowed to NHL even though the schema supports eight leagues, so the scope statement is slightly narrower than the tool actually is.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
'Use when you need team abbreviations' gives a concrete triggering condition, and 'Excludes historical franchises (ATL, ARI)' pre-empts a likely user request. It also flags cost ('Cheapest tool at 1 credit'), which helps routing decisions, though no sibling alternative is named.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
search_playersSearch playersARead-onlyIdempotentInspect
Use when looking up a player by name. Searches 4,900+ players across every season since 2010-11. Returns active players by default; set active=false for retired/historical. Use the returned player ID with get_player_stats for full details. Costs 2 credits.
| Name | Required | Description | Default |
|---|---|---|---|
| team | No | Filter by team abbreviation | |
| limit | No | Max results (default 10) | |
| query | Yes | Player name to search for (partial match supported) | |
| active | No | Filter by active status (default: true). Set false to search active plus retired/historical players. | |
| league | No | League. Defaults to nhl. One of: nhl, pwhl, ohl, whl, qmjhl, echl, ahl, ushl. | |
| position | No | Filter by position |
Output Schema
| Name | Required | Description |
|---|---|---|
| note | No | |
| count | Yes | |
| players | Yes | |
| included_inactive | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare this as a safe, read-only, idempotent, non-destructive operation. The description adds useful behavioral context beyond annotations: default active-only results, historical scope via active=false, and a concrete cost of 2 credits. It does not describe pagination or result-shape behavior, so it is not exhaustive.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is four tight sentences with no wasted wording. The primary use case is front-loaded, followed by scope, default behavior, next-step routing, and cost.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
An output schema exists, so the description need not explain return values. Given the 100% schema coverage, clear annotations, and the description's coverage of use case, defaults, next tool, and cost, an agent has enough information to select and invoke this tool correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so all six parameters are already documented in the schema. The description reinforces the important active-status default and clarifies that query is a name search, but it does not add syntax or meaning beyond what the schema already provides.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb and resource ('looking up a player by name') and adds scope ('4,900+ players across every season since 2010-11'). It also distinguishes this lookup tool from get_player_stats by explaining that the returned player ID should be used there for full details.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It gives a clear usage context ('Use when looking up a player by name') and names the follow-up tool get_player_stats for full details. It also explains the default active-player behavior and how to include retired/historical players, though it does not explicitly state when not to use this tool.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
Tool Schema Changelog
Recent tool additions, removals, and schema changes observed during successful MCP inspections.
1 tool update
- Changed
get_prop_history1 field changed- added
Input schema / properties / estimate_onlyAdded value: +{ + "description": "Return what this call would cost, without charging or running it.", + "type": "boolean" +}
1 tool update
- Changed
get_player_props2 fields changed- added
Output schema / properties / props / items / properties / minutes_before_scheduled_startAdded value: +{ + "type": [ + "number", + "null" + ] +} - added
Output schema / properties / props / items / properties / scheduled_startAdded value: +{ + "type": [ + "string", + "null" + ] +}
1 tool update
- Changed
get_player_props1 field changed- changed
Input schema / properties / snapshot_type / descriptionPrevious value: -"closing (default): the last line before the game starts. opening: the first one captured."New value: +"closing (default): the last line before the game starts. opening: the first one captured, which is the same capture as the close wherever only one was taken."
1 tool update
- Changed
get_predictions1 field changed- added
Output schema / properties / noteAdded value: +{ + "type": "string" +}
3 tool updates
- Changed
get_goalie_stats1 field changed- changed
Input schema / properties / min_games / descriptionPrevious value: -"Minimum games played (default 10)"New value: +"Minimum games played (default 10; early in a season, half the most games anyone has played so far)"
- Changed
get_odds1 field changed- changed
Input schema / properties / snapshot_type / descriptionPrevious value: -"opening (game-day morning; for a game not yet played, the latest morning line) or closing (final pre-game). Single game: default both. Season: default closing."New value: +"opening (game-day morning; for a game not yet played, the latest morning line) or closing (final pre-game). Single game: default every snapshot held, including first (each book's first posted line, from October 2026). Season: default closing."
- Changed
get_skater_season_stats1 field changed- changed
Input schema / properties / min_games / descriptionPrevious value: -"Minimum games played (default 10)"New value: +"Minimum games played (default 10; early in a season, half the most games anyone has played so far)"
1 tool update
- Added
get_prop_projections
1 tool update
- Added
get_predictions
2 tool updates
- Added
get_shifts - Added
get_situation_time
Related MCP Connectors
NFL/NBA/MLB/NHL/PGA + DFS and prediction-market data. Browse free; query with a free API key.
Live sports data: scores, play-by-play, box scores, odds and props. No key needed to start.
Live and historical NBA/NFL/NHL data — fantasy bots, content sites, betting research.
Related MCP Servers
- FlicenseNot gradedqualityDmaintenanceProvides access to live NHL data including player statistics, team standings, game scores, schedules, and playoff information through 40+ NHL API endpoints.3-
- AlicenseNot gradedqualityBmaintenanceProvides live NHL data from the official NHL API, enabling users to fetch standings, scores, schedules, and player statistics.382 npmMIT
- AlicenseAqualityAmaintenanceLive sports betting player props MCP server covering NBA, MLB, NFL, NHL, NCAA, and soccer. Unified from real sportsbooks into one REST API and a real MCP server (Streamable HTTP). Free tier, no card required.5MIT
- AlicenseAqualityDmaintenanceProvides access to live NHL game data, player and team statistics, standings, schedules, playoff brackets, and historical comparisons through natural language queries using the official NHL API.11MIT
Glama MCP Gateway
Add one secure layer between your agents and this server.