mcpField
W
Whoop MCP Server

Whoop MCP Server

ローカル
github.comヘルスケア164 週間前に更新

Whoop MCP Server について

Claude や ChatGPT などから個人の WHOOP の回復、睡眠、負荷、ワークアウトデータを照会できる、セルフホスト可能なオープンソースの MCP サーバーです。データは要求時に WHOOP から取得し、健康データを保存しません。各アプリに個別のサインインと許可を求めます。

主な機能

  1. 01回復、睡眠、負荷、ワークアウト記録の照会
  2. 02WHOOP から最新データをオンデマンド取得
  3. 03日次サマリーと過去の傾向を提供
  4. 04OAuth 2.1 サインインとアプリごとの同意

活用シーン

  1. 01昨夜の睡眠時間と睡眠ステージを確認
  2. 02回復、HRV、安静時心拍数の傾向を確認
  3. 03最近のワークアウト、心拍ゾーン、カロリーを集計
  4. 04AI アプリから個人の WHOOP データにアクセス

MCP 対応

MCP サーバーとして、WHOOP データを照会するツールをクライアントに提供し、OAuth 2.1 のサインインとユーザーの同意によってアクセスを制限します。

設定

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

mcp.json · 共通設定
{
"mcpServers": {
"yuridivonis-whoop": {
"command": "docker",
"args": [
"run",
"-i",
"--rm",
"-e",
"WHOOP_CLIENT_ID",
"-e",
"WHOOP_CLIENT_SECRET",
"-e",
"WHOOP_REDIRECT_URI",
"-e",
"MCP_AUTH_PASSWORD",
"-e",
"PUBLIC_URL",
"-e",
"ENCRYPTION_SECRET",
"-e",
"UPDATE_CHECK",
"ghcr.io/yuridivonis/whoop-mcp-server:1.5.1"
],
"env": {
"WHOOP_CLIENT_ID": "<WHOOP_CLIENT_ID>",
"WHOOP_CLIENT_SECRET": "<WHOOP_CLIENT_SECRET>",
"WHOOP_REDIRECT_URI": "<WHOOP_REDIRECT_URI>",
"MCP_AUTH_PASSWORD": "<MCP_AUTH_PASSWORD>",
"PUBLIC_URL": "<PUBLIC_URL>",
"ENCRYPTION_SECRET": "<ENCRYPTION_SECRET>",
"UPDATE_CHECK": "<UPDATE_CHECK>"
}
}
}
}
起動コマンドdocker run -i --rm -e WHOOP_CLIENT_ID -e WHOOP_CLIENT_SECRET -e WHOOP_REDIRECT_URI -e MCP_AUTH_PASSWORD -e PUBLIC_URL -e ENCRYPTION_SECRET -e UPDATE_CHECK ghcr.io/yuridivonis/whoop-mcp-server:1.5.1
設定が必要な環境変数
WHOOP_CLIENT_IDClient ID of your WHOOP developer app.
WHOOP_CLIENT_SECRETシークレットClient secret of your WHOOP developer app.
WHOOP_REDIRECT_URIThe server's /callback address, also added to your WHOOP app. WHOOP needs an https address, such as a tunnel to this computer.
MCP_AUTH_PASSWORDシークレットPassword for the sign-in page that protects /mcp, at least 16 characters.
PUBLIC_URLThe address MCP clients use to reach the server. Keep the default when running it on this computer.
ENCRYPTION_SECRETシークレットKey for encrypting the stored WHOOP tokens. Defaults to WHOOP_CLIENT_SECRET.
UPDATE_CHECKOnce a day, ask GitHub for the latest release number and mention a newer version in get_today. Sends nothing about you. Set to false to turn it off.

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

パッケージ
ocighcr.io/yuridivonis/whoop-mcp-server:1.5.1

ツール

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

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

詳細

README の画像

Whoop MCP Server

CI OpenSSF Scorecard OpenSSF Best Practices Latest release License: MIT

ご利用のAIでWHOOPデータを使えます。さらに近いうちに、ご自身のコードでも利用できるようになります。 セルフホスト可能で、プライベートなオープンソースです。

Claude、ChatGPT、その他のMCPアプリに「今週の睡眠はどうでしたか?」と尋ねると、ご自身のリカバリー、睡眠、ストレイン、ワークアウトのデータに基づいた回答が得られます。サーバーはご自身で実行します。質問するとWHOOPからデータを取得し、コピーは保存しません。また、アクセスできるのは許可したアプリだけです。

これは独立したオープンソースプロジェクトです。WHOOP製品のデータへのアクセスにWHOOP APIを使用しており、WHOOPとの提携、WHOOPによる承認、またはWHOOPからの支援を受けていません。

2つの使い方

  • データに話しかける。 サーバーをデプロイしてAIに接続し、質問します。セットアップから始めて、AIに追加してください。ここには、これまでにテスト済みのアプリも記載されています。
  • データを使って開発する。 このサーバー内のWHOOPクライアント(型付けされ、テスト済みで、WHOOPの使い捨てリフレッシュトークンを慎重に扱います)は、ご自身のコードで使えるライブラリとして分離する作業が進んでいます。まだ公開されていません。公開時期を知るには、このリポジトリのリリースを確認してください。

Whoop Developer API v2とModel Context Protocol(MCP)を基盤としています。MCPは、このようなツールを呼び出すためにAIアプリが使用するオープン標準です。

特長

  • Whoopが送信するデータをすべて表示し、隠しません:Whoop APIの生理学的フィールドをすべて含み、各レコードに日付を付け、ゼロはゼロとして表示し、スコアが付いていない日はその旨を示します
  • リカバリー:毎日のリカバリースコア、HRV、安静時心拍数、SpO2、皮膚温、Whoopによる調整がまだ続いているかどうか
  • 睡眠:就寝時刻と起床時刻、睡眠時間とベッドにいた時間、覚醒時間とデータのない時間、浅い睡眠/深い睡眠/REMの各段階、睡眠サイクル、中断、パフォーマンス、効率、一貫性、呼吸数、各夜の前に必要な睡眠(ベースライン、負債、ストレイン、昼寝による充足分)、昼寝
  • ストレイン:毎日のストレインスコア、消費カロリー、平均心拍数と最大心拍数、歩数
  • ワークアウト:アクティビティ、現地での開始時刻、時間、ストレイン、心拍数、消費カロリー、各心拍ゾーンでの時間、距離、獲得標高と高度の変化、記録された心拍データの割合
  • ライブデータ:質問するたびにWhoopから回答を取得するため、常に最新です。サーバーが保存するのはサインイン情報と暗号化されたWHOOPトークンのみで、健康データは保存しません
  • デフォルトでプライベート:各アプリはご自身で選んだパスワードでサインインし(OAuth 2.1)、許可するチェックボックスにチェックした後にのみアクセスできます。そのため、他の人がデータを読むことはできません
  • 好きなAIを選択:ClaudeとChatGPTで実際にテスト済みです。OAuthでサインインする他のアプリも同様に動作するはずです(互換性を参照)

MCP ツール

ツール説明
get_today朝のブリーフィング:最新のリカバリー、昨夜の睡眠(必要な睡眠時間と昼寝を含む)、今日のストレインを、各フィールドの日付とともに取得します
get_recovery_trends日ごとのリカバリー、HRV、安静時心拍数、SpO2、皮膚温度、キャリブレーション中フラグと、スコアが記録された日の平均を取得します
get_sleep_analysis夜間の睡眠:時刻、ステージ、パフォーマンス、効率、一貫性、中断、呼吸数、必要な睡眠時間、昼寝、平均を取得します
get_strain_history日ごとのストレイン、カロリー、心拍数、歩数と、完了した日の平均を取得します
get_workoutsアクティビティ、時間、ストレイン、心拍数、カロリー、すべての心拍ゾーン、距離、高度を含むワークアウトと、合計を取得します
get_auth_urlWhoop アカウントを接続するリンク(1回のみ使用でき、10分で期限切れになります)

セットアップ

最速の方法:Railway にデプロイ

テンプレートは、このプロジェクトのメンテナーが公開しています。Railway は、デプロイでの支出に応じてテンプレート作成者に収益の一部を支払います。また、リンクには紹介コードが含まれています。どちらも追加料金はかかりません。Railway の Hobby プランで十分です。

Railway にデプロイ

ワンクリックで、ボリューム、自動更新、生成されたシークレットを備えた :1 イメージを実行する Railway プロジェクトが作成されます。入力するものはありません。2026-09-29 に実環境での動作を確認済みです。続けて、次の手順を実行してください。

  1. サービスカードをクリックします。アドレスは Deployments タブの上部にあります(whoop-mcp-server-production-xxxx.up.railway.app)。開いてください。
  2. ページの案内に従って、残りの手順を進めます。Whoop の開発者アプリを作成し(すべての入力欄が表示されます)、アプリの2つのキーをサービスの変数にあるプレースホルダーに貼り付け、表示されたアドレスを Claude または ChatGPT に追加し、最初の質問の際に Whoop の認証を一度承認してください。

手動で、または別の場所にセットアップする場合は、続きをお読みください。

1. デプロイ

各リリースは、すぐに使えるイメージ ghcr.io/yuridivonis/whoop-mcp-server として公開されます。これをデプロイしてください。コードを変更する場合(コードの変更を参照)を除き、このリポジトリをフォークする必要はありません。以下の手順では Railway を使用します。それ以外の場所で実行する場合は、Dockerを参照してください。

  1. Railway プロジェクトで New をクリックし、Docker Image を選択して、ghcr.io/yuridivonis/whoop-mcp-server:1 を入力します。次に、サービスの Settings → Networking → Public Networking で Generate Domain を選択します。これがサーバーのアドレスとなり、以下では your-app.up.railway.app とします。サーバーはこのアドレスから Whoop のコールバックアドレスを判断します。
  2. 環境変数を追加します。
    • MCP_AUTH_PASSWORD:AI アプリを接続するときに、各アプリから求められるパスワードです。openssl rand -base64 24 で生成し、パスワードマネージャーに保存してください。この値が設定されていないと、サーバーは起動しません(16 文字以上が必要です)。
    • ENCRYPTION_SECRET(任意、推奨):openssl rand -base64 32 で生成してください。保存された Whoop トークンを暗号化するため、後で Whoop クライアントシークレットを変更しても、アカウントの接続が切れません。
    • ひとまず WHOOP_CLIENT_ID = replace-with-your-client-id、WHOOP_CLIENT_SECRET = replace-with-your-client-secret を設定します。サーバーはこれらを未設定として扱います。Whoop Developer App を作成するで置き換えます。
  3. /data にマウントするボリュームを追加します。サインイン情報と暗号化された Whoop トークンが保存されます。これがないと、デプロイのたびにアプリからサインアウトされ、Whoop との接続も切れます。
  4. 更新を有効にします。サービスの Settings で Source の下にある Configure Auto Updates を選択し、メンテナンス時間帯(たとえば Night)を設定します。:1 タグは 1.x リリースごとに更新され、Railway はその後サービスを再デプロイします。Pro プランでは、その前にボリュームがバックアップされます。
  5. デプロイしたら、https://your-app.up.railway.app/ を開きます。セットアップページの案内に従って、残りの手順を進めてください。デプロイに失敗した場合はログを開いてください。不足しているものがサーバーに表示されます。

すでに Railway でフォークを実行していますか? イメージに切り替えます。サービスの Settings を開き、Service Source を ghcr.io/yuridivonis/whoop-mcp-server:1 に変更して、手順 4 と同じように自動更新を有効にします。Whoop との接続を維持するため、同じ環境変数とボリュームを使ってください。フォークのバージョンが 1.3.0 より古い場合は、先に1.3.0 へのアップグレードを読んでください。すべてのアプリで、もう一度サインインする必要があります。その後、フォークは使用されなくなります。

2. Whoop 開発者アプリを作成する

サーバーのセットアップページ https://your-app.up.railway.app/ では、Whoop の新規アプリ作成フォームをフォームの順番どおりに案内し、各項目には貼り付け用のコピーボタンがあります。手順を簡潔にまとめると、次のとおりです。

  1. Whoop Developer Dashboard で New App を開き、フォームの上から順に入力します。

    • Name:任意の名前です。アプリを承認するときに表示されます。
    • Logo:空欄のままにします。
    • Contacts:メールアドレスを入力します。Whoop だけに表示されます。
    • Privacy Policy:このプロジェクトの PRIVACY.md、https://github.com/yuridivonis/whoop-mcp-server/blob/main/PRIVACY.md、または他の人のためにサーバーを運用する場合は、それに合わせて変更した独自のコピーを指定します。アプリを承認するときに、このリンクが表示されます。
    • Redirect URLs:サーバーのコールバック URL を、セットアップページに表示されているとおりに https://your-app.up.railway.app/callback と入力します。
    • Scopes:read:recovery、read:cycles、read:sleep、read:workout を指定します。サーバーはそれ以外のスコープを使用しません。ログイン時には offline も要求されます。これにより、再ログインしなくてもサーバーが Whoop のアクセストークンを更新できます。このスコープはダッシュボードには表示されません。
    • Webhooks:空欄のままにします。

    Create App をクリックすると、Whoop にアプリの Client ID と Client Secret が表示されます。

  2. サービスの Variables タブで、WHOOP_CLIENT_ID の replace-with-your-client-id を選択して Client ID を貼り付けます。同様に、WHOOP_CLIENT_SECRET の replace-with-your-client-secret を選択して Client Secret を貼り付け、上部の Deploy をクリックします。すると、セットアップページで手順 2 と 3 にチェックが付きます。

あとでカスタムドメインを追加した場合は、セットアップページをもう一度開きます。表示される Redirect URL が変わっていたら、Whoop アプリの設定を更新するか、WHOOP_REDIRECT_URI を設定してください。

3. AI を接続する

サーバーのアドレス https://your-app.up.railway.app/mcp を、カスタムコネクターとして AI アプリに追加します。サーバーのサインインページが開くので、接続するアプリの名前が表示されていることを確認し、MCP_AUTH_PASSWORD を入力して、Whoop データの読み取りを許可するチェックボックスにチェックを入れます。たとえば Claude.ai では、Customize → Connectors → + → Add custom connector の順に選択します。

AI に追加するには、Claude、ChatGPT、Claude Code、Cursor、VS Code、Windsurf での手順と、テスト済みのアプリが記載されています。アプリは再デプロイ後もサインイン状態を維持します。パスワードを持たないユーザーが /mcp にアクセスすると、401 Unauthorized が返されます。

4. Whoop アカウントを接続する
  1. チャットで、リカバリーについて AI に質問します。最初の回答には Whoop のリンクが表示されます(get_auth_url を呼び出します)。
  2. リンクを開き、Whoop にログインして、アプリを一度だけ承認します。サーバーにリダイレクトされ、その後は AI が回答できるようになります。
  3. 好きなことを質問してください。「昨夜はよく眠れましたか?」

1.3.0 へのアップグレード

1.3.0 では Whoop データのコピーを保持しなくなり、各アプリがデータを受け取る前に許可を求めるようになりました。アップグレードするには、次の手順に従います。

  1. 新しいバージョンを入手します。イメージを使っている場合は、Railway が自動更新します。または、Service Source を :1 タグに切り替えて再デプロイします(Docker で :1 を使っている場合は、もう一度イメージを取得して再起動します)。フォークを使っている場合は、GitHub の Sync fork ボタンをクリックしてから再デプロイするか、Deploy に記載されている方法でイメージに切り替えます。
  2. サーバーは初回起動時に、以前のバージョンが保存したリカバリー、睡眠、ストレイン、ワークアウトのデータを削除し、データベースファイルを書き換えて、ディスク上にデータが残らないようにします。Whoop との接続は維持されます。ログには Deleted the WHOOP data stored by an earlier version と表示されます。
  3. すべてのアプリが一度サインアウトされます。次にアプリを使うとサインインページが開きます。パスワードを入力し、Whoop データの読み取りを許可するチェックボックスにチェックを入れます。
  4. sync_data は廃止されました。アプリにまだ表示されている場合は、コネクターを削除して追加し直してください。
  5. ホストがボリュームのバックアップやスナップショットを保持している場合は、アップグレード前のものを削除してください。古いデータのコピーがまだ含まれています。

アップグレードしたデータベースを 1.2.x に戻すことはできません。新しいサインイン用テーブルでは、アプリにサインインできないためです。

1.0.0 からのアップグレード

1.1.0 では、/mcp の前にサインインを設けています。バージョン 1.0.0 ではここに認証がなかったため、HTTP 経由で Claude と連携していた 1.0.0 のサーバーは、URL を知っている人なら誰でもデータを取得できる状態でした。(未変更の 1.0.0 にはリクエスト解析のバグもあり、Claude が HTTP 経由で接続できませんでした。1.1.0 ではその両方を修正しています。)アップグレードするには、次の手順を実行します。

  1. フォークを更新します(GitHub の Sync fork ボタンを使用するか、上流の main ブランチをマージします)。または、デプロイの説明に従って、サービスで使用するイメージを切り替えます。
  2. Railway の変数に MCP_AUTH_PASSWORD を設定します(「セットアップ」の手順 1 を参照)。設定しないと、新しいバージョンは起動しません。これは意図した動作です。
  3. 再デプロイします。
  4. Claude.ai → 設定 → コネクターで、Whoop コネクターを削除し、同じ URL で再度追加します。Claude にサインインページが一度表示されます。
  5. ツールに Whoop の認証期限が切れたと表示された場合は、get_auth_url を一度実行して再接続します。
  6. 任意:Whoop アプリで read:profile と read:body_measurement のチェックを外します。1.1.0 ではこれらを使用しなくなりました。

1.0.0 のサーバーがパブリック URL で Claude と連携していた場合、データが読み取られていた可能性があると考えてください。予防策として、Whoop の開発者ダッシュボードでクライアントシークレットをローテーションし、WHOOP_CLIENT_SECRET を更新してから、get_auth_url を一度実行してください。ENCRYPTION_SECRET が設定されていない場合、保存されていた Whoop トークンは古いクライアントシークレットで暗号化されています。サーバーはそのまま起動しますが、再接続するまでは Whoop が切断された状態として扱われます。

セキュリティ

  • /mcp が応答するのは、サインイン済みのクライアントだけです。サインインコードとリフレッシュトークンは一度だけ使用でき、ハッシュとして保存されます。同じものが二度使用された場合、サインイン全体が取り消されます。
  • サインインの失敗回数は、アドレスごとに 15 分間で 10 回まで、全体で 1 時間に 50 回までに制限されています。
  • サインインコードは、Claude、ChatGPT、ご使用のコンピューター上のデスクトップアプリ、または MCP_ALLOWED_REDIRECT_HOSTS で追加したウェブクライアントにのみ送信されます。サインインページには戻り先が表示されます。接続を自分で開始した場合にのみサインインしてください。
  • 各アプリは、Whoop データの読み取りを許可するチェックボックスにチェックを入れた後にのみ、サインインされます。
  • Whoop トークンは保存時に暗号化されます(AES-256-GCM)。健康データは保存されません。サーバーは質問ごとに Whoop からデータを取得し、サインインしたクライアントにのみ送信します。
  • MCP_AUTH_PASSWORD を変更すると、すべてのクライアントがサインアウトされます。
  • サーバーが Whoop に要求するデータは、回復、サイクル、睡眠、ワークアウトのみです。

セキュリティモデルの全容と脆弱性を非公開で報告する方法については、SECURITY.md を参照してください。デプロイで保存・共有される情報については、PRIVACY.md を参照してください。

WHOOPの規約:サーバーが行うことと、あなたに委ねられること

このサーバーをデプロイすると、独自のWhoop開発者アプリを登録するため、2026年10月6日発効のWHOOPのAPI利用規約における開発者(「Company」)となります。規約では各セクションに番号が付いていますが、セクション内の段落には番号が付いていないため、ここではセクションと見出しを使って各段落を示します。これは、サーバーによるデータの取り扱いに関わる義務の要約であり、法的助言でも、あらゆるデプロイが規約に準拠することを保証するものでもありません。デプロイする前に規約をお読みください。

WHOOPの規約求められる事項サーバーが行うことと、あなたに委ねられること
4. WHOOP Data、Prohibitions on WHOOP DataWHOOPデータが第三者に渡る前に、明示的なオプトイン同意を得ること接続するアプリはすべて第三者です。サインインページでデータの送信先を明示し、データの送信を許可するチェックボックスにチェックを入れるまで、アプリへのサインインは行われません。
4. WHOOP Data、Prohibitions on WHOOP Dataデータベースや永続的なコピーを作成せず、WHOOPのキャッシュヘッダーで許可された期間を超えてキャッシュコピーを保持しないことデータは何も保存されません。リクエストのたびにWHOOPから回答を取得します。同時に実行されたツールは1つのリクエストを共有し、処理の完了後は何も保持しません。
4. WHOOP Data、Prohibitions on WHOOP DataWHOOPデータをAIの作成、開発、テスト、トレーニング、ファインチューニング、改善に使用しないことサーバーは何もトレーニングしません。また、このプロジェクトのテストには合成データのみを使用します。アプリを接続する前に、会話をモデルの改善に使用することをプロバイダーに許可する設定をすべてオフにしてください。
2. Company Applications、Application SecurityWHOOPデータを転送中および保存時に暗号化し、セキュリティインシデントを48時間以内にWHOOPへ報告することhttpsなしでサーバーをパブリックアドレス上で実行することを拒否します。また、サーバーが保存するWHOOPデータは暗号化されたトークンのみです。インシデントの報告はあなたの責任です。下記をご覧ください。
1. Use of WHOOP APIs、Permitted AccessアプリごとにWHOOPの認証情報を1組だけ使用することデプロイごとに独自のWhoop開発者アプリを用意してください。
3. Restrictions; Confidentiality、Confidentiality開発者認証情報を機密に保ち、オープンソースプロジェクトに決して埋め込まないことサーバーは環境変数から認証情報を読み込みます。フォークを含め、リポジトリに決してコミットしないでください。
3. Restrictions; Confidentiality、API Prohibitions医療、法律、その他の専門的な助言を提供せず、医療機器として使用しないことツールはWHOOPの数値を報告します。助言や診断は行いません。また、ツールを利用して構築するものも、同様に助言や診断を行うべきではありません。
他の人のために運用する場合

各デプロイは1つのWhoopアカウントに対応します。他の人のためにデプロイする場合、その人はエンドユーザーとなり、2. Company Applicationsに基づき、あなたには以下の責任があります。

  • 同意: その人はWhoopのログインを通じて自分のWhoopアカウントを接続し、アプリごとに自分でチェックボックスにチェックを入れます。そのため、サーバーのパスワード(MCP_AUTH_PASSWORD)が必要です。本人に代わってチェックを入れないでください(End User Authorization and Consent)。
  • プライバシーポリシー: PRIVACY.mdをご自身の連絡先情報に合わせて変更し、Whoopアプリからリンクしてください(End User Privacy)。
  • サポート: あなたに簡単に連絡できる手段を用意してください(End User Authorization and Consent、Application Support)。
  • セキュリティインシデント: 誰かがその人のデータに不正アクセスした場合、発見から48時間以内に[email protected]へWHOOPに通知し、法律で求められるとおりに本人にも伝えてください(Application Security)。SECURITY.mdをご覧ください。
  • 更新: デプロイをサポート対象バージョンに保ってください。
  • AI: 独自の実験を含め、いかなるAIシステムのテストや改善にも、その人のデータを決して使用しないでください。

Docker

各リリースは、GitHub のコンテナレジストリで amd64 および arm64 向けのイメージとして公開されています。上記の Railway のセットアップと同じサーバーが実行されます。

docker run -d --name whoop-mcp -p 3000:3000 -v whoop-data:/data \
  -e WHOOP_CLIENT_ID=replace-with-your-client-id \
  -e WHOOP_CLIENT_SECRET=replace-with-your-client-secret \
  -e WHOOP_REDIRECT_URI=https://your-server.example.com/callback \
  -e MCP_AUTH_PASSWORD=replace-with-a-password-of-16-or-more-characters \
  ghcr.io/yuridivonis/whoop-mcp-server:1
  • https の公開アドレスがあるサーバーの場合: WHOOP_REDIRECT_URI にそのアドレスの /callback を設定し、Railway と同様に、AI アプリを /mcp に接続します。サーバーのルートにあるセットアップページに、残りの作業が表示されます。
  • 自分のコンピューターの場合: Whoop のログインには引き続き https アドレスが必要なので、ポート 3000 にトンネルを向け(下記参照)、トンネルの /callback を使用します。同じコンピューター上の MCP クライアントが http://localhost:3000/mcp に接続できるように、-e PUBLIC_URL=http://localhost:3000 を追加します。
  • サインイン情報と Whoop トークン: whoop-data ボリュームに保存されるため、再起動やアップグレード後も接続状態が維持されます。
  • タグ: :1 は常に最新の 1.x リリースを指すため、再度 pull する(または再デプロイする)と、互換性を損なう変更なしに修正や新機能を取得できます。:1.3.0 などは特定のバージョンに固定されます。:latest は、将来の 2.0 を含むすべてのリリースを追跡します。

イメージがこのリポジトリのリリースワークフローによってビルドされたことを確認するには、gh attestation verify oci://ghcr.io/yuridivonis/whoop-mcp-server:1 --owner yuridivonis を実行します。

このサーバーは公式の MCP Registry にも io.github.yuridivonis/whoop-mcp-server として登録されています。

自分のコンピューターで実行する

Node.js 22 以降が必要です。

# Install dependencies
npm install

# Create .env file (npm run dev loads it)
cat > .env << EOF
WHOOP_CLIENT_ID=replace-with-your-client-id
WHOOP_CLIENT_SECRET=replace-with-your-client-secret
# Whoop needs an https address: use your tunnel's (see below)
WHOOP_REDIRECT_URI=https://your-tunnel.example.com/callback
MCP_AUTH_PASSWORD=replace-with-a-password-of-16-or-more-characters
MCP_MODE=http
EOF

# Run in development mode (restarts on changes)
npm run dev

# Run the tests and the type check
npm test
npm run typecheck

このリポジトリは npm ワークスペースです。src/ にサーバーがあり、その基盤となる WHOOP API クライアントは packages/whoop-client にあります。このライブラリは単独でも使用できます。npm install によって両者がリンクされ、npm test、npm run typecheck、npm run build、npm run dev はライブラリを先にビルドします。ライブラリ自体を変更する場合は、npx tsc -b -w packages/whoop-client を実行すると、変更に応じて再ビルドされます。

Whoop のリダイレクト URL は https(またはアプリスキーム)である必要があるため、自分のコンピューター上のサーバーには https トンネルが必要です。たとえば、cloudflared tunnel --url http://localhost:3000 または ngrok http 3000 を使用します。その後、次の手順を行います。

  1. WHOOP_REDIRECT_URI にトンネルの /callback アドレスを設定します。
  2. そのアドレスを Whoop アプリに追加します。
  3. MCP クライアントをトンネルの /mcp アドレスに接続します。

クイックトンネルは起動するたびに新しいアドレスになるため、手順 1 から 3 を繰り返す必要があります。名前付きトンネルなら同じアドレスを維持できます。ツールの回答を含むトラフィックは、トンネルプロバイダーを経由します。

MCP_MODE=stdio を指定すると、ローカルコマンドとして起動する MCP クライアント向けにサーバーが実行されます。起動したアプリだけがアクセスできるため、サインインはありません。また、Whoop のログインを受け取ることもできないため、まずサーバーを http モードで起動し、同じ DB_PATH を使って Whoop に一度接続してから、サーバーを停止し、stdio サーバーを起動してください。両方を同時に実行しないでください。Whoop はトークンが使用されるたびにリフレッシュトークンを置き換えるため、1 つのデータベースを共有する 2 つのサーバーは互いのログイン状態を解除してしまいます。

コードの変更

独自の変更を実行するには、このリポジトリをフォークし、イメージの代わりにフォークをデプロイします。Railway では New → GitHub Repo を選択すると、Dockerfile がビルドされます。フォークは自動では更新されません。新しいリリースを取得するには、GitHub の Sync fork ボタンを使用して再デプロイし、変更を進めながらマージしてください。変更が不要であれば、イメージの方が簡単で、自動的に最新の状態が保たれます。

環境変数

変数説明デフォルト
WHOOP_CLIENT_IDWhoop OAuth クライアント IDWhoop への接続に必要です。両方が設定されるまで、/ のセットアップページに手順が表示されます。replace-with を含む値は未設定として扱われます
WHOOP_CLIENT_SECRETWhoop OAuth クライアントシークレット上記と同じです
WHOOP_REDIRECT_URIOAuth コールバック URLPUBLIC_URL + /callback。Railway では https://<the service's domain>/callback、それ以外では http://localhost:3000/callback
MCP_AUTH_PASSWORD/mcp を保護するサインインページのパスワード(16 文字以上)http モードでは必須です
PUBLIC_URLWHOOP_REDIRECT_URI と異なる場合のサーバーの公開アドレス。AI アプリは PUBLIC_URL/mcp に接続する必要があります。WHOOP_REDIRECT_URI のオリジン
ENCRYPTION_SECRET保存された Whoop トークンの暗号化キーWHOOP_CLIENT_SECRET
MCP_ALLOWED_REDIRECT_HOSTSサインインコードの受け取りを許可する追加のウェブクライアント。ホスト名をカンマ区切りで指定します(例:app.example.com)。Claude、ChatGPT、およびご自身のコンピューター上のデスクトップアプリ(ローカルアドレス、および Cursor、VS Code、Windsurf のリンク)は常に許可されます。なし
TRUST_PROXYクライアントの IP アドレスを報告できるプロキシ(サインインのレート制限に使用):ホップ数、false、またはアドレス/サブネットRailway では 1、それ以外では false
DB_PATHSQLite データベースのパス(サインイン情報と暗号化された Whoop トークン)./whoop.db
PORTHTTP サーバーのポート3000
MCP_MODEサーバーの場合は http、ローカルコマンドとして起動する MCP クライアントの場合は stdio(ご自身のコンピューターでの実行を参照)http
UPDATE_CHECK1 日に 1 回 GitHub に最新リリース番号を問い合わせ、新しいバージョンがある場合は get_today の回答の末尾に 1 行のお知らせを追加します。このリクエストで、あなたやあなたのデータに関する情報が送信されることはありません。false にすると無効になります。true

アーキテクチャ

┌─────────────────────────────────────────────────┐
│  Your AI app (Claude, ChatGPT, ...)             │
│  "How did I sleep last night?"                  │
└────────────────────────┬────────────────────────┘
                         │  signs in once (OAuth 2.1),
                         │  then calls tools on /mcp
                         ▼
┌─────────────────────────────────────────────────┐
│                Whoop MCP Server                 │
│                                                 │
│  ┌─────────────┐      ┌──────────────────┐      │
│  │ Sign-in     │─────►│  SQLite Database │      │
│  │ (OAuth 2.1) │      │  - sign-ins      │      │
│  └─────────────┘      │  - Whoop tokens  │      │
│  ┌─────────────┐      │    (encrypted)   │      │
│  │ MCP tools   │      └──────────────────┘      │
│  └──────┬──────┘               ▲                │
│         ▼                      │                │
│  ┌─────────────┐               │                │
│  │ whoop-client│─── tokens ────┘                │
│  │ (library)   │   (no health data is stored)   │
│  └─────────────┘                                │
└─────────┬───────────────────────────────────────┘
          │  Whoop OAuth + API v2, live on every call
          ▼
┌─────────────────────────────────────────────────┐
│  Whoop API                                      │
└─────────────────────────────────────────────────┘

サーバーは packages/whoop-client の whoop-client を介して WHOOP と通信します。これは、サインインとトークンの更新を処理する、誰でも WHOOP のデータを利用した構築に使える、小規模で型付けされた同じライブラリです。まだ npm には公開されていません。

使用する Whoop API エンドポイント

  • GET /v2/cycle - 生理学的サイクル(ストレインデータ)
  • GET /v2/recovery - 回復スコア
  • GET /v2/activity/sleep - 睡眠記録
  • GET /v2/activity/workout - ワークアウト記録

貢献

Issue やプルリクエストを歓迎します。すべての変更はプルリクエストを経由し、CI が成功し、メンテナーによるレビューが完了した場合にのみマージできます。

  • 変更にはテストを含めてください。 新機能やバグ修正には、自動テストスイートにテストを追加してください。サーバーのテストは test/、WHOOP クライアントのテストは packages/whoop-client/test/ にあります。プルリクエストを作成する前に、npm test と npm run typecheck を実行してください。すべてのプルリクエストでは、Docker のスモークテストと CodeQL スキャンに加えて、CI で両方のコマンドが実行されます。
  • コードスタイル: src/、packages/whoop-client/src/ およびテストと同様に、厳密モードの TypeScript を使用し、周囲のコードに合わせて記述してください。理由をプルリクエストで説明できない限り、新しい依存関係は追加しないでください。
  • サーバーはパッケージ名 @yuridivonis/whoop-client で WHOOP クライアントを使用します。 packages/whoop-client/src 内のパスを直接指定しないでください。ライブラリのコピーが 2 つあると、そのエラーに対する instanceof チェックが機能しなくなります。唯一の例外はテスト用の偽 WHOOP で、packages/whoop-client/test/ からインポートします。
  • セキュリティ上の問題: Issue ではなく、SECURITY.md の説明に従って非公開で報告してください。

合成データのみを使用してください。 テストは、作成された記録を提供する偽の Whoop API(packages/whoop-client/test/fake-whoop.ts)に対して実行され、今後の評価でも同様です。自分のものか他人のものかを問わず、実際の Whoop データをテスト、フィクスチャ、Issue、プルリクエストに決して含めないでください。WHOOP の利用規約では、AI システムのテストに使用することが禁じられており、また個人の健康データでもあります。

変更履歴

CHANGELOG.md を参照してください。

ライセンス

MIT - 詳細は LICENSE を参照してください。

コメント

MCP は初めてですか?

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

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