intervals-icu-chatgpt-mcp
Provides read-only access to Garmin-recorded training and wellness data via intervals.icu's official Garmin sync, including activities, laps, streams, heart rate and pace zones, fitness/fatigue, sleep, HRV, resting heart rate, and related calendar data.
This server does not currently have a deployable release on Glama. Follow the repository's setup instructions to install and configure it for your MCP client, including any required credentials and local dependencies.
intervals-icu-chatgpt-mcp
Let ChatGPT read your training data, without screenshots.
A small, read-only MCP server that connects ChatGPT to your intervals.icu account, and through it to everything your Garmin watch records: activities with laps and streams, heart rate and pace zones, fitness and fatigue, sleep, HRV, resting heart rate and your training calendar. It brings its own OAuth login, so you can host it on the public internet and use it from ChatGPT on the web, on macOS and on your phone.
Garmin watch ─► Garmin Connect ─► intervals.icu ─► this server (fly.io) ─► ChatGPT
(official sync) (API key) (OAuth, read-only)Ask things like "How was my long run on Saturday?", "Compare this week's easy runs" or "Am I recovered enough for intervals tomorrow?" and ChatGPT fetches the data itself.
Not affiliated with Garmin, intervals.icu or OpenAI. A hobby project, maintained when time allows.
Why this one
There are several good MCP servers for intervals.icu already. This one is built for a narrower case:
Read-only by construction. No tool writes, and the API client can only send
GET. Your calendar, activities and settings cannot be changed through ChatGPT.Safe to expose. It ships a complete OAuth 2.1 flow (dynamic client registration, PKCE, short-lived tokens) with a password login page. Without it, anyone who learns the URL could read your health data.
Stateless. No database. It runs on the smallest fly.io machine that stops when idle, which typically costs nothing or close to it.
Answers sized for a chat model. Empty fields are dropped, streams are downsampled, and aerobic decoupling is computed from the raw data, so it also works for runs without a power meter.
Garmin is only reached through intervals.icu's official Garmin sync. There is no scraping and no Garmin login involved.
Related MCP server: intervals-icu-mcp
What you need
An intervals.icu account (free) connected to Garmin Connect
A ChatGPT plan that allows custom connectors (developer mode)
A fly.io account and
flyctl, or any other host that runs a Docker image behind HTTPSNode.js 22 or newer, only for local development
Setup
1. intervals.icu
Create an account and connect Garmin Connect in the settings. Enable activities and wellness. Older data may need a one-off import.
Near the bottom of the settings page (Developer Settings), note your athlete id (starts with
i) and create an API key. Treat the key like a password: it allows full access to your intervals.icu account, even though this server only reads.
2. Deploy to fly.io
git clone https://github.com/sthoelscher/intervals-icu-chatgpt-mcp.git
cd intervals-icu-chatgpt-mcp
cp fly.example.toml fly.toml # then replace YOUR-APP-NAME (twice)
fly apps create YOUR-APP-NAME
fly secrets set --stage -a YOUR-APP-NAME \
INTERVALS_API_KEY='your-api-key' \
INTERVALS_ATHLETE_ID='i123456' \
JWT_SECRET="$(openssl rand -hex 32)" \
LOGIN_PASSWORD="$(openssl rand -base64 18)" # or your own long password
fly deploy --ha=falsecurl https://YOUR-APP-NAME.fly.dev/health should answer ok. If you let fly generate the password,
read it once with fly ssh console -C 'printenv LOGIN_PASSWORD' and store it in your password manager.
--ha=false keeps it to one machine. Two machines would double the login rate limit, which is counted per
machine.
Set the secrets from your own terminal and keep them out of chats, issues and shell history you share.
3. Connect ChatGPT
On chatgpt.com, open Settings → Apps, enable developer mode under Advanced, and create a new app or connector (the labels change from time to time):
URL:
https://YOUR-APP-NAME.fly.dev/mcpAuthentication: OAuth
ChatGPT opens a login page. Enter your LOGIN_PASSWORD and allow access. A connector created on chatgpt.com
is available in the ChatGPT apps as well. The macOS app can also add it directly under Settings → Plugins →
MCPs → Add → Streamable HTTP.
Start with: "Get my training overview."
After a deploy that renames or removes tools, start a new chat. Existing chats keep the old tool list.
Tools
27 tools, all read-only.
Area | Tools |
Overview |
|
Athlete |
|
Activities |
|
Wellness |
|
Performance |
|
Calendar |
|
Other |
|
Answers drop null and empty fields and are capped at 120,000 characters.
Security model
One user. The server serves exactly one intervals.icu account, configured through secrets. The login page asks for
LOGIN_PASSWORD. Failed attempts are limited to 10 per 15 minutes per IP and 30 per hour in total. Use a generated password (openssl rand -base64 18), not a memorable one.Known clients only. Dynamic client registration accepts only redirect targets on ChatGPT's origins (
https://chatgpt.com,https://chat.openai.com) and loopback addresses. This stops anyone from registering their own client and sending you a link to your real login page (consent phishing). Change the list withALLOWED_REDIRECT_ORIGINS. The login page shows where access will go.OAuth 2.1. Public clients with PKCE (S256). Authorization codes are valid for 5 minutes and single use. Access tokens last 1 hour and are bound to this server's
/mcpURL. Refresh tokens last 30 days, and no chain of refreshes outlives 180 days after you entered the password.Stateless tokens. Client ids, codes and tokens are JWTs signed with
JWT_SECRET(HS256). Nothing is stored, so an auto-stopped machine keeps working. Because anyone can obtain a signed client id, the server refuses to start unlessJWT_SECRETis random and at least 32 bytes (openssl rand -hex 32). RotatingJWT_SECRETrevokes every token and client at once. That is the emergency switch, and the only way to revoke.Read-only. The intervals.icu client has no code path for anything but
GET.Headers. The login page cannot be framed, is not cached and sends no referrer. HSTS is on for HTTPS.
Logs contain paths, status codes, durations, tool names, registration origins and login outcomes. Never query strings, tokens, passwords or training data.
Proxy.
TRUST_PROXY=1(default) is right on fly.io. Without a proxy in front, set it to0, otherwise clients can fake their IP and get around the per-IP login limit.
If you find a security problem, please open a private security advisory on GitHub instead of an issue.
Local development
npm install
cp .env.example .env # INTERVALS_API_KEY and INTERVALS_ATHLETE_ID
set -a; . ./.env; set +a
npm run smoke # calls every tool once against your account (stdio)
npm run inspect # MCP Inspector
npm run dev:stdio # stdio server, e.g. for the ChatGPT macOS app's STDIO optionTo run the HTTP server with OAuth locally:
PUBLIC_URL=http://localhost:8787 LOGIN_PASSWORD=local-test-password-123 JWT_SECRET=$(openssl rand -hex 32) \
npm run dev:http
# in a second shell
BASE=http://localhost:8787 LOGIN_PASSWORD=local-test-password-123 npm run oauth-e2eoauth-e2e walks the whole flow the way ChatGPT does: discovery, registration (including refused foreign
redirect targets), login, wrong password, foreign resource, PKCE, single-use codes, tampered tokens and
refresh.
Variable | Needed for | Meaning |
| both | intervals.icu API key |
| both | intervals.icu athlete id, e.g. |
| HTTP | public base URL, e.g. |
| HTTP | password on the login page, at least 12 characters |
| HTTP | signing key, random, at least 32 bytes ( |
| HTTP | optional, comma separated, default ChatGPT's origins; loopback is always allowed |
| HTTP | optional, proxies in front, default |
| HTTP | default |
Limitations
Only reads. Planning workouts into your calendar is deliberately not supported.
One athlete per deployment.
Tested with ChatGPT (web and macOS). Other MCP clients with OAuth support should work but are untested.
Pace based decoupling is distorted by hills, wind and stops. Compare it between similar routes.
License
MIT
This server cannot be deployed
Maintenance
Related MCP Connectors
Garmin data in Claude & ChatGPT via the Garmin Health API. OAuth sign-in, no password sharing.
tri-train is a training platform for triathletes that syncs activities from Strava and Garmin and exposes them to Claude through a remote MCP server. Ask Claude how your last block went, why your run pace dropped, or whether you are fresh enough for Sunday's race, and it answers from your real data: activities with laps and grade-adjusted pace, weekly load and the performance management chart (CTL/ATL/TSB), sleep, HRV and resting heart rate, and your race calendar with predictions. Claude can also act: create and adjust planned workouts with structured intervals, push them to your Garmin watch, add races and write notes. Every change is journaled and can be undone. Read and write access are separate OAuth scopes, and the server enforces them on every call. Built and hosted in Switzerland by a triathlete; data stays on our own servers (Swiss revDSG / GDPR).
Adaptive running coach MCP server — training data, plans, and recovery for AI assistants.
Remote MCP server for training, nutrition, wellness, and performance data with OAuth 2.0.
Related MCP Servers
- AlicenseAqualityCmaintenanceMCP server for Intervals.icu that enables AI assistants to manage athletic training data, including activities, calendar events, wellness metrics, and workout libraries.19Apache 2.0
- AlicenseAqualityBmaintenanceMCP server that connects AI agents to Intervals.icu, enabling access to training data such as activities, wellness metrics, calendar events, gear, power curves, and custom items. Includes a running coach AI template for automated post-session analysis.1916 npm1MIT
- AlicenseAqualityCmaintenanceMCP server that connects Claude and ChatGPT to the Intervals.icu API, enabling retrieval and management of activities, events, wellness data, power curves, and custom items.21GPL 3.0
- AlicenseAqualityBmaintenanceEnables natural-language access to Intervals.icu training data, wellness metrics, activities, events, and workout management through MCP-compatible clients.64MIT