Labsco
troelskn logo

Hawaii Conditions MCP

from troelskn

Real-time surf, trails, volcano, ocean safety, weather, and restaurants for all Hawaiian islands โ€” built for AI agents.

๐Ÿ”ฅ๐Ÿ”ฅFreeQuick setup

eliteprospects

Unofficial access to eliteprospects.com hockey data โ€” leagues, teams, players, and staff โ€” as structured output rather than scraped HTML.

It comes in two forms backed by the same TypeScript core: a command-line tool for browsing and searching from the terminal (with --json for piping into other tools), and an MCP server that exposes the same lookups to MCP clients such as Claude. No API key and no build step.

MCP server

The same functionality is exposed to MCP clients (e.g. Claude) by bin/eliteprospects-mcp, a Model Context Protocol server speaking JSON-RPC 2.0 over stdio. It is dependency-free โ€” the protocol is implemented directly in src/mcp.ts.

Tools:

ToolArgumentsDescription
searchquery, type?Search players, staff, teams, leagues by name
list_leaguescountry?List leagues, optionally filtered by country code
get_leagueslug, season?League metadata, teams, seasons
get_teamid, season?Team metadata and roster
get_playeridPlayer profile
get_staffidStaff profile

Register it with an MCP client by pointing at the launcher, e.g. in a mcpServers config:

{
  "mcpServers": {
    "eliteprospects": {
      "command": "bun",
      "args": ["/absolute/path/to/eliteprospects/bin/eliteprospects-mcp"]
    }
  }
}

See also: https://coworkerai.io/guide/mcp-setup

How it works

EliteProspects is a Next.js site. Two data sources are used, both structured JSON rather than scraped HTML:

  • Index pages (e.g. /leagues) embed their data in a <script id="__NEXT_DATA__"> tag. See src/leagues.ts.
  • Detail pages (e.g. /league/<slug>) sit behind a Cloudflare challenge in their rendered form, so we instead fetch Next.js's data endpoint /_next/data/<buildId>/<route>.json, which returns the same pageProps and is not challenged. The buildId changes per deploy, so it is read at runtime from the reachable /leagues page and cached. See src/client.ts and src/league.ts.

Search uses a different backend entirely: the site's autocomplete API at autocomplete.eliteprospects.com (the same one the site's search box uses). It is a separate, unauthenticated host โ€” not behind the Cloudflare challenge, and not subject to the member limits of the on-site search form. The /all endpoint returns mixed types (each tagged with _type); /players, /staff, /teams, and /leagues each return a single type. See src/search.ts.

Team, player, and staff URLs carry both an id and a slug (/team/42107/aalborg-u18, /player/8862/joe-sakic, /staff/14739/daniel-rasmussen). A request for the id alone soft-redirects to the canonical path, which the scraper follows to learn the slug โ€” so teams, players, and staff work from just the numeric id. This idโ†’slug resolution lives in fetchEntityData (src/client.ts) and is shared by src/team.ts and src/profile.ts.

Country codes

EliteProspects identifies countries with ISO 3166-1 alpha-3 codes (DNK). The output and --country filter use the more universal alpha-2 form (DK); both forms are accepted as input. The two UK home nations EP lists separately โ€” England and Scotland โ€” are not ISO countries and have no alpha-2, so they keep the ISO 3166-2 subdivision codes GB-ENG / GB-SCT (distinct from GB = U.K.). The mapping is an embedded, verified ISO table โ€” see src/countries.ts.

Project layout

Development

bun install     # install dev dependencies (TypeScript, @types/bun)
bun run typecheck