Every change Wellknown observed on this MCP server, newest first, with what it was before and what it became. Tool-surface changes carry the definition diff. Nothing here is edited after the fact.
Recently observed → Live
Added "player_stats"; changed the definition of "check_api_status", "get_archive_career", "get_archive_match" and 21 more (24 tools before, 25 now)
⟨8 unchanged words⟩ and which plan the configured key is on.UsefulUseforitdiagnosingto find out why other tools are refusing data. Works with no key.
{"$schema":"http://json-schema.org/draft-07/schema#","additionalProperties":false,"properties":{},"type":"object"}
⟨19 unchanged words⟩ ":{"description":"Whether a key wassuppliedconfiguredwithfor thiscall.tool set.","type":"boolean"},"message":{"description":"Human-readablesummary. Identicalsummarytoof thetext contentresult,sosafeeithertohalfrelaycantobetheuseduseralone.verbatim.","type":"string"},"ok":{"description":"True when thecallrequest
One player's whole career over the results archive (1968–20221968 to 2022):. W-L recordoverallin total and by surface/level/year, titles, and summed servestatistics with honest coverage —statistics.theThe corpus records serve stats from 1991 only, so matches_with_statsstatessays how many matches the serve block covers. The name must resolve to oneperson;person.anAn ambiguous fragment returns the candidate list to choose ⟨9 unchanged words⟩
One result from the results archive (1968–20221968 to 2022), with per-match serve statistics where the era recordedthem —them.statsStats are null for most rows before 1991, honestly, never synthesised. Requires the BASIC plan or any History plan.
⟨5 unchanged words⟩ properties":{"message":{"description":"Human-readablesummary. Identicalsummarytoof thetext contentresult,sosafeeithertohalf
EveryMatch Charting Projectcharting stat family for ONE charted match, both players, with the per-set split (set 1, set 2,…..., Total) exactly as charted. Charting ids are their own id space (1960–20261960 to 2026),.mostlyMost of these matcheswithhave no counterpart in the live tables. Requires the ULTRA plan.
⟨6 unchanged words⟩ {"charting_match_id":{"description":"Charting match id,—in its own idspace,space.
Careershot-levelprofile from shot-level charting data, summed over theMatchplayer'sChartingchartedProject:matches.serveServe placement (deuce/ad×x wide/body/T), return depth and outcomes, net play, and clutch break/game/set-pointserving,serving. Also winners and errors by wing,rally-length tendencies — summed over the player'sandchartedrally-lengthmatches.tendencies. COVERAGE IS CURATED,
Upcoming scheduled tennis fixtures, earliestfirstfirst.—This is the forward schedule, filterable bytour, player and date.tour. Use this for "what is on this ⟨11 unchanged words⟩
⟨21 unchanged words⟩ integer"},"tour":{"description":"Tourfilter;filter.eachEach name covers its doubles variants. Exhibition/team events carry ⟨20 unchanged words⟩
⟨15 unchanged words⟩ The all-time record between two players, across BOTH halves of theproduct:product. That is the results archive (1968–20221968 to 2022) plusour ownthe completed matches(from 2023onward).onward. Names are thekeys —keys.anAn ambiguous fragment returns the candidate list to choose from,ratherandthannothingguessing.is guessed. Totals count only meetings with a knownwinner;
⟨6 unchanged words⟩ {"country":{"description":"Either participant's country—: the lowercase 3-letter IOC-style code the Player object ⟨38 unchanged words⟩ ":"Player ids (from search_players), max50 —50.keepsKeeps matches where ANY listed player is either participant. ⟨6 unchanged words⟩ array"},"tour":{"description":"Tourfilter;filter.eachEach name covers its doubles variants. Exhibition/team events carry ⟨20 unchanged words⟩
⟨71 unchanged words⟩ status has never changed since the field wasintroduced —introduced.never
⟨9 unchanged words⟩ ,"description":"Model analysis. Requires the ULTRAplan;plan, absent otherwise.","properties":{"key_factors":{ ⟨30 unchanged words⟩ ,"description":"Match-winner market. Requires the PROplan;plan, absent otherwise.","properties":{"prices":{ ⟨143 unchanged words⟩ status has never changed since the field wasintroduced —introduced.neverNever backfilled.","type":["string","null" ⟨136 unchanged words⟩ normalized vocabulary (F, SF, QF, R16…... Q);.nullNull when the label is unrecognised, never guessed.","type":["string","null"]},"scheduled_time":{"description":"Scheduled start, UTC ISO-8601. Null when no start time is set yet.","type":["string","null"]},"score":{"description":"Formatted score line, ⟨26 unchanged words⟩ ":{"description":"One of live, upcoming,
⟨6 unchanged words⟩ win probability, the model's thesis and thekeymain factors behind it. Requires the ULTRA plan. Match rows carry has_analysis,—so check itfirst;first.aA match with no thesis or profile has nothing to return.
⟨5 unchanged words⟩ properties":{"message":{"description":"Human-readablesummary. Identicalsummarytoof thetext contentresult,sosafe
Timeline of events for a match—: breaks, games won, sets won, momentum ⟨5 unchanged words⟩
⟨5 unchanged words⟩ "properties":{"events":{"description":"Events,innewestchronologicalfirst,order.as the API returns them.","items":{"additionalProperties":false,"properties" ⟨40 unchanged words⟩ array"},"message":{"description":"Human-readablesummary. Identicalsummarytoof thetext contentresult,so
Match-winner market prices for a match—: implied probability per player, with bid, ask and mid. Requires the PRO plan. Match rows carry has_market,—so check itfirst;first.aA match with no market mapped has no prices to return.
⟨126 unchanged words⟩ object"},"message":{"description":"Human-readablesummary. Identicalsummarytoof thetext contentresult,sosafeeither
Current score for onematchmatch.—This is the fastest read,lowest-latencywithread.the lowest latency. Usethisit when you only need the score and already ⟨13 unchanged words⟩
⟨5 unchanged words⟩ properties":{"message":{"description":"Human-readablesummary. Identicalsummarytoof thetext content
⟨4 unchanged words⟩ for one match, in TWO families keptdeliberatelyseparate:on purpose. DERIVED is rebuilt from the point-by-point record (holds/breaks, break points, service/return points);. MEASURED is countedupstreamperandmatch. It includes what no point record can yield—: aces, double faults, the serve split, winners/unforced errors. Measured coverage varies bytour;tour.absentAbsent fields are omitted, never zero-filled. Requires the ULTRA plan.
⟨5 unchanged words⟩ ⟨5 unchanged words⟩ properties":{"message":{"description":"Human-readablesummary. Identicalsummarytoof thetext contentresult,sosafeeithertohalfrelaycantobetheuseduseralone.verbatim.","type":"string"},"ok":{"description":"True when thecallrequestreturnedsucceeded,data.
Point-in-time ranking records for SPECIFICplayers:players.perPer system, the newest record in force ON OR BEFORE as_of—, never one dated after it. Every other ranking field in this API is the CURRENT value joined at readtime;time.thisThis one is the historical answer. Systems are never collapsed ⟨20 unchanged words⟩
⟨5 unchanged words⟩ ,"properties":{"as_of":{"description":"YYYY-MM-DD —YYYY-MM-DD.theThe record in force on this date. Omit for ⟨52 unchanged words⟩
The FULL published ranking table in rank order for one system,—from the newest week at or before as_of. Rows ⟨15 unchanged words⟩ table has no silent holes. ATP/WTA history runsdeep;deep.theThe ITF circuits begin 2026-07-29. For point-in-time records of ⟨8 unchanged words⟩
⟨5 unchanged words⟩ ,"properties":{"as_of":{"description":"YYYY-MM-DD —YYYY-MM-DD.servesServes the newest published week at or before this ⟨25 unchanged words⟩ "Ranking system to list. utr has no listing,—because it is a rating, not a ranking."
⟨6 unchanged words⟩ {"country":{"description":"Either participant's country—: the lowercase 3-letter IOC-style code the Player object ⟨53 unchanged words⟩ ":"Player ids (from search_players), max50 —50.keepsKeeps matches where ANY listed player is either participant. ⟨8 unchanged words⟩ "description":"Latest play date: YYYY-MM-DD orISO-8601;ISO-8601.mustMust not precede from.","type":"string"},"tour":{"description":"Tourfilter;filter.eachEach name covers its doubles variants. Exhibition/team events carry ⟨20 unchanged words⟩
One tournament by its stable id—, the tournament_id carried on match objects. Name, ⟨19 unchanged words⟩
⟨5 unchanged words⟩ properties":{"message":{"description":"Human-readablesummary. Identicalsummarytoof thetext contentresult,sosafeeithertohalfrelaycantobetheused
⟨6 unchanged words⟩ {"country":{"description":"Either participant's country—: the lowercase 3-letter IOC-style code the Player object ⟨53 unchanged words⟩ ":"Player ids (from search_players), max50 —50.keepsKeeps matches where ANY listed player is either participant. ⟨8 unchanged words⟩ "description":"Latest play date: YYYY-MM-DD orISO-8601;ISO-8601.mustMust not precede from.","type":"string"},"tour":{"description":"Tourfilter;filter.eachEach name covers its doubles variants. Exhibition/team events carry ⟨20 unchanged words⟩
Search the results archive—: completed-match RESULTS from 1968 through2022:2022. ATP and WTA, main draws, qualifying and the ITF/futures tiers.Winner/loser-shapedEachrecordsrecordwithhas winner and loser, final score, and seeds and ranks AT THE TIME of the match. Use this for historical questions ("Borg's Wimbledon finals");.theThe archive ends 2022-12-31, whereourtheowncurrent results (get_recent_results) begin. Requires the BASIC plan or any History plan.
The people of the results archive (1968–20221968 to 2022): hand, date of birth, country, ⟨18 unchanged words⟩ winner/loser player_id on archive results), not rosterids —ids.forFor current players use search_players. Requires the BASIC plan or any History plan.
⟨5 unchanged words⟩ properties":{"message":{"description":"Human-readablesummary. Identicalsummarytoof thetext contentresult,sosafeeithertohalf
⟨5 unchanged words⟩ properties":{"message":{"description":"Human-readablesummary. Identicalsummarytoof thetext contentresult,sosafeeithertohalfrelaycantobetheuseduseralone.verbatim.","type":"string"},"ok":{"description":"True when thecallrequestreturnedsucceeded,data.
Search the tournamentcataloguecatalogue.—Itstheidsstableareidthespacetournament_id that match objectscarry as tournament_id.carry. Returns surface, indoor, host city/country and category ⟨11 unchanged words⟩
⟨5 unchanged words⟩ properties":{"message":{"description":"Human-readablesummary. Identicalsummarytoof
Player record and splits — One player's record over completed singles matches from 2023 onward, by default the last 365 days. It gives W/L overall, over the last 12 months and by surface, venue, level and season. It also gives tiebreaks, deciding sets, the record after winning or losing the first set, comebacks, withdrawals and the last N matches. Every count carries its sample size, and a percentage on an empty sample is null, never 0. On ULTRA it adds serve_return: measured serve and return statistics summed over the window. Singles only, so a doubles-team id is refused. For 1968 to 2022 use get_archive_career. Requi…
Live → Recently observed
Changed the definition of "get_fixtures", "get_live_matches", "get_match" and 9 more
Upcoming scheduled tennis fixtures, earliest first — the forwardschedule.schedule, filterable by tour, player and date. Use this for "what is on this week". Works on the FREE plan (no card needed).
⟨18 unchanged words⟩ for "what tennis is on right now". Works on the FREE plan (no card needed).
Certificate changed, valid to 2026-12-14
Certificate recorded, valid to 2026-10-16
Authorization not required
First tool surface recorded: 24 tools (server version 1.4.0)
Showing the latest 8 events. The API returns up to 500 and filters by kind: ?kind=tool_surface_changed
⟨33 unchanged words⟩ array"},"message":{"description":"Human-readablesummary. Identicalsummarytoof thetext contentresult,sosafeeithertohalfrelaycantobetheuseduseralone.verbatim.","type":"string"},"ok":{"description":"True when thecallrequestreturnedsucceeded,data.includingFalsewhenfortheaanswertieriswall,an empty list. False for a missing or rejected key,oraanplanemptythatresultdoes—notallincludeofthiswhichdata,areannormalunknownstatesid,witha rate limit or aclearnetworkremedyerror. The message then says what to do. check_api_status is the exception: it is true whenever the API answered,notandfailures.reports API key problems in the message.","type":"boolean"},"player_name":{ ⟨37 unchanged words⟩ :"null"}],"description":"W-L persourcetier code."},"by_surface":{"anyOf":[ ⟨70 unchanged words⟩ serve stats + derived ratios. matches_with_stats states thecoverage;coverage.ratiosRatios are null where the denominator is zero."} ⟨38 unchanged words⟩
⟨32 unchanged words⟩ "]},"mcp_id":{"description":"TheMatch ChartingchartingProject'sdataset's own row identifier.","type":["string","null"]},"message":{"description":"Human-readablesummary. Identicalsummarytoof thetext contentresult,sosafeeithertohalfrelaycantobetheuseduseralone.verbatim.","type":"string"},"ok":{"description":"True when thecallrequestreturnedsucceeded,data.includingFalsewhenfortheaanswertieriswall,an empty list. False for a missing or rejected key,oraanplanemptythatresultdoes—notallincludeofthiswhichdata,areannormalunknownstatesid,witha rate limit or aclearnetworkremedyerror. The message then says what to do. check_api_status is the exception: it is true whenever the API answered,notandfailures.reports API key problems in the message.","type":"boolean"},"players":{ ⟨16 unchanged words⟩
⟨21 unchanged words⟩ "description":"Player name fragment, min 3chars —chars.mustMust resolve to one charted person.","minLength": ⟨7 unchanged words⟩
⟨22 unchanged words⟩ :{},"description":"Per-family summed numeric columns—: raw sums over the player's charted Total rows. ⟨13 unchanged words⟩ "]},"message":{"description":"Human-readablesummary. Identicalsummarytoof thetext contentresult,sosafeeithertohalfrelaycantobetheuseduseralone.verbatim.","type":"string"},"ok":{"description":"True when thecallrequestreturnedsucceeded,data.includingFalsewhenfortheaanswertieriswall,an empty list. False for a missing or rejected key,oraanplanemptythatresultdoes—notallincludeofthiswhichdata,areannormalunknownstatesid,witha rate limit or aclearnetworkremedyerror. The message then says what to do. check_api_status is the exception: it is true whenever the API answered,notandfailures.reports API key problems in the message.","type":"boolean"},"player":{ ⟨16 unchanged words⟩
⟨23 unchanged words⟩ "object"},"description":"Decided wins persurface;surface. The keys are surface names plus \"unknown\"." ⟨35 unchanged words⟩ results archive, 1968-2022) or \"current\" (our owncompleted matches,from 2023 onward).","type":["string", ⟨3 unchanged words⟩ ":"Our match id (current era rows)—.passPass to get_match.","type":["number","null"]},"outcome":{"description":"completed, retired, walkover,… —...excludeExclude non-completed yourself if needed.","type":[" ⟨9 unchanged words⟩ :{"description":"Final score (archive rowsonly —only.readRead current rows from get_match).","type": ⟨51 unchanged words⟩ array"},"message":{"description":"Human-readablesummary. Identicalsummarytoof thetext contentresult,sosafeeithertohalfrelaycantobetheuseduseralone.verbatim.","type":"string"},"ok":{"description":"True when thecallrequestreturnedsucceeded,data.includingFalsewhenfortheaanswertieriswall,an empty list. False for a missing or rejected key,oraanplanemptythatresultdoes—notallincludeofthiswhichdata,areannormalunknownstatesid,witha rate limit or aclearnetworkremedyerror. The message then says what to do. check_api_status is the exception: it is true whenever the API answered,notandfailures.reports API key problems in the message.","type":"boolean"},"players":{ ⟨28 unchanged words⟩ :"null"}],"description":"The resolvednames;names.nullNull when no player matches the fragments."}," ⟨43 unchanged words⟩ ":{"description":"Meetings with no derivablewinner —winner.neverNever counted in wins.","type":["number" ⟨13 unchanged words⟩
⟨31 unchanged words⟩ result."},"message":{"description":"Human-readablesummary. Identicalsummarytoof thetext contentresult,sosafeeithertohalfrelaycantobetheuseduseralone.verbatim.","type":"string"},"ok":{"description":"True when thecallrequestreturnedsucceeded,data.includingFalsewhenfortheaanswertieriswall,an empty list. False for a missing or rejected key,oraanplanemptythatresultdoes—notallincludeofthiswhichdata,areannormalunknownstatesid,witha rate limit or aclearnetworkremedyerror. The message then says what to do. check_api_status is the exception: it is true whenever the API answered,notandfailures.reports API key problems in the message.","type":"boolean"},"rankings":{ ⟨25 unchanged words⟩ },"player_id":{"description":"Roster playerid —id.nullNull on listing rows for players outside our roster. ⟨2 unchanged words⟩ "null"]},"player_name":{"description":"NamePlayer name astheitrankingappearspublisherinprintedtheitranking (listing rows).","type":["string ⟨11 unchanged words⟩ "Rank at the preceding snapshot week (ATP/WTAonly;only, null elsewhere).","type":["number" ⟨14 unchanged words⟩ "null"]},"rank_movement":{"description":"The circuit's own signedSigned weekly rank movement (ITF systems only).","type":["number","null"]},"rating":{"description":"UTRonly;only, null elsewhere.","type":["number"," ⟨36 unchanged words⟩
⟨5 unchanged words⟩ properties":{"message":{"description":"Human-readablesummary. Identicalsummarytoof thetext contentresult,sosafeeithertohalfrelaycantobetheuseduseralone.verbatim.","type":"string"},"ok":{"description":"True when thecallrequestreturnedsucceeded,data.includingFalsewhenfortheaanswertieriswall,an empty list. False for a missing or rejected key,oraanplanemptythatresultdoes—notallincludeofthiswhichdata,areannormalunknownstatesid,witha rate limit or aclearnetworkremedyerror. The message then says what to do. check_api_status is the exception: it is true whenever the API answered,notandfailures.reports API key problems in the message.","type":"boolean"},"rankings":{ ⟨23 unchanged words⟩ },"player_id":{"description":"Roster playerid —id.nullNull on listing rows for players outside our roster. ⟨2 unchanged words⟩ "null"]},"player_name":{"description":"NamePlayer name astheitrankingappearspublisherinprintedtheitranking (listing rows).","type":["string ⟨11 unchanged words⟩ "Rank at the preceding snapshot week (ATP/WTAonly;only, null elsewhere).","type":["number" ⟨14 unchanged words⟩ "null"]},"rank_movement":{"description":"The circuit's own signedSigned weekly rank movement (ITF systems only).","type":["number","null"]},"rating":{"description":"UTRonly;only, null elsewhere.","type":["number"," ⟨36 unchanged words⟩
⟨14 unchanged words⟩ :"string"},"level":{"description":"Source tierTier code: G=grand slam, M=masters, A=tour, F=finals, D=davis cup, C=challenger,O=olympics,O=olympics.orOr a futures category code (e.g. 15)." ⟨83 unchanged words⟩
⟨5 unchanged words⟩ properties":{"message":{"description":"Human-readablesummary. Identicalsummarytoof thetext contentresult,sosafeeithertohalfrelaycantobetheuseduseralone.verbatim.","type":"string"},"ok":{"description":"True when thecallrequestreturnedsucceeded,data.includingFalsewhenfortheaanswertieriswall,an empty list. False for a missing or rejected key,oraanplanemptythatresultdoes—notallincludeofthiswhichdata,areannormalunknownstatesid,witha rate limit or aclearnetworkremedyerror. The message then says what to do. check_api_status is the exception: it is true whenever the API answered,notandfailures.reports API key problems in the message.","type":"boolean"},"results":{ ⟨10 unchanged words⟩ "event_date":{"description":"The tournament STARTdate —date.per-matchPer-match dates do not exist in thisera’sera's records.","type":["string","null" ⟨16 unchanged words⟩ "null"]},"level":{"description":"Source tierTier code: G, M, A, F, ⟨59 unchanged words⟩ ":"completed, retired, walkover, default orabandoned —abandoned.parsedParsed, null when unparseable.","type":["string ⟨43 unchanged words⟩ },"tour":{"description":"atp orwta —wta.theThe results archive covers those two tours.","type ⟨10 unchanged words⟩ :{"additionalProperties":false,"description":"The winner—, a stored field in the corpus, never ⟨26 unchanged words⟩ entry where recorded (WC, Q, LL,…...)—.nullNull for direct acceptances.","type":["string" ⟨34 unchanged words⟩ },"player_id":{"description":"Corpus personidid.—Joinpassit to search_archive_players resultsto joinfor bios. NOT a roster player id.","type ⟨57 unchanged words⟩
⟨15 unchanged words⟩ prices on PRO and model analysis on ULTRA. Works on the FREE plan (no card needed).
⟨184 unchanged words⟩ "type":["string","null"]},"event_status_updated_at":{"description":"The instant the current event_status was recorded, UTC ISO-8601 (added 2026-08-19). Null while the status has never changed since the field was introduced — never backfilled.","type":["string","null"]},"has_analysis":{"description":"Whether a model thesis or profile exists for this match (added 2026-09-02, every tier). Filter on this before calling get_match_analysis, which reports the same absence. Null only when the server predates the field.","type":["boolean","null"]},"has_market":{"description":"Whether a match-winner market is mapped to this match (added 2026-09-02, every tier). Filter on this before calling get_match_odds, which reports the same absence. Null only when the server predates the field.","type":["boolean","null"]},"id":{"description":"Match id. Pass to ⟨245 unchanged words⟩ indoor","serving","winner","event_status","event_status_updated_at","withdrew","has_analysis","has_market","win_probability_p1"],"type":"object"}, ⟨60 unchanged words⟩
⟨13 unchanged words⟩ key factors behind it. Requires the ULTRA plan. Match rows carry has_analysis — check it first; a match with no thesis or profile has nothing to return.
⟨12 unchanged words⟩ bid, ask and mid. Requires the PRO plan. Match rows carry has_market — check it first; a match with no market mapped has no prices to return.
⟨16 unchanged words⟩ the score and already know the match id. Works on the FREE plan (no card needed).
⟨5 unchanged words⟩ , handedness, date of birth and cached stats. Works on the FREE plan (no card needed).
⟨50 unchanged words⟩ "type":["string","null"]},"event_status_updated_at":{"description":"The instant the current event_status was recorded, UTC ISO-8601 (added 2026-08-19). Null while the status has never changed since the field was introduced — never backfilled.","type":["string","null"]},"has_analysis":{"description":"Whether a model thesis or profile exists for this match (added 2026-09-02, every tier). Filter on this before calling get_match_analysis, which reports the same absence. Null only when the server predates the field.","type":["boolean","null"]},"has_market":{"description":"Whether a match-winner market is mapped to this match (added 2026-09-02, every tier). Filter on this before calling get_match_odds, which reports the same absence. Null only when the server predates the field.","type":["boolean","null"]},"id":{"description":"Match id. Pass to ⟨245 unchanged words⟩ indoor","serving","winner","event_status","event_status_updated_at","withdrew","has_analysis","has_market","win_probability_p1"],"type":"object"}, ⟨62 unchanged words⟩
⟨16 unchanged words⟩ indoor, plus host city/country and category where curated. Works on the FREE plan (no card needed).
List tennis matches scheduled to start soon, with players, tournament andtournament.start time. Use this for "who plays next" or to find a match id before it starts. Works on the FREE plan (no card needed).
⟨51 unchanged words⟩ "type":["string","null"]},"event_status_updated_at":{"description":"The instant the current event_status was recorded, UTC ISO-8601 (added 2026-08-19). Null while the status has never changed since the field was introduced — never backfilled.","type":["string","null"]},"has_analysis":{"description":"Whether a model thesis or profile exists for this match (added 2026-09-02, every tier). Filter on this before calling get_match_analysis, which reports the same absence. Null only when the server predates the field.","type":["boolean","null"]},"has_market":{"description":"Whether a match-winner market is mapped to this match (added 2026-09-02, every tier). Filter on this before calling get_match_odds, which reports the same absence. Null only when the server predates the field.","type":["boolean","null"]},"id":{"description":"Match id. Pass to ⟨245 unchanged words⟩ indoor","serving","winner","event_status","event_status_updated_at","withdrew","has_analysis","has_market","win_probability_p1"],"type":"object"}, ⟨62 unchanged words⟩
⟨9 unchanged words⟩ and tour. Use the returned id with get_player. Works on the FREE plan (no card needed).
⟨17 unchanged words⟩ , indoor, host city/country and category where curated. Works on the FREE plan (no card needed).