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.
Changed the definition of "get_model_track_record"
⟨59 unchanged words⟩ with CALIBRATION (ECE — lower is better;~0.006under 0.005 means a stated 60% wins ~60% of the time), then BCE. Do NOT headlinerawraw accuracy on its own: Dota drafts are balanced by design, so~55%pre-game draft-onlyisaccuracynearsits in thegame-imposedceilinghigh 50s for ANY model (always picking Radiant already scores ~53%) — calibration is the meaningful claim. Args: ⟨48 unchanged words⟩
Changed the definition of "analyze_draft", "fetch", "get_ban_rates" and 13 more
⟨102 unchanged words⟩ ,"type":"string"},"enemy_heroes":{"description":"Heroes on the ENEMY team, as a list of hero names (any alias or short name; normalised internally). To see every valid hero name for a game, call lookup_hero with an EMPTY query (query=\"\", game=...) — it returns the full roster (displayName + shortName + aliases).","items":{"type":"string"},"title":"Enemy Heroes","type":"array"},"game":{"description":"Which game: \"dota2\", \"deadlock\" or \"marvel-rivals\". Required — hero names alone do not identify the game.","enum":["dota2","deadlock","marvel-rivals"],"title":"Game","type":"string"},"my_heroes":{"description":"Heroes already on YOUR team, as a list of hero names (any alias or short name; normalised internally). May be empty for a fresh draft. To see every valid hero name for a game, call lookup_hero with an EMPTY query (query=\"\", game=...) — it returns the full roster (displayName + shortName + aliases).","items":{"type":"string"},"title" ⟨3 unchanged words⟩ "array"},"my_side":{"default":"radiant","description":"Dota 2 only: the side your team plays, \"radiant\" or \"dire\". Ignored for deadlock / marvel-rivals.","enum":["radiant","dire"], ⟨14 unchanged words⟩
Certificate recorded, valid to 2026-11-28
Authorization not required
First tool surface recorded: 17 tools (server version 0.7.0)
Showing the latest 5 events. The API returns up to 500 and filters by kind: ?kind=tool_surface_changed
⟨102 unchanged words⟩ ,"type":"string"},"id":{"description":"A document id exactly as returned by search.","title":"Id","type":"string"}} ⟨7 unchanged words⟩
⟨102 unchanged words⟩ ,"type":"string"},"game":{"description":"\"deadlock\" or \"marvel-rivals\" (Dota 2 has no draft-phase ban data here).","enum":["dota2","deadlock","marvel-rivals"] ⟨3 unchanged words⟩ :"string"},"limit":{"default":15,"description":"Maximum number of rows to return.","title":"Limit","type":"integer" ⟨7 unchanged words⟩
⟨102 unchanged words⟩ ,"type":"string"},"game":{"description":"Which game: \"dota2\", \"deadlock\" or \"marvel-rivals\". Required — hero names alone do not identify the game.","enum":["dota2","deadlock","marvel-rivals"],"title":"Game","type":"string"},"hero":{"description":"Hero name — any alias or short name is accepted and normalised internally. To see every valid hero name for a game, call lookup_hero with an EMPTY query (query=\"\", game=...) — it returns the full roster (displayName + shortName + aliases).","title":"Hero","type":"string"},"limit":{"default":12,"description":"Max opponents to list per direction (best / worst matchups).","title":"Limit","type":"integer" ⟨8 unchanged words⟩
⟨102 unchanged words⟩ ,"type":"string"},"game":{"description":"Which game: \"dota2\", \"deadlock\" or \"marvel-rivals\". Required — hero names alone do not identify the game.","enum":["dota2","deadlock","marvel-rivals"] ⟨4 unchanged words⟩ "},"hero":{"default":"","description":"Optional: one hero to report on. Empty = the biggest movers of the current window.","title":"Hero","type":"string"},"limit":{"default":10,"description":"Maximum number of rows to return.","title":"Limit","type":"integer" ⟨7 unchanged words⟩
⟨102 unchanged words⟩ ,"type":"string"},"game":{"description":"Which game: \"dota2\", \"deadlock\" or \"marvel-rivals\". Required — hero names alone do not identify the game.","enum":["dota2","deadlock","marvel-rivals"],"title":"Game","type":"string"},"hero":{"description":"The hero you are asking about (any alias; normalised internally).","title":"Hero","type":"string"},"opponent":{"description":"The opposing hero (any alias; normalised internally).","title":"Opponent","type":"string"} ⟨9 unchanged words⟩
⟨103 unchanged words⟩ string"},"limit":{"default":10,"description":"Number of most recent weekly evaluations to return.","title":"Limit","type":"integer"}} ⟨6 unchanged words⟩
⟨102 unchanged words⟩ ,"type":"string"},"game":{"description":"Which game: \"dota2\", \"deadlock\" or \"marvel-rivals\". Required — hero names alone do not identify the game.","enum":["dota2","deadlock","marvel-rivals"],"title":"Game","type":"string"},"hero":{"description":"Hero name — any alias or short name is accepted and normalised internally. To see every valid hero name for a game, call lookup_hero with an EMPTY query (query=\"\", game=...) — it returns the full roster (displayName + shortName + aliases).","title":"Hero","type":"string"},"limit":{"default":12,"description":"Max teammates to list per direction (best / worst duos).","title":"Limit","type":"integer" ⟨8 unchanged words⟩
⟨102 unchanged words⟩ ,"type":"string"},"game":{"description":"Which game: \"dota2\", \"deadlock\" or \"marvel-rivals\". Required — hero names alone do not identify the game.","enum":["dota2","deadlock","marvel-rivals"] ⟨3 unchanged words⟩ string"},"limit":{"default":20,"description":"Maximum number of rows to return.","title":"Limit","type":"integer"},"rank":{"default":"","description":"Optional skill bracket. dota2: herald, guardian, crusader, archon, legend, ancient (or a band like \"legend-ancient\"). deadlock / marvel-rivals: low, mid, high or top. Empty = all ranks.","title":"Rank","type":"string ⟨7 unchanged words⟩
⟨104 unchanged words⟩ },"event":{"default":"ti-2026","description":"Event slug, e.g. \"ti-2026\" or \"ewc-2026\".","title":"Event","type":"string"},"game":{"default":"dota2","description":"Only \"dota2\" has replay-parsed box scores today.","enum":["dota2","deadlock","marvel-rivals"] ⟨3 unchanged words⟩ string"},"limit":{"default":3,"description":"Max games to return (each is a full box score).","title":"Limit","type":"integer"},"match_id":{"default":0,"description":"Optional: a single Dota match id to fetch; 0 = no filter.","title":"Match Id","type":"integer"},"stage":{"default":"","description":"Optional stage filter (group stage, playoffs, ...).","title":"Stage","type":"string"},"team":{"default":"","description":"Optional team-name filter (either side of the game).","title":"Team","type":"string ⟨6 unchanged words⟩
⟨104 unchanged words⟩ },"event":{"default":"ti-2026","description":"Event slug, e.g. \"ti-2026\" (The International 2026) or \"ewc-2026\" (Esports World Cup).","title":"Event","type":"string"},"game":{"default":"dota2","description":"Only \"dota2\" has pro tournament coverage today.","enum":["dota2","deadlock","marvel-rivals"] ⟨3 unchanged words⟩ :"string"},"limit":{"default":15,"description":"Maximum number of rows to return.","title":"Limit","type":"integer" ⟨6 unchanged words⟩
Normalise a hero name/alias/shortName to its canonicalidentity.identity — or list the whole roster. Use this to turn messy user input ( ⟨20 unchanged words⟩ names it doesn't recognise, so always normalise first. Not sure which heroes exist? Call it with an EMPTY query to get every hero of that game (displayName, shortName, aliases). Args: query: A hero name, alias, or short name. Empty string = list the full roster. game: "dota2" (default), "deadlock" ⟨6 unchanged words⟩ shortName, game} for the best match,oran error with `did_you_mean` candidates if nothingmatches.matches, or — for an empty query — {game, count, heroes:[{id, displayName, shortName, aliases}]}.
⟨104 unchanged words⟩ },"game":{"default":"dota2","description":"\"dota2\" (default), \"deadlock\", or \"marvel-rivals\".","title":"Game","type":"string"},"query":{"description":"A hero name, alias or short name as the user typed it. Pass an EMPTY string to list the game's full roster instead.","title":"Query","type":"string"} ⟨7 unchanged words⟩
⟨83 unchanged words⟩ is ignored. For partial drafts use recommend_pick instead. Args: game: "dota2", "deadlock", or "marvel-rivals" (required). my_heroes: Your team's heroes (list of names; may be empty). enemy_heroes: The enemy team's heroes (list of names). my_side: Dota only — "radiant" (default) or "dire". Returns calibrated win-rate percentages for both teams. Report ⟨23 unchanged words⟩
⟨102 unchanged words⟩ ,"type":"string"},"enemy_heroes":{"description":"Heroes on the ENEMY team, as a list of hero names (any alias or short name; normalised internally). To see every valid hero name for a game, call lookup_hero with an EMPTY query (query=\"\", game=...) — it returns the full roster (displayName + shortName + aliases).","items":{"type":"string"},"title":"Enemy Heroes","type":"array"},"game":{"description":"Which game: \"dota2\", \"deadlock\" or \"marvel-rivals\". Required — hero names alone do not identify the game.","enum":["dota2","deadlock","marvel-rivals"],"title":"Game","type":"string"},"my_heroes":{"description":"Heroes already on YOUR team, as a list of hero names (any alias or short name; normalised internally). May be empty for a fresh draft. To see every valid hero name for a game, call lookup_hero with an EMPTY query (query=\"\", game=...) — it returns the full roster (displayName + shortName + aliases).","items":{"type":"string"},"title" ⟨3 unchanged words⟩ array"},"my_side":{"default":"radiant","description":"Dota 2 only: the side your team plays, \"radiant\" or \"dire\". Ignored for deadlock / marvel-rivals.","enum":["radiant","dire"],"title":"My Side","type":" ⟨10 unchanged words⟩
{"properties":{"candidates":{"description":"Candidate heroes to evaluate as your next pick (1-150), as a list of hero names.","items":{"type":"string"},"title" ⟨104 unchanged words⟩ ,"type":"string"},"enemy_heroes":{"description":"Enemy heroes (0-5), as a list of hero names.","items":{"type":"string"},"title" ⟨4 unchanged words⟩ },"game":{"default":"dota2","description":"Only \"dota2\" is supported today.","enum":["dota2","deadlock","marvel-rivals"],"title":"Game","type":"string"},"my_heroes":{"description":"Heroes your team already picked (0-4), as a list of hero names.","items":{"type":"string"},"title" ⟨3 unchanged words⟩ array"},"my_side":{"default":"radiant","description":"Dota 2 only: the side your team plays, \"radiant\" or \"dire\". Ignored for deadlock / marvel-rivals.","enum":["radiant","dire"],"title":"My Side","type":" ⟨10 unchanged words⟩
⟨102 unchanged words⟩ ,"type":"string"},"enemy_heroes":{"description":"Enemy heroes to pick against, as a list of hero names.","items":{"type":"string"},"title":"Enemy Heroes","type":"array"},"game":{"description":"Which game: \"dota2\", \"deadlock\" or \"marvel-rivals\". Required — hero names alone do not identify the game.","enum":["dota2","deadlock","marvel-rivals"] ⟨3 unchanged words⟩ string"},"limit":{"default":5,"description":"Max recommendations (Deadlock / Marvel Rivals; Dota always returns its top 3).","title":"Limit","type":"integer"},"my_heroes":{"default":[],"description":"Heroes your team already has, as a list of hero names (may be empty).","items":{"type":"string"},"title" ⟨3 unchanged words⟩ array"},"my_side":{"default":"radiant","description":"Dota 2 only: the side your team plays, \"radiant\" or \"dire\". Ignored for deadlock / marvel-rivals.","enum":["radiant","dire"],"title":"My Side","type":" ⟨9 unchanged words⟩
⟨102 unchanged words⟩ ,"type":"string"},"query":{"description":"Free-text search over Batru's live esports data (hero names, matchups, tournaments, patches).","title":"Query","type":"string"}} ⟨7 unchanged words⟩