关于 espn
为 AI Agent 提供 ESPN 实时及历史体育数据的 MCP 服务,涵盖比分、赔率、球员统计和预测。它将游戏、球队和新闻划分为独立领域,可通过服务配置选择。
主要功能
- 01实时与历史比分及赛程
- 02赔率、胜率和比赛预测
- 03球队、阵容和球员统计
- 04排名、榜单和交易记录
- 05可选的比赛、球队和新闻配置
适用场景
- 01跟踪实时比赛局势和胜率
- 02比较赔率与对阵预测
- 03查看球员简介、统计和比赛记录
- 04查询赛程、排名和联盟榜单
MCP 相关
通过 MCP 工具和资源提供 ESPN 公共体育数据。支持 stdio 与 Streamable HTTP,并可按领域选择服务配置。
配置
本地服务的配置在各客户端中通用,复制后粘贴到客户端的 MCP 配置文件即可。
uvx mcp-server-espnESPN_BASE_URLOptional REST base URL overrideESPN_TIMEOUT_SECONDSHTTP request timeout in secondsESPN_MAX_RETRIESMaximum retry attempts on HTTP 429 / 5xxESPN_MCP_READONLYRestrict server execution strictly to read-only inspection toolsESPN_MCP_PROFILEServer domain profile (full, games, teams, news, readonly)ESPN_MCP_ENABLE_TOOL_SEARCHReplace flat tool catalog with dynamic search transformESPN_MCP_TOOL_SEARCH_BACKENDTool Search backend: bm25 (default) or regex本地服务需要在你的电脑上安装运行环境(如 Node.js 18+)。各客户端的配置文件位置不同,请参考客户端文档。
工具
本地服务需要在你的电脑上运行后才能读取工具,维护者暂未提供工具列表。
详细介绍
🏈 mcp-server-espn
企业级 Model Context Protocol(MCP)服务,用于通过 ESPN 获取实时和历史体育数据分析、共识投注赔率及预测。
为 AI Agent 提供实时体育情报、实时胜率预测、深入的记分统计、阵容层级信息和对阵分析。
⚠️ 免责声明与合理使用声明
重要
社区项目免责声明
mcp-server-espn是一个独立的开源社区项目,与 ESPN Inc. 或 The Walt Disney Company 没有任何关联,也未获得其赞助、认可或支持。“ESPN” 是 ESPN Inc. 的商标。通过 ESPN 公开 REST 接口提供的所有数据,旨在用于教育、研究和个人非商业用途。
💡 项目缘起
自主体育分析需要高速、结构化且可靠的数据流:
- 实时比赛状态与获胜概率: 实时比赛事件(失误、得分进攻、投手更换)会动态改变比赛势头和预期结果。
- 关键球员伤情与阵容深度调整: 比赛中的受伤或换人会从根本上改变球队效率和战术对阵。
- 共识赔率与预测模型: 汇总体育博彩公司的共识赔率(DraftKings、Caesars、ESPN BET)以及预测指标(FPI、BPI),可用于深入评估比赛数据。
mcp-server-espn 提供统一且经过加固的 Model Context Protocol 接口,直接连接 ESPN 的公开体育数据接口。
🏟️ 系统架构
graph TD
Client["AI Agent / MCP Client<br>(Antigravity, Claude, Codex, Cortex)"]
Gateway["Root FastMCP Gateway (espn-mcp)<br>(stdio / Streamable HTTP)"]
ParentMW["Parent Middleware Pipeline<br>(ParentAuditMiddleware & ReadOnlyGateMiddleware)"]
GamesSub["Sub-Server: espn-games<br>(games_* | GamesDomainGuard)"]
TeamsSub["Sub-Server: espn-teams<br>(teams_* | TeamsDomainGuard)"]
NewsSub["Sub-Server: espn-news<br>(news_* | Resources)"]
ClientHandler["Hardened ESPN AsyncClient<br>(Connection Pool & 429 Jitter Backoff)"]
ESPN["ESPN Public REST CDN<br>(https://site.web.api.espn.com)"]
Client <-->|"JSON-RPC (tools/list, tools/call)"| Gateway
Gateway --> ParentMW
ParentMW --> GamesSub
ParentMW --> TeamsSub
ParentMW --> NewsSub
GamesSub & TeamsSub & NewsSub <-->|"API Methods"| ClientHandler
ClientHandler <-->|"HTTPS REST Mirror"| ESPN
🚀 FastMCP 4 服务组合
mcp-server-espn 通过 root.mount(..., namespace="...") 实现规范的 FastMCP 4 服务组合:
- 领域子服务:划分为
espn-games(games_*)、espn-teams(teams_*)和espn-news(news_*)。 - 分层中间件:
- 父级:
ParentAuditMiddleware(计时日志、审计跟踪和敏感信息清理)以及ReadOnlyGateMiddleware(失败时默认拒绝的只读强制机制)。 - 子级:
GamesDomainGuardMiddleware(查询限制验证,<= 100)和TeamsDomainGuardMiddleware(球队和运动员标识符验证)。
- 父级:
- 专用配置:通过
--profile full|games|teams|news|readonly(ESPN_MCP_PROFILE)运行轻量级功能集:full(默认):挂载全部 33 个领域工具和资源。games:比分、摘要、赛程、排名、排行榜、交易、联盟领跑者、选秀、实时比赛逐球记录、比赛情况、赔率、概率、预测器、日历、未来赛果和实力指数(20 个工具)。teams:阵容、深度图、球员数据、运动员档案、简介、数据、比赛记录、分类统计、搜索、球队列表、球队详情、球队数据(12 个工具)。news:联盟新闻和参考资源(1 个工具)。readonly:对所有路由强制执行只读限制。
- 选择启用工具搜索:默认保留标准的扁平
tools/list,确保与客户端无缝兼容;同时可通过--enable-tool-search(ESPN_MCP_ENABLE_TOOL_SEARCH)启用搜索转换:默认使用 BM25 对自然语言查询进行排序(search_tools接受query),也可通过--tool-search-backend regex(ESPN_MCP_TOOL_SEARCH_BACKEND=regex;search_tools接受pattern)使用正则表达式模式。
📈 体育智能工作流
工作流 1:实时比赛胜率与比赛情况跟踪
- 轮询正在进行的比赛: Agent 调用
games_get_scoreboard(sport="football", league="nfl"),找出下半场比分接近的比赛。 - 获取比赛情况与胜率: 调用
games_get_game_situation(sport="football", league="nfl", event_id="401872947")和games_get_win_probabilities(sport="football", league="nfl", event_id="401872947"),查看进攻档数/码数、红区状态和实时胜率曲线。 - 查看逐球记录: 调用
games_get_play_by_play(sport="football", league="nfl", event_id="401872947"),获取逐个进攻回合的比赛进程和得分事件记录。
工作流 2:深入分析运动员与梦幻体育估值
- 简介与职业生涯背景: 调用
teams_get_athlete_bio(sport="football", league="nfl", athlete_id="12483"),获取选秀顺位、大学经历和身体指标。 - 近期比赛记录与分类统计: 调用
teams_get_athlete_gamelog和teams_get_athlete_splits,分析球员面对特定防守战术和场馆条件时的表现趋势。 - 联盟整体排行榜排名: 调用
games_get_leaders_by_athlete(sport="football", league="nfl", category="passing", sort="yards"),评估百分位排名。
🏟️ 支持的体育项目与联赛参考表
服务支持规范的体育项目 / 联赛 slug 配对,并会自动规范化常见简称:
| 体育项目 Slug | 联赛 Slug | 可识别的简称 / 别名 | 常用显示名称 |
|---|---|---|---|
football | nfl | nfl | 国家橄榄球联盟 |
football | college-football | cfb、ncaa-football、fbs | NCAA 大学橄榄球 |
basketball | nba | nba | 国家篮球协会 |
basketball | mens-college-basketball | cbb、ncaa-basketball | NCAA 男子大学篮球 |
basketball | womens-college-basketball | wbb、ncaa-womens-basketball | NCAA 女子大学篮球 |
basketball | wnba | wnba | 女子国家篮球协会 |
baseball | mlb | mlb | 美国职业棒球大联盟 |
hockey | nhl | nhl | 国家冰球联盟 |
soccer | eng.1 | epl、premier-league | 英格兰超级联赛 |
soccer | usa.1 | mls | 美国职业足球大联盟 |
soccer | uefa.champions | ucl、champions-league | UEFA 欧洲冠军联赛 |
soccer | esp.1 | la-liga | 西班牙足球甲级联赛 |
soccer | ita.1 | serie-a | 意大利足球甲级联赛 |
soccer | ger.1 | bundesliga | 德国足球甲级联赛 |
soccer | fra.1 | ligue-1 | 法国足球甲级联赛 |
📊 工具套件(33 个领域工具)
所有工具均实现了明确的 MCP 2.0 注解(readOnlyHint=True、idempotentHint=True):
| 领域 | 工具 | 参数 | 描述 |
|---|---|---|---|
| 比赛 | games_get_scoreboard | sport, league, date, week, season_type, group, limit | 任意日期(date=YYYYMMDD)或包含首尾日期的日期范围(date=YYYYMMDD-YYYYMMDD)的最终比分和赛果(最多 31 天的范围会逐日获取,因为 ESPN 会拒绝团队运动记分板的范围格式,因此 limit 适用于每天(最多 31 × limit 场赛事),任一天获取失败都会导致整个调用失败;高尔夫日期范围会原样发送给 ESPN);还包括实时比分、比赛状态(pre/in/post)、节次/计时、电视转播和预计首发球员。返回供其他比赛工具使用的赛事 ID。 |
| 比赛 | games_get_game_summary | sport, league, event_id | 多家机构投注盘口共识、对阵预测胜率、ATS、得分进攻、推进过程、领先球员和比赛势头。 |
| 比赛 | games_get_team_schedule | sport, league, team_id, season, season_type | 赛季赛程,包含历史比赛结果和比分:默认显示常规赛,使用 season_type=3 获取季后赛。 |
| 比赛 | games_get_standings | sport, league, season | 分区、联盟和联赛总排名、胜负记录、落后场次和胜率。season 表示赛季结束年份(2016 = 2015-16 NBA 赛季),足球则表示赛季开始年份(2026 = 2026-27 Premier League 赛季);响应会回显 requested_season、season 和 season_display。 |
| 比赛 | games_get_rankings | sport, league | 全国前 25 名投票榜和排名(AP Top 25、Coaches Poll、College Football Playoff)。 |
| 比赛 | games_get_transactions | sport, league, limit | 联赛范围内的交易、阵容交易、弃权签约、签约和裁员。 |
| 比赛 | games_get_leaders_by_athlete | sport, league, limit, category, sort | 联赛球员统计排行榜。 |
| 比赛 | games_get_leaders_by_team | sport, league, limit, category, sort | 球队统计排名和排行榜。 |
| 比赛 | games_get_league_groups | sport, league | 联赛联盟、分区和结构分组层级。 |
| 比赛 | games_get_league_events | sport, league, dates | 联赛当前已排期的赛事。ESPN 的赛事路由会忽略日期,因此不支持按日期筛选:提供 dates 值会返回 isError: true 且不会发起请求,并提示使用 games_get_scoreboard,将相同的值作为 date 传入。 |
| 比赛 | games_get_league_draft | sport, league, season | 联赛选秀轮次、球队选择和选秀结果。 |
| 比赛 | games_get_scoreboard_header | sport, league | 某项运动和联赛中各场比赛的实时滚动记分板标题数据。 |
| 比赛 | games_get_event_odds | sport, league, event_id, competition_id | 体育博彩盘口共识和服务商赔率(让分、大小分、独赢盘)。 |
| 比赛 | games_get_play_by_play | sport, league, event_id, limit, page | 逐回合比赛序列、计时、得分和推进事件。 |
| 比赛 | games_get_game_situation | sport, league, event_id | 实时比赛情况(进攻档数、距离、码线、控球权、红区)。 |
| 比赛 | games_get_win_probabilities | sport, league, event_id | 比赛进程中的实时和历史胜率曲线。 |
| 比赛 | games_get_game_predictor | sport, league, event_id | 赛前和赛中的对阵预测及预测指标。 |
| 比赛 | games_get_calendar | sport, league, dates | 联赛赛程日历及整个赛季的有效赛事日期。 |
| 比赛 | games_get_futures | sport, league, season | 赛季期货投注市场(冠军赔率、胜场总数)。 |
| 比赛 | games_get_power_index | sport, league, season | 球队实力指数(FPI / BPI)评分和效率指标。 |
| 球队 | teams_search | query, type, limit | 按名称/关键词全局搜索运动员和球队(type="player" 或 "team")。 |
| 球队 | teams_list_teams | sport, league | 指定联赛所有球队/俱乐部的目录,包含 ID、名称和标志。 |
| 球队 | teams_get_team | sport, league, team_id | 球队详情概览、场馆、战绩、排名摘要和即将举行的赛事。 |
| 球队 | teams_get_team_statistics | sport, league, team_id | 球队和对手各统计类别的完整细分数据(传球、冲球等)。 |
| 球队 | teams_get_team_roster | sport, league, team_id | 按位置分组的完整现役阵容、教练信息、球衣号码和伤病状态。 |
| 球队 | teams_get_team_depth_chart | sport, league, team_id | 位置首发/替补层级(QB1、QB2 等),用于模拟伤病对人员替换的影响。 |
| 球队 | teams_get_player_stats | sport, league, event_id | 各比赛类别的运动员个人记分统计。 |
| 球队 | teams_get_athlete_overview | sport, league, athlete_id | 运动员个人资料、赛季/生涯统计、比赛记录、下一场比赛和 Rotowire 备注。 |
| 球队 | teams_get_athlete_bio | sport, league, athlete_id | 运动员详细背景、选秀历史、出生信息和大学经历。 |
| 球队 | teams_get_athlete_stats | sport, league, athlete_id, season | 运动员完整的赛季和生涯各类别统计数据。 |
| 球队 | teams_get_athlete_gamelog | sport, league, athlete_id, season | 运动员整个赛季逐场比赛的表现记录。 |
| 球队 | teams_get_athlete_splits | sport, league, athlete_id, season | 情境统计细分数据(主场/客场、人造草坪/天然草坪、按月、对阵不同对手)。 |
| 新闻 | news_get_news | sport, league, limit | 最新新闻标题、伤病状态和突发阵容分析。 |
🏃 快速开始与安装
1. 通过 uvx 直接运行(无需安装)
[project.scripts] 中的控制台脚本都会调用 espn_mcp.server:main:espn-mcp(下文使用)和 mcp-server-espn。安装示例不会固定版本。若要锁定某个版本,请选择 Releases 中的版本。
uvx --from mcp-server-espn espn-mcp
升级后,请重新加载 MCP 宿主,确保运行中进程的启动时间晚于新二进制文件的修改时间(旧进程 ≠ 新软件包)。
2. 通过 pip 或 uv 安装
# Using pip
pip install mcp-server-espn
# Using uv
uv add mcp-server-espn
3. 通过 Docker 运行
docker run --rm -i ghcr.io/christianclaudio/mcp-server-espn:latest
🎛️ 引擎配置
| 变量 | CLI 标志 | 默认值 | 描述 |
|---|---|---|---|
ESPN_BASE_URL | — | https://site.web.api.espn.com | 目标 ESPN REST CDN 基础 URL(绕过 Akamai TLS 过滤器) |
ESPN_TIMEOUT_SECONDS | — | 30.0 | HTTP 请求超时时间(秒) |
ESPN_MCP_AUTH_TOKEN | — | 未设置 | HTTP 传输所需的共享 bearer 令牌(stdio 不使用此令牌) |
ESPN_MCP_ALLOW_UNAUTHENTICATED_BIND | — | 未设置 | 1 表示允许在非 localhost 主机上绑定不带令牌的 HTTP |
ESPN_MAX_RETRIES | — | 3 | 遇到 429 / 5xx 时的最大重试次数,采用带随机抖动的指数退避;若 Retry-After 要求等待更久,则延长等待时间(上限为 ESPN_TIMEOUT_SECONDS) |
ESPN_MCP_READONLY | — | 0 | 将服务严格限制为只读检查工具 |
ESPN_MCP_PROFILE | --profile | full | 域子服务配置:full、games、teams、news、readonly |
ESPN_MCP_ENABLE_TOOL_SEARCH | --enable-tool-search | 0 | 将扁平工具目录替换为动态搜索转换(search_tools + call_tool) |
ESPN_MCP_TOOL_SEARCH_BACKEND | --tool-search-backend | bm25 | 工具搜索后端:bm25(BM25SearchTransform,按自然语言进行排序;search_tools 接受 query)或 regex(RegexSearchTransform,使用正则表达式模式;search_tools 接受 pattern) |
🎮 客户端集成指南
🧡 Claude Desktop
添加到 ~/Library/Application Support/Claude/claude_desktop_config.json(macOS)或 %APPDATA%\Claude\claude_desktop_config.json(Windows):
{
"mcpServers": {
"espn": {
"command": "uvx",
"args": ["--from", "mcp-server-espn", "espn-mcp"],
"env": {
"ESPN_TIMEOUT_SECONDS": "20.0"
}
}
}
}
对于 Claude Code CLI:
claude mcp add espn -- uvx --from mcp-server-espn espn-mcp
♊ Google Antigravity & Gemini CLI
添加到 .agents/mcp_config.json 或 ~/.gemini/config/mcp_config.json:
{
"mcpServers": {
"espn": {
"command": "uvx",
"args": ["--from", "mcp-server-espn", "espn-mcp"],
"env": {
"ESPN_TIMEOUT_SECONDS": "20.0"
},
"lazy": true
}
}
}
❄️ Snowflake Cortex
添加到 ~/.snowflake/cortex/mcp.json:
{
"mcpServers": {
"espn": {
"command": "uvx",
"args": ["--from", "mcp-server-espn", "espn-mcp"],
"env": {
"ESPN_TIMEOUT_SECONDS": "20.0"
},
"lazy": true
}
}
}
⚡ Cursor IDE
添加到 .cursor/mcp.json:
{
"mcpServers": {
"espn": {
"command": "uvx",
"args": ["--from", "mcp-server-espn", "espn-mcp"]
}
}
}
💻 VS Code(Cline / Roo Code / Copilot Agent Mode)
添加到 cline_mcp_settings.json 或 .vscode/settings.json:
{
"mcpServers": {
"espn": {
"command": "uvx",
"args": ["--from", "mcp-server-espn", "espn-mcp"]
}
}
}
🌐 本地 HTTP / 网络传输模式
通过现代 Streamable HTTP 启动 FastMCP 服务:
uvx --from mcp-server-espn espn-mcp --transport streamable-http --host 127.0.0.1 --port 8000
将 Streamable HTTP 客户端连接到 http://127.0.0.1:8000/mcp(FastMCP 默认的 Streamable HTTP 路径)。
在默认的(有状态)HTTP 模式下,空闲 30 分钟的会话会过期:下一次请求将收到 HTTP 404,客户端必须启动新会话。可通过 FastMCP 的 session_idle_timeout(在 http_app() 上设置)或 FASTMCP_HTTP_SESSION_IDLE_TIMEOUT(秒数;设为 none 则永不过期)更改此设置;请参阅 FastMCP 4.1.0 版本说明和 #5229。
HTTP 身份验证。 设置 ESPN_MCP_AUTH_TOKEN,即可要求每个 HTTP 请求都携带 Authorization: Bearer <token>;缺少令牌或令牌错误时会返回 401。令牌会先去除首尾空白,空值视为未设置。令牌会在构建服务时附加,因此 espn-mcp、fastmcp run 和挂载 mcp.http_app() 的 ASGI 主机都会执行此验证。stdio 不使用此令牌。
未设置令牌时,espn-mcp 不允许将 HTTP 绑定到 127.0.0.1、::1 或 localhost 以外的主机,并会以代码 2 退出。设置令牌、绑定到 localhost,或设置 ESPN_MCP_ALLOW_UNAUTHENTICATED_BIND=1,即可允许未经过身份验证的公网绑定。其他入口会获取令牌,但不会执行 localhost 检查:fastmcp run 和 http_app() 不会经过 espn-mcp 的 main(),因此在这些入口中,不带令牌绑定到 0.0.0.0 不会被拒绝,且服务不会进行身份验证。绑定地址由主机或其进程管理器负责,因此应在那里设置 ESPN_MCP_AUTH_TOKEN。
若要通过 HTTP 提供图像,请从 shell 或环境文件传入令牌(切勿使用固定值),并指定客户端使用的公共主机名:
PUBLIC_HOST=mcp.example.com # the host name clients use
export ESPN_MCP_AUTH_TOKEN="$(openssl rand -hex 32)" # or keep it in an env file
docker run --rm -p 8000:8000 -e ESPN_MCP_AUTH_TOKEN \
ghcr.io/christianclaudio/mcp-server-espn:latest \
--transport streamable-http --host 0.0.0.0 --allowed-host "$PUBLIC_HOST"
# with an env file instead: docker run --rm -p 8000:8000 --env-file espn.env ...
📚 权威文档与实时文档 MCP 服务
开发、加固或扩展 MCP 服务时,请查阅官方框架和协议参考资料:
- FastMCP 4 框架参考:
https://gofastmcp.com/llms.txt— 服务组合(mount)、分层中间件、转换(ToolTransform、ToolSearch)、生命周期以及内存中的测试客户端。 - Model Context Protocol 规范:
https://modelcontextprotocol.io/llms.txt— 官方规范(2026-07-28)、线路级 JSON-RPC 架构、注解和传输帧格式。
实时文档 MCP 端点(SSE / Streamable HTTP)
将 AI 编码 Agent 直接连接到实时文档服务:
- FastMCP 文档服务:
https://gofastmcp.com/mcp(工具:search_fast_mcp、query_docs_filesystem_fast_mcp、submit_feedback) - Anthropic MCP 文档服务:
https://modelcontextprotocol.io/mcp(工具:search_model_context_protocol、query_docs_filesystem_model_context_protocol、submit_feedback)
{
"mcpServers": {
"fastmcp-docs": { "type": "sse", "url": "https://gofastmcp.com/mcp" },
"mcp-official-docs": { "type": "sse", "url": "https://modelcontextprotocol.io/mcp" }
}
}
🏆 验证与质量门禁
# Run unit test suite (100% statement coverage enforced)
pytest
# Static type safety & formatting
mypy --strict src/
ruff check --fix .
ruff format .
# Tool contract, drift & protocol conformance audits
python scripts/check_tool_contract.py
python scripts/check_openapi_drift.py
./scripts/check_conformance.sh
📜 许可证
基于 Apache-2.0 License 发布。
评论
一个开放协议,规定了 AI 应用如何以统一方式连接外部工具与数据源。客户端负责与模型对话,MCP 服务负责提供工具、资源和提示模板,两者通过标准消息通信,同一个服务可以被不同客户端复用。