PuckAPI
REMOTE · MCP.PUCKAPI.COM · SCANNED SEP 27
The hockey API for stats, odds, and everything between. REST API and MCP server. Free to start.
Available components
How this component scores in each security and reliability category. Every signal is checked automatically against the live server, and we only credit what we can confirm. How we score → Why this is hard to score →
Endpoint Security83
- The endpoint's TLS certificate is valid, in date, and uses a strong key. View diagnostics → Pass
- Authorisation is enforced on tool calls, but the challenge carries no valid RFC 9728 metadata, so a client cannot discover where to get a token. See how to fix → View diagnostics → Fail
- HTTPS is enforced; there's no plaintext access path. View diagnostics → Pass
- HSTS check failed: the Strict-Transport-Security header is absent. See how to fix → View diagnostics → Fail
- DNSSEC check failed: this domain isn't protected by DNSSEC. See how to fix → View diagnostics → Fail
Transport & Reachability100
- Verified streamable-http transport via a live MCP handshake. View diagnostics → Pass
Schema Quality & AI Usability65
- AI-judged instruction clarity (excellent).Pass
- Context-footprint check failed: tool/resource definitions use about 3430 tokens (~228/item across 15 items; 15 tools + 0 resources), over budget; trim descriptions and params. See how to fix → Fail
- Usage-examples check failed: none of the tools include examples. See how to fix → Fail
Stability & Change Management0
- Stability not yet verified: not enough scan history yet (needs a 30-day window).Unverified
Tool Coverage100
- 100% of tools have a non-trivial description (not blank, and not just the tool's name).Pass
- 100% of tool parameters carry a description.Pass
- Structured output schemas are declared (100% of tools); any adoption earns full credit.Pass
Tool Safety100
- No prompt-injection markers were found in the server instructions, tool names or descriptions we captured.Pass
- We read all 15 captured tool definition(s), and no name or description among them implies an irreversible operation.Pass
- An AI judge read all 16 captured unit(s) of tool text and found none that tries to manipulate the model reading it.Pass
Capabilities100
- Implements a supported MCP spec version (2025-11-25); the latest is 2026-07-28.Pass
Unverified: 1 category
A category scored 0 because we could not verify it: authentication we do not have, an unreachable endpoint, or not enough scan history. We only credit what we can confirm.
How do I install the PuckAPI MCP server?
PuckAPI is a hosted endpoint at https://mcp.puckapi.com/mcp, so there is nothing to install locally. Ready-made configuration for Claude, Cursor, VS Code, Codex and 5 more is on this page, copied from each client's own documentation.
remote · mcp.puckapi.com
claude mcp add --transport http noahowsh-puckapi 'https://mcp.puckapi.com/mcp'
{
"mcpServers": {
"noahowsh-puckapi": {
"url": "https://mcp.puckapi.com/mcp"
}
}
} {
"servers": {
"noahowsh-puckapi": {
"type": "http",
"url": "https://mcp.puckapi.com/mcp"
}
}
} [mcp_servers.noahowsh-puckapi] url = "https://mcp.puckapi.com/mcp"
{
"$schema": "https://opencode.ai/config.json",
"mcp": {
"noahowsh-puckapi": {
"type": "remote",
"url": "https://mcp.puckapi.com/mcp",
"enabled": true
}
}
} openclaw mcp add noahowsh-puckapi --url 'https://mcp.puckapi.com/mcp' --transport streamable-http
mcp_servers:
noahowsh-puckapi:
url: "https://mcp.puckapi.com/mcp" {
"McpServers": {
"noahowsh-puckapi": {
"Transport": "http",
"Url": "https://mcp.puckapi.com/mcp"
}
}
} assistant mcp add noahowsh-puckapi -t streamable-http -u 'https://mcp.puckapi.com/mcp'
{
"mcpServers": {
"noahowsh-puckapi": {
"type": "http",
"url": "https://mcp.puckapi.com/mcp"
}
}
} The mcpServers block is a cross-client convention. Remote transports vary, so check your client's docs.
Every change we have recorded for this component, newest first. Security-relevant changes are always shown. ▲ marks a change for the better, ▼ a change for the worse; unmarked changes are neutral.
- 27 Sept 26 +40
- Transport: unverified → pass ▲ security
- Injection markers: unverified → pass ▲ security
- First check of Judged manipulation: pass security
- Authorization: Authorisation is enforced on tool calls, but the challenge carries no valid RFC 9728 metadata, so a client cannot discover where to get a token. security
- MCP protocol: unverified → pass ▲ functional
- Tool coverage: unverified → 100 ▲ functional
- First check of Schema quality: fail functional
- First check of Schema quality: excellent functional
- First check of Destructive annotations: pass functional
- First check of Schema quality: fail functional
- First check of Tool coverage: 100 functional
- First check of Tool coverage: 100 functional
- 25 Sept 26 0
- We updated how we score, so this day's move reflects our rubric, not a change to the server See what changed → functional
- 26 Aug 26 0
- We updated how we score, so this day's move reflects our rubric, not a change to the server See what changed → functional
- 11 Aug 26 0
- We updated how we score, so this day's move reflects our rubric, not a change to the server See what changed → functional
- 31 Jul 26 0
- We updated how we score, so this day's move reflects our rubric, not a change to the server See what changed → functional
- 27 Jul 26 0
- We updated how we score, so this day's move reflects our rubric, not a change to the server See what changed → functional
- 26 Jul 26 0
First indexed and scored.
Diagnostic detail from the automated scan of this channel: what the scanner observed at each step, so you can see exactly where a check passed or failed. It is informational only and never changes the trust score.
Captured 27 Sept 2026 · Probed https://mcp.puckapi.com/mcp
TLS valid
Negotiated TLS 1.3 with TLS_AES_128_GCM_SHA256 .
| Subject | Issuer | Valid from | Valid until | Key | Signature | Serial |
|---|---|---|---|---|---|---|
| CN=mcp.puckapi.com | CN=YE2,O=Let's Encrypt,C=US | 4 Sept 2026 | 3 Dec 2026 | ECDSA 256 | ECDSA-SHA384 | 51911ea8c7fc3792948ec885670e81051ad |
| SANs: mcp.puckapi.com | ||||||
| CN=YE2,O=Let's Encrypt,C=US (CA) | CN=Root YE,O=ISRG,C=US | 3 Sept 2025 | 2 Sept 2028 | ECDSA 384 | ECDSA-SHA384 | 4df3b15dd6c0784c507cd37b58e6f115 |
| CN=Root YE,O=ISRG,C=US (CA) | CN=ISRG Root X2,O=Internet Security Research Group,C=US | 13 May 2026 | 2 Sept 2032 | ECDSA 384 | ECDSA-SHA384 | 872165fc34b6e5fba8add5b3705fb53a |
| CN=ISRG Root X2,O=Internet Security Research Group,C=US (CA) | CN=ISRG Root X1,O=Internet Security Research Group,C=US | 13 May 2026 | 2 Sept 2032 | ECDSA 384 | SHA256-RSA | 6c8f1dc727c7117f7baf853ac980f9cd |
Background: What to check on a remote MCP endpoint →
DNSSEC insecure
Validation of mcp.puckapi.com. — Not signed
| Zone | DS | Keys | Algorithms | Outcome |
|---|---|---|---|---|
| . | trust_anchor | 20326, 38696 | 8, 8 | Verified |
| com. | present | 19718 | 13 | Verified |
| puckapi.com. | absent | Unsigned (proven) parent-signed NSEC/NSEC3 proves an unsigned delegation |
Authentication Challenged, unverified
The endpoint asked for a token, but we could not retrieve and validate the RFC 9728 metadata that tells a client how to obtain one.
| Result | Challenged, unverified |
|---|---|
| Enforced | On tool calls |
| HTTP status | 200 |
Protected resource metadata
| Retrieved | No |
|---|---|
| Problem | no_resource_metadata |
Background: How OAuth 2.1 works in the 2026 MCP spec →
Transports 2 probes
| Transport | URL | Outcome | Status | Location |
|---|---|---|---|---|
| streamable-http | https://mcp.puckapi.com/mcp | Verified | 200 | |
| http (plaintext) | http://mcp.puckapi.com/mcp | HTTPS enforced | 301 | https://mcp.puckapi.com/mcp |
The tools this component advertises to a client, with an estimated token cost for each. Expand a tool to see its parameters and schema. The per-tool counts are indicative and are not scored directly; the schema's total context footprint is one signal in Schema Quality & AI Usability. A tool's description is untrusted text the model reads on every call, which is what makes this list a security surface and not just an inventory: how tool poisoning works →
get_game_detail ~122
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 available for 2019-20 onwards, though 2019-20 itself is sparse. Goalie starts are derived from play-by-play, so they are available for played games, not upcoming ones. Costs 10 credits.
| Name | Type | Req | Description |
|---|---|---|---|
| game_id | string | yes | NHL game ID (e.g. 2025020887) |
| Name | Type | Req | Description |
|---|---|---|---|
| away_team | – | yes | – |
| game | – | yes | – |
| goalie_starts | – | yes | – |
| home_team | – | yes | – |
| odds | array | yes | – |
No examples provided.
get_games ~170
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 | Type | Req | Description |
|---|---|---|---|
| date_from | string | – | Start date (YYYY-MM-DD) |
| date_to | string | – | End date (YYYY-MM-DD) |
| game_state | string | – | Filter by game state |
| game_type | string | – | Filter by game type |
| limit | integer | – | Max results (default 100) |
| season | string | – | Season ID, 8-digit (e.g. 20242025 for 2024-25). 2024-25 and 2024-2025 also accepted. |
| team | string | – | Team abbreviation to filter (home or away) |
| Name | Type | Req | Description |
|---|---|---|---|
| count | number | yes | – |
| games | array | yes | – |
No examples provided.
get_goalie_stats ~236
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 | Type | Req | Description |
|---|---|---|---|
| limit | integer | – | Max results (default 20) |
| min_games | integer | – | Minimum games played (default 10) |
| season | string | – | 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 o… |
| sort_by | string | – | Sort metric (default save_pct). gsax is goals saved above expected. |
| team | string | – | Filter by team abbreviation |
| Name | Type | Req | Description |
|---|---|---|---|
| count | number | yes | – |
| filters | object | yes | – |
| goalies | array | yes | – |
No examples provided.
get_head_to_head ~137
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 | Type | Req | Description |
|---|---|---|---|
| limit | integer | – | Max games to return (default 20) |
| season | string | – | Season ID, 8-digit (e.g. 20242025 for 2024-25). 2024-25 and 2024-2025 also accepted. Omit for all-time. |
| team1 | string | yes | First team abbreviation (e.g. BUF) |
| team2 | string | yes | Second team abbreviation (e.g. TOR) |
| Name | Type | Req | Description |
|---|---|---|---|
| games | array | yes | – |
| record | object | yes | – |
| team1 | string | yes | – |
| team2 | string | yes | – |
| total_games | number | yes | – |
No examples provided.
get_line_movement ~78
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 | Type | Req | Description |
|---|---|---|---|
| bookmaker | string | – | Filter by specific bookmaker key (lowercase) |
| game_id | string | yes | NHL game ID |
| Name | Type | Req | Description |
|---|---|---|---|
| away_team | string | yes | – |
| game_id | string | yes | – |
| home_team | string | yes | – |
| movement | object | yes | – |
No examples provided.
get_odds ~147
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 | Type | Req | Description |
|---|---|---|---|
| bookmaker | string | – | Filter by bookmaker key (e.g. draftkings, fanduel, betmgm). Lowercase. |
| game_id | string | yes | NHL game ID (e.g. 2025020887) |
| snapshot_type | string | – | Filter by snapshot type: opening (game-day morning lines) or closing (final pre-game lines). Default returns both. |
| Name | Type | Req | Description |
|---|---|---|---|
| away_team | string | yes | – |
| bookmaker_count | number | yes | – |
| game_date | string|null | yes | – |
| game_id | string | yes | – |
| home_team | string | yes | – |
| odds | array | yes | – |
No examples provided.
get_player_stats ~100
Use when you need full details for one player: bio, team, physical attributes, and headshot. 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 | Type | Req | Description |
|---|---|---|---|
| player_id | integer | yes | NHL player ID |
| Name | Type | Req | Description |
|---|---|---|---|
| goalie_stats | – | yes | – |
| player | – | yes | – |
| skater_stats | – | yes | – |
No examples provided.
get_plays ~306
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 | Type | Req | Description |
|---|---|---|---|
| game_id | string | – | NHL game ID (e.g. 2025020887) |
| limit | integer | – | Max events (default 200) |
| offset | integer | – | Pagination offset |
| period | integer | – | Period number (4+ is overtime) |
| player_id | integer | – | NHL player ID; matches the player in any role on the event |
| season | string | – | Season ID, 8-digit (e.g. 20242025). |
| shot_attempts_only | boolean | – | Only goals, shots on goal, missed shots and blocked shots (Corsi events) |
| strength | string | – | Skater strength from the event owner's view, e.g. 5v5, 5v4, 4v5 |
| team | string | – | Team abbreviation that owns the event (e.g. BUF) |
| type | string | – | Event type |
| zone | string | – | Zone: O offensive, N neutral, D defensive |
| Name | Type | Req | Description |
|---|---|---|---|
| count | number | yes | – |
| next_offset | number|null | yes | – |
| plays | array | yes | – |
| summary | object | yes | – |
No examples provided.
get_schedule ~75
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 | Type | Req | Description |
|---|---|---|---|
| days | integer | – | Number of days ahead to look (default 7) |
| team | string | – | Team abbreviation to filter |
| Name | Type | Req | Description |
|---|---|---|---|
| count | number | yes | – |
| upcoming_games | array | yes | – |
No examples provided.
get_shot_map ~189
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 | Type | Req | Description |
|---|---|---|---|
| game_id | string | – | NHL game ID |
| limit | integer | – | Max shots per page (default 1000) |
| offset | integer | – | Pagination offset; follow next_offset for a full season |
| player_id | integer | – | NHL player ID of the shooter |
| season | string | – | Season ID, 8-digit (e.g. 20242025); use with team |
| strength | string | – | Strength filter, e.g. 5v5 |
| team | string | – | Team abbreviation; use with season |
| Name | Type | Req | Description |
|---|---|---|---|
| count | number | yes | – |
| next_offset | number|null | yes | – |
| shots | array | yes | – |
| summary | object | yes | – |
No examples provided.
get_skater_season_stats ~202
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. Costs 5 credits.
| Name | Type | Req | Description |
|---|---|---|---|
| limit | integer | – | Max results (default 20) |
| min_games | integer | – | Minimum games played (default 10) |
| season | string | – | 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 o… |
| sort_by | string | – | Sort metric (default points) |
| team | string | – | Filter by team abbreviation |
| Name | Type | Req | Description |
|---|---|---|---|
| count | number | yes | – |
| filters | object | yes | – |
| skaters | array | yes | – |
No examples provided.
get_standings ~183
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 | Type | Req | Description |
|---|---|---|---|
| conference | string | – | Filter by conference |
| division | string | – | Filter by division (e.g. Atlantic, Metropolitan, Central, Pacific) |
| season | string | – | Season ID, 8-digit (e.g. 20242025 for 2024-25). 2024-25 and 2024-2025 also accepted. Defaults to current season. |
| Name | Type | Req | Description |
|---|---|---|---|
| count | number | yes | – |
| snapshot_date | string|null | yes | – |
| standings | array | yes | – |
No examples provided.
get_team_stats ~140
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 | Type | Req | Description |
|---|---|---|---|
| season | string | – | Season ID, 8-digit (e.g. 20242025 for 2024-25). 2024-25 and 2024-2025 also accepted. Defaults to current season. |
| team | string | yes | Team abbreviation (e.g. BUF, TOR, NYR) |
| Name | Type | Req | Description |
|---|---|---|---|
| current_stats | – | yes | – |
| season | string|null | yes | – |
| team | – | yes | – |
No examples provided.
list_teams ~73
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 | Type | Req | Description |
|---|---|---|---|
| conference | string | – | Filter by conference |
| division | string | – | Filter by division |
| Name | Type | Req | Description |
|---|---|---|---|
| count | number | yes | – |
| teams | array | yes | – |
No examples provided.
search_players ~137
Use when looking up a player by name. Searches 4,800+ 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 | Type | Req | Description |
|---|---|---|---|
| active | boolean | – | Filter by active status (default: true). Set false to search active plus retired/historical players. |
| limit | integer | – | Max results (default 10) |
| position | string | – | Filter by position |
| query | string | yes | Player name to search for (partial match supported) |
| team | string | – | Filter by team abbreviation |
| Name | Type | Req | Description |
|---|---|---|---|
| count | number | yes | – |
| included_inactive | boolean | yes | – |
| note | string | – | – |
| players | array | yes | – |
No examples provided.
What is the PuckAPI MCP server?
PuckAPI is an MCP server listed in the public MCP registry as io.github.noahowsh/puckapi. The hockey API for stats, odds, and everything between. REST API and MCP server. Free to start. This page covers its hosted endpoint (https://mcp.puckapi.com/mcp).
Is the PuckAPI MCP server safe to use?
PuckAPI scores 73 out of 100 on VerifyMCP. That is a record of what we were able to check automatically, not an endorsement. The category breakdown on this page shows every signal behind the number, including the ones we could not confirm.
What tools does the PuckAPI MCP server expose?
PuckAPI exposes 15 tools: get_standings, get_team_stats, list_teams, get_games, get_schedule, and 10 more. Their descriptions and schemas cost roughly 2,295 tokens of context every time the server is loaded.
Does the PuckAPI MCP server require authentication?
Yes. PuckAPI asked us for credentials when we connected, so you will need to authorise it in your MCP client before it can do anything.
Is the PuckAPI MCP server still maintained?
PuckAPI is still listed as active in the MCP registry. We last reached this channel on 27 September 2026. Those dates come from our own scans of the registry and the channel itself, not from anything the publisher announced.