STAS Running Coach for Claude
REMOTE · STAS.RUN · SCANNED AUG 3
Connect Claude to your Intervals.icu watch data for fitness, workout review, and plan writing.
Available components
How this component scores in each security and reliability category. Every signal is checked automatically against the live server, and we only credit what we can confirm. How we score →
Endpoint Security97
- The endpoint's TLS certificate is valid, in date, and uses a strong key. View diagnostics → Pass
- Authorisation is enforced on tool calls, advertised via RFC 9728 protected-resource metadata. Discovery is public, which costs nothing: no tool can be invoked without a token. View diagnostics → Pass
- HTTPS is enforced; there's no plaintext access path. View diagnostics → Pass
- The HSTS (Strict-Transport-Security) header is present. View diagnostics → Pass
- DNSSEC is configured correctly; the domain's records validate against the full chain to the root. View diagnostics → Pass
- The authorisation server offers only Dynamic Client Registration (RFC 7591), which MCP 2026-07-28 deprecated in favour of Client ID Metadata Documents. View diagnostics → Partial
Transport & Reachability100
- Verified streamable-http transport via a live MCP handshake. View diagnostics → Pass
Schema Quality & AI Usability75
- 100% of prompts and resources have a non-trivial description (not blank, and not just the item's name).Pass
- AI-judged instruction clarity (good).Pass
- Context-footprint check failed: tool/resource definitions use about 4522 tokens (~161/item across 28 items; 20 tools + 8 resources), over budget; trim descriptions and params. See how to fix → Fail
- Usage-examples check failed: none of the tools include examples. See how to fix → Fail
Stability & Change Management27
- Stability observed for 8 of 30 days with no destabilising changes; credit accrues until the full window elapses.Partial
Tool Coverage95
- 100% of tools have a non-trivial description (not blank, and not just the tool's name).Pass
- 85% of tool parameters carry a description.Partial
Capabilities100
- Implements a supported MCP spec version (2025-11-25); the latest is 2026-07-28.Pass
Add this component to your MCP client. Where a client-specific snippet is available, pick your client below and copy it straight into your config; otherwise use the connection detail shown.
remote · stas.run
claude mcp add --transport http run-stas-stas https://stas.run/api/mcp
[mcp_servers.run-stas-stas] url = "https://stas.run/api/mcp"
{
"$schema": "https://opencode.ai/config.json",
"mcp": {
"run-stas-stas": {
"type": "remote",
"url": "https://stas.run/api/mcp",
"enabled": true
}
}
} openclaw mcp add run-stas-stas --url https://stas.run/api/mcp --transport streamable-http
mcp_servers:
run-stas-stas:
url: "https://stas.run/api/mcp" {
"mcpServers": {
"run-stas-stas": {
"type": "http",
"url": "https://stas.run/api/mcp"
}
}
} The mcpServers block is a cross-client convention. Remote transports vary, so check your client's docs.
Every change we have recorded for this component, newest first. Security-relevant changes are always shown. ▲ marks a change for the better, ▼ a change for the worse; unmarked changes are neutral.
- 2 Aug 26 +1
No change was recorded against any check on this day. Stability & Change Management went from 20 to 23. That category is still filling its 30-day observation window: 6 days of observed history at the previous scan, 7 at this one. The score rises as the window fills, whether or not the server changes.
- 31 Jul 26 +6
- We updated how we score, so this day's move reflects our rubric, not a change to the server See what changed → functional
- 30 Jul 26 0
- We updated how we score, so this day's move reflects our rubric, not a change to the server See what changed → functional
- 29 Jul 26 +1
No change was recorded against any check on this day. Stability & Change Management went from 7 to 10. That category is still filling its 30-day observation window: 2 days of observed history at the previous scan, 3 at this one. The score rises as the window fills, whether or not the server changes.
- 28 Jul 26 +1
No change was recorded against any check on this day. Stability & Change Management went from 3 to 7. That category is still filling its 30-day observation window: 1 days of observed history at the previous scan, 2 at this one. The score rises as the window fills, whether or not the server changes.
- 27 Jul 26 +1
- We updated how we score, so this day's move reflects our rubric, not a change to the server See what changed → functional
- 26 Jul 26 72
First indexed and scored.
Diagnostic detail from the automated scan of this channel: what the scanner observed at each step, so you can see exactly where a check passed or failed. It is informational only and never changes the trust score.
Captured 3 Aug 2026 · Probed https://stas.run/api/mcp
TLS valid
Negotiated TLS 1.3 with TLS_AES_128_GCM_SHA256 .
| Subject | Issuer | Valid from | Valid until | Key | Signature | Serial |
|---|---|---|---|---|---|---|
| CN=stas.run | CN=YE1,O=Let's Encrypt,C=US | 6 Jul 2026 | 4 Oct 2026 | ECDSA 256 | ECDSA-SHA384 | 570c6ba73eac69d77374e3215031eb01c09 |
| SANs: stas.run | ||||||
| CN=YE1,O=Let's Encrypt,C=US (CA) | CN=Root YE,O=ISRG,C=US | 3 Sept 2025 | 2 Sept 2028 | ECDSA 384 | ECDSA-SHA384 | 5ddd70dd31f801c85c186a7a04b80afe |
| CN=Root YE,O=ISRG,C=US (CA) | CN=ISRG Root X2,O=Internet Security Research Group,C=US | 13 May 2026 | 2 Sept 2032 | ECDSA 384 | ECDSA-SHA384 | 872165fc34b6e5fba8add5b3705fb53a |
| CN=ISRG Root X2,O=Internet Security Research Group,C=US (CA) | CN=ISRG Root X1,O=Internet Security Research Group,C=US | 13 May 2026 | 2 Sept 2032 | ECDSA 384 | SHA256-RSA | 6c8f1dc727c7117f7baf853ac980f9cd |
DNSSEC secure
Validation of stas.run. — Secure
| Zone | DS | Keys | Algorithms | Outcome |
|---|---|---|---|---|
| . | trust_anchor | 20326, 38696 | 8, 8 | Verified |
| run. | present | 37315 | 8 | Verified |
| stas.run. | present | 2371 | 13 | Verified |
| stas.run. | Verified address RRset verified with the apex keys |
Authentication Enforced and verified
The endpoint asked for a token and published valid RFC 9728 metadata describing how to get one.
| Result | Enforced and verified |
|---|---|
| Enforced | On tool calls |
| HTTP status | 200 |
WWW-Authenticate challenge Bearer error="invalid_token", error_description="Authentication required for this tool", resource_metadata="https://stas.run/.well-known/oauth-protected-resource/mcp"
Bearer error="invalid_token", error_description="Authentication required for this tool", resource_metadata="https://stas.run/.well-known/oauth-protected-resource/mcp" | Header | Value |
|---|---|
| strict-transport-security | max-age=31536000; includeSubDomains |
| content-security-policy | default-src 'self'; script-src 'self' 'unsafe-inline' telegram.org mc.yandex.ru www.googletagmanager.com www.google-analytics.com; style-src 'self' 'unsafe-inline'; img-src 'self' data: telegram.org storage.ko-fi.com mc.yandex.ru www.googletagmanager.com; connect-src 'self' mc.yandex.ru www.google-analytics.com www.googletagmanager.com errors.stas.run; font-src 'self'; frame-src oauth.telegram.org; object-src 'none' |
| x-content-type-options | nosniff |
| x-frame-options | DENY |
| referrer-policy | strict-origin-when-cross-origin |
| permissions-policy | camera=(), microphone=(), geolocation=() |
Protected resource metadata
| Document | https://stas.run/.well-known/oauth-protected-resource/mcp |
|---|---|
| Retrieved | Yes |
| Resource | https://stas.run/api/mcp |
| Authorisation server | https://intervals.stas.run |
Transports 2 probes
| Transport | URL | Outcome | Status | Location |
|---|---|---|---|---|
| streamable-http | https://stas.run/api/mcp | Verified | 200 | |
| http (plaintext) | http://stas.run/api/mcp | HTTPS enforced | 308 | https://stas.run/api/mcp |
The tools this component advertises to a client, with an estimated token cost for each. Expand a tool to see its parameters and schema. The per-tool counts are indicative and are not scored directly; the schema's total context footprint is one signal in Schema Quality & AI Usability.
commit_goal_result_change ~80
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.
| Name | Type | Req | Description |
|---|---|---|---|
| changeId | integer | yes | Preview id returned by preview_goal_result_change. Commit only after the user confirms that exact preview. |
No output schema declared.
No examples provided.
commit_profile_section_change ~98
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.
| Name | Type | Req | Description |
|---|---|---|---|
| changeId | integer | yes | Preview change id returned by preview_profile_section_change. Call only after the user explicitly confirms the exact full text shown for this preview. |
No output schema declared.
No examples provided.
create_note_event ~159
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.
| Name | Type | Req | Description |
|---|---|---|---|
| dry_run | boolean | yes | Required. false writes to Intervals.icu; true only previews without writing. |
| events | array | yes | — |
No output schema declared.
No examples provided.
create_plan_event ~1,162
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'…
| Name | Type | Req | Description |
|---|---|---|---|
| dry_run | boolean | yes | Required. false writes to Intervals.icu; true only previews without writing. |
| events | array | yes | 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. wor… |
No output schema declared.
No examples provided.
delete_note_events ~209
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.
| Name | Type | Req | Description |
|---|---|---|---|
| dry_run | boolean | yes | Required. false writes to Intervals.icu; true only previews without writing. |
| external_id | — | — | Compatibility alias for deleting one exact STAS event id. Prefer external_ids for multiple ids. |
| external_ids | array | — | Exact STAS event ids to delete. Use this for deleting specific workouts or notes without clearing the whole day/window. |
| newest | string | — | End date for full-window replacement deletes. Required unless external_ids is provided. |
| oldest | string | — | Start date for full-window replacement deletes. Required unless external_ids is provided. |
No output schema declared.
No examples provided.
delete_plan_events ~221
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.
| Name | Type | Req | Description |
|---|---|---|---|
| dry_run | boolean | yes | Required. false writes to Intervals.icu; true only previews without writing. |
| external_id | — | — | Compatibility alias for deleting one exact STAS event id. Prefer external_ids for multiple ids. |
| external_ids | array | — | Exact STAS event ids to delete. Use this for deleting specific workouts or notes without clearing the whole day/window. |
| newest | string | — | End date for full-window replacement deletes. Required unless external_ids is provided. |
| oldest | string | — | Start date for full-window replacement deletes. Required unless external_ids is provided. |
No output schema declared.
No examples provided.
get_activity_detail ~100
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.
| Name | Type | Req | Description |
|---|---|---|---|
| training_id | string | yes | Training id returned by get_trainings. Load get_trainings first to identify the exact workout. |
No output schema declared.
No examples provided.
get_editable_goals_results ~56
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.
Input schema present but exposes no named parameters.
No output schema declared.
No examples provided.
get_goal_activity_candidates ~70
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.
| Name | Type | Req | Description |
|---|---|---|---|
| goalPublicId | string | yes | Stable public ID of one event goal returned by get_editable_goals_results. |
No output schema declared.
No examples provided.
get_planned_events ~49
Read planned events from the Intervals calendar in a date window. Use this before rewriting or replacing an existing STAS plan.
| Name | Type | Req | Description |
|---|---|---|---|
| newest | string | yes | — |
| oldest | string | yes | — |
No output schema declared.
No examples provided.
get_trainings ~227
Load one bounded, size-safe list of completed workouts. Default mode is a rich index for chronology, load, reports, compact summaries, and choosing training_id. Set full=true only for analysis-rich comparison across multiple workouts; it adds a bounded compact interval projection. For one selected workout, use get_activity_detail instead of full=true.
| Name | Type | Req | Description |
|---|---|---|---|
| full | boolean | — | 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… |
| limit | integer | — | Max trainings per page. Server cap is 50. |
| newest | string | — | End boundary date in YYYY-MM-DD, exclusive. To load one date, set newest to the next calendar date, for example oldest=2026-06-21 and newest=2026-06-22. |
| oldest | string | — | Start boundary date in YYYY-MM-DD, inclusive. |
No output schema declared.
No examples provided.
get_user_summary ~57
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.
| Name | Type | Req | Description |
|---|---|---|---|
| section | string | — | — |
No output schema declared.
No examples provided.
preview_goal_result_change ~130
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.
| Name | Type | Req | Description |
|---|---|---|---|
| command | — | yes | One exact goal, start, activity-link, or result change. Broad replace-all writes are not supported. |
| expectedDataVersion | string | yes | Exact dataVersion returned by get_editable_goals_results. A stale version is rejected. |
No output schema declared.
No examples provided.
preview_profile_section_change ~191
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.
| Name | Type | Req | Description |
|---|---|---|---|
| diffSummary | string | — | Short internal summary of the factual change. Do not include raw chat transcript. |
| newText | string | — | Legacy fallback full section text for rules or profile only. |
| previousHash | string | yes | Hash returned by read_profile_sections for the same section. Used to prevent overwriting newer profile data. |
| section | string | yes | Profile memory section to update. Supports rules and profile when enabled by the server. Goals and results use preview_goal_result_change. |
| structured | object | — | Preferred input. For rules/profile, send only the matching object. |
No output schema declared.
No examples provided.
read_profile_change_detail ~62
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.
| Name | Type | Req | Description |
|---|---|---|---|
| changeId | integer | yes | Change id returned by read_profile_change_history. |
No output schema declared.
No examples provided.
read_profile_change_history ~96
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.
| Name | Type | Req | Description |
|---|---|---|---|
| cursor | integer | — | nextCursor from the previous history page. |
| limit | integer | — | Compact records per page. Default 10, maximum 20. |
| section | string | — | — |
| status | string | — | — |
No output schema declared.
No examples provided.
read_profile_sections ~48
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.
Input schema present but exposes no named parameters.
No output schema declared.
No examples provided.
restore_profile_change ~114
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.
| Name | Type | Req | Description |
|---|---|---|---|
| changeId | integer | yes | 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. |
No output schema declared.
No examples provided.
save_strategy ~809
Save the athlete's long-term STAS strategy only after explicit user confirmation. Strategy is a compact long-term roadmap, not a calendar, not a weekly plan, and not a full coaching analysis. Target length is about 2500-4500 characters; hard maximum is 5000 characters. Required markdown sections: Goal chain, Current point, Weekly decision contract, Roadmap, Resources / risks, Review triggers / unknowns. Build the strategy from current goals, rules, profile, condition, training history, evidence, and calendar first; do not copy or paraphrase the previous saved strategy's wording, race labels, priorities, phase names, or workout examples unless current facts independently support them. 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. The roadmap must be the main content and say what each block prepares directly, keeps ready in the background, and leaves out for now with a reason. Do not hide a block-driving goal behind vague background wording. Keep Weekly decision contract short; it is guardrails for the blocks, not the center of the strategy. Do not write day-by-day or 8-week calendar progression inside strategy; that belongs in block planning or calendar tools. Use for meaningful changes to goals, constraints, current position, roadmap, or long-term training logic, not for one-off weekly edits. Before calling this…
| Name | Type | Req | Description |
|---|---|---|---|
| strategy_md | string | yes | Compact long-term STAS roadmap markdown, not a calendar, not a weekly plan, and not a full coaching analysis. Target length is about 2500-4500 characters; hard maximum is 5000 characters. Required se… |
No output schema declared.
No examples provided.
whoami ~25
Check which STAS user is currently authenticated. Use only for diagnostics or reconnect troubleshooting.
Input schema present but exposes no named parameters.
No output schema declared.
No examples provided.