mcpField
O
Open Health Sync

Open Health Sync

ローカル
github.com/soma-intelligenceヘルスケア521 日前に更新

Open Health Sync について

Open Health Sync は、健康データの取り込みと正規化を行うセルフホスト型レイヤーです。アプリ開発者や、自分のサーバーにデータを集約したい人向けに、複数のソースを共通モデルにまとめ、REST、FHIR R4、読み取り専用 MCP サーバーで提供します。

主な機能

  1. 01複数の健康データソースに接続
  2. 02単位とレコードを正規化
  3. 03生データを保持して再処理
  4. 04REST と FHIR R4 でデータ提供
  5. 05同期状況の確認とデータ削除

活用シーン

  1. 01健康アプリのバックエンド構築
  2. 02個人の健康データをエージェントに読み取り専用で提供
  3. 03研究用のウェアラブルデータ収集
  4. 04個人の健康データのアーカイブ

MCP 対応

AI エージェントが同期済みの健康データを参照できる、読み取り専用 MCP サーバーを提供します。

設定

ローカルサーバーの設定はどのクライアントでも共通です。コピーしてクライアントの MCP 設定ファイルに貼り付けてください。

mcp.json · 共通設定
{
"mcpServers": {
"soma-intelligence-open-health-sync": {
"command": "docker",
"args": [
"run",
"-i",
"--rm",
"-e",
"OHS_MCP_URL",
"-e",
"OHS_MCP_KEY",
"ghcr.io/soma-intelligence/open-health-sync:0.2.0"
],
"env": {
"OHS_MCP_URL": "<OHS_MCP_URL>",
"OHS_MCP_KEY": "<OHS_MCP_KEY>"
}
}
}
}
起動コマンドdocker run -i --rm -e OHS_MCP_URL -e OHS_MCP_KEY ghcr.io/soma-intelligence/open-health-sync:0.2.0
設定が必要な環境変数
OHS_MCP_URLBase URL of your Open Health Sync instance. Must be https unless the host is loopback (inside a container, loopback is the container itself).
OHS_MCP_KEYシークレットA user token with the read scope (ohs_ut_...) or a tenant API key (ohs_sk_...).

ローカルサーバーにはマシン上の実行環境(Node.js 18 以上など)が必要です。設定ファイルの場所はクライアントごとに異なります。

パッケージ
ocighcr.io/soma-intelligence/open-health-sync:0.2.0

ツール

ツール一覧はまだ取得されていません

ローカルサーバーのツールはマシン上で起動して初めて取得できます。メンテナーはまだツール一覧を提供していません。

詳細

健康データを安心して同期できます。文字で描かれた鯉が、途切れのないループで線の周りを泳ぎます。

Open Health Sync:18のデータソースを1つのGoバイナリに集約します(バックグラウンド同期、rawストア、正規化、Postgres)。18すべてがv0.2.0で利用できます:Apple Health、Withings、Health Connect、Oura、WHOOP、Fitbit、Polar、Strava、Suunto、Ultrahuman、Dexcom、OMRON、intervals.icu、Garmin、Eight Sleep、Xiaomi、アクティビティファイル、Bluetoothデバイス。出力はすべてv0.2.0で利用できます:REST API、読み取り専用MCP、FHIR R4、Open mHealth、CSV/Parquetエクスポート、送信Webhook。CorosとHealth Connect経由のSamsung Healthは今後対応予定です。表示されているJSONは、APIから実際に読み取った心拍数のサンプルです。

Open Health Sync

ウェアラブルと健康データのための、1つのオープンAPI。自分のサーバーで運用できます。

Apple Health、Withings、Oura、WHOOP、Fitbit、Health Connect、Dexcom、OMRONなど、さらに5つに対応。
REST、FHIR R4、AI エージェント向け読み取り専用MCP サーバーを通じて、統一されたデータモデルを提供します。
無料で使えるGoバイナリとPostgresのみで動作し、Raspberry Piでも実行できます。
Terraなどのホステッド型ウェアラブルAPIに代わる、オープンソースでセルフホスト可能な選択肢です。

CI リリース イメージ amd64 and arm64 Goバージョン ライセンス:AGPL-3.0 ホステッド版ベータ:無料で登録

Apple Health: 利用可能 Withings: 利用可能 Oura: 利用可能 WHOOP: 利用可能 Strava: 利用可能 Polar: 利用可能 Fitbit: 利用可能 Suunto: 利用可能 Ultrahuman: 利用可能 intervals.icu: 利用可能 Health Connect: 利用可能 Dexcom: 利用可能 OMRON: 利用可能 Garmin: 利用可能

docker pull ghcr.io/soma-intelligence/open-health-sync:0.2.0

サーバーを運用したくない方へ ホステッドベータは、運用不要で同じ API を利用できます。1 分でキーを取得し、最初の呼び出しでデモデータを利用できます。
無料で始める →  ·  開発者ポータルにサインイン  ·  ▶ 75 秒の紹介を見る

クイックスタート  ·  ホステッドベータ  ·  比較  ·  ロードマップの概要  ·  ユースケース  ·  理由  ·  機能  ·  仕組み  ·  MCP  ·  FAQ

パーサーをもうひとつ作らずに済んだなら、⭐ スターを付けていただけると、ほかの開発者にも見つけてもらいやすくなります。質問やアイデアはこちら:ディスカッション。

v0.2.0、アーリープレビュー。 0.x のリリースでは、API、設定、スキーマが変更される場合があります。

クイックスタートのターミナル録画。docker compose up で ohs と Postgres が起動します。ohs seed --demo は Oura、WHOOP、Withings、Fitbit、Polar、Apple Health の 90 日分の合成データを 44144 件書き込みます。日次エンドポイントは、apple_health の 8132 歩、oura の安静時心拍数 53 と睡眠スコア 62 を含む 1 日分のデータと、各数値のソースを返します。心拍数の測定値 70 bpm は /samples から FHIR R4 Observation(LOINC 8867-4、UCUM /min)および Open mHealth の心拍数データポイント(beats/min)として返されます。MCP エンドポイントの tools/list は、読み取り専用ツールを 16 個表示します。

合成データを使った v0.1.0 のクイックスタートの記録です。スタックを起動し、6 台のデバイスから 90 日分のデータを読み込み、統合ビューの 1 日分のデータと、1 件の心拍数測定値を REST、FHIR R4、Open mHealth 形式で読み取り、MCP ツールを確認します。モックは一切ありません。録画は再度レンダリングできます。

Open Health Sync(ohs)は、ヘルスデータを取り込み、正規化するセルフホスト可能なレイヤーです。プロバイダーからデータを取得し、スマートフォンからのアップロードを受け付け、各ペイロードをそのまま保存して、1 つの標準モデルと単位にマッピングし、REST API と読み取り専用 MCP サーバーで提供します。ダッシュボードでもコーチングアプリでもなく、医療機器や臨床ソフトウェアでもありません。ご自身で運用するか、ホステッドベータでこちらに運用をお任せください。

🔌 18 のソースを 1 つのモデルに
すべてのプロバイダーのデータを同じレコードにマッピングし、各量に 1 つの単位(UCUM、LOINC)を適用します。ソースでの呼び名にかかわらず、心拍数は bpm です。18 種類すべてを v0.2.0 で提供します。

⚡ 常に最新
プロバイダーの Webhook により、変更されたデータだけを取得します。バックストップとしての取得処理で取りこぼしを補い、/freshness で各ソースの最新状態を確認できます。

🧾 何も破棄しません
すべてのペイロードをディスクまたは S3 にそのまま保存します。マッパーを修正したら、元ファイルからユーザーのデータを再処理できます。再送されたアップロードは重複排除されます。

🤖 AI エージェントですぐに利用可能
読み取り専用の MCP サーバーです。ユーザーは、自分の読み取り専用トークンを使って、自分のデータに自身のエージェントを接続できます。

🏥 標準規格に準拠した出力
OpenAPI 3.1 REST API に加え、公式 HL7 バリデーターで検証された FHIR R4 Observation を提供します。

🔒 データはあなたのもの。完全に削除可能
セルフホスト可能で、外部への通信はありません。DELETE /v1/users/{id} は、行と元ファイルを完全に削除します。プロバイダー側での削除も反映されます。

## ホステッドベータ

同じサーバーを、あなたに代わって運用します。ホステッドベータでは、Postgres、raw store、ワーカーの運用が不要な Open Health Sync を利用できます。サインインしてキーを作成すれば、最初の呼び出しからデータを読み取れます。

開発者ポータルの75秒ツアーを再生します。ポスターには、Sleep Coachというテストプロジェクトのデータページが表示されています。1人のユーザーが、6つのソースから30日間にわたって1.1万件のレコードを記録しており、ソース別に積み上げた1日あたりのレコード数を示す棒グラフがあります(WHOOP、Fitbit、Oura、Polar、Apple Health、Withings)。

テストデータを使った75秒のツアーです。アカウントとプロジェクトを作成し、MCP 経由でコーディングエージェントを接続して、サンプルデータを読み込み、グラフを確認し、エクスプローラーから API を呼び出して、最後に Ctrl K を押します。動画を再生(MP4、9 MB)。

  • 1分でキーを取得。 プロジェクトを作成して、API キーを取得できます。ベータ期間中は、1アカウントにつき3つのプロジェクト、1プロジェクトにつき5つのキーを作成できます。
  • 最初の呼び出しからデータを取得。 クリック1つで、6つのソースから30日分の合成ユーザーデータを追加できます。そのため、最初のリクエストから睡眠、心拍数、歩数が返されます。
  • あらゆる出力形式。 REST(OpenAPI ファイル付き)、FHIR R4、Open mHealth、CSV と Parquet、署名付き Webhook、読み取り専用の MCP サーバーを利用できます。詳しくはここに記載しています。
  • あなたの値が入力されたクイックスタート。 curl、TypeScript、Python にはインスタンスのアドレスが入力されています。さらに、サンプルアプリと MCP 経由の AI エージェントも利用できます。
  • 移行は不要。 このオープンソースサーバーを実行します。このサーバー向けに書いたコードは、ベース URL とキーを変更するだけで自分のインスタンスに移行でき、また戻すこともできます。
ウェブサンプルアプリがプロジェクトキーを使って1人のユーザーのデータを読み戻しています。4つのカウンターには、保留中のジョブなし、データのある日数は15日、拒否された行なし、ソースは apple_health と表示されています。10月3日から16日までの1日あたりの歩数を示す棒グラフでは、1日あたり約4,600~10,700歩で、下には日付の表があります。安静時心拍数のグラフには、最新値54 bpm、14日間の平均値56 bpmと表示されています。最新の夜は、睡眠時間が7時間46分で、深い睡眠、浅い睡眠、REM、覚醒に分けられ、「合成」と表示されています。

ウェブサンプルがプロジェクトキーを使ってユーザーのデータを読み戻します。1日あたりの歩数、安静時心拍数、睡眠ステージは、すべて合成データです。

オープンサインアップの無料ベータで、共有容量で運用されています。現在はテストデータのみ利用できます。デモユーザーと合成ユーザーが対象で、実在する人の健康データは利用できません。セルフホストは引き続き第一級の選択肢であり、サーバーは AGPL のもとで無料のままです。

無料で始める →  メールアドレスで登録して、確認してください。すでにアカウントをお持ちですか? 開発者ポータルにサインイン。

ロードマップの概要

✅ v0.2.0 に含まれる機能  ·  🛠 予定

出力とインテグレーションデータソース
✅REST API(OpenAPI 3.1)、読み取り専用の MCP サーバー✅Apple Health、Withings
✅FHIR R4(Observations、HL7 validator で検証済み)✅Oura、WHOOP、Polar、Strava
✅Open mHealth 出力(ドキュメント)✅Fitbit、Suunto、Ultrahuman、intervals.icu
✅CSV と Parquet のエクスポート(ドキュメント)✅Dexcom(CGM)、OMRON
✅送信 Webhook(ドキュメント)✅Health Connect(Android アプリからのアップロード)
✅バックグラウンド同期と /freshness✅Health アプリのエクスポートデータのインポート
✅Prometheus メトリクスと OpenTelemetry トレース。デフォルトでは無効(ドキュメント)
✅ユーザーと指標ごとに優先順位を設定した、データソース横断の統合ビュー(ドキュメント)
✅/console の管理コンソール:パイプラインの実行と、ブラウザーからのプロバイダーの有効化(ドキュメント)
✅ユーザー、データソース、カテゴリごとの同意と、同意撤回 Webhook(ドキュメント)
✅データポータビリティに対応した、ユーザーごとの完全なアーカイブ(ドキュメント)
✅認証済みリクエストすべての追記専用監査ログ。GET /v1/audit で読み取り可能(ドキュメント)
✅CI でテスト済みのバックアップ・復元スクリプト(ドキュメント)
✅Helm チャートによる Kubernetes 対応(ドキュメント)
✅Render、Fly.io、Railway 用のデプロイテンプレート(ドキュメント)
✅ホスト型接続ページ:アプリ名とロゴを設定でき、データソースごとにボタンを表示(ドキュメント)
✅切断時に、ユーザーの特定のデータソースのデータを消去。Apple Health と Health Connect にも対応
✅トレーニング、睡眠、回復に関する12個の MCP プロンプトと、エージェントスキル(ドキュメント)
✅TypeScript と Python 用のサーバー SDK、および Postman コレクション(ドキュメント)
✅プロバイダー向けルートのレート制限(ドキュメント)
✅cosign で署名されたイメージと checksums.txt。鍵不要(検証方法)
✅暗号化キーのオンラインローテーション(ドキュメント)
✅任意のタイムゾーンでの、量の種類ごとの時間別・日別統計。REST と MCP に対応(ドキュメント)
✅初回起動時にブラウザーでセットアップ。ワンタイムトークンを使用し、レート制限を適用するため、アプリストアでのターミナル操作は不要(ドキュメント)
✅Xiaomi:Mi Fitness データのインポート、および Xiaomi、Amazfit、RingConn 向けの Health Connect アトリビューション(ガイド)
✅Garmin:独自の Garmin アプリを持つ運用者向けの Health API コネクター(日次サマリー、睡眠、アクティビティ、HRV、体組成など)(ガイド)
✅アクティビティファイル:FIT、GPX、TCX、および Garmin、COROS、Wahoo、Suunto、Zwift、Strava のエクスポートデータに対応。ohs import files を使用(ガイド)
✅REST、FHIR(波形は SampledData)、MCP、エクスポートを通じた ECG 記録(ドキュメント)
✅セルフレポート:同期データと並べて、本人の評価(気分、ストレス、エネルギー、睡眠の質など)を記録(ドキュメント)
✅共有リンク(SMART Health Links):有効期限、パスコード、組み込みビューアーを備えた、医師やコーチ向けの暗号化 FHIR バンドル(ドキュメント)
✅1つのインスタンスで複数のチームにサービスを提供できるよう、インスタンス管理者キーを使って HTTP 経由でテナントとその API キーを管理(ドキュメント)
✅パーソナルモード(ohs admin personal setup)と、個人データを使った8つの小さな Go レシピ🛠SMART on FHIR 経由の医療記録(EHR)
✅Kotlin、Swift、React Native、Flutter SDKとサンプルアプリ🛠Coros
リリースが公開されたときにのみ、行が上に移動します。ソースごとの詳細:
docs/connectors。

構築できるもの

  • ヘルスアプリのバックエンド。 iOS アプリから HealthKit データをアップロードし、ユーザーは Oura、WHOOP、Withings のアカウントを接続します(ロゴを入れたホスト型の接続ページを経由)。アプリは 18 種類の API ではなく、1 つの API を読み取ります。
  • 独自データを扱う AI エージェント。 自宅で実行し、デバイスを接続して、MCP を通じて睡眠、ワークアウト、心拍数の読み取り専用ビューをデスクトップエージェントに提供します。
  • 参加者のウェアラブルデータを収集する研究。 監査用に生のペイロードを保持し、研究参加を取りやめた場合は完全に削除でき、分析側には FHIR R4 を出力します。
  • 個人データのアーカイブ。 ヘルスケアアプリのエクスポートから、何年分もの履歴を 1 つのコマンドで読み込み、自分が所有するマシンに保管できます。
  • 自分のデータを使う小さなツール。 ohs admin personal setup を実行すると、自分専用のインスタンスを用意できます。レシピを使えば、睡眠レポート、心拍数の推移、週間ダイジェスト、ダッシュボードなどを追加できます。それぞれ依存関係のない単一の Go ファイルで構成されています。

理由

ヘルスデータのソースは、それぞれ独自の形式を使っています。Apple Health は HealthKit サンプルごとに 1 行の JSON を送信し、心拍数は count/min、酸素飽和度は小数で表されます。Withings は日付をキーとする日ごとのアクティビティオブジェクトと、Unix エポックをキーとする日中の時系列データを送信します。日、デバイス、重複データの扱いもソースごとに異なります。

そのため、チームはプロバイダーごとにスクリプトを作成します。パーサー、テーブル、cron ジョブです。2 つ目のプロバイダー、最初の再送アップロード、バックフィルが必要な最初のマッパーバグ、あるいは保有するすべてのデータを削除してほしいという最初の依頼が来るまでは、それでうまくいきます。

Open Health Sync は、こうした層を一度実装し、面倒な部分まで適切に処理します。

変換前:リポジトリのテスト用フィクスチャにある Apple Health の歩数行、Withings の日ごとのアクティビティオブジェクト、Withings の日中のエントリーという、形の異なる 3 種類のデータ。変換後:API から読み取った DailySummary(2026-01-10 の step_count は 9720)と QuantitySample。
プロバイダーごとの自作スクリプトOpen Health Sync
ソースの追加新しいパーサー、新しいテーブル、新しい cron ジョブ同じモデルにマッピングするコネクター
単位各 API が送信する単位数量ごとに単位を統一し、元の値と単位は metadata に保持
「今日」UTC、またはプロバイダーの時刻記録のタイムゾーンにおける現地の暦日
再送されたアップロード2 回保存"duplicate": true とともに 200 を返し、コンテンツハッシュでレコードの重複を排除
生のペイロード解析後に破棄ディスクまたは S3 にそのまま保持するため、修正後にユーザーのデータを再処理可能
完了したか?推測するか、ログを確認GET /coverage:pending_jobs、parked_jobs、rejected_records
最新の状態か?cron ジョブに期待するwebhook によるプルとバックストップ用のプル、ソースごとの GET /freshness
プロバイダー側で削除されたレコードテーブルに残るプロバイダーから通知された時点で、こちらでも削除
新しいデータの到着タイマーでポーリングユーザー、プロバイダー、日付を示す署名付き webhook(data.written)
実行途中のクラッシュスクリプトを再実行して期待するPostgres キュー、バックオフ付き再試行、5 回失敗後に保留
プロバイダーの OAuth トークン平文のカラムまたは .envOHS_ENCRYPTION_KEY を使用して AES-256-GCM で暗号化
ユーザーの削除テーブルやバケットを横断して grepDELETE /v1/users/{id} を実行し、GET /v1/deletions/{job_id} をポーリング
1 つのプロバイダーのデータを消去同じ grep を手作業で絞り込むDELETE /v1/users/{id}/connections/{provider}?delete_data=true、またはデバイスの場合は DELETE /v1/users/{id}/data/{provider}
AI エージェントによる読み取り統合を構築読み取り専用 MCP サーバー。デスクトップエージェントには ohs mcp

機能

  • 正規モデルは一つです。 量のサンプル、カテゴリのサンプル、睡眠セッションとフェーズ、ワークアウトとルート、栄養、日次サマリーを扱います。各レコードには出所を示す provider、source、device、ingested_at が含まれます。
  • 量ごとに単位は一つです。 量の名称には UCUM 単位と LOINC コードが付与されます(データモデル)。心拍数は、ソース側の名称にかかわらず bpm です。
  • 生のペイロードは保持されます。 すべてのアップロードと取得データは、ほかの処理より先に生データストア(ローカルフォルダーまたは S3 互換バケット)に保存され、書き換えられることはありません。マッパーを修正した後は、どのユーザーのデータでも生ファイルから再処理できます(方法)。
  • UTC 日ではなく、現地の日付を使います。 日次サマリーは、レコードのタイムゾーンに基づく現地の暦日ごとに作成されます。プロバイダーが日次サマリーを送信しない場合は、サンプルから歩数、エネルギー、距離の合計を算出します。
  • アップロードは常に冪等です。 Apple Health の各パートは、日付、バッチ、パート番号ごとに保存されます。同じバイト列を再送すると "duplicate": true とともに 200 が返されます。使用済みのキーに異なるバイト列が指定された場合は拒否され、上書きされることはありません。レコードはコンテンツハッシュで重複排除されます。
  • 同期ボタンなしで常に最新の状態を保ちます。 プロバイダーの Webhook を受け取ると、定期処理より先に変更分だけを取得します。さらに、6 時間ごと(Webhook が届かない場合は1時間ごと)にバックアップ取得を行い、取りこぼしを検出します。GET /v1/users/{id}/freshness で、各ソースの最新状態を確認できます(バックグラウンド同期)。
  • 処理状況を把握できます。 カバレッジレポートには、プロバイダー別、現地日付別のレコード数に加え、処理待ちのジョブ、リトライ後に保留されたジョブ、保存されなかった行が表示されます。
  • 確実に消去します。 DELETE /v1/users/{id} は、ユーザーの生ファイルとすべての行を削除してからユーザーを削除します。ソフトフラグではありません。プロバイダーからレコード削除の通知(Oura、WHOOP、Strava)があった場合は、こちらでも削除します。?delete_data=true を指定してソースの接続を解除すると、そのソースがユーザーについて送信したすべてのデータ(レコード、生ファイル、同期履歴)が消去されます。また、DELETE /v1/users/{id}/data/{provider} でも Apple Health または Health Connect のデータを同様に消去できます。OHS_RETENTION_DAYS を設定すると、指定日数を超えた生ファイルと正規化データが削除されます。
  • カテゴリごとに同意を管理します。 各ユーザーは、データカテゴリ(睡眠、心拍、位置情報、血糖値など)ごとに各ソースへの同意または拒否を設定します。同意されていないデータは保存前に破棄され、カテゴリへの同意を取り消すと保存済みのデータが削除されます。また、consent.granted と consent.revoked の Webhook でサーバーに通知します(ガイド)。
  • 1回の呼び出しでユーザーアーカイブを取得できます。 GET /v1/users/{id}/archive は、アクセス要求やデータポータビリティ要求に応じて、1人のユーザーについて保持しているすべてのデータを1つの zip ファイルで返します(ドキュメント)。
  • マルチテナント対応です。 サーバー用のテナント API キー(ohs_sk_)と、1人のユーザーのアプリまたはエージェント用の有効期間が短いスコープ付きユーザートークン(ohs_ut_、スコープは upload と read)を使用します。キーとトークンは SHA-256 ハッシュとして保存されます。
  • 送信 Webhook に対応しています。 同期によるデータの書き込みや削除、ユーザーの消去、ユーザーに再接続を求める必要がある場合に、サーバーへ通知します。Standard Webhooks に準拠した署名が付与され、約28時間にわたって再試行されます。また、ヘルスデータの値がペイロードに含まれることはありません(ガイド)。
  • AI エージェント向けの読み取り専用 MCP です。 ユーザーは、自分のデータに自分のエージェントを接続できます。使用するトークンで可能なのは読み取りだけです。
  • バイナリと Postgres だけで動作します。 キューは Postgres(FOR UPDATE SKIP LOCKED)に格納されます。メッセージブローカー、キャッシュ、ワーカーフリートは不要です。api、collect、etl の各ロールは、1つのプロセス内でも個別でも実行できます。
  • 小規模な環境で動作します。 4 GB の Raspberry Pi 5 で、専用に調整された compose オーバーレイを使ってスタック全体を実行できます。30日より古いサンプルは圧縮され、ディスク上のサイズが約7分の1になります。また、圧縮されたデータへの履歴の再インポートも高速です。
  • オープンスタンダードを採用しています。 OpenAPI 3.1 ファイルで API を記述し、FHIR R4 Observations は公式 HL7 バリデーター(scripts/fhir-validate.sh)で検証されます。MCP はオープンプロトコルであり、信頼して使用する前に ohs doctor で設定を確認できます。
  • スコアも、内部の AI もありません。 清潔で追跡可能なデータを提供するところまでです。その上にインサイトを構築してください。
データソースと出力

v0.2.0 では18のデータソースに対応しており、そのうち5つが新たに追加されました。Garmin、Eight Sleep、Xiaomi、アクティビティファイル、Bluetooth デバイスです。Amazfit と RingConn は Health Connect 経由で利用できます。 それ以外はすべて今後の予定です。ロードマップに掲載されていますが、まだ実装されていません。 各データソースの連携方法、ベンダープログラム、追跡課題については、こちらをご覧ください。 docs/connectors。

データソース状況データの取り込み方法
Apple Health✅ 利用可能iOS アプリから Swift SDK または独自のコード(仕様)を使って HealthKit データをアップロードできます。ohs import apple-health を使うと Health アプリのエクスポートデータを読み込みます
Withings✅ 利用可能OAuth、定期的なデータ取得、プッシュ通知(ガイド)
Oura✅ 利用可能OAuth、定期的なデータ取得、Webhook(ガイド)
Whoop✅ 利用可能OAuth、定期的なデータ取得、Webhook(ガイド)
Strava✅ 利用可能OAuth、定期的なデータ取得、Webhook イベント(ガイド)
Polar✅ 利用可能OAuth、定期的なデータ取得、Webhook(ガイド)
Garmin✅ 利用可能パートナープログラム:PKCE による OAuth、定期的なデータ取得、Garmin の通知。ご自身の Garmin アプリをご用意ください。Garmin は新規申請の受付を一時停止しています(ガイド)
Fitbit✅ 利用可能Google Health API:OAuth、定期的なデータ取得、署名付き Webhook(ガイド)。未検証の Google プロジェクトでは最大100人のユーザーにしかサービスを提供できません
Suunto✅ 利用可能パートナープログラム:OAuth、定期的なデータ取得、署名付き通知(ガイド)
Ultrahuman✅ 利用可能Partnership API:OAuth、毎日のデータ取得。リングのデータと M1 の血糖値に対応(ガイド)
intervals.icu✅ 利用可能OAuth、定期的なデータ取得、Webhook。Garmin、Wahoo、Zwift、Coros などのアクティビティに加え、毎日のウェルネスデータにも対応(ガイド)
Health Connect✅ 利用可能Android アプリから Health Connect の記録をアップロードできます(仕様)
Dexcom✅ 利用可能CGM の血糖値:OAuth、定期的なデータ取得(ガイド)
OMRON✅ 利用可能血圧と体重:パートナー API、OAuth、定期的なデータ取得(ガイド)
Xiaomi✅ 利用可能ohs import mi-fitness を使うと Mi Fitness のデータコピーを読み込みます(全履歴に対応)。継続的なデータ取得には Health Connect または Apple Health を使用します(ガイド)
Bluetooth デバイス✅ 利用可能標準の Bluetooth 健康プロファイルに対応した心拍数ストラップ、血圧計、体重計、血糖測定器、体温計、パルスオキシメーターを、デスクトップブリッジの ohs-bridge(macOS、Linux、Raspberry Pi、Windows)または Swift および Kotlin SDK 経由で利用できます。ベンダーアカウントは不要です(ガイド)
アクティビティファイル✅ 利用可能ohs import files を使うと FIT、GPX、TCX ファイル、および Garmin、COROS、Wahoo、Suunto、Zwift、Strava のエクスポートデータを読み込みます(ガイド)
FreeStyle Libre公開 API なしHealth Connect または Apple Health 経由で利用できます(注記)
Coros🛠 予定クラウド API、OAuth
Zepp / Amazfit、RingConn✅ 利用可能、Health Connect 経由Android では各アプリが Health Connect に書き込みます。記録にはそれぞれのソース(zepp、ringconn)が保持されます(詳細)
Samsung Health🛠 予定、Health Connect 経由Android ではアプリが Health Connect に書き込みます
Google FitGoogle により非推奨Health Connect をご利用ください
Eight Sleep✅ 利用可能公開 API はありません。Eight Sleep アプリで使用されるサインイン方式を利用し、睡眠ステージ、心拍数、HRV、呼吸数、ベッドの温度を定期的に取得します(ガイド)
今すぐ追加したいですか?コネクターは独立しているため、
コネクターの作成方法を読み、
初めての貢献に適した Issueを選んでください。
出力状況
api/openapi.yamlで定義された REST JSON✅ 利用可能
MCP サーバー、読み取り専用(docs/mcp.md)✅ 利用可能
公式 HL7 バリデーターで検証済みの FHIR R4(docs/fhir.md)✅ 利用可能(Observations、Patient、Device、Provenance、Patient $everything)
心拍シリーズごとの RR 間隔と HRV(RMSSD、SDNN、pNN50、平均 RR、心拍数)、REST および MCP 経由(docs/hrv.md)✅ 利用可能
記録された出血量から算出する月経周期、REST および MCP 経由。予測は行いません(docs/menstrual-cycles.md)✅ 利用可能
データに文脈を与える時間タグ(病気、けが、旅行、時差ぼけ、予防接種、服薬、アルコール)、REST、ウェブフック、MCP 経由(docs/time-tags.md)✅ 利用可能
現在保存されている ECG 記録の読み取りルート🛠 予定
FHIR R4 一括エクスポート($export)🛠 予定
Open mHealth(docs/open-mhealth.md)✅ 利用可能
CSV および Parquet エクスポート(docs/exports.md)✅ 利用可能
Standard Webhooks に準拠して署名される送信ウェブフック(docs/webhooks.md)✅ 利用可能(データの書き込みまたは削除、ユーザーの消去、接続の再認証が必要になった場合)
クライアント SDK:Kotlin、Swift(HealthKit 同期対応)、React Native、Flutter、および iOS、Android、React Native 向けサンプルアプリ(docs/sdks)✅ 利用可能(このリポジトリからインストール。パッケージレジストリでは提供していません)
医療記録(EHR):SMART on FHIR 経由で読み取る検査結果、疾患、服薬、アレルギー。FHIR R4 として提供🛠 予定

クイックスタート

Docker Compose v2.24以降に加えて、curl、jq、opensslが必要です。Composeは公開イメージghcr.io/soma-intelligence/open-health-sync(amd64およびarm64)を取得します。

git clone https://github.com/soma-intelligence/open-health-sync.git && cd open-health-sync
cp .env.example .env
sed -i.bak "s|^OHS_ENCRYPTION_KEY=.*|OHS_ENCRYPTION_KEY=$(openssl rand -base64 32)|" .env
docker compose --env-file .env -f deploy/docker-compose.yml up -d --wait
docker compose --env-file .env -f deploy/docker-compose.yml run --rm ohs doctor
docker compose --env-file .env -f deploy/docker-compose.yml exec ohs /ohs admin tenant create --name dev

ohs doctorは各チェック(設定、データベース、rawストア、公開URL、コネクター)についてokまたはfailの行を1行ずつ出力します。.envを変更したときは、再度実行してください。最後のコマンドはテナントAPIキーを一度だけ出力します。大切に保管してください。

export OHS=http://localhost:8080
export KEY=ohs_sk_...    # the key printed above

APIは127.0.0.1のみで待ち受けるため、以下の手順は同じマシン上で実行します。スマートフォンアプリ、プロバイダーのWebhook、または別のコンピューターから利用するには、外部からアクセスできるようにする必要があります。TLS対応のリバースプロキシを前段に配置するか、.envでOHS_HTTP_BIND=0.0.0.0を設定し、ネットワーク上でプレーンHTTPを使ってください。

デバイスやプロバイダーのキーがまだありませんか?ohs seed --demoを実行すると、6つの重複するソースからの合成データ90日分がインスタンスに追加され、試用できるデモAPIキーとリクエストが出力されます (docs/demo.md)。

docker compose --env-file .env -f deploy/docker-compose.yml exec ohs /ohs seed --demo

ポート8080が使用中ですか?.envでOHS_HTTP_PORTと、それに対応するOHS_PUBLIC_URLを設定してください(セルフホスティングを参照)。

エンドユーザーと、そのユーザーのアプリが保持するトークンを作成します。

USER_ID=$(curl -s -X POST $OHS/v1/users -H "Authorization: Bearer $KEY" \
  -H 'Content-Type: application/json' -d '{"external_ref":"demo"}' | jq -r .id)
TOKEN=$(curl -s -X POST $OHS/v1/users/$USER_ID/tokens -H "Authorization: Bearer $KEY" \
  -H 'Content-Type: application/json' -d '{"scopes":["upload"]}' | jq -r .token)

Apple Healthのパートを1つ(心拍数の測定値1件、gzip圧縮)アップロードします。

DAY=$(date -u +%Y-%m-%d); NOW=$(date -u +%Y-%m-%dT%H:%M:%SZ)
printf '{"quantityType":"HKQuantityTypeIdentifierHeartRate","startDate":"%s","endDate":"%s","value":72,"unit":"count/min","sourceName":"Demo Watch","metadata":{"HKTimeZone":"UTC"}}\n' "$NOW" "$NOW" \
  | gzip | curl -s -X POST $OHS/v1/ingest/apple-health \
    -H "Authorization: Bearer $TOKEN" -H "Content-Type: application/gzip" \
    -H "X-OHS-Type: HKQuantityTypeIdentifierHeartRate" -H "X-OHS-Day: $DAY" \
    -H "X-OHS-Batch: demo1" -H "X-OHS-Part: 0" --data-binary @-

処理が完了するまで待ち(pending_jobsが0になるまで)、正規化されたサンプルを読み戻します。

curl -s "$OHS/v1/users/$USER_ID/coverage" -H "Authorization: Bearer $KEY"
curl -s "$OHS/v1/users/$USER_ID/samples?type=heart_rate" -H "Authorization: Bearer $KEY"

マシンにohsバイナリをインストールします。 以下のインポートとMCPの設定では、コンテナーの外部でohsを実行します。お使いのシステムに合ったアーカイブを リリースページ から取得します(ohs_<version>_<os>_<arch>.tar.gz。osはlinuxまたはdarwin、archはamd64またはarm64です)。同じ名前のフォルダーに展開されます。

tar xzf ohs_*_linux_amd64.tar.gz
sudo install ohs_*_linux_amd64/ohs /usr/local/bin/ohs
ohs version

macOSでは、まず隔離フラグを解除してください:xattr -d com.apple.quarantine ohs_*_darwin_*/ohs。

既存の履歴を読み込みます。 iPhoneでヘルスケアアプリを開き、自分の写真をタップして、すべてのヘルスケアデータを書き出すを選ぶと、export.zipが作成されます。ユーザーのトークンを使って読み込みます(--dry-runを先に実行すると、送信されるデータの件数を確認できます)。

OHS_TOKEN=$TOKEN ohs import apple-health export.zip --url $OHS

記録、ルート情報付きのワークアウト、心電図は、一定のメモリ使用量で同じアップロードAPIを通じて処理されます。再実行しても、同じデータが二重にアップロードされることはありません。詳細はエクスポートのインポートを参照してください。

データはpgdataボリュームとrawボリュームに保存されます。docker compose ... downを実行しても保持されます。

仕組み

flowchart LR
  AH["Apple Health, Health Connect<br/>app upload, export import"] --> C
  CL["Withings, Oura, WHOOP, Fitbit,<br/>Polar, Strava, Suunto, Ultrahuman,<br/>intervals.icu, Dexcom, OMRON<br/>OAuth pull + webhooks"] --> C
  C["collect / ingest"] --> R[("raw store<br/>disk or S3")]
  R --> E["ETL<br/>normalize, dedup,<br/>units, local-day summaries"]
  E --> P[("Postgres<br/>+ TimescaleDB")]
  P --> API["REST API<br/>(OpenAPI)"]
  P --> MCP["MCP server<br/>(read only)"]
  P --> FHIR["FHIR R4<br/>Observations"]
  1. 収集。 iOSアプリは、uploadスコープを持つユーザートークンと、ヘッダーX-OHS-Type、X-OHS-Day、X-OHS-Batch、X-OHS-Partを使って、HealthKitデータをgzip圧縮されたNDJSONパートとしてPOST /v1/ingest/apple-healthに送信します。クラウドプロバイダー(Withings、Oura、WHOOP、Fitbitなど)のデータは、Webhookが送信されたときに(変更分のみ)取得され、スケジュールに従って定期的にも取得されます。
  2. rawペイロードの保存。 パートはまずrawストアに書き込まれ、その後、ジョブがPostgresにキューイングされます。応答にはrawキーと、パートが重複していたかどうかが含まれます。
  3. 正規化。 etlロールが各行を標準モデルにマッピングし、単位を変換して重複を削除し、ソースとデバイスを関連付け、現地時間の日ごとのサマリーを集計します。
  4. 提供。 読み取りにはテナントキーを使ったGET /v1/users/{id}/...を使用し、カーソルでページ分割します。MCP サーバーは同じデータを読み取り専用で参照します。

詳細:アーキテクチャ、APIガイド。

プロバイダーを有効にして、ユーザーが接続する

管理コンソールでOuraアプリのキーを貼り付けると、再起動なしでOuraが有効になります。その後、アプリが接続リンクを作成し、ユーザーに送信します。ユーザーはOuraを選び、次にWithingsを選んで、それぞれでアクセスを許可します。ohsがコードを交換し、許可情報を暗号化して保存し、バックグラウンドで履歴を取得して正規化します。コンソールに戻ると、パイプラインにデータの処理状況が表示され、ユーザーのページには各ソースが有効で最新であることが示されます。

ブラウザーの録画。新しいインスタンスの管理コンソールでは、概要に5段階のパイプラインが表示され、すべてゼロです。まだ設定されていないOuraのページで、オペレーターがクライアントIDとシークレットを貼り付けて保存すると、Ouraが有効になります。次にアプリSleep Diaryがユーザー用の接続リンクを開きます。すりガラス風のパネルが並ぶページにはOura、WHOOP、Withings、Polar、Stravaが表示され、5つ中0つが接続済みで、リンクの有効期限は残り30分です。ユーザーがOuraを接続します。テストサーバーと表示された同意画面にスコープが列挙され、「許可」を選ぶとOuraが接続され、ページに戻るとOuraが接続済みと表示されます。続いてWithingsも接続します。コンソールに戻ると、概要には2件の接続、同期の実行、保存された生データが表示され、ユーザーのページには両方の接続が有効かつ正常で、3日間に51件のレコードがあると表示されます。

このリポジトリで合成データを使って記録しました。コンソール、接続ページ、コード交換、暗号化された許可情報、バックグラウンドでの取得、正規化は実際のものです。プロバイダー側(同意画面とAPI)は、コネクターテスト用のテストサーバーが担っています。作成方法については、docs/demoをご覧ください。

実際の動作を見る

これらはモックアップではなく、実際のキャプチャです。このリポジトリからビルドしたohs 0.0.1をTimescaleDBに対してネイティブに実行し(そのマシンでは8080が使用中だったため、ポート8088を使用)、connectors/applehealth/testdata/e2eにあるApple Healthのエンドツーエンド用フィクスチャを6つのパートに分けてアップロードしました。フィクスチャの値は合成データです。

ohs doctorの出力:config、database、raw store、public url、apple_healthコネクターは正常。キーが設定されていないため、withingsはスキップ。

サンプルは正規単位で返され、プロバイダーから送信された値はmetadataに保持されます(count/minはbpmになりました)。

/v1/users/{id}/samples?type=heart_rate&limit=1をcurlで取得してjqに渡した結果:Apple Watch由来の心拍数サンプルが1件あり、値は55.5 bpm。メタデータと出所情報も含まれています。

日次サマリーはローカル日付ごとに導出され、カバレッジレポートで処理の完了状況を確認できます。

左:/dailyは2026-01-10と2026-01-11の歩数を9720歩と返し、導出済み、タイムゾーンはEurope/Parisと表示。右:/coverageはpendingが0、parkedが0、rejectedが0で、2026-01-10のレコードが212件と表示。 2026-01-10のローカル時刻ごとの歩数の棒グラフ。07:00の346歩から18:00の874歩までを示し、合計は日次サマリーの9,720歩です。心拍数サンプル288件、歩数サンプル96件、保留中のジョブ0件。 ## AI エージェントを接続する(MCP)

read スコープのみを持つユーザートークンを発行します(最長 30 日間有効です)。

curl -s -X POST $OHS/v1/users/$USER_ID/tokens -H "Authorization: Bearer $KEY" \
  -H 'Content-Type: application/json' -d '{"scopes":["read"],"ttl_seconds":2592000}'

次に、デスクトップエージェントの mcpServers に ohs mcp(stdio)を追加します (インストール手順で入手したバイナリを使用します)。

{
  "mcpServers": {
    "open-health-sync": {
      "command": "/usr/local/bin/ohs",
      "args": ["mcp"],
      "env": { "OHS_MCP_URL": "http://localhost:8080", "OHS_MCP_KEY": "ohs_ut_..." }
    }
  }
}

ohs mcp はデータを保持せず、データベースも必要ありません。各メッセージをインスタンスの /mcp エンドポイントに転送します。ホストがループバックでない限り、OHS_MCP_URL には https を指定する必要があります。Streamable HTTP に対応するエージェントは、ベアラートークンを使って /mcp を直接呼び出せます。

0.2.0 以降、サーバーは 12 個のプロンプト(prompts/list)も一覧表示します。トレーニング、睡眠、回復について、先にデータを読み取って数値を示す質問が用意されています (プロンプト、プロンプトライブラリ)。同じガイダンスは、skills/open-health-sync にエージェントスキルとしても同梱されています。

ohs mcp の stdio セッション。tools/list は読み取り専用ツールを 11 個返し、2026-01-10 の get_daily は apple_health から step_count 9720 を返します。

ツール、引数、ページングについては、docs/mcp.md を参照してください。

データモデル

すべてのデータソースは、以下のレコードに対応付けられます(フィールドと単位についてはdocs/data-model.mdを参照してください)。

  • QuantitySample:心拍数、歩数、SpO2 などの単一の数値測定値です。
  • CategorySample:立位時間や月経量の記録など、カテゴリ別のイベントです。 月経周期は、読み取り時に /menstrual-cycles が月経量の記録から導出します (docs/menstrual-cycles.md)。
  • SleepSession と SleepPhase:各夜の睡眠時間の内訳と、個々の睡眠段階です。
  • Workout と RoutePoint:各ワークアウトの指標と、その GPS トラックです。
  • NutritionLog:栄養素を含む食べ物または飲み物の記録です。
  • ECGRecording と ECGVoltageSample:記録のメタデータと、その電圧トレースです。 データは保存されますが、まだ提供されていません。読み取りルートは今後実装予定です。
  • HeartbeatSample:拍動ごとの(RR)間隔です。/rr-intervals と /hrv が、系列ごとに導出した HRV とともに提供します (docs/hrv.md)。
  • DailySummary:プロバイダーから取得する、またはサンプルから集計するローカル日ごとの合計値です。
  • Observation:多様なデータを扱うための汎用的なコード付き事実です。現時点では、これを書き込むコネクターはありません。

デプロイ

  • 公開イメージで Compose を実行します。 クイックスタートと同様に、deploy/docker-compose.yml を使用します。OHS_VERSION でタグを固定してください(0.x の間は latest はありません)。セルフホストをご覧ください。
  • Raspberry Pi 5。 オーバーレイ deploy/docker-compose.pi.yml を追加します(Postgres のバッファーを縮小し、メモリー制限を設定します)。Raspberry Pi 5をご覧ください。
  • S3 の生データストア。 deploy/docker-compose.s3.yml を追加するか、OHS_RAW_STORE を任意の S3 互換バケットに設定します。S3をご覧ください。
  • バックアップと復元。 scripts/backup.sh はデータベース、生データストア、スキーマバージョンを含む単一のアーカイブを書き出し、scripts/restore.sh はそれを復元します。CI では、すべてのプルリクエストでスタックを破棄して復元します。バックアップと復元をご覧ください。
  • リリースバイナリ。 Linux と macOS 向けの amd64 および arm64 バイナリを、checksums.txt とともにリリースページで公開しています。Postgres と TimescaleDB はご自身で用意し、ohs doctor を実行してから ohs up を実行します(マイグレーション後にサーバーを起動します)。各アーカイブを展開すると ohs_<version>_<os>_<arch>/ohs が含まれます(インストール)。macOS バイナリはまだ署名されていません。xattr -d com.apple.quarantine で検疫フラグを解除してください。0.2.0 以降、イメージと checksums.txt は cosign で署名されています(リリースの検証)。
  • ソースからビルドします。 Go 1.26 の場合、make build を実行すると bin/ohs が生成されます。Compose を使用するには、docker buildx が必要な deploy/docker-compose.build.yml を追加します。これを使用できない場合は、ソースからのビルドをご覧ください。

Open Health Sync と Terra、その他のヘルスデータ API の比較

Terra API の代替や、オープンソースのヘルスデータアグリゲーターをお探しですか?Open Health Sync とホスト型ウェアラブル API の比較を以下に示します。他社製品に関する情報は、各社のウェブサイトと料金ページから確認したもので、確認日は 2026-10-17 です。各行のリンク先には、移行方法を含む詳細な比較があります。

オープンソース最低料金FHIR R4AI エージェント向け MCP サーバーデータの保存場所
Open Health Syncはい、AGPL-3.0無料、サーバーの費用はお客様負担はい、公式 HL7 バリデーターで確認済み読み取り専用、stdio と HTTPお客様のサーバー
Terraいいえ年払いで月額 $399FHIR の選択肢あり、バージョン名の記載なし読み取り専用Terra のクラウド、その後お客様の接続先
Junctionいいえ最大 500 ユーザーで月額 $300ドキュメントに記載なしドキュメントに記載なしJunction のクラウド、米国または EU
Thryveいいえ最大 500 ユーザーで月額 499 EURウェブサイトに記載なしウェブサイトに記載なしドイツにある Thryve のサーバー
Spike APIいいえ月額 $450 からドキュメントに記載なしはいSpike のクラウド
Sahhaいいえ年払いで月額 $299 からウェブサイトに記載なしはいSahha のクラウド
ROOKいいえ最大 750 ユーザーで月額 $399アドオン。Business プランから含まれますウェブサイトに記載なしROOK のクラウド

現在 Garmin や多数のデバイスに対応する必要がある場合、サーバーの運用を望まない場合、またはベンダーの SOC 2 および HIPAA に関する保証が必要な場合は、ホスト型 API を選んでください。データを自社のインフラストラクチャ内に保持する必要がある場合、ユーザーごとの料金体系が合わない場合、標準形式(FHIR R4、Open mHealth)での出力と、すべての生ペイロードの保持が必要な場合は、Open Health Sync を選んでください。各選択肢の比較については、ヘルスデータアグリゲーターの比較をご覧ください。

よくある質問

誰が私のデータを見ることができますか? そのインスタンスを実行する人だけです。セルフホストの場合、当方でアカウントを作成する必要はなく、分析情報の収集も、ホームへの通信もありません。サーバーが通信するのは、有効にしたプロバイダー(キーを設定したプロバイダー)と、ご自身のデータベースおよび生データストアだけです。ログにトークン、キー、健康データが含まれることはありません。[ホスト型ベータ版](#hosted-beta)では当方がインスタンスを実行するため、現時点ではテストデータのみを受け付けています。
データはどこに保存されますか?

ご自身で管理する2か所に保存されます。Postgres with TimescaleDB(接続情報とジョブはohs_syncスキーマ、正規化されたレコードはohs_data)と、生データストア(ローカルフォルダーまたはS3互換バケット)です。composeでは、それぞれpgdataボリュームとrawボリュームに保存されます。OHS_ENCRYPTION_KEYと併せてバックアップしてください。

HIPAAまたはGDPRに準拠していますか?

ソフトウェア単体で準拠を実現することはできません。Open Health Syncは認証、監査を受けておらず、業務提携契約の対象でもありません。提供する機能は次のとおりです。データはご自身が選んだインフラストラクチャに保持されます。DELETE /v1/users/{id}は生ファイルと行を完全に削除します(消去リクエストへの対応に便利です)。ユーザーの特定のソースのデータは、1回の呼び出しで消去できます。同意はソースごと、データカテゴリごとに保持され、書き込みのたびに適用されます。GET /v1/users/{id}/archiveを使うと、ある個人について保持しているすべてのデータをzipファイルで取得できます。OHS_RETENTION_DAYSによって保持期間が適用されます。すべてのクエリはテナントとユーザーの範囲に限定されます。キーとトークンはハッシュ化して保存され、プロバイダーのOAuthトークンは、オンラインでローテーション可能なキーを使ってAES-256-GCMで暗号化されます(キーのローテーション)。健康記録自体はohsによって暗号化されません。ディスクまたはデータベースの暗号化、APIの前段でのTLS、ご自身によるアクセス制御を使用してください。デプロイがHIPAA、GDPR、その他の規則に準拠するかどうかは、運用方法によって異なります。

費用はいくらですか?

無料です。サーバーは無料のオープンソースです。費用がかかるのは実行環境のみで、4 GBのRaspberry Pi 5でも実行できます。各クラウドプロバイダー(Withings、Oura、WHOOP、Fitbitなど)を利用するには、ベンダーに登録したご自身の開発者アプリケーションが必要です。ホスト型ベータ版は、ベータ期間中は無料です。

ホスト型バージョンはありますか?

はい。無料のベータ版として、誰でも登録できます。同じAPIを共有リソース上で実行し、現時点ではテストデータとデモデータのみを対象としています。 無料で登録できます。ホスト型ベータ版のセクションで提供内容をご確認ください。

Terraとはどう違いますか?

Terraはホスト型APIです。Garminを含む500以上の連携に対応していると案内しており、年間請求で月額399ドルから利用できます。また、ユーザーのデータは同社のクラウドを経由します。Open Health Syncは無料で、標準を重視しています。FHIR R4およびOpen mHealthの出力は公式バリデーターで検証され、すべての生ペイロードが保持され、Raspberry Piで動作するGoバイナリが1つ提供されます。比較表をご覧いただくか、Terra APIの代替で機能を直接比較してください。

どのデバイスで使えますか? Apple Health(Apple Watch、iPhone、HealthKit に同期するアプリやデバイスを含む)に書き込むものはすべて、データをアップロードする iOS アプリを通じて連携できます。[Swift SDK](docs/sdks/swift.md#healthkit-sync) は HealthKit を読み取り、変更分をアップロードします。または、アプリで [アップロード契約](docs/connectors/apple-health.md) を独自に実装することもできます。アプリを使わない場合は、`ohs import apple-health` で、Health アプリが出力するエクスポートを履歴も含めて読み込みます。Withings の体重計、時計、睡眠デバイスは、ユーザー自身の Withings アカウントを通じて連携できます。Oura のリング、WHOOP のバンド、Polar の時計、Strava のアクティビティ、Suunto の時計、Fitbit デバイス(Google Health API 経由)、Ultrahuman のリング、intervals.icu のアカウント、Dexcom の CGM、OMRON の血圧計と体重計は、それぞれユーザー自身のアカウントを通じて連携できます。Fitbit、Suunto、Ultrahuman、OMRON では、承認された開発者にのみ各ベンダーが提供するキーが必要です。Android では、Health Connect に書き込むもの(Samsung Health、FreeStyle Libre などの CGM アプリ)は、データをアップロードするアプリを通じて連携します([契約](docs/connectors/health-connect.md))。Garmin の時計は、Garmin が承認済みの企業にのみ提供するキーを使い、ユーザー自身の Garmin Connect アカウントを通じて連携できます([ガイド](docs/connectors/garmin.md))。今後さらに多くのソースを[追加する予定](docs/connectors/README.md)です。[コネクターのリクエストフォーム](https://github.com/soma-intelligence/open-health-sync/issues/new/choose)も利用できます。
なぜ AGPL なのですか?

このレイヤーをオープンな状態に保つためです。誰でも実行、調査、変更できます。変更を加えた Open Health Sync をネットワークサービスとして実行する場合は、同じライセンスの下で変更内容を公開します。sdks/ のクライアント SDK も AGPL-3.0-only です。

商用利用できますか?

はい。企業は、自社製品を動かすために、未変更または変更済みの状態で実行できます。AGPL が求めているのは、変更済みのサーバーとネットワーク経由でやり取りするユーザーが、そのソースコードを入手できることだけです。これは法的助言ではありません。LICENSE を読むか、弁護士に相談してください。

医療機器ですか?

いいえ。データの移動と正規化を行います。診断、スコアリング、助言は行わず、臨床用ソフトウェアでもありません。

ステータスとロードマップ

最新リリースは v0.2.0 です。パイプラインを実行する管理コンソール、テナントとそのキーを管理する管理 API、テナントごとに保存するプロバイダーキー、Garmin、Eight Sleep、Xiaomi のコネクター、アクティビティファイルのインポート、ohs-bridge 経由の Bluetooth ヘルスデバイス、心電図の読み取り、自己申告、共有リンク、時間単位と日単位のサンプル統計、暗号化キーのオンラインローテーション、署名付きリリースが追加されました。変更内容:CHANGELOG.md。インストールとアップグレードに関する注意事項、および制限事項の全一覧:リリースノート。

既知の制限事項:

  • 強制終了後、処理中だったジョブが再び処理されるのは、可視性タイムアウトの 10 分後です。
  • インスタンスごとにデータベースは 1 つ、raw ストアは 1 つです。マルチリージョンレプリケーションには対応していません。
  • FHIR R4 の一括エクスポート($export)には、まだ対応していません。
  • クライアント SDK は 0.1.0 で、まだパッケージレジストリには公開されていません。このリポジトリからインストールしてください。Kotlin SDK で Health Connect を読み取る機能は、今後対応予定です。

ホスト型ベータ版は、誰でも登録できる無料ベータ版です(容量は共有で、テストデータとデモデータのみ利用できます):無料で登録。

今後の予定:コネクターの追加、標準出力(FHIR R4 リソースの追加)、Kotlin SDK での Health Connect の読み取り、続いて SMART on FHIR 経由での医療記録(EHR)の連携です。コネクターのリクエストフォームを含め、GitHub の Issue でのリクエストを歓迎します。

ドキュメント

貢献

Issue やプルリクエストを歓迎します。5 分から週末まで、3 つの方法で参加できます。

  • ウェアラブルをお持ちですか? make record PROVIDER=oura(またはその他のソース)を実行して、約 5 分でご自身のアカウントを記録できます。レコーダーはお使いのマシン上で匿名化し、CI では変更のたびにファイルを再生します。#60 でソースを選び、コネクターの記録をご覧ください。
  • 初めての貢献に適した Issueを選ぶ:ドキュメント、レシピ、CLI コマンド、デプロイ用テンプレートなど、いずれも 1 つの PR で完了する範囲です。
  • プロバイダーを追加する。 コネクターは自己完結型です。コネクターの作成から始めてください。

まず CONTRIBUTING.md と行動規範をお読みください。初めて貢献する方には、48 時間以内にレビューを行います。

make setup        # git hooks
make build        # bin/ohs
make test         # unit tests
make integration  # needs Docker (testcontainers)
貢献者
Open Health Sync への貢献者

セキュリティ

脆弱性は、SECURITY.mdに記載の方法で非公開で報告してください。公開 Issue に健康データ、キー、トークンを絶対に貼り付けないでください。

ライセンス

サーバーは AGPL-3.0-only です。詳しくはLICENSEをご覧ください。Open Health Sync を変更してサービスとして実行する場合は、変更内容を公開する必要があります。sdks/ のクライアント SDK も同じライセンスの下で提供されています。

コメント

MCP は初めてですか?

プロトコルの概要から最初のサーバーの導入まで、よくある疑問にまとめて答えます。

AI アプリケーションが外部のツールやデータソースに統一的な方法で接続するためのオープンなプロトコルです。クライアントはモデルとの対話を担い、MCP サーバーはツール・リソース・プロンプトテンプレートを提供します。標準メッセージでやり取りするため、1 つのサーバーを複数のクライアントで再利用できます。