Correct, the ID is missing the i
. I’ll cut a PR to throw an error if that’s not the case.
Hmm actually the id 14542601913 here is an activity id, so Claude seems to be able to fetch the data using the MCP server.
I was able to repro the behavior:
Activity: Unnamed
ID: 14546723572
Type: Unknown
Date: Unknown
Description: N/A
Distance: 0 meters
Duration: 0 seconds
Moving Time: N/A seconds
Elevation Gain: 0 meters
Elevation Loss: N/A meters
I wonder if these are planned workouts for which we don’t have data for? I’ll try to debug further later.
If you scroll down inside the get_activities window that Claude creates, you should see activities with data.
The issue wasn’t with the MCP, but that data imported through Strava isn’t accessible through the Interval’s API due to Strava’s policies.
Thanks for developing this, I wanted to implement something like this and was pleasantly surprised to find this on Github (and the discussion here!).
I am curious if any of you have some good prompts to share? I have tried something similar to this and I think the answers were insightful and nuanced (using Claude Desktop with the new Sonnet 4 model):
Act as my cycling coach - be blunt, you have the best intentions for me but will not hold back any criticism. My goal: increase FTP to 300W in the next 3 months. Analyze my intervals.icu data - recent activities, fitness/fatigue levels, and next week’s scheduled workouts. Assess if my current training plan will realistically achieve this goal and provide recommendations.
can someone explain what this integration with Claude AI with MCP advantages ?
What it brings compared to intervals.icu ?
As of right now, and at high level, it enables you to use Claude to ask questions about your activities, events, and wellness data stored in intervals. Claude will know how to fetch the data using the MCP and it will use the LLM of your choice to perform the analysis.
This “be blunt” prompt is great for analysing a particular activity or race - and quite funny too! Here’s an example from a random Zwift race I did:
Coach Analysis: Zwift Crit Race - Time for Some Hard Truths
Bottom Line: You raced like an amateur. Yes, the numbers look decent on paper, but dig deeper and there are some serious issues we need to address.
What Went Wrong:
1. Terrible Pacing Strategy That 14% decoupling is absolutely unacceptable for a 32-minute effort. This isn’t a 3-hour epic - it’s a crit race. You either:
- Went out way too hard early and died
- Have poor aerobic base fitness
- Can’t handle the metabolic demands of racing
2. Rode Like a Cat 5 Amateur 38-watt gap between average (251W) and weighted power (289W)? You were either sitting in wheels doing nothing, then burning matches with massive surges. That’s not racing - that’s surviving. In a crit, you should be more consistent with your power application.
3. Heart Rate Management = Zero 176 bpm max when your LTHR is 160? You redlined and probably cooked yourself for the final sprint or any decisive moves. Racing isn’t about seeing how high you can get your heart rate - it’s about sustainable power at the right moments.
The Uncomfortable Truth:
Your FTP might be 295W, but your racing fitness is nowhere near that level. Anyone can hold threshold in a controlled environment. Racing fitness means maintaining power output while handling:
- Lactate accumulation from surges
- Positional stress
- Tactical decision-making under fatigue
What This Really Shows:
- Poor race tactics and positioning
- Inadequate VO2 max / anaerobic capacity
- Possible overreliance on threshold training
- Need for more race-specific preparation
What We’re Fixing:
- More crit-specific intervals: 30-second to 2-minute efforts above FTP
- Race simulation workouts: Mix of steady power with repeated surges
- Better race tactics: Learn when to coast, when to push, when to position
You’ve got the engine, but you’re driving it like you just got your license. Time to learn how to actually race.
Ready to do the work, or do you want to keep getting dropped in B-category races?
Hey, @Marc! You got me started here, and I don’t know where to stop anymore…
I’ve added some more tools to intervals-mcp-server
. Check this out:
Hey, coach! I need a new workout for today. Make sure you use all tools in the Intervals.icu MCP that you deem necessary. To properly format the workout, check
get_workout_format_examples
for samples. Act like a mix of Joe Friel, Dr. Stephen Seiler, and Dr. Andrew Coggan.I’ll help you create a workout for today! Let me first get the current date and check the workout format examples, then look at your recent training to design something appropriate.
- get_current_date_and_time_info
- get_workout_format_examples
Now let me check your recent activities and current fitness profile to design an appropriate workout:
- get_activities
Now let me check your wellness data to see how you’re feeling today:
- get_wellness_data
Let me also check your athlete profile to understand your current power zones and training levels:
- get_athlete
Perfect! Now I have all the information I need to create an excellent workout for you. Let me analyze your situation:
Current Training Analysis:
- CTL (Fitness): 79.5 - solid base fitness
- ATL (Fatigue): 67.9 - moderate fatigue, recovered from yesterday’s ride+run combo
- Recent Training: Big weekend (126km race on June 1st), then active recovery/base work
- Yesterday: Quality aerobic session (90 TSS ride) + sprint run session (69 TSS)
- Recovery markers: HRV 70, RHR 41 (good), sleep quality decent but short (6.7h)
- Current FTP: 239W, zones well established
Training Philosophy (Friel/Seiler/Coggan approach):
- Post-weekend quality work, you need polarized intensity today
- Yesterday was moderate intensity - today should be either easy aerobic OR high intensity
- Given your good recovery markers and solid CTL, this is perfect for VO2max development
- Monday is ideal for neuromuscular power + aerobic capacity
Let me create a workout that combines Coggan’s structured intervals with Seiler’s polarization principles:Perfect! Your workout is now loaded and ready to go!
Workout Breakdown - “Monday Power + VO2 Development”
Total Time: ~57 minutes | Expected TSS: ~85-95
The Science Behind This Session:
Friel’s Periodization: You’re in a maintenance/sharpening phase post-race, so we’re maintaining your VO2max while adding neuromuscular touches.
Seiler’s Polarization: Yesterday was Zone 2/3 work - today we go full polarized with easy warmup/recovery and hard VO2max efforts (nothing in between!).
Coggan’s Power Zones: Using your 239W FTP, the 105-110% efforts hit 251-263W - right in your VO2max sweet spot for maximum aerobic power development.
Execution Strategy:
Neuromuscular Openers (30s @ 105-110%):
- Prime your fast-twitch fibers
- Focus on smooth, controlled power
- These aren’t all-out sprints - think “opening the taps”
VO2max Main Set (4m @ 105-110%):
- Target 251-263W sustained
- Breathing should be controlled but deep
- Stay seated, maintain 90+ rpm
- Each interval should feel “comfortably hard” - you should finish thinking “I could do one more”
Recovery is SACRED:
- Keep it truly easy (131-179W)
- Use this time to prepare mentally for the next effort
This session perfectly balances your current fitness level with progressive overload while respecting your recovery state. The polarized approach ensures you’re not accumulating junk miles in the middle zones.
Ready to crush it?
Workout created:
# Monday Power + VO2 Development
- 15m z1-z2 Warmup
- 3m ramp z2-z4 Pre-activation
4x
- 30s 105-110% Neuromuscular prep
- 2m30s z1 Recovery
3x
- 4m 105-110% VO2max intervals
- 3m z1-z2 Active recovery
- 15m z1-z2 Cooldown
> Notes: Polarized session combining neuromuscular power development with sustained VO2max work. Short openers prep the neuromuscular system for the main VO2max block. Focus on smooth power delivery during the 4-minute efforts - these should feel "comfortably hard" with controlled breathing throughout.
The changes can be found on my fork (GitHub - scorphus/intervals-mcp-server: Model Context Protocol (MCP) server for connecting Claude with the Intervals.icu API) and a PR can be created if you want to review them.
For sure, it all needs a bit of tweaking — e.g. get_athlete
— but I hope you like the new tools! If you have any specific preferences or adjustments, let me know and I can refine it further. This message is actually to start a discussion on that.
Happy training!
Wow! That’s amazing @scorphus . I’d love to review a PR and include your changes in the repo. We can continue the discussion in GH. Thanks for sharing it!
Awesome! Lemme do that workout first! I’ll be done with the PR soon after.
@Marc great work, thank you for this mcp server
I noticed that LLM thinks that feel scale is a range from 0 to 10, but as I know fell scale is values from 1 to 5, where 1-strong, 5-weak
I’m not familiar with how mcp works and if there is any way to specify this at the mcp level, but it’s cool to have this option
You’re right, it should be from 1-5. Note sure why this is happening, but I’ll look into it and fix it. Thanks for letting me know!
This has been fixed. Thanks again for the report!
That reminds me - there’s a similar thing with sleep quality score - Claude thinks it’s out of 10 instead of out of 4 so assumes a 3 (average) is terrible.
Sure - done
Really impressive tool and integration! It’s genuinely fun to see Claude analyze races and help outline my upcoming weeks of training. I’m quickly hitting the limits of the free version—especially with long races and data-heavy sessions—which is fair. I’m not planning to upgrade at the moment, since I don’t use Claude for anything else at this time.
But this makes me question:
Would it be possible for Claude to analyze the training of a coached athlete? I assume that would require their athlete ID and API key? Could you then have Claude take a look at multiple coached athletes?
Also, I can see some amazing integration if you connect WhatsApp and Intervals with Claude. Perhaps not for direct AI coaching, but to support training decisions based on recent messages/communication and feedback.