health4ai について
health4aiは、Apple HealthのデータをAIクライアントから照会するためのiOSアプリとローカルMCPサーバーです。データは利用者自身のSupabaseプロジェクトに同期され、health4.aiのインフラには保存されません。
主な機能
- 01HealthKitのバックグラウンド同期
- 02所有するSupabaseへのデータ保存
- 03健康概要・睡眠・HRVの照会
- 04ワークアウトと指標履歴の照会
- 05回復とトレーニングの概要
活用シーン
- 01週ごとの睡眠と回復の確認
- 02HRVとワークアウト傾向の確認
- 03期間ごとの指標の比較
MCP 対応
ローカルMCPサーバーは、健康概要、睡眠、HRV、ワークアウト、指標、傾向、コーチングのツールを公開します。Claude、Cursor、OllamaなどのMCPクライアントに接続できます。
設定
ローカルサーバーの設定はどのクライアントでも共通です。コピーしてクライアントの MCP 設定ファイルに貼り付けてください。
このサーバーのパッケージやリモートエンドポイントはまだ取得できていません。プロジェクトの README の手順に従ってください。
ツール
ローカルサーバーのツールはマシン上で起動して初めて取得できます。メンテナーはまだツール一覧を提供していません。
詳細
health4.ai — Apple Health × AI
睡眠、HRV、回復、フィットネスについて、AI に自然な言葉で質問できます。
無料の iOS アプリ · 自分のデータベース · あらゆる MCP クライアントで利用可能
App Store から health4ai をダウンロード
できること
iPhone HealthKit → Your Supabase project → MCP server → Any AI
Apple Health には、睡眠ステージ、HRV、心拍数、ワークアウト、VO₂ max、その他 150 種類以上の指標など、何年にもわたる生体データが保存されています。health4.ai は専用の MCP ツールを通じて、そのすべてを Claude、ChatGPT、Cursor、Ollama、または MCP 対応クライアントから照会できるようにします。
データは自分で管理できます。 作成して所有する Supabase プロジェクトに同期されます。health4.ai はバックエンドを運用せず、健康データを保存したり、アクセスしたりすることはありません。
開発の背景
| 課題 | health4.ai の解決策 |
|---|---|
| Apple には HealthKit のサーバー API がなく、アクセスには端末上のアプリが必要です | HKObserverQuery と BGTaskScheduler によるバックグラウンド同期を備えたネイティブ iOS アプリ |
| Health Auto Export は同じ WiFi 上でしか動作しません | データは Postgres に保存され、どこからでもあらゆる AI で照会できます |
| claude.ai の Apple Health コネクタは Claude Code CLI や Cursor には接続できません | 標準の MCP(stdio)を使用し、設定ブロックひとつでどこでも動作します |
| 多くのソリューションでは管理されたクラウドサービスが必要です | 自分の Supabase プロジェクトを使用でき、health4ai はサーバーを運用しません |
デモ
デモ動画は準備中です。一般的な会話例を以下に示します。
You: How was my recovery this week? Anything standing out?
Claude: Your recovery this week was mixed but trending positive.
• HRV averaged 58ms (Tue–Thu strong at 64–68ms; Monday low at 44ms after Saturday's long run)
• Sleep averaged 7h 12m — Wednesday and Thursday were your best nights (7h 40m+)
• Resting HR dropped from 54bpm Monday to 49bpm Friday — a good sign
Recommendation: today looks like a solid day for a moderate-intensity session.
クイックスタート
health4ai を利用するには、ご自身が所有する Supabase プロジェクトが必要です。アプリは Supabase Auth でサインインし、Supabase Edge Function 経由で書き込みを行うため、通常の Postgres(Neon、ローカルの Docker コンテナ)はバックエンドとしてサポートされていません。詳しい手順は docs/SETUP.md をご覧ください。
1. スキーマを作成します。 supabase.com でプロジェクトを作成し、SQL エディターを開いて web/public/schema.sql(https://health4.ai/schema.sql にもあります)を実行します。これは supabase/bootstrap/ から生成されます。テーブル、行レベルセキュリティ、クライアントからの直接アクセスを拒否する権限設定が含まれます。新規プロジェクトには番号付きのマイグレーションが適用されないため、supabase db push は使用しないでください。
2. ingest 関数をデプロイします(Supabase CLI が必要です)。
git clone https://github.com/jefflitt1/health4ai.git
cd health4ai
supabase functions deploy healthkit-ingest --project-ref <your-project-ref> --no-verify-jwt
--no-verify-jwt は意図的に指定しています。この関数自体がサインイン済みユーザーのトークンを検証し、そのユーザーの ID のみを使って書き込みます。
3. ユーザーを作成します。 ダッシュボードで Authentication → Users を開き、ユーザーを追加して UID をコピーします。アプリはサインインしますが、サインアップは行いません。
次に、MCP サーバーをセットアップします(同じチェックアウトから実行します)。
cp mcp-server/.env.example mcp-server/.env
mcp-server/.env を編集します。
DATABASE_URL=postgresql://... # your project's pooler connection string (database password, not a key)
HEALTHKIT_USER_ID=... # your Supabase Auth user's UID (see mcp-server/.env.example)
AI クライアントに追加します。
Claude Code / Claude Desktop
{
"mcpServers": {
"health4ai": {
"command": "python",
"args": ["/path/to/health4ai/mcp-server/main.py"],
"env": {
"DATABASE_URL": "postgresql://...",
"HEALTHKIT_USER_ID": "<your auth user UID>"
}
}
}
}
Cursor
同じブロック → ~/.cursor/mcp.json
Ollama(ローカルモデル)
mcphost または mcp-client-for-ollama と組み合わせます。
mcphost --model ollama/llama3.2 \
--mcp-server "health4ai:python /path/to/health4ai/mcp-server/main.py"
モデルはお使いのハードウェア上で実行され、MCP サーバーはローカルで実行されます。健康データはご自身の Supabase プロジェクトから読み取られます。
App Store からiOS アプリをインストールし、ご自身の Supabase プロジェクト(Project URL + anon key)に接続して、作成したユーザーでサインインし、Start Sync をタップします。TestFlight ベータ版を利用する場合は、テスター分離ガイドに従ってください。他の人のバックエンドや認証情報は決して使用しないでください。
MCP ツール
| ツール | 回答できる内容 |
|---|---|
get_health_summary | 過去 N 日間の主要指標の概要 |
get_sleep | REM、Deep、Core の各ステージを含む、夜ごとの睡眠の内訳。1 晩につき 1 つのソースを使用します。優先順位は Oura > Apple Watch > Whoop > Garmin > Withings > その他のソース(iPhone を含む)のうちステージ記録が最も多いものです |
get_hrv_trend | 日ごとの HRV(SDNN)、移動比較、トレンド |
get_daily_snapshot | 特定の日付に記録されたすべてのデータ |
get_workouts | 種類、継続時間、距離、カロリーを含む最近のワークアウト |
query_metric | 任意の HealthKit 指標タイプの生時系列データ |
get_long_term_trend | 数年分の月次集計(生データ + サマリーティア) |
get_coaching_brief | 回復状況、睡眠の質(get_sleep と同じく 1 晩につき 1 つのソースを使用)、トレーニング負荷、フィットネス指標 |
search_records | 指標がしきい値を超えた日を検索 |
get_metric_stats | 個人の基準値:最小値/最大値/平均値/パーセンタイル |
compare_periods | 2 つの期間における指標を比較 |
指標が空の場合は、鵜呑みにする前に data_status を確認してください
iOS は、Health のアクセス許可が拒否されたことをアプリに知らせません。 共有されていない種類のデータを取得すると、空の結果が返されます。これは、実際に何もしなかった日の結果とバイト単位で同一です。HealthKit の API にはこの2つを区別する方法がないため、単なる 0 を見たアシスタントは、自信を持って「歩数はありませんでした」と伝えてしまいます。
空の結果を返す可能性のあるツールは、そのため data_status ブロックを付けます。
never_recorded— この指標のサンプルがこれまで一度も記録されていません。歩数、心拍数、アクティブエネルギー、歩行距離については、データが共有されていればこの状態にはならないため、ほぼ間違いなく共有されていません。ヘルスケア → 共有 → App → health4ai を開き、対象の指標をオンにしてから、アプリのホームタブでインポートを再実行してください。empty_window— 指定した期間内にはデータがありませんが、別の期間にはその指標のデータがあります。これは実際の空白期間であり、アクセス許可の問題ではありません。
これは仮定の話ではありません。著者自身のアカウントでは、他のすべての指標が正常に同期され、アプリに緑色の「Complete」が表示されていた間、歩数、心拍数、アクティブエネルギー、歩行距離が3か月近く、気づかれないまま共有されていませんでした。
アーキテクチャ
┌─────────────────────────────────────────────────────────────┐
│ iPhone │
│ HKObserverQuery + BGTaskScheduler │
│ → continuous background sync │
└──────────────────────────┬──────────────────────────────────┘
│ HTTPS → your healthkit-ingest Edge Function
▼
┌─────────────────────────────────────────────────────────────┐
│ Your Supabase project (you own it) │
│ healthkit_metrics · healthkit_daily_summaries │
│ row-level security on · no direct client access │
└──────────────────────────┬──────────────────────────────────┘
│ Postgres connection (database password, from your machine)
▼
┌─────────────────────────────────────────────────────────────┐
│ FastMCP server (mcp-server/main.py) │
│ FastMCP tools · stdio transport │
└──────────────────────────┬──────────────────────────────────┘
│ MCP
▼
Claude · ChatGPT · Cursor · Ollama · any client
データ階層: 過去30日以内のクエリでは生サンプルが返されます。それより古い日については、healthkit_daily_summaries に事前集計された行があればそれを使い、なければ Postgres 内で生サンプルから日ごとに集計します。そのため、プロジェクトで集計処理が一度でも実行されたかどうかにかかわらず、結果は完全です(新しいセルフホストプロジェクトでは、集計処理は一度も実行されていません)。レスポンスには、各階層が何日分を処理したかを示す tier ブロックが含まれます。暦日は HEALTH4AI_TZ に従います(デフォルトは UTC です。mcp-server/.env で設定してください)。
リポジトリの構成
health4ai/
├── ios/ # Swift/SwiftUI iOS app (iOS 17+)
│ └── Health4AI/ # HealthKit sync engine, auth, settings
├── mcp-server/
│ ├── main.py # FastMCP server entry point
│ ├── tools.py # MCP tool implementations
│ └── .env.example # Required environment variables
├── web/
│ ├── public/schema.sql # Generated from supabase/bootstrap (Supabase only)
│ └── src/ # Astro marketing site
├── scripts/
│ ├── import_health_export.py # One-time XML backfill from Apple Health export
│ └── summarize_historical.py # Backfill daily summaries table
└── docs/
└── SETUP.md # Detailed setup guide
プライバシー
健康データは、iPhone からお客様自身の Supabase プロジェクトに直接送信されます。health4.ai がデータを受信、保存したり、アクセスしたりすることはありません。MCP サーバーはお客様自身の認証情報を使ってローカルで実行されるため、データが当社のインフラに触れることはありません。
詳しくはプライバシーポリシーをご覧ください。
コントリビューション
MIT ライセンスです。プルリクエストを歓迎します。
最初に取り組むのに適した分野:指標集計の追加、JWT/RLS による複数ユーザー対応、Android 対応、MCP クライアントとの連携ガイドの拡充。
SQL の変更には明示的な権限付与が必要です。 Supabase では、新しい public テーブルに対する anon/authenticated/service_role のアクセス権が自動付与されなくなりました(2026-10-30 以降の既存プロジェクト)。そのため、テーブルの SQL に利用者を指定するまで、Data API からテーブルにアクセスできません。scripts/migration-templates/public_table.sql をひな形として使ってください。お客様がインストールするテーブルは supabase/bootstrap/ に配置し、その後 scripts/build_schema_sql.sh を実行してください。scripts/lint-migration-grants.sh は web/public/schema.sql とマイグレーションフォルダーをチェックし、テーブルに権限付与がない場合は CI が失敗します。過去の番号付きマイグレーションで見つかった問題は、scripts/migration-grants-baseline.txt に記録され、以後変更されません。
ライセンス
MIT — LICENSE をご覧ください。
コメント
AI アプリケーションが外部のツールやデータソースに統一的な方法で接続するためのオープンなプロトコルです。クライアントはモデルとの対話を担い、MCP サーバーはツール・リソース・プロンプトテンプレートを提供します。標準メッセージでやり取りするため、1 つのサーバーを複数のクライアントで再利用できます。