{"name":"io.github.briangaoo/whoop-mcp","slug":"briangaoo-whoop-mcp","title":null,"description":"Full read + write access to your Whoop fitness data via the private iOS API. 48 tools.","url":"https://mcp.market/server/briangaoo-whoop-mcp","rating":null,"grade":"C","score":62,"certified":false,"status":"active","category":"other","tags":[],"presence":{"score":42,"stars":121,"forks":30,"downloads_week":25,"last_push_at":"2026-09-16T00:45:26.000Z","license":"NOASSERTION"},"uptime":null,"claimed":false,"transport":"npm","callable_via_gateway":false,"default_price_micros":0,"repository":"https://github.com/briangaoo/whoop-mcp","website":null,"version":"1.3.0","remotes":[],"packages":[{"registryType":"npm","identifier":"@briangaoo/whoop-mcp","version":"1.3.0","transport":{"type":"stdio"},"environmentVariables":[{"description":"Whoop Cognito access token. Obtain via `whoop-mcp auth` from the repo, which prompts for your Whoop email + password + SMS MFA code, then writes both tokens to a local .env. Auto-refreshes every ~24h.","isRequired":true,"format":"string","isSecret":true,"name":"WHOOP_IOS_BEARER_TOKEN"},{"description":"Whoop Cognito refresh token (~30 day lifetime). Obtained alongside the bearer token from `whoop-mcp auth`. When this expires, run `whoop-mcp auth` to get a fresh pair.","isRequired":true,"format":"string","isSecret":true,"name":"WHOOP_COGNITO_REFRESH_TOKEN"},{"description":"Your Whoop account email. Used only by `whoop-mcp auth` — the running server reads tokens, not credentials.","isRequired":true,"format":"string","name":"WHOOP_EMAIL"},{"description":"Your numeric Whoop user ID. Optional — used by whoop_profile and whoop_leaderboard. Avoids one redundant bootstrap call per session if set.","format":"string","name":"WHOOP_USER_ID"},{"description":"IANA timezone (e.g., America/Los_Angeles) for response timestamps. Optional — if unset, the server auto-detects from your Whoop profile's timezone_offset field (refreshed hourly).","format":"string","name":"WHOOP_TIMEZONE"}]}],"tools":[{"name":"whoop_activity_create","description":"WRITE: log a generic off-strap activity for a sport_id (call whoop_sports_catalog first to get one) over a start–end window of at least 1 minute. Preview unless confirm:true.","write_action":true,"price_micros":0,"input_schema":null},{"name":"whoop_activity_delete","description":"WRITE / DESTRUCTIVE: delete a workout/activity. Preview unless confirm:true.","write_action":true,"price_micros":0,"input_schema":null},{"name":"whoop_behavior_impact","description":"How much your tracked behaviors have historically moved recovery/HRV/sleep. Call with NO behavior_id to list every behavior with its impact_uuid + headline effect; then call again with behavior_id set to that impact_uuid (the long UUID, not a numeric id) for the full breakdown.","write_action":false,"price_micros":0,"input_schema":null},{"name":"whoop_calendar","description":"Month-at-a-glance calendar grid for the month containing the given date: each day's recovery STATE — GREEN (high), YELLOW (medium), or RED (low). The grid only exposes the state, not numeric recovery/sleep/strain scores; for a specific day's numbers use whoop_day.","write_action":false,"price_micros":0,"input_schema":null},{"name":"whoop_coach_ask","description":"WRITE (creates a coach conversation): ask Whoop Coach a question and poll up to 30s for the reply. context tells the coach which screen you're asking about — one of HOME, RECOVERY, STRAIN, SLEEP, STRESS, CARDIO_DETAILS, WAKE_UP_REPORT (default HOME). Preview unless confirm:true.","write_action":true,"price_micros":0,"input_schema":null},{"name":"whoop_communities","description":"Lists the communities you belong to (teams, friend groups) with member count and optionally your rank, controlled by team_type (ALL, COMMUNITY, TEAM, BUSINESS), metric (strain, sleep, recovery), and period (day, week, month). Use this to discover community IDs, then whoop_leaderboard to drill into one.","write_action":false,"price_micros":0,"input_schema":null},{"name":"whoop_compare","description":"Compare two date windows side by side (e.g. 'this week vs last week') — each metric's average in window A vs window B plus the delta. window: week or month. metrics: any of RECOVERY, SLEEP_PERFORMANCE, DAY_STRAIN, HRV, RHR (defaults to all five).","write_action":false,"price_micros":0,"input_schema":null},{"name":"whoop_cycle","description":"Current menstrual cycle status for a date: phase (e.g. Luteal Phase), cycle day, typical cycle length, and predicted next-period / ovulation dates. Requires women's-health tracking enabled on the account; fields return null if it isn't set up.","write_action":false,"price_micros":0,"input_schema":null},{"name":"whoop_cycle_log","description":"WRITE: log a period or ovulation event for a date — pass period:true (optionally period_flow for flow intensity) OR ovulation:true, not both on the same date. Women's-health tracking must be set up on the account first (else the API 400s).","write_action":true,"price_micros":0,"input_schema":null},{"name":"whoop_day","description":"Composite snapshot for any past date: recovery, sleep + stages, day strain, workouts count. Same shape as whoop_today but current_state is always null (not relevant for historical days).","write_action":false,"price_micros":0,"input_schema":null},{"name":"whoop_endpoints","description":"Search the bundled catalog of Whoop iOS API endpoints. Call before whoop_raw to discover paths.","write_action":false,"price_micros":0,"input_schema":null},{"name":"whoop_hidden_metric","description":"WRITE: show or hide a dashboard metric. metric: BODY_COMP or HEALTHSPAN. action: hide or show.","write_action":true,"price_micros":0,"input_schema":null},{"name":"whoop_hr_zones","description":"Current heart-rate zones + max HR + last updated.","write_action":false,"price_micros":0,"input_schema":null},{"name":"whoop_hr_zones_set","description":"WRITE: set your heart-rate zones. mode=max_hr → pass max_hr (bpm) and Whoop recomputes the 5 zones; mode=custom → pass all 5 zones (ZONE_1..ZONE_5, each with min/max bpm).","write_action":true,"price_micros":0,"input_schema":null},{"name":"whoop_journal","description":"Your journal entry for a date: tracked behaviors with values + human-readable names (resolved from the bundled catalog).","write_action":false,"price_micros":0,"input_schema":null},{"name":"whoop_journal_autopop","description":"WRITE: trigger Whoop to auto-populate the journal from inferred behaviors (HealthKit data, workout patterns).","write_action":true,"price_micros":0,"input_schema":null},{"name":"whoop_journal_catalog","description":"Search the 308-behavior journal catalog to get a behavior_tracker_id and its magnitude type for whoop_journal_log. Filter by substring, magnitude_type (bare, boolean, or magnitude), or category (Drugs & Medication, Health & Symptoms, Hormonal Health, Lifestyle, Mental Wellbeing, Nutrition, Recovery, Sleep & Circadian Health, Supplements).","write_action":false,"price_micros":0,"input_schema":null},{"name":"whoop_journal_log","description":"WRITE: save the full journal entry for a date — this REPLACES the whole day's entry, so first call whoop_journal to read what's already logged today and resend those entries together with your additions, or they'll be wiped. Use whoop_journal_catalog for each behavior_tracker_id and its magnitude type: bare → pass just the id, boolean → add answered_yes, magnitude → add magnitude_value.","write_action":true,"price_micros":0,"input_schema":null},{"name":"whoop_leaderboard","description":"Community leaderboard ranking + your own position in it. Auto-discovers your first community if community_id is omitted. metric: recovery, sleep, or strain. window: day, week, or month.","write_action":false,"price_micros":0,"input_schema":null},{"name":"whoop_lift_catalog","description":"Search the 372-exercise Strength Trainer catalog to get the exact exercise_id for whoop_lift_log, lift_exercise, or lift_progression. Filter by name substring, muscle, equipment, movement_pattern, or laterality (BILATERAL, LEFT, RIGHT, ALTERNATING), and read the id from the result.","write_action":false,"price_micros":0,"input_schema":null},{"name":"whoop_lift_custom_exercise","description":"WRITE: create a custom Strength Trainer exercise based on an existing official one. Requires calling whoop_lift_catalog first.","write_action":true,"price_micros":0,"input_schema":null},{"name":"whoop_lift_exercise","description":"Single exercise composite: metadata + recent sessions (sets with reps/weight/medal) + PRs. Requires calling whoop_lift_catalog first.","write_action":false,"price_micros":0,"input_schema":null},{"name":"whoop_lift_history","description":"Recent strength workouts with per-exercise aggregates (set count, total reps, tonnage, medals). It does NOT include individual set reps/weights — for those use whoop_lift_exercise, which returns every set for one exercise across your history.","write_action":false,"price_micros":0,"input_schema":null},{"name":"whoop_lift_library","description":"Your saved Strength Trainer templates. Pass template_id for full detail of one; omit for the list.","write_action":false,"price_micros":0,"input_schema":null},{"name":"whoop_lift_log","description":"WRITE: log a finished strength workout — pass exercises, each with sets (reps and/or weight in kg and/or time_seconds). Call whoop_lift_catalog first to get valid exercise_ids; preview unless confirm:true.","write_action":true,"price_micros":0,"input_schema":null},{"name":"whoop_lift_progression","description":"Multi-window volume trend for a single exercise: 30-day, 6-month, year segments with avg volume + change % + per-session points. Requires calling whoop_lift_catalog first.","write_action":false,"price_micros":0,"input_schema":null},{"name":"whoop_lift_prs","description":"All Strength Trainer personal records: per-exercise top weight, units, date, medal.","write_action":false,"price_micros":0,"input_schema":null},{"name":"whoop_lift_template_save","description":"WRITE: create or save-as a Strength Trainer workout template from exercises whose sets can specify reps and/or weight (kg) and/or time_seconds. Call whoop_lift_catalog first for valid exercise_ids; preview unless confirm:true.","write_action":true,"price_micros":0,"input_schema":null},{"name":"whoop_live_hr","description":"Current heart rate from the strap. Returns is_recording:false + last-known BPM if not actively streaming. Check last_updated_at for staleness.","write_action":false,"price_micros":0,"input_schema":null},{"name":"whoop_live_state","description":"Are you currently in a tracked workout, sleep, or idle? Returns sport name + start time if active.","write_action":false,"price_micros":0,"input_schema":null},{"name":"whoop_live_stress","description":"Current stress level (terse). Cheaper than whoop_stress if you just want the latest reading.","write_action":false,"price_micros":0,"input_schema":null},{"name":"whoop_performance_assessment","description":"Whoop's performance assessment for a period — recoveries logged vs required, whether an assessment is due, and the next assessment window. period: WEEK or MONTH (default MONTH).","write_action":false,"price_micros":0,"input_schema":null},{"name":"whoop_profile","description":"Static account + body data: name, email, height, weight, max HR, resting HR, hidden metrics, stealth mode.","write_action":false,"price_micros":0,"input_schema":null},{"name":"whoop_profile_update","description":"WRITE: change any profile field(s) — pass ONLY what you want to change and the tool fetches your current profile and merges, backfilling everything you didn't touch (Whoop's PUT is non-partial and 422s on a sparse body). Weight is kg and height is meters; preview unless confirm:true.","write_action":true,"price_micros":0,"input_schema":null},{"name":"whoop_raw","description":"ESCAPE HATCH: call any Whoop endpoint directly — use only when no specific tool fits, and look up the exact path with whoop_endpoints first. Mutating methods (POST/PUT/DELETE) require confirm:true.","write_action":false,"price_micros":0,"input_schema":null},{"name":"whoop_recovery","description":"Recovery deep-dive: score, state, HRV and RHR (each with baseline), respiratory rate, SpO2, skin temp, and sleep performance. (The generic contributors[] array and calibration_state are empty in the current tile shape — the per-metric data is in the typed fields.)","write_action":false,"price_micros":0,"input_schema":null},{"name":"whoop_sleep","description":"Last night's sleep deep-dive: all 4 stages (REM/light/SWS/wake) with durations + percentages, the full per-stage hypnogram, efficiency, performance, consistency, disturbances, and in-sleep heart rate. (Sleep HRV, respiratory rate, debt, and latency aren't exposed by this endpoint and return null.)","write_action":false,"price_micros":0,"input_schema":null},{"name":"whoop_sleep_need","description":"Recommended bedtime/wake time + sleep need breakdown (baseline + debt + strain need) + smart-alarm eligibility.","write_action":false,"price_micros":0,"input_schema":null},{"name":"whoop_smart_alarm","description":"Current Smart Alarm state: schedules (per-day-of-week) + global prefs (lower/upper bounds, goal mode, enabled).","write_action":false,"price_micros":0,"input_schema":null},{"name":"whoop_smart_alarm_set","description":"WRITE: update Smart Alarm. To change WHEN the alarm wakes you, use mode=schedule (needs schedule_id + latest_wake_time) — that's the setting that actually controls the wake time. mode=preferences sets the global goal + enable flags, but its lower/upper_time_bound are ignored by the server whenever an explicit schedule exists, so don't use it to set a wake time. master_enable / master_disable turn ","write_action":true,"price_micros":0,"input_schema":null},{"name":"whoop_sports_catalog","description":"Search the 203-sport catalog (numeric sport_id ↔ name) to get the exact sport_id for whoop_activity_create. Filter by a substring of the sport name and read the id straight from the result rather than guessing one.","write_action":false,"price_micros":0,"input_schema":null},{"name":"whoop_strain","description":"Day strain deep-dive: score, calories, avg/max HR, time in 6 HR zones, workouts count, steps, strength activity time.","write_action":false,"price_micros":0,"input_schema":null},{"name":"whoop_stress","description":"Stress monitor for a day: timeline buckets (15-min), current level, baseline, daily min/peak.","write_action":false,"price_micros":0,"input_schema":null},{"name":"whoop_symptom_log","description":"WRITE: log women's-health symptoms for a date via menstruation (none, spotting, light_flow, medium_flow, heavy_flow), cervical_mucus (5 discharge types — see the param enum; omit to clear), and/or symptoms[] referencing behavior_tracker_ids. Women's-health tracking must be set up, and any symptoms[] require calling whoop_journal_catalog first.","write_action":true,"price_micros":0,"input_schema":null},{"name":"whoop_today","description":"Composite snapshot for today: recovery score, sleep performance + stages, day strain so far, workouts logged today, current activity state.","write_action":false,"price_micros":0,"input_schema":null},{"name":"whoop_trend","description":"Trend for one metric across week / month / 6-month windows — per-day points, aggregate stats, and delta vs the prior window. metric is exactly one of: HRV, RHR, RECOVERY, DAY_STRAIN, CALORIES, STEPS, AVERAGE_HR, HOURS_V_NEED, HOURS_V_NEEDED_PERCENT, TIME_IN_BED, SLEEP_PERFORMANCE, SLEEP_EFFICIENCY, SLEEP_CONSISTENCY, SLEEP_DEBT_POST, RESTORATIVE_SLEEP, HR_ZONES_1_3, HR_ZONES_4_5, RESPIRATORY_RATE,","write_action":false,"price_micros":0,"input_schema":null},{"name":"whoop_workout","description":"Single workout full detail: strain, HR curve, HR zone durations, calories, distance, sport. Strength workouts also include MSK summary. Note: a just-created/logged activity stays 'pending' for a while and errors here until Whoop scores it.","write_action":false,"price_micros":0,"input_schema":null},{"name":"whoop_workouts","description":"Recent workouts — sport, start/end, duration, strain, avg/max HR, and calories. Optional sport-name filter, limit (≤25), and start/end date range; use whoop_workout(activity_id) for one workout's full detail (HR curve, zones).","write_action":false,"price_micros":0,"input_schema":null}],"scan":{"score":62,"grade":"C","scanned_at":"2026-09-27T12:17:09.752Z","report":{"scannerVersion":"0.1.9","scannedAt":"2026-09-27T12:17:09.740Z","components":{"code":{"score":13,"max":25,"notes":["259 source files scanned"]},"reliability":{"score":-1,"max":20,"notes":["no gateway calls yet and no remote to probe"]},"poisoning":{"score":-1,"max":15,"notes":["tools not inspected (local package is not executed); not counted"]},"auth":{"score":6,"max":15,"notes":["static API keys via environment variables"]},"maintenance":{"score":15,"max":15,"notes":["last push 11 days ago"]},"identity":{"score":6,"max":10,"notes":["registry namespace matches repository owner"]}},"findings":[{"id":"install.curl-pipe","severity":"high","component":"code","title":"curl | sh in a script","evidence":"dist/cli/setup.js: …s: true })) { await run(\"sh\", [\"-c\", \"curl https://sdk.cloud.google.com | bash\"]); } } …"}],"inputs":{"packages":[{"registryType":"npm","identifier":"@briangaoo/whoop-mcp","version":"1.3.0","found":true,"license":"MIT","hasInstallScripts":false,"dependencyCount":4,"publishedAt":"2026-06-01T23:39:40.954Z","repositoryUrl":"git+https://github.com/briangaoo/whoop-mcp.git","weeklyDownloads":25}],"repo":{"found":true,"owner":"briangaoo","repo":"whoop-mcp","archived":false,"pushedAt":"2026-09-16T00:45:26Z","stars":121,"forks":30,"openIssues":3,"ownerType":"User","ownerAvatarUrl":"https://avatars.githubusercontent.com/u/211872763?v=4","license":"NOASSERTION"},"icon":{"url":"https://avatars.githubusercontent.com/u/211872763?v=4&s=128","source":"github"},"presence":{"stars":121,"forks":30,"downloadsWeek":25,"license":"NOASSERTION","lastPushAt":"2026-09-16T00:45:26.000Z","score":42}}}},"grade_history":[],"reviews":[]}