WorkoutX Exercise API
io.github.furkanuruk/workoutxfurkanurukstreamable-httpv2.1.0Scanned
Exercise API MCP: 1,900+ exercises with video, workout generator, supplements, dev tools.
20 tools: 7 change things and 13 only read.
- Reads private data · 0
- Reads text others write · 1
- Can send data out · 1
- 4 findings
Anlyon alternative
7 of these tools change something. Run those as governed actions.
Declare what an action changes, and Anlyon puts it under a shared limit, binds every approval to the exact request, and grades the outcome. It works on any HTTPS API you can describe as an action.
Anlyon does not run, proxy or govern this MCP server. A tool your own code calls directly is not routed through Anlyon and is not governed by it.
Import an OpenAPI spec →Tools
Grouped by what each tool does, most consequential first. Open one for its reasons and full description; descriptions are the publisher's own words.
20 tools
Changes things 7Claude Code: ask
check_api_keyConfirm the configured API key works and show the plan and remaining quota.No findings
Why it is in this group
- Nothing in its name or description says what it does, so it is counted as a write.
- The server marks it read-only (readOnlyHint: true), but an annotation never lowers a class.
Description, as the server wrote it Confirm the configured API key works and show the plan and remaining quota. Uses one request.
Annotations the server declares
- title: Check API key
- readOnlyHint: true
- openWorldHint: false
diagnose_requestPaste 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, unkno…1 finding
Why it is in this group
- The name "diagnose_request" says "request": a word for a change.
- The server marks it read-only (readOnlyHint: true), but an annotation never lowers a class.
Findings
- Warn
The server marks "diagnose_request" read-only (readOnlyHint: true), and its own name, description or input give the class "write".
What this check looks forMatched text
annotations: {"readOnlyHint":true,"openWorldHint":false}; The name "diagnose_request" says "request": a word for a change.
Description, as the server wrote it 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.
Annotations the server declares
- title: Diagnose a request
- readOnlyHint: true
- openWorldHint: false
estimate_caloriesCalories burned for an exercise from its MET value, body weight and duration.No findings
Why it is in this group
- Nothing in its name or description says what it does, so it is counted as a write.
- The server marks it read-only (readOnlyHint: true), but an annotation never lowers a class.
Description, as the server wrote it Calories burned for an exercise from its MET value, body weight and duration.
Annotations the server declares
- title: Estimate calories
- readOnlyHint: true
- openWorldHint: false
export_exercise_seedExercise ids, names, muscles and equipment without media, as JSON or CSV, to seed your own database or fixtures.No findings
Why it is in this group
- Nothing in its name or description says what it does, so it is counted as a write.
- The server marks it read-only (readOnlyHint: true), but an annotation never lowers a class.
Description, as the server wrote it 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).
Annotations the server declares
- title: Export exercises for seeding
- readOnlyHint: true
- openWorldHint: false
generate_programA multi-week program with periodisation, deloads and weekly volume targets.1 finding
Why it is in this group
- The name "generate_program" says "generate": a word for a change.
- The server marks it read-only (readOnlyHint: true), but an annotation never lowers a class.
Findings
- Warn
The server marks "generate_program" read-only (readOnlyHint: true), and its own name, description or input give the class "write".
What this check looks forMatched text
annotations: {"readOnlyHint":true,"openWorldHint":false}; The name "generate_program" says "generate": a word for a change.
Description, as the server wrote it A multi-week program with periodisation, deloads and weekly volume targets. Needs the Scale plan.
Annotations the server declares
- title: Generate a training program
- readOnlyHint: true
- openWorldHint: false
generate_typesReady-to-paste TypeScript, Swift (Codable), Kotlin (kotlinx.serialization) or Dart models for v2 responses, generated from the OpenAPI spec.1 finding
Why it is in this group
- The name "generate_types" says "generate": a word for a change.
- The server marks it read-only (readOnlyHint: true), but an annotation never lowers a class.
Findings
- Warn
The server marks "generate_types" read-only (readOnlyHint: true), and its own name, description or input give the class "write".
What this check looks forMatched text
annotations: {"readOnlyHint":true,"openWorldHint":false}; The name "generate_types" says "generate": a word for a change.
Description, as the server wrote it Ready-to-paste TypeScript, Swift (Codable), Kotlin (kotlinx.serialization) or Dart models for v2 responses, generated from the OpenAPI spec. Uses one request.
Annotations the server declares
- title: Generate model types
- readOnlyHint: true
- openWorldHint: false
generate_workoutOne complete session built from movement patterns: warm-up, main work with sets/reps/rest, cool-down and swap suggestions.1 finding
Why it is in this group
- The name "generate_workout" says "generate": a word for a change.
- The server marks it read-only (readOnlyHint: true), but an annotation never lowers a class.
Findings
- Warn
The server marks "generate_workout" read-only (readOnlyHint: true), and its own name, description or input give the class "write".
What this check looks forMatched text
annotations: {"readOnlyHint":true,"openWorldHint":false}; The name "generate_workout" says "generate": a word for a change.
Description, as the server wrote it 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.
Annotations the server declares
- title: Generate a workout
- readOnlyHint: true
- openWorldHint: false
Only reads 13Show 13 read-only tools
find_exercise_alternativesRanked swaps that train the same muscles, e.g.No findings
Why it is in this group
- The name "find_exercise_alternatives" says "find": a word for reading.
Description, as the server wrote it Ranked swaps that train the same muscles, e.g. when equipment is missing. Optionally require or exclude equipment.
Annotations the server declares
- title: Find exercise alternatives
- readOnlyHint: true
- openWorldHint: false
find_similar_exercisesExercises most similar to the given one (same pattern, muscles and equipment), ranked by score.No findings
Why it is in this group
- The name "find_similar_exercises" says "find": a word for reading.
Description, as the server wrote it Exercises most similar to the given one (same pattern, muscles and equipment), ranked by score.
Annotations the server declares
- title: Find similar exercises
- readOnlyHint: true
- openWorldHint: false
get_code_exampleA 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 handlin…No findings
Why it is in this group
- The name "get_code_example" says "get": a word for reading.
Description, as the server wrote it 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.
Annotations the server declares
- title: Get a code example
- readOnlyHint: true
- openWorldHint: false
get_endpoint_referenceParameters, response shape, errors and a curl example for any v2 endpoint, straight from the OpenAPI spec.Reads text others writeCan send data outNo findings
Why it is in this group
- The name "get_endpoint_reference" says "get": a word for reading.
What it can reach
- untrusted-inputThe input takes a URL (input.endpoint), and the tool reads it: it reads web pages, which anyone can write.
- outboundThe input takes a URL (input.endpoint): a request to a URL can carry data to whoever runs it.
Claude Code: ask, because it is tagged outbound.
Description, as the server wrote it 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.
Annotations the server declares
- title: Get endpoint reference
- readOnlyHint: true
- openWorldHint: false
get_exerciseOne exercise by v2 id: instructions, tips, muscles, equipment, sets/reps guidance, calories and signed media links.No findings
Why it is in this group
- The name "get_exercise" says "get": a word for reading.
Description, as the server wrote it One exercise by v2 id: instructions, tips, muscles, equipment, sets/reps guidance, calories and signed media links.
Annotations the server declares
- title: Get an exercise
- readOnlyHint: true
- openWorldHint: false
get_exercise_mediaFresh signed MP4 and thumbnail links for one exercise (links expire; call again rather than storing them).No findings
Why it is in this group
- The name "get_exercise_media" says "get": a word for reading.
Description, as the server wrote it Fresh signed MP4 and thumbnail links for one exercise (links expire; call again rather than storing them).
Annotations the server declares
- title: Get exercise media
- readOnlyHint: true
- openWorldHint: false
get_supplement_stackA recommended stack for a goal with dosages and timing.No findings
Why it is in this group
- The name "get_supplement_stack" says "get": a word for reading.
Description, as the server wrote it A recommended stack for a goal with dosages and timing. Needs the Scale plan.
Annotations the server declares
- title: Build a supplement stack
- readOnlyHint: true
- openWorldHint: false
get_trending_exercisesThe exercises and filters (body parts, muscles, equipment, categories) requested most across WorkoutX apps in the last 30 days.No findings
Why it is in this group
- The name "get_trending_exercises" says "get": a word for reading.
Description, as the server wrote it 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.
Annotations the server declares
- title: Get trending exercises
- readOnlyHint: true
- openWorldHint: false
get_usage_statsYour 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.No findings
Why it is in this group
- The name "get_usage_stats" says "get": a word for reading.
Description, as the server wrote it 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.
Annotations the server declares
- title: Get usage statistics
- readOnlyHint: true
- openWorldHint: false
list_exercise_filtersEvery valid value (with counts) for body parts, target muscles, equipment, categories and muscles.No findings
Why it is in this group
- The name "list_exercise_filters" says "list": a word for reading.
Description, as the server wrote it Every valid value (with counts) for body parts, target muscles, equipment, categories and muscles. Call this before search_exercises when unsure of a value.
Annotations the server declares
- title: List exercise filters
- readOnlyHint: true
- openWorldHint: false
map_v1_exerciseFind the v2 exercise for an old v1 id (e.g.No findings
Why it is in this group
- The description's first verb is "find": a word for reading.
Description, as the server wrote it Find the v2 exercise for an old v1 id (e.g. "0025"), with the match quality: exact, equivalent, alternative, closest or none.
Annotations the server declares
- title: Map a v1 exercise id to v2
- readOnlyHint: true
- openWorldHint: false
search_exercisesSearch 1,900+ exercises.No findings
Why it is in this group
- The name "search_exercises" says "search": a word for reading.
Description, as the server wrote it 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.
Annotations the server declares
- title: Search exercises
- readOnlyHint: true
- openWorldHint: false
search_supplementsSupplements with evidence ratings, dosage and timing.No findings
Why it is in this group
- The name "search_supplements" says "search": a word for reading.
Description, as the server wrote it Supplements with evidence ratings, dosage and timing. Filter by category, goal, timing, evidence or free text. Needs the Growth plan or higher.
Annotations the server declares
- title: Search supplements
- readOnlyHint: true
- openWorldHint: false
This is not a safety rating, and no finding is not a safety guarantee. The groups and findings come from fixed checks of the tool definitions the server returned on the date shown, not from its code or what it does when called. How the checks work.
Exfil surface
Which tools read private data, which read text someone else can write, and which can send data out. One of each is a path a prompt injection can use.
No private-data, untrusted-input, outbound path in this server alone: no tool is tagged private-data.
- Reads private data0
- Reads files, mail, messages, databases, secrets, calendars or repositories.
- Reads text others write1
- Brings in text someone else can write: web pages, inbound email, messages, issues and comments.
- Can send data out1
- Can carry data to people or systems: it sends, posts or publishes, or takes a recipient, channel or URL.
Other servers in the same agent add their own tools to these paths. Audit your whole setup to see them together.
Findings
Matches of fixed checks, with the text they matched.
- Warngenerate_workout
The server marks "generate_workout" read-only (readOnlyHint: true), and its own name, description or input give the class "write".
What this check looks forMatched text
annotations: {"readOnlyHint":true,"openWorldHint":false}; The name "generate_workout" says "generate": a word for a change.
- Warngenerate_program
The server marks "generate_program" read-only (readOnlyHint: true), and its own name, description or input give the class "write".
What this check looks forMatched text
annotations: {"readOnlyHint":true,"openWorldHint":false}; The name "generate_program" says "generate": a word for a change.
- Warngenerate_types
The server marks "generate_types" read-only (readOnlyHint: true), and its own name, description or input give the class "write".
What this check looks forMatched text
annotations: {"readOnlyHint":true,"openWorldHint":false}; The name "generate_types" says "generate": a word for a change.
- Warndiagnose_request
The server marks "diagnose_request" read-only (readOnlyHint: true), and its own name, description or input give the class "write".
What this check looks forMatched text
annotations: {"readOnlyHint":true,"openWorldHint":false}; The name "diagnose_request" says "request": a word for a change.
History
Changes to its tool definitions and to its remote endpoint, newest first.
No change seen yet. Its tools are rescanned every day, and a remote endpoint is looked at once a week.
Install
Pinned to version 2.1.0. Values in angle brackets are yours to fill in.
claude mcp add --transport http workoutx https://api.workoutxapp.com/mcp --header 'X-WorkoutX-Key: <your-x-workoutx-key>'claude mcp add --transport http workoutx https://api.workoutxapp.com/mcp --header 'X-WorkoutX-Key: <your-x-workoutx-key>'Run in a terminal.
Claude Code permissions
Allow the reads, ask before a change or a way out, deny the deletes. Paste into .claude/settings.json.
{
"permissions": {
"allow": [
"mcp__workoutx__list_exercise_filters",
"mcp__workoutx__search_exercises",
"mcp__workoutx__get_exercise",
"mcp__workoutx__get_exercise_media",
"mcp__workoutx__find_exercise_alternatives",
"mcp__workoutx__find_similar_exercises",
"mcp__workoutx__map_v1_exercise",
"mcp__workoutx__search_supplements",
"mcp__workoutx__get_supplement_stack",
"mcp__workoutx__get_usage_stats",
"mcp__workoutx__get_trending_exercises",
"mcp__workoutx__get_code_example"
],
"ask": [
"mcp__workoutx__estimate_calories",
"mcp__workoutx__generate_workout",
"mcp__workoutx__generate_program",
"mcp__workoutx__export_exercise_seed",
"mcp__workoutx__get_endpoint_reference",
"mcp__workoutx__generate_types",
"mcp__workoutx__diagnose_request",
"mcp__workoutx__check_api_key"
],
"deny": []
}
}Tools that only read are allowed, tools that change things ask first, tools that delete or cancel are denied. A read that can send data out (it takes a URL, say) asks first too. It assumes the server is installed as workoutx. Review it before you use it.
Capability tags behind 1 rule
- mcp__workoutx__get_endpoint_reference untrusted-input, outbound
Pin
Keep the decision: fail CI when the tools change, follow every change, or show a badge.
Pin in CI
Fail a build when the tools you reviewed are not the tools the server serves today.
curl -s "https://anlyon.dev/api/v1/servers/io.github.furkanuruk/workoutx/verify?hash=f602298e4adb7ed34035fdae30b0ddcb6d2f86746610530c17a33b4a3d2b8dab" | jq -e '.changed == false'Pinned hash f602298e4adb, from Oct 29, 2026, 04:17 UTC.
Watch
Get told when its tools change: a new tool, a new description, a new class.
https://anlyon.dev/servers/io.github.furkanuruk/workoutx/changes.xmlAn Atom feed. Works in any feed reader or Slack's RSS app.
Badge
[](https://anlyon.dev/servers/io.github.furkanuruk/workoutx)Source: MCP Registry · repository. Synced Oct 29, 2026, 04:17 UTC.