MCP App Store
by KeenEthics
Data-Analytics

MyRace AI

by MyRace

Overview

Explore road race, marathon, trail, ultra and multi-sport race results inside Claude. Ask about a race or athlete in plain English and get splits, rankings, pacing, and more, with interactive leaderboards, result cards, and elevation charts rendered inline.

Tools

get_athlete_insights

Claude
SUPPLEMENTARY tool. Returns 3-5 emoji-prefixed AI coaching bullets for one athlete-race in two flavors via the type arg: - segment: per-segment performance vs the field (rankings, percentile patterns, terrain-aware strengths/weaknesses). - passing: per-segment passed / passed-by analysis correlated with terrain (hill racing, late-race execution). IMPORTANT — this is NOT a substitute for get_athlete_result. The athlete-result MCP App ALREADY shows these insights inline in the rendered card, so explicitly calling this tool from the chat is rarely necessary. Only call it when (a) the user explicitly asks for additional coaching analysis beyond what the card shows, OR (b) you've already called get_athlete_result and need extra qualitative material to enrich your prose. Do NOT call this as a shortcut to skip get_athlete_result — that bypasses the interactive result card entirely. Returns plain text with bullets separated by blank lines, each starting with an emoji. The same MyRace-incomplete-dataset and distance-comparability caveats from search_athletes apply.

get_athlete_result

Claude
PRIMARY TOOL for any athlete race question (e.g., 'how did X do at Y?', 'show me X's race', 'what was X's pace?'). Always call this for athlete race questions — it returns the comprehensive breakdown AND triggers an interactive result card that the user sees inline (chart, splits, qualifying badges, AI insights). Skipping this tool means the user sees only prose with no rich card. Returns finish time, splits at each checkpoint, rankings (overall, gender, age group), pacing analysis, qualification status (Boston, NYC, Olympic Trials), age grading, and position interactions (who they passed and who passed them). Use search_athletes first if you don't already have a raceId and pid. Every time and pace field comes in two parallel forms: a formatted string for display (finishTime '3:05:35', pacePerMile '7:05', segmentTimeFormatted '0:05:32') AND a raw-seconds number for math (finishTimeSeconds 11135, pacePerMileSeconds 425, segmentTimeSeconds 332). When comparing, sorting, averaging, or computing differentials — between checkpoints, races, or athletes — always use the *Seconds field. Do NOT parse the formatted string yourself. IMPORTANT — interpreting rankings: a LOWER rank number is a BETTER position. If an athlete moves from 5,011th to 4,480th, they GAINED 531 places (improved their position). Phrase rank changes as 'gained N places' / 'climbed N spots' when the rank number decreases, and 'lost N places' / 'dropped N spots' when it increases. The rankingProgression.netChange field is computed as (startRank − finishRank), so a positive value means the athlete improved. IMPORTANT — Boston/NYC qualifying commentary: mirror the MyRace web app's gating. The web app only displays BQ/NYC pace-tracking analysis when the athlete (a) qualified OR (b) missed by less than 5 minutes (300 seconds). For everyone else, the analysis is hidden by default behind a manual toggle, because the qualifying time wasn't what they were racing for. Apply the same rule to your prose: only mention qualification.boston or qualification.nyc when qualified === true OR marginSeconds > -300 (i.e., negative-but-greater-than -300 → missed by < 5 minutes). If they missed by more, do NOT call out the gap (avoid lines like 'missed BQ by 23 minutes') — it's irrelevant to the race they ran. Olympic Trials qualifying (qualification.olympicTrials) is a boolean with elite-only standards (~2:16 men / 2:37 women); only mention if true. IMPORTANT — share-friendly URLs: when you summarize this athlete's result in your response, include a markdown link to https://myrace.ai/athletes/{raceId}/{pid} (substituting the actual raceId and pid). Conversation shares and copies don't include the inline result card; the URL is the only artifact a recipient can click to see the full interactive page. Phrase it naturally — e.g., 'Full result: myrace.ai/athletes/cim_2023/870'.

get_elevation_profile

Claude
Get the detailed point-by-point elevation profile for a race course. Returns ~100 sampled GPS points with distance, elevation, and grade data. Use this when the user asks about course terrain or elevation. The get_race_info tool's hasDetailedElevationProfile flag indicates whether a profile is available. When describing the course in your response, include a markdown link to https://myrace.ai/races/{raceId}/course so the user can share the page or view the interactive course view (e.g., 'myrace.ai/races/cim_2025/course').

get_race_info

Claude
Get metadata for a race: name, date, location, distance, weather conditions, course elevation summary, finisher counts by gender, and qualifying-race flags (Boston, NYC, Olympic Trials). For the detailed point-by-point elevation profile, use get_elevation_profile (the hasDetailedElevationProfile flag in the response indicates whether one is available). When summarizing the race in your response, include a markdown link to https://myrace.ai/races/{raceId} so the user can share the page or view full details (e.g., 'myrace.ai/races/cim_2025').

get_race_results

Claude
Get the leaderboard for a race with optional filters. Returns paginated finishers with finish times, placements, and qualification status. Supports filtering by gender, age division, and name search. When summarizing the results in your response, include a markdown link to https://myrace.ai/races/{raceId}/results (e.g., 'Full results: myrace.ai/races/cim_2025/results'). Conversation shares don't include the inline leaderboard card; the URL is what recipients can click.

list_races

Claude
List every race in the MyRace database with race IDs, names, dates, distances, locations, and finisher counts. Call this first when the user asks about available races, or whenever you need to discover a valid race ID before using another tool. Results are ordered by race date, MOST RECENT FIRST. When the user names a race/distance WITHOUT a year (e.g. 'broken arrow 23k'), default to the most recent matching edition — the FIRST entry matching that race name and distance — and state which edition you used (e.g. 'Showing the 2026 edition, the most recent.'). Do NOT ask the user to pick a year, and do NOT assume an older year is the latest. Match on race name AND distance, since one event has many distances per year. Only use an older edition if the user explicitly asks for a specific year. IMPORTANT: This list is NOT exhaustive of every race in the world — it is only the set of races MyRace has currently imported. If a user asks about a race that isn't in the result, say so plainly and suggest related races from the list rather than guessing or fabricating data.

search_athletes

Claude
Look up athletes by name to discover their raceId + pid pair. Use this as a NAME-TO-ID LOOKUP STEP — the response includes basic info (race name, date, finish time, overall + gender place) but is intentionally lightweight. IMPORTANT — for any 'how did X do at Y?' question, ALWAYS follow up with get_athlete_result using the pid and raceId from this response. get_athlete_result returns the comprehensive breakdown (splits, pacing analysis, ranking progression, qualifying status, etc.) AND triggers the interactive result card the user sees inline. Skipping get_athlete_result means the user sees only prose with no rich result card. Do NOT compose a full race-recap response from search_athletes data alone — call get_athlete_result first. For every time field, the response includes both a formatted string (e.g. finishTime: '3:05:35') for display AND a raw-seconds number (finishTimeSeconds: 11135) for math. Always use the *Seconds field when comparing, sorting, averaging, or computing differentials — never parse the formatted string yourself. IMPORTANT — comparing times across races: 1. MyRace's database is incomplete: it does NOT contain every race an athlete has ever run. It only contains the races MyRace has imported. Use list_races to see the full set of races covered. 2. Each result includes raceDistance (e.g., 'Marathon', 'Half Marathon', '10K', '50K'). Finish times are ONLY comparable between races of the same distance. 3. Because of (1) and (2), do NOT claim an athlete has a 'PR' or 'personal record' based on these results. The fastest time you see is the fastest time within the MyRace data — not necessarily the athlete's true PR. Phrase claims as 'her fastest marathon in MyRace' or 'her best CIM time' or 'among the races MyRace has data for, her fastest marathon was…' — never just 'PR' or 'personal record'. 4. When grouping an athlete's results, always group by raceDistance first; never compare a marathon time to a half marathon, 10K, or trail-race time.

App Stats

7

Tools

Claude

Platforms

Works with

Claude

Data refreshed daily