add_to_my_picks
ChatGPTSave a horse to the user's personal My Picks tracker so its result and ROI are tracked over time. Provide the Sportily raceId and horseId (from search_races / get_race_card / discover_* tools). The pick is auto-tagged with the source (claude or chatgpt) so the user can filter by who suggested it. Idempotent — saving the same runner twice will not duplicate it. Use only when the user explicitly asks to save, track, or add a pick.
add_to_my_picks
ChatGPTSave a horse to the user's personal My Picks tracker so its result and ROI are tracked over time. Provide the Sportily raceId and horseId (from search_races / get_race_card / discover_* tools). The pick is auto-tagged with the source (claude or chatgpt) so the user can filter by who suggested it. Idempotent — saving the same runner twice will not duplicate it. Use only when the user explicitly asks to save, track, or add a pick.
analyze_my_picks
ChatGPTAnalyse the user's My Picks track record: overall strike rate, stake-weighted ROI, beat-SP (closing-line value), max drawdown and win/lose streaks, plus a performance breakdown grouped by a chosen dimension (going, course, country, distance, class, type, or tag) and plain-language best/weakest insights. Use when the user wants to understand patterns in their picks — e.g. 'how do my picks do on soft going' or 'where am I losing money'.
analyze_my_picks
ChatGPTAnalyse the user's My Picks track record: overall strike rate, stake-weighted ROI, beat-SP (closing-line value), max drawdown and win/lose streaks, plus a performance breakdown grouped by a chosen dimension (going, course, country, distance, class, type, or tag) and plain-language best/weakest insights. Use when the user wants to understand patterns in their picks — e.g. 'how do my picks do on soft going' or 'where am I losing money'.
backtest_race_lens
ChatGPTBacktest one of the authenticated user's saved Race Lens filters, or a draft filterAst, over historical completed races. Race Lens model predicates use the base price-agnostic race model, not SmartPicks or Value Finder tipster percentages. Capped at 60 days for MCP (see the returned days / maxBacktestDays). Note: get_saved_lenses_summary reports metrics over each lens's own original lookback (which can be longer than 60 days), so its numbers will not exactly match this tool's — compare lenses using results computed by this tool over the same days. Returns performance, sample selections, and concrete filterAst improvement ideas to try next.
backtest_race_lens
ChatGPTBacktest one of the authenticated user's saved Race Lens filters, or a draft filterAst, over historical completed races. Race Lens model predicates use the base price-agnostic race model, not SmartPicks or Value Finder tipster percentages. Capped at 60 days for MCP (see the returned days / maxBacktestDays). Note: get_saved_lenses_summary reports metrics over each lens's own original lookback (which can be longer than 60 days), so its numbers will not exactly match this tool's — compare lenses using results computed by this tool over the same days. Returns performance, sample selections, and concrete filterAst improvement ideas to try next.
compare_runners
ChatGPTUse for horse-vs-horse comparison in a Sportily race. Returns focused evidence for selected runners; treat model percentages as directional analytics signals, not absolute truth.
compare_runners
ChatGPTUse for horse-vs-horse comparison in a Sportily race. Returns focused evidence for selected runners; treat model percentages as directional analytics signals, not absolute truth.
discover_racing_picks
ChatGPTUse by default when a user asks for horse-racing picks, good horses, value, SmartPicks, Value Finder, or Sportily analytics candidates. For a specific request, drill into that pick immediately. For a broad scan, score the candidates first and analyse the top 2-3 races in parallel. The goal is to test whether model% is realistic, not just restate it. Only return a bare list if the user explicitly asks for a list.
discover_racing_picks
ChatGPTUse when a user asks for broad horse-racing picks, good horses, value, SmartPicks, Value Finder, or Sportily analytics candidates. This is a candidate-discovery step, not a final verdict. Call once per date/source/filter set in a user turn; for broad scans, score candidates and analyse at most the top 3 raceIds. Only return a bare list if the user explicitly asks for a list.
find_horses
ChatGPTUse by default when a horse-racing user names a horse, asks about a runner, or needs Sportily runner matching. Finds runners by partial horse name, or lists runners for a date so the MCP client can match a horse.
find_horses
ChatGPTUse when a horse-racing user names a horse and the Sportily horseId/raceId is not yet known. Finds runners by partial horse name, or lists runners for a date so the MCP client can match a horse. Once the runner is resolved, do not repeat this lookup for the same horse in the same user turn.
find_races
ChatGPTUse by default when a user asks what horse races are on, asks for a course without a race id, or needs Sportily race ids. Lists racecourses and race ids for a date.
find_races
ChatGPTDefault tool for "what races are on?" — lists a full day's racecourses and race ids grouped by course, with today/tomorrow selection and an upcomingOnly filter. Use search_races instead when the user already named a specific course/date and you only need a quick flat list of matching race ids.
get_external_race_context
ChatGPTFetch validated industry context for a Sportily race. Call automatically after get_race_card when externalResearchTargets are available. Returns status and extracted facts — fold insights into analysis without naming the source.
get_external_race_context
ChatGPTFetch validated industry context for a Sportily race. Use at most once after get_race_card when externalResearchTargets are available and the user wants a full/deep verdict or outside context would materially help. Returns status and extracted facts — fold checked, matched facts into analysis without naming the source.
get_horse_profile
ChatGPTUse after finding a Sportily horse id when a horse-racing user asks for an opinion, profile, form view, or analysis of a named horse. Fetches career stats, upcoming races, and recent runs; open the race card before a race verdict.
get_horse_profile
ChatGPTUse after finding a Sportily horse id when a horse-racing user asks for an opinion, profile, form view, or analysis of a named horse. Fetches career stats, upcoming races, and recent runs; open the race card before a race verdict.
get_race_card
ChatGPTUse by default when the user asks to analyse a horse race, Sportily race, runner, racecard, or named horse in a specific race. Fetches a pre-race analytics payload with race, runner, model, market price, stats, past-performance, response-shape, and external-research guidance. Target-race result fields are intentionally omitted so historical analysis can be run blind.
get_race_card
ChatGPTUse when a raceId is known and the user asks to analyse a horse race, Sportily race, runner, racecard, or named horse in a specific race. Fetches the primary pre-race analytics payload with race, runner, model, market price, stats, past-performance, response-shape, and external-research guidance. Call once per raceId in a user turn unless the previous call failed. Target-race result fields are intentionally omitted so historical analysis can be run blind.
get_race_results
ChatGPTUse when the user asks who won, what happened, or wants explicit result data for a Sportily race. This is the post-race companion to get_race_card and exposes outcome fields intentionally hidden from the analysis payload.
get_race_results
ChatGPTUse when the user asks who won, what happened, or wants explicit result data for a Sportily race. This is the post-race companion to get_race_card and exposes outcome fields intentionally hidden from the analysis payload.
get_saved_lenses_summary
ChatGPTList the authenticated user's saved Sportily Race Lens filters with compact backtest metrics and lens ids. Step 1 of the lens flow: use this before get_upcoming_lens_matches (to run lenses on upcoming races) or backtest_race_lens (to re-test over history) when the user wants to choose a specific saved lens, system, filter, or angle. Each lens's backtest metrics use its own stored lookback (backtest.days), which may exceed the 60-day MCP backtest cap.
get_saved_lenses_summary
ChatGPTList the authenticated user's saved Sportily Race Lens filters with compact backtest metrics and lens ids. Step 1 of the lens flow: use this before get_upcoming_lens_matches (to run lenses on upcoming races) or backtest_race_lens (to re-test over history) when the user wants to choose a specific saved lens, system, filter, or angle. Each lens's backtest metrics use its own stored lookback (backtest.days), which may exceed the 60-day MCP backtest cap.
get_upcoming_lens_matches
ChatGPTRun the authenticated user's saved Sportily Race Lens filters against upcoming races in the next 24 hours. Use when the user asks for their Race Lens results, saved-lens matches, custom systems, filters, angles, or upcoming runners found by their lenses. Race Lens model fields use the base price-agnostic race model and can differ from SmartPicks or Value Finder tipster percentages. User-specific: only the connected user's saved lenses are considered. Step 2 of the lens flow — call get_saved_lenses_summary first if you need lens ids or want the user to choose specific lenses.
get_upcoming_lens_matches
ChatGPTRun the authenticated user's saved Sportily Race Lens filters against upcoming races in the next 24 hours. Use when the user asks for their Race Lens results, saved-lens matches, custom systems, filters, angles, or upcoming runners found by their lenses. Race Lens model fields use the base price-agnostic race model and can differ from SmartPicks or Value Finder tipster percentages. User-specific: only the connected user's saved lenses are considered. Step 2 of the lens flow — call get_saved_lenses_summary first if you need lens ids or want the user to choose specific lenses.
list_my_picks
ChatGPTReturn the user's saved My Picks with live result and stake-weighted ROI for each, plus headline performance (strike rate, ROI points, beat-SP rate, drawdown, streaks). Use when the user asks what they have saved, how their picks are doing, or for their track record.
list_my_picks
ChatGPTReturn the user's saved My Picks with live result and stake-weighted ROI for each, plus headline performance (strike rate, ROI points, beat-SP rate, drawdown, streaks). Use when the user asks what they have saved, how their picks are doing, or for their track record.
list_race_lens_filters
ChatGPTList the available Sportily Race Lens filter fields, operators, value types, and example predicates, plus the filterAst shape and rules. Use this when helping a user build or edit a lens. Model fields in this catalog use the base price-agnostic race model, not SmartPicks or Value Finder tipster percentages. Build flow: call this for the catalog, then backtest_race_lens with a draft filterAst to test the idea over history before saving. Note: a filterAst is a flat list of AND-ed predicates — there is no nested OR.
list_race_lens_filters
ChatGPTList the available Sportily Race Lens filter fields, operators, value types, and example predicates, plus the filterAst shape and rules. Use this when helping a user build or edit a lens. Model fields in this catalog use the base price-agnostic race model, not SmartPicks or Value Finder tipster percentages. Build flow: call this for the catalog, then backtest_race_lens with a draft filterAst to test the idea over history before saving. Note: a filterAst is a flat list of AND-ed predicates — there is no nested OR.
remove_from_my_picks
ChatGPTRemove a previously saved horse from the user's My Picks tracker, identified by raceId and horseId. Use only when the user explicitly asks to remove or delete a saved pick.
remove_from_my_picks
ChatGPTRemove a previously saved horse from the user's My Picks tracker, identified by raceId and horseId. Use only when the user explicitly asks to remove or delete a saved pick.
search_races
ChatGPTUse by default for horse-racing race lookup requests, including races, racecards, runners at a course, or requests that say "on Sportily". Finds Sportily race cards by date, course, and region.
search_races
ChatGPTQuick, flat race lookup when the user already names a course and/or date and you just need the matching Sportily race ids (returns up to 25 races, ordered by off time). For browsing a whole day's card grouped by course, or to filter to upcoming-only / today / tomorrow, use find_races instead.