WorkoutX Exercise API

Exercise API MCP: 1,900+ exercises with video, workout generator, supplements, dev tools.

Should I use this

Quality & Safety

A
Description quality
90%
Schema completeness
87%
Naming quality
97%
Poisoning risk
100%
Permission match
100%
Protocol compliance
100%

Findings (3)

  • LOWTool 'find_exercise_alternatives' description lacks action verbin find_exercise_alternatives
  • LOWTool 'find_similar_exercises' description lacks action verbin find_similar_exercises
  • LOWTool 'estimate_calories' description lacks action verbin estimate_calories

Based on automated analysis of tool definitions and protocol compliance.

Context Cost

~4,303Tokens (tool definitions)
~1.7 KBTypical response size
Significant attention impact (3.36% 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": {
    "workoutx": {
      "command": "npx",
      "args": [
        "workoutx-mcp"
      ]
    }
  }
}

Runnable packages

npmworkoutx-mcp2.1.0stdio

Remote endpoints

https://api.workoutxapp.com/mcpstreamable-http

What it can do

Tool inventory

Tools (20)

🟢 Read-only🟡 Write🔴 Delete⚪ Unknown
🟢list_exercise_filters(lang)

Every valid value (with counts) for body parts, target muscles, equipment, categories and muscles. Call this before search_exercises when unsure of a value.

Input Schema

{
  "type": "object",
  "properties": {
    "lang": {
      "type": "string",
      "enum": [
        "en",
        "tr",
        "de",
        "es",
        "fr",
        "zh-SG",
        "zh-HK"
      ],
      "description": "Language for names, instructions and tips (default en)"
    }
  },
  "additionalProperties": false,
  "$schema": "http://json-schema.org/draft-07/schema#"
}
🟢search_exercises(name, bodyPart, target, muscle, equipment, ...)

Search 1,900+ exercises. Filters are optional and case-insensitive; combining two or more filters needs the Starter plan or higher. Results include instructions, tips, muscles, equipment, difficulty, calories and signed MP4/thumbnail links.

Input Schema

{
  "type": "object",
  "properties": {
    "name": {
      "type": "string",
      "description": "Partial name match, e.g. \"bench press\""
    },
    "bodyPart": {
      "type": "string",
      "description": "e.g. Chest, Back, Upper Legs, Waist"
    },
    "target": {
      "type": "string",
      "description": "Primary target, e.g. Pectorals, Glutes, Lats"
    },
    "muscle": {
      "type": "string",
      "description": "Matches primary or secondary muscles"
    },
    "equipment": {
      "type": "string",
      "description": "e.g. Barbell, Dumbbell, Body Weight, Cable"
    },
    "category": {
      "type": "string",
      "enum": [
        "strength",
        "flexibility",
        "cardio",
        "yoga",
        "plyometric",
        "balance"
      ]
    },
    "difficulty": {
      "type": "string",
      "enum": [
        "beginner",
        "intermediate",
        "advanced"
      ]
    },
    "mechanic": {
      "type": "string",
      "enum": [
        "compound",
        "isolation"
      ]
    },
    "force": {
      "type": "string",
      "enum": [
        "push",
        "pull",
        "static",
        "carry"
      ]
    },
    "model": {
      "type": "string",
      "enum": [
        "male",
        "female"
      ],
      "description": "Animation model"
    },
    "fields": {
      "type": "array",
      "items": {
        "type": "string"
      },
      "description": "Only these top-level fields, e.g. [\"name\",\"target\",\"equipment\"]; id is always included. Smaller answers, fewer tokens."
    },
    "includeMedia": {
      "type": "boolean",
      "description": "false: no video links and no use of the distinct-exercise media limit (default true)"
    },
    "limit": {
      "type": "integer",
      "minimum": 1,
      "maximum": 200,
      "description": "Max results (default 10, plan caps apply)"
    },
    "offset": {
      "type": "integer",
      "minimum": 0
    },
    "lang": {
      "type": "string",
      "enum": [
        "en",
        "tr",
        "de",
        "es",
        "fr",
        "zh-SG",
        "zh-HK"
      ],
      "description": "Language for names, instructions and tips (default en)"
    }
  },
  "additionalProperties": false,
  "$schema": "http://json-schema.org/draft-07/schema#"
}
🟢get_exercise(id, lang)

One exercise by v2 id: instructions, tips, muscles, equipment, sets/reps guidance, calories and signed media links.

Input Schema

{
  "type": "object",
  "properties": {
    "id": {
      "type": "string",
      "minLength": 1,
      "description": "v2 exercise id, e.g. \"ex_GE5XEP\""
    },
    "lang": {
      "type": "string",
      "enum": [
        "en",
        "tr",
        "de",
        "es",
        "fr",
        "zh-SG",
        "zh-HK"
      ],
      "description": "Language for names, instructions and tips (default en)"
    }
  },
  "required": [
    "id"
  ],
  "additionalProperties": false,
  "$schema": "http://json-schema.org/draft-07/schema#"
}
🟢get_exercise_media(id)

Fresh signed MP4 and thumbnail links for one exercise (links expire; call again rather than storing them).

Input Schema

{
  "type": "object",
  "properties": {
    "id": {
      "type": "string",
      "minLength": 1,
      "description": "v2 exercise id, e.g. \"ex_GE5XEP\""
    }
  },
  "required": [
    "id"
  ],
  "additionalProperties": false,
  "$schema": "http://json-schema.org/draft-07/schema#"
}
🟢find_exercise_alternatives(id, equipment, excludeEquipment, model, limit, ...)

Ranked swaps that train the same muscles, e.g. when equipment is missing. Optionally require or exclude equipment.

Input Schema

{
  "type": "object",
  "properties": {
    "id": {
      "type": "string",
      "minLength": 1,
      "description": "v2 exercise id, e.g. \"ex_GE5XEP\""
    },
    "equipment": {
      "type": "string",
      "description": "Only alternatives using this equipment (comma-separated)"
    },
    "excludeEquipment": {
      "type": "string",
      "description": "Leave out this equipment (comma-separated)"
    },
    "model": {
      "type": "string",
      "enum": [
        "male",
        "female",
        "any"
      ]
    },
    "limit": {
      "type": "integer",
      "minimum": 1,
      "maximum": 50,
      "description": "Max results (default 10, plan caps apply)"
    },
    "lang": {
      "type": "string",
      "enum": [
        "en",
        "tr",
        "de",
        "es",
        "fr",
        "zh-SG",
        "zh-HK"
      ],
      "description": "Language for names, instructions and tips (default en)"
    }
  },
  "required": [
    "id"
  ],
  "additionalProperties": false,
  "$schema": "http://json-schema.org/draft-07/schema#"
}
🟢find_similar_exercises(id, model, limit, lang)

Exercises most similar to the given one (same pattern, muscles and equipment), ranked by score.

Input Schema

{
  "type": "object",
  "properties": {
    "id": {
      "type": "string",
      "minLength": 1,
      "description": "v2 exercise id, e.g. \"ex_GE5XEP\""
    },
    "model": {
      "type": "string",
      "enum": [
        "male",
        "female",
        "any"
      ]
    },
    "limit": {
      "type": "integer",
      "minimum": 1,
      "maximum": 50,
      "description": "Max results (default 10, plan caps apply)"
    },
    "lang": {
      "type": "string",
      "enum": [
        "en",
        "tr",
        "de",
        "es",
        "fr",
        "zh-SG",
        "zh-HK"
      ],
      "description": "Language for names, instructions and tips (default en)"
    }
  },
  "required": [
    "id"
  ],
  "additionalProperties": false,
  "$schema": "http://json-schema.org/draft-07/schema#"
}
🟢estimate_calories(id, weightKg, minutes)

Calories burned for an exercise from its MET value, body weight and duration.

Input Schema

{
  "type": "object",
  "properties": {
    "id": {
      "type": "string",
      "minLength": 1,
      "description": "v2 exercise id, e.g. \"ex_GE5XEP\""
    },
    "weightKg": {
      "type": "number",
      "exclusiveMinimum": 0,
      "description": "Body weight in kg (default 70)"
    },
    "minutes": {
      "type": "number",
      "exclusiveMinimum": 0,
      "description": "Duration in minutes (default 10)"
    }
  },
  "required": [
    "id"
  ],
  "additionalProperties": false,
  "$schema": "http://json-schema.org/draft-07/schema#"
}
🟢map_v1_exercise(v1Id, lang)

Find the v2 exercise for an old v1 id (e.g. "0025"), with the match quality: exact, equivalent, alternative, closest or none.

Input Schema

{
  "type": "object",
  "properties": {
    "v1Id": {
      "type": "string",
      "minLength": 1,
      "description": "v1 exercise id, e.g. \"0025\""
    },
    "lang": {
      "type": "string",
      "enum": [
        "en",
        "tr",
        "de",
        "es",
        "fr",
        "zh-SG",
        "zh-HK"
      ],
      "description": "Language for names, instructions and tips (default en)"
    }
  },
  "required": [
    "v1Id"
  ],
  "additionalProperties": false,
  "$schema": "http://json-schema.org/draft-07/schema#"
}
🟢generate_workout(goal, level, duration, split, equipment, ...)

One complete session built from movement patterns: warm-up, main work with sets/reps/rest, cool-down and swap suggestions. Needs the Growth plan or higher.

Input Schema

{
  "type": "object",
  "properties": {
    "goal": {
      "type": "string",
      "enum": [
        "muscle_gain",
        "strength",
        "fat_loss",
        "endurance",
        "mobility",
        "general_fitness"
      ]
    },
    "level": {
      "type": "string",
      "enum": [
        "beginner",
        "intermediate",
        "advanced"
      ]
    },
    "duration": {
      "type": "integer",
      "minimum": 15,
      "maximum": 120,
      "description": "Minutes (default 45)"
    },
    "split": {
      "type": "string",
      "enum": [
        "full_body",
        "upper",
        "lower",
        "push",
        "pull",
        "legs",
        "core",
        "conditioning",
        "mobility",
        "push_pull_legs",
        "upper_lower"
      ]
    },
    "equipment": {
      "type": "array",
      "items": {
        "type": "string"
      },
      "description": "Available equipment, e.g. [\"dumbbell\",\"bench\"]; empty = gym"
    },
    "bodyFocus": {
      "type": "array",
      "items": {
        "type": "string"
      },
      "description": "Muscles or body parts to emphasise"
    },
    "exclude": {
      "type": "array",
      "items": {
        "type": "string"
      },
      "description": "Exercise ids to leave out"
    },
    "avoidJoints": {
      "type": "array",
      "items": {
        "type": "string",
        "enum": [
          "knee",
          "shoulder",
          "lumbar_spine",
          "elbow",
          "wrist",
          "hip",
          "ankle"
        ]
      },
      "description": "Joints to spare; exercises that load them are left out"
    },
    "format": {
      "type": "string",
      "enum": [
        "auto",
        "straight",
        "superset",
        "circuit"
      ]
    },
    "model": {
      "type": "string",
      "enum": [
        "male",
        "female"
      ],
      "description": "Animation model"
    },
    "seed": {
      "type": "string",
      "description": "Same seed + same inputs = same workout"
    },
    "lang": {
      "type": "string",
      "enum": [
        "en",
        "tr",
        "de",
        "es",
        "fr",
        "zh-SG",
        "zh-HK"
      ],
      "description": "Language for names, instructions and tips (default en)"
    }
  },
  "additionalProperties": false,
  "$schema": "http://json-schema.org/draft-07/schema#"
}
🟢generate_program(goal, level, weeks, daysPerWeek, duration, ...)

A multi-week program with periodisation, deloads and weekly volume targets. Needs the Scale plan.

Input Schema

{
  "type": "object",
  "properties": {
    "goal": {
      "type": "string",
      "enum": [
        "muscle_gain",
        "strength",
        "fat_loss",
        "endurance",
        "mobility",
        "general_fitness"
      ]
    },
    "level": {
      "type": "string",
      "enum": [
        "beginner",
        "intermediate",
        "advanced"
      ]
    },
    "weeks": {
      "type": "integer",
      "minimum": 2,
      "maximum": 16,
      "description": "Default 4"
    },
    "daysPerWeek": {
      "type": "integer",
      "minimum": 2,
      "maximum": 6,
      "description": "Default 3"
    },
    "duration": {
      "type": "integer",
      "minimum": 20,
      "maximum": 120,
      "description": "Minutes per session (default 60)"
    },
    "equipment": {
      "type": "array",
      "items": {
        "type": "string"
      }
    },
    "avoidJoints": {
      "type": "array",
      "items": {
        "type": "string",
        "enum": [
          "knee",
          "shoulder",
          "lumbar_spine",
          "elbow",
          "wrist",
          "hip",
          "ankle"
        ]
      },
      "description": "Joints to spare; exercises that load them are left out"
    },
    "format": {
      "type": "string",
      "enum": [
        "auto",
        "straight",
        "superset",
        "circuit"
      ]
    },
    "model": {
      "type": "string",
      "enum": [
        "male",
        "female"
      ],
      "description": "Animation model"
    },
    "seed": {
      "type": "string"
    },
    "lang": {
      "type": "string",
      "enum": [
        "en",
        "tr",
        "de",
        "es",
        "fr",
        "zh-SG",
        "zh-HK"
      ],
      "description": "Language for names, instructions and tips (default en)"
    }
  },
  "additionalProperties": false,
  "$schema": "http://json-schema.org/draft-07/schema#"
}
🟢search_supplements(search, category, goal, timing, evidence, ...)

Supplements with evidence ratings, dosage and timing. Filter by category, goal, timing, evidence or free text. Needs the Growth plan or higher.

Input Schema

{
  "type": "object",
  "properties": {
    "search": {
      "type": "string"
    },
    "category": {
      "type": "string",
      "description": "e.g. protein, creatine, pre-workout"
    },
    "goal": {
      "type": "string",
      "enum": [
        "muscle_gain",
        "strength",
        "fat_loss",
        "endurance",
        "recovery",
        "mobility",
        "general_health"
      ]
    },
    "timing": {
      "type": "string",
      "description": "e.g. pre-workout, post-workout, morning"
    },
    "evidence": {
      "type": "string",
      "description": "e.g. strong, moderate"
    },
    "limit": {
      "type": "integer",
      "minimum": 1,
      "maximum": 200,
      "description": "Max results (default 200, plan caps apply)"
    },
    "offset": {
      "type": "integer",
      "minimum": 0
    }
  },
  "additionalProperties": false,
  "$schema": "http://json-schema.org/draft-07/schema#"
}
🟢get_supplement_stack(goal, level)

A recommended stack for a goal with dosages and timing. Needs the Scale plan.

Input Schema

{
  "type": "object",
  "properties": {
    "goal": {
      "type": "string",
      "enum": [
        "muscle_gain",
        "strength",
        "fat_loss",
        "endurance",
        "recovery",
        "mobility",
        "general_health"
      ]
    },
    "level": {
      "type": "string",
      "enum": [
        "essential",
        "standard",
        "comprehensive"
      ]
    }
  },
  "required": [
    "goal"
  ],
  "additionalProperties": false,
  "$schema": "http://json-schema.org/draft-07/schema#"
}
🟢export_exercise_seed(bodyPart, target, equipment, category, model, ...)

Exercise ids, names, muscles and equipment without media, as JSON or CSV, to seed your own database or fixtures. Does not use the distinct-exercise media limit. Page with offset; plan caps per call apply (Free 10, Starter 100, others 200).

Input Schema

{
  "type": "object",
  "properties": {
    "bodyPart": {
      "type": "string"
    },
    "target": {
      "type": "string"
    },
    "equipment": {
      "type": "string"
    },
    "category": {
      "type": "string",
      "enum": [
        "strength",
        "flexibility",
        "cardio",
        "yoga",
        "plyometric",
        "balance"
      ]
    },
    "model": {
      "type": "string",
      "enum": [
        "male",
        "female"
      ],
      "description": "Animation model"
    },
    "fields": {
      "type": "array",
      "items": {
        "type": "string",
        "enum": [
          "name",
          "model",
          "counterpartId",
          "category",
          "bodyPart",
          "target",
          "equipment",
          "difficulty",
          "mechanic",
          "force",
          "met",
          "caloriesPerMinute",
          "isUnilateral",
          "recommendedSets",
          "recommendedReps",
          "description",
          "instructions",
          "tips"
        ]
      },
      "description": "Default: name, model, bodyPart, target, equipment, difficulty, category"
    },
    "format": {
      "type": "string",
      "enum": [
        "json",
        "csv"
      ],
      "description": "Default json"
    },
    "limit": {
      "type": "integer",
      "minimum": 1,
      "maximum": 200,
      "description": "Max results (default 200, plan caps apply)"
    },
    "offset": {
      "type": "integer",
      "minimum": 0
    },
    "lang": {
      "type": "string",
      "enum": [
        "en",
        "tr",
        "de",
        "es",
        "fr",
        "zh-SG",
        "zh-HK"
      ],
      "description": "Language for names, instructions and tips (default en)"
    }
  },
  "additionalProperties": false,
  "$schema": "http://json-schema.org/draft-07/schema#"
}
🟢get_usage_stats(days)

Your account's API usage: requests, success rate, response times (avg and p95), errors by status code, top endpoints, daily counts, live quota, rate limit and media-limit usage. Use it to answer "why am I getting 429s?" or "when will my quota run out?". Uses one request.

Input Schema

{
  "type": "object",
  "properties": {
    "days": {
      "type": "integer",
      "minimum": 1,
      "maximum": 60,
      "description": "Window in days (default 30, max 60)"
    }
  },
  "additionalProperties": false,
  "$schema": "http://json-schema.org/draft-07/schema#"
}
🟢get_trending_exercises(limit, lang)

The exercises and filters (body parts, muscles, equipment, categories) requested most across WorkoutX apps in the last 30 days. Anonymised: only values at least 3 different accounts asked for, filters as shares. Good for deciding what to feature in an app. Uses one request.

Input Schema

{
  "type": "object",
  "properties": {
    "limit": {
      "type": "integer",
      "minimum": 1,
      "maximum": 50,
      "description": "Max results (default 20, plan caps apply)"
    },
    "lang": {
      "type": "string",
      "enum": [
        "en",
        "tr",
        "de",
        "es",
        "fr",
        "zh-SG",
        "zh-HK"
      ],
      "description": "Language for names, instructions and tips (default en)"
    }
  },
  "additionalProperties": false,
  "$schema": "http://json-schema.org/draft-07/schema#"
}
🟢get_endpoint_reference(endpoint)

Parameters, response shape, errors and a curl example for any v2 endpoint, straight from the OpenAPI spec. Call with no endpoint to list them all. Uses one request.

Input Schema

{
  "type": "object",
  "properties": {
    "endpoint": {
      "type": "string",
      "maxLength": 300,
      "description": "e.g. \"/v2/exercises\", \"exercises/{id}/alternatives\" or a full URL"
    }
  },
  "additionalProperties": false,
  "$schema": "http://json-schema.org/draft-07/schema#"
}
🟢generate_types(language, models)

Ready-to-paste TypeScript, Swift (Codable), Kotlin (kotlinx.serialization) or Dart models for v2 responses, generated from the OpenAPI spec. Uses one request.

Input Schema

{
  "type": "object",
  "properties": {
    "language": {
      "type": "string",
      "enum": [
        "typescript",
        "swift",
        "kotlin",
        "dart"
      ]
    },
    "models": {
      "type": "array",
      "items": {
        "type": "string"
      },
      "maxItems": 20,
      "description": "Default: ExerciseV2, ExercisePageV2, WorkoutV2, ProgramV2. Others: MediaLinksV2, MuscleV2, RankedPageV2, CaloriesV2, SupplementV2, AccountUsageV2, TrendingV2…"
    }
  },
  "required": [
    "language"
  ],
  "additionalProperties": false,
  "$schema": "http://json-schema.org/draft-07/schema#"
}
🟢get_code_example(platform, topic)

A working snippet for a platform and task: listing and paging exercises, playing the looping MP4 and refreshing its signed link, the workout generator, error and rate-limit handling, or a backend proxy that keeps your key off the device. Uses one request.

Input Schema

{
  "type": "object",
  "properties": {
    "platform": {
      "type": "string",
      "enum": [
        "react-native",
        "swift",
        "flutter",
        "nextjs",
        "node",
        "python"
      ]
    },
    "topic": {
      "type": "string",
      "enum": [
        "list-exercises",
        "play-video",
        "workout-generator",
        "handle-errors",
        "backend-proxy"
      ]
    }
  },
  "required": [
    "platform",
    "topic"
  ],
  "additionalProperties": false,
  "$schema": "http://json-schema.org/draft-07/schema#"
}
🟢diagnose_request(request, status, response)

Paste a failing WorkoutX request (curl, URL or "GET /v2/...") and optionally the status and response body: explains what is wrong (wrong host, key in the URL, missing header, unknown or repeated parameter, invalid value, v1 id, plan gate, rate limit, quota, expired media link) and how to fix it. Only reads the text; never sends the request. Uses one request.

Input Schema

{
  "type": "object",
  "properties": {
    "request": {
      "type": "string",
      "minLength": 1,
      "maxLength": 20000,
      "description": "curl command, URL or \"GET /v2/...\" line, with headers if you have them"
    },
    "status": {
      "type": "integer",
      "minimum": 100,
      "maximum": 599
    },
    "response": {
      "type": "string",
      "maxLength": 5000,
      "description": "Response body, if any"
    }
  },
  "required": [
    "request"
  ],
  "additionalProperties": false,
  "$schema": "http://json-schema.org/draft-07/schema#"
}
🟢check_api_key

Confirm the configured API key works and show the plan and remaining quota. Uses one request.

Input Schema

{
  "type": "object",
  "properties": {},
  "$schema": "http://json-schema.org/draft-07/schema#"
}

Community

Rate this Server

Evidence

Recent observations

verifiedversion not recorded20 tools