
Garmin Local Mcp
io.github.anup-shesh由 GitHub 账号 anup-shesh 发布v0.1.9更新于 Oct 27, 2026
Local-first Garmin data warehouse: sync once to SQLite, analyze trends and correlations offline.
发布方自己的服务:LMCP
概览
本地优先的 Garmin 数据仓库:把 Garmin Connect 历史同步到 SQLite,让助手离线分析趋势、相关性与睡眠节律。
- 可以做什么
- 同步与检查 Garmin Connect 数据:登录状态、增量同步、各表覆盖情况与缺失
- 读取单日合并视图,或按日、周、月聚合的列式指标时间序列
- 分析指标:带 -7 到 +7 天滞后扫描的 Pearson/Spearman 相关、个人基线、异常日与连续偏离
- 浏览活动:按类型、日期和距离筛选的近期活动表,以及单个活动的已存摘要
- 估算时型、睡眠需求与建议起床窗口,并给出区间和样本外证据
- 无需登录即可导入手动导出的 wellness FIT 数据包
- 适用场景
- 适合让助手回答关于自己 Garmin 数据的跨月问题,例如睡眠与次日静息心率的关系,而不必每次都为庞大的实时 API 响应付费。也适合在 Garmin 非官方 API 中断时继续做分析,或先用合成演示数据试用这些工具。
- 运行要求
- 本机需 Python 3.12+(pip 安装,或用 uv 配合 uvx)。需要 Garmin Connect 账号:先运行一次登录命令行(支持 MFA),再用同步命令行回填历史,之后才启动服务;MCP 服务器本身不会索要凭据。可选环境变量 GARMIN_MCP_DATA_DIR、GARMINTOKENS、GARMIN_EMAIL 和 GARMIN_PASSWORD,以及可选的 config.toml。仅同步时需要网络。
安装
在 SourceWeft 中
- 打开 控制台中的 Garmin Local Mcp,将其添加到工作区。
- 为需要使用其工具的对话启用该服务。
Desktop only,通过 STDIO。 STDIO 服务会启动本地进程,因此需要 SourceWeft 桌面宿主。
其他 MCP 客户端
参照 仓库 中的启动说明。
README
garmin-local-mcp
Local-first Garmin data warehouse with an analysis-grade MCP server. Sync once, analyze forever, even when the API is down.
[garmin-local-mcp answering questions from a local store, including with the network disconnected]
Try it without a Garmin account
If you don't own a Garmin, or just want to see what the tools return before handing over credentials, seed a synthetic store:
That generates 180 days across every table, then serves them over MCP. No login, no network, no account.
The data is generated rather than recorded, but it is not random. A latent recovery factor drives HRV up while resting heart rate goes down, training load raises the next day's resting heart rate, a six-day illness window sits in the middle of the range, and a few sleep nights are deliberately missing. Sleep timing carries a planted chronotype (MCTQ MSFsc 03:45, with alarm-pinned work mornings and later, longer free nights), and the sleep score drops with distance from that natural wake time. So the analysis tools have something real to find. Over the full 180 days (exact figures shift a little with the end date, because training days depend on the weekday):
The analysis tools default to the last 30 days, which misses the illness
window, so ask about the whole range (demo prints it). On a short window a
lag scan has little to work with; correlate says so in its note when the
strongest lag is not significant once all 15 lags are accounted for.
sync_status reports demo_store: true on these stores, so an assistant can
never present generated numbers as real measurements. The generator is
deterministic — --seed reproduces a store exactly, and --days changes the
range. demo refuses to overwrite a database it did not generate.
Why another Garmin MCP?
Most Garmin MCP servers are thin live wrappers around Garmin's unofficial API. Every question your AI assistant asks becomes one or more live API calls returning large raw JSON blobs (a single raw sleep response runs around 230 KB), which makes multi-month questions like "how does my sleep correlate with training load?" expensive to ask.
That design is no longer universal. Since Garmin's auth change in March 2026 broke the ecosystem for several weeks, a number of projects have added local storage, and the largest server computes training-load and HRV trends server-side. Data ownership and server-side analysis are both crowded ground now. Three things are not:
- Sleep-timing advice that is tested before it is given.
circadianestimates your chronotype from your watch's sleep times (the Munich Chronotype Questionnaire's sleep-debt-corrected mid-sleep) and the wake time that fits it, with an 80% interval on each and a check of how much the answer moves under other reasonable settings. Then it asks whether waking near that time actually went with higher Garmin scores on nights the model never saw, beyond what sleep duration and schedule regularity explain, and says plainly when it didn't. Chronotype on its own is not new: other tools, including at least one MCP server, report MCTQ-style chronotype from wearable sleep data. I have not found another that puts uncertainty on the answer or validates it out of sample. See Sleep timing and chronotype. - Ingest that needs no login. A standalone decoder for Garmin's undocumented wellness FIT messages (sleep score, HRV, skin temperature, sleep stages, naps) reads manually exported bundles with no credentials at all. Other servers parse FIT activity files; I have not found another that decodes the wellness export. It is the only ingest path here that keeps working when Garmin auth breaks.
- Correlation with lag. Pearson and Spearman between any two metrics with a scan over -7 to +7 day lags, so "training load raises my resting HR the next day" is a question with an answer.
The rest of the design follows from keeping your own copy:
- Sync once, analyze forever. Incremental sync into a local warehouse: immutable raw JSON snapshots plus a SQLite database, in a directory you own.
- Compact responses. Trends, correlations, baselines and anomaly detection
are computed locally and returned as small columnar tables. Typical responses
are under 2 KB (
circadian, the richest, stays under 3 KB), so nothing floods the model's context. - Offline resilience. An API breakage pauses new syncs only. Every query over already-synced history keeps working, and FIT import keeps filling gaps.
- Curated tools. 13 composable tools, not 110.
Quickstart
Requires Python 3.12+.
Or run it without installing, via uv:
1. Log in once (MFA supported; tokens persist locally, so future runs never ask for a password):
2. Backfill your history. The sync is resumable, safe to interrupt, and throttled to be polite to Garmin's servers. A year of history is roughly 1,800 requests; for long backfills, start it and let it run (overnight works well). If it gets rate limited or interrupted, re-run the same command and it resumes where it left off.
3. Register the MCP server with your client (see Client setup for Claude Desktop, Cursor, and other clients):
4. Ask questions. Examples of what Claude can now answer from your local warehouse in one or two tool calls:
- "How does my sleep score correlate with next-day resting HR?"
- "What were my anomalous HRV days this quarter?"
- "Show weekly training load vs sleep for the last 3 months."
Client setup
The server speaks stdio, so any MCP client works. pip install garmin-local-mcp
first (or use the uvx variants below, which need nothing installed beyond
uv).
Claude Code
Claude Desktop, one-click: download garmin-local-mcp-x.y.z.mcpb from the
latest release,
then in Claude Desktop open Settings > Extensions > Advanced settings, click
"Install Extension…", and select the file. Requires
uv on your PATH;
the extension installs and runs the server from PyPI via uvx, so no manual
Python setup is needed. If the install dialog warns about a missing
Python >=3.12, you can ignore it: uv provisions its own interpreter.
Claude Desktop, manual (Settings, then Developer, then Edit Config; add to
claude_desktop_config.json):
Cursor (~/.cursor/mcp.json, or .cursor/mcp.json in a project):
Any other stdio client / no local install (requires uv):
Note: login and the initial backfill sync are CLI steps (see
Quickstart); the MCP server itself never prompts for
credentials.
The 13 tools
Only sync and import_fit write anything, and only inside the data
directory. The server never prompts: auth problems come back as structured
errors with a hint pointing at the login CLI.
Available metric names include resting_hr, sleep_score, hrv, steps,
stress_avg, body_battery_high, skin_temp_dev_c, vo2max, fitness_age,
achievable_fitness_age, training_load, endurance_score, hill_score,
readiness_score, race_5k_s, the sleep-timing metrics sleep_onset_min,
wake_time_min and mid_sleep_min (minutes from midnight of the wake date, so
a 23:00 bedtime is −60), and about 35 more; any tool given an unknown name
returns the full list.
Performance scores
Garmin's periodic fitness scores land in their own performance table:
endurance score, hill score (with its endurance and strength sub-scores),
training readiness (score, level, recovery time) and race predictions for 5k,
10k, half and full marathon (all in seconds).
These update on Garmin's own cadence rather than daily, so performance is
deliberately excluded from gaps — a day without a new endurance score is
normal, not a hole. Race predictions and hill score only move after qualifying
running activity, so long stretches of nulls are expected for anyone whose
training is mostly hiking, cycling or strength work.
Sleep timing and chronotype
circadian answers "when does my body clock want me to wake up?" from the sleep
start and end times already in the store. It returns three separate quantities,
each with an 80% interval from a week-block bootstrap:
- Chronotype (
msf_sc). The Munich Chronotype Questionnaire measure: mid-sleep on free days, corrected for the extra sleep taken to repay workday debt. Labelledearly(before 03:30),intermediateorlate(after 04:30); the bands are approximate and the number is the main value. - Sleep need. Your mean free-night sleep window, unless you pass
sleep_need_min. The range where your Garmin scores level off is reported alongside as a cross-check. - Circadian-compatible wake window.
msf_sc + sleep_need / 2. This is an inference, not an MCTQ output. With no catch-up sleep it is simply your average free-day wake time; with catch-up sleep it is that time moved earlier by half the catch-up.
It then checks the inference against what actually happened:
- Stability. The estimate is recomputed over 90, 180 and 365 days, mean and
median mid-sleep, and three travel-filter widths.
stability: lowusually means your schedule changed; pass astartafter the change. - Evidence. On a rolling holdout (train 120 days, test the next 30), it
compares a sleep-duration-only model with one that adds distance from your
circadian wake, and controls for schedule regularity with a separate pair of
models. The level is
consistent,supportive,suggestiveorunsupported. These describe how consistently the pattern held on unseen nights. They are not statistical significance, and evidence needs at least 180 days of history. - What it can't show. Readiness and sleep score are Garmin's own composite scores, not physiological measurements. The strongest possible conclusion is that waking near your window was associated with higher Garmin scores on nights the model never saw, beyond what sleep duration and regularity predict. It does not show that wake timing changes physiology.
When the formula and your past scores disagree by more than 30 minutes, the
tool keeps both and suggests a 21-night experiment between them rather than
averaging them away. Free days default to Saturday and Sunday mornings
(free_days changes that), and if you set alarms on free days the chronotype
comes out earlier than your body clock. Daylight-saving changes in the range
are listed, using the configured timezone or the host's. Shift workers
(daytime main sleep) get the rhythm and chronotype but no wake window.
Data layout and ownership
Everything lives in one directory you own (default ~/.garmin-mcp, override
with the GARMIN_MCP_DATA_DIR environment variable or --data-dir):
The raw JSON snapshots are the source of truth and are never overwritten. The
SQLite database is a derived, rebuildable index: garmin-local-mcp reparse
rebuilds it from the raw snapshots entirely offline, which is the universal
escape hatch for schema evolution and parser fixes. Your data never leaves
your machine.
Data quality note
Garmin watches report a provisional on-device resting heart rate that can diverge sharply from Garmin Connect's finalized value on nights with sparse sampling. A real observed case: the watch reported 69 bpm on-device while Garmin Connect later finalized the same night at 56 bpm.
This project handles that in two ways:
- The API sync stores Garmin Connect's finalized value.
- The FIT importer cross-checks the provisional on-device value against the
overnight heart-rate floor. A resting HR sitting more than 10 bpm above the
lowest overnight sample is a rate the watch never actually observed; it gets
flagged (
rhr_far_above_hr_floor) and withheld, leaving the field for the API to backfill rather than storing a misleading number.
Sparse sleep-stage logging is flagged the same way
(sparse_sleep_stage_logging), and flags surface in get_day so the analysis
layer knows which numbers to trust.
Offline / fallback runbook
If Garmin breaks the unofficial API again (it has before):
- Everything analytical keeps working. All query, correlation, baseline, anomaly, and gap tools run on your already-synced local history. Only new syncs pause.
- Keep ingesting without auth. Download a daily FIT bundle from the
Garmin Connect website and import it locally (exact steps below).
garmin-local-mcp import-fit <folder>decodes the bundle with zero authentication and fills the gap days. FIT-sourced rows never overwrite API-sourced rows (unless you pass--force). - Resume when the community catches up. Watch the
python-garminconnect
project for a fix, upgrade, and run
garmin-local-mcp syncagain. Thanks to resumable sync state, it picks up exactly where it stopped.
Downloading a wellness bundle, step by step
-
Sign in at connect.garmin.com in any browser.
-
Go directly to https://connect.garmin.com/app/settings/accountInformation (or click your avatar in the top-right corner, then Settings, then Account Information in the left sidebar).
-
Scroll to the bottom of the page, to the section titled Export Wellness Data ("Download your wellness FIT files from a specific day. This includes data such as steps, sleep, stress, HRV and more.").
-
Pick a date in the Date field and click Export. Your browser downloads a small zip for that one day, containing roughly 12 to 15 binary
.fitfiles (*_WELLNESS.fit,*_SLEEP_DATA.fit,*_HRV_STATUS.fit,*_SKIN_TEMP.fit,*_METRICS.fit, and similar). -
Unzip it into a folder and run:
-
Repeat for each missing day (one bundle per date). The
gapstool orgarmin-local-mcp statustells you which days need filling.
Two things worth knowing:
- Overnight sleep belongs to the wake date. To get last night's sleep, export yesterday's date if you slept into this morning, i.e. the date you woke up on.
- This per-day export is instant and separate from Garmin's full account
export (the "Data Management" link on the same page), which is a bulk
archive that can take days to arrive by email and is not what
import-fitexpects.
Configuration
Optional config.toml in the data directory:
Environment variables:
Development
The test suite runs fully offline against sanitized JSON fixtures and small FIT samples; CI never touches the live API.
Disclaimer
This project is not affiliated with, endorsed by, or supported by Garmin Ltd. It uses the community python-garminconnect library with your own credentials to access your own data. Garmin's APIs are unofficial and can change or break at any time; when that happens, your synced history remains fully usable and the FIT import path keeps working.
All data stays on your machine. Nothing phones home: no telemetry, no third-party services, no cloud. Treat your data directory like the personal health record it is, and never commit it to a repository.
License
MIT
来源:README.md,提交 d3989fc
工具
0版本历史
3- v0.1.9最新Oct 4, 2026
- v0.1.7Sep 26, 2026
- v0.1.6Sep 16, 2026
评分
已满足适用检查项的 50%
该评分衡量此收录条目的完整程度,依据注册中心条目、端点与公开来源计算得出。它不是对服务器本身的评价,也不表示服务器安全或当前可用:可连通性是带日期的检查结果,评分也不包含安装量或用户评价。
- 近 30 天内可连通25 分
请保持端点能够响应 MCP 握手;SourceWeft 每 30 天探测一次。
- 已声明认证方式10 分
请在注册中心条目中声明凭据请求头,或保持端点能够响应探测,以便判定其认证方式。
- 已列出工具15 分
请让服务器在无凭据时响应 tools/list,或发布可在沙箱中无凭据启动的软件包。
- 描述必需15 分
- 图标10 分
- 文档15 分
- 许可证10 分
其他 Local-Mcp 集成
LMCP
com.local-mcp官方发布者
将 ChatGPT、Claude、Cursor 等 MCP 客户端连接到你的邮件、日历、消息、任务和文件,让助手汇集上下文并据此执行操作。

Autodesk Fusion
com.autodesk.aps.api
把 MCP 客户端连接到正在运行的 Autodesk Fusion 内置 MCP 服务器的桥接工具,让助手创建、修改和检查 CAD 几何。

Cicadas local MCP
由 GitHub 账号 kevinwowo 发布
连接 Cicadas.ai 客户 API 的实验性本地桥接,让助手列出视频模型、查询积分余额、估算费用并查看自有视频任务

Local Mcp
由 GitHub 账号 lanchuske 发布
一款原生 macOS 和 Windows 桌面应用,提供 82 个 MCP 工具,覆盖邮件、日历、Teams、OneDrive 等应用。

BLACKPROOF Local MCP
由 GitHub 账号 l0gfr 发布
一个本地、只读的 MCP 服务器(alpha),让助手执行网络证据完整性检查与汇总比较。