Local-first MCP server for private endurance-training file analysis.
paceline-mcp defines 26 tools with consistent verb-noun naming (get_*, list_*, sync_*) and detailed descriptions (avg 120 chars). All tools have Zod schemas with typed parameters and constraints (e.g., limit 1-500, days 1-365). However, output schemas are not documented, responses are JSON-stringified without field-level documentation. Three tools appear duplicated (explain_training_load, assess_readiness, identify_training_risks at indices 11-13 and 23-25), suggesting composition issues. Error handling is minimal, no recovery guidance or actionable error messages visible in source. Parameter descriptions are adequate but lack dependency hints (e.g., 'FTP must be configured for power-derived load'). No tool annotations (readOnlyHint/destructiveHint) despite clear risk classifications in metadata.
Analyse a bounded local training block: volume, load, weekly pattern, intensity distribution, highlights, and comparison with the preceding equal-length period. Values are unavailable when inputs are insufficient. Read-only.
Assess today's readiness from sleep, HRV, resting heart rate, and reported fatigue. Read-only.
Assess training form from TrainingPeaks load. Garmin recovery signals are not yet connected. Read-only.
Compare recent and preceding local periods by activity count, duration, distance, and available load. Read-only.
Create a non-publishing weekly bike-training draft from recent completed TrainingPeaks load.
Create a non-publishing draft plan aligned to availability and current readiness.
Output schemas not documented. Tools return JSON-stringified responses without field-level documentation. LLMs cannot plan downstream calls or extract specific fields reliably.
Duplicate tool definitions. Tools explain_training_load, assess_readiness, identify_training_risks, and draft_next_week_plan appear twice (indices 11-13 and 23-25) with identical or near-identical signatures. This violates single-responsibility and confuses LLM tool selection.
No tool annotations. Tools marked READ_ONLY or WRITE in metadata lack readOnlyHint/destructiveHint/idempotentHint annotations. LLMs cannot infer safety properties and may incorrectly retry or compose tools.
| Scored | Grade | Overall | Spec posture | Rubric |
|---|---|---|---|---|
| 2026-09-23 | C | 60 | 2026-07-28+ | v2 |
Explain TrainingPeaks fitness, fatigue, form, and recent completed load. Read-only.
Summarise recent load, compare it with the prior period, and explain the coaching implication.
Return one local canonical activity with laps, samples, and file-provided metrics. Read-only.
Return the encrypted, local-only athlete profile and the thresholds PaceLine can defensibly use. Read-only.
Return a concise, provider-neutral athlete profile, recovery data, and recent workouts.
Return TrainingPeaks form plus Garmin recovery signals that are actually available. Read-only.
Return a full unified session view for one combined or provider workout ID: available planned-versus-actual fields, detailed Garmin metrics, recorded route, and source-specific TrainingPeaks data. Read-only.
Return recent Garmin activities plus available HR, HRV, resting HR, sleep, and stress signals. Read-only.
Return a normalized Garmin activity with detailed metrics and recorded GPS route points where available. Read-only.
Return local power and heart-rate time-in-zone distribution for a period. Power intensity is grouped as easy, moderate, and hard only when timestamped samples and zones are available. Read-only.
Return aggregate local duration, distance, and available training stress. Read-only.
Return FIT/TCX-imported local activities from PaceLine's encrypted local store. Read-only.
Return every available TrainingPeaks field for today's planned and completed workouts. Read-only.
Calculate weekly volume and available CTL, ATL, and TSB from FIT/TCX imports. Power-derived load requires configured FTP; values are otherwise left unavailable. Read-only.
Return configured or profile-derived power and heart-rate zones. Values remain unavailable when no threshold is configured. Read-only.
Identify non-diagnostic load and recovery risks, with conservative actions.
Highlight conservative training-load risks from TrainingPeaks history. Read-only.
Return provider-neutral workouts from TrainingPeaks and Garmin, matching likely duplicates. Read-only.
Read normalized workouts from encrypted local private-alpha storage. Read-only.
Synchronize provider data into encrypted local private-alpha storage. This writes only to the configured local store; it never changes provider data.
Missing error handling guidance. No visible error responses or recovery hints. Tools that depend on configuration (e.g., FTP for power metrics) do not document what happens when prerequisites are missing.
Parameter descriptions lack dependency hints. Tools like get_training_load mention 'Power-derived load requires configured FTP' but do not guide LLM on what to do if FTP is missing or how to configure it.