$npx -y skills add machina-sports/sports-skills --skill xctf-dataNCAA cross country and track & field athlete data via TFRRS (tfrrs.org) and news via The Stride Report. Fetch athlete profiles including all personal records (PRs), eligibility year, school, full season-by-season results history, and XC/TF news. Zero config, no API keys. Use when
| 1 | # XC/TF Data (TFRRS — NCAA Cross Country & Track and Field) |
| 2 | |
| 3 | Before writing queries, consult `references/api-reference.md` for parameters, URL conventions, and return shapes. |
| 4 | |
| 5 | ## Setup |
| 6 | |
| 7 | Before first use, check if the CLI is available: |
| 8 | ```bash |
| 9 | which sports-skills || pip install sports-skills |
| 10 | ``` |
| 11 | If `pip install` fails, install from GitHub: |
| 12 | ```bash |
| 13 | pip install git+https://github.com/machina-sports/sports-skills.git |
| 14 | ``` |
| 15 | Requires Python 3.10+. No API keys required. All data comes from TFRRS public pages and The Stride Report RSS feed. |
| 16 | |
| 17 | ## Quick Start |
| 18 | |
| 19 | CLI (preferred): |
| 20 | ```bash |
| 21 | sports-skills xctf get_athlete_profile --athlete_id=9230145 --school=BYU --name=Jane_Hedengren |
| 22 | sports-skills xctf get_news --limit=5 |
| 23 | ``` |
| 24 | |
| 25 | Python SDK: |
| 26 | ```python |
| 27 | from sports_skills import xctf |
| 28 | |
| 29 | profile = xctf.get_athlete_profile( |
| 30 | athlete_id="9230145", |
| 31 | school="BYU", |
| 32 | name="Jane_Hedengren", |
| 33 | ) |
| 34 | ``` |
| 35 | |
| 36 | ## CRITICAL: Before Any Query |
| 37 | |
| 38 | All three parameters are required and must match the athlete's TFRRS URL exactly: |
| 39 | |
| 40 | ``` |
| 41 | https://www.tfrrs.org/athletes/{athlete_id}/{school}/{name}.html |
| 42 | ``` |
| 43 | |
| 44 | - `athlete_id` — numeric ID (e.g. `9230145`) |
| 45 | - `school` — school slug with underscores, not spaces (e.g. `BYU`) |
| 46 | - `name` — athlete name slug (e.g. `Jane_Hedengren`) |
| 47 | |
| 48 | Do NOT guess slugs. Find them by navigating to the athlete on tfrrs.org and copying the URL. |
| 49 | |
| 50 | ## Commands |
| 51 | |
| 52 | | Command | Description | |
| 53 | |---|---| |
| 54 | | `search_athlete` | Search the current team roster by name; returns `athlete_id`, `school`, and `name` slugs for use with `get_athlete_profile`. Searches both genders automatically. Current athletes only — graduated athletes require a direct TFRRS URL | |
| 55 | | `get_athlete_profile` | Athlete name, school, eligibility, all PRs, and full season-by-season meet results | |
| 56 | | `get_team_roster` | Full XC and/or TF roster for a team | |
| 57 | | `get_meet_results` | All event results and team scores from a TFRRS meet | |
| 58 | | `get_news` | Recent XC/TF articles from The Stride Report (thestridereport.com) | |
| 59 | |
| 60 | See `references/api-reference.md` for full parameter details and return shapes. |
| 61 | |
| 62 | ## Examples |
| 63 | |
| 64 | Example 1: Look up a current athlete's PRs |
| 65 | User says: "What are Jane Hedengren's PRs?" |
| 66 | Actions: |
| 67 | 1. Call `search_athlete(name="Jane Hedengren", school="UT_college_f_BYU")` |
| 68 | Result: `data.matches` contains entries with `athlete_id`, `school`, `name` slugs |
| 69 | 2. Call `get_athlete_profile(athlete_id="9230145", school="BYU", name="Jane_Hedengren")` |
| 70 | Result: `data.prs` contains all personal records by event (e.g. `{"1500": "4:10.24", "5000": "14:44.79", "6K (XC)": "18:29.6", ...}`) |
| 71 | |
| 72 | Example 2: Get a runner's cross country season |
| 73 | User says: "Show me Jane Hedengren's 2025 XC season results" |
| 74 | Actions: |
| 75 | 1. Call `search_athlete(name="Jane Hedengren", school="UT_college_f_BYU")` |
| 76 | 2. Call `get_athlete_profile` with the matched athlete params |
| 77 | 3. Filter `data.meets` for entries whose `date` falls in the fall of 2025 (Sep–Nov 2025) |
| 78 | Result: List of meets with dates, events, marks, and places |
| 79 | |
| 80 | Example 3: Graduated or transferred athlete |
| 81 | User says: "What are Katelyn Vuong's PRs from UC Davis?" |
| 82 | Actions: |
| 83 | 1. Call `search_athlete(name="Katelyn Vuong", school="CA_college_f_UC_Davis")` |
| 84 | Result: `data.matches` is empty — athlete has graduated |
| 85 | 2. Tell the user: "Katelyn Vuong is not on UC Davis's current roster. Please find her profile URL on tfrrs.org (e.g. search 'Katelyn Vuong UC Davis tfrrs') and share it." |
| 86 | 3. User provides: `https://www.tfrrs.org/athletes/7899206/UC_Davis/Katelyn_Vuong.html` |
| 87 | 4. Extract params from the URL and call `get_athlete_profile(athlete_id="7899206", school="UC_Davis", name="Katelyn_Vuong")` |
| 88 | Note: TFRRS creates separate profiles for XC and TF. If both exist, fetch both IDs for complete PRs. |
| 89 | |
| 90 | Example 4: Get a team's current roster |
| 91 | User says: "Show me the UC Davis women's XC roster" |
| 92 | Actions: |
| 93 | 1. Call `get_team_roster(school="CA_college_f_UC_Davis", sport="xc")` |
| 94 | Result: List of athletes with name, year, and profile slugs |
| 95 | |
| 96 | Example 5: Get results from a meet |
| 97 | User says: "Show me the results from the Stanford Invitational" |
| 98 | Actions: |