xctf-data — скилл для Claude Code: данные NCAA по кроссу и лёгкой
Тянет профили атлетов NCAA из TFRRS: личные рекорды, год допуска, школа и результаты по сезонам. Плюс новости The Stride Report.
npx skills add machina-sports/sports-skills --skill xctf-data -a claude-codeЧто делает xctf-data
Скилл закрывает запросы про студенческий кросс и лёгкую атлетику в США. Он берёт данные со страниц TFRRS и ленты The Stride Report, ключи API не нужны. Внутри пять команд: search_athlete ищет атлета в текущем составе команды, get_athlete_profile отдаёт имя, школу, допуск, все личные рекорды и результаты по каждому сезону, get_team_roster — состав команды по кроссу или лёгкой атлетике, get_meet_results — протоколы забегов и командные очки, get_news — свежие статьи.
Для get_athlete_profile нужны три параметра, и все три должны совпадать с URL атлета на tfrrs.org: числовой athlete_id, слаг школы с подчёркиваниями вместо пробелов и слаг имени. Угадывать слаги не стоит — откройте страницу атлета и скопируйте адрес. Вот на этом чаще всего и спотыкаются: неверный регистр или пробел вместо подчёркивания, и профиль не найдётся.
Есть нюанс с выпускниками. search_athlete ищет только по текущим составам, поэтому для закончившего карьеру атлета совпадений не будет — понадобится прямая ссылка с tfrrs.org. Ещё TFRRS заводит отдельные профили для кросса и для лёгкой атлетики, так что для полной картины рекордов иногда нужно тянуть оба ID. Для кроссовых забегов в get_meet_results передавайте sport="xc": у кросса свой диапазон идентификаторов, и без этого флага вернётся чужой легкоатлетический протокол. Нужен Python 3.10+ и доступ в интернет.
Какие задачи решает
- посмотреть личные рекорды атлета по всем дистанциям
- собрать результаты кроссового сезона по датам и местам
- выгрузить текущий состав команды по кроссу или лёгкой атлетике
- получить протоколы и командные очки с конкретного турнира
- найти свежие новости студенческой лёгкой атлетики
Примеры запросов агенту
- Какие личные рекорды у Jane Hedengren?
- Покажи результаты Jane Hedengren в кроссе за 2025 год
- Выведи состав женской команды UC Davis по кроссу
Как установить xctf-data
1Через Skills CLI (Vercel)
npx skills add machina-sports/sports-skills --skill xctf-data -a claude-code2Вручную: положить файлы
~/.claude/skills/xctf-data/SKILL.mdПапка скилла целиком; для одного проекта — .claude/skills/xctf-data/
1Через Skills CLI (Vercel)
npx skills add machina-sports/sports-skills --skill xctf-data -a codex2Вручную: положить файлы
.agents/skills/xctf-data/SKILL.mdДля всех проектов — ~/.agents/skills/
1Через Skills CLI (Vercel)
npx skills add machina-sports/sports-skills --skill xctf-data -a cursor2Вручную: положить файлы
.cursor/skills/xctf-data/SKILL.mdCursor читает и .agents/skills/, и .claude/skills/
1GitHub CLI
gh skill install machina-sports/sports-skills xctf-data2Вручную: положить файлы
.github/skills/xctf-data/SKILL.md1Через Skills CLI (Vercel)
npx skills add machina-sports/sports-skills --skill xctf-data -a gemini-cli2Командой платформы
gemini skills install https://github.com/machina-sports/sports-skills --path skills/xctf-dataВручную: положить файлы
.devin/skills/xctf-data/SKILL.mdСтарый путь .windsurf/skills/ тоже читается
Через Skills CLI (Vercel)
npx skills add machina-sports/sports-skills --skill xctf-data -a opencodeClaude.ai
Упакуйте папку в zip и загрузите в Settings → Capabilities → Skills
По шагам, с командами для каждой платформы: Как установить скилл в Claude Code: пять способов
Вопросы о xctf-data
Как установить xctf-data в Claude?
Выполните npx skills add machina-sports/sports-skills --skill xctf-data -a claude-code. Скилл встанет в ~/.claude/skills/xctf-data/SKILL.md.
Что делает xctf-data?
Достаёт профили атлетов NCAA из TFRRS: личные рекорды, год допуска, школу и результаты по сезонам. Отдельной командой отдаёт новости The Stride Report.
Почему не находится атлет, который уже выпустился?
search_athlete ищет только по текущим составам команд. Для выпускника или переведённого атлета нужна прямая ссылка на его страницу в TFRRS, из которой берутся athlete_id, школа и имя.
Исходный текст
SKILL.md · MIT
---
name: xctf-data
description: |
NCAA 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: user asks about NCAA cross country, NCAA track and field, college running, TFRRS athlete profiles, personal records, PRs, XC or TF season results, individual athlete performance history, or XC/TF news.
Don't use when: user asks about professional track, Diamond League, or other sports — use nfl-data, nba-data, wnba-data, nhl-data, mlb-data, golf-data, cricket-data, cfb-data, cbb-data, tennis-data, fastf1, or volleyball-data. For betting use polymarket or kalshi.
license: MIT
compatibility: Requires Python 3.10+ and internet access to tfrrs.org and thestridereport.com. No API keys required.
metadata:
author: machina-sports
version: "0.1.0"
---
# XC/TF Data (TFRRS — NCAA Cross Country & Track and Field)
Before writing queries, consult `references/api-reference.md` for parameters, URL conventions, and return shapes.
## Setup
Before first use, check if the CLI is available:
```bash
which sports-skills || pip install sports-skills
```
If `pip install` fails, install from GitHub:
```bash
pip install git+https://github.com/machina-sports/sports-skills.git
```
Requires Python 3.10+. No API keys required. All data comes from TFRRS public pages and The Stride Report RSS feed.
## Quick Start
CLI (preferred):
```bash
sports-skills xctf get_athlete_profile --athlete_id=9230145 --school=BYU --name=Jane_Hedengren
sports-skills xctf get_news --limit=5
```
Python SDK:
```python
from sports_skills import xctf
profile = xctf.get_athlete_profile(
athlete_id="9230145",
school="BYU",
name="Jane_Hedengren",
)
```
## CRITICAL: Before Any Query
All three parameters are required and must match the athlete's TFRRS URL exactly:
```
https://www.tfrrs.org/athletes/{athlete_id}/{school}/{name}.html
```
- `athlete_id` — numeric ID (e.g. `9230145`)
- `school` — school slug with underscores, not spaces (e.g. `BYU`)
- `name` — athlete name slug (e.g. `Jane_Hedengren`)
Do NOT guess slugs. Find them by navigating to the athlete on tfrrs.org and copying the URL.
## Commands
| Command | Description |
|---|---|
| `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 |
| `get_athlete_profile` | Athlete name, school, eligibility, all PRs, and full season-by-season meet results |
| `get_team_roster` | Full XC and/or TF roster for a team |
| `get_meet_results` | All event results and team scores from a TFRRS meet |
| `get_news` | Recent XC/TF articles from The Stride Report (thestridereport.com) |
See `references/api-reference.md` for full parameter details and return shapes.
## Examples
Example 1: Look up a current athlete's PRs
User says: "What are Jane Hedengren's PRs?"
Actions:
1. Call `search_athlete(name="Jane Hedengren", school="UT_college_f_BYU")`
Result: `data.matches` contains entries with `athlete_id`, `school`, `name` slugs
2. Call `get_athlete_profile(athlete_id="9230145", school="BYU", name="Jane_Hedengren")`
Result: `data.prs` contains all personal records by event (e.g. `{"1500": "4:10.24", "5000": "14:44.79", "6K (XC)": "18:29.6", ...}`)
Example 2: Get a runner's cross country season
User says: "Show me Jane Hedengren's 2025 XC season results"
Actions:
1. Call `search_athlete(name="Jane Hedengren", school="UT_college_f_BYU")`
2. Call `get_athlete_profile` with the matched athlete params
3. Filter `data.meets` for entries whose `date` falls in the fall of 2025 (Sep–Nov 2025)
Result: List of meets with dates, events, marks, and places
Example 3: Graduated or transferred athlete
User says: "What are Katelyn Vuong's PRs from UC Davis?"
Actions:
1. Call `search_athlete(name="Katelyn Vuong", school="CA_college_f_UC_Davis")`
Result: `data.matches` is empty — athlete has graduated
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."
3. User provides: `https://www.tfrrs.org/athletes/7899206/UC_Davis/Katelyn_Vuong.html`
4. Extract params from the URL and call `get_athlete_profile(athlete_id="7899206", school="UC_Davis", name="Katelyn_Vuong")`
Note: TFRRS creates separate profiles for XC and TF. If both exist, fetch both IDs for complete PRs.
Example 4: Get a team's current roster
User says: "Show me the UC Davis women's XC roster"
Actions:
1. Call `get_team_roster(school="CA_college_f_UC_Davis", sport="xc")`
Result: List of athletes with name, year, and profile slugs
Example 5: Get results from a meet
User says: "Show me the results from the Stanford Invitational"
Actions:
1. Find the meet on tfrrs.org and copy the meet_id and slug from the URL (e.g. tfrrs.org/results/95890/Stanford_Invitational)
2. Call `get_meet_results(meet_id="95890", slug="Stanford_Invitational")`
Result: All event results and team scores from the meet. Each result has `place`, `name`, `year`, `team`, `marks` (the recorded mark, e.g. `["9.72"]`, or `["DNF"]`) and `score` (team points, `null` at unscored meets); `wind`, `conversion` (imperial mark) and relay `athletes` appear when the event has them.
For a cross-country meet (URL like tfrrs.org/results/xc/28714/Gans_Creek_Classic) pass `sport="xc"`: `get_meet_results(meet_id="28714", slug="Gans_Creek_Classic", sport="xc")`. XC `team_scores` are keyed by race name. XC ids use a separate range, so an XC id without `sport="xc"` returns an unrelated track meet (flagged in `warnings`).
Example 6: Get the latest XC/TF news
User says: "What's the latest college track news?"
Actions:
1. Call `get_news(limit=10)`
Result: Recent articles from The Stride Report with title, date, summary, and link
## Commands that DO NOT exist — never call these
- ~~`get_team_rankings`~~ — does not exist. Use `get_athlete_profile` for individual data.
- ~~`search_athletes`~~ — does not exist. The correct command is `search_athlete` (no trailing 's').
- ~~`fetch_news`~~ — does not exist. The correct command is `get_news`.
If a command is not listed in the Commands table above, it does not exist.
## Error Handling
When a command fails, **do not surface raw errors to the user**. Instead:
1. For `get_athlete_profile`: confirm `athlete_id`, `school`, and `name` match the TFRRS URL exactly (case-sensitive)
2. For `search_athlete`: verify the team slug is correct by checking the team's TFRRS page URL
3. For `get_meet_results`: verify the `meet_id` and `slug` match the meet's TFRRS URL exactly
4. For `get_team_roster`: verify the school slug is correct
5. For `get_news`: if the feed fails, inform the user that The Stride Report may be temporarily unavailable
6. Report failure with a clean message only after exhausting alternatives
## Troubleshooting
**`sports-skills` command not found**
Run `pip install sports-skills` or install from GitHub (see Setup above).
**HTTP 404 on athlete profile**
The `school` or `name` slug does not match the TFRRS URL exactly. Slugs are case-sensitive and use underscores. Copy directly from tfrrs.org.
**`prs` returns empty dict**
The athlete's profile page may be very new or structured differently. Check the URL directly on tfrrs.org.
**`search_athlete` returns empty matches**
The athlete is likely graduated or transferred. See Example 3 above for how to handle this.
**`get_meet_results` returns no events**
The `meet_id` or `slug` may be incorrect. Copy both directly from the meet's TFRRS URL. If the URL contains `/results/xc/`, pass `sport="xc"`.
**`get_news` fails or returns no articles**
The Stride Report RSS feed may be temporarily unavailable. Try again later.
**Connection errors or timeouts**
TFRRS may be temporarily unavailable. Requests are throttled to 1 per second automatically — wait a moment and retry.
© machina-sports · MIT · machina-sports/sports-skills