# io.github.livetennisapi/livetennisapi-mcp (npm · livetennisapi-mcp)

Real-time tennis scores, players, odds and model win-probability for ATP, WTA, Challenger, ITF.

- Trust score: 31/100 (low)
- Change this week: −15
- Registry status: active
- Liveness: live
- Owner verified: no
- Last scored: 2026-08-03

## Components

- remote · `mcp.livetennisapi.com`: 70/100, [markdown](https://verifymcp.io/servers/livetennisapi-livetennisapi-mcp/mcp.md), [page](https://verifymcp.io/servers/livetennisapi-livetennisapi-mcp/mcp)
- npm · `livetennisapi-mcp`: 31/100 (this document), [markdown](https://verifymcp.io/servers/livetennisapi-livetennisapi-mcp/livetennisapi-mcp.md), [page](https://verifymcp.io/servers/livetennisapi-livetennisapi-mcp/livetennisapi-mcp)

## Channel facts

- Registry: `npm`
- Package: `livetennisapi-mcp`
- Version: `1.3.0`
- Transport: `stdio`

## Trust breakdown

How this component scores in each security and reliability category. Every signal is checked automatically from public evidence about the published package, including repeated runs of it in an isolated sandbox, and we only credit what we can confirm. Scores are 0–100 per category. Scoring method: https://verifymcp.io/docs/scoring (what has changed: https://verifymcp.io/docs/scoring/changelog)

Scored 2026-08-03.

- **Supply Chain Security**: 38/100
  - Malware scan not yet available for this package.
  - Only part of the dependency tree could be resolved (96 of 97), so this covers what we could see, not the whole tree.
  - No install/post-install scripts declared.
  - Only part of the dependency tree could be resolved (96 of 97), so this covers what we could see, not the whole tree.
- **Provenance & Transparency**: 97/100
  - Source repository is publicly reachable at the declared URL.
  - Cryptographically verified build provenance (signed, bound to livetennisapi/livetennisapi-mcp).
  - Clear OSI-approved license (MIT).
  - Actively maintained (last published 0 days ago).
  - Disclosure check failed: no security disclosure policy was found in the source repository.
- **Schema Quality & AI Usability**: 0/100
  - Schema quality not yet verified: we do not have a sandbox capture of the MCP schema this version of the package serves yet.
- **Stability & Change Management**: 0/100
  - Stability not yet verified: we do not have a sandbox capture of the MCP schema this version of the package serves yet.
- **Tool Coverage**: 0/100
  - Tool coverage not yet verified: we do not have a sandbox capture of the tool definitions this version of the package serves yet.
- **Capabilities**: 0/100
  - Protocol version not yet verified: we do not have a sandbox capture of the MCP handshake this version of the package performs yet.

**Unverified: 4 categories.** Categories scored 0 because our sandbox run of this package has not given us the schema these checks need to read. That is a gap on our side rather than a finding about the package, and we only credit what we can confirm, so the score stands at 0 until the capture succeeds. We are working through the fleet, so this normally clears without any action from you.

## Install

### Claude

```bash
claude mcp add livetennisapi-livetennisapi-mcp -- npx -y livetennisapi-mcp
```

### Codex

```bash
codex mcp add livetennisapi-livetennisapi-mcp -- npx -y livetennisapi-mcp
```

### opencode

```json
{
  "$schema": "https://opencode.ai/config.json",
  "mcp": {
    "livetennisapi-livetennisapi-mcp": {
      "type": "local",
      "command": [
        "npx",
        "-y",
        "livetennisapi-mcp"
      ],
      "enabled": true
    }
  }
}
```

### OpenClaw

```bash
openclaw mcp add livetennisapi-livetennisapi-mcp --command npx --arg -y --arg livetennisapi-mcp
```

### Hermes

```yaml
mcp_servers:
  livetennisapi-livetennisapi-mcp:
    command: "npx"
    args: ["-y", "livetennisapi-mcp"]
```

### Other

```json
{
  "mcpServers": {
    "livetennisapi-livetennisapi-mcp": {
      "command": "npx",
      "args": [
        "-y",
        "livetennisapi-mcp"
      ]
    }
  }
}
```

## Changelog

Every change recorded for this component, newest first. Days that predate change tracking, or that we cannot explain, say so: "we were watching and nothing happened" and "we were not watching" are different claims.

### 2026-08-03 (score 31, −49)

- [security regression] Malware scan: pass → unverified
- [security regression] Stability: 0.20 → unverified
- [functional regression] Tool coverage: 100 → unverified
- [functional regression] Capabilities: pass → unverified
- [functional] Package version: 1.2.3 → 1.3.0

### 2026-08-02 (score 80, +25)

- [security regression] Install scripts: pass → unverified
- [security regression] Provenance: pass → unverified
- [security improvement] Known CVEs: unverified → partial
- [security improvement] Malware scan: unverified → pass
- [security] The attested source repository moved: livetennisapi/livetennisapi-mcp
- [functional regression] Maintenance: pass → unverified
- [functional regression] License: pass → unverified
- [functional improvement] Dependency health: unverified → partial
- [functional improvement] Stability: unverified → 0.20
- [functional] Licence: MIT
- [functional] Package version: 1.2.2 → 1.2.3

### 2026-07-31 (score 55, −8)

- [functional] We updated how we score, so this day's move reflects our rubric, not a change to the server

### 2026-07-30 (score 63, −31)

- [security regression] Malware scan: pass → unverified
- [security regression] Known CVEs: partial → unverified
- [functional regression] Dependency health: partial → unverified

### 2026-07-29 (score 94, +69)

- [security improvement] Install scripts: unverified → pass
- [security improvement] Provenance: unverified → pass
- [security improvement] Known CVEs: unverified → partial
- [security] The attested source repository moved: livetennisapi/livetennisapi-mcp
- [functional regression] Security disclosure: unverified → fail
- [functional improvement] Maintenance: unverified → pass
- [functional improvement] License: unverified → pass
- [functional improvement] Tool coverage: unverified → 100
- [functional improvement] Schema quality: unverified → excellent
- [functional] Licence: MIT

### 2026-07-28 (score 25, −21)

- [functional regression] Security disclosure: fail → unverified
- [functional regression] Tool coverage: 100 → unverified
- [functional improvement] Dependency health: unverified → partial
- [functional] First check of Schema quality: unverified

### 2026-07-27 (score 46)

First indexed and scored.

## MCP tools (19)

### `get_live_matches` (~57 tokens)

Live matches

List tennis matches currently in progress, with live scores. Covers ATP, WTA, Challenger and ITF. Use this for "what tennis is on right now".

Input parameters:

- `limit` (integer): Maximum matches to return (1-200).

Output parameters:

- `matches` (array): The live matches, most relevant first.
- `message` (string): Human-readable summary. Identical to the text content, so either half can be used alone.
- `ok` (boolean): True when the call returned data. False for a tier wall, a missing or rejected key, or an empty result — all of which are normal states with a clear remedy, not failures.

### `get_upcoming_matches` (~38 tokens)

Upcoming matches

List tennis matches scheduled to start soon, with players and tournament.

Input parameters:

- `limit` (integer): Maximum matches to return (1-200).

Output parameters:

- `matches` (array): Matches due to start, soonest first.
- `message` (string): Human-readable summary. Identical to the text content, so either half can be used alone.
- `ok` (boolean): True when the call returned data. False for a tier wall, a missing or rejected key, or an empty result — all of which are normal states with a clear remedy, not failures.

### `get_match` (~64 tokens)

Match detail

Full detail for one match by id: players, score, surface, round and status. Includes market prices on PRO and model analysis on ULTRA.

Input parameters:

- `match_id` (integer, required): Match id, as returned by get_live_matches, get_upcoming_matches or get_recent_results.

Output parameters:

- `analysis` (object): Model analysis. Requires the ULTRA plan; absent otherwise.
- `market` (object): Match-winner market. Requires the PRO plan; absent otherwise.
- `match` (object): The match.
- `message` (string): Human-readable summary. Identical to the text content, so either half can be used alone.
- `ok` (boolean): True when the call returned data. False for a tier wall, a missing or rejected key, or an empty result — all of which are normal states with a clear remedy, not failures.

### `get_match_score` (~65 tokens)

Match score

Current score for one match — the fastest, lowest-latency read. Use this when you only need the score and already know the match id.

Input parameters:

- `match_id` (integer, required): Match id, as returned by get_live_matches, get_upcoming_matches or get_recent_results.

Output parameters:

- `message` (string): Human-readable summary. Identical to the text content, so either half can be used alone.
- `ok` (boolean): True when the call returned data. False for a tier wall, a missing or rejected key, or an empty result — all of which are normal states with a clear remedy, not failures.
- `score` (object): The current score.

### `search_players` (~66 tokens)

Search players

Search tennis players by name. Returns id, country, ranking and tour. Use the returned id with get_player.

Input parameters:

- `limit` (integer): Maximum players to return (1-200).
- `query` (string, required): Full or partial player name, e.g. "alcaraz".

Output parameters:

- `message` (string): Human-readable summary. Identical to the text content, so either half can be used alone.
- `ok` (boolean): True when the call returned data. False for a tier wall, a missing or rejected key, or an empty result — all of which are normal states with a clear remedy, not failures.
- `players` (array): Matching players, best match first.

### `get_player` (~42 tokens)

Player profile

One player's profile: ranking, country, handedness, date of birth and cached stats.

Input parameters:

- `player_id` (integer, required): Player id, as returned by search_players.

Output parameters:

- `message` (string): Human-readable summary. Identical to the text content, so either half can be used alone.
- `ok` (boolean): True when the call returned data. False for a tier wall, a missing or rejected key, or an empty result — all of which are normal states with a clear remedy, not failures.
- `player` (object): The player.

### `get_fixtures` (~37 tokens)

Fixture schedule

Upcoming scheduled tennis fixtures, earliest first — the forward schedule.

Input parameters:

- `limit` (integer): Maximum fixtures to return (1-200).

Output parameters:

- `fixtures` (array): Scheduled fixtures, earliest first.
- `message` (string): Human-readable summary. Identical to the text content, so either half can be used alone.
- `ok` (boolean): True when the call returned data. False for a tier wall, a missing or rejected key, or an empty result — all of which are normal states with a clear remedy, not failures.

### `search_tournaments` (~92 tokens)

Tournament catalogue

Search the tournament catalogue — the stable id space that match objects carry as tournament_id. Returns surface, indoor, host city/country and category where curated.

Input parameters:

- `limit` (integer): Maximum tournaments to return (1-200).
- `query` (string): Full or partial tournament name, e.g. "wimbledon". Omit to list all.
- `tour` (string): Restrict to one tour.

Output parameters:

- `message` (string): Human-readable summary. Identical to the text content, so either half can be used alone.
- `ok` (boolean): True when the call returned data. False for a tier wall, a missing or rejected key, or an empty result — all of which are normal states with a clear remedy, not failures.
- `tournaments` (array): Matching tournaments, name order.

### `get_tournament` (~68 tokens)

Tournament detail

One tournament by its stable id — the tournament_id carried on match objects. Name, tour, surface, indoor, plus host city/country and category where curated.

Input parameters:

- `tournament_id` (string, required): Stable tournament id, as returned by search_tournaments or carried on a match as tournament_id.

Output parameters:

- `message` (string): Human-readable summary. Identical to the text content, so either half can be used alone.
- `ok` (boolean): True when the call returned data. False for a tier wall, a missing or rejected key, or an empty result — all of which are normal states with a clear remedy, not failures.
- `tournament` (object): The tournament.

### `get_recent_results` (~34 tokens)

Recent results

Recently completed tennis matches with final scores and winners.

Input parameters:

- `limit` (integer): Maximum matches to return (1-200).

Output parameters:

- `matches` (array): Completed matches, most recent first.
- `message` (string): Human-readable summary. Identical to the text content, so either half can be used alone.
- `ok` (boolean): True when the call returned data. False for a tier wall, a missing or rejected key, or an empty result — all of which are normal states with a clear remedy, not failures.

### `search_archive_matches` (~263 tokens)

Results archive (1968–2022)

Search the results archive — completed-match RESULTS from 1968 through 2022: ATP and WTA, main draws, qualifying and the ITF/futures tiers. Winner/loser-shaped records with final score, seeds and ranks AT THE TIME of the match. Use this for historical questions ("Borg's Wimbledon finals"); the archive ends 2022-12-31 where our own results (get_recent_results) begin. Requires the BASIC plan or any History plan.

Input parameters:

- `from` (string): Earliest tournament START date, YYYY-MM-DD.
- `level` (string): Source tier code: G=grand slam, M=masters, A=tour, F=finals, D=davis cup, C=challenger, O=olympics, or a futures category code (e.g. 15).
- `limit` (integer): Maximum results to return (1-200).
- `player_name` (string): Case-insensitive fragment of EITHER player's name, min 3 chars, e.g. "borg".
- `round` (string): Round code, e.g. F for finals.
- `to` (string): Latest tournament START date, YYYY-MM-DD.
- `tour` (string): atp or wta.

Output parameters:

- `message` (string): Human-readable summary. Identical to the text content, so either half can be used alone.
- `ok` (boolean): True when the call returned data. False for a tier wall, a missing or rejected key, or an empty result — all of which are normal states with a clear remedy, not failures.
- `results` (array): Archive results, newest tournament first.

### `get_archive_match` (~78 tokens)

Archive result detail

One result from the results archive (1968–2022), with per-match serve statistics where the era recorded them — stats are null for most rows before 1991, honestly, never synthesised. Requires the BASIC plan or any History plan.

Input parameters:

- `archive_match_id` (integer, required): Archive match id, as returned by search_archive_matches.

Output parameters:

- `message` (string): Human-readable summary. Identical to the text content, so either half can be used alone.
- `ok` (boolean): True when the call returned data. False for a tier wall, a missing or rejected key, or an empty result — all of which are normal states with a clear remedy, not failures.
- `result` (object): The archive result.
- `stats`: Per-match serve statistics (aces, double_faults, serve_points, first_in, first_won, second_won, serve_games, bp_saved, bp_faced). Null for most pre-1991 rows.

### `search_archive_players` (~135 tokens)

Archive player bios

The people of the results archive (1968–2022): hand, date of birth, country, height, and career-high rank with the week it was first reached. Their ids are corpus person ids (the winner/loser player_id on archive results), not roster ids — for current players use search_players. Requires the BASIC plan or any History plan.

Input parameters:

- `limit` (integer): Maximum players to return (1-200).
- `query` (string, required): Full or partial player name, min 3 chars, e.g. "navratilova".
- `tour` (string): atp or wta.

Output parameters:

- `message` (string): Human-readable summary. Identical to the text content, so either half can be used alone.
- `ok` (boolean): True when the call returned data. False for a tier wall, a missing or rejected key, or an empty result — all of which are normal states with a clear remedy, not failures.
- `players` (array): Matching archive people, ordered by name.

### `get_archive_career` (~120 tokens)

Archive career aggregates

One player's whole career over the results archive (1968–2022): W-L record overall and by surface/level/year, titles, and summed serve statistics with honest coverage — the corpus records serve stats from 1991 only, so matches_with_stats states how many matches the serve block covers. The name must resolve to one person; an ambiguous fragment returns the candidate list to choose from. Requires the BASIC plan or any History plan.

Input parameters:

- `name` (string, required): Player name fragment, min 3 chars — must resolve to exactly one person.

Output parameters:

- `by_year` (array): Per-season W-L.
- `message` (string): Human-readable summary. Identical to the text content, so either half can be used alone.
- `ok` (boolean): True when the call returned data. False for a tier wall, a missing or rejected key, or an empty result — all of which are normal states with a clear remedy, not failures.
- `player_name` (string|null): The resolved player.
- `record` (object): The W-L record.
- `serve`: Summed serve stats + derived ratios. matches_with_stats states the coverage; ratios are null where the denominator is zero.
- `span` (object): Career span inside the archive.

### `get_h2h` (~151 tokens)

Head-to-head

The all-time record between two players, across BOTH halves of the product: the results archive (1968–2022) plus our own completed matches (2023 onward). Names are the keys — an ambiguous fragment returns the candidate list to choose from rather than guessing. Totals count only meetings with a known winner; walkovers and retirements are part of the record and each meeting carries its outcome. Requires the BASIC plan or any History plan.

Input parameters:

- `player1` (string, required): First player name (fragment, min 3 chars), e.g. "federer".
- `player2` (string, required): Second player name (fragment, min 3 chars), e.g. "nadal".

Output parameters:

- `by_surface` (object): Decided wins per surface; keys are surface names plus "unknown".
- `meetings` (array): Individual meetings, newest first, capped at 200.
- `message` (string): Human-readable summary. Identical to the text content, so either half can be used alone.
- `ok` (boolean): True when the call returned data. False for a tier wall, a missing or rejected key, or an empty result — all of which are normal states with a clear remedy, not failures.
- `players`: The resolved names; null when no player matches the fragments.
- `totals` (object): The headline record.

### `get_match_events` (~73 tokens)

Match timeline

Timeline of events for a match — breaks, games won, sets won, momentum runs. Requires the PRO plan.

Input parameters:

- `limit` (integer): Maximum events to return (1-200).
- `match_id` (integer, required): Match id, as returned by get_live_matches, get_upcoming_matches or get_recent_results.

Output parameters:

- `events` (array): Events in chronological order.
- `message` (string): Human-readable summary. Identical to the text content, so either half can be used alone.
- `ok` (boolean): True when the call returned data. False for a tier wall, a missing or rejected key, or an empty result — all of which are normal states with a clear remedy, not failures.

### `get_match_odds` (~78 tokens)

Match market prices

Match-winner market prices for a match — implied probability per player, with bid, ask and mid. Requires the PRO plan.

Input parameters:

- `limit` (integer): Maximum price points to return (1-200).
- `match_id` (integer, required): Match id, as returned by get_live_matches, get_upcoming_matches or get_recent_results.

Output parameters:

- `market` (object): The match-winner market.
- `message` (string): Human-readable summary. Identical to the text content, so either half can be used alone.
- `ok` (boolean): True when the call returned data. False for a tier wall, a missing or rejected key, or an empty result — all of which are normal states with a clear remedy, not failures.

### `get_match_analysis` (~62 tokens)

Model analysis

Model analysis for a match: predicted win probability, the model's thesis and the key factors behind it. Requires the ULTRA plan.

Input parameters:

- `match_id` (integer, required): Match id, as returned by get_live_matches, get_upcoming_matches or get_recent_results.

Output parameters:

- `message` (string): Human-readable summary. Identical to the text content, so either half can be used alone.
- `ok` (boolean): True when the call returned data. False for a tier wall, a missing or rejected key, or an empty result — all of which are normal states with a clear remedy, not failures.
- `profile` (object): Quantitative view.
- `thesis` (object): Narrative view.

### `check_api_status` (~36 tokens)

API status and plan

Check whether the Live Tennis API is reachable and which plan the configured key is on. Useful for diagnosing why other tools are refusing data.

Output parameters:

- `api_version` (string|null): API version reported by the health check.
- `has_key` (boolean): Whether a key was supplied with this call.
- `message` (string): Human-readable summary. Identical to the text content, so either half can be used alone.
- `ok` (boolean): True when the call returned data. False for a tier wall, a missing or rejected key, or an empty result — all of which are normal states with a clear remedy, not failures.
- `reachable` (boolean): True when the API answered its health check.
- `tier` (string|null): Detected plan: FREE, BASIC, PRO or ULTRA. Null when no key is configured.

## Diagnostics

Captured diagnostic sections: Provenance, Dependencies. The full working is on the page: https://verifymcp.io/servers/livetennisapi-livetennisapi-mcp/livetennisapi-mcp#diagnostics

## Score history

- 2026-08-03: 31
- 2026-08-02: 80
- 2026-08-01: 55
- 2026-07-31: 55
- 2026-07-30: 63
- 2026-07-29: 94
- 2026-07-28: 25
- 2026-07-27: 46

## Links

- npm package: https://www.npmjs.com/package/livetennisapi-mcp
- Socket report: https://socket.dev/npm/package/livetennisapi-mcp
- Repository: https://github.com/livetennisapi/livetennisapi-mcp
- Website: https://livetennisapi.com/
- Changelog RSS feed: https://verifymcp.io/servers/livetennisapi-livetennisapi-mcp/livetennisapi-mcp/changelog.xml
- Changelog JSON feed: https://verifymcp.io/servers/livetennisapi-livetennisapi-mcp/livetennisapi-mcp/changelog.json
- HTML version of this page: https://verifymcp.io/servers/livetennisapi-livetennisapi-mcp/livetennisapi-mcp
