Skip to main content
Glama
rudeayelo
by rudeayelo

aimharder-mcp

Ask about your AimHarder classes, workouts, bookings and activity from an AI client. Version 0.4.0 is a local MCP server that supports confirmed manual booking actions and own activity publication and deletion. One standard Open Box creation/cancellation cycle was observed live at 9NBC; the late branch, other gyms and credit effects remain unverified. Activity writes have fixture coverage but no live action through this server. This is an independent project, neither affiliated with nor endorsed by AimHarder.

Data limits: Live checks used one account at one location (9NBC). Other gyms may differ. Workout and booking views can be incomplete, so an empty result may not mean there is nothing to show. Details

Get started

  1. Install Node.js 24 or newer.

  2. Supply AIMHARDER_USERNAME and AIMHARDER_PASSWORD to the server process through your client or a secrets manager. Keep them out of shared configuration. The server assumes Europe/Madrid unless you configure your gym's time zone.

  3. Add a local stdio server to your client. This generic JSON example assumes the client passes the required environment variables:

    {
      "mcpServers": {
        "aimharder": {
          "command": "npx",
          "args": ["--yes", "aimharder-mcp@0.4.1"]
        }
      }
    }
  4. Ask your client an AimHarder question, such as “What is tomorrow's WOD?” The first valid tool call signs in. See the guide for your client below for its configuration format and credential options.

Related MCP server: garmin-mcp

Desktop and CLI clients

Hermes and Codex CLI have called the account tool through the published package. The ChatGPT desktop STDIO form has been observed; package connections in ChatGPT desktop, Claude Desktop and OpenClaw have not been verified. Mobile apps are outside the current setup guides.

Tools

Version 0.4.0 includes the activity publication and deletion tools below. Each write requires a separate confirmation of the exact preview.

Tool

Example question

get_account_context

Which gyms can I query?

get_class_sessions

What classes are available this week?

prepare_booking_creation

Preview booking this exact class without reserving it.

execute_booking_creation

Book the exact preview after explicit account-holder confirmation.

prepare_booking_cancellation

Preview cancelling one existing booking without changing it.

execute_booking_cancellation

Cancel the exact preview after explicit account-holder confirmation.

execute_late_booking_cancellation

After a warning, attempt late cancellation only with separate confirmation of possible credit loss.

get_published_workouts

What is tomorrow's WOD?

get_exercise_1rm

What is my latest 1RM for this source exercise ID?

find_exercise_1rm

Which exercise by this name has my latest 1RM?

get_exercise_rm_progression

How have my RMs for this source exercise progressed?

get_upcoming_bookings

When am I booked?

get_booking_history

Which past bookings are available?

get_personal_activity

What activity did I record this month?

prepare_activity_publication

Preview publishing results from this verified gym workout.

execute_activity_publication

Publish that exact preview after separate confirmation and check the own read-back.

prepare_activity_deletion

Preview deleting this exact own activity entry.

execute_activity_deletion

Delete that exact entry after separate confirmation and report fresh account observations.

Clients can combine tools for questions about workouts and bookings, or count recent activity entries. An activity entry does not establish attendance or one distinct training session. See tool inputs and coverage.

Version 0.3.0 adds source exercise IDs, known-ID and name-based own-account 1RM queries, separate RM progression, and calculated loads for eligible %RM prescriptions dated today or later in the gym's reported zone. Original instructions and all publication/variant alternatives remain visible. Search and personal history coverage are limited. Live source comparison passed for search, progression and a calculated load in the 28 September WOD. That WOD's split variant rows lacked valid source exercise IDs, so their original percentages remained visible with unavailable calculation status; split arithmetic remains fixture-verified only. See validation for the evidence limits.

Version 0.4.0 includes prepare_activity_publication and a confirmation-gated execute_activity_publication for supported structured block results and manually confirmed actual kilogram loads from a current-view gym workout. It also includes prepare_activity_deletion and execute_activity_deletion: preparation verifies an exact own entry through the account calendar and detail; execution requires separate confirmation, rechecks the target, attempts at most one DELETE, and reports a fresh account view. A read-only publication draft can show historical kilogram suggestions before the account holder chooses an actual load; it cannot be executed. Preparation reads the independently configured account audience. Publication execution rechecks the audience, source, suggestion and exact Copy payload, sends at most one activity POST, then reads the own calendar and detail before reporting confirmation or uncertainty. An MCP client journey test covers both actions against anonymized upstream fixtures. No live publication or deletion through this server has been performed. Configure a user-confirmed gym zone and review each complete preview before providing separate confirmation. The fixture journey does not establish a real write outcome.

Roadmap

Planned capabilities, without committed dates or versions:

  • Compare a calculable split %RM source example against the MCP when one becomes available; the current release decision accepts fixture-only evidence for that arithmetic path.

  • Validate own activity results (specified in #42; source implementation and fixture journey complete, live action acceptance pending).

  • Expand compatibility to more AimHarder gyms.

  • Explore compatibility with mobile apps.

Contributing

Report bugs or propose changes in GitHub Issues. Keep credentials and private activity out of reports. See the development guide to contribute code.

License

MIT.

Available Tools

18 tools
execute_activity_deletionA
Destructive

Delete one exact own activity entry using a fresh prepare_activity_deletion reference. The MCP client MUST show the complete preview and obtain the account holder's separate confirmation of that exact entry before calling with confirmed: true and its sourceActivityId. Rechecks account, gym, membership, date, ownership and content, sends at most one DELETE to the fixed verified endpoint, then reads the account calendar/detail. A reference or boolean alone does not prove human consent. An absent row does not prove permanent deletion or RM-history effects. An uncertain attempt must never be retried automatically.

ParametersJSON Schema
NameRequiredDescriptionDefault
gymIdNo
confirmedYes
actionReferenceYes
sourceActivityIdYes

Output Schema

ParametersJSON Schema
NameRequiredDescription
statusYes

TDQS

A4.6/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations cover the safety profile (destructive, non-idempotent, openWorld), and the description adds substantial context beyond them: rechecks of account/gym/membership/date/ownership/content, exactly one DELETE to a fixed verified endpoint, post-delete calendar read, and the warning that a reference or boolean alone is not proof of consent. It also flags that an absent row does not prove permanent deletion or RM-history effects.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Dense but every clause earns its place, with the core confirmation requirement front-loaded before the recheck/retry caveats. Slightly long for a single tool, but not padded.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a destructive, non-idempotent write with an output schema (so return values need not be explained), the description covers prerequisites, consent, verification scope, single-attempt semantics, and read-back. Nothing an agent needs to invoke it safely is missing.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 0%, so the description must carry parameter meaning. It explains actionReference must come fresh from prepare_activity_deletion and that confirmed: true accompanies the call, but it never defines sourceActivityId's role in matching the previewed entry, nor gymId, which the schema presents only as an opaque pattern. Partial compensation.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb (delete) plus the exact resource/scope ('one exact own activity entry') and names the required precursor tool prepare_activity_deletion, cleanly separating it from the prepare_* siblings. An agent can identify the operation without opening the schema.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Explicitly requires a fresh prepare_activity_deletion reference, mandates showing the full preview and obtaining separate human confirmation of the exact entry before calling with confirmed: true, and states the retry prohibition ('an uncertain attempt must never be retried automatically'). It effectively defines when and when-not to call.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

execute_activity_publicationA

Publish the exact fresh prepare_activity_publication preview only after the MCP client shows its gym, source, date, variant, account audience, WOD TV setting and results and obtains action-specific account-holder confirmation. A reference alone does not prove consent. Rechecks the source and preferences, sends at most one activity POST, then reads the own calendar and detail. A timeout or unverified read-back remains uncertain and is never retried automatically.

ParametersJSON Schema
NameRequiredDescriptionDefault
gymIdNo
confirmedYes
actionReferenceYes
acknowledgePossibleDuplicateNo

Output Schema

ParametersJSON Schema
NameRequiredDescription
statusYes

TDQS

A4.5/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Goes well beyond annotations (readOnlyHint=false, openWorldHint=true, idempotentHint=false, destructiveHint=false) by disclosing the full behavioral contract: rechecks source and preferences, sends at most one POST, reads back the calendar and detail, and treats a timeout or unverified read-back as uncertain and never retried automatically. This is exactly the kind of non-idempotent, side-effecting detail an agent needs.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Two dense sentences that are front-loaded with the core action and sequencing, and no filler. Slightly packed – the consent/precondition clause could be separated – but every phrase carries load.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a non-idempotent open-world mutation with an output schema (so return values needn't be explained) and zero schema parameter coverage, it covers consent, sequencing, retry semantics and uncertainty well. It omits the meaning of confirmed and acknowledgePossibleDuplicate, which is a real gap for a write tool.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 0%, so the description must compensate, and it partly does – it references the preview's gym, source, date, variant, audience, WOD TV setting, results and the action reference. However, it does not explain the confirmed boolean const, or acknowledgePossibleDuplicate, leaving two parameters without meaning. Good but incomplete compensation.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb (Publish) and resource (the fresh prepare_activity_publication preview), and explicitly ties it to the sibling prepare_activity_publication, distinguishing it from all other execute_* and get_* siblings. An agent can tell exactly what this does without opening other schemas.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Clearly states the precondition (only after the MCP client shows the preview and obtains action-specific account-holder confirmation; a reference alone is insufficient consent). It does not explicitly name when-not to use it versus e.g. execute_booking_creation, but the dependence on a fresh prepare_activity_publication preview implies the alternative path.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

execute_booking_cancellationA
Destructive

Cancel one exact prepared booking. The MCP client MUST show the gym, class, local date/time, current booked state and possible credit loss from the preview, then obtain explicit account-holder confirmation before calling with confirmed: true. A reference alone does not prove consent. Rechecks the reservation, sends at most one standard cancellation request, then reconciles with fresh reads. A late-credit-loss warning remains pending; never retry automatically. One standard cancellation was observed at 9NBC; late and other response branches remain unverified live.

ParametersJSON Schema
NameRequiredDescriptionDefault
gymIdNo
confirmedYes
actionReferenceYes

Output Schema

ParametersJSON Schema
NameRequiredDescription
gymYes
actionYes
creditYes
statusYes
targetYes
noticesYes
expiresAtNo
observedStateYes
actionReferenceNo

TDQS

A4.5/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Beyond the annotations (destructiveHint=true, idempotentHint=false), the description discloses meaningful behavior: it rechecks the reservation, sends at most one cancellation request, reconciles with fresh reads, and never retries automatically. It also transparently notes that only one standard cancellation branch was observed live and that late/other branches remain unverified, which is valuable cautionary context.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is front-loaded with the core purpose and then adds only high-value safety and behavioral details. Each sentence earns its place, including the consent requirement, no-retry rule, and live-verification caveat, without padding or redundancy.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a destructive, non-idempotent tool with an output schema, the description covers the essential operational context: consent proof, rechecking, single request, reconciliation, and the unresolved late-credit-loss branch. The presence of an output schema means return values need not be described, and nothing critical for correct invocation is missing.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

With 0% schema description coverage, the description must compensate, and it does add meaning for confirmed (must be true and backed by explicit consent) and actionReference (a reference alone does not prove consent). However, it leaves gymId unexplained and does not clarify the actionReference format beyond what the schema pattern already provides, so the compensation is incomplete.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description opens with a specific verb and resource, 'Cancel one exact prepared booking,' which clearly states the tool's function. It also distinguishes itself from siblings like execute_late_booking_cancellation by referring to a 'standard cancellation request' and an exact prepared booking, so an agent can tell it apart without opening schemas.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description gives explicit preconditions: the MCP client must show the preview and obtain explicit account-holder confirmation before calling with confirmed: true, and it warns never to retry automatically. It does not explicitly name alternatives or state when to prefer execute_late_booking_cancellation, but the context strongly implies the standard-cancellation path.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

execute_booking_creationA

Create exactly one booking from a fresh prepare_booking_creation reference. The MCP client MUST show the exact gym, class, local date/time and credit uncertainty from that preview and obtain explicit account-holder confirmation before calling with confirmed: true. A reference alone does not prove consent. Rechecks the target and sends at most one standard write, then reconciles with fresh reads. One standard creation was observed at 9NBC; other response branches remain unverified live. An uncertain result requires manual inspection before a new action.

ParametersJSON Schema
NameRequiredDescriptionDefault
gymIdNo
confirmedYes
actionReferenceYes

Output Schema

ParametersJSON Schema
NameRequiredDescription
gymYes
actionYes
creditYes
statusYes
targetYes
noticesYes
observedStateYes

TDQS

A4.7/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Beyond the annotations (write, non-idempotent, open-world), the description discloses meaningful operational traits: it 'sends at most one standard write, then reconciles with fresh reads,' and honestly flags its verification status ('One standard creation was observed at 9NBC; other response branches remain unverified live'). This is exactly the kind of trust calibration context annotations cannot convey, and it does not contradict any annotation.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is dense but efficient: the safety-critical consent precondition is front-loaded, and each sentence after it adds a distinct operational fact (fresh reference, one write, reconciliation, verification status, uncertainty handling). The only minor redundancy is the consent point appearing in both sentence two and sentence three, but that repetition serves to emphasize the highest-risk failure mode.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a consequential mutating tool with an output schema present (so return values need no explanation), the description covers the full decision path: consent gate, fresh-reference requirement, at-most-one-write guarantee, live verification status, and the mandated post-condition of manual inspection on uncertain results. The sole missing element is undocumented gymId semantics, which prevents a 5.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

With 0% schema coverage, the description must carry parameter meaning, and it does for the two required fields: actionReference is defined as a fresh prepare_booking_creation reference, and confirmed is explained as requiring prior explicit account-holder consent (const: true). However, gymId is never mentioned anywhere, so an agent cannot infer why the optional gymId parameter exists or when to supply it — a genuine gap in an otherwise strong definition.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The first sentence states a specific verb + resource + constraint: 'Create exactly one booking from a fresh prepare_booking_creation reference.' This simultaneously distinguishes the tool from the cancellation siblings and from the prepare step, so an agent knows precisely what this tool does and which sibling pairing it belongs to.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description gives explicit routing conditions: it must follow a fresh prepare_booking_creation reference, must be preceded by showing the user the exact gym/class/time/credit uncertainty and obtaining explicit confirmation, and 'A reference alone does not prove consent.' It also states when NOT to proceed ('An uncertain result requires manual inspection before a new action'), leaving no ambiguity about the required precondition.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

execute_late_booking_cancellationA
Destructive

After execute_booking_cancellation reports pending-credit-loss, the MCP client MUST show its exact gym, class, local date/time, still-booked state and possible lost credit, then obtain a SEPARATE explicit account-holder confirmation of that consequence. Only then call with the NEW actionReference and confirmedCreditLoss: true. Rechecks the same reservation, sends at most one late request, and reconciles by reading. Never retry automatically. No refund or balance is verified.

ParametersJSON Schema
NameRequiredDescriptionDefault
gymIdNo
actionReferenceYes
confirmedCreditLossYes

Output Schema

ParametersJSON Schema
NameRequiredDescription
gymYes
actionYes
creditYes
statusYes
targetYes
noticesYes
observedStateYes

TDQS

A4.9/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations (destructiveHint:true, idempotentHint:false) are already present, but the description adds crucial context: it requires a UI confirmation step, sends at most one request, reconciles by reading, and explicitly states it does not verify refund or balance. This goes beyond the annotations and tells the agent what side effects to expect.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Every sentence adds value: it front-loads the mandatory confirmation step, then the call condition, then the behavior after the call. It is dense but not verbose, with no filler. The structure logically guides the agent through the required sequence.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a complex mutation tool with an output schema, the description covers the entire workflow: what to do before calling, what parameters to pass, what the tool does (rechecks, sends once, reconciles), and what it doesn't verify. An agent has all the information needed to invoke it correctly without ambiguity.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 0%, so the description carries the burden. It explains the meaning of the two required parameters: actionReference must be the NEW one from the prior call, and confirmedCreditLoss must be true. It does not explain gymId, which is optional, but for the essential parameters it adds useful semantics beyond the schema's raw constraints.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly defines the tool as the follow-up to a normal cancellation when credit loss is pending. It names the sibling execute_booking_cancellation and specifies the exact condition ('reports pending-credit-loss') that triggers this tool, distinguishing it from other cancellation tools.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Explicitly states the precondition: 'After execute_booking_cancellation reports pending-credit-loss'. It mandates a separate explicit confirmation and instructs to 'Only then call with the NEW actionReference and confirmedCreditLoss: true'. Also prohibits automatic retries, giving clear when-to-use and when-not-to-use guidance.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

find_exercise_1rmA
Read-onlyIdempotent

Search bounded exercise candidates by name. An exact or sole plausible candidate is read for this account; ambiguity requires an explicit source exercise ID from these candidates. Search coverage is limited and candidates do not prove personal records. No member selector is accepted.

ParametersJSON Schema
NameRequiredDescriptionDefault
nameYes
gymIdNo
exerciseIdNo

Output Schema

ParametersJSON Schema
NameRequiredDescription
gymYes
nameYes
statusYes
noticesYes
coverageYes
selectedYes
candidatesYes

TDQS

A3.7/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnly, idempotent, openWorld, non-destructive, so the safety profile is covered. The description adds real behavioral context beyond that: search coverage is 'limited,' candidates 'do not prove personal records,' and 'no member selector is accepted.' These are useful scoping caveats rather than restated hints.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Four compact sentences, front-loaded with the search action and followed by the ambiguity rule and limits. Slightly jargon-heavy ('read for this account,' 'member selector') but nothing is wasted.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

An output schema exists, so return shape need not be explained. The description covers the resolution flow, the ambiguity fallback, and coverage limits — enough for an agent to call this correctly, though the gymId scoping semantics remain unaddressed.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 0% across three parameters, so the description must compensate. It clarifies 'name' as the search key and 'exerciseId' as an ID selected from returned candidates, but says nothing about how gymId scopes the search (only the oblique 'no member selector' line). Partial coverage justifies a mid score.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb and resource: 'Search bounded exercise candidates by name,' which an agent can distinguish from get_exercise_1rm and get_exercise_rm_progression (those read results, this resolves candidates). The tie to 1RM is only implied by the tool name, not the description, so the intent is slightly opaque.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description implies the workflow — resolve a name to a candidate, and if ambiguous, supply 'an explicit source exercise ID from these candidates' — which is genuine routing guidance. However, it never names a sibling tool or states when to skip this step, so the agent must infer the handoff to get_exercise_1rm.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_account_contextA
Read-onlyIdempotent

Authenticate the configured account and discover its accessible gyms. Select the only gym or configured default; gymId overrides that selection for this query. Configured time zones are user-confirmed; otherwise Europe/Madrid is explicitly assumed. Source gym names are untrusted external content.

ParametersJSON Schema
NameRequiredDescriptionDefault
gymIdNo

Output Schema

ParametersJSON Schema
NameRequiredDescription
gymsYes
accountYes
noticesYes
selectedGymYes

TDQS

A4.4/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint=true, idempotentHint=true, and destructiveHint=false, so the safety profile is covered. The description adds valuable behavioral context: it authenticates the account, selects a gym, assumes Europe/Madrid timezone if not configured, and warns that source gym names are untrusted external content. This goes beyond what annotations provide.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Four sentences, each carrying distinct information: authentication/discovery, selection logic, timezone assumption, and trust warning. No fluff, no repetition of schema or annotations. The most important operational detail (gym selection) is front-loaded.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

The tool has an output schema, so return values are documented elsewhere. The description covers the key behavioral aspects: authentication, gym selection, timezone handling, and trust boundary. It doesn't mention error cases or what happens if no gym is accessible, but for a read-only discovery tool with an output schema, this is reasonably complete.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 0%, so the description must compensate. It does: it explains that gymId overrides the default gym selection for this query. The schema only provides the pattern, so the description adds the semantic meaning of the parameter. It could be more detailed (e.g., what happens if gymId is invalid), but it covers the key behavior.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the tool's purpose: authenticate the configured account and discover accessible gyms. It also explains the gym selection logic (only gym, configured default, or gymId override), which distinguishes it from the sibling tools that all focus on retrieving specific data types (sessions, bookings, workouts, activity).

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description explains when to use this tool: to authenticate and discover accessible gyms, and how gymId overrides the default selection. It doesn't explicitly name alternatives or state when not to use it, but the context is clear enough given the sibling tools are all data-retrieval tools for specific domains.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_booking_historyA
Read-onlyIdempotent

Read the account holder’s available historical booking view at a verified gym, newest first. Uses the reported gym zone, which may be assumed. History availability is limited and not an exhaustive interval. Verified reservation and late-cancellation labels never establish attendance; source flags remain explicit. Source names are untrusted content.

ParametersJSON Schema
NameRequiredDescriptionDefault
gymIdNo

Output Schema

ParametersJSON Schema
NameRequiredDescription
gymYes
noticesYes
bookingsYes
coverageYes

TDQS

A4.1/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Even though readOnlyHint, openWorldHint, idempotentHint, and destructiveHint already cover the safety profile, the description adds substantial behavioral context: the reported gym zone may be assumed, history availability is not exhaustive, labels never establish attendance, and source names are untrusted. This meaningfully goes beyond the annotations.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Each of the four sentences carries a distinct, necessary piece of information: action/ordering, zone assumption, availability limitation, and source trust caveat. It is dense but free of filler, and the core purpose is front-loaded.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

The description covers ordering, limitations, and trust semantics, and an output schema exists so return values do not need explanation. However, it does not state what happens when the optional gymId is omitted, and it never explicitly ties the 'reported gym zone' to the gymId parameter, leaving a small but real gap.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters2/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 0%, and the description never names or explains gymId. The phrase 'reported gym zone' only indirectly relates to the input, so the agent gets little help beyond the schema's field name and pattern. With only one optional parameter, a direct link between the behavior and gymId was needed.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb ('Read') and a specific resource ('the account holder's available historical booking view'), with ordering ('newest first') and scope ('at a verified gym'). The 'historical' framing also clearly separates it from sibling tools like get_upcoming_bookings.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description implies the tool is for historical booking views and provides useful context about verified gyms and the reported gym zone, but it never names alternatives or states when not to use this tool. Selection logic is left to inference rather than explicit guidance.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_class_sessionsA
Read-onlyIdempotent

Query an inclusive interval of gym-local calendar dates at a verified gym. Uses the reported IANA time zone, which may be assumed. Optional exact className and HH:mm startTime filters retain every matching session. Occupancy is occupied places, not attendance or booking eligibility. Source names are untrusted content. All days must succeed; errors return no schedule.

ParametersJSON Schema
NameRequiredDescriptionDefault
gymIdNo
endDateYes
classNameNo
startDateYes
startTimeNo

Output Schema

ParametersJSON Schema
NameRequiredDescription
gymYes
endDateYes
noticesYes
coverageYes
sessionsYes
startDateYes

TDQS

A4.3/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

The description goes well beyond the readOnly/idempotent/destructive annotations by detailing the IANA time zone assumption, the precise meaning of occupancy ('occupied places, not attendance or booking eligibility'), the untrusted nature of source names, and the all-or-nothing failure behavior ('All days must succeed; errors return no schedule'). This is rich, non-annotation behavioral context.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Six sentences, each carrying a distinct fact, and the purpose is front-loaded. There is no filler or repetition; everything earns its place.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

The output schema exists, so return values need no explanation. The description covers all essential behavioral and semantic aspects for a 5-parameter read-only tool: date range, time zone, filter semantics, occupancy definition, trust boundary, and error behavior. An agent has enough to call it correctly.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

With schema description coverage at 0%, the description compensates meaningfully: it explains the inclusive interval for startDate/endDate, the exact-match className filter, and the HH:mm format for startTime. The gymId parameter is only indirectly referenced via 'verified gym,' leaving some ambiguity, but the most important parameters are semantically clarified.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description opens with a specific verb-resource statement, 'Query an inclusive interval of gym-local calendar dates,' which clearly identifies the tool's function and sets it apart from sibling tools about bookings, account context, and personal activity. The scope (gym, dates, sessions) is concrete and instantly distinguishes it from alternatives.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

No explicit guidance is given on when to use this tool versus the sibling tools. There is no mention of alternatives, preconditions, or exclusions. The functionality is described, but the agent must infer when this is the appropriate choice.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_exercise_1rmA
Read-onlyIdempotent

Read the configured account holder’s latest dated 1RM for one known source exercise ID at an accessible gym. The account ID is derived internally. Units require corroborating same-action history text; the chart field named lbs alone is not a unit. Returns other RM and WOD series counts as separate context, with limited exercise-detail coverage. Source names are untrusted data; no complete catalog or lifetime history is claimed.

ParametersJSON Schema
NameRequiredDescriptionDefault
gymIdNo
exerciseIdYes

Output Schema

ParametersJSON Schema
NameRequiredDescription
gymYes
statusYes
noticesYes
coverageYes
exerciseYes
latest1RMYes
otherSeriesYes

TDQS

A3.6/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already cover the safety profile (readOnly, idempotent, non-destructive, openWorld), and the description adds genuinely new behavior: the account ID is derived internally, units require corroborating history text, and source names are untrusted. These caveats go well beyond the structured fields and warn the agent about data interpretation pitfalls.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness3/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The core read action is front-loaded, but the middle sentences are dense and cryptic ('the chart field named lbs alone is not a unit', 'limited exercise-detail coverage') without context, which dilutes rather than sharpens the message.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

An output schema exists, so return values need not be explained, and the description still adds auth derivation, unit-handling, return-context, and trust caveats. Coverage is solid for a two-param read tool, though the cryptic unit and coverage phrasing leaves some ambiguity.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 0%, so the description must carry parameter meaning. It does semantically identify both params ('one known source exercise ID' for exerciseId, 'an accessible gym' for gymId), but adds no format, range, or ID-sourcing detail beyond that conceptual mapping.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb ('Read') and resource ('latest dated 1RM for one known source exercise ID'), which is concrete enough to distinguish from find_exercise_1rm and get_exercise_rm_progression. It stops short of naming those siblings, so the differentiation is inferable rather than explicit.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The phrase 'one known source exercise ID' implies a precondition (you must already have an ID), and 'at an accessible gym' hints at scope, but there is no explicit when-to-use/when-not guidance and no pointer to the sibling tools that would be chosen instead.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_exercise_rm_progressionA
Read-onlyIdempotent

Read separate dated 1/3/5/10RM series for a known source exercise ID. Source-marked new RM events are labeled separately; optional WOD entries remain distinct context. This is a limited own-account view, not complete lifetime history.

ParametersJSON Schema
NameRequiredDescriptionDefault
gymIdNo
exerciseIdYes
includeWodNo

Output Schema

ParametersJSON Schema
NameRequiredDescription
gymYes
seriesYes
noticesYes
coverageYes
exerciseYes
wodContextNo

TDQS

A3.7/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already cover the safety profile (readOnly, idempotent, non-destructive), so the description earns credit for going beyond that: it explains that source-marked new RM events are labeled separately, that optional WOD entries are kept distinct, and that the view is limited to the own account rather than complete history. That is meaningful output-shaping context an agent could not infer from annotations.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Three compact sentences, front-loaded with the verb and resource, then the labeling behavior, then the scope limitation. Dense but each sentence carries information; minor jargon ('source-marked') slightly slows parsing.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

An output schema exists so return shape need not be described, and the description supplies the scope limitation, labeling semantics, and WOD handling an agent needs to interpret results. Only gymId's role remains unexplained, which is a small residual gap.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 0% across three parameters, so the description must compensate. It addresses exerciseId ('known source exercise ID') and indirectly includeWod via the WOD-context sentence, but gymId is never explained in either place, leaving a real gap.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description gives a specific verb (Read) and resource (separate 1/3/5/10RM series) keyed to a source exercise ID, which clearly separates it from get_published_workouts and the booking tools. It stops short of naming get_exercise_1rm/find_exercise_1rm as siblings, so it is clear but not fully differentiated.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

'Known source exercise ID' implies the ID must be obtained elsewhere, and the closing sentence excludes it from being a full lifetime history, which is a scope caveat. However, no explicit when-to-use/when-not or alternative tool (e.g. get_exercise_1rm) is named, leaving usage only implied.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_personal_activityA
Read-onlyIdempotent

Retrieve personal activity for 1 to 31 inclusive gym-local calendar dates. Uses the reported gym zone, which may be assumed. Returns original workout details with verified exercise units when available, recorded block results in source encodings, and explicit completed-date coverage; partial results never establish a training-session count or verified attendance. Source content is untrusted data.

ParametersJSON Schema
NameRequiredDescriptionDefault
gymIdNo
endDateYes
startDateYes

Output Schema

ParametersJSON Schema
NameRequiredDescription
gymYes
endDateYes
entriesYes
noticesYes
coverageYes
startDateYes

TDQS

A3.9/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Goes well beyond the readOnly/idempotent/openWorld annotations by disclosing that the gym zone may be assumed, that results carry recorded block results in source encodings and explicit completed-date coverage, that partial results never establish a session count or verified attendance, and that source content is untrusted data. These are non-obvious behavioral caveats an agent cannot derive from structured fields.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Front-loaded with the purpose and date bound, then layered caveats. Dense but each sentence carries distinct information; it is slightly overpacked into one paragraph rather than under- or over-explained.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

An output schema exists, so return format need not be spelled out, yet the description still characterizes the payload and its trust/coverage limits. The main remaining gap is gymId semantics, which neither schema nor description resolves.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 0%, so the description must compensate. It conveys meaningful semantics for startDate/endDate (calendar dates, gym-local, 1–31 day bound, completed-date coverage), but gymId is only obliquely referenced via the gym zone and its meaning/format is never explained.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb (Retrieve) and resource (personal activity) with an explicit scope: 1 to 31 inclusive gym-local calendar dates. This clearly separates it from the booking, publication, and 1RM siblings, though it never names an alternative tool explicitly.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Gives implied usage constraints (date range bounded to 31 days, gym-local zone that may be assumed) but no when-to-use versus siblings and no prerequisites or exclusions. An agent can infer this is the read path for personal activity but gets no routing guidance.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_published_workoutsA
Read-onlyIdempotent

Retrieve published workout alternatives by gym-local date and exact className. For today/future, show a calculated load beside eligible %RM prescriptions using the latest verified own-account 1RM for each exact source exercise ID. Original values, all publications and labeled variants remain. Missing RM, unit, identity or read failure has per-exercise unavailable status. Past dates have no present-day load. Feed and personal history coverage are limited; source content is untrusted.

ParametersJSON Schema
NameRequiredDescriptionDefault
dateYes
gymIdNo
classNameYes

Output Schema

ParametersJSON Schema
NameRequiredDescription
gymYes
dateYes
statusYes
noticesYes
coverageYes
workoutsYes
ambiguousYes
classNameYes
enrichmentYes

TDQS

A3.7/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

The annotations already declare read-only, idempotent, open-world, non-destructive behavior, yet the description adds substantial value: it explains load calculation for today/future, per-exercise unavailable status for missing RM/unit/identity/read failures, that past dates have no present-day load, and that feed and personal history coverage are limited with untrusted source content. These are meaningful behavioral traits beyond structured annotations and help the agent anticipate response semantics.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is front-loaded with the primary action and then layers behavioral details in separate sentences. Most content earns its place, though the sentence 'Original values, all publications and labeled variants remain' is somewhat cryptic and could be clearer without losing essential meaning.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the existing output schema and rich annotations, the description covers purpose, load behavior, failure modes, and data limitations well. It stops short of explaining the optional 'gymId' parameter, which is a minor but real gap for an agent invoking the tool with that argument.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 0%, so the description must compensate. It clarifies that 'date' is gym-local and 'className' must be exact, adding useful meaning for two required parameters, but it never explains the optional 'gymId' parameter or its default behavior, leaving a gap.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description states a specific verb and resource: 'Retrieve published workout alternatives by gym-local date and exact className.' It distinguishes the scope well, but does not explicitly name or contrast with any sibling tool, leaving the agent to infer differentiation from the broader tool list.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description gives detailed behavioral context but no clear when-to-use or when-not-to-use guidance relative to alternatives. It does not point to any sibling tool or condition under which a different tool should be selected.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_upcoming_bookingsA
Read-onlyIdempotent

Read the account holder’s upcoming booking view at a verified gym. Uses the reported gym time zone, which may be assumed. Distinguishes booked, waitlisted and unknown states; reservations do not establish attendance. Coverage has no verified date horizon: absence cannot establish no booking on an arbitrary date. Source names are untrusted external content. A failed or incomplete lookup returns an error, never an empty successful view.

ParametersJSON Schema
NameRequiredDescriptionDefault
gymIdNo

Output Schema

ParametersJSON Schema
NameRequiredDescription
gymYes
noticesYes
bookingsYes
coverageYes
bookingStatusYes

TDQS

A4.7/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

The description substantially enriches the annotations: it explains time-zone assumptions, state distinctions, that reservations do not establish attendance, that coverage has no verified date horizon, that source names are untrusted, and that failures return errors rather than empty views. These details go far beyond readOnlyHint and openWorldHint alone.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Each sentence earns its place: the action is front-loaded, and the following sentences cover time-zone handling, state semantics, coverage limits, trust boundaries, and error behavior. The description is dense but not bloated, and every clause addresses a decision or interpretation an agent would otherwise lack.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the output schema exists and the annotations already cover read-only, idempotent, and open-world behavior, the description completes the remaining picture: how to interpret states, what absence means, how time zones are handled, and what failure looks like. Nothing critical is missing for correct invocation and interpretation.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Although schema description coverage is 0%, the description adds meaningful context for the single gymId parameter: the gym must be verified, and its reported time zone may be assumed. This is useful beyond the schema's pattern constraint, even though it does not explicitly name the parameter.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description opens with a specific verb and resource: "Read the account holder’s upcoming booking view at a verified gym." The word "upcoming" clearly distinguishes this from siblings like get_booking_history and get_class_sessions, so an agent can infer its scope even without opening the schema.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The tool's intended use is clearly implied: use it to read the account holder's upcoming booking view, including distinguishing booked, waitlisted, and unknown states. It does not explicitly name alternatives or exclusion conditions, but the scope is precise enough that an agent can select it appropriately among the listed siblings.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

prepare_activity_deletionA
Read-only

Prepare a read-only preview for deleting one exact own activity entry. Supply a gym-local date and, when needed, a sourceActivityId obtained from get_personal_activity. The ID must occur in the authenticated account calendar and its detail must verify the account owner, selected gym and date. Shows exact content, incomplete coverage, possible irreversible loss, no automatic backup or undo, and unknown RM-history effects. An entry with RM marks remains eligible. This tool never sends DELETE; its short-lived reference is not confirmation.

ParametersJSON Schema
NameRequiredDescriptionDefault
dateYes
gymIdNo
sourceActivityIdNo

Output Schema

ParametersJSON Schema
NameRequiredDescription
statusYes

TDQS

A4.6/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint=true and destructiveHint=false, and the description's 'never sends DELETE' and 'short-lived reference is not confirmation' statements are consistent and add real context. It goes further with the preview contents (exact content, incomplete coverage, possible irreversible loss, no backup or undo, unknown RM-history effects) and eligibility rules, which is strong disclosure for a preview tool.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Front-loads the core purpose and the non-destructive guarantee, then layers preconditions and caveats. It is fairly dense but every sentence carries distinct information; only the rapid-fire caveat list could be tightened.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

An output schema exists so return values need not be described, and the description still covers preconditions, eligibility, safety caveats and the non-confirmation semantics. For a preview tool feeding an execute sibling, nothing essential is missing.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 0%, so the description must compensate, and it does: it explains date as gym-local, tells where to obtain sourceActivityId (get_personal_activity), and states the ID must occur in the authenticated account calendar and verify owner/gym/date. gymId is only implied via 'selected gym', leaving a small gap.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb and resource ('Prepare a read-only preview for deleting one exact own activity entry') and clearly distinguishes itself from execute_activity_deletion by emphasizing that it never sends DELETE. An agent can identify the tool's role without opening any schema.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Explicitly says when to use it (before deletion, for an exact own entry) and prescribes the prerequisites: a gym-local date and a sourceActivityId obtained from get_personal_activity. It also rules out misuse by stating the reference is not confirmation and no DELETE is sent, implicitly routing confirmation to the execute sibling.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

prepare_activity_publicationA
Read-only

Read a selected gym workout in the current supported publication view and prepare one own activity entry. Supply its source ID from get_published_workouts and one difficulty label if several exist. With no result or actual load, return a read-only draft with historical kilogram suggestions but no action reference; then prepare again with a supported result or explicitly confirmed actual kilograms. The audience and WOD TV setting come from account preferences and are rechecked before execution. Show the full ready preview and obtain action-specific confirmation before execution.

ParametersJSON Schema
NameRequiredDescriptionDefault
gymIdNo
commentNo
actualLoadsNo
activityDateNo
blockResultsNo
variantLabelNo
sourceActivityIdYes

Output Schema

ParametersJSON Schema
NameRequiredDescription
statusYes

TDQS

A3.8/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Adds meaningful behavior beyond the annotations: the two-phase draft/execute flow, that a draft has no action reference, that historical kilogram suggestions are read-only, and that audience and WOD TV settings are pulled from account preferences and rechecked before execution. None of this is inferable from readOnlyHint/openWorldHint, and nothing contradicts them.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness3/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The single dense paragraph is front-loaded with the core action, but sentences are long and stack multiple conditions (draft mode, load confirmation, preference recheck, preview/confirm) without structure. Every clause carries information, yet a bulleted or sequenced layout would cost less effort to parse.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

An output schema exists, so return values need no explanation, and the description covers the workflow, preconditions, and confirmation gate sufficiently to call the tool correctly. The remaining shortfall is the undocumented parameters, which is a schema/description gap rather than a missing concept.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 0% across 7 parameters, so the description is the only guidance and it covers only part of the surface: sourceActivityId (source ID), variantLabel (difficulty label), actualLoads (actual kilograms), and blockResults ('supported result'). gymId, comment, activityDate, and the sourceAlternative enum are never explained, leaving a real documentation gap.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb+resource: reads a selected gym workout in the current publication view and prepares one own activity entry, and names the upstream source (get_published_workouts). It distinguishes itself from execute_activity_publication through the 'prepare' framing and the confirmation gate, though the phrasing ('own activity entry', 'supported publication view') is dense enough that the exact artifact being produced takes a second read.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Gives real when-to-use guidance: supply the source ID from get_published_workouts, resolve the difficulty label when several variants exist, and re-run the call with a supported result or explicitly confirmed kilograms when the first pass returns a draft. It does not explicitly name execute_activity_publication as the tool that consumes the prepared draft, so the hand-off is implied rather than stated.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

prepare_booking_cancellationA
Read-only

Read the configured account’s fresh daily schedule and prepare cancellation of one exact booked class. Requires a user-confirmed gym IANA zone. Matches the schedule reservation internally; no reservation ID or family selector is accepted. Ambiguous, missing, cancelled, waitlisted, or unsupported targets receive no executable reference. At 9NBC, show the published 90-minute credit-loss risk before any cancellation request. Show the full preview and obtain explicit account-holder confirmation before execute_booking_cancellation. This preview sends no cancellation POST.

ParametersJSON Schema
NameRequiredDescriptionDefault
dateYes
gymIdNo
endTimeYes
classNameYes
startTimeYes

Output Schema

ParametersJSON Schema
NameRequiredDescription
gymYes
actionYes
creditNo
statusYes
targetYes
noticesYes
expiresAtNo
alternativesYes
currentStateNo
actionReferenceNo

TDQS

A4.1/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint=true and destructiveHint=false, so the description adds value by detailing behavior: it matches the schedule reservation internally, accepts no reservation ID or family selector, returns no executable reference for ambiguous/missing/cancelled/waitlisted/unsupported targets, and explicitly says 'This preview sends no cancellation POST.' It also mentions showing credit-loss risk at 9NBC, providing richer behavioral context beyond the annotations.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is moderately long but every sentence adds value: it states the purpose, prerequisites, matching constraints, conditional behavior (credit-loss risk), required confirmation flow, and non-mutation guarantee. It is front-loaded with the core purpose and maintains a logical structure. No redundant or filler sentences.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the output schema exists (not shown here) and annotations cover safety, the description provides sufficient context: it explains the tool's role in the cancellation workflow, prerequisites, behavioral limitations, and the confirmation requirement. It does not mention return value details, but that is likely covered by the output schema. The only minor gap is the lack of explicit per-parameter explanation, but that is a smaller concern because the schema patterns and names are clear.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 0%—the properties have no descriptions—so the description must compensate. It explains that the tool matches the schedule reservation based on date, className, startTime, and endTime, and that no reservation ID or family selector is accepted, implying these four required fields are how the class is identified. However, it does not explain each parameter individually or mention the optional gymId, leaving some ambiguity for agents. The parameter names are self-explanatory, but the description could be more explicit about what gymId means (likely the gym identifier related to the IANA zone).

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description states a specific verb and resource: 'read the configured account’s fresh daily schedule and prepare cancellation of one exact booked class.' It clearly distinguishes itself from execute_booking_cancellation by emphasizing that this is a preview step that sends no cancellation POST, and it names the sibling execute_booking_cancellation as the next step. This makes the tool's role unambiguous.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description explicitly instructs to obtain explicit account-holder confirmation before execute_booking_cancellation and notes that this preview sends no cancellation POST, establishing the correct order of operations. It also specifies a prerequisite (user-confirmed gym IANA zone) and mentions a condition at 9NBC (show credit-loss risk). However, it does not explicitly state when to use this over other prepare tools like prepare_booking_creation, though the focus on cancellation is clear enough.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

prepare_booking_creationA
Read-only

Read the current daily schedule and prepare one exact class booking for the configured account. Requires a user-confirmed gym IANA zone and exact class name, date, start and end time. Ambiguous, missing, already booked, waitlisted or unsupported targets receive no action reference. The short-lived reference does not book a class. Show the full preview and obtain explicit account-holder confirmation before execute_booking_creation. Possible credit use and the unverified balance are disclosed.

ParametersJSON Schema
NameRequiredDescriptionDefault
dateYes
gymIdNo
endTimeYes
classNameYes
startTimeYes

Output Schema

ParametersJSON Schema
NameRequiredDescription
gymYes
actionYes
creditNo
statusYes
targetYes
noticesYes
expiresAtNo
alternativesYes
currentStateNo
actionReferenceNo

TDQS

A4.5/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint=true and destructiveHint=false, so the safety profile is known. The description adds valuable behavioral context: 'The short-lived reference does not book a class' and 'Possible credit use and the unverified balance are disclosed.' These go beyond the annotations by explaining the temporal nature of the reference and the disclosure of side effects (credit usage), which is not communicated by the annotation flags.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is concise and front-loaded: the first sentence states the purpose and scope, followed by prerequisites, exclusions, and the required confirmation flow. Each sentence adds a distinct, non-redundant piece of information. It is not bloated but packs a lot of essential context into a short paragraph.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a preparation tool that is part of a two-step booking flow, the description covers the core requirements: what it does, what data it needs, what it does not do (no booking, no action on ambiguous targets), and the required confirmation step before calling the sibling. The output schema exists, so explaining the return structure is unnecessary. The only minor gap is no explicit mention of error handling for invalid inputs, but the statement about ambiguous targets receiving no action covers the most likely failure mode.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

With schema description coverage at 0%, the description carries the burden of explaining parameters. It maps the required parameters to their roles: 'class name, date, start and end time' and 'user-confirmed gym IANA zone' for the gymId. It also emphasizes the need for exact and unambiguous values, which is essential for correct invocation. While it does not detail formats (covered by schema patterns), it does provide the semantic meaning behind each parameter, compensating for the lack of schema descriptions.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the tool's purpose: 'Read the current daily schedule and prepare one exact class booking for the configured account.' It distinguishes itself from the sibling execute_booking_creation by explicitly stating it does not book, and it names the exact target parameters (class name, date, start/end time). This is a specific verb+resource that tells an agent exactly what the tool does.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description gives explicit usage context: it requires a user-confirmed gym IANA zone and exact class details, and it states that ambiguous/missing/already booked/waitlisted/unsupported targets receive no action reference. It further instructs to 'Show the full preview and obtain explicit account-holder confirmation before execute_booking_creation,' which routes the agent to the correct sibling for the actual booking. This is clear when/when-not guidance with an explicit alternative.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

Tool Schema Changelog

Recent tool additions, removals, and schema changes observed during successful MCP inspections.

  1. 9 tool updatesv0.4.1
    • Addedexecute_activity_deletion
    • Addedexecute_activity_publication
    • Addedfind_exercise_1rm
    • Addedget_exercise_1rm
    • Addedget_exercise_rm_progression
    • Changedget_personal_activity3 fields changed
      • addedOutput schema / properties / entries / items / properties / exercises / items / properties / personalLoad
        Added value: +{
        +  "additionalProperties": false,
        +  "properties": {
        +    "alternatives": {
        +      "items": {
        +        "additionalProperties": false,
        +        "properties": {
        +          "basis": {
        +            "anyOf": [
        +              {
        +                "additionalProperties": false,
        +                "properties": {
        +                  "rule": {
        +                    "const": "latest-dated-1rm-times-percent",
        +                    "type": "string"
        +                  },
        +                  "sourceDate": {
        +                    "type": "string"
        +                  },
        +                  "sourceExerciseId": {
        +                    "exclusiveMinimum": 0,
        +                    "maximum": 9007199254740991,
        +                    "type": "integer"
        +                  },
        +                  "value": {
        +                    "type": "string"
        +                  }
        +                },
        +                "required": [
        +                  "rule",
        +                  "sourceExerciseId",
        +                  "value",
        +                  "sourceDate"
        +                ],
        +                "type": "object"
        +              },
        +              {
        +                "type": "null"
        +              }
        +            ]
        +          },
        +          "calculatedLoad": {
        +            "type": [
        +              "string",
        +              "null"
        +            ]
        +          },
        +          "originalPercent": {
        +            "type": "string"
        +          },
        +          "reason": {
        +            "type": [
        +              "string",
        +              "null"
        +            ]
        +          },
        +          "sourceField": {
        +            "enum": [
        +              "valor2",
        +              "valor2h",
        +              "valor2m"
        +            ],
        +            "type": "string"
        +          },
        +          "sourceLabel": {
        +            "enum": [
        +              "single",
        +              "male",
        +              "female"
        +            ],
        +            "type": "string"
        +          },
        +          "status": {
        +            "enum": [
        +              "available",
        +              "unavailable"
        +            ],
        +            "type": "string"
        +          },
        +          "unit": {
        +            "anyOf": [
        +              {
        +                "enum": [
        +                  "kg",
        +                  "lbs"
        +                ],
        +                "type": "string"
        +              },
        +              {
        +                "type": "null"
        +              }
        +            ]
        +          }
        +        },
        +        "required": [
        +          "sourceField",
        +          "sourceLabel",
        +          "originalPercent",
        +          "status",
        +          "reason",
        +          "calculatedLoad",
        +          "unit",
        +          "basis"
        +        ],
        +        "type": "object"
        +      },
        +      "type": "array"
        +    },
        +    "reason": {
        +      "type": [
        +        "string",
        +        "null"
        +      ]
        +    },
        +    "status": {
        +      "enum": [
        +        "available",
        +        "unavailable",
        +        "partial"
        +      ],
        +      "type": "string"
        +    }
        +  },
        +  "required": [
        +    "status",
        +    "reason",
        +    "alternatives"
        +  ],
        +  "type": "object"
        +}
      • addedOutput schema / properties / entries / items / properties / exercises / items / properties / sourceExerciseId
        Added value: +{
        +  "anyOf": [
        +    {
        +      "exclusiveMinimum": 0,
        +      "maximum": 9007199254740991,
        +      "type": "integer"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "description": "Validated upstream ejerId; null means no supported source identity was supplied."
        +}
      • changedOutput schema / properties / entries / items / properties / exercises / items / required
        Previous value: -[
        -  "name",
        -  "blockIndex",
        -  "prescription"
        -]New value: +[
        +  "name",
        +  "sourceExerciseId",
        +  "blockIndex",
        +  "prescription"
        +]
    • Changedget_published_workouts8 fields changed
      • addedOutput schema / properties / enrichment
        Added value: +{
        +  "additionalProperties": false,
        +  "properties": {
        +    "availableExercises": {
        +      "maximum": 9007199254740991,
        +      "minimum": 0,
        +      "type": "integer"
        +    },
        +    "basis": {
        +      "const": "latest-dated-1rm-times-percent",
        +      "type": "string"
        +    },
        +    "eligibleExercises": {
        +      "maximum": 9007199254740991,
        +      "minimum": 0,
        +      "type": "integer"
        +    },
        +    "status": {
        +      "enum": [
        +        "not-applicable",
        +        "complete",
        +        "incomplete"
        +      ],
        +      "type": "string"
        +    },
        +    "unavailableExercises": {
        +      "maximum": 9007199254740991,
        +      "minimum": 0,
        +      "type": "integer"
        +    }
        +  },
        +  "required": [
        +    "status",
        +    "eligibleExercises",
        +    "availableExercises",
        +    "unavailableExercises",
        +    "basis"
        +  ],
        +  "type": "object"
        +}
      • addedOutput schema / properties / workouts / items / properties / exercises / items / properties / personalLoad
        Added value: +{
        +  "additionalProperties": false,
        +  "properties": {
        +    "alternatives": {
        +      "items": {
        +        "additionalProperties": false,
        +        "properties": {
        +          "basis": {
        +            "anyOf": [
        +              {
        +                "additionalProperties": false,
        +                "properties": {
        +                  "rule": {
        +                    "const": "latest-dated-1rm-times-percent",
        +                    "type": "string"
        +                  },
        +                  "sourceDate": {
        +                    "type": "string"
        +                  },
        +                  "sourceExerciseId": {
        +                    "exclusiveMinimum": 0,
        +                    "maximum": 9007199254740991,
        +                    "type": "integer"
        +                  },
        +                  "value": {
        +                    "type": "string"
        +                  }
        +                },
        +                "required": [
        +                  "rule",
        +                  "sourceExerciseId",
        +                  "value",
        +                  "sourceDate"
        +                ],
        +                "type": "object"
        +              },
        +              {
        +                "type": "null"
        +              }
        +            ]
        +          },
        +          "calculatedLoad": {
        +            "type": [
        +              "string",
        +              "null"
        +            ]
        +          },
        +          "originalPercent": {
        +            "type": "string"
        +          },
        +          "reason": {
        +            "type": [
        +              "string",
        +              "null"
        +            ]
        +          },
        +          "sourceField": {
        +            "enum": [
        +              "valor2",
        +              "valor2h",
        +              "valor2m"
        +            ],
        +            "type": "string"
        +          },
        +          "sourceLabel": {
        +            "enum": [
        +              "single",
        +              "male",
        +              "female"
        +            ],
        +            "type": "string"
        +          },
        +          "status": {
        +            "enum": [
        +              "available",
        +              "unavailable"
        +            ],
        +            "type": "string"
        +          },
        +          "unit": {
        +            "anyOf": [
        +              {
        +                "enum": [
        +                  "kg",
        +                  "lbs"
        +                ],
        +                "type": "string"
        +              },
        +              {
        +                "type": "null"
        +              }
        +            ]
        +          }
        +        },
        +        "required": [
        +          "sourceField",
        +          "sourceLabel",
        +          "originalPercent",
        +          "status",
        +          "reason",
        +          "calculatedLoad",
        +          "unit",
        +          "basis"
        +        ],
        +        "type": "object"
        +      },
        +      "type": "array"
        +    },
        +    "reason": {
        +      "type": [
        +        "string",
        +        "null"
        +      ]
        +    },
        +    "status": {
        +      "enum": [
        +        "available",
        +        "unavailable",
        +        "partial"
        +      ],
        +      "type": "string"
        +    }
        +  },
        +  "required": [
        +    "status",
        +    "reason",
        +    "alternatives"
        +  ],
        +  "type": "object"
        +}
      • addedOutput schema / properties / workouts / items / properties / exercises / items / properties / sourceExerciseId
        Added value: +{
        +  "anyOf": [
        +    {
        +      "exclusiveMinimum": 0,
        +      "maximum": 9007199254740991,
        +      "type": "integer"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "description": "Validated upstream ejerId; null means no supported source identity was supplied."
        +}
      • changedOutput schema / properties / workouts / items / properties / exercises / items / required
        Previous value: -[
        -  "name",
        -  "blockIndex",
        -  "prescription"
        -]New value: +[
        +  "name",
        +  "sourceExerciseId",
        +  "blockIndex",
        +  "prescription"
        +]
      • addedOutput schema / properties / workouts / items / properties / variants / items / properties / exercises / items / properties / personalLoad
        Added value: +{
        +  "additionalProperties": false,
        +  "properties": {
        +    "alternatives": {
        +      "items": {
        +        "additionalProperties": false,
        +        "properties": {
        +          "basis": {
        +            "anyOf": [
        +              {
        +                "additionalProperties": false,
        +                "properties": {
        +                  "rule": {
        +                    "const": "latest-dated-1rm-times-percent",
        +                    "type": "string"
        +                  },
        +                  "sourceDate": {
        +                    "type": "string"
        +                  },
        +                  "sourceExerciseId": {
        +                    "exclusiveMinimum": 0,
        +                    "maximum": 9007199254740991,
        +                    "type": "integer"
        +                  },
        +                  "value": {
        +                    "type": "string"
        +                  }
        +                },
        +                "required": [
        +                  "rule",
        +                  "sourceExerciseId",
        +                  "value",
        +                  "sourceDate"
        +                ],
        +                "type": "object"
        +              },
        +              {
        +                "type": "null"
        +              }
        +            ]
        +          },
        +          "calculatedLoad": {
        +            "type": [
        +              "string",
        +              "null"
        +            ]
        +          },
        +          "originalPercent": {
        +            "type": "string"
        +          },
        +          "reason": {
        +            "type": [
        +              "string",
        +              "null"
        +            ]
        +          },
        +          "sourceField": {
        +            "enum": [
        +              "valor2",
        +              "valor2h",
        +              "valor2m"
        +            ],
        +            "type": "string"
        +          },
        +          "sourceLabel": {
        +            "enum": [
        +              "single",
        +              "male",
        +              "female"
        +            ],
        +            "type": "string"
        +          },
        +          "status": {
        +            "enum": [
        +              "available",
        +              "unavailable"
        +            ],
        +            "type": "string"
        +          },
        +          "unit": {
        +            "anyOf": [
        +              {
        +                "enum": [
        +                  "kg",
        +                  "lbs"
        +                ],
        +                "type": "string"
        +              },
        +              {
        +                "type": "null"
        +              }
        +            ]
        +          }
        +        },
        +        "required": [
        +          "sourceField",
        +          "sourceLabel",
        +          "originalPercent",
        +          "status",
        +          "reason",
        +          "calculatedLoad",
        +          "unit",
        +          "basis"
        +        ],
        +        "type": "object"
        +      },
        +      "type": "array"
        +    },
        +    "reason": {
        +      "type": [
        +        "string",
        +        "null"
        +      ]
        +    },
        +    "status": {
        +      "enum": [
        +        "available",
        +        "unavailable",
        +        "partial"
        +      ],
        +      "type": "string"
        +    }
        +  },
        +  "required": [
        +    "status",
        +    "reason",
        +    "alternatives"
        +  ],
        +  "type": "object"
        +}
      • addedOutput schema / properties / workouts / items / properties / variants / items / properties / exercises / items / properties / sourceExerciseId
        Added value: +{
        +  "anyOf": [
        +    {
        +      "exclusiveMinimum": 0,
        +      "maximum": 9007199254740991,
        +      "type": "integer"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "description": "Validated upstream ejerId; null means no supported source identity was supplied."
        +}
      • changedOutput schema / properties / workouts / items / properties / variants / items / properties / exercises / items / required
        Previous value: -[
        -  "name",
        -  "blockIndex",
        -  "prescription"
        -]New value: +[
        +  "name",
        +  "sourceExerciseId",
        +  "blockIndex",
        +  "prescription"
        +]
      • changedOutput schema / required
        Previous value: -[
        -  "gym",
        -  "date",
        -  "className",
        -  "status",
        -  "ambiguous",
        -  "workouts",
        -  "coverage",
        -  "notices"
        -]New value: +[
        +  "gym",
        +  "date",
        +  "className",
        +  "status",
        +  "ambiguous",
        +  "workouts",
        +  "enrichment",
        +  "coverage",
        +  "notices"
        +]
    • Addedprepare_activity_deletion
    • Addedprepare_activity_publication
  2. 5 tool updatesv0.2.0
    • Addedexecute_booking_cancellation
    • Addedexecute_booking_creation
    • Addedexecute_late_booking_cancellation
    • Addedprepare_booking_cancellation
    • Addedprepare_booking_creation
  3. 6 tool updatesv0.1.2
    • Changedget_account_context6 fields changed
      • changedOutput schema / properties / gyms / items / properties / timeZone / type
        Previous value: -"null"New value: +[
        +  "string",
        +  "null"
        +]
      • removedOutput schema / properties / gyms / items / properties / timeZoneStatus / const
        Removed value: -"unverified"
      • addedOutput schema / properties / gyms / items / properties / timeZoneStatus / enum
        Added value: +[
        +  "assumed",
        +  "user-confirmed"
        +]
      • changedOutput schema / properties / selectedGym / properties / timeZone / type
        Previous value: -"null"New value: +[
        +  "string",
        +  "null"
        +]
      • removedOutput schema / properties / selectedGym / properties / timeZoneStatus / const
        Removed value: -"unverified"
      • addedOutput schema / properties / selectedGym / properties / timeZoneStatus / enum
        Added value: +[
        +  "assumed",
        +  "user-confirmed"
        +]
    • Addedget_booking_history
    • Addedget_class_sessions
    • Addedget_personal_activity
    • Addedget_published_workouts
    • Addedget_upcoming_bookings
  4. 1 tool updatev0.1.0
    • First observedget_account_context

TDQS

A4.1/5.0

Scored across 18 tools

Disambiguation4/5

Each tool targets a distinct resource+action, and the prepare/execute pairs are clearly split by read-only preview vs. commit. The only friction is the four-step booking-cancellation chain (prepare/execute/late) and the three 1RM tools, which require careful reading to separate, but descriptions resolve them.

Naming Consistency5/5

Uniform snake_case with a predictable verb_noun pattern (prepare_*, execute_*, get_*, find_*), and the prepare/execute pairing is consistent across every mutating workflow.

Tool Count4/5

18 tools is on the heavier side but each earns its place across distinct workflows (bookings, cancellations, activity publication/deletion, RM reads), with the prepare/execute split accounting for the bulk. Slightly heavy for the apparent scope.

Completeness4/5

Strong lifecycle coverage: booking create/cancel/late-cancel, activity publish/delete, plus reads for schedule, history, upcoming bookings and RM series. Minor gaps exist (no activity update, no booking reschedule), but core workflows are workable.

Maintenance

ActivityMaintained
ResponsivenessResponsive

Related MCP Connectors

Related MCP Servers