skills: {'id': 'get_user_summary', 'name': 'get_user_summary', 'description': "Start here for most conversations. Load the athlete's profile, goals, rules, recent load, current fitness context, performance evidence, planning guidance, and persistent STAS memory opportunities.", 'tags': [], 'examples': None, 'input_modes': None, 'output_modes': None}, {'id': 'get_trainings', 'name': 'get_trainings', 'description': 'Load recent workouts with pace, heart rate, sport metrics, intervals, and athlete reports. Use after the summary when analyzing load, progress, fatigue, or consistency.', 'tags': [], 'examples': None, 'input_modes': None, 'output_modes': None}, {'id': 'get_planned_events', 'name': 'get_planned_events', 'description': 'Read planned events from the Intervals calendar in a date window. Use this before rewriting or replacing an existing STAS plan.', 'tags': [], 'examples': None, 'input_modes': None, 'output_modes': None}, {'id': 'whoami', 'name': 'whoami', 'description': 'Check which STAS user is currently authenticated. Use only for diagnostics or reconnect troubleshooting.', 'tags': [], 'examples': None, 'input_modes': None, 'output_modes': None}, {'id': 'create_plan_event', 'name': 'create_plan_event', '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/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 workout_builder. 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 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 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 meters; \'m\' means minutes. 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}]}', 'tags': [], 'examples': None, 'input_modes': None, 'output_modes': None}, {'id': 'create_note_event', 'name': 'create_note_event', '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.', 'tags': [], 'examples': None, 'input_modes': None, 'output_modes': None}, {'id': 'delete_plan_events', 'name': 'delete_plan_events', 'description': 'Delete STAS plan events. For one specific workout, pass external_ids with the exact plan:YYYY-MM-DD:<slug> id. 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.', 'tags': [], 'examples': None, 'input_modes': None, 'output_modes': None}, {'id': 'delete_note_events', 'name': 'delete_note_events', 'description': 'Delete STAS note events. For one specific note, pass external_ids with the exact note:YYYY-MM-DD:<slug> id. 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.', 'tags': [], 'examples': None, 'input_modes': None, 'output_modes': None}; uptime_30d 1.0%; p95 1773.2ms; conformance: pass
How to connect
https://stas.run/api/mcp
curl -X POST https://stas.run/api/mcp \
-H 'Content-Type: application/json' \
-H 'Accept: application/json, text/event-stream' \
-d '{"jsonrpc":"2.0","id":1,"method":"initialize","params":{}}'