Skip to main content
Glama
juanlarreapm

Strava MCP Server

by juanlarreapm
README.md
# Strava MCP Server

A Model Context Protocol (MCP) server that integrates with the Strava API, allowing AI assistants to access your Strava fitness data.

## Features

- Fetch athlete profile and statistics
- List and query activities
- Access segment data and efforts
- Explore segments by geographic area
- View starred segments

## Prerequisites

- Node.js 18 or higher
- A Strava account
- Strava API credentials (Client ID and Client Secret)

## Installation

1. Clone this repository:
```bash
git clone https://github.com/juanlarreapm/strava-mcp-server.git
cd strava-mcp-server
```

2. Install dependencies:
```bash
npm install
```

3. Build the project:
```bash
npm run build
```

## Strava API Setup

Before using this server, you need to create a Strava API application:

1. Go to [https://www.strava.com/settings/api](https://www.strava.com/settings/api)
2. Create a new application
3. Set the **Authorization Callback Domain** to `localhost`
4. Note your **Client ID** and **Client Secret**

## Getting OAuth Tokens

Run the authentication setup script to obtain your access tokens:

```bash
node setup-auth.cjs
```

This will:
1. Prompt you for your Client ID and Client Secret
2. Open a browser for Strava authorization
3. Display your access token, refresh token, and other credentials

Keep these credentials secure - you'll need them to configure the MCP server.

## Configuration

The server requires the following environment variables:

- `STRAVA_ACCESS_TOKEN` - Your Strava access token (required)
- `STRAVA_REFRESH_TOKEN` - Your refresh token (optional, for token renewal)
- `STRAVA_CLIENT_ID` - Your Strava application Client ID (optional)
- `STRAVA_CLIENT_SECRET` - Your Strava application Client Secret (optional)

### For Claude Desktop

Add this to your Claude Desktop MCP settings file:

**macOS**: `~/Library/Application Support/Claude/claude_desktop_config.json`
**Windows**: `%APPDATA%\Claude\claude_desktop_config.json`

```json
{
  "mcpServers": {
    "strava": {
      "command": "node",
      "args": ["/path/to/strava-mcp-server/dist/index.js"],
      "env": {
        "STRAVA_ACCESS_TOKEN": "your_access_token_here",
        "STRAVA_REFRESH_TOKEN": "your_refresh_token_here",
        "STRAVA_CLIENT_ID": "your_client_id_here",
        "STRAVA_CLIENT_SECRET": "your_client_secret_here"
      }
    }
  }
}
```

### For Other MCP Clients

Create a `.env` file in the project root (see `.env.example`):

```bash
STRAVA_ACCESS_TOKEN=your_access_token_here
STRAVA_REFRESH_TOKEN=your_refresh_token_here
STRAVA_CLIENT_ID=your_client_id_here
STRAVA_CLIENT_SECRET=your_client_secret_here
```

## Available Tools

The server exposes the following tools:

### `get_athlete_profile`
Get the authenticated athlete's profile information.

### `get_athlete_stats`
Get detailed statistics including totals and recent activity counts.

### `list_activities`
List recent activities with optional pagination and time filtering.

**Parameters:**
- `before` (number): Unix timestamp to get activities before this time
- `after` (number): Unix timestamp to get activities after this time
- `page` (number): Page number (default: 1)
- `per_page` (number): Items per page (default: 30, max: 200)

### `get_activity`
Get detailed information about a specific activity.

**Parameters:**
- `id` (string, required): The activity ID
- `include_all_efforts` (boolean): Include all segment efforts

### `get_segment`
Get information about a specific segment.

**Parameters:**
- `id` (string, required): The segment ID

### `list_starred_segments`
List segments starred by the athlete.

**Parameters:**
- `page` (number): Page number
- `per_page` (number): Items per page

### `explore_segments`
Explore segments in a geographic area.

**Parameters:**
- `bounds` (string, required): Coordinates as `sw_lat,sw_lng,ne_lat,ne_lng`
- `activity_type` (string): Either `running` or `riding`
- `min_cat` (number): Minimum climb category (0-5)
- `max_cat` (number): Maximum climb category (0-5)

### `get_segment_efforts`
Get efforts on a specific segment.

**Parameters:**
- `segment_id` (string, required): The segment ID
- `start_date_local` (string): ISO 8601 formatted start date
- `end_date_local` (string): ISO 8601 formatted end date
- `per_page` (number): Items per page

## Development

### Build
```bash
npm run build
```

### Watch mode
```bash
npm run watch
```

### Run locally
```bash
npm start
```

## Token Expiration

Strava access tokens expire after 6 hours. To handle token refresh:

1. Store your refresh token securely
2. Implement token refresh logic using the Strava OAuth token endpoint
3. Or run `setup-auth.cjs` again to get fresh tokens

## Rate Limits

Strava API has rate limits:
- 100 requests per 15 minutes
- 1000 requests per day

Plan your usage accordingly.

## Troubleshooting

### "STRAVA_ACCESS_TOKEN environment variable is required"
Make sure you've set the access token in your MCP configuration or environment variables.

### "Strava API error: 401"
Your access token may have expired. Run `setup-auth.cjs` to get a new token.

### "Authorization Callback Domain" error
Ensure you've set the callback domain to `localhost` in your Strava API settings.

## Contributing

Contributions are welcome! Please feel free to submit a Pull Request.

## License

MIT License - see LICENSE file for details

## Resources

- [Strava API Documentation](https://developers.strava.com/docs/reference/)
- [Model Context Protocol](https://modelcontextprotocol.io/)
- [Strava API Settings](https://www.strava.com/settings/api)

TDQS

B3.4/5.0

Scored across 8 tools

Disambiguation5/5

Each tool has a clearly distinct purpose targeting specific resources and actions in the Strava domain. For example, get_activity retrieves a single activity by ID, while list_activities lists multiple activities; explore_segments searches segments by area, while get_segment gets a specific segment by ID. There is no overlap or ambiguity in functionality.

Naming Consistency5/5

All tool names follow a consistent verb_noun pattern with snake_case, such as get_activity, list_activities, explore_segments, and get_segment_efforts. This uniformity makes the tool set predictable and easy to understand for agents.

Tool Count5/5

With 8 tools, the server is well-scoped for interacting with Strava's API, covering athlete profiles, activities, and segments without being overwhelming. Each tool serves a distinct and necessary function, such as retrieving data or listing resources, making the count appropriate for the domain.

Completeness4/5

The tool set provides strong coverage for reading athlete data, activities, and segments, including CRUD-like operations like get and list. However, there are minor gaps, such as no tools for creating or updating activities or segments, which might limit full lifecycle management but are not critical for common query-focused workflows.

Maintenance

ActivityInactive
ResponsivenessNo issues