Skip to main content
Glama
nnishad
by nnishad

health-relay

セルフホスト型ブリッジです。Samsung Watch → Sync2R1 スマホアプリと Hermes AI エージェントを接続します。アプリはLAN経由でヘルスデータをこのリレーに送信し、 データはローカル(SQLite)に保存され、REST と MCP の両方で公開されるため、 エージェントからクエリできます。

Galaxy Watch ─▶ Samsung Health ─▶ Sync2Ra1 (phone) ──push──▶ health-relay ──MCP/REST──▶ Hermes

すべてのデータはネットワーク内に留まります。外部へ送信されることはありません。


クイックスタート(Docker または Podman)

echo "HR_AUTH_TOKEN=<choose-a-secret>" > .env
docker compose up -d          # or: podman compose up -d
curl http://localhost:8790/healthz     # -> {"ok":true}

データは ./data/ledger.db(SQLite、WALモード)に保存されます。

Docker を使わずに実行する

python3 -m venv .venv && .venv/bin/pip install -r requirements.txt
HR_AUTH_TOKEN=<secret> ./run.sh

Related MCP server: Yummy Health MCP

スマホアプリをリレーに接続する

Sync2R1 → データタブ → Relay(Hermes ブリッジ) で設定します:

フィールド

値

リレーURL

http://<this-machine-ip>:8790

トークン

HR_AUTH_TOKEN と同じシークレット

Save → Sync now をタップすると、数秒以内に測定値が届きます。


接続

phone (Sync2Ra1) ──HTTP :8790──▶ health-relay ◀──MCP stdio / HTTP── Hermes
        same LAN · or Tailscale for anywhere-access

項目

詳細

向き

スマホ → リレー(スマホからのアウトバウンド。スマホへ接続されるものはありません)

ポート

リレーを実行中のマシンへのTCP 8790インバウンド — そのホストのファイアウォールで開放してください

プロトコル

平文HTTP + Authorization: Bearer <token>。LAN内のみに限定するか、TLSにするにはリバースプロキシ(Caddy/nginx)を前面に置いてください

どこからでも接続可

Tailscale をマシンとスマホにインストールし、Tailscale IP(http://100.x.y.z:8790)をアプリに向けます — 暗号化され、モバイルデータでも動作し、ポートをインターネットに公開することはありません

同期頻度

アプリは1時間ごと、アプリ起動時、手動の 今すぐ同期 で自動同期します

オフライン時

スマホはすべてをローカルSQLiteにバッファリングします。再接続時にそのバックログ全体を(古い順に)送信し、過去48時間を再同期して、Samsung側の更新も反映します

重複対策

二重にカウントするのは不可能です — 各読み取りには一意なキーがあり、再送はサーバー側で無視されます

Hermesの場所

同じマシン(MCPがローカルサブプロセスとしてSQLiteファイルを読み取る)またはリモート(MCP の代わりにRESTエンドポイントを使う)


REST API(ベアラー認証)

エンドポイント

目的

GET /healthz

liveness(認証なし)

POST /api/v1/health/samples

バッチ取り込み — 冪等、再送は no-op

GET /api/v1/health/samples?type=&from_ms=&to_ms=&limit=&offset=

生の測定値

GET /api/v1/health/daily-summary?date=YYYY-MM-DD&tz=Europe/London

メトリックごとの最小/最大/平均/件数

GET /api/v1/health/trends?type=X&days=N&tz=Europe/London

日次ロールアップ

GET /api/v1/health/status

種別ごとの合計

curl -H "Authorization: Bearer <secret>" \
  "http://localhost:8790/api/v1/health/daily-summary?date=$(date +%F)&tz=Europe/London"

Hermes に接続する(MCP)

MCPサーバーは同じSQLiteファイルを読み取ります — このリポジトリから起動してください。

python3 -m venv .venv-mcp
.venv-mcp/bin/pip install fastmcp

エージェントのMCP設定に以下を追加します。

{
  "mcpServers": {
    "health-relay": {
      "command": "<repo-path>/.venv-mcp/bin/python",
      "args": ["<repo-path>/mcp_server.py"],
      "env": { "HR_DATA_DIR": "<repo-path>/data" }
    }
  }
}

エージェントが使えるツール

ツール

対応する質問の例

list_streams()

「どんなヘルスデータがありますか?」

get_samples(type, from_ms, to_ms)

「今朝の心拍数を表示」

daily_summary(date, tz)

「昨日はどれくらい活動しましたか?」

sleep_breakdown(nights)

「今週の睡眠状態はどうでしたか?」

日付の境界はタイムゾーン(tz="Europe/London" など、DSTにも対応)に従います。


記録されるデータ

心拍数・SpO₂・肌温度・呼吸回数・安静時心拍数・VO₂max・ sleep時間/スコア/ステージ・歩数と階数(毎時+毎日)・運動・ アクティビティーカロリー/時間/距離・体組成(BIA)・エナジースコア・血圧・glucose・水分補給・食事。


設定

環境変数

デフォルト

説明

HR_AUTH_TOKEN

(空欄 = 認証オフ)

本番では必ず設定

HR_PORT

8790

HR_HOST

0.0.0.0

信頼できるLAN内にのみ

HR_DATA_DIR

~/health-relay-data

SQLiteはここに保存されます

テスト

.venv/bin/python -m pytest tests/ -q

Related MCP Connectors

Related MCP Servers

  • F
    license
    Not graded
    quality
    B
    maintenance
    Private, read-only health data bridge that reads from Android Health Connect and exposes heart rate, steps, sleep, and other health metrics to ChatGPT via MCP tools.
    -
  • A
    license
    B
    quality
    A
    maintenance
    Enables local, read-only access to Garmin Connect health and training data through MCP, letting assistants summarize recovery, sleep, activities, and more without uploading your data.
    19
    MIT