health-mcp
Provides read-only access to Garmin Connect health data, including activities, workouts, and personal metrics through a set of get and search tools.
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., "@health-mcp@health-mcp what was my step count yesterday?"
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.
health_mcp
Personal health data for Claude: Garmin Connect and Technogym mywellness, served as one MCP endpoint that runs on a Windows machine, starts with it, and is reachable from claude.ai anywhere through a Cloudflare Tunnel.
claude.ai ─HTTPS─▶ Cloudflare Tunnel ─▶ cloudflared (service)
│ http://127.0.0.1:18080/s/<secret>/mcp
▼
health-caddy (Caddy, loopback :18080)
│ strips /s/<secret>/, 404s everything else
▼
health-mcp (aggregator, loopback :18001)
├─ garmin_* ─▶ garmin-mcp (loopback :18000)
└─ technogym_* ─▶ technogym-mcp (loopback :<port>/<secret>/mcp)Everything is a Windows service running as LOCAL SYSTEM. No inbound ports are opened; cloudflared dials out. The only thing between the internet and your data is the secret path, so the URL is treated like a password.
Repository layout
Path | What |
| The aggregator. FastMCP 4 |
| The |
| technogym-mcp: MCP server for Technogym mywellness (own |
| One idempotent installer for all four services. |
| Installs the Cloudflare Tunnel connector as a service (token based). |
| The secret-path gate. |
| Garmin tool allowlist (read-only tools only). |
| Lists every tool the installed garmin-mcp offers. |
| Lists the tools health-mcp exposes. |
Garmin's MCP server itself is upstream Taxuspt/garmin_mcp,
installed as a uv tool; nothing of it is vendored here.
Related MCP server: garmin-mcp
Machine layout
Path | Purpose |
| URL secret. Treat like a password. |
| Rendered gate config (contains the secret). |
| Active Garmin allowlist. |
| One rotated log per service. |
| Garmin OAuth tokens. |
| Garmin server binary. |
| Technogym credentials, port and secret path (never committed). |
| Upstream URLs for the aggregator, |
Services: garmin-mcp, technogym-mcp, health-mcp (depends on both), health-caddy
(depends on health-mcp), cloudflared.
Setup from scratch
1. Tools
winget install --id Git.Git
winget install --id astral-sh.uv
winget install --id CaddyServer.Caddy
winget install --id Cloudflare.cloudflared
winget install --id NSSM.NSSMReopen PowerShell, then:
uv tool install --python 3.12 git+https://github.com/Taxuspt/garmin_mcp
garmin-mcp-auth # interactive Garmin login (email, password, MFA). Once.
garmin-mcp-auth --verify2. Configure
git clone https://github.com/ErikAnkerKilbergSkallevold/health_mcp
cd health_mcp
copy technogym\.env.example technogym\.env # mywellness email+password, a port (e.g. 38472),
# and TECHNOGYM_MCP_PATH=/<32 hex>/mcp
copy .env.example .env # TECHNOGYM_MCP_URL = http://127.0.0.1:<port><that path>3. Install the services
Elevated PowerShell:
.\deploy\install.ps1Generates the secret on first run, renders the Caddyfile, syncs both Python environments,
(re)creates the four services and prints probe results plus the connector path. Re-run it after
changing deploy\enabled_tools.txt or either .env.
Expected:
garmin http://127.0.0.1:18000/healthz -> 200 ok
technogym http://127.0.0.1:38472/healthz -> 200 ok
health http://127.0.0.1:18001/healthz -> 200 {"status":"ok","upstreams":{"garmin":"ok","technogym":"ok"}}
gated http://127.0.0.1:18080/s/<secret>/healthz -> 200
nosecret http://127.0.0.1:18080/healthz -> 4044. Cloudflare Tunnel
Needs a Cloudflare account (Free) and a domain whose nameservers point at Cloudflare. For a
.no domain from Domeneshop: buy it with the free DNS option, add the domain in Cloudflare,
then set the two Cloudflare nameservers under "Egne navnetjenere". Norid publishes the change
within about an hour.
Zero Trust → Networks → Tunnels → Create a tunnel → Cloudflared. Name it after the machine.
Pick Windows and copy the token from the shown
service installcommand.Published application route: subdomain
health, your domain, HTTP,localhost:18080, Path empty.On the machine, elevated:
.\deploy\install-cloudflared.ps1 -Token <token>
One tunnel per machine. More apps later are just more routes on the same tunnel.
In the zone's AI Crawl Control, set Agent to Allow, or claude.ai's requests may be blocked.
5. claude.ai
Settings → Connectors → Yours → Add custom connector. URL:
https://health.<domain>/s/<contents of C:\health-mcp\secret.txt>/mcpNo OAuth fields. Custom connectors are per account: on Team/Enterprise plans only Owners can add them, a Free account gets one, Pro/Max unlimited.
Combined tools (combined_*)
Garmin and Technogym record the same workout from different angles and know nothing of each
other's IDs. The combined_* tools pair them by time overlap and merge them:
Tool | What it returns |
| Gym workouts from both sides in a range, paired by overlap: |
| Runs: Technogym intervals and laps each enriched with Garmin HR, power and cadence for that window; a merged summary where every metric names its source and carries the other side's value as |
Merge rule: Technogym is authoritative for what the machine did (speed, grade, belt distance,
mill-measured cadence and running power, sets / reps / weight); Garmin for what the body did
(heart rate, zones, training effect and load, calories, recovery). Nothing is discarded: where
both report a metric the chosen value is marked with source and the other kept under alt.
Alignment is by wall clock, so the 10-20 s between pressing start on the watch and on the
console is accounted for (clock_offset_sec).
Tools
deploy\enabled_tools.txt limits Garmin to read-only tools (every get_*/search_* plus
count_activities, 106 of 150). Write tools such as uploading workouts, editing activities or
logging food are excluded because the URL alone guards the account. Trim it further to save
context per chat and re-run the installer. Technogym is read-only by design.
uv run python scripts\list_tools.py # what the connector exposes
& "$env:APPDATA\uv\tools\garmin-mcp\Scripts\python.exe" deploy\list_garmin_tools.py "$env:USERPROFILE\.local\bin\garmin-mcp.exe"Operations
Task | Command |
Status |
|
Logs |
|
Restart everything |
|
Upgrade garmin-mcp |
|
Update this repo |
|
Re-auth Garmin |
|
Rotate the secret | delete |
Uninstall |
|
Troubleshooting
Symptom | Cause / fix |
| An upstream rejects non-local Host headers. Caddy sets |
Phone/claude.ai says the connector failed; log shows | Client sent calls without a session id. health-mcp must run stateless ( |
|
|
Cloudflare shows "Invalid nameservers" on a new domain | Registry publishing lag. Wait, then "Check nameservers". |
Connector gets 403 from Cloudflare | AI Crawl Control → Agent → Allow; Security → Settings → "Block AI bots" off. |
Service stuck in | The installer kills the nssm host after 15 s; manually: |
Tokens invalid after a while | Garmin tokens expire eventually: |
This server cannot be deployed
Maintenance
Related MCP Connectors
Connect your health, fitness, nutrition, sleep, and wearable data to your AI assistant.
- freddyOAuthcoach.freddy
Connect your wearables, rings and training apps, then ask your AI about your own health data.
Garmin data in Claude & ChatGPT via the Garmin Health API. OAuth sign-in, no password sharing.
- PressoOAuthnow.presso
Connect e-commerce and marketing data to AI assistants via MCP.
Related MCP Servers
- AlicenseNot gradedqualityDmaintenanceEnables AI assistants to read Garmin health and fitness data from the Chinese version (garmin.cn) via MCP protocol.4MIT
- AlicenseNot gradedqualityDmaintenanceEnables AI assistants to query live Garmin Connect health and fitness data, including daily metrics, activities, sleep analysis, and trends via natural language.MIT
- FlicenseAqualityDmaintenanceMCP server that connects AI assistants to Garmin Connect health and fitness data, enabling natural language queries about workouts, sleep, heart rate, and more.29-
- AlicenseNot gradedqualityDmaintenanceEnables AI assistants to access Garmin Connect fitness and health data, including activities, heart rate, sleep, and device information.MIT