Health & fitness
Trainerize
Clients, programs, check-ins and messages for your Trainerize business.
14 endpoints
Read your Strava activities, gear and club records through MCP or REST. Connect an AI agent or create a private activity reporting workflow with HTTP requests.
11 tools Read and write
Strava has an official API and, since 1 June 2026, an official MCP connector (checked 27 Oct 2026). The MCP is read-only, works with Claude only and needs a paid Strava subscription, with no separate fee. Cotlet runs 11 Strava tools hosted, 5 of them writes, over MCP for agents and REST for scripts.
| What you need | Official MCP | Strava API | Cotlet |
|---|---|---|---|
| Read activities, gear and clubs | Yes, with a subscription | Yes, with a subscription | Yes |
| Edit gear, title or privacy | No, read-only | Yes, one call each | Yes, one activity at a time |
| Read a club leaderboard | Club data, no tool list | Club endpoints deprecated | Yes |
| Post a comment | No | Not in the reference | Yes, after your OK |
| Use it from ChatGPT, Cursor or n8n | Claude only for now | Bans AI use of the data | Any MCP client or REST |
| Allowed by Strava's terms | Yes, official | Yes, but not for AI | No, automated access |
Checked 27 Oct 2026. Sources: Strava Press: Strava Launches MCP Connector (1 June 2026) · Strava Help: What Is the Strava MCP Connector? · Strava Community Hub: An Update To Our Developer Program · Strava API Policy (effective 1 June 2026) · Strava Help: Bulk editing activities
Use your own account in its Cotlet Cloud Browser.
Connect your agent or create a Cotlet API key.
Ask your agent or send an HTTP request.
We never keep your Strava password, and no comment or new activity goes out until you approve it. Who can see your session
Use MCP with your AI agent, or HTTP requests in n8n, Make, Zapier and scripts. Follow the MCP setup below or jump to the REST guide.
Enable Strava for agents. Sign up, log in to Strava in its Cloud Browser, then press Enable for agents.
Paste the Cotlet address. Add https://cotlet.dev/mcp/v1 as an MCP server or connector in your agent.
Approve the connection. Chat apps ask you to sign in to Cotlet. Editors, n8n and scripts use an API key from the console.
One shared address, https://cotlet.dev/mcp/v1, also carries Strava next to your other apps. If you enable Strava after connecting, refresh the connector so the new tools show up.
Settings > Connectors > Add custom connector
URL: https://cotlet.dev/mcp/v1/connect
Claude Code:
claude mcp add --transport http cotlet-strava \
https://cotlet.dev/mcp/v1 \
--header "Authorization: Bearer $COTLET_API_KEY" Settings > Apps & Connectors > Create
MCP server URL: https://cotlet.dev/mcp/v1/connect
Authentication: OAuth // ~/.cursor/mcp.json
{
"mcpServers": {
"cotlet-strava": {
"url": "https://cotlet.dev/mcp/v1",
"headers": { "Authorization": "Bearer ${env:COTLET_API_KEY}" }
}
}
} # ~/.codex/config.toml
[mcp_servers.cotlet-strava]
url = "https://cotlet.dev/mcp/v1"
bearer_token_env_var = "COTLET_API_KEY" MCP Client Tool (inside an AI Agent)
Transport: HTTP Streamable
URL: https://cotlet.dev/mcp/v1
Auth: Bearer, <your key>
Tool: strava_read Make: MCP Client > Call a tool
Zapier: MCP Client by Zapier > Run Tool
Server URL: https://cotlet.dev/mcp/v1
Token: <your key>
Tool: strava_write Create a Cotlet API key with access to Strava and its read operations. Store it as COTLET_API_KEY in your environment or automation platform's credential store.
Sign in to Strava in its Cotlet Cloud Browser and enable the app for agents. Use your own Strava account; private activities remain account data to handle in your chosen private destination.
curl https://cotlet.dev/api/v1/strava/activities \
-H "Authorization: Bearer $COTLET_API_KEY" A successful REST call puts the tool output in result. This illustrative response excerpt omits call IDs, messages and credit details.
{
"status": "success",
"app": "strava",
"tool": "list_activities",
"result": {
"activities": [
{
"activity_id": "14820593112",
"title": "Morning run",
"sport": "Run",
"date": "2026-10-26",
"distance_km": 10.4,
"moving_time": "52:10",
"gear": "Pegasus 41",
"visibility": "followers",
"kudos": 12,
"comments": 3
}
],
"next_cursor": null
}
} Read result.activities and pass the returned next_cursor unchanged as cursor until it is empty. Preserve sport, date and missing-gear filters; no page-size input is exposed.
Your own activity list includes Only You activities. Keep those records in a private destination and compare gear, visibility and engagement counts as well as IDs.
distance_km uses kilometers; moving_time is formatted time rather than numeric minutes. These activity reads do not return GPS, power or other streams.
| Tool | Connect through | Example workflow |
|---|---|---|
| n8n | HTTP Request | Read activities and activity details into a private gear and activity report, retaining visibility settings. |
| Make | HTTP > Make a request | Read gear records into a shoe and bike distance review without updating equipment. |
| Python or Node.js | REST API | Read clubs and their leaderboards into a dated club-distance digest for your chosen destination. |
Send Authorization: Bearer <your Cotlet API key> in request headers. You configure the schedule, destination and record comparisons.
Cotlet reads Strava; your workflow steps write to your chosen destination. These HTTP workflows do not require a native Cotlet connector or a prebuilt template.
Python and Node.js can use the same HTTP requests without an AI agent. Keep access keys in credentials, outside shared workflow exports.
The API and MCP reference lists operations and inputs. The REST API guide explains authentication, errors and approvals.
Reads come from your My Activities list. Streams, GPS tracks and power data are not returned. Strava has no bulk edit, so a change to many activities is one call each.
Returns the activity ID, title, sport, date, distance in km, moving time, gear name, visibility, and kudos and comment counts for each row, newest first. The tool reads the My Activities list, so it sees your own activities only, including those set to Only You. Follow next_cursor until it is empty to read a long history. Streams, GPS tracks and power data are not returned.
MCP callstrava_read → list_activities
REST endpointGET https://cotlet.dev/api/v1/strava/activities
| Name | Type | Description |
|---|---|---|
| sport string | string | Sport filter as My Activities shows it, for example Run or Ride. Omit for all sports. |
| since string | string | Only activities on or after this date, ISO 8601. |
| until string | string | Only activities on or before this date, ISO 8601. |
| missing_gear boolean | boolean | When true, return only activities with no gear set. |
| cursor string | string | Next page cursor from the previous call. |
{
"activities": [
{
"activity_id": "14820593112",
"title": "Morning run",
"sport": "Run",
"date": "2026-10-26",
"distance_km": 10.4,
"moving_time": "52:10",
"gear": "Pegasus 41",
"visibility": "followers",
"kudos": 12,
"comments": 3
},
{
"activity_id": "14812207745",
"title": "Hill repeats",
"sport": "Run",
"date": "2026-10-24",
"distance_km": 8.1,
"moving_time": "47:32",
"gear": null,
"visibility": "followers",
"kudos": 4,
"comments": 0
},
{
"activity_id": "14799031860",
"title": "Easy spin",
"sport": "Ride",
"date": "2026-10-22",
"distance_km": 24.8,
"moving_time": "1:12:05",
"gear": null,
"visibility": "everyone",
"kudos": 7,
"comments": 1
}
],
"next_cursor": null
} Returns the title, description, sport, start time, distance, elevation gain, moving and elapsed time, gear, visibility, whether heart rate is hidden, and the kudos and comment counts. Private notes and the full list of kudos givers are not returned. Works for your own activities only.
MCP callstrava_read → get_activity
REST endpointGET https://cotlet.dev/api/v1/strava/activities/{activity_id}
| Name | Type | Description |
|---|---|---|
| activity_id string required | string | Activity ID from list_activities. |
{
"activity_id": "activity_8c41d2"
} {
"activity_id": "14820593112",
"title": "Morning run",
"description": "Easy loop by the river.",
"sport": "Run",
"start": "2026-10-26T06:41:00",
"distance_km": 10.4,
"elevation_gain_m": 62,
"moving_time": "52:10",
"gear": "Pegasus 41",
"visibility": "followers",
"heart_rate_hidden": false,
"kudos": 12,
"comments": 3
} Saves the fields you pass and leaves the rest as they are. Returns the activity as it is after the save. It does not change visibility, so it reaches nobody new and is undone by calling it again with the old values, which is why it does not ask first. For many activities the agent calls it once per activity, because Strava has no bulk edit for gear.
MCP callstrava_write → update_activity
REST endpointPATCH https://cotlet.dev/api/v1/strava/activities/{activity_id}
| Name | Type | Description |
|---|---|---|
| activity_id string required | string | Activity ID from list_activities. |
| title string | string | New title. |
| description string | string | New description. |
| gear_id string | string | Gear ID from list_gear. The gear must already exist in your profile. |
| sport string | string | Sport as the edit screen lists it, for example Run or Ride. |
{
"activity_id": "14812207745",
"gear_id": "g8812034"
} {
"activity_id": "14812207745",
"title": "Hill repeats",
"gear": "Pegasus 41",
"sport": "Run",
"saved": true
} Changes who can see one activity. Moving an activity from Everyone to Followers or Only You removes its segment achievements, and Strava does not give them back. Returns the new setting. By default you confirm each call; you can switch that off for this tool.
MCP callstrava_write → set_activity_visibility
REST endpointPUT https://cotlet.dev/api/v1/strava/activities/{activity_id}/visibility
| Name | Type | Description |
|---|---|---|
| activity_id string required | string | Activity ID from list_activities. |
| visibility string required | string | everyone, followers or only_you. |
{
"activity_id": "activity_8c41d2",
"visibility": "visibility"
} {
"activity_id": "14799031860",
"visibility": "only_you",
"saved": true
} Creates the activity from the web form and returns its ID and link. The website cannot edit start time, distance, duration or elevation of a manual activity afterwards, so a wrong entry has to be deleted by hand and created again. A new activity shows in your followers' feeds. By default you confirm each call; you can switch that off for this tool.
MCP callstrava_write → create_manual_activity
REST endpointPOST https://cotlet.dev/api/v1/strava/manual-activities
| Name | Type | Description |
|---|---|---|
| title string required | string | Activity title. |
| sport string required | string | Sport as the manual entry form lists it, for example Run or Ride. |
| start string required | string | Start date and time, ISO 8601, in your Strava time zone. |
| duration_minutes number required | number | Elapsed time in minutes. |
| distance_km number | number | Distance in km. |
| gear_id string | string | Gear ID from list_gear. |
{
"title": "title",
"sport": "sport",
"start": "start",
"duration_minutes": 1
} {
"activity_id": "14831550204",
"title": "Easy run",
"sport": "Run",
"start": "2026-10-26T18:30:00",
"distance_km": 5.2,
"url": "https://www.strava.com/activities/14831550204"
} Replies are posted under your name and no tool deletes them.
Returns the comment ID, author name, text and time for each comment, oldest first. Use it before comment_on_activity so the agent answers the open question and not one you already answered.
MCP callstrava_read → list_activity_comments
REST endpointGET https://cotlet.dev/api/v1/strava/activity-comments
| Name | Type | Description |
|---|---|---|
| activity_id string required | string | Activity ID from list_activities. |
| cursor string | string | Next page cursor from the previous call. |
{
"activity_id": "activity_8c41d2"
} {
"comments": [
{
"comment_id": "3301145",
"author": "Dana K.",
"text": "Nice pace! Which shoes?",
"posted_at": "2026-10-26T08:12:00"
},
{
"comment_id": "3301190",
"author": "Tom R.",
"text": "See you Saturday?",
"posted_at": "2026-10-26T09:40:00"
}
],
"next_cursor": null
} Posts the comment under your name and returns its ID. Anyone who can see the activity can read it, and no tool deletes it, so remove a wrong comment by hand in Strava. By default you confirm each call; you can switch that off for this tool.
MCP callstrava_write → comment_on_activity
REST endpointPOST https://cotlet.dev/api/v1/strava/activities/{activity_id}/replies
| Name | Type | Description |
|---|---|---|
| activity_id string required | string | Activity ID from list_activities. |
| text string required | string | Comment text. |
{
"activity_id": "activity_8c41d2",
"text": "text"
} {
"comment_id": "3301302",
"activity_id": "14820593112",
"text": "Thanks Dana, Pegasus 41. Saturday works for me.",
"posted_at": "2026-10-27T07:05:00"
} Gear mileage is what Strava counts from assigned activities. A club leaderboard covers this week and last week only.
Returns the gear ID, name, type (bike or shoes), total distance in km, and whether it is your default for a sport, as the My Gear page shows them. Strava has no field to enter gear mileage by hand, so the distance comes from the activities assigned to the item.
MCP callstrava_read → list_gear
REST endpointGET https://cotlet.dev/api/v1/strava/gears
No parameters.
{
"gear": [
{
"gear_id": "g8812034",
"name": "Pegasus 41",
"type": "shoes",
"distance_km": 412.6,
"default_for": [
"Run"
]
},
{
"gear_id": "g7740291",
"name": "Gravel bike",
"type": "bike",
"distance_km": 3180.2,
"default_for": [
"Ride"
]
}
]
} Returns the club ID, name, sport type, member count and your role (member or admin) for each club. The club ID feeds get_club_leaderboard.
MCP callstrava_read → list_clubs
REST endpointGET https://cotlet.dev/api/v1/strava/clubs
No parameters.
{
"clubs": [
{
"club_id": "921004",
"name": "Riverside Runners",
"sport": "Running",
"members": 214,
"role": "admin"
},
{
"club_id": "655871",
"name": "Saturday Gravel",
"sport": "Cycling",
"members": 58,
"role": "member"
}
]
} Returns the ranked members with the stats Strava shows. A single-sport club ranks by distance and a multisport club by time. The website shows the top 100 members. Strava keeps no leaderboard history beyond last week, so a weekly run is the only way to build one.
MCP callstrava_read → get_club_leaderboard
REST endpointGET https://cotlet.dev/api/v1/strava/clubs/{club_id}/leaderboard
| Name | Type | Description |
|---|---|---|
| club_id string required | string | Club ID from list_clubs. |
| week string | string | this or last. Defaults to last. |
{
"club_id": "club_8c41d2"
} {
"club": "Riverside Runners",
"week": "last",
"ranked_by": "distance",
"members": [
{
"rank": 1,
"name": "Dana K.",
"distance_km": 62.4,
"activities": 5,
"time": "5:31:10"
},
{
"rank": 2,
"name": "Sam R.",
"distance_km": 55,
"activities": 4,
"time": "4:58:42"
},
{
"rank": 3,
"name": "Lena P.",
"distance_km": 48.7,
"activities": 4,
"time": "4:41:03"
}
]
} Asks Strava for the account archive and cannot open the email it sends.
Presses Request download under Settings, My Account, Download your account. Strava emails the link to your account address, which can take a few hours, and the agent cannot open that email. The request reaches only you and nothing needs undoing, so it does not ask first.
MCP callstrava_write → request_account_export
REST endpointPOST https://cotlet.dev/api/v1/strava/account-export/request
No parameters.
{
"requested": true,
"delivery": "email to your Strava address, can take a few hours"
} Your logged-in Strava profile, encrypted with AES-256-GCM, in Finland. Not the password.
The 11 Strava tools. Never the cookie.
Your activities, including Only You ones, gear, clubs and comments.
Subscription, payments, password, privacy zones, deleting.
A code or CAPTCHA is for you. You type it in, we never do.
Disable for agents, reset the browser, or log out sessions in Strava.
Our site scores A+ on Qualys SSL Labs, securityheaders.com and Mozilla Observatory (live results). There is no SOC 2 report or third-party pentest yet.
"Automated access to or collection of data from the Services, by any means, including data mining, robots, screen scraping, scripts, or similar data-gathering tools or software such as browser extensions and crawlers, is prohibited. This prohibition applies regardless of whether you are logged into a Strava account at the time of such automated access or collection."
Strava says it acts on violations with "a warning, a temporary account suspension, and for more serious offenses, a permanent suspension", and you can appeal. Strava also names scraping as a problem that "degraded platform performance for everyone". Cotlet works through the Strava web app for one account, and Strava can still read that as automation. We found no public case of a Strava account closed for it (checked 27 Oct 2026). Do not connect an account you cannot afford to lose.
Edit many activities over days, not in one burst, and keep your agent to your own account and clubs.
Strava is also reworking its API through June 2027 (developer program post, 1 Jun 2026). When it moves a button or renames a field, the fix happens on our side and your prompts keep working. status.cotlet.dev watches the site, console and API every 3 minutes.
| Action | Undo |
|---|---|
| Change gear, title or description | Call update_activity with the old value |
| Set visibility | Set it back; segment achievements lost on the way to Followers or Only You stay lost |
| Log a manual activity | Delete it by hand; the website cannot edit its distance or time |
| Post a comment | Delete it by hand in Strava |
| Request an export | Nothing to undo, only the email goes to you |
3 of 11 tools ask first: comment_on_activity, create_manual_activity and set_activity_visibility, the ones others can see. A gear or title fix is undone in one call, and an export request reaches only you, so they run at once. Switch the wait off per tool for a scheduled run.
Strava applies a bulk privacy change to all past activities at once and cannot reverse it. Cotlet changes one activity per call.
{
"name": "update_activity",
"arguments": {
"activity_id": "14812207745",
"gear_id": "g8812034"
}
} curl -X PATCH https://cotlet.dev/api/v1/strava/activities/14812207745 \
-H "Authorization: Bearer $COTLET_API_KEY" \
-H "Content-Type: application/json" \
-d '{"gear_id":"g8812034"}' {
"activity_id": "14812207745",
"title": "Hill repeats",
"gear": "Pegasus 41",
"sport": "Run",
"saved": true
} Scripts and cron jobs reach the same tools over REST at /api/v1/strava, with the same key and price. A gear ID that is not in your profile fails, and a failed call costs nothing. The tools table lists the REST path of each tool.
About $16 a monthfor an athlete who fixes gear weekly and answers comments daily, 2,700 credits. Your Strava account is billed by Strava as before.
| Job | Calls | Credits |
|---|---|---|
| Fix gear on 6 activities, weekly | 8 × 4 | 320 |
| Club leaderboard, weekly | 2 × 4 | 80 |
| Shoe and bike mileage, weekly | 1 × 4 | 40 |
| Comment replies on 3 activities, daily | 6 × 12 | 720 |
| Log a missed workout | 1 × 4 | 40 |
| Cloud Browser, 30 days | 1,500 | |
| Total | 2,700 |
The month is our example: 12 activities a month, a club leaderboard each week. For comparison, Strava's own MCP adds no fee but needs a paid Strava subscription, and so does its API. Dollars at the $29 pack rate.
| Credits | Price, one time | Calls at 10 credits | Per 1,000 credits |
|---|---|---|---|
| 5,000 | $29 | 500 | $5.80 |
| 15,000 | $79 | 1,500 | $5.27 |
| 32,000 | $149 | 3,200 | $4.66 |
| 60,000 | $249 | 6,000 | $4.15 |
Only successful calls use credits; failed calls and timeouts cost nothing. At a balance of 0 calls pause, never a surprise charge. Authenticate with the Authorization: Bearer header.
| Option | What it does | Where it stops |
|---|---|---|
| Strava MCP connector | Official, remote, OAuth. Activity history, fitness trends, gear, clubs. Included in a Strava subscription. | Read-only, Claude only for now, personal use of your own data, no published tool list or limits. |
| r-huijts/strava-mcp and similar | Community MCP servers on the Strava API, 502 stars for the largest, last push 13 Jun 2026. | You register an API app and host it. The API Policy bans operating MCP servers on the API and AI use of the data. |
| Zapier and n8n | Zapier has a Create Activity action. n8n has a Strava node with activities, comments and update. | Both use the API, so the subscription, tiers and limits apply. No comment posting or leaderboard. |
| Bulk-edit browser extensions | Change gear or privacy across the activities you filter, in Chrome. | You run them by hand. They automate the web app too, so Strava's terms apply. |
If you only want to read and analyze your training in Claude, use Strava's own MCP: it is official and costs nothing beyond your subscription. Cotlet fits when you need an agent that writes, runs from another client or a script, or reads a club leaderboard, and you accept the terms risk above.
Take Group sp. z o.o. runs Cotlet. It is a software company registered in Poland, EU (VAT PL6342984273), working since 2019, founded by Bart Krawczyk (Co-founder, CTO) and Jake Slugocki (Co-founder, SEO, sales and marketing). Write to contact@cotlet.dev with questions about the Strava tools.
Yes. Call Cotlet's REST API from a script or an HTTP step in n8n, Make or Zapier with your Cotlet key. MCP is the alternative for AI agents; you do not need to connect an agent to use REST.
Create a free account at https://cotlet.dev, open Strava under Integrations in the console and log in to Strava in its Cloud Browser. The trial starts with your first app, no card asked.
Mostly not. Strava's MCP connector, launched on 1 June 2026, is read-only, works with Claude only for now and needs a paid Strava subscription; a trial does not count. It cannot edit or upload activities. Strava publishes no list of its tools or its request limits, only that a limit per minute and per day exists (Strava Help, checked 27 Oct 2026).
No. Strava's Terms of Service prohibit automated access to the Services by robots, screen scraping and scripts, "regardless of whether you are logged into a Strava account". Strava may warn, suspend or ban an account for a violation. We found no public case of an account banned for this (checked 27 Oct 2026). Read the Terms before you connect an account you cannot lose.
No. Cotlet works in your own Strava account on its web app and does not use the Strava API or the MCP, so the subscription the API now asks of developers does not apply. Features Strava keeps for subscribers stay for subscribers.
Since 1 June 2026 the API needs a Strava subscription for developers, serves 1 athlete by default and 10 after a self-upgrade, and its policy bans using the data in any AI application and operating an MCP server on it. Strava's own MCP is the only sanctioned way to give an agent your data (Strava API Policy sections 3.5, 5.3 and 5.16, checked 27 Oct 2026).
Yes. The session is yours, so list_activities returns activities set to Only You, and the agent can change who sees an activity. Changing visibility asks for your OK by default.
Only the door is different. Both expose the same 11 tools, inputs and answers, with one API key and one price. Agents use MCP; scripts and HTTP steps use REST.
No. Cotlet is independent and not affiliated with Strava, Inc.
Free 7-day trial with 2,000 credits, no card needed.
May we use Google Analytics to see which pages help people? It sets cookies only if you accept. No ads, and we never sell data. Cookie policy