Healthfolder

io.github.CloudCorpRecords由 GitHub 帳號 CloudCorpRecords 發布v0.1.0更新於 Nov 5, 2026

Read a Health Access folder of Apple Watch workouts and vitals; write training plans back as files.

已驗證STDIO僅桌面位置與生活檔案與儲存

概覽

AI 產生的概覽

讀取本機 Health Access 資料夾中的 Apple Watch 訓練、生命徵象與心電圖,並把訓練計畫與努力評分以檔案形式寫回。

可以做什麼
  • 列出並檢視訓練,含摘要列、分段文字、心率區間與心臟負荷
  • 讀取近期生命徵象與依 ISO 週的訓練彙總
  • 讀取指定日期範圍的每日檔案、目錄索引、個人資料與心電圖摘要
  • 為某次訓練儲存運動員自述的努力評分
  • 驗證訓練計畫並寫入資料夾,再查詢計畫狀態與列出所有計畫
適用情境
適合已把 Apple 健康資料匯出到 Health Access 資料夾的運動員,讓助理回顧訓練、生命徵象與訓練負荷,或草擬並提交給 Watch 應用程式的訓練計畫。
執行需求
透過 npx 或 Docker 以 stdio 在本機執行,不需帳號、網路或 API 金鑰。伺服器需找到 Health Access 資料夾:可用 --dir、環境變數 HEALTHACCESS_DIR(別名 TIDE_DIR)、config.toml 中的路徑,或自動在雲端硬碟與「文件」目錄中探索。Docker 需掛載該資料夾並傳入 --dir。
安裝前請注意
它會讀取資料夾中的個人健康資料(訓練、心率、睡眠、體重、血壓、個人資料),只應指向你願意交給助理的資料夾。rate_workout 與 push_plan 會寫入檔案;若已有 Apple 自帶的努力評分,除非 override 為 true 否則會被拒絕。伺服器也會在 mcp/clients 下寫入連線狀態檔,含用戶端名稱、機器名稱與最後呼叫的工具名稱。

安裝

在 SourceWeft 中

  1. 開啟 儀表板中的 Healthfolder,將其新增到工作區。
  2. 為需要使用其工具的對話啟用該服務。

Desktop only,透過 STDIO。 STDIO 服務會啟動本機處理程序,因此需要 SourceWeft 桌面主機。

其他 MCP 客戶端

參照 儲存庫 中的啟動說明。

README

healthfolder

Read a Health Access folder of Apple Watch workouts and vitals, and write training plans back into it — as plain files. The folder an app writes from Apple Health (workouts, day files, an index, a profile) is the whole API: this package is a local stdio MCP server plus a CLI over that folder. No account, no network, nothing leaves the machine.

How the folder is found

First hit wins:

  1. --dir <folder> on the command line
  2. the HEALTHACCESS_DIR environment variable (alias TIDE_DIR)
  3. dir = "..." in ~/.config/healthaccess/config.toml (the path can be overridden with HEALTHACCESS_CONFIG; zone bounds can also be set there as zones = [133, 146, 158, 169])
  4. discovery: iCloud Drive, then ~/Library/CloudStorage/*, ~/Dropbox, ~/Google Drive, ~/OneDrive*, ~/Box, then ~/Documents. A Health Access folder holds an index.json of schema healthaccess.index.v1 and a workouts/ directory. If discovery finds several, the server refuses to guess and lists them.

Run healthfolder --check to print the resolved folder, where it came from, and the zone bounds in effect.

CLI

sh
npx -y @reneturcios/healthfolder --checknpx -y @reneturcios/healthfolder list --sport swim --limit 5npx -y @reneturcios/healthfolder show 7A1C3E90npx -y @reneturcios/healthfolder vitals --days 14npx -y @reneturcios/healthfolder summary --weeks 4npx -y @reneturcios/healthfolder rate 7A1C3E90 7 "legs heavy, breathing fine"npx -y @reneturcios/healthfolder plan push ./s30.jsonnpx -y @reneturcios/healthfolder plan status 2026-10-24T20:22:05Z-s30npx -y @reneturcios/healthfolder plan listnpx -y @reneturcios/healthfolder day 2026-05-14npx -y @reneturcios/healthfolder days --from 2026-05-01 --to 2026-05-14 --groups heart,sleepnpx -y @reneturcios/healthfolder catalognpx -y @reneturcios/healthfolder profilenpx -y @reneturcios/healthfolder ecgs

Every command prints pretty JSON. Exit codes: 0 success, 1 domain or IO error, 2 usage error. --dir works on every subcommand.

MCP server

sh
npx -y @reneturcios/healthfolder mcp

MCP client config:

json
{  "mcpServers": {    "healthfolder": {      "command": "npx",      "args": ["-y", "@reneturcios/healthfolder", "mcp"]    }  }}

Add "--dir", "<absolute path>" to args to skip the folder search.

Tools (13)

ToolWhat it does
list_workoutsWorkouts from the index (deduplicated, newest first), one summary line each
get_workoutOne workout in full: document, summary, parts text, zones, cardiac cost
get_vitalsResting HR, HRV, body mass, sleep, steps, VO2max, blood pressure over the last N days
training_summaryOne entry per ISO week: volume, zones, effort, cardiac cost, rings from day files
rate_workoutStore the athlete's own effort rating (1–10) in the workout file
push_planValidate a training plan and write plans/<id>.json for the app to put on the Watch
get_plan_statusA plan's state: pending, scheduled, failed or cancelled
list_plansEvery plan with its state and planned distance/time
get_dayOne day file with every Health group it holds
get_daysDay files in a range (max 366 days), optionally reduced to named groups
get_catalogcatalog.json plus the export-coverage check
get_profileprofile.json as written
list_ecgsEvery ECG summary in ecg/, newest first

All results are pretty-printed JSON text with floats rounded to one decimal. Malformed arguments are JSON-RPC InvalidParams errors; domain problems (unknown id, failed validation, a refusal) come back as isError results with the reason in plain words.

Two safety rules are built in:

  • rate_workout only ever stores a number the athlete said. A workout that already carries Apple's own rating (effort_source: "apple") is refused unless the call passes override: true — the refusal names the file, the existing rating, and the remedy, and nothing is written.
  • push_plan reports every validation violation in one message (sport, name length, block/step shape, goal type and value, zone, label length), so a plan can be fixed in one pass.

Resources: healthaccess://index (the deduplicated index) and the template healthaccess://workout/{id} (one workout, heart-rate series included). MCP prompts are not implemented in this build.

Derived numbers

  • Zones. Four bounds, five zones. Bounds come from config.toml, else are estimated from the age in profile.json: max HR = 208 − 0.7 × age, bounds at 72/79/86/92 % of it (age 34 → [133, 146, 158, 169]). Zone seconds are computed from the heart-rate series: each sample's time until the next sample goes to that sample's zone, only time inside the workout counts, gaps over 60 s count as 60 s. With no bounds known, a file's own legacy zones are shown, marked bounds_source: "file".
  • Cardiac cost (swims only) = avg HR × best freestyle 100 m pace (s) / 60 = heart beats per 100 m; lower is better. The best 100 is the fastest work step of at least 95 m whose overlapping laps were at least half freestyle, normalised to 100 m; if no step qualifies and the swim is at least 100 m, the whole-workout pace is used.
  • Summary lines look like: 2026-05-14 Pool swim "S12" · 1200 m · 36:06 · avg HR 129 (max 162) · Z1–2 93% · effort 6/10 (apple) · best FR 100 2:12 → 284 beats/100 m — each segment appears only when its data exists.

Presence handshake

On initialize, and after tool calls at most once a minute, the server writes mcp/clients/<id>.json in the folder so the app can show "Connected". The id is the FNV-1a 64 hash of machine name + client name; the file carries the client name/version from the initialize request, the machine name (HEALTHACCESS_MACHINE overrides it), call counts carried over between writes, and the last tool name — never arguments or results. A failed write never fails a tool call. The CLI writes the same file, as client healthfolder-cli, only from the commands that write into the folder anyway (rate, plan push).

Docker

sh
docker run -i ghcr.io/cloudcorprecords/healthfolder            # stdio MCP serverdocker run --rm ghcr.io/cloudcorprecords/healthfolder list --dir /data

Mount the Health Access folder into the container and pass --dir (or set HEALTHACCESS_DIR) so the server can find it.

Development

sh
npm installnpm run build   # tsc -> dist/npm test        # tsx --test test/*.test.ts (synthetic folders, no network)npm run dev     # run the CLI from source

License

MIT — Copyright (c) 2026 Rene Turcios.

來源:README.md,提交 cf06900

工具

13

list_workouts

List workouts from the Health Access folder, newest first, with a one-line summary each. Read-only.

輸入參數limitsincesport

get_workout

Open one workout in full: the workout document plus summary, parts text and cardiac cost. Read-only.

輸入參數id必填include_lapsinclude_hr_series

get_vitals

The seven-metric vitals view (resting HR, HRV, body mass, sleep, steps, VO2max, blood pressure) of the last N days, oldest first, with latest values and averages. Read-only.

輸入參數days

training_summary

Training summary: one entry per ISO week ending in the current week, empty weeks included. Read-only.

輸入參數weeks

rate_workout

Store the athlete's own effort rating (1 to 10) and optional feel note in a workout file. Call only with a number the athlete said; an existing Apple rating is refused unless override is true.

輸入參數id必填feeleffort必填override

push_plan

Validate a healthaccess.plan.v1 training plan and write it into the folder's plans/ directory for the app to put on the Watch. Every validation violation is reported in one message.

輸入參數plan必填

get_plan_status

Read a plan's status as the app recorded it: pending, scheduled, failed or cancelled. Read-only.

輸入參數id必填

list_plans

List every plan in the folder's plans/ directory with its state, planned distance and time, newest first. Read-only.

無需輸入參數。

get_day

Read one day file (days/<date>.json) with every Health group it holds. Read-only.

輸入參數date必填

get_days

Read the day files in a date range (at most 366 days), oldest first, optionally reduced to named groups. Read-only.

輸入參數to必填from必填groups

get_catalog

Read catalog.json (which Health types have data and where they were exported) plus the export-coverage check. Read-only.

無需輸入參數。

get_profile

Read profile.json: age, birth year, sex, blood type and the app's other profile fields. Read-only.

無需輸入參數。

list_ecgs

List every ECG file in the folder's ecg/ directory, newest first. Read-only.

無需輸入參數。

版本歷史

1
  1. v0.1.0最新Nov 5, 2026

評分

已滿足適用檢查項的 90%

該評分衡量此收錄條目的完整程度,依據註冊中心條目、端點與公開來源計算得出。它不是對伺服器本身的評價,也不表示伺服器安全或目前可用:可連通性是帶日期的檢查結果,評分也不包含安裝量或使用者評價。

  • 近 30 天內可連通25 分
  • 已宣告認證方式10 分

    請在註冊中心條目中宣告憑證請求標頭,或保持端點能夠回應探測,以便判定其認證方式。

  • 已列出工具必需15 分
  • 描述必需15 分
  • 圖示10 分
  • 文件15 分
  • 授權條款10 分