Skip to main content
Glama
README.md
# garmin-owl

Ask Claude (or ChatGPT) about your Garmin data: sleep, HRV, recovery, workouts, training load, and long-term trends.

- **Private:** runs on your computer. There is no server or account in between.
- **Read-only:** it can't change anything in your Garmin account.
- **Honest:** when Garmin has no value, it says so instead of guessing.

Works on macOS and Ubuntu Linux.

## What you need

- [Claude Desktop](https://claude.ai/download) (or [ChatGPT Desktop](docs/chatgpt.md), or [another MCP app](docs/reference.md#other-mcp-apps))
- A Garmin Connect account
- [`uv`](https://docs.astral.sh/uv/getting-started/installation/) and Git

## Setup

### 1. Sign in to Garmin

Run this once in a terminal:

```bash
git clone https://github.com/xichen-de/garmin-owl.git
cd garmin-owl
uv sync --locked
uv run garmin-owl-auth
```

Enter your Garmin email, password and MFA code. Your password isn't saved, only a session token in `~/.garminconnect`. Keep that folder private.

### 2. Install the extension

1. Download the latest `.mcpb` file from [Releases](https://github.com/xichen-de/garmin-owl/releases).
2. Drag it into Claude Desktop → **Settings** → **Extensions**, then enable it.
3. Start a new chat.

Using ChatGPT? Follow [docs/chatgpt.md](docs/chatgpt.md) instead.

### 3. Ask

- "Summarize my recovery today."
- "How did I sleep last night?"
- "Compare my last two runs."
- "How have my resting HR and HRV changed month by month over the last year?"
- "Show my VO2 max since I got my watch."

## What it can answer

- **Any day:** sleep, HRV, resting HR, stress, Body Battery, training readiness, cycle phase
- **Workouts:** activity lists, details with your own notes and effort ratings, comparisons, weekly totals
- **Training:** load and status, zones, running tolerance, VO2 max
- **Long-term:** daily history or monthly summaries over up to three years, and when your data starts

See the [full tool list and limits](docs/reference.md#tools).

## Add your own context (optional)

Trends often depend on things Garmin doesn't know about. Write them in `~/.garmin-owl/events.toml`:

```toml
[[event]]
date = 2026-03-01
end_date = 2026-06-30    # optional
label = "Started new medication"

[[event]]
date = 2026-01-12
label = "Flu"
```

Long-range answers include the events from the period they cover. garmin-owl only reads this file.

## Updating

Download the new `.mcpb` from [Releases](https://github.com/xichen-de/garmin-owl/releases) and drag it in again. Then run `git pull` in your `garmin-owl` folder. Your sign-in and cached data carry over.

## If something goes wrong

Check sign-in and the main reads (this shows pass/fail only, never your data):

```bash
uv run garmin-owl-smoke
```

- **"authentication expired" or "No local Garmin tokens":** run `uv run garmin-owl-auth` again.
- **"rate limit reached":** wait a few minutes and ask again.
- **Extension not showing:** restart Claude Desktop.

Anything else: see [Troubleshooting](docs/reference.md#troubleshooting).

## Privacy

- Your data goes only from Garmin to your computer and into your chat. There is no telemetry and no remote database.
- garmin-owl keeps a local cache so each day is fetched only once ([details](docs/reference.md#local-cache)).
- Whatever reaches your chat is handled under your Claude or ChatGPT privacy settings.
- This is not medical advice.

garmin-owl uses the unofficial [`python-garminconnect`](https://github.com/cyberjunky/python-garminconnect) client, so a change on Garmin's side can occasionally break a read until garmin-owl is updated.

## Uninstall

Remove the extension in Claude Desktop, then delete your `garmin-owl` folder. To also remove your data, delete the cache (`~/Library/Application Support/garmin-owl` on macOS, `~/.local/share/garmin-owl` on Linux) and `~/.garmin-owl`. Delete `~/.garminconnect` only if no other Garmin tool uses it.

---

Developing garmin-owl? See [CONTRIBUTING.md](CONTRIBUTING.md).

TDQS

A4.4/5.0

Scored across 24 tools

Disambiguation4/5

Most tools have distinct targets and the descriptions explicitly route between detail, aggregate, and trend views. There is still meaningful overlap among get_daily_summary/get_recovery/get_training_context, get_activities/get_recent_activities/get_training_week, and get_daily_series/get_period_summary/get_recovery_trend, so some careful tool selection is needed.

Naming Consistency5/5

Tool names consistently use snake_case and a predictable get_noun or verb_noun pattern, e.g. get_sleep, get_training_load, compare_activities. Minor variations like get_activities_detail are still clear and fit the overall convention.

Tool Count3/5

The 24 tools cover a broad Garmin analytics domain, and many earn their place, but the count is heavy and sits at the upper end of the borderline range. Several tools provide convenience or composite views that could be consolidated for easier selection.

Completeness4/5

The surface covers daily health, sleep, HRV, recovery, readiness, Body Battery, stress, activities, training load, trends, cycle, and coverage checks, with good lifecycle support for a read-only analytics server. Minor gaps remain for some Garmin data families such as workouts/gear/hydration or dedicated respiration/SpO2 detail, but core workflows are covered.

Maintenance

ActivityActive
ResponsivenessNo issues