The Tennis Desk
by @chungty · io.github.chungty/thetennisdesk
Ratings, line win chances and lineup help for USTA NorCal adult league tennis, from public results.
- Category
- Developer tools
- Connection
- Remote (HTTP)
- Tools
- 29 reported
- Status
- Online
Connect it to your AI
Claude Code
claude mcp add --transport http thetennisdesk https://thetennisdesk.com/api/mcpClaude, ChatGPT, Cursor and other apps
Add it as a custom connector with this URL (Streamable HTTP):
https://thetennisdesk.com/api/mcpCursor, VS Code and other apps (mcp.json)
{
"mcpServers": {
"thetennisdesk": {
"url": "https://thetennisdesk.com/api/mcp"
}
}
}Tools it offers
29 tools, as the server itself reported during our check on Oct 31, 2026.
plan_lineupPlans a doubles and singles lineup for a team the Desk covers. It lists who has played most for your team this season, with their appearances, usual line and Desk level, the Desk's estimate of how they play now. Againstquery_team_recordReturns the recorded lines of any team the Desk covers, in any league and season, each with an evidenceId you can cite. It also gives the team's record, which is already counted, every team match of the period and its nequery_matchupReturns the recorded lines from the scorecards where two named teams played each other, in any season, each with an evidenceId. Call it for the head-to-head between two teams, or before you state a fact about it.query_rosterReturns a team's roster for a season, one row per player with an evidenceId: name, NTRP rating, wins, losses, matches and Desk level. Call it when someone asks who is on a team, or before you state a fact about a roster.query_player_historyReturns the recorded lines a named player appeared in, as cited rows told from the player's side, with the player's record, which is already counted by season, team and stage. Call it when someone asks about a player's rquery_match_logReturns a player's match-by-match rating history for one season: each match they played, their level before and after it, and the other players on court with their levels then. Call it when someone asks how a player's lecompute_aggregateWorks out one number for any covered team, in any league or season, in code from its recorded lines: `win_rate`, `win_count`, `loss_count` or `match_count`. Call it whenever you would state a count, an average or a win rcompute_roster_strengthSplits a team's roster by published NTRP level and gives each level group's players, wins, losses and win rate this season, over every league line those players appeared in. Call it for a roster's shape rather than its rcompute_match_line_ratingsRanks a team's recorded matches by how strong a lineup it fielded, from each player's current Desk level, so it is not a rating at the time of the match. Call it when someone asks which match had the strongest or weakestquery_player_ratingReturns the Desk's read of a named player: their Desk level, their record by season, team, stage and format, the model card id and the lines behind it. Call it when someone asks how strong a player is, or about their ratpredict_matchupGives the home side's win probability for one line between named players. It weighs each player's Desk level, how a pair plays together and who is available, while a player the Desk has not yet rated gets a default levelquery_team_forecastReturns a team's upcoming matches on the league schedule, or those of every team a player is on: the opponent, the day, the start time, and home or away. Call it for a next match, today's or tomorrow's match, or the schequery_club_teamsReturns the teams a named club fields this year, and which of them plays next. Call it whenever someone asks about a whole club by name, before you narrow the question to a single team. For how the club is doing, call ququery_clubReturns what a club's page on The Tennis Desk shows, in one call. That is its teams in a season by league, each with its place in the Desk's unofficial league table and its record. It also gives the club's next matches,query_my_teamsReturns the member's own teams, the ones they are on or have played for, which come from their affiliations. Call it when the person asks about their own teams, as in 'what teams am I on', and set thisYear:true for thisquery_cohort_standingRanks a group of players by Desk level and gives the member's place in it. Call it for 'where do I stand', 'how do I compare to the top players', a ranking or a percentile, or the top players in an age group or level. Dequery_league_standingsBuilds the Desk's unofficial league table for a team's flight, with the named team's place, which it ranks from recorded results by the league's own rule and tie-breaks. Call it for the standings, how a team finished, whplan_lineup_from_availabilityPlans a lineup from the availability a member's agent read on the USTA NorCal league site, so the agent can fill in the lineup form. Pass the team, the match and each player's answer in USTA's own words: yes, No, maybe,prepare_score_entryPrepares the values for the score form on the USTA NorCal league site, from the scores a member reports. Pass the team, the match and each line: its players on both sides, its set scores, and its status when a line was nmatch_date_checkChecks a proposed date and time for a home match before the captain posts it on the USTA NorCal league site. Pass the team, the match and the proposed date and start time, and the format and second-shift time if the captavailability_loopFinds the players who have not answered the next match on the USTA NorCal availability grid. Pass the team and the grid as your agent read it: each match column's header, and each player's row with one cell per column. Iread_docsReads The Tennis Desk's own docs, word for word. They cover what the Desk is, a Desk level, what is free and what the Desk Pass adds, coverage and updates, agents, privacy and how a league table is ordered. Call it whenread_researchReads the Desk's published research about players in general, word for word. Each piece comes with its question, headline, answers and figures, the group of past players it counts and the day it was measured. Call it whequery_coverageAnswers what the Desk covers: which areas, leagues, levels, clubs, teams and seasons are on record, and what kinds of question it can answer at all. Call it whenever someone asks what you can look up, what data you have,project_standingsProjects how a league table could finish, from the matches left and the Desk's line forecasts. It gives each team's likely place, its chance to finish first and, when the Desk knows the playoff cut, its chance to make thquery_playoff_historyGives a team's playoff chances from a week ago and earlier, one a week, each as of its day. It also says what moved the chance most: the change between two days and the matches played between them. Call it for how a teamquery_forecast_resultsGives a team's latest matches that the Desk forecast before they were played. For each line, it gives the team's chance as the Desk logged it the night before, and whether the team won the line. It also gives each match'scout_teamWrites the Desk's scout of one team it covers: its ranked reads of who matters and how the lines go, each with its evidence. Call it when someone asks for a scout, a breakdown of a team, or how to beat a named team. Passget_desk_passSays whether the signed-in member holds the Desk Pass, when it renews or ends, how many forecasts they have left this week and when more come. Call it when someone asks about their Desk Pass or their forecasts. It takes
Questions
What is the The Tennis Desk MCP server?
Ratings, line win chances and lineup help for USTA NorCal adult league tennis, from public results. It is made by @chungty and listed in the official MCP Registry as io.github.chungty/thetennisdesk. MCP (Model Context Protocol) is the open standard that lets AI apps like Claude, ChatGPT and Cursor use outside tools.
How do I add The Tennis Desk to Claude?
In the Claude app or claude.ai, open Settings, then Connectors, choose "Add custom connector" and paste https://thetennisdesk.com/api/mcp. In Claude Code, run: claude mcp add --transport http thetennisdesk https://thetennisdesk.com/api/mcp
How do I add The Tennis Desk to ChatGPT?
ChatGPT can use remote MCP servers as connectors. In ChatGPT settings, under Apps and Connectors, turn on developer mode if asked, create a new connector and paste https://thetennisdesk.com/api/mcp.
How do I add The Tennis Desk to Cursor?
Open Cursor settings, go to MCP, choose "Add new MCP server" (or edit ~/.cursor/mcp.json) and add: { "mcpServers": { "thetennisdesk": { "url": "https://thetennisdesk.com/api/mcp" } } }
Does The Tennis Desk work right now?
Yes. It responded when we last checked on 31 Oct 2026. We check remote MCP servers every day.
What can The Tennis Desk do?
It gives your AI 29 tools, including plan_lineup, query_team_record, query_matchup, query_roster, query_player_history. The full list is on this page.
Is this your server? Get the badge for your README
Markdown (GitHub README)
[](https://chen.media/mcp/github-chungty-thetennisdesk)HTML (switches to dark mode on its own)
<a href="https://chen.media/mcp/github-chungty-thetennisdesk"><picture><source media="(prefers-color-scheme: dark)" srcset="https://chen.media/mcp/badge/github-chungty-thetennisdesk.svg?theme=dark"><img src="https://chen.media/mcp/badge/github-chungty-thetennisdesk.svg" alt="Listed on chen.media/mcp" height="40"></picture></a>More in Developer tools
See allAlgolia ProductivityVerified maker
@algoliaConnect LLM tools to your Algolia account with user-scoped access for internal workflows.
GitHubVerified maker
@githubConnect AI assistants to GitHub - manage repos, issues, PRs, and workflows through natural language.
MCP devkit serverVerified maker
@mapboxProvides AI assistants with direct access to Mapbox developer APIs and documentation.
GitLabVerified maker
gitlab.comOfficial GitLab MCP Server
Perplexity API PlatformVerified maker
perplexity.aiReal-time web search, reasoning, and research through Perplexity's API
Valuein — SEC EDGAR Fundamentals & Smart-Money Data
@valueinPoint-in-time, survivorship-free SEC EDGAR fundamentals + smart-money signals for AI agents.