puckapi avatar

PuckAPI

puckapi/mcp

Connects Claude to 16+ seasons of NHL data through 13 tools covering games, stats, odds, and line movement. You get box scores, player comparisons (goals, assists, TOI, shooting percentage), standings, head-to-head records, and pre-game odds from 15+ sportsbooks with opening-to-closing line tracking. Built on PuckAPI's REST API with the same endpoints exposed as MCP tools. Free tier includes 500 credits, each tool call costs one credit. Useful for sports analysis, betting research, or building hockey-aware agents that need current scores, historical matchups, or real-time odds without scraping or managing multiple data sources.

tools
24
auth
Secret needed
transport
HTTP
last updated
Oct 16, 2026

Install

From registry metadata
$ npx add-mcp https://mcp.puckapi.com/mcp --name puckapi --header 'x-api-key: ${X_API_KEY}'

Run in your terminal. add-mcp asks which agents to add it to, then asks for each value it needs. Add -g to install it for every project.

Review the command, arguments and environment values before installing. MCP servers run with your local permissions.

Other ways

Claude Code

$ claude mcp add --transport http puckapi https://mcp.puckapi.com/mcp --header 'x-api-key: YOUR_X_API_KEY'

Run in your terminal. Add --scope user to make it available in every project.

Tools

Verified live · 24 tools

Verified live against the running server on Nov 6, 2026.

get_standingsUse 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...4 params

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...

Parameters* required
conferencestring
Filter by conferenceone of Eastern · Western
divisionstring
Filter by division (e.g. Atlantic, Metropolitan, Central, Pacific)
leaguestring
League. Defaults to nhl. One of: nhl, pwhl, ohl, whl, qmjhl, echl, ahl, ushl.one of nhl · pwhl · ohl · whl · qmjhl · echl
seasonstring
Season ID, 8-digit (e.g. 20242025 for 2024-25). 2024-25 and 2024-2025 also accepted. Defaults to current season.
get_team_statsUse 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.3 params

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.

Parameters* required
leaguestring
League. Defaults to nhl. One of: nhl, pwhl, ohl, whl, qmjhl, echl, ahl, ushl.one of nhl · pwhl · ohl · whl · qmjhl · echl
seasonstring
Season ID, 8-digit (e.g. 20242025 for 2024-25). 2024-25 and 2024-2025 also accepted. Defaults to current season.
team*string
Team abbreviation (e.g. BUF, TOR, NYR)
list_teamsUse 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.3 params

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.

Parameters* required
conferencestring
Filter by conferenceone of Eastern · Western
divisionstring
Filter by division
leaguestring
League. Defaults to nhl. One of: nhl, pwhl, ohl, whl, qmjhl, echl, ahl, ushl.one of nhl · pwhl · ohl · whl · qmjhl · echl
get_gamesUse 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.8 params

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.

Parameters* required
date_fromstring
Start date (YYYY-MM-DD)
date_tostring
End date (YYYY-MM-DD)
game_statestring
Filter by game state. FINAL and OFF both mean finished and return the same games; FUT is scheduled, LIVE in progress.one of FUT · LIVE · FINAL · OFF
game_typestring
Filter by game typeone of regular · playoff · preseason
leaguestring
League. Defaults to nhl. One of: nhl, pwhl, ohl, whl, qmjhl, echl, ahl, ushl.one of nhl · pwhl · ohl · whl · qmjhl · echl
limitinteger
Max results (default 100)
seasonstring
Season ID, 8-digit (e.g. 20242025 for 2024-25). 2024-25 and 2024-2025 also accepted.
teamstring
Team abbreviation to filter (home or away)
get_scheduleUse 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.3 params

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.

Parameters* required
daysinteger
Number of days ahead to look (default 7)
leaguestring
League. Defaults to nhl. One of: nhl, pwhl, ohl, whl, qmjhl, echl, ahl, ushl.one of nhl · pwhl · ohl · whl · qmjhl · echl
teamstring
Team abbreviation to filter
get_game_detailUse 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 s...2 params

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 s...

Parameters* required
game_id*string
NHL game ID (e.g. 2025020887)
leaguestring
League. Defaults to nhl. One of: nhl, pwhl, ohl, whl, qmjhl, echl, ahl, ushl.one of nhl · pwhl · ohl · whl · qmjhl · echl
get_head_to_headUse when comparing two teams' history. Returns recent matchups with win/loss record. Can filter by season or get all-time. Costs 10 credits.5 params

Use when comparing two teams' history. Returns recent matchups with win/loss record. Can filter by season or get all-time. Costs 10 credits.

Parameters* required
leaguestring
League. Defaults to nhl. One of: nhl, pwhl, ohl, whl, qmjhl, echl, ahl, ushl.one of nhl · pwhl · ohl · whl · qmjhl · echl
limitinteger
Max games to return (default 20)
seasonstring
Season ID, 8-digit (e.g. 20242025 for 2024-25). 2024-25 and 2024-2025 also accepted. Omit for all-time.
team1*string
First team abbreviation (e.g. BUF)
team2*string
Second team abbreviation (e.g. TOR)
search_playersUse 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.6 params

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.

Parameters* required
activeboolean
Filter by active status (default: true). Set false to search active plus retired/historical players.
leaguestring
League. Defaults to nhl. One of: nhl, pwhl, ohl, whl, qmjhl, echl, ahl, ushl.one of nhl · pwhl · ohl · whl · qmjhl · echl
limitinteger
Max results (default 10)
positionstring
Filter by positionone of G · D · C · LW · RW
query*string
Player name to search for (partial match supported)
teamstring
Filter by team abbreviation
get_player_statsUse 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_player...2 params

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_player...

Parameters* required
leaguestring
League. Defaults to nhl. One of: nhl, pwhl, ohl, whl, qmjhl, echl, ahl, ushl.one of nhl · pwhl · ohl · whl · qmjhl · echl
player_id*integer
NHL player ID
get_goalie_statsUse 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 day...6 params

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 day...

Parameters* required
leaguestring
League. Defaults to nhl. One of: nhl, pwhl, ohl, whl, qmjhl, echl, ahl, ushl.one of nhl · pwhl · ohl · whl · qmjhl · echl
limitinteger
Max results (default 20)
min_gamesinteger
Minimum games played (default 10; early in a season, half the most games anyone has played so far)
seasonstring
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...
sort_bystring
Sort metric (default save_pct). gsax is goals saved above expected.one of save_pct · gaa · gsax · wins
teamstring
Filter by team abbreviation
get_skater_season_statsUse 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...6 params

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...

Parameters* required
leaguestring
League. Defaults to nhl. One of: nhl, pwhl, ohl, whl, qmjhl, echl, ahl, ushl.one of nhl · pwhl · ohl · whl · qmjhl · echl
limitinteger
Max results (default 20)
min_gamesinteger
Minimum games played (default 10; early in a season, half the most games anyone has played so far)
seasonstring
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...
sort_bystring
Sort metric (default points)one of points · goals · assists · plus_minus · shots
teamstring
Filter by team abbreviation
get_player_game_logUse 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...6 params

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...

Parameters* required
game_typestring
Which games to include: regular, playoff, preseason, or all. Defaults to regular, matching every other stats tool.one of regular · playoff · preseason · all
leaguestring
League. Defaults to nhl. One of: nhl, pwhl, ohl, whl, qmjhl, echl, ahl, ushl.one of nhl · pwhl · ohl · whl · qmjhl · echl
limitinteger
Max games to return (default 100)
offsetinteger
Pagination offset
player_id*integer
NHL player ID
seasonstring
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...
get_oddsUse 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...9 params

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...

Parameters* required
all_booksboolean
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.
bookmakerstring
Filter by bookmaker key (e.g. draftkings, fanduel, betmgm). Lowercase.
estimate_onlyboolean
Return what this call would cost, without charging or running it.
game_idstring
NHL game ID (e.g. 2025020887). Omit and pass season for a whole season.
limitinteger
With season: games per page (default 100, max 500).
offsetinteger
With season: page offset; use next_offset from the previous page.
seasonstring
Season for a whole season of lines, e.g. 2025-26 or 20252026. Used when game_id is not set.
snapshot_typestring
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,...one of opening · closing
teamstring
With season: only this team's games (abbreviation, e.g. BUF).
get_line_movementUse 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, recomme...2 params

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, recomme...

Parameters* required
bookmakerstring
Filter by specific bookmaker key (lowercase)
game_id*string
NHL game ID
get_player_propsUse for player prop lines by sportsbook: over/under on points, goals, assists, shots on goal, blocked shots, goalie saves, power-play points, anytime and first goal scorer, from May 2023 (DraftKings, FanDuel, BetMGM, ESPN BET, Pinnacle and others). Pass game_id for every playe...8 params

Use for player prop lines by sportsbook: over/under on points, goals, assists, shots on goal, blocked shots, goalie saves, power-play points, anytime and first goal scorer, from May 2023 (DraftKings, FanDuel, BetMGM, ESPN BET, Pinnacle and others). Pass game_id for every playe...

Parameters* required
bookmakerstring
Bookmaker key, e.g. draftkings, fanduel, pinnacle.
estimate_onlyboolean
Return what this call would cost, without charging or running it.
from_datestring
With player_id: first date, YYYY-MM-DD (the game's date).
game_idstring
Game id: every player's props for that game.
marketstring
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), pl...one of player_points · player_goals · player_assists · player_shots_on_goal · player_blocked_shots · player_total_saves
player_idnumber | string
Player id (e.g. 8478402) from search_players. With from_date: that player's props across games.
snapshot_typestring
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.one of opening · closing
to_datestring
With player_id: last date (default: no end), YYYY-MM-DD (the game's date).
get_prop_historyUse 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, power-play points, or anytime or first goal scorer), one row per game with the closing line (the median across books, or one book's)...7 params

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, power-play points, or anytime or first goal scorer), one row per game with the closing line (the median across books, or one book's)...

Parameters* required
bookmakerstring
One book's closing line instead of the median across books, e.g. draftkings.
estimate_onlyboolean
Return what this call would cost, without charging or running it.
from_datestring
First date, YYYY-MM-DD (the game's date).
limitinteger
Games to return, oldest first (default 50, max 200). next_from_date says where to continue.
market*string
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), pl...one of player_points · player_goals · player_assists · player_shots_on_goal · player_blocked_shots · player_total_saves
player_id*number | string
Player id (e.g. 8478402) from search_players.
to_datestring
Last date, YYYY-MM-DD (the game's date).
get_prop_movementUse to see how one player's prop line moved before a game: every capture we hold, book by book and oldest first, with the line, both prices and the minutes before the start. line_change is the last capture's line minus the first's. The number of captures varies by game and boo...4 params

Use to see how one player's prop line moved before a game: every capture we hold, book by book and oldest first, with the line, both prices and the minutes before the start. line_change is the last capture's line minus the first's. The number of captures varies by game and boo...

Parameters* required
bookmakerstring
One book's captures, e.g. draftkings.
game_id*string
Game id.
market*string
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), pl...one of player_points · player_goals · player_assists · player_shots_on_goal · player_blocked_shots · player_total_saves
player_id*number | string
Player id (e.g. 8478402) from search_players.
get_market_oddsUse for the extra betting markets of a game as history: the regulation result (three-way, a draw is possible), the 1st period result and puck line, and the 1st, 2nd and 3rd period totals. Pass game_id (from get_schedule or get_games) and market. For each sportsbook it returns...4 params

Use for the extra betting markets of a game as history: the regulation result (three-way, a draw is possible), the 1st period result and puck line, and the 1st, 2nd and 3rd period totals. Pass game_id (from get_schedule or get_games) and market. For each sportsbook it returns...

Parameters* required
bookmakerstring
One bookmaker key, e.g. draftkings, fanduel, pinnacle.
estimate_onlyboolean
Return what this call would cost, without charging or running it.
game_id*string
Game id from get_schedule or get_games.
market*string
The market: h2h_3_way (regulation result: home, draw or away after 60 minutes), totals_p1 (1st period total goals), totals_p2 (2nd period total goals), totals_p3 (3rd period total goals), h2h_p1 (1...one of h2h_3_way · totals_p1 · totals_p2 · totals_p3 · h2h_p1 · spreads_p1
get_playsUse 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....12 params

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....

Parameters* required
game_idstring
NHL game ID (e.g. 2025020887)
leaguestring
League. Defaults to nhl. One of: nhl, pwhl, ohl, whl, qmjhl, echl, ahl, ushl.one of nhl · pwhl · ohl · whl · qmjhl · echl
limitinteger
Max events (default 200)
offsetinteger
Pagination offset
periodinteger
Period number (4+ is overtime)
player_idinteger
NHL player ID; matches the player in any role on the event
seasonstring
Season ID, 8-digit (e.g. 20242025).
shot_attempts_onlyboolean
Only goals, shots on goal, missed shots and blocked shots (Corsi events)
strengthstring
Skater strength from the event owner's view, e.g. 5v5, 5v4, 4v5
teamstring
Team abbreviation that owns the event (e.g. BUF)
typestring
Event typeone of goal · shot-on-goal · missed-shot · blocked-shot · faceoff · hit
zonestring
Zone: O offensive, N neutral, D defensiveone of O · N · D
get_shot_mapUse 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...9 params

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...

Parameters* required
game_idstring
NHL game ID
game_typestring
Which games to include: regular (default for a season) or all (default for one game). Shootout attempts are never included.one of regular · playoff · preseason · all
leaguestring
League. Defaults to nhl. One of: nhl, pwhl, ohl, qmjhl, echl, ahl.one of nhl · pwhl · ohl · qmjhl · echl · ahl
limitinteger
Max shots per page (default 1000)
offsetinteger
Pagination offset; follow next_offset for a full season
player_idinteger
NHL player ID of the shooter
seasonstring
Season ID, 8-digit (e.g. 20242025); use with team
strengthstring
Strength filter, e.g. 5v5
teamstring
Team abbreviation; use with season
get_shiftsUse 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 201...3 params

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 201...

Parameters* required
game_id*string
NHL game ID, 10 digits (e.g. 2026020084)
player_idinteger
Only this player, by NHL player ID
teamstring
Only this team's players, by abbreviation (e.g. WSH)
get_situation_timeUse 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...3 params

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...

Parameters* required
datestring
Every game played on this date, YYYY-MM-DD (instead of game_id)
game_idstring
NHL game ID, 10 digits (e.g. 2026020084)
include_playersboolean
Add each skater's seconds by strength (default false)
get_predictionsUse 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 ow...

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 ow...

No parameters. Call it with no arguments.

get_prop_projectionsPaid 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 pr...2 params

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 pr...

Parameters* required
playerstring
Part of a player's name, e.g. makar. Accents are ignored. Keeps only matching players.
teamstring
Team abbreviation, e.g. COL. Keeps the games that team plays in, home or away.

Sponsors

Readme

PuckAPI MCP Server

The hockey data API. Stats, odds, and everything between.
REST API and MCP server. Free to start.


License: MIT Tools Seasons Skills Smithery

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]

View the full README on GitHub

Details

Repository
github.com/puckapi/mcp
Transport
HTTP
Auth
Required
Registry
MCP registry, active
Tools verified
Nov 6, 2026