1
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

Claude CodeのskillsでOura Ringの睡眠データ分析をしてみた

1
Posted at

きっかけ

元ネタはこちらのツイート。

@SuguruKun_ai さんのポスト

Oura Ringは5年くらい使っていて、毎朝アプリで睡眠スコアを見るのが日課になっていました。とはいえ、いつも「今日は73点かぁ〜」で終わるだけで、特に何か行動を変えることもなく、そろそろ手放そうかなと思っていたところにこれを見て、面白そうだな...と思いました。

Oura Ringのデータ(レディネス・アクティビティ・バイタル)をClaude Codeで取得・分析して、🟢🟡🔴で判定しつつ、トレンドやPDCAまで出しているのを見て、自分のデータもClaude Codeのskillsを作れば簡単に取得できそうだなと思い、やってみました。

skillsで分析をワンコマンド化した

毎回「データ取って、並べて、判定して…」って手打ちするのはだるいので、ちょうど業務でもskillsを使って定型作業をまとめることが増えてきていたこともあり、今回もワンコマンド化しました。

やりたかったのは、単にOuraのデータを取ることではなくて、毎回同じ観点で見て、最後に次のアクションまで出すことです。

アプリを見ているだけだと、

  • 今日はちょっと低い...か...?
  • 昨日よりマシかも...?

で終わりがちです。

それならClaude Code側に分析の型を持たせて、/oura-pdca と打つだけで一旦直近7日を同じルールで見てもらえばいいかなと思い、その方向性で作成しました。

skillsの簡単な説明

Claude Codeでは、こうしたワークフローをMarkdownファイルにして持たせることができます。Markdownの中身は「Claude Codeへの指示書」みたいなもので、どんなデータを取得して、どう分析して、どういうフォーマットで出力するかを定義できます。

今回は oura-pdca.md を作成して、/oura-pdca と打つだけで直近7日間の睡眠PDCA分析が走るようにしました。

skillsの全体像

実際に作成した oura-pdca.md は長いので一部だけ載せます。

---
description: Oura Ringの過去7日間の睡眠・回復データを取得・分析してPDCAサイクルで改善アクションを出力する
allowed-tools: mcp__oura__get_daily_readiness, mcp__oura__get_daily_sleep, mcp__oura__get_sleep, mcp__oura__get_daily_spo2, mcp__oura__get_heart_rate
---

# Oura Ring PDCA 睡眠分析

分析期間: 今日を基準に直近7日間

## Step 1: データ取得
以下を start_date / end_date で取得する
1. daily_sleep
2. sleep
3. daily_readiness
4. daily_spo2
5. heart_rate

## Step 2: 集計
- 睡眠時間
- 睡眠効率
- 深睡眠 / REM の比率
- 心拍数
- HRV
- SpO2
- 直近2日 vs 過去5日

## Step 3: 出力
- サマリー
- 変化点
- 要因の仮説
- 次のアクション

記載の通り、あらかじめ観点を固定しておくと、毎回の出力がかなり安定しました。

実際によかったところ

よかったのは、日毎の数字を見るだけだったデータが、集計された上で可視化できるようになったことです。

たとえば、

  • 直近数日で回復系の指標が落ちている
  • 睡眠時間は取れていても、質の面では崩れている
  • 今日は負荷を上げないほうがよさそう

みたいなことを、アプリを眺めるより整理された形で見られるようになりました。

自分でグラフをなんとなく見るより、毎回同じ形式で出してもらうほうが、変化に気づきやすかったです。

前準備: MCPサーバーの自作

skillの中でOuraのデータを取得するには、まずClaude CodeからOura APIを叩けるようにする必要があります。そのためにMCPサーバーを自作しました。

Oura Ringからは公式のMCPは出ていないので、今回はローカルで動かす前提で、自分でコードと権限範囲を把握しやすい構成にしました。
自作といっても、実装はClaude Codeにかなり手伝ってもらっています。

Claude Codeに「Ouraの睡眠データを取得できるMCPサーバーを作って」と伝えたら、以下を一気にやってくれました。

  • oura-mcp/ ディレクトリの作成
  • TypeScriptでOura API v2クライアントの実装
  • @modelcontextprotocol/sdk を使ったMCPサーバー化
  • ビルドしてClaude Codeから呼べる状態にするところまで

一番詰まったのはMCPよりOAuth2認証の方でした。
ここは自分で取得する必要があり、普段あまり触ってこなかったので、最初は「トークンどこで取るんだ?」でかなり迷いました...笑

実際にどういう分析ができるようになったか

ここでは自分の生データは出しませんが、実際にやってみると、たとえばこんな感じの出力が返ってきます。

出力イメージ(サンプル)

※ 以下は実際の出力形式に寄せたサンプルです。数値は説明用のダミーデータです。

---
Oura PDCA 睡眠分析

分析期間: 今日を基準に直近7日間

---
睡眠サマリー

| 日付 | スコア | 就寝→起床 | 合計睡眠 | 深睡眠 | REM | 効率 |
|------|--------|------------|----------|--------|-----|------|
| Day1 | 🟡 72  | 00:10→07:20 | 6h 10m | 62m | 85m | 87% |
| Day2 | 🔴 65  | 01:05→07:00 | 5h 20m | 40m | 60m | 81% |
| Day3 | 🟡 75  | 00:30→08:10 | 6h 50m | 70m | 92m | 88% |
| 7日平均 | 🟡 71 | — | 6h 20m | 64m | 82m | 85% |

トレンド: 直近2日の睡眠時間は過去5日より短く、スコアは横ばい〜やや低下。

---
レディネス(回復度)

| 指標 | 直近値 | 7日平均 | 判定 |
|------|--------|----------|------|
| レディネススコア | 79 | 81 | 🟡 |
| 回復指数 | 74 | 80 | 🟡 |
| 前夜の睡眠 | 61 | 65 | 🔴 |

トレンド: 前夜の睡眠評価が低めで、回復系の指標も少し弱い。

---
睡眠バイタル

| 指標 | 最新値 | 7日範囲 | 判定 |
|------|--------|----------|------|
| 安静時HR | 53 bpm | 52–57 bpm | 🟢 |
| HRV | 64 ms | 55–70 ms | 🟢 |
| SpO2 | 98.7% | 98.1–99.0% | 🟢 |
| 呼吸数 | 13.0 回/分 | 12.5–13.5 回/分 | 🟢 |

---
睡眠構成

| 指標 | 7日平均 | 直近値 | 判定 |
|------|----------|--------|------|
| 合計睡眠時間 | 6h 20m | 5h 40m | 🟡 / 🔴 |
| 深睡眠 | 64m (16%) | 58m | 🟢 |
| REM睡眠 | 82m (20%) | 78m | 🟢 |
| 睡眠効率 | 85% | 89% | 🟢 |

---
PDCA 分析

Check(現状把握)
- 睡眠時間は平均6時間台で、直近2日はやや短め
- 就寝時刻のばらつきがあり、遅い日にスコアが落ちやすい
- 回復系の指標は大きく崩れてはいないが、「前夜の睡眠」は継続的に弱い

Analyze(課題特定)
- 問題A: 合計睡眠時間が安定して7時間を超えていない
- 問題B: 就寝時刻のばらつきが睡眠スコア低下につながっていそう

Plan(改善計画)
- 目標A: 睡眠時間を7時間以上に近づける
- 目標B: 就寝時刻を0:00前後に寄せてばらつきを小さくする

Act(次のアクション)
- 就寝時刻を23:30〜0:00に固定する
- 就寝30分前からスマホ・PCを見ない
- 夜遅い時間のカフェイン摂取を避ける

ポイントは、ただ「睡眠を改善しましょう」で終わらないことです。

  • どこが落ちているのか
  • 何が直近の変化なのか
  • 次に何をやるのか

まで一連の流れで出るようにしました。

やってみてわかったこと

使ってみてよかったのは、単に分析できたというのもありますが、毎回同じ粒度で振り返れるようになったことでした。

Ouraのアプリ自体ももちろん便利なんですが、日々見ているとどうしてもその日の数字だけで終わります。
一方でskill化しておくと、

  • 直近の傾向を見る
  • 少し前との差を見る
  • 仮説とアクションに落とす

までがひとまとまりになります。

あと、年単位とか月単位みたいに少し長めで見たときにも、アプリを見ているだけでは気づかなかった傾向が見えました。
「なんとなく最近よくない気がする」を、少し整理された形で見られるのはかなりよかったです。

まとめ

普段の業務ではClaude Codeのskillsを使って定型作業をまとめることがあります。今回それをプライベートの健康管理に持ち込んでみて感じたのは、skillsで分析の型を決めてあげると、ただ溜まっていただけのデータが急に使えるものになるということでした。

このパターンは健康管理に限らず、APIがあってデータが溜まるものなら何にでも使えると思います。
筋トレの記録とか食事管理とか、次はそのあたりでもやってみたいです。

1
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?