strava-sync — independently scanned and version-tracked by SaferSkills.
SaferSkills independently audited strava-sync (Agent Skill) and scored it 100/100 (green). The audit ran 55 deterministic rules across Security, Supply Chain, Maintenance, Transparency, and Community; it found 0 high-severity and 0 lower-severity findings. The full rule-by-rule trace and per-finding evidence are below. Free, methodology-open.
Findings & checks · 0 flagged
Every scanned point with the score it earned and what moved between them.
First recorded scan — no prior version to compare against.
The primary manifest — the file an agent reads to learn what this artifact does.
This skill downloads training data from Strava using the Strava MCP server and creates weekly markdown summaries in the training-log folder. Each week is stored as a single markdown file with detailed activity summaries, including lap details for runs marked as workouts.
Note: This is a Strava-specific data import tool. The running coach system also supports:
This skill uses MCP tools specific to Strava (mcp__strava__*). Similar skills could be created for other platforms using their respective APIs or MCP servers.
First, ask the user to provide the training week number:
week-{n}.md where {n} is this week numberVerify that Strava is connected:
# Check connection statusUse the mcp__strava__check-strava-connection tool to verify the connection. If not connected, use mcp__strava__connect-strava to authenticate.
Retrieve the last 7 days of activities from Strava:
mcp__strava__get-recent-activities to fetch recent activities (default 30 activities)For each activity in the last week:
workout_type field in the activity datamcp__strava__get-activity-laps with the activity IDIMPORTANT: Use Python to calculate all totals to ensure mathematical accuracy. Do NOT calculate totals manually.
Use the mcp__ide__executeCode tool or Bash with Python to:
Example Python calculation:
from collections import defaultdict
# Given activities list
activities = [...] # Your activities data
# Group by activity type
by_type = defaultdict(list)
for activity in activities:
activity_type = activity['type'] # e.g., 'Run', 'Ride', 'Swim'
by_type[activity_type].append(activity)
# Calculate totals per activity type
type_totals = {}
for activity_type, activities_of_type in by_type.items():
total_distance = sum(a['distance'] for a in activities_of_type) # in meters
total_time = sum(a['moving_time'] for a in activities_of_type) # in seconds
total_elevation = sum(a['total_elevation_gain'] for a in activities_of_type) # in meters
count = len(activities_of_type)
# Convert to display units
distance_miles = total_distance * 0.000621371
hours = total_time // 3600
minutes = (total_time % 3600) // 60
seconds = total_time % 60
elevation_feet = total_elevation * 3.28084
type_totals[activity_type] = {
'count': count,
'distance': f"{distance_miles:.2f} miles",
'time': f"{hours:02d}:{minutes:02d}:{seconds:02d}",
'elevation': f"{elevation_feet:.0f} ft"
}
# Calculate overall totals
total_distance = sum(a['distance'] for a in activities)
total_time = sum(a['moving_time'] for a in activities)
total_elevation = sum(a['total_elevation_gain'] for a in activities)
total_count = len(activities)
# Convert to display units
overall_distance_miles = total_distance * 0.000621371
overall_hours = total_time // 3600
overall_minutes = (total_time % 3600) // 60
overall_seconds = total_time % 60
overall_elevation_feet = total_elevation * 3.28084
print(f"Overall Total Activities: {total_count}")
print(f"Overall Total Distance: {overall_distance_miles:.2f} miles")
print(f"Overall Total Time: {overall_hours:02d}:{overall_minutes:02d}:{overall_seconds:02d}")
print(f"Overall Total Elevation: {overall_elevation_feet:.0f} ft")
print("\nBy Activity Type:")
for activity_type, totals in type_totals.items():
print(f"\n{activity_type}:")
print(f" Count: {totals['count']}")
print(f" Distance: {totals['distance']}")
print(f" Time: {totals['time']}")
print(f" Elevation: {totals['elevation']}")Create a markdown file with the following structure, using the calculated totals:
# Training Log: [Start Date] to [End Date]
## Week Summary
### Overall Totals
- **Total Activities**: [count from calculation]
- **Total Distance**: [distance from calculation] miles/km
- **Total Time**: [duration from calculation]
- **Total Elevation**: [elevation from calculation] ft/m
### By Activity Type
#### Run
- **Activities**: [count]
- **Distance**: [distance] miles
- **Time**: [HH:MM:SS]
- **Elevation**: [elevation] ft
#### Ride
- **Activities**: [count]
- **Distance**: [distance] miles
- **Time**: [HH:MM:SS]
- **Elevation**: [elevation] ft
[Include sections for each activity type present in the week]
## Activities
### [Date] - [Activity Name]
**Type**: [Run/Ride/Swim/etc.]
**Distance**: [distance] mi
**Duration**: [HH:MM:SS]
**Pace**: [pace per mile/km]
**Elevation**: [elevation] ft
**Heart Rate**: [avg bpm] (max: [max bpm])
[Activity description/notes if available]
#### Lap Details
| Lap | Distance | Time | Pace | HR | Elevation |
|-----|----------|------|------|-----|-----------|
| 1 | [dist] | [time] | [pace] | [hr] | [elev] |
| 2 | [dist] | [time] | [pace] | [hr] | [elev] |
---
[Continue for each activity...]training-log folder if it doesn't exist: mkdir -p training-logweek-{n}.md where {n} is the week numberweek-1.md, week-2.md, week-3.md, etc.After syncing, provide a brief summary:
training-log/week-1.md)mcp__strava__check-strava-connection: Verify Strava authenticationmcp__strava__connect-strava: Connect to Strava if neededmcp__strava__get-recent-activities: Fetch recent activitiesmcp__strava__get-activity-details: Get detailed info for specific activities (if needed)mcp__strava__get-activity-laps: Fetch lap details for workout runs~30 seconds. Free. No account. Every finding cites a rule and a line of evidence.