Strava MCP Server
# Strava MCP Server
An MCP (Model Context Protocol) server for the [Strava API v3](https://developers.strava.com/docs/reference/). Exposes Strava data through MCP tools, resources, and prompts. Built with TypeScript and the [MCP SDK](https://modelcontextprotocol.io/).
## Tools
### Activities
- **strava_list_activities** - List the authenticated athlete's activities with date range filtering and pagination
- **strava_get_activity** - Get detailed activity info including splits, laps, segment efforts, and gear
- **strava_create_activity** - Create a manual activity entry
- **strava_update_activity** - Update an activity's mutable properties
- **strava_list_activity_comments** - List comments on an activity
- **strava_list_activity_kudoers** - List athletes who gave kudos
- **strava_list_activity_laps** - List laps with distance, time, speed, heart rate, watts, and elevation
- **strava_list_activity_zones** - Get heart rate and power zone distribution
### Athletes
- **strava_get_authenticated_athlete** - Get the authenticated athlete's profile
- **strava_get_athlete_zones** - Get heart rate and power zones
- **strava_get_athlete_stats** - Get year-to-date and all-time totals for runs, rides, and swims
### Segments
- **strava_get_segment** - Get segment details including distance, elevation, grade, and effort count
- **strava_list_segment_efforts** - List efforts on a segment with date range filtering
- **strava_get_segment_effort** - Get a specific segment effort with achievements
- **strava_explore_segments** - Find popular segments within a geographic bounding box
- **strava_star_segment** - Star or unstar a segment
### Routes
- **strava_list_athlete_routes** - List routes created by an athlete
- **strava_get_route** - Get detailed route information
- **strava_export_route_gpx** - Export a route as GPX
- **strava_export_route_tcx** - Export a route as TCX
### Streams (Time-Series Data)
- **strava_get_activity_streams** - Get activity streams (heart rate, power, cadence, altitude, GPS, etc.)
- **strava_get_segment_effort_streams** - Get segment effort streams
- **strava_get_segment_streams** - Get segment GPS/altitude data
- **strava_get_route_streams** - Get route GPS/altitude data
### Clubs
- **strava_list_athlete_clubs** - List clubs the athlete belongs to
- **strava_get_club** - Get club details
- **strava_list_club_activities** - List recent club member activities
- **strava_list_club_members** - List club members
- **strava_list_club_admins** - List club admins
### Gear
- **strava_get_gear** - Get equipment details (bikes, shoes)
### Uploads
- **strava_create_upload** - Upload a FIT/TCX/GPX file to create an activity
- **strava_get_upload** - Check upload processing status
## Resources
Resources provide read-only context data that clients can pull into conversations.
### Static Resources
| URI | Description |
|---|---|
| `strava://athlete/profile` | Current authenticated athlete profile (name, location, bikes, shoes) |
| `strava://athlete/stats` | Year-to-date and all-time activity totals for runs, rides, and swims |
### Template Resources
| URI Template | Description |
|---|---|
| `strava://activity/{activityId}` | Detailed activity by ID |
| `strava://segment/{segmentId}` | Detailed segment by ID |
| `strava://route/{routeId}/gpx` | Export a route as GPX |
## Prompts
Prompts are user-triggered prompt templates that fetch relevant Strava data and ask the LLM for analysis.
| Prompt | Arguments | Description |
|---|---|---|
| `weekly-summary` | `week_start?` (ISO date) | Summarize training for a given week |
| `activity-analysis` | `activity_id` (required) | Deep analysis of pacing, effort, and performance for a single activity |
| `training-plan-review` | `days?` (default 30) | Review training load, volume progression, and overtraining risk |
| `segment-comparison` | `segment_id` (required) | Compare all efforts on a segment to identify trends |
| `race-readiness` | `distance?` (e.g. "marathon") | Assess fitness and race readiness based on recent training |
## Setup
### 1. Create a Strava API Application
Go to [Strava API Settings](https://www.strava.com/settings/api) and create an application. Note your Client ID and Client Secret.
### 2. Get an Access Token
You need an access token with the appropriate scopes. For read-only access use `read,activity:read_all`. For write access add `activity:write`.
You can obtain tokens through Strava's [OAuth flow](https://developers.strava.com/docs/authentication/). The server will automatically refresh expired tokens if `STRAVA_REFRESH_TOKEN`, `STRAVA_CLIENT_ID`, and `STRAVA_CLIENT_SECRET` are set.
### 3. Configure Environment Variables
```sh
export STRAVA_CLIENT_ID="your_client_id"
export STRAVA_CLIENT_SECRET="your_client_secret"
export STRAVA_ACCESS_TOKEN="your_access_token"
export STRAVA_REFRESH_TOKEN="your_refresh_token"
```
### 4. Add to Claude Desktop
Add to your `claude_desktop_config.json`:
```json
{
"mcpServers": {
"strava": {
"command": "npx",
"args": ["-y", "strava-mcp-server"],
"env": {
"STRAVA_CLIENT_ID": "your_client_id",
"STRAVA_CLIENT_SECRET": "your_client_secret",
"STRAVA_ACCESS_TOKEN": "your_access_token",
"STRAVA_REFRESH_TOKEN": "your_refresh_token"
}
}
}
}
```
Or if installed locally:
```json
{
"mcpServers": {
"strava": {
"command": "node",
"args": ["/path/to/strava-mcp/dist/index.js"],
"env": {
"STRAVA_CLIENT_ID": "your_client_id",
"STRAVA_CLIENT_SECRET": "your_client_secret",
"STRAVA_ACCESS_TOKEN": "your_access_token",
"STRAVA_REFRESH_TOKEN": "your_refresh_token"
}
}
}
}
```
## Development
```sh
npm install
npm run build
npm run dev # watch mode with tsx
```
## License
MIT
TDQS
Scored across 33 tools
Most tools have distinct purposes targeting specific Strava resources (activities, segments, routes, clubs, gear) with clear action verbs. However, some overlap exists: 'strava_get_activity_streams' and 'strava_get_segment_effort_streams' both provide time-series data, which could cause confusion about when to use each. The 'strava_list_activity_zones' and 'strava_get_athlete_zones' also cover similar zone concepts but for different contexts.
Tool names follow a highly consistent 'strava_verb_noun' pattern throughout, using snake_case uniformly. The verbs are predictable (get, list, create, update, star, export) and align well with the resource types (activity, segment, route, club, athlete, gear). This makes the tool set easy to navigate and understand at a glance.
With 33 tools, the count feels heavy for a single-domain server, potentially overwhelming for agents. While Strava's API is feature-rich, this many tools may indicate over-fragmentation (e.g., separate tools for similar stream types or list functions). A more consolidated set (e.g., 15-20 tools) could improve usability without losing functionality.
The tool set provides comprehensive coverage of Strava's core domain, including full CRUD/lifecycle operations for activities (create, get, list, update), segments (explore, get, star, efforts), routes (get, export), clubs (get, list members/admins/activities), and athlete data (profile, stats, zones). It handles key workflows like file uploads, streams, and social features (comments, kudos), leaving no obvious gaps.