Strava API集成服务器

一个用于与Strava API集成的模型上下文协议(MCP)服务器,提供对活动、运动员数据、路线、路段、俱乐部和装备等主要Strava API端点的全面访问。

  • by gcoombe
  • TypeScript
  • 本地部署
  • 更新于
在 GitHub 查看 gcoombe/strava-mcp

使用说明

Strava MCP服务器

用于与Strava API集成的模型上下文协议(MCP)服务器。该服务器提供对所有主要Strava API端点的全面访问,包括活动、运动员数据、路线、分段、俱乐部和装备。

运输方式

此服务器支持两种传输模式 MCP规范:

模式 命令 授权 用例
标准 npm start 环境令牌 克劳德桌面(单用户)
超文本传输协议 npm run start:http OAuth+JWT ChatGPT,REST客户端(多用户)

特性

活动管理

  • 使用过滤器(日期范围、页码)获取运动员活动
  • 获取详细的活动信息
  • 创建、更新和删除活动
  • 访问活动流(GPS、心率、功率、节奏等)
  • 获取活动评论和荣誉

运动员数据

  • 获取经过认证的运动员资料
  • 获取运动员统计数据和总数
  • 获取运动员区域(心率和力量)

路线

  • 获取运动员路线
  • 获取详细的路线信息

片段

  • 获取星级片段
  • 获取细分市场详细信息
  • 使用筛选器获取细分市场排行榜
  • 探索地理区域中的细分市场

俱乐部和社交

  • 获取运动员俱乐部
  • 获取俱乐部详细信息和会员
  • 参加俱乐部活动

齿轮

  • 获取详细的装备信息

先决条件

  • Node.js 18+(建议使用LTS)
  • 斯特拉瓦账户
  • Strava API凭证(客户ID和客户机密)

安装

  1. 克隆此存储库:
git clone https://github.com/gcoombe/strava-mcp.git
cd strava-mcp
  1. 安装依赖项:
npm install
  1. 复制示例环境文件:
cp .env.example .env
  1. 构建项目:
npm run build

Strava API设置

1.创建Strava应用程序

  1. 首选 Strava API设置
  2. 创建新应用程序
  3. 填写所需信息:
    • 应用程序名称:您的应用程序名称
    • 类别:选择合适的类别
    • 网站:可以使用 http://localhost 用于测试
    • 授权回调域:使用 localhost 用于本地测试,或您的域名用于生产
  4. 注意你的 客户端ID 和 客户端密钥
  5. 将它们添加到您的 .env 文件

2.选择您的运输方式

stdio模式(克劳德桌面)

对于单用户使用Claude Desktop:

# Run the interactive setup to get your personal tokens
npm run setup

# Start the server
npm start

安装脚本将指导您完成OAuth流程,并将令牌保存到 .env.

HTTP模式(多用户)

对于多用户部署(ChatGPT、REST客户端):

# Add HTTP-specific variables to .env:
# OAUTH_CLIENT_ID=<generate with: openssl rand -hex 16>
# OAUTH_CLIENT_SECRET=<generate with: openssl rand -hex 16>
# JWT_SECRET=<generate with: openssl rand -base64 32>
# STRAVA_REDIRECT_URI=http://localhost:3000/auth/strava/callback

# Start the HTTP server
npm run start:http

用户通过OAuth进行身份验证 /auth/authorize 并接收用于API访问的JWT。

ChatGPT配置

要与ChatGPT一起使用:

  1. 为您的用户生成OAuth凭据 .env:

    echo "OAUTH_CLIENT_ID=$(openssl rand -hex 16)"
    echo "OAUTH_CLIENT_SECRET=$(openssl rand -hex 16)"
    
  2. 通过ngrok公开您的服务器或公开部署:

    ngrok http 3000
    
  3. 在ChatGPT中,使用以下配置MCP服务器:

    • 服务器URL: https://your-ngrok-url.ngrok-free.dev
    • OAuth客户端ID:您的价值 .env
    • OAuth客户端密码:您的价值 .env

ChatGPT将通过以下方式自动发现OAuth端点 /.well-known/oauth-authorization-server.

MCP配置(标准输入模式)

克劳德桌面版

将此添加到您的Claude Desktop配置文件中:

macOS: ~/Library/Application Support/Claude/claude_desktop_config.json 视窗: %APPDATA%\Claude\claude_desktop_config.json

{
  "mcpServers": {
    "strava": {
      "command": "node",
      "args": [
        "/absolute/path/to/strava-mcp/dist/index.js"
      ]
    }
  }
}

HTTP API参考

在HTTP模式下运行时(npm run start:http),以下端点可用:

OAuth 2.0端点

端点 方法 描述
/.well-known/oauth-authorization-server GET OAuth服务器元数据(RFC 8414)
/auth/authorize GET OAuth授权端点(重定向到Strava)
/auth/callback GET 来自Strava的内部OAuth回调
/auth/token POST JWT的交换授权码
/auth/me 获取当前运动员信息(需要JWT)
/auth/logout POST 撤销令牌(需要JWT)

工具

端点 方法 身份验证 描述
/tools GET - 列出所有可用工具
/tools/:name GET - 获取工具架构
/tools/:name POST JWT 执行工具

示例用法

# Start the server
npm run start:http

# For ChatGPT: Configure with your server URL and OAuth credentials
# ChatGPT will handle the OAuth flow automatically

# For manual testing with curl:
# 1. List tools (no auth required)
curl http://localhost:3000/tools

# 2. After completing OAuth flow, use the JWT for API calls
TOKEN="your-jwt-token"

# Get athlete profile
curl -X POST http://localhost:3000/tools/get_athlete \
  -H "Authorization: Bearer $TOKEN"

# Get recent activities
curl -X POST http://localhost:3000/tools/get_activities \
  -H "Authorization: Bearer $TOKEN" \
  -H "Content-Type: application/json" \
  -d '{"per_page": 10}'

可用工具

活动

  • get_activities -使用过滤器列出运动员活动
  • get_activity -获取详细的活动信息
  • create_activity -创建新的手动活动
  • update_activity -更新现有活动
  • delete_activity -删除活动
  • get_activity_streams -获取活动数据流
  • get_activity_comments -获取活动评论
  • get_activity_kudos -获得活动荣誉

运动员

  • get_athlete -获取经过认证的运动员资料
  • get_athlete_stats -获取运动员统计数据
  • get_athlete_zones -获得运动员训练区

路线

  • get_routes -列出运动员路线
  • get_route -获取路线详细信息

片段

  • get_starred_segments -列出星级片段
  • get_segment -获取细分市场详细信息
  • get_segment_leaderboard -获取细分市场排行榜
  • explore_segments -探索某个地区的细分市场

俱乐部

  • get_athlete_clubs -列出运动员俱乐部
  • get_club -获取俱乐部详细信息
  • get_club_members -获取俱乐部会员
  • get_club_activities -参加俱乐部活动

齿轮

  • get_gear -获取装备详细信息

环境变量

变量 必填 模式 描述
STRAVA_CLIENT_ID 是 两者都有 Strava API客户ID
STRAVA_CLIENT_SECRET 是 两者都是 Strava API客户机密
STRAVA_ACCESS_TOKEN 是 stdio 用户的访问令牌
STRAVA_REFRESH_TOKEN 是 stdio 用户刷新令牌
STRAVA_EXPIRES_AT 是 stdio 令牌过期时间戳
OAUTH_CLIENT_ID 是 HTTP ChatGPT的OAuth客户端ID(由您创建)
OAUTH_CLIENT_SECRET 是 HTTP ChatGPT的OAuth客户端密钥(由您创建)
JWT_SECRET 是 HTTP 签名JWT的秘密
JWT_EXPIRES_IN 无 HTTP JWT过期(默认:7d)
STRAVA_REDIRECT_URI 是 HTTP OAuth回调URL
DATABASE_PATH 无 HTTP SQLite路径(默认:./data/strava-mcp.db)
HTTP_PORT 无 HTTP 服务器端口(默认值:3000)

发展

脚本

  • npm run build -构建TypeScript项目
  • npm run dev -开发观看模式
  • npm run lint -抓取代码库
  • npm test -运行测试
  • npm start -启动MCP服务器(stdio模式)
  • npm run start:http -启动HTTP服务器
  • npm run setup -交互式OAuth设置

项目结构

strava-mcp/
├── src/
│   ├── index.ts              # Entry point (mode selection)
│   ├── auth.ts               # Strava OAuth handling
│   ├── strava-client.ts      # Strava API client
│   ├── http-server.ts        # Express HTTP server
│   ├── create-tools.ts       # Tool initialization
│   ├── db.ts                 # SQLite database (HTTP mode)
│   ├── auth/                 # HTTP auth module
│   │   ├── jwt.ts            # JWT utilities
│   │   ├── middleware.ts     # Auth middleware
│   │   └── routes.ts         # OAuth endpoints
│   ├── types/
│   │   └── strava.ts         # TypeScript definitions
│   ├── tools/                # MCP tool implementations
│   │   ├── activities.ts
│   │   ├── athlete.ts
│   │   ├── routes.ts
│   │   ├── segments.ts
│   │   ├── clubs.ts
│   │   └── gear.ts
│   └── utils/
│       └── data-reducer.ts   # Response optimization
├── data/                     # SQLite database (HTTP mode)
├── package.json
├── tsconfig.json
├── .env.example
└── README.md

令牌刷新

当访问令牌过期时,服务器会自动刷新访问令牌:

  • stdio模式:令牌在内存中刷新
  • HTTP模式:刷新的令牌将持久化到SQLite

速率限制

Strava有费率限制:

  • 每15分钟100个请求
  • 每天1000个请求

服务器当前未实施速率限制,因此请负责任地使用。

故障排除

“没有可用令牌”错误(stdio模式)

  • 确保所有 STRAVA_* 环境变量设置在 .env
  • 跑 npm run setup 获取新令牌

“需要JWT_SECRET”错误(HTTP模式)

  • 添加 JWT_SECRET 给你的 .env 文件
  • 生成一个: openssl rand -base64 32

“找不到用户的令牌”错误(HTTP模式)

  • 用户需要在重新验证 /auth/strava
  • 代币可能已被Strava撤销

“刷新令牌失败”错误

  • 您的刷新令牌可能已被吊销
  • 再次浏览OAuth流程以获取新令牌

构建错误

  • 确保你使用的是Node.js 18+LTS
  • 跑 npm install 确保所有依赖项都已安装

许可证

麻省理工学院

资源