$npx -y skills add machina-sports/sports-skills --skill tennis-dataATP and WTA tennis data via ESPN public endpoints — tournament scores, season calendars, player rankings, player profiles, and news. Zero config, no API keys. Use when: user asks about tennis scores, match results, tournament draws, ATP/WTA rankings, tennis player info, or tennis
| 1 | # Tennis Data (ATP + WTA) |
| 2 | |
| 3 | Before writing queries, consult `references/api-reference.md` for endpoints, ID conventions, and data shapes. |
| 4 | |
| 5 | ## Quick Start |
| 6 | |
| 7 | Prefer the CLI — it avoids Python import path issues: |
| 8 | ```bash |
| 9 | sports-skills tennis get_scoreboard --tour=atp |
| 10 | sports-skills tennis get_rankings --tour=wta |
| 11 | sports-skills tennis get_calendar --tour=atp --year=2026 |
| 12 | ``` |
| 13 | |
| 14 | ## CRITICAL: Before Any Query |
| 15 | |
| 16 | CRITICAL: Before calling any data endpoint, verify: |
| 17 | - The `tour` parameter is specified (`atp` or `wta`) — there is no default. |
| 18 | - Year is derived from the system prompt's `currentDate` — never hardcoded. |
| 19 | |
| 20 | ## The `tour` Parameter |
| 21 | |
| 22 | Most commands require `--tour=atp` or `--tour=wta`: |
| 23 | - **ATP**: Men's professional tennis tour |
| 24 | - **WTA**: Women's professional tennis tour |
| 25 | |
| 26 | If the user doesn't specify, ask which tour or show both by calling the command twice. |
| 27 | |
| 28 | ## Commands |
| 29 | |
| 30 | | Command | Description | |
| 31 | |---|---| |
| 32 | | `get_scoreboard` | Live/recent tournament scores for a tour | |
| 33 | | `get_rankings` | ATP or WTA player rankings | |
| 34 | | `get_calendar` | Full season tournament calendar | |
| 35 | | `get_player_info` | Individual tennis player profile | |
| 36 | |
| 37 | See `references/api-reference.md` for full parameter lists and return shapes. |
| 38 | |
| 39 | ## Workflows |
| 40 | |
| 41 | ### Live Tournament Check |
| 42 | 1. `get_scoreboard --tour=<atp|wta>` |
| 43 | 2. Present current matches by round. |
| 44 | 3. For player info, use `get_player_info --player_id=<id>`. |
| 45 | |
| 46 | ### Rankings Lookup |
| 47 | 1. `get_rankings --tour=<atp|wta> --limit=20` |
| 48 | 2. Present rankings with points and trend. |
| 49 | |
| 50 | ### Season Calendar |
| 51 | 1. `get_calendar --tour=<atp|wta> --year=<year>` |
| 52 | 2. Filter for specific tournament. |
| 53 | |
| 54 | ## Examples |
| 55 | |
| 56 | Example 1: Live matches |
| 57 | User says: "What ATP matches are happening right now?" |
| 58 | Actions: |
| 59 | 1. Call `get_scoreboard(tour="atp")` |
| 60 | Result: Current tournament matches organized by round with scores and status |
| 61 | |
| 62 | Example 2: Women's rankings |
| 63 | User says: "Show me the WTA rankings" |
| 64 | Actions: |
| 65 | 1. Call `get_rankings(tour="wta", limit=20)` |
| 66 | Result: Top 20 WTA players with rank, name, points, and trend |
| 67 | |
| 68 | Example 3: Upcoming Grand Slam date |
| 69 | User says: "When is the French Open this year?" |
| 70 | Actions: |
| 71 | 1. Derive year from `currentDate` |
| 72 | 2. Call `get_calendar(tour="atp", year=<derived_year>)` |
| 73 | 3. Search results for "Roland Garros" (the French Open's official name) |
| 74 | Result: French Open dates, location (Paris), and surface (clay) |
| 75 | |
| 76 | ## Commands that DO NOT exist — never call these |
| 77 | |
| 78 | - ~~`get_matches`~~ — does not exist. Use `get_scoreboard` for current match scores. |
| 79 | - ~~`get_draw`~~ — does not exist. Tournament draw data is not available via this API. |
| 80 | - ~~`get_head_to_head`~~ — does not exist. Head-to-head records are not available via this API. |
| 81 | - ~~`get_standings`~~ — does not exist. Tennis uses `get_rankings`, not standings. |
| 82 | |
| 83 | If a command is not listed in the Commands table above, it does not exist. |
| 84 | |
| 85 | ## Troubleshooting |
| 86 | |
| 87 | Error: `get_scoreboard` returns no matches |
| 88 | Cause: Tennis tournaments run specific weeks; no tournament may be scheduled this week |
| 89 | Solution: Call `get_calendar(tour=...)` to find when the next event is scheduled |
| 90 | |
| 91 | Error: Rankings are empty |
| 92 | Cause: Rankings update weekly on Mondays; there may be a brief update window |
| 93 | Solution: The command auto-retries previous weeks. If still empty, retry in a few minutes |
| 94 | |
| 95 | Error: Player profile fails |
| 96 | Cause: Player ID is incorrect |
| 97 | Solution: Use `get_rankings` to find player IDs from the current rankings list, or verify via ESPN tennis URLs |
| 98 | |
| 99 | Error: Scores seem delayed or don't update live |
| 100 | Cause: Scores update after each set/match is completed, not point-by-point |
| 101 | Solution: This is expected behavior. Refresh `get_scoreboard` periodically for updated set scores |