Strava MCP
Strava MCP Server
Strava MCP server: an agent reads your workouts, heart rate, power, segments and routes and exports routes to GPX and TCX
- 503 ★ on the repository
- Last commit
- MIT
Broad access
Why this level
- Stores the Strava Client Secret and tokens as open JSON in the home folder
- Reads personal data such as heart rate, power, routes and workout photos and passes it to the model
- Requests the `profile:write` scope and can star and unstar segments
Install
- Works in
In your terminal, with SkillFoxx CLI
npx skillfoxx add mcp/strava-mcp-serverDetects the agents on your machine, shows the access level and pins the version.
Other ways to install
Access and checks
How we reviewBroad accessThe tool can change data, run commands or handle secrets.
- Stores the Strava Client Secret and tokens as open JSON in the home folder
- Reads personal data such as heart rate, power, routes and workout photos and passes it to the model
- Requests the `profile:write` scope and can star and unstar segments
This is third-party code. Review the repository files before installing.
What it does
The Node.js server works through the Strava API v3 over stdio and gives an agent 25 tools. It returns the profile and stats: athlete data, year and all-time totals, heart rate and power zones, shoes with mileage and clubs. For workouts it returns recent activities and selections by type and dates, one workout's details, laps and photos, plus data streams (heart rate, power, cadence, altitude) in a compact format that can be split into chunks and downsampled. In the segments area the agent searches popular segments around a point, reads the leaderboard and your efforts, lists starred segments and stars or unstars one. In the routes area it fetches saved routes and exports them to GPX and TCX. A separate tool turns a workout description into a Zwift `.zwo` file. The first run goes like this: the agent calls connect, a page opens on local port 8111 where you enter the Client ID and Client Secret of your own Strava app and approve access on the Strava site. The server refreshes tokens by itself.
Who it is for. For runners, cyclists and coaches who log workouts in Strava and want to analyze load, pace and heart rate by asking an agent in Claude Desktop or Claude Code.
Good fit when
- You want a month or year summary: kilometers, moving time, the longest ride, week-to-week comparison
- After a workout you want heart rate, power and cadence through the ride and pace per lap of interval work
- You want to find strong segments near a city or see how you do on them against the leaderboard
- You need a Strava route as a GPX or TCX file for a bike computer or a watch
- A workout plan drafted in the conversation should become a Zwift file
Not a fit when
- Your workouts live outside Strava, for example only in Garmin Connect: the garmin_mcp entry covers that
- Your health data sits in the Apple Health app rather than Strava: you need the apple-health-mcp entry
- You cannot create an app in your Strava developer account: the server works only with your own Client ID and Client Secret
- You need to add or edit the workouts themselves in Strava: the server has no tool for writing activities, only segment stars change
- Your agent cannot start local stdio servers with `npx`: the server connects only that way
Example request
How many kilometers did I run this month and how did my heart rate change on my last long workout?MCP
- Transport
- stdio
- Authentication
- OAuth
Environment variables
STRAVA_CLIENT_ID- Client ID of the Strava app if you skip the connection window
STRAVA_CLIENT_SECRETsecret- Client Secret of the Strava app
STRAVA_ACCESS_TOKENsecret- OAuth access token
STRAVA_REFRESH_TOKENsecret- OAuth refresh token
ROUTE_EXPORT_PATH- Folder for GPX and TCX route exports
Limitations
The project is unofficial and has no link to Strava. MIT License, package version 1.2.1, Node.js 18 or newer is required.
To start you must create your own Strava app at `strava.com/settings/api`; set the callback domain to `localhost`. The server asks for the `profile:read_all`, `activity:read_all`, `activity:read` and `profile:write` scopes.
Client ID, Client Secret and tokens sit as open JSON in `~/.config/strava-mcp/config.json`. The order of sources is environment variables, this file, then a local `.env`. While connecting, a temporary local server runs on port 8111, so the port must be free.
Workout data includes routes and map points, and everything the agent reads enters the conversation with the model.
The repository has no tests against a real account: the tests rely on saved sample responses, and a separate script checks the server over stdio.
How to disable. Tell the agent to disconnect your Strava account: the disconnect tool deletes the stored tokens. Then remove the `strava` block from `claude_desktop_config.json` or run `claude mcp remove strava`, and revoke the app's access in your Strava settings.
FAQ
How do I connect the server to Claude Desktop?
Add a `strava` server to `claude_desktop_config.json` with the `npx` command and the arguments `-y` and `@r-huijts/strava-mcp-server`, then restart Claude Desktop and say Connect my Strava account. The file is in `~/Library/Application Support/Claude` on Mac and `%APPDATA%\Claude` on Windows.
How do I connect the server to Claude Code?
Run `claude mcp add --transport stdio strava -- npx @r-huijts/strava-mcp-server` and check with `claude mcp list`: the server should show a Connected mark.
Which settings does the Strava app need?
Any name and category, the website can be `http://localhost`, and the callback domain must be `localhost`. After creating it, copy the Client ID and Client Secret.
Can I skip the browser window?
Yes. Set the `STRAVA_CLIENT_ID`, `STRAVA_CLIENT_SECRET`, `STRAVA_ACCESS_TOKEN` and `STRAVA_REFRESH_TOKEN` environment variables. They take priority over the `config.json` file.
Where are exported routes saved?
In the folder from the `ROUTE_EXPORT_PATH` variable. There are two formats, GPX and TCX, both for bike computers and watches.
Why do workout data streams arrive in a compact form?
By default the streams tool returns arrays with metadata, which is 70–80% smaller than the verbose format. It cuts large workouts into chunks of about 50 KB and downsamples points when needed.
Discussion
No questions or reviews yet.
Related
MCP serversAn MCP server for workout tracking: Claude Desktop, Cursor and Cline read routines, sets, body weight and 1RM from your self-hosted openGym
Garmin MCP
garmin-mcp
Garmin Connect data for an agent: activities, health, editing names and notes. Works through the unofficial python-garminconnect library
Plane MCP Server: project management in Plane
Plane MCP Server
Official Plane MCP server: the agent manages projects, work items, cycles and releases through 30 tools
Yandex Tracker MCP in Yandex AI Studio
Яндекс Трекер в MCP Hub
A Yandex AI Studio MCP Hub template: an agent reads Tracker issue links, creates issues, comments and goals and bulk-changes statuses and queues
The official Todoist MCP server: the agent finds, creates and updates tasks and projects in your account
A Yandex Tracker MCP server: queues, issues, comments, status transitions, sprints and search in Tracker query language
Comparison with similar tools
Entries that share the main search query, and how they differ.
| Entry | Official | Authentication | Repository stars | Main difference |
|---|---|---|---|---|
| Strava MCP (this entry) | no | OAuth | 503 | |
| Garmin MCP | no | API key | 1,426 | Garmin Connect data through the python-garminconnect library, with name and note edits |
| Apple Health MCP Server | no | not required | 575 | Apple Health data on sleep, workouts and heart rate, with SQL queries over an export |
README in short
The repository gives sample questions by area: progress, workout analysis, routes and segments, coaching insights. It continues with a three-step quick start for Claude Desktop and Claude Code, getting the Strava app keys, three ways to install and tables of tools by group. There is a breakdown of common errors in `TROUBLESHOOTING.md`, a list of environment variables, a description of token refresh and data stream compression, a changelog and tests in the `tests` folder.