technogym-mcp
This server gives AI assistants read access to your Technogym mywellness training history via MCP.
Verify credentials and get account info (user id, name, culture, facilities, Movergy score)
List workout sessions in a date range (default last 30 days), newest first, with duration, MOVEs, calories, and exercise counts
Get full workout session details: every exercise, machine, muscles, duration, calories, MOVEs, plus performed and prescribed sets with reps, weight, and rest
Conveniently list and fully load all workouts from the last N days
Get per-second exercise analytics: machine channels (power, RPM, speed, etc.), heart-rate samples, HR zones, and summary metrics like total weight and estimated 1RM
Get whole-session heart-rate traces with timestamped samples, HR zones, and avg/min/max HR
Runs as a persistent local HTTP server or stdio MCP server, can be scheduled to start with Windows and exposed securely via Cloudflare Tunnel
Click on "Deploy Server".
Wait a few minutes for the server to deploy. Once ready, it will show a "Started" state.
In the chat, type
@followed by the MCP server name and your instructions, e.g., "@technogym-mcp list my workout sessions from the last 7 days"
That's it! The server will respond to your query, and you can continue using it as needed.
Here is a step-by-step guide with screenshots.
technogym-mcp
An MCP server that gives AI assistants read access to your Technogym mywellness training history: workout sessions, per-exercise data with per-set reps / weight / rest, per-second exercise analytics (machine channels + heart rate) and whole-session heart-rate traces.
It runs as a persistent local HTTP server that starts with Windows, so every MCP client on the machine (Claude Desktop, Claude Code, Cursor, ...) can connect to the same endpoint.
How it works / caveat. Technogym's official API is partner-only (B2B). This server speaks the same JSON API the official end-user web app (endusernext.mywellness.com) uses, logging in with your normal email + password and identifying itself with that app's client headers. No HTML scraping is involved, but it will still break if Technogym changes the login flow or the client-trust rules. The old
mywellness.com/cloudportal that earlier tools (e.g. lcanis/gymexport) scraped was retired in 2026 and now redirects to technogym.com.
Tools
Tool | What it returns |
| Logs in and returns user id, name, culture, facilities and current Movergy score. Use to verify credentials. |
| Sessions in a range (default: last 30 days), newest first: |
| Every exercise with machine, status, duration, calories, MOVEs, muscles, performed and prescribed sets (reps, kg, rest), plus session efficacy and muscle scores. |
| Lists and fully loads all sessions from the last N days. |
| Per-second machine channels, HR samples, HR zones and summary metrics (total weight, est. 1RM, METs...) for one exercise. |
| Timestamped HR trace, HR zones and avg/min/max HR for a whole session. |
A session is addressed by session_id and its date (the API partitions by day). Pass the
date whenever you have it; if omitted, the last year of history is scanned to find it.
GET /health on the same port reports liveness and whether a session is authenticated.
Related MCP server: Garmin Connect MCP server
Setup
Requires uv (it manages Python for you).
git clone https://github.com/ErikAnkerKilbergSkallevold/technogym_mcp
cd technogym_mcp
copy .env.example .env # then fill in MYWELLNESS_EMAIL / MYWELLNESS_PASSWORD
uv syncRun once (foreground)
uv run technogym-mcp # HTTP on http://127.0.0.1:8765/mcp
uv run technogym-mcp --transport stdio # for clients that spawn the server themselvesStart with Windows (always available)
powershell -ExecutionPolicy Bypass -File scripts\install-startup.ps1This registers a Scheduled Task named Technogym MCP Server that starts silently at logon
(via uvw.exe, no console window), restarts on failure, and never times out. Logs go to
logs\technogym-mcp.log. Remove it with scripts\uninstall-startup.ps1. After editing
.env, restart it: Restart-ScheduledTask "Technogym MCP Server".
Expose it publicly (Cloudflare Tunnel)
To reach the server from other machines or from a hosted Claude, tunnel it out through Cloudflare instead of opening a port. One-time prerequisites:
winget install Cloudflare.cloudflared
cloudflared tunnel login # browser: pick your zoneSet TECHNOGYM_MCP_PUBLIC_HOST=technogym.example.com in .env, restart the server task, then:
powershell -ExecutionPolicy Bypass -File scripts\install-tunnel.ps1 -Hostname technogym.example.comThis creates a named tunnel, routes the DNS record, and installs cloudflared as a Windows
service (it will ask for elevation once). The MCP endpoint is then https://technogym.example.com/mcp.
Alternatively, create the tunnel in the Zero Trust dashboard (Networks → Tunnels → Create,
choose Windows, run the provided cloudflared service install <token> command) and add a public
hostname there pointing at http://localhost:<port>. That also installs an auto-starting Windows
service; skip the script in that case, since it would create a second tunnel.
The MCP endpoint has no authentication of its own. Pick one of two ways to protect it:
Cloudflare Access (best when your clients can complete a browser login, e.g. Claude Code with
claude mcp add --transport http): add an Access application for the hostname (Zero Trust → Access → Applications → Self-hosted) with a policy that allows only your email.Unguessable path (needed for clients that cannot send auth headers or do a Cloudflare login, e.g. claude.ai custom connectors): set
TECHNOGYM_MCP_PATH=/<32 random hex>/mcpin.env, restart the server task, and treat the full URL as a secret. Requests to any other path get 404. Optionally still put Access on/healthand/.
Adding to claude.ai
Make sure the tunnel is up and
https://<host>/healthanswers.In claude.ai go to Settings → Connectors → Add custom connector.
Name it
Technogym, paste the full endpoint URL (https://<host><TECHNOGYM_MCP_PATH>), leave OAuth fields empty, and click Add.In a chat, open the tools menu (the sliders icon) and enable the Technogym connector.
Connecting a client
Claude Code
claude mcp add -s user --transport http technogym http://127.0.0.1:8765/mcpClaude Desktop (claude_desktop_config.json), either pointing at the running server:
{
"mcpServers": {
"technogym": { "type": "http", "url": "http://127.0.0.1:8765/mcp" }
}
}or spawning it over stdio:
{
"mcpServers": {
"technogym": {
"command": "uv",
"args": ["run", "--directory", "C:\\path\\to\\technogym_mcp", "technogym-mcp", "--transport", "stdio"]
}
}
}Configuration (.env)
Variable | Default | Purpose |
| Your mywellness login | |
| Your mywellness password | |
|
| Bind address. Keep on loopback; there is no auth on the MCP endpoint. |
|
| Port |
| Public hostname(s) accepted in the Host header, e.g. | |
|
| URL path of the MCP endpoint. Use an unguessable path when the endpoint must be reachable without auth headers (see claude.ai below). |
|
| Logging level |
API notes (for maintainers)
Login:
POST https://core.mywellness.com/v2/enduser/authentication/loginwith{username, password, keepMeLoggedIn}and headersX-MWAPPS-APPID: EC1D38D7-D359-48D0-A60C-D8C0B8FB9DF9,X-MWAPPS-CLIENT: enduserweb. Returnstoken,userContext.id,facilities[].url.Data:
POST https://services.mywellness.com/{facilityUrl}/Training/User/{userId}/<Action>withAuthorization: Bearer <token>and the same X-MWAPPS headers. Actions used:ActivityHistory,GetPerformedWorkoutSessionByIdCr,GetHrSession,MyMovergy; plusTraining/CardioLog/{analyticsId}/Details. Dates areyyyyMMddpartition keys.Localised strings (exercise names, units) come back in the account's culture.
Development
uv run pytest
uv run ruff check .License
MIT
Available Tools
6 toolsget_account_infoA
Log in (if needed) and return the mywellness user id, name, culture and facilities.
Use this to verify credentials are working.
Inputs: no named parameters. Returns: object
get_exercise_analyticsA
Per-second analytics for one exercise: machine channels (power, RPM, speed, distance, level... whatever the equipment reports), heart-rate samples, HR zones and summary metrics (duration, calories, MOVEs, total lifted weight, estimated 1RM...).
Args: analytics_id: An exercise's analytics_id from get_workout_session. sample_every_seconds: Downsample factor; 1 keeps every sample, 10 keeps every 10th.
Inputs: analytics_id (required), sample_every_seconds. Returns: object
get_recent_workoutsA
Convenience: list and fully load every workout session from the last N days.
Args: days: Look-back window in days (1-365).
Inputs: days. Returns: result
get_session_heart_rateA
Whole-session heart-rate trace (timestamped samples), HR zones, and session summary (duration, avg/min/max HR, calories, MOVEs, METs).
Args: session_id: The session_id from list_workout_sessions. date: The session's ISO date (recommended; otherwise resolved from history). sample_every_seconds: Downsample factor for hr_samples (default 10; 1 = all).
Inputs: session_id (required), date, sample_every_seconds. Returns: object
get_workout_sessionA
Full detail for one workout session: every exercise with machine, status, duration, calories, MOVEs, muscles, per-set reps / weight / rest (performed and prescribed), plus session efficacy and muscle scores. Each exercise carries an analytics_id for get_exercise_analytics.
Args: session_id: The session_id from list_workout_sessions. date: The session's ISO date. Strongly recommended; if omitted the last year of history is scanned to find it.
Inputs: session_id (required), date. Returns: object
list_workout_sessionsA
List workout sessions in a date range, newest first. Each item has session_id and date, which together identify the session for the detail tools, plus name, duration, MOVEs, calories and exercise counts.
Args: from_date: ISO date (YYYY-MM-DD). Defaults to 30 days before to_date. to_date: ISO date (YYYY-MM-DD). Defaults to today. only_workouts: Only gym-floor workout sessions (default). False includes every activity type (classes, outdoor, ...).
Inputs: to_date, from_date, only_workouts. Returns: result
Tool Schema Changelog
Recent tool additions, removals, and schema changes observed during successful MCP inspections.
Loading tool schema changelog…
TDQS
Scored across 6 tools
Each tool targets a distinct data view: account, session list, session detail, recent workouts, per-exercise analytics, and heart-rate trace. get_recent_workouts overlaps with list_workout_sessions plus get_workout_session, but it is clearly framed as a convenience wrapper, so the ambiguity is minimal.
All tool names follow a consistent verb_noun pattern using get_ or list_ prefixes: get_account_info, list_workout_sessions, get_workout_session, get_recent_workouts, get_exercise_analytics, get_session_heart_rate. There is no mixing of styles or vague verbs.
Six tools is well-scoped for a read-only fitness/wellness data server. Each tool serves a clear purpose and the count is neither bloated nor too thin.
The tool surface covers the full read-only workflow: account verification, session listing, session detail, exercise-level analytics, heart-rate traces, and a convenience bulk loader. The data flow from list_workout_sessions to get_workout_session to get_exercise_analytics is complete with no obvious dead ends.
Related MCP Connectors
Your own cycling data for your AI assistant: rides, power, climbs and routes. Read-only.
Your strength-training data for any AI assistant: workouts, progress, muscle volume, routines.
Your Garmin, Oura, WHOOP, Hevy and 35 more fitness apps, queryable from your own AI.
Access approved FITsociety clients, schedules, bookings and coaching data with AI assistants.
Related MCP Servers
- AlicenseAqualityDmaintenanceEnables AI assistants to access and analyze your Hevy workout data, including workout history, exercise progress, personal records, and routines.472 npm3MIT
- AlicenseNot gradedqualityCmaintenanceEnables AI assistants to design strength training workouts, push them to Garmin Connect and your watch, and read back completed sessions and exercise history.MIT
- AlicenseAqualityBmaintenanceProvides AI assistants with read-only access to an athlete's Intervals.icu training data, including activities, wellness metrics, zones, and planned events, for use with MCP clients like ChatGPT and Claude.15MIT
- AlicenseAqualityCmaintenanceEnables AI assistants to access and modify a user's real GymTimer workout and nutrition data stored in private iCloud, allowing natural-language queries about training history and the creation of workout templates and meal plans.21MIT