{
  "markdown": "<p align=\"center\">\n  <img src=\"assets/logo.png\" alt=\"Sports Hub\" width=\"128\" height=\"128\">\n</p>\n\n<h1 align=\"center\">Sports Hub MCP Server</h1>\n\n<p align=\"center\">\n  <a href=\"https://www.npmjs.com/package/mcp-sports-hub\"><img src=\"https://img.shields.io/npm/v/mcp-sports-hub?color=CB3837&logo=npm&logoColor=white\" alt=\"npm version\"></a>\n  <a href=\"https://www.npmjs.com/package/mcp-sports-hub\"><img src=\"https://img.shields.io/npm/dt/mcp-sports-hub?color=CB3837&logo=npm&logoColor=white\" alt=\"npm downloads\"></a>\n  <a href=\"https://github.com/lacausecrypto/mcp-sports-hub/actions\"><img src=\"https://github.com/lacausecrypto/mcp-sports-hub/actions/workflows/ci.yml/badge.svg\" alt=\"CI\"></a>\n  <a href=\"LICENSE\"><img src=\"https://img.shields.io/badge/License-MIT-blue.svg\" alt=\"License\"></a>\n</p>\n\n<p align=\"center\">\n  <img src=\"https://img.shields.io/badge/Providers-41-orange\" alt=\"41 Providers\">\n  <img src=\"https://img.shields.io/badge/Tools-410-green\" alt=\"410 Tools\">\n  <a href=\"https://registry.modelcontextprotocol.io\"><img src=\"https://img.shields.io/badge/MCP_Registry-published-8B5CF6?logo=anthropic&logoColor=white\" alt=\"MCP Registry\"></a>\n</p>\n\n<p align=\"center\">\n  <img src=\"https://img.shields.io/badge/macOS-supported-lightgrey?logo=apple&logoColor=white\" alt=\"macOS\">\n  <img src=\"https://img.shields.io/badge/Linux-supported-lightgrey?logo=linux&logoColor=white\" alt=\"Linux\">\n  <img src=\"https://img.shields.io/badge/Windows-supported-lightgrey?logo=windows&logoColor=white\" alt=\"Windows\">\n  <img src=\"https://img.shields.io/badge/Node.js-18+-339933?logo=node.js&logoColor=white\" alt=\"Node.js\">\n  <img src=\"https://img.shields.io/badge/TypeScript-5.7-3178C6?logo=typescript&logoColor=white\" alt=\"TypeScript\">\n</p>\n\nA unified MCP server that aggregates **42 sports API providers** into a single service. **410 tools** covering scores, stats, odds, esports, college sports, chess, motorsport, boxing, AFL, and more across 70+ sports.\n\n> Each provider works independently. You only need API keys for the providers you use. Missing keys don't block startup — tools return an error when called without their key.\n\n**Works with:**\n[![Claude](https://img.shields.io/badge/Claude-Desktop_%7C_Code-D97706?logo=anthropic&logoColor=white)](https://claude.ai)\n[![ChatGPT](https://img.shields.io/badge/ChatGPT-Desktop-74AA9C?logo=openai&logoColor=white)](https://openai.com)\n[![Cursor](https://img.shields.io/badge/Cursor-IDE-000000?logo=cursor&logoColor=white)](https://cursor.com)\n[![Windsurf](https://img.shields.io/badge/Windsurf-IDE-09B6A2)](https://codeium.com/windsurf)\n[![Zed](https://img.shields.io/badge/Zed-Editor-084CCF)](https://zed.dev)\n[![Continue](https://img.shields.io/badge/Continue-OSS-000000)](https://continue.dev)\n[![Cline](https://img.shields.io/badge/Cline-VS_Code-007ACC?logo=visualstudiocode&logoColor=white)](https://github.com/cline/cline)\n\n## Demo\n\n![mcp-sports-hub demo](docs/demo.gif)\n\n> NBA scores, Premier League odds, Tennis H2H — all from a single MCP server.\n\n## Compatibility\n\n### Platforms\n\n| OS | Status |\n|----|--------|\n| macOS | Supported |\n| Linux | Supported |\n| Windows | Supported |\n\n### MCP Clients\n\n| Client | Status | Notes |\n|--------|--------|-------|\n| **Claude Desktop** | Supported | Anthropic's desktop app |\n| **Claude Code (CLI)** | Supported | `claude mcp add` |\n| **Cursor** | Supported | Built-in MCP |\n| **Windsurf (Codeium)** | Supported | Built-in MCP |\n| **Continue.dev** | Supported | Open-source AI assistant |\n| **Cline** | Supported | VS Code extension |\n| **Zed** | Supported | Built-in MCP |\n| **ChatGPT Desktop** | Supported | OpenAI desktop app |\n| **Gemini CLI** | Supported | Google CLI |\n| **Any MCP client** | Supported | Stdio + HTTP/SSE transport |\n\nUses the **stdio transport** from the [MCP SDK](https://modelcontextprotocol.io). Works with any LLM (Claude, GPT, Gemini, Llama, Mistral, etc.).\n\n**Requirements**: Node.js 18+, npm.\n\n## Providers (32)\n\n### Works instantly — no API key, no signup (19 providers, ~165 tools)\n\nThese providers work out of the box. Just build and run.\n\n| Prefix | Provider | Coverage | Tools | Notes |\n|--------|----------|----------|-------|-------|\n| `espn_` | [ESPN](https://site.api.espn.com/) | 20+ sports | 10 | Unofficial — can break |\n| `nhl_` | [NHL Web API](https://api-web.nhle.com/) | NHL | 13 | Undocumented but stable |\n| `mlb_` | [MLB Stats API](https://statsapi.mlb.com/) | MLB/MiLB | 13 | Official, undocumented |\n| `f1_` | [Jolpica F1](https://api.jolpi.ca/ergast/f1/) | Formula 1 (1950+) | 13 | Community-maintained |\n| `openf1_` | [OpenF1](https://openf1.org/) | F1 live telemetry | 12 | Live race weekends only |\n| `openliga_` | [OpenLigaDB](https://api.openligadb.de/) | German football | 10 | Bundesliga focus |\n| `sportsdb_` | [TheSportsDB](https://www.thesportsdb.com/) | 40+ sports | 13 | Test key auto, watermarks |\n| `ncaa_` | [NCAA API](https://github.com/henrygd/ncaa-api) | College sports | 8 | 5 req/s rate limit |\n| `sportsrc_` | [SportSRC](https://sportsrc.org/) | Football, basketball, MMA + streams | 7 | V1 free, V2 needs paid key |\n| `lichess_` | [Lichess](https://lichess.org/api) | Chess (users, top players, broadcasts, daily puzzle) | 7 | ~20 req/sec/IP |\n| `chesscom_` | [Chess.com](https://www.chess.com/news/view/published-data-api) | Chess (profiles, stats, clubs, leaderboards) | 7 | Throttles on parallel calls |\n| `squiggle_` | [Squiggle](https://api.squiggle.com.au/) | AFL (Australian Football League) | 6 | Honest UA required |\n| `motogp_` | [MotoGP](https://www.motogp.com/) | MotoGP/Moto2/Moto3/MotoE | 7 | Unofficial — can break |\n| `formulae_` | [Formula E](https://www.fiaformulae.com/) | Formula E | 7 | Unofficial — can break |\n| `nascar_` | [NASCAR](https://www.nascar.com/) | NASCAR Cup/Xfinity/Truck | 3 | Unofficial CDN feeds |\n| `opendota_` | [OpenDota](https://www.opendota.com/) | Dota 2 analytics | 11 | 60 req/min, 50k/mo |\n| `sleeper_` | [Sleeper](https://docs.sleeper.com/) | NFL fantasy | 10 | ~1000 req/min |\n| `euroleague_` | [EuroLeague](https://www.euroleaguebasketball.net/) | EuroLeague + EuroCup basketball | 6 | Keyless feeds |\n| `footballdata_uk_` | [Football-Data.co.uk](https://www.football-data.co.uk/) | Historical football results + odds | 2 | CSV, 25+ leagues |\n\n> **Tip**: Use `SPORTS_HUB_PROVIDERS=free` to load only these 19 providers (~165 tools).\n\n### Free tier with API key — signup required, no credit card (23 providers, ~245 tools)\n\nRegistration takes 1-2 minutes. All keys are free.\n\n| Prefix | Provider | Coverage | Tools | Free Limit | Get Key |\n|--------|----------|----------|-------|------------|---------|\n| `pandascore_` | PandaScore | Esports (13 titles) | 14 | 1000 req/hr | [Sign up](https://pandascore.co/) |\n| `apifootball_` | API-Football | Soccer (960+ leagues) | 15 | 100 req/day | [Sign up](https://www.api-football.com/) |\n| `apisports_` | API-Sports | 9 sports | 10 | 100 req/day/sport | [Sign up](https://api-sports.io/) |\n| `apitennis_` | API-Tennis | Tennis (ATP/WTA/ITF) | 12 | 100 req/day | [Sign up](https://api-tennis.com/) |\n| `bdl_` | BallDontLie | NBA/NFL/MLB/NHL | 10 | Basic tier | [Sign up](https://www.balldontlie.io/) |\n| `cricket_` | CricketData | Cricket | 10 | 100 req/day | [Sign up](https://cricketdata.org/) |\n| `entitycricket_` | Entity Sport | Cricket (250+ comps) | 12 | Free plan | [Sign up](https://www.entitysport.com/) |\n| `footballdata_` | football-data.org | Soccer (12 leagues) | 11 | 10 req/min | [Sign up](https://www.football-data.org/) |\n| `sportmonks_` | Sportmonks | Soccer | 12 | 3000 req/hr | [Sign up](https://www.sportmonks.com/) |\n| `sportsdata_` | SportsDataIO | 9 sports | 12 | 1000 req/mo | [Sign up](https://sportsdata.io/) |\n| `odds_` | The Odds API | 70+ sports odds | 9 | 500 req/mo | [Sign up](https://the-odds-api.com/) |\n| `oddsio_` | Odds-API.io | 34 sports odds | 10 | Free account | [Sign up](https://odds-api.io/) |\n| `sgo_` | Sports Game Odds | 55+ leagues odds | 10 | Trial | [Sign up](https://sportsgameodds.com/) |\n| `lumify_` | Lumify | Odds, splits + AI bet analysis (8 sports) | 14 | Free trial key | [Sign up](https://lumify.ai/) |\n| `mma_` | Fighting Tomatoes | MMA | 8 | 200 req/mo | [Sign up](https://fightingtomatoes.com/) |\n| `livegolf_` | Live Golf API | Golf (PGA/DP World) | 8 | Free tier | [Sign up](https://livegolfapi.com/) |\n| `isports_` | iSportsAPI | Football/Basketball (Asia) | 10 | Free tier | [Sign up](https://www.isportsapi.com/) |\n| `sportdevs_` | SportDevs | Rugby/Volleyball/Handball | 12 | Trial | [Sign up](https://sportdevs.com/) |\n| `msf_` | MySportsFeeds | NFL/NBA/MLB/NHL | 12 | Free non-commercial | [Sign up](https://www.mysportsfeeds.com/) |\n| `golfcourse_` | GolfCourseAPI | 30K+ golf courses | 6 | 300 req/day | [Sign up](https://golfcourseapi.com/) |\n| `cfbd_` | College Football Data | NCAA football | 14 | 1000 req/mo | [Sign up](https://collegefootballdata.com/key) |\n| `boxing_` | Boxing Data API | Pro boxing (fighters/bouts/titles) | 8 | 100 req/mo | [Sign up](https://rapidapi.com/) |\n| `highlightly_` | Highlightly | Multi-sport highlights + odds | 6 | 100 req/day | [Sign up](https://highlightly.net/) |\n\n> Providers with missing keys don't block the server — they just return an error when called. Register keys incrementally as you need them.\n\n## Installation\n\n### Quick (npx — no install)\n\n```bash\nnpx mcp-sports-hub\n```\n\n### npm global\n\n```bash\nnpm install -g mcp-sports-hub\nmcp-sports-hub\n```\n\n### From source\n\n```bash\ngit clone https://github.com/lacausecrypto/mcp-sports-hub.git\ncd mcp-sports-hub\nnpm install\nnpm run build\n```\n\n### MCP Registry\n\nThis server is published on the [official MCP Registry](https://registry.modelcontextprotocol.io) as `io.github.lacausecrypto/sports-hub`. MCP clients that support the registry can discover and install it automatically.\n\n## Transport Modes\n\n### Stdio (default — Claude Desktop, Cursor, etc.)\n\n```bash\nnpx mcp-sports-hub\n```\n\n### HTTP/SSE (remote clients, web apps, custom integrations)\n\n```bash\n# Via flag\nnpx mcp-sports-hub --http\n\n# Via env\nSPORTS_HUB_HTTP=1 SPORTS_HUB_PORT=3000 npx mcp-sports-hub\n```\n\nEndpoints:\n- `POST /mcp` — MCP protocol (Streamable HTTP with SSE)\n- `GET /health` — Health check (`{\"status\":\"ok\",\"providers\":19,\"sessions\":0,\"mode\":\"session\"}`)\n\nSupports CORS and multi-client session management via the `mcp-session-id` header. Default port: 3000.\n\nEach client gets its own session, created on `initialize` and addressed afterwards by its session id. Building a session costs ~90 ms for the 165-tool `free` preset, paid once per client rather than per request. Idle sessions are reaped.\n\n```bash\nSPORTS_HUB_MAX_SESSIONS=200   # concurrent sessions before new ones get a 503\nSPORTS_HUB_SESSION_TTL=1800   # seconds a session may sit idle\nSPORTS_HUB_STATELESS=1        # opt out: build a throwaway server per request\n```\n\n`SPORTS_HUB_STATELESS=1` suits several replicas behind a load balancer with no sticky routing. It pays the build cost on every call, so prefer sessions for a single instance.\n\n> **⚠ Security**: HTTP mode binds to `127.0.0.1` (loopback) by default. Setting `SPORTS_HUB_HOST=0.0.0.0` exposes an **unauthenticated** MCP endpoint to your whole network — anyone who can reach it can use your configured API keys. DNS-rebinding protection only blocks browser-origin attacks, not direct clients. Only expose it behind a reverse proxy with auth/TLS. `SPORTS_HUB_CORS_ORIGINS` must list explicit origins (a literal `*` is rejected).\n\n### Hosted (Smithery)\n\nA `Dockerfile` and `smithery.yaml` are included for container hosting on [Smithery](https://smithery.ai). The hosted endpoint serves the keyless `free` preset, so clients connect with zero setup. The deploy sets `SPORTS_HUB_DNS_REBINDING_PROTECTION=0` because Smithery's proxy forwards a non-localhost `Host` header.\n\n> `SPORTS_HUB_DNS_REBINDING_PROTECTION=0` disables the Host/Origin check (it is **on** by default). Only set it when the server runs behind a trusted proxy that owns routing — never for a server directly reachable by browsers on localhost.\n\n## Configuration\n\n### Environment Variables\n\nOnly set keys for providers you want:\n\n```bash\n# Free — no key needed:\n# ESPN, NHL, MLB, Jolpica F1, OpenF1, OpenLigaDB, NCAA, TheSportsDB (test key),\n# SportSRC (V1), Lichess, Chess.com, Squiggle (AFL),\n# MotoGP, Formula E, NASCAR, OpenDota, Sleeper\n\n# Optional (defaults to test key)\nexport THESPORTSDB_API_KEY=\"your-key\"          # https://www.thesportsdb.com/\n\n# Requires free registration\nexport PANDASCORE_TOKEN=\"your-token\"            # https://pandascore.co/\nexport API_SPORTS_KEY=\"your-key\"                # https://api-sports.io/\nexport API_FOOTBALL_KEY=\"your-key\"              # https://www.api-football.com/\nexport API_TENNIS_KEY=\"your-key\"                # https://api-tennis.com/\nexport BALLDONTLIE_API_KEY=\"your-key\"           # https://www.balldontlie.io/\nexport CRICKETDATA_API_KEY=\"your-key\"           # https://cricketdata.org/\nexport ENTITY_SPORT_KEY=\"your-key\"              # https://www.entitysport.com/\nexport FOOTBALL_DATA_API_KEY=\"your-key\"         # https://www.football-data.org/\nexport SPORTMONKS_API_KEY=\"your-key\"            # https://www.sportmonks.com/\nexport SPORTSDATA_IO_KEY=\"your-key\"             # https://sportsdata.io/\nexport THE_ODDS_API_KEY=\"your-key\"              # https://the-odds-api.com/\nexport ODDS_API_IO_KEY=\"your-key\"               # https://odds-api.io/\nexport SPORTS_GAME_ODDS_KEY=\"your-key\"          # https://sportsgameodds.com/\nexport FIGHTING_TOMATOES_API_KEY=\"your-key\"     # https://fightingtomatoes.com/\nexport LIVE_GOLF_API_KEY=\"your-key\"             # https://livegolfapi.com/\nexport ISPORTSAPI_KEY=\"your-key\"                # https://www.isportsapi.com/\nexport SPORTDEVS_API_KEY=\"your-key\"             # https://sportdevs.com/\nexport GOLFCOURSE_API_KEY=\"your-key\"            # https://golfcourseapi.com/\nexport MYSPORTSFEEDS_USER=\"your-user\"           # https://www.mysportsfeeds.com/\nexport MYSPORTSFEEDS_PASS=\"your-pass\"\nexport CFBD_API_KEY=\"your-key\"                  # https://collegefootballdata.com/key\nexport LUMIFY_API_KEY=\"your-key\"                # https://lumify.ai/\n```\n\n**Windows** (PowerShell):\n```powershell\n$env:API_SPORTS_KEY = \"your-key\"\n$env:PANDASCORE_TOKEN = \"your-token\"\n```\n\n**Windows** (cmd):\n```cmd\nset API_SPORTS_KEY=your-key\nset PANDASCORE_TOKEN=your-token\n```\n\n### Response size and the `fields` parameter\n\nSports APIs return very wide objects, and every byte a tool returns is spent from the model's context window. A single `espn_get_scoreboard`-style team listing is ~300 KB of JSON, of which the part anyone wants is under 3 KB.\n\n**Every tool accepts an optional `fields` parameter**: a comma-separated list of key names to keep, matched at any depth. Branches that match nothing are dropped, and a matched key keeps its whole value.\n\n```jsonc\n// espn_get_teams { \"sport\": \"basketball\", \"league\": \"nba\" }\n//   -> 297 KB\n\n// espn_get_teams { \"sport\": \"basketball\", \"league\": \"nba\",\n//                  \"fields\": \"id,abbreviation,displayName,location\" }\n//   -> 2.9 KB, same 30 teams\n```\n\nIf `fields` matches nothing, the tool says so and lists the top-level keys it did see, rather than returning an empty object.\n\nResponses are also capped. Above the limit, the longest lists in the payload are shortened until it fits (so the JSON still parses) and a note reports how many items were dropped.\n\n```bash\nSPORTS_HUB_MAX_RESULT_BYTES=40000   # default; serialized bytes per tool result\n```\n\n### Claude Desktop\n\nConfig file locations:\n- **macOS**: `~/Library/Application Support/Claude/claude_desktop_config.json`\n- **Windows**: `%APPDATA%\\Claude\\claude_desktop_config.json`\n- **Linux**: `~/.config/claude/claude_desktop_config.json`\n\n```json\n{\n  \"mcpServers\": {\n    \"sports-hub\": {\n      \"command\": \"node\",\n      \"args\": [\"/absolute/path/to/mcp-sports-hub/dist/index.js\"],\n      \"env\": {\n        \"PANDASCORE_TOKEN\": \"your-token\",\n        \"API_SPORTS_KEY\": \"your-key\",\n        \"THE_ODDS_API_KEY\": \"your-key\"\n      }\n    }\n  }\n}\n```\n\nWindows path: `\"args\": [\"C:/Users/you/mcp-sports-hub/dist/index.js\"]`\n\nOnly include env vars for providers you need. Omit `env` entirely for free-only providers.\n\n### Claude Code (CLI)\n\n```bash\nclaude mcp add sports-hub node /absolute/path/to/mcp-sports-hub/dist/index.js\n```\n\nOr in `.claude/settings.json`:\n```json\n{\n  \"mcpServers\": {\n    \"sports-hub\": {\n      \"command\": \"node\",\n      \"args\": [\"/absolute/path/to/mcp-sports-hub/dist/index.js\"],\n      \"env\": {\n        \"PANDASCORE_TOKEN\": \"your-token\"\n      }\n    }\n  }\n}\n```\n\n## Provider Filtering\n\nBy default, only the **free preset** is loaded (19 providers, ~165 tools — no API keys needed). Use `SPORTS_HUB_PROVIDERS` to change what's loaded:\n\n```bash\n# Default — free providers only (no config needed)\nnpx mcp-sports-hub\n\n# Load ALL 42 providers (410 tools)\nSPORTS_HUB_PROVIDERS=all npx mcp-sports-hub\n\n# Use a preset\nSPORTS_HUB_PROVIDERS=us-major npx mcp-sports-hub\n\n# Pick specific providers\nSPORTS_HUB_PROVIDERS=espn,nhl,odds npx mcp-sports-hub\n\n# Exclude from all (prefix with -)\nSPORTS_HUB_PROVIDERS=-sportsdata,-mma npx mcp-sports-hub\n```\n\n### Presets\n\n| Preset | Providers | Tools | Needs keys? |\n|--------|-----------|-------|-------------|\n| `free` (default) | 19 no-key providers (espn, nhl, mlb, f1, openf1, openliga, sportsdb, ncaa, sportsrc, lichess, chesscom, squiggle, motogp, formulae, nascar, opendota, sleeper, euroleague, footballdatauk) | ~165 | No |\n| `all` | all 42 providers | 410 | Yes (for key-required providers) |\n| `chess` | lichess, chesscom | 14 | No |\n| `us-major` | espn, nhl, mlb, ncaa, cfbd, bdl, msf, nascar, sleeper | ~93 | Some |\n| `soccer` | espn, apifootball, footballdata, sportmonks, openliga, sportsrc, footballdatauk, highlightly | ~73 | Some |\n| `f1` | f1, openf1 | 25 | No |\n| `motorsport` | f1, openf1, motogp, formulae, nascar | ~42 | No |\n| `esports` | pandascore, opendota | 25 | Some |\n| `odds` | odds, oddsio, sgo, lumify | 43 | Yes |\n| `cricket` | cricket, entitycricket | 22 | Yes |\n| `golf` | livegolf, golfcourse | 14 | Some |\n\n### Cache\n\nAll GET responses are cached in memory for 60 seconds by default. This protects against duplicate calls and rate limit waste. Configure with:\n\n```bash\nSPORTS_HUB_CACHE_TTL=120  # seconds (0 to disable)\n```\n\nThe cache key includes a digest of the request's auth headers, so two API keys never read each other's entries. Concurrent identical requests are collapsed into a single upstream call, and a `404`/`410` is remembered briefly (`SPORTS_HUB_NEGATIVE_CACHE_TTL`, default 30s) so a wrong ID can't be re-fetched in a loop.\n\n### Rate limits and retries\n\n`429` and `5xx` responses are retried with exponential backoff, honouring `Retry-After` when the upstream sends one. Client errors (`4xx` other than 408/425/429) and timeouts are not retried.\n\n```bash\nSPORTS_HUB_MAX_RETRIES=2        # extra attempts after the first (0 disables)\nSPORTS_HUB_RETRY_BASE_MS=300    # backoff base; doubles per attempt\n```\n\nIn Claude Desktop config:\n```json\n\"env\": {\n  \"SPORTS_HUB_PROVIDERS\": \"us-major\",\n  \"THE_ODDS_API_KEY\": \"your-key\"\n}\n```\n\n## Tool Naming\n\nAll tools follow `{provider}_{action}`:\n\n```\nespn_get_scoreboard        — Live scores (ESPN)\nnhl_get_standings          — NHL standings\nmlb_get_game_boxscore      — MLB box score\nf1_get_race_results        — F1 results (1950+)\nopenf1_get_laps            — F1 live telemetry\npandascore_get_lives       — Live esports matches\napifootball_get_fixtures   — Soccer fixtures (960+ leagues)\nodds_get_odds              — Betting odds (70+ sports)\nsportsrc_get_xg_stats      — Expected goals (xG)\n```\n\n## MCP Resources & Prompts\n\nBeyond tools, the server exposes:\n\n**Resources** (readable catalogs, no API call):\n- `sportshub://providers` — the full provider catalog (prefix, name, coverage, required key)\n- `sportshub://presets` — all presets and the providers they load\n- `sportshub://provider/{key}` — details for one provider (with key autocompletion)\n\n**Prompts** (curated slash-command workflows over the 410 tools):\n- `whats-on-today` · `compare-odds {event}` · `motorsport-weekend {series}` · `league-standings {league}` · `team-deep-dive {team}` · `f1-race {season} {round}`\n\nAll tools are annotated `readOnly` / `idempotent` so clients can skip confirmation prompts.\n\n## Architecture\n\n```\nsrc/\n├── index.ts                    # Imports + registers all 42 providers; transports\n├── shared/\n│   ├── http.ts                 # fetchJson, fetchText, buildUrl, toolResult, errorResult\n│   │                           #   + retry/backoff, coalescing, keyed cache\n│   ├── catalog.ts              # provider catalog + presets (single source of truth)\n│   ├── annotations.ts          # central read-only annotations + titles\n│   ├── tool-pipeline.ts        # central `fields` param, size cap, empty-result hints\n│   ├── projection.ts           # field projection used by the pipeline\n│   ├── slim.ts                 # strips $schema boilerplate from tools/list\n│   ├── resources.ts            # MCP resources (provider/preset catalogs)\n│   └── prompts.ts              # MCP prompts (curated workflows)\n└── providers/\n    ├── espn.ts                 #  10 tools — no key\n    ├── nhl.ts                  #  13 tools — no key\n    ├── mlb-stats.ts            #  13 tools — no key\n    ├── jolpica-f1.ts           #  13 tools — no key\n    ├── openf1.ts               #  12 tools — no key\n    ├── openligadb.ts           #  10 tools — no key\n    ├── golfcourse.ts           #   6 tools — GOLFCOURSE_API_KEY\n    ├── thesportsdb.ts          #  13 tools — optional key\n    ├── pandascore.ts           #  14 tools — PANDASCORE_TOKEN\n    ├── api-football.ts         #  15 tools — API_FOOTBALL_KEY\n    ├── api-sports.ts           #  10 tools — API_SPORTS_KEY\n    ├── api-tennis.ts           #  12 tools — API_TENNIS_KEY\n    ├── balldontlie.ts          #  10 tools — BALLDONTLIE_API_KEY\n    ├── cricketdata.ts          #  10 tools — CRICKETDATA_API_KEY\n    ├── entity-sport-cricket.ts #  12 tools — ENTITY_SPORT_KEY\n    ├── football-data.ts        #  11 tools — FOOTBALL_DATA_API_KEY\n    ├── sportmonks.ts           #  12 tools — SPORTMONKS_API_KEY\n    ├── sportsdata-io.ts        #  12 tools — SPORTSDATA_IO_KEY\n    ├── the-odds-api.ts         #   9 tools — THE_ODDS_API_KEY\n    ├── odds-api-io.ts          #  10 tools — ODDS_API_IO_KEY\n    ├── sports-game-odds.ts     #  10 tools — SPORTS_GAME_ODDS_KEY\n    ├── lumify.ts               #  14 tools — LUMIFY_API_KEY\n    ├── fighting-tomatoes.ts    #   8 tools — FIGHTING_TOMATOES_API_KEY\n    ├── live-golf.ts            #   8 tools — LIVE_GOLF_API_KEY\n    ├── isportsapi.ts           #  10 tools — ISPORTSAPI_KEY\n    ├── sportdevs.ts            #  12 tools — SPORTDEVS_API_KEY\n    ├── mysportsfeeds.ts        #  12 tools — MYSPORTSFEEDS_USER/PASS\n    ├── sportsrc.ts             #   7 tools — V1 free, V2 needs paid key (not exposed)\n    ├── ncaa.ts                 #   8 tools — no key\n    ├── cfbd.ts                 #  14 tools — CFBD_API_KEY\n    ├── lichess.ts              #   7 tools — no key\n    ├── chess-com.ts            #   7 tools — no key\n    ├── squiggle.ts             #   6 tools — no key\n    ├── motogp.ts               #   7 tools — no key\n    ├── formula-e.ts            #   7 tools — no key\n    ├── nascar.ts               #   3 tools — no key\n    ├── opendota.ts             #  11 tools — no key\n    ├── sleeper.ts              #  10 tools — no key\n    ├── euroleague.ts           #   6 tools — no key\n    ├── football-data-uk.ts     #   2 tools — no key (CSV)\n    ├── boxing.ts               #   8 tools — BOXING_DATA_API_KEY\n    └── highlightly.ts          #   6 tools — HIGHLIGHTLY_API_KEY\n```\n\nEach provider exports `register(server)`. Keys are checked at call time, not startup.\n\n## Contributing\n\n1. Fork the repository\n2. Create `src/providers/my-api.ts` exporting `register(server: McpServer)`\n3. Prefix tool names: `myapi_get_something`\n4. Import + call in `src/index.ts`\n5. `npm run build` to verify\n6. Submit a PR\n\n## License\n\nMIT\n",
  "bytes": 23987,
  "sha": "d26520498d95b8ac13f77ac089746c9bb7857a88f7ffe381f21ae82fff8842a5",
  "repo_slug": "lacausecrypto/mcp-sports-hub",
  "fonte": "repo",
  "truncated": false,
  "api": "https://agentalog.com/api/listings/mcp_io_github_lacausecrypto_sports_hub_e24509ff/readme"
}