Skip to content

Best Efforts (MMP)

Mean-Maximal Power (MMP) is the highest average power you’ve sustained for a given duration. For example, your “5-minute MMP” is the best average watts you’ve ever held for exactly 5 minutes in a single activity.

MMP curves are the standard way to characterise a cyclist’s physiology — short durations reflect neuromuscular and anaerobic capacity; long durations reflect aerobic fitness and FTP.

FitRepo computes MMP for these standard durations:

DurationLabel
5 secondsSprint peak
10 seconds
30 secondsAnaerobic
60 seconds1-minute
5 minutes (300 s)VO₂max
10 minutes (600 s)
20 minutes (1200 s)FTP proxy
30 minutes (1800 s)
60 minutes (3600 s)Hour power

FitRepo uses a sliding window approach over 1-second power records:

  1. Parse all record messages from the FIT file with a power field.
  2. For each target duration d (in seconds), slide a window of width d across the power array.
  3. Compute the mean power for each window position.
  4. Store the maximum mean power found.
MMP(d) = max over all windows of length d { mean(power[i..i+d]) }

This is equivalent to the standard rolling-average method used by tools like Golden Cheetah and WKO.

Best efforts are stored in the best_efforts JSONB column on the activities table:

{
"5": 520,
"10": 480,
"30": 420,
"60": 390,
"300": 318,
"600": 295,
"1200": 268,
"1800": 252,
"3600": 238
}

Keys are the duration in seconds as a string; values are watts (integers).

The get_best_efforts MCP tool rolls up MMP across all activities in a date range and returns the all-time best for each duration. You can use this to track personal records over time:

# All-time bests
get_best_efforts()
# Bests in the last 90 days
get_best_efforts(from: "2025-01-01", to: "2025-03-31")

A duration slot is omitted from best_efforts if the activity was shorter than that duration (e.g. a 10-minute ride won’t have a 20-minute MMP). Activities without a power meter have best_efforts = null.