프로토타입 · 미리 보기: 공식 레지스트리의 모든 서버를 담고 있으며 30분마다 동기화해요. Google로 로그인하면 리뷰를 쓸 수 있어요.
PopNx MCPAI를 쓰는 사람을 위한 MCP 서버 · 쉬운 말로 설명해요

Sportwizzard

제작자: adamruehle버전 0.1.4i★ 0i컴퓨터 또는 클라우드
레지스트리 이름com.sportwizzard/sportwizzard

설치 방법

개요

제작자가 쓴 설명(영어 원문)

Real-time sports betting data: odds, player props, edges and arbitrage from 35+ books and DFS apps.

할 수 있는 일

이 서버는 아직 쉬운 말로 된 요약을 쓰지 못했어요. 아래는 레지스트리에서 읽어 온 사실이에요.

  • 연결 방식: 컴퓨터 또는 클라우드
  • 전송 방식: stdio, Streamable HTTP
  • 카테고리: 게임, 스포츠, 음식 및 학습
  • 입력해야 할 값: SPORTWIZZARD_API_KEY, Authorization

설치

쓰고 있는 AI 앱을 고른 다음 설정을 복사하세요.

검사 3/4 통과 · 내가 묻는 내용은 제작자 서버(mcp.sportwizzard.com)를 거쳐요

먼저: 어떤 AI를 쓰시나요?

쓰는 앱을 고르면 아래에 단계가 나옵니다.

Claude에 연결할 수 있어요 · 약 5분

Sportwizzard 키가 필요해요 (제작자 사이트에서 가입, 비용이 들 수 있음) · claude.ai나 데스크톱 앱에서 한 번 설정하면 채팅에서 쓸 수 있어요 · 무료 계정은 1개까지

  1. Sportwizzard에 가입하고 키 만들기

    제작자 사이트에서 가입하고 다음 단계에 쓸 API 키를 만드세요. 비용이 들 수 있어요.

    Sportwizzard 사이트 열기 ↗

  2. Claude의 Connectors 페이지 열기

    CustomizeConnectors

    CustomizeConnectors1+ Add2https://…3Add4
  3. “+ Add” → “Add custom connector”를 누르고 이 2칸 채우기

    여기서 복사해 Claude의 같은 이름 칸에 붙여 넣고 Continue를 누르세요

    Name · 이름Sportwizzard
    Remote MCP server URL · 주소https://mcp.sportwizzard.com/mcp

    Request headers에 이 이름과 값을 추가

    헤더 이름Authorization
    값Bearer <여기에 키 붙여 넣기>

    키는 앱 입력란에만 붙여 넣고, 채팅에 붙이거나 다른 사람에게 보내지 마세요

    Authentication은 Claude가 찾은 그대로 두고 Add를 누르세요

  4. 채팅에서 켜기

    +ConnectorsSportwizzard

  5. 해 보기

    Sportwizzard을 써서 나에게 무엇을 해 줄 수 있는지 알려 주고, 하나 해 봐

    ✓ Claude가 Sportwizzard을 쓰고 있다고 하거나 답에 Sportwizzard 도구 이름이 나오면 연결된 거예요

메뉴 이름은 2026년 11월 11일에 Anthropic 도움말에서 확인 · 앱 버전에 따라 화면이 조금 다를 수 있어요

ChatGPT는 아직 Sportwizzard에 연결할 수 없어요

Sportwizzard는 연결할 때 내 키가 필요한데, OpenAI 도움말은 OAuth 로그인만 설명하고 우리가 확인한 키 입력 방법이 없어요

대신 이렇게 할 수 있어요

A · Sportwizzard에 연결되는 앱 쓰기

  • Sportwizzard 키가 필요해요 (제작자 사이트에서 가입, 비용이 들 수 있음) · claude.ai나 데스크톱 앱에서 한 번 설정하면 채팅에서 쓸 수 있어요 · 무료 계정은 1개까지
  • Sportwizzard 키가 필요해요 (제작자 사이트에서 가입, 비용이 들 수 있음)
  • Sportwizzard 키가 필요해요 (제작자 사이트에서 가입, 비용이 들 수 있음)
  • Sportwizzard 키가 필요해요 (제작자 사이트에서 가입, 비용이 들 수 있음)

B · 게임, 스포츠, 음식 및 학습에서 ChatGPT에 연결되는 다른 서버

같은 분류에서 많이 쓰는 것 중 키 없이 주소만으로 연결되는 것을 골랐어요

Claude Code에 연결할 수 있어요 · 약 5분

Sportwizzard 키가 필요해요 (제작자 사이트에서 가입, 비용이 들 수 있음)

  1. Sportwizzard에 가입하고 키 만들기

    제작자 사이트에서 가입하고 다음 단계에 쓸 API 키를 만드세요. 비용이 들 수 있어요.

    Sportwizzard 사이트 열기 ↗

  2. 터미널 열기

    Mac: Command+스페이스를 누르고 Terminal 입력 · Windows: PowerShell 열기

  3. 이 명령을 붙여 넣고 Enter

    claude mcp add --transport http sportwizzard https://mcp.sportwizzard.com/mcp --header 'Authorization: your-value'

    Enter 전에 “your-value”를 내 키로 바꾸세요

    키는 앱 입력란에만 붙여 넣고, 채팅에 붙이거나 다른 사람에게 보내지 마세요

  4. Claude Code에서 /mcp 입력

    Sportwizzard이 목록에 있고 연결됨으로 보이면 돼요

  5. 해 보기

    Sportwizzard을 써서 나에게 무엇을 해 줄 수 있는지 알려 주고, 하나 해 봐

    ✓ Claude Code가 Sportwizzard을 쓰고 있다고 하거나 답에 Sportwizzard 도구 이름이 나오면 연결된 거예요

메뉴 이름은 2026년 11월 11일에 Anthropic 도움말에서 확인 · 앱 버전에 따라 화면이 조금 다를 수 있어요

Cursor에 연결할 수 있어요 · 약 5분

Sportwizzard 키가 필요해요 (제작자 사이트에서 가입, 비용이 들 수 있음)

  1. Sportwizzard에 가입하고 키 만들기

    제작자 사이트에서 가입하고 다음 단계에 쓸 API 키를 만드세요. 비용이 들 수 있어요.

    Sportwizzard 사이트 열기 ↗

  2. 이 버튼으로 Cursor 열기

    Cursor에서 열기

    Cursor가 설치를 확인하면 Install을 누르세요

  3. 키 입력

    Sportwizzard 설정에서 Authorization가 비어 있어요. 내 키를 넣고 저장하세요

    키는 앱 입력란에만 붙여 넣고, 채팅에 붙이거나 다른 사람에게 보내지 마세요

  4. Cursor에서 AI 채팅을 Agent 모드로 열기

  5. 해 보기

    Sportwizzard을 써서 나에게 무엇을 해 줄 수 있는지 알려 주고, 하나 해 봐

    ✓ Cursor가 Sportwizzard을 쓰고 있다고 하거나 답에 Sportwizzard 도구 이름이 나오면 연결된 거예요

메뉴 이름은 2026년 11월 11일에 Cursor 도움말에서 확인 · 앱 버전에 따라 화면이 조금 다를 수 있어요

VS Code에 연결할 수 있어요 · 약 5분

Sportwizzard 키가 필요해요 (제작자 사이트에서 가입, 비용이 들 수 있음)

  1. Sportwizzard에 가입하고 키 만들기

    제작자 사이트에서 가입하고 다음 단계에 쓸 API 키를 만드세요. 비용이 들 수 있어요.

    Sportwizzard 사이트 열기 ↗

  2. 이 버튼으로 VS Code 열기

    VS Code에서 열기

    VS Code가 설치를 확인하면 Install을 누르세요

  3. 키 입력

    Sportwizzard 설정에서 Authorization가 비어 있어요. 내 키를 넣고 저장하세요

    키는 앱 입력란에만 붙여 넣고, 채팅에 붙이거나 다른 사람에게 보내지 마세요

  4. VS Code에서 AI 채팅을 Agent 모드로 열기

  5. 해 보기

    Sportwizzard을 써서 나에게 무엇을 해 줄 수 있는지 알려 주고, 하나 해 봐

    ✓ VS Code가 Sportwizzard을 쓰고 있다고 하거나 답에 Sportwizzard 도구 이름이 나오면 연결된 거예요

메뉴 이름은 2026년 11월 11일에 VS Code 도움말에서 확인 · 앱 버전에 따라 화면이 조금 다를 수 있어요

Windsurf, Zed, Gemini CLI 같은 다른 MCP 앱은 추가 방법이 저마다 달라요. 앱 목록에서 확인하세요

MCP를 쓰는 앱 모두 보기 →

웹으로 연결하는 앱용 주소

주소https://mcp.sportwizzard.com/mcp

JSON 설정은 아래 “개발자용”에 있어요

막혔나요? Sportwizzard을 쓰는 사람에게 물어보세요💬 토론 →
개발자용: 터미널 명령과 JSON 설정

웹으로 연결

Claude Code

claude mcp add --transport http sportwizzard https://mcp.sportwizzard.com/mcp --header 'Authorization: your-value'

Cursor (~/.cursor/mcp.json)

{
  "mcpServers": {
    "sportwizzard": {
      "url": "https://mcp.sportwizzard.com/mcp",
      "headers": {
        "Authorization": "your-value"
      }
    }
  }
}

VS Code (mcp.json)

{
  "servers": {
    "sportwizzard": {
      "type": "http",
      "url": "https://mcp.sportwizzard.com/mcp",
      "headers": {
        "Authorization": "your-value"
      }
    }
  }
}

컴퓨터에 설치

Claude Code

claude mcp add sportwizzard --env SPORTWIZZARD_API_KEY=your-value -- npx -y sportwizzard-mcp

Claude Desktop (claude_desktop_config.json)

{
  "mcpServers": {
    "sportwizzard": {
      "command": "npx",
      "args": [
        "-y",
        "sportwizzard-mcp"
      ],
      "env": {
        "SPORTWIZZARD_API_KEY": "your-value"
      }
    }
  }
}

Cursor (~/.cursor/mcp.json)

{
  "mcpServers": {
    "sportwizzard": {
      "command": "npx",
      "args": [
        "-y",
        "sportwizzard-mcp"
      ],
      "env": {
        "SPORTWIZZARD_API_KEY": "your-value"
      }
    }
  }
}

VS Code (mcp.json)

{
  "servers": {
    "sportwizzard": {
      "type": "stdio",
      "command": "npx",
      "args": [
        "-y",
        "sportwizzard-mcp"
      ],
      "env": {
        "SPORTWIZZARD_API_KEY": "your-value"
      }
    }
  }
}

직접 입력할 값

  • SPORTWIZZARD_API_KEY 비밀 env
    Free self-serve API key from https://sportwizzard.com/account (API Keys tab)
  • Authorization 비밀 필수 HTTP header
    Bearer — free self-serve keys at https://sportwizzard.com/account (API Keys tab), no card required

이 설정은 제작자의 레지스트리 정보로 만들었어요. README와 다르면 README를 따르세요.

한눈에 보기

주간 다운로드i
84/주
확인된 도메인
✓ sportwizzard.com
연결 방식
컴퓨터 또는 클라우드
전송 방식
stdio, streamable-http
최신 버전i
0.1.4
레지스트리 공개i
2026년 7월 24일
코드 마지막 변경i
2026년 11월 8일
제작자
adamruehle
패키지
npm: sportwizzard-mcp
웹사이트
sportwizzard.com
레지스트리 상태
활성

어떤 앱에서 쓸 수 있나요

이 서버의 연결 방식과 각 앱의 공식 문서를 바탕으로 했어요. 2026년 11월 10일 확인.

인터넷으로 연결하는 앱

ClaudeGooseLM StudioMsty StudioCherry StudioCursorVS Code + GitHub CopilotVisual StudioWindsurf (Devin Desktop)ZedKiroClineContinueJetBrains AI AssistantClaude CodeCodex CLIGemini CLIOpenCodenodecodeWarpLibreChatOpen WebUIRaycast

내 컴퓨터에서 실행하는 앱

ClaudeGooseLM StudioMsty StudioCherry StudioCursorVS Code + GitHub CopilotVisual StudioWindsurf (Devin Desktop)ZedKiroClineContinueJetBrains AI AssistantClaude CodeCodex CLIGemini CLIOpenCodenodecodeWarpLibreChatRaycast

모든 앱과 장단점 →

할 수 있는 일

마지막으로 점검했을 때 서버가 응답하지 않아서 도구를 읽지 못했어요.

기본 점검i

누구나 볼 수 있는 정보를 점검했고, 코드는 읽지 않았어요. 해당하지 않는 항목은 개수에서 뺐어요. · 2026년 11월 11일 점검

  • ✓ 통과

    제작자와 저장소 일치

    레지스트리 이름이 도메인 sportwizzard.com 기준으로 확인되었어요(레지스트리가 도메인 소유를 확인해요)

  • ✓ 통과

    계속 관리되고 있음

    코드 마지막 변경: 3일 전

  • ✓ 통과

    라이선스 있음

    MIT 사용

  • ✕ 실패

    엔드포인트 응답

    점검할 때 6초 안에 응답하지 않았어요

  • – 해당 없음

    OAuth로 로그인

    점검할 때 6초 안에 응답하지 않았어요

  • … 아직 점검 안 함

    도구 설명에 숨겨진 지시 없음

    아직 점검하지 않았어요. 엔드포인트를 점검할 때 도구 목록을 읽어요

토론

질문하고, 팁을 나누고, 안 되는 점을 알려 주세요. "도움이 됨"이 많은 순서예요.

아직 글이 없어요. 처음으로 질문하거나 공유해 보세요.

이곳의 글은 사용자가 쓴 것으로, PopNx 팀의 글이 아니에요.

Google로 로그인하고 글쓰기

사용자 리뷰

아직 리뷰가 없어요

Google로 로그인하고 리뷰 쓰기

게임, 스포츠, 음식 및 학습 카테고리의 다른 서버와 비교i

  • 이 카테고리의 다른 서버 1447개 중 0%보다 스타가 많아요
  • 이 카테고리의 다른 서버 1447개 중 16%보다 최근에 레지스트리에 공개됐어요
  • 기본 점검 결과가 이 카테고리의 다른 서버 1447개 중 55%와 같거나 더 좋아요

레지스트리에서 이 카테고리의 활성 서버 전체와 비교했어요. 스타는 게시자가 저장소를 소유한 경우에만 세요.

자주 묻는 질문

Sportwizzard, 안전한가요?

해당하는 기본 점검 4개 중 3개를 통과했어요. 코드는 읽지 않았어요. 키나 토큰을 넣기 전에 서버가 어떤 권한을 요구하는지 확인하고, 꼭 필요한 권한만 있는 키를 쓰세요.

어떤 키나 코드가 필요한가요?

입력해야 할 값: SPORTWIZZARD_API_KEY, Authorization

내 컴퓨터에서 실행되나요, 클라우드에서 실행되나요?

둘 다 가능해요. 내 컴퓨터에 설치해도 되고, 클라우드 버전에 연결해도 돼요.

아직 관리되고 있나요?

GitHub 저장소는 마지막으로 3일 전 변경됐고, 최신 버전(0.1.4)은 4개월 전 레지스트리에 올라왔어요.

어떤 앱에서 쓸 수 있나요?

Claude Desktop, Claude Code, Cursor, VS Code처럼 MCP를 지원하는 앱에서 쓸 수 있어요. URL로 연결되므로 원격 MCP를 지원하는 앱에서도 쓸 수 있어요. 예: ChatGPT Business 이상.

대신 쓸 수 있는 건 뭐가 있나요?

같은 카테고리에는: Honcho, ShipSwift, Pm Claude Skills

대안

같은 카테고리에서 다른 제작자가 만든 서버예요. 스타 순으로 정렬했어요.

카드 보는 법:↓ 주간 다운로드i★ GitHub 스타i세 기둥: 리뷰 · 점검 · 사용 정도i업데이트 = 최신 버전을 레지스트리에 공개한 날i

Honcho

Memory that reasons: continual learning for stateful agents. Better context, fewer tokens.

제작자: plastic-labs널리 사용됨★ 8.1천3개월 전 업데이트

클라우드에서 실행

ShipSwift

40+ production-ready SwiftUI recipes for building full-stack iOS apps via MCP.

제작자: signerlabs널리 사용됨★ 3.3천9개월 전 업데이트

클라우드에서 실행

Pm Claude Skills

1310 professional Agent Skills + workflow recipes — searchable & fetchable over MCP.

제작자: mohitagw15856널리 사용됨↓ 2.5천/주★ 1.5천19일 전 업데이트

내 컴퓨터에서 실행

제작자의 README

README 열기

제작자의 저장소에서 쓰인 그대로 가져왔어요. PopNx MCP가 검토하거나 보증한 내용이 아니에요. HTML, 이미지, 스크립트는 제거했어요. 링크를 누르면 이 사이트를 벗어나요.

SportWizzard MCP Server

Query live sports-betting data — odds, player props, +EV edges, arbitrage, stats and reference data from 35+ sportsbooks and DFS apps — from any MCP-capable AI agent (Claude Code, Claude Desktop, Codex, Cursor, …).

20 read-only tools over the SportWizzard REST v1 API, available two ways: a hosted remote server (zero install) and a stdio server via npx. Get a free API key at https://sportwizzard.com/account (API Keys tab — no card required).

Hosted (recommended — zero install)

claude mcp add --transport http sportwizzard https://mcp.sportwizzard.com/mcp \

--header "Authorization: Bearer sw_live_your_api_key_here"

codex mcp add sportwizzard --transport http --url https://mcp.sportwizzard.com/mcp \

--header "Authorization: Bearer sw_live_your_api_key_here"

The hosted server is a thin proxy: your key is forwarded to the SportWizzard API, which enforces auth and rate limits. All 20 tools work on both transports. (download_snapshot on the hosted server returns a CDN download URL + a ready-to-run command your agent executes locally; on stdio it writes the file directly.)

Successful authenticated live tool calls send a best-effort account-usage receipt. The measurement request contains no tool arguments or result data. For hosted download_snapshot, a successful CDN HEAD check counts because the tool has verified that the returned download URL is reachable; a failed HEAD check does not count.

Stdio (local)

npx -y sportwizzard-mcp

Claude Code:

claude mcp add sportwizzard -e SPORTWIZZARD_API_KEY=sw_live_your_api_key_here -- npx -y sportwizzard-mcp

Claude Desktop (claude_desktop_config.json — macOS: ~/Library/Application Support/Claude/, Windows: %APPDATA%\Claude\):

{

"mcpServers": { "sportwizzard": { "command": "npx", "args": ["-y", "sportwizzard-mcp"], "env": { "SPORTWIZZARD_API_KEY": "sw_live_your_api_key_here" } } } }

Mock mode (no key, no network)

Set SPORTWIZZARD_MOCK=1 to get canned sample responses — useful for wiring up an integration before you have a key.

Configuration

Env varDefaultPurpose
SPORTWIZZARD_API_KEY_(none)_Your API key, sent as X-Api-Key.
SPORTWIZZARD_BASE_URLhttps://api.sportwizzard.comOverride the API base URL.
SPORTWIZZARD_MOCK_(off)_1 = canned sample data, no network.

Tools

ToolWhat it does
list_events / get_eventEvents/fixtures with their participants — filter by competition, competitor, player, status, time; full detail incl. each side's score, the latest live state, weather, lineups, probable pitchers.
get_event_statsBox score: every player's stat line + competitor results for one event.
get_odds / get_event_odds / get_player_odds / get_competitor_oddsCurrent prices, scoped by event, player, competitor, sportsbook, market, or competition. get_odds also takes scope: event (game markets), season (season-long futures), tournament (golf/tennis outrights); omit for all.
get_edges+EV edges vs. devigged fair market (competition, source, min_edge filters).
get_arbitrageArbitrage opportunities with legs and stake fractions (two/three-way).
list_players / list_competitors / get_player_stats / get_competitor_statsReference data and season/historical stats.
get_player_game_logsBulk per-game stat rows — the model-training feed.
download_snapshotSave the full live board to disk (tens of MB gzip). include_history: true also populates every selection's selectionPrice rows (same schema; 5 credits flat vs 1).
list_sportsbooks / list_competitions / list_markets / statusDiscover source IDs, covered competitions and supported market types; check customer API availability.
get_account_usageYour plan tier, rate limit, and monthly usage.

Every response uses the envelope { success, data, nextCursor, meta }; when nextCursor is present the tool appends a _paging hint so agents know to continue.

Participants and sides

Events, edges and arbitrage rows list who takes part as participants, ordered by side:

Eventparticipants
NBA: Hawks at Wizards{side: 1, sideLabel: "home", position: 1, name: "Washington Wizards"}, {side: 2, sideLabel: "away", position: 1, name: "Atlanta Hawks"}
Tennis singles{side: 1, position: 1, name: "Brandon Nakashima"}, {side: 2, position: 1, name: "Matteo Berrettini"} (no label: order is arbitrary, as in MMA and esports)
Tennis doublestwo players per side, position 1 and 2
Golfthe whole field, {name} only, no sides

get_event adds each side's final score and, when a source reported one, the latest live state ({status, period, clock, side1Score, side2Score, source, observedAt}).

Each odds row is one outcome of a selection:

  • side: 1 or 2, the event side the outcome is about; absent for totals, draws, "neither" and futures.
  • outcomeCode: SportWizzard's fixed list: OVER, UNDER, YES, NO, WIN (a moneyline leg is WIN with its side), DRAW, NEITHER, WIN_OR_DRAW, EITHER, ODD, EVEN, SCORE (read side1Score/side2Score), RANGE, OTHER, LABEL (a categorical answer only the selection label explains).
  • statType: the fixed stat list (points, rush_yards, …).
  • outcomeParticipants: [{kind: "competitor" | "player", name}], names exactly as the sportsbook sent them. An outcome about a side with no name has none; read the event participant on that side.

Markets carry phase (PRE or LIVE). With include_history, each selection's selectionPrice is a list of rows, oldest first, one per run of an unchanged price:

{"observedAt": "2026-11-03T12:31:02Z", "lastObservedAt": "2026-11-03T12:40:15Z", "priceAmerican": -110, "priceDecimal": 1.9091}

A row may also carry dfsMultiplier, suspended: true and, on exchanges, liquidityTier.

IDs depend on your key: with an API key on a paid plan, each participant and outcome participant also has competitorId (a team) or playerId (a person), and odds, edge and arbitrage rows carry playerId and source references. Without a key, or on the Free plan, you get names and sides. competitor_id and player_id filters match events where that competitor or player is a participant.

Futures (season-scope markets)

get_odds with scope=season returns season-long futures — division/conference/championship winners, award odds, team win totals, season leaders and full-season player props. Three orthogonal axes describe them:

  • `marketScope` — which anchor the market hangs off: SEASON or TOURNAMENT. Omitted entirely on ordinary game rows.
  • `period` — the window within that anchor: REG_SEASON (settles at the end of the regular season) or FULL (runs through the playoffs).
  • `segment` — which slice of the competition: AFC_EAST, NL, SEC, … Present only when the market is segment-scoped, and load-bearing: all 32 NFL DIVISION_WINNER selections share one season-anchor eventId, so without segment they read as a single 32-team race instead of 8 divisions.

Notes: winner/award markets are categorical (one YES selection per competitor, no side, usually no NO side); eventStartTime on a futures row is the season anchor / settlement date, not a kickoff; every book's futures for a competition share the same season eventId; and futures are deliberately excluded from get_edges / get_arbitrage (they never enter de-vig or edge math). Scope matching is exact — season does not include TOURNAMENT — and an invalid value returns HTTP 400 naming the valid ones.

From source

git clone https://github.com/sportwizzard/sportwizzard-mcp.git

cd sportwizzard-mcp && npm install && npm run build SPORTWIZZARD_MOCK=1 node dist/index.js # or set SPORTWIZZARD_API_KEY

Maintainers

This README ships inside the npm package, so keep it free of internal hostnames, keys and private notes (the repository is public).

Layout. src/index.ts is the stdio entry (dist/index.js, the npm bin); src/httpServer.ts is the hosted Streamable HTTP entry (stateless, one request per POST; Host allow list and bearer-key handling); src/auth.ts validates the caller's key against the API, caches it and applies the per-key rate limit; src/tools.ts and src/server.ts define and register tools; src/client.ts is the REST client and src/mock.ts the SPORTWIZZARD_MOCK=1 data. tests/stdio-smoke.mjs and tests/http-smoke.mjs are end-to-end smokes against a loopback mock API (no credentials, no production calls).

Build and verify (the PR check, .github/workflows/ci.yml, runs the same pack-and-smoke plus a no-push container build):

npm ci --ignore-scripts && npm run build

release_dir="$(mktemp -d)" npm pack --ignore-scripts --pack-destination "$release_dir" npm install --prefix "$release_dir/consumer" --omit=dev --ignore-scripts --no-audit --no-fund "$release_dir"/*.tgz npm run smoke -- "$release_dir/consumer/node_modules/sportwizzard-mcp/dist/index.js" "$release_dir/smoke.json" "$release_dir"/*.tgz npm run smoke:http -- "$release_dir/consumer/node_modules/sportwizzard-mcp/dist/httpServer.js" "$release_dir/http-smoke.json" rm -rf "$release_dir"

The stdio smoke checks tools/list, get_odds scope=season forwarding and a snapshot download with history; the HTTP smoke checks /healthz, key rejection, the Host allow list, tools/list, key forwarding and a clean SIGTERM exit. Both prove transport and packaging, not live data quality.

Releasing.

  • Hosted server: publish-container.yml publishes a SHA-tagged GHCR image on every push to main. It deploys only when that digest is promoted in the Ops deployment/releases/api.yaml row, which owns placement, limits and credential references.
  • npm package: bump version in package.json, run npm install --package-lock-only, sync server.json, merge to main, then run the manual Publish npm package workflow (publish-npm.yml). It builds once, smokes the packed tarball and publishes those exact bytes through npm trusted publishing (OIDC; no npm token). Publishing npm does not update the hosted container.

Gotchas. Hosted runtime settings are MCP_HTTP_PORT (default 8091), MCP_ALLOWED_HOSTS, AUTH_CACHE_TTL_MS, RATE_LIMIT_PER_MIN, SPORTWIZZARD_SNAPSHOT_URL and SPORTWIZZARD_SNAPSHOT_HISTORY_URL, plus the customer settings above. download_snapshot writes a file on stdio but returns a CDN URL and a command on the hosted server. Never print or commit ~/.npmrc. Open work goes in GitHub issues in this repository.

License

MIT © SportWizzard LLC