Talk to your own body data in plain English — and watch it live on a beautiful private dashboard. No coding experience needed. If you can copy, paste, and click, you can do this in about twenty minutes.
free · ~20 minutes · ~$5/month to run · works on iPhone & Android
~20 min
Start to finish
0 lines
Of code you write
100%
Yours & private
~$5/mo
Running cost
What you'll build
Your health data, finally under your own roof.
Right now your Garmin data lives inside Garmin's app. This guide puts a tiny, private helper of your own on the internet that can read your Garmin data and hand it to Claude — so you can ask questions like "How did I sleep?" or "Am I recovered enough for a hard run?" — and it powers a live dashboard you can open on your phone.
💬
You + Claude
Ask in plain English, on any device
→
🔒
Your server
A tiny app only you can reach
→
⌚
Garmin
Your real watch data
→
📊
Dashboard
One page, always current
🗣️
Ask anything
"Show my last 5 runs." "What's my body battery?" Claude reads your Garmin and answers.
📈
A live dashboard
Body battery, sleep, heart rate, training load, and a Swim / Bike / Run view — refreshes every time you open it.
🛡️
Private by design
It runs on your account, locked with your secret key. Your Garmin password never leaves your computer.
In plain words
GitHub
A free home for app code — like Google Drive, but for software. You'll keep your own copy of the app here.
Railway
A service that runs your little app on the internet around the clock, so you never have to keep your own computer switched on. Think of it as renting a tiny, always-on computer — about $5 a month.
Claude
The AI assistant you'll chat with — on the web, or the Claude app on your phone.
Connector
The little bridge that lets Claude read your Garmin data. You add it once, in Claude's settings.
Token / key
A long, random secret — a password — that keeps everyone but you out of your data.
Two ways to do this · pick one
The fast lane, or the hands-on lane.
Both paths end in exactly the same place. Choose whichever suits you — you don't need both. And you can do either one on a Mac or a Windows PC.
⚡
① Let Claude Code do it
Fastest. Needs the free Claude Code app (Mac or Windows). It drives your computer and does the technical steps for you. Best if you're happy to install one app.
🖱️
② Do it by hand
Nothing to install, no coding. Almost all of it is in your web browser; just one short step uses your computer — covered for both Mac and Windows. Jump to Step 1 →
Option ① — with Claude Code
Claude Code is a version of Claude that can safely use your computer. It runs every technical step for you — cloning the app, deploying to Railway, and handing you the final links. It works the same on Mac and Windows (it picks the right commands for your system automatically).
Install Claude Code from claude.ai/code — available for Mac and Windows — and open it in a new, empty folder.
Create a Railway account (Step 1 below). Claude Code can install the small Railway tool for you if you ask it to.
Paste the prompt below and press Enter. Answer its two or three questions when it asks.
Don't want to install Claude Code?You don't have to install anything at all. Skip this box and follow the eight hands-on steps — they do the exact same thing in your web browser, with one short computer step covered for both Mac and Windows.
What you'll still do yourselfTwo quick things, on purpose, so no secret ever passes through the AI: (1) approve the Railway login in your browser when it pops up, and (2) run one command to unlock your Garmin data — you type your Garmin password into your own terminal; Claude never sees it.
copy this into claude code
Help me deploy a self-hosted Garmin Connect MCP server and live dashboard to
Railway, then connect it to Claude. Work step by step, verify each stage, and
only stop to ask me for a credential or a security (MFA) code. Tell me first
which operating system commands you'll use for my machine.
The app is open-source and already includes bearer-token security, a live
/dashboard page, and every deployment fix — DO NOT modify its code. It's here:
https://github.com/sumal009/garmin-mcp
Please do the following, checking each step worked before moving on:
1. Check my tools: git, Python 3, and the Railway CLI (railway). If the Railway
CLI is missing, offer to install it. Run `railway login` (a browser opens —
I'll approve it).
2. Clone https://github.com/sumal009/garmin-mcp into a new folder and go into it.
3. Generate a strong access token for me:
python3 -c "import secrets; print(secrets.token_urlsafe(32))"
Show it to me once and remember it as MCP_ACCESS_TOKEN.
4. Mint my Garmin token locally (the login must run from MY computer, because
Garmin blocks logins from cloud servers). Because this needs my password,
give me ONE command block to run in my own terminal that installs
`garminconnect` in a temp virtual-env and prints a base64 token line — then
wait for me to paste that long line back. Never ask me to type my Garmin
password to you.
5. Deploy to Railway from the project folder:
- railway init --name garmin-mcp
- railway up -d (the first deploy will be unhealthy until variables are
set — that's expected and safe; the app refuses to run unprotected)
- link the service with `railway service`, then:
railway volume add --mount-path /root/.garminconnect
- set these four variables:
MCP_ACCESS_TOKEN = the token from step 3
GARMIN_TOKEN_BASE64 = the base64 line from step 4
GARMIN_MCP_TRANSPORT = streamable-http
GARMIN_MCP_HOST = 0.0.0.0
- railway up (this build should go healthy)
- railway domain (to get my public web address)
If the Railway CLI ever times out while streaming logs, ignore it — the
build still runs; confirm via the dashboard or a curl instead.
6. Verify from my machine (replace the address + token):
- curl the domain + /healthz -> expect 200
- curl the domain + /mcp (no token) -> expect 401
- curl the domain + /mcp?token=MY-TOKEN -> expect 200
Fix anything that isn't right before continuing.
7. Hand me back, ready to paste:
- Claude connector URL: [my-domain]/mcp?token=MY-ACCESS-TOKEN
(I'll add it in Claude: Settings -> Connectors -> Add custom connector,
pasting this as the URL and leaving the OAuth boxes empty)
- Dashboard URL: [my-domain]/dashboard?token=MY-ACCESS-TOKEN
8. Remind me: it costs about $5/month on Railway; if my data ever stops
updating (~monthly) I just re-run step 4 and update the GARMIN_TOKEN_BASE64
variable; and I can change my access token anytime.
Important: if my Garmin login is ever rate-limited (a "429" error), STOP —
tell me to wait 30–60 minutes or switch to my phone's hotspot, and do not
retry in a loop. Ask me now for anything you need before you begin.
Prefer to click through it yourself, or don't want to install anything? The eight steps below do exactly the same thing, by hand, in your browser.
Before you start
A short checklist. Everything here is free to sign up for.
A Garmin account that your watch already syncs to (email + password, and your phone for the security code).
A computer (Mac or Windows) for about 5 minutes — just for one step.
Three free sign-ups, which we'll do in Step 1: GitHub, Railway, and Claude — and you'll use your data in Claude on the web or the phone app, so no desktop app is needed.
A payment method for Railway (the always-on server) — it costs about $5/month and the free trial covers your first run.
Almost everything is done in your web browser. Only one step (getting your Garmin key) uses your computer — with the exact commands given for both Mac and Windows.
About 20 minutes and a cup of chai. ☕
Two promisesYou will never paste your Garmin password anywhere online. It stays on your own computer for one step and is turned into a safe "key." And you can delete the whole thing anytime — it's yours.
Option ② · the eight hands-on steps
Step 1 / 8≈ 3 min
Create your three free accounts
Open each link in a new tab and sign up. You'll come back to these.
Click the Fork button (top-right). On the next screen, click Create fork.
Done — you now have your own copy at github.com/your-name/garmin-mcp.
Step 3 / 8≈ 3 min
Put it online with Railway
Railway takes your copy and runs it on the internet. All clicking, no typing.
In Railway, click New Project → Deploy from GitHub repo.
Pick your garmin-mcp fork. Railway starts building it automatically.
Wait for it to finish. It will show as "Crashed" or unhealthy — that is expected and safe. The app refuses to run until you give it your secret key (Step 5). We'll fix it in Step 7.
Why it "fails" firstThis is a safety feature, not a bug. The app is built to never run unprotected — so before your key exists, it deliberately stays off. Nobody can reach your data in this state.
Step 4 / 8≈ 1 min
Add a small storage disk
This lets your app remember its Garmin login so you don't have to repeat it.
In Railway, click your service (the box named garmin-mcp).
Open the Settings (or right-click the service) and choose Add Volume → Attach Volume.
Set the Mount path to exactly:
mount path
/root/.garminconnect
Step 5 / 8≈ 1 min
Make your secret key (the lock on your data)
This long random word is the password that keeps everyone else out. Generate one and paste it somewhere safe (a notes app) for a few minutes — you'll use it twice.
Easiest way: open this generator and copy the word it shows. Or, if you're on a Mac/Linux terminal, run:
Keep it secretAnyone with this key can read your Garmin data. Don't post it publicly. You can change it anytime (see Keeping it running).
Step 6 / 8≈ 4 min
Get your Garmin "key" — once, on your own computer
This is the only step that uses your computer. It logs into Garmin from your home (so Garmin trusts it) and turns your login into a long safe code. Your password is typed on your own machine and never sent to us or to Railway.
On a Mac: open the Terminal app (press ⌘ + Space, type "Terminal", hit Enter). Paste this whole block and press Enter:
mac · terminal
python3 -m venv /tmp/garmin-key && /tmp/garmin-key/bin/pip install -q "garminconnect==0.2.25"
cat > /tmp/getkey.py <<'PY'
import getpass
from garminconnect import Garmin
email = input("Garmin email: ").strip()
pw = getpass.getpass("Garmin password: ")
g = Garmin(email=email, password=pw, is_cn=False,
prompt_mfa=lambda: input("Code from your email/SMS: ").strip())
g.login()
print("\n===== COPY THE ONE LONG LINE BELOW =====")
print(g.garth.dumps())
print("===== end =====")
PY
/tmp/garmin-key/bin/python /tmp/getkey.py
On Windows: install Python (tick "Add Python to PATH" during install). Open Notepad, paste the script below, and Save As getkey.py (change "Save as type" to All Files) onto your Desktop:
windows · save as getkey.py
import getpass
from garminconnect import Garmin
email = input("Garmin email: ").strip()
pw = getpass.getpass("Garmin password: ")
g = Garmin(email=email, password=pw, is_cn=False,
prompt_mfa=lambda: input("Code from your email/SMS: ").strip())
g.login()
print("\n===== COPY THE ONE LONG LINE BELOW =====")
print(g.garth.dumps())
print("===== end =====")
Then open PowerShell (Start menu → type "PowerShell") and run these two lines:
Either way, it asks for your email, then password, then a security code Garmin texts/emails you. When it finishes it prints one very long line between the ===== markers. Copy that entire long line and keep it safe for the next step — that's your Garmin key.
If it says "429" or "rate limited"Garmin briefly blocks too many login tries. Don't keep retrying. Wait 30–60 minutes, or switch your computer to your phone's hotspot (a fresh connection) and run it once more.
Step 7 / 8≈ 3 min
Give Railway your secrets, and switch it on
Back in Railway, open your garmin-mcp service and click the Variables tab. Add these four, one at a time (New Variable → name → value):
MCP_ACCESS_TOKEN → your secret key from Step 5
GARMIN_TOKEN_BASE64 → the long Garmin key from Step 6 (paste the whole line)
GARMIN_MCP_TRANSPORT → streamable-http
GARMIN_MCP_HOST → 0.0.0.0
Railway automatically re-deploys. This time it should turn green / Active — your app is alive. 🎉 Now give it a web address:
Open Settings → Networking (or "Public Networking").
Click Generate Domain. Railway shows a web address like garmin-mcp-production-xxxx.up.railway.app.
Copy that address — you'll need it in the last step. We'll call it YOUR-APP.
Step 8 / 8≈ 3 min
Connect it to Claude, and open your dashboard
You now have two web addresses. In both, replace YOUR-APP with your Railway address and YOUR-KEY with your secret key from Step 5.
1 · Add it to Claude — In Claude, go to Settings → Connectors → Add custom connector. Give it a name (e.g. "Garmin"), paste this as the URL, leave the OAuth boxes empty, and click Add:
claude connector url
https://YOUR-APP/mcp?token=YOUR-KEY
Now, in any chat, try: "What's my body battery and how did I sleep?" Claude will read your Garmin and answer.
2 · Open your dashboard — Paste this into your phone or laptop browser. Then use your browser's "Add to Home Screen" to get an app icon:
your dashboard
https://YOUR-APP/dashboard?token=YOUR-KEY
Why the key is in the addressClaude's connector screen only offers "OAuth" logins and has no box for a password — so your key rides safely in the web address instead. That's normal and expected.
That's it — you're done. 🏁 Your Garmin now lives inside Claude, and your dashboard updates itself every time you open it.
Keeping it running
A few minutes, every so often.
Cost. About $5/month on Railway's Hobby plan for this small always-on app.
If your data stops updating (roughly once a month, or after a long break): your Garmin key expired. Just re-run Step 6 to make a fresh one, then update the GARMIN_TOKEN_BASE64 variable in Railway. Nothing else changes.
To change your secret key: pick a new one (Step 5), update MCP_ACCESS_TOKEN in Railway, and update the ?token= part in your Claude connector and dashboard address.
To turn it all off: delete the project in Railway. It's completely yours — no leftovers, no lock-in.
If something looks off
The common hiccups, and their one-line fixes.
Is my Garmin data actually safe?
Yes. The app runs on your own Railway account, and only someone with your secret key can reach it. Your Garmin password is typed only on your own computer in Step 6 and is never sent to us, to Railway, or anywhere online — it's converted into a limited "key" that can read your data but not change your password.
The dashboard says "Application not found."
Railway is still building, or the build failed. In Railway, open your service → Deployments → click the latest one → View Logs. If it says "Deploy complete / Healthcheck succeeded," just wait a minute and refresh. If it's red, the log will point to the cause.
It says "Not Found" (a plain white page).
You're viewing an older version. Wait for the newest Railway deploy to finish (Active, green), then refresh the page — on a laptop use a hard refresh (Cmd/Ctrl + Shift + R).
It says "Unauthorized" or asks for a token.
The key in your web address is missing or wrong. Check that the address ends with ?token=YOUR-KEY and that YOUR-KEY exactly matches the MCP_ACCESS_TOKEN you set in Railway (no spaces, nothing cut off).
The Garmin key step says "429 / rate limited."
Garmin temporarily blocks repeated login attempts. Stop retrying, wait 30–60 minutes, or connect your computer to your phone's hotspot and try once. Once you have a key, this never happens again — the running app reuses the key instead of logging in.
Claude's "Add connector" screen only shows OAuth boxes.
That's expected — Claude has no field for a simple key. That's exactly why your key goes inside the web address as ?token=…. Leave the OAuth Client ID/Secret boxes empty and click Add.
Do I need to keep my computer switched on?
No. Railway keeps the app running around the clock. Your computer was only needed for Step 6.
Shared by
Sudhakar Reddy Gade
Organisational Physicist, Executive Coach, Author, and endurance-sport tinkerer. Founder, Nirvedha Executive Coaching Solutions. This guide is offered free to the community — built on the open-source garmin_mcp project by Taxuspt and the streamable-HTTP fork by k8sautom8, with a bearer-token security layer and a live triathlon dashboard added on top.