From sundial-org-awesome-openclaw-skills-4
Loads and analyzes Strava activities, stats, and workouts via the Strava API. Supports filtering by date, listing recent activities, and fetching detailed activity or athlete data.
How this skill is triggered — by the user, by Claude, or both
Slash command
/sundial-org-awesome-openclaw-skills-4:stravaThe summary Claude sees in its skill listing — used to decide when to auto-load this skill
Interact with Strava to load activities, analyze workouts, and track fitness data.
Interact with Strava to load activities, analyze workouts, and track fitness data.
http://localhost as callback for testing)Visit this URL in your browser (replace CLIENT_ID):
https://www.strava.com/oauth/authorize?client_id=CLIENT_ID&response_type=code&redirect_uri=http://localhost&approval_prompt=force&scope=activity:read_all
After authorizing, you'll be redirected to http://localhost/?code=AUTHORIZATION_CODE
Exchange the code for tokens:
curl -X POST https://www.strava.com/oauth/token \
-d client_id=YOUR_CLIENT_ID \
-d client_secret=YOUR_CLIENT_SECRET \
-d code=AUTHORIZATION_CODE \
-d grant_type=authorization_code
This returns access_token and refresh_token.
Add to ~/.clawdbot/clawdbot.json:
{
"skills": {
"entries": {
"strava": {
"enabled": true,
"env": {
"STRAVA_ACCESS_TOKEN": "your-access-token",
"STRAVA_REFRESH_TOKEN": "your-refresh-token",
"STRAVA_CLIENT_ID": "your-client-id",
"STRAVA_CLIENT_SECRET": "your-client-secret"
}
}
}
}
}
Or use environment variables:
export STRAVA_ACCESS_TOKEN="your-access-token"
export STRAVA_REFRESH_TOKEN="your-refresh-token"
export STRAVA_CLIENT_ID="your-client-id"
export STRAVA_CLIENT_SECRET="your-client-secret"
Get the last 30 activities:
curl -s -H "Authorization: Bearer ${STRAVA_ACCESS_TOKEN}" \
"https://www.strava.com/api/v3/athlete/activities?per_page=30"
Get the last 10 activities:
curl -s -H "Authorization: Bearer ${STRAVA_ACCESS_TOKEN}" \
"https://www.strava.com/api/v3/athlete/activities?per_page=10"
Get activities after a specific date (Unix timestamp):
# Activities after Jan 1, 2024
curl -s -H "Authorization: Bearer ${STRAVA_ACCESS_TOKEN}" \
"https://www.strava.com/api/v3/athlete/activities?after=1704067200"
Get activities in a date range:
# Activities between Jan 1 - Jan 31, 2024
curl -s -H "Authorization: Bearer ${STRAVA_ACCESS_TOKEN}" \
"https://www.strava.com/api/v3/athlete/activities?after=1704067200&before=1706745600"
Get full details for a specific activity (replace ACTIVITY_ID):
curl -s -H "Authorization: Bearer ${STRAVA_ACCESS_TOKEN}" \
"https://www.strava.com/api/v3/activities/ACTIVITY_ID"
Get the authenticated athlete's profile:
curl -s -H "Authorization: Bearer ${STRAVA_ACCESS_TOKEN}" \
"https://www.strava.com/api/v3/athlete"
Get athlete statistics (replace ATHLETE_ID):
curl -s -H "Authorization: Bearer ${STRAVA_ACCESS_TOKEN}" \
"https://www.strava.com/api/v3/athletes/ATHLETE_ID/stats"
Navigate through pages:
# Page 1 (default)
curl -s -H "Authorization: Bearer ${STRAVA_ACCESS_TOKEN}" \
"https://www.strava.com/api/v3/athlete/activities?page=1&per_page=30"
# Page 2
curl -s -H "Authorization: Bearer ${STRAVA_ACCESS_TOKEN}" \
"https://www.strava.com/api/v3/athlete/activities?page=2&per_page=30"
Access tokens expire every 6 hours. Refresh using the helper script:
bash {baseDir}/scripts/refresh_token.sh
Or manually:
curl -s -X POST https://www.strava.com/oauth/token \
-d client_id="${STRAVA_CLIENT_ID}" \
-d client_secret="${STRAVA_CLIENT_SECRET}" \
-d grant_type=refresh_token \
-d refresh_token="${STRAVA_REFRESH_TOKEN}"
The response includes a new access_token and refresh_token. Update your configuration with both tokens.
Activity objects include:
name — Activity titledistance — Distance in metersmoving_time — Moving time in secondselapsed_time — Total time in secondstotal_elevation_gain — Elevation gain in meterstype — Activity type (Run, Ride, Swim, etc.)sport_type — Specific sport typestart_date — Start time (ISO 8601)average_speed — Average speed in m/smax_speed — Max speed in m/saverage_heartrate — Average heart rate (if available)max_heartrate — Max heart rate (if available)kudos_count — Number of kudos receivedIf you hit rate limits, responses will include X-RateLimit-* headers.
date -d @TIMESTAMP (Linux) or date -r TIMESTAMP (macOS)jq if available, or use grep/sed for basic extractionGet running activities from last week with distances:
LAST_WEEK=$(date -d '7 days ago' +%s 2>/dev/null || date -v-7d +%s)
curl -s -H "Authorization: Bearer ${STRAVA_ACCESS_TOKEN}" \
"https://www.strava.com/api/v3/athlete/activities?after=${LAST_WEEK}&per_page=50" \
| grep -E '"name"|"distance"|"type"'
Get total distance from recent activities:
curl -s -H "Authorization: Bearer ${STRAVA_ACCESS_TOKEN}" \
"https://www.strava.com/api/v3/athlete/activities?per_page=10" \
| grep -o '"distance":[0-9.]*' | cut -d: -f2 | awk '{sum+=$1} END {print sum/1000 " km"}'
If you get a 401 Unauthorized error, your access token has expired. Run the token refresh command.
If you get rate limit errors, wait until the limit window resets (check X-RateLimit-Usage header).
npx claudepluginhub sundial-org/awesome-openclaw-skillsAutomates Strava tasks through Composio's Strava toolkit via Rube MCP. Handles tool discovery, connection management, and API execution.
Generates personalized triathlon, marathon, and ultra-endurance training plans with periodized workouts, zones, and race-day strategies. Syncs with Strava or works from manually provided fitness data.
Analyzes Strava activities with per-activity coaching metrics: session kind (interval/steady), terrain (road/trail), HR zones, recovery estimate, and coaching narrative. Useful post-workout or for retro-analysis.