Strava MCP Server
# Strava MCP Server
An MCP (Model Context Protocol) server that connects Claude to the Strava API, giving Claude direct access to your training data.
## Features
- **Athlete Profile** — Get your Strava profile info
- **Athlete Stats** — Lifetime and recent totals (runs, rides, swims)
- **Activities** — List recent activities or filter by date range
- **Activity Details** — Deep dive into any single activity
- **Activity Streams** — Time-series data: GPS, heartrate, power, cadence, altitude
- **Segments** — Starred segments and segment details
## Setup
### 1. Create a Strava API Application
1. Go to [strava.com/settings/api](https://www.strava.com/settings/api)
2. Create an application — set the **Authorization Callback Domain** to `localhost`
3. Note your **Client ID** and **Client Secret**
### 2. Install & Authorize
```bash
npm install
npm run setup
```
The setup wizard will:
- Ask for your Client ID and Client Secret
- Open your browser to authorize with Strava
- Automatically catch the callback and exchange tokens
- Write your `.env` file
### 3. Build
```bash
npm run build
```
<details>
<summary>Manual setup (alternative)</summary>
Open this URL in your browser (replace `CLIENT_ID`):
```
https://www.strava.com/oauth/authorize?client_id=CLIENT_ID&response_type=code&redirect_uri=http://localhost&scope=read_all,activity:read_all
```
After authorizing, you'll be redirected to `http://localhost?code=AUTHORIZATION_CODE`. Copy the code and exchange it:
```bash
curl -s -X POST 'https://www.strava.com/oauth/token' \
-F 'client_id=CLIENT_ID' \
-F 'client_secret=CLIENT_SECRET' \
-F 'code=AUTHORIZATION_CODE' \
-F 'grant_type=authorization_code'
```
Save the `refresh_token` from the response and create a `.env` file:
```
STRAVA_CLIENT_ID=your_client_id
STRAVA_CLIENT_SECRET=your_client_secret
STRAVA_REFRESH_TOKEN=your_refresh_token
```
</details>
### 4. Configure Claude Desktop
#### Option A: Docker (recommended)
Build the Docker image:
```bash
docker build -t strava-mcp-server .
```
Edit `~/Library/Application Support/Claude/claude_desktop_config.json`:
```json
{
"mcpServers": {
"strava": {
"command": "docker",
"args": [
"run", "-i", "--rm",
"--env-file", "/absolute/path/to/your/.env",
"strava-mcp-server"
]
}
}
}
```
Replace `/absolute/path/to/your/.env` with the full path to your `.env` file.
#### Option B: Node.js (local)
```json
{
"mcpServers": {
"strava": {
"command": "node",
"args": ["/Users/USERNAME/Apps/StravaMCP/dist/index.js"],
"env": {
"STRAVA_CLIENT_ID": "your_client_id",
"STRAVA_CLIENT_SECRET": "your_client_secret",
"STRAVA_REFRESH_TOKEN": "your_refresh_token"
}
}
}
}
```
Restart Claude Desktop. You should see the Strava tools available in the tools menu (hammer icon).
## Available Tools
| Tool | Description |
|------|-------------|
| `get_athlete` | Get your Strava profile |
| `get_athlete_stats` | Get lifetime and recent statistics |
| `get_activities` | List recent activities (paginated) |
| `get_activities_between` | Get all activities within a date range (auto-paginated) |
| `get_activity` | Get detailed info for one activity |
| `get_activity_laps` | Get lap/split data for an activity |
| `get_activity_zones` | Get HR and power zone distribution |
| `get_activity_streams` | Get time-series data (GPS, HR, power, etc.) |
| `get_starred_segments` | Get your starred segments |
| `get_segment` | Get details for a specific segment |
| `get_segment_efforts` | Get your efforts on a segment (with optional date filter) |
## Example Prompts
Once connected, try asking Claude:
- "What were my activities this week?"
- "Analyze my running performance over the past month"
- "Compare my cycling times in January vs February"
- "Show me my heartrate data from my last run"
- "What are my all-time stats?"
## Development
```bash
# Run in dev mode (no build step)
npm run dev
# Build for production
npm run build
npm start
```
## License
MIT
TDQS
Scored across 8 tools
Each tool has a clearly distinct purpose targeting specific Strava resources: activities (list, range, detail, streams), athlete (profile, stats), and segments (detail, starred). No overlap exists in functionality, making tool selection unambiguous for an agent.
All tools follow a consistent verb_noun pattern with 'get_' prefix and descriptive suffixes (e.g., get_activities, get_activity_streams). This predictable naming convention enhances readability and agent usability throughout the set.
With 8 tools, this server is well-scoped for the Strava domain, covering core resources like activities, athlete data, and segments. Each tool earns its place by addressing distinct aspects of the API without being overwhelming or insufficient.
The tool set provides strong read-only coverage for activities, athlete, and segments, but lacks write operations (e.g., create/update activities, star segments) or broader functionality like clubs or routes. This is a notable gap that may limit agent workflows requiring full CRUD capabilities.