WHOOP MCP by usefulapi

Read WHOOP recovery, sleep, cycles, workouts and body measurements.

Should I use this

Quality & Safety

A
Description quality
100%
Schema completeness
82%
Naming quality
80%
Poisoning risk
100%
Permission match
100%
Protocol compliance
100%

Based on automated analysis of tool definitions and protocol compliance.

Context Cost

~1,836Tokens (tool definitions)
~1.0 KBTypical response size
Moderate attention impact (1.43% of 128k context)

This is the approximate number of tokens consumed each time the server's tools are loaded into a model's context. Higher counts reduce the attention available for other tasks.

Install

One-Click Install

Add this to your `claude_desktop_config.json` file:

{
  "mcpServers": {
    "whoop": {
      "url": "https://whoop.usefulapi.io/mcp"
    }
  }
}

Remote endpoints

https://whoop.usefulapi.io/mcpstreamable-http

What it can do

Tool inventory

Tools (10)

🟢 Read-only🟡 Write🔴 Delete⚪ Unknown
🟢whoop_get_profile

The current user's basic WHOOP profile (user id, email, first name, last name). WHOOP REST: GET /v2/user/profile/basic. Scope: read:profile.

Input Schema

{
  "type": "object",
  "properties": {},
  "$schema": "https://json-schema.org/draft/2020-12/schema"
}
🟢whoop_body_measurement

The user's body measurements (height in meters, weight in kilograms, max heart rate). WHOOP REST: GET /v2/user/measurement/body. Scope: read:body_measurement.

Input Schema

{
  "type": "object",
  "properties": {},
  "$schema": "https://json-schema.org/draft/2020-12/schema"
}
🟢whoop_list_cycles(limit, start, end, nextToken)

List the user's physiological cycles (a WHOOP 'day', ~24h anchored to sleep), most recent first. Each cycle carries a score with day strain, kilojoules burned, and average/max heart rate. Paginated (limit/nextToken) and filterable by created-time window (start/end). WHOOP REST: GET /v2/cycle. Scope: read:cycles.

Input Schema

{
  "type": "object",
  "properties": {
    "limit": {
      "description": "Max records to return per page (1–25, default 10).",
      "type": "integer",
      "minimum": 1,
      "maximum": 25
    },
    "start": {
      "description": "Return records created at/after this ISO 8601 datetime, e.g. 2024-01-01T00:00:00.000Z.",
      "type": "string"
    },
    "end": {
      "description": "Return records created before this ISO 8601 datetime, e.g. 2024-02-01T00:00:00.000Z.",
      "type": "string"
    },
    "nextToken": {
      "description": "Pagination cursor: pass the `next_token` from a previous response to fetch the next page.",
      "type": "string"
    }
  },
  "$schema": "https://json-schema.org/draft/2020-12/schema"
}
🟢whoop_get_cycle(cycleId)

Get a single physiological cycle by its id (strain, kilojoules, average/max heart rate, start/end). WHOOP REST: GET /v2/cycle/{cycleId}. Scope: read:cycles.

Input Schema

{
  "type": "object",
  "properties": {
    "cycleId": {
      "type": "string",
      "minLength": 1,
      "description": "The cycle id (an integer, e.g. from whoop_list_cycles)."
    }
  },
  "required": [
    "cycleId"
  ],
  "$schema": "https://json-schema.org/draft/2020-12/schema"
}
🟢whoop_get_cycle_recovery(cycleId)

Get the recovery scored for a specific cycle (recovery %, resting heart rate, HRV RMSSD, SpO2 %, skin temperature). WHOOP REST: GET /v2/cycle/{cycleId}/recovery. Scope: read:recovery.

Input Schema

{
  "type": "object",
  "properties": {
    "cycleId": {
      "type": "string",
      "minLength": 1,
      "description": "The cycle id (an integer, e.g. from whoop_list_cycles)."
    }
  },
  "required": [
    "cycleId"
  ],
  "$schema": "https://json-schema.org/draft/2020-12/schema"
}
🟢whoop_list_recoveries(limit, start, end, nextToken)

List the user's recoveries, most recent first. Each recovery scores how ready the body is (recovery %, resting heart rate, HRV RMSSD, SpO2 %, skin temperature) and links to its cycle and sleep. Paginated (limit/nextToken) and filterable by created-time window (start/end). WHOOP REST: GET /v2/recovery. Scope: read:recovery.

Input Schema

{
  "type": "object",
  "properties": {
    "limit": {
      "description": "Max records to return per page (1–25, default 10).",
      "type": "integer",
      "minimum": 1,
      "maximum": 25
    },
    "start": {
      "description": "Return records created at/after this ISO 8601 datetime, e.g. 2024-01-01T00:00:00.000Z.",
      "type": "string"
    },
    "end": {
      "description": "Return records created before this ISO 8601 datetime, e.g. 2024-02-01T00:00:00.000Z.",
      "type": "string"
    },
    "nextToken": {
      "description": "Pagination cursor: pass the `next_token` from a previous response to fetch the next page.",
      "type": "string"
    }
  },
  "$schema": "https://json-schema.org/draft/2020-12/schema"
}
🟢whoop_list_sleep(limit, start, end, nextToken)

List the user's sleep activities, most recent first. Each carries a score with sleep-stage summary, sleep needed, respiratory rate, and sleep performance %. Paginated (limit/nextToken) and filterable by created-time window (start/end). WHOOP REST: GET /v2/activity/sleep. Scope: read:sleep.

Input Schema

{
  "type": "object",
  "properties": {
    "limit": {
      "description": "Max records to return per page (1–25, default 10).",
      "type": "integer",
      "minimum": 1,
      "maximum": 25
    },
    "start": {
      "description": "Return records created at/after this ISO 8601 datetime, e.g. 2024-01-01T00:00:00.000Z.",
      "type": "string"
    },
    "end": {
      "description": "Return records created before this ISO 8601 datetime, e.g. 2024-02-01T00:00:00.000Z.",
      "type": "string"
    },
    "nextToken": {
      "description": "Pagination cursor: pass the `next_token` from a previous response to fetch the next page.",
      "type": "string"
    }
  },
  "$schema": "https://json-schema.org/draft/2020-12/schema"
}
🟢whoop_get_sleep(sleepId)

Get a single sleep activity by its id (stage summary, sleep needed, respiratory rate, sleep performance %, start/end). WHOOP REST: GET /v2/activity/sleep/{sleepId}. Scope: read:sleep.

Input Schema

{
  "type": "object",
  "properties": {
    "sleepId": {
      "type": "string",
      "minLength": 1,
      "description": "The sleep id (a UUID, e.g. from whoop_list_sleep)."
    }
  },
  "required": [
    "sleepId"
  ],
  "$schema": "https://json-schema.org/draft/2020-12/schema"
}
🟢whoop_list_workouts(limit, start, end, nextToken)

List the user's workouts, most recent first. Each carries a score with strain, average/max heart rate, distance (meters), and per-heart-rate-zone durations. Paginated (limit/nextToken) and filterable by created-time window (start/end). WHOOP REST: GET /v2/activity/workout. Scope: read:workout.

Input Schema

{
  "type": "object",
  "properties": {
    "limit": {
      "description": "Max records to return per page (1–25, default 10).",
      "type": "integer",
      "minimum": 1,
      "maximum": 25
    },
    "start": {
      "description": "Return records created at/after this ISO 8601 datetime, e.g. 2024-01-01T00:00:00.000Z.",
      "type": "string"
    },
    "end": {
      "description": "Return records created before this ISO 8601 datetime, e.g. 2024-02-01T00:00:00.000Z.",
      "type": "string"
    },
    "nextToken": {
      "description": "Pagination cursor: pass the `next_token` from a previous response to fetch the next page.",
      "type": "string"
    }
  },
  "$schema": "https://json-schema.org/draft/2020-12/schema"
}
🟢whoop_get_workout(workoutId)

Get a single workout by its id (sport, strain, average/max heart rate, distance, zone durations, start/end). WHOOP REST: GET /v2/activity/workout/{workoutId}. Scope: read:workout.

Input Schema

{
  "type": "object",
  "properties": {
    "workoutId": {
      "type": "string",
      "minLength": 1,
      "description": "The workout id (a UUID, e.g. from whoop_list_workouts)."
    }
  },
  "required": [
    "workoutId"
  ],
  "$schema": "https://json-schema.org/draft/2020-12/schema"
}

Community

Rate this Server

Evidence

Recent observations

verifiedversion not recorded10 tools
verifiedversion not recorded10 tools