Skip to main content

Garmin Connect CLI

Garmin Connect CLI

Garmin Connect from your terminal. Pipe it, script it, automate it.

Python 3.12+ PyPI

Exploring CLI tools as skills for AI agents. Background below.

Features

  • All your Garmin data — activities, stats, sleep, heart rate, stress, body battery
  • Script and automate — composable with jq, pipes, xargs, and standard Unix tools
  • AI agent ready — install the skill for Claude, Cursor, and other assistants
  • Flexible output — JSON for scripts, CSV for spreadsheets, tables for humans

Installation

Quick Install (Recommended)

curl -fsSL https://raw.githubusercontent.com/eddmann/garmin-connect-cli/main/install.sh | sh

Downloads the pre-built binary for your platform (macOS/Linux) to ~/.local/bin.

Homebrew

brew install eddmann/tap/garmin-connect-cli

Using uv

Requires Python 3.12+ and uv.

uvx garmin-connect-cli --help
uv tool install garmin-connect-cli

The PyPI package is garmin-connect-cli; the CLI command remains garmin-connect.

From Source

git clone https://github.com/eddmann/garmin-connect-cli
cd garmin-connect-cli
make deps
uv run garmin-connect --help

Quick Start

# Authenticate with Garmin Connect
garmin-connect auth login

# List recent activities
garmin-connect activities list --limit 10

# Get today's stats
garmin-connect athlete stats

# Get sleep data
garmin-connect health sleep

# Get aggregated context for LLMs
garmin-connect context

Command Reference

Global Options

Flag Short Description
--format -f Output format: json (default), jsonl, csv, tsv, human
--fields Comma-separated list of fields to include
--no-header Omit header row in CSV/TSV output
--verbose -v Verbose output to stderr
--quiet -q Suppress non-essential output
--config -c Path to config file
--profile -p Named profile to use
--version -V Show version and exit

Authentication

Tokens are stored in ~/.config/garmin-connect-cli/tokens/ and remain valid for approximately one year. MFA is supported.

garmin-connect auth login                    # Interactive login
garmin-connect auth login --email EMAIL      # With credentials
garmin-connect auth status                   # Check status
garmin-connect auth logout                   # Clear tokens
garmin-connect auth login --profile work     # Named profile

Commands

Use garmin-connect <command> --help for full details.

Command Description
activities list List activities (supports --limit, --after, --before, --type)
activities get <id> Get activity details (--details for extended info)
activities splits <id> Get activity splits/laps
activities download <id> Download as GPX/TCX/FIT (--format, -o)
activities upload <file> Upload activity file
activities delete <id> Delete activity (--force to skip confirmation)
athlete Get user profile
athlete stats Daily statistics (--date)
athlete summary Comprehensive summary with body metrics
health sleep Sleep data (--date)
health heart-rate Heart rate data
health rhr Resting heart rate
health steps Step count
health stress Stress levels
health body-battery Body battery
training status Training status (Productive, Peaking, etc.)
training readiness Training readiness score (0-100)
training vo2max VO2 max estimates
training hrv Heart rate variability
training fitness-age Fitness age
weight list Weight entries (--start, --end)
weight get Weight for date (--date)
weight log <kg> Log weight measurement
context Aggregated data for LLMs (--focus, --activities, --no-health)

Configuration

CLI preferences are stored in ~/.config/garmin-connect-cli/config.toml:

[defaults]
format = "json"
limit = 30

[profiles.work]
email = "work@example.com"

Authentication tokens are managed by python-garminconnect and stored in ~/.config/garmin-connect-cli/tokens/.

Environment Variables

Variable Description
GARMIN_EMAIL Garmin Connect email
GARMIN_PASSWORD Garmin Connect password
GARMIN_FORMAT Default output format
GARMIN_PROFILE Default profile name
GARMIN_CONFIG Path to config file

Composability

# Filter runs over 10km (distance in meters)
garmin-connect activities list --type running | jq '.[] | select(.distance > 10000)'

# Total running distance in km
garmin-connect activities list --type running | jq '[.[].distance] | add / 1000'

# Get recent activities with key metrics
garmin-connect activities list --limit 5 | jq '.[] | {name: .activityName, km: (.distance/1000), mins: (.duration/60)}'

AI Agent Integration

This CLI is available as an Agent Skill — it works with Claude Code, Cursor, and other compatible AI agents. See SKILL.md for the skill definition.

Install Agent Skill

curl -fsSL https://raw.githubusercontent.com/eddmann/garmin-connect-cli/main/install-skill.sh | sh

Installs the skill to ~/.claude/skills/garmin-connect/ and ~/.cursor/skills/garmin-connect/. Agents will auto-detect when you ask about Garmin/fitness data.

Development

git clone https://github.com/eddmann/garmin-connect-cli
cd garmin-connect-cli
make deps                             # Install dependencies
make test                             # Run tests
make run CMD="activities list --limit 5"  # Run command

Background

I recently built garmin-connect-mcp, an MCP server for Garmin Connect. This got me thinking about alternative approaches to giving AI agents capabilities.

There's been a lot of discussion around the heavyweight nature of MCP. An alternative approach is to give agents discoverable skills via well-documented CLI tooling. Give an LLM a terminal and let it use composable CLI tools to build up functionality and solve problems — the Unix philosophy applied to AI agents.

This project is an exploration of Claude Code Skills and the emerging Agent Skills standard for AI-tool interoperability. The goal was to build a CLI that works seamlessly as both:

  1. A traditional Unix tool — composable, pipe-friendly, machine-readable
  2. An AI agent skill — structured output, comprehensive documentation, predictable behavior

Going forward, another approach worth exploring is going one step further than CLI and providing a code library that agents can import and use directly.

License

MIT

Credits

Built on top of python-garminconnect by cyberjunky.

Metadata

Release files for garmin-connect-cli 1.0.1

For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.

Source distribution (sdist)

Source distribution for garmin-connect-cli 1.0.1
File Size Uploaded
garmin_connect_cli-1.0.1.tar.gz 19.0 kB Details

Built distribution (wheel)

Table of built distributions (wheels) for garmin-connect-cli 1.0.1
File Interpreter ABI Platform
garmin_connect_cli-1.0.1-py3-none-any.whl Python 3 none any Details

Total release size: 44.9 kB

Release files / garmin_connect_cli-1.0.1.tar.gz

Download URL garmin_connect_cli-1.0.1.tar.gz
Size 19.0 kB
Tags Source
SHA-256 checksum
How to use checksums
fbcb78466a3c8f5ee000e595f2a7dce93f9136481904a6b01ee99c269c735ba6
BLAKE2b-256 checksum
How to use checksums
b3a38d1584b323ecdfe091a1000e5fcfd00f9fa41ad9de3051cf691d7e2c9fc3
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/6.1.0 CPython/3.13.12

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on May 20, 2026.

Transparency log

Release files / garmin_connect_cli-1.0.1-py3-none-any.whl

Download URL garmin_connect_cli-1.0.1-py3-none-any.whl
Size 25.8 kB
Tags Python 3
SHA-256 checksum
How to use checksums
57e52e87dd5f37cbf1407db89337d1d8a1be9151dd29fbf4e8f37bfbfad579fe
BLAKE2b-256 checksum
How to use checksums
69b03c8bb78f12a2390e69a894fe66bb709b2fd71183409e3f680130f65ba088
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/6.1.0 CPython/3.13.12

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on May 20, 2026.

Transparency log

Release history Release notifications | RSS feed

This release

1.0.1 This release

2 release files

Anthropic, PBC Visionary sponsor Bloomberg Visionary sponsor Hudson River Trading Visionary sponsor Meta Visionary sponsor NVIDIA Visionary sponsor Microsoft Sustainability sponsor Depot Continuous Integration AWS Cloud computing and Security Sponsor Datadog Monitoring Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page