Server definition
- Hash
- sha256:fae9bbc73263791b19bc4110734aadfec7f6e38040706d373c22f8fa979dfcd0
- What it is
- What a remote MCP server returned when asked what it offers: 21 tools
The blob, as servednamed by its sha256
{
"instructions": "You are STAS, an AI endurance coach connected to the athlete's real Intervals.icu and STAS data. Start with a short summary, then give the practical next step. Be goal-first and data-backed: use goals -> current block role -> required capacity -> broad history -> key stimulus -> format/dose -> self-review; load `get_user_summary` before coaching decisions, use the analysis-rich `get_trainings` list for bounded multi-workout evidence, and use `get_activity_detail` after the default `get_trainings` lookup for one selected completed workout. Do not batch `get_activity_detail` across multiple workouts; use normal `get_trainings` for workout comparisons. For weekly/block/strategy planning, cover at least 60 days/about 2 months when available using exact non-overlapping analysis-rich `get_trainings` windows; do not treat `recentTrainings` or summaries as enough, and open `get_activity_detail` only for selected workouts whose exact execution matters. Treat strategy as a reusable preparation map: use the agreed goal relationships, assumed current phase, broad phase route, transition conditions, durable boundaries, and review triggers; derive session frequency, stimuli, format, dose, load, support work, cuts, and taper fresh through the private Planning Gate. Before weekly/block plans, privately run one linear gate: complete evidence -> priority goal and direct performance marker -> week shape and evidence-based quality-session count -> protocol choice, comparing materially different candidates only when alternatives are safe and viable -> critic/revision. Show only the selected plan; never expose candidate scoring or hidden reasoning. Keep load objective separate from readiness: maintenance TL ~= Fitness x 7 is an objective metric-direction reference, not a target, ceiling, or fatigue diagnosis; planned workouts are candidate future load, and accumulated fatigue needs persistent multi-signal deterioration across days or sessions. For every race-containing block, explicitly choose no taper, light taper, or full taper from goal priority, recovery evidence, recent absorbed load, cost to later goals, and comparison with continued build/consolidation; nearest date alone never justifies reduction. Use `trainingContextQuality`, `workPatternSummary`, and `workSignals` as planning context; treat generic or null `sessionType` as unknown, not as a confirmed workout label. If today's training is ambiguous between an already completed workout and a planned session, call `get_trainings` first for that exact athlete-local date with oldest=D and newest=D+1 because newest is exclusive. If no completed workout is returned, then read `get_planned_events` for the same date before saying that no training exists. Read the calendar with `get_planned_events` before changing, replacing, or judging planned workouts. Write or delete calendar items, profile memory, restores, and strategy only after clear user intent and the required preview or confirmation. Use the MCP tool schemas exactly; do not invent fields, routes, or hidden operations. Use resources for detailed rules: evidence, planning, calendar writing, notes, strategy, and profile memory. If the data is missing or thin, say what is missing and what to check next. Every successful STAS tool result ends with a ready-to-use Markdown navigation footer. After the answer, copy that footer exactly once, keep every URL exact, and append no other footer or links. The permanent Telegram URL safely personalizes account linking after the user clicks it. If no STAS tool was called, do not invent a footer; use info links only when the user asks.",
"tools": [
{
"description": "Commit one previewed goal, start, activity-link, or result change. Call only after the user explicitly confirms the exact preview from preview_goal_result_change. The server rejects stale data and returns the new authoritative editing state.",
"inputSchema": {
"$schema": "https://json-schema.org/draft/2020-12/schema",
"additionalProperties": false,
"properties": {
"changeId": {
"description": "Preview id returned by preview_goal_result_change. Commit only after the user confirms that exact preview.",
"exclusiveMinimum": 0,
"maximum": 9007199254740991,
"type": "integer"
}
},
"required": [
"changeId"
],
"type": "object"
},
"name": "commit_goal_result_change",
"outputSchema": null
},
{
"description": "Commit a previously previewed rules or profile memory change. Call this only after the user explicitly confirms the exact full text shown for that preview. If preview returned noChange=true, do not call commit. The server updates the profile only if the section hash still matches the preview.",
"inputSchema": {
"$schema": "https://json-schema.org/draft/2020-12/schema",
"additionalProperties": false,
"properties": {
"changeId": {
"description": "Preview change id returned by preview_profile_section_change. Call only after the user explicitly confirms the exact full text shown for this preview.",
"exclusiveMinimum": 0,
"maximum": 9007199254740991,
"type": "integer"
}
},
"required": [
"changeId"
],
"type": "object"
},
"name": "commit_profile_section_change",
"outputSchema": null
},
{
"description": "Create or update NOTE events in Intervals. dry_run is required: false writes the note, true previews only. Send category=NOTE and external_id=note:YYYY-MM-DD:<slug>. Use all-day local times for normal notes, keep description short, and omit type, moving_time, icu_training_load, and workout_doc. For weekly review notes or other notes that apply to the whole week, send for_week=true; omit it or use false for ordinary notes. Do not create a seven-day date range for weekly notes; keep one all-day anchor date and use for_week=true.",
"inputSchema": {
"$schema": "https://json-schema.org/draft/2020-12/schema",
"additionalProperties": false,
"properties": {
"dry_run": {
"description": "Required. false writes to Intervals.icu; true only previews without writing.",
"type": "boolean"
},
"events": {
"items": {
"additionalProperties": false,
"properties": {
"category": {
"const": "NOTE",
"description": "Must be NOTE for calendar notes.",
"type": "string"
},
"color": {
"description": "Optional. Usually omit for notes.",
"enum": [
"green",
"blue",
"orange"
],
"type": "string"
},
"description": {
"description": "Short note text. Ordinary notes are normally 1-4 lines; weekly review notes use the 6-field coaching-memory format.",
"minLength": 1,
"type": "string"
},
"end_date_local": {
"description": "All-day notes end at the next day YYYY-MM-DDT00:00:00.",
"pattern": "^\\d{4}-\\d{2}-\\d{2}T\\d{2}:\\d{2}(?::\\d{2})?$",
"type": "string"
},
"external_id": {
"description": "Stable STAS id in the form note:YYYY-MM-DD:<slug>.",
"pattern": "^note:\\d{4}-\\d{2}-\\d{2}:[a-z0-9]+(?:-[a-z0-9]+)*$",
"type": "string"
},
"for_week": {
"description": "Optional. Set true only for notes that apply to the whole week, such as weekly review notes. Do not stretch start/end over seven days; keep the note as a single all-day anchor date.",
"type": "boolean"
},
"name": {
"description": "Short note title.",
"minLength": 1,
"type": "string"
},
"start_date_local": {
"description": "All-day notes use YYYY-MM-DDT00:00:00.",
"pattern": "^\\d{4}-\\d{2}-\\d{2}T\\d{2}:\\d{2}(?::\\d{2})?$",
"type": "string"
}
},
"required": [
"category",
"name",
"start_date_local",
"end_date_local",
"description",
"external_id"
],
"type": "object"
},
"minItems": 1,
"type": "array"
}
},
"required": [
"events",
"dry_run"
],
"type": "object"
},
"name": "create_note_event",
"outputSchema": null
},
{
"description": "Create or update planned WORKOUT events in Intervals. For changes to an existing STAS workout, keep the same external_id and call this tool again; do not delete the day/window just to edit time, name, note, load, color, or workout_builder. This tool is self-contained; do not look for SKILL.md or examples in the athlete's calendar. dry_run is required: false writes the event, true previews only. Send activity_type as Run/Ride/Swim/Workout/WeightTraining/Yoga/Pilates/Stretching/Walk/Hike/Elliptical/NordicSki/HighIntensityIntervalTraining/Other, stas_note for the human workout note, and external_id=plan:YYYY-MM-DD:<slug>. Do not send low-level Intervals fields category, type, sport, workoutType, target, description, workout_doc, icu_workout, filename, or file_contents. The server maps activity_type to Intervals type and category=WORKOUT and infers Intervals target=HR/PACE/POWER from Run/Ride workout_builder only. Use local datetimes without a timezone suffix, e.g. 2026-05-13T08:00:00, not 2026-05-13T08:00:00+03:00. workout_builder is mandatory for any interval/key workout save, mainly Run/Ride intervals; never save intervals as prose-only. Omit workout_builder only for easy/simple workouts without structured steps. If validation fails, inspect error.data.issues[].path, fix that exact event field, and retry only after changing the invalid field. If you use workout_builder, do not include ## STAS or ## Workout; the server adds wrappers. Builder headers and repeat headers are plain lines without '-', e.g. 'Warmup', 'Main Set 5x', 'Cooldown'. Actual step lines start flush-left with '- ' and contain duration/distance plus a target, e.g. '- 1km 4:25/km-4:35/km Pace', '- 10m 75%', or '- Recovery 90s Z1 HR'. For swim workouts, distance-led steps such as '- 400m easy' and '- 6 x 50m build' are allowed. For HR-only workouts, every structured step target should use HR syntax like '- 10m Z2 HR' or '- 3m Z4 HR'. Do not write '- Warmup' followed by indented child bullets. Use '1km' or '1000mtr' for run/ride meters; bare 400m is allowed for swim but m means minutes in run/ride builder text. icu_training_load is accepted for planned workouts, but Intervals.icu can still return icu_atl/icu_ctl as null or exclude/partially weight non-cardio types in Fitness/Fatigue depending on athlete settings. After writing a structured key workout, read it back with get_planned_events and check workout_doc.steps is non-empty before claiming it is structured. Example real interval write arguments. Replace the date/time and paces, but keep this exact JSON shape. Use activity_type, stas_note, and mandatory workout_builder for interval/key workout saves. workout_builder contains only native Intervals.icu Workout Builder text: repeat headers do not start with \"-\", step lines are flush-left, and nested Markdown bullets are forbidden. {\"dry_run\":false,\"events\":[{\"activity_type\":\"Run\",\"name\":\"Intervals: 5x1000m\",\"start_date_local\":\"2026-05-13T08:00:00\",\"end_date_local\":\"2026-05-13T08:55:00\",\"stas_note\":\"Goal: controlled interval work without overreaching.\\nRule: if HR rises too fast or form breaks, stop after 4 reps.\",\"workout_builder\":\"Warmup\\n- 15m Z2 HR\\n\\nMain Set 5x\\n- 1km 4:25/km-4:35/km Pace\\n- Recovery 90s Z1 HR\\n\\nCooldown\\n- 10m Z1 HR\",\"external_id\":\"plan:2026-05-13:intervals-5x1000m\",\"color\":\"green\",\"moving_time\":3300}]}",
"inputSchema": {
"$schema": "https://json-schema.org/draft/2020-12/schema",
"additionalProperties": false,
"description": "Example real interval write arguments. Replace the date/time and paces, but keep this exact JSON shape. Use activity_type, stas_note, and mandatory workout_builder for interval/key workout saves. workout_builder contains only native Intervals.icu Workout Builder text: repeat headers do not start with \"-\", step lines are flush-left, and nested Markdown bullets are forbidden. {\"dry_run\":false,\"events\":[{\"activity_type\":\"Run\",\"name\":\"Intervals: 5x1000m\",\"start_date_local\":\"2026-05-13T08:00:00\",\"end_date_local\":\"2026-05-13T08:55:00\",\"stas_note\":\"Goal: controlled interval work without overreaching.\\nRule: if HR rises too fast or form breaks, stop after 4 reps.\",\"workout_builder\":\"Warmup\\n- 15m Z2 HR\\n\\nMain Set 5x\\n- 1km 4:25/km-4:35/km Pace\\n- Recovery 90s Z1 HR\\n\\nCooldown\\n- 10m Z1 HR\",\"external_id\":\"plan:2026-05-13:intervals-5x1000m\",\"color\":\"green\",\"moving_time\":3300}]}",
"properties": {
"dry_run": {
"description": "Required. false writes to Intervals.icu; true only previews without writing.",
"type": "boolean"
},
"events": {
"description": "Example real interval write arguments. Replace the date/time and paces, but keep this exact JSON shape. Use activity_type, stas_note, and mandatory workout_builder for interval/key workout saves. workout_builder contains only native Intervals.icu Workout Builder text: repeat headers do not start with \"-\", step lines are flush-left, and nested Markdown bullets are forbidden. {\"dry_run\":false,\"events\":[{\"activity_type\":\"Run\",\"name\":\"Intervals: 5x1000m\",\"start_date_local\":\"2026-05-13T08:00:00\",\"end_date_local\":\"2026-05-13T08:55:00\",\"stas_note\":\"Goal: controlled interval work without overreaching.\\nRule: if HR rises too fast or form breaks, stop after 4 reps.\",\"workout_builder\":\"Warmup\\n- 15m Z2 HR\\n\\nMain Set 5x\\n- 1km 4:25/km-4:35/km Pace\\n- Recovery 90s Z1 HR\\n\\nCooldown\\n- 10m Z1 HR\",\"external_id\":\"plan:2026-05-13:intervals-5x1000m\",\"color\":\"green\",\"moving_time\":3300}]}",
"items": {
"additionalProperties": false,
"properties": {
"activity_type": {
"description": "Required activity type for the planned workout. Use exactly one of Run, Ride, Swim, Workout, WeightTraining, Yoga, Pilates, Stretching, Walk, Hike, Elliptical, NordicSki, HighIntensityIntervalTraining, Other. Do not send category, type, sport, or workoutType.",
"enum": [
"Run",
"Ride",
"Swim",
"Workout",
"WeightTraining",
"Yoga",
"Pilates",
"Stretching",
"Walk",
"Hike",
"Elliptical",
"NordicSki",
"HighIntensityIntervalTraining",
"Other"
],
"type": "string"
},
"color": {
"description": "Optional. Defaults to green for Run/Walk/Hike/Elliptical/NordicSki/HighIntensityIntervalTraining, blue for Ride/Swim, orange for Workout/WeightTraining/Yoga/Pilates/Stretching/Other.",
"enum": [
"green",
"blue",
"orange"
],
"type": "string"
},
"end_date_local": {
"description": "Local end time, for example 2026-04-28T08:45:00.",
"pattern": "^\\d{4}-\\d{2}-\\d{2}T\\d{2}:\\d{2}(?::\\d{2})?$",
"type": "string"
},
"external_id": {
"description": "Stable STAS id in the form plan:YYYY-MM-DD:<slug>.",
"pattern": "^plan:\\d{4}-\\d{2}-\\d{2}:[a-z0-9]+(?:-[a-z0-9]+)*$",
"type": "string"
},
"icu_training_load": {
"description": "Optional estimated training load when it is known. Intervals.icu may store the load but exclude or partially weight non-cardio types such as WeightTraining, Yoga, Pilates, Stretching, Workout, or Other in Fitness/Fatigue depending on the athlete settings.",
"minimum": 0,
"type": "number"
},
"moving_time": {
"description": "Optional duration in seconds when it is known.",
"exclusiveMinimum": 0,
"maximum": 9007199254740991,
"type": "integer"
},
"name": {
"description": "Short, specific workout name.",
"minLength": 1,
"type": "string"
},
"start_date_local": {
"description": "Local start time, for example 2026-04-28T08:00:00.",
"pattern": "^\\d{4}-\\d{2}-\\d{2}T\\d{2}:\\d{2}(?::\\d{2})?$",
"type": "string"
},
"stas_note": {
"description": "Required human-readable workout note. Use this for goal, adjustment rule, and simple workouts. Do not include a ## Workout block here.",
"minLength": 1,
"type": "string"
},
"workout_builder": {
"description": "Native Intervals.icu Workout Builder text. Mandatory for interval/key workout saves; optional only for simple/easy workouts without structured steps. Use mainly for Run/Ride interval workouts with real steps. Do not include ## STAS or ## Workout; the server adds those wrappers.",
"minLength": 1,
"type": "string"
}
},
"required": [
"activity_type",
"name",
"start_date_local",
"end_date_local",
"stas_note",
"external_id"
],
"type": "object"
},
"minItems": 1,
"type": "array"
}
},
"required": [
"events",
"dry_run"
],
"type": "object"
},
"name": "create_plan_event",
"outputSchema": null
},
{
"description": "Delete STAS note events. For one specific note, pass external_ids with the exact note:YYYY-MM-DD:<slug> id; external_id as one string is accepted as a compatibility alias. Use oldest/newest window deletion only when replacing a whole note set in that date window. Do not delete user-created notes without a note: external_id. dry_run is required: false deletes, true previews only.",
"inputSchema": {
"$schema": "https://json-schema.org/draft/2020-12/schema",
"additionalProperties": false,
"properties": {
"dry_run": {
"description": "Required. false writes to Intervals.icu; true only previews without writing.",
"type": "boolean"
},
"external_id": {
"anyOf": [
{
"pattern": "^plan:\\d{4}-\\d{2}-\\d{2}:[a-z0-9]+(?:-[a-z0-9]+)*$",
"type": "string"
},
{
"pattern": "^note:\\d{4}-\\d{2}-\\d{2}:[a-z0-9]+(?:-[a-z0-9]+)*$",
"type": "string"
}
],
"description": "Compatibility alias for deleting one exact STAS event id. Prefer external_ids for multiple ids."
},
"external_ids": {
"description": "Exact STAS event ids to delete. Use this for deleting specific workouts or notes without clearing the whole day/window.",
"items": {
"anyOf": [
{
"pattern": "^plan:\\d{4}-\\d{2}-\\d{2}:[a-z0-9]+(?:-[a-z0-9]+)*$",
"type": "string"
},
{
"pattern": "^note:\\d{4}-\\d{2}-\\d{2}:[a-z0-9]+(?:-[a-z0-9]+)*$",
"type": "string"
}
]
},
"maxItems": 20,
"minItems": 1,
"type": "array"
},
"newest": {
"description": "End date for full-window replacement deletes. Required unless external_ids is provided.",
"pattern": "^\\d{4}-\\d{2}-\\d{2}$",
"type": "string"
},
"oldest": {
"description": "Start date for full-window replacement deletes. Required unless external_ids is provided.",
"pattern": "^\\d{4}-\\d{2}-\\d{2}$",
"type": "string"
}
},
"required": [
"dry_run"
],
"type": "object"
},
"name": "delete_note_events",
"outputSchema": null
},
{
"description": "Delete STAS plan events. For one specific workout, pass external_ids with the exact plan:YYYY-MM-DD:<slug> id; external_id as one string is accepted as a compatibility alias. Use oldest/newest window deletion only when the user is replacing the whole STAS plan in that date window. Do not use window deletion for simple edits; update with create_plan_event using the same external_id instead. dry_run is required: false deletes, true previews only.",
"inputSchema": {
"$schema": "https://json-schema.org/draft/2020-12/schema",
"additionalProperties": false,
"properties": {
"dry_run": {
"description": "Required. false writes to Intervals.icu; true only previews without writing.",
"type": "boolean"
},
"external_id": {
"anyOf": [
{
"pattern": "^plan:\\d{4}-\\d{2}-\\d{2}:[a-z0-9]+(?:-[a-z0-9]+)*$",
"type": "string"
},
{
"pattern": "^note:\\d{4}-\\d{2}-\\d{2}:[a-z0-9]+(?:-[a-z0-9]+)*$",
"type": "string"
}
],
"description": "Compatibility alias for deleting one exact STAS event id. Prefer external_ids for multiple ids."
},
"external_ids": {
"description": "Exact STAS event ids to delete. Use this for deleting specific workouts or notes without clearing the whole day/window.",
"items": {
"anyOf": [
{
"pattern": "^plan:\\d{4}-\\d{2}-\\d{2}:[a-z0-9]+(?:-[a-z0-9]+)*$",
"type": "string"
},
{
"pattern": "^note:\\d{4}-\\d{2}-\\d{2}:[a-z0-9]+(?:-[a-z0-9]+)*$",
"type": "string"
}
]
},
"maxItems": 20,
"minItems": 1,
"type": "array"
},
"newest": {
"description": "End date for full-window replacement deletes. Required unless external_ids is provided.",
"pattern": "^\\d{4}-\\d{2}-\\d{2}$",
"type": "string"
},
"oldest": {
"description": "Start date for full-window replacement deletes. Required unless external_ids is provided.",
"pattern": "^\\d{4}-\\d{2}-\\d{2}$",
"type": "string"
}
},
"required": [
"dry_run"
],
"type": "object"
},
"name": "delete_plan_events",
"outputSchema": null
},
{
"description": "Load a compact read-only passport for one completed workout after identifying its training_id with get_trainings. Use for detailed one completed workout questions about intervals, laps, splits, terrain, weather, efforts, segments, and data quality. The response omits source payloads, route coordinates, latlng, and raw stream arrays from JSON; when available, complete second-by-second metrics are embedded as CSV in the MCP result, with a signed link fallback.",
"inputSchema": {
"$schema": "https://json-schema.org/draft/2020-12/schema",
"additionalProperties": false,
"properties": {
"training_id": {
"description": "Training id returned by get_trainings. Load get_trainings first to identify the exact workout.",
"minLength": 1,
"type": "string"
}
},
"required": [
"training_id"
],
"type": "object"
},
"name": "get_activity_detail",
"outputSchema": null
},
{
"description": "Read the complete bounded editing state for general goals, calendar-linked starts, race results, standalone results, and legacy results. Stable public IDs and dataVersion are required for every later preview. This tool does not change anything.",
"inputSchema": {
"$schema": "https://json-schema.org/draft/2020-12/schema",
"additionalProperties": false,
"properties": {},
"type": "object"
},
"name": "get_editable_goals_results",
"outputSchema": null
},
{
"description": "Read safe nearby activity candidates for one exact start. Use the returned opaque selectionId when previewing result_link_activity. This tool does not change the start, activity, or result.",
"inputSchema": {
"$schema": "https://json-schema.org/draft/2020-12/schema",
"additionalProperties": false,
"properties": {
"goalPublicId": {
"description": "Stable public ID of one event goal returned by get_editable_goals_results.",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
"type": "string"
}
},
"required": [
"goalPublicId"
],
"type": "object"
},
"name": "get_goal_activity_candidates",
"outputSchema": null
},
{
"description": "Read only planned or scheduled events from the Intervals calendar in a date window, not completed activities. This must not be the only source when a request may mean today's completed workout: call get_trainings first. Use this before rewriting or replacing an existing STAS plan.",
"inputSchema": {
"$schema": "https://json-schema.org/draft/2020-12/schema",
"additionalProperties": false,
"properties": {
"newest": {
"pattern": "^\\d{4}-\\d{2}-\\d{2}$",
"type": "string"
},
"oldest": {
"pattern": "^\\d{4}-\\d{2}-\\d{2}$",
"type": "string"
}
},
"required": [
"oldest",
"newest"
],
"type": "object"
},
"name": "get_planned_events",
"outputSchema": null
},
{
"description": "Use this for completed, finished, recorded, or uploaded activities, including workouts completed today. To load one date D, always set oldest=D and newest=D+1 because newest is exclusive. It returns one bounded, size-safe chronological list of completed workouts plus historical calendar context (NOTE, SICK, INJURED, HOLIDAY). Context is not a workout and does not consume the training limit. Default mode is a rich index for chronology, load, reports, compact summaries, and choosing training_id; use offset to continue beyond the first 50 completed workouts. Set full=true only for analysis-rich comparison across multiple workouts; it adds a bounded compact interval projection. For one selected completed workout, use get_activity_detail for splits and richer detail; kilometre splits are intentionally omitted from get_trainings in every mode. If listDetail.userReportTruncated=true for a workout, its report was shortened only to keep the whole list within the response budget; call get_activity_detail with that training_id for the complete report.",
"inputSchema": {
"$schema": "https://json-schema.org/draft/2020-12/schema",
"additionalProperties": false,
"properties": {
"full": {
"description": "Optional analysis-rich list mode for comparing multiple completed workouts in a bounded date window. It adds a size-safe compact interval projection, but is not raw data and is not the detailed view for one workout. Omit it when locating/listing workouts or choosing a training_id; use get_activity_detail after selecting one exact workout.",
"type": "boolean"
},
"limit": {
"description": "Max trainings per page. Server cap is 50.",
"maximum": 50,
"minimum": 1,
"type": "integer"
},
"newest": {
"description": "End boundary date in YYYY-MM-DD, exclusive. Never use the last wanted date here; use the next calendar date. For one day D, set oldest=D and newest=D+1, for example oldest=2026-06-21 and newest=2026-06-22.",
"pattern": "^\\d{4}-\\d{2}-\\d{2}$",
"type": "string"
},
"offset": {
"description": "Pagination offset for completed trainings. Use the next offset to continue the same bounded date window; calendar context is returned only on the first page.",
"maximum": 9007199254740991,
"minimum": 0,
"type": "integer"
},
"oldest": {
"description": "Start boundary date in YYYY-MM-DD, inclusive.",
"pattern": "^\\d{4}-\\d{2}-\\d{2}$",
"type": "string"
}
},
"type": "object"
},
"name": "get_trainings",
"outputSchema": null
},
{
"description": "Start here for most conversations. Load the athlete's profile, goals, rules, recent load, current fitness context, performance evidence, optional bounded historical signals, planning guidance, and persistent STAS memory opportunities. weeklyHistory.recentKeySessionEvidence is the compact 42-day factual register for current planning. It includes all qualifying key sessions unless truncated=true; each row uses columns for date, saved name/type, sourceTrainingId, confirmed actual WORK, confirmed REST only when recorded, and wholeActivity only when no confirmed interval structure exists. It never invents recovery or interval rows; null recovery means no confirmed REST inside that activity. For older comparisons, use get_trainings with a bounded date range, then get_activity_detail for one exact workout. confirmedStructuredIntervals remains a separate verified structured-session index for its stated period; do not infer unshown measurements.",
"inputSchema": {
"$schema": "https://json-schema.org/draft/2020-12/schema",
"additionalProperties": false,
"properties": {
"section": {
"enum": [
"profile",
"history",
"evidence",
"pace",
"plan"
],
"type": "string"
}
},
"type": "object"
},
"name": "get_user_summary",
"outputSchema": null
},
{
"description": "Read all locally stored Intervals.icu wellness values for any requested date window; there is no fixed day cap and this read makes no live provider request. The response is column-oriented: dates[i] is the date for every series[field][i] and customSeries[field][i]. null means not recorded, never zero. Only fields with at least one value are returned. window=[oldest inclusive,newest exclusive]; missingRanges uses the same boundaries and names dates for which STAS has no stored wellness row. healthCoverage counts locally available weight/restingHr/hrv/sleep/steps days and reports the initial source-sync status; status=partial means the source history may still be incomplete. complete=true means the response is not truncated and includes all meaningful locally stored standard and custom wellness fields; it does not claim the watch/provider supplied every metric. source=intervals_icu_cached_by_stas means values may originate from a watch, another connected source, or manual Intervals.icu entry and are served from STAS cache. Interpret trends against this athlete's own baseline and together with workouts and reports; do not judge readiness or diagnose from one value. CTL is modeled longer-term training load, ATL shorter-term load, and CTL-ATL can be used as Form; higher or lower is not inherently good or bad. HRV is protocol/device dependent and is mainly useful relative to the athlete's own trend. Resting HR is also individual; acute deviation matters more than a universal threshold. sleepSecs is seconds. sleepQuality is 1=Excellent through 4=Poor. soreness/fatigue/stress are 0=None through 4=Extreme, higher is worse. mood/motivation are 1=Excellent through 4=Poor, higher is worse. providerUpdatedAt is the provider record update time, not the measurement time. Preserve custom field names exactly; if a custom field's unit or scale is unclear, do not invent it—describe only its observed trend or ask the user. If the complete response is too large, retry every exact non-overlapping window in suggestedWindows; if none are suggested, explain that one stored day itself cannot be split further by date. Never treat a partial window as the whole request.",
"inputSchema": {
"$schema": "https://json-schema.org/draft/2020-12/schema",
"additionalProperties": false,
"properties": {
"newest": {
"description": "End boundary date in YYYY-MM-DD, exclusive. There is no fixed day limit. If the complete result is too large, retry the exact non-overlapping suggested windows returned by the tool.",
"pattern": "^\\d{4}-\\d{2}-\\d{2}$",
"type": "string"
},
"oldest": {
"description": "Start boundary date in YYYY-MM-DD, inclusive. There is no fixed day limit.",
"pattern": "^\\d{4}-\\d{2}-\\d{2}$",
"type": "string"
}
},
"required": [
"oldest",
"newest"
],
"type": "object"
},
"name": "get_wellness",
"outputSchema": null
},
{
"description": "Preview one exact change to a general goal, calendar-linked start, activity pairing, race result, standalone result, or legacy result. Always load get_editable_goals_results first and send its exact dataVersion. This never saves. Show the user the exact preview, including calendar/activity effects, and ask for explicit confirmation before commit_goal_result_change.",
"inputSchema": {
"$schema": "https://json-schema.org/draft/2020-12/schema",
"additionalProperties": false,
"properties": {
"command": {
"anyOf": [
{
"additionalProperties": false,
"properties": {
"comment": {
"anyOf": [
{
"maxLength": 1000,
"minLength": 1,
"type": "string"
},
{
"type": "null"
}
]
},
"deadlineDate": {
"anyOf": [
{
"pattern": "^\\d{4}-\\d{2}-\\d{2}$",
"type": "string"
},
{
"type": "null"
}
]
},
"operationId": {
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
"type": "string"
},
"sport": {
"anyOf": [
{
"enum": [
"run",
"ride",
"swim"
],
"type": "string"
},
{
"type": "null"
}
]
},
"target": {
"anyOf": [
{
"maxLength": 500,
"minLength": 1,
"type": "string"
},
{
"type": "null"
}
]
},
"title": {
"maxLength": 300,
"minLength": 1,
"type": "string"
},
"type": {
"const": "general_create",
"description": "Use exactly \"general_create\" as command.type.",
"type": "string"
}
},
"required": [
"type",
"operationId",
"title"
],
"type": "object"
},
{
"additionalProperties": false,
"properties": {
"comment": {
"anyOf": [
{
"maxLength": 1000,
"minLength": 1,
"type": "string"
},
{
"type": "null"
}
]
},
"deadlineDate": {
"anyOf": [
{
"pattern": "^\\d{4}-\\d{2}-\\d{2}$",
"type": "string"
},
{
"type": "null"
}
]
},
"goalPublicId": {
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
"type": "string"
},
"operationId": {
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
"type": "string"
},
"sport": {
"anyOf": [
{
"enum": [
"run",
"ride",
"swim"
],
"type": "string"
},
{
"type": "null"
}
]
},
"target": {
"anyOf": [
{
"maxLength": 500,
"minLength": 1,
"type": "string"
},
{
"type": "null"
}
]
},
"title": {
"maxLength": 300,
"minLength": 1,
"type": "string"
},
"type": {
"const": "general_update",
"description": "Use exactly \"general_update\" as command.type.",
"type": "string"
}
},
"required": [
"type",
"operationId",
"goalPublicId"
],
"type": "object"
},
{
"additionalProperties": false,
"properties": {
"goalPublicId": {
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
"type": "string"
},
"operationId": {
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
"type": "string"
},
"type": {
"const": "general_archive",
"description": "Use exactly \"general_archive\" as command.type.",
"type": "string"
}
},
"required": [
"type",
"operationId",
"goalPublicId"
],
"type": "object"
},
{
"additionalProperties": false,
"properties": {
"comment": {
"anyOf": [
{
"maxLength": 1000,
"minLength": 1,
"type": "string"
},
{
"type": "null"
}
]
},
"date": {
"pattern": "^\\d{4}-\\d{2}-\\d{2}$",
"type": "string"
},
"distanceMeters": {
"exclusiveMinimum": 0,
"maximum": 1000000,
"type": "integer"
},
"operationId": {
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
"type": "string"
},
"priority": {
"enum": [
"A",
"B",
"C"
],
"type": "string"
},
"sport": {
"enum": [
"run",
"ride",
"swim"
],
"type": "string"
},
"target": {
"anyOf": [
{
"pattern": "^\\d{1,3}:[0-5]\\d(?::[0-5]\\d)?$",
"type": "string"
},
{
"type": "null"
}
]
},
"timezone": {
"maxLength": 100,
"minLength": 1,
"type": "string"
},
"title": {
"maxLength": 300,
"minLength": 1,
"type": "string"
},
"type": {
"const": "start_create",
"description": "Use exactly \"start_create\" as command.type.",
"type": "string"
}
},
"required": [
"type",
"operationId",
"title",
"date",
"sport",
"distanceMeters",
"priority"
],
"type": "object"
},
{
"additionalProperties": false,
"properties": {
"comment": {
"anyOf": [
{
"maxLength": 1000,
"minLength": 1,
"type": "string"
},
{
"type": "null"
}
]
},
"date": {
"pattern": "^\\d{4}-\\d{2}-\\d{2}$",
"type": "string"
},
"distanceMeters": {
"anyOf": [
{
"exclusiveMinimum": 0,
"maximum": 1000000,
"type": "integer"
},
{
"type": "null"
}
]
},
"goalPublicId": {
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
"type": "string"
},
"operationId": {
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
"type": "string"
},
"priority": {
"enum": [
"A",
"B",
"C"
],
"type": "string"
},
"sport": {
"enum": [
"run",
"ride",
"swim"
],
"type": "string"
},
"target": {
"anyOf": [
{
"pattern": "^\\d{1,3}:[0-5]\\d(?::[0-5]\\d)?$",
"type": "string"
},
{
"type": "null"
}
]
},
"timezone": {
"maxLength": 100,
"minLength": 1,
"type": "string"
},
"title": {
"maxLength": 300,
"minLength": 1,
"type": "string"
},
"type": {
"const": "start_update",
"description": "Use exactly \"start_update\" as command.type.",
"type": "string"
}
},
"required": [
"type",
"operationId",
"goalPublicId"
],
"type": "object"
},
{
"additionalProperties": false,
"properties": {
"goalPublicId": {
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
"type": "string"
},
"operationId": {
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
"type": "string"
},
"type": {
"description": "Use exactly start_delete, start_cancel, or start_dns as command.type.",
"enum": [
"start_delete",
"start_cancel",
"start_dns"
],
"type": "string"
}
},
"required": [
"type",
"operationId",
"goalPublicId"
],
"type": "object"
},
{
"additionalProperties": false,
"properties": {
"actualDate": {
"pattern": "^\\d{4}-\\d{2}-\\d{2}$",
"type": "string"
},
"goalPublicId": {
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
"type": "string"
},
"operationId": {
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
"type": "string"
},
"resultKind": {
"enum": [
"manual",
"official_chip",
"official_gun"
],
"type": "string"
},
"seconds": {
"exclusiveMinimum": 0,
"maximum": 604800,
"type": "integer"
},
"type": {
"const": "result_set",
"description": "Use exactly \"result_set\" as command.type.",
"type": "string"
}
},
"required": [
"type",
"operationId",
"goalPublicId",
"resultKind",
"seconds"
],
"type": "object"
},
{
"additionalProperties": false,
"properties": {
"goalPublicId": {
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
"type": "string"
},
"operationId": {
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
"type": "string"
},
"selectionId": {
"pattern": "^[0-9a-f]{64}$",
"type": "string"
},
"type": {
"const": "result_link_activity",
"description": "Use exactly \"result_link_activity\" as command.type.",
"type": "string"
}
},
"required": [
"type",
"operationId",
"goalPublicId",
"selectionId"
],
"type": "object"
},
{
"additionalProperties": false,
"properties": {
"goalPublicId": {
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
"type": "string"
},
"operationId": {
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
"type": "string"
},
"type": {
"const": "result_detach_activity",
"description": "Use exactly \"result_detach_activity\" as command.type.",
"type": "string"
}
},
"required": [
"type",
"operationId",
"goalPublicId"
],
"type": "object"
},
{
"additionalProperties": false,
"description": "Create a standalone result. Multiple results for the same sport and distance are allowed.",
"properties": {
"actualDate": {
"pattern": "^\\d{4}-\\d{2}-\\d{2}$",
"type": "string"
},
"distanceMeters": {
"exclusiveMinimum": 0,
"maximum": 1000000,
"type": "integer"
},
"operationId": {
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
"type": "string"
},
"seconds": {
"exclusiveMinimum": 0,
"maximum": 604800,
"type": "integer"
},
"sport": {
"enum": [
"run",
"ride",
"swim"
],
"type": "string"
},
"type": {
"const": "manual_result_create",
"description": "Use exactly \"manual_result_create\" as command.type.",
"type": "string"
}
},
"required": [
"type",
"operationId",
"sport",
"distanceMeters",
"seconds",
"actualDate"
],
"type": "object"
},
{
"additionalProperties": false,
"description": "Update one existing standalone result. Use the resultPublicId returned in manualResults.",
"properties": {
"actualDate": {
"pattern": "^\\d{4}-\\d{2}-\\d{2}$",
"type": "string"
},
"distanceMeters": {
"exclusiveMinimum": 0,
"maximum": 1000000,
"type": "integer"
},
"operationId": {
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
"type": "string"
},
"resultPublicId": {
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
"type": "string"
},
"seconds": {
"exclusiveMinimum": 0,
"maximum": 604800,
"type": "integer"
},
"sport": {
"enum": [
"run",
"ride",
"swim"
],
"type": "string"
},
"type": {
"const": "manual_result_update",
"description": "Use exactly \"manual_result_update\" as command.type.",
"type": "string"
}
},
"required": [
"type",
"operationId",
"resultPublicId",
"sport",
"distanceMeters",
"seconds",
"actualDate"
],
"type": "object"
},
{
"additionalProperties": false,
"properties": {
"operationId": {
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
"type": "string"
},
"resultPublicId": {
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
"type": "string"
},
"type": {
"const": "manual_result_delete",
"description": "Use exactly \"manual_result_delete\" as command.type.",
"type": "string"
}
},
"required": [
"type",
"operationId",
"resultPublicId"
],
"type": "object"
},
{
"additionalProperties": false,
"properties": {
"actualDate": {
"pattern": "^\\d{4}-\\d{2}-\\d{2}$",
"type": "string"
},
"distanceMeters": {
"exclusiveMinimum": 0,
"maximum": 1000000,
"type": "integer"
},
"expectedBestResultVersion": {
"pattern": "^[0-9a-f]{64}$",
"type": "string"
},
"legacyToken": {
"pattern": "^[0-9a-f]{64}$",
"type": "string"
},
"operationId": {
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
"type": "string"
},
"seconds": {
"exclusiveMinimum": 0,
"maximum": 604800,
"type": "integer"
},
"sport": {
"enum": [
"run",
"ride",
"swim"
],
"type": "string"
},
"type": {
"const": "legacy_result_convert",
"description": "Use exactly \"legacy_result_convert\" as command.type.",
"type": "string"
}
},
"required": [
"type",
"operationId",
"expectedBestResultVersion",
"legacyToken",
"sport",
"distanceMeters",
"seconds",
"actualDate"
],
"type": "object"
},
{
"additionalProperties": false,
"properties": {
"expectedBestResultVersion": {
"pattern": "^[0-9a-f]{64}$",
"type": "string"
},
"legacyToken": {
"pattern": "^[0-9a-f]{64}$",
"type": "string"
},
"operationId": {
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
"type": "string"
},
"type": {
"const": "legacy_result_delete",
"description": "Use exactly \"legacy_result_delete\" as command.type.",
"type": "string"
}
},
"required": [
"type",
"operationId",
"expectedBestResultVersion",
"legacyToken"
],
"type": "object"
}
],
"description": "One exact goal, start, activity-link, or result change. Broad replace-all writes are not supported."
},
"expectedDataVersion": {
"description": "Exact dataVersion returned by get_editable_goals_results. A stale version is rejected.",
"pattern": "^[0-9a-f]{64}$",
"type": "string"
}
},
"required": [
"expectedDataVersion",
"command"
],
"type": "object"
},
"name": "preview_goal_result_change",
"outputSchema": null
},
{
"description": "Create a controlled preview for rules or profile memory. Goals, starts, activities, and results must use preview_goal_result_change so stable IDs and calendar links are preserved. This does not update the athlete profile. Before commit, show the user the exact full text from the preview and ask for explicit confirmation of that exact text.",
"inputSchema": {
"$schema": "https://json-schema.org/draft/2020-12/schema",
"additionalProperties": false,
"properties": {
"diffSummary": {
"description": "Short internal summary of the factual change. Do not include raw chat transcript.",
"minLength": 1,
"type": "string"
},
"newText": {
"description": "Legacy fallback full section text for rules or profile only.",
"minLength": 1,
"type": "string"
},
"previousHash": {
"description": "Hash returned by read_profile_sections for the same section. Used to prevent overwriting newer profile data.",
"minLength": 1,
"type": "string"
},
"section": {
"description": "Profile memory section to update. Supports rules and profile when enabled by the server. Goals and results use preview_goal_result_change.",
"enum": [
"rules",
"profile"
],
"type": "string"
},
"structured": {
"additionalProperties": false,
"description": "Preferred input. For rules/profile, send only the matching object.",
"properties": {
"profile": {
"additionalProperties": false,
"description": "Use only when section is profile. Server patches Athlete.info and builds the exact web-profile text. Do not send firstName.",
"properties": {
"additional": {
"anyOf": [
{
"minLength": 1,
"type": "string"
},
{
"type": "null"
}
],
"description": "Additional durable profile context. Omit to preserve, null to clear."
},
"birthYear": {
"anyOf": [
{
"maximum": 2010,
"minimum": 1940,
"type": "integer"
},
{
"type": "null"
}
],
"description": "Birth year. Omit to preserve, null to clear."
},
"gender": {
"anyOf": [
{
"enum": [
"male",
"female"
],
"type": "string"
},
{
"type": "null"
}
],
"description": "Gender from the web profile form. Omit to preserve, null to clear."
},
"height": {
"anyOf": [
{
"maximum": 230,
"minimum": 130,
"type": "integer"
},
{
"type": "null"
}
],
"description": "Height in cm. Omit to preserve, null to clear."
},
"ltHr": {
"anyOf": [
{
"maximum": 220,
"minimum": 100,
"type": "integer"
},
{
"type": "null"
}
],
"description": "Lactate-threshold heart rate. Omit to preserve, null to clear."
},
"maxHr": {
"anyOf": [
{
"maximum": 220,
"minimum": 100,
"type": "integer"
},
{
"type": "null"
}
],
"description": "Maximum heart rate. Omit to preserve, null to clear."
},
"otherSports": {
"anyOf": [
{
"minLength": 1,
"type": "string"
},
{
"type": "null"
}
],
"description": "Other sports. Omit to preserve, null to clear."
},
"raceResults": {
"anyOf": [
{
"items": {
"additionalProperties": false,
"properties": {
"date": {
"anyOf": [
{
"minLength": 1,
"type": "string"
},
{
"type": "null"
}
],
"description": "Optional race date or month. Send null only to omit it for this race result."
},
"distance": {
"description": "Race distance, for example 5 км, 10 km, half marathon, or marathon.",
"minLength": 1,
"type": "string"
},
"result": {
"description": "Finish result, for example 20:15 or 1:42:30.",
"minLength": 1,
"type": "string"
}
},
"required": [
"distance",
"result"
],
"type": "object"
},
"type": "array"
},
{
"type": "null"
}
],
"description": "Race PR list. If provided, replaces the whole list; [] or null clears it. Omit to preserve."
},
"weight": {
"anyOf": [
{
"maximum": 200,
"minimum": 30,
"type": "integer"
},
{
"type": "null"
}
],
"description": "Weight in kg. Omit to preserve, null to clear."
}
},
"type": "object"
},
"rules": {
"additionalProperties": false,
"description": "Use only when section is rules. Server builds the exact web-profile text.",
"properties": {
"additional": {
"description": "Extra durable rule context that does not fit the other fields.",
"minLength": 1,
"type": "string"
},
"customRules": {
"description": "Separate durable custom rules. The server writes one `Rule:` line per item.",
"items": {
"minLength": 1,
"type": "string"
},
"type": "array"
},
"offDays": {
"description": "Exact single number for `Rest days per week`. Do not send ranges, minimums, maximums, or flexible wording here.",
"maximum": 7,
"minimum": 0,
"type": "integer"
},
"restDays": {
"description": "Fixed rest weekdays for `Rest days`, only when the user names fixed weekdays.",
"minLength": 1,
"type": "string"
},
"trainingsPerWeek": {
"description": "Exact single number for `Training sessions per week`. Do not send ranges, minimums, maximums, or flexible wording here.",
"maximum": 14,
"minimum": 1,
"type": "integer"
}
},
"type": "object"
}
},
"type": "object"
}
},
"required": [
"section",
"previousHash"
],
"type": "object"
},
"name": "preview_profile_section_change",
"outputSchema": null
},
{
"description": "Load the exact full text and hashes for one profile-memory record selected from read_profile_change_history. This is read-only and should be used only for details or before considering a restore.",
"inputSchema": {
"$schema": "https://json-schema.org/draft/2020-12/schema",
"additionalProperties": false,
"properties": {
"changeId": {
"description": "Change id returned by read_profile_change_history.",
"exclusiveMinimum": 0,
"maximum": 9007199254740991,
"type": "integer"
}
},
"required": [
"changeId"
],
"type": "object"
},
"name": "read_profile_change_detail",
"outputSchema": null
},
{
"description": "Read a compact paginated index of goals, rules, or profile memory changes. Text bodies and hashes are omitted. Use nextCursor for another page and read_profile_change_detail for one exact record.",
"inputSchema": {
"$schema": "https://json-schema.org/draft/2020-12/schema",
"additionalProperties": false,
"properties": {
"cursor": {
"description": "nextCursor from the previous history page.",
"exclusiveMinimum": 0,
"maximum": 9007199254740991,
"type": "integer"
},
"limit": {
"description": "Compact records per page. Default 10, maximum 20.",
"maximum": 20,
"minimum": 1,
"type": "integer"
},
"section": {
"enum": [
"goals",
"rules",
"profile"
],
"type": "string"
},
"status": {
"enum": [
"previewed",
"committed",
"restored",
"expired",
"conflict",
"rejected"
],
"type": "string"
}
},
"type": "object"
},
"name": "read_profile_change_history",
"outputSchema": null
},
{
"description": "Read controlled rules and profile memory with their hashes. Goals and results are available only through get_editable_goals_results. Use the returned hash as previousHash before previewing a rules/profile change.",
"inputSchema": {
"$schema": "https://json-schema.org/draft/2020-12/schema",
"additionalProperties": false,
"properties": {},
"type": "object"
},
"name": "read_profile_sections",
"outputSchema": null
},
{
"description": "Restore a committed profile, goals, or rules profile memory change back to its previous text. First load the exact record with read_profile_change_detail. For goals, restoring old-format labels is blocked; rebuild a canonical goals preview instead. Call this only after the user explicitly confirms the exact full text that will be restored.",
"inputSchema": {
"$schema": "https://json-schema.org/draft/2020-12/schema",
"additionalProperties": false,
"properties": {
"changeId": {
"description": "Committed change id to restore. Call only after the user explicitly confirms the exact full text that will be restored. Restore only succeeds when the current section still matches that change.",
"exclusiveMinimum": 0,
"maximum": 9007199254740991,
"type": "integer"
}
},
"required": [
"changeId"
],
"type": "object"
},
"name": "restore_profile_change",
"outputSchema": null
},
{
"description": "Save the athlete preparation map only after explicit user confirmation. The map is the reusable result of long-horizon planning, not a calendar, weekly plan, workout prescription, or full coaching analysis. Target length is about 1800-4000 characters; hard maximum is 5000 characters. Required sections: Goal direction, Current phase, Preparation map, Durable boundaries, Review triggers / unknowns. Build from current goals, rules, profile, lastMetrics, wellness, training history, evidence, reports, and calendar first; treat previous strategy as historical context and contamination risk. Use at least 8 weeks of weekly/load history when available and 12-26 weeks for season direction, combined with exact bounded-list windows and selected detailed workout passports. Treat every dated goal as a real input and infer priority only when explicit. Store the agreed goal relationships, current phase purpose, a broad 3-6 phase route, what each phase develops/preserves/defers, transition conditions, durable boundaries, and causal review triggers. A phase may name its target capacity. Every Durable boundaries line must preserve a route-specific decision and must not repeat universal coaching, measurement, device, load-cost, or athlete rules. Local pain, sleep, recovery, illness, or execution signals change the near-term plan first and become map review triggers only when persistence would change phase feasibility, timing, sequence, or the goal route. Treat phase dates as approximate anchors and Transition when as review evidence, not hard gates; if unmet, consider adaptation, delayed or compressed transition, and remaining runway. Do not store session frequency, easy/hard balance, weekly load targets, number of key workouts, default weekly stimuli, exact progression, workout formats/protocols, fixed taper depth, ready 2-4 week sequences, current Fitness/Fatigue/Form/TL, loaded windows, or live calendar state. Old detailed strategies remain historical context: do not proactively ask the athlete to convert one merely because an internal audit calls it legacy. Create or update the map only when the athlete asks for strategy/season work or explicitly agrees to a long-term route change. Before calling this tool, show the exact full markdown and ask for explicit confirmation. Never show one version and save another.",
"inputSchema": {
"$schema": "https://json-schema.org/draft/2020-12/schema",
"additionalProperties": false,
"properties": {
"strategy_md": {
"description": "Compact STAS preparation map: a saved result of long-horizon planning, not a calendar, weekly plan, workout prescription, or full coaching analysis. Target length is about 1800-4000 characters; hard maximum is 5000 characters. Required sections: Goal direction, Current phase, Preparation map, Durable boundaries, Review triggers / unknowns. Build from current goals, rules, profile, lastMetrics, wellness, reports, training history, evidence, and calendar first; do not copy or paraphrase previous_strategy unless current facts independently support the same durable decision. For strategy-level work, use at least 8 weeks of weekly/load history when available and 12-26 weeks for season direction; combine it with exact bounded-list windows and selected detailed workout passports instead of using only 2-4 weeks. Treat every dated goal as a real planning input by default; do not infer a single main goal from distance, later date, target result, profile order, or old strategy wording. Use priority only when it is explicit in the current profile, goal comment, athlete message, or current coaching decision. B/C/training-race/no-full-taper wording changes peak depth and risk; it does not mean the race should be ignored unless the athlete explicitly says the result does not matter. Store the agreed goal relationships, current phase purpose, a 3-6 phase seasonal route, what each phase develops/preserves/defers, broad transition conditions, durable boundaries, and causal review triggers. A phase may name the capacity it develops, but it must not prescribe exact weekly stimuli, workout formats, dose, load, support work, cuts, or taper. Do not store session frequency, easy/hard balance, weekly load targets, number of key workouts, default weekly stimulus, exact progression, workout protocols, fixed taper depth, ready 2-4 week sequences, or current Fitness/Fatigue/Form/TL. Every Durable boundaries line must preserve a route-specific decision that would be lost after reloading goals, athlete rules, and canonical planning rules; delete universal coaching, measurement, device, or load-cost rules from the map. Local pain, sleep, recovery, illness, or execution signals change the near-term plan first. Store them as map review triggers only when persistence or consequence would change phase feasibility, timing, sequence, or the goal route. Treat phase dates as approximate anchors and Transition when as review evidence, not hard gates. If a condition is unmet, consider adaptation, delayed or compressed transition, and remaining runway to the next goal instead of freezing the route. Old detailed strategies remain historical context. Do not proactively ask the athlete to convert one merely because it is legacy; create or update the map only when the athlete asks for strategy/season work or explicitly agrees to a long-term route change. Before save_strategy, show the user the exact full markdown and save only after explicit confirmation. Never show one version and save another.",
"maxLength": 5000,
"minLength": 1,
"type": "string"
}
},
"required": [
"strategy_md"
],
"type": "object"
},
"name": "save_strategy",
"outputSchema": null
},
{
"description": "Check which STAS user is currently authenticated. Use only for diagnostics or reconnect troubleshooting.",
"inputSchema": {
"$schema": "https://json-schema.org/draft/2020-12/schema",
"additionalProperties": false,
"properties": {},
"type": "object"
},
"name": "whoami",
"outputSchema": null
}
]
}Verify it yourself
curl -s https://api.teppi.xyz/v1/evidence/sha256:fae9bbc73263791b19bc4110734aadfec7f6e38040706d373c22f8fa979dfcd0 | sha256sum