個人 GitHub 帳號下公開儲存庫的擁有者可以登入並驗證所有權,自行管理介紹,無需管理員核准。
登入並產生驗證檔案,在 30 分鐘內將其提交至此儲存庫的預設分支。其他分支或分叉儲存庫中的檔案無效。然後在下方檢查檔案,即可無需管理員核准直接管理專案。請保留檔案以維持管理權限。
如需登入,將前往登入頁面。登入後請回到此處,再次點擊所選的驗證按鈕。
在專案資料夾中執行 /nomorevibe verify,即可驗證所有權並自行管理介紹。
一分鐘完成驗證Connect Apple Health to any MCP-compatible AI agent — sleep, steps, heart rate, HRV, workouts and more, via the Mibly iPhone app.
翻譯準備中
取自儲存庫 README
正在載入完整 README。
檢視完整 README ↗An open-source Apple Health MCP server: bring your Apple Health (HealthKit) data — sleep, steps, heart rate, HRV, workouts, weight, body fat, and more — into Claude Desktop/Code, Codex, or any other AI agent you build or run yourself (anything that speaks MCP).
Local mode: your data never touches Mibly's servers. No account, no cloud, no telemetry. It is stored encrypted on a machine you control, and this repository is the code that does it.
Your agent sets up the receiver and MCP service for you. No cloning, no building, no config files.
Apple Health data can only be read through HealthKit, inside a native iOS app. There is no web API. Mibly handles the HealthKit side — permissions, background sync, and data formatting — so you don't need an Apple Developer account or Xcode.
A reference implementation of the receiver your agent installs. It's here so you can:
You don't need this code to use Mibly. The setup prompt above is the recommended path.
| Question | Answer |
|---|---|
| Where is health data stored? | ~/.mibly/data.enc only. AES-256-GCM, key = scrypt(pairing token, random salt). |
| Does the service make outbound network requests? | No. It only listens. No telemetry, no update check. |
| Who can read it over the network? | Anyone holding the pairing token. Every route requires Authorization: Bearer <token>. |
| How long is it kept? | 365 days of history. Only the latest sample per type is kept longer. |
| Is traffic encrypted in transit? | No. Local mode is designed for your home or office LAN: the iPhone and this receiver sit on the same Wi-Fi and talk plain HTTP. Don't expose the port to the public internet. |
Check it yourself. This should print nothing:
grep -rnE "fetch\(|https?\.request|axios|net\.connect|XMLHttpRequest" src
The wire protocol (endpoints, payloads, storage format) is in PROTOCOL.md; the threat model is in SECURITY.md.
Requires Node.js 18+.
npm ci
npm run build
MIBLY_TOKEN=<token from the Mibly app> npm start
On first run the token is saved to ~/.mibly/config.json (mode 0600), so later restarts need no env var. On startup the receiver prints the address(es) to use, e.g. Target Host to enter in Mibly: 192.168.1.24:7345 (en0). Enter that in the app's Target Host field (just IP:port, no http://, no path); pick the address on your Wi-Fi/LAN if several are listed.
| Variable | Meaning | Default |
|---|---|---|
MIBLY_TOKEN | Pairing token from the app | saved config |
MIBLY_HOST | Bind address host:port | 0.0.0.0:7345 |
Connect an MCP client over HTTP to http://<ip>:7345/mcp with the header Authorization: Bearer <token>. For agents that spawn MCP servers over stdio, add --stdio (logs go to stderr).
If you regenerate the token in the app, restart with the new MIBLY_TOKEN. The old encrypted store can't be decrypted with the new key, so the receiver starts empty.
Code map: src/index.ts (routes) · src/auth.ts (token check) · src/config.ts (~/.mibly/config.json) · src/ingest.ts (validation) · src/store.ts (encryption, retention, queries) · src/mcp.ts (the two tools). Run the tests with npm test.
The receiver should keep running after a restart. Replace the paths (and, on Linux, the user) with yours; the token is already saved in ~/.mibly/config.json, so no env var is needed.
macOS (launchd) — ~/Library/LaunchAgents/com.mibly.receiver.plist:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0"><dict>
<key>Label</key><string>com.mibly.receiver</string>
<key>ProgramArguments</key><array>
<string>/usr/local/bin/node</string>
<string>/Users/you/mibly-apple-health-mcp/dist/index.js</string>
</array>
<key>RunAtLoad</key><true/>
<key>KeepAlive</key><true/>
</dict></plist>
launchctl bootstrap gui/$(id -u) ~/Library/LaunchAgents/com.mibly.receiver.plist
Linux (systemd) — /etc/systemd/system/mibly-receiver.service:
[Unit]
Description=Mibly receiver
After=network-online.target
Wants=network-online.target
[Service]
User=you
ExecStart=/usr/bin/node /home/you/mibly-apple-health-mcp/dist/index.js
Restart=always
[Install]
WantedBy=multi-user.target
sudo systemctl enable --now mibly-receiver
Restart the machine, then confirm the receiver is back (use the IP the receiver printed):
curl -H "Authorization: Bearer <token>" http://<ip>:7345/status
A JSON reply with version and lastPushAt means it is running.
Update in place; do not set up a second receiver.
npm ci && npm run build, and restart the service.~/.mibly and do not change the token. A new token starts an empty store.heartRate records (single readings without heartRateSummary) are deleted on start-up, because heartRate is now an hourly summary. Everything else is kept.GET /status: it should show the new version and capabilities.Newer Mibly app features need the matching receiver version; older apps keep working with a newer receiver.
| Local (Free) | Cloud (Pro) | |
|---|---|---|
| Data path | iPhone → an agent environment you control | iPhone → Mibly Cloud → your agents |
| Remote access across devices | — | ✓ |
| Multiple agents on the same data | — | ✓ |
| Menstrual cycle data | Available (off by default) | Never uploaded |
This repository covers Local only. You choose which data types are shared and can turn each one off at any time.
MIT