Garmin Read-Only MCP
A read-only MCP server that synchronizes Garmin Connect summaries into a local SQLite cache and provides tools to query daily activity, recent activities, and recovery data.
README
Garmin Read-Only MCP
A deliberately narrow Garmin Connect integration for local use with Hermes Agent. It synchronizes selected Garmin summaries into an owner-only SQLite cache, then serves only that normalized cache through three read-only MCP tools.
This project uses the community-maintained
python-garminconnectclient and undocumented Garmin Connect endpoints. It is not affiliated with or supported by Garmin. Endpoints may change, and automated access may carry account or terms-of-use risk. The official Garmin Connect Developer Program remains the preferred route for approved business integrations.
Security model
The design separates network access from the MCP process:
garmin-readonly-authperforms a one-time interactive login in a local terminal. Password and MFA input are hidden and never accepted as command arguments.garmin-readonly-syncloads reusable local session material, fetches a bounded date window, strips upstream fields, and writes normalized summaries to SQLite.garmin-readonly-mcpimports neither the Garmin client nor session material. It reads only the normalized SQLite cache and refuses caches that are symlinks, non-regular, not owned by the current user, or accessible by group/other users.
The default state directory is:
~/.local/share/garmin-readonly-mcp/
├── tokens/ # Garmin session material, mode 0700/0600
└── cache.sqlite3 # normalized cache, mode 0600
Set the non-secret GARMIN_READONLY_HOME environment variable to use another root.
Never place the state directory inside the repository.
Data scope
The cache and MCP expose only:
- Daily total, active, and BMR/resting calories
- Steps and resting heart rate when available
- Activity type, start time, duration, distance, and calories
- Sleep duration/score, Body Battery, nightly HRV/status, and training readiness when available
They deliberately exclude:
- Garmin profile and social data
- Account identifiers and activity IDs
- Device details
- GPS coordinates, routes, and FIT/GPX/TCX files
- Weight and body composition
- Raw Garmin responses
- Upload, update, schedule, or deletion operations
- Generic or arbitrary Garmin API access
Garmin calorie values are activity context, not a command to increase food intake.
Requirements
- Linux or another Unix-like environment with private file permissions
- Python 3.12+
- uv
- A Garmin Connect account
Install
git clone https://github.com/alexpomsft/garmin-readonly-mcp.git
cd garmin-readonly-mcp
uv sync --frozen
Authenticate locally
Run this in a private local terminal—not Telegram, chat, shell history, or a shared screen:
uv run garmin-readonly-auth
The command asks locally for email, hidden password, and hidden MFA if Garmin requires it. It stores reusable session material but not the password.
Synchronize
The default synchronizes today and yesterday:
uv run garmin-readonly-sync
A bounded historical window can be requested:
uv run garmin-readonly-sync --end-date 2026-08-18 --days 14
--days must be between 1 and 31. Provider errors are replaced with a fixed public
message so raw Garmin responses and authentication details are not echoed.
Run the MCP server
After at least one successful synchronization:
uv run garmin-readonly-mcp
The stdio server exposes exactly:
get_daily_activity(date: YYYY-MM-DD)get_recent_activities(days: 1..31 = 7)get_recovery_summary(date: YYYY-MM-DD)
Tool schemas reject undeclared arguments.
Connect to Hermes Agent
Use Hermes' MCP command rather than editing config.yaml manually:
hermes mcp add garmin-readonly \
--command /absolute/path/to/garmin-readonly-mcp/.venv/bin/garmin-readonly-mcp
hermes mcp test garmin-readonly
Restart Hermes after adding the server so its tools are discovered. No credentials or
session-token paths are passed to the MCP configuration; it uses the private default
state root. If GARMIN_READONLY_HOME is customized, pass only that non-secret setting
with hermes mcp add ... --env GARMIN_READONLY_HOME=/private/path.
Development and verification
uv sync --frozen
uv run pytest --cov=garmin_readonly_mcp --cov-report=term-missing
uv run ruff check .
uv run mypy src tests
uv run pip-audit
The implementation was developed with failing tests first. CI runs the same test, lint, type-check, and dependency-audit gates.
Limitations
- Garmin Connect endpoints are reverse-engineered and can break without notice.
- Garmin may rate-limit, challenge, or lock automated clients.
- Some recovery fields are unavailable on some devices or dates and return
null. - The local cache is a snapshot; schedule
garmin-readonly-syncseparately if fresher data is needed. - This project does not automatically modify calorie targets or provide medical advice.
See SECURITY.md for credential handling and vulnerability reporting.
推荐服务器
Baidu Map
百度地图核心API现已全面兼容MCP协议,是国内首家兼容MCP协议的地图服务商。
Playwright MCP Server
一个模型上下文协议服务器,它使大型语言模型能够通过结构化的可访问性快照与网页进行交互,而无需视觉模型或屏幕截图。
Magic Component Platform (MCP)
一个由人工智能驱动的工具,可以从自然语言描述生成现代化的用户界面组件,并与流行的集成开发环境(IDE)集成,从而简化用户界面开发流程。
Audiense Insights MCP Server
通过模型上下文协议启用与 Audiense Insights 账户的交互,从而促进营销洞察和受众数据的提取和分析,包括人口统计信息、行为和影响者互动。
VeyraX
一个单一的 MCP 工具,连接你所有喜爱的工具:Gmail、日历以及其他 40 多个工具。
graphlit-mcp-server
模型上下文协议 (MCP) 服务器实现了 MCP 客户端与 Graphlit 服务之间的集成。 除了网络爬取之外,还可以将任何内容(从 Slack 到 Gmail 再到播客订阅源)导入到 Graphlit 项目中,然后从 MCP 客户端检索相关内容。
Kagi MCP Server
一个 MCP 服务器,集成了 Kagi 搜索功能和 Claude AI,使 Claude 能够在回答需要最新信息的问题时执行实时网络搜索。
e2b-mcp-server
使用 MCP 通过 e2b 运行代码。
Neon MCP Server
用于与 Neon 管理 API 和数据库交互的 MCP 服务器
Exa MCP Server
模型上下文协议(MCP)服务器允许像 Claude 这样的 AI 助手使用 Exa AI 搜索 API 进行网络搜索。这种设置允许 AI 模型以安全和受控的方式获取实时的网络信息。