| get_activitiesA | Get the authenticated athlete's recent activities.
Args:
limit: Maximum number of activities to return (default: 10)
Returns:
Dictionary containing activities data
|
| get_activities_by_date_rangeA | Get activities within a specific date range.
Args:
start_date: Start date in ISO format (YYYY-MM-DD)
end_date: End date in ISO format (YYYY-MM-DD)
limit: Maximum number of activities to return (default: 30)
Returns:
Dictionary containing activities data
|
| get_activity_by_idB | Get detailed information about a specific activity.
Args:
activity_id: ID of the activity to retrieve
Returns:
Dictionary containing activity details
|
| get_recent_activitiesB | Get activities from the past X days.
Args:
days: Number of days to look back (default: 7)
limit: Maximum number of activities to return (default: 10)
Returns:
Dictionary containing activities data
|
| get_activity_streamsA | Get stream data for a specific activity (e.g., heartrate, pace, altitude).
Args:
activity_id: ID of the activity to retrieve streams for
stream_types: Comma-separated list of stream types to retrieve.
Available types: heartrate, pace, altitude, cadence, distance,
moving, temperature, time, watts (default: "heartrate,pace")
Returns:
Dictionary containing stream data indexed by stream type
|
| get_activity_descriptionA | Get an activity's description to check for existing coaching feedback.
Args:
activity_id: ID of the activity
Returns:
Dictionary with activity id, name, and description
|
| add_coaching_feedbackA | Add coaching feedback to a Strava activity description.
Appends feedback from the coach to the activity's description,
preserving any existing description text.
IMPORTANT — pass ONLY the raw feedback body. Do NOT include:
- a leading "(CoachName 🤖)" prefix or any 🤖 emoji
- a trailing "Coached by MCPacer …" signature
- separator lines like "-------"
The tool wraps your text with all of these automatically. If you
copy the format you see in existing descriptions, you will produce
duplicate emojis and a duplicate signature.
Args:
activity_id: ID of the activity to add feedback to
feedback: The raw coaching feedback body (no prefix, no signature)
coach_name: Name of the coach to display (default: "Coach")
Returns:
Dictionary with success status or error message
|
| add_run_noteA | Add a coach note to a cached run. Notes persist across sessions.
Use this when the athlete shares context that changes interpretation
of a run (treadmill paces, watch glitch, how they felt, etc.).
Notes appear as 📝 lines in get_run_context() output.
Args:
activity_id: The Strava activity ID.
note: The note text to append.
Returns:
Confirmation message.
|
| get_run_detailA | Get a detailed view of a single run — full lap splits, HR, elevation,
digest, and coach notes. Use for post-race analysis, anomalies, or
when the athlete asks about specific splits.
Args:
activity_id: The Strava activity ID.
Returns:
Formatted run detail as text.
|
| get_pending_digestsA | Get runs that need LLM digestion, with pre-built prompts.
Returns a list of items, each with activity_id, name, date, and the
digestion prompt. The host should process each item — ideally by
spawning parallel Haiku subagents — and save results via
save_run_digest(activity_id, digest).
Returns:
Dict with "pending" list (each item has activity_id, name, date,
prompt) or "message" if nothing is pending.
|
| save_run_digestA | Save a digest for a run (generated by LLM or host).
Called after processing a digestion prompt from get_pending_digests().
The digest should be a single compact line with segments separated
by | (e.g. "WU 2km @5:00 | 10×1km @3:45 HR 165→185 | CD 2km | +110m").
Args:
activity_id: The Strava activity ID.
digest: The digest string.
Returns:
Confirmation message.
|
| get_plan_contextA | Get the active training plan rendered as compact text.
Returns a two-line-per-week overview with the current week highlighted.
If no active plan exists, returns a message saying so — the coach
works fine without a plan (off-season, casual running, etc.).
Returns:
Pre-formatted plan overview text.
|
| list_training_plansA | List all saved training plans with summary metadata.
Returns:
Dict with plans list (id, name, race_date, goal_time, weeks count).
|
| get_training_planA | Get the full YAML content of a training plan.
Use this when you need to inspect or edit individual workouts.
For the compact overview, use get_plan_context() instead.
Args:
plan_id: The plan ID.
Returns:
Raw YAML content as text.
|
| update_plan_runA | Modify a single workout within a week. Surgical edit — only the
specified fields are changed, everything else is preserved.
Args:
plan_id: The plan ID.
week_number: Which week (1-indexed).
day_of_week: Day name (e.g. "Tuesday", "Sunday").
updates_json: JSON string of fields to update.
Example: {"type": "easy", "distance_km": 10, "description": "Recovery run"}
Returns:
Confirmation message.
|
| update_plan_weekB | Update week-level metadata (weekly_focus, total_planned_distance_km, etc.).
Args:
plan_id: The plan ID.
week_number: Which week.
updates_json: JSON string of week-level fields to update.
Example: {"weekly_focus": "Deload week", "total_planned_distance_km": 50}
Returns:
Confirmation message.
|
| add_plan_runA | Add a new workout to a week.
Args:
plan_id: The plan ID.
week_number: Which week.
run_json: JSON string of the run to add.
Example: {"day_of_week": "Friday", "type": "easy", "distance_km": 8, "description": "Recovery"}
Returns:
Confirmation message.
|
| remove_plan_runB | Remove a workout from a week.
Args:
plan_id: The plan ID.
week_number: Which week.
day_of_week: Day name (e.g. "Thursday").
Returns:
Confirmation message.
|
| add_plan_commentA | Add a YAML comment to a week block. Documents plan adjustments
in the plan itself (e.g. "Deload week — groin recovery, cut volume 30%").
These comments persist through all future reads and exports.
Args:
plan_id: The plan ID.
week_number: Which week.
comment: The comment text (without # prefix).
Returns:
Confirmation message.
|
| get_coaching_personasA | Get the list of available coaching personas.
Returns:
Dictionary containing a list of available coach names.
|
| get_coaching_personaA | Load a coaching persona's full definition and guidelines.
Returns the persona's personality, tone, and communication style
combined with shared coaching guidelines. This content should be
adopted fully for the duration of the session.
Args:
coach_name: Name of the coach persona to load (e.g. "david", "coach").
Returns:
The full persona text as markdown.
|
| get_onboarding_questionsA | Load the onboarding questionnaire for a new athlete.
Call this when read_coach_memory returns "not been onboarded yet" or
the Athlete section of coach memory is empty. Returns the full series
of questions to ask (PRs, goals, constraints, etc.) plus instructions
for saving initial memory and drafting a training plan.
Returns:
Dictionary with the onboarding questionnaire as markdown.
|
| read_coach_memoryA | Read the full COACH_MEMORY.md — the coach's long-term knowledge about the athlete.
Contains sections: Athlete, PRs, Goals, Active Flags, Training Context, Patterns & Insights.
This is loaded at session start and can be re-read on demand.
Returns:
The full coach memory as markdown text.
|
| update_coach_memoryA | Update a specific section of the coach's memory (COACH_MEMORY.md).
Rewrites the section in-place. Call this immediately when significant
new information emerges — don't wait until session end.
Sections:
athlete — name, location, weight
prs — self-reported PRs with date assessed
goals — target race, current phase
active_flags — injuries, niggles, concerns
training_context — weekly volume, training days, constraints
patterns — observations about the athlete's training
Args:
section: Section key (athlete, prs, goals, active_flags, training_context, patterns)
content: New content for the section (replaces everything under the ## header)
Returns:
Confirmation message.
|
| get_session_logsA | Read recent daily session logs — summaries of previous coaching conversations.
Each log records what was discussed, flags raised, decisions made, and
plan adjustments from a past session. Provides conversation continuity.
Args:
limit: Number of recent logs to return (default 3, max 5).
Returns:
Concatenated session logs as text, most recent first.
|
| save_session_logA | Save a session summary log for today.
Called at the end of a coaching session to persist what was discussed.
The summary should be 3-5 lines covering: what was discussed, flags
raised, decisions made, and any plan adjustments.
IMPORTANT: The first line should be a standalone sentence capturing
the session's most important takeaway, as it will be used as a
one-liner in compressed session history.
Args:
summary: The session summary text (3-5 lines).
coach_name: Name of the coach persona used in this session.
Returns:
Confirmation message.
|
| get_archived_session_logA | Retrieve a full session log from the archive by date.
Older session logs are automatically compressed into one-liners in
the Session History section of coach memory. Use this tool when a
one-liner doesn't provide enough context and you need the full
original session summary.
Args:
session_date: Date of the session in YYYY-MM-DD format.
Returns:
The full session log text, or a message if not found.
|
| get_run_contextA | Sync new activities from Strava and return a training overview.
This is the primary tool for loading the athlete's training history
at session start. It:
1. Syncs any new activities from Strava
2. Renders an age-tiered text snapshot (one-liners for older weeks,
per-run detail for recent weeks)
The output is purely actual run data — no plan awareness. The plan
context is loaded separately via get_plan_context().
Returns:
Pre-formatted text block with the full training overview.
|
| list_body_regionsA | List all valid body region IDs that can be highlighted on the body
diagram or that the athlete might paint as a source of pain or
tightness. Use this to discover region IDs before calling
highlight_body_regions.
Each region has a stable ID (e.g. left_itb_lower) and a human-
readable label (e.g. "IT band — lower (L)"). Regions are grouped
by body area.
Returns:
Grouped list of region IDs and labels.
|
| get_painted_regionsA | Read the body regions the athlete has painted/marked on the body
diagram. These are areas the athlete is reporting pain, tightness,
or concern. Call this when the athlete refers to "what I've marked",
"this area", or "where it hurts" — or proactively to check whether
anything has been flagged.
Returns:
A list of painted region IDs with their human labels, or a
note that nothing is painted.
|
| highlight_body_regionsA | Highlight one or more body regions in the dashboard's Body panel
(shown amber). Use this to draw the athlete's attention to a chain
of related structures, suggest "is this what hurts?", or visualize
the kinematic chain you're reasoning about.
Calling this REPLACES the previous highlight set (it is not
additive). To wipe, pass an empty list or call clear_body_highlights.
Args:
regions: List of region IDs (use list_body_regions to discover
valid IDs). Invalid IDs are silently dropped.
reason: Short caption explaining why these are highlighted —
shown to the athlete in the panel (e.g.
"checking IT band kinematic chain").
Returns:
Confirmation with the regions actually highlighted.
|
| clear_body_highlightsA | Clear all amber highlights in the Body panel. Does NOT touch what
the athlete has painted — only the agent-driven highlights.
Returns:
Confirmation.
|