Repository avatar
Monitoring
v0.1.0
active

tennis-mcp

io.github.sorukumar/tennis-mcp

Zero-clone ATP tennis analytics: 200k+ matches since 1968, H2H, GSDI, NBI, and shot charting.

Documentation

🎾 tennis-mcp

PyPI sorukumar/tennis-mcp MCP server License: MIT Python 3.11+ Data: sorukumar/tml-data Visualizations

Zero-clone Model Context Protocol (MCP) server for Open Era ATP tennis.

Query 200,105 ATP matches (1968–2026), 7,622 player careers, 113,744 surface-split head-to-heads, 7,663 Match Charting Project shot/rally breakdowns, and curated dominance/drama indices (GSDI, NBI, Race to Greatness, Young Guns) directly inside Claude, Cursor, Antigravity, or VS Code — without cloning the 265 MB data repo.


⚡ Quick Start (Zero Clone)

tennis-mcp runs via uvx (or pip install tennis-mcp) and lazily caches only the Parquet/JSON tables your questions need into ~/.cache/tennis-mcp/.

Claude Desktop / Cursor / Antigravity (mcpServers)

{
  "mcpServers": {
    "tennis-mcp": {
      "command": "uvx",
      "args": ["tennis-mcp"]
    }
  }
}

Claude Code (CLI)

claude mcp add tennis-mcp -- uvx tennis-mcp

VS Code (.vscode/mcp.json)

{
  "servers": {
    "tennis-mcp": {
      "type": "stdio",
      "command": "uvx",
      "args": ["tennis-mcp"]
    }
  }
}

pip Install / Offline tml-data Override

If you prefer pip or already cloned sorukumar/tml-data, install from PyPI and optionally point TML_DATA_DIR at your local data directory:

pip install tennis-mcp
TML_DATA_DIR=/path/to/tml-data/data tennis-mcp

🛠 Available MCP Capabilities

15 Tools (Powered by DuckDB + Parquet + Story JSONs)

CategoryToolWhat It Queries
Warehouseget_dataset_overviewLive row counts, date window, charting counts, and licenses
Playerssearch_playersFilter 7,622 ATP careers by name, country IOC code, or Slam champion status
Playersget_player_profileCareer W-L, surface splits, Top 10 win%, recent matches, and MCP charting profile
Rivalriesget_head_to_headSurface-by-surface H2H breakdown (113,744 pairs) + individual match logs
Matchessearch_matchesParameterized SQL search over 200,105 enriched ATP matches
Shot / Rallyget_charting_profile475 players' serve/return, rally length (1–3 / 4–6 / 7–9 / 10+), UF rate, Serve+1, and surface splits
Shot / Rallyget_match_charting_statsPer-match winners, unforced errors, rally distributions across 7,663 charted matches
Comparecompare_playersSide-by-side comparison of 2–6 players across career stats, charting, and age snapshots
Indicesget_gsdi_rankingsGrand Slam Dominance Index (231 title runs)
Indicesget_nail_bitersNail-Biter Index (687 Grand Slam Finals & Semifinals)
Indicesget_greatness_raceAge-for-age title & Slam pace: Big 3, Alcaraz, Sinner, Borg, Sampras, McEnroe, Lendl, Agassi
Indicesget_young_guns_raceFonseca, Mensik, Tien, Jodar benchmarked against Alcaraz & Sinner
Indicesget_gs_breakthroughCareer age, matches, and years before first Grand Slam title across 59 champions
Geographyget_country_profileTop 100 / Top 10 ATP evolution across 50 years by IOC code or snapshot year
Indiaget_indian_tennis_statsOpen Era Indian ATP singles milestones & histories

7 Resources (tennis://*)

  • tennis://overview, tennis://gsdi/top, tennis://nbi/top, tennis://greatness/summary, tennis://young-guns/summary, tennis://global/timeline, tennis://indian/notable

3 Prompt Templates

  • scouting_report(player_name)
  • rivalry_breakdown(player1, player2)
  • slam_campaign_audit(player_name, tournament)

💬 Example Questions You Can Ask Your AI

  • "Compare Jannik Sinner and Carlos Alcaraz on 1st-serve won%, unforced error rate, and Clay charting metrics."
  • "Show me Novak Djokovic vs Rafael Nadal head-to-head by surface, plus their highest Nail-Biter Index Slam matches."
  • "Which players won a Grand Slam with the fewest tour matches before their first major?"
  • "How does Joao Fonseca at age 18–20 track against Carlos Alcaraz in ATP wins and Top 50 wins?"
  • "List the top 5 Grass-court Grand Slam comebacks since 2000 sorted by comeback score and duration."

🏗 Architecture

Claude / Cursor / Antigravity / VS Code
            │  (stdio MCP)
            ▼
       tennis-mcp  (Python + FastMCP/MCPServer + DuckDB)
            │
            ├── TML_DATA_DIR set? ──▶ Local tml-data/data/*.parquet + *.json
            │
            └── Otherwise ──────────▶ Lazy cache (~/.cache/tennis-mcp/, 7-day TTL)
                                       fetched via HTTPS from sorukumar/tml-data

📄 License & Data Attribution

PYPI
tennis-mcp
Install Command
pip install tennis-mcp