{"openapi":"3.1.0","info":{"title":"TriathlonPlan API","version":"0.1.0","description":"Week-by-week triathlon training plans (swim/bike/run volume distribution, brick-workout scheduling) using documented periodization principles, plus brick, taper and race-distance reference — all local.\n\nEvery operation is read-only or compute-only. The same tools are available over MCP (streamable HTTP) at https://triathlonplan.connectorbay.com/mcp.","contact":{"name":"Unify Dynamics LLC","email":"hr@unifydynamics.com","url":"https://connectorbay.com/triathlonplan/docs"},"termsOfService":"https://connectorbay.com/triathlonplan/terms"},"servers":[{"url":"https://triathlonplan.connectorbay.com"}],"externalDocs":{"url":"https://connectorbay.com/triathlonplan/docs"},"security":[{},{"bearer":[]}],"components":{"securitySchemes":{"bearer":{"type":"http","scheme":"bearer","description":"Optional. A Pro API key raises rate limits; no credentials are required."}},"schemas":{"Error":{"type":"object","properties":{"ok":{"const":false},"error":{"type":"object"}}}}},"paths":{"/v1/tools/training_plan":{"post":{"operationId":"training_plan","summary":"A week-by-week triathlon training plan: swim/bike/run/brick hours per week using base/build/peak/taper","description":"A week-by-week triathlon training plan: swim/bike/run/brick hours per week using base/build/peak/taper\n    periodization, scaled to race distance and experience. Use for \"16-week sprint plan for a beginner\" or\n    \"build me a 70.3 plan, intermediate, 12 weeks\".","tags":["tools"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"properties":{"race_distance":{"description":"sprint | olympic | 70.3 | full (aliases 'half' and 'ironman' also accepted).","title":"Race Distance","type":"string"},"weeks_available":{"description":"Weeks until race day.","maximum":52,"minimum":6,"title":"Weeks Available","type":"integer"},"experience_level":{"default":"intermediate","description":"beginner | intermediate | advanced","title":"Experience Level","type":"string"},"current_weekly_hours":{"anyOf":[{"exclusiveMinimum":0,"maximum":40,"type":"number"},{"type":"null"}],"default":null,"description":"Your current typical training hours per week, as the plan's starting point. Omit to start from a computed default.","title":"Current Weekly Hours"}},"required":["race_distance","weeks_available"],"title":"training_planArguments","type":"object"}}}},"responses":{"200":{"description":"Tool result. `ok: true` on success; `ok: false` with a structured `error` (provider_unavailable, upstream_error, bad_input) when the tool could not answer.","content":{"application/json":{"schema":{"type":"object","additionalProperties":true}}}},"422":{"description":"Arguments failed validation","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limit exceeded (see Retry-After)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"x-read-only":true}},"/v1/tools/brick_workout_guide":{"post":{"operationId":"brick_workout_guide","summary":"Why bike-to-run brick workouts matter, and example brick structures by training phase. Use for \"why do","description":"Why bike-to-run brick workouts matter, and example brick structures by training phase. Use for \"why do\n    brick workouts matter\" or \"what brick should I do during build phase\".","tags":["tools"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"properties":{"race_distance":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null,"description":"sprint | olympic | 70.3 | full — to also get the peak-phase brick frequency for that distance.","title":"Race Distance"},"phase":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null,"description":"base | build | peak | taper — for one phase's brick guidance only.","title":"Phase"}},"title":"brick_workout_guideArguments","type":"object"}}}},"responses":{"200":{"description":"Tool result. `ok: true` on success; `ok: false` with a structured `error` (provider_unavailable, upstream_error, bad_input) when the tool could not answer.","content":{"application/json":{"schema":{"type":"object","additionalProperties":true}}}},"422":{"description":"Arguments failed validation","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limit exceeded (see Retry-After)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"x-read-only":true}},"/v1/tools/taper_guide":{"post":{"operationId":"taper_guide","summary":"Taper length and weekly volume percentages by race distance, and what to expect during taper. Use for","description":"Taper length and weekly volume percentages by race distance, and what to expect during taper. Use for\n    \"how long should my taper be for a full\".","tags":["tools"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"properties":{"race_distance":{"description":"sprint | olympic | 70.3 | full","title":"Race Distance","type":"string"}},"required":["race_distance"],"title":"taper_guideArguments","type":"object"}}}},"responses":{"200":{"description":"Tool result. `ok: true` on success; `ok: false` with a structured `error` (provider_unavailable, upstream_error, bad_input) when the tool could not answer.","content":{"application/json":{"schema":{"type":"object","additionalProperties":true}}}},"422":{"description":"Arguments failed validation","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limit exceeded (see Retry-After)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"x-read-only":true}},"/v1/tools/race_distances_reference":{"post":{"operationId":"race_distances_reference","summary":"Standard swim/bike/run distances for sprint, olympic, 70.3 and full-distance triathlons. Use for","description":"Standard swim/bike/run distances for sprint, olympic, 70.3 and full-distance triathlons. Use for\n    \"what's the swim/bike/run distance for an Olympic triathlon\".","tags":["tools"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"properties":{},"title":"race_distances_referenceArguments","type":"object"}}}},"responses":{"200":{"description":"Tool result. `ok: true` on success; `ok: false` with a structured `error` (provider_unavailable, upstream_error, bad_input) when the tool could not answer.","content":{"application/json":{"schema":{"type":"object","additionalProperties":true}}}},"422":{"description":"Arguments failed validation","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limit exceeded (see Retry-After)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"x-read-only":true}}}}