MOBA Match Stats MCP Server avatar

MOBA Match Stats MCP Server

Pricing

from $3.00 / 1,000 read operations

Go to Apify Store
MOBA Match Stats MCP Server

MOBA Match Stats MCP Server

MCP server for Dota 2 stats in Claude, ChatGPT and Cursor, from OpenDota's public match data. Look up a player's rank medal, match history and scoreboards, recent form (KDA, GPM, XPM), hero win, pick and ban rates, counters, item builds and pro results. Unofficial, not affiliated with Valve.

Pricing

from $3.00 / 1,000 read operations

Rating

0.0

(0)

Developer

MrBridge

MrBridge

Maintained by Community

Actor stats

0

Bookmarked

2

Total users

1

Monthly active users

6 days ago

Last modified

Share

🎮 MOBA Match Stats MCP Server

Give Claude, ChatGPT, Cursor, VS Code or any MCP client the public match data of Dota 2 players and heroes. This MCP server reads the OpenDota API through 10 read-only tools: player search and profile, match history, recent form, hero pool, a two-player comparison, full match scoreboards, hero meta by rank bracket, one hero's counters and item builds, and recent pro matches.

Ask "how has my friend been playing lately compared with me?" and your assistant calls moba_compare_players. You get both players' rank, recent win rate, KDA, GPM, XPM, last hits and damage side by side, with the leader on each metric. Dota 2 is a trademark of Valve Corporation. This server is unofficial and not affiliated with or endorsed by Valve or OpenDota.

Quick start

  1. Copy your Apify API token from Apify Console > Settings > API & Integrations.
  2. Point your MCP client at https://mrbridge--moba-stats-mcp.apify.actor/mcp with that token, as a Bearer header or as ?token= in claude.ai and ChatGPT (Connect has every recipe).
  3. Ask in plain language.

What this server exposes

This server gives an AI client 10 read-only tools over the OpenDota API, an open-source platform that collects public Dota 2 match data from Valve and from match replays. Four tools are about players: find an account id from a persona name, read a profile with the rank medal and the win/loss record, list the match history with filters (hero, days, ranked only, wins or losses), and list the heroes a player plays with their win rates. Two tools compute recent form from the last 20 matches: one for a single player (record, streak, average KDA, GPM, XPM, damage, best and worst game) and one comparing two players metric by metric. One tool returns the full scoreboard of a match, two cover heroes (win, pick and ban rates by rank bracket over the last 7 days, and one hero's matchups and popular items), and the last one lists recent professional matches. No account or API key is needed. Only public data is served: players who keep their match data private are not served, and anonymous players stay anonymous.

Tools

ToolWhat it answersBilled event
moba_search_playersSearch Dota 2 players by nametool-read
moba_get_player_profileGet a Dota 2 player profiletool-read
moba_get_match_historyGet a Dota 2 player's match historytool-read
moba_analyze_performanceAnalyze a Dota 2 player's recent performancetool-action
moba_get_player_heroesGet a Dota 2 player's hero pooltool-read
moba_compare_playersCompare two Dota 2 playerstool-action
moba_get_match_detailsGet a Dota 2 match scoreboardtool-action
moba_get_hero_statsGet Dota 2 hero meta statisticstool-read
moba_analyze_heroAnalyze a Dota 2 herotool-action
moba_get_pro_matchesGet recent professional Dota 2 matchestool-read

moba_search_players: Search Dota 2 players by name

Use this when you need the account id of a Dota 2 player from their Steam persona name, or want to check which accounts carry a name, before calling the other player tools. Do not use for a player's stats or rank, use moba_get_player_profile with the account id instead. Returns up to 50 accounts from OpenDota with account id, persona name, a name similarity score from 0 to 1 and the OpenDota link. Persona names are not unique and anyone can copy one, so confirm with the profile. It reads persona names only: a pro name such as "Dendi" is not searched, and pros often play under another persona, so take a pro's account id from the scoreboard of one of their matches (moba_get_pro_matches, then moba_get_match_details). An account id or profile link is checked directly and answers NOT_FOUND for a private account. Parameters: query (persona name of 3 or more characters, e.g. "LaneBreaker", or an account id or profile link to check that it exists), limit (1-50, default 10), offset (default 0), response_format ("concise" default, or "detailed" to add cache information).

ParameterTypeRequiredExample
querystringyes"LaneBreaker"
limitintegerno10
offsetintegerno0
response_format"concise" or "detailed"no"concise"

Returns { query, players[], pagination, attribution }. Upstream: OpenDota. Cache: daily (1 day). Read-only.

moba_get_player_profile: Get a Dota 2 player profile

Use this when you need a Dota 2 player's rank (medal and stars, leaderboard place for Immortal players), persona name, verified pro name and overall win/loss record. It is the starting point for questions about one player. Do not use for finding an account by name (use moba_search_players), for the list of matches (moba_get_match_history) or for recent form (moba_analyze_performance). Public data only: an account that keeps its match data private answers NOT_FOUND. The record counts standard game modes, as OpenDota does by default (Turbo and event modes excluded). Parameters: account_id (Steam32 id such as 86745912, a Steam64 id or a profile link), response_format ("concise" default, or "detailed" to add OpenDota's estimated MMR and cache information).

ParameterTypeRequiredExample
account_idvalueyes86745912
response_format"concise" or "detailed"no"concise"

Returns { account_id, persona_name, pro_name, rank, leaderboard_rank, record, opendota_url, opendota_estimated_mmr, opendota_estimated_mmr_turbo, attribution }. Upstream: OpenDota. Cache: hourly (1 hour). Read-only.

moba_get_match_history: Get a Dota 2 player's match history

Use this when you need the list of a Dota 2 player's matches, newest first: last games, ranked games, games on one hero, wins or losses, games of the last N days, with the record for those filters. Do not use for averages and recent form (use moba_analyze_performance), for the full scoreboard of one match (use moba_get_match_details with a match_id from this list) or for the hero pool (moba_get_player_heroes). Public data only: a private account answers NOT_FOUND. Parameters: account_id (Steam32 id such as 86745912, a Steam64 id or a profile link), hero (optional, name or id, e.g. "Juggernaut"), days (optional, 1-3650, e.g. 30), ranked_only (default false), result ("any" default, "win" or "loss"), include_all_modes (default false, true adds Turbo, Ability Draft and other modes OpenDota leaves out by default), limit (1-50, default 10), offset (default 0), response_format ("concise" default, or "detailed" to add side, average rank, party size, abandon and parse flags, links and cache information).

ParameterTypeRequiredExample
account_idvalueyes86745912
herovalueno"Anti-Mage"
daysintegerno30
ranked_onlybooleannotrue
result"any" or "win" or "loss"no"win"
include_all_modesbooleannofalse
limitintegerno10
offsetintegerno0
response_format"concise" or "detailed"no"concise"

Returns { account_id, filters, record, matches[], pagination, attribution }. Upstream: OpenDota. Cache: intraday (5 minutes). Read-only.

moba_analyze_performance: Analyze a Dota 2 player's recent performance

Use this when you need how a Dota 2 player has been playing lately: win rate, current streak, average kills, deaths, assists, KDA ratio, GPM, XPM, last hits, hero and tower damage, healing, the heroes played and the best and worst game. Covers the last 20 matches at most (OpenDota's recent list, Turbo included). Do not use for the whole history (moba_get_match_history), the all-time record and rank (moba_get_player_profile) or two players side by side (moba_compare_players). Public data only: a private account answers NOT_FOUND. Parameters: account_id (Steam32 id such as 86745912, a Steam64 id or a profile link), matches (1-20, default 20, the number of most recent matches to analyse), response_format ("concise" default with the top 5 heroes, or "detailed" to add every hero, lane roles, one line per match and cache information).

ParameterTypeRequiredExample
account_idvalueyes86745912
matchesintegerno10
response_format"concise" or "detailed"no"concise"

Returns { account_id, sample, record, streak, averages, heroes[], best_match, worst_match, lane_roles, matches[], attribution }. Upstream: OpenDota. Cache: intraday (5 minutes). Read-only.

moba_get_player_heroes: Get a Dota 2 player's hero pool

Use this when you need which heroes a Dota 2 player plays most and how well: games, wins and win rate per hero, or the player's record on one hero. Do not use for global hero statistics (use moba_get_hero_stats), for one hero's matchups and items (moba_analyze_hero) or for the matches themselves (moba_get_match_history). Public data only: a private account answers NOT_FOUND. Counts standard game modes by default, as OpenDota does (Turbo excluded). Parameters: account_id (Steam32 id such as 86745912, a Steam64 id or a profile link), hero (optional, keeps one hero, e.g. "Invoker"), days (optional, 1-3650, e.g. 90), ranked_only (default false), include_all_modes (default false, true adds Turbo and other modes), sort_by ("games" default, "win_rate" or "last_played"), min_games (1-1000, default 1, e.g. 20 for a meaningful win-rate ranking), limit (1-50, default 10), offset (default 0), response_format ("concise" default, or "detailed" to add the player's record with and against each hero, and cache information).

ParameterTypeRequiredExample
account_idvalueyes86745912
herovalueno"Anti-Mage"
daysintegerno30
ranked_onlybooleannotrue
include_all_modesbooleannofalse
sort_by"games" or "win_rate" or "last_played"no"win_rate"
min_gamesintegerno20
limitintegerno10
offsetintegerno0
response_format"concise" or "detailed"no"concise"

Returns { account_id, heroes_played, heroes[], pagination, attribution }. Upstream: OpenDota. Cache: hourly (1 hour). Read-only.

moba_compare_players: Compare two Dota 2 players

Use this when you need two Dota 2 players side by side: rank, recent win rate and average KDA, GPM, XPM, last hits, damage and healing over their recent matches, with the leader of each metric. Do not use for one player (moba_analyze_performance or moba_get_player_profile) or for the matches the two played together. Uses each player's last 20 matches on OpenDota, Turbo included, and gives the dates each sample spans, which can be months old for a player who rarely plays. Public data only: a private account answers NOT_FOUND naming that account. Parameters: account_id_a and account_id_b (Steam32 ids such as 86745912, Steam64 ids or profile links, two different accounts), response_format ("concise" default with 3 top heroes each, or "detailed" with 5 and cache information).

ParameterTypeRequiredExample
account_id_avalueyes86745912
account_id_bvalueyes86745912
response_format"concise" or "detailed"no"concise"

Returns { players[], comparison[], attribution }. Upstream: OpenDota. Cache: intraday (5 minutes). Read-only.

moba_get_match_details: Get a Dota 2 match scoreboard

Use this when you need what happened in one Dota 2 match: winner, score, duration, mode, teams and league, and for each of the 10 players the hero, name, K/D/A, last hits, denies, GPM, XPM, net worth, level, damage, healing and items. Do not use for finding matches (use moba_get_match_history for a player or moba_get_pro_matches for tournaments) or for games in progress, which this server does not cover. Players who keep their match data private appear as Anonymous. Replay-parsed matches (parsed true) carry more detail. Parameters: match_id (integer such as 8001234567, or a match link from opendota.com, dotabuff.com or stratz.com), response_format ("concise" default, or "detailed" to add the draft, ranks, lane roles, backpack and neutral items, stuns, wards, stacks, buybacks, first blood time and cache information).

ParameterTypeRequiredExample
match_idvalueyes8001234567
response_format"concise" or "detailed"no"concise"

Returns { match_id, start_time, duration, duration_sec, game_mode, lobby_type, winner, league, parsed, radiant, dire, opendota_url, first_blood_time, league_id, draft[], attribution }. Upstream: OpenDota. Cache: daily (1 day). Read-only.

moba_get_hero_stats: Get Dota 2 hero meta statistics

Use this when you need which Dota 2 heroes win, get picked or get banned most right now: win rate and pick rate by rank bracket (Herald to Immortal), public matches overall, Turbo, or professional matches with bans, over the last 7 days. Also breaks one hero down by bracket. A bracket OpenDota leaves empty answers NOT_FOUND (Immortal had no counts in October 2026). Do not use for a player's own heroes (moba_get_player_heroes) or for one hero's matchups and item builds (moba_analyze_hero). Parameters: bracket ("all" default, "herald", "guardian", "crusader", "archon", "legend", "ancient", "divine", "immortal", "pro", "turbo"), sort_by ("win_rate" default, "picks", or "bans" with bracket "pro"), hero (optional, one hero with every bracket, e.g. "Pudge", the other filters then do not apply), role (optional, e.g. "support"), primary_attribute (optional, "str", "agi", "int" or "all"), min_picks (minimum picks to enter a win-rate ranking, default 100, or 5 with bracket "pro"), limit (1-50, default 10), offset (default 0), response_format ("concise" default, or "detailed" to add roles, attribute, attack type and cache information).

ParameterTypeRequiredExample
bracket"all" or "herald" or "guardian" or "crusader" or "archon" or "legend" or "ancient" or "divine" or "immortal" or "pro" or "turbo"no"divine"
sort_by"win_rate" or "picks" or "bans"no"picks"
herovalueno"Anti-Mage"
role"carry" or "support" or "nuker" or "disabler" or "jungler" or "durable" or "escape" or "pusher" or "initiator"no"support"
primary_attribute"str" or "agi" or "int" or "all"no"agi"
min_picksintegerno500
limitintegerno10
offsetintegerno0
response_format"concise" or "detailed"no"concise"

Returns { bracket, sort_by, window, heroes[], brackets[], pagination, attribution }. Upstream: OpenDota. Cache: hourly (1 hour). Read-only.

moba_analyze_hero: Analyze a Dota 2 hero

Use this when you need one Dota 2 hero in depth: how strong it is this week (public win and pick rate, professional picks, bans and win rate), which heroes it does best and worst against (counters), and which items players buy on it at the start, early, mid and late game. Do not use for ranking all heroes (moba_get_hero_stats) or for a player's results on a hero (moba_get_player_heroes). Matchups come from OpenDota's match sample of the last 12 months and items from the hero's last 100 replay-parsed matches, so small samples are noisy. Parameters: hero (name, short name or id, e.g. "Anti-Mage", "am" or 1), min_games (1-1000, default 10, the smallest matchup sample shown), response_format ("concise" default with 5 matchups each way and 5 items per phase, or "detailed" with 15 and 10 plus cache information).

ParameterTypeRequiredExample
herovalueyes"Anti-Mage"
min_gamesintegerno20
response_format"concise" or "detailed"no"concise"

Returns { hero, meta, matchups, items, notes[], attribution }. Upstream: OpenDota. Cache: daily (1 day). Read-only.

moba_get_pro_matches: Get recent professional Dota 2 matches

Use this when you need recent professional Dota 2 results: the latest league matches, the results of a team, or the matches of a tournament, with teams, score, winner and duration. Do not use for a full scoreboard (call moba_get_match_details with a match_id from this list), for public matchmaking games (moba_get_match_history) or for matches in progress, which this server does not cover. Reads OpenDota's 100 most recent league matches before a cursor. Filters apply inside that window, and window.next_before_match_id opens the previous 100 (null when no older match exists). Parameters: team (optional, part of a team name, case-insensitive, e.g. "spirit"), league (optional, part of a league name, e.g. "international"), before_match_id (optional, only matches with a lower id, e.g. 8100000008 from a previous answer), limit (1-50, default 10), offset (default 0), response_format ("concise" default, or "detailed" to add team, league and series ids, the parse flag, links and cache information).

ParameterTypeRequiredExample
teamstringno"spirit"
leaguestringno"international"
before_match_idvalueno8100000008
limitintegerno10
offsetintegerno0
response_format"concise" or "detailed"no"concise"

Returns { window, matches[], pagination, attribution }. Upstream: OpenDota. Cache: intraday (5 minutes). Read-only.

Connect

Endpoint (Streamable HTTP): https://mrbridge--moba-stats-mcp.apify.actor/mcp

Every client authenticates with your Apify API token, found in Apify Console > Settings > API & Integrations. Clients that support custom headers send it as Authorization: Bearer <token>. The others use the ?token= URL variant, which must be treated as a secret: keep it out of commits, screenshots and shared logs.

Claude Code

$claude mcp add --transport http moba-stats "https://mrbridge--moba-stats-mcp.apify.actor/mcp" --header "Authorization: Bearer ${APIFY_TOKEN}"

Cursor, VS Code and other JSON configurations

{
"mcpServers": {
"moba-stats": {
"type": "http",
"url": "https://mrbridge--moba-stats-mcp.apify.actor/mcp",
"headers": {
"Authorization": "Bearer ${APIFY_TOKEN}"
}
}
}
}

claude.ai and Claude Desktop

Add a custom connector with the URL https://mrbridge--moba-stats-mcp.apify.actor/mcp?token=YOUR_APIFY_TOKEN and no authentication. Prefilled link (replace the token placeholder before saving): add MOBA Match Stats MCP Server to Claude.

ChatGPT (developer mode)

Settings > Apps > Create, URL https://mrbridge--moba-stats-mcp.apify.actor/mcp?token=YOUR_APIFY_TOKEN, authentication "No authentication". ChatGPT snapshots the tool list: after a server update, an admin has to click Refresh on the app.

OpenAI Responses API

{
"type": "mcp",
"server_label": "moba_stats",
"server_url": "https://mrbridge--moba-stats-mcp.apify.actor/mcp",
"headers": {
"Authorization": "Bearer YOUR_APIFY_TOKEN"
},
"require_approval": "never"
}

Add allowed_tools to restrict the tool list. Tool calls must finish within about 60 seconds on this API, and every tool of this server answers in under 50 seconds.

Anthropic Messages API

{
"mcp_servers": [
{
"type": "url",
"url": "https://mrbridge--moba-stats-mcp.apify.actor/mcp",
"name": "moba-stats",
"authorization_token": "YOUR_APIFY_TOKEN"
}
],
"tools": [
{
"type": "mcp_toolset",
"mcp_server_name": "moba-stats"
}
]
}

Send the beta header anthropic-beta: mcp-client-2025-11-20.

One-click OAuth alternative

https://mcp.apify.com/?tools=mrbridge/moba-stats-mcp connects through Apify OAuth without a token. It exposes the Actor as a single tool rather than the granular tools listed above.

Cost control

Each Standby run has a spending limit (maxTotalChargeUsd). When a call uses the last of it, the result is still returned, and later calls in that run answer CHARGE_LIMIT_REACHED until the limit is raised.

Why use this server

  • Questions, not endpoints. Recent form with streak and averages, two players compared metric by metric, hero meta by bracket, counters with item builds: each comes back from a single call.
  • Takes what you have. Persona names, Friend IDs, Steam64 ids, profile or match links from the usual stats sites, hero names and short names such as "am" or "qop".
  • Privacy by design. Private accounts are refused, anonymous players stay anonymous, and public profile fields (persona name, account id) are only kept in the server's short-lived cache.
  • Familiar tool names. The naming mirrors the account's League of Legends and Teamfight Tactics servers, so a multi-game agent needs no relearning.
  • Resilient when the source is busy. Answers already cached are still served while OpenDota is rate limiting or down.
  • No key needed. Connect with your Apify token. You pay per successful call, plus the platform usage of your own server run.

Pricing (Pay-per-Event)

EventCharged whenPrice
apify-actor-startrun start (platform default)see the Store page
tool-read (primary event)each successful read tool callsee the Store page
tool-actioneach successful call of a detailed or computed toolsee the Store page

Never charged: initialize, tools/list, pings, readiness probes, and any call that ends in an error (invalid input, not found, upstream failure, timeout, spending limit).

Platform usage comes on top of these events. This server runs in Apify Standby mode, and you also pay the platform usage of your own Standby run, billed to your Apify account like any other run: the memory set for the Standby run, for as long as the server is up, idle time included, until the run stops at its idle timeout. The Apify pay-per-event documentation says so: "For runs in Standby mode, users always pay the platform usage costs in addition to the event charges."

Limits, caveats and attribution

  • Attribution. Every answer carries an attribution block crediting OpenDota (https://www.opendota.com) and stating that Dota 2 is a trademark of Valve Corporation and that this server is not affiliated with or endorsed by Valve or OpenDota. Keep that credit when you reuse what the server returns.
  • Public data only. Players who turn off "Expose Public Match Data" in Dota 2 appear as Anonymous in matches. Accounts that OpenDota marks private answer NOT_FOUND and nothing about them is returned. Steam ids, avatars, countries, chat, past names and the list of people a player plays with are never returned or stored.
  • Rate limits. Without a key, OpenDota allows 60 requests per minute and 3,000 per day per IP address, and Apify's network is shared by many users. This server keeps to 30 requests per minute per instance, never retries a request (a retry would spend the shared quota), stops calling OpenDota for a minute after a rate-limit answer, caches every answer (5 minutes for match lists, 1 hour for profiles and hero statistics, 1 day for matches, hero and item tables) and serves a cached answer when OpenDota is rate limiting or down. When the daily quota is spent, calls fail with UPSTREAM_RATE_LIMITED until the end of the UTC day, unless the Actor owner sets an OpenDota API key.
  • What the numbers cover. Profiles and match histories count standard game modes, as OpenDota does (set include_all_modes for Turbo and event modes). Recent form uses OpenDota's last 20 matches, Turbo included, which can be fewer and months old for a player who rarely plays, so the answers give their dates. Hero statistics are sums over the last 7 days, and a rank bracket OpenDota leaves empty answers NOT_FOUND (on 2026-10-13 it published no Immortal counts). Player search reads Steam persona names, not pro names. Matchups come from OpenDota's match sample of the last 12 months, mostly league and replay-parsed matches, and item popularity from the hero's last 100 parsed matches, so small samples are noisy. Win rates, averages and pick and ban rates are computed by this server from OpenDota's counts. Ranks are medals (Herald to Immortal), and the MMR shown in detailed profiles is OpenDota's own estimate, not Valve's matchmaking rating.
  • No live games. Matches in progress are not covered, and a match that just ended can take a few minutes to appear. Professional matches come in windows of the 100 most recent before a cursor.
  • Best effort. OpenDota runs on volunteer time and depends on Valve's services, with no availability guarantee. The data is provided as is.

Data terms

The data comes from the OpenDota API (https://docs.opendota.com/), which OpenDota builds from public Dota 2 match data published by Valve (https://steamcommunity.com/dev/apiterms) and from match replays. It is provided as is, without warranty of accuracy or availability. By using this server you agree to keep the OpenDota credit and the no-affiliation notice of each answer when you republish its data, not to present the data as coming from or endorsed by Valve or OpenDota, and not to use it for unsolicited marketing or to gain an unfair advantage during a match in progress. Dota 2 and Dota are trademarks of Valve Corporation.

The fee for this server pays for the service (hosting, caching, normalisation, computed statistics), not for a licence on the data.

Use cases

  • Personal coaching. A player reviews their last 20 games, sees which heroes work for them and compares their farm with a friend's.
  • Hero research. Check a hero's counters (last 12 months of matches) and its popular items while learning it.
  • Meta content. Streamers and writers pull pro results, plus each hero's win rate with its picks per bracket and its pro bans, for a weekly video or post.
  • Team scouting. Amateur teams review recent pro matches and full scoreboards of a tournament.
  • Community bots. A Discord bot answers "what's my rank?" or "show my last match" with the full scoreboard.

FAQ

Which game does it cover?

Dota 2, through the public data of the OpenDota API. The server is unofficial: Valve owns the Dota trademark and has no part in it.

Can it see live games?

No, on purpose. Matches in progress are not covered, and a match that just ended can take a few minutes to appear.

Why is a player not found?

Players who keep their match data private are not served, and anonymous players show as Anonymous. Only public data is available.

How fresh is the hero meta?

Hero statistics (win rate, picks, bans) cover the last 7 days. Matchups and item builds come from smaller samples, and the MMR shown is OpenDota's estimate, not an official figure.

What does a call cost?

Each successful tool call is one event, at the price shown on the Pricing tab for your Apify plan: tool-action for moba_analyze_performance, moba_compare_players, moba_get_match_details and moba_analyze_hero, tool-read for every other tool. Paid Apify plans get lower prices. On the free plan, a read costs $0.005 and an action $0.01, so 100 reads come to $0.50 in events. On top of that, your Apify account pays the platform usage of your own Standby run while the server is up, idle minutes included. Errors and private or unknown players are never charged, and maxTotalChargeUsd caps what one run can spend.

Why is the first call slower?

The first call after a quiet period starts a new Standby run on your Apify account, which takes a few seconds. Then it answers quickly, and it shuts down after about 5 idle minutes.

Do you have servers for other games?

Yes: the League of Legends MCP Server and the Teamfight Tactics MCP Server use the same tool naming.

Your feedback

Found a bug or a hero name it does not understand? Tell us on the Issues tab.

More MCP servers, scrapers and data studies from the same team: mr-bridge.com.

Changelog

  • 0.1.4: Output, dataset and key-value store schemas, as Apify asks for publication: the Output tab of a run started from the Console shows the connection details and one row per tool.
  • 0.1.3: the Input tab shows the endpoint and how to connect an AI client, and a run started from the Console outputs the connection details and the tool list
  • 0.1.2: pricing events tool-read and tool-action
  • 0.1.1: fixes from the first live capture: both names OpenDota gives hero 76 ("Outworld Destroyer" and "Outworld Devourer") and the short name "od" work in every hero tool, a rank bracket OpenDota leaves empty (Immortal) answers NOT_FOUND without a charge instead of a provider error, the player comparison gives the dates each sample spans, and the search says it reads persona names, not pro names
  • 0.1.0: initial build (private, unpublished)