list_workouts
List workouts from the Health Access folder, newest first, with a one-line summary each. Read-only.
limitsincesport
io.github.CloudCorpRecordsPublished by GitHub account CloudCorpRecordsv0.1.0Updated Nov 5, 2026
Read a Health Access folder of Apple Watch workouts and vitals; write training plans back as files.
Reads a local Health Access folder of Apple Watch workouts, vitals and ECGs, and writes training plans and effort ratings back as files.
Desktop only via STDIO. STDIO servers start a local process, so they need the SourceWeft desktop host.
Follow the launch instructions in the repository.
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.
First hit wins:
--dir <folder> on the command lineHEALTHACCESS_DIR environment variable (alias TIDE_DIR)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])~/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.
Every command prints pretty JSON. Exit codes: 0 success, 1 domain or
IO error, 2 usage error. --dir works on every subcommand.
MCP client config:
Add "--dir", "<absolute path>" to args to skip the folder search.
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.
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".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.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).
Mount the Health Access folder into the container and pass --dir
(or set HEALTHACCESS_DIR) so the server can find it.
MIT — Copyright (c) 2026 Rene Turcios.
Source: README.md at commit cf06900
List workouts from the Health Access folder, newest first, with a one-line summary each. Read-only.
limitsincesportOpen one workout in full: the workout document plus summary, parts text and cardiac cost. Read-only.
idrequiredinclude_lapsinclude_hr_seriesThe 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.
daysTraining summary: one entry per ISO week ending in the current week, empty weeks included. Read-only.
weeksStore 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.
idrequiredfeeleffortrequiredoverrideValidate 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.
planrequiredRead a plan's status as the app recorded it: pending, scheduled, failed or cancelled. Read-only.
idrequiredList every plan in the folder's plans/ directory with its state, planned distance and time, newest first. Read-only.
Takes no parameters.
Read one day file (days/<date>.json) with every Health group it holds. Read-only.
daterequiredRead the day files in a date range (at most 366 days), oldest first, optionally reduced to named groups. Read-only.
torequiredfromrequiredgroupsRead catalog.json (which Health types have data and where they were exported) plus the export-coverage check. Read-only.
Takes no parameters.
Read profile.json: age, birth year, sex, blood type and the app's other profile fields. Read-only.
Takes no parameters.
List every ECG file in the folder's ecg/ directory, newest first. Read-only.
Takes no parameters.
90% of the applicable checks met
How complete this listing is, computed from the registry entry, the endpoint and public sources. Not a rating of the server and not a statement that it is safe or working today: reachability is a dated check, and no installs or reviews go into the score.
Declare the credential headers in the registry entry, or keep the endpoint answering the probe so its auth can be classified.
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 ecgsnpx -y @reneturcios/healthfolder mcp{ "mcpServers": { "healthfolder": { "command": "npx", "args": ["-y", "@reneturcios/healthfolder", "mcp"] } }}docker run -i ghcr.io/cloudcorprecords/healthfolder # stdio MCP serverdocker run --rm ghcr.io/cloudcorprecords/healthfolder list --dir /datanpm installnpm run build # tsc -> dist/npm test # tsx --test test/*.test.ts (synthetic folders, no network)npm run dev # run the CLI from source