训练数据访问服务器

一个用于访问TrainingPeaks训练数据的MCP服务器,适用于Claude Desktop、ChatGPT和其他MCP兼容客户端。

  • by robertgregorywest
  • TypeScript
  • 本地部署
  • 1 星标
  • 更新于
在 GitHub 查看 robertgregorywest/trainingpeaks-mcp

使用说明

培训口语mcp

用于访问TrainingPeaks训练数据的MCP(模型上下文协议)服务器。适用于Claude Desktop、ChatGPT和其他MCP兼容客户端。

特性

  • 20工具 用于访问锻炼、力量锻炼、健身指标、峰值/PR、功率分析、有氧解耦、锻炼计划合规性、ZWO锻炼生成、文件、缓存管理和日期解析
  • FIT文件缓存:下载的FIT文件被缓存到磁盘(~/.trainingpeaks-mcp/cache/fit/)--消除了会话之间的冗余下载
  • 双重运输:stdio用于克劳德桌面,HTTP用于ChatGPT
  • FIT文件解析:从下载的FIT文件中提取结构化数据
  • 也可用作独立的TypeScript库

快速开始

一键安装(克劳德桌面版)

  1. 下载最新 .mcpb 文件来自 发布
  2. 双击 .mcpb file--Claude Desktop将打开并提示您安装
  3. 在提示时输入您的TrainingPeaks凭据

就是这样——不需要安装Node.js。Claude Desktop捆绑了自己的运行时。

手动配置(克劳德桌面)

需要 Node.js 20+。添加到您的Claude Desktop配置中(~/Library/Application Support/Claude/claude_desktop_config.json 在macOS上):

{
  "mcpServers": {
    "trainingpeaks": {
      "command": "npx",
      "args": ["trainingpeaks-mcp"],
      "env": {
        "TP_USERNAME": "your-email@example.com",
        "TP_PASSWORD": "your-password"
      }
    }
  }
}

重新启动克劳德桌面。现在,您可以向Claude询问您的训练数据!

ChatGPT(通过HTTP)

需要 Node.js 20+.

  1. 克隆并安装:

    git clone https://github.com/robertgregorywest/trainingpeaks-mcp.git
    cd trainingpeaks-mcp
    npm install
    
  2. 创建 .env 使用您的凭据文件:

    cp .env.example .env
    # Edit .env with your TrainingPeaks credentials
    
  3. 构建并启动HTTP服务器:

    npm run build
    npm run start:http
    

    您应该看到: TrainingPeaks MCP HTTP server running on port 3000

  4. 安装ngrok(如果尚未安装):

    macOS(Homebrew):

    brew install ngrok
    

    窗户(巧克力):

    choco install ngrok
    

    或直接从以下网址下载: https://ngrok.com/download

  5. 创建一个免费的ngrok帐户并获取您的身份验证令牌:

    • 注册地址:https://dashboard.ngrok.com/signup
    • 从以下位置复制您的身份验证令牌https://dashboard.ngrok.com/get-started/your-authtoken
    • 使用您的令牌配置ngrok:
      ngrok config add-authtoken YOUR_AUTH_TOKEN
      
  6. 启动ngrok以暴露您的本地服务器(在新终端中):

    ngrok http 3000
    

    ngrok将显示如下输出:

    Forwarding   https://abc123.ngrok-free.app -> http://localhost:3000
    

    复制 https://...ngrok-free.app URL。

  7. 在ChatGPT中添加MCP连接器:

    • 转到ChatGPT设置→ 连接器→ 添加连接器
    • 输入您的ngrok URL /mcp 路径: https://abc123.ngrok-free.app/mcp
    • 保存连接器
  8. 通过向ChatGPT询问您的TrainingPeaks数据进行测试!

可用工具

工具 说明
get_user 获取包含运动员ID的用户资料
get_athlete_id 获取运动员ID
get_workouts 按日期范围列出锻炼计划
get_workout 获取单次锻炼总结
get_workout_details 使用完整的指标、间隔、圈数、区域进行锻炼
search_workouts 按标题搜索几天内的训练(不区分大小写)
compare_intervals 使用功率/持续时间过滤器在训练中并排比较圈数/间隔
get_strength_workouts 在指定日期范围内进行力量训练(训练、分组、锻炼、依从性)
parse_fit_file 解析FIT文件并提取结构化数据
get_fitness_data 获取日期范围的CTL/ATL/TSB
get_current_fitness 获取今天的健身指标
get_peaks 获得特定运动和类型的峰值
get_workout_peaks 从特定训练中获取PR
get_best_power 根据原始FIT文件计算任意持续时间(例如3分钟、8分钟、45分钟)的最佳功率
get_power_duration_curve 在一个日期范围内构建自行车训练的功率持续时间曲线
get_aerobic_decoupling 计算有氧运动与运动的脱钩(Pw:Hr)——测量心脏漂移
assess_compliance 评估锻炼计划的合规性——将规定的计划与实际活动、每一步和总结指标进行比较
build_zwo_workout 从结构化分段(热身、间歇、稳定、斜坡、冷却、自由骑行)构建Zwift.zwo锻炼文件
clear_fit_cache 清除从TrainingPeaks下载的所有缓存FIT文件
get_current_date 获取ISO、美国、欧盟或自定义格式的当前日期

示例提示

  • “我上周做了什么锻炼?”
  • “显示我当前的健康状况(CTL、ATL、TSB)”
  • “我最好的5分钟力量是什么?”
  • “获取我最近骑行的详细信息,包括心率区域”
  • “下载并解析昨天骑行的FIT文件”
  • “搜索我过去30天的所有节奏训练”
  • “比较我最近3次阈值骑行的间隔”
  • “从昨天的骑行中,我最好的3分钟和8分钟力量是什么?”
  • “构建过去6周的功率持续时间曲线”
  • “我上次长途骑行的有氧脱钩是什么?”
  • “我昨天的骑行计划执行得怎么样了?”
  • “为Zwift创建300W的5x5 VO2max训练,FTP恢复率为50%”
  • “以220W的功率为我打造一个3x10分钟的最佳时段”
  • “今天几号?”

环境变量

创建一个 .env 示例中的文件:

cp .env.example .env

然后编辑 .env 使用您的TrainingPeaks证书:

TP_USERNAME=your-email@example.com
TP_PASSWORD=your-password
变量 描述 可选
TP_USERNAME TrainingPeaks电子邮件地址 否
TP_PASSWORD TrainingPeaks密码 否
PORT HTTP服务器端口(默认值:3000) 是
TP_TEST_BIKE_WORKOUT_ID 自行车训练ID,包含FIT文件、功率和HR数据(用于集成测试) 是

图书馆使用情况

您还可以将此包用作独立的TypeScript库:

import { createClient } from "trainingpeaks-mcp";

const client = createClient();

// Get workouts for a date range
const workouts = await client.getWorkouts("2024-01-01", "2024-12-31");

// Get workout details with metrics
const details = await client.getWorkoutDetails(workouts[0].workoutId);
console.log(details.metrics);

// Get current fitness
const fitness = await client.getCurrentFitness();
console.log(`CTL: ${fitness.ctl}, ATL: ${fitness.atl}, TSB: ${fitness.tsb}`);

// Build a power-duration curve from the last 6 weeks of rides
const curve = await client.getPowerDurationCurve({
  startDate: "2024-11-01",
  endDate: "2024-12-15",
});
console.log(curve.curve.map((p) => `${p.durationLabel}: ${p.bestPowerWatts}W`));

// Aerobic decoupling analysis
const decoupling = await client.getAerobicDecoupling(workouts[0].workoutId);
console.log(
  `Decoupling: ${decoupling.decouplingPercent}% — ${decoupling.interpretation}`,
);

// Workout plan compliance assessment
const compliance = await client.assessCompliance(workouts[0].workoutId);
console.log(
  `Plan compliance: ${compliance.overallCompliance.powerComplianceAvg}%`,
);

// Clean up when done
await client.close();

发展

npm run build        # Compile TypeScript
npm run lint         # Run ESLint
npm run test         # Run unit tests
npm run typecheck    # Type-check without emitting

集成测试

集成测试对TrainingPeaks进行真正的API调用,以验证所有端点是否正常工作。

先决条件:

  1. 创建 .env 将您的TrainingPeaks凭据归档(请参阅 环境变量)

运行集成测试:

npm run test:integration

测试内容:

  • 用户API: getUser, getAthleteId
  • API训练: getWorkouts, getWorkout, getWorkoutDetails
  • 健身API: getCurrentFitness, getFitnessData
  • 峰值API: getPeaks, getWorkoutPeaks
  • 文件API: downloadActivityFile

如果凭据不可用,则会自动跳过测试。

运作原理

该库使用Playwright自动将浏览器登录到TrainingPeaks,从API请求中捕获身份验证令牌。然后将该令牌用于后续的API调用。

许可证

麻省理工学院