Garmin Connect MCP server
MCP-сервер Garmin Connect
MCP-сервер для силовых тренировок в Garmin Connect. Спланируйте тренировку в диалоге с ИИ-ассистентом, отправьте её на часы и прочитайте, что вы реально подняли.
Неофициальный. Не связан с Garmin, не одобрен и не поддерживается Garmin. Garmin и Garmin Connect являются товарными знаками Garmin Ltd. Этот проект обращается к частным конечным точкам сервиса тренировок Garmin через реверс-инжиниринг клиента python-garminconnect, поэтому Garmin может изменить или сломать его без предупреждения. Используйте на свой страх и риск и проверьте свои обязательства по условиям использования Garmin.
Всё работает локально. Ваши учётные данные остаются на вашем компьютере и передаются только в Garmin.
Зачем это нужно
Garmin Connect не импортирует файлы тренировок .FIT — импорт FIT работает только для завершённых активностей, а не для запланированных тренировок. Ваши варианты — веб-интерфейс Connect вручную или та же частная конечная точка, которую вызывает само веб-приложение. Этот проект идёт вторым путём и предоставляет MCP-интерфейс, так что тренировка может появиться из разговора, а не из двадцати минут кликанья.
Инструменты
Tool | Does |
| Поиск по каталогу из ~1500 движений Garmin |
| Сохранённые тренировки и их ID |
| Чтение структуры одной тренировки |
| Создание и загрузка с проверкой полного цикла |
| Замена содержимого на месте, сохраняя ID |
| Удаление одной тренировки по ID |
| Добавление тренировки в календарь на дату |
| Многодневные шаблоны в |
| Создание или обновление каждой тренировки в программе |
| Завершённые сессии с количеством подходов и объёмом |
| Одно движение во времени: нагрузка, повторения, объём, e1RM |
| Массовый экспорт в CSV/JSON в |
| Устройства и последняя синхронизация для подтверждения отправки |
delete_workout — единственный разрушительный инструмент.
Установка
Требуется Python 3.12 или новее (garminconnect 0.3.x требует этого).
git clone https://github.com/YOUR-USERNAME/garmin-mcp.git
cd garmin-mcp
./setup.shsetup.sh создаёт .venv/ в каталоге проекта, устанавливает зависимости и копирует .env.example в .env. Ничего не устанавливается в систему. Если в вашей последней версии Python ещё нет колёс для какой-либо зависимости, переопределите её:
PYTHON=python3.13 ./setup.shЗаполните .env своими данными для входа в Garmin, затем выполните аутентификацию один раз:
./.venv/bin/python garmin_login.pyЭтот шаг намеренно интерактивный. Garmin может запросить код MFA, а у MCP-сервера нет терминала, чтобы спросить — он просто зависнет. Вход кэширует токены в ~/.garminconnect, и сервер затем молча использует их. Повторно запускайте его только в том случае, если сервер сообщит об истечении сессии.
Проверьте сборку без обращения к сети:
./.venv/bin/python garmin_mcp.py --self-testПодключение к клиенту
Claude Desktop
Добавьте в claude_desktop_config.json — на macOS в ~/Library/Application Support/Claude/, на Windows в %APPDATA%\Claude\:
{
"mcpServers": {
"garmin": {
"command": "/absolute/path/to/garmin-mcp/.venv/bin/python",
"args": ["/absolute/path/to/garmin-mcp/garmin_mcp.py"]
}
}
}Используйте абсолютные пути и интерпретатор из venv, а не просто python — приложение не наследует PATH вашей оболочки. После этого перезапустите приложение.
Всё остальное
Это стандартный MCP-сервер stdio, поэтому подойдёт любой клиент. Для отладки вне клиента:
npx @modelcontextprotocol/inspector ./.venv/bin/python garmin_mcp.pyПрограммы
Программа — это JSON-файл в programs/, описывающий многодневный шаблон. sync_program отправляет каждую тренировку в нём, сопоставляя по имени — существующие тренировки обновляются на месте, новые создаются. Смотрите programs/example.json с комментариями.
{
"name": "Example Upper/Lower",
"workouts": [
{
"name": "[EX] Upper A",
"warmup": "Two or three ramp-up sets.",
"blocks": [
{
"repeat": 4,
"steps": [
{ "exercise": "Barbell Bench Press", "reps": 5, "weight_kg": 60,
"note": "4x5-7. Add 2.5kg once you hit 7 on every set." },
{ "rest_seconds": 180 }
]
}
]
}
]
}Блок — это повторяющаяся группа, которая выполняется repeat раз. Шаг — это либо упражнение (exercise + reps, опционально weight_kg и note), либо отдых (rest_seconds). Суперсет — это один блок, содержащий оба упражнения с коротким отдыхом между ними и длинным отдыхом в конце. Опустите weight_kg для работы с собственным весом. Опустите warmup для шага разминки по умолчанию или установите его в "" для отсутствия разминки.
programs/*.json игнорируется git, кроме примера, так что ваши собственные тренировки никогда не попадут в коммит.
Что может вас подвести
Garmin молча стирает нераспознанные названия упражнений. Загрузка возвращает 200, и упражнение отображается без названия на часах во время сессии. Именно поэтому существует search_exercises и почему каждое название сверяется с каталогом перед загрузкой. Отображаемые названия содержат дефисы так, как никто не печатает — «Rope Press-down», «Close-grip Chin-up» — поэтому поиск нормализует пунктуацию и понимает сокращения вроде «db», «bb», «ohp», «rdl», «skullcrusher».
Две части API расходятся в единицах веса. Сервис тренировок принимает weightValue в килограммах, несмотря на то, что weightUnit содержит "factor": 1000.0. Полезные данные активности — то, что вы подняли, — сообщаются в граммах. Оба варианта обрабатываются; не «исправляйте» ни один из них.
Проверка полного цикла не может поймать ошибку единиц. Она сравнивает то, что Garmin сохранил, с тем, что было отправлено, и Garmin добросовестно сохраняет всё, что вы отправляете. Когда отправлялись граммы, проверка проходила, и Connect отображал «75,000 кг». Проверьте свою первую загрузку в Connect.
Обновляйте, а не удаляйте и создавайте заново. Сохранение ID тренировки означает, что часы воспринимают изменение как редактирование. Повторное создание заставляет их удалить старые тренировки и загрузить новые, что приводит к устаревшим дубликатам.
429 и 401 выглядят одинаково. Garmin агрессивно ограничивает количество входов с IP. Когда первый транспорт входа ограничен, запасной вариант garminconnect сообщает вводящий в заблуждение 401. Если вы только что видели 429, это ограничение — подождите 30–60 минут и не повторяйте попытки в цикле, это продлевает блокировку. Чтобы исключить действительно неверный пароль: garmin_login.py --check-env.
Структура
garmin_mcp.py the server — tool definitions
garmin_core.py auth, payload building, verification, set parsing
garmin_login.py one-time interactive login (MFA lives here)
programs/ multi-day templates as JSON
setup.sh creates .venv and installs dependenciesЛицензия
MIT — см. LICENSE.
Создано на основе python-garminconnect (MIT) и MCP Python SDK (MIT).
This server cannot be installed
Maintenance
Resources
Unclaimed servers have limited discoverability.
Looking for Admin?
If you are the server author, to access and configure the admin panel.
Related MCP Connectors
Garmin data in Claude & ChatGPT via the Garmin Health API. OAuth sign-in, no password sharing.
Create Hevy routines and analyze your training from chat. Unofficial; BYO Hevy PRO API key.
Garmin data in Claude: 135 tools — activities, sleep, HRV, training, workouts. Free, open source.
Latest Blog Posts
- Who's Calling? MCP Hosts Are an Identity Blind Spot (And the Spec Knows It)By Om-Shree-0709 on .mcpAgent IdentityOAuth 2.1
- Your AI Chatbot Just Exposed Your CEO's Salary to an InternBy Om-Shree-0709 on .Agent IdentityMCP SecurityOAuth Delegation
- Why MCP Servers Need Execution Sandboxing (And Why Your Current Stack Isn't Enough)By Om-Shree-0709 on .Agentic AiPrompt InjectionWebAssembly
MCP directory API
We provide all the information about MCP servers via our MCP API.
curl -X GET 'https://glama.ai/api/mcp/v1/servers/felna-devops/garmin-mcp'
If you have feedback or need assistance with the MCP directory API, please join our Discord server