프로토타입 · 미리 보기: 공식 레지스트리의 모든 서버를 담고 있으며 30분마다 동기화해요. 리뷰와 계정 기능은 다음 단계에서 열려요.
PopNx MCPAI를 쓰는 사람을 위한 MCP 서버 · 쉬운 말로 설명해요

Whoop MCP

제작자: AshwanthramKL버전 0.8.5i★ –i내 컴퓨터에서 실행
레지스트리 이름io.github.AshwanthramKL/whoop-mcp

설치

개요

제작자가 쓴 설명(영어 원문)

Read-only WHOOP v2 data for MCP clients, with local SQLite cache and CSV/JSONL/Parquet exports.

PopNx MCP의 세 기둥

이 세 가지는 절대 하나의 점수로 합치지 않아요. 의견, 측정, 인기는 서로 다른 것이니까요.

할 수 있는 일

이 서버는 아직 쉬운 말로 된 요약을 쓰지 못했어요. 아래는 레지스트리에서 읽어 온 사실이에요.

  • 연결 방식: 내 컴퓨터에서 실행
  • 전송 방식: 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에서 열기

또는 설정을 직접 복사하기

프로젝트의 .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"
      }
    }
  }
}

브라우저가 앱을 열지 물어본 다음, 앱이 설정을 보여 주고 확인을 요청해요. 키 값은 비워 두니 직접 입력하세요.

VS Code에서 열기

또는 설정을 직접 복사하기

프로젝트의 .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는 인터넷에 있는 서버에만 연결할 수 있어요. 다른 앱을 고르세요.

선택한 앱은 이 기기의 쿠키에만 저장돼요. 계정은 필요 없어요.

직접 입력할 값

  • WHOOP_CLIENT_ID 필수 env
    Client ID from your WHOOP developer app (https://developer-dashboard.whoop.com/apps/create).
  • WHOOP_CLIENT_SECRET 비밀 필수 env
    Client secret from your WHOOP developer app. Used for OAuth token refresh.
  • WHOOP_REDIRECT_URI env
    OAuth redirect URI. Defaults to http://localhost:8000/callback — only change if you registered a different URI.
  • WHOOP_LOG_LEVEL env
    Log level (DEBUG / INFO / WARNING / ERROR). Default INFO.
  • WHOOP_LOG_FILE env
    Path to the rotating log file. Set to empty string to disable file logging. Default ~/.whoop-mcp-server/logs/whoop-mcp.log.
  • WHOOP_LOG_JSON env
    Structured JSON logs (true) vs human-readable (false). Default true.

이 설정은 제작자의 레지스트리 정보로 만들었어요. README와 다르면 README를 따르세요.

할 수 있는 일

내 컴퓨터에서 실행돼요. 설치하면 AI 앱에 도구 목록이 나타나요.

기본 점검i

누구나 볼 수 있는 정보를 점검했고, 코드는 읽지 않았어요. 해당하지 않는 항목은 개수에서 뺐어요. · 2026년 11월 8일 점검

  • ✓ 통과

    제작자와 저장소 일치

    레지스트리 이름이 GitHub 계정 AshwanthramKL 기준으로 확인되었고, 이 계정이 저장소를 소유하고 있어요

  • … 아직 점검 안 함

    계속 관리되고 있음

    아직 GitHub에서 이 저장소를 읽어 오지 않았어요

  • … 아직 점검 안 함

    라이선스 있음

    아직 GitHub에서 이 저장소를 읽어 오지 않았어요

  • – 해당 없음

    엔드포인트 응답

    내 컴퓨터에서 실행되는 서버라 인터넷 엔드포인트가 없어요

  • – 해당 없음

    OAuth로 로그인

    내 컴퓨터에서 실행되며, 대신 로컬 설정을 사용해요

  • … 아직 점검 안 함

    도구 설명에 숨겨진 지시 없음

    내 컴퓨터에서 실행돼요. 도구 목록은 인터넷 엔드포인트가 있는 서버에서만 읽을 수 있어요

데이터베이스 및 데이터셋 카테고리의 다른 서버와 비교i

  • 이 카테고리의 다른 서버 1146개 중 0%보다 스타가 많아요
  • 이 카테고리의 다른 서버 1146개 중 10%보다 최근에 레지스트리에 공개됐어요
  • 기본 점검 결과가 이 카테고리의 다른 서버 1146개 중 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 스타i세 기둥: 리뷰 · 점검 · 사용 정도i업데이트 = 최신 버전을 레지스트리에 공개한 날i

Supabase

MCP server for interacting with the Supabase platform

제작자: supabase널리 사용됨↓ 23.5만/주★ 3천그저께 업데이트

컴퓨터 또는 클라우드✓ supabase.com

MongoDB MCP Server

MongoDB Model Context Protocol Server

제작자: mongodb-js널리 사용됨↓ 15.7만/주★ 1.2천4일 전 업데이트

내 컴퓨터에서 실행

Elasticsearch MCP Server

MCP server for interacting with Elasticsearch

제작자: cr7258성장 중↓ 2.7천/주★ 31514개월 전 업데이트

내 컴퓨터에서 실행

제작자의 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.x minor 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:

  1. Sync the cache. "Sync my WHOOP data from the last 30 days." Claude calls sync_whoop() and reports per-resource counts.
  2. 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.
  3. Export. "Export all my cached workouts to ~/whoop-workouts.csv." Claude calls export_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.

ToolWhat it doesKey parameters
get_whoop_auth_statusReport OAuth token status. Call first if other tools return AUTH_FAILED.—
get_whoop_profileAuthenticated user's WHOOP profile (name, email).fresh
get_whoop_body_measurementLatest body measurements: height, weight, max HR.fresh
list_whoop_cyclesPhysiological cycles in a time window.start, end, limit, fresh
get_whoop_cycleOne cycle by integer ID.cycle_id, fresh
get_whoop_cycle_sleepSleep record tied to a given cycle.cycle_id, fresh
get_whoop_cycle_recoveryRecovery record tied to a given cycle.cycle_id, fresh
list_whoop_recoveriesRecoveries (HRV / RHR / recovery score) in a window.start, end, limit, fresh
list_whoop_sleepsSleep activities incl. naps in a window.start, end, limit, fresh
get_whoop_sleepOne sleep activity by UUID.sleep_id, fresh
list_whoop_workoutsWorkouts with zone durations (seconds).start, end, limit, fresh
get_whoop_workoutOne workout by UUID.workout_id, fresh
get_whoop_daily_summaryJoined cycle + recovery + primary sleep + workouts for a UTC date.date
sync_whoopRefresh cache from WHOOP API. Idempotent, incremental by default.full, since, resources
get_whoop_eventsChronological "what's new" feed across cached resources.since, until, resources, limit
export_whoopDump cached records to CSV / JSONL / Parquet.kind, format, path, start, end, overwrite
health_checkComposite 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.

URIContent
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/profileLatest profile snapshot.
whoop://db/body_measurementLatest 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

앞부분만 보여 드려요. 나머지는 저장소에서 읽어 보세요

PopNx에게 묻기