Every change Wellknown observed on this MCP server, newest first, with what it was before and what it became. Tool-surface changes carry the definition diff. Nothing here is edited after the fact.
Added "get_activity_submission" and "get_storage_readiness"; changed the definition of "analyze_activity", "build_runner_profile_from_strava", "compare_execution" and 8 more (24 tools before, 26 now)
⟨123 unchanged words⟩ Inspect job.status/errors; this call currently runs analysis synchronously. Optional idempotency {key, caller_token} requires the server feature enabled; API keys are optional. Persist the private caller/key before submission, use get_activity_submission to reconcile, and never switch to a fresh key to bypass an unresolved outcome.
⟨109 unchanged words⟩ "string"}},"type":"object"},"idempotency":{"additionalProperties":false,"properties":{"caller_token":{"description":"Anonymous callers: private stable 32-byte cryptographic random token, unpadded base64url. Preserve before submitting; never expose in URLs/logs. Omit for API-key identity.","pattern":"^[A-Za-z0-9_-]{43}$","type":"string","writeOnly":true},"key":{"description":"Stable per-submission random key. Same caller/key/input replays; changed input conflicts. Never reuse expired keys.","pattern":"^[A-Za-z0-9._:-]{16,128}$","type":"string"}},"required":["key"],"type":"object"},"options":{"additionalProperties":false,"properties":{" ⟨240 unchanged words⟩
{"additionalProperties":false,"properties":{"error":{"anyOf":[{"additionalProperties":false,"properties":{"code":{"description":"Machine-readable warning/error code.","type":"string"},"message":{"description":"Human-readable warning/error message.","type":"string"},"severity":{"description":"Problem severity, usually warning or error.","type":"string"}},"required":["code","message"],"type":"object"},{"type":"null"}]},"job":{"additionalProperties":false,"properties":{" ⟨306 unchanged words⟩ this job.","type":"string"},"submission_request_id":{"description":"Request ID that originally allocated this job; absent in legacy metadata.","type":"string"},"warnings":{"items":{"additionalProperties":false," ⟨32 unchanged words⟩ }},"required":["job_id","status"],"type":"object"},"submission":{"additionalProperties":true,"type":"object"},"summary":{" ⟨225 unchanged words⟩
⟨309 unchanged words⟩ this job.","type":"string"},"submission_request_id":{"description":"Request ID that originally allocated this job; absent in legacy metadata.","type":"string"},"warnings":{"items":{"additionalProperties":false," ⟨37 unchanged words⟩
⟨313 unchanged words⟩ this job.","type":"string"},"submission_request_id":{"description":"Request ID that originally allocated this job; absent in legacy metadata.","type":"string"},"warnings":{"items":{"additionalProperties":false," ⟨330 unchanged words⟩
⟨309 unchanged words⟩ this job.","type":"string"},"submission_request_id":{"description":"Request ID that originally allocated this job; absent in legacy metadata.","type":"string"},"warnings":{"items":{"additionalProperties":false," ⟨37 unchanged words⟩
⟨309 unchanged words⟩ this job.","type":"string"},"submission_request_id":{"description":"Request ID that originally allocated this job; absent in legacy metadata.","type":"string"},"warnings":{"items":{"additionalProperties":false," ⟨37 unchanged words⟩
⟨309 unchanged words⟩ this job.","type":"string"},"submission_request_id":{"description":"Request ID that originally allocated this job; absent in legacy metadata.","type":"string"},"warnings":{"items":{"additionalProperties":false," ⟨37 unchanged words⟩
⟨309 unchanged words⟩ this job.","type":"string"},"submission_request_id":{"description":"Request ID that originally allocated this job; absent in legacy metadata.","type":"string"},"warnings":{"items":{"additionalProperties":false," ⟨37 unchanged words⟩
⟨309 unchanged words⟩ this job.","type":"string"},"submission_request_id":{"description":"Request ID that originally allocated this job; absent in legacy metadata.","type":"string"},"warnings":{"items":{"additionalProperties":false," ⟨37 unchanged words⟩
⟨309 unchanged words⟩ this job.","type":"string"},"submission_request_id":{"description":"Request ID that originally allocated this job; absent in legacy metadata.","type":"string"},"warnings":{"items":{"additionalProperties":false," ⟨37 unchanged words⟩
⟨309 unchanged words⟩ this job.","type":"string"},"submission_request_id":{"description":"Request ID that originally allocated this job; absent in legacy metadata.","type":"string"},"warnings":{"items":{"additionalProperties":false," ⟨37 unchanged words⟩
⟨309 unchanged words⟩ this job.","type":"string"},"submission_request_id":{"description":"Request ID that originally allocated this job; absent in legacy metadata.","type":"string"},"warnings":{"items":{"additionalProperties":false," ⟨37 unchanged words⟩
Reconcile activity submission — Read-only lookup of an opt-in analyze_activity submission using the same caller/key. No URL fetches, writes or reanalysis. outcome_unknown is not absence and never authorizes a fresh execution. Requires durable idempotency enabled; private caller_token required for anonymous callers.
Get storage readiness — Read-only non-secret storage diagnostic. Default checks configuration only. check_bucket=true performs HeadBucket; never writes test objects. Bucket access does not verify job/artifact reads or writes.
Changed the definition of "submit_course"
⟨665 unchanged words⟩ "event":{"additionalProperties":true,"description":"Submission metadata is normalized into canonical CRSProf event fields. Supplemental fields (including year, official distance/elevation, notes, and unrecognized extensions) are retained as sourceMetadata in the submission record, not inserted into CRSProf geometry. A year alone does not invent a date; website/source URLs become event links. Important catalog metadata collected from official sources. Populate ⟨409 unchanged words⟩ not the course/distance variant. Example: Speedgoat Mountain Races.","type":"string"},"notes":{"description":"Official caveats or contextual notes retained as submission provenance, not course geometry.","type":"string"},"official_source_url":{ ⟨244 unchanged words⟩
Changed the definition of "analyze_activity", "build_runner_profile_from_strava", "compare_execution" and 11 more
⟨116 unchanged words⟩ :"string"},"download_url":{"description":"Private short-livedArtifact downloadURL.URLsShareare private and short-lived; share them only with theuser.user, verbatim in a code block, not a clickable link. Ask the user to copy the entire URL into their browser address bar. Do not rewrite the URL or add tracking parameters such as utm_source: changes invalidate the signature. If expired, call get_artifact for a fresh URL. This applies only to artifact download_url values, not authorization or upload links.","type":"string"},"download_url_expires_at":{ ⟨391 unchanged words⟩
Certificate changed, valid to 2027-03-29
Certificate recorded, valid to 2026-11-11
Authorization not required
First tool surface recorded: 24 tools (server version 0.1.0)
Showing the latest 7 events. The API returns up to 500 and filters by kind: ?kind=tool_surface_changed
⟨112 unchanged words⟩ :"string"},"download_url":{"description":"Private short-livedArtifact downloadURL.URLsShareare private and short-lived; share them only with theuser.user, verbatim in a code block, not a clickable link. Ask the user to copy the entire URL into their browser address bar. Do not rewrite the URL or add tracking parameters such as utm_source: changes invalidate the signature. If expired, call get_artifact for a fresh URL. This applies only to artifact download_url values, not authorization or upload links.","type":"string"},"download_url_expires_at":{ ⟨165 unchanged words⟩
⟨116 unchanged words⟩ :"string"},"download_url":{"description":"Private short-livedArtifact downloadURL.URLsShareare private and short-lived; share them only with theuser.user, verbatim in a code block, not a clickable link. Ask the user to copy the entire URL into their browser address bar. Do not rewrite the URL or add tracking parameters such as utm_source: changes invalidate the signature. If expired, call get_artifact for a fresh URL. This applies only to artifact download_url values, not authorization or upload links.","type":"string"},"download_url_expires_at":{ ⟨458 unchanged words⟩
⟨112 unchanged words⟩ :"string"},"download_url":{"description":"Private short-livedArtifact downloadURL.URLsShareare private and short-lived; share them only with theuser.user, verbatim in a code block, not a clickable link. Ask the user to copy the entire URL into their browser address bar. Do not rewrite the URL or add tracking parameters such as utm_source: changes invalidate the signature. If expired, call get_artifact for a fresh URL. This applies only to artifact download_url values, not authorization or upload links.","type":"string"},"download_url_expires_at":{ ⟨165 unchanged words⟩
⟨112 unchanged words⟩ :"string"},"download_url":{"description":"Private short-livedArtifact downloadURL.URLsShareare private and short-lived; share them only with theuser.user, verbatim in a code block, not a clickable link. Ask the user to copy the entire URL into their browser address bar. Do not rewrite the URL or add tracking parameters such as utm_source: changes invalidate the signature. If expired, call get_artifact for a fresh URL. This applies only to artifact download_url values, not authorization or upload links.","type":"string"},"download_url_expires_at":{ ⟨165 unchanged words⟩
⟨112 unchanged words⟩ :"string"},"download_url":{"description":"Private short-livedArtifact downloadURL.URLsShareare private and short-lived; share them only with theuser.user, verbatim in a code block, not a clickable link. Ask the user to copy the entire URL into their browser address bar. Do not rewrite the URL or add tracking parameters such as utm_source: changes invalidate the signature. If expired, call get_artifact for a fresh URL. This applies only to artifact download_url values, not authorization or upload links.","type":"string"},"download_url_expires_at":{ ⟨165 unchanged words⟩
⟨112 unchanged words⟩ :"string"},"download_url":{"description":"Private short-livedArtifact downloadURL.URLsShareare private and short-lived; share them only with theuser.user, verbatim in a code block, not a clickable link. Ask the user to copy the entire URL into their browser address bar. Do not rewrite the URL or add tracking parameters such as utm_source: changes invalidate the signature. If expired, call get_artifact for a fresh URL. This applies only to artifact download_url values, not authorization or upload links.","type":"string"},"download_url_expires_at":{ ⟨165 unchanged words⟩
⟨112 unchanged words⟩ :"string"},"download_url":{"description":"Private short-livedArtifact downloadURL.URLsShareare private and short-lived; share them only with theuser.user, verbatim in a code block, not a clickable link. Ask the user to copy the entire URL into their browser address bar. Do not rewrite the URL or add tracking parameters such as utm_source: changes invalidate the signature. If expired, call get_artifact for a fresh URL. This applies only to artifact download_url values, not authorization or upload links.","type":"string"},"download_url_expires_at":{ ⟨165 unchanged words⟩
Fetch artifact metadata and a private short-lived download URL by artifact_id. Artifact download URLs are private and short-lived; share them only with the user, verbatim in a code block, not a clickable link. Ask the user to copy the entire URL into their browser address bar. Do not rewrite the URL or add tracking parameters such as utm_source: changes invalidate the signature. If expired, call get_artifact for a fresh URL. This applies only to artifact download_url values, not authorization or upload links.⟨23 unchanged words⟩ :"string"},"download_url":{"description":"Private short-livedArtifact downloadURL.URLsShareare private and short-lived; share them only with theuser.user, verbatim in a code block, not a clickable link. Ask the user to copy the entire URL into their browser address bar. Do not rewrite the URL or add tracking parameters such as utm_source: changes invalidate the signature. If expired, call get_artifact for a fresh URL. This applies only to artifact download_url values, not authorization or upload links.","type":"string"},"download_url_expires_at":{ ⟨90 unchanged words⟩
⟨112 unchanged words⟩ :"string"},"download_url":{"description":"Private short-livedArtifact downloadURL.URLsShareare private and short-lived; share them only with theuser.user, verbatim in a code block, not a clickable link. Ask the user to copy the entire URL into their browser address bar. Do not rewrite the URL or add tracking parameters such as utm_source: changes invalidate the signature. If expired, call get_artifact for a fresh URL. This applies only to artifact download_url values, not authorization or upload links.","type":"string"},"download_url_expires_at":{ ⟨165 unchanged words⟩
⟨112 unchanged words⟩ :"string"},"download_url":{"description":"Private short-livedArtifact downloadURL.URLsShareare private and short-lived; share them only with theuser.user, verbatim in a code block, not a clickable link. Ask the user to copy the entire URL into their browser address bar. Do not rewrite the URL or add tracking parameters such as utm_source: changes invalidate the signature. If expired, call get_artifact for a fresh URL. This applies only to artifact download_url values, not authorization or upload links.","type":"string"},"download_url_expires_at":{ ⟨165 unchanged words⟩
⟨112 unchanged words⟩ :"string"},"download_url":{"description":"Private short-livedArtifact downloadURL.URLsShareare private and short-lived; share them only with theuser.user, verbatim in a code block, not a clickable link. Ask the user to copy the entire URL into their browser address bar. Do not rewrite the URL or add tracking parameters such as utm_source: changes invalidate the signature. If expired, call get_artifact for a fresh URL. This applies only to artifact download_url values, not authorization or upload links.","type":"string"},"download_url_expires_at":{ ⟨165 unchanged words⟩
⟨27 unchanged words⟩ :"string"},"download_url":{"description":"Private short-livedArtifact downloadURL.URLsShareare private and short-lived; share them only with theuser.user, verbatim in a code block, not a clickable link. Ask the user to copy the entire URL into their browser address bar. Do not rewrite the URL or add tracking parameters such as utm_source: changes invalidate the signature. If expired, call get_artifact for a fresh URL. This applies only to artifact download_url values, not authorization or upload links.","type":"string"},"download_url_expires_at":{ ⟨176 unchanged words⟩
⟨27 unchanged words⟩ :"string"},"download_url":{"description":"Private short-livedArtifact downloadURL.URLsShareare private and short-lived; share them only with theuser.user, verbatim in a code block, not a clickable link. Ask the user to copy the entire URL into their browser address bar. Do not rewrite the URL or add tracking parameters such as utm_source: changes invalidate the signature. If expired, call get_artifact for a fresh URL. This applies only to artifact download_url values, not authorization or upload links.","type":"string"},"download_url_expires_at":{ ⟨176 unchanged words⟩