by cygnusb
MCP server for AI assistants to read and manage Coros fitness data: sleep, HRV, daily metrics, activities, and structured workouts via the unofficial Coros API
# Add to your Claude Code skills
git clone https://github.com/cygnusb/coros-mcpLast scanned: 7/16/2026
{
"issues": [],
"status": "PASSED",
"scannedAt": "2026-07-16T06:18:54.953Z",
"npmAuditRan": true,
"pipAuditRan": true,
"promptInjectionRan": true
}coros-mcp is an open-source ai agents skill for AI coding assistants such as Claude Code, Codex CLI, and ChatGPT, built by cygnusb. MCP server for AI assistants to read and manage Coros fitness data: sleep, HRV, daily metrics, activities, and structured workouts via the unofficial Coros API. It has 100 GitHub stars.
Yes. coros-mcp passed SkillsLLM's automated security scan — a dependency vulnerability audit plus prompt-injection heuristics — with no high-severity issues. You can read the full report in the Security Report section on this page.
Clone the repository with "git clone https://github.com/cygnusb/coros-mcp" and add it to your Claude Code skills directory (see the Installation section above).
coros-mcp is primarily written in Python. It is open-source under cygnusb on GitHub, so you can review or fork the full source.
Yes. SkillsLLM lists many other AI Agents skills you can browse and compare side by side. Open the AI Agents category from the badge at the top of this page, or use the Related Skills and comparison links further down to weigh coros-mcp against similar tools.
No comments yet. Be the first to share your thoughts!
[!IMPORTANT] 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.
Ask your AI assistant questions like:
| Tool | Description |
|---|---|
authenticate_coros |
Log in with email and password — token stored securely in keyring |
authenticate_coros_mobile |
Log in to the mobile API only (useful for sleep data troubleshooting) |
check_coros_auth |
Check whether a valid auth token is present |
get_daily_metrics |
Fetch daily metrics (HRV, resting HR, training load, VO2max, stamina, and more) for n weeks (default: 4) |
get_sleep_data |
Fetch nightly sleep stages (deep, light, REM, awake) and sleep HR for n weeks (default: 4) |
list_activities |
List activities for a date range with summary metrics |
get_activity_detail |
Fetch full detail for a single activity (laps, HR zones, power zones) |
list_workout_templates |
List reusable workout templates saved in the library |
save_workout_template |
Save a reusable cycling/intervals workout template (named steps, power targets) |
save_strength_workout_template |
Save a reusable strength workout template (sets, reps, or timed exercises) |
delete_workout_template |
Delete a saved workout template from the library |
list_planned_activities |
List planned workouts from the Coros training calendar |
schedule_workout |
Schedule a one-off cycling/intervals workout for a date (no library entry) |
schedule_strength_workout |
Schedule a one-off strength workout for a date (no library entry) |
schedule_workout_template |
Schedule an existing library template on a calendar day |
remove_scheduled_workout |
Remove a scheduled workout from the calendar |
list_exercises |
Browse the Coros exercise catalogue, especially for strength workouts |
sync_coros_data |
Backfill all data into the local SQLite cache for a date range |
get_cache_status |
Show coverage (record counts and date ranges) of the local cache |
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.
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 .
claude mcp add coros -- /path/to/coros-mcp/.venv/bin/coros-mcp serve
To 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 serve
Or 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"]
}
}
}
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=eu
The 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 auth
You 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 tokens
authenticate_corosLog 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_mobileAuthenticate 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_authCheck 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_metricsFetch 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 |
— | Date (YYYYMMDD) |
avg_sleep_hrv |
dayDetail | Nightly HRV (RMSSD ms) |
baseline |
dayDetail | HRV rolling baseline |
rhr |
dayDetail | Resting heart rate (bpm) |
training_load |
dayDetail | Daily training load |
training_load_ratio |
dayDetail | Acute/chronic training load ratio |
tired_rate |
dayDetail | Fatigue rate |
ati / cti |
dayDetail | Acute / chronic training index |
distance / duration |
dayDetail | Distance (m) / duration (s) |
vo2max |
analyse (merge) | VO2 Max (last ~28 days) |
lthr |
analyse (merge) | Lactate threshold heart rate (bpm) |
ltsp |
analyse (merge) | Lactate threshold pace (s/km) |
stamina_level |
analyse (merge) | Base fitness level |
stamina_level_7d |
analyse (merge) | 7-day fitness trend |
get_sleep_dataFetch 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 |
Date (YYYYMMDD) — the morning after the sleep |
total_duration_minutes |
Total sleep in minutes |
phases.deep_minutes |
Deep sleep |
phases.light_minutes |
Light sleep |
phases.rem_minutes |
REM sleep |
phases.awake_minutes |
Time awake during the night |
phases.nap_minutes |
Daytime nap time (null if none) |
avg_hr |
Average heart rate during sleep |
min_hr |
Minimum heart rate during sleep |
max_hr |
Maximum heart rate during sleep |
quality_score |
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_activitiesList activities for a date range.
{ "start_day": "20260101", "end_day": "20260305", "page": 1, "size": 30 }
Returns: activities (list),