Skip to main content
Glama

TrainHeroic MCP Server

Python 3.12+ MCP License: MIT

TrainHeroic MCP server — connect TrainHeroic to Claude via the Model Context Protocol.

Give Claude (and other AI agents) direct access to your TrainHeroic workout data — history, exercise stats, personal records, and personal calendar — through the Model Context Protocol.

Built from the TrainHeroic mobile API (iOS app v8.25.0, endpoints captured via mitmproxy).


What you can do

Ask Claude things like:

  • "What workouts did I do this week?"

  • "What's my working max for back squat and how has it changed?"

  • "Show me my bench press PRs by rep count."

  • "Log today's session — I did 4×5 back squat at 225 lbs, RPE 8."

  • "Create a personal session for tomorrow and add deadlifts and Romanian deadlifts."

  • "How did I feel after Monday's workout? What was my energy and stress survey?"

  • "Who's on the leaderboard for Tuesday's workout?"


Related MCP server: Intervals.icu MCP

Quick Start

Prerequisites: Python 3.12+ and uv

# 1. Clone and install
git clone https://github.com/cmagorian/trainheroicMcp
cd trainheroicMcp
make install

# 2. Add your credentials
cp .env.example .env
# Edit .env — see "Credentials" section below

# 3. Register with your AI client
make setup-claude      # Claude Code
make setup-openclaw    # OpenClaw
# See below for Claude Desktop and Cursor

Restart your AI client and ask: "What did I train this week?"


Credentials

Copy .env.example to .env and choose one of two methods:

TRAINHEROIC_EMAIL=you@example.com
TRAINHEROIC_PASSWORD=yourpassword

The server logs in on first start and caches the session token to ~/.config/trainheroic/session.json. Re-login is automatic when the token expires.

Option B — Session token

If you'd rather not store your password:

  1. Log in at trainheroic.com

  2. Open DevTools (F12) → Network tab

  3. Click any request to api.trainheroic.com

  4. Under Request Headers, copy the session-token value

TRAINHEROIC_SESSION_TOKEN=<your-session-token>

Verify your credentials before registering:

make check-env   # confirms .env is present and populated
make run         # starts the server — look for "Ready — logged in as ..." on stderr

Registering with your AI client

Claude Code

make setup-claude

This registers the server in .claude/settings.json for this project. Credentials are loaded from .env automatically.

Run /mcp in Claude Code (or restart) to pick up the new server.

Claude Desktop

Open the config file for your OS:

OS

Path

macOS

~/Library/Application Support/Claude/claude_desktop_config.json

Windows

%APPDATA%\Claude\claude_desktop_config.json

Linux

~/.config/Claude/claude_desktop_config.json

Add the trainheroic entry — replace the path and credentials:

{
  "mcpServers": {
    "trainheroic": {
      "command": "uv",
      "args": [
        "run",
        "--directory", "/absolute/path/to/trainheroicMcp",
        "python", "-m", "trainheroic_mcp.server"
      ],
      "env": {
        "TRAINHEROIC_EMAIL": "you@example.com",
        "TRAINHEROIC_PASSWORD": "yourpassword"
      }
    }
  }
}

Restart Claude Desktop after saving.

Cursor

Open Cursor SettingsMCPAdd new MCP server, or edit ~/.cursor/mcp.json directly:

{
  "mcpServers": {
    "trainheroic": {
      "command": "uv",
      "args": [
        "run",
        "--directory", "/absolute/path/to/trainheroicMcp",
        "python", "-m", "trainheroic_mcp.server"
      ],
      "env": {
        "TRAINHEROIC_EMAIL": "you@example.com",
        "TRAINHEROIC_PASSWORD": "yourpassword"
      }
    }
  }
}

Restart Cursor after saving.

OpenClaw

make setup-openclaw

This registers the server in ~/.openclaw/openclaw.json. Restart OpenClaw to pick it up.


Example prompts

Checking history

What workouts did I complete last week?
Show me everything I trained in May.
Did I train on Monday?

Exercise stats and PRs

What's my current working max for back squat?
Show me my bench press PRs broken down by rep count.
What were my last 3 performances on Romanian deadlifts?

Logging a session

Create a personal session for today and add back squat, bench press, and cable rows.
Log my workout — I completed all sets. RPE was 7, rating 8 out of 10.

Surveys and recovery

What were my energy and stress scores after Tuesday's workout?
Submit my readiness survey: sleep was good, mood was great, energy was ok.

Social

Who's on the leaderboard for this week's main lift?
What comments are on today's workout?

Available tools

Core data

Tool

What it does

Key params

get_user_profile

Name, ID, coach status

get_team_info

Teams, program IDs, coaches

get_workout_history

Workouts in a date range (flat summary by default)

start_date, end_date, weeks_back, include_sets

get_workout_details

Full sets + logged weights for one session

program_workout_id, program_id

get_exercise_stats

Last performance, PR, working max

exercise_id, stat_date

get_personal_records

All PRs by rep count

exercise_id

get_working_max

Current working max

exercise_id

Tip: get_workout_history returns compact summaries (date, title, rating, RPE, notes) by default. Pass include_sets=True for set-level data on a 1–3 day window, or call get_workout_details for a single session.

Exercise library

Tool

What it does

Key params

get_exercise_library

Full library; filter by name

query (optional substring)

get_circuit_library

Full circuit library

get_recent_exercises

Recently used exercises

get_recent_circuits

Recently used circuits

Personal calendar

Tool

What it does

Key params

create_personal_session

Create a new session

session_date (YYYY-MM-DD)

add_exercises_to_session

Add exercises in order

workout_id, exercise_ids

log_workout

Save a completed workout

saved_workout_id, workout_id, date_string, blocks, notes, rpe, workout_rating

delete_session

Delete a session

program_workout_id

Surveys & messaging

Tool

What it does

Key params

get_workout_surveys

Sleep/mood/energy/soreness/stress data

saved_workout_ids

submit_survey

Answer a survey question

saved_workout_id, question_id, answer_id

get_workout_messages

Comments on a workout

program_workout_id

get_workout_leaderboard

Full leaderboard for a workout

program_workout_id

Survey reference:

Sleep

Mood

Energy

Soreness

Stress

question_id

8

9

10

11

12

answer_id

1

2

3

4

5

Meaning

Awful

Poor

Ok

Good

Excellent


Deploying online (access from any machine)

Host the server on Railway so any device running Claude Code, Claude Desktop, or OpenClaw can connect to it over HTTPS — no local Python install needed on the client.

Step 1 — Generate an auth token

make generate-token
# prints: MCP_AUTH_TOKEN=e5b7a8e3...

Copy the full line — you'll need it in Steps 2 and 3.

Step 2 — Deploy to Railway

  1. Push this repo to GitHub

  2. Go to railway.appNew ProjectDeploy from GitHub repo

  3. Select the repository — Railway auto-detects the Dockerfile

  4. In Variables, add:

Variable

Value

MCP_TRANSPORT

http

TRAINHEROIC_EMAIL

your email

TRAINHEROIC_PASSWORD

your password

MCP_AUTH_TOKEN

the token from Step 1

  1. Click Deploy. Railway assigns a URL like https://trainheroicmcp-production.up.railway.app

Check the deploy logs for:

INFO [trainheroic-mcp] Ready — logged in as Your Name (team: Your Team)
INFO [trainheroic-mcp] HTTP transport — listening on 0.0.0.0:8000/mcp

Step 3 — Connect from any machine

Replace YOUR_URL with your Railway URL and YOUR_TOKEN with the token from Step 1.

Claude Code:

claude mcp add \
  --transport http \
  --header "Authorization: Bearer YOUR_TOKEN" \
  trainheroic \
  https://YOUR_URL/mcp

Claude Desktop / Cursor (claude_desktop_config.json or ~/.cursor/mcp.json):

{
  "mcpServers": {
    "trainheroic": {
      "type": "http",
      "url": "https://YOUR_URL/mcp",
      "headers": {
        "Authorization": "Bearer YOUR_TOKEN"
      }
    }
  }
}

OpenClaw:

openclaw mcp set trainheroic \
  '{"type":"http","url":"https://YOUR_URL/mcp","headers":{"Authorization":"Bearer YOUR_TOKEN"}}'

Test the connection:

curl -s \
  -H "Authorization: Bearer YOUR_TOKEN" \
  -H "Content-Type: application/json" \
  https://YOUR_URL/mcp
# Should return an MCP protocol response, not 401

Run HTTP transport locally (before deploying):

MCP_AUTH_TOKEN=test-token make run-http
# Server starts on http://localhost:8000/mcp

Troubleshooting

Symptom

Likely cause

Fix

No TrainHeroic credentials found

.env missing or empty

cp .env.example .env and add credentials

401 Unauthorized on startup

Expired or invalid token

Delete ~/.config/trainheroic/session.json and restart; the server re-logs in

401 from get_workout_details

Wrong team resolved

Pass program_id from the get_workout_history item alongside program_workout_id

Server starts but Claude can't find it

Not registered or client not restarted

Re-run make setup-claude and restart Claude

Responses seem incomplete

Date range too wide

Use 1–2 week windows; call get_workout_details per session for set data


Known limitations

Feature

Reason unavailable

Lift goals

Requires Athlete Pro subscription

Nutrition calendar

Requires Athlete Pro subscription

Program listing

Coach accounts only

Data export

Backend returns 504 timeout


Development

Running tests

No credentials needed — all HTTP is intercepted by pytest-httpx.

make test                                  # quiet summary
make test-v                                # verbose, one line per test
uv run pytest -k "TestLogin"              # single class
uv run pytest tests/test_client.py        # single file

Project structure

src/trainheroic_mcp/
├── client.py     # TrainHeroicClient — auth, token cache, HTTP helpers
└── server.py     # FastMCP server — 19 tool definitions, response projectors

tests/
├── conftest.py      # fixtures: cache isolation (autouse), th_client, patched_server
├── helpers.py       # shared constants + add_init_responses helper
├── test_client.py   # init, login, token cache, HTTP helpers
└── test_tools.py    # one test class per tool

Adding a new tool

  1. Add the function to server.py with @mcp.tool().

  2. Add a test class to tests/test_tools.py using the patched_server fixture.

# server.py
@mcp.tool()
def get_athlete_pro_status() -> dict:
    """Check whether the user has an active Athlete Pro subscription."""
    return _get_client()._get("/v5/athletePro/access")
# tests/test_tools.py
class TestGetAthleteProStatus:
    def test_calls_correct_endpoint(self, patched_server, httpx_mock):
        httpx_mock.add_response(
            method="GET",
            url=f"{BASE}/v5/athletePro/access",
            json={"hasAthleteProAccess": False},
        )
        result = server.get_athlete_pro_status()
        assert result["hasAthleteProAccess"] is False

Available Tools

20 tools
add_exercises_to_sessionA

Add exercises to a personal workout session in order.

exercise_ids: ordered list of exercise IDs to add (use get_exercise_library to look up IDs). Returns the created workout sets with full exercise details.

ParametersJSON Schema
NameRequiredDescriptionDefault
workout_idYes
exercise_idsYes

TDQS

A4.2/5.0
Behavior4/5

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

With no annotations provided, the description carries the burden of behavioral disclosure. It clearly states the operation is an add operation, that ordering matters, and that the tool returns created workout sets with full exercise details. It doesn't discuss error conditions or ipotential side effects, but the disclosed behavior is substantive and goes beyond the schema.

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 three concise sentences. It front-loads the core purpose, then gives a parameter-specific instruction, then describes the return value. Every sentence adds value with no redundancy or filler.

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 simple 2-parameter mutation tool with no annotations or output schema, the description covers the operation, parameter guidance for exercise_ids, and return behavior. It omits explicit mention that the session must already exist, but this is a minor gap given the sibling context and the meaning of 'Add exercises to a personal workout session'.

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 adds meaningful semantics for exercise_ids ('ordered list' and 'use get_exercise_library to look up IDs'). However, workout_id is left unexplained; its meaning is mostly inferred from the tool name and description, 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 clearly states a specific action ('Add exercises') on a specific resource ('personal workout session'), and explicitly notes the 'in order' behavior. This distinguishes it from sibling tools like create_personal_session (creating sessions) and get_exercise_library (looking up exercises).

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 provides clear context for when to use the tool (adding exercises to an existing personal workout session) and explicitly directs users to get_exercise_library for ID lookup. However, it does not explicitly state when not to use it or mention the alternative of creating a session first with create_personal_session.

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

create_personal_sessionA

Create a new personal training session for a given date (YYYY-MM-DD).

Returns {programWorkout: {id, programId, date, workoutId}, savedWorkout: {id}}. Use the returned workoutId with add_exercises_to_session and savedWorkout.id with log_workout.

ParametersJSON Schema
NameRequiredDescriptionDefault
session_dateYes

TDQS

A4.3/5.0
Behavior3/5

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

No annotations, so description must disclose behavior. It reveals the exact return structure and the purpose, but does not mention potential side effects, idempotency, or prerequisites (e.g., whether a session for that date already exists).

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?

Two sentences, directly front-loaded with purpose and followed by essential return/chaining details. No wasted words.

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 single-parameter creation tool, the description covers purpose, input format, return shape, and downstream workflow. It is sufficient for an agent to invoke it correctly and chain with siblings.

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 coverage is 0%, but description compensates by specifying the date format (YYYY-MM-DD) for session_date, adding value beyond the bare schema.

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?

Clearly states verb+resource: 'Create a new personal training session for a given date.' Provides exact return shape, distinguishing it from sibling tools that operate on existing sessions.

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?

Provides clear context for the session-creation workflow, explicitly directing use of returned IDs with add_exercises_to_session and log_workout. Does not explicitly state when not to use it or alternatives, but the chaining guidance gives strong usage context.

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

delete_sessionB

Delete a program workout / personal session by its ID.

ParametersJSON Schema
NameRequiredDescriptionDefault
program_workout_idYes

TDQS

B3.2/5.0
Behavior2/5

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

With no annotations provided, the description carries full burden. It only states 'Delete', which is already implied by the name. It does not disclose whether deletion is permanent or soft, any side effects on related data, or required permissions. For a mutation tool, this is insufficient.

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 a single sentence with no unnecessary words, achieving maximum conciseness while covering the essential purpose.

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

Completeness2/5

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

For a simple delete tool, the description is minimal. It omits behavioral details like reversibility, side effects, and return values. The ambiguity between 'program workout' and 'personal session' is not addressed, despite the parameter name only referencing 'program_workout_id'. Overall, an agent would struggle to know if this is a hard delete or if there are any conditions.

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?

The only parameter 'program_workout_id' has no description in the schema, so the description must compensate. It says 'by its ID', which indicates the parameter is the identifier, but it does not clarify the distinction between 'program workout' and 'personal session', nor does it specify the ID format or where to obtain it.

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 verb 'Delete' and the resource 'program workout / personal session', with the method 'by its ID'. It distinguishes from sibling tools like create_personal_session and log_workout by indicating a destructive operation.

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 does not provide any guidance on when to use this tool vs alternatives, when not to use it, or prerequisites such as ownership or permissions. There is no mention of conditions for deletion or any caution about irreversibility.

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

get_circuit_libraryB

Get the circuit library for a team.

Each circuit has id, title, instructions, prescription, and exerciseIds.

ParametersJSON Schema
NameRequiredDescriptionDefault
team_idNo

TDQS

B3.2/5.0
Behavior2/5

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

With no annotations, the description must disclose behavioral traits itself. It only lists return fields but does not state read-only nature, auth requirements, or behavior when team_id is null. This leaves significant gaps in expectations.

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 two sentences, front-loaded with the action and resource, and includes a concise list of return fields. Every sentence earns its place with no superfluous detail.

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

Completeness3/5

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

For a simple read tool with one optional parameter and no output schema, the description is adequate but incomplete. It covers the resource shape but omits parameter behavior and usage context, leaving some ambiguity.

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 coverage is 0%, so the description must explain the team_id parameter. It only says 'for a team' but does not clarify that team_id is optional, what null means, or how it filters results. The parameter semantics remain ambiguous.

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 uses a specific verb 'Get' and identifies the resource as 'circuit library for a team', which clearly distinguishes it from sibling tools like get_exercise_library or get_recent_circuits. The additional field list clarifies the scope further.

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 provides no guidance on when to use this tool versus alternatives. There is no mention of scenarios or exclusions, unlike more helpful descriptions that reference sibling tools.

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

get_exercise_detailA

Get the full, un-slimmed per-set data for ONE exercise within a workout.

Use this after a slim get_workout_details call when you need every logged set (all param_N_* values, prescribed vs. actual) for a specific exercise, without pulling the entire session. Reuses the cached workout-details response.

Pass the exercise_id shown in the slim get_workout_details response, plus the same program_id/team_id you used there so the correct team is resolved.

ParametersJSON Schema
NameRequiredDescriptionDefault
team_idNo
program_idNo
exercise_idYes
program_workout_idYes

TDQS

A4.4/5.0
Behavior4/5

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

With no annotations, the description carries the transparency burden. It discloses caching behavior ('Reuses the cached workout-details response'), the need for team resolution via program_id/team_id, and the scope (per-set data for one exercise). It doesn't explicitly state read-only or error behavior, but the 'get' semantics and level of detail are sufficient for typical use.

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 three sentences, front-loaded with the main purpose, and free of fluff. Every sentence adds value: purpose, usage context, and parameter guidance.

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 tool with 4 parameters and no output schema, the description covers purpose, usage context, and most parameters. It lacks an explicit mention of program_workout_id and return-value shape, but the caching note and 'per-set data' hint give enough context for an agent to proceed. Slightly more detail would make it complete.

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 explain parameters. It explains exercise_id and team_id/program_id ('Pass the exercise_id shown... plus the same program_id/team_id you used there'). However, it omits program_workout_id, a required parameter, leaving a gap for that key identifier.

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 action and resource: 'Get the full, un-slimmed per-set data for ONE exercise within a workout.' It explicitly distinguishes itself from the sibling get_workout_details by noting this returns per-set data without pulling the entire session, making its scope clear.

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?

It provides clear guidance: 'Use this after a slim get_workout_details call' and explains the trade-off (get every logged set without pulling the entire session). It also specifies the prerequisite of reusing the cached workout-details response and what parameters to pass, giving actionable when-to-use context.

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

get_exercise_libraryB

Get the full exercise library for a team.

Optionally filter by name with query (case-insensitive substring match). Each exercise has id, title, prescription, param1Type, param2Type, videoUrl, hasVideo.

ParametersJSON Schema
NameRequiredDescriptionDefault
queryNo
team_idNo

TDQS

B3.1/5.0
Behavior3/5

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

With no annotations, the description carries the transparency burden. It discloses useful behavioral details: optional case-insensitive substring filtering via 'query' and the returned exercise fields. However, it does not clarify how team_id is used, whether team_id is required, or any pagination/ordering behavior, leaving gaps in behavioral understanding.

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 three sentences, each earning its place: the main purpose, the optional filter behavior, and the return structure. It is front-loaded with the action and resource, and contains no redundant or verbose phrasing.

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

Completeness3/5

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

For a simple list tool with no output schema and two optional parameters, the description provides the essential return fields and filter semantics. However, it lacks explanation of team_id's role, which is a key parameter, and provides no usage guidance relative to sibling tools, leaving some contextual gaps.

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?

The input schema has 0% description coverage, so the description must compensate. It explicitly explains the 'query' parameter as a case-insensitive substring match on name, which is valuable. However, 'team_id' is not described: its meaning is only hinted by 'for a team', and its optionality and default behavior are unclear.

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 clearly states the verb 'Get' and the resource 'full exercise library' with scope 'for a team', making the purpose specific. It implicitly differentiates from siblings like get_exercise_detail and get_circuit_library through the term 'exercise library' and 'full', but does not explicitly name an alternative.

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 provides no explicit guidance on when to use this tool versus alternatives like get_exercise_detail or get_recent_exercises. It implies usage when the full library is needed, but there is no mention of exclusions, prerequisites, or when to choose a different tool.

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

get_exercise_statsB

Get stats for an exercise: last performance, personal record, and working max.

stat_date is YYYY-MM-DD and defaults to today. Response includes isLift, lastPerformance (text, date, notes), personalRecord, and workingMax.

ParametersJSON Schema
NameRequiredDescriptionDefault
stat_dateNo
exercise_idYes

TDQS

B3.3/5.0
Behavior3/5

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

Despite the absence of annotations, the description discloses behavioral details by specifying the response fields (isLift, lastPerformance, personalRecord, workingMax) and the default behavior of stat_date (defaults to today, format YYYY-MM-DD). However, it does not explicitly state that this is a read-only operation or explain edge cases, but it adds meaningful context beyond the schema.

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 concise and well-structured: two sentences, front-loaded with the purpose and followed by essential parameter and response details. No extraneous content.

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

Completeness3/5

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

The description covers key aspects: purpose, parameter format, and response structure. However, it lacks definitions of what personalRecord and workingMax represent (e.g., all-time vs. current), and it remains ambiguous how this tool relates to specialized siblings. With no annotations and no output schema, these gaps leave moderate 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?

The description adds useful context for stat_date, specifying format and default behavior, which the schema omits (schema default is null). However, it provides no additional meaning for exercise_id beyond its schema type and requirement, and with 0% schema coverage, more compensation would be expected.

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 clearly states the tool's main function: obtaining stats for an exercise, specifically last performance, personal record, and working max. This is a specific verb and resource, but it does not explicitly differentiate from sibling tools like get_personal_records or get_working_max, leaving some ambiguity about selection.

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 provides no guidance on when to use this tool versus related tools such as get_personal_records or get_working_max. It offers no alternatives or exclusions, leaving the agent to infer usage context.

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

get_personal_recordsB

Get all personal records for an exercise, broken down by rep count.

Each entry contains reps, weight, scaledWeight, units, and setNumber.

ParametersJSON Schema
NameRequiredDescriptionDefault
exercise_idYes

TDQS

B3.4/5.0
Behavior3/5

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

With no annotations, the description provides some transparency by listing the fields returned (reps, weight, scaledWeight, units, setNumber), which tells the agent what to expect. However, it doesn't discuss ordering, pagination, or what qualifies as a 'personal record,' nor any potential failure modes.

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?

Two short sentences, no irrelevant detail, and the key information is front-loaded. Perfectly concise.

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 simple retrieval tool with one parameter and no output schema, the description covers the main return fields and the purpose. It doesn't describe response structure (array vs object) or error handling, but for this low-complexity tool, it is relatively complete.

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?

The single parameter exercise_id is only named in the schema without description, and the tool description does not explicitly define it beyond 'for an exercise.' The name is self-explanatory, but at 0% schema coverage, the description should have explicitly stated it takes the exercise ID to retrieve records for, which it does only implicitly.

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 clearly states the tool retrieves all personal records for an exercise, specifically broken down by rep count. This is more specific than merely saying 'get records' and distinguishes it from generic stats tools. However, it doesn't explicitly contrast with siblings like get_exercise_stats or get_working_max.

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 guidance is given on when to use this tool versus alternatives. The description only states what it does, not when it should be selected over sibling tools like get_exercise_stats or get_working_max. There are no usage caveats or exclusions.

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

get_recent_circuitsA

Get the user's recently used circuits.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

TDQS

A3.7/5.0
Behavior2/5

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

No annotations are provided, so the description must carry the full burden of disclosing behavioral traits. It only rephrases the tool name without explaining what 'recently used' means (e.g., time window, ordering), whether the operation is read-only, or any other side effects or restrictions. For a zero-parameter getter, some context about the returned data or default behavior is expected.

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 a single clear, complete sentence with no filler or redundant information. It is efficiently front-loaded and earns its place.

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

Completeness3/5

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

With no output schema and no annotations, the description should explain what the tool returns or how the results are presented. It only states 'recently used circuits' without defining the return format, limit of results, or ordering criteria. This is adequate for a simple zero-param tool but leaves gaps for correct 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?

The tool has zero parameters, so the schema is trivially 100% covered. According to the rubric, a baseline of 4 applies for 0 params. The description adds no parameter-level detail because there are none to describe.

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 retrieves the user's recently used circuits, using a specific verb (Get) and resource (circuits). It is easily distinguishable from siblings like get_circuit_library (which would return all circuits) and get_recent_exercises (which focuses on exercises).

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 usage for retrieving recently used circuits but does not explicitly state when to use it over alternatives or mention any exclusions. It relies on the name and context to convey its purpose, which is adequate but not explicit.

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

get_recent_exercisesA

Get the user's recently used exercises.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

TDQS

A3.5/5.0
Behavior2/5

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

With no annotations to rely on, the description carries the full burden. It only says 'get' with no details about side effects (though read-only is implied), what 'recently used' means (time window, count), or whether results are sorted. The description adds minimal 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?

The description is a single sentence, front-loaded with the verb and resource. Every word is necessary and there is no redundancy or fluff.

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

Completeness3/5

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

The tool is very simple with no parameters, but it lacks an output schema and the description does not mention what the return value looks like (e.g., a list of IDs, full exercise objects). For a retrieval tool, this leaves room for ambiguity, but the minimal scope makes it borderline adequate.

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?

The tool has zero parameters, so the schema is trivially empty and the baseline is 4. The description does not need to explain parameter meanings, and it adequately sets expectations that the tool takes no input.

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 retrieves the user's recently used exercises, with a specific verb ('get') and resource ('recently used exercises'). It distinguishes itself from sibling tools like get_recent_circuits (which gets circuits) and get_exercise_library (which lists all exercises).

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 guidance is provided on when to use this tool versus alternatives like get_exercise_library or get_exercise_detail. The description gives no context for selection criteria, prerequisites, or exclusions.

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

get_team_infoA

Get the athlete's team memberships and license info (team IDs, program IDs, coaches).

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

TDQS

A4/5.0
Behavior3/5

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

No annotations are provided, so the description carries the full burden. It indicates a read-only 'Get' operation, but does not disclose other behavioral traits such as whether the data may be empty, if authentication is required, or any potential side effects. The behavior is simple, but more transparency could be added.

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 a single sentence that is concise and front-loaded with the main action. The parenthetical adds useful detail about the output without unnecessary words.

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 tool's simplicity (no parameters, no output schema), the description adequately covers the returned content. However, it does not explicitly mention what happens if the athlete has no team memberships or whether the response is an array, but this is not critical for a tool with such a narrow purpose.

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?

The tool has zero parameters and the schema is empty, so there are no parameter semantics to document. The description adds context about what data is returned, which is sufficient given the absence of parameters.

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 retrieves an athlete's team memberships and license information, specifically including team IDs, program IDs, and coaches. This is a specific verb+resource combination that distinguishes it from siblings like get_user_profile or get_recent_exercises.

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 retrieving team-related data for an athlete, but it does not explicitly state when to use it over alternatives or mention any exclusions. The context from sibling names suggests a clear use case, but explicit guidance is missing.

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

get_user_profileA

Get the current user's profile (name, ID, coach status, etc.).

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

TDQS

A4/5.0
Behavior4/5

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

Since no annotations are provided, the description carries the full burden of behavioral disclosure. It usefully reveals that the tool returns only the current user's profile (not another user's), which is a scoping constraint. The verb 'Get' also implies a read-only operation, and with no parameters, there is minimal behavior to disclose. However, it does not explicitly state authentication requirements or error conditions, so it falls short of a 5.

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 a single concise sentence that immediately states the tool's purpose, followed by a brief parenthetical of examples. Every word is informative, and there is no redundancy or fluff. It is perfectly sized for the tool's simplicity.

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 that this is a zero-parameter getter with no output schema and no annotations, the description is reasonably complete. It explains what data is returned (name, ID, coach status, etc.) and scopes it to the current user. It could have described the return format in more detail, but for such a simple tool, the description is sufficient to guide an agent.

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 zero parameters, the baseline is 4. The description does not need to explain parameter meaning since there are none, and the schema coverage is 100% trivially. The parenthetical examples of profile fields add some semantic context to what the tool will return, which is helpful.

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 uses a specific verb ('Get'), identifies the resource ('current user's profile'), and gives concrete examples of the profile fields (name, ID, coach status). This clearly distinguishes it from sibling tools like get_team_info or get_recent_exercises, which target different resources.

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 provides no guidance on when to use this tool versus alternatives. It simply states what the tool does without context on appropriate use cases, exclusions, or prerequisites. There is no mention of scenarios where another tool would be more appropriate.

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

get_working_maxB

Get the current working max for a specific exercise.

Response: {value, hasReferenceMaxExercise, referenceMaxExercise}

ParametersJSON Schema
NameRequiredDescriptionDefault
exercise_idYes

TDQS

B3.4/5.0
Behavior3/5

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

The description discloses the return structure ({value, hasReferenceMaxExercise, referenceMaxExercise}), which adds behavioral insight beyond the empty annotations. However, it does not explain the meaning of these fields, nor does it mention whether the operation is read-only, has any side effects, or requires specific permissions.

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 extremely concise: two sentences. The first states the purpose, and the second gives the response shape. There is no fluff or redundant wording.

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

Completeness3/5

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

For a simple one-parameter getter, the description provides the core purpose and return format, which is helpful. However, it lacks usage context, parameter explanation, and any caveats about behavior. Given no annotations and no output schema, it is minimally viable but not fully complete.

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?

With 0% schema description coverage, the description should compensate by explaining the exercise_id parameter. It only says 'for a specific exercise,' which essentially restates the parameter name. It does not clarify what a working max is, how to find the exercise_id, or any 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 uses a specific verb ('Get') and resource ('current working max') with a clear scope ('for a specific exercise'). It clearly distinguishes this from sibling tools like get_personal_records or get_exercise_stats, which cover different concepts.

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 guidance is provided on when to use this tool versus alternatives. It does not mention any exclusions, prerequisites, or when a different tool would be more appropriate. The sibling tools are not referenced or contrasted.

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

get_workout_detailsA

Get workout details for a specific program workout: exercises, prescribed vs. logged sets, and coaching notes.

Pass the program_workout_id from get_workout_history. To ensure the correct team is used, also pass program_id (the program_id field from the get_workout_history item) — the server will resolve the matching team automatically. Alternatively, pass team_id directly. Falls back to the user's primary team if neither is given.

slim=True (the DEFAULT, and safe for small/local context windows) removes the duplicated saved_workout_set_exercises array, per-exercise media (tips/video_url), and the empty per-set param_N_* value slots. Each exercise is left with its title, abr (prescribed, e.g. "3 x 10 @ 60 lb"), abr_results (actual), and completed flags. Coaching/description text is kept but truncated to max_text_chars. The raw response can exceed 200k characters per session, so keep slim on unless you specifically need the full per-set logged values.

slim=False returns the full response (media fields still stripped). For the full per-set data of a SINGLE exercise without the whole session, use get_exercise_detail(program_workout_id, exercise_id) instead.

ParametersJSON Schema
NameRequiredDescriptionDefault
slimNo
team_idNo
cache_bustNo
program_idNo
max_text_charsNo
program_workout_idYes

TDQS

A4.9/5.0
Behavior5/5

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

With no annotations, the description carries the full burden and discloses substantial behavior: the response can exceed 200k characters, slim mode strips specific fields, media fields are always stripped, coaching text truncates to max_text_chars, and team resolution falls back to the user's primary team. It also explains server-side team resolution when program_id is provided. No contradictions exist.

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 organized into three purposeful paragraphs: overview, usage/team resolution, and slim-mode details with an alternative. Each sentence carries operational information—response size, defaults, fallbacks, and alternatives—so the length is justified 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.

Completeness5/5

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

For a 6-parameter tool with no output schema, the description is remarkably complete: it specifies input provenance, output contents and size, default behavior, truncation, and a targeted alternative. It also warns about a concrete risk (raw response >200k chars) that affects agent decisions. The only minor omission is cache_bust semantics, which does not substantially hurt usability.

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 covers 5 of 6 parameters: program_workout_id provenance, program_id/team_id relationship, slim behavior, and max_text_chars truncation. cache_bust is the only parameter left unexplained, but it is a minor boolean flag and all required/main parameters are given clear semantic context.

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: 'Get workout details for a specific program workout,' and enumerates the included content (exercises, prescribed vs. logged sets, coaching notes). It also distinguishes from sibling tools by tying to get_workout_history and directing single-exercise needs to get_exercise_detail.

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?

It explicitly instructs to pass the program_workout_id from get_workout_history, explains the trade-offs between program_id and team_id, and names get_exercise_detail as the alternative when only one exercise's per-set data is needed. It also tells when to use slim=True versus slim=False based on response size and context-window constraints.

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

get_workout_historyA

Get workout history for a date range.

Dates must be YYYY-MM-DD. If omitted, defaults to the last weeks_back weeks. Fetches one day at a time to guarantee the full day's data is returned.

By default (include_sets=False) each item is projected to a flat summary: id, workout_id, program_id, date, workout_title, feed_item_id, saved_workout_id, completed, workout_rating, rpe, notes. Use this for scanning history and finding sessions — it's intentionally small.

Set include_sets=True only when you need set-level exercise data AND you are querying a narrow range (1-3 days). For full set data on a single known session, prefer get_workout_details(program_workout_id, program_id) instead.

Set cache_bust=True to force a fresh API fetch for every day in the range, ignoring and overwriting any cached data regardless of TTL.

ParametersJSON Schema
NameRequiredDescriptionDefault
end_dateNo
cache_bustNo
start_dateNo
weeks_backNo
include_setsNo

TDQS

A5/5.0
Behavior5/5

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

With no annotations, the description fully discloses behavior: date format requirements, one-day-at-a-time fetching for completeness, the default projection, and cache_bust's side effect of 'ignoring and overwriting any cached data regardless of TTL.' This goes beyond a simple read operation and is essential 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 organized into clear paragraphs: overview, date/default behavior, default projection, usage guidance, and cache_bust. Each sentence adds necessary information without fluff, making it appropriately sized for the tool's 5 parameters and behavioral nuances.

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 lack of output schema and annotations, the description is remarkably complete. It explains the return format (flat summary with listed fields), covers all parameter semantics, provides usage boundaries, and presents alternatives. No critical information seems missing for this history-retrieval tool.

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

Parameters5/5

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

Schema coverage is 0%, so the description must compensate. It explains start/end date as a date range with YYYY-MM-DD format, weeks_back as the default fallback, include_sets as a boolean for set-level data with range restrictions, and cache_bust for forcing fresh fetches. All 5 parameters are given meaningful context.

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 'Get workout history for a date range' with a specific verb and resource. It distinguishes itself from siblings by positioning the flat summary as for 'scanning history and finding sessions' and explicitly recommending get_workout_details for single known sessions.

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?

It explicitly guides when to use the tool ('Use this for scanning history and finding sessions'), warns against include_sets=True for broad ranges, and directs users to get_workout_details for full set data on a single session. This meets the 'when/when-not/alternatives' criterion perfectly.

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

get_workout_leaderboardB

Get the leaderboard for a specific program workout.

Returns {workoutId, workoutTitle, date, tests, results, testStats, userResult}.

ParametersJSON Schema
NameRequiredDescriptionDefault
program_workout_idYes

TDQS

B3.1/5.0
Behavior3/5

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

With no annotations provided, the description carries the full burden of behavioral disclosure. It implicitly indicates a read operation through 'Get', and it does reveal the return structure ({workoutId, workoutTitle, date, tests, results, testStats, userResult}), which is useful. However, it does not explicitly state read-only safety, authentication needs, error behavior, or potential side effects.

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 extremely concise: two sentences, with the first stating the purpose and the second listing the return fields. Every word earns its place, and the most important information is front-loaded. There is no redundancy or filler.

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

Completeness3/5

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

Given the tool's low complexity (single parameter, no output schema) the description covers the basic purpose and return format. However, it omits any behavioral context such as whether filtering or ordering is available, whether the original workout ID is required, or any error conditions. It is minimally complete but leaves gaps that could be filled with a bit more context.

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?

The schema has one parameter (program_workout_id) with zero description coverage, and the tool description adds little beyond 'a specific program workout'. The parameter name is self-explanatory, but the description does not explain how to obtain the ID, any constraints (e.g., integer range), or the meaning of the ID in context, so it fails to compensate for the low schema coverage.

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: 'Get the leaderboard for a specific program workout.' It clearly identifies the tool's function and distinguishes it from sibling tools like get_user_profile or get_team_info, though it does not explicitly discuss alternatives or differentiators within the description itself.

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 provides no guidance on when to use this tool versus alternatives, no prerequisites, and no context about how the leaderboard might be accessed in a workflow. There is no mention of exclusions or when-not conditions, leaving the agent without direction on appropriate usage.

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

get_workout_messagesA

Get the messaging stream and all comments for a workout.

Returns {stream: {id, title, lastActivity, ...}, comments: [...]} where each comment has content, authorName, replies, and reactions.

ParametersJSON Schema
NameRequiredDescriptionDefault
team_idNo
program_workout_idYes

TDQS

A3.8/5.0
Behavior4/5

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

No annotations are provided, so the description carries the full burden. It discloses the return structure in detail: '{stream: {id, title, lastActivity, ...}, comments: [...]} where each comment has content, authorName, replies, and reactions.' This goes beyond the schema and sets clear expectations for the output, though it does not explicitly state read-only behavior or mention errors or edge cases.

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 two sentences, front-loaded with the main purpose, and includes a useful output schema sketch. Every sentence earns its place with no redundant fluff.

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

Completeness3/5

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

The description is complete enough for a simple get tool, but it misses important context: no explanation of the optional team_id parameter, no mention of ordering or pagination for comments, and no usage guidance. Given the tool has two parameters and no output schema, the description could do more to fully prepare an agent.

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%, so the description must compensate, but it does not mention parameters at all. The schema alone provides property names and types, but the description adds no semantic value about how to use team_id or program_workout_id. This leaves the agent to infer from the tool name and schema titles.

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 'Get the messaging stream and all comments for a workout' with a specific verb and resource. It distinguishes itself from sibling tools like get_workout_details, get_workout_history, and get_workout_leaderboard by focusing specifically on messages and comments.

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 when to use the tool (when messaging stream and comments are needed) but provides no explicit guidance on when-not-to-use or alternatives. There is no comparison to siblings or mention of prerequisites, so the usage context is only implied.

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

get_workout_surveysA

Get pre/post workout surveys for one or more saved workout IDs.

Returns a map of savedWorkoutId → survey data with Sleep, Mood, Energy, Soreness, Stress questions.

ParametersJSON Schema
NameRequiredDescriptionDefault
saved_workout_idsYes

TDQS

A4/5.0
Behavior3/5

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

With no annotations provided, the description carries the full burden of behavioral disclosure. It does reveal that the return is a map of ID to survey data containing specific question types, which is useful. However, it does not mention any side effects, permissions, error behavior, or whether it is read-only, leaving some uncertainty.

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 two compact sentences, front-loaded with the main action and return structure. Every word adds value, no redundancy or irrelevant details.

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 simple retrieval tool with one parameter and no output schema, the description covers the input, the output structure, and the data fields. It doesn't specify behavior for invalid IDs or limits, but this is a minor gap given the simplicity.

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?

The input schema only defines a field name and type with no description, giving 0% schema coverage. The description compensates by explaining the parameter is for saved workout IDs and how they map to the returned survey data. It adds clear semantic meaning beyond the raw schema.

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 retrieves pre/post workout surveys for specific saved workout IDs. It uses a specific verb 'Get' and a specific resource 'workout surveys', distinguishing it from sibling tools that handle messages, leaderboards, or history.

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 usage when survey data is needed for known workout IDs, but does not explicitly mention alternatives or exclusion criteria. For example, it doesn't distinguish itself from get_workout_details or get_workout_messages, though the resource is different. This is implied usage 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.

log_workoutB

Save/log a completed workout with results.

saved_workout_id: from create_personal_session or get_workout_details. workout_id: the workout's workoutId. date_string: YYYY-MM-DD date of the session. blocks: list of block/set IDs that were completed. rpe: Rate of Perceived Exertion (1-10). workout_rating: numeric rating as string e.g. "8.0".

ParametersJSON Schema
NameRequiredDescriptionDefault
rpeNo
notesNo
blocksYes
workout_idYes
date_stringYes
workout_ratingNo
saved_workout_idYes
is_personal_calendarNo

TDQS

B3.4/5.0
Behavior2/5

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

No annotations exist, so the description must disclose behavioral traits. It only states the basic action and says nothing about side effects, persistence, idempotency, or side effects of logging. This is insufficient for a mutation tool.

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 brief, front-loaded with the purpose, and then efficiently lists parameters in a structured way. No filler or redundancy.

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

Completeness2/5

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

With 8 parameters, no output schema, and no annotations, the description only partially completes the picture. It lacks usage context, return behavior, and potential side effects. Missing parameter explanations and no guidance on response format make it incomplete for an agent to fully trust.

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 has zero descriptions, so the description compensates by explaining 6 of 8 parameters with clear meanings. However it omits notes and is_personal_calendar, leaving a gap. Still, the provided explanations add real value.

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?

Description clearly states 'Save/log a completed workout with results' – a specific verb and resource, distinguishing it from planning/session-creation tools. It directly conveys the tool's core function without ambiguity.

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 on when to use this vs alternatives. The only hint is that saved_workout_id comes from create_personal_session or get_workout_details, implying a dependency, but no when/when-not or alternative comparisons are provided.

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

submit_surveyA

Submit a readiness/recovery survey answer for a workout.

Question IDs: 8=Sleep, 9=Mood, 10=Energy, 11=Soreness, 12=Stress Answer IDs: 1=Awful/VeryPoor, 2=Poor, 3=Ok, 4=Good, 5=Excellent

ParametersJSON Schema
NameRequiredDescriptionDefault
answer_idYes
question_idYes
saved_workout_idYes

TDQS

A3.9/5.0
Behavior2/5

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

No annotations are provided, so the description carries the full burden of behavioral disclosure. It only states 'Submit...' without detailing permissions, idempotency, side effects (e.g., whether an existing answer is overwritten), or the relationship between saved_workout_id and the survey. The provided ID mappings are helpful but do not address behavioral traits.

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 concise and front-loaded, with the primary action in the first sentence. The subsequent lines list ID mappings, which are essential and clearly structured. No filler or redundant information.

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

Completeness3/5

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

The description covers the core purpose and parameter meanings but lacks important context: no mention of return values (no output schema), no preconditions (e.g., workout must exist), and no usage guidance. For a simple submission tool, it is functional but leaves gaps that could confuse an agent.

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 description coverage, the description must explain parameters. It maps question_id to specific survey questions (8=Sleep, etc.) and answer_id to rating labels (1=Awful...5=Excellent), which directly adds meaning. However, it doesn't explain saved_workout_id beyond implying it's a workout identifier, leaving that parameter underspecified.

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 action: 'Submit a readiness/recovery survey answer for a workout.' It specifies the verb (submit), resource (survey answer), and context (for a workout). This distinguishes it from sibling tools like get_workout_surveys (which retrieves surveys) and log_workout (which logs workouts).

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 implies when to use the tool: when submitting a survey answer for a workout. It provides clear context but does not explicitly mention alternatives or exclusions. For instance, it doesn't say to use get_workout_surveys to read existing answers. This is valid but slightly lacking in explicit guidance.

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. 20 tool updatesv0.1.0
    • First observedadd_exercises_to_session
    • First observedcreate_personal_session
    • First observeddelete_session
    • First observedget_circuit_library
    • First observedget_exercise_detail
    • First observedget_exercise_library
    • First observedget_exercise_stats
    • First observedget_personal_records
    • First observedget_recent_circuits
    • First observedget_recent_exercises
    • First observedget_team_info
    • First observedget_user_profile
    • First observedget_working_max
    • First observedget_workout_details
    • First observedget_workout_history
    • First observedget_workout_leaderboard
    • First observedget_workout_messages
    • First observedget_workout_surveys
    • First observedlog_workout
    • First observedsubmit_survey

TDQS

A3.6/5.0

Scored across 20 tools

Disambiguation4/5

Most tools target distinct resource+action pairs. A few exercise performance tools (get_exercise_stats, get_personal_records, get_working_max) overlap in information returned, but descriptions clarify their specific scopes. Overall, agents can reliably select the right tool.

Naming Consistency4/5

Tool names mostly follow a verb_noun pattern with get_ prefix for reads and action verbs for mutations. A minor inconsistency exists between 'session' and 'workout' terminology (create_personal_session vs log_workout), and some nouns are singular vs plural, but the pattern is predictable and consistent in style.

Tool Count4/5

20 tools is on the heavier side but each covers a distinct aspect of the training domain: user/team info, session management, workout logging, surveys, messaging, leaderboards, and exercise data. No tool feels redundant, though the count could be trimmed by merging some exercise stat tools.

Completeness3/5

Core session lifecycle (create, add exercises, log, delete) is covered, along with history, details, surveys, and leaderboards. Notable gaps include no update/remove exercises from a session, no upcoming workout schedule, and circuits cannot be added to sessions despite having a library. These are working gaps agents may need to work around.

Maintenance

ActivityStale
ResponsivenessNo issues

Related MCP Connectors

Related MCP Servers

  • A
    license
    Not graded
    quality
    B
    maintenance
    Provides raw Garmin Connect data access for training analysis, enabling retrieval of activity summaries, lap data, time-series streams, comments with lactate, wellness metrics, and personal records through an MCP interface.
    MIT
  • F
    license
    Not graded
    quality
    B
    maintenance
    Enables agents to track workouts, body metrics, and training stats for registered users through a JSON-RPC MCP endpoint, with scoped agent permissions and a web dashboard.
    -
  • A
    license
    Not graded
    quality
    B
    maintenance
    Enables MCP hosts to read Garmin training data and write structured workouts to a calendar, with tools for listing activities, summarizing training, computing athlete zones, building and scheduling workout plans, syncing data, and checking cache status.
    1
    MIT