Oura Ring (read-only) について
Oura Ring (read-only)は、Ouraの健康・活動データを照会するMCPサーバーで、MCPクライアントからリングの指標を分析したい人向けです。日次サマリーとトレンドをまとめて提供し、読み取り専用を徹底してOAuthトークンをローカルに保存します。
主な機能
- 01日次の準備度、睡眠、活動の概要
- 02最大90日分のトレンドと平均値
- 03睡眠ステージと心拍数カーブ
- 04活動、ワークアウト、セッション、タグ
- 05OAuthトークンのローカル保存と更新
- 06公開サンプルデータのサンドボックス
活用シーン
- 01ある日の睡眠ステージと準備度の確認
- 021か月のHRVと最低心拍数の比較
- 03活動、ストレス、睡眠の傾向分析
- 04タグを付けた日と準備度の関連確認
MCP 対応
日次サマリー、トレンド表、睡眠詳細、心拍数データなどの読み取り専用OuraツールをMCPクライアントに公開します。stdioで動作し、Ouraデータを変更するツールはありません。
設定
ローカルサーバーの設定はどのクライアントでも共通です。コピーしてクライアントの MCP 設定ファイルに貼り付けてください。
ツール
14掲載時のツール一覧 · 1 週間前に更新
このツールにパラメーターはありません。
詳細
Oura Ring MCP サーバー(読み取り専用)
Claude、Cursor、VS Code、または任意のMCPクライアントに、Oura Ringのコンディション、睡眠、HRV、アクティビティ、ストレス、心拍数について質問できます。データを変更する手段を一切与えずに利用できます。
「昨夜の睡眠はどうでしたか?コンディションが64しかないのはなぜですか?」 「過去30日間のHRVと最低心拍数を比較してください。」 「昨夜の睡眠ステージと心拍数の推移を表示してください。」 「アルコールをタグ付けした日の後は、コンディションが下がりますか?」
(インストールの前後に、一度だけauth手順を実行してください。)
このサーバーの特長
- 読み取り専用を徹底。 OuraのAPIにはデータを書き込むエンドポイントがありません。このクライアントはさらに厳格で、
GETのみを送信し、/v2/usercollection/以外のURLを拒否します。また、Webhook APIには一切アクセスせず、すべてのツールにreadOnlyHint: trueが設定されています。これらを満たさない場合、テストでビルドが失敗します。 - 質問全体に1回の呼び出しで回答。
get_daily_overviewは、1日分のコンディション、睡眠、昼寝、アクティビティ、ストレス、レジリエンス、SpO2、ワークアウト、タグをまとめて返します。get_trendsは、最大90日分の日別テーブルに加え、平均値とコンディションゾーンを返します。 - モデルに適した出力。 秒やメートルではなく、時間、分、km、現地時刻を使ったコンパクトなJSONを出力します。ヒプノグラムはステージごとのセグメントで、心拍数はバケットごとに集約されます。Ouraの元のオブジェクトが必要な場合は、
raw: trueを指定してください。 - 利用できないデータにも柔軟に対応。 Ouraの同意画面でデータタイプのチェックを外している場合、統合ツールは失敗する代わりに、そのデータタイプを
unavailableに列挙します。 - トークンはお使いのマシンから外に出ません。 ご自身のOura APIアプリケーション、PKCEによるOAuth、
0600のトークンファイルを使用し、Ouraの一度しか使えないリフレッシュトークンを安全に扱います。サードパーティのサーバーもテレメトリーもありません。 - アカウントなしで試せます。
OURA_SANDBOX=1を指定すると、Ouraの公開サンプルデータを利用できます。
クイックスタート
**Node.js 20.11+**とOuraアカウントが必要です。(Ouraは2025年12月に個人用アクセストークンを廃止したため、OAuthのみ利用できます。)
1. Oura APIアプリケーションを作成する(2分)
- cloud.ouraring.com/oauth/applicationsを開き、新しいアプリケーションを作成します。
- Redirect URIを
http://localhost:8787/callbackに設定します。 - Client IDとClient Secretをコピーします。
Ouraの承認なしで、アプリケーションは最大10人のユーザーに利用できます。個人利用には十分です。
2. Oura アカウントを接続する
npx -y @royreznik/oura-ring-mcp auth
求められたら、クライアント ID とクライアントシークレットを貼り付けます(シークレットは画面に表示されません)。ブラウザーで Oura の同意ページが開くので、すべてのデータ種別にチェックを入れたまま承認してください。トークンは ~/.config/oura-ring-mcp/tokens.json に保存され、以降は自動的に更新されます。
(スクリプトの場合、プロンプトに回答する代わりに OURA_CLIENT_ID と OURA_CLIENT_SECRET を設定してください。)
3. MCP クライアントに追加する
Claude Code
プラグインとして(サーバーと、接続手順を案内する /oura:auth スキルを追加します):
/plugin marketplace add royreznik/oura-ring-mcp
/plugin install oura@oura-ring-mcp
または、MCP サーバーのみ:
claude mcp add oura --scope user -- npx -y @royreznik/oura-ring-mcp
Claude Desktop、Cursor、Windsurf
クライアントの MCP 設定に追加します(Claude Desktop:Settings → Developer → Edit Config、Cursor:~/.cursor/mcp.json、Windsurf:~/.codeium/windsurf/mcp_config.json):
{
"mcpServers": {
"oura": {
"command": "npx",
"args": ["-y", "@royreznik/oura-ring-mcp"]
}
}
}
Claude Desktop では、最新リリースから .mcpb バンドルをインストールすることもできます。
VS Code(GitHub Copilot)
.vscode/mcp.json(またはユーザーの mcp.json):
{
"servers": {
"oura": { "type": "stdio", "command": "npx", "args": ["-y", "@royreznik/oura-ring-mcp"] }
}
}
OpenAI Codex CLI
~/.codex/config.toml:
[mcp_servers.oura]
command = "npx"
args = ["-y", "@royreznik/oura-ring-mcp"]
Docker
まずホスト上で auth を実行し、その後トークンディレクトリをマウントします:
docker build -t oura-ring-mcp https://github.com/royreznik/oura-ring-mcp.git
docker run -i --rm -v ~/.config/oura-ring-mcp:/home/node/.config/oura-ring-mcp oura-ring-mcp
次に、「今日の Oura の概要を教えてください」と尋ねます。
アカウントなしで試す
claude mcp add oura-sandbox --env OURA_SANDBOX=1 -- npx -y @royreznik/oura-ring-mcp
サンドボックスモードでは、Oura の公開サンプルデータを利用できます。認証手順は不要で、個人データも使いません。
ツール
| ツール | 返される内容 |
|---|---|
get_daily_overview | 1 日分:レディネス、睡眠スコアと主睡眠、昼寝、アクティビティ、ストレス、レジリエンス、SpO2、心血管年齢、VO2 max、就寝時刻のガイダンス、ワークアウト、セッション、タグ(デフォルトでは、スコアが付いた最新の日) |
get_trends | レディネス、睡眠、アクティビティのスコア、睡眠ステージ、HRV、最低心拍数、体温、歩数、カロリー、ストレスについて、日ごとの表と平均/最小/最大を返します(期間は 1~90 日) |
get_profile | 年齢、身長、体重、性別、メールアドレス、リングのモデル、サイズ、色、ファームウェア、バッテリー残量 |
list_daily_readiness | レディネススコア、要因、体温の偏差 |
list_daily_sleep | 睡眠スコアと要因 |
list_sleep_periods / get_sleep_period | 夜間の睡眠と昼寝:ステージ、入眠潜時、効率、HR、HRV、呼吸。1 晩分の睡眠段階図と HR/HRV の推移 |
list_daily_activity | アクティビティスコア、歩数、カロリー、アクティビティ時間、座位時間 |
list_workouts | アクティビティ、強度、時間、カロリー、距離(アクティビティで絞り込み可能) |
list_sessions | 気分、HR、HRV を含む瞑想/呼吸/リラクゼーションのセッション |
list_daily_health | ストレス、レジリエンス、SpO2 と呼吸障害、心血管年齢、VO2 max、就寝時間帯を日ごとに結合して返します |
list_tags | Oura アプリのタグとメモ(アルコール、カフェイン、体調不良、カスタムなど) |
list_rest_mode_periods | Rest Mode の期間と症状タグ |
get_heart_rate | 5 分/15 分/1 時間/1 日単位(または生データ)に集約した心拍数時系列と、ソースごとの統計。1 回の呼び出しにつき最大 30 日分 |
リスト取得ツールは start / end(YYYY-MM-DD、両端を含む)、簡易指定の days、および next_token を受け付けます。詳細は**ツールリファレンス**をご覧ください。
設定
| 変数 | デフォルト | 用途 |
|---|---|---|
OURA_CLIENT_ID | トークンファイルから取得 | アプリのクライアント ID(未設定の場合、auth が入力を求めます) |
OURA_CLIENT_SECRET | トークンファイルから取得 | アプリのクライアントシークレット(未設定の場合、auth が入力を求めます。入力内容は表示されません) |
OURA_REDIRECT_URI | http://localhost:8787/callback | アプリに登録されているリダイレクト URI と完全に一致する必要があります |
OURA_TOKEN_PATH | ~/.config/oura-ring-mcp/tokens.json | 認証情報の保存先です。絶対パスである必要があります(~/ は展開されます)。XDG_CONFIG_HOME に対応しています。 |
OURA_SANDBOX | 未設定 | 1 を設定すると、アカウントの代わりに Oura の公開サンプルデータを提供します |
oura-ring-mcp Start the MCP server on stdio (what your MCP client runs)
oura-ring-mcp auth Connect your Oura account (opens your browser)
oura-ring-mcp status Check the stored connection
oura-ring-mcp logout Delete the locally stored tokens
oura-ring-mcp --version
「今日」はコンピューターのタイムゾーンに基づいて算出されます。このタイムゾーンは、Oura アプリで使用しているタイムゾーンと一致している必要があります。
プライバシーとセキュリティ
- oura-ring-mcp は
api.ouraring.comとのみ通信します(authの実行中にブラウザーでcloud.ouraring.comにアクセスする場合を除きます)。テレメトリーや中継サーバーはありません。 - トークンとクライアントシークレットは、ユーザー本人のみが読み取れる(
0600)ファイル 1 つに保存されます。ログに記録されたり、ツールから返されたりすることはありません。 - **MCP クライアントは、ツールの結果を言語モデルに送信します。**問い合わせた健康データは、その利用規約に基づいてモデルのプロバイダーと共有されます。
- 接続を解除するには、
oura-ring-mcp logoutを実行します。アクセス権を完全に取り消すには、cloud.ouraring.com/oauth/applications でアプリケーションを削除するか、Oura アカウントでアクセス権を取り消します。
詳細については、PRIVACY.md と SECURITY.md をご覧ください。
認証の仕組み
- PKCE(S256)とランダムな
stateを使用する OAuth 2 認可コードフローです。ループバック専用のコールバックサーバーで結果を受け取ります。 - Oura のリフレッシュトークンは 1 回しか使えません。oura-ring-mcp は、有効期限の直前(および 401 の発生時)に、ロックファイルを使って同時に 1 つずつリフレッシュします。これにより、同じマシン上で複数のクライアント(例:Claude Desktop と Claude Code)が同時にリフレッシュするのを防ぎ、新しいトークンをアトミックに書き込みます。書き込みに失敗した場合も、新しいトークンはメモリーに保持されるため、ディスク容量がいっぱいになってもログアウトされません。
- レート制限(429。
Retry-Afterに従います)、サーバーエラー、タイムアウト(30 秒)、ネットワークエラーは、バックオフを適用して再試行されます。クライアントでリクエストをキャンセルすると、Oura への呼び出しも停止します。
トラブルシューティング
| 症状 | 対処方法 |
|---|---|
| Oura にリダイレクト URI エラーが表示される | アプリのリダイレクト URI は、http://、ポート、/callback を含めて OURA_REDIRECT_URI と完全に一致する必要があります。 |
Port 8787 is in use | アプリに別の URI(例:http://localhost:9876/callback)を登録し、OURA_REDIRECT_URI にその URI を設定して auth を実行します。 |
Not connected to Oura | auth を実行します。クライアントが別のユーザーまたは HOME で実行されている場合は、クライアント設定で OURA_TOKEN_PATH を設定します。 |
Oura rejected the refresh token | auth を再実行します(アプリのシークレットが更新された、アクセス権が取り消された、またはトークンファイルを別のマシンにコピーした場合に発生します)。 |
データタイプが unavailable(403)に表示される | Oura の同意ページでチェックが外れているか、有効な Oura メンバーシップが必要です。auth を再実行して許可します。 |
426 エラー | スマートフォンの Oura アプリを更新して開き、同期します。 |
| 今日のデータが見つからない | Oura にデータが保存されるのは、リングが Oura アプリを通じて同期された後のみです。アプリを開いてから、もう一度問い合わせてください。 |
npx -y @royreznik/oura-ring-mcp status
開発
npm install
npm test # unit, MCP integration, end-to-end and packaging tests (no network)
npm run smoke:sandbox # every tool against Oura's live sandbox API
npm run smoke:live # every tool against your account (after auth); prints only counts
npm run inspect # MCP Inspector
CONTRIBUTING.md をご覧ください。唯一の厳格なルールは、oura-ring-mcp を読み取り専用に保つことです。
クレジットと法的情報
アーキテクチャ、認証、テストの方針は、Oryan Omer による whoop-mcp(MIT)を参考にしています。
MIT © Roy Reznik。非公式プロジェクトであり、Oura Health Oy との提携や同社による承認はありません。「Oura」は Oura Health Oy の商標です。ここに記載されている内容は、医学的助言ではありません。
コメント
AI アプリケーションが外部のツールやデータソースに統一的な方法で接続するためのオープンなプロトコルです。クライアントはモデルとの対話を担い、MCP サーバーはツール・リソース・プロンプトテンプレートを提供します。標準メッセージでやり取りするため、1 つのサーバーを複数のクライアントで再利用できます。