PuckAPI
Provides access to NHL hockey data including game results, schedules, player stats, team stats, odds, and line movement from PuckAPI.
The hockey data API. Stats, odds, and everything between.REST API and MCP server. Free to start.
Quick Start · Tools · Data · Pricing · REST API
You: "What were last night's NHL scores?"
Claude: [calls get_games → returns scores, periods, shots, goals]
You: "Show me the line movement on the Sabres game"
Claude: [calls get_line_movement → opening line, current line, timestamps, book-by-book]
You: "Compare McDavid and MacKinnon this season"
Claude: [calls get_player_stats x2 → side-by-side goals, assists, points, TOI, shooting %]Quick Start
Claude Desktop -- add to claude_desktop_config.json:
{
"mcpServers": {
"puckapi": {
"url": "https://mcp.puckapi.com/mcp?key=YOUR_API_KEY"
}
}
}Claude Code -- one command:
claude mcp add puckapi \
--transport streamable-http \
"https://mcp.puckapi.com/mcp?key=YOUR_API_KEY"Other MCP clients -- any client supporting Streamable HTTP:
Setting | Value |
URL |
|
Transport | Streamable HTTP |
Also accepts Authorization: Bearer or x-api-key headers for REST API usage.
Get your free key at puckapi.com -- 500 credits, no credit card.
Related MCP server: nba-mcp
Available Tools
Tool | Description |
| Game results with scores, periods, shots, and goals |
| Upcoming and past game schedules |
| Full box score for a specific game |
| Historical matchup data between two teams |
Tool | Description |
| Current or historical standings by season |
| Team-level stats (goals, shots, PP%, PK%, etc.) |
| All NHL teams with abbreviations and metadata |
Tool | Description |
| Find players by name |
| Skater stats (goals, assists, points, TOI, etc.) |
| Season stats leaderboard -- goals, assists, points, TOI, shooting %, filterable by team and sortable by 5 metrics |
| Goalie stats (SV%, GAA, wins, shutouts, etc.) |
Tool | Description |
| Pre-game odds from 15+ sportsbooks (ML, spread, total) |
| Track how lines move from open to close |
Data Coverage
Category | Details |
Seasons | 2008-09 through current (16+) |
Games | 22,000+ with full box scores |
Odds | Pre-game ML, spread, totals from 15+ books |
Line movement | Opening to closing line tracking |
Players | 3,000+ skaters and goalies |
Updates | Scores and odds refresh throughout the day |
Pricing
Plan | Credits/mo | Price |
Free | 500 | $0 |
Starter | 10,000 | $19/mo |
Pro | 30,000 | $49/mo |
Scale | 125,000 | $149/mo |
Each tool call costs 1 credit. Top up anytime with wallet deposits.
REST API
PuckAPI also offers a standard REST API:
curl -H "x-api-key: YOUR_API_KEY" \
https://mcp.puckapi.com/v1/get_standingsFull documentation at puckapi.com/docs.
Related
28 free Claude Code skills for hockey analytics, betting models, and research | |
Sign up, dashboard, API docs |
puckapi.com · API Docs · Skills
MIT License
Available Tools
12 toolsget_game_detailARead-onlyInspect
Use when you need everything about one game: both teams' full info, all betting odds, and goalie starts. Requires a game ID (get one from get_games or get_schedule). Odds available for 2019-20 onwards. Costs 10 credits.
| Name | Required | Description | Default |
|---|---|---|---|
| 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?
Beyond readOnlyHint annotation, discloses credit cost (10 credits) and odds data timeframe, adding valuable behavioral context.
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 concise sentences, each packed with value: purpose, prerequisite, limitations, cost. Front-loaded and efficient.
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?
Covers all key aspects: what tool returns, prerequisite, cost, data availability. Output schema exists, so return values need no further explanation.
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 already describes game_id well; description adds guidance on sourcing the ID from specific tools, enhancing usability.
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?
Clearly states it retrieves comprehensive game details (teams, odds, goalies) and distinguishes from sibling tools like get_games and get_odds.
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?
Provides clear usage context: requires game ID from get_games/get_schedule, and notes odds availability from 2019-20 onward. Lacks explicit 'when not to use' but overall helpful.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_gamesARead-onlyInspect
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) | |
| season | No | Season ID (e.g. 20252026) | |
| 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 |
Output Schema
| Name | Required | Description |
|---|---|---|
| count | Yes | |
| games | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Description adds cost info beyond annotations (readOnlyHint=true). No destructive behavior implied. Sufficient for a read-only tool.
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 sentences, front-loaded with purpose and alternative, no wasted words.
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 7 optional params and output schema, description covers return types, cost, and alternative. Adequate for a query tool.
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% with descriptions for all 7 parameters. Description does not add extra parameter semantics beyond 'with filters', so baseline 3 is appropriate.
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?
Description clearly states the tool queries games with filters and returns specific data. It distinguishes from sibling 'get_schedule' for upcoming-only games.
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?
Explicitly tells when to use (querying past/future games with filters) and when not (upcoming-only prefer get_schedule), plus mentions cost comparison.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_goalie_statsARead-onlyInspect
Use when ranking goalies or comparing goalie performance. Returns leaderboard sorted by save%, GAA, GSAX, or wins with games played filter. Includes advanced metrics: high-danger save%, rolling save%, trend, and rest days. Costs 5 credits.
| Name | Required | Description | Default |
|---|---|---|---|
| team | No | Filter by team abbreviation | |
| limit | No | Max results (default 20) | |
| season | No | Season ID. Defaults to current. | |
| sort_by | No | Sort metric (default save_pct) | |
| min_games | No | Minimum games played (default 10) |
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 set readOnlyHint=true. Description adds 'Costs 5 credits' and mentions advanced metrics, providing useful context beyond annotations. No contradictions.
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 sentences, front-loaded with usage context, no wasted words. Each sentence serves a distinct purpose: usage, return details, advanced metrics 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 full parameter schema, readOnlyHint annotation, and output schema present, the description completes the picture by covering use case, sort options, filters, and 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 covers all parameters (100% coverage). Description adds value by naming sort metrics (save%, GAA, GSAX, wins) and mentioning games played filter, aligning with the enums and min_games 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?
Description clearly states 'returns leaderboard sorted by save%, GAA, GSAX, or wins' and specifies 'Use when ranking goalies or comparing goalie performance.' This distinguishes it from siblings like get_player_stats.
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?
Explicitly says when to use ('ranking goalies or comparing goalie performance'), but does not mention when not to use or alternatives. The context is clear enough for an agent to decide.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_head_to_headARead-onlyInspect
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) | |
| season | No | Season ID to filter. 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 declare readOnlyHint=true, so the read-only nature is known. The description adds value by mentioning the cost of 10 credits, which is a behavioral trait beyond what annotations provide. No contradictions.
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 brief with three sentences, the first directly stating purpose. There is no redundant information, and every sentence adds value.
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 the output schema exists to explain return values, the description covers the essential aspects: purpose, usage context, filtering, and cost. It is complete enough for a simple head-to-head tool.
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 parameters are documented. The description does not add significant information beyond the schema, except for implying the 'season' parameter filters by season. Baseline score is appropriate.
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 clearly states the tool's purpose: comparing two teams' history. It specifies the return of recent matchups with win/loss record, which distinguishes it from sibling tools that focus on single games or broader game lists.
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?
The description explicitly says 'Use when comparing two teams' history,' guiding the agent on when to select this tool. It also mentions filtering options and cost, but does not provide explicit alternatives or when not to use it.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_line_movementARead-onlyInspect
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.
| 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?
The description adds behavioral context beyond the annotations (readOnlyHint=true) by specifying it returns time-series snapshots, grouping by bookmaker, and highlighting the high cost. No contradiction with 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?
The description is two sentences, front-loaded with the core purpose and usage guidance. Every sentence adds value with no redundancy or waste.
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?
The presence of an output schema covers return values. The description includes cost, usage context, grouping behavior, and an alternative tool, making it complete for a complex tool with clear annotation support.
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. The description briefly mentions grouping by bookmaker, which adds some context, but does not elaborate on parameter details 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 clearly states the tool retrieves time-series snapshots of betting line movements grouped by bookmaker. It explicitly contrasts with the sibling tool get_odds, making the purpose distinct and 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?
The description explicitly states when to use this tool (analyzing line movement) and when not to (use get_odds for current lines). It also mentions the cost (25 cr) as a usage consideration, providing thorough guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_oddsARead-onlyInspect
Use when checking betting lines for a game. Returns moneylines, spreads, and totals from DraftKings, FanDuel, BetMGM, and ESPN BET. Filter by bookmaker or snapshot type (opening/closing). Odds available for 2019-20 onwards. Costs 10 credits.
| Name | Required | Description | Default |
|---|---|---|---|
| game_id | Yes | NHL game ID (e.g. 2025020887) | |
| bookmaker | No | Filter by bookmaker key (e.g. draftkings, fanduel, betmgm). Lowercase. | |
| snapshot_type | No | Filter by snapshot type: opening (game-day morning lines) or closing (final pre-game lines). Default returns both. |
Output Schema
| Name | Required | Description |
|---|---|---|
| odds | Yes | |
| game_id | Yes | |
| away_team | Yes | |
| game_date | Yes | |
| home_team | Yes | |
| bookmaker_count | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, and the description adds value by mentioning a 10-credit cost and data availability from 2019-20 onwards. There is no contradiction with annotations, and it discloses important behavioral traits beyond what annotations provide.
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 concise, with three sentences that front-load the purpose and follow with essential details (bookmakers, filters, date range, cost). No unnecessary words.
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 the tool's simplicity (3 params, read-only, output schema present), the description covers all critical aspects: what it does, which bookmakers, snapshot types, date range, and cost. It is complete enough for an agent to select and use 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?
With 100% schema description coverage, the baseline is 3. The description restates filtering by bookmaker and snapshot type but does not add significantly new semantic information 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 clearly states it returns betting lines (moneylines, spreads, totals) for a specific game from specific bookmakers. It differentiates from sibling tools like get_line_movement and get_game_detail by focusing on current odds versus line history or game 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?
The description begins with 'Use when checking betting lines for a game,' which clearly indicates the intended scenario. It does not explicitly exclude alternatives, but the context of siblings such as get_line_movement suggests alternative uses.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_player_statsARead-onlyInspect
Use when you need full details for one player: bio, team, physical attributes, and headshot. For goalies, also returns save%, GAA, GSAX, and trend data. Requires player ID from search_players. Costs 5 credits.
| Name | Required | Description | Default |
|---|---|---|---|
| player_id | Yes | NHL player ID |
Output Schema
| Name | Required | Description |
|---|---|---|
| player | Yes | |
| goalie_stats | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, so description's role is reduced. It adds cost information and goalie-specific stat disclosure, which are useful behavioral traits beyond the annotation.
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 sentences that cover purpose, content, prerequisite, and cost. No wasted words, front-loaded with key 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 a single-parameter tool with an output schema, description covers all essential context: when to use, what data is returned, prerequisite, and cost. No gaps identified.
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 has 100% coverage with a single parameter player_id described as 'NHL player ID'. Description adds context by stating the ID comes from search_players, which provides provenance and reduces ambiguity.
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?
Description clearly states it retrieves full details for one player including bio, team, physical attributes, headshot, and goalie-specific stats. It distinguishes from sibling tools like get_goalie_stats by specifying it returns detailed goalie stats as part of the player profile.
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?
Explicitly says 'Use when you need full details for one player' and states prerequisite 'Requires player ID from search_players' plus cost of 5 credits. Does not explicitly mention when not to use or contrast with siblings, but provides clear context.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_scheduleARead-onlyInspect
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 |
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 mark readOnlyHint as true, but the description adds key behavioral details: returns only unplayed future games, default 7-day horizon, and a 2-credit cost. This goes beyond annotations without contradiction, giving the agent full clarity on side effects and constraints.
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 three concise sentences, with the primary purpose in the first sentence, core behavior in the second, and an alternative plus cost in the third. Every sentence contributes necessary information without redundancy.
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 the output schema existing, the description sufficiently covers the tool's input (future games, time range) and behavior (unplayed only). It also clarifies credit cost and distinguishes from siblings. No critical gaps remain for agent use.
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% with both parameters described. The description only adds the default value for 'days' (matching schema) and no further nuance for 'team'. Given the high schema coverage, the description does not significantly enhance parameter understanding 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 clearly states the tool is for checking upcoming games, using specific verbs ('checking', 'returns') and defining the resource scope as 'unplayed future games for the next N days'. It differentiates from sibling get_games by specifying the opposite use case (past games).
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?
The description explicitly tells when to use the tool ('when checking what games are coming up') and when not to ('For past games, use get_games instead'), providing a clear alternative. It also includes a cost note ('Costs 2 credits'), aiding decision-making.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_standingsARead-onlyInspect
Use when checking where teams rank in their division or conference. Returns points, wins, losses, OT losses, point%, goal differential, and advanced stats (Corsi%, Fenwick%, xGF, xGA). Defaults to current season. Costs 2 credits.
| Name | Required | Description | Default |
|---|---|---|---|
| season | No | Season ID (e.g. 20252026). 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 readOnlyHint=true, indicating safe read operation. The description adds that it costs 2 credits and lists returned fields, providing extra context. No contradictions or missing behavioral traits.
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 sentences, front-loaded with usage guidance, each sentence adds value. No redundant or vague language.
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 3 optional parameters and an output schema, the description covers return fields, cost, and default behavior. It's complete enough for an agent to understand the tool's scope.
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?
Input schema has 100% coverage with descriptions for all 3 parameters. The description adds no new parameter information beyond what the schema already provides, hitting the baseline.
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 clearly states the tool is for checking where teams rank in their division or conference, and lists the specific statistics returned. This distinguishes it from sibling tools like get_game_detail or get_team_stats.
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?
The description explicitly states 'Use when checking where teams rank' and notes defaulting to the current season. While it doesn't specify when not to use or mention alternatives, this is sufficient guidance for an agent to select the tool appropriately.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_team_statsARead-onlyInspect
Use when you need full details for one team: record, advanced metrics, and rankings. 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) | |
| season | No | Season ID (e.g. 20252026). 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 indicate readOnlyHint=true. The description adds 'Costs 5 credits', which is a behavioral trait not in annotations. No contradictions.
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 sentences, front-loaded purpose, no waste. Every sentence provides essential 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?
With output schema present, description covers purpose, prerequisite, cost, and scope. Could mention return format but output schema handles that. Good completeness.
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% with descriptions. The description adds value for 'team' parameter by suggesting using list_teams if unsure. No extra on 'season' but not needed.
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 specifies the verb 'get' and resource 'team stats', states it provides 'full details for one team: record, advanced metrics, and rankings', and distinguishes from sibling tool 'list_teams' for getting abbreviations.
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?
Explicitly advises 'Use when you need full details for one team', gives prerequisite 'Requires a team abbreviation (use list_teams if unsure)', and mentions cost. Provides clear context and alternative.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_teamsARead-onlyInspect
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 |
|---|---|---|---|
| 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 readOnlyHint=true. Description adds useful context about excluding historical franchises and being cheapest tool, but does not elaborate on authorization, rate limits, or response format beyond what annotations provide.
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 sentences, no wasted words. Front-loaded with use case and key details. Efficient.
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 simple list tool with output schema and readOnlyHint annotation, description covers key outputs and exclusions. Missing pagination or sorting details but not critical for this tool.
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 schema already describes the two optional parameters. Description does not add additional meaning beyond what schema provides, so baseline 3 is appropriate.
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?
Description clearly states the tool lists team abbreviations and all 32 active NHL teams with city, conference, division, and arena. It uses specific verb 'list' and distinguishes from siblings which are about games, stats, etc.
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?
Explicitly says to use when needing team abbreviations or seeing all teams. Provides context about excluding historical franchises and cost, but does not explicitly state when not to use or suggest alternatives.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
search_playersARead-onlyInspect
Use when looking up a player by name. Searches 3,000+ players across 16 seasons. 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. | |
| position | No | Filter by position |
Output Schema
| Name | Required | Description |
|---|---|---|
| count | Yes | |
| players | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The descriptions adds significant value beyond the readOnlyHint annotation by disclosing the credit cost (2 credits) and default filtering behavior (active by default). It sets user expectations with the scope and partial match support, making tool behavior transparent.
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 three sentences with no unnecessary words. It front-loads the purpose and efficiently covers usage, behavioral details, and chaining guidance.
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?
The description is complete for a search tool with an output schema. It explains the result usage (chain with get_player_stats), sets scope expectations, and covers the default behavior. No gaps remain given the structured fields.
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 extra context for the 'query' and 'active' parameters, explaining partial match support and the default vs. retired filter. While it does not describe 'team', 'limit', or 'position' in the description, the schema descriptions for those are clear, and the overall value added merits a 4.
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 'Use when looking up a player by name,' providing a clear verb and resource. It also specifies the scope (3,000+ players, 16 seasons) and distinguishes from sibling tools like get_player_stats, which is for detail retrieval after obtaining the player ID.
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?
The description explicitly states when to use the tool and guides the user to use the returned ID with get_player_stats. It mentions the credit cost. However, it lacks an explicit 'when not to use' statement, which could be improved by noting that if you already have the player ID, you should directly call get_player_stats.
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.
12 tool updates
v0.1.1- Added
get_game_detail - Added
get_games - Added
get_goalie_stats - Added
get_head_to_head - Added
get_line_movement - Added
get_odds - Added
get_player_stats - Added
get_schedule - Added
get_standings - Added
get_team_stats - Added
list_teams - Added
search_players
TDQS
Scored across 12 tools
Each tool has a clearly distinct purpose: games, teams, players, goalies, standings, betting odds, and line movement. No two tools serve overlapping functions; descriptions clearly differentiate them.
All tool names follow a consistent verb_noun pattern using snake_case (e.g., get_game_detail, list_teams, search_players), making them predictable and easy to understand.
12 tools is a well-scoped set for an NHL data API covering games, teams, players, goalies, standings, and betting. Each tool serves a distinct purpose without being excessive.
The tools cover the core NHL data domain comprehensively: games (past/future), teams, players, goalies, standings, and betting. Minor gaps exist, such as roster or player game logs, but the surface is robust for most use cases.
Maintenance
Related MCP Connectors
Sports Game Odds MCP — wraps the Sports Game Odds API (sportsgameodds.com)
SportsDataIO MCP — wraps SportsDataIO's Big-Six sports data API (sportsdata.io)
Live and historical NBA/NFL/NHL data — fantasy bots, content sites, betting research.
Related MCP Servers
- FlicenseNot gradedqualityCmaintenanceAn MCP Server that provides access to NHL (National Hockey League) scores and statistics via the SportsData.io NHL v3 Scores API.-
- AlicenseAqualityCmaintenanceMCP server for NBA live data and stats, providing read-only tools to query live scores, box scores, player info, standings, and more from NBA.com.158 npm1MIT
- FlicenseNot gradedqualityDmaintenanceMCP server providing tools to query live scores, schedules, standings, and game stats from the SportRadar API for multiple sports including NFL, NBA, NHL, NCAAMB, soccer, and tennis.-
- AlicenseNot gradedqualityBmaintenanceMCP server that turns real NFL & fantasy data into a decisive edge, offering 70+ tools for draft assistance, start/sit recommendations, trade analysis, playoff odds, and more, with live league integration.MIT