使用说明
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和客户机密)
安装
- 克隆此存储库:
git clone https://github.com/gcoombe/strava-mcp.git
cd strava-mcp
- 安装依赖项:
npm install
- 复制示例环境文件:
cp .env.example .env
- 构建项目:
npm run build
Strava API设置
1.创建Strava应用程序
- 首选 Strava API设置
- 创建新应用程序
- 填写所需信息:
- 应用程序名称:您的应用程序名称
- 类别:选择合适的类别
- 网站:可以使用
http://localhost用于测试 - 授权回调域:使用
localhost用于本地测试,或您的域名用于生产
- 注意你的 客户端ID 和 客户端密钥
- 将它们添加到您的
.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一起使用:
-
为您的用户生成OAuth凭据
.env:echo "OAUTH_CLIENT_ID=$(openssl rand -hex 16)" echo "OAUTH_CLIENT_SECRET=$(openssl rand -hex 16)" -
通过ngrok公开您的服务器或公开部署:
ngrok http 3000 -
在ChatGPT中,使用以下配置MCP服务器:
- 服务器URL:
https://your-ngrok-url.ngrok-free.dev - OAuth客户端ID:您的价值
.env - OAuth客户端密码:您的价值
.env
- 服务器URL:
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确保所有依赖项都已安装
许可证
麻省理工学院