Skip to main content
Glama

Server Configuration

Describes the environment variables required to run the server.

NameRequiredDescriptionDefault
STRAVA_CLIENT_IDYesYour Strava API application client ID
STRAVA_CLIENT_SECRETYesYour Strava API application client secret

Capabilities

Features and capabilities supported by this server

CapabilityDetails
tools
{
  "listChanged": false
}
prompts
{
  "listChanged": false
}
resources
{
  "subscribe": false,
  "listChanged": false
}
experimental
{}

Tools

Functions exposed to the LLM to take actions

NameDescription
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.
    

Prompts

Interactive templates invoked by user choice

NameDescription

No prompts

Resources

Contextual data attached and managed by the client

NameDescription

No resources

Latest Blog Posts

MCP directory API

We provide all the information about MCP servers via our MCP API.

curl -X GET 'https://glama.ai/api/mcp/v1/servers/wernerpe/mcpacer'

If you have feedback or need assistance with the MCP directory API, please join our Discord server