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.

OnlineRemote
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/mcp

Claude, ChatGPT, Cursor and other apps

Add it as a custom connector with this URL (Streamable HTTP):

https://thetennisdesk.com/api/mcp

Cursor, 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. Against
  • query_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 ne
  • query_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 r
  • query_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 le
  • compute_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 r
  • compute_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 r
  • compute_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 weakest
  • query_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 rat
  • predict_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 level
  • query_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 sche
  • query_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 qu
  • query_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 this
  • query_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. De
  • query_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, wh
  • plan_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 n
  • match_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 capt
  • availability_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. I
  • read_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 when
  • read_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 whe
  • query_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 th
  • query_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 team
  • query_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. Pass
  • get_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
chen.media/mcp badge

Markdown (GitHub README)

[![Listed on chen.media/mcp](https://chen.media/mcp/badge/github-chungty-thetennisdesk.svg)](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 all