mcpField
S
Sportsdata Mcp

Sportsdata Mcp

本地服务
sportsdata-ai.com游戏娱乐294 周前更新

关于 Sportsdata Mcp

sportsdata-mcp 是一个开源的体育数据 MCP 服务,提供多家博彩公司、官方联赛统计及预测市场的数据工具。其特点是可以同时比较不同博彩公司对同一市场的赔率,适合关注澳大利亚市场或需要全球体育数据的用户。

主要功能

  1. 01汇总多家博彩公司及交易所的实时赔率
  2. 02覆盖澳新博彩公司与赛马数据
  3. 03官方联赛与统计数据源
  4. 04按需启用工具组
  5. 05提供下注工具,需用户自行授权

适用场景

  1. 01比较同一场比赛在不同博彩公司的赔率差异
  2. 02查询 MLB、NBA 等联赛的赔率与统计数据

MCP 相关

该项目作为 MCP 服务,将体育数据接口封装为工具,供 MCP 客户端按能力标签查找和调用。

配置

本地服务的配置在各客户端中通用,复制后粘贴到客户端的 MCP 配置文件即可。

mcp.json · 通用配置
{
"mcpServers": {
"sportsdata": {
"command": "uvx",
"args": [
"sportsdata-mcp"
]
}
}
}
启动命令uvx sportsdata-mcp

本地服务需要在你的电脑上安装运行环境(如 Node.js 18+)。各客户端的配置文件位置不同,请参考客户端文档。

安装包
pypisportsdata-mcp0.27.0

工具

200

收录的工具列表 · 更新于 2 周前

此工具无需参数。

详细介绍

sportsdata-mcp

CI Release PyPI PyPI downloads License: MIT sportsdata-mcp MCP server Support on Ko-fi

Add to Cursor

问问 AI 哪家博彩公司开出的赔率更高,就能得到真实答案。

免费且开源(MIT)。在 Claude Desktop、Cursor 或任何 MCP 客户端中使用,涵盖 65 家数据提供商的约 856 个工具。运行 uvx sportsdata-mcp serve 即可。

你: Parramatta 对阵 Penrith,哪家博彩公司给出的赔率最高?差距有多大?

Claude 同时查询五家博彩公司,给出以下结果:

博彩公司EelsPanthers
Betfair1.186.20
BetR1.175.00
PointsBet1.174.80
Pinnacle1.174.78
Sportsbet1.194.75

实际采集的赔率。在 Penrith 的同一场投注中,Betfair 的赔率为 $6.20,而 Sportsbet 为 $4.75——相同风险下,赔率相差 30%。除非有工具能同时读取每家博彩公司,否则这种差距根本无从发现。

这个项目的用途:比较赔率,而不只是查询比分。 许多体育类 MCP 服务都能提供赛程和积分榜。这个项目的核心是博彩公司之间的赔率差异——并排比较同一市场的十一家博彩公司、Betfair 交易所和两个预测市场(Kalshi、Polymarket),外加二十七个官方联盟/统计数据源。它对澳大利亚和新西兰博彩公司(Sportsbet、TAB、Ladbrokes、PointsBet、BetR、Dabble)以及赛马的数据覆盖尤其深入——包括纯种马、赛狗和马车赛,以及彩池投注和交易所资金流;这些领域大多数目录完全没有涉及。能力标签让不同数据提供商可以互换,因此“比较各家博彩公司赔率”只需提出一个问题,而不必对接四十三套集成。

适合你吗?

坦率说明这一点很重要,因为它决定你第一次提问时,得到的是有效结果还是看起来像出了问题。

最适合——关注或投注澳大利亚市场的用户。 上文所说的跨博彩公司优势正是这个项目的初衷,其基础是八家澳大利亚博彩公司提供的 159 个工具:Sportsbet、TAB、PointsBet、BetR、Ladbrokes/Neds、Betfair、Dabble、Unibet。没有其他项目能提供这样的覆盖,而且赛马数据同样深入,涵盖纯种马、赛狗和马车赛,以及彩池投注和交易所资金流。

也很适合——需要获取全球各地体育数据的用户。 其他来自 57 家数据提供商的 697 个工具不受地区限制:MLB、NBA、NFL、NHL、英超、板球、高尔夫、网球、F1、UFC、梦幻体育(ESPN、Sleeper、FPL),以及 Pinnacle 和 Kalshi、Polymarket 预测市场。其中 491 个工具无需密钥。

不适合——需要美国体育博彩赔率的用户。 这八家博彩公司获准在澳大利亚运营,会屏蔽澳大利亚以外的流量。在美国,价格数据可通过 Pinnacle、FanDuel、Kalshi 和 Polymarket 获取;统计数据和梦幻体育功能则可以完整使用。如果你是为了比较美国各家博彩公司赔率而来,这个工具并不适合你。

现在它可以下注了。请阅读这段内容。

自 0.31.0 起,目录中包含 sportsbet_place_bet、tab_place_bet、 entain_place_bet 和 unibet_place_bet。这些工具会使用你提供的凭据,通过你自己的账户投注真钱。它们不会自行调用——它们只是普通工具,因此连接到此服务的任何应用都会决定何时运行它们。

这会带来两点,务必都读完:

  • 在这些工具可用的情况下,大模型可以下注。 如果你不希望如此,请勿启用账户组;其他所有分组均不受影响,而且 list-groups 会准确显示你已启用的内容。
  • 只有 Sportsbet 和 TAB 已在真实账户上完成往返测试。 Unibet 和 Ladbrokes/Neds 的请求格式是根据浏览器中进行的投注记录而捕获的,这能证明请求格式,但无法说明仅凭已保存的凭据是否就能被接受。

Agent 工作台会在此基础上应用自己的策略——一切都从 paper 模式开始,除非你主动启用某家博彩公司,否则不会投注——但这是应用的防护措施,不是此服务的防护措施。单独使用时,此软件包会按要求行事。

与其盲目信任,不如询问它:

sportsdata-mcp coverage

它会从你的设备探测每家服务商,并打印哪些服务商有响应、哪些因你所在地区而受限,以及哪些需要密钥——因此结果为空时,你不会分不清是“没有数据”还是“国家/地区不对”。

基于此服务构建

两个实时终端,均为开源,且仅依靠这些工具运行:

sportsdata-ai.com/sports — 将预测市场 + 交易所汇总为去除水钱后的专业盘口,并以此衡量每家博彩公司。

体育赛事看板

sportsdata-ai.com/board — 赛马资金流向:哪些参赛马匹正在走强、公平赔率与全场对比,以及胜率/投资回报率记分卡。

赛马看板

安装后试试这些问题
  • “比较今晚所有 NRL 比赛中各家博彩公司的一对一赔率。”
  • “哪些 AFL 比赛的博彩公司赔率分歧最大?”
  • “Betfair 对 Panthers 的赔率暗示了什么?Sportsbet 又提供了什么赔率?”
  • “显示今天每场 MLB 比赛的 Pinnacle 盘口。”
  • “获取 Hawthorn 的积分榜排名和最近五场比赛的结果。”

一个MCP服务,可将体育数据 API(博彩公司、联赛/管理机构数据源、聚合服务)作为工具提供,并且可配置为只加载你需要的工具组。能力标签系统让不同服务商的工具在回答相同问题时可以互换使用——这样模型就能通过一次发现调用,比较不同博彩公司之间的赔率,或比较不同数据源之间的统计数据。

目录涵盖博彩公司、联赛/管理机构数据源和统计聚合服务,并且还在不断扩展。只需将 YAML 规格文件放入 src/sportsdata_mcp/specs/,即可添加新的服务商——无需更改引擎代码——因此具体的服务商和工具数量会随时间变化。运行 sportsdata-mcp list-groups 查看实时目录;无论启用什么内容,三个元工具(分组发现、能力查询、资源列表)始终可用。

安装

一行命令(通过 uv 配置任何 MCP 客户端):

uvx sportsdata-mcp serve        # or: pip install sportsdata-mcp

预构建应用(无需 Python):下载最新的 release (macOS + Windows)并解压,然后运行 sportsdata-mcp setup——它会为你写入 Claude Desktop / Cursor 的配置。目前 macOS 版本尚未签名:首次使用时,右键点击 → 打开。

从源代码安装:

git clone https://github.com/DanielTomaro13/sportsdata-mcp.git
cd sportsdata-mcp
pip install -e .                # add ".[dev]" for the test + lint toolchain

快速入门

sportsdata-mcp version          # print version info
sportsdata-mcp list-groups      # see every available tool group
sportsdata-mcp lint             # validate the packaged specs
sportsdata-mcp doctor           # probe enabled groups for reachability + auth
sportsdata-mcp serve            # start the MCP stdio server (default command)
sportsdata-mcp update-specs     # OTA-refresh provider specs (signed bundle); --clear reverts

提供商端点会发生变化(例如,Entain 会轮换其 GraphQL 持久化查询哈希)。 update-specs 会获取一个已签名的规范包,并将其应用到 ~/.sportsdata/spec-overlay 下的覆盖层中。加载器会优先使用覆盖层,而不是打包的副本,因此修复端点变化无需重新构建整个应用。该软件包会使用内置密钥进行 Ed25519 验证 (产品构建会拒绝未签名或伪造的软件包;防回滚机制会拒绝过期的重放)。 使用 scripts/publish-spec-bundle.py 发布软件包;将 --url / $SPORTSDATA_SPEC_FEED_URL 指向该资源。应用后重启服务。

使用配置文件或 SPORTSDATA_MCP_GROUPS 环境变量启用工具组:

SPORTSDATA_MCP_GROUPS="afl.public.core,sportsbet.racing,entain.graphql" sportsdata-mcp serve

请参阅 examples/,其中包含 Claude Desktop / Claude Code 的配置片段、 一份完整的跨博彩公司赔率比较提示词, 以及一份 NBA 投篮图表 + 比分统计演练, 展示了 nba_stats_call 分发器模式的完整流程。

配置

配置按以下顺序解析(命中第一项后即停止):

  1. --config <path> 标志
  2. $SPORTSDATA_MCP_CONFIG
  3. ./sportsdata-mcp.yaml
  4. ~/.config/sportsdata-mcp/config.yaml
  5. 内置默认值
# sportsdata-mcp.yaml
enabled_groups:
  - afl.public.core
  - sportsbet.racing
  - entain.graphql

providers:                      # all optional; sensible defaults apply
  sportsbet:
    request_timeout_seconds: 30
    rate_limit_rps: 10          # sustained requests/sec (token bucket)
    max_response_bytes: 0       # 0 = no cap (default); set a positive byte count to guard context

secrets: {}                     # for authenticated providers; prefer env vars in prod

对于身份验证配置读取 env: SOME_VAR 的提供商,首先使用实际环境变量的值, 然后使用同名的 secrets: { SOME_VAR: "..." } 条目 (便于本地开发;生产环境中请将真实密钥保存在环境变量中)。

环境变量
变量效果
SPORTSDATA_MCP_GROUPS工具组选项;覆盖 enabled_groups。接受预设(free、au-books、racing、arb、fantasy、chess、official-stats、aus、odds、motorsport、all)、提供商 ID(espn)或 glob(espn.*)、字面工具组以及排除项(*,-twitter)。运行 list-groups 可查看每个预设及其工具数量。
SPORTSDATA_MCP_CONFIG配置文件路径(参见上方的解析顺序)。
SPORTSDATA_MCP_MAX_BYTES为未自行设置 max_response_bytes 的所有提供商设置全局响应大小上限(单位:字节)。0(默认值)表示不设上限。
SPORTSDATA_MCP_CACHE_TTL缓存相同 GET 响应的秒数(默认为 60,0 表示禁用)。可吸收模型推理期间发出的重复调用,同时避免实时价格过时。每个提供商可单独设置:providers.<id>.cache_ttl_seconds。
SPORTSDATA_MCP_HTTP / SPORTSDATA_MCP_HOST / SPORTSDATA_MCP_PORT使用 HTTP 而非 stdio 提供服务(等同于 serve --http --host --port)。默认绑定到 127.0.0.1 —— 该端点未经身份验证,因此绑定到更广泛的网络会向该网络暴露所有已启用的工具,以及进程中的任何提供商凭据。
SPORTSDATA_LICENSE未启用 —— 本产品免费;无需许可证。签名授权机制仍保留,供自行托管受限高级数据源的用户使用(见下文)。
SPORTSDATA_ENTITLEMENT_URL / SPORTSDATA_ENTITLEMENT_PUBKEY仅与上述未启用的授权门控相关。通常不设置。
(休眠的)授权门控

本项目曾是付费产品。现在它免费了——无需许可证,也不存在许可证;默认情况下,所有分组均可使用——但签名授权机制(经 Ed25519 验证的 Feed 授权、离线缓存、每 15 分钟重新验证)并未删除,而是保留为休眠状态:它经过测试,未设置时不会造成影响,对于希望为自己的用户限制高级 Feed 的本地自托管服务用户也很有用。设置 SPORTSDATA_LICENSE + SPORTSDATA_ENTITLEMENT_URL,指向你自己的签发服务即可启用;保持未设置(默认状态)则一切照旧。

需要密钥的 Feed。 少数提供商需要你自行提供上游凭据——例如,DataGolf 需要 DATAGOLF_KEY,Twitter/X 需要 X_BEARER_TOKEN。其他所有内容均无需密钥。

无论启用了哪些分组,元工具(list_available_groups、list_tools_by_capability、list_resources)始终会注册,因此全新安装仍可引导模型启用分组。

关于响应大小上限。 默认情况下没有上限——每个工具都会返回上游 API 发送的所有内容。如果你想保护模型的上下文窗口,可以选择启用上限:优先级依次为 providers.<id>.max_response_bytes > SPORTSDATA_MCP_MAX_BYTES > 默认值(0,不限制)。请注意,超大的负载(例如 Sportsbet 完整的 *_event_markets 数据流,约 2 MB)无论如何都无法装入 Claude 约 200 K 个 Token 的上下文;对此类数据,建议使用范围更窄的工具,例如设置 includeTopMarkets: true 的 sportsbet_sports_card。

工具分组

运行 sportsdata-mcp list-groups 查看实时数量和说明。

AFL — api.afl.com.au
分组工具数说明
afl.public.core22赛事、赛季、轮次、赛程、积分榜、比赛数据
afl.public.broadcasting9转播地区、指南、提供商
afl.public.content8新闻/文章、视频、照片
afl.premium.cfs1CFS 高级操作——需要匿名的 x-media-mis-token
afl.premium.statspro1StatsPro 操作——需要 x-media-mis-token
afl.premium.keyserver1HLS 视频 URL 签名
Sportsbet — sportsbet.com.au
分组工具数说明
sportsbet.racing15赛马赛事、赛卡、赛果、期货、SRM
sportsbet.sports14体育赛事、盘口、赔率、SGM
sportsbet.cross12实时状态、解说、积分榜、促销、视频
sportsbet.results2按日期查询已出结果的赛事
sportsbet.graphql1持久化 GraphQL 网关(apigw/sportsbook/graph)
Entain / Ladbrokes — ladbrokes.com.au
分组工具数说明
entain.rest13导航快捷链接和 REST 接口
entain.graphql1127 个持久化 GraphQL 操作(gql/router)
entain.cdn1Contentful CMS 条目(促销、重大赛事导航)
PointsBet — pointsbet.com.au
分组工具数说明
pointsbet.sports10体育目录、赛事/比赛 Feed、完整赛事盘口、滚球、搜索
pointsbet.racing11赛会、赛卡、赛果、期货、SRM、小贴士、赛马资料
pointsbet.content3促销、促销代码启动页,以及针对静态 CMS/导航资源的 pointsbet_content_call
TAB — tab.com.au
分组工具数说明
tab.racing9日期、赛会、赛卡(固定赔率 + 彩池投注)、赛马资料、即将开赛、累积奖池、期货
tab.sports9体育/赛事树、完整比赛盘口 + SGM、重点比赛盘口、即将开赛、赛果、多串关构建器
tab.discovery4精选/实时推荐,以及针对 CMS 内容 Feed 的 tab_cms_call
Unibet — unibet.com.au
分组工具备注
unibet.racing1unibet_racing_call — 持久化 GraphQL:赛事日、赛卡、赛马资料、期货、特别投注
unibet.sport3通过 Kambi 报价 API 调用 unibet_kambi_call(分组、赛事、投注选项、滚球、投注构建器)+ 实时统计 + 赔率阶梯
BetR — betr.com.au(BlueBet 平台)
分组工具备注
betr.racing8即将开赛的赛事、今日/分组赛卡、赛卡、赛马资料、赔率波动、热门选项
betr.sport7赛事类型、赛事类别、赛事市场、比赛详情、热门 SGM
betr.content4促销 + 精选赛马 + 热门市场链接
Pinnacle — pinnacle.com(精准赔率)
分组工具备注
pinnacle.sports13体育项目/联赛、完整 + 精选 + 实时 + 按联赛划分的对阵、轮播、对阵详情、单场 + 串关市场(美式赔率)
pinnacle.reference4枚举、市场标签词典、让分投注定义、API 状态
Betfair Exchange — betfair.com.au(交易所赔率)
分组工具备注
betfair.exchange3bymarket + byevent 的买入/卖出赔率数据流(最精准的赔率)+ 现金退出可用性
betfair.navigation1bynode 目录图(体育项目 → 赛事日 → 赛事 → 市场)
betfair.inplay5实时比分、赛事详情、时间线(单项 + 批量)、比分 + 转播
Dabble — dabble.com.au(iOS 应用后端)
分组工具备注
dabble.sport5发现任意赛事(活跃列表/名称查找/体育项目),然后获取其赛程(内嵌市场 + 十进制赔率)+ 每场赛事的完整投注簿(400 多个市场 + Pick'em 特选)

澳大利亚社交博彩应用的后端,可直接读取。通过伪装成 iOS 应用访问——规范中内置了应用的 User-Agent + x-device-id + x-app-version,因此公共数据流会匿名返回 JSON。仅限澳大利亚,且由 Cloudflare 提供保护(与其他澳大利亚博彩公司一样,非澳大利亚 IP 会收到 403)。适用于任意赛事——dabble_active_competitions 会列出所有体育项目中目前可投注的约 269 项赛事。赔率只读——不能下注。 可通过 sport.event_markets / sport.prices 与其他博彩公司组合使用。

SuperCoach — supercoach.com.au(News Corp / Champion Data 梦幻体育)
分组工具备注
supercoach.fantasy6在全部 7 项赛事(afl/nrl/epl/nba/nbl/nfl/bbl)× 2 种模式(classic + draft)中提供统一界面:赛事状态、完整的球员数据流(价格 + ppts1 预测 + 持有率 + 对阵;draft 还会增加 predraft_rank)、赛程(含 H2H 赔率)、俱乐部 + 单球员目录、联赛

News Corp / Champion Data 的工资帽梦幻体育游戏。所有数据流都位于 /{year}/api/{sport}/classic/v1/… 下——传入 sport(七项赛事之一)和 year(赛季标识:afl/nrl 使用当前日历年,其他赛事目前使用 2025,这些赛事跨年进行)。无需身份验证,不受地理限制(可在 CI 中运行)。 核心 supercoach_players 数据流按轮次划分,数据量较大(约 1–3 MB);请使用 ppts1(真实预测值),而非 ppts。与 Data Golf 一起,通过 stats.fantasy_projections 补充梦幻体育/预测视角。参见 documentation/SuperCoach.md。

NBL — nbl.com.au(澳大利亚国家篮球联赛)
分组工具数说明
nbl.basketball16赛季、球队、排名榜、赛程(比分)、单场比赛的技术统计和比赛逐球记录、球员及阵容、球员赛季统计及比赛日志技术统计、球队统计、赛季统计数据领跑者(可排序)和新闻

联盟自有站点数据 API——基于 Genius Sports 统计数据的 Redis 缓存代理(“rosetta”),位于 prod.rosetta.nbl.com.au/get/…。无需令牌,但受 Referer 限制(没有 nbl.com.au Origin + Referer 会返回 403——两者都已写入规范)。每个响应都封装为 {type, count, source, data:[…]}。按 year(赛季开始年份)指定赛季:2026 = NBL27(当前赛季);统计数据领跑者接口使用从 nbl_seasons 获取的赛季 UUID。与 SuperCoach 的 nbl 梦幻体育数据源不同,这是官方技术统计数据源。参见 documentation/NBL.md。

WTA — wtatennis.com(女子网球协会,官方)
分组工具数说明
wta.tennis8WTA 官方 API:单打/双打排名、球员目录及个人资料与比赛历史、赛事日历及各届赛事结果与参赛名单(种子选手)

WTA 的官方数据 API(api.wtatennis.com/tennis/…)——公开的 Spring REST API,无需认证/密钥,无地域限制,可在 CI 中运行。排名需要 type+metric(rankSingles+singles 或 rankDoubles+doubles);赛事使用 tournamentGroup.id + year 作为标识(澳大利亚网球公开赛 = group 901)。填补了统计数据方面的网球空缺,可与博彩公司提供的实时网球市场数据结合使用。参见 documentation/WTA.md。(ATP 没有同等的开放 API——atptour.com 受 Cloudflare 反机器人保护——因此未纳入建模。)

Racing and Sports — racingandsports.com.au
分组工具数说明
racingandsports.racing3今日赛马日程(所有赛种,已验证)+ 体育赛事列表 + 单场赛马赔率(需要令牌)
PuntersEdge — puntersedge.online(澳大利亚 + 新西兰赔率聚合器,演示版无需密钥)
分组工具数说明
puntersedge.demo3无需密钥——即将开赛的赛马、最佳赔率 + 套利标记、单个体育项目中一家博彩公司提供的赔率
puntersedge.racing7每场赛马中各家博彩公司提供的赔率、每匹赛马的最佳胜出/位置/彩池赔率、赛卡、赛果、赔率变动、赛场、收盘线档案
puntersedge.sport3体育项目目录、按 sport_key 查询各家博彩公司提供的赔率、每个选项的最佳赔率 + 套利标记

这是澳大利亚博彩公司面板的聚合器,而非博彩公司本身;与大多数澳大利亚博彩公司不同,它没有地域限制,并提供永久收盘线档案,适用于 CLV 和回测工作。演示工具无需密钥;其余工具读取 PUNTERSEDGE_API_KEY。参见 documentation/PuntersEdge.md。

Data Golf — datagolf.com(需要密钥)
分组工具数说明
datagolf.general3球员名单、巡回赛日程、当前赛事参赛名单
datagolf.predictions11DG 排名、赛前(含存档)及比赛进行中的模型概率、技术水平与攻球技术评级、球员/实时 SG 分解数据、实时杆数得失、实时球洞统计、DFS 投影
datagolf.betting3全胜、对决及所有配对赔率,涵盖约 13 家博彩公司(含模型赔率)
datagolf.historical9存档原始轮次数据、赛事级结果(名次/奖金/积分)、历史博彩公司赔率(全胜 + 对决)及 DFS 赛果

需要在 DATAGOLF_KEY 环境变量中设置 Data Golf API 密钥(个人订阅密钥——通过 static_query 认证方案提供,不会存储在代码库中)。

FanDuel — fanduel.com(美国)
分组工具数说明
fanduel.racing4fanduel_racing_call(完整查询 GraphQL:精选/今日赛马及赔率、单场赛马赛卡、赛道、彩池、专家推荐)+ 消息/快速链接/促销活动
fanduel.sportsbook2fanduel_sb_call(REST:赛事页面及盘口、比赛进行中、促销活动、通过 _ak 密钥获取的配置)+ 实时比分
NRL — mc.championdata.com
GroupToolsNotes
nrl.public.core4Champion Data 比赛中心:赛事、赛程、每场比赛的球员统计数据、应用设置

此外还有 nrl://stats/definitions 资源(包含所有 NRL 统计代码的字典)。

NBA — cdn.nba.com + stats.nba.com
GroupToolsNotes
nba.public.cdn5开放 CDN JSON:今日记分板、完整赛程、实时技术统计表 + 比赛过程、赔率
nba.stats2nba_daily_lineups + nba_stats_call,用于分发 /stats/ API 中的 138 个端点

nba_stats_call 提供对整个 stats.nba.com /stats/ 分析接口的访问(球员/球队数据面板、v2 + v3 技术统计表、投篮图、比赛过程、领跑者、排名、选秀、拼抢、追踪等)。可在 nba://stats/operations 资源中查看每个操作、必需参数及默认值。

ESPN — espn.com JSON 源
GroupToolsNotes
espn.scores5网站 API 便捷端点:记分板、球队、排名、比赛摘要、新闻
espn.site1espn_site_call — 球队详情、阵容、赛程、伤病、阵容深度图、交易、历史记录、运动员新闻、分组、排名(10 个操作)
espn.core1espn_core_call — 规范的 $ref 链接模型:赛事/比赛、赔率、胜率、比赛过程、场馆、选秀、教练、日历、交易(37 个操作)
espn.web1espn_web_call — 全站搜索 + common/v3 运动员视图(7 个操作)
espn.cdn1espn_cdn_call — CDN 实时核心源:记分板/比赛/技术统计表/比赛过程(4 个操作)

所有 ESPN 工具都可通过 sport + league slug 参数指定范围(例如 football/nfl、basketball/nba、soccer/eng.1),因此这五组工具覆盖 ESPN 提供的所有联赛。可在 espn://{site,core,web,cdn}/operations 资源中查看每个分发器的操作。

OpenDota — api.opendota.com(Dota 2 电竞,无需密钥)
GroupToolsNotes
opendota.reference4英雄、按技能段划分的英雄元数据、职业战队、联赛
opendota.matches3职业比赛、完整比赛详情、公开天梯比赛
opendota.players4个人资料 + 排名、比赛记录、胜负、英雄池

本目录中的首个电竞数据源。双方称为 Radiant/Dire,而非主队/客队;英雄统计则按技能段提供成对的选用/获胜次数,而非比率——两者均有文档说明,也均有测试固定验证。不会公开 4.4 MB 的职业选手列表。详见 documentation/OpenDota.md。

OpenLigaDB — api.openligadb.de(德国足球,无需密钥)
GroupToolsNotes
openligadb.football8德甲 1/2/3 级 + DFB-Pokal:赛程、结果、积分榜、比赛日

补上五大联赛中的空缺——此前已有英超、西甲和意甲,但没有德甲。数据由社区维护,因此较少见的赛事信息可能会有延迟。请注意,比分位于 matchResults 中,其中包含半场和全场两项记录。详见 documentation/OpenLigaDB.md。

EuroLeague — api-live.euroleague.net(篮球,无需密钥)
GroupToolsNotes
euroleague.basketball7EuroLeague + EuroCup:赛季、俱乐部、轮次、比赛、技术统计表

与 NBA 和 NBL 一同完善篮球数据。一个字母用于选择赛事(E/U);赛季代码为 E2024;主场/客场分别称为 local/road;技术统计表使用 PIR,而非 NBA 风格的效率值。详见 documentation/EuroLeague.md。

NCAA — ncaa-api.henrygd.me(美国大学体育,无需密钥)
GroupToolsNotes
ncaa.college3涵盖所有大学体育项目的记分板、联盟排名、AP/教练投票排名

ESPN 已提供大学赛事比分;此处则以标准化格式补充 NCAA 自有的投票排名和联盟排名。这是 NCAA.com 的第三方镜像,并非官方数据源。详见 documentation/NCAA.md。

Fantasy Premier League — fantasy.premierleague.com(官方,无需密钥)
分组工具说明
fpl.players2所有球员的价格、状态、持有率、预期进球/预期助攻数据;单名球员提供完整详细信息
fpl.reference3俱乐部实力评级、全部 38 个比赛周及其截止时间、计分规则
fpl.fixtures5赛程及 1-5 难度评级、球员实时得分、梦幻阵容、定位球主罚者
fpl.managers6任意经理的阵容、历史记录和选人;经典联赛和 H2H 联赛;你自己的队伍

全球参与人数最多的梦幻游戏——共有 4,085,510 支注册队伍,除你自己的队伍外,数据均为公开数据。

一个特性影响了整个提供方:bootstrap-static 是一个大小为 1.37 MB 的单一数据块,仅球员数据行就有约 362,000 个 token,且不支持服务端字段筛选。四个工具都访问这同一个 URL,各自返回一个数据切片,因此 fpl_players 返回约 58k 个 token,而不是大到无法使用。没有编造或重命名任何内容——只是删除了部分内容。

注意单位:now_cost 的单位是百万英镑的十分之一(145 = £14.5m),form 和预期进球相关字段都是字符串,而 team 是 FPL 自己的 1-20 编号,并非英超的编号。参见 documentation/FPL.md。

UFC — ufc.com JSON:API(官方,无需密钥)
分组工具说明
ufc.events3包含分段比赛时间和场馆信息的赛事、完整对阵卡,以及 UFC 1 以来的比赛记录
ufc.athletes2选手搜索和附带统计数据的个人资料
ufc.stats2FightMetric 职业生涯统计表和各级别排名
ufc.records2单回合纪录,以及 JSON:API 资源索引

看起来最直接的数据源 ufcstats.com 实际上行不通——它提供带有 noindex 的 JavaScript 工作量证明机器人验证,HTML 中没有任何数据行,因此读取数据就意味着要构建绕过机器人检测的机制。结果发现 ufc.com 更好:它运行 Drupal 并公开了 JSON:API,且 athlete_stat 包含相同的 FightMetric 数据集,甚至使用相同的 fightmetric_id 标识符。

每位选手有 48 项统计数据——按站立、缠抱、地面等位置以及头部、躯干、腿部等目标细分的重要打击数据;摔倒成功次数/尝试次数/成功率/防守率、降服和击倒平均数据、每分钟打击命中数和承受数,以及按终结方式分类的职业生涯纪录。

有两个注意事项:关联记录绝不会内嵌返回(不使用 include=athlete_stat,就完全没有选手统计数据);统计数据集合上的筛选器会悄无声息地返回 0 行,而不是报错——因此不提供这些参数,而是通过排序实现排行榜功能。由于 robots.txt 要求 crawl-delay: 15,请求速率限制为 0.5 rps。参见 documentation/UFC.md。

Football-Data.co.uk — 历史赛果及收盘赔率(无需密钥)
分组工具说明
footballdatauk.history1每次调用获取一个联赛赛季:赛果、射门、罚牌,以及约 10 家博彩公司提供的收盘赔率;数据可追溯至 1990 年代

这是此处唯一可用于回测的数据源。其他所有足球数据提供方都告诉你发生了什么;而这个数据源会逐场告诉你市场当时认为会发生什么。获取一个已结束的赛季,将收盘赔率与赛果进行比较,就能得到一个 CLV 基准,用来衡量今天 sportsbet/pinnacle/betfair 的实时赔率。

数据以 CSV 形式发布——这是唯一使用引擎 response_format: csv 的提供方,因此模型仍会收到普通 JSON。参见 documentation/FootballDataUK.md。

F1 之外的赛车运动 — MotoGP、Formula E、NASCAR(无需密钥)
分组工具说明
motogp.racing6MotoGP/Moto2/Moto3/MotoE 自 1949 年以来的数据:赛事、包含赛道状况的赛段、排名、锦标赛
formulae.racing5Formula E 自 2014-15 赛季以来的数据:赛历、车手和车队锦标赛及每场比赛积分
nascar.racing2Cup/Xfinity/Truck:完整赛季摘要,以及包含练习赛、排位赛和比赛结果的周末数据流

加上 openf1(实时遥测数据)和 jolpicaf1(历史数据),motorsport 预设现已涵盖五项赛事。每项赛事都有其结构特点,并在对应页面中说明:MotoGP 需要遍历四层 uuid,Formula E 会封装比赛数据,但不会封装积分榜;NASCAR 的结果数组未排序,且包含名次为 0 的未发车选手,因此 results[0] 并非获胜者。参见 MotoGP.md、FormulaE.md、NASCAR.md。

Jolpica F1 — api.jolpi.ca(F1 历史数据,1950 年至今,无需密钥)
分组工具说明
jolpicaf1.reference4赛季、车手、车队、赛道
jolpicaf1.schedule1包含各赛段时间的比赛日程
jolpicaf1.results5比赛、排位赛和冲刺赛结果、单圈用时、进站记录
jolpicaf1.standings2车手和车队锦标赛

这是 Ergast 的社区后继项目,Ergast 已于 2024 年底弃用。它与 openf1 互为补充,而非功能重叠:OpenF1 提供 2023 年以来的实时遥测数据,Jolpica 则涵盖自 1950 年以来的每场比赛。“谁赢得了 1976 年日本大奖赛”和“Verstappen 跑到第几圈了”需要使用不同的数据源。响应采用 Ergast 的双层 MRData 封装,所有值均以字符串形式返回——参见 documentation/JolpicaF1.md。

国际象棋 — lichess.org + api.chess.com(无需密钥)
分组工具说明
lichess.chess6按时限分类的等级分、排行榜、用户状态、每日谜题、锦标赛
chesscom.chess7个人资料、按赛制分类的等级分、排行榜、拥有头衔的棋手、月度对局存档

两大国际象棋平台。请注意,两者的等级分不可直接比较——它们的棋手群体和计算公式不同;而且只有 Chess.com 会以 JSON 格式提供对局历史,因为 Lichess 会将导出数据作为 NDJSON 流传输。参见 Lichess.md 和 ChessCom.md。

Squiggle — squiggle.com.au(AFL 预测模型)
分组工具说明
squiggle.afl641 个独立的 AFL 预测模型:各模型的预测、置信度和分差,以及实际和预测积分榜

这不是另一个比赛结果数据源,而是对 AFL 比赛的观点市场,可与博彩公司给出的赔率自然对照。获取某一轮的预测,从博彩公司获取同一批比赛的赔率,对赔率进行去水处理,就能将 41 个模型的共识与市场进行比较。squiggle_ladder 还包含 swarms,即每个预测背后的模拟最终排名分布。这是由一位志愿者运营的服务,因此该数据源使用如实标明身份的联系 User-Agent,并采用刻意温和的速率限制——参见 documentation/Squiggle.md。

NHL — api-web.nhle.com(官方 Web API,无需密钥)
分组工具数说明
nhl.reference3赛季、按位置组划分的俱乐部阵容、球员简介/选秀/职业生涯
nhl.schedule2按周查询联盟赛程,以及俱乐部整个赛季的比赛记录
nhl.game3实时比分板、包含每位球员上场时间的比赛数据、得分摘要
nhl.stats3按分区/联盟/外卡顺序排列的排名、滑手和守门员排行榜

联盟自己的 API——nhl.com 使用的就是这个(旧的 statsapi.web.nhl.com 已失效)。 espn.* 分组已经能回答“NHL 比分是多少”;这里则提供更深入的数据。 有两项约定值得了解:赛季 ID 由连续年份组成(20242025),而 /now 路径会发生 307 重定向。参见 documentation/NHL.md。

Sleeper — api.sleeper.app(梦幻美式橄榄球,完全公开)
分组工具数说明
sleeper.reference3赛季/周次状态、用户名 → 用户 ID、全平台热门签入/弃用球员
sleeper.league8设置、阵容、经理、每周对阵、交易、季后赛对阵表、已交易选秀权
sleeper.draft3联盟选秀、选秀设置,以及包含球员姓名的所有选秀签位

这是另一个主要的梦幻体育平台,也是更容易接入的一个:Sleeper 的读取 API 无需密钥,也无需 Cookie——只需联盟 ID。它在 fantasy.* 功能方面与 espnfantasy 接轨,因此“显示我的联盟”可同时适用于两者。 这里有意不公开 15 MB 的球员目录;选秀签位中会附带球员姓名。参见 documentation/Sleeper.md。

ESPN Fantasy — 你自己的梦幻体育联盟
分组工具数说明
espnfantasy.reference6比赛目录(解析当前赛季和周次)、赛季状态、职业球队及轮空周、球员全集、计分预设、球员新闻
espnfantasy.league14设置、球队、阵容、排名、对阵、选秀板、交易、留言板、联盟历史,以及未公开的 allon 综合视图
espnfantasy.scoring5比赛数据(阵容包含实际和预测得分)、对阵得分、比分板、实时计分、位置评分
espnfantasy.players2包含持有情况和预测数据的自由球员/候补球员池;深入的球员个人统计细分

这是 ESPN 的梦幻体育平台,而非 ESPN 比分板(后者见上文的 espn.*)——每个联盟对应一个 URL,载荷由可重复使用的 view 参数决定;通过每个工具上的 game 参数覆盖全部五种运动(ffl 美式橄榄球、flb 棒球、fba 篮球、fhl 冰球、wfba WNBA)。公开联盟无需凭据;设置 ESPN_FANTASY_COOKIE 为 espn_s2=…; SWID={…},即可通过同一组工具访问你的私人联盟。梦幻体育中的 playerId 是 ESPN 运动员 ID,因此这里的阵容可以直接关联到现实世界的 espn.* 数据流。有关视图目录、x-fantasy-filter 使用指南和 ID 解码表,请参见 documentation/ESPNFantasy.md。

OpenF1 — api.openf1.org(一级方程式,无需密钥)
分组工具数说明
openf1.reference3大奖赛周末(赛事)、比赛场次(赛程数据流)、车手名单
openf1.results5比赛场次排名、发车位、车手/车队锦标赛排名、超车
openf1.timing5每圈分段及测速点计时、进站、轮胎使用时段、实时间距/间隔、赛道位置
openf1.telemetry2赛车遥测数据(速度/油门/刹车/挡位/转速/DRS)及约 3.7 Hz 的 (x,y,z) 位置
openf1.live3比赛控制消息(旗帜/安全车/事故)、车队无线电片段、天气

免费、无需认证的公开 REST 接口(auth: none)。通过 session_key / meeting_key(两者均接受字面值 latest)和 driver_number 筛选数据流;先使用 openf1_sessions / openf1_meetings 查找密钥。

Cricket Australia — cricket.com.au(无需密钥)
分组工具数说明
cricketaustralia.core7赛程(/matches 信息流)、赛事、巡回赛/系列赛、球队、球员资料(批量)、场馆查询、赛事积分榜
cricketaustralia.match3完整记分卡(各局击球/投球/出局信息)、得分走势图系列、直播视频流
cricketaustralia.content2Pulselive CMS:视频/文本/音频/播放列表内容列表 + 精选播放列表

两个无需身份验证的主机(apiv2.cricket.com.au/web + Pulselive CMS)。apiv2 端点默认携带 jsconfig=eccn:true,因此会返回文档中说明的 camelCase 格式;调用流程为 cricketaustralia_fixtures → cricketaustralia_scorecard?fixtureId= → cricketaustralia_players?playerIds=。

MLB — statsapi.mlb.com(官方 Stats API,无需密钥)
分组工具数说明
mlb.reference22体育项目/联盟/分区/赛区、球队(+ 单支球队、附属球队、历史、球衣)、阵容、校友、教练、工作人员、球员(资料、批量、搜索、赛季目录、变更信息流)、场馆、赛季(当前赛季 + 完整历史)
mlb.schedule5按日期/范围/球队查询比赛,另含季后赛(赛程、系列赛、观赛信息)和打成平局的比赛
mlb.game10比赛记分卡、局分、逐球赛况、v1.1 feed/live 实时数据流、获胜概率、背景指标、内容、球员单场数据、变更、球衣
mlb.stats9积分榜、赛季数据、单名球员数据、联盟 + 球队领先榜、球队赛季数据、比赛节奏、高/低纪录
mlb.extra15选秀(+ 新秀)、奖项(目录 + 获奖者)、上座人数、交易、自由球员、职务(裁判/现场数据员/记分员)、全垒打大赛、全明星投票
mlb.meta1mlb_meta — 用于查询所有枚举值的 /{type} 接口(位置、statTypes、gameTypes、pitchCodes,等等)

官方 MLB Stats API,MLB-StatsAPI 库对其进行了封装;此处直接读取(无需密钥)—— 全面覆盖公开接口。sportId=1 代表 MLB;使用 mlb_teams / mlb_schedule / mlb_player_search 查找 ID,然后深入查询比赛或球员。大多数工具都接受 API 的 hydrate 字符串,可在一次调用中嵌入相关对象。

Premier League — premierleague.com(无需密钥)
分组工具数说明
premierleague.core7赛事、赛季结构、奖项、联赛积分榜、当前比赛周、地理信息
premierleague.teams10球队(+ 批量)、阵容、状态(单支球队 + 所有球队)、球队数据、下一场比赛、俱乐部元数据
premierleague.matches8赛程/结果信息流 + 比赛中心:详情、事件、首发阵容、球队数据(约 200 项 Opta 指标)、裁判、解说
premierleague.players8球员目录、资料(基本/职业生涯/赛季)、批量查询、赛季 + 赛事数据、元数据
premierleague.stats2球员 + 球队数据领先榜(可按任意 Opta 指标排序)
premierleague.content8编辑内容/搜索、最新+热门新闻/视频、转播日程

为 premierleague.com 提供支持的私有 JSON API,可直接读取(无需密钥, 无需 Cookie),涉及三个主机(SDP 数据平台、编辑/转播主机 api.premierleague.com,以及 resources.premierleague.com 上的静态配置)。 底层数据来自 Opta。Premier League = 赛事 8;赛季 ID 为起始年份(2025 = 2025/26)。调用流程:pl_teams → pl_matches → 比赛 ID → pl_match/pl_match_stats;积分榜使用 pl_standings。非官方/未公开文档—— 请遵守约 5 rps 的速率限制。SDP 请求参数(_limit、_sort、 kickoff>/kickoff<)通过简洁的工具名称(limit、sort、 kickoff_after/kickoff_before)提供。

LaLiga — apim.laliga.com(随附公开密钥)
分组工具数说明
laliga.core6赛事、赛季实例(订阅)、联赛排名、轮次/比赛周
laliga.teams3赛季球队列表、单支球队、俱乐部阵容
laliga.players3全部球员的赛季统计(约 749 名,包含完整 Opta 指标)、球员资料及统计
laliga.matches2比赛动态及单场比赛详情

直接读取 laliga.com 背后的私有 JSON API(Azure APIM)。底层数据来自 Opta。随附可用的 公开 Ocp-Apim-Subscription-Key 作为 默认密钥,因此开箱即用;但密钥会轮换。如果读取开始返回 401,请通过 LALIGA_SUBSCRIPTION_KEY(环境变量或 secrets:)覆盖密钥(从 laliga.com 的 __NEXT_DATA__ 重新获取)。「订阅」指一个赛季实例(slug laliga-easports-2025 = 2025/26);详情端点以 slug 为键。可通过共享的 stats.ladder / sport.fixtures_by_date / stats.player_season 标签,与英超数据提供方搭配进行跨联赛足球比较。

意甲 — api-sdp.legaseriea.it(无需认证)
分组工具数说明
seriea.core3所有赛事、涵盖 41 个赛季的目录、单赛季详情
seriea.season6联赛排名(总排名/主场/客场)、20 支球队、所有球员及球队的 Opta 统计(分页)、全部 380 场比赛、比赛阵容

直接读取 legaseriea.it 背后的公开 SDP JSON API(无需认证)。底层数据来自 Opta。意甲赛事 ID 已内置,因此只需提供 seasonId(从 seriea_seasons 获取;seasonName 类似 2025/2026)。球员统计一次调用即可返回身份信息 和 约 279 项 Opta 指标(没有阵容端点),每页 30 条,并支持 category=General|Goalkeeping。通过共享的 stats.ladder / sport.fixtures_by_date / stats.player_season 标签,与英超及 La Liga 一同构成三大足球联赛数据源。

Kalshi — kalshi.com(预测市场,无需密钥)
分组工具数说明
kalshi.markets6市场目录及详情、订单簿、公开交易、OHLC 蜡烛图(单个及批量)
kalshi.events9事件、系列目录(按类别)、单个系列、里程碑、MVE 组合集合、实体注册表
kalshi.exchange3交易所状态、交易日程、公告

受 CFTC 监管的美国事件合约交易所。市场数据公开,无需密钥;可选设置 KALSHI_API_KEY_ID + KALSHI_PRIVATE_KEY(_PATH),即可对每个请求进行 RSA 签名,以获得 Kalshi 更高的认证速率限制(需要 pip install "sportsdata-mcp[kalshi-auth]")。交易功能不在范围内(只读数据提供方)。ID 链: kalshi_series_list(category) → kalshi_events → kalshi_markets → 按 ticker 查询订单簿/交易/蜡烛图。价格以美元计价。

Polymarket — polymarket.com(预测市场,无需密钥,受地域限制)
分组工具数说明
polymarket.gamma9市场/事件/系列/体育/标签目录及站内搜索(发现层)
polymarket.clob6订单簿、最佳价格、中间价、价差、价格历史、CLOB 目录
polymarket.data2公开交易记录及主要持有者

规模最大的加密货币预测市场。所有读取端点均可匿名访问——Polymarket SDK 使用的钱包密钥仅用于下单(不在范围内)。⚠️ 受地域限制:Polymarket 会在网络边缘断开来自受限地区的连接(已验证:澳大利亚 IP 访问所有主机均超时)——请从不受限制的地区或通过 VPN 运行。流程:polymarket_events → 某市场的 clobTokenIds → polymarket_book / polymarket_price_history。

X (Twitter) — api.x.com(需要 Bearer token)
分组工具说明
twitter.tweets7搜索近 7 天的内容、数量统计、帖子查询(批量 + 单条)、引用/转发/点赞互动
twitter.users6个人资料查询(handle/id,批量)、用户时间线、提及
twitter.trends2按位置(WOEID)查询趋势 + 项目用量/上限监控

X API v2 的读取功能——没有匿名层级,因此需要 Bearer token:优先使用环境变量 X_BEARER_TOKEN(运维人员可以为所有用户提供部署范围内的 token),然后使用配置中的 secrets: 块(每位用户使用自己的 token)。环境变量存放的是原始 token;规范会添加 Bearer 。请留意你所在层级的每月读取上限(twitter_usage);规范会将请求速率限制在约 0.5 req/s,且不会自动重试 429。写入/用户上下文功能(发帖、私信、关注)不在范围内。流程:twitter_user_by_username("AFL") → id → twitter_user_tweets;使用 X 运算符搜索("Storm" lang:en -is:retweet)。

自备密钥

有 17 个提供商需要你自行注册并获取密钥。它们不包含在 free 预设和默认分组集合中,因此除非你选择启用,否则不会产生任何变化——设置环境变量并添加相应分组。

提供商环境变量工具其他地方没有的功能
apisportsAPI_SPORTS_KEY20一个密钥覆盖十种运动——也是这里唯一提供橄榄球(rugby union)数据的服务
theoddsapiTHE_ODDS_API_KEY6来自约 40 家国际博彩公司赔率,以及用于 CLV 分析的历史快照
oddsapiioODDS_API_IO_KEY5覆盖 34 种运动的 274 家博彩公司,包括板式网球、班迪球和盖尔式足球
sportsgameoddsSPORTSGAMEODDS_API_KEY7球员特殊投注项,拥有稳定的市场 ID,可跨博彩公司和时间段关联
sportsdataioSPORTSDATAIO_*_KEY9DFS 薪资和预测数据(DraftKings/FanDuel),官方数据源均不提供
sportmonksSPORTMONKS_TOKEN8足球阵容、赛事事件和球员个人统计,且提供真正免费的层级
cfbdCFBD_API_KEY10大学美式橄榄球分析数据:SP+、Elo、高级比赛数据、历史赔率
footballdataorgFOOTBALL_DATA_ORG_KEY10这里没有官方数据源覆盖的欧洲赛事——UCL、荷甲、英冠
balldontlieBALLDONTLIE_API_KEY10NBA、NFL、MLB 和 EPL 数据采用统一格式
pandascorePANDASCORE_TOKEN8涵盖 Dota 2 以外的电子竞技——CS2、LoL、Valorant、R6
apitennisAPI_TENNIS_KEY7ATP 和 ITF 签表、交锋记录和排名(wta 仅覆盖女子巡回赛)
cricketdataCRICKETDATA_API_KEY8国际和特许赛制板球(cricketaustralia 仅覆盖澳大利亚)
highlightlyHIGHLIGHTLY_API_KEY7覆盖五种运动的精彩视频——这里唯一不局限于单一联赛的视频功能
mysportsfeedsMYSPORTSFEEDS_API_KEY5主要美国职业体育赛事提供免费的非商业层级,并提供整洁的逐场球员记录
isportsapiISPORTS_API_KEY5亚洲博彩公司提供的亚洲让球盘赔率
entitysportENTITYSPORT_TOKEN5板球逐球解说(比 cricketdata 更深入)
golfcourseapiGOLFCOURSE_API_KEY2超过 3 万个高尔夫球场,包含逐洞标准杆数、码数和击球指数
export THE_ODDS_API_KEY=...
sportsdata-mcp serve --groups "free,theoddsapi.*"
依赖这些工具前,需要了解两件事

它们的响应结构有文档说明,但未经验证。 我们没有任何一个工具的密钥, 因此各规范中的结构来自供应商自己的文档,而非实时探测。每个工具都带有明确说明, 提醒模型检查实际收到的有效载荷,而不要轻信示意结构。本目录中其他工具的结构经过 探测并修正——大约三分之一与文档所暗示的不同——因此在你使用自己的密钥运行之前, 请将这一类视为可信度较低的工具。如果你运行后发现问题,提交一个将 shapes_verified: true 设为 true 并附上修正内容的 PR,是目前最有价值的贡献。

其中四个工具会用 HTTP 200 报告失败。 apitennis 遇到无效密钥时返回 200 {"error":"1", …},cricketdata 返回 200 {"status":"failure","reason":"Invalid API Key"},isportsapi 返回 200 {"code":2,"message":"Invalid [api_key]…"},而 apisports 在当日配额用尽时会返回 200,其中 errors 对象有内容,但 response 为空。最后一种 情况最棘手:模型查询今天的赛程时会得到空列表,并报告“今天没有比赛”,因此配额耗尽与 平静的周二毫无区别。这四个规范都声明了 error_signals,引擎会报出真实错误,并指出需要设置的变量。如果你在此服务之外 调用这些 API,请检查响应正文——状态码会误导你。

Odds-API.io 使用的是 /v3/,不是 /v2/。 供应商自己的页面写的是 v2 路径;这些路径 全部会返回 404。我们在编写规范之前通过探测发现了这一点——否则五个工具都会以故障状态发布。

未纳入

我们探测了三个候选项,但拒绝纳入,以免发布无法正常工作的工具:

SportDevs — 截至 2026-08-10,sportdevs.com、api.sportdevs.com 和 rugby.sportdevs.com 都没有 DNS 记录。该服务已停止,因此无法再通过它获取其宣传的 橄榄球、排球和手球数据。(橄榄球联盟由 apisports 提供。)

Live Golf API — use.livegolfapi.com 可以解析,但包括根路径在内的所有路径都会返回 404 {"message":"Application not found"}。主机可以访问,但其背后的应用并未部署。

Fighting Tomatoes — fightingtomatoes.com/API/… 下有文档记录的 API 路径会返回该网站的 404 页面。该域名提供的是 Web 应用,而非其宣传的 API。

TheSportsDB 的免费套餐会静默返回截断的数据——EPL 积分榜只返回 20 行中的 5 行, 且没有任何标记说明数据不完整。悄悄只返回五分之一积分榜的供应商还不如没有供应商, 因此我们选择不纳入,而不是附带警告发布。

遥测

除非你主动启用,否则不会传输任何数据。 默认设置不会发送数据,没有首次运行时默认选中的提示,且只能通过环境变量读取是否同意——绝不会从配置文件读取,因为配置文件可能会被提交到代码仓库,或打包进他人的 Docker 镜像。

始终开启的是本地记录,数据归你所有:

sportsdata-mcp stats

按工具统计调用次数、错误率、错误代码和空结果次数,并优先显示最糟糕的结果。模型可以在会话中通过 sportsdata_session_stats 读取相同信息——这通常是区分缺少密钥(错误率为 100%,代码为 AUTH_REQUIRED)和上游无数据(没有错误,但 empty 值很高)的最快方法。

要分享这些数据,需要主动执行以下两个操作,单独执行任意一个都不会传输数据:

export SPORTSDATA_TELEMETRY=1
export SPORTSDATA_TELEMETRY_ENDPOINT=https://your/collector

工具参数绝不会被记录,这项保证由结构设计实现,而非依靠过滤:Telemetry.record() 没有任何可用于接收这些参数的参数。相比大多数项目,这一点在这里尤其重要——ESPN Fantasy 联盟 ID 可以识别某个联盟及其成员,而 Sleeper 用户名本身就是用户名。

sportsdata-mcp telemetry --show-payload

会输出传输内容的准确 JSON,因此这些说法可以核实,而不是只靠承诺。完整详情(包括唯一的自由文本字段的用途)请见:docs/TELEMETRY.md。

要了解采用情况,且完全不涉及任何用户——PyPI 下载量、独立克隆者数量、引荐来源——可以运行 python scripts/metrics.py,读取有关该软件包的公开数据。

跨服务商比较

每个工具都带有与服务商无关的能力标识(例如 sport.event_markets、racing.race_card)。共享同一标识的工具能回答相同问题,可直接跨服务商比较。发现流程如下:

  1. list_tools_by_capability("sport.event_markets") → 所有已启用且提供该能力的工具
  2. 使用已解析的赛事 ID,并发调用各服务商的工具
  3. 比较原始快照(不会对架构进行规范化——由模型进行协调)

完整的“比较各博彩公司 Storm 对 Cowboys 的赔率”演示,请参见 examples/comparator-prompt.md。

各服务商说明

  • Sportsbet — 匿名公共 API;无需密钥。REST 赛事以整数 eventId 为键;还提供持久化 GraphQL 网关,可通过 sportsbet_graphql_call 调用(浏览 sportsbet://graphql/operations)。
  • Entain / Ladbrokes — 持久化 GraphQL 网关;模型提供操作名称和变量(在 entain://graphql/operations 中查找)。前端 bundle 发布时哈希可能会变化;使用 sportsdata-mcp refresh-hashes entain 刷新。
  • AFL — afl.public.* 无需身份验证。afl.premium.* 会自动生成匿名 x-media-mis-token;部分高级端点对匿名调用者仍会返回 401。
  • NRL — 使用匿名 Champion Data 比赛中心 CDN(mc.championdata.com),数据与官方 nrl.com 比赛中心读取的静态 JSON 相同。无需密钥,也无需缓存清除参数。从 nrl_competitions 获取 competitionId(例如,12999 = 2026 NRL Premiership),从 nrl_fixture 获取 matchId,然后通过 nrl_match 获取每位球员的比赛统计数据;使用 nrl://stats/definitions 解码统计代码。
  • NBA — 两个数据接口,均无需密钥。cdn.nba.com 完全开放(它甚至以 text/plain 提供 JSON,客户端也能接受)。stats.nba.com 位于 Akamai 之后,任何缺少完整浏览器标头包的请求都会被丢弃;规范在 provider.default_headers 中附带了该标头包,因此开箱即用。Akamai 还会严格限制请求速率,因此规范的 defaults 区块将 NBA 限速为约每 2.5 秒 1 个请求,设置 45 秒超时,并对临时 429/5xx 错误进行指数退避重试(均可通过 providers.nba.* 覆盖)。/stats/ 系列由一个分发器处理(nba_stats_call):选择一个 operation(路径片段,例如 leaguedashplayerstats),并传入 query_params——每个操作都已包含 NBA 的完整默认参数集,因此只需覆盖需要更改的参数。大多数响应采用按列组织的格式(resultSets:[{name, headers, rowSet}]});v3 盒分数据则采用嵌套结构。
  • ESPN — 四个公共主机,无需身份验证,也无需 API 密钥:site.api.espn.com(比分、球队、排名、新闻、摘要)、sports.core.api.espn.com(规范的 $ref 链接模型——赔率、获胜概率、比赛、场馆、选秀、教练)、site.web.api.espn.com(搜索和运动员视图)以及 cdn.espn.com(实时核心数据流,需要 ?xhr=1)。几乎所有 URL 都采用 .../sports/{sport}/{league}/{resource} 格式,因此工具将 sport 和 league 作为参数,可通过参数化方式覆盖所有 ESPN 联赛——NFL、NBA、MLB、NHL、大学联赛、足球(eng.1、esp.1 等)、高尔夫、赛车、网球、MMA 等。发现数据的流程:espn_scoreboard(sport, league) → 一个 event ID → espn_game_summary 或深入调用 espn_core_call(event_*) 操作。规范将请求速率限制为约每秒 5 个请求,并对临时 429/5xx 错误进行重试(可通过 providers.espn.* 覆盖)。请注意,核心 API 路径使用 leagues/{league}(复数);核心列表响应采用延迟加载的 {count, items:[{$ref}]} 信封格式——需跟随引用获取详情。
  • PointsBet — 匿名公共 API,无需密钥。api.au.pointsbet.com 提供体育博彩服务(体育和赛马);pointsbet.com.au 通过 pointsbet_content_call 分发器提供静态 CMS/导航资源。体育数据发现流程:pointsbet_sport_competitions(sportKey) → 一个赛事 key → pointsbet_event(eventKey) 获取完整盘口。赛马数据发现流程:pointsbet_racing_meetings(startDate, endDate) → 一个 raceId → pointsbet_racing_race。许多数据流返回顶层 JSON 数组。
  • TAB (Tabcorp) — 匿名公共数据,无需密钥。api.beta.tab.com.au 位于 Akamai 之后(与 NBA 一样,规范附带浏览器标头包并将请求速率限制为每秒约 2.5 个);cmsapi.tab.com.au 通过 tab_cms_call 提供 CMS 数据流。每个端点都需要 jurisdiction(默认为 NSW)。该 API 使用 HATEOAS,且基于名称——路径中包含带空格的体育项目/赛事/比赛/场馆名称(…/AFL Football/competitions/AFL/matches/Adelaide v Geelong),HTTP 层会对其进行百分号编码;请传入原始名称。赛马数据发现流程:tab_racing_meetings(date) → raceType+venueMnemonic → tab_racing_race。体育数据发现流程:tab_sport → tab_competition → tab_match 获取完整盘口。
  • Unibet — 匿名澳大利亚数据,无需密钥,包含两个数据接口。赛马采用持久化 GraphQL(在 rsa.unibet.com.au 上通过 unibet_racing_call(graphql_persisted 分发器)调用)——赛马 ID 是类似 202606040200.T.AUS.hawkesbury.1 的 eventKey;该端点会强制执行 Apollo CSRF 验证,因此会发送 Content-Type: application/json 标头。体育使用 Kambi 报价 API(通过 unibet_kambi_call 调用 *.kambicdn.com,市场为 AU):分组树、赛事、投注选项、滚球、投注组合构建器。在 unibet://{racing,sport}/operations 中浏览操作。
  • BetR — 匿名澳大利亚数据,无需密钥。BetR 基于 BlueBet 平台运行,因此 API 为 web20-api.bluebet.com.au——一个平铺的 REST 接口,涵盖赛马(即将开赛、分组赛程表、赛马卡片、赛马信息、赔率变动)和体育(赛事类型 → 分类 → 盘口、SGM)。不使用 betr.com.au 的 Next.js _next/data/{buildHash} 数据块(每次部署时哈希都可能变化,较为脆弱;API 提供相同数据)。
  • Racing and Sports — www.racingandsports.com.au 提供赛马/赛马信息数据,无需身份验证。racingandsports_todays_racing(/todays-racing-json-v2)是经过验证的数据流,提供按国家划分的当日纯种马赛、赛马和灵缇犬赛事。该网站位于 Cloudflare 之后,Cloudflare 会将此数据流加入允许列表,但会对来自数据中心 IP 的其他路径发起 JavaScript 挑战(住宅/浏览器 IP 可正常访问);赛马信息/赛场/赛果页面为 HTML 页面,而 GetOdds 需要每场比赛对应的令牌,因此仅对 JSON 数据流建模。
  • Betfair Exchange — 匿名访问,使用公开的 _ak 查询参数作为键的开放只读 Web API。核心功能是 betfair_market_prices(ero …/bymarket)——交易所的 back/lay 赔率,是最精准的参考赔率。通过遍历 betfair_navigation(scan …/bynode,例如 EVENT_TYPE:7 = 赛马)并深入 MARKET 节点来发现市场 ID;实时比分/详情来自 ips 实时服务。string_csv ID 参数接受列表。(apieds 赛马小组件受 Cloudflare 阻挡,无法从数据中心 IP 访问;appsync GraphQL 需要会话,因此不在范围内——赛马数据通过导航→bymarket 获取。)
  • Pinnacle — 匿名访问,无需密钥。使用 Arcadia“guest”API(guest.api.arcadia.pinnacle.com)——Web 体育博彩网站读取的开放数据流。仅提供体育(精准赔率盘口,不含赛马);赔率为美式赔率。调用流程:pinnacle_sports → pinnacle_sport_matchups(sportId) → pinnacle_matchup_markets(matchupId)。此数据提供方会发送 Pinnacle 公开的 Web 客户端 X-API-Key,从而解锁完整的按体育项目和联赛分类的对阵列表,以及串关盘口。
  • FanDuel (US) — 匿名美国数据,无需密钥,一个数据提供方下有两个数据接口。赛马是首个采用完整查询 GraphQL 的数据提供方:fanduel_racing_call 会发送原始查询文本(graphql_query 分发器类型,与持久化哈希 graphql_persisted 并列),并通过每个操作的 default_variables 预置样板变量(brand/product/device/profile)——大多数调用无需传入变量,只需覆盖变化的部分({results: 12}、{trackCode, raceNumber})。体育博彩使用 REST(fanduel_sb_call),以静态公开的 _ak Web 密钥为键,区域为 NJ。两个接口需要不同的 Origin 标头,因此体育博彩分发器会在赛马来源的提供方默认值基础上覆盖 Origin 和 x-sportsbook-region。在 fanduel://{racing,sportsbook}/operations 中浏览操作。(美国数据——可通过能力标签与其他美国数据源组合使用。)

CLI 参考

命令用途
serve启动 MCP stdio 服务(未指定子命令时的默认命令)
list-groups打印所有分组及其工具数量和说明
lint根据架构和能力目录验证规范(失败时返回非零退出码)
coverage查看你的所在地可用的内容:可访问的提供方、所在地区屏蔽的内容,以及需要密钥的内容
doctor探测各提供方的可访问性、身份验证和 REST 契约(失败时返回非零退出码)
refresh-hashes <provider>从实时前端捆绑文件刷新持久化查询哈希(使用 --dry-run 预览)
version打印版本信息

-v / --verbose 可启用 DEBUG 日志记录(并取消对 httpx/httpcore 的静默)。

参与贡献

完整指南请参阅 documentation/ADDING_A_PROVIDER.md,其中分别提供了添加博彩公司与体育网站/数据 API的操作手册。简而言之,在常见情况下,添加提供方只需修改规范:

  1. 编写 src/sportsdata_mcp/specs/<provider>.yaml(复制现有规范)。
  2. 为每个工具添加 specs/_capabilities.yaml 中的能力标识;如果没有合适的标识,就在那里新增一个(两个提供方共用一个标识后即可进行比较)。
  3. 运行 sportsdata-mcp lint——必须通过。
  4. 运行 sportsdata-mcp doctor(启用新分组)——对其进行实时探测。
  5. 运行 pytest -m "not live"——离线测试套件;去掉标记筛选条件即可运行实时测试。
  6. 在 tests/contract/test_api_contracts.py 中添加一行,确保每次 PR 都实时验证新提供方文档中描述的响应结构(见下文)。
pip install -e ".[dev]"
pytest -m "not live"      # offline suite (the CI gate)
pytest -m contract        # live response-contract checks (see below)
ruff check .
CI

每次推送/PR 都会运行三个作业(.github/workflows/ci.yml):

  • test — 运行 ruff、sportsdata-mcp lint 和离线测试套件(pytest -m "not live"),覆盖 Python 3.11–3.13。这是确定性门禁。
  • contract — 运行 pytest -m contract:实时响应契约检查会请求各个上游 API,并断言其返回的结构仍符合文档描述(顶层键,以及列表项中有文档说明的键)。此检查经过专门设计,具有较强容错性——遇到我们无法控制的情况时会跳过(网络错误、5xx、401/403/429、地理封锁、缺少 DATAGOLF_KEY 或数据源为空);只有出现实际结构回归或规范错误(路径/参数错误 → 4xx)时才会失败。屏蔽 GitHub 运行器所在地区的博彩公司 API 会在运行器上跳过。
  • package — 构建 wheel,并通过全新安装验证 CLI 能加载打包后的规范。

支持本项目

sportsdata-mcp 免费、采用 MIT 许可且没有付费层级——所有提供方和工具都已包含在内。要让 62 份提供方规范持续适配不断变化的 API,需要持续投入。如果本项目为你节省了时间,可以通过 ko-fi.com/danieltomaro 赞助。

完全自愿,项目没有任何内容设有赞助门槛。为仓库点星、提交优质错误报告或添加提供方规范,都同样有帮助。

许可证

MIT。 版权所有 (c) 2026 Daniel Tomaro。可免费使用、复制、修改和分发,但须保留版权声明和许可声明——详见 LICENSE。

mcp-name: io.github.DanielTomaro13/sportsdata-mcp

评论

支持 Markdown

第一次接触 MCP?

从协议是什么,到在客户端里装上第一个服务,这几条回答覆盖了大多数入门问题。

一个开放协议,规定了 AI 应用如何以统一方式连接外部工具与数据源。客户端负责与模型对话,MCP 服务负责提供工具、资源和提示模板,两者通过标准消息通信,同一个服务可以被不同客户端复用。