coros-mcp
The coros-mcp server enables AI assistants to fully manage Coros fitness data and training. Using your Coros account (no API key needed), it supports:
Authentication: Log in via web or mobile API, check auth status and token validity.
Health & Training Metrics: Fetch daily metrics (HRV, resting heart rate, training load, VO2max, stamina, distance, etc.) and detailed nightly sleep data (deep, light, REM, awake, sleep HR) for up to 52 weeks.
Activity Data: List summarized activities for a date range and drill into a single activity with laps, HR/power zones, and sport-specific metrics.
Workout Templates: Browse, save, and delete reusable cycling, running, intervals, or strength templates from the Coros library.
Training Calendar: View, schedule (one-off or from templates), update, and remove planned workouts; add raw planned workouts and recalculate metrics.
Training Plans: List available training plans.
Exercise Catalogue: Browse Coros’s exercise library (especially for strength).
Local Cache & Sync: Backfill and sync data (daily metrics, sleep, activities) into a local SQLite cache for faster access; check cache coverage.
Utility: Get tool help and list available exercises.
Configuration: Optionally restrict the toolset (e.g., read-only mode) or hide authentication tools for security/autonomy.
Click on "Install Server".
Wait a few minutes for the server to deploy. Once ready, it will show a "Started" state.
In the chat, type
@followed by the MCP server name and your instructions, e.g., "@coros-mcpshow my sleep data for the past week"
That's it! The server will respond to your query, and you can continue using it as needed.
Here is a step-by-step guide with screenshots.
coros-mcp
This is an unofficial, community-built project and is not affiliated with or endorsed by COROS.
COROS has since launched their official MCP server: coroslab/COROS-MCP. If you are looking for an officially supported integration, please use that instead.
This project continues to exist as a community alternative and may offer different or complementary features.
A Model Context Protocol (MCP) server that fetches sleep, HRV, and training data from the unofficial Coros API and exposes them to AI assistants like Claude.
No API key required. This server authenticates directly with your Coros Training Hub credentials. Your token is stored securely in your system keyring (or an encrypted local file as fallback), never transmitted anywhere except to Coros.
What You Can Do
Ask your AI assistant questions like:
"How much deep sleep and REM did I get last week?"
"What was my HRV trend over the last 4 weeks?"
"Show me my resting heart rate and training load for last week"
"How many steps did I average per day this month?"
"List my rides from last month"
"Show me the details of my last long ride"
"Create a 90-minute sweet spot workout for me"
"What's on my training calendar next week?"
"Schedule my VO2 workout for Thursday"
"Create a 20-minute strength circuit with squats, lunges, and planks"
Related MCP server: whoop-mcp
Features
Tool | Description |
| Log in with email and password — token stored securely in keyring |
| Log in to the mobile API only (useful for sleep data troubleshooting) |
| Check whether a valid auth token is present |
| Fetch daily metrics (HRV, resting HR, training load, VO2max, stamina, and more) for n weeks (default: 4) |
| Fetch nightly sleep stages (deep, light, REM, awake) and sleep HR for n weeks (default: 4) |
| List activities for a date range with summary metrics |
| Fetch full detail for a single activity (laps, HR zones, power zones) |
| List reusable workout templates saved in the library |
| Save a reusable cycling/intervals workout template (named steps, power targets) |
| Save a reusable strength workout template (sets, reps, or timed exercises) |
| Delete a saved workout template from the library |
| List planned workouts from the Coros training calendar |
| Schedule a one-off cycling/intervals workout for a date (no library entry) |
| Schedule a one-off strength workout for a date (no library entry) |
| Schedule an existing library template on a calendar day |
| Remove a scheduled workout from the calendar |
| Browse the Coros exercise catalogue, especially for strength workouts |
| Backfill all data into the local SQLite cache for a date range |
| Show coverage (record counts and date ranges) of the local cache |
Setup
Option A: Auto-Setup with Claude Code
If you have Claude Code, paste this prompt:
Set up the Coros MCP server from https://github.com/cygnusb/coros-mcp — clone it, create a venv, install it with pip install -e ., add it to my MCP config, then tell me to run 'coros-mcp auth' in my terminal to authenticate.Claude will handle the installation and guide you through configuration.
Option B: Manual Setup
Step 1: Install
git clone https://github.com/cygnusb/coros-mcp.git
cd coros-mcp
python3 -m venv .venv
source .venv/bin/activate # Windows: .venv\Scripts\activate
pip install -e .Or with uv:
uv pip install -e .Step 2: Add to Claude Code
claude mcp add coros -- /path/to/coros-mcp/.venv/bin/coros-mcp serveTo limit the MCP to a specific project only (recommended):
cd /path/to/your/project
claude mcp add --scope project coros -- /path/to/coros-mcp/.venv/bin/coros-mcp serveOr add to Claude Desktop (~/Library/Application Support/Claude/claude_desktop_config.json):
{
"mcpServers": {
"coros": {
"command": "/path/to/coros-mcp/.venv/bin/coros-mcp",
"args": ["serve"]
}
}
}Step 3: Authenticate
Option A — .env file (recommended for project-scoped setups):
Create a .env file in your project directory:
COROS_EMAIL=you@example.com
COROS_PASSWORD=yourpassword
COROS_REGION=euThe server authenticates automatically on the first request and re-authenticates transparently whenever the token expires. No manual auth step needed.
Option B — Manual authentication:
Run the following command in your terminal — outside of any Claude session:
coros-mcp authYou will be prompted for your email, password, and region (eu, us, or asia). This stores both the Training Hub web token and the mobile API token (used for sleep data). Your credentials are sent directly to Coros and the tokens are stored securely in your system keyring (or an encrypted local file as fallback). You only need to do this once — the tokens persist across restarts.
Note: The mobile login (
apieu.coros.com) will log you out of the Coros mobile app on your phone. If you want to avoid this, usecoros-mcp auth-webinstead — it stores only the web token, and the mobile token will be obtained automatically when you first request sleep data.
Other auth commands:
coros-mcp serve # Start the MCP server (used by Claude Code / Claude Desktop)
coros-mcp auth-web # Web API only — skips mobile login (sleep data obtained lazily)
coros-mcp auth-mobile # Mobile API only (sleep data)
coros-mcp auth-status # Check if authenticated
coros-mcp auth-clear # Remove stored tokensStep 4 (optional): Restrict the toolset for autonomous agents
When the MCP client is an autonomous agent or a smaller open-weight model (e.g. hermes-agent with a DeepSeek/Hermes model), two env vars harden the server:
COROS_MCP_TOOLSET=readonly # expose only the 12 read tools
COROS_MCP_HIDE_AUTH_TOOLS=1 # hide authenticate_* (credentials never enter the model context)COROS_MCP_TOOLSET=readonlyhides everything that writes to your Coros account (save/schedule/update/delete tools) plus the low-level raw escape hatches, leaving:get_help,check_coros_auth,get_daily_metrics,get_sleep_data,list_activities,get_activity_detail,list_workout_templates,list_training_plans,list_planned_activities,list_exercises,sync_coros_data,get_cache_status. A smaller tool list also improves tool-calling reliability of non-frontier models. Default:full(all 26 tools).COROS_MCP_HIDE_AUTH_TOOLS=1removes the twoauthenticate_*tools so your password can never travel through the model context or agent logs. Authentication then happens exclusively via theCOROS_EMAIL/COROS_PASSWORDenv auto-login (or tokens stored beforehand withcoros-mcp auth).
All tools additionally carry MCP readOnlyHint / destructiveHint
annotations, so agent harnesses that honor them can require confirmation
for write actions.
Tool Reference
authenticate_coros
Log in with your Coros credentials. The auth token is stored securely in your system keyring (or an encrypted file as fallback).
{ "email": "you@example.com", "password": "yourpassword", "region": "eu" }Returns: authenticated, user_id, region, message
authenticate_coros_mobile
Authenticate with the Coros mobile API only. This is mainly useful if you need to restore sleep-data access without redoing full web authentication.
{ "email": "you@example.com", "password": "yourpassword", "region": "eu" }Returns: authenticated, user_id, region, message
check_coros_auth
Check whether valid web and mobile tokens are stored and how long the web token remains valid.
{}Returns: authenticated, user_id, region, expires_in_hours, mobile_authenticated, mobile_token_status
get_daily_metrics
Fetch daily metrics for a configurable number of weeks (default: 4).
{ "weeks": 4 }Returns: records (list), count, date_range
Each record includes:
Field | Source | Description |
| — | Date (YYYYMMDD) |
| dayDetail | Nightly HRV (RMSSD ms) |
| dayDetail | HRV rolling baseline |
| dayDetail | Resting heart rate (bpm) |
| dayDetail | Daily training load |
| dayDetail | Acute/chronic training load ratio |
| dayDetail | Fatigue rate |
| dayDetail | Acute / chronic training index |
| dayDetail | Distance (m) / duration (s) |
| analyse (merge) | VO2 Max (last ~28 days) |
| analyse (merge) | Lactate threshold heart rate (bpm) |
| analyse (merge) | Lactate threshold pace (s/km) |
| analyse (merge) | Base fitness level |
| analyse (merge) | 7-day fitness trend |
get_sleep_data
Fetch nightly sleep stage data for a configurable number of weeks (default: 4).
{ "weeks": 4 }Returns: records (list), count, date_range
Each record includes:
Field | Description |
| Date (YYYYMMDD) — the morning after the sleep |
| Total sleep in minutes |
| Deep sleep |
| Light sleep |
| REM sleep |
| Time awake during the night |
| Daytime nap time (null if none) |
| Average heart rate during sleep |
| Minimum heart rate during sleep |
| Maximum heart rate during sleep |
| Sleep quality score (null if not computed) |
Note: Sleep data is fetched from the Coros mobile API (
apieu.coros.com), which uses a separate token from the Training Hub web API.coros-mcp authobtains both tokens, but doing so logs you out of the Coros mobile app. Usecoros-mcp auth-webto skip mobile login — the mobile token is then obtained automatically on the first sleep data request. The token expires after ~1 hour but refreshes automatically on subsequent requests.
list_activities
List activities for a date range.
{ "start_day": "20260101", "end_day": "20260305", "page": 1, "size": 30 }Returns: activities (list), total_count, page
Each activity includes: activity_id, name, sport_type, sport_name, start_time, end_time, duration_seconds, distance_meters, avg_hr, max_hr, calories (in cal — divide by 1000 for kcal), training_load, avg_power, normalized_power, elevation_gain
get_activity_detail
Fetch full detail for a single activity. Requires the sport_type from list_activities.
{ "activity_id": "469901014965714948", "sport_type": 200 }Returns full activity data including laps, HR zones, power zones, and all sport-specific metrics.
Note: Large time-series arrays (
graphList,frequencyList,gpsLightDuration) are stripped from the response to keep it manageable.
list_workout_templates
List reusable workout templates saved in the Coros library.
{}Returns: workouts (list), count
Each entry includes: id, name, sport_type, sport_name, estimated_time_seconds, exercise_count, exercises (list of steps with name, duration_seconds, intensity_low, intensity_high, sets)
save_workout_template
Save a reusable cycling/intervals workout template to the Coros library. The template appears in the Coros app and can be synced to the watch. Steps can be plain steps or repeat groups for intervals.
⚠️ This persists to the library indefinitely. For a one-off workout for a specific date, use
schedule_workoutinstead — it builds the workout inline and leaves no library entry.
Plain steps:
{
"name": "Sweet Spot 90min",
"sport_type": 2,
"steps": [
{"name": "15:00 Warmup", "duration_minutes": 15, "intensity_low": 148, "intensity_high": 192},
{"name": "20:00 Sweet Spot", "duration_minutes": 20, "intensity_low": 260, "intensity_high": 275},
{"name": "5:00 Rest", "duration_minutes": 5, "intensity_low": 100, "intensity_high": 150},
{"name": "20:00 Sweet Spot", "duration_minutes": 20, "intensity_low": 260, "intensity_high": 275},
{"name": "30:00 Cooldown", "duration_minutes": 30, "intensity_low": 100, "intensity_high": 192}
]
}With repeat groups (intervals):
{
"name": "3×10min Sweet Spot",
"sport_type": 2,
"steps": [
{"name": "Warmup", "duration_minutes": 10, "intensity_low": 150, "intensity_high": 200},
{"repeat": 3, "steps": [
{"name": "Sweet Spot", "duration_minutes": 10, "intensity_low": 265, "intensity_high": 285},
{"name": "Recovery", "duration_minutes": 3, "intensity_low": 150, "intensity_high": 175}
]},
{"name": "Cooldown", "duration_minutes": 11, "intensity_low": 150, "intensity_high": 200}
]
}Distance-based steps: use duration_meters instead of duration_minutes for a step that should end at a real distance regardless of pace, e.g. {"name": "1km @ 4:00/km", "duration_meters": 1000, "intensity_low": 235, "intensity_high": 245} (pace in sec/km with intensity_type: 3). Exactly one of the two keys per step.
sport_type: 2 = Indoor Cycling (default), 200 = Road Bike
Returns: workout_id, name, total_minutes, distance_meters_total, steps_count, message
save_strength_workout_template
Save a reusable strength workout template to the Coros library. Exercises must come from the Coros exercise catalogue.
⚠️ This persists to the library indefinitely. For a one-off workout for a specific date, use
schedule_strength_workoutinstead — it builds the workout inline and leaves no library entry.
{
"name": "Leg Circuit",
"sets": 3,
"exercises": [
{
"origin_id": "54",
"name": "T1061",
"overview": "sid_strength_squats",
"target_type": 3,
"target_value": 12,
"rest_seconds": 45,
"sets": 3,
"weight_kg": 80
},
{
"origin_id": "130",
"name": "T1176",
"overview": "sid_strength_plank",
"target_type": 2,
"target_value": 60,
"rest_seconds": 30
}
]
}target_type: 2 = time in seconds, 3 = reps
sets (per exercise, optional): consecutive sets of that exercise before moving on. Use this instead of duplicating the exercise entry. Defaults to 1.
sets (top-level): full-circuit repetitions — repeats the entire exercise list. Defaults to 1.
Weight fields (per exercise, optional):
Field | Description |
| Prescribed weight in kg (e.g. |
| Prescribed weight in pounds (e.g. |
Omitting both fields renders the exercise as Bodyweight in the Coros app.
Setting
weight_kg: 0renders as "0.00 kg" — distinct from Bodyweight.For dumbbell exercises, the weight is per hand by convention (the app shows a single value).
kg and lbs can be mixed across exercises within the same workout.
Returns: workout_id, name, sets, exercise_count
delete_workout_template
Delete a saved workout template from the Coros library.
{ "workout_id": "476023839273435149" }The workout_id comes from list_workout_templates.
Returns: deleted, workout_id, message
list_planned_activities
List planned activities from the Coros training calendar.
{ "start_day": "20260309", "end_day": "20260316" }Returns: schedule (dict with entities and programs sub-lists), count (number of scheduled entities), date_range
schedule_workout
Schedule a one-off cycling/intervals workout for a specific date. Builds the workout inline and posts straight to the calendar — does not create a library entry. This is the common case.
Same parameters as save_workout_template, plus happen_day (YYYYMMDD) and an optional sort_no (order within the day).
{
"name": "Z2 Recovery",
"happen_day": "20260312",
"sport_type": 2,
"steps": [
{"name": "Easy spin", "duration_minutes": 60, "intensity_low": 150, "intensity_high": 200}
]
}Returns: scheduled, name, happen_day, total_minutes, steps_count, response
schedule_strength_workout
Schedule a one-off strength workout for a specific date. Builds the workout inline and posts straight to the calendar — does not create a library entry.
Same parameters as save_strength_workout_template, plus happen_day.
{
"name": "Push Day",
"happen_day": "20260312",
"sets": 1,
"exercises": [ ... ]
}Returns: scheduled, name, happen_day, sets, exercise_count, response
schedule_workout_template
Schedule an existing library template on a calendar day.
{ "workout_id": "1234567890", "happen_day": "20260312", "sort_no": 1 }The workout_id comes from list_workout_templates. For one-off workouts that don't need a library entry, use schedule_workout or schedule_strength_workout instead.
Returns: scheduled, workout_id, happen_day, response
remove_scheduled_workout
Remove a scheduled workout from the Coros training calendar.
{
"plan_id": "987654321",
"id_in_plan": "1234567890",
"plan_program_id": "1234567890"
}plan_id, id_in_plan, and plan_program_id come from list_planned_activities. If plan_program_id is missing, you can usually reuse id_in_plan.
Returns: removed, plan_id, id_in_plan
list_exercises
List the Coros exercise catalogue for a sport type. Default sport_type=4 returns strength exercises.
{ "sport_type": 4 }Returns: exercises (list), count, sport_type
sync_coros_data
Backfill all data into the local SQLite cache for a date range. After the first full sync, get_daily_metrics, get_sleep_data, and list_activities serve historical data from cache and only fetch the incremental tail from the API.
{ "start_day": "20230101", "end_day": "20260514" }Both parameters are optional and default to two years ago / today respectively. For large ranges (> 6 months) prefer the CLI:
coros-mcp sync --from 20230101Returns: daily (records synced), sleep (records synced), activities (records synced), errors (list), cache (coverage summary)
get_cache_status
Show what data is currently stored in the local SQLite cache.
{}Returns per data type: count, from (earliest date), to (latest date). Also includes db_path.
Requirements
Python ≥ 3.11
A Coros account (Training Hub)
Project Structure
coros-mcp/
├── coros_mcp/
│ ├── server.py # MCP server with tool definitions
│ ├── coros_api.py # Coros API client (auth, requests, parsers)
│ ├── models.py # Pydantic data models
│ ├── cli.py # CLI entry point (serve, auth, sync, cache-status, …)
│ ├── auth/ # Token storage (keyring + encrypted file fallback)
│ └── cache/ # SQLite cache layer (store, sync, utils)
├── tests/ # pytest test suite
├── pyproject.toml # Project metadata & dependencies
└── docs/
└── mobile-token.md # Mobile API token background (legacy reference)Dependencies
fastmcp — MCP framework
httpx — Async HTTP client
pydantic — Data validation
cryptography — AES encryption (mobile API auth + token file)
keyring — Secure token storage
python-dotenv —
.envsupport
Disclaimer
This project uses the unofficial Coros Training Hub API. The API may change at any time without notice. Use at your own risk.
Available Tools
26 toolsadd_planned_workoutA
Add an inline planned workout to the Coros training calendar.
This is a low-level escape hatch for callers that already hold raw entity / program objects (e.g. copied from list_planned_activities_raw). For the common case of building and scheduling a workout, prefer schedule_workout.
| Name | Required | Description | Default |
|---|---|---|---|
| entity | Yes | Raw schedule entity object. Must include idInPlan and happenDay. | |
| program | Yes | Raw program object to add to the calendar. | |
| version_object | No | Optional explicit version object. If omitted, it is built with status=1 (add). |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations indicate readOnlyHint=false and destructiveHint=false, and the description adds context that this is a low-level escape hatch. It does not detail side effects, authentication requirements, or failure modes beyond what annotations already signal. The mention that version_object defaults to status=1 (add) provides some behavioral nuance, but the description largely relies on annotations and schema for transparency.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is two sentences, front-loaded with the primary action, followed by targeted context and an explicit alternative. Every sentence earns its place, with no redundant information.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the presence of annotations, a full output schema, and complete parameter schema descriptions, the description covers the essential context: what it does, when to use it, and what to prefer instead. It could elaborate on what 'inline planned workout' implies or the distinction from schedule_workout further, but for a low-level tool with rich structured data, it is adequately complete.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the baseline is 3. The description adds value by pointing to list_planned_activities_raw as the source for the raw entity/program objects, which helps callers understand the expected parameter origins. This goes slightly beyond the schema's field-level descriptions.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool adds an inline planned workout to the Coros training calendar, and distinguishes itself as a low-level escape hatch from the higher-level schedule_workout. It names the specific resource (calendar) and scope (inline planned workout), making it easy to differentiate from siblings.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description explicitly tells when to use this tool (when already holding raw entity/program objects) and directs callers to prefer schedule_workout for the common case. It names the alternative tool clearly, providing strong usage guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
authenticate_corosA
Authenticate with the Coros Training Hub API and store the access token.
| Name | Required | Description | Default |
|---|---|---|---|
| Yes | Coros account email address. | ||
| region | No | "eu" (default) or "us". EU users must use "eu" — tokens are region-bound (EU tokens only work on teameuapi.coros.com). | eu |
| password | Yes | Coros account password (plain text — hashed with MD5 before sending). |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description states the side effect 'store the access token', which is consistent with the annotations (readOnlyHint: false). It adds context about the state change, but does not elaborate on token expiration, overwriting behavior, or prerequisites. With annotations already covering the non-read-only nature, this is adequate but not rich.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single, tightly written sentence that is front-loaded with the action and resource. There is zero waste, and it shares the essential purpose without unnecessary detail.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The description combined with the rich schema and annotations provides a fairly complete picture for an authentication tool. The existence of an output schema covers return values, and the schema details the region-bound tokens and password hashing. However, it lacks an explicit statement that this tool must be called before other API calls, making the context slightly incomplete.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The input schema provides 100% coverage for all three parameters, including detailed descriptions for region and password handling. The description adds no additional parameter semantics, so the baseline score of 3 applies as the schema already does the heavy lifting.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the action ('Authenticate') and the resource ('Coros Training Hub API') along with the outcome ('store the access token'). It distinguishes itself from the sibling 'authenticate_coros_mobile' by specifying the Training Hub API, making the purpose unambiguous.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description implies this tool is used to authenticate before accessing other API endpoints, but it does not explicitly state when to use it versus alternatives like 'check_coros_auth' or 'authenticate_coros_mobile'. There is no explicit when/when-not guidance, only the implied context that it is the primary authentication method.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
authenticate_coros_mobileA
Authenticate with the Coros mobile API only and store the mobile token.
This is needed for sleep data (deep/light/REM/awake phases) which is only available through the mobile API (apieu.coros.com), not the Training Hub web API.
| Name | Required | Description | Default |
|---|---|---|---|
| Yes | Coros account email address. | ||
| region | No | "eu" (default) or "us". | eu |
| password | Yes | Coros account password (plain text — encrypted before sending). |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already indicate this is a mutating (readOnlyHint=false), non-destructive action. The description adds context beyond annotations: it stores a mobile token and scopes authentication to the mobile API. This is meaningful behavioral disclosure, though it does not detail token expiration, refresh behavior, or repeated-call semantics.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is just two sentences, with the primary purpose front-loaded in the first sentence. The second sentence provides valuable context (sleep data) without any filler or repetition of schema details.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The tool is an authentication step, and the description explains what it does, why it is needed (sleep data), and its scoping to the mobile API. With an output schema present and annotations already covering mutation/destructiveness, the description is sufficiently complete for an agent 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.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the input schema fully documents email, password, and region. The description does not add extra parameter context beyond the schema, which is acceptable given the high coverage. The baseline of 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description begins with a specific verb and object: 'Authenticate with the Coros mobile API only and store the mobile token.' It clearly identifies the resource (mobile API) and the action (authenticate/store token), and distinguishes itself from sibling authenticate_coros by emphasizing 'mobile API only.'
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description explicitly states when this tool is needed: for sleep data (deep/light/REM/awake phases) that is only available via the mobile API. It also clarifies that the Training Hub web API does not provide this data, implying the alternative. However, it does not explicitly name the sibling tool authenticate_coros as the alternative for non-sleep data, so it stops short of a full 5.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
calculate_workout_programARead-only
Recalculate a workout program after editing its exercises.
This calls Coros /training/program/calculate and returns the calculated metrics plus a copy of the supplied program with derived fields such as duration, estimated distance, training load, and exerciseBarChart applied. Feed the returned program into update_scheduled_workout when its exercises changed.
| Name | Required | Description | Default |
|---|---|---|---|
| program | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description goes beyond the readOnlyHint annotation by clarifying that the tool calls an external Coros endpoint, returns a copy of the program with derived fields, and does not itself persist changes. It explains what is calculated (duration, distance, training load, exerciseBarChart). It does not cover auth/error behavior, but that is unnecessary given the annotations and calculation-focused purpose.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is concise and well-structured: a one-sentence summary, an informative second sentence about behavior/return value, and a practical third sentence about downstream usage. Every sentence contributes value without redundancy.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the output schema exists, the description is not required to detail return values. It sufficiently covers the operation's purpose, when to use it, what it returns, and how to chain it with a sibling tool. For a calculation helper, this is a complete picture.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The schema provides only an opaque 'program' object with additionalProperties true and 0% description coverage, so the description carries most of the semantic responsibility. It does convey that 'program' is a workout program with exercises and derived fields, which is useful, but it does not specify the internal structure or required fields needed to invoke the tool correctly. This is a meaningful but incomplete compensation.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific action ('Recalculate a workout program after editing its exercises') and clearly identifies the resource (workout program). It also names the underlying API call and differentiates itself from sibling scheduling tools by specifying it computes derived fields and should be followed by update_scheduled_workout.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It explicitly states when to use the tool ('after editing its exercises') and gives concrete downstream guidance ('Feed the returned program into update_scheduled_workout when its exercises changed'). This is strong usage direction that prevents misuse relative to the scheduling siblings.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
check_coros_authARead-only
Check whether valid Coros access tokens are stored locally.
By default this is a LOCAL check only: authenticated: true means the stored
token has not passed its 24h TTL by the local clock — it does NOT confirm the
token is still accepted by Coros. A token can be revoked server-side (password
change, account lock) or invalidated early and still report authenticated here;
the next real data call would then fail with an auth error (which triggers a
re-login retry). expires_in_hours is likewise a local TTL estimate.
| Name | Required | Description | Default |
|---|---|---|---|
| verify_with_server | No | When True, additionally make one lightweight read call to Coros to confirm the web token is still accepted, adding a ``server_verified`` key: ``True`` (accepted), ``False`` (rejected — revoked/expired/wrong region), or ``None`` (inconclusive, e.g. a network error) with a ``server_message``. This does not re-login or alter the stored token. Off by default to keep the check cheap and offline. |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description goes well beyond the readOnlyHint annotation by explaining the local TTL check, the possibility of stale tokens due to server-side revocation, and the exact implications of the returned fields. It also clearly states that the tool does not re-login or alter stored tokens, providing thorough behavioral disclosure.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is moderately detailed but well-structured, starting with a clear statement of purpose and following with relevant caveats and details. Each sentence adds value, and the use of inline code for keys improves readability. It is not excessively verbose for the complexity involved.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the tool's diagnostic nature and the presence of an output schema, the description provides comprehensive context: it explains the default local-only behavior, the optional server verification, the meaning of `authenticated` and `expires_in_hours`, and edge cases like revocation. This is sufficient for an agent to understand the tool's role and limitations without additional documentation.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The single parameter `verify_with_server` is fully described in the schema with details on behavior and return keys. The tool description adds context about the default local check and what the parameter modifies, but this is largely complementary to the schema rather than adding new meaning. With 100% schema coverage, a baseline of 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description uses a specific verb ('Check') and clearly identifies the resource ('valid Coros access tokens') and scope ('stored locally'). It distinguishes itself from sibling authentication tools by focusing on checking local storage rather than creating or managing tokens.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides clear context for use: it's a local check that can optionally verify with the server, and it warns that a local 'authenticated' result doesn't guarantee server acceptance. It doesn't explicitly name alternative tools or say when not to use it, but the behavior is well-enough contextualized for an agent to decide when to call it.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
delete_workout_templateADestructive
Delete a saved workout TEMPLATE from the Coros library.
| Name | Required | Description | Default |
|---|---|---|---|
| workout_id | Yes | The workout ID to delete (from list_workout_templates). |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description adds minimal behavioral context beyond the annotations: it specifies that the deletion applies to saved workout templates from the Coros library, providing the target scope. However, the destructive nature is already disclosed via destructiveHint=true, and the description does not elaborate on consequences like irreversibility or impact on dependent schedules. No contradiction with annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single concise sentence with no redundant words, front-loading the action and object. Every word earns its place.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple deletion tool with one parameter, destructive annotations, and an output schema, the description is sufficient. It identifies the resource type and location, though it doesn't explicitly state how to obtain the ID (left to the parameter description). Overall, it's complete given the simplicity.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The schema provides a 100% description coverage for the single parameter (workout_id) with guidance to obtain it from list_workout_templates. The description itself adds no parameter-specific semantics, but the schema carries the full load, meeting the baseline of 3.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the action ('Delete'), the target ('saved workout TEMPLATE'), and the scope ('from the Coros library'), which distinguishes it from sibling tools like save_workout_template or list_workout_templates. The verb+resource is specific and unambiguous.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description implicitly conveys usage for removing a saved workout template, but it does not explicitly state when to use this tool versus alternatives, nor does it mention any prerequisites or exclusions. The schema parameter description references list_workout_templates, which provides indirect guidance, but the description itself lacks explicit usage guidelines.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_activity_detailARead-only
Fetch detail for a single Coros activity.
| Name | Required | Description | Default |
|---|---|---|---|
| sport_type | No | Sport type ID from list_activities (e.g. 200=Road Bike, 201=Indoor Cycling, 100=Running). Required for the API call to succeed. | |
| activity_id | Yes | The activity ID (labelId) from list_activities. |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true and openWorldHint=true, covering the safety profile. The description adds no extra behavioral context beyond the basic fetch operation, which is acceptable given the annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single, well-structured sentence with no filler. It front-loads the action and resource effectively.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
This is a simple read-only fetch tool with a complete input schema and output schema present. The description is sufficient for an agent to select and invoke it correctly; no critical information is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Input schema has 100% coverage with helpful descriptions for both parameters, including the note that sport_type is required for the API call and activity_id comes from list_activities. The tool description itself adds no parameter details, so the baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description uses a specific verb 'Fetch' and clearly names the resource 'detail for a single Coros activity', distinguishing it from sibling tools like list_activities. It precisely communicates what the tool does.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides clear context: use this when you need details for a single activity. It does not explicitly mention alternatives or exclusions, but the purpose statement makes the use case obvious.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_cache_statusARead-only
Show what data is currently stored in the local cache.
Returns
dict with keys: daily_records, sleep_records, activities — each with:
count: number of cached records
from: earliest cached date (YYYYMMDD)
to: latest cached date (YYYYMMDD) Also includes db_path: absolute path to the SQLite file.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotation contradiction: readOnlyHint=true is consistent with 'Show...'. The description adds context beyond the annotation by specifying the exact return format, including the db_path to the SQLite file. This clarifies the tool's local, read-only nature and gives insight into what the output contains.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is succinct and well-structured: a single purpose sentence followed by a clear return-value section. Every word is necessary, and the format is easily scannable for an AI agent.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a zero-parameter, read-only cache inspection tool, the description fully covers purpose and output. The output schema exists, but the description adds human-readable detail about keys and meaning. There is no missing information that would impede tool selection or invocation.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The tool has zero parameters, so no parameter explanation is needed. According to the rubric, 0 parameters baseline is 4. The description provides no parameter details because there are none, which is appropriate and complete.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description explicitly states 'Show what data is currently stored in the local cache,' using a specific verb and resource. It clearly distinguishes itself from sibling data-retrieval tools by focusing on cache metadata rather than actual data pulls. The return-value breakdown further reinforces the purpose.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
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 you need to inspect cache contents. The return structure clarifies that it provides counts and date ranges, not actual records, so it is clearly a diagnostic tool. However, it does not explicitly mention alternatives or exclusion criteria, which would warrant a 5.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_daily_metricsARead-only
Retrieve nightly HRV and daily metrics from Coros for a configurable time range (up to 52 weeks).
Historical data is served from the local SQLite cache (fast); only the uncached tail is fetched from the Coros API. The underlying API endpoint supports up to 24 weeks per call; the cache layer fetches longer uncached ranges in 12-week chunks, so any range up to 52 weeks works even on a cold cache.
| Name | Required | Description | Default |
|---|---|---|---|
| weeks | No | Number of weeks to fetch (1–52). Default: 4. |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description provides rich behavioral context: data is served from local SQLite cache, the uncached tail fetches from the API, and longer ranges are chunked into 12-week calls. This goes well beyond the readOnlyHint annotation and clarifies performance and caching behavior.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is three sentences: a clear purpose statement followed by two sentences of implementation details. Each sentence earns its place, providing useful information without unnecessary verbosity.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the output schema exists and annotations indicate read-only behavior, the description fully covers the data source, range constraints, and caching behavior. There are no significant gaps for a single-parameter fetch tool.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage for the only parameter (weeks) is 100%, so the baseline is 3. The description adds value by explaining that the range is configurable and works even on a cold cache, giving extra confidence about parameter behavior beyond the schema's basic range description.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly identifies the tool's function: 'Retrieve nightly HRV and daily metrics from Coros' with a configurable time range. It also distinguishes itself from sibling tools like get_sleep_data by specifying 'HRV and daily metrics'.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description explains how the cache and API are used, implying that the tool is suitable for historical data ranges. However, it does not explicitly mention when to avoid this tool or suggest alternatives, so it lacks explicit exclusion guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_helpARead-only
List all available Coros MCP tools with a short description of each.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The annotations already declare readOnlyHint=true, and the description adds behavioral context by specifying that it returns a list with short descriptions. This goes beyond the annotation without contradicting it. No additional behavioral quirks are relevant for such a simple read-only listing.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single, focused sentence that front-loads the action and resource. Every word earns its place, with no redundant information.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the tool's simplicity, zero parameters, and the presence of an output schema, the description fully covers the tool's purpose and behavior. There is no missing context for an agent to select and invoke this tool correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The tool has zero parameters and schema coverage is 100% (vacuously). The description provides all needed context since there is nothing to configure. Baseline 4 is appropriate for a no-parameter tool.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description uses a specific verb ('List') with a clear resource ('all available Coros MCP tools') and describes the output (short description of each). It clearly distinguishes itself from the sibling data tools, which perform specific operations.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
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 you need an overview of available tools. While it doesn't explicitly state alternatives or exclusions, the tool's self-referential nature and lack of competing help tools make the usage context clear.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_sleep_dataARead-only
Fetch nightly sleep data from Coros for a configurable time range.
Returns per-night sleep stage breakdown (deep, light, REM, awake) and sleep heart rate for each night. Data comes from the Coros mobile API (apieu.coros.com) which is separate from the Training Hub web API.
| Name | Required | Description | Default |
|---|---|---|---|
| weeks | No | Number of weeks to fetch (1–52). Default: 4. |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, and the description adds value by detailing the return payload (sleep stage breakdown and heart rate) and the data source distinction. It goes beyond the annotation by explaining what data is returned and the API context, though it doesn't disclose rate limits or auth requirements.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two concise sentences front-load the core purpose, followed by a useful note about the API source and return data. No unnecessary words or repetition of schema details.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a tool with one optional parameter and an output schema, the description explains the return data (per-night breakdown, heart rate) and the API origin. It doesn't mention auth prerequisites, but sibling tools like authenticate_coros_mobile and check_coros_auth fill that gap. The output schema handles return structure, so completeness is adequate.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The input schema has 100% description coverage for the single 'weeks' parameter, so the description doesn't need to add much. It mentions 'configurable time range' but doesn't elaborate on the weeks parameter beyond the schema. Baseline of 3 is appropriate given high schema coverage.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description uses a specific verb ('Fetch') and resource ('nightly sleep data from Coros'), clearly distinguishing this tool from siblings like get_daily_metrics and list_activities. It also specifies the configurable time range, which adds scope clarity.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description clearly implies it is the tool for sleep data from Coros and notes the API source (apieu.coros.com), which helps differentiate from Training Hub web API tools. However, it does not explicitly name alternatives or state when not to use this tool, so it falls short of a 5.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_activitiesCRead-only
List Coros activities for a date range.
| Name | Required | Description | Default |
|---|---|---|---|
| page | No | Page number (default 1). | |
| size | No | Results per page (default 30, max 100). | |
| end_day | Yes | End date in YYYYMMDD format — local calendar date (same convention as start_day). | |
| start_day | Yes | Start date in YYYYMMDD format — local calendar date (per COROS_TIMEZONE, defaults to system timezone). Example: "20250316" for March 16 in your timezone. |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true and openWorldHint=true, so the safety profile is known. The description adds no behavioral context beyond that—no mention of pagination behavior, timezone conventions, or result interpretation. It merely repeats the date-range concept already present in 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.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single sentence with no filler, and the main action is front-loaded. It loses a point because it is so terse that it omits useful context, but from a conciseness standpoint it is efficient.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With 4 parameters, an output schema, and 25 sibling tools, a one-line description is under-specified. It doesn't clarify what categories of activities are included, how this relates to list_planned_activities, or any edge cases. The output schema addresses return values, but the tool still needs more context for correct selection and invocation.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema descriptions cover 100% of parameters with formats, defaults, and examples, so the description carries no extra burden. The phrase 'date range' adds no new meaning beyond what start_day and end_day already communicate. Baseline 3 is appropriate since the schema does the heavy lifting.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the verb 'list' and the resource 'Coros activities' with a date range scope. It distinguishes from other list_* siblings like list_exercises, though it could be more explicit that these are completed activity records as opposed to planned activities.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
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. Given the large number of sibling tools, including list_planned_activities and list_exercises, the description offers no exclusions or preferred context, leaving the agent to guess which list tool to invoke.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_exercisesARead-only
List the exercise catalogue for a given sport type.
Useful for resolving strength/conditioning exercises (sport_type=4) that appear in planned workouts by name and ID.
| Name | Required | Description | Default |
|---|---|---|---|
| sport_type | No | Sport type ID. Default 4 = Strength. |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true and openWorldHint=true, so the safety profile is covered. The description adds the context about sport_type=4 being strength and its use for resolving planned workout entries, but does not disclose details like pagination, ordering, or catalogue scope. This is adequate given the annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two sentences, front-loaded with the core purpose and enriched with a practical use case. Every word earns its place; no redundancy or filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With high schema coverage, an output schema, and annotations already providing read-only/open-world context, the description is complete for selection and invocation. It provides enough integration context without needing to describe return values.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The input schema provides full coverage for the single parameter (sport_type) with a clear description and default. The description reinforces that sport_type=4 is Strength, adding slight value beyond the schema but no new parameter details.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description uses the specific verb 'List' and identifies the resource as 'the exercise catalogue', scoped by 'sport type'. This clearly distinguishes it from sibling tools like list_activities, list_workout_templates, and list_training_plans by focusing on exercises and mentioning their role in planned workouts.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description explicitly states a use case: resolving strength/conditioning exercises (sport_type=4) that appear in planned workouts. This gives clear context for when to use it, though it does not explicitly mention exclusions or alternatives.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_planned_activitiesARead-only
List planned (scheduled) activities from the Coros training calendar.
| Name | Required | Description | Default |
|---|---|---|---|
| end_day | Yes | End date in YYYYMMDD format. | |
| start_day | Yes | Start date in YYYYMMDD format. |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare read-only and open-world behavior, so the description does not need to repeat those. It adds 'from the Coros training calendar' as useful context, but does not disclose additional behavioral details like return format or pagination, though these are partially covered by the output schema.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single, front-loaded sentence that states the action and scope with no unnecessary words. It earns its place entirely.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple read-only list tool with two well-described parameters, an output schema, and informative annotations, the description is fully sufficient. It clearly identifies the resource and source without requiring further explanation.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100% with start_day and end_day both described as dates in YYYYMMDD format. The description adds no extra parameter meaning beyond what the schema already provides, so the baseline score of 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool lists planned (scheduled) activities from the Coros training calendar, using a specific verb and resource. It distinguishes itself from general list_activities by specifying 'planned' and from list_planned_activities_raw by not mentioning raw output.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description implies usage for retrieving scheduled activities but does not explicitly mention alternatives or exclusions. There is no guidance on when to use this vs. list_planned_activities_raw or list_activities.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_planned_activities_rawARead-only
List planned activities without stripping API fields.
Use this before updating an existing scheduled workout. The raw entity and program objects contain the identifiers and version fields required by update_scheduled_workout (planId, planProgramId, idInPlan, version, ...).
| Name | Required | Description | Default |
|---|---|---|---|
| end_day | Yes | ||
| start_day | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already indicate read-only and open-world semantics. The description adds valuable context about the raw response containing specific identifiers/version fields (planId, planProgramId, idInPlan, version), which is not visible in annotations. No contradiction.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is three concise sentences, each earning its place: purpose, usage context, and justification. It is front-loaded with the core action and avoids any filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With an output schema present and annotations covering safety, the description covers the essential context: what the tool does, when to use it, and why it matters. The description is sufficiently complete for a read-only list operation with 2 parameters.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, and the description does not explain the start_day or end_day parameters at all. The parameter names are suggestive of a date range, but the description provides no semantic meaning beyond the schema's pattern constraints.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the action ('List planned activities') and the distinguishing nuance ('without stripping API fields'), which differentiates it from the sibling tool list_planned_activities. It also gives a specific use case, making the purpose unambiguous.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description explicitly says 'Use this before updating an existing scheduled workout' and explains why: the raw fields contain identifiers and version info required by update_scheduled_workout. This gives strong when-to-use guidance and implicitly contrasts with other list tools.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_training_plansBRead-only
List training plans in the Coros account.
| Name | Required | Description | Default |
|---|---|---|---|
| status_list | No | Plan status values to query. Defaults to [1, 2], matching the Training Hub request. |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations declare readOnlyHint=true and openWorldHint=true, so the safety profile is known. The description adds minimal context by specifying 'in the Coros account', but it does not disclose any additional behavioral traits such as data scoping, pagination, or authentication requirements. The default status list behavior is already in the schema description, so the description itself adds little beyond the annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single, clear sentence that immediately communicates the tool's purpose. It is front-loaded and contains no filler or redundant information, making it appropriately concise and well-structured.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the tool's simplicity (one optional parameter), the presence of an output schema, and annotations indicating a safe read operation, the description is sufficient for basic use. It does not explicitly mention how it differs from the 'raw' sibling, but the output schema and sibling names provide enough context for an agent to infer the tool's role. Slightly more detail about the distinction would make it complete.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The schema description covers the only parameter 'status_list' at 100%, including its default and meaning. The tool description does not add any additional parameter semantics. With full schema coverage, the baseline of 3 applies, and no extra value is provided.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description 'List training plans in the Coros account' uses a specific verb and resource, clearly stating the tool's function. However, it does not differentiate from the sibling tool 'list_training_plans_raw', which likely serves a similar yet distinct purpose, so it misses the distinction requirement for a 5.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
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 does not mention when to prefer this over 'list_training_plans_raw' or any other sibling, nor does it state any prerequisites or exclusions. The only contextual hint is the default parameter behavior, but that is parameter semantics, not usage guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_training_plans_rawARead-only
List training plans without stripping API fields.
Use this when the full plan payload is needed, including entities and programs (e.g. to drive update_scheduled_workout).
| Name | Required | Description | Default |
|---|---|---|---|
| status_list | No |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The readOnlyHint annotation already covers safety; the description adds context by revealing the tool returns raw, unstripped fields and includes entities/programs. This goes beyond the annotation, providing behavioral differentiation from the likely stripped variant.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is two sentences, front-loaded with the core purpose, and has no filler. The second sentence gives practical context, making it efficient and well-structured.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the tool has an output schema and annotations, the description sufficiently clarifies the primary use case and raw-field behavior. It could have explained the status_list parameter's effect, but the overall context is mostly complete for a listing tool with a single optional filter.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0% and the description does not mention the 'status_list' parameter at all. The schema only provides type info (array of integers or null) and a default, leaving the meaning of status codes unexplained. The description fails to compensate for the low coverage.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool lists training plans with the specific behavior of not stripping API fields, and contrasts with the likely sibling list_training_plans. It uses a specific verb and resource with a distinguishing detail.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It explicitly says when to use this tool: 'when the full plan payload is needed, including entities and programs' and gives an example use case (update_scheduled_workout). While it doesn't state when not to use it, the 'use this when' phrasing implies the alternative for simpler needs.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_workout_templatesARead-only
List reusable workout templates saved in the Coros library.
These are templates created by save_workout_template / save_strength_workout_template — schedulable later via schedule_workout_template. One-off workouts scheduled with schedule_workout / schedule_strength_workout do NOT appear here.
Returns
dict with keys: workouts (list), count Each entry contains: id, name, sport_type, sport_name, estimated_time_seconds, exercise_count, exercises (list of steps with name, intensity_low, intensity_high, sets, and either duration_seconds for time-based steps or distance_meters for distance-based steps)
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Beyond the readOnlyHint annotation, the description discloses inclusion/exclusion behavior: only templates created by the save_* tools appear, not one-off scheduled workouts. It also transparently specifies the returned structure with keys like workouts and count, so the agent knows exactly what to expect.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is front-loaded with the core purpose and every subsequent sentence adds value: provenance, exclusions, and return format. It is detailed but not bloated, with no redundant phrasing.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no parameters, an output schema present, and annotations declaring read-only/open-world behavior, the description provides all the context needed to invoke the tool correctly. It names related creation/scheduling tools, clarifies exclusions, and documents the response shape.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The input schema has zero parameters, so there are no parameter semantics to explain; the baseline of 4 applies. The description instead focuses on return-value semantics, which is appropriate here.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
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: 'List reusable workout templates saved in the Coros library.' It also distinguishes the tool from related siblings by clarifying that templates come from save_workout_template / save_strength_workout_template and that one-off scheduled workouts are not included.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It explicitly states when to use the tool—listing reusable templates—and gives when-not guidance by saying one-off workouts from schedule_workout / schedule_strength_workout do NOT appear. It also points to related tools like schedule_workout_template, giving the agent clear routing context.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
remove_scheduled_workoutADestructive
Remove a scheduled workout from the Coros training calendar.
| Name | Required | Description | Default |
|---|---|---|---|
| plan_id | Yes | Top-level plan ID — the 'id' field returned by list_planned_activities. | |
| id_in_plan | Yes | The entity's idInPlan value from list_planned_activities. | |
| plan_program_id | No | The entity's planProgramId (leave empty to use id_in_plan). |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description only restates the basic action without adding behavioral context. Although the annotations already indicate destructiveHint and openWorldHint, the description does not disclose additional details such as permanence, side effects, or whether the removal is reversible. It adds no value beyond the structured data.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single sentence of 11 words, front-loaded with the action and object. It is exceptionally concise and structured, with no filler or redundant information.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the simplicity of the operation, the detailed input schema, and the existence of an output schema, the description is sufficiently complete. It could optionally include side-effect notes, but the core context is adequately conveyed for a destructive removal operation.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The input schema provides complete descriptions for all three parameters (plan_id, id_in_plan, plan_program_id), covering 100% of them. The tool description adds no additional parameter semantics, so the baseline score of 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the action (remove), the resource (scheduled workout), and the context (Coros training calendar), distinguishing it from siblings like update_scheduled_workout and schedule_workout. It is specific and unambiguous.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description implies the usage: remove a scheduled workout. However, it does not explicitly mention when to use this tool versus alternatives such as update_scheduled_workout or add_planned_workout, nor does it provide any exclusions or prerequisites. The guidance is minimal but not misleading.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
save_strength_workout_templateA
Save a REUSABLE strength workout TEMPLATE to the Coros library.
⚠️ This persists to the library indefinitely. Use ONLY when the user explicitly asks to "save as a template", "create a workout in my library", "add to my workout list".
For a ONE-OFF workout for a specific date — the common case — use schedule_strength_workout instead. That tool builds the workout inline and leaves no library residue.
If the user's intent is unclear, ASK THEM: "Do you want this saved as a reusable template in your library, or just scheduled as a one-off for [date]?" Don't guess.
| Name | Required | Description | Default |
|---|---|---|---|
| name | Yes | Workout name. | |
| sets | No | Number of full-circuit repetitions over the whole exercise list (default 1). Distinct from the per-exercise `sets` above. | |
| exercises | Yes | - origin_id (str): exercise catalogue ID from list_exercises - name (str): T-code name (e.g. "T1061") - overview (str): sid_ key (e.g. "sid_strength_squats") - target_type (int): 2=time in seconds, 3=reps - target_value (int): number of seconds or reps - rest_seconds (int): rest after this exercise (default 60). Use 0 to render as "Skip rests" in the Coros app. - sets (int, optional): number of consecutive sets of this exercise (default 1). Use this to get "3 sets of face pull in a row" instead of having to duplicate the exercise entry 3 times. - weight_kg (float, optional): prescribed weight in kg. - weight_lbs (float, optional): prescribed weight in pounds. Mutually exclusive with weight_kg — set at most one. The Coros app supports mixing kg/lbs per exercise within the same workout; this lbs exercise will display as lbs regardless of other exercises' units. Omitting BOTH fields renders as "Bodyweight" in the app (intensityValue is sent as an empty string, intensityCustom=1). Explicitly setting weight_kg=0 renders as "0.00 kg" — distinct from "Bodyweight". For dumbbell exercises this is the per-hand weight by convention. The Coros app shows a single weight per exercise — it does not render ranges. |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The warning 'This persists to the library indefinitely' goes beyond the annotations, disclosing a long-term side effect. It also explains the contrast with schedule_strength_workout ('leaves no library residue'), giving the agent a clear mental model of the persistence behavior. No contradiction with annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is slightly long but every sentence earns its place: the warning, conditional usage rule, alternative tool reference, and clarification prompt are all high-signal. It is front-loaded with the core purpose and structured with clear sections.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the tool's mutation side effect and the existence of a close sibling, the description fully covers when to use it, when not to, what to do on ambiguity, and the persistence consequences. The presence of an output schema means details about return values are not required in the description.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% and the input schema provides rich descriptions for all parameters, including detailed subsemantics for the exercises array. The tool description itself does not add parameter meaning beyond what the schema already provides, so the baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a clear verb+resource+destination: 'Save a REUSABLE strength workout TEMPLATE to the Coros library.' It distinguishes this tool from schedule_strength_workout by emphasizing persistence and reuse, so the agent knows exactly what it does and how it differs from siblings.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description gives explicit when-to-use guidance: 'Use ONLY when the user explicitly asks to save as a template...' It names the alternative schedule_strength_workout for one-off workouts, and instructs the agent to ask the user if intent is unclear. This is exemplary usage guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
save_workout_templateA
Save a REUSABLE cycling/intervals/running workout TEMPLATE to the Coros library.
⚠️ This persists to the library indefinitely. Use ONLY when the user explicitly asks to "save as a template", "create a workout in my library", "add to my workout list", or otherwise indicates they want a reusable template.
For a ONE-OFF workout for a specific date — the common case — use schedule_workout instead. That tool builds the workout inline and leaves no library residue.
If the user's intent is unclear, ASK THEM: "Do you want this saved as a reusable template in your library, or just scheduled as a one-off for [date]?" Don't guess.
The saved template appears in the Coros app under Workouts and can be synced to the watch for guided execution.
| Name | Required | Description | Default |
|---|---|---|---|
| name | Yes | Workout name (e.g. "Z2 Erholung 60min"). | |
| steps | Yes | List of workout steps. Each step is either a plain step or a repeat group. Plain step: - name (str): step label, e.g. "10:00 Warm-up" - duration_minutes (float) OR duration_meters (float): step length, time-based or distance-based. Use duration_meters for a step that should end at a real distance regardless of pace (e.g. "1000" for a 1km rep) rather than an estimated time -- a duration_minutes step ends after that much elapsed time even if actual pace made it cover more or less than the intended distance. Exactly one of the two is required. - intensity_low (int): lower intensity target (watts, BPM, etc. depending on intensity_type) - intensity_high (int): upper intensity target (0 = open-ended) Note: power_low_w / power_high_w are accepted as legacy aliases for intensity_low / intensity_high. Repeat group (for intervals): - repeat (int): number of repetitions - steps (list[dict]): sub-steps (same format as plain steps) Example: [ | |
| sport_type | No | Sport type ID, in the ACTIVITY namespace (the same IDs list_activities returns). Default 2 = Indoor Cycling (indoor trainer). - Cycling: 2 = Indoor Cycling (indoor trainer), 200 = Road Bike (outdoor), 201 = Indoor Cycling (alt) - Running: 100 = Running, 102 = Trail Running, 103 = Track Running Running IDs are mapped internally to the workout-API wire ID (sportType=1) and given the metadata block COROS requires for runs. Do NOT pass 1 directly — it's the internal wire ID and is rejected. | |
| intensity_type | No | Intensity type ID. Defaults per sport when omitted: runs → 2 (HR), cycling → 6 (power in watts). Other IntensityType values: 1=weight, 2=HR, 3=pace, 4=speed, 5=none, 6=power, 7=cadence |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations indicate readOnlyHint=false and destructiveHint=false, but the description goes further by disclosing that this 'persists to the library indefinitely', appears in the Coros app under Workouts, and can be synced to the watch. This adds real behavioral context beyond the annotations and does not contradict them.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Although the description is longer than average, every section earns its place: purpose, persistence warning, sibling alternative, user-disambiguation prompt, and post-save outcome. The critical caveat is front-loaded with a warning symbol, and the structure is easy to scan.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The description is complete for a high-stakes persistence operation: it explains side effects, required user intent, alternatives, and disambiguation. With a rich input schema and an output schema present, nothing essential for correct invocation is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The tool description itself adds little parameter-level detail, but the input schema already provides thorough coverage of all parameters, including sport_type wire-ID mappings and intensity_type defaults. At 100% schema coverage, the baseline of 3 applies; no additional parameter semantics are needed.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with a precise verb and resource: 'Save a REUSABLE cycling/intervals/running workout TEMPLATE to the Coros library.' It clearly distinguishes this from one-off scheduling and names the sibling tool, schedule_workout, making the purpose unambiguous.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It explicitly states when to use the tool ('only when the user explicitly asks to save as a template'), when not to use it (one-off workout: use schedule_workout instead), and instructs the agent to ask the user when intent is unclear. This is exemplary routing guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
schedule_strength_workoutA
Schedule a ONE-OFF strength workout for a specific date.
This is the COMMON case. Use this whenever the user wants a strength workout on a specific date and doesn't explicitly ask for a reusable template. Does NOT save to the Coros library — leaves no template behind.
For a REUSABLE library template instead, use save_strength_workout_template (which saves it for re-scheduling later via schedule_workout_template).
If the user's intent is unclear, ASK THEM: "Do you want this saved as a reusable template in your library, or just scheduled as a one-off for [date]?" Don't guess.
| Name | Required | Description | Default |
|---|---|---|---|
| name | Yes | Workout name as it should appear on the calendar. | |
| sets | No | Number of full-circuit repetitions (default 1). | |
| sort_no | No | Order within the day (default 1). | |
| exercises | Yes | Same shape as save_strength_workout_template (origin_id, name, overview, target_type, target_value, rest_seconds, optional weight_kg or weight_lbs, optional per-exercise sets). | |
| happen_day | Yes | Date in YYYYMMDD format. |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Description discloses a key behavioral trait not available from annotations: 'Does NOT save to the Coros library — leaves no template behind.' It also sets expectations for handling ambiguous user intent ('If the user's intent is unclear, ASK THEM'). Annotations already indicate this is a write operation (readOnlyHint=false) and not destructive, but the description adds crucial context about the lack of persistent template 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.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is well-structured and front-loaded with the core purpose. It uses a clear multi-paragraph format with key information in the first line, followed by usage guidance and disambiguation. Every sentence adds value, though slightly verbose with the quoted question, but this earns its place. Not overly long, but could be trimmed slightly without losing intent.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the tool's moderate complexity (5 params, 3 required, nested exercise array) and the presence of an output schema, the description covers all essential context: the one-off nature, distinction from template-saving siblings, and clear instructions for ambiguous cases. No gaps remain for an agent 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.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The input schema has 100% coverage for all five parameters, so the baseline is 3. The description does not add additional parameter-level meaning beyond the schema; it only cross-references the exercises shape to another tool ('Same shape as save_strength_workout_template'), which is already stated in the schema. No extra semantic value is provided beyond the schema's documentation.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool's primary action: 'Schedule a ONE-OFF strength workout for a specific date.' It specifies the exact verb (schedule), resource (strength workout), and scope (one-off, specific date). It also explicitly distinguishes from sibling tools like save_strength_workout_template, eliminating ambiguity about which tool to use.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description gives explicit when-to-use guidance: 'Use this whenever the user wants a strength workout on a specific date and doesn't explicitly ask for a reusable template.' It provides a clear alternative for reusable templates ('use save_strength_workout_template') and instructs the agent to ask the user when intent is unclear, including a direct question template. This is exceptionally actionable.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
schedule_workoutA
Schedule a ONE-OFF cycling/intervals/running workout for a specific date.
This is the COMMON case. Use this whenever the user wants a workout on a specific date and doesn't explicitly ask for a reusable template. Does NOT save to the Coros library — leaves no template behind.
For a REUSABLE library template instead, use save_workout_template (which saves it for re-scheduling later via schedule_workout_template).
If the user's intent is unclear, ASK THEM: "Do you want this saved as a reusable template in your library, or just scheduled as a one-off for [date]?" Don't guess.
| Name | Required | Description | Default |
|---|---|---|---|
| name | Yes | Workout name as it should appear on the calendar. | |
| steps | Yes | Same shape as save_workout_template: plain steps or repeat groups. | |
| sort_no | No | Order within the day (default 1). | |
| happen_day | Yes | Date in YYYYMMDD format. | |
| sport_type | No | Sport type ID, in the ACTIVITY namespace (as list_activities returns). Default 2 = Indoor Cycling. 200 = Road Bike, 201 = Indoor Cycling (alt). 100 = Running, 102 = Trail Running, 103 = Track Running — these map internally to the workout wire ID (sportType=1) and get the running metadata block. Don't pass 1 directly (it's the wire ID and is rejected). | |
| intensity_type | No | Intensity type ID. Defaults per sport when omitted: runs → 2 (HR), cycling → 6 (power in watts). |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already convey readOnly=false and destructive=false. The description adds key behavioral context: 'Does NOT save to the Coros library — leaves no template behind,' and details sport_type wire ID rejection ('Don't pass 1 directly'). This enriches the agent's understanding beyond the structured hints, though it doesn't cover all 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.
Is the description appropriately sized, front-loaded, and free of redundancy?
The first sentence states the purpose, followed by concise usage boundaries and an explicit clarification prompt. Every sentence earns its place; the quoted user question is structural guidance, not fluff. The length is appropriate for the tool's decision complexity.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The description covers the common case, the alternative path, essential behavioral notes (no template saved), parameter edge cases (sport_type internal mapping), and a decision heuristic for ambiguous intent. With an output schema present, return values need not be detailed, making this complete for the tool's context.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema covers 100% of parameters with detailed descriptions (e.g., sport_type defaults, intensity_type defaults, happen_day format). The description adds value by cross-referencing the steps shape to save_workout_template and clarifying sport type categories align with the schema's values, which goes beyond a pure schema summary.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with 'Schedule a ONE-OFF cycling/intervals/running workout for a specific date,' using a specific verb and resource that clearly distinguishes it from reusable-template siblings. It explicitly contrasts itself with save_workout_template, leaving no ambiguity about scope.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Provides explicit when-to-use ('whenever the user wants a workout on a specific date and doesn't explicitly ask for a reusable template'), when-not-to-use (reusable template → save_workout_template), and even an ask-if-unclear script with a direct quote. This is model guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
schedule_workout_templateA
Add an existing library workout TEMPLATE to the training calendar.
Use this only when scheduling a previously-saved template by ID. For a one-off workout that doesn't need to live in the library, use the inline tools instead: schedule_workout (cycling/intervals) or schedule_strength_workout (strength).
| Name | Required | Description | Default |
|---|---|---|---|
| sort_no | No | Order within the day if multiple workouts are scheduled (default 1). | |
| happen_day | Yes | Date in YYYYMMDD format. | |
| workout_id | Yes | ID of the workout template to schedule (from list_workout_templates, save_workout_template, or save_strength_workout_template). |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already cover read-only and destructive hints. The description adds meaningful context by clarifying this schedules an existing template (not a one-off) and points to the ID requirement. It does not discuss side effects like device sync (openWorldHint), but this is partially mitigated by annotations and output schema.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three sentences, front-loaded with purpose, then usage guidance. No redundant wording; every sentence adds value.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the output schema and full parameter schema coverage, the description is sufficient for correct tool selection and invocation. It provides purpose, selection criteria, and alternatives without unnecessary detail.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema covers 100% of parameters with descriptions, so the description doesn't need to explain each. The description reinforces the workout_id semantics ('previously-saved template') but adds little beyond what the schema already states.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool adds an existing library workout template to the training calendar. It specifically names the resource ('library workout TEMPLATE') and action ('Add'), and distinguishes itself from one-off scheduling tools by name.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly states when to use: 'only when scheduling a previously-saved template by ID'. Also provides clear alternatives: 'use the inline tools instead: schedule_workout (cycling/intervals) or schedule_strength_workout (strength)'.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
sync_coros_dataAIdempotent
Sync Coros data for a date range into the local SQLite cache.
After the first full sync, subsequent calls to get_daily_metrics, get_sleep_data, and list_activities will serve historical data from cache and only fetch the incremental tail from the API.
For large date ranges (> 6 months), call this tool in segments to avoid timeout (e.g. one segment per year). For the initial full historical backfill, use the CLI instead: coros-mcp sync --from 20230101
| Name | Required | Description | Default |
|---|---|---|---|
| end_day | No | End of sync range in YYYYMMDD format — local calendar date (same convention as start_day). Defaults to today if omitted. | |
| start_day | No | Start of sync range in YYYYMMDD format — local calendar date (per COROS_TIMEZONE, defaults to system timezone). Defaults to two years ago if omitted. |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Beyond annotations, the description discloses cache side effects, incremental behavior after first sync, and timeout risks for large ranges. It also mentions the CLI alternative for backfills, which annotations do not convey. No contradiction with readOnlyHint=false or idempotentHint=true.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is very concise: three sentences, each serving a clear purpose (what it does, post-sync behavior, usage advice). It is front-loaded with the core purpose and contains no fluff or redundant details.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Despite having an output schema, the description covers essential behavioral context: cache population, downstream effects, timeout avoidance, and CLI alternative. For a sync tool with side effects and optional parameters, this is comprehensive and leaves no obvious gaps.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% with both start_day and end_day described in detail (format, defaults, timezone). The description adds no additional parameter-level meaning beyond what the schema already provides, so the baseline of 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool syncs Coros data for a date range into a local SQLite cache, using a specific verb-resource pair. It distinguishes itself from read tools like get_daily_metrics by explaining its role as a cache population step.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly explains when to use this tool (before reads), what happens after first sync, and gives alternative guidance for large ranges (segmenting) and initial backfill (use CLI). This directly contrasts with sibling tools and prevents misuse.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
update_scheduled_workoutADestructive
Update an existing scheduled workout on the Coros training calendar.
Workflow: fetch the day with list_planned_activities_raw, edit the entity / program objects, and (if exercises changed) run them through calculate_workout_program first to refresh derived metrics.
| Name | Required | Description | Default |
|---|---|---|---|
| entity | Yes | Raw entity object from list_planned_activities_raw, with any intended edits applied. Must include idInPlan and planId. | |
| program | Yes | Raw or calculated program object. If exercises changed, first call calculate_workout_program and pass its returned program here. | |
| version_object | No | Optional explicit version object. If omitted, it is built from entity / program with status=2 (update). |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=false and destructiveHint=true, so the description only needs to add context. It does so by explaining the prerequisite data fetching and the need to recalculate derived metrics via calculate_workout_program. This adds behavioral insight beyond the structured annotations and does not contradict them.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is exceptionally concise: two sentences. The first states purpose, the second provides a structured workflow. No filler or redundant content. Front-loaded and every sentence earns its place.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a complex update tool with nested objects and dependencies, the description covers the workflow, prerequisite tools, and a conditional step. The output schema exists, so return values are documented. It could mention reversible/destructive consequences, but the destructiveHint annotation covers that. Overall, it 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.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The input schema covers all parameters with descriptions (100% coverage), including the role of entity and program and the default behavior of version_object. The description's workflow reiterates this context but adds no new syntactic or semantic details beyond what the schema already provides. Baseline 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool's function: 'Update an existing scheduled workout on the Coros training calendar.' This is a specific verb and resource, and the term 'existing' distinguishes it from creation tools like schedule_workout. The workflow references sibling tools, further clarifying its role.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides a clear workflow: fetch the day with list_planned_activities_raw, edit entity/program, and run through calculate_workout_program if exercises changed. This is explicit usage guidance with named alternatives and a condition. However, it does not explicitly state when not to use the tool or contrast it with other update/schedule tools, so the score is 4 rather than 5.
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 tool update
v0.1.1- Changed
save_workout_template1 field changed- changed
Input schema / properties / steps / descriptionPrevious value: -"List of workout steps. Each step is either a plain step or a repeat group.\n\nPlain step:\n- name (str): step label, e.g. \"10:00 Warm-up\"\n- duration_minutes (float): step duration in minutes\n- intensity_low (int): lower intensity target (watts, BPM, etc. depending on intensity_type)\n- intensity_high (int): upper intensity target (0 = open-ended)\nNote: power_low_w / power_high_w are accepted as legacy aliases for intensity_low / intensity_high.\n\nRepeat group (for intervals):\n- repeat (int): number of repetitions\n- steps (list[dict]): sub-steps (same format as plain steps)\n\nExample:\n["New value: +"List of workout steps. Each step is either a plain step or a repeat group.\n\nPlain step:\n- name (str): step label, e.g. \"10:00 Warm-up\"\n- duration_minutes (float) OR duration_meters (float): step length,\n time-based or distance-based. Use duration_meters for a step that\n should end at a real distance regardless of pace (e.g. \"1000\" for\n a 1km rep) rather than an estimated time -- a duration_minutes\n step ends after that much elapsed time even if actual pace made it\n cover more or less than the intended distance. Exactly one of the\n two is required.\n- intensity_low (int): lower intensity target (watts, BPM, etc. depending on intensity_type)\n- intensity_high (int): upper intensity target (0 = open-ended)\nNote: power_low_w / power_high_w are accepted as legacy aliases for intensity_low / intensity_high.\n\nRepeat group (for intervals):\n- repeat (int): number of repetitions\n- steps (list[dict]): sub-steps (same format as plain steps)\n\nExample:\n["
26 tool updates
v0.1.0- First observed
add_planned_workout - First observed
authenticate_coros - First observed
authenticate_coros_mobile - First observed
calculate_workout_program - First observed
check_coros_auth - First observed
delete_workout_template - First observed
get_activity_detail - First observed
get_cache_status - First observed
get_daily_metrics - First observed
get_help - First observed
get_sleep_data - First observed
list_activities - First observed
list_exercises - First observed
list_planned_activities - First observed
list_planned_activities_raw - First observed
list_training_plans - First observed
list_training_plans_raw - First observed
list_workout_templates - First observed
remove_scheduled_workout - First observed
save_strength_workout_template - First observed
save_workout_template - First observed
schedule_strength_workout - First observed
schedule_workout - First observed
schedule_workout_template - First observed
sync_coros_data - First observed
update_scheduled_workout
TDQS
Most tools have clearly distinct purposes, and the descriptions are careful to distinguish one-off scheduling from reusable templates and raw from cleaned list variants. However, the cluster of scheduling tools (schedule_workout, schedule_strength_workout, schedule_workout_template, add_planned_workout) and the paired raw/non-raw list tools still create some potential for misselection.
The vast majority of tools follow a clear verb_noun pattern (list_, get_, save_, schedule_, delete_, update_, remove_). Minor inconsistencies exist, such as add_planned_workout vs. schedule_workout and the raw suffix on only some list tools, but overall the naming is predictable and readable.
With 26 tools, the server crosses the threshold where the surface feels too heavy for an agent to navigate comfortably. Many tools are individually justified, but the raw variants, cache management utilities, and multiple scheduling entry points add notable bulk.
The tool set covers the core Coros workflows well: authentication, metrics and sleep retrieval, activity listing/detail, workout template CRUD, scheduled workout create/update/remove, and cache syncing. Minor gaps exist, such as no dedicated create/delete training plan tools or a single planned-activity getter, but raw list and calculate tools provide workarounds.
Maintenance
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
Pace is a remote MCP server that exposes wearable and fitness data to Claude via the Model Context Protocol. It connects to Garmin, Oura, Whoop, Polar, Fitbit and 20+ devices and provides 15 tools for querying sleep, activity, recovery, and training data. Hosted on Google Cloud Run, OAuth 2.1 authentication, Streamable HTTP transport. Instructions: First you need to create an account at: https://pacetraining.co and connect your wearables. After that you can connect the remote Server via Custom Connector in Claude and OAuth 2.1 Flow startet.
- SomviaOAuthapp.somvia
Private Apple Health metrics and workout detail for ChatGPT, Claude, and any MCP client.
A comprehensive Model Context Protocol (MCP) server that enables AI assistants to interact with yo…
MCP server for Withings health data — sleep, activity, heart, and body metrics.
Related MCP Servers
- AlicenseAqualityFmaintenanceA Model Context Protocol (MCP) server for Intervals.icu integration. Access your training data, wellness metrics, and performance analysis through Claude and other LLMs.4835MIT
- AlicenseNot gradedqualityDmaintenanceA Model Context Protocol (MCP) server that gives Claude access to your WHOOP biometric data — recovery, sleep, strain, and workouts.47MIT
- AlicenseNot gradedqualityDmaintenanceThis Model Context Protocol (MCP) server connects to Garmin Connect and exposes your fitness and health data to Claude and other MCP-compatible clients.1MIT
- AlicenseNot gradedqualityAmaintenanceA Model Context Protocol (MCP) server that brings your Withings health data into Claude, allowing natural conversation access to sleep patterns, body measurements, workouts, heart data, and more.39MIT
Latest Blog Posts
- Who's Calling? MCP Hosts Are an Identity Blind Spot (And the Spec Knows It)By Om-Shree-0709 on .mcpAgent IdentityOAuth 2.1
- Your AI Chatbot Just Exposed Your CEO's Salary to an InternBy Om-Shree-0709 on .Agent IdentityMCP SecurityOAuth Delegation
- Why MCP Servers Need Execution Sandboxing (And Why Your Current Stack Isn't Enough)By Om-Shree-0709 on .Agentic AiPrompt InjectionWebAssembly
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/cygnusb/coros-mcp'
If you have feedback or need assistance with the MCP directory API, please join our Discord server