That’s great. As a coach, I’m less interested in the connector writing training and more interested in recognizing trends, parsing through all the data and recognizing individual changes. The power of Intervals.icu is being able to see specific data that’s unique to each athlete. But, as a coach, looking for that data across a group of 20 that’s also often different between the athletes is the challenge.
Of course this is just one coach’s opinion! Thanks!
I’m wondering if I can connect this new official Intervals MCP server to my own locally developed AI agent, and not just to the official major AI agents like Claude, Codex, and Gemini?
Is there a configuration option like the one outlined here as an example:
{
"mcpServers": {
"intervals": {
"type": "http",
"url": "https://mcp.intervals.icu/mcp",
"headers": { # just as example
"Authorization": "Bearer YOUR_API_KEY",
"X-Custom-Header": "custom-value"
}
}
}
}
Ok, I used the desktop app and I reproduced the same issues as you - no global connector settings, just a list of tools. no ‘always allow’.
I have been using the web app (https://gemini.google.com/customize/connectors) and that has given me all the options in both devmode and outside of devmode - I only have a plus account, nothing fancy.
I see exactly the same in the web app as the desktop app - in fact, my screenshots in dark mode are from the webapp. Even clicking your link just shows me the tools with a tick, with no options for each
Open Plugins (Settings, then Plugins), select +, then Add custom MCP server.
Name it Intervals.icu Connector and enter this address: https://mcp.intervals.icu/mcp. Leave authentication on OAuth.
Accept the risk warning, select Create as a plugin, then install it.
Sign in to Intervals.icu and approve.
You need to be an Intervals.icu Supporter during the beta. If you don’t see Add custom MCP server, tell me which ChatGPT plan you’re on and I’ll look into it.
Great to see an official connector. I’ve been tinkering on an MCP server of my own over the past months, mainly for my own training and for the handful of athletes I coach. It’s a hobby project rather than anything polished, but since coach access came up in this thread, a comparison might be of some use.
Coaching is in there. Every tool exists twice: get_activities acts on the signed-in athlete, and coach_get_activities takes an athlete_id and does the same for an athlete who has accepted the user as coach, using the coach’s own API key with the athlete’s ID in the path. coach_list_athletes gives the IDs. I went with separate tools rather than an optional parameter because Claude, Gemini and friends keep “always allow” per tool, so the user ends up approving writes to an athlete’s calendar separately from writes to their own. Tools that take an activity or event ID also fetch it first and check that the owner matches the account the tool acts on, so an ID from another athlete can’t slip through under the wrong tool’s permission. You’ll have thought about most of this already, but it may be a data point for the permission and privacy decisions you mentioned.
It runs locally over stdio (SQLite cache) and as a remote server on AWS Lambda behind a small stateless OAuth layer, so a few athletes can each connect it in their own claude.ai account. A hosted instance isn’t open to the public: whoever runs it adds each user with a command-line script, which stores their name, password and intervals.icu API key in SSM Parameter Store after checking the key against the API. Only people on that list can sign in, and the API key stays on the server. Nowhere near as neat as proper intervals.icu OAuth with scopes, of course.
For what it’s worth, here is how the two line up, going by your description as of 2 November. Corrections welcome where I’ve misread it:
Feature
Official connector
intervals-icu-mcp
Activities, intervals, fitness, wellness, events, zones, sport settings
Yes
Yes
Best efforts / power curve
Yes (this season)
Yes, any date range
Activity comments
Yes
No
Raw streams and per-window analysis (avg, NP, kJ above FTP, W′ balance)
No, never recomputes
Yes, analyze_activity_window; it seems to agree with the site’s figures for the rides I checked
Aggregated coaching snapshot (fitness, planned vs actual, wellness trends)
Planned (daily readiness)
Yes, get_coaching_context
Submax fatigue test verdict
Yes
No
Create, move, change, delete planned workouts and notes, with colour
Yes, today or later
Yes, any date
Races, sick/injured/holiday, weekly targets, season start
Yes
Yes
Batch changes confirmed with one yes
Yes
No, one call per event
Delete a completed activity
Yes, with preview
Yes
Upload an activity file (.fit/.gpx/.tcx)
No
Yes, local only
Write intervals onto an activity
No
Yes
Log daily wellness
Yes
No, read only
Set RPE and feel on an activity
Yes
No
Sport settings per sport (FTP, LTHR, max HR, zones)
Yes
Yes, plus indoor FTP, W′, Pmax
Athlete profile (weight, resting HR, height, DOB)
Not mentioned
Yes
Coach access to other athletes
Planned
Yes, every tool as coach_*
History depth
12 months, 6 per question
No limit
Strava activities
Marked as withheld
Opaque, not flagged
Auth
intervals.icu OAuth with scopes
Own OAuth server in front of API keys
Confirmation of writes
Server-side preview, then commit
Left to the client’s per-tool permissions
A few API details I stumbled over along the way. You’ve very likely hit them already, but just in case:
PUT /events/{id} moves a one-day event’s end with its start but leaves a multi-day event’s end where it was, and a changed description re-parses the workout and can change the event’s type and clear its load. The server sends the current type, duration and load along with a new description to keep them.
Only workouts and races keep a time of day; a date with T00:00:00 makes a timed event all-day again.
PUT /sport-settings/{type} with a type that has no entry silently updates the Other entry, so the server resolves the numeric ID itself.
athlete-summary with Basic auth returns every followed athlete, which is also how coach_list_athletes works.
Happy to answer questions about any of it, and looking forward to seeing where the official one goes.
I received the following exception list from Claude when I asked it to test the Connector.
I’ve provided it to inform your tweaking of the Connector (not b/c I’m expecting a fix).
'Fatigue - Subjective is a custom Wellness field I’ve created.
"What it doesn’t give me
Your daily “Fatigue – Subjective” rating doesn’t come through, so please keep telling me that in chat.
HRRc and W′ drop don’t appear in what I can pull. For those two KPIs I’d still need a CSV export now and then, or just the figures from you."
We finished the initial research on coach access this week. We know what has to change on the Intervals side for a coach’s assistant to read an athlete’s data, and how consent should work so athletes stay in control of who sees what.
I can’t give a date when testing can start right now, but I’m working towards it - the connector is my main focus for the foreseeable.
A small coach test group trying the first version and telling me what’s missing will be super helpful. I’ll message you all when there’s something to try.
From other dev work I have done for coaches, the most-used output tended to be each athlete’s story over time - individual longitudinal trends for specific sessions, wellness and freshness results across weeks etc. Let me know if your own priorities are different. (comparing athlete numbers within a group or team structure etc)
@gofaster thanks your repository was helpful! we checked your four API notes against the backend and all four made sense, and one exposed a bug of our own that’s fixed in the 3 November release.
@Franky@Cuack yes, if your agent can sign in to a remote MCP server with OAuth. The connector registers your client itself at first sign-in, so there’s no client id or secret to configure, and no custom headers.
API keys in a header aren’t accepted on the live server: sign-in is the only route, which is what keeps the consent and permission choices in the athlete’s hands.
@Cuack if Hermes can do that sign-in, you get the same tools as Claude or ChatGPT, with the previews before writes. Tell me how it goes - I think you are the first agent of that kind on the list.
@sprouty76 thanks for the details. I am using a paid personal account and did also try VPN from the UK, desktop differed from web app for some reason.
I have to assume at this point that they will move towards providing tool settings, because this is supportive of what the MCP spec provides and in line with what other tools are doing. So we will have to keep the one preview confirmation for deletes for now, until I am proven wrong on this assumption
Thanks, great list Paul. Your custom “Fatigue – Subjective” field is now built and on our staging server. I will update you when it’s in production - will be today some time.
Your assistant will read it by the name you gave it, and can log it too. Heart rate recovery and W′ drop are in the build after that.
Both will show on the release log at intervals.icu/connector/changelog when they are live.