Skip to main content
Glama
nitinchakravarthy

Workout Tracker MCP Server

Workout Tracker MCP Server

A comprehensive Model Context Protocol (MCP) server for workout tracking with DynamoDB persistence and Exercise Database integration. Built with FastMCP.

Features

  • 12 MCP Tools: Workout logging, volume calculation, DynamoDB operations, Exercise DB integration

  • 2 MCP Prompts: AI-powered workout plan generation and formatting

  • 1 MCP Resource: Exercise list

  • DynamoDB Integration: Persistent storage for workout plans with single-table design

  • Exercise Database: 1500+ exercises with search, filtering, and detailed information

  • Dual Transport: stdio (local) and HTTP/SSE (production) modes


Related MCP server: fitness-agent-mcp

Prerequisites

Before you begin, ensure you have:

  • Python 3.12+ (Python 3.14 recommended)

  • AWS Account with IAM credentials (Access Key ID and Secret Access Key)

  • AWS CDK (for infrastructure deployment) - Install with: npm install -g aws-cdk

  • Terminal/Command Line


Infrastructure Setup (One-Time)

⚠️ IMPORTANT: You must deploy the DynamoDB infrastructure to your AWS account before using this MCP server.

# Navigate to infrastructure directory
cd infrastructure

# Install CDK dependencies
npm install

# Bootstrap CDK in your AWS account (first time only)
cdk bootstrap

# Deploy the DynamoDB table
cdk deploy

This will create:

  • DynamoDB table: WorkoutPlans

  • Global Secondary Indexes: GSI1 (Status), GSI2 (Exercise History)

  • Point-in-time recovery enabled

  • Billing mode: Pay-per-request

Option 2: Using the Bash Script

./scripts/create_dynamodb_table.sh

Verify Table Creation

aws dynamodb describe-table --table-name WorkoutPlans --region us-west-2

Quick Start (2 Minutes)

1. Install & Setup

Run the automated setup script:

./setup.sh

During setup, you will be prompted to enter:

  • Your AWS Access Key ID

  • Your AWS Secret Access Key

  • AWS Region (default: us-west-2)

The script will:

  • ✅ Install uv package manager (if needed)

  • ✅ Detect Python 3.12+

  • ✅ Create virtual environment

  • ✅ Install all dependencies

  • ✅ Prompt for AWS credentials and save them to ~/.bashrc or ~/.zshrc

  • ✅ Verify DynamoDB access

Note: After setup, restart your terminal or run source ~/.bashrc (or ~/.zshrc) for AWS credentials to be available system-wide.

3. Start the Server

Local mode (stdio - for Claude Desktop, Claude Code):

uv run main.py

Production mode (HTTP/SSE):

uv run main.py --http

Server will be available at http://localhost:8000/sse


Connect to MCP Clients

Option 1: Claude Desktop

Config file location:

  • macOS: ~/Library/Application Support/Claude/claude_desktop_config.json

  • Windows: %APPDATA%\Claude\claude_desktop_config.json

  • Linux: ~/.config/Claude/claude_desktop_config.json

Add to config:

{
  "mcpServers": {
    "workout-tracker": {
      "command": "uv",
      "args": [
        "run",
        "--directory",
        "/absolute/path/to/workout_tracker_mcp",
        "main.py"
      ]
    }
  }
}

Important:

  • Replace /absolute/path/to/workout_tracker_mcp with your actual path

  • AWS credentials are automatically configured by setup.sh

  • Restart Claude Desktop after saving

Option 2: Claude Code

The MCP server is already configured in .mcp.json. AWS credentials are automatically configured after running ./setup.sh.

Option 3: MCP Inspector (Testing)

npx @modelcontextprotocol/inspector uv run main.py

Opens interactive web UI at http://localhost:5173


Test Queries for MCP Clients

Once connected to Claude Desktop or Claude Code, try these queries:

1. Basic Workout Logging

Log a workout: Bench Press, 3 sets of 8 reps
Calculate volume for: 185 lbs, 4 sets, 10 reps
Search for push exercises
Find all chest exercises using a barbell
List exercises that target the quadriceps
Show me all bodyweight exercises for legs
What body parts can I train?

3. Workout Plan Generation

Create a 12-week strength training program for an intermediate lifter who trains 4 days per week
Generate a 6-week beginner workout plan focused on hypertrophy with 3 training days per week,
using only dumbbells, for a 28-year-old male

4. DynamoDB Operations

Save a generated plan:

Save the workout plan you just generated for user_123

Retrieve a saved plan:

Get the workout plan for user_123 with plan_id abc-123-def

Format for client:

Format this workout plan in a clean, printable format for my client

5. Exercise Details

Get detailed information about exercise ID "VPPtusI"
Show me exercise instructions for barbell squats

Available MCP Components

Tools (12)

Workout Tracking (2):

  • log_workout(exercise, sets, reps) - Log a workout session

  • calculate_volume(weight, sets, reps) - Calculate total volume

DynamoDB Operations (3):

  • save_workout_plan_to_dynamodb(workout_plan_json, user_id, ...) - Save workout plan

  • get_workout_plan_from_dynamodb(user_id, plan_id, ...) - Retrieve workout plan

  • log_workout_session_to_dynamodb(workout_log_json, user_id, ...) - Log workout execution

Exercise Database (7):

  • get_all_exercises(limit, offset) - List all exercises (paginated)

  • search_exercises(query, limit, offset, threshold) - Search exercises by name

  • get_exercise_by_id(exercise_id) - Get exercise details

  • get_exercises_by_body_part(body_part, limit, offset) - Filter by body part

  • get_exercises_by_target_muscle(target, limit, offset) - Filter by muscle

  • get_exercises_by_equipment(equipment, limit, offset) - Filter by equipment

  • list_body_parts() - List all body parts

  • list_target_muscles() - List all target muscles

  • list_equipment() - List all equipment types

Prompts (2)

  • workout_plan_prompt() - Generate comprehensive workout plans with 10 parameters

    • Parameters: goal, experience_level, training_frequency, session_duration_min, equipment_available, age, gender, current_maxes, injuries_limitations, program_duration_weeks

    • Returns: Structured JSON for DynamoDB storage

  • format_workout_plan() - Transform DynamoDB JSON to client-friendly format

    • Parameters: workout_plan_json

    • Returns: Beautiful markdown document

Resources (1)

  • workout://exercises/list - Static list of 8 basic exercises


Running Tests

End-to-End DynamoDB Test

uv run python tests/test_dynamodb_fetch.py

What it tests:

  • ✅ Saves workout plan to DynamoDB

  • ✅ Fetches plan from DynamoDB

  • ✅ Verifies data integrity

  • ✅ Cleans up test data

Expected output:

✅ SUCCESS - All verifications passed!
  ✓ Saved 27 entities to DynamoDB
  ✓ Fetched complete workout plan
  ✓ Verified 6 weeks

Exercise DB API Test

uv run python examples/test_api_slow.py

What it tests:

  • ✅ Exercise listing

  • ✅ Exercise search

  • ✅ Exercise details

  • ✅ Body part listing


Project Structure

workout_tracker_mcp/
├── main.py                          # MCP server (12 tools, 2 prompts, 1 resource)
├── setup.sh                         # Automated setup script
├── .mcp.json                        # MCP client configuration
├── ARCHITECTURE.md                  # System architecture documentation
│
├── src/                             # Source modules
│   ├── db/
│   │   └── dynamodb_client.py      # DynamoDB integration
│   └── client/
│       ├── mcp_client.py           # MCP client wrapper
│       └── mcp_client_tools.py     # MCP client helpers
│
├── src/prompts/                         # Prompt templates
│   ├── workout_plan_prompt_template.py    # Plan generation
│   └── format_workout_plan_prompt.py      # Plan formatting
│
├── docs/                            # Documentation
│   ├── DYNAMODB_DATA_MODEL.md      # Schema reference
│   ├── DYNAMODB_INTEGRATION.md     # Integration guide
│   ├── DYNAMODB_SETUP.md           # Table setup
│   └── ...
│
├── infrastructure/                  # Infrastructure as Code
│   └── dynamodb_stack.py           # AWS CDK stack
│
├── scripts/                         # Utility scripts
│   ├── create_dynamodb_table.sh    # DynamoDB table creation
│   └── ...
│
├── tests/                           # Test suite
│   ├── test_dynamodb_fetch.py      # DynamoDB integration test
│   └── ...
│
└── examples/                        # Usage examples
    ├── save_workout_plan_example.py    # DynamoDB save
    ├── test_api_slow.py                # Exercise DB test
    └── mcp_client_usage.py             # MCP client example

Configuration

Environment Variables

AWS Configuration: Automatically configured by ./setup.sh (saved to ~/.bashrc or ~/.zshrc).

Server Configuration (optional):

export MCP_HOST="0.0.0.0"           # Default: 0.0.0.0
export MCP_PORT="8000"              # Default: 8000
export MCP_TRANSPORT="stdio"        # Default: stdio (or "http")

DynamoDB Table Setup

Option 1: Using the script (Quick)

./scripts/create_dynamodb_table.sh

Option 2: Using AWS CDK

cd infrastructure
cdk deploy

Table Details:

  • Name: WorkoutPlans

  • Region: us-west-2

  • Billing: On-demand

  • Indexes: 2 GSIs (status, exercise history)


Deployment

Docker

# Build image
docker build -t workout-tracker-mcp .

# Run with environment variables
docker run -p 8000:8000 \
  -e AWS_ACCESS_KEY_ID="your_key" \
  -e AWS_SECRET_ACCESS_KEY="your_secret" \
  -e AWS_DEFAULT_REGION="us-west-2" \
  workout-tracker-mcp

Google Cloud Run

# Deploy (will prompt for region)
gcloud run deploy workout-tracker \
  --source . \
  --platform managed \
  --allow-unauthenticated \
  --set-env-vars AWS_ACCESS_KEY_ID=your_key,AWS_SECRET_ACCESS_KEY=your_secret

Troubleshooting

Server Won't Start

Check Python version:

python --version  # Should be 3.12+

Reinstall dependencies:

uv sync --reinstall

AWS Credentials Issues

If AWS credentials are missing or not working:

  1. Re-run setup:

    ./setup.sh
  2. Restart terminal:

    source ~/.bashrc  # or ~/.zshrc
  3. Verify credentials:

    aws sts get-caller-identity

Claude Desktop Can't Connect

  1. Use absolute paths in config (not relative ~ or ./)

  2. Restart Claude Desktop after config changes

  3. Check logs: Help > View Logs in Claude Desktop

  4. Test server manually: uv run main.py should start without errors

DynamoDB Table Not Found

# Check if table exists
aws dynamodb describe-table --table-name WorkoutPlans --region us-west-2

# Create table if missing
./scripts/create_dynamodb_table.sh

Example Workflows

Complete Workout Plan Creation

1. "Search for compound leg exercises"
2. "Create a 12-week strength program for intermediate lifter, 4 days/week"
3. "Save this plan for user_john_doe"
4. "Format the plan for my client to print"

Exercise Discovery

1. "What body parts can I train?"
2. "Show me all chest exercises"
3. "Filter chest exercises that use dumbbells"
4. "Get detailed instructions for dumbbell bench press"

Resources


License

MIT License

Support

Available Tools

14 tools
calculate_volumeA
Calculate total workout volume (weight x sets x reps)

Args:
    weight: Weight used in pounds or kilograms
    sets: Number of sets
    reps: Number of repetitions per set

Returns:
    Dictionary with volume calculation details
ParametersJSON Schema
NameRequiredDescriptionDefault
repsYes
setsYes
weightYes

TDQS

A3.9/5.0
Behavior3/5

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

No annotations are present, so the description carries the full burden. It discloses the multiplication formula and that the return is a dictionary with volume details, but it does not mention unit handling, input validation, or the exact structure of the returned dictionary.

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 formula and organized into Args and Returns sections with no wasted words. Every sentence adds necessary 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?

For a simple calculator, the inputs and general return type are covered, but the return dictionary's keys and units remain unspecified. Since there is no output schema, this leaves the agent uncertain about the exact result shape.

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%, but the description compensates by explaining the meaning of each parameter and noting that weight can be in pounds or kilograms. It does not specify constraints like positive numbers or explain the output units, so it is not fully comprehensive.

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: 'Calculate total workout volume' with the exact formula (weight x sets x reps). This clearly distinguishes it from the sibling tools, which all deal with logging, retrieving, or listing workout data.

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?

No explicit when-to-use or when-not-to-use guidance is provided. Context implies it is a standalone calculator that would be used before logging a workout, but the description offers no alternatives or exclusions.

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

get_all_exercisesA
Get a list of all exercises with pagination.

Args:
    limit: Maximum number of exercises to return (default: 20, max: 100)
    offset: Number of exercises to skip (default: 0)

Returns:
    A formatted string containing exercise information including name, body parts,
    target muscles, equipment, and instructions.
ParametersJSON Schema
NameRequiredDescriptionDefault
limitNo
offsetNo

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.1/5.0
Behavior4/5

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

No annotations are supplied, so the description carries the full burden of behavioral disclosure. It clearly states that the tool returns a formatted string containing name, body parts, target muscles, equipment, and instructions, and it documents pagination via limit/offset. It does not cover ordering or error behavior, but 'get' implies a read-only operation and the return contract is explicit.

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 compact, with a one-sentence summary followed by clearly labeled Args and Returns sections. Every sentence provides actionable information with no repetition 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 paginated list with zero required parameters and an existing output schema, the description is nearly complete: it documents both parameters, defaults, and the return format. The main gap is the lack of ordering details needed for stable pagination, but this does not prevent a basic correct invocation.

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 description coverage is 0%, so the description must document the parameters, and it does effectively. It explains that limit is the maximum number of exercises (default 20, max 100) and offset is the number to skip (default 0), adding meaning not present in the input schema. Both arguments are fully specified.

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 opening sentence 'Get a list of all exercises with pagination' states a concrete verb, resource, and scope, which can be distinguished from filtered siblings such as get_exercises_by_body_part or search_exercises. However, it does not explicitly name or contrast any sibling, so it stops short of the strongest differentiation.

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 does not state when to prefer this tool over the numerous filtered alternatives, nor does it name any alternative. Use is only implied by the word 'all' in the first sentence. No explicit exclusions or prerequisites are provided.

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

get_exercise_by_idA
Get detailed information about a specific exercise by its ID.

Args:
    exercise_id: The unique identifier of the exercise

Returns:
    Detailed exercise information including name, body parts, target muscles,
    equipment, instructions, and GIF URL.
ParametersJSON Schema
NameRequiredDescriptionDefault
exercise_idYes

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4/5.0
Behavior3/5

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

With no annotations, the description carries the full burden of behavioral disclosure. It makes the read-only nature clear through 'Get' and lists the returned fields, but it does not describe behavior for invalid or missing IDs, authentication requirements, or other 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 compact and front-loaded with the core purpose, followed by minimal Args and Returns sections. Every sentence contributes useful information with no fluff or repetition of the schema fields.

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 single-parameter lookup where the return shape is covered by an output schema, the description is mostly complete. It could add a note about not-found behavior or point to search_exercises when an ID isn't available, but the core invocation path is fully specified.

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 Args section must compensate. It defines exercise_id as 'the unique identifier of the exercise,' which is sufficient for an agent to understand that this parameter selects the specific record to return.

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 action ('Get detailed information') and the exact target resource ('a specific exercise by its ID'). This singular-lookup framing distinguishes it from sibling tools like get_all_exercises and the get_exercises_by_* collection tools.

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 'by its ID' implies this tool should be used when an exercise_id is already known. However, there is no explicit guidance about when to prefer it over search_exercises or get_all_exercises, and no mention of when not to use it.

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

get_exercises_by_body_partA
Get exercises targeting a specific body part.

Args:
    body_part: Body part to filter by (e.g., 'chest', 'back', 'legs', 'shoulders', 'arms')
    limit: Maximum number of exercises to return (default: 20, max: 100)
    offset: Number of exercises to skip (default: 0)

Returns:
    List of exercises for the specified body part.
ParametersJSON Schema
NameRequiredDescriptionDefault
limitNo
offsetNo
body_partYes

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A3.9/5.0
Behavior3/5

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

With no annotations provided, the description bears the full burden and does add genuine behavioral context: 'Get' signals a read operation, and the Args section discloses pagination semantics (limit default 20 and max 100, offset default 0 to skip), which go beyond the schema's bare defaults. However, it does not disclose edge-case behavior such as handling of an unknown body part, empty result sets, or case sensitivity, which are the remaining behavioral unknowns.

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 compact docstring: a one-line front-loaded summary, three tightly written per-parameter lines, and a Returns line. Every sentence earns its place with no repetition of schema structure or filler, making it quick for an agent to scan.

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 3-parameter retrieval tool with an output schema, the description covers purpose, all parameters with constraints and examples, and the return shape, which is largely sufficient. The notable gap is contextual routing among the many similar sibling read tools and the lack of error/edge-behavior details; an agent facing overlapping alternatives like search_exercises or get_exercises_by_equipment gets no disambiguation help.

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: body_part gets concrete examples beyond the schema's bare type, limit gets both default and the cap of 100 (not present in the schema), and offset is explained as 'Number of exercises to skip.' Each argument is meaningfully enriched, though body_part validity rules remain only illustrative rather than exhaustive.

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 pair, 'Get exercises targeting a specific body part,' which precisely names the action, object, and filter scope. The body-part examples ('chest', 'back', 'legs') plus the named filter distinguish it from sibling read tools like get_exercises_by_equipment, get_exercises_by_target_muscle, and get_all_exercises 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 Guidelines3/5

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

The intended use — retrieving exercises filtered by a body part — is clearly implied by the summary and the body_part argument. However, there is no explicit when-to-use versus when-not-to-use guidance, and with six-plus overlapping read siblings (by equipment, by target muscle, by id, search, all), no alternatives are named or contrasted.

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

get_exercises_by_equipmentA
Get exercises that use specific equipment.

Args:
    equipment: Equipment to filter by (e.g., 'barbell', 'dumbbell', 'cable', 'body weight')
    limit: Maximum number of exercises to return (default: 20, max: 100)
    offset: Number of exercises to skip (default: 0)

Returns:
    List of exercises using the specified equipment.
ParametersJSON Schema
NameRequiredDescriptionDefault
limitNo
offsetNo
equipmentYes

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.3/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 burden of behavioral disclosure. It does state that the tool returns a list of exercises and documents pagination behavior via limit and offset, which is useful. However, it does not mention read-only status, sorting, default ordering, error handling, or behavior when no exercises match, so the behavioral picture is only partially complete.

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 compact and well-structured: a one-sentence summary followed by a clear Args section and a Returns line. Every line contributes necessary information, with no filler or repetition of the schema's redundant title fields.

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?

All parameters are documented with defaults and examples, and an output schema exists so return structure is already defined. The only minor gap is not mentioning that valid equipment values could be obtained from the sibling list_equipment tool, and not specifying whether equipment matching is exact or substring-based, but overall the description is complete enough for correct invocation.

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 description coverage is 0%, but the description compensates fully: equipment gets concrete examples, limit gets its default and maximum, and offset gets its default. This adds real meaning beyond the bare schema definitions, so an agent knows exactly what values are expected.

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 opening line 'Get exercises that use specific equipment' precisely states the verb, resource, and filtering criterion. This clearly distinguishes the tool from siblings like get_exercises_by_body_part and get_exercises_by_target_muscle, and the equipment examples make the scope immediately understandable.

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 makes the intended use obvious: call this when you need exercises filtered by equipment. It does not explicitly mention alternatives or exclusions, such as 'for keyword search use search_exercises', so it misses the full when-versus-alternatives guidance, but the context is clear enough for an agent to choose correctly.

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

get_exercises_by_target_muscleA
Get exercises targeting a specific muscle.

Args:
    target: Target muscle to filter by (e.g., 'biceps', 'triceps', 'quads', 'hamstrings')
    limit: Maximum number of exercises to return (default: 20, max: 100)
    offset: Number of exercises to skip (default: 0)

Returns:
    List of exercises targeting the specified muscle.
ParametersJSON Schema
NameRequiredDescriptionDefault
limitNo
offsetNo
targetYes

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A3.9/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 behavioral disclosure burden. It does disclose pagination behavior via limit/offset defaults and the maximum limit, and states the return type. It does not mention ordering, empty-result behavior, exact-match semantics, or invalid target handling, leaving some gaps.

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 compact and well-structured with Args and Returns sections. Every sentence adds information, and the core purpose is front-loaded without any 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 filtered read tool with three parameters, the description covers the required parameter, optional pagination, and return shape. With an output schema available, deeper return details are unnecessary; it could add only minor context like valid muscle sources or invalid-target behavior.

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?

The schema provides 0% description coverage, but the Args section fully compensates. It gives concrete muscle examples for target, default and maximum for limit, and default for offset, enabling an agent to populate all parameters correctly.

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 opens with a clear verb and resource: 'Get exercises targeting a specific muscle.' The phrase 'specific muscle' distinguishes it from sibling tools like get_exercises_by_body_part and get_exercises_by_equipment, though it does not explicitly name those alternatives.

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?

Usage is implied by the tool name and first sentence: use this when filtering exercises by target muscle. However, there is no explicit guidance about when to prefer this over search_exercises, get_all_exercises, or the body-part/equipment variants.

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

get_workout_plan_from_dynamodbA
Retrieve a complete workout plan from DynamoDB

Fetches the entire workout plan structure including:
- Plan metadata (name, goal, duration, status, etc.)
- All weeks in the program
- All workout sessions for each week
- All exercises for each workout session

Args:
    user_id: User ID who owns the plan
    plan_id: Unique plan identifier
    table_name: DynamoDB table name (default: WorkoutPlans)
    region: AWS region (default: us-west-2)

Returns:
    Dictionary containing the complete workout plan with plan_metadata and weeks,
    or error information if the plan is not found or retrieval fails

Example:
    result = get_workout_plan_from_dynamodb(
        user_id="user_123",
        plan_id="plan_abc123"
    )
ParametersJSON Schema
NameRequiredDescriptionDefault
regionNous-west-2
plan_idYes
user_idYes
table_nameNoWorkoutPlans

TDQS

A4.6/5.0
Behavior4/5

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

With no annotations, the description carries the full burden and does well by explaining the full return structure, including plan_metadata and weeks, and by stating that error information is returned when the plan is not found or retrieval fails. It could additionally note that the operation is read-only, but the verb 'retrieve' and the detailed behavior make the tool's effect clear.

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 well-structured with a concise summary, bulleted return contents, a parameter list, a returns explanation, and an example. Every section adds useful information without unnecessary verbosity.

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 there is no output schema and no annotations, the description is remarkably complete: it defines purpose, expected payload structure, all parameters with defaults, return behavior, error handling, and a usage example. An agent has enough information to select and invoke the tool correctly.

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?

The input schema has 0% description coverage, so the description must compensate, and it does. It explains user_id as the plan owner, plan_id as the unique identifier, table_name with its default, and region with its default, plus it provides a concrete example using the required 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 begins with a specific verb and resource: 'Retrieve a complete workout plan from DynamoDB.' It then enumerates exactly what is fetched (metadata, weeks, sessions, exercises), which clearly distinguishes it from sibling tools like log_workout or save_workout_plan_to_dynamodb.

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 clearly states the context for use: when a complete workout plan needs to be retrieved from DynamoDB. It does not explicitly name alternatives or state when not to use the tool, but the context is straightforward and the sibling tool for saving is easy to distinguish.

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

list_body_partsB
Get a list of all available body parts in the database.

Returns:
    Comma-separated list of body parts that can be used for filtering.
ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

B3.4/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 behavioral burden. It does disclose the return format ('Comma-separated list'), which is genuinely useful behavioral context beyond the tool name. However, it doesn't explicitly confirm read-only/non-destructive behavior, auth needs, ordering, or failure modes; the read-only nature is only implied by 'Get.'

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 with zero filler. The first sentence front-loads the purpose with a clear verb and resource; the second is a labeled 'Returns:' section that adds the key output detail. Every sentence 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?

For a zero-parameter tool, the description covers the core action and return shape, and an output schema exists to fill in return-value structure. However, it leaves gaps: no differentiation from list_target_muscles, no explicit safety confirmation, and minimal usage context. Adequate but with clear open questions for the 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?

The tool has zero parameters, so the empty input schema cannot carry meaning and the description isn't required to document parameters. Instead, it adds value by explaining the output semantics: a comma-separated list meant for 'filtering,' which the schema cannot convey. This matches the 0-params baseline of 4.

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 a list of all available body parts in the database.' This clearly distinguishes the tool from data-retrieval siblings like get_exercises_by_body_part and list_equipment. However, it does not explicitly disambiguate from the closely related sibling list_target_muscles, so it falls short of full sibling differentiation.

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 offers no explicit when-to-use guidance or alternatives. The only hint is 'can be used for filtering,' which implies the output feeds downstream filter parameters, but it doesn't tell the agent when to choose this tool over list_target_muscles or any of the other 13 siblings.

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

list_equipmentA
Get a list of all available equipment types in the database.

Returns:
    Comma-separated list of equipment types that can be used for filtering.
ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A3.7/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 behavioral disclosure burden. It does disclose the return format ('comma-separated list') and scope ('all available ... in the database'), which is helpful. It does not mention ordering, empty results, or dynamic/cached behavior, but for a simple read-only list tool this is a reasonable level of transparency.

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 compact and well structured: one sentence states the core purpose, and a second sentence describes the return format and intended use. Every word earns its place, and the most important information 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?

For a zero-parameter list tool with an output schema, the description is nearly complete: it tells the agent what is returned, in what format, and for what purpose. It is missing only a small amount of contextual guidance about sibling tools, but nothing essential is needed to invoke the tool 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?

The input schema has zero parameters, so there is nothing for the description to explain at the parameter level. The baseline of 4 applies for a zero-parameter tool, and the note about filtering adds useful context about why the returned values matter.

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 clear action and resource: retrieve all equipment types in the database. It is not a tautology and clearly identifies the subject matter, though it does not explicitly distinguish itself from sibling list tools like list_body_parts or list_target_muscles beyond the resource name.

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 'can be used for filtering' provides implied usage context: an agent should call this when it needs equipment filter options. However, there is no explicit guidance about when to prefer this over related siblings such as get_exercises_by_equipment, and no alternative tools are named.

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

list_target_musclesA
Get a list of all available target muscles in the database.

Returns:
    Comma-separated list of target muscles that can be used for filtering.
ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.3/5.0
Behavior4/5

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

No annotations are present, so the description carries the behavioral disclosure burden. It discloses the return format ('comma-separated list'), the data source ('database'), and the intended use ('for filtering'). For a zero-parameter read-only list tool, this is sufficiently transparent; it omits nothing critical.

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 short sentences with the core action front-loaded. The return format is given in a clear, structured way, and every sentence adds useful information without repeating the schema.

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 simple, zero-parameter listing tool with an output schema, the description is complete. It states what the tool returns, how the values are formatted, and their intended use. Nothing needed to invoke the tool correctly 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?

The tool has zero parameters, so the schema fully covers all input concerns. The 0-parameter baseline is 4, and the description does not need to provide parameter-level detail. It also adds context that the returned values are meant for filtering.

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 ('Get a list'), the resource ('target muscles'), and the scope ('all available ... in the database'). The resource is specific enough to distinguish it from sibling list tools like list_body_parts and list_equipment.

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 'can be used for filtering' implies the tool is useful when an agent needs valid target-muscle filter values, likely before calling get_exercises_by_target_muscle. However, it does not explicitly state when to prefer this tool over alternatives or mention any exclusions.

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

log_workoutB
Log a workout session

Args:
    exercise: Name of the exercise performed
    sets: Number of sets completed
    reps: Number of repetitions per set

Returns:
    Confirmation message with workout details
ParametersJSON Schema
NameRequiredDescriptionDefault
repsYes
setsYes
exerciseYes

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

B3.2/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 that a workout is logged and a confirmation is returned; it does not disclose whether the log is persisted, where it is stored, whether it overwrites previous entries, or any side effects. This is a significant transparency gap.

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 compact and front-loaded with the core purpose, followed by a clear Args/Returns structure. There is no fluff or filler; every line contributes to understanding how to call the tool.

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 three-parameter tool with an output schema, the description covers the necessary invocation details: what to pass and what to expect back. However, the existence of a nearly-named sibling ('log_workout_session_to_dynamodb') creates ambiguity about where the workout is being logged and whether this is the right tool to use. That missing context keeps this at the minimum viable level.

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 provides zero property descriptions, so the description must compensate. It does so by defining each parameter: 'exercise' as the name of the exercise, 'sets' as the number of sets, and 'reps' as repetitions per set. It does not add constraints like positive integers or allowed exercise names, but it clearly conveys meaning for all three params.

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 a specific action ('Log') and a specific resource ('workout session'), and the Returns line clarifies what the result will look like. However, it does not distinguish this tool from the sibling 'log_workout_session_to_dynamodb', so it stops short of full clarity.

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?

There is no guidance on when to use this tool versus alternatives such as 'log_workout_session_to_dynamodb' or 'save_workout_plan_to_dynamodb'. The description gives no context about storage, persistence, or selection criteria, so the agent must infer when this tool is appropriate.

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

log_workout_session_to_dynamodbA
Log a completed workout session to DynamoDB

Records the actual workout performed including session metadata and all exercise sets.
This creates:
- WorkoutLog (session metadata: start/end time, duration, energy level, etc.)
- ExerciseSetLog (one per set performed with weight, reps, RPE, form rating, etc.)

The workout_log_json should contain:
{
    "plan_id": "plan_abc",
    "week_number": 1,
    "day_number": 1,
    "workout_date": "2026-01-06",
    "started_at": "2026-01-06T14:30:00Z",
    "completed_at": "2026-01-06T15:45:00Z",
    "duration_min": 75,
    "perceived_difficulty": 8,
    "energy_level": 7,
    "sleep_quality": 8,
    "pre_workout_nutrition": "protein shake + banana",
    "bodyweight_lbs": 185,
    "status": "completed",
    "exercises": [
        {
            "exercise_id": "bench_press_barbell",
            "exercise_name": "Barbell Bench Press",
            "sets": [
                {
                    "set_number": 1,
                    "set_type": "working",
                    "weight_lbs": 225,
                    "reps_completed": 5,
                    "reps_target": 5,
                    "rpe": 8,
                    "rir": 2,
                    "tempo_actual": "2-0-1-0",
                    "rest_seconds_actual": 180,
                    "form_rating": 9,
                    "notes": "Felt strong",
                    "failed": false,
                    "spotted": false
                }
            ]
        }
    ]
}

Args:
    workout_log_json: JSON string of workout log data
    user_id: User ID who performed the workout
    log_id: Optional log ID (auto-generated UUID if not provided)
    table_name: DynamoDB table name (default: WorkoutPlans)
    region: AWS region (default: us-west-2)

Returns:
    Dictionary with success status and statistics about logged entities

Example:
    result = log_workout_session_to_dynamodb(
        workout_log_json='{"plan_id": "plan_abc", "week_number": 1, ...}',
        user_id="user_123"
    )
ParametersJSON Schema
NameRequiredDescriptionDefault
log_idNo
regionNous-west-2
user_idYes
table_nameNoWorkoutPlans
workout_log_jsonYes

TDQS

A4.6/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 full burden of behavioral disclosure. It explicitly states this is a write operation and enumerates the exact records created: WorkoutLog and ExerciseSetLog. It also describes the return value as a dictionary with success status and statistics. It does not cover permission requirements, idempotency, or overwrite semantics, but the side-effect disclosure is clear and substantial.

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 long due to the necessary JSON example, but every section earns its place: purpose, created entities, payload schema, args, return value, and an example call. It is well-structured and front-loaded with the core purpose before diving into details.

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 5 parameters, no output schema, and no annotations, this description is exceptionally complete. It tells the agent exactly what to pass, the structure of the JSON string, how defaults work, and what the return will look like. No critical calling information is missing.

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 description coverage is 0%, so the description must fully compensate. It does: every parameter is explained (workout_log_json, user_id, log_id, table_name, region) and the complex JSON structure is detailed with a full example including nested exercises and sets. This goes well beyond the schema's bare property names and defaults.

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 action ('Log a completed workout session to DynamoDB') and the specific resource (workout session data). It further details that it creates WorkoutLog and ExerciseSetLog records, which differentiates it from sibling tools like save_workout_plan_to_dynamodb and generic log_workout.

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 establishes clear context: use this tool when a workout session has been completed and needs to be persisted with session metadata and exercise sets. It doesn't explicitly name alternatives or exclusion criteria, but the detailed domain-specific behavior makes when-to-use obvious. A brief 'use save_workout_plan_to_dynamodb for plans instead' would have earned a 5.

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

save_workout_plan_to_dynamodbA
Save a workout plan to DynamoDB

Takes the JSON output from workout_plan_prompt and saves it to DynamoDB
following the schema defined in DYNAMODB_DATA_MODEL.md.

This creates all necessary entities:
- WorkoutPlan (plan metadata)
- WeekTemplate (one per week)
- WorkoutSession (one per workout day)
- PlannedExercise (one per exercise)

Args:
    workout_plan_json: JSON string of workout plan (output from workout_plan_prompt)
    user_id: User ID who owns this plan
    plan_id: Optional plan ID (auto-generated UUID if not provided)
    table_name: DynamoDB table name (default: WorkoutPlans)
    region: AWS region (default: us-west-2)

Returns:
    Dictionary with success status and statistics about created entities

Example:
    result = save_workout_plan_to_dynamodb(
        workout_plan_json='{"plan_metadata": {...}, "weeks": [...]}',
        user_id="user_123"
    )
ParametersJSON Schema
NameRequiredDescriptionDefault
regionNous-west-2
plan_idNo
user_idYes
table_nameNoWorkoutPlans
workout_plan_jsonYes

TDQS

A4.5/5.0
Behavior4/5

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

No annotations are present, so the description carries the behavioral burden. It clearly discloses that the tool creates four kinds of entities and returns a status/statistics dictionary. It stops short of describing overwrite/upsert behavior for an existing plan_id or permission requirements, but the primary side effects are well documented.

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 purpose, then uses compact bullets for created entities, an Args list mirroring parameter order, a Returns line, and a concrete example. No filler sentences; each section adds callable information.

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 5-parameter, side-effect-heavy tool with no output schema or annotations, the description covers source, target, entity creation, defaults, return shape, and an example. It could add more detail about returned dictionary keys or behavior when an existing plan_id is supplied, but the essential calling context is present.

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 description coverage is 0% because the schema only has titles, so the description fully compensates. It explains each parameter with semantics: workout_plan_json is plan output, user_id is the owner, plan_id is optional and auto-generates a UUID, and table_name and region have defaults.

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 (save), resource (workout plan to DynamoDB), and precise input source (JSON output from workout_plan_prompt). The list of created entities makes its scope unambiguous and distinguishes it from siblings like log_workout_session_to_dynamodb.

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?

Explicitly says to use it with the JSON output from workout_plan_prompt, giving an agent a clear condition for when this tool is appropriate. It does not explicitly mention alternatives or exclusions, but saving a full multi-entity plan is clearly different from logging a single session or retrieving a plan.

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

search_exercisesA
Search for exercises by name or keyword with fuzzy matching.

Args:
    query: Search query (exercise name or keyword)
    limit: Maximum number of exercises to return (default: 20, max: 100)
    offset: Number of exercises to skip (default: 0)
    threshold: Fuzzy match threshold 0.0-1.0 (default: 0.3, lower = more results)

Returns:
    List of exercises matching the search query with relevance scoring.
ParametersJSON Schema
NameRequiredDescriptionDefault
limitNo
queryYes
offsetNo
thresholdNo

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.4/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 explains fuzzy matching, the threshold's effect ('lower = more results'), and relevance scoring in the return value. It does not mention non-mutation or rate limits, but for a search operation these are less critical and the key behavioral traits are covered.

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: a one-sentence summary up front, followed by a compact parameter list and a return-value line. Every sentence carries necessary information, and there is no redundant or filler content.

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 simple search tool, the description provides all essential information needed to call it correctly: what it searches, how fuzzy matching works, parameter meanings and defaults, and what it returns. The presence of an output schema further reduces the need to document return structure in detail.

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 description coverage is 0%, so the description must compensate, and it does. Every parameter is explained: 'query' as name/keyword, 'limit' with a max of 100, 'offset' as skip count, and 'threshold' with a range and behavioral implication. This adds real semantic value 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 a specific verb ('Search'), the resource ('exercises'), and the method ('by name or keyword with fuzzy matching'). This distinguishes it from sibling tools like get_exercise_by_id or get_exercises_by_body_part, which imply exact or filtered retrieval rather than fuzzy keyword search.

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 should be used when a fuzzy name/keyword search is needed, but it gives no explicit guidance about when to prefer it over sibling tools. It does not state exclusions or alternatives, so the usage context is inferred rather than spelled out.

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. Dates show when Glama detected each change.

  1. 14 tool updatesv0.1.0
    • First observedcalculate_volume
    • First observedget_all_exercises
    • First observedget_exercise_by_id
    • First observedget_exercises_by_body_part
    • First observedget_exercises_by_equipment
    • First observedget_exercises_by_target_muscle
    • First observedget_workout_plan_from_dynamodb
    • First observedlist_body_parts
    • First observedlist_equipment
    • First observedlist_target_muscles
    • First observedlog_workout
    • First observedlog_workout_session_to_dynamodb
    • First observedsave_workout_plan_to_dynamodb
    • First observedsearch_exercises

TDQS

A3.5/5.0
Disambiguation2/5

log_workout and log_workout_session_to_dynamodb both log workouts but at different levels of detail and persistence, creating real ambiguity for an agent. The multiple get_exercises_by_* filters are largely distinct but could be confused with search_exercises, especially since they all return exercise lists.

Naming Consistency4/5

Tool names consistently use snake_case with a verb_noun pattern, such as list_*, get_*, log_*, and save_*. Minor deviations like calculate_volume (no resource object) and the long 'to_dynamodb'/'from_dynamodb' suffixes are still readable and predictable.

Tool Count4/5

With 14 tools, the count is on the higher end but still within a reasonable scope for an exercise database combined with workout plan and session logging. A few tools, especially the redundant log_workout, could be consolidated, but the overall count is not excessive.

Completeness2/5

The server provides save/get for workout plans and a session logger, but lacks list, update, and delete operations for plans or logs. There is also no way to retrieve a user's workout history, leaving significant lifecycle gaps that would cause agent failures in common tracking workflows.

Maintenance

ActivityInactive
ResponsivenessNo issues

Resources

Unclaimed servers have limited discoverability.

Looking for Admin?

If you are the server author, to access and configure the admin panel.

Related MCP Connectors

Related MCP Servers

  • A
    license
    Not graded
    quality
    D
    maintenance
    A comprehensive AI-powered fitness tracking application that enables AI tools to interact intelligently with user fitness data, providing personalized workout plans, nutrition tracking, and progress analysis through natural language.
    15
    MIT
  • A
    license
    Not graded
    quality
    D
    maintenance
    A universal fitness intelligence layer for AI assistants like Claude, ChatGPT, and Copilot, enabling user profiles, workout/diet plans, calendar scheduling, and gamification via MCP and REST APIs.
    11,502
    MIT
  • F
    license
    Not graded
    quality
    B
    maintenance
    Enables workout tracking and coaching within Claude conversations, managing exercise configs, logs, streaks, and health metrics via an MCP server with PostgreSQL.
    -

Latest Blog Posts

MCP directory API

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

curl -X GET 'https://glama.ai/api/mcp/v1/servers/nitinchakravarthy/workout_tracker_mcp'

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