关于 Sportsdata Mcp
sportsdata-mcp 是一个开源的体育数据 MCP 服务,提供多家博彩公司、官方联赛统计及预测市场的数据工具。其特点是可以同时比较不同博彩公司对同一市场的赔率,适合关注澳大利亚市场或需要全球体育数据的用户。
主要功能
- 01汇总多家博彩公司及交易所的实时赔率
- 02覆盖澳新博彩公司与赛马数据
- 03官方联赛与统计数据源
- 04按需启用工具组
- 05提供下注工具,需用户自行授权
适用场景
- 01比较同一场比赛在不同博彩公司的赔率差异
- 02查询 MLB、NBA 等联赛的赔率与统计数据
MCP 相关
该项目作为 MCP 服务,将体育数据接口封装为工具,供 MCP 客户端按能力标签查找和调用。
配置
本地服务的配置在各客户端中通用,复制后粘贴到客户端的 MCP 配置文件即可。
工具
200收录的工具列表 · 更新于 2 周前
此工具无需参数。
详细介绍
sportsdata-mcp
问问 AI 哪家博彩公司开出的赔率更高,就能得到真实答案。
免费且开源(MIT)。在 Claude Desktop、Cursor 或任何 MCP 客户端中使用,涵盖 65 家数据提供商的约 856 个工具。运行 uvx sportsdata-mcp serve 即可。
你: Parramatta 对阵 Penrith,哪家博彩公司给出的赔率最高?差距有多大?
Claude 同时查询五家博彩公司,给出以下结果:
| 博彩公司 | Eels | Panthers |
|---|---|---|
| Betfair | 1.18 | 6.20 |
| BetR | 1.17 | 5.00 |
| PointsBet | 1.17 | 4.80 |
| Pinnacle | 1.17 | 4.78 |
| Sportsbet | 1.19 | 4.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 分发器模式的完整流程。
配置
配置按以下顺序解析(命中第一项后即停止):
--config <path>标志$SPORTSDATA_MCP_CONFIG./sportsdata-mcp.yaml~/.config/sportsdata-mcp/config.yaml- 内置默认值
# 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.core | 22 | 赛事、赛季、轮次、赛程、积分榜、比赛数据 |
afl.public.broadcasting | 9 | 转播地区、指南、提供商 |
afl.public.content | 8 | 新闻/文章、视频、照片 |
afl.premium.cfs | 1 | CFS 高级操作——需要匿名的 x-media-mis-token |
afl.premium.statspro | 1 | StatsPro 操作——需要 x-media-mis-token |
afl.premium.keyserver | 1 | HLS 视频 URL 签名 |
Sportsbet — sportsbet.com.au
| 分组 | 工具数 | 说明 |
|---|---|---|
sportsbet.racing | 15 | 赛马赛事、赛卡、赛果、期货、SRM |
sportsbet.sports | 14 | 体育赛事、盘口、赔率、SGM |
sportsbet.cross | 12 | 实时状态、解说、积分榜、促销、视频 |
sportsbet.results | 2 | 按日期查询已出结果的赛事 |
sportsbet.graphql | 1 | 持久化 GraphQL 网关(apigw/sportsbook/graph) |
Entain / Ladbrokes — ladbrokes.com.au
| 分组 | 工具数 | 说明 |
|---|---|---|
entain.rest | 13 | 导航快捷链接和 REST 接口 |
entain.graphql | 1 | 127 个持久化 GraphQL 操作(gql/router) |
entain.cdn | 1 | Contentful CMS 条目(促销、重大赛事导航) |
PointsBet — pointsbet.com.au
| 分组 | 工具数 | 说明 |
|---|---|---|
pointsbet.sports | 10 | 体育目录、赛事/比赛 Feed、完整赛事盘口、滚球、搜索 |
pointsbet.racing | 11 | 赛会、赛卡、赛果、期货、SRM、小贴士、赛马资料 |
pointsbet.content | 3 | 促销、促销代码启动页,以及针对静态 CMS/导航资源的 pointsbet_content_call |
TAB — tab.com.au
| 分组 | 工具数 | 说明 |
|---|---|---|
tab.racing | 9 | 日期、赛会、赛卡(固定赔率 + 彩池投注)、赛马资料、即将开赛、累积奖池、期货 |
tab.sports | 9 | 体育/赛事树、完整比赛盘口 + SGM、重点比赛盘口、即将开赛、赛果、多串关构建器 |
tab.discovery | 4 | 精选/实时推荐,以及针对 CMS 内容 Feed 的 tab_cms_call |
Unibet — unibet.com.au
| 分组 | 工具 | 备注 |
|---|---|---|
unibet.racing | 1 | unibet_racing_call — 持久化 GraphQL:赛事日、赛卡、赛马资料、期货、特别投注 |
unibet.sport | 3 | 通过 Kambi 报价 API 调用 unibet_kambi_call(分组、赛事、投注选项、滚球、投注构建器)+ 实时统计 + 赔率阶梯 |
BetR — betr.com.au(BlueBet 平台)
| 分组 | 工具 | 备注 |
|---|---|---|
betr.racing | 8 | 即将开赛的赛事、今日/分组赛卡、赛卡、赛马资料、赔率波动、热门选项 |
betr.sport | 7 | 赛事类型、赛事类别、赛事市场、比赛详情、热门 SGM |
betr.content | 4 | 促销 + 精选赛马 + 热门市场链接 |
Pinnacle — pinnacle.com(精准赔率)
| 分组 | 工具 | 备注 |
|---|---|---|
pinnacle.sports | 13 | 体育项目/联赛、完整 + 精选 + 实时 + 按联赛划分的对阵、轮播、对阵详情、单场 + 串关市场(美式赔率) |
pinnacle.reference | 4 | 枚举、市场标签词典、让分投注定义、API 状态 |
Betfair Exchange — betfair.com.au(交易所赔率)
| 分组 | 工具 | 备注 |
|---|---|---|
betfair.exchange | 3 | bymarket + byevent 的买入/卖出赔率数据流(最精准的赔率)+ 现金退出可用性 |
betfair.navigation | 1 | bynode 目录图(体育项目 → 赛事日 → 赛事 → 市场) |
betfair.inplay | 5 | 实时比分、赛事详情、时间线(单项 + 批量)、比分 + 转播 |
Dabble — dabble.com.au(iOS 应用后端)
| 分组 | 工具 | 备注 |
|---|---|---|
dabble.sport | 5 | 发现任意赛事(活跃列表/名称查找/体育项目),然后获取其赛程(内嵌市场 + 十进制赔率)+ 每场赛事的完整投注簿(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.fantasy | 6 | 在全部 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.basketball | 16 | 赛季、球队、排名榜、赛程(比分)、单场比赛的技术统计和比赛逐球记录、球员及阵容、球员赛季统计及比赛日志技术统计、球队统计、赛季统计数据领跑者(可排序)和新闻 |
联盟自有站点数据 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.tennis | 8 | WTA 官方 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.racing | 3 | 今日赛马日程(所有赛种,已验证)+ 体育赛事列表 + 单场赛马赔率(需要令牌) |
PuntersEdge — puntersedge.online(澳大利亚 + 新西兰赔率聚合器,演示版无需密钥)
| 分组 | 工具数 | 说明 |
|---|---|---|
puntersedge.demo | 3 | 无需密钥——即将开赛的赛马、最佳赔率 + 套利标记、单个体育项目中一家博彩公司提供的赔率 |
puntersedge.racing | 7 | 每场赛马中各家博彩公司提供的赔率、每匹赛马的最佳胜出/位置/彩池赔率、赛卡、赛果、赔率变动、赛场、收盘线档案 |
puntersedge.sport | 3 | 体育项目目录、按 sport_key 查询各家博彩公司提供的赔率、每个选项的最佳赔率 + 套利标记 |
这是澳大利亚博彩公司面板的聚合器,而非博彩公司本身;与大多数澳大利亚博彩公司不同,它没有地域限制,并提供永久收盘线档案,适用于 CLV 和回测工作。演示工具无需密钥;其余工具读取 PUNTERSEDGE_API_KEY。参见 documentation/PuntersEdge.md。
Data Golf — datagolf.com(需要密钥)
| 分组 | 工具数 | 说明 |
|---|---|---|
datagolf.general | 3 | 球员名单、巡回赛日程、当前赛事参赛名单 |
datagolf.predictions | 11 | DG 排名、赛前(含存档)及比赛进行中的模型概率、技术水平与攻球技术评级、球员/实时 SG 分解数据、实时杆数得失、实时球洞统计、DFS 投影 |
datagolf.betting | 3 | 全胜、对决及所有配对赔率,涵盖约 13 家博彩公司(含模型赔率) |
datagolf.historical | 9 | 存档原始轮次数据、赛事级结果(名次/奖金/积分)、历史博彩公司赔率(全胜 + 对决)及 DFS 赛果 |
需要在 DATAGOLF_KEY 环境变量中设置 Data Golf API 密钥(个人订阅密钥——通过 static_query 认证方案提供,不会存储在代码库中)。
FanDuel — fanduel.com(美国)
| 分组 | 工具数 | 说明 |
|---|---|---|
fanduel.racing | 4 | fanduel_racing_call(完整查询 GraphQL:精选/今日赛马及赔率、单场赛马赛卡、赛道、彩池、专家推荐)+ 消息/快速链接/促销活动 |
fanduel.sportsbook | 2 | fanduel_sb_call(REST:赛事页面及盘口、比赛进行中、促销活动、通过 _ak 密钥获取的配置)+ 实时比分 |
NRL — mc.championdata.com
| Group | Tools | Notes |
|---|---|---|
nrl.public.core | 4 | Champion Data 比赛中心:赛事、赛程、每场比赛的球员统计数据、应用设置 |
此外还有 nrl://stats/definitions 资源(包含所有 NRL 统计代码的字典)。
NBA — cdn.nba.com + stats.nba.com
| Group | Tools | Notes |
|---|---|---|
nba.public.cdn | 5 | 开放 CDN JSON:今日记分板、完整赛程、实时技术统计表 + 比赛过程、赔率 |
nba.stats | 2 | nba_daily_lineups + nba_stats_call,用于分发 /stats/ API 中的 138 个端点 |
nba_stats_call 提供对整个 stats.nba.com /stats/ 分析接口的访问(球员/球队数据面板、v2 + v3 技术统计表、投篮图、比赛过程、领跑者、排名、选秀、拼抢、追踪等)。可在 nba://stats/operations 资源中查看每个操作、必需参数及默认值。
ESPN — espn.com JSON 源
| Group | Tools | Notes |
|---|---|---|
espn.scores | 5 | 网站 API 便捷端点:记分板、球队、排名、比赛摘要、新闻 |
espn.site | 1 | espn_site_call — 球队详情、阵容、赛程、伤病、阵容深度图、交易、历史记录、运动员新闻、分组、排名(10 个操作) |
espn.core | 1 | espn_core_call — 规范的 $ref 链接模型:赛事/比赛、赔率、胜率、比赛过程、场馆、选秀、教练、日历、交易(37 个操作) |
espn.web | 1 | espn_web_call — 全站搜索 + common/v3 运动员视图(7 个操作) |
espn.cdn | 1 | espn_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 电竞,无需密钥)
| Group | Tools | Notes |
|---|---|---|
opendota.reference | 4 | 英雄、按技能段划分的英雄元数据、职业战队、联赛 |
opendota.matches | 3 | 职业比赛、完整比赛详情、公开天梯比赛 |
opendota.players | 4 | 个人资料 + 排名、比赛记录、胜负、英雄池 |
本目录中的首个电竞数据源。双方称为 Radiant/Dire,而非主队/客队;英雄统计则按技能段提供成对的选用/获胜次数,而非比率——两者均有文档说明,也均有测试固定验证。不会公开 4.4 MB 的职业选手列表。详见 documentation/OpenDota.md。
OpenLigaDB — api.openligadb.de(德国足球,无需密钥)
| Group | Tools | Notes |
|---|---|---|
openligadb.football | 8 | 德甲 1/2/3 级 + DFB-Pokal:赛程、结果、积分榜、比赛日 |
补上五大联赛中的空缺——此前已有英超、西甲和意甲,但没有德甲。数据由社区维护,因此较少见的赛事信息可能会有延迟。请注意,比分位于 matchResults 中,其中包含半场和全场两项记录。详见 documentation/OpenLigaDB.md。
EuroLeague — api-live.euroleague.net(篮球,无需密钥)
| Group | Tools | Notes |
|---|---|---|
euroleague.basketball | 7 | EuroLeague + EuroCup:赛季、俱乐部、轮次、比赛、技术统计表 |
与 NBA 和 NBL 一同完善篮球数据。一个字母用于选择赛事(E/U);赛季代码为 E2024;主场/客场分别称为 local/road;技术统计表使用 PIR,而非 NBA 风格的效率值。详见 documentation/EuroLeague.md。
NCAA — ncaa-api.henrygd.me(美国大学体育,无需密钥)
| Group | Tools | Notes |
|---|---|---|
ncaa.college | 3 | 涵盖所有大学体育项目的记分板、联盟排名、AP/教练投票排名 |
ESPN 已提供大学赛事比分;此处则以标准化格式补充 NCAA 自有的投票排名和联盟排名。这是 NCAA.com 的第三方镜像,并非官方数据源。详见 documentation/NCAA.md。
Fantasy Premier League — fantasy.premierleague.com(官方,无需密钥)
| 分组 | 工具 | 说明 |
|---|---|---|
fpl.players | 2 | 所有球员的价格、状态、持有率、预期进球/预期助攻数据;单名球员提供完整详细信息 |
fpl.reference | 3 | 俱乐部实力评级、全部 38 个比赛周及其截止时间、计分规则 |
fpl.fixtures | 5 | 赛程及 1-5 难度评级、球员实时得分、梦幻阵容、定位球主罚者 |
fpl.managers | 6 | 任意经理的阵容、历史记录和选人;经典联赛和 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.events | 3 | 包含分段比赛时间和场馆信息的赛事、完整对阵卡,以及 UFC 1 以来的比赛记录 |
ufc.athletes | 2 | 选手搜索和附带统计数据的个人资料 |
ufc.stats | 2 | FightMetric 职业生涯统计表和各级别排名 |
ufc.records | 2 | 单回合纪录,以及 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.history | 1 | 每次调用获取一个联赛赛季:赛果、射门、罚牌,以及约 10 家博彩公司提供的收盘赔率;数据可追溯至 1990 年代 |
这是此处唯一可用于回测的数据源。其他所有足球数据提供方都告诉你发生了什么;而这个数据源会逐场告诉你市场当时认为会发生什么。获取一个已结束的赛季,将收盘赔率与赛果进行比较,就能得到一个 CLV 基准,用来衡量今天 sportsbet/pinnacle/betfair 的实时赔率。
数据以 CSV 形式发布——这是唯一使用引擎 response_format: csv 的提供方,因此模型仍会收到普通 JSON。参见
documentation/FootballDataUK.md。
F1 之外的赛车运动 — MotoGP、Formula E、NASCAR(无需密钥)
| 分组 | 工具 | 说明 |
|---|---|---|
motogp.racing | 6 | MotoGP/Moto2/Moto3/MotoE 自 1949 年以来的数据:赛事、包含赛道状况的赛段、排名、锦标赛 |
formulae.racing | 5 | Formula E 自 2014-15 赛季以来的数据:赛历、车手和车队锦标赛及每场比赛积分 |
nascar.racing | 2 | Cup/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.reference | 4 | 赛季、车手、车队、赛道 |
jolpicaf1.schedule | 1 | 包含各赛段时间的比赛日程 |
jolpicaf1.results | 5 | 比赛、排位赛和冲刺赛结果、单圈用时、进站记录 |
jolpicaf1.standings | 2 | 车手和车队锦标赛 |
这是 Ergast 的社区后继项目,Ergast 已于 2024 年底弃用。它与 openf1 互为补充,而非功能重叠:OpenF1 提供 2023 年以来的实时遥测数据,Jolpica 则涵盖自 1950 年以来的每场比赛。“谁赢得了 1976 年日本大奖赛”和“Verstappen 跑到第几圈了”需要使用不同的数据源。响应采用 Ergast 的双层 MRData 封装,所有值均以字符串形式返回——参见 documentation/JolpicaF1.md。
国际象棋 — lichess.org + api.chess.com(无需密钥)
| 分组 | 工具 | 说明 |
|---|---|---|
lichess.chess | 6 | 按时限分类的等级分、排行榜、用户状态、每日谜题、锦标赛 |
chesscom.chess | 7 | 个人资料、按赛制分类的等级分、排行榜、拥有头衔的棋手、月度对局存档 |
两大国际象棋平台。请注意,两者的等级分不可直接比较——它们的棋手群体和计算公式不同;而且只有 Chess.com 会以 JSON 格式提供对局历史,因为 Lichess 会将导出数据作为 NDJSON 流传输。参见 Lichess.md 和 ChessCom.md。
Squiggle — squiggle.com.au(AFL 预测模型)
| 分组 | 工具 | 说明 |
|---|---|---|
squiggle.afl | 6 | 41 个独立的 AFL 预测模型:各模型的预测、置信度和分差,以及实际和预测积分榜 |
这不是另一个比赛结果数据源,而是对 AFL 比赛的观点市场,可与博彩公司给出的赔率自然对照。获取某一轮的预测,从博彩公司获取同一批比赛的赔率,对赔率进行去水处理,就能将 41 个模型的共识与市场进行比较。squiggle_ladder 还包含 swarms,即每个预测背后的模拟最终排名分布。这是由一位志愿者运营的服务,因此该数据源使用如实标明身份的联系 User-Agent,并采用刻意温和的速率限制——参见 documentation/Squiggle.md。
NHL — api-web.nhle.com(官方 Web API,无需密钥)
| 分组 | 工具数 | 说明 |
|---|---|---|
nhl.reference | 3 | 赛季、按位置组划分的俱乐部阵容、球员简介/选秀/职业生涯 |
nhl.schedule | 2 | 按周查询联盟赛程,以及俱乐部整个赛季的比赛记录 |
nhl.game | 3 | 实时比分板、包含每位球员上场时间的比赛数据、得分摘要 |
nhl.stats | 3 | 按分区/联盟/外卡顺序排列的排名、滑手和守门员排行榜 |
联盟自己的 API——nhl.com 使用的就是这个(旧的 statsapi.web.nhl.com 已失效)。
espn.* 分组已经能回答“NHL 比分是多少”;这里则提供更深入的数据。
有两项约定值得了解:赛季 ID 由连续年份组成(20242025),而
/now 路径会发生 307 重定向。参见 documentation/NHL.md。
Sleeper — api.sleeper.app(梦幻美式橄榄球,完全公开)
| 分组 | 工具数 | 说明 |
|---|---|---|
sleeper.reference | 3 | 赛季/周次状态、用户名 → 用户 ID、全平台热门签入/弃用球员 |
sleeper.league | 8 | 设置、阵容、经理、每周对阵、交易、季后赛对阵表、已交易选秀权 |
sleeper.draft | 3 | 联盟选秀、选秀设置,以及包含球员姓名的所有选秀签位 |
这是另一个主要的梦幻体育平台,也是更容易接入的一个:Sleeper 的读取
API 无需密钥,也无需 Cookie——只需联盟 ID。它在
fantasy.* 功能方面与 espnfantasy 接轨,因此“显示我的联盟”可同时适用于两者。
这里有意不公开 15 MB 的球员目录;选秀签位中会附带球员姓名。参见
documentation/Sleeper.md。
ESPN Fantasy — 你自己的梦幻体育联盟
| 分组 | 工具数 | 说明 |
|---|---|---|
espnfantasy.reference | 6 | 比赛目录(解析当前赛季和周次)、赛季状态、职业球队及轮空周、球员全集、计分预设、球员新闻 |
espnfantasy.league | 14 | 设置、球队、阵容、排名、对阵、选秀板、交易、留言板、联盟历史,以及未公开的 allon 综合视图 |
espnfantasy.scoring | 5 | 比赛数据(阵容包含实际和预测得分)、对阵得分、比分板、实时计分、位置评分 |
espnfantasy.players | 2 | 包含持有情况和预测数据的自由球员/候补球员池;深入的球员个人统计细分 |
这是 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.reference | 3 | 大奖赛周末(赛事)、比赛场次(赛程数据流)、车手名单 |
openf1.results | 5 | 比赛场次排名、发车位、车手/车队锦标赛排名、超车 |
openf1.timing | 5 | 每圈分段及测速点计时、进站、轮胎使用时段、实时间距/间隔、赛道位置 |
openf1.telemetry | 2 | 赛车遥测数据(速度/油门/刹车/挡位/转速/DRS)及约 3.7 Hz 的 (x,y,z) 位置 |
openf1.live | 3 | 比赛控制消息(旗帜/安全车/事故)、车队无线电片段、天气 |
免费、无需认证的公开 REST 接口(auth: none)。通过 session_key /
meeting_key(两者均接受字面值 latest)和 driver_number 筛选数据流;先使用
openf1_sessions / openf1_meetings 查找密钥。
Cricket Australia — cricket.com.au(无需密钥)
| 分组 | 工具数 | 说明 |
|---|---|---|
cricketaustralia.core | 7 | 赛程(/matches 信息流)、赛事、巡回赛/系列赛、球队、球员资料(批量)、场馆查询、赛事积分榜 |
cricketaustralia.match | 3 | 完整记分卡(各局击球/投球/出局信息)、得分走势图系列、直播视频流 |
cricketaustralia.content | 2 | Pulselive 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.reference | 22 | 体育项目/联盟/分区/赛区、球队(+ 单支球队、附属球队、历史、球衣)、阵容、校友、教练、工作人员、球员(资料、批量、搜索、赛季目录、变更信息流)、场馆、赛季(当前赛季 + 完整历史) |
mlb.schedule | 5 | 按日期/范围/球队查询比赛,另含季后赛(赛程、系列赛、观赛信息)和打成平局的比赛 |
mlb.game | 10 | 比赛记分卡、局分、逐球赛况、v1.1 feed/live 实时数据流、获胜概率、背景指标、内容、球员单场数据、变更、球衣 |
mlb.stats | 9 | 积分榜、赛季数据、单名球员数据、联盟 + 球队领先榜、球队赛季数据、比赛节奏、高/低纪录 |
mlb.extra | 15 | 选秀(+ 新秀)、奖项(目录 + 获奖者)、上座人数、交易、自由球员、职务(裁判/现场数据员/记分员)、全垒打大赛、全明星投票 |
mlb.meta | 1 | mlb_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.core | 7 | 赛事、赛季结构、奖项、联赛积分榜、当前比赛周、地理信息 |
premierleague.teams | 10 | 球队(+ 批量)、阵容、状态(单支球队 + 所有球队)、球队数据、下一场比赛、俱乐部元数据 |
premierleague.matches | 8 | 赛程/结果信息流 + 比赛中心:详情、事件、首发阵容、球队数据(约 200 项 Opta 指标)、裁判、解说 |
premierleague.players | 8 | 球员目录、资料(基本/职业生涯/赛季)、批量查询、赛季 + 赛事数据、元数据 |
premierleague.stats | 2 | 球员 + 球队数据领先榜(可按任意 Opta 指标排序) |
premierleague.content | 8 | 编辑内容/搜索、最新+热门新闻/视频、转播日程 |
为 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.core | 6 | 赛事、赛季实例(订阅)、联赛排名、轮次/比赛周 |
laliga.teams | 3 | 赛季球队列表、单支球队、俱乐部阵容 |
laliga.players | 3 | 全部球员的赛季统计(约 749 名,包含完整 Opta 指标)、球员资料及统计 |
laliga.matches | 2 | 比赛动态及单场比赛详情 |
直接读取 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.core | 3 | 所有赛事、涵盖 41 个赛季的目录、单赛季详情 |
seriea.season | 6 | 联赛排名(总排名/主场/客场)、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.markets | 6 | 市场目录及详情、订单簿、公开交易、OHLC 蜡烛图(单个及批量) |
kalshi.events | 9 | 事件、系列目录(按类别)、单个系列、里程碑、MVE 组合集合、实体注册表 |
kalshi.exchange | 3 | 交易所状态、交易日程、公告 |
受 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.gamma | 9 | 市场/事件/系列/体育/标签目录及站内搜索(发现层) |
polymarket.clob | 6 | 订单簿、最佳价格、中间价、价差、价格历史、CLOB 目录 |
polymarket.data | 2 | 公开交易记录及主要持有者 |
规模最大的加密货币预测市场。所有读取端点均可匿名访问——Polymarket SDK 使用的钱包密钥仅用于下单(不在范围内)。⚠️ 受地域限制:Polymarket 会在网络边缘断开来自受限地区的连接(已验证:澳大利亚 IP 访问所有主机均超时)——请从不受限制的地区或通过 VPN 运行。流程:polymarket_events → 某市场的 clobTokenIds → polymarket_book / polymarket_price_history。
X (Twitter) — api.x.com(需要 Bearer token)
| 分组 | 工具 | 说明 |
|---|---|---|
twitter.tweets | 7 | 搜索近 7 天的内容、数量统计、帖子查询(批量 + 单条)、引用/转发/点赞互动 |
twitter.users | 6 | 个人资料查询(handle/id,批量)、用户时间线、提及 |
twitter.trends | 2 | 按位置(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 预设和默认分组集合中,因此除非你选择启用,否则不会产生任何变化——设置环境变量并添加相应分组。
| 提供商 | 环境变量 | 工具 | 其他地方没有的功能 |
|---|---|---|---|
apisports | API_SPORTS_KEY | 20 | 一个密钥覆盖十种运动——也是这里唯一提供橄榄球(rugby union)数据的服务 |
theoddsapi | THE_ODDS_API_KEY | 6 | 来自约 40 家国际博彩公司赔率,以及用于 CLV 分析的历史快照 |
oddsapiio | ODDS_API_IO_KEY | 5 | 覆盖 34 种运动的 274 家博彩公司,包括板式网球、班迪球和盖尔式足球 |
sportsgameodds | SPORTSGAMEODDS_API_KEY | 7 | 球员特殊投注项,拥有稳定的市场 ID,可跨博彩公司和时间段关联 |
sportsdataio | SPORTSDATAIO_*_KEY | 9 | DFS 薪资和预测数据(DraftKings/FanDuel),官方数据源均不提供 |
sportmonks | SPORTMONKS_TOKEN | 8 | 足球阵容、赛事事件和球员个人统计,且提供真正免费的层级 |
cfbd | CFBD_API_KEY | 10 | 大学美式橄榄球分析数据:SP+、Elo、高级比赛数据、历史赔率 |
footballdataorg | FOOTBALL_DATA_ORG_KEY | 10 | 这里没有官方数据源覆盖的欧洲赛事——UCL、荷甲、英冠 |
balldontlie | BALLDONTLIE_API_KEY | 10 | NBA、NFL、MLB 和 EPL 数据采用统一格式 |
pandascore | PANDASCORE_TOKEN | 8 | 涵盖 Dota 2 以外的电子竞技——CS2、LoL、Valorant、R6 |
apitennis | API_TENNIS_KEY | 7 | ATP 和 ITF 签表、交锋记录和排名(wta 仅覆盖女子巡回赛) |
cricketdata | CRICKETDATA_API_KEY | 8 | 国际和特许赛制板球(cricketaustralia 仅覆盖澳大利亚) |
highlightly | HIGHLIGHTLY_API_KEY | 7 | 覆盖五种运动的精彩视频——这里唯一不局限于单一联赛的视频功能 |
mysportsfeeds | MYSPORTSFEEDS_API_KEY | 5 | 主要美国职业体育赛事提供免费的非商业层级,并提供整洁的逐场球员记录 |
isportsapi | ISPORTS_API_KEY | 5 | 亚洲博彩公司提供的亚洲让球盘赔率 |
entitysport | ENTITYSPORT_TOKEN | 5 | 板球逐球解说(比 cricketdata 更深入) |
golfcourseapi | GOLFCOURSE_API_KEY | 2 | 超过 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)。共享同一标识的工具能回答相同问题,可直接跨服务商比较。发现流程如下:
list_tools_by_capability("sport.event_markets")→ 所有已启用且提供该能力的工具- 使用已解析的赛事 ID,并发调用各服务商的工具
- 比较原始快照(不会对架构进行规范化——由模型进行协调)
完整的“比较各博彩公司 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)→ 一个eventID →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_csvID 参数接受列表。(apieds赛马小组件受 Cloudflare 阻挡,无法从数据中心 IP 访问;appsyncGraphQL 需要会话,因此不在范围内——赛马数据通过导航→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),以静态公开的_akWeb 密钥为键,区域为 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的操作手册。简而言之,在常见情况下,添加提供方只需修改规范:
- 编写
src/sportsdata_mcp/specs/<provider>.yaml(复制现有规范)。 - 为每个工具添加
specs/_capabilities.yaml中的能力标识;如果没有合适的标识,就在那里新增一个(两个提供方共用一个标识后即可进行比较)。 - 运行
sportsdata-mcp lint——必须通过。 - 运行
sportsdata-mcp doctor(启用新分组)——对其进行实时探测。 - 运行
pytest -m "not live"——离线测试套件;去掉标记筛选条件即可运行实时测试。 - 在
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
评论
一个开放协议,规定了 AI 应用如何以统一方式连接外部工具与数据源。客户端负责与模型对话,MCP 服务负责提供工具、资源和提示模板,两者通过标准消息通信,同一个服务可以被不同客户端复用。