返回市场
斯特拉瓦-MCP

斯特拉瓦-MCP

作者:r-huijts188 星标更新:2025-09-17

项目介绍

MseeP.ai 安全评估徽章

Strava MCP 服务器

该项目使用 TypeScript 实现了一个 Model Context Protocol (MCP) 服务器,作为与 Strava API 的桥梁。它通过 MCP 标准暴露 Strava 数据和功能作为“工具”,供大型语言模型(LLMs)利用。

<a href="https://glama.ai/mcp/servers/@r-huijts/strava-mcp"> <img width="380" height="200" src="https://gips1.baidu.com/it/u=1014416094,3708497421&fm=3081&app=3081&f=PNG?w=760&h=400" alt="Strava Server MCP 服务器" /> </a>

功能

  • 🏃 访问最近的活动、个人资料和统计数据。
  • 📊 获取详细的活动流数据(功率、心率、踏频等)。
  • 🗺️ 探索、查看、收藏和管理路段。
  • ⏱️ 查看详细的活动和路段努力信息。
  • 📍 列出并查看保存路线的详细信息。
  • 💾 将路线导出为 GPX 或 TCX 格式到本地文件系统。
  • 🤖 通过 MCP 提供 AI 友好的 JSON 响应。
  • 🔧 使用 Strava API V3。

自然语言交互示例

向您的AI助手询问如下问题以与您的Strava数据进行互动:

最近活动和个人资料:

  • “显示我最近的Strava活动。”
  • “我的最后三次骑行是什么?”
  • “获取我的Strava个人资料信息。”
  • “我的Strava用户名是什么?”

活动流和数据:

  • “获取我昨天早晨跑步的心率数据。”
  • “显示我最后一次骑行的功率数据。”
  • “我的周末百英里骑行的踏频概况是什么?”
  • “获取我星期四晚上锻炼的所有流数据。”
  • “显示我攀登迪亚布洛山的海拔概况。”

统计数据:

  • “今年我在Strava上的跑步统计数据是什么?”
  • “我总共骑了多远?”
  • “显示我游泳的总统计数据。”

特定活动:

  • “给我最后一次跑步的详细信息。”
  • “周二间歇训练的平均功率是多少?”
  • “我昨天通勤时是否使用了我的Trek自行车?”

俱乐部:

  • “我在哪些Strava俱乐部中?”
  • “列出我加入的俱乐部。”

路段:

  • “列出我在科罗拉多州博尔德附近收藏的路段。”
  • “显示我最喜欢的路段。”
  • “获取‘阿尔普杜兹’路段的详细信息。”
  • “金门公园附近有哪些好的跑步路段?”
  • “找到靠近博尔德弗拉斯特山的挑战性爬坡路段。”
  • “为我收藏‘弗拉斯特路爬坡’路段。”
  • “取消收藏‘左手法兰峡谷’路段。”

路段努力:

  • “显示我本月在‘阳光峡谷’路段的努力情况。”
  • “列出我今年1月至6月在Box Hill上的尝试。”
  • “获取我在阿尔普杜兹的个人记录的详细信息。”

路线:

  • “列出我保存的Strava路线。”
  • “显示我的路线第二页。”
  • “我的博尔德环线路线的海拔增益是多少?”
  • “获取我‘博尔德环线’路线的描述。”
  • “将我的‘博尔德环线’路线导出为GPX文件。”
  • “将我周日早晨的路线保存为TCX文件。”

高级提示示例

这是一个更高级的提示示例,用于创建您最近Strava活动的专业自行车教练分析:

你是Tom Verhaegen,世界冠军Mathieu van der Poel的精英自行车教练和导师。分析我最近的Strava活动。提供全面的数据驱动评估,结合定量见解和文本解释。

报告开始时用一段文字总结关键发现和背景。然后,使原始数字生动起来:使用HTML、CSS和JavaScript构建一个交互式的视觉引人注目的仪表板。使用大胆、高对比度的颜色和直观、有洞察力的图表类型,最适合每个指标(例如心率、功率、踏频、海拔)。

在可视化中嵌入清晰的教练反馈和个性化的训练建议。这些应该实用、可操作,并且仅基于提供的数据——不假设或捏造。

作为额外奖励,在Mathieu van der Poel本人的激励名言和俏皮评论中点缀——他一直带着一种既关心又逗趣的挑眉和微笑观看我的骑行。

目标:提供一个看起来和感觉就像来自世界级自行车圈内圈的专业表现分析。

此提示生成了您最近Strava活动的个性化分析,包括专业教练反馈和定制的可视化仪表板。

⚠️ 重要设置顺序

为了成功集成Claude,请按以下精确顺序执行步骤:

  1. 安装服务器及其依赖项
  2. 在Claude的配置中配置服务器
  3. 完成Strava认证流程
  4. 重启Claude以确保正确加载环境变量

跳过步骤或不按顺序执行可能会导致环境变量未被Claude正确读取。

安装及设置

  1. 前提条件:
    • Node.js(推荐版本18或更高)
    • npm(通常随Node.js一起提供)
    • 一个Strava账户

1. 从源代码安装

  1. 克隆仓库:

    git clone https://github.com/r-huijts/strava-mcp.git
    cd strava-mcp
    
  2. 安装依赖项:

    npm install
    
  3. 构建项目:

    npm run build
    

2. 配置Claude桌面

更新您的Claude配置文件:

{
  "mcpServers": {
    "strava-mcp-local": {
      "command": "node",
      "args": [
        "/绝对路径/到你的/strava-mcp/dist/server.js"
      ]
      // 环境变量由服务器从.env文件中读取
    }
  }
}

确保替换/绝对路径/到你的/strava-mcp/为实际安装路径。

3. Strava认证设置

setup-auth.ts脚本简化了与Strava API的认证设置。请仔细遵循以下步骤:

创建Strava API应用程序

  1. 转到https://www.strava.com/settings/api
  2. 创建一个新的应用程序:
    • 输入您的应用程序详情(名称、网站、描述)
    • 重要:将“授权回调域”设置为localhost
    • 记下您的客户端ID和客户端密钥

运行设置脚本

# 在您的strava-mcp目录中
npx tsx scripts/setup-auth.ts

按照提示完成认证流程(详细说明见下方认证部分)。

4. 重启Claude

完成上述所有步骤后,重启Claude桌面以使更改生效。这确保:

  • 新的配置已加载
  • 环境变量被正确读取
  • Strava MCP服务器被正确初始化

🔑 环境变量

变量描述
STRAVA_CLIENT_ID您的Strava应用程序客户端ID(必需)
STRAVA_CLIENT_SECRET您的Strava应用程序客户端密钥(必需)
STRAVA_ACCESS_TOKEN您的Strava API访问令牌(在设置期间生成)
STRAVA_REFRESH_TOKEN您的Strava API刷新令牌(在设置期间生成)
ROUTE_EXPORT_PATH导出路线文件的绝对路径(可选)

令牌处理

该服务器实现了自动令牌刷新。当初始访问令牌过期(通常6小时后),服务器将自动使用存储在.env中的刷新令牌来获取新的访问令牌和刷新令牌。这些新令牌将更新到运行进程和.env文件中,确保持续运行。

您只需运行一次scripts/setup-auth.ts脚本进行初始设置。

配置导出路径(可选)

如果您打算使用export-route-gpxexport-route-tcx工具,需要指定一个目录来保存导出的文件。

编辑您的.env文件并添加/更新ROUTE_EXPORT_PATH变量:

# 可选:定义一个*绝对*路径以保存导出的路线文件(GPX/TCX)
# 确保该目录存在并且服务器进程具有写权限。
# 示例:ROUTE_EXPORT_PATH=/Users/your_username/strava-exports
ROUTE_EXPORT_PATH=

用您想要的导出目录的绝对路径替换占位符。确保该目录存在并且服务器具有写入权限。

API参考

服务器公开了以下MCP工具:


get-recent-activities

获取认证用户最近的活动。

  • 何时使用: 当用户询问他们的最近锻炼、活动、跑步、骑行等。
  • 参数:
    • perPage(可选):
      • 类型:number
      • 描述:要检索的活动数量。
      • 默认值:30
  • 输出: 最近活动的格式化文本列表(名称、ID、距离、日期)。
  • 错误: 缺失/无效的令牌,Strava API错误。

get-athlete-profile

获取认证运动员的个人资料信息。

  • 何时使用: 当用户询问他们的个人资料详情,如用户名、位置、体重、高级状态等。
  • 参数:
  • 输出: 包含个人资料详情的格式化文本字符串。
  • 错误: 缺失/无效的令牌,Strava API错误。

get-athlete-stats

获取认证运动员的活动统计数据(最近、YTD、全部时间)。

  • 何时使用: 当用户询问他们的总体统计数据,如跑步/骑行/游泳的总计,个人记录(最长骑行、最大爬升)。
  • 参数:
  • 输出: 统计数据的格式化文本摘要,尊重用户的测量偏好。
  • 错误: 缺失/无效的令牌,Strava API错误。

get-activity-details

使用其ID获取特定活动的详细信息。

  • 何时使用: 当用户询问特定活动的详细信息,该活动通过其ID识别。
  • 参数:
    • activityId(必需):
      • 类型:number
      • 描述:活动的唯一标识符。
  • 输出: 包含详细活动信息的格式化文本字符串(类型、日期、距离、时间、速度、HR、功率、装备等),尊重用户的测量偏好。
  • 错误: 缺失/无效的令牌,无效的activityId,Strava API错误。

list-athlete-clubs

列出认证运动员所属的俱乐部。

  • 何时使用: 当用户询问他们加入的俱乐部。
  • 参数:
  • 输出: 俱乐部的格式化文本列表(名称、ID、运动、成员数、位置)。
  • 错误: 缺失/无效的令牌,Strava API错误。

list-starred-segments

列出认证运动员收藏的路段。

  • 何时使用: 当用户询问他们的收藏或喜欢的路段。
  • 参数:
  • 输出: 收藏路段的格式化文本列表(名称、ID、类型、距离、坡度、位置)。
  • 错误: 缺失/无效的令牌,Strava API错误。

get-segment

使用其ID获取特定路段的详细信息。

  • 何时使用: 当用户询问特定路段的详细信息,该路段通过其ID识别。
  • 参数:
    • segmentId(必需):
      • 类型:number
      • 描述:路段的唯一标识符。
  • 输出: 包含详细路段信息的格式化文本字符串(距离、坡度、海拔、位置、星标、努力等),尊重用户的测量偏好。
  • 错误: 缺失/无效的令牌,无效的segmentId,Strava API错误。

explore-segments

搜索给定地理区域(边界框)内的流行路段。

  • 何时使用: 当用户希望在特定地理区域内查找或发现路段,可选地按活动类型或爬坡类别过滤。
  • 参数:
    • bounds(必需):
      • 类型:string
      • 描述:逗号分隔:south_west_lat,south_west_lng,north_east_lat,north_east_lng
    • activityType(可选):
      • 类型:string"running""riding"
      • 描述:按活动类型过滤。
    • minCat(可选):
      • 类型:number(0-5)
      • 描述:最小爬坡类别。需要activityType: 'riding'
    • maxCat(可选):
      • 类型:number(0-5)
      • 描述:最大爬坡类别。需要activityType: 'riding'
  • 输出: 找到路段的格式化文本列表(名称、ID、爬坡类别、距离、坡度、海拔)。
  • 错误: 缺失/无效的令牌,无效的bounds格式,无效的过滤组合,Strava API错误。

star-segment

为认证运动员收藏或取消收藏特定路段。

  • 何时使用: 当用户明确要求收藏、喜欢、取消收藏或不喜欢特定路段,该路段通过其ID识别。

  • 参数:

    • segmentId(必需):
      • 类型:number
      • 描述:路段的唯一标识符。
    • starred(必需):
      • 类型:boolean
      • 描述:true表示收藏,false表示取消收藏。
  • 输出: 成功消息确认操作和路段的新收藏状态。

  • 错误: 缺失/无效的令牌,无效的segmentId,Strava API错误(例如,路段未找到,速率限制)。

  • 备注:

    • 需要profile:write范围才能收藏和取消收藏路段

get-segment-effort

使用其ID获取特定路段努力的详细信息。

  • 何时使用: 当用户询问特定路段努力的详细信息,该努力通过其ID识别。
  • 参数:
    • effortId(必需):
      • 类型:number
      • 描述:路段努力的唯一标识符。
  • 输出: 包含详细努力信息的格式化文本字符串(路段名称、活动ID、时间、距离、HR、功率、排名等)。
  • 错误: 缺失/无效的令牌,无效的effortId,Strava API错误。

list-segment-efforts

列出认证运动员在给定路段上的努力,可选地按日期过滤。

  • 何时使用: 当用户询问他们在特定路段上的努力或尝试,可能在某个日期范围内。
  • 参数:
    • segmentId(必需):
      • 类型:number
      • 描述:路段的ID。
    • startDateLocal(可选):
      • 类型:string(ISO 8601格式)
      • 描述:过滤在此日期时间之后的努力。
    • endDateLocal(可选):
      • 类型:string(ISO 8601格式)
      • 描述:过滤在此日期时间之前的努力。
    • perPage(可选):
      • 类型:number
      • 描述:每页的结果数量。
      • 默认值:30
  • 输出: 匹配路段努力的格式化文本列表。
  • 错误: 缺失/无效的令牌,无效的segmentId,无效的日期格式,Strava API错误。

list-athlete-routes

列出认证运动员创建的路线。

  • 何时使用: 当用户询问他们创建或保存的路线。
  • 参数:
    • page(可选):
      • 类型:number
      • 描述:分页的页码。
    • perPage(可选):
      • 类型:number
      • 描述:每页的路线数量。
      • 默认值:30
  • 输出: 路线的格式化文本列表(名称、ID、类型、距离、海拔、日期)。
  • 错误: 缺失/无效的令牌,Strava API错误。

get-route

使用其ID获取特定路线的详细信息。

  • 何时使用: 当用户询问特定路线的详细信息,该路线通过其ID识别。
  • 参数:
    • routeId(必需):
      • 类型:number
      • 描述:路线的唯一标识符。
  • 输出: 包含路线详细信息的格式化文本字符串(名称、ID、类型、距离、海拔、预计时间、描述、路段数量)。
  • 错误: 缺失/无效的令牌,无效的routeId,Strava API错误。

export-route-gpx

将特定路线导出为GPX格式并保存到本地。

  • 何时使用: 当用户明确要求将特定路线导出或保存为GPX文件。
  • 前提条件: 服务器上的ROUTE_EXPORT_PATH环境变量必须正确配置。
  • 参数:
    • routeId(必需):
      • 类型:number
      • 描述:路线的唯一标识符。
  • 输出: 成功消息指示保存位置,或错误消息。
  • 错误: 缺失/无效的令牌,缺失/无效的`ROUTE_EXPORT_PATH