mcpField
P
Polar Health Data (self-hosted)

Polar Health Data (self-hosted)

ローカル
stumason.github.ioヘルスケア241 週間前に更新

Polar Health Data (self-hosted) について

Polar デバイスのデータをセルフホストで分析するサーバーで、MCP サーバーを内蔵しています。睡眠、HRV、ワークアウトなどを PostgreSQL に保存し、個人のベースラインと比較するため、自分でデータを管理したい方に向いています。

主な機能

  1. 01Polar AccessLink API の 13 エンドポイントを同期
  2. 02自分の PostgreSQL データベースに保存
  3. 03ローリング平均と IQR による異常値範囲の算出
  4. 04OAuth サインインに対応した内蔵 MCP サーバー
  5. 05管理画面、REST API、ユーザーごとの API キー

活用シーン

  1. 01夜間の HRV と個人のベースラインからトレーニング可否を判断
  2. 02睡眠と回復の長期的な傾向を確認
  3. 03MCP クライアントから現在の体調を問い合わせ

MCP 対応

ストリーミング HTTP による /mcp エンドポイントで、健康評価、睡眠、回復、アクティビティ、ワークアウト、ベースラインのツールを MCP クライアントに提供します。

設定

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

mcp.json · 共通設定
{
"mcpServers": {
"stumason-polar-flow-server": {
"command": "docker",
"args": [
"run",
"-i",
"--rm",
"-e",
"DATABASE_URL",
"-e",
"POLAR_CLIENT_ID",
"-e",
"POLAR_CLIENT_SECRET",
"-e",
"BASE_URL",
"docker.io/stumason/polar-flow-server:1.6.2"
],
"env": {
"DATABASE_URL": "<DATABASE_URL>",
"POLAR_CLIENT_ID": "<POLAR_CLIENT_ID>",
"POLAR_CLIENT_SECRET": "<POLAR_CLIENT_SECRET>",
"BASE_URL": "<BASE_URL>"
}
}
}
}
起動コマンドdocker run -i --rm -e DATABASE_URL -e POLAR_CLIENT_ID -e POLAR_CLIENT_SECRET -e BASE_URL docker.io/stumason/polar-flow-server:1.6.2
設定が必要な環境変数
DATABASE_URLシークレットPostgreSQL connection string, e.g. postgresql+asyncpg://user:pass@host:5432/polar
POLAR_CLIENT_IDPolar AccessLink OAuth client id (register at admin.polaraccesslink.com)
POLAR_CLIENT_SECRETシークレットPolar AccessLink OAuth client secret
BASE_URLPublic HTTPS base URL of this deployment; enables OAuth sign-in for MCP connectors

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

パッケージ
ocidocker.io/stumason/polar-flow-server:1.6.2

ツール

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

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

詳細

polar-flow-server

Polar デバイス向けのセルフホスト可能な健康分析ツールです。データを自分で管理し、自分自身のベースラインと照らし合わせて分析し、AI アシスタントにデータを読み取らせることができます。

テスト ドキュメント Docker MCP ライセンス:MIT

ダッシュボード

ドキュメント全文 · MCP サーバー · 連携ガイド · API リファレンス

このツールでできること

あなたの時計は、あなた自身よりもあなたのことをよく知っています。しかし、Polar の API では直近 28~30 日分のデータしか確認できません。このサーバーはすべてのデータを同期して永久に保存し、さまざまな質問への回答に役立てます。

  1. Polar API の 13 個すべてのエンドポイントを自動的に同期します。睡眠、HRV、アクティビティ、ワークアウト、SpO2、ECG、皮膚温などに対応しています
  2. すべてのデータを PostgreSQL に保存します。データもサーバーも自分で管理でき、間にクラウドを挟みません
  3. 個人ベースライン(移動平均、IQR による異常値の範囲)を算出するため、「これは正常か?」を「あなたにとって正常か?」という意味で判断できます
  4. OAuth サインイン機能を備えた組み込み MCP サーバーを搭載しています。Claude に「今日はハードなトレーニングをするべき?」と尋ねると、夜間の HRV をベースラインと比較して回答します
  5. 管理ダッシュボード(HTMX)、REST API、ユーザーごとの API キーを備え、複数ユーザーに対応しています

AI に自分の体について尋ねる(MCP)

組み込みの Model Context Protocol サーバーは、プロトコルリビジョン 2026-07-28 のストリーミング可能な HTTP 形式で、メインサーバー内の /mcp で動作します。10 個の厳選されたツールで、1 回の健康評価、睡眠、回復、アクティビティ、ワークアウト、7 種類のバイオセンシングデータ、個人ベースライン、パターンや異常、同期の制御に対応します。

MCP Apps を表示できるクライアント(claude.ai、Claude Desktop、VS Code)では、「調子はどう?」と尋ねると、会話内に実際のカードが表示されます。

MCP Apps のカード

接続はサインインであり、トークンの貼り付けではありません。 BASE_URL を設定すると、このサーバー自体が OAuth 2.1 認可サーバーになります。Claude Desktop または claude.ai で https://your-server/mcp をカスタムコネクターとして追加し、接続をクリックして、自分のサーバーにログインし、同意画面で承認します。トークンはユーザーごとに管理され、有効期限は 1 時間です。自動的に更新され、接続したアプリはすべて設定からいつでも取り消せます。ヘッドレスクライアントでは、引き続き API キーを使用できます。

claude mcp add polar-health https://your-server.example.com/mcp \
  --transport http \
  --header "X-API-Key: pfk_your_key_here"

詳しいセットアップ方法は、MCP ドキュメントをご覧ください。

アーキテクチャ

Polar API → polar-flow SDK → Sync Service → PostgreSQL
                                                  ↓
                                           Admin Dashboard (HTMX)
                                                  ↓
                                             REST API

技術スタック:

  • Litestar(非同期 Web フレームワーク)
  • SQLAlchemy 2.0(非同期 ORM)
  • PostgreSQL
  • HTMX + Tailwind(管理 UI)
  • polar-flow SDK v1.5.0

サーバーを運用するのはちょっと……という方へ。 ホステッド版を準備中です。ウェイティングリストに登録してください。セルフホスト版は今後もずっと無料です。

クイックスタート

オプション 1:Docker(推奨)
# Pull and run
curl -O https://raw.githubusercontent.com/StuMason/polar-flow-server/main/docker-compose.prod.yml
docker-compose -f docker-compose.prod.yml up -d

# That's it. Open http://localhost:8000/admin
オプション 2:ソースから実行
git clone https://github.com/StuMason/polar-flow-server.git
cd polar-flow-server
docker-compose up -d
セットアップ
  1. http://localhost:8000/admin を開きます
  2. admin.polaraccesslink.com から Polar の認証情報を取得します(リダイレクト URI を http://localhost:8000/admin/oauth/callback に設定します)
  3. 認証情報を入力して、「Polar に接続」をクリックします
  4. 「今すぐ同期」をクリックして、データを取得します

サーバーは 1 時間ごとにデータを自動同期します。

ダッシュボード

/admin/dashboard の管理パネルはタブで構成されています(モバイルではタブバーがフローティング表示されます)。

  • 概要 - 統計タイル(HRV、安静時心拍数、SpO2、皮膚温、歩数、負荷、睡眠スコア、覚醒度など)、今日のコンディションに関するおすすめ、「今日の概要」ミニチャート(睡眠ステージ、心拍数、歩数)
  • トレンドとベースライン - 個人のベースラインと検出されたパターン
  • 睡眠 - 睡眠スコアとステージ別時間のチャート
  • 心拍数 - 1日のHR、HRV、ANSチャージのチャート、生体センシングパネル
  • トレーニング負荷 - アクティビティとカーディオ負荷のチャート

トレンドとベースライン

チャートでは7/14/30日間の範囲を選択でき、CSVにエクスポートできます。APIキーは設定ページで管理でき、レート制限の状況も追跡できます。フロントエンドのアセットはすべて同梱されているため、ダッシュボードはオフラインでも、CDNのないLAN環境でも動作します。

同期されるデータ(13個のエンドポイント)

エンドポイントデータ
睡眠スコア、ステージ(浅い/深い/REM)、時間
Nightly RechargeHRV、ANSチャージ、回復状況
Daily Activity歩数、距離、カロリー、活動時間
Exercisesスポーツ、時間、心拍ゾーン、トレーニング負荷
Cardio Load負荷、許容量、負荷比、状態
SleepWise Alertness時間ごとの覚醒度予測
SleepWise Bedtime最適な睡眠タイミングのおすすめ
Activity Samples分単位の歩数データ
Continuous HR1日を通した心拍数(5分間隔)
SpO2血中酸素の測定値(対応デバイス)
ECG心電図の測定値(対応デバイス)
Body Temperature継続的な体温
Skin Temperatureベースラインからの偏差を含む夜間の皮膚温

設定

必須の環境変数
変数説明必須
DATABASE_URLPostgreSQL接続文字列はい
ENCRYPTION_KEYトークン暗号化用の32バイトのFernetキーはい(本番環境)

暗号化キーを生成します:

python -c "from cryptography.fernet import Fernet; print(Fernet.generate_key().decode())"
任意の環境変数
変数説明デフォルト
DEPLOYMENT_MODEself_hosted または saasself_hosted
SYNC_INTERVAL_HOURS自動同期の間隔1
SYNC_ON_STARTUPサーバー起動時に同期するかどうかfalse
SYNC_DAYS_LOOKBACK同期する過去の日数28
LOG_LEVELログの詳細度INFO
API_KEYマスターAPIキー(レート制限を回避)なし

API認証

APIエンドポイントには認証が必要です。 健康データを一般公開してはなりません。

認証方法
  1. ユーザーごとのAPIキー(推奨)- 管理ダッシュボードまたはOAuthフローから作成します
  2. マスターAPIキー - API_KEY 環境変数を設定すると、すべてのアクセスが可能になります(レート制限を回避)
APIキーの使用
# With per-user API key (includes rate limit headers)
curl -H "X-API-Key: pfk_your_api_key_here" \
  http://localhost:8000/api/v1/users/{user_id}/sleep?days=7

# Response headers include:
# X-RateLimit-Limit: 1000
# X-RateLimit-Remaining: 999
# X-RateLimit-Reset: 1704067200
レート制限
  • デフォルト:APIキーごとに1時間あたり1000リクエスト
  • レート制限は1時間ごとにリセットされます
  • マスターAPIキー(API_KEY 環境変数)はレート制限を回避します
  • レート制限情報はレスポンスヘッダーに返されます

OAuth連携(SaaS/マルチユーザー)

polar-flow-serverとの連携が必要なアプリケーション向けです(例:Laravel、モバイルアプリ、ウェブフロントエンド)。

これにより、すべてのPolarユーザーが自分のアカウントをアプリケーションに接続できるようになります。

OAuthフロー
┌─────────────────┐     ┌─────────────────────┐     ┌─────────────────┐
│  Your App       │────▶│  polar-flow-server  │────▶│  Polar Flow     │
│  (Laravel etc)  │     │                     │     │  (OAuth)        │
│                 │◀────│                     │◀────│                 │
└─────────────────┘     └─────────────────────┘     └─────────────────┘

ステップ1:OAuthを開始するためにユーザーをリダイレクトする

GET /oauth/start?callback_url=https://yourapp.com/callback&client_id=your-app-name
パラメーター必須説明
callback_urlはいOAuth後のリダイレクト先(アプリのコールバックエンドポイント)
client_idいいえアプリの識別子(交換時に検証されます)

ステップ2:ユーザーがPolarで認証する

ユーザーはPolarにリダイレクトされ、認証情報でログインして、アプリを承認します。

ステップ3:ユーザーがコールバック先にリダイレクトされる

https://yourapp.com/callback?code=TEMP_CODE_HERE

ステップ4:一時コードをAPIキーと交換する(サーバー間通信)

POST /oauth/exchange
Content-Type: application/json

{
  "code": "TEMP_CODE_HERE",
  "client_id": "your-app-name"
}

レスポンス:

{
  "api_key": "pfk_abc123...",
  "polar_user_id": "12345678",
  "expires_at": null
}

ステップ5:APIキーを保存して使用する

このユーザーの api_key と polar_user_id を保存します。すべてのデータリクエストでAPIキーを使用します:

curl -H "X-API-Key: pfk_abc123..." \
  "https://your-polar-server.com/api/v1/users/12345678/sleep?days=7"
Polar 管理画面の設定

admin.polaraccesslink.comで、アプリのリダイレクト URI を次のように設定します。

https://your-polar-server.com/oauth/callback
キー管理
# Get key info
GET /api/v1/users/{user_id}/api-key/info
X-API-Key: pfk_...

# Regenerate key (invalidates old key)
POST /api/v1/users/{user_id}/api-key/regenerate
X-API-Key: pfk_...

# Revoke key
POST /api/v1/users/{user_id}/api-key/revoke
X-API-Key: pfk_...

API エンドポイント

# Health check (no auth required)
curl http://localhost:8000/health

# Get sleep data (last 7 days)
curl -H "X-API-Key: pfk_..." \
  "http://localhost:8000/api/v1/users/{user_id}/sleep?days=7"

# Get activity data
curl -H "X-API-Key: pfk_..." \
  "http://localhost:8000/api/v1/users/{user_id}/activity?days=7"

# Get nightly recharge (HRV)
curl -H "X-API-Key: pfk_..." \
  "http://localhost:8000/api/v1/users/{user_id}/recharge?days=7"

# Get exercises
curl -H "X-API-Key: pfk_..." \
  "http://localhost:8000/api/v1/users/{user_id}/exercises?days=30"

# Export summary
curl -H "X-API-Key: pfk_..." \
  "http://localhost:8000/api/v1/users/{user_id}/export/summary?days=30"

開発

# Install dependencies
uv sync --all-extras

# Start PostgreSQL
docker-compose up -d postgres

# Run server with hot reload
uv run uvicorn polar_flow_server.app:app --reload

# Run tests
uv run pytest

# Type check
uv run mypy src/polar_flow_server

# Lint
uv run ruff check src/

本番環境へのデプロイ

Docker を実行できる場所であれば、どこにでもデプロイできます。

# Download and run
curl -O https://raw.githubusercontent.com/StuMason/polar-flow-server/main/docker-compose.prod.yml
docker-compose -f docker-compose.prod.yml up -d

Coolify、Railway、Render など - GitHub リポジトリを指定すると、Dockerfile からビルドされます。

本番環境で必要な設定:

  • ENCRYPTION_KEY 環境変数を設定します(設定しないと、トークンは再起動後に保持されません)
  • DATABASE_URL に PostgreSQL インスタンスを設定します

データベースのマイグレーションは起動時に自動で実行されます。

マルチテナント

このサーバーは、標準で複数ユーザーに対応しています。

  • すべてのテーブルに user_id カラムがあります
  • すべてのクエリは user_id でスコープされます
  • ユーザーごとの API キーにより、各ユーザーは自分のデータにのみアクセスできます
  • セルフホストの場合:通常は 1 人のユーザーです
  • マルチユーザーの場合:同じコードベースを多くのユーザーで利用します

使用技術

ライセンス

MIT

コメント

MCP は初めてですか?

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

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