Open Health Sync について
Open Health Sync は、健康データの取り込みと正規化を行うセルフホスト型レイヤーです。アプリ開発者や、自分のサーバーにデータを集約したい人向けに、複数のソースを共通モデルにまとめ、REST、FHIR R4、読み取り専用 MCP サーバーで提供します。
主な機能
- 01複数の健康データソースに接続
- 02単位とレコードを正規化
- 03生データを保持して再処理
- 04REST と FHIR R4 でデータ提供
- 05同期状況の確認とデータ削除
活用シーン
- 01健康アプリのバックエンド構築
- 02個人の健康データをエージェントに読み取り専用で提供
- 03研究用のウェアラブルデータ収集
- 04個人の健康データのアーカイブ
MCP 対応
AI エージェントが同期済みの健康データを参照できる、読み取り専用 MCP サーバーを提供します。
設定
ローカルサーバーの設定はどのクライアントでも共通です。コピーしてクライアントの MCP 設定ファイルに貼り付けてください。
docker run -i --rm -e OHS_MCP_URL -e OHS_MCP_KEY ghcr.io/soma-intelligence/open-health-sync:0.2.0OHS_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 以上など)が必要です。設定ファイルの場所はクライアントごとに異なります。
ghcr.io/soma-intelligence/open-health-sync:0.2.0stdioツール
ローカルサーバーのツールはマシン上で起動して初めて取得できます。メンテナーはまだツール一覧を提供していません。
詳細
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に代わる、オープンソースでセルフホスト可能な選択肢です。
docker pull ghcr.io/soma-intelligence/open-health-sync:0.2.0
サーバーを運用したくない方へ ホステッドベータは、運用不要で同じ API を利用できます。1 分でキーを取得し、最初の呼び出しでデモデータを利用できます。
無料で始める → · 開発者ポータルにサインイン · ▶ 75 秒の紹介を見る
クイックスタート · ホステッドベータ · 比較 · ロードマップの概要 · ユースケース · 理由 · 機能 · 仕組み · MCP · FAQ
パーサーをもうひとつ作らずに済んだなら、⭐ スターを付けていただけると、ほかの開発者にも見つけてもらいやすくなります。質問やアイデアはこちら:ディスカッション。
v0.2.0、アーリープレビュー。 0.x のリリースでは、API、設定、スキーマが変更される場合があります。
合成データを使った v0.1.0 のクイックスタートの記録です。スタックを起動し、6 台のデバイスから 90 日分のデータを読み込み、統合ビューの 1 日分のデータと、1 件の心拍数測定値を REST、FHIR R4、Open mHealth 形式で読み取り、MCP ツールを確認します。モックは一切ありません。録画は再度レンダリングできます。
Open Health Sync(ohs)は、ヘルスデータを取り込み、正規化するセルフホスト可能なレイヤーです。プロバイダーからデータを取得し、スマートフォンからのアップロードを受け付け、各ペイロードをそのまま保存して、1 つの標準モデルと単位にマッピングし、REST API と読み取り専用 MCP サーバーで提供します。ダッシュボードでもコーチングアプリでもなく、医療機器や臨床ソフトウェアでもありません。ご自身で運用するか、ホステッドベータでこちらに運用をお任せください。
|
🔌 18 のソースを 1 つのモデルに |
⚡ 常に最新 |
🧾 何も破棄しません |
|
🤖 AI エージェントですぐに利用可能 |
🏥 標準規格に準拠した出力 |
🔒 データはあなたのもの。完全に削除可能 |
同じサーバーを、あなたに代わって運用します。ホステッドベータでは、Postgres、raw store、ワーカーの運用が不要な Open Health Sync を利用できます。サインインしてキーを作成すれば、最初の呼び出しからデータを読み取れます。
テストデータを使った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日あたりの歩数、安静時心拍数、睡眠ステージは、すべて合成データです。
オープンサインアップの無料ベータで、共有容量で運用されています。現在はテストデータのみ利用できます。デモユーザーと合成ユーザーが対象で、実在する人の健康データは利用できません。セルフホストは引き続き第一級の選択肢であり、サーバーは 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 は、こうした層を一度実装し、面倒な部分まで適切に処理します。
| プロバイダーごとの自作スクリプト | 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 トークン | 平文のカラムまたは .env | OHS_ENCRYPTION_KEY を使用して AES-256-GCM で暗号化 |
| ユーザーの削除 | テーブルやバケットを横断して grep | DELETE /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 Fit | Google により非推奨 | 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"]
- 収集。 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が送信されたときに(変更分のみ)取得され、スケジュールに従って定期的にも取得されます。 - rawペイロードの保存。 パートはまずrawストアに書き込まれ、その後、ジョブがPostgresにキューイングされます。応答にはrawキーと、パートが重複していたかどうかが含まれます。
- 正規化。
etlロールが各行を標準モデルにマッピングし、単位を変換して重複を削除し、ソースとデバイスを関連付け、現地時間の日ごとのサマリーを集計します。 - 提供。 読み取りにはテナントキーを使った
GET /v1/users/{id}/...を使用し、カーソルでページ分割します。MCP サーバーは同じデータを読み取り専用で参照します。
プロバイダーを有効にして、ユーザーが接続する
管理コンソールでOuraアプリのキーを貼り付けると、再起動なしでOuraが有効になります。その後、アプリが接続リンクを作成し、ユーザーに送信します。ユーザーはOuraを選び、次にWithingsを選んで、それぞれでアクセスを許可します。ohsがコードを交換し、許可情報を暗号化して保存し、バックグラウンドで履歴を取得して正規化します。コンソールに戻ると、パイプラインにデータの処理状況が表示され、ユーザーのページには各ソースが有効で最新であることが示されます。
このリポジトリで合成データを使って記録しました。コンソール、接続ページ、コード交換、暗号化された許可情報、バックグラウンドでの取得、正規化は実際のものです。プロバイダー側(同意画面とAPI)は、コネクターテスト用のテストサーバーが担っています。作成方法については、docs/demoをご覧ください。
実際の動作を見る
これらはモックアップではなく、実際のキャプチャです。このリポジトリからビルドしたohs 0.0.1をTimescaleDBに対してネイティブに実行し(そのマシンでは8080が使用中だったため、ポート8088を使用)、connectors/applehealth/testdata/e2eにあるApple Healthのエンドツーエンド用フィクスチャを6つのパートに分けてアップロードしました。フィクスチャの値は合成データです。
サンプルは正規単位で返され、プロバイダーから送信された値はmetadataに保持されます(count/minはbpmになりました)。
日次サマリーはローカル日付ごとに導出され、カバレッジレポートで処理の完了状況を確認できます。
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 にエージェントスキルとしても同梱されています。
ツール、引数、ページングについては、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 R4 | AI エージェント向け MCP サーバー | データの保存場所 | |
|---|---|---|---|---|---|
| Open Health Sync | はい、AGPL-3.0 | 無料、サーバーの費用はお客様負担 | はい、公式 HL7 バリデーターで確認済み | 読み取り専用、stdio と HTTP | お客様のサーバー |
| Terra | いいえ | 年払いで月額 $399 | FHIR の選択肢あり、バージョン名の記載なし | 読み取り専用 | 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 でのリクエストを歓迎します。
ドキュメント
- セルフホスティング:設定、イメージ、Raspberry Pi、S3、運用上の注意事項。
- セキュリティモデルとセキュリティ強化チェックリスト:保護対象と保護方法、実際のユーザーデータを扱う前にインスタンスで設定する内容。
- API ガイドと、信頼できる情報源であるOpenAPI ファイル。
- MCP サーバー:ツール、プロンプト、認証情報、デスクトップエージェントとリモートエージェント。
- FHIR R4 出力:ユーザーの記録を Observations として扱う方法、そのマッピングと制限事項。
- 送信 Webhook:イベント、署名、再試行、エンドポイントのルート。
- データモデル:単位を含む、すべての標準的な型と量の名称。
- クライアント SDK:Kotlin、Swift、 React Native、Flutter。
- サーバー SDK:バックエンド向けの TypeScript および Python クライアントと、 Postman コレクション。
- サンプルアプリ:SDK を使用して構築された iOS(HealthKit)、Android、React Native のアプリと、最初のユーザー登録から Webhook までをサーバー SDK で実現する Next.js ウェブアプリ。
- デスクトップブリッジ:
ohs-bridgeを使うと、コンピューターまたは Raspberry Pi から、Bluetooth 対応の健康管理デバイスや USB 接続の時計が記録したデータを送信できます。 - アーキテクチャ:役割、パイプライン、ストレージ、信頼性。
- コネクター:サポート対象および開発予定のソース、 Apple Health、 Withings、Oura、 WHOOP、Strava、 Polar、独自コネクターの作成。
- バックグラウンド同期:Webhook、バックストップ用の取得処理、データの鮮度。
- バックアップと復元:データベースと生データストアをまとめた 1 つのアーカイブと、その復元方法。
- 接続ページ:ユーザーがソースを接続してからアプリに戻るためのホスト型ページ。
- 管理コンソール:ブラウザーからパイプラインを実行できます。プロバイダーとそのキー、ユーザーと接続、同期および処理ジョブ、Webhook、API キー、監査ログを管理します。
- 管理 API:1 つのインスタンスを複数のチームで運用できます。HTTP 経由でテナントを作成し、キーを管理して、デモユーザーにデータを入力します。
- レシピ:個人用のセットアップと、自分のデータを使った小さなツール。
- RR 間隔と HRV:拍動間隔と、そこから算出される HRV。
- 月経周期:記録された経血量から算出される周期。予測は行いません。
- 時間タグ:病気や旅行など、データにコンテキストを与える期間。
- 自己報告:同期されたデータと並べて保存される、本人による評価。
- 共有リンク:ビューアーを内蔵した SMART Health Links。
貢献
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)
貢献者
セキュリティ
脆弱性は、SECURITY.mdに記載の方法で非公開で報告してください。公開 Issue に健康データ、キー、トークンを絶対に貼り付けないでください。
ライセンス
サーバーは AGPL-3.0-only です。詳しくはLICENSEをご覧ください。Open Health Sync を変更してサービスとして実行する場合は、変更内容を公開する必要があります。sdks/ のクライアント SDK も同じライセンスの下で提供されています。
コメント
AI アプリケーションが外部のツールやデータソースに統一的な方法で接続するためのオープンなプロトコルです。クライアントはモデルとの対話を担い、MCP サーバーはツール・リソース・プロンプトテンプレートを提供します。標準メッセージでやり取りするため、1 つのサーバーを複数のクライアントで再利用できます。