IcuSync - Claude AI MCP connector for Intervals.icu (no technical setup required)

Hey everyone, I’m Toby, a 49-year-old deaf athlete based on Phillip Island, Victoria, Australia.

I grew up playing various sports and started taking running seriously at 40, diving into ultras and building from there. Last year I had my first experience with structured marathon coaching, working through Canova methodology with Stryd power toward one goal: sub-3 at the Tokyo Deaflympics last November. That ended with a 2:59:53.

After Tokyo I started self-coaching with Claude’s help, feeding it data I’d manually exported from Garmin and Stryd. Claude suggested I sign up to Intervals.icu to make Stryd power testing, CP tracking, and workout planning easier. It helped, but I still had to manually enter everything. So I asked Claude how I could automate that, and that conversation is basically how IcuSync got built.

IcuSync connects Claude directly to your Intervals.icu data. Once connected, Claude can read your training history, activity details, and fitness data including fitness, fatigue, and form, then analyse it and offer suggestions like a real coaching conversation. It can also build structured workouts and push or edit them directly on your calendar. There are chart examples on the website showing what that looks like in practice.

It runs as an MCP (Model Context Protocol) server, so you’ll need Claude to use it, but once connected the setup is straightforward and covered on the support page. It works across running, cycling, and other sports, so feedback from all kinds of athletes here would be really valuable.

Sign up in the next 14 days, message me, and I’ll grant you a free subscription so you can try it out and share feedback.

https://icusync.icu

Thanks,
Toby

UPDATED : Really excited to share this one. Coach access is now in testing and it is working really well. Athletes can invite their coach by email from the dashboard, the coach gets a personal MCP URL to add to Claude and can access their athletes training data straight away. No IcuSync account needed on the coach side, and athletes control exactly which tools to grant and can revoke any time.

17 Likes

First impression: looks good and works as expected! I used it to analyse my last workouts, first run after connecting it to Claude seemed to be a little bit slow, after that it was fine. Will continue to use it, as I’m currently in the middle of a plan, so it will come in really handy.

It would be great if you could also include a tool to read the wellness data from intervals.icu - the API endpoint is really simple with (aside from the athlete ID) only the date necessary.

1 Like

Hi Christoph,

Really glad to hear it’s working well! The slowness is on Claude’s side rather than IcuSync - they’ve been under a bit of load lately.

On wellness data - IcuSync already pulls CTL, ATL, and TSB via the get_fitness tool, so fitness load metrics are covered. If you mean the broader wellness endpoint (sleep, HRV, resting HR, weight, etc.), that’s a great suggestion and it’s on my list.

Cheers,
Toby

Hi Christoph,

Wellness data is now live! To pick up the new tool, just disconnect and reconnect IcuSync in your Claude settings, then start a fresh conversation.

Thank you,
Toby

1 Like

Hi Toby, I use Claude daily to train for my first marathon. I’d love to try this connector because I’m currently manually sending screenshots of my Zepp app (Amazfit smartwatch) to Claude. My current training plan was created by Claude and then uploaded via API/Python to Intervals.icu. I’d be happy to try it and share my impressions of your connector. I just signed up for IcuSync. Thanks.

1 Like

Thank you, Looking forward to hearing how you find it. Feel free to post any feedback.

Hi Toby,

I’ve been using IcuSync integrated with Claude to manage my training plan on intervals.icu and I’ve encountered a behavior that limits the tool’s usefulness in real-world scenarios.

The issue: when using edit_workout or push_workout, the tool always converts the description to structured workout format (Warmup / Main Set / Cooldown with intensity= syntax), even when the original workout on intervals.icu uses a free-text description. As a result, edits sent through Claude either don’t appear as expected on the intervals.icu calendar, or overwrite a format the user had set manually or via direct Python API.

Concrete example: I have a marathon plan loaded via Python API with free-text descriptions like:

Easy Aerobico

- 6km 6:00-5:50/km Pace ritmo confortevole
6 giorni a Padova. FC: <143 bpm

- RIENTRO 10m 20-60% Pace (7:17-21:50 for 0.91km) intensity=recovery

When I try to edit these workouts via Claude + IcuSync, the tool normalizes everything into Main Set 1x / intensity=warmup etc., stripping away all contextual text — countdown to race day, nutrition notes, specific execution instructions — which is critical for an athlete during actual training.

Feature requests:

  1. Support for a description_raw or free_text mode that passes the description text exactly as provided, without normalization.
  2. Or the ability to handle the description field (free-text notes) separately from the structured workout_doc field, mirroring the behavior of the native intervals.icu API.
  3. At minimum, clearly document that the tool always overwrites with structured format, so users can set expectations accordingly.

Implications for other users: anyone with a pre-existing plan on intervals.icu created with free-text descriptions — via Python scripts, coach imports, or manual entry — will lose the original formatting on the first edit via Claude. This is a significant issue for athletes with complex plans and detailed notes, particularly when the plan is shared with a coach who expects to see the original description format.

Thanks for building this tool.

1 Like

Hi Marco,

Thanks for the detailed report, you’re right and it’s now fixed.

Both push_workout and edit_workout now support a description_raw field that bypasses normalization entirely and passes text to intervals.icu exactly as provided. Claude will use this automatically when preserving or editing existing free-text descriptions.

Let me know if you run into anything else.

Thank you,
Toby

1 Like

Hi Toby,

thanks for reading my previous message. I’ve done further testing and the issue persists — here’s exactly what I found.

What I tested: I tried modifying the description of an existing workout by passing free-text in the description field via edit_workout. The tool accepts the call (returns success: true) but on intervals.icu the resulting description is always in structured format, completely ignoring the text I passed.

Root cause in the schema: looking at the description field rules, the tool always enforces structured format (Warmup / Main Set / Cooldown with intensity= flags). Even when I pass free-text, the tool normalizes or discards it before sending to the API. I verified that modifying the name field works correctly — the issue is specific to description.

What’s needed: the description field currently only supports structured workouts with targets (watts, pace, HR). A separate field is needed — call it notes, free_text, or description_raw — that gets passed directly to the intervals.icu API without normalization. The native intervals.icu API already supports this: the description field accepts free text, while workout_doc handles the structure. The tool currently merges both, losing free-text content.

Concrete impact: I have a marathon plan with descriptions like:

Easy Aerobico

- 6km 6:00-5:50/km Pace ritmo confortevole
6 giorni a Padova. FC: <143 bpm

- RIENTRO 10m 20-60% Pace (7:17-21:50 for 0.91km) intensity=recovery

This format includes race countdown, nutrition notes and contextual instructions. Every edit via Claude wipes this information and replaces it with the normalized structure — completely unusable for an athlete reading the workout during training.

A simple fix would be to expose a notes parameter in both edit_workout and push_workout that maps directly to the description field in the intervals.icu API payload, bypassing the structured workout normalization entirely.

Thanks again.

Hi Marco,

The fix is live but you’ll need to start a new Claude conversation to pick it up, Claude caches the tool schema at session start, so your current session doesn’t have the new description_raw field yet.

Start a fresh conversation and it should work straight away. I tested with your exact example and the description came back character for character unchanged.

Thanks,
Toby

In the new session, also if you’re passing your own text say something like “set the description to exactly: [your text]” and Claude will use description_raw automatically.

Everything seems to be working fine now. Thanks. I’ll continue using it to analyze my workouts and optimize my fitness, and I’ll let you know if I run into any other issues.

1 Like

Glad to hear it, thanks again for the thorough testing. Good luck for your first marathon!

This looks interesting. Currently running an intervals.icu mcp server on my pc but being able to use on mobile for a tiny amount a month will be nice

1 Like

Thanks for signing up! The mobile use case is exactly what IcuSync is built for. Would love to hear how you find it and feel free to share any feedback

Hey Toby, been giving this a go, working great so far for analysing activities!
I’m trying to pull in my upcoming races (prompted “Read my upcoming races.”) to build a plan, but it errors with:

{
  "newest": "2026-12-31",
  "oldest": "2026-04-09",
  "category": "RACE"
}
Error

{
  "error": true,
  "message": "Could not fetch calendar events. Please check your connection and try again."
}

request_id: xxx

but this doesn’t appear to return anything to Claude. Am I doing something wrong here or is there a bug?

1 Like

Hey Alasdair,

Thanks for reporting this, great catch. The get_events tool had a bug where the category filter was being sent for WORKOUT only. It’s now fixed for all RACE A/B/C, WORKOUT, and NOTE.

You’ll need to start a new conversation with Claude to pick up the updated MCP server, then “Read my upcoming races” should work as expected. Thank you!

Quick note for anyone syncing via Strava: activities that reach Intervals.icu through Strava are blocked from the API due to Strava’s terms of service, so Claude won’t be able to see them. The fix is to connect your device directly to Intervals.icu instead. Garmin, Wahoo, Coros, Suunto, and Polar etc all support this natively.

New tool just added: get_best_efforts lets Claude retrieve your personal bests directly from Intervals.icu. More details at icusync.icu/resources/how-to-find-your-personal-bests-with-icusync

To pick up the new tool, disconnect and reconnect IcuSync in your Claude settings then start a fresh conversation. Any feedback is welcome! Thank you :folded_hands:

Hi Toby,

Been using this for the last couple of days. Really helpful to be able to use in my iPhone - I had created a workflow with Claude Cowork but this is much easier! Couple of queries

  • would it be possible for IcuSync to access cadence data. I’d like to be able to ask how my cadence changes with paces
  • I use miles as my distance unit but conversations seem to use km. Is the best way to solve this to add a request in project instructions? Or is there another way.

Cheers,

Shan

1 Like