Skip to main content
Glama
elias-ramzi

ClaudeCyclingMCP

by elias-ramzi

Server Configuration

Describes the environment variables required to run the server.

NameRequiredDescriptionDefault

No arguments

Capabilities

Features and capabilities supported by this server

CapabilityDetails
tools
{
  "listChanged": false
}
prompts
{
  "listChanged": false
}
resources
{
  "subscribe": false,
  "listChanged": false
}
experimental
{}

Tools

Functions exposed to the LLM to take actions

NameDescription
validate_specA

Check a workout spec and report every problem found.

Catches the mistakes that actually bite: empty workouts, zero or negative durations, power that resolves outside a sane fraction of FTP (usually watts and percentages swapped), ramps whose endpoints are equal, both unit forms on one block, percentages with no FTP to resolve them against, and empty or nested repeats. Unknown keys are reported as warnings, which catches typos like "powr_w" that would otherwise be silently ignored.

Returns valid/errors/warnings, plus a summary of the workout when it is valid.

describe_specA

Render a workout spec as a human-readable block table for sanity-checking.

Shows every block with its computed watts, duration and elapsed time, plus total duration, average and normalised power, estimated IF and TSS, and total work. Use this before rendering to confirm a session is what was intended — it is much easier to spot a wrong number here than in XML.

render_zwoA

Render a workout spec to a MyWhoosh-compatible .zwo file.

Returns the XML and the filename to upload it under. That filename matters: MyWhoosh takes the workout's library name from the uploaded filename, not from the tag inside the file. Set the spec's "filename" field to control it.

Ramps are emitted as explicit and repeats are flattened into individual blocks, both so the result stays unambiguous and editable inside MyWhoosh's editor.

Pass out_path to also write the file to disk; the content is returned either way. Writing is the only filesystem access this server performs.

render_garminA

Render a workout spec to a Garmin Connect workout payload.

The returned "payload" is ready to hand to the Garmin MCP's upload_workout tool unchanged. Power targets are absolute watts via power.between (workoutTargetTypeId 6); percentages in the spec are resolved against the spec's FTP. Repeats become RepeatGroupDTO groups carrying a complete endCondition, including the numeric conditionTypeId that Garmin needs to avoid silently corrupting the repeat count.

This server does not upload. Use the bundled garmin-upload skill, which uploads and then verifies by fetching the workout back and comparing it against what was sent.

Pass out_path to also write the payload as JSON to disk.

verify_garmin_uploadA

Check that Garmin stored the workout that was actually sent.

Pass the payload given to upload_workout, and the response from get_workout_by_id for the workout it created. Returns the list of differences; an empty list means Garmin kept what was sent.

This compares against the sent payload, not against an assumed read shape — the difference matters, because get_workout_by_id returns a lossy projection that will happily agree with a wrong-units payload. It also catches a repeat count silently corrupted by a missing conditionTypeId.

Two things it cannot prove: whether a power target was stored as watts or as %FTP (the curated read drops the targetValueUnit field that distinguishes them), and whether the workout displays correctly on a head unit. Confirm those by opening the workout in Garmin Connect once.

Pure comparison, no network access.

spec_schemaA

Return the workout spec's JSON schema plus the notes needed to author one.

Call this before writing a spec by hand if the format is not already known.

Prompts

Interactive templates invoked by user choice

NameDescription
garmin-uploadBuild a structured cycling workout and put it on Garmin Connect. Use this whenever someone describes a bike session — intervals, sweet spot, threshold, VO2, endurance, a ramp test — and wants it created, added, sent, pushed, put on, synced to, or scheduled on Garmin Connect, their Garmin watch, or their Edge head unit. Trigger on any of "create a workout", "add this to Garmin", "send it to my Garmin", "put it on my head unit", "schedule this for Tuesday", not only on the word "upload". Also use to schedule a workout that already exists in the Garmin library.
mywhoosh-uploadBuild a structured cycling workout and put it into MyWhoosh. Use this whenever someone describes a bike session — intervals, sweet spot, threshold, VO2, endurance, a ramp test — and wants it created, added, sent, imported, put on, or loaded into MyWhoosh, their MyWhoosh library, or "the trainer app" for an indoor ride. Trigger on any of "create a workout in MyWhoosh", "add this to MyWhoosh", "send it to MyWhoosh", "put it on the trainer", "make me a .zwo", not only on the word "upload". Drives the MyWhoosh workout builder through Claude in Chrome, because MyWhoosh has no usable API.

Resources

Contextual data attached and managed by the client

NameDescription

No resources

Latest Blog Posts

MCP directory API

We provide all the information about MCP servers via our MCP API.

curl -X GET 'https://glama.ai/api/mcp/v1/servers/elias-ramzi/ClaudeCyclingMCP'

If you have feedback or need assistance with the MCP directory API, please join our Discord server