Wahoo SYSTM MCP Server
Python MCP server bridging LLMs to the Wahoo SYSTM API for training data and workout management.
主要特点
- 日历管理:查看、安排、重新安排和删除计划的锻炼
- 锻炼库:使用高级过滤功能(运动、持续时间、TSS、4DP焦点、强度)浏览和搜索1000+个训练
- 锻炼详细信息:访问完整的锻炼结构,包括间隔目标、设备要求和关键指标
- 骑手简介:检索当前的4DP值、骑手类型分类、优缺点、cTHR和心率区域
- 体能测试历史:通过完整的4DP分析访问完整的正面和半月测试结果
- AI集成:通过MCP标准返回针对LLM消费优化的结构化JSON响应
兼容客户端
任何与模型上下文协议(MCP)兼容的客户端都应该工作。请参阅 模型上下文协议:入门 引言部分进行了总体概述。
安装说明
先决条件
- 活跃的 Wahoo SYSTM 账户
安装选项
根据您的MCP客户端选择以下方法之一:
选项A:MCPB捆绑包(建议用于Claude Desktop)
不需要依赖关系。下载 .mcpb 捆绑从 发布 页面, 双击以使用Claude Desktop打开,然后按照提示输入 您的证书。
选项B:通过uvx直接安装
需要 紫外线 待安装。不需要本地克隆。请参阅下面的客户特定说明。
选项C:本地克隆(用于开发)
需要Python 3.11+和 紫外线.
git clone https://github.com/joaodrp/wahoo-systm-mcp.git
cd wahoo-systm-mcp
uv sync客户端配置
Claude Desktop
使用上述选项A(MCPB捆绑包)进行最简单的设置。
手动配置(备选)
- macOS:
~/Library/Application Support/Claude/claude_desktop_config.json - 窗户:
%APPDATA%/Claude/claude_desktop_config.json
{
"mcpServers": {
"wahoo-systm": {
"command": "uvx",
"args": ["--from", "git+https://github.com/joaodrp/wahoo-systm-mcp.git", "wahoo-systm-mcp"],
"env": {
"WAHOO_USERNAME": "your_email@example.com",
"WAHOO_PASSWORD": "your_password"
}
}
}
}文件: 克劳德桌面MCP设置
Claude Code
使用凭据添加服务器:
claude mcp add wahoo-systm \
-e WAHOO_USERNAME=your_email@example.com \
-e WAHOO_PASSWORD=your_password \
-- uvx --from git+https://github.com/joaodrp/wahoo-systm-mcp.git wahoo-systm-mcp验证配置:
claude mcp get wahoo-systm或者,如果您是通过Claude Desktop安装的,则可以导入服务器:
claude mcp add-from-claude-desktop文件: 克劳德代码MCP
ChatGPT (remote MCP only)
ChatGPT目前仅支持远程MCP服务器(不支持本地)。运行HTTP 服务器模式并将其托管在可访问的地方,然后通过设置添加它→ 应用程序和连接器→ 创建。
文件: 开发者模式+MCP连接器 和 应用程序和连接器
OpenCode
在下添加MCP服务器 mcp 在您的OpenCode配置中:
{
"$schema": "https://opencode.ai/config.json",
"mcp": {
"wahoo-systm": {
"type": "local",
"command": "uvx",
"args": ["--from", "git+https://github.com/joaodrp/wahoo-systm-mcp.git", "wahoo-systm-mcp"],
"env": {
"WAHOO_USERNAME": "your_email@example.com",
"WAHOO_PASSWORD": "your_password"
}
}
}
}文件: OpenCode MCP服务器
HTTP服务器模式(可选)
如果要通过HTTP运行此服务器(用于基于web或远程MCP客户端),请使用 HTTP入口点:
uv run wahoo-systm-mcp-server如果您没有克隆仓库,可以直接用以下命令运行它 uvx:
uvx --from git+https://github.com/joaodrp/wahoo-systm-mcp.git wahoo-systm-mcp-server您可以使用环境变量覆盖主机/端口或传输:
HTTP_HOST=0.0.0.0 HTTP_PORT=9000 uv run wahoo-systm-mcp-server环境变量
| 变量 | 目的 |
|---|---|
WAHOO_USERNAME | Wahoo SYSTM电子邮件地址 |
WAHOO_PASSWORD | Wahoo SYSTM密码 |
HTTP_HOST | HTTP绑定主机(仅HTTP模式,默认: 127.0.0.1) |
HTTP_PORT | HTTP绑定端口(仅限HTTP模式,默认值: 8000) |
HTTP_TRANSPORT | HTTP传输(http, streamable-http, sse) |
服务器在启动时自动进行身份验证,并在进程期间维护会话。
可用工具
日历和日程安排
get_calendar:使用完整的锻炼详细信息和议程ID检索日期范围内的计划锻炼schedule_workout:将库中的锻炼添加到日历中的特定日期reschedule_workout:将计划的锻炼调整到其他日期remove_workout:从日历中取消/删除计划的锻炼
锻炼库
\[!注意\] 目前,只有自行车有专门的锻炼搜索工具(get_cycling_workouts)具有运动特定的过滤器,如4DP焦点和自行车类别。对于其他运动(跑步、力量训练、瑜伽、游泳),请使用通用get_workouts工具。
get_workouts:使用运动、持续时间、TSS、搜索词和排序选项的过滤器浏览整个锻炼库get_cycling_workouts:使用4DP焦点、频道、类别和强度过滤器进行专门的自行车锻炼搜索get_workout_details:获取完整的锻炼信息,包括间隔目标、设备和TSS
骑手简介
get_rider_profile:检索当前的4DP值(NM、AC、MAP、FTP)、骑手类型分类、优缺点、cTHR和心率区域
\[!注意\] 心率区域根据cTHR计算,以匹配运动员个人资料UI。 响应包括上下文的最后测试日期。
体能测试
get_fitness_test_history:列出所有已完成的正面和半月测试,包括4DP结果、骑手类型和日期get_fitness_test_details:访问详细的测试数据,包括逐秒功率/节奏/HR、功率曲线最佳值和分析
示例用法
日历管理
- “本周我的SYSTM日历上有什么?”
- “周六安排九把锤子”
- “将明天的训练移至周四”
- “从SYSTM中删除周五的锻炼”
锻炼发现
- “找到一个45-60分钟的最佳锻炼时间”
- “SYSTM训练的目标是MAP吗?”
- “显示1小时内最受欢迎的自行车锻炼”
- “寻找低强度的恢复骑行”
锻炼详情
- “告诉我Omnium训练的情况”
- “Half Monty的结构是什么?”
4DP配置文件和测试
- “我目前的4DP配置文件是什么?”
- “显示我的体能测试历史记录”
- “比较我最近的两个Full Frontal结果”
发展
项目结构
wahoo-systm-mcp/
├── src/
│ └── wahoo_systm_mcp/
│ ├── __init__.py
│ ├── __main__.py # Stdio entry point
│ ├── main.py # HTTP entry point
│ ├── models.py # MCP tool response models
│ ├── types.py # Shared typing aliases
│ ├── server/
│ │ ├── __init__.py
│ │ ├── app.py # FastMCP app builder
│ │ ├── config.py # HTTP config
│ │ ├── lifecycle.py # Lifespan management
│ │ └── register.py # Tool registration
│ ├── tools/
│ │ ├── __init__.py
│ │ ├── calendar.py
│ │ ├── library.py
│ │ └── profile.py
│ └── client/
│ ├── __init__.py
│ ├── api.py # WahooClient (GraphQL)
│ ├── config.py # API configuration
│ ├── models.py # API response models
│ └── queries.py # GraphQL queries
├── tests/
│ ├── __init__.py
│ ├── conftest.py # Shared fixtures
│ ├── test_client.py
│ ├── test_entrypoints.py # CLI entry point tests
│ ├── test_integration.py # Integration tests
│ ├── test_models.py
│ └── test_server.py
├── docs/
│ └── wahoo-graphql-spec.md # API specification
├── .github/
│ └── workflows/ # CI/CD pipelines
├── .env.example # Environment template
├── .mcpbignore # MCPB bundle exclusions
├── justfile # Development commands
├── manifest.json # MCPB bundle manifest
├── pyproject.toml
├── CHANGELOG.md
└── README.md设置开发环境
# Install all dependencies
just install
# Or manually with uv
uv sync --dev复制 .env.example 到 .env 并填写您的Wahoo SYSTM证书以进行本地开发。
开发命令
跑 just 查看所有可用命令:
just # List all commands
just test # Run unit tests
just test-cov # Run tests with coverage
just lint # Lint with ruff
just typecheck # Type check with mypy
just check # Run all checks (lint + typecheck)
just format # Format code
just fix # Fix lint issues and format
just serve # Run the MCP server测试
# Unit tests (no credentials needed)
just test
# Unit tests with coverage
just test-cov
# Integration tests (requires .env with credentials)
just test-integration
# All tests (unit + integration)
just test-all过梁和类型检查
just lint # Lint with ruff
just typecheck # Type check with mypy
just check # Run both
just fix # Auto-fix issues and formatAPI信息
此服务器使用位于的Wahoo SYSTM GraphQL API https://api.thesufferfest.com/graphql.该实现基于反向引擎化web应用程序的API调用。
安全说明
- 凭据仅在会话期间存储在内存中
- 身份验证令牌在服务器重新启动之间不会持久化
致谢
这个项目的灵感来自 suffersync bakermat将Wahoo SYSTM训练同步到intervals.icu。
贡献和许可
欢迎通过pull请求进行贡献。根据MIT许可证获得许可。
