TrainingPeaks MCP Server
A Model Context Protocol server for TrainingPeaks with an analytics focus — enabling real-time querying of training data, performance trends, CTL/ATL/TSB analysis, and training load optimization through Claude Desktop.
# Install and run — no cloning needed
uvx tp-mcp-server
Features
14 tools organized across 5 categories:
| Category | Tools | Description |
|---|---|---|
| Auth | tp_auth_status, tp_refresh_auth |
Check/refresh authentication |
| Profile | tp_get_profile |
Athlete profile + auto-detect ID |
| Workouts | tp_get_workouts, tp_get_workout |
List and detail past workouts |
tp_get_planned_workouts |
Upcoming planned workouts with coach instructions | |
| Fitness | tp_get_fitness |
CTL/ATL/TSB with computed values |
| Peaks | tp_get_peaks, tp_get_workout_prs |
Personal records by sport |
| Analytics | tp_training_load_summary |
Weekly/monthly TSS, load ramp rate |
tp_fitness_trend |
CTL trajectory, 7-day projection | |
tp_workout_analysis |
Efficiency factor, variability index | |
tp_performance_summary |
Sport-specific volume & consistency | |
tp_training_zones_distribution |
IF-based zone breakdown |
Key feature: CTL/ATL/TSB are computed from TSS using standard exponential weighted moving averages (42-day/7-day time constants), since the TP API doesn't return these values directly.
Quick Start (recommended)
The fastest way to get running — no cloning or venv needed.
1. Install uv (if you don't have it)
uv is a fast Python package manager built by Astral (the company behind Ruff). It includes uvx, a tool that can download and run Python packages in isolated environments — no manual setup needed. It's open-source, widely adopted in the Python community, and used by projects like FastAPI, Pydantic, and many MCP servers.
curl -LsSf https://astral.sh/uv/install.sh | sh
2. Get your TrainingPeaks auth cookie
- Open your browser and go to trainingpeaks.com and log in
- Open Developer Tools (
Cmd+Option+Ion Mac,F12on Windows/Linux) - Click the Application tab (Chrome/Edge) or Storage tab (Firefox)
- In the left sidebar, expand Cookies and click on
https://www.trainingpeaks.com - Find the cookie named
Production_tpAuth - Double-click its Value column and copy the entire string
3. Add to Claude Desktop
Open your Claude Desktop config file:
- macOS:
~/Library/Application Support/Claude/claude_desktop_config.json - Windows:
%APPDATA%\Claude\claude_desktop_config.json - Linux:
~/.config/Claude/claude_desktop_config.json
Note: If this file doesn't exist yet (first time configuring an MCP server), create it yourself. On macOS, the
Claudefolder insideApplication Supportshould already exist if you've opened Claude Desktop at least once — you just need to create theclaude_desktop_config.jsonfile inside it.
First, find the full path to uvx:
which uvx
This will output something like /Users/yourname/.local/bin/uvx.
Then add this to your config (replace the command path and your_cookie_value):
{
"mcpServers": {
"trainingpeaks": {
"command": "/Users/yourname/.local/bin/uvx",
"args": ["tp-mcp-server"],
"env": {
"TP_AUTH_COOKIE": "your_cookie_value"
}
}
}
}
Important: You must use the full absolute path to
uvx(not just"uvx"). Claude Desktop has a limited PATH and won't find it otherwise.
4. Restart Claude Desktop
Fully quit and reopen Claude Desktop. You should see "trainingpeaks" listed as a connected MCP server (look for the hammer icon).
That's it — no cloning, no virtual environments. uvx automatically downloads and runs the package from PyPI.
Alternative: Install from source
If you want to modify the code or contribute:
Prerequisites
- Python 3.12+
- uv (recommended) or pip
Steps
git clone https://github.com/banananovej-chuan/tp-mcp-server.git
cd tp-mcp-server
uv venv --python 3.12
uv pip install .
Get your cookie (see step 2 above), then configure the environment:
cp .env.example .env
# Edit .env and paste your cookie value
For Claude Desktop, use the absolute path to the venv Python:
{
"mcpServers": {
"trainingpeaks": {
"command": "/absolute/path/to/tp-mcp-server/.venv/bin/python",
"args": ["-m", "tp_mcp_server"],
"env": {
"TP_AUTH_COOKIE": "your_cookie_value"
}
}
}
}
Important: The
commandpath must be an absolute path. On macOS/Linux it starts with/, on Windows use the full path likeC:\\Users\\yourname\\tp-mcp-server\\.venv\\Scripts\\python.exe. Do not use~or relative paths.
Example Queries
Once connected in Claude Desktop, try:
- "What's my current fitness level?"
- "Show my planned workouts for the next 2 weeks"
- "Show my training load trend for the last 3 months"
- "Analyze my last bike workout"
- "What are my power PRs?"
- "How is my training zone distribution this month?"
- "Compare my bike performance over the last 90 days"
Refreshing Your Auth Cookie
The TrainingPeaks auth cookie expires periodically (typically every few days to weeks). When it expires:
- You'll see authentication errors in Claude Desktop
- Re-extract the cookie from your browser (repeat Step 2 from Quick Start)
- Update the
TP_AUTH_COOKIEvalue in your Claude Desktop config (and.envfile if using source install) - Restart Claude Desktop
Architecture
src/tp_mcp_server/
├── server.py # FastMCP entry point
├── mcp_instance.py # Shared MCP instance
├── config.py # Environment config
├── api/
│ ├── client.py # Async httpx client, token management
│ └── endpoints.py # API URL constants
├── auth/
│ ├── storage.py # Cookie storage (env/keyring)
│ └── browser.py # Browser cookie extraction
├── tools/
│ ├── auth.py # Auth status/refresh
│ ├── profile.py # Athlete profile
│ ├── workouts.py # Workout list/detail
│ ├── fitness.py # CTL/ATL/TSB data
│ ├── peaks.py # Personal records
│ └── analytics.py # Derived analytics
├── models/
│ ├── workout.py # Workout models
│ ├── fitness.py # Fitness models + CTL computation
│ ├── peaks.py # PR models
│ └── profile.py # Profile model
└── utils/
├── dates.py # Date helpers
└── formatting.py # Output formatting
Known Limitations
- Internal API: TrainingPeaks has no public API. This uses the same internal API as the web app, which could change without notice.
- Cookie auth: Requires periodic browser re-login to refresh the cookie.
- Sport-level PRs: The
/personalrecord/v2/athletes/{id}/{sport}endpoint returns 500. PRs are aggregated from individual workouts instead. - CTL/ATL/TSB: The API returns
"NaN"for these values. They are computed locally from TSS data. - Rate limiting: Requests are throttled to 150ms apart to avoid hitting TP rate limits.
Metadata
Release files for tp-mcp-server 0.2.3
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Source distribution (sdist)
| File | Size | Uploaded | |
|---|---|---|---|
| tp_mcp_server-0.2.3.tar.gz | 83.7 kB | Details |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Reset |
|---|---|---|---|---|
| tp_mcp_server-0.2.3-py3-none-any.whl | Python 3 | none | any | Details |
Total release size: 116.9 kB
Release files / tp_mcp_server-0.2.3.tar.gz
| Download URL | tp_mcp_server-0.2.3.tar.gz |
|---|---|
| Size | 83.7 kB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
a81f687d75f89a384eb9f5d9c30f50f57f2514059b87cd39f18c7ce9370129ba
|
|
BLAKE2b-256 checksum How to use checksums |
8350f654c276ad09365ebf0d0048a466c8b37dd242f1a01c41df0491223e3920
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
uv/0.10.4 {"installer":{"name":"uv","version":"0.10.4","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"macOS","version":null,"id":null,"libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":null}
|
Release files / tp_mcp_server-0.2.3-py3-none-any.whl
| Download URL | tp_mcp_server-0.2.3-py3-none-any.whl |
|---|---|
| Size | 33.2 kB |
| Tags | Python 3 |
|
SHA-256 checksum How to use checksums |
be4257e1c78962bd37959b222083b82c971e898ba1e72692a04760961aee6f8c
|
|
BLAKE2b-256 checksum How to use checksums |
8f5139538a0b67205a3ae8f51fc15025f15268bfc93a01f34c566de968c3b2d9
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
uv/0.10.4 {"installer":{"name":"uv","version":"0.10.4","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"macOS","version":null,"id":null,"libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":null}
|