leo-running-coach
Coach Leo is an AI running coach that syncs your real training data from Strava, remembers every conversation, tracks your body signals and shoes, and adapts…
What it can do
- Get Coaching Briefing: MUST be called at the start of EVERY conversation before any other tool. You are Leo, a personal AI running coach. This briefing provides the runner's complete coaching context:
- Manage Athlete: Manage the runner's profile and running character. Use when the runner shares personal info, asks about their profile, or during weekly reviews. Actions: - get_profile: Full runner pro
- Manage Activities: Access and annotate the runner's training activities. Use when the runner mentions a workout, asks about training history, or wants to record feedback. Actions: - query: Search acti
What data it sees
Do you need an account
No: the server works without sign-in
Coach Leo is an AI running coach that syncs your real training data from Strava, remembers every conversation, tracks your body signals and shoes, and adapts your training to who you actually are as a runner. It assigns you a running character based on your real data. Every recommendation draws from a curated knowledge base of 65+ peer-reviewed papers.
How to connect
How to connect leo-running-coach to Claude
The server address to paste into Claude settings:
https://leo--running-coach.run.tools
- Open Claude (claude.ai or the desktop app).
- Go to Settings → Connectors.
- Click Add custom connector.
- Paste the server address copied below into Remote MCP server URL and click Add.
- In a chat, click + → Connectors and switch the new connector on.
Custom connectors are available on Free, Pro, Max, Team and Enterprise plans (Free is limited to one). On Team and Enterprise an organization Owner adds the connector first under Organization settings → Connectors.
Authorization
After you click Add, a sign-in window for the service opens. Sign in with your own account and approve access. Claude never sees your password.
How to connect leo-running-coach to ChatGPT
The server address to paste into ChatGPT settings:
https://leo--running-coach.run.tools
- Open ChatGPT in a browser (chatgpt.com). A Plus, Pro, Business, Enterprise or Edu plan is required.
- Turn on developer mode once: Settings → Apps → Advanced settings → Developer mode.
- Open Settings → Connectors and click Create.
- Fill in the form: Name (anything), Description (one line about what the service does), MCP server URL (copy it below).
- Under Authentication choose OAuth if the service requires sign-in, otherwise None. Click Create.
- In a new chat open + → Apps/Connectors and enable the connector.
OpenAI has renamed this section before (Connectors → Apps/Plugins). If the label differs, search settings for "developer mode". On Business/Enterprise workspaces an admin must allow custom connectors first.
Authorization
On first use ChatGPT opens the service's sign-in window. Sign in and approve access.
How to connect leo-running-coach to Cursor
The server address to paste into Cursor settings:
https://leo--running-coach.run.tools
Fastest: click Open in Cursor below and confirm the prompt.
Manually:
- In Cursor open Settings → Cursor Settings → MCP and click Add new global MCP server.
- Paste the JSON copied below into
~/.cursor/mcp.json(per project:.cursor/mcp.jsonin the repo root). - Save the file. The server appears in the MCP list; authorize it there if asked.
Authorization
If the service needs sign-in, an authorize button appears next to the server in the MCP list.
Server tool list (12)
Raw names from tools/list. Only developers need these.
| get_coaching_briefing | MUST be called at the start of EVERY conversation before any other tool. You are Leo, a personal AI running coach. This briefing provides the runner's complete coaching context: profile, latest activity, today's session, training load trends, target race, active alerts, readiness, recent coaching decisions, and character status. The response includes coaching_identity with Leo's principles — follow them. If needs_onboarding is true, call get_skill_workflow("onboarding") immediately. Never ask the runner questions that the briefing already answers. The briefing already includes recent_activities (last 10 across all sport types). Do NOT call activity(action="query") redundantly after the briefing. If the runner asks about their training, race prep, or weekly review, call training(action="get_plan") and race(action="list") for full context. Never base your analysis on just 2-3 days of data — always look at the bigger picture. |
| manage_athlete | Manage the runner's profile and running character. Use when the runner shares personal info, asks about their profile, or during weekly reviews. Actions: - get_profile: Full runner profile (body metrics, running form, shoes, preferences, setback history). - update_profile: Update profile fields. data: {field: value} for name, age, weight_kg, height_cm, resting_hr, max_hr, vo2max_estimate, foot_type, arch_type, preferred_terrain, preferred_distance, weekly_availability, cross_training_sports, equipment_available, coaching_preferences. coaching_preferences: JSON object controlling coaching behavior. Merge with existing values (don't overwrite). See instructions for full field reference. - get_character: Get running character data. Returns "Snow Leopard Cub" if not yet eligible (requires 7+ days since signup AND 5+ activities). - recalculate_character: Recompute character from real activity data. Blocked if not eligible. Must call during every weekly review when eligible. |
| manage_activities | Access and annotate the runner's training activities. Use when the runner mentions a workout, asks about training history, or wants to record feedback. Actions: - query: Search activity history with filters. data: {date_from?, date_to?, sport_type? (run/trail_run/ride/mountain_bike/nordic_ski), training_impact? (primary/cross_aerobic/cross_muscular/cross_recovery), limit?} TIP: Always query at least 10-15 activities (limit=15) to get a meaningful training picture. A single week is never enough context — look at 2-4 weeks. The runner may do cross-training (cycling, skiing, hiking) that matters for load. - get_detail: Full activity details including metrics and GPX summary. data: {activity_id} Call this on the most recent or most relevant activity to give specific feedback. - record_feedback: Record post-workout subjective feedback. data: {activity_id, perceived_effort (1-10), sensations?, notes?, shoe_id?} This is the most valuable subjective data -- always collect after discussing a workout. - update: Update activity fields directly. data: {activity_id, shoe_id?, notes?, name?, weather?, perceived_effort?, sensations?} Use this to correct activity data (e.g. link a shoe) without requiring full feedback. |
| manage_training | Manage training plans and sessions. Actions: - get_plan: Active plan with sessions (past 7 days + next 14 days). data: {include_past_days?} - create_plan: Create a NEW plan. If active plan exists, returns confirmation with plan details — call again with force=true to replace (old plan archived, completed sessions preserved). Use when: race change, plan doesn't fit, major restructuring needed. For small tweaks, prefer add/remove/update_session. data: {plan_name, objective, start_date, end_date, force?, sessions: [{scheduled_date, session_type, title, description, target_duration_min}]} - add_session: Add a single session to the active plan. data: {scheduled_date, session_type, title, description, target_duration_min} - remove_session: Cancel a planned session (cannot remove completed). data: {session_id} - update_session: Modify a session — reschedule, change type, link an activity, mark completed/skipped. When get_plan shows a 'missed' session with a match_candidate, use this to link the activity (set completion_status=completed and completed_activity_id). data: {session_id, scheduled_date?, completion_status? (planned/completed/skipped/modified), completed_activity_id?, was_adapted?, adaptation_reason?, adaptation_type?, session_type?, title?, description?, target_duration_min?, target_intensity?} |
| track_body_signals | Track athletic body signals and daily readiness for training optimization. Use when the runner reports discomfort, tightness, unusual sensations during training, or wants to log daily readiness. Actions: - record_observation: Log physical feedback from training: tightness, soreness, asymmetry. data: {body_area, description, severity (info/watch/warning/alert), observation_type?, activity_id?, terrain_context?, ai_interpretation?, scientific_references?, recommended_actions?} Always record even minor observations -- pattern detection over time helps prevent overtraining. - update_observation: Update status/severity of an existing observation. Use to resolve observations that are no longer relevant, or adjust severity as situation evolves. data: {observation_id, status? (active/monitoring/resolved/chronic), severity? (info/watch/warning/alert), description?, ai_interpretation?, follow_up_date?, recommended_actions?} - record_physical_setback: Record a confirmed physical setback. data: {body_area, start_date, severity (minor/moderate/severe), description, setback_type?, probable_cause?, recovery_action?} - update_physical_setback: Update an existing setback's status or add resolution info. data: {setback_id, status? (active/recovering/resolved), severity?, resolved_date?, recovery_action?, modified_training?, lessons_learned?} - record_readiness: Daily readiness check-in (scores 1-10, 10=excellent). data: {date, sleep_hours?, sleep_quality?, energy_level?, mood?, stress_level?, muscle_soreness?, resting_hr?, notes?} |
| manage_shoes | Manage the runner's shoe collection, inspections, and wear tracking. Use when the runner discusses shoes, asks about shoe condition, or shares shoe photos. Actions: - add: New shoe. data: {name, brand, model, category (trail/road/mixed), estimated_lifetime_km?, purchase_date?, strava_gear_id?, initial_km?} initial_km: km already run in this shoe (ask the runner if they know). The system will auto-match with Strava gear by name if strava_gear_id is not provided. - update: Modify shoe. data: {shoe_id, ...fields to change} - retire: End of life. data: {shoe_id} - inspect: Record wear inspection. data: {shoe_id, zone (outsole/midsole_lateral/ midsole_medial/upper/heel/insole), visual_score (1-10, 10=new), observations, ai_analysis?, estimated_remaining_life_pct?, total_km_at_inspection?} - stats: Shoe statistics (km, inspections, remaining life). data: {shoe_id} - link: Auto-link shoes to activities via Strava gear IDs. No data needed. |
| manage_races | Manage the runner's races from discovery to post-race report. When a runner mentions a race by name, USE YOUR WEB SEARCH capabilities to automatically find race details (date, location, distance, D+, terrain, GPX, number of runners) before asking them to provide info manually. Load get_skill_workflow("race-planning") for the full race lifecycle workflow. Actions: - list: Get races. data: {status? (planned/completed/dns/dnf)} - add: Register a race. data: {name, date, distance_km, elevation_gain_m, goal_type?, goal_details?, terrain_type?, max_participants?, registration_url?, course_url?, race_role? (objectif/préparatoire/découverte), parent_race_id?} - update: Modify race. data: {race_id, ...fields to change} - report: Record results. data: {race_id, result_time_seconds, result_notes?, race_report?} |
| search_knowledge | Access and enrich the scientific knowledge base. CRITICAL: you MUST search this knowledge base BEFORE making any training recommendation, interpreting body signals, or advising on overtraining prevention. Never recommend without evidence from the knowledge base. Actions: - search: Hybrid semantic + full-text search. data: {query, category?, tier?, top_k?} Categories: training_methodology, overtraining_prevention, trail_specific, running_form, nutrition_recovery, psychology, cross_training. ALWAYS search before training recommendations. Cite sources naturally. - list_sources: List documents. data: {category?, tier? (T1/T2/personalized)} - ingest: Add document with chunking + embedding. data: {title, content, author, year, category, tier?, tags?, relevance_note?, doi?, isbn?} - record_gap: Log missing topic when search returns no relevant results. data: {topic, query_trigger?, context?, category?, priority?} - list_gaps: Get gaps. data: {status? (open/researching/resolved/dismissed), category?} - resolve_gap: Mark resolved. data: {gap_id, resolution_doc_ids?, resolution_note?} |
| coaching_memory | Persistent coaching memory across sessions. ALWAYS log meaningful coaching exchanges (decisions, plan adaptations, setback advice). ALWAYS search history before giving advice to avoid repeating yourself or contradicting past decisions. Actions: - log_conversation: Save coaching exchange. data: {topic, summary, decisions?, actions?, tags?} Topics: onboarding, plan_adaptation, sensation_analysis, overtraining_prevention, weekly_review, race_prep. Call after every meaningful coaching exchange. - search_history: Search past coaching, activities, observations. data: {query, scope? (coaching/activities/observations/all), date_from?, date_to?} Search before repeating advice already given. |
| estimate_vo2max | Estimate VO2max using 3 scientific methods (ACSM Running Equation, Jack Daniels VDOT, HR-Pace regression). Analyzes last 12 weeks of running activities automatically. Detects real max HR from activities if not set in profile. |
| analyze_gpx | Parse and analyze a GPX file: elevation profile, segments (climb/descent/flat), terrain diversity score. |
| get_skill_workflow | Load a detailed coaching workflow by its ID. Call this when you detect a coaching scenario that matches one of the Available Coaching Workflows listed below. The returned workflow contains step-by-step instructions, the exact tool call sequence, and knowledge base queries to execute. ALWAYS load the relevant workflow BEFORE responding to a complex coaching scenario. This ensures consistent, science-backed coaching across all sessions. Available skill IDs and their triggers: - onboarding: new runner, empty profile, first conversation - post-activity-analysis: runner finished a workout, wants to debrief - body-signal-analysis: runner reports discomfort, tightness, unusual feelings - overtraining-monitor: recurring discomfort, load spikes, overtraining risk questions - weekly-review: "bilan de la semaine", weekly summary, how was my week - adaptive-training-plan: create/adapt plan, prepare for race - race-planning: mentions a race, wants to find races, reports results - deep-research: knowledge enrichment, deep research session - gpx-pattern-analysis: shares GPX file, analyze a route - shoe-wear-analysis: shares shoe photos, asks about shoe condition - character-reveal: first character reveal (only when eligible) |