PuckAPI

io.github.noahowshPublished by GitHub account noahowshv1.1.6Updated Oct 24, 2026

NHL and PWHL stats, play-by-play, expected goals and odds. REST API and MCP server. Free to start.

VerifiedStreamable HTTPWeb executableFinanceData & Analytics

Overview

AI-generated overview

Remote MCP server for NHL and PWHL hockey data: stats, play-by-play, shot maps, odds and model predictions, paid for in credits.

What you can do
  • Look up games, schedules, box scores and head-to-head history
  • Check standings, team stats and the list of NHL teams
  • Search players and pull skater, goalie and game-log stats or season leaderboards
  • Query betting odds, line movement and player prop lines and history
  • Inspect play-by-play events, shot maps, shifts and time at each strength
  • Get model win probabilities and, on paid plans, player prop projections
When to use it
Useful when you want an assistant to answer hockey questions with real data — scores, standings, player comparisons, possession metrics, betting lines or play-by-play detail — without building your own data pipeline. It fits analysts, fantasy and betting research, and editorial work on NHL or PWHL games.
Requirements
A remote Streamable HTTP endpoint; no local install. An API key is required to call tools (connecting and listing tools works without one), passed as the x-api-key header, a Bearer token, or a key query parameter. A free key gives 500 credits per month; paid plans and top-ups cost money. Network access to the provider's endpoint.
Before you install
Every tool call spends credits from your account, from 1 to 25 per call, and some calls scale with the number of games returned, so costs can add up quickly. The API key is a billable credential and appears in the connection URL in the documented setup, so keep it out of shared configs. Odds and line-movement data are market information; the server's own guidance says not to compute stakes, payouts or profits or recommend bets.

Installation

In SourceWeft

  1. Open PuckAPI in the dashboard and add it to a workspace.
  2. Connect x-api-key credentials. They are stored privately and never shown on public pages.
  3. Enable the server for the chats that should use its tools.

Web executable via Streamable HTTP. Remote servers run from the web runtime once configured in a workspace.

Use with an agent

Paste this prompt into Claude Code, Codex, Cursor or another agent — or into SourceWeft chat. The agent reads this server's install guide, shows you its publisher, endpoint and sign-in, and adds it to your client once you agree. Keys never go into a command.

Read https://sourceweft.com/mcp/io.github.noahowsh%2Fpuckapi/install.md and connect the MCP server it describes to my client. Before changing any config, show me its publisher, endpoint and sign-in method and wait for my OK. Never put an API key in a command or in a file I would commit; ask me where it should come from.

Read the install guide the agent follows

Other MCP clients

Add this to your client's mcpServers config.

{
  "mcpServers": {
    "puckapi": {
      "type": "http",
      "url": "https://mcp.puckapi.com/mcp",
      "headers": {
        "x-api-key": "<YOUR_API_KEY>"
      }
    }
  }
}

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]
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:

json
{  "mcpServers": {    "puckapi": {      "url": "https://mcp.puckapi.com/mcp?key=YOUR_API_KEY"    }  }}

Claude Code -- one command:

bash
claude mcp add --transport http puckapi \  "https://mcp.puckapi.com/mcp?key=YOUR_API_KEY"

Other MCP clients -- any client supporting Streamable HTTP:

SettingValue
URLhttps://mcp.puckapi.com/mcp?key=YOUR_API_KEY
TransportStreamable HTTP

Also accepts Authorization: Bearer or x-api-key headers. Connecting and listing tools works without a key; calling a tool needs one.

Get your free key at puckapi.com -- 500 credits, no credit card.


Available Tools

Games -- 4 tools
ToolDescription
get_gamesGame results with scores, periods, shots, and goals
get_scheduleUpcoming and past game schedules
get_game_detailFull box score for a specific game
get_head_to_headHistorical matchup data between two teams
Teams -- 3 tools
ToolDescription
get_standingsCurrent or historical standings by season
get_team_statsTeam-level stats (goals, shots, PP%, PK%, etc.)
list_teamsAll NHL teams with abbreviations and metadata
Players -- 5 tools
ToolDescription
search_playersFind players by name
get_player_statsSkater stats (goals, assists, points, TOI, etc.)
get_skater_season_statsSeason stats leaderboard -- goals, assists, points, TOI, shooting %, filterable by team and sortable by 5 metrics
get_goalie_statsGoalie stats (SV%, GAA, wins, shutouts, etc.)
get_player_game_logGame-by-game lines for a skater or goalie in a season: goals, assists, shots, PIM, saves, SV%
Odds -- 2 tools
ToolDescription
get_oddsOpening and closing moneyline, puck line and total by sportsbook, every game from 2019-20
get_line_movementTime-series odds grouped by bookmaker
Play-by-play -- 2 tools
ToolDescription
get_playsPlay-by-play events with rink coordinates, strength state and the players involved
get_shot_mapEvery shot attempt with rink coordinates, shot type, shooter and goalie

Data Coverage

CategoryDetails
Games23,000+ across 16 seasons
Play-by-playEvery event since 2010-11 with rink coordinates (6.8M+ events)
OddsEvery game from 2019-20: about 12-14 books a game for 2020-21 to 2023-24, 60+ in 2025-26, and 8 books including Pinnacle captured hourly from October 2026
Line movementHourly snapshots from September 2026
Players4,800+ skaters and goalies
ComputedExpected goals, GSAX, Corsi and Fenwick
PWHLGames, standings, play-by-play and shot locations; pass league: "pwhl" (details)
UpdatesGames daily; odds captured hourly

Live coverage by season: historical odds · play-by-play · shot data


Pricing

PlanCredits/moPrice
Free500 every month$0
Starter10,000$19/mo
Pro30,000$49/mo
Scale125,000$149/mo

Tools cost 1 to 25 credits a call (per-tool costs). Wallet top-ups from $5 never expire.


REST API

PuckAPI also offers a standard REST API:

bash
curl -X POST https://mcp.puckapi.com/v1/get_standings \  -H "x-api-key: YOUR_API_KEY"

Full documentation at puckapi.com/docs.


Used by

PuckCast, our NHL predictions site, runs on this API.

Related

PuckAPI Skills28 free Claude Code skills for hockey analytics, betting models, and research
puckapi.comSign up, dashboard, API docs
NHL odds tonightEvery tracked sportsbook's moneyline, puck line and total, refreshed hourly
NHL player props todayPoints, goals, shots, saves and anytime scorer: the consensus line and the best over and under price per player
Shots on goal prop historyHow often a player goes over his shots line, game by game, in Python

Other sports, same tools and key format

EndzoneAPINFL and college football
DunkAPINBA, WNBA and college basketball
FastballAPIMLB and college baseball
StrikerAPISoccer, 17 competitions
AcesAPIATP and WTA tennis
BirdieAPIPGA Tour and other golf tours
FighterAPIUFC, PFL and Bellator

puckapi.com · API Docs · Skills

MIT License

Source: README.md at commit dbbd5fc

Tools

22

get_standings

Standings

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.

Parametersleagueseasondivisionconference

get_team_stats

Team stats

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.

Parametersteamrequiredleagueseason

list_teams

List teams

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.

Parametersleaguedivisionconference

get_games

Games

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.

Parametersteamlimitleagueseasondate_todate_fromgame_typegame_state

get_schedule

Schedule

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.

Parametersdaysteamleague

get_game_detail

Game detail

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.

Parametersleaguegame_idrequired

get_head_to_head

Head to head

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

Parameterslimitteam1requiredteam2requiredleagueseason

search_players

Search players

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.

Parametersteamlimitqueryrequiredactiveleagueposition

get_player_stats

Player stats

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.

Parametersleagueplayer_idrequired

get_goalie_stats

Goalie stats

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.

Parametersteamlimitleagueseasonsort_bymin_games

get_skater_season_stats

Skater season stats

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.

Parametersteamlimitleagueseasonsort_bymin_games

get_player_game_log

Player game log

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.

Parameterslimitleagueoffsetseasongame_typeplayer_idrequired

get_odds

Odds

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.

Parametersteamlimitoffsetseasongame_idall_booksbookmakerestimate_onlysnapshot_type

get_line_movement

Line movement

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.

Parametersgame_idrequiredbookmaker

get_player_props

Player props

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 (10 credits), or player_id with from_date (and to_date) for one player across games (10 credits per game returned, up to 100). Returns the closing line by default (the last before the game starts) or the opening line, with each book's over and under prices. 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.

Parametersmarketgame_idto_datebookmakerfrom_dateplayer_idestimate_onlysnapshot_type

get_prop_history

Prop history

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. Costs 10 credits for up to 200 games. Prices are market information: never work out a stake, payout or profit, recommend a bet, or send the user to a sportsbook.

Parameterslimitmarketrequiredto_datebookmakerfrom_dateplayer_idrequired

get_plays

Plays

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.

Parametersteamtypezonelimitleagueoffsetperiodseasongame_idstrengthplayer_idshot_attempts_only

get_shot_map

Shot map

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.

Parametersteamlimitleagueoffsetseasongame_idstrengthplayer_id

get_shifts

Shifts

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.

Parametersteamgame_idrequiredplayer_id

get_situation_time

Situation time

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.

Parametersdategame_idinclude_players

get_predictions

Predictions

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.

Takes no parameters.

get_prop_projections

Prop projections

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.

Parametersteamplayer

Version history

7
  1. v1.1.6LatestOct 16, 2026
  2. v1.1.4Oct 8, 2026
  3. v1.1.3Oct 7, 2026
  4. v1.1.2Sep 27, 2026
  5. v1.1.1Sep 27, 2026
  6. v1.1.0Sep 27, 2026
  7. v1.0.0Sep 16, 2026

Score

100% of the applicable checks met

How complete this listing is, computed from the registry entry, the endpoint and public sources. Not a rating of the server and not a statement that it is safe or working today: reachability is a dated check, and no installs or reviews go into the score.

  • Reached in the last 30 daysRequired25 pts
  • Auth declaredRequired10 pts
  • Tools listedRequired15 pts
  • DescriptionRequired15 pts
  • Logo10 pts
  • Documentation15 pts
  • License10 pts