Strava MCP Server

by r-huijts

450 stars
338 downloads
Not rated
GitHub

About

A Model Context Protocol (MCP) server that connects to Strava API, providing tools to access Strava data through LLMs

Details

Author
r-huijts
GitHub stars
450
Downloads
338
Categories
Cloud Service, Infrastructure, Other

- Query activities, stats, and segments in natural language
- OAuth authentication with local credential storage
- 25 tools covering activities, segments, routes, and clubs
- Smart chunking and compact format for activity streams
- Token auto‑refresh with config file persistence

Setting up with Highlight

This MCP is not yet compatible with Highlight’s one-click setup. However, you can still use it with Highlight by following these steps:

  1. Download and install Highlight from highlightai.com/download
  2. Navigate to the plugins tab and select "Add Custom Plugin"
  3. Configure the plugin with the settings below
    Plugin Name Strava MCP Server
    Command (node, npx, python, etc.)

    Please refer to the README for specific instructions on how to obtain API keys or other required environment variables.

  4. Enable "Start Automatically" if you want the plugin to start when Highlight launches

From the repository

Add the server to your Claude Desktop configuration file (claude_desktop_config.json) using the npx command @r-huijts/strava-mcp-server. Alternatively, add it to Claude Code with claude mcp add. After restarting Claude, say “Connect my Strava account” to authorize via OAuth in a browser.

get-athlete-profile

Fetches the profile information for the authenticated athlete, including their unique numeric ID needed for other tools like get-athlete-stats.

get-athlete-stats

Fetches the activity statistics (recent, YTD, all-time) for a specific athlete using their ID. Requires the athleteId obtained from the get-athlete-profile tool.

get-activity-details

Fetches detailed information about a specific activity using its ID.

get-recent-activities

Fetches the most recent activities for the authenticated athlete.

list-athlete-clubs

Lists the clubs the authenticated athlete is a member of.

list-starred-segments

Lists the segments starred by the authenticated athlete.

get-segment

Fetches detailed information about a specific segment using its ID.

explore-segments

Searches for popular segments within a given geographical area.

star-segment

Stars or unstars a specific segment for the authenticated athlete.

get-segment-effort

Fetches detailed information about a specific segment effort using its ID.

list-segment-efforts

Lists the authenticated athlete's efforts on a specific segment, optionally filtering by date.

list-athlete-routes

Lists the routes created by the authenticated athlete, with pagination.

get-route

Fetches detailed information about a specific route using its ID.

export-route-gpx

Exports a specific Strava route in GPX format and saves it to a pre-configured local directory.

export-route-tcx

Exports a specific Strava route in TCX format and saves it to a pre-configured local directory.

get-activity-streams

Retrieves detailed time-series data streams from a Strava activity. Perfect for analyzing workout metrics, visualizing routes, or performing detailed activity analysis. Key Features: 1. Multiple Data Types: Access various metrics like heart rate, power, speed, GPS coordinates, etc. 2. Flexible Resolution: Choose data density from low (~100 points) to high (~10000 points) 3. Smart Pagination: Get data in manageable chunks optimized for LLM context limits 4. Rich Statistics: Includes min/max/avg for numeric streams 5. Dual Format Support: Compact (LLM-optimized) or verbose (human-readable) 6. Intelligent Downsampling: Automatically reduce large datasets while preserving key features Format Options: - compact (default): Raw arrays, minified JSON, ~70-80% smaller payloads, ideal for LLM processing - verbose: Human-readable objects with formatted values, backward compatible with legacy format Common Use Cases: - Analyzing workout intensity through heart rate zones - Calculating power metrics for cycling activities - Visualizing route data using GPS coordinates - Analyzing pace and elevation changes - Detailed segment analysis Output Format: 1. Metadata: Activity overview, available streams, data points, units, format info 2. Statistics: Summary stats for each stream type (max/min/avg where applicable) 3. Data: Time-series data in compact arrays or verbose objects (based on format parameter) Notes: - Requires activity:read scope - Not all streams are available for all activities - Older activities might have limited data - Large activities are automatically chunked to ~50KB per message - Use max_points parameter to downsample very large activities intelligently

get-activity-laps

Retrieves detailed lap data for a specific Strava activity. Use Cases: - Get complete lap data including timestamps, speeds, and metrics - Access raw values for detailed analysis or visualization - Extract specific lap metrics for comparison or tracking Parameters: - id (required): The unique identifier of the Strava activity. Output Format: Returns both a human-readable summary and complete JSON data for each lap, including: 1. A text summary with formatted metrics 2. Raw lap data containing all fields from the Strava API: - Unique lap ID and indices - Timestamps (start_date, start_date_local) - Distance and timing metrics - Speed metrics (average and max) - Performance metrics (heart rate, cadence, power if available) - Elevation data - Resource state information - Activity and athlete references Notes: - Requires activity:read scope for public/followers activities, activity:read_all for private activities - Returns complete data as received from Strava API without omissions - All numeric values are preserved in their original precision

get-athlete-zones

Retrieves the authenticated athlete's configured heart rate and power zones. Output includes both a formatted summary and the raw JSON data.

get-all-activities

Fetches complete activity history with optional filtering by date range and activity type. Supports pagination to retrieve all activities.

get-activity-photos

Retrieves photos associated with a specific Strava activity. Use Cases: - Fetch all photos uploaded to an activity - Get photo URLs for display or download - Access photo metadata including location and timestamps Parameters: - id (required): The unique identifier of the Strava activity. - size (optional): Size of photos to return in pixels (e.g., 100, 600, 2048). If not specified, returns all available sizes. Output Format: Returns both a human-readable summary and complete JSON data for each photo, including: 1. A text summary with photo count and URLs 2. Raw photo data containing all fields from the Strava API: - Photo ID and unique identifier - URLs for different sizes - Source (1 = Strava, 2 = Instagram) - Timestamps (uploaded_at, created_at) - Location coordinates if available - Caption if provided Notes: - Requires activity:read scope for public/followers activities, activity:read_all for private activities - Photos may come from Strava uploads or linked Instagram posts - Returns empty array if activity has no photos

get-server-version

Returns the Strava MCP server version and related metadata.

connect-strava

Connect your Strava account to enable activity tracking. This will open a browser window for secure authentication. Use this when the user asks to connect, link, or authenticate their Strava account.

disconnect-strava

Disconnect your Strava account and remove stored credentials. Use this when the user wants to logout, disconnect, or remove their Strava connection.

check-strava-connection

Check if Strava is connected and show the current connection status. Use this when the user asks about their connection status.

Claude Desktop / Cursor

Paste into your MCP client config file to install this server.

{
    "mcpServers": {
        "strava mcp server": {
            "strava": {
                "command": "npx",
                "args": [
                    "-y",
                    "@r-huijts/strava-mcp-server"
                ]
            }
        }
    }
}

McpServers

{
    "strava": {
        "command": "npx",
        "args": [
            "-y",
            "@r-huijts/strava-mcp-server"
        ]
    }
}
# Strava MCP Server **Talk to your Strava data using AI.** Connect Claude to your Strava account and ask questions in plain English: "How far did I run this month?", "Analyze my last ride", or "Show me my fastest segments." [![MseeP.ai Security Assessment Badge](https://mseep.net/pr/r-huijts-strava-mcp-badge.png)](https://mseep.ai/app/r-huijts-strava-mcp) <a href="https://glama.ai/mcp/servers/@r-huijts/strava-mcp"> <img width="380" height="200" src="https://glama.ai/mcp/servers/@r-huijts/strava-mcp/badge" alt="Strava Server MCP server" /> </a> --- ## What Can You Do With This? Once connected, just talk to Claude like you're talking to a friend who has access to all your Strava data: ### 🏃 Track Your Progress > "How many kilometers did I run this month?" > > "Compare my running stats from January to December" > > "What's my longest ride ever?" ### 📊 Analyze Your Workouts > "Break down my last cycling workout - show me power, heart rate, and cadence" > > "How did my heart rate zones look during yesterday's run?" > > "What was my average pace for each lap in my interval training?" ### 🗺️ Explore Routes & Segments > "What are the most popular cycling segments near Central Park?" > > "Show me my starred segments" > > "Export my Sunday morning route as a GPX file" ### 🏆 Get Coaching Insights > "Analyze my training load this week" > > "How does my current fitness compare to last month?" > > "Give me a summary of my cycling performance this year" --- ## Quick Start (3 Steps) ### Step 1: Add to Claude Desktop Open your Claude Desktop configuration file: - **Mac**: `~/Library/Application Support/Claude/claude_desktop_config.json` - **Windows**: `%APPDATA%\Claude\claude_desktop_config.json` Add this to the file: ```json { "mcpServers": { "strava": { "command": "npx", "args": ["-y", "@r-huijts/strava-mcp-server"] } } } ``` ### Step 1 (alternative): Add to Claude Code You can add this MCP server to claude code with the following command: ``` claude mcp add --transport stdio strava -- npx @r-huijts/strava-mcp-server ``` You can confirm successful instalation as follows: ``` % claude mcp list Checking MCP server health... strava: npx @r-huijts/strava-mcp-server - ✓ Connected ``` ### Step 2: Restart Claude Desktop Close and reopen Claude Desktop to load the new configuration. ### Step 3: Connect Your Strava Just say to Claude: > **"Connect my Strava account"** A browser window will open. Enter your Strava API credentials, authorize the app, and you're done! **That's it!** Start asking about your activities. --- ## Connecting Your Strava Account ### First Time Setup When you say "Connect my Strava account", here's what happens: 1. **A browser window opens** showing a setup page 2. **Enter your Strava API credentials** (Client ID and Client Secret) 3. **Click "Continue to Strava"** - you'll be redirected to Strava 4. **Authorize the app** on Strava's website 5. **See the success message** - you can close the browser 6. **Done!** Claude confirms you're connected Your credentials are saved locally at `~/.config/strava-mcp/config.json` and persist across sessions. ### Getting Your Strava API Credentials You need to create a free Strava API application (one-time setup): 1. Go to [strava.com/settings/api](https://www.strava.com/settings/api) 2. Click "Create an App" (or view your existing app) 3. Fill in the form: - **Application Name**: Anything you want (e.g., "My Claude Assistant") - **Category**: Choose any - **Website**: Can be anything (e.g., `http://localhost`) - **Authorization Callback Domain**: Must be `localhost` 4. Copy your **Client ID** and **Client Secret** That's it! You only need to do this once. ### Managing Your Connection - **Check status**: "Am I connected to Strava?" - **Reconnect**: "Connect my Strava account" (use `force: true` to reconnect) - **Disconnect**: "Disconnect my Strava account" --- ## Installation Options ### Option A: Just Use It (Recommended) No installation needed! The `npx` command in the Quick Start automatically downloads and runs the latest version. ### Option B: Install Globally If you prefer to install it once: ```bash npm install -g @r-huijts/strava-mcp-server ``` Then update your Claude config to use: ```json { "mcpServers": { "strava": { "command": "strava-mcp-server" } } } ``` **Note:** Even though the package name is `@r-huijts/strava-mcp-server`, the executable name remains `strava-mcp-server` for backward compatibility. ### Option C: Build from Source For developers who want to modify the code: ```bash git clone https://github.com/r-huijts/strava-mcp.git cd strava-mcp npm install npm run build ``` Then point Claude to your local build: ```json { "mcpServers": { "strava": { "command": "node", "args": ["/path/to/strava-mcp/dist/server.js"] } } } ``` --- ## Example Conversations ### Morning Check-in > **You**: What did I do for exercise this week? > > **Claude**: Looking at your Strava activities this week, you completed: > - Monday: 5.2km run (28:15) > - Wednesday: 45km bike ride (1:32:00) > - Saturday: 10km run (52:30) > > Total: 60.2km across 3 activities. Nice consistency! ### Workout Analysis > **You**: Analyze my last cycling workout in detail > > **Claude**: Here's a breakdown of your ride "Evening Loop" from yesterday: > > **Overview** > - Distance: 42.3 km > - Time: 1:28:45 > - Avg Speed: 28.6 km/h > > **Power Analysis** > - Average Power: 185W > - Normalized Power: 198W > - Max Power: 520W > > **Heart Rate** > - Average: 142 bpm > - Max: 175 bpm > - Time in Zone 4+: 23 minutes > > Your power-to-heart-rate ratio suggests good aerobic efficiency... ### Finding New Routes > **You**: Find me some challenging cycling climbs near Boulder, Colorado > > **Claude**: Here are popular climbing segments near Boulder: > > 1. **Flagstaff Road** - 5.2km, 6.8% avg grade > 2. **Sunshine Canyon** - 3.8km, 7.2% avg grade > 3. **Left Hand Canyon** - 8.1km, 4.5% avg grade > > Want me to star any of these so you can find them easily later? --- ## Available Tools ### Account & Profile | What you can ask | What it does | |------------------|--------------| | "Connect my Strava account" | Links your Strava to Claude | | "Check my Strava connection" | Shows connection status | | "Disconnect my Strava account" | Unlinks Strava and clears stored tokens | | "Get my Strava profile" | Shows your profile info | | "What shoes do I have?" | Lists your shoes and usage distance | | "What are my training zones?" | Shows HR and power zones | ### Activities | What you can ask | What it does | |------------------|--------------| | "Show my recent activities" | Lists your latest workouts | | "Get all my runs from January" | Fetches activities with filters | | "Analyze activity 12345" | Detailed info about one activity | | "Show the laps from my last run" | Lap-by-lap breakdown | | "Get heart rate data from my ride" | Time-series workout data (optimized compact format) | | "Show photos from my hike" | Activity photos | ### Stats & Progress | What you can ask | What it does | |------------------|--------------| | "What are my running stats?" | YTD and all-time totals | | "How far have I cycled this year?" | Activity totals by type | | "What's my longest ride?" | Personal records | ### Segments | What you can ask | What it does | |------------------|--------------| | "Show my starred segments" | Your favorite segments | | "Find segments near [location]" | Discover popular segments | | "Get details on segment 12345" | Segment info and leaderboard | | "Star this segment" | Save to favorites | | "Show my efforts on [segment]" | Your attempts on a segment | ### Routes | What you can ask | What it does | |------------------|--------------| | "List my saved routes" | Your created routes | | "Get details for my [route name]" | Route info | | "Export [route] as GPX" | Download for GPS devices | | "Export [route] as TCX" | Download for GPS devices | ### Clubs | What you can ask | What it does | |------------------|--------------| | "What clubs am I in?" | Lists your Strava clubs | ### Workouts | What you can ask | What it does | |------------------|--------------| | "Turn this workout into a Zwift file" | Formats a workout plan into a structured file (currently Zwift `.zwo`) | ### Server | What you can ask | What it does | |------------------|--------------| | "What version is the Strava server?" | Shows the MCP server version and metadata | --- ## Troubleshooting ### "Connect my Strava account" doesn't open a browser - Make sure Claude Desktop is running the MCP server (check for errors in Claude) - Try restarting Claude Desktop - Check that port 8111 isn't blocked by a firewall ### "Authentication failed" or "Invalid token" - Your token may have expired - say "Connect my Strava account" to reconnect - Make sure your Strava API application is still active at [strava.com/settings/api](https://www.strava.com/settings/api) ### "Missing credentials" error - You need to complete the OAuth flow - say "Connect my Strava account" - If you're using environment variables, make sure all 4 are set (see Developer section) ### Claude doesn't see the Strava tools - Make sure your `claude_desktop_config.json` is valid JSON (no trailing commas!) - Restart Claude Desktop after making config changes - Check Claude's developer console for error messages ### JSONRPC.ProtocolTransportError after package name change If you're getting a JSONRPC error after updating to `@r-huijts/strava-mcp-server`: 1. **Clear npx cache**: Run `rm -rf ~/.npm/_npx` in terminal 2. **Verify config** uses `@r-huijts/strava-mcp-server` (not the old `strava-mcp-server`) 3. **Restart Claude Desktop** completely (quit and reopen) 4. **Test manually**: Run `npx -y @r-huijts/strava-mcp-server` - you should see "Starting Strava MCP Server v1.2.1..." --- ## For Developers <details> <summary>Click to expand technical details</summary> ### Environment Variables Instead of using the browser-based auth, you can set environment variables: | Variable | Description | |----------|-------------| | `STRAVA_CLIENT_ID` | Your Strava Application Client ID | | `STRAVA_CLIENT_SECRET` | Your Strava Application Client Secret | | `STRAVA_ACCESS_TOKEN` | OAuth access token | | `STRAVA_REFRESH_TOKEN` | OAuth refresh token | | `ROUTE_EXPORT_PATH` | Directory for GPX/TCX exports | ### Token Refresh The server automatically refreshes expired tokens. New tokens are saved to both `process.env` and `~/.config/strava-mcp/config.json`. ### Config Priority 1. Environment variables (highest) 2. `~/.config/strava-mcp/config.json` 3. Local `.env` file ### Building & Testing ```bash npm install npm run build npm test ``` ### Activity Streams Optimization The `get-activity-streams` tool uses a compact format by default, reducing payload size by ~70-80% while preserving all data: - **Compact format** (default): Raw arrays with metadata, ~70-80% smaller, ideal for LLM processing - **Verbose format**: Human-readable objects with formatted values (backward compatible) - **Smart chunking**: Large activities automatically split into ~50KB chunks - **Optional downsampling**: Can reduce very large datasets while preserving key features The compact format includes comprehensive metadata (units, descriptions, statistics) so LLMs can understand the raw numeric data. ### API Reference The server implements the Model Context Protocol (MCP) and exposes 25 tools for Strava API v3. See the source code in `src/tools/` for implementation details. ### Contributing Contributions welcome! Please submit a Pull Request. </details> --- ## License MIT License - see LICENSE file for details. --- **Questions?** Open an issue on [GitHub](https://github.com/r-huijts/strava-mcp/issues).
No reviews yet — be the first

Sign in to leave a review

Use Google, GitHub, or an email account so ratings stay tied to real people.

Email sign in

No reviews posted yet.