Whoop MCP
概要
作者による説明(英語の原文)
Read-only WHOOP v2 data for MCP clients, with local SQLite cache and CSV/JSONL/Parquet exports.
PopNx MCPの3つの柱
この3つを1つのスコアにまとめることはしません。意見、測定、人気はそれぞれ別のものだからです。
- 利用者の声iレビューはまだありませんレビューは今後のステップで、アカウント機能と一緒に始まります
- 私たちの基本チェックi1項目中1項目に合格公開情報からチェック。コードはまだスキャンしていません
- 利用状況iとても新しい↓ 74/週 · ★ –
できること
このサーバーのやさしい解説はまだ書いていません。以下はレジストリから読み取った事実です。
- 接続方法: パソコンで動く
- トランスポート: stdio
- カテゴリ: データベース・データセット
- 入力が必要なもの:WHOOP_CLIENT_ID, WHOOP_CLIENT_SECRET
インストール
使っているAIアプリを選んで、設定をコピーしてください。
インストールの前に
- 基本チェック:1項目中1項目に合格
- あなたのパソコンで、あなたのユーザーと同じ権限(ファイル、ネットワーク、アプリ)で動きます。
- 自分で入力するもの:
WHOOP_CLIENT_ID,WHOOP_CLIENT_SECRET,WHOOP_REDIRECT_URI,WHOOP_LOG_LEVEL,WHOOP_LOG_FILE,WHOOP_LOG_JSON
「秘密」と表示された値は、あなたのアカウントの鍵です。絶対に人に教えたり、チャットに貼り付けたりしないでください。
必要なもの
- PyPIPythonのuvのインストール(uvxコマンドに必要)
どのアプリを使っていますか?
上でアプリを選んでください。選んだアプリを覚えておくので、次からはボタンに「…にインストール」と表示されます。
Claude Desktop → Settings → Developer → Edit Config を開き、claude_desktop_config.json にこれを貼り付けます
{
"mcpServers": {
"whoop": {
"command": "uvx",
"args": [
"whoop-mcp"
],
"env": {
"WHOOP_CLIENT_ID": "your-value",
"WHOOP_CLIENT_SECRET": "your-value",
"WHOOP_REDIRECT_URI": "your-value",
"WHOOP_LOG_LEVEL": "your-value",
"WHOOP_LOG_FILE": "your-value",
"WHOOP_LOG_JSON": "your-value"
}
}
}
}ターミナルでこれを実行します
claude mcp add whoop --env WHOOP_CLIENT_ID=your-value --env WHOOP_CLIENT_SECRET=your-value --env WHOOP_REDIRECT_URI=your-value --env WHOOP_LOG_LEVEL=your-value --env WHOOP_LOG_FILE=your-value --env WHOOP_LOG_JSON=your-value -- uvx whoop-mcp動かす前に、空欄の値を入力してください。
または、設定を自分でコピーする
プロジェクトの .cursor/mcp.json、または ~/.cursor/mcp.json に貼り付けます
{
"mcpServers": {
"whoop": {
"command": "uvx",
"args": [
"whoop-mcp"
],
"env": {
"WHOOP_CLIENT_ID": "your-value",
"WHOOP_CLIENT_SECRET": "your-value",
"WHOOP_REDIRECT_URI": "your-value",
"WHOOP_LOG_LEVEL": "your-value",
"WHOOP_LOG_FILE": "your-value",
"WHOOP_LOG_JSON": "your-value"
}
}
}
}ブラウザがアプリを開いてよいか確認し、そのあとアプリが設定を表示して確認を求めます。キーの値は空欄のままなので、自分で入力してください。
または、設定を自分でコピーする
プロジェクトの .vscode/mcp.json に貼り付けます
{
"servers": {
"whoop": {
"type": "stdio",
"command": "uvx",
"args": [
"whoop-mcp"
],
"env": {
"WHOOP_CLIENT_ID": "your-value",
"WHOOP_CLIENT_SECRET": "your-value",
"WHOOP_REDIRECT_URI": "your-value",
"WHOOP_LOG_LEVEL": "your-value",
"WHOOP_LOG_FILE": "your-value",
"WHOOP_LOG_JSON": "your-value"
}
}
}
}ブラウザがアプリを開いてよいか確認し、そのあとアプリが設定を表示して確認を求めます。キーの値は空欄のままなので、自分で入力してください。
これはパソコンで動くサーバーですが、ChatGPTがつなげるのはインターネット上のサーバーだけです。ほかのアプリを選んでください。
選んだアプリは、この端末のCookieに保存されます。アカウントは不要です。
自分で入力する値
- Client ID from your WHOOP developer app (https://developer-dashboard.whoop.com/apps/create).
- Client secret from your WHOOP developer app. Used for OAuth token refresh.
WHOOP_REDIRECT_URIenvOAuth redirect URI. Defaults to http://localhost:8000/callback — only change if you registered a different URI.WHOOP_LOG_LEVELenvLog level (DEBUG / INFO / WARNING / ERROR). Default INFO.WHOOP_LOG_FILEenvPath to the rotating log file. Set to empty string to disable file logging. Default ~/.whoop-mcp-server/logs/whoop-mcp.log.WHOOP_LOG_JSONenvStructured JSON logs (true) vs human-readable (false). Default true.
この設定は、作者のレジストリ登録情報から作成しています。READMEと違う場合は、READMEに従ってください。
できること
パソコンで動くサーバーです。インストールすると、ツール一覧がAIアプリに表示されます。
基本チェックi
誰でも見られる情報をチェックしており、コードは読んでいません。当てはまらない項目は数に入れていません。 · 2026年11月9日にチェック
- ✓ 合格
作者とリポジトリが一致
レジストリ名は、リポジトリを所有するGitHubアカウント AshwanthramKL で確認済みです
- … 未チェック
今もメンテナンスされている
このリポジトリはまだGitHubから読み取っていません
- … 未チェック
ライセンスがある
このリポジトリはまだGitHubから読み取っていません
- – 対象外
エンドポイントが応答する
これはパソコンで動くため、インターネット上のエンドポイントはありません
- – 対象外
OAuthでサインイン
パソコンで動き、代わりにローカルの設定を使います
- … 未チェック
ツールの説明に隠れた指示がない
パソコンで動くサーバーです。ツール一覧を読み取れるのは、インターネット上のエンドポイントがある場合だけです
データベース・データセットのほかのサーバーとの比較i
- このカテゴリのほかの1151件のうち0%よりスターが多い
- このカテゴリのほかの1151件のうち10%より最近レジストリに公開
- 基本チェックの結果が、このカテゴリのほかの1151件のうち100%と同じかそれ以上
レジストリでこのカテゴリにある有効なすべてのサーバーと比較しています。スターは、公開者がリポジトリの所有者である場合だけ数えます。
よくある質問
Whoop MCPは安全ですか?
当てはまる基本チェック1項目のうち1項目に合格しました。コードは読んでいません。キーやトークンを追加する前に、サーバーがどんなアクセスを求めているかを確認し、必要な権限だけを持つキーを使ってください。
どんなキーやコードが必要ですか?
入力が必要なもの:WHOOP_CLIENT_ID, WHOOP_CLIENT_SECRET
パソコンで動きますか、それともクラウドですか?
あなたのパソコンで動きます。必要なときにAIアプリが起動し、データは作者のサーバーを通りません(サーバー自体がオンラインサービスを呼び出す場合を除きます)。
今もメンテナンスされていますか?
GitHubリポジトリの最終更新は–、最新バージョン(0.8.5)がレジストリに届いたのは7 か月前です。
どのアプリで使えますか?
Claude Desktop、Claude Code、Cursor、VS CodeなどのMCP対応アプリで使えます。パソコンにPython (uv)も必要です。
代わりに使えるものは?
同じカテゴリには:Supabase, MongoDB MCP Server, Elasticsearch MCP Server
代わりの候補
同じカテゴリで、ほかの作者が作ったサーバー。スターの多い順。
カードの見方:↓ 週あたりのダウンロードi★ GitHubスターi3つの柱:レビュー · チェック · 利用状況i更新=最新バージョンをレジストリに公開した日i
作者のREADME
READMEを開く
作者のリポジトリから書かれたとおりにコピーしたものです。PopNx MCPは内容を確認・推奨していません。HTML、画像、スクリプトは取り除いています。リンクはこのサイトの外へ移動します。
WHOOP MCP Server
A local Model Context Protocol (MCP) server that gives an LLM read-only access to your WHOOP fitness data. Authentication is direct OAuth against your own WHOOP developer app — there is no third-party proxy in the path. All records are mirrored into a local SQLite cache at ~/.whoop-mcp-server/whoop.db, and no data ever leaves your machine except for the authenticated calls the server itself makes to the WHOOP v2 API.
Current version: 0.8.5 — see CHANGELOG.md.
Pre-1.0 status. The API surface (tool names, response shapes, error
codes) is stabilizing but not frozen. Breaking changes may land in
0.xminor bumps during dogfooding. Patch bumps (0.8.x) are
bugfix-only. 1.0.0 will be cut when the surface has been stable for
2+ weeks of real use. Pin the minor version in CI if you're building
on top of this.
Just want to try it? Copy the prompt in
docs/AGENT_INSTALL_PROMPT.md, paste
it into Claude Code / Claude Desktop / Cursor / Windsurf, and your
agent will do the install end-to-end.
Building on this repo? Start with AGENTS.md and
docs/ARCHITECTURE.md — they're the
load-bearing conventions and one-page system map.
Table of contents
- What this is
- Install (one line via uvx)
- Install with your agent
- Install from source
- Analysis skill: whoop-insights
- Quick start
- Tool catalog
- MCP resources
- Data model
- Sync model
- Event feed
- Exports
- What's not supported
- Updating
- Operations
- Security and privacy
- Development
- For agents building on this repo
- Versioning
What this is
The WHOOP MCP Server is a small Python process that speaks MCP over stdio. It exposes WHOOP v2 data (profile, body measurement, cycles, recoveries, sleeps, workouts) to any MCP-capable client — primarily Claude Desktop and Claude Code. The server is read-only. It authenticates with WHOOP using an OAuth app you register yourself, so your tokens never travel through a third-party server. The WHOOP records you fetch are written to a local SQLite cache (mode 0o600) so subsequent reads are free and offline, and the cache file never leaves your machine.
Install (one line via uvx)
# 1. Create a WHOOP developer app (one-time, free, self-serve):
https://developer-dashboard.whoop.com/apps/create
Redirect URI: http://localhost:8000/callback
Scopes: read:profile read:body_measurement read:recovery
read:cycles read:sleep read:workout offline
2. One-shot OAuth — opens browser, catches callback, saves encrypted tokens.
WHOOP_CLIENT_ID=" " \ WHOOP_CLIENT_SECRET=" " \ uvx --from whoop-mcp whoop-mcp-oauth
3. Register with Claude Code. The --env flags are required so the
server can refresh tokens when the 1-hour access token expires.
claude mcp add whoop --scope user \ --env WHOOP_CLIENT_ID="$WHOOP_CLIENT_ID" \ --env WHOOP_CLIENT_SECRET="$WHOOP_CLIENT_SECRET" \ -- uvx --from whoop-mcp whoop-mcp
No clone, no venv, no absolute paths. Don't have uv? Install it once: curl -LsSf https://astral.sh/uv/install.sh | sh (or brew install uv).
Install with your agent
Paste the prompt in docs/AGENT_INSTALL_PROMPT.md into any MCP-aware agent (Claude Code, Claude Desktop, Cursor, Windsurf, Zed, Aider). The agent will run the install for you.
Install from source (for development)
git clone https://github.com/AshwanthramKL/whoop-mcp.git
cd whoop-mcp python3 -m venv .venv source .venv/bin/activate pip install -r requirements.txt -r requirements-dev.txt .venv/bin/pytest -q # 183 tests, ~6s, all respx-mocked
Then register with -- /abs/path/to/whoop-mcp/.venv/bin/python /abs/path/to/whoop-mcp/src/whoop_mcp_server.py.
For Claude Desktop, add the equivalent entry to ~/Library/Application Support/Claude/claude_desktop_config.json (macOS), pointing command at the venv Python and args at src/whoop_mcp_server.py. Run ./scripts/fresh_install_check.sh if you want a clean-env smoke of the install path end-to-end (minus the browser OAuth flow).
Quick start
Once the server is registered, try these prompts:
- Sync the cache. "Sync my WHOOP data from the last 30 days." Claude calls
sync_whoop()and reports per-resource counts. - Inspect a day. "Give me yesterday's WHOOP daily summary." Claude calls
get_whoop_daily_summary(date="YYYY-MM-DD")and shows a joined cycle + recovery + primary sleep + workouts record. - Export. "Export all my cached workouts to
~/whoop-workouts.csv." Claude callsexport_whoop(kind="workouts", format="csv", path="...").
Analysis skill: whoop-insights
Bundled with the repo: skills/whoop-insights.
Install (one command):
whoop-mcp-install-skills # writes to ~/.claude/skills/
That fetches the latest skill from this repo's main branch and drops it where Claude Code (and Cursor / Windsurf / Zed) auto-discovers user-scope skills. Restart your MCP client session and ask:
*"How am I doing? Run the whoop-insights skill."*
*"Generate my weekly WHOOP report."*
*"Am I overtraining? Check the last 30 days."*
The skill pulls 30 days from the cache, computes personal baselines (HRV, recovery, sleep, strain), flags anomalies with evidence, runs two correlations (sleep→next-day-recovery, strain→next-day-recovery), and optionally generates a self-contained HTML dashboard with Chart.js visualizations. Every claim cites a specific date and a specific number — the skill is instructed never to fabricate.
For repo-native developers iterating on the skill itself: whoop-mcp-install-skills --source ./skills installs from your local working tree instead of GitHub.
Tool catalog
17 tools. All list tools accept start / end as ISO-8601 and auto-paginate. Every read tool takes fresh: bool = False — pass True to bypass the cache and hit the WHOOP API, write-through to cache, and return the live response. Errors are returned as a structured {"error": {...}} envelope; tools never raise.
| Tool | What it does | Key parameters |
|---|---|---|
get_whoop_auth_status | Report OAuth token status. Call first if other tools return AUTH_FAILED. | — |
get_whoop_profile | Authenticated user's WHOOP profile (name, email). | fresh |
get_whoop_body_measurement | Latest body measurements: height, weight, max HR. | fresh |
list_whoop_cycles | Physiological cycles in a time window. | start, end, limit, fresh |
get_whoop_cycle | One cycle by integer ID. | cycle_id, fresh |
get_whoop_cycle_sleep | Sleep record tied to a given cycle. | cycle_id, fresh |
get_whoop_cycle_recovery | Recovery record tied to a given cycle. | cycle_id, fresh |
list_whoop_recoveries | Recoveries (HRV / RHR / recovery score) in a window. | start, end, limit, fresh |
list_whoop_sleeps | Sleep activities incl. naps in a window. | start, end, limit, fresh |
get_whoop_sleep | One sleep activity by UUID. | sleep_id, fresh |
list_whoop_workouts | Workouts with zone durations (seconds). | start, end, limit, fresh |
get_whoop_workout | One workout by UUID. | workout_id, fresh |
get_whoop_daily_summary | Joined cycle + recovery + primary sleep + workouts for a UTC date. | date |
sync_whoop | Refresh cache from WHOOP API. Idempotent, incremental by default. | full, since, resources |
get_whoop_events | Chronological "what's new" feed across cached resources. | since, until, resources, limit |
export_whoop | Dump cached records to CSV / JSONL / Parquet. | kind, format, path, start, end, overwrite |
health_check | Composite status (auth, API, cache, schema). Never raises. | live |
Error codes: AUTH_FAILED, RATE_LIMITED, NOT_FOUND, UPSTREAM_ERROR, VALIDATION_ERROR, CACHE_ERROR, CACHE_EMPTY, FILE_EXISTS, EXPORT_ERROR, SYNC_ERROR.
MCP resources
The cache is also exposed as read-only MCP resources, so the client can browse date slices without invoking a tool.
| URI | Content |
|---|---|
whoop://db/cycles/{start}/{end} | Cached cycles in [start, end) (dates YYYY-MM-DD). |
whoop://db/recoveries/{start}/{end} | Cached recoveries. |
whoop://db/sleeps/{start}/{end} | Cached sleeps (including naps). |
whoop://db/workouts/{start}/{end} | Cached workouts. |
whoop://db/profile | Latest profile snapshot. |
whoop://db/body_measurement | Latest body_measurement snapshot. |
whoop://db/sync_runs/{limit} | Most recent sync audit rows. |
whoop://db/events/{since} | Event feed since since, until = now. |
whoop://db/events/{since}/{until} | Event feed for explicit window. |
All resources return application/json. Bad inputs return the same {"error": {"code","message"}} envelope used by tools.
Data model
Responses are flattened: the WHOOP score wrapper is lifted, milliseconds become seconds (*_seconds, 1 decimal), kilojoules become calories (calories, rounded int), heart-rate keys are renamed to avg_hr_bpm / max_hr_bpm, and sleep stages are named deep_sleep_seconds, rem_sleep_seconds, light_sleep_seconds, awake_seconds, in_bed_seconds. Raw user_id, v1_id, and per-record created_at are dropped.
`score_state` convention. WHOOP scores are not always computed. When score_state != "SCORED" (e.g. PENDING_SCORE, UNSCORABLE) every derived score field is null and the top-level score_state is preserved so callers know why.
One flattened record per resource:
// Cycle
{ "id": 123456, "start": "2026-04-20T04:00:00.000Z", "end": "2026-04-21T04:00:00.000Z", "timezone_offset": "+00:00", "score_state": "SCORED", "strain": 12.4, "avg_hr_bpm": 62, "max_hr_bpm": 168, "calories": 2810 }
// Recovery
{ "cycle_id": 123456, "sleep_id": "bb68db7b-...", "score_state": "SCORED", "recovery_score": 74, "resting_heart_rate_bpm": 48, "hrv_rmssd_ms": 87.3, "spo2_pct": 97.4, "skin_temp_c": 33.1, "user_calibrating": false }
// Sleep
{ "id": "bb68db7b-...", "cycle_id": 123456, "start": "2026-04-20T03:10:00.000Z", "end": "2026-04-20T10:42:00.000Z", "nap": false, "score_state": "SCORED", "sleep_performance_pct": 88.0, "in_bed_seconds": 27120.0, "light_sleep_seconds": 12540.0, "rem_sleep_seconds": 5280.0, "deep_sleep_seconds": 6840.0, "awake_seconds": 1080.0 }
// Workout
{ "id": "a91f...", "start": "2026-04-20T17:00:00.000Z", "end": "2026-04-20T17:48:00.000Z", "sport_name": "Running", "score_state": "SCORED", "strain": 9.3, "avg_hr_bpm": 142, "max_hr_bpm": 176, "calories": 511, "distance_meter": 8030.0, "zone_durations
冒頭だけを表示しています。続きはリポジトリで読めます