@dynamicsninja/garminconnect-mcp 0.7.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +21 -0
- package/NOTICE +16 -0
- package/README.md +78 -0
- package/dist/cli.js +11790 -0
- package/dist/cli.js.map +1 -0
- package/package.json +52 -0
package/LICENSE
ADDED
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
MIT License
|
|
2
|
+
|
|
3
|
+
Copyright (c) 2026 Ivan Ficko
|
|
4
|
+
|
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
6
|
+
of this software and associated documentation files (the "Software"), to deal
|
|
7
|
+
in the Software without restriction, including without limitation the rights
|
|
8
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
9
|
+
copies of the Software, and to permit persons to whom the Software is
|
|
10
|
+
furnished to do so, subject to the following conditions:
|
|
11
|
+
|
|
12
|
+
The above copyright notice and this permission notice shall be included in all
|
|
13
|
+
copies or substantial portions of the Software.
|
|
14
|
+
|
|
15
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
16
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
17
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
18
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
19
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
20
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
21
|
+
SOFTWARE.
|
package/NOTICE
ADDED
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
garminconnect-js
|
|
2
|
+
|
|
3
|
+
This project began as a TypeScript port of two MIT-licensed Python projects, and
|
|
4
|
+
still derives substantial parts of its endpoint surface and auth flow from them:
|
|
5
|
+
|
|
6
|
+
python-garminconnect — https://github.com/cyberjunky/python-garminconnect
|
|
7
|
+
Copyright (c) Ron Klinkien and contributors
|
|
8
|
+
|
|
9
|
+
garth — https://github.com/matin/garth
|
|
10
|
+
Copyright (c) Matin Tamizi and contributors
|
|
11
|
+
|
|
12
|
+
The endpoint surface follows python-garminconnect. The SSO and OAuth flow
|
|
13
|
+
follows garth. Neither project is affiliated with this one.
|
|
14
|
+
|
|
15
|
+
Garmin and Garmin Connect are trademarks of Garmin Ltd. This project is not
|
|
16
|
+
affiliated with, endorsed by, or supported by Garmin.
|
package/README.md
ADDED
|
@@ -0,0 +1,78 @@
|
|
|
1
|
+
# @dynamicsninja/garminconnect-mcp
|
|
2
|
+
|
|
3
|
+
Talk to Claude to create Garmin workouts, and read or manage the rest of your Garmin Connect data,
|
|
4
|
+
through an [MCP](https://modelcontextprotocol.io) server built on
|
|
5
|
+
[garminconnect-js](https://github.com/DynamicsNinja/garminconnect-js).
|
|
6
|
+
|
|
7
|
+
> "Make me a 6×400 m session at 5k pace with 2-minute jog recoveries, put it on Thursday, and send
|
|
8
|
+
> it to my watch."
|
|
9
|
+
|
|
10
|
+
Claude previews the workout, waits for your OK, saves it to your Garmin workout library, schedules
|
|
11
|
+
it, and pushes it to your device.
|
|
12
|
+
|
|
13
|
+
## Set up
|
|
14
|
+
|
|
15
|
+
1. **Sign in once** (in a terminal; your password never passes through Claude):
|
|
16
|
+
|
|
17
|
+
```sh
|
|
18
|
+
npx @dynamicsninja/garminconnect-mcp login
|
|
19
|
+
```
|
|
20
|
+
|
|
21
|
+
It asks for your Garmin email, password and, if enabled, your MFA code. The session is saved to
|
|
22
|
+
`~/.garminconnect-mcp/tokens` and renews itself as long as you use it at least once every 30 days.
|
|
23
|
+
|
|
24
|
+
2. **Add it to Claude Desktop**: Settings → Developer → Edit Config, then in
|
|
25
|
+
`claude_desktop_config.json`:
|
|
26
|
+
|
|
27
|
+
```json
|
|
28
|
+
{
|
|
29
|
+
"mcpServers": {
|
|
30
|
+
"garmin": { "command": "npx", "args": ["-y", "@dynamicsninja/garminconnect-mcp"] }
|
|
31
|
+
}
|
|
32
|
+
}
|
|
33
|
+
```
|
|
34
|
+
|
|
35
|
+
On Windows, if Claude Desktop cannot start `npx`, use
|
|
36
|
+
`"command": "cmd", "args": ["/c", "npx", "-y", "@dynamicsninja/garminconnect-mcp"]`.
|
|
37
|
+
|
|
38
|
+
3. Restart Claude Desktop.
|
|
39
|
+
|
|
40
|
+
## What it can do
|
|
41
|
+
|
|
42
|
+
- **Workouts**: `preview_workout`, `create_workout`, `update_workout`, `search_exercises`, for every
|
|
43
|
+
sport the builder supports (running, cycling, swimming, strength, HIIT, yoga, pilates, mobility,
|
|
44
|
+
cardio, rucking, multi-sport). Workouts are checked before anything is sent: an unknown exercise
|
|
45
|
+
name or a malformed step is reported back to Claude with exactly where the problem is.
|
|
46
|
+
- **Everything else in garminconnect-js**: sleep, HRV, stress, training readiness and status, race
|
|
47
|
+
predictions, activities (list, details, download, upload files), gear, courses, devices, badges,
|
|
48
|
+
weigh-ins, and more. One tool per library method.
|
|
49
|
+
|
|
50
|
+
Tools that delete or overwrite data are marked destructive. Claude is told to confirm with you
|
|
51
|
+
before calling one, even if you've auto-approved the rest.
|
|
52
|
+
|
|
53
|
+
**Not exposed:** `logout` (it would delete your saved session), the raw-JSON workout uploads (the
|
|
54
|
+
checked `create_workout` replaces them), and the raw GraphQL passthrough unless you opt in.
|
|
55
|
+
|
|
56
|
+
## Settings (environment variables)
|
|
57
|
+
|
|
58
|
+
| Variable | Default | Meaning |
|
|
59
|
+
|---|---|---|
|
|
60
|
+
| `GARMIN_MCP_TOKEN_DIR` | `~/.garminconnect-mcp/tokens` | Where the session is saved |
|
|
61
|
+
| `GARMIN_MCP_DOWNLOAD_DIR` | `~/Downloads/garmin` | Where downloaded files (FIT, GPX, …) go |
|
|
62
|
+
| `GARMIN_MCP_GROUPS` | all | Comma-separated tool groups: `wellness`, `activities`, `metrics`, `workouts`, `gear`, `courses`, `devices`, `badges-challenges`, `body-composition-weight`, `womens-health`, `golf`, `profile-and-misc`. The workout-builder tools are always on. Fewer groups means less of Claude's context used. |
|
|
63
|
+
| `GARMIN_MCP_ENABLE_GRAPHQL` | off | Set to `1` to expose `query_garmin_graphql` |
|
|
64
|
+
|
|
65
|
+
Set them under `"env"` in the Claude Desktop config entry.
|
|
66
|
+
|
|
67
|
+
If you set `GARMIN_MCP_TOKEN_DIR` in the Claude Desktop config, set the same value when running
|
|
68
|
+
`npx @dynamicsninja/garminconnect-mcp login` (e.g.
|
|
69
|
+
`GARMIN_MCP_TOKEN_DIR=/path/to/dir npx @dynamicsninja/garminconnect-mcp login`), or the server
|
|
70
|
+
won't find the session you signed in with.
|
|
71
|
+
|
|
72
|
+
## Good to know
|
|
73
|
+
|
|
74
|
+
- Dates are calendar dates in UTC (`YYYY-MM-DD`).
|
|
75
|
+
- Everything runs on your machine. Your Garmin session stays in your token folder and is sent only
|
|
76
|
+
to Garmin.
|
|
77
|
+
- Garmin Connect's API is unofficial and can change; this server moves in lockstep with
|
|
78
|
+
garminconnect-js, and each release is tested against the library version it contains.
|