Strava MCP
Remote MCP server for your Strava activities, segments, and routes
Connector by ljcl · GitHub account verified by the MCP Registry
Install
Pick your client. Read the repository before you give any tool access to your data.
No install instructions from the source yet. Check the repository for setup steps.
Get the weekly diff
The weekly diff: one email a week with new agent tools, notable updates and grade changes, plus security alerts for tools you follow. Double opt-in, one-click unsubscribe.
About
Reviews
Write a reviewNo reviews yet. Installed it? Reviews come from verified installers only. How reviews work
Permissions
What this server can do and what it asks for, from its tool list and install config. Checked Oct 25, 2026.
- Tools
- 43 read · 7 write · 1 delete
- Secrets
- None asked for
- Install scripts
- Not scanned yet
- Runs as
- Docker image
Tools by what they do 51
Read from the source code; the running server may list different tools.
Read 43 · Look things up without changing anything.
compare-activitiescompare-segment-effortsexplore-segmentsfind-segments-on-routeget-activity-lapsget-activity-photosget-activity-segments-dataget-activity-streams-rawget-activity-zonesget-activity-zones-dataget-aerobic-analysisget-athlete-stats
Show 31 more tools
get-best-effortsget-cadence-trend-dataget-compare-activities-dataget-fitness-trendget-fitness-trend-dataget-hill-analysisget-interval-analysisget-race-predictionget-routeget-route-map-dataget-route-previewget-running-summaryget-segmentget-segment-effortget-segment-profileget-segment-progress-dataget-split-analysisget-training-loadget-training-load-datalist-athlete-routeslist-segment-effortslist-starred-segmentsview-activity-chartview-activity-segmentsview-activity-zonesview-cadence-trendsview-compare-activitiesview-fitness-trendview-route-mapview-segment-progressview-training-load
Write 7 · Create, change, send or run things.
create-activityexport-activity-gpxexport-route-gpxexport-route-tcxset-brush-windowset-viewportstar-segment
Delete 1 · Delete, drop, revoke or wipe things.
update-activity
Tools (51)
Read from the source code; the running server may differ. Descriptions are the server’s own words; hidden characters are shown as [U+…].
compare-activitiesread-onlyCompares two running activities side-by-side. This tool provides: - Key metrics for both activities - Calculated differences (pace, heart rate, cadence, etc.) - Efficiency analysis comparing pace relative to heart rate Use Cases: - Compare the same route on different days - Track fitness progress over time - Analyze performance in different conditions - Compare race efforts Parameters: - activityId1 (required): First activity ID (typically the baseline/older activity) - activityId2 (required): Second activity ID (typically the comparison/newer activity) Notes: - Both activities should be …
compare-segment-effortsread-onlyCompares two of your efforts on the same segment to show WHERE the time went, not just how much. view-segment-progress can tell you that you were 8 seconds off your PR. This tool slices both efforts out of their activities' full-resolution streams, aligns them on distance along the segment, and reports: - Total time for each effort and the gap between them - A per-third breakdown: time, pace, and average HR for each third of the segment - Where the gap peaked in each direction, so you can see "went out too hard" versus "faded at the top" Use Cases: - "Did I lose that PR attempt early or on …
create-activityCreates a manual activity on the athlete's Strava timeline — for sessions without a device recording, e.g. strength training, yoga, or a treadmill run. Takes a title, sport type, local start time, and duration, plus optional distance, description, and trainer/commute flags. Requires the activity:write scope. Not idempotent: calling it twice creates two activities.
explore-segmentsread-onlySearch for popular segments inside a geographic bounding box (south-west and north-east lat/lng). Optionally filter by climb category. Returns matching segments with id, name, distance, and average grade. Use when the user wants to discover segments in an area rather than look up one they already know.
export-activity-gpxExports a Strava activity's recorded track as a GPX file saved to a pre-configured local directory. Built from the activity's streams (GPS, time, altitude, heart rate, cadence), since Strava's API has no native activity export. Activities without full streams fall back to the map polyline (geometry only, no timestamps or sensor data). Use for importing rides/runs into Garmin, route planners, or backups.
export-route-gpxExports a Strava route as GPX. Returns the GPX document in the response by default on a remote server, or writes it to the server's configured export directory when output: 'file'.
export-route-tcxExports a Strava route as TCX. Returns the TCX document in the response by default on a remote server, or writes it to the server's configured export directory when output: 'file'.
find-segments-on-routeread-onlyDescription is built at runtime.
get-activity-lapsread-onlyRetrieves the laps of a Strava activity with sport-appropriate formatting. Runs report per-lap pace (min/km and min/mile, cadence in spm); rides and other sports report speed (km/h), power when a meter was present, and cadence in rpm. Works for any activity type with recorded laps — manual laps, auto-laps, or structured-workout intervals. Use Cases: - Review interval workouts lap by lap (runs and rides) - Compare effort across laps: pace/speed, HR, power, cadence, elevation - Feed lap-level data into further analysis Parameters: - id (required): The unique identifier of the activity. Note…
get-activity-photosread-onlyRetrieves the photos attached to a specific Strava activity. Use Cases: - Fetch the photos uploaded to an activity - Get photo URLs for display or download - Access photo captions, locations, and timestamps Parameters: - id (required): The unique identifier of the Strava activity. - size (optional): Photo size in pixels (e.g., 100, 600, 2048). Strava keys each photo's URLs by size; when omitted it returns every available size. The structured payload carries the largest URL returned. Notes: - Requires activity:read scope for public/followers activities, activity:read_all for private activit…
get-activity-segments-dataread-onlyInternal data feed for the activity-segments UI: returns the activity's segment efforts (name, time, distance, grade, climb category, PR/top-10 ranks, HR, power, cadence) as JSON. The view-activity-segments app calls this; not intended for direct model use.
get-activity-streams-rawread-onlyInternal data feed for the activity chart UI: returns raw per-sample arrays (time, heartrate, watts, velocity_smooth, altitude, cadence, grade_smooth, distance) as JSON for one activity. The view-activity-chart app calls this; not intended for direct model use.
get-activity-zonesread-onlyRetrieves the time-in-zone distribution for a specific Strava activity: how long it spent in each heart rate and/or power zone, as opposed to the athlete's zone definitions. Use Cases: - See how a workout was distributed across HR or power zones - Quantify time spent in each training zone for a single activity - Compare effort distribution between activities Parameters: - id (required): The unique identifier of the Strava activity. Notes: - Requires activity:read scope for public/followers activities, activity:read_all for private activities - Not all activities have zone data (e.g. no HR …
get-activity-zones-dataread-onlyInternal data feed for the activity-zones UI: returns per-zone time distributions (bucket bounds, seconds, percentages) for the activity's heart rate and power zones as JSON. The view-activity-zones app calls this; not intended for direct model use.
get-aerobic-analysisread-onlyComputes aerobic decoupling and efficiency metrics for one activity from its heart rate and power (or speed) streams. Metrics: - Aerobic decoupling: % drift of the output:HR ratio between the first and second half of the MOVING portion of the activity (power:HR when a power stream exists, speed:HR otherwise). Positive = the second half cost more heartbeats per watt — aerobic fatigue; negative = warmed into the effort. - Efficiency factor (EF): normalized output per heartbeat (W/beat with power, metres-per-minute/beat with speed). - Intensity factor (IF): normalized power / threshold power, w…
Show 36 more tools
get-athlete-statsread-onlyFetches the activity statistics (recent, YTD, all-time) for an athlete. Defaults to the authenticated athlete; pass athleteId to target a specific athlete.
get-best-effortsread-onlyAggregates personal best efforts across all running activities. This tool retrieves and ranks your best times at standard distances: - 400m, 1/2 mile, 1K, 1 mile, 2 mile - 5K, 10K, 15K, 10 mile - Half Marathon, Marathon, 50K Use Cases: - Track PRs across all distances - Find your best performances at specific distances - Analyze progress over time at key distances Parameters: - distance (optional): Filter to a specific distance (e.g., "5K", "1 mile") - limit (optional): Maximum number of efforts to return per distance (default: 3, max: 50) - maxActivities (optional): Maximum number of acti…
get-cadence-trend-dataread-onlyInternal data feed for the cadence-trends UI: returns per-run summary cadence and pace for recent running activities as JSON. The view-cadence-trends app calls this; not intended for direct model use.
get-compare-activities-dataread-onlyInternal data feed for the compare-activities UI: returns the aggregate comparison (per-activity summaries, activity2−activity1 differences, efficiency analysis) as JSON. The view-compare-activities app calls this alongside get-activity-streams-raw; not intended for direct model use.
get-fitness-trendread-onlyComputes the fitness/fatigue/form trend (CTL, ATL, TSB) from Strava relative effort. This tool builds the classic performance-management chart from the relative effort (suffer score) already present on the activity list — no per-activity fetches: - CTL ("fitness"): 42-day exponentially weighted average of daily load - ATL ("fatigue"): 7-day exponentially weighted average of daily load - TSB ("form"): CTL − ATL. Negative = carrying fatigue, positive = fresh Use Cases: - "When does my form (TSB) return positive, and does it align with my next quality day?" - Judge whether a training block is …
get-fitness-trend-dataread-onlyInternal data feed for the fitness-trend UI: returns the per-day CTL/ATL/TSB series, the forward projection, any solved taper plan (weekly loads and the days they produce), and the dated deep-fatigue / freshness / steep-ramp bands as JSON. The view-fitness-trend app calls this; not intended for direct model use.
get-hill-analysisread-onlyAnalyses climbing and descending performance within one activity from its elevation, grade, and pace streams. This tool detects sustained climbs (grade ≥ 2% for ≥ 200 m, dip-tolerant) and descents, and reports per segment: - Start km, length, average grade, elevation gain - Moving pace and grade-adjusted (GAP, flat-equivalent) pace - Average HR, cadence, and power where recorded The headline output is early-vs-late climb drift: climb effort is normalised as HR per unit of grade-adjusted speed, then climbs starting in the first half of the run are compared with climbs in the second half. Pos…
get-interval-analysisread-onlyDetects and analyses interval structure in one activity, with urban-stop-aware rest classification. Naive rest-based interval detection false-positives on urban runs: traffic-light stops read as recovery intervals. This tool classifies every stopped segment (from the moving stream) before trusting it: - Stop under 60 s with no fast effort before it → traffic light, excluded - Stop up to 3 min after a fast effort → genuine interval recovery - Stop over 5 min → café/regroup/kit stop, noted but excluded - Anything else → unclassified, excluded (lowers confidence) Work reps are reconstructed be…
get-race-predictionread-onlyPredicts race times from your recorded best efforts and builds a goal-pace split table. Uses Riegel's equivalent-performance formula (T2 = T1 × (D2/D1)^1.06) over the best efforts Strava records inside each run, combining them into one estimate per distance weighted by how recent each effort is and how far it has to be extrapolated. Use Cases: - "I am racing a half in six weeks — what should I target, and what is my km split?" - Sanity-check a goal time against what your training actually supports - See which effort is driving a prediction, and how much your distances disagree Parameters: …
get-routeread-onlyFetch full detail for one saved route by id: name, distance, elevation gain, estimated moving time, and segment count. Use when the user wants details of a route from list-athlete-routes, or before exporting it with export-route-gpx or export-route-tcx.
get-route-map-dataread-onlyInternal data feed for the route-map UI: returns decoded [lat, lng] coordinates plus start/end points, distance, elevation gain, and (for activities with GPS streams) index-aligned metric streams (time, distance, altitude, heartrate, watts, velocity_smooth, grade_smooth) and annotation anchors (lap boundaries, segment-effort spans with PR/top-10 flags, geotagged photos, caller-supplied distance-anchored waypoints) for one activity or route as JSON. The view-route-map app calls this; not intended for direct model use.
get-route-previewread-onlyPreviews a saved route's climbs before you ride or run it, from the route's stored elevation profile. list-athlete-routes and get-route report a route's total distance and elevation gain, which says nothing about where the hard parts are. This tool names every sustained climb on the course and reports: - Each climb's position along the route, length, average grade, and gain - The crux: the steepest sustained ~200 m stretch and how far in it sits - A gradient band breakdown along the whole course - A shape verdict — steady, front-loaded, back-loaded, rolling, or flat Use Cases: - "Where are …
get-running-summaryread-onlyRetrieves a comprehensive running-focused summary of a Strava activity. This tool combines data from multiple sources and computes derived metrics specifically for running analysis: - Pace in min/km and min/mile (not just speed) - Cadence as steps per minute (doubled from Strava's strides) - Heart rate zone distribution computed from HR stream - Per-lap breakdown with running-specific metrics Use Cases: - Get a complete picture of a run in a single call - Analyze heart rate zone distribution - Review lap-by-lap performance with pace data - Assess cadence efficiency Parameters: - activityId…
get-segmentread-onlyFetch full detail for one segment by id: distance, average and maximum grade, total elevation gain, climb category, location, and starred state. Use after finding a segment via explore-segments or list-starred-segments when the user wants its difficulty or stats. Obtain the id from those tools.
get-segment-effortread-onlyFetch one specific segment effort by its effort id, including elapsed and moving time, PR rank, and KOM/QOM rank. Use when the user asks about a single recorded attempt on a segment. For all of an athlete's efforts on a segment use list-segment-efforts; for the segment's static stats use get-segment.
get-segment-profileread-onlyBreaks one segment's gradient down along its length, from its stored elevation streams. get-segment reports a single average grade, which hides the difference between a steady ramp and a flat kilometre followed by a wall — two segments you would pace completely differently. This tool reports: - A gradient band every 100 m (wider on long segments) with each band's own grade - Every sustained climb inside the segment (grade ≥ 2% for ≥ 200 m, dip-tolerant) - The crux: the steepest sustained ~200 m stretch and how far into the segment it sits - A shape verdict — steady, front-loaded, back-loaded…
get-segment-progress-dataread-onlyInternal data feed for the segment-progress UI: returns the segment's details plus the athlete's efforts on it (date, elapsed and moving time, pace, heart rate, power, cadence, PR/KOM ranks, rank within the history) and a derived summary as JSON. The view-segment-progress app calls this; not intended for direct model use.
get-split-analysisread-onlyBreaks one activity into even distance splits and says whether it was positive-, negative-, or evenly split — corrected for terrain. Device laps are whatever the athlete pressed the button for; this tool ignores them and bins the streams into fixed 1 km (or 1 mile) splits, reporting per split: - Moving pace and grade-adjusted (GAP, flat-equivalent) pace - Elevation change and average grade - Average HR, cadence, and power where recorded The headline is the two-halves verdict, stated twice: once on the clock and once grade-adjusted. A hilly back half slows raw pace with no fade at all, and a…
get-training-loadread-onlyRetrieves training load summary for a specified time period. This tool aggregates running activities to provide: - Total and weekly volume (distance, time, elevation) - Training trend analysis (increasing, stable, decreasing) - Warnings for sudden volume increases (injury risk) Use Cases: - Monitor weekly training volume - Track training consistency over time - Identify potential overtraining risks - Review training history for periodization planning Parameters: - days (optional): Number of days to analyze (default: 28, i.e., 4 weeks) - activityTypes (optional): Activity types to include (…
get-training-load-dataread-onlyInternal data feed for the training-load UI: returns per-week running volume (distance, runs, time, elevation), a rolling trend value, and injury-risk warning flags with reasons as JSON. The view-training-load app calls this; not intended for direct model use.
list-athlete-routesread-onlyLists the routes created by the authenticated athlete, with pagination.
list-segment-effortsread-onlyLists the authenticated athlete's efforts on a specific segment, optionally filtering by date.
list-starred-segmentsread-onlyList the segments the athlete has starred. Returns each segment's id, name, distance, average grade, and climb category so the model can pick one to inspect with get-segment or list efforts with list-segment-efforts. Results are paged: when the response says more are available, call again with the next page. Use when the user refers to their saved or favorite segments.
set-brush-windowZoom the chartZoom the activity chart's x-axis to one window of the activity, given either in kilometres from the start or in seconds of elapsed time. Use it to put the part of the run being discussed on screen — a surge, a climb, an interval — rather than describing where to look. Pass reset to show the whole activity again.
set-viewportFrame part of the routeZoom the route map to a stretch of the course, given in kilometres from the start. Use it to show the user where on the route something happens — a climb, a split, a segment — instead of only describing it. Omit both bounds and pass reset to show the whole route again.
star-segmentStars or unstars a specific segment for the authenticated athlete.
update-activitycan change or delete dataUpdates an activity's title, description, sport type, gear, or flags (commute/trainer/hidden). Description defaults to append (adds to existing notes); pass descriptionMode 'replace' to overwrite. Requires the activity:write scope. Assign gear by passing a Strava gear id.
view-activity-chartread-onlyOpen an interactive chart of one activity with selectable heart rate, power, pace, altitude, cadence, and grade overlays. Prefer this over a text summary when the user wants to see or explore how metrics change over the course of an activity. Takes the activity id.
view-activity-segmentsread-onlyOpen a prioritised, scrollable list of the segments run in one activity: your PRs and top-10s pinned on top, then every segment in run order, each with pace, grade, and expandable heart-rate, cadence, and power detail. Prefer this over text when the user wants to review the segments in a workout. Takes the activity id.
view-activity-zonesread-onlyOpen an interactive time-in-zone chart for one activity: bars for the time spent in each heart rate and power zone, with percentages and an easy/moderate/hard split. Prefer this over the text-only get-activity-zones when the user wants to see how a workout's effort was distributed. Takes the activity id.
view-cadence-trendsread-onlyOpen an interactive cadence dashboard across recent runs: trend timeline, cadence-versus-pace scatter, pace-zone breakdown, and per-run overlay comparison. Prefer this over text when the user wants to explore cadence patterns over time. Takes a number of weeks of history.
view-compare-activitiesread-onlyOpen an interactive side-by-side overlay of two activities: their pace, heart rate, power, cadence, or altitude streams aligned on a shared distance or time axis, with an aggregate delta summary. Prefer this over the text-only compare-activities when the user wants to see WHERE in the activities the difference happened. Takes both activity ids.
view-fitness-trendread-onlyOpen an interactive fitness/fatigue/form chart (the performance-management chart): fitness (CTL) and fatigue (ATL) over the lookback window with form (TSB) on its own axis, deep-fatigue, freshness, and steep-ramp periods shaded, and a dashed continuation past today. Pass targetDate to chart a solved taper landing on targetTsb on that day, week by week; omit it for a rest projection. Prefer this over the text-only get-fitness-trend when the user wants to see whether they are peaking or digging a hole.
view-route-mapread-onlyOpen an interactive map of one activity's or saved route's GPS track, fit to bounds with start and finish markers and a distance/elevation summary. Prefer this over a text summary when the user wants to see where an activity or route went. Takes either an activity_id or a route_id (provide exactly one). Optionally pin distance-anchored waypoints (fueling points, climb warnings, …) along the track via the waypoints array — useful when discussing a race plan or course guide.
view-segment-progressread-onlyOpen an interactive history of the athlete's own efforts on one segment: effort time over date with the personal best and top three highlighted, an optional average heart rate series, and a per-effort list. Prefer this over the text-only list-segment-efforts when the user wants to see whether they are getting faster on a climb or course segment, or whether the same time is now costing less heart rate. Takes the segment id (from list-starred-segments, explore-segments, or get-segment) and an optional date range.
view-training-loadread-onlyOpen an interactive training-load chart: weekly running volume bars with a rolling trend line, and injury-risk warning weeks highlighted with their reason on hover. Prefer this over text when the user wants to see how their training volume is trending. Takes a number of days of history.
Signals
- Stars
- 0
- Forks
- 0
- Open issues
- 9
- Last commit
- Oct 18, 2026 (11 days ago)
- Last release
- Aug 23, 2026 (2 months ago)
From GitHub (fetched Oct 24, 2026).
Details
- Registry name
io.github.ljcl/strava-mcp- Version
- 3.0.0
- Auth
- API key
- Packages
- oci
ghcr.io/ljcl/strava-mcp:3.0.0 - License
- MIT
- Repository
- github.com/ljcl/strava-mcp
- First seen
- Oct 24, 2026
- Last checked
- Oct 24, 2026
More from ljcl
Cite this page
Strava MCP. Agent Mart. https://agentmart.dev/connectors/ljcl-strava-mcp (last updated 2026-10-24)