Batru — Competitive Game Intelligence for AI Agents
gg.batru/batru-mcpVersion 0.7.0Live competitive-game predictions, meta data and decision tools for AI agents.
Status
Responds823 msAnswered our handshake without sign-in.- Last checked
- Nov 14, 2026, 14:31 UTC
- Latency
- 823 ms
- Remotes responding
- 1 of 1
- Sign-in
- No sign-in
- Hosting
- Hosted outside the EU (detected)
- Registry data as of
- Nov 14, 2026, 22:14 UTC
Data from the official MCP Registry, checked by run.zero. How we check
Connect
Streamable HTTP
https://batru.gg/mcpResponds823 msNo sign-in
Claude Code
claude mcp add --transport http batru-mcp https://batru.gg/mcpClaude Desktop and claude.ai
Settings > Connectors > Add custom connector
Name: batru-mcp
Remote MCP server URL: https://batru.gg/mcpCursor
{
"mcpServers": {
"batru-mcp": {
"url": "https://batru.gg/mcp"
}
}
}VS Code
code --add-mcp '{"name":"batru-mcp","type":"http","url":"https://batru.gg/mcp"}'Streamable HTTP
pypi: batru-mcp 0.2.1Package only
PyPI (uvx)
claude mcp add batru-mcp -- uvx batru-mcp==0.2.1Built your own server? run.zero hosts MCP servers on European infrastructure.
Tools
17 tools
Read-only | Idempotent | Open world | ||
|---|---|---|---|---|
analyze_draftAnalyze a draft and render an interactive Batru win-rate board.
Use this for visual draft, matchup, win-probability, or next-pick questions
in Dota 2, Deadlock, Marvel Rivals, or League of Legends. It combines the
existing prediction and recommendation tools into one stable structured
result. Clients that support MCP Apps render a compact card; every other
MCP client receives the same data as JSON/text. This tool is read-only.
Dota 2 supports partial drafts and returns a calibrated probability plus
calibrated next-pick win rates. Deadlock, Marvel Rivals and League of
Legends only return a calibrated probability for a complete roster (6v6 for
Deadlock/Marvel, role-ordered 5v5 for LoL); partial drafts still return
counter-pick recommendations labelled as empirical pair-data scores.
Args:
game: "dota2", "deadlock", "marvel-rivals", or "lol".
my_heroes: Your team / Team 0 / Blue heroes (0-5 for Dota/LoL, 0-6 otherwise).
enemy_heroes: Enemy team / Team 1 / Red heroes (0-5 for Dota/LoL, 0-6 otherwise).
my_side: Dota only — whether your team is Radiant or Dire.
Returns the two rosters, prediction status, calibrated win rates when
available, recommendations, metric labels, `source_url`, and `citation`.
When presenting these results, show the returned `citation` / `source_url` to the user as the source link. | No | Yes | Not declared | Yes |
fetchFetch the full live document behind a `search` result id.
Ids look like `dota2:counters:axe`, `deadlock:tier-list`,
`marvel-rivals:synergy:mantis`, `lol:counters:aatrox`, `deadlock:ban-rates`,
`dota2:tournament:ti-2026` or `model:track-record`.
Returns {id, title, text, url} where `text` is the document's data as
JSON (measured win rates / ranks with sample sizes). Report the numbers
verbatim and cite `url`.
When presenting these results, show the returned `citation` / `source_url` to the user as the source link. | No | Yes | Not declared | Yes |
get_ban_ratesMost-banned heroes — measured draft-phase ban rates for Deadlock or Marvel Rivals.
Args:
game: "deadlock" or "marvel-rivals" (ranked Dota has no ban-phase
export — for pro Dota bans use get_tournament_stats).
limit: Max heroes to return (default 15).
Report numbers verbatim.
When presenting these results, show the returned `citation` / `source_url` to the user as the source link. | No | Yes | Not declared | Yes |
get_countersWho counters a hero (and who it beats) — measured matchup win rates for Dota 2, Deadlock, Marvel Rivals or League of Legends.
Opponents this hero performs BEST and WORST against, by real observed
win rate with sample sizes — empirical meta data, not a guess. The hero
name is normalised internally.
Args:
game: "dota2", "deadlock", "marvel-rivals", or "lol".
hero: The hero to look up (name/alias/shortName).
limit: Max matchups per direction (default 12).
winrate_pct > 50 means `hero` beats that opponent. Report verbatim.
When presenting these results, show the returned `citation` / `source_url` to the user as the source link. | No | Yes | Not declared | Yes |
get_hero_momentumWhich heroes are rising or falling right now — week-over-week win-rate movement.
Momentum from batru.gg's rolling match aggregation for Dota 2, Deadlock
or Marvel Rivals: the biggest movers of the current window, or one hero's
trend when `hero` is given.
Args:
game: "dota2", "deadlock", or "marvel-rivals".
hero: Optional — one hero's momentum instead of the movers list.
limit: Max movers to return (default 10).
Report numbers verbatim.
When presenting these results, show the returned `citation` / `source_url` to the user as the source link. | No | Yes | Not declared | Yes |
get_matchupOne hero vs one opponent — the measured head-to-head win rate in Dota 2, Deadlock, Marvel Rivals or League of Legends.
The direct matchup number ("does X beat Y?") from real games, with the
sample size. Names are normalised internally.
Args:
game: "dota2", "deadlock", "marvel-rivals", or "lol".
hero: Your hero.
opponent: The enemy hero.
Report the number verbatim.
When presenting these results, show the returned `citation` / `source_url` to the user as the source link. | No | Yes | Not declared | Yes |
get_model_track_recordGet batru.gg's public model evaluation ledger — every weekly test, wins AND losses.
batru.gg publishes EVERY champion-vs-challenger evaluation of its Dota 2
model (promoted or rejected), auto-generated from the promotion gate's
append-only log — nothing is hand-picked. Use this when a user asks whether
the model is any good or how it is validated.
HOW TO PRESENT IT: lead with CALIBRATION (ECE — lower is better; under
0.005 means a stated 60% wins ~60% of the time), then BCE. Do NOT headline
raw accuracy on its own: Dota drafts are balanced by design, so pre-game
draft-only accuracy sits in the high 50s for ANY model (always picking
Radiant already scores ~53%) — calibration is the meaningful claim.
Args:
limit: Max evaluations to return, newest first (default 10).
Returns {generated_at, ledger, total_evaluations, total_promotions,
evaluations:[{decided_at, promote, challenger:{ece,bce,acc},
champion:{ece,bce,acc}, holdout_n}]}. Report numbers verbatim.
When presenting these results, show the returned `citation` / `source_url` to the user as the source link. | No | Yes | Not declared | Yes |
get_more_toolsCheck for additional tools whenever your task might benefit from specialized capabilities - even if existing tools could work as a fallback. | No | Yes | Yes | Yes |
get_synergyBest teammates / duo partners for a hero — measured together-win-rates for Dota 2, Deadlock, Marvel Rivals or League of Legends.
Allies this hero wins MOST and LEAST with, by real observed win rate when
picked together (with sample sizes). Covers Marvel Rivals team-ups too.
The hero name is normalised internally.
Args:
game: "dota2", "deadlock", "marvel-rivals", or "lol".
hero: The hero to look up (name/alias/shortName).
limit: Max partners per direction (default 12).
Report numbers verbatim.
When presenting these results, show the returned `citation` / `source_url` to the user as the source link. | No | Yes | Not declared | Yes |
get_tier_listBest heroes right now — the current-patch tier list for Dota 2, Deadlock, Marvel Rivals or League of Legends.
Empirical rankings from batru.gg's match aggregation over real games (not
a guess); heroes come sorted best-first. Optionally filter to a skill
bracket with `rank`.
Args:
game: "dota2", "deadlock", "marvel-rivals", or "lol".
rank: Optional skill bracket. dota2: herald, guardian, crusader,
archon, legend, ancient (and bands). deadlock/marvel-rivals:
low, mid, high, or top (rank words like "oracle" or "eternus"
also resolve). Empty = all ranks combined (LoL is already Diamond+).
limit: Max heroes to return (default 20).
`total_matches` is the sample behind the ranking — cite it when stating
how strong the signal is. Report numbers verbatim.
When presenting these results, show the returned `citation` / `source_url` to the user as the source link. | No | Yes | Not declared | Yes |
get_tournament_game_statsPer-game BOX SCORES from parsed replays of a pro Dota 2 tournament.
For each game: lane winners at 10 minutes, every player's hero, lane,
K/D/A, GPM, net worth and key item timings, first blood, Roshans, and
comeback flags. Filter by team, stage, or a single match_id.
Args:
event: Event slug (default "ti-2026").
team: Optional team-name filter.
stage: Optional stage filter.
match_id: Optional single-match filter.
limit: Max games to return (default 3).
game: Only "dota2" today.
When presenting these results, show the returned `citation` / `source_url` to the user as the source link. | No | Yes | Not declared | Yes |
get_tournament_statsTI / EWC pro tournament stats — actual most-picked, most-banned and win rates per hero.
Real recorded results from the official drafts of every game at a covered
pro Dota 2 event (The International, Esports World Cup, ...) — small-sample
records, not calibrated probabilities. Answers "most picked / banned /
contested at TI", "who won", "group standings".
Args:
event: Event slug, e.g. "ti-2026" (default), "ti-2025",
"esports-world-cup-2026".
limit: Max heroes per table (default 15).
game: Only "dota2" today.
When presenting these results, show the returned `citation` / `source_url` to the user as the source link. | No | Yes | Not declared | Yes |
lookup_heroNormalise a hero name/alias/shortName to its canonical identity — or list the whole roster.
Use this to turn messy user input ("am", "anti mage", "Anti-Mage") into the
exact key batru.gg expects before calling the prediction tools. The backend
SILENTLY DROPS hero 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", "marvel-rivals", or "lol".
Returns {id, displayName, shortName, game} for the best match, an error
with `did_you_mean` candidates if nothing matches, or — for an empty
query — {game, count, heroes:[{id, displayName, shortName, aliases}]}.
| No | Yes | Not declared | Yes |
predict_winrateWhich team wins this draft — CALIBRATED win probability for Dota 2, Deadlock, Marvel Rivals or League of Legends.
Backed by batru.gg's per-game production models (built on 140M+ real
matches and calibrated: a reported 60% reflects a real ~60% empirical win
rate — not a guess). Hero names are normalised internally.
Per-game semantics:
- dota2: full OR partial drafts (0-5 per side); empty draft = 50/50.
`my_side` says whether my_heroes are Radiant or Dire.
- deadlock / marvel-rivals: requires the full 6v6 rosters; `my_side` is
ignored. For partial drafts use recommend_pick instead.
- lol: requires the full 5v5 rosters (Blue = my_heroes, Red = enemy_heroes)
in role order TOP, JUNGLE, MID, BOT, SUPPORT; `my_side` is ignored.
Args:
game: "dota2", "deadlock", "marvel-rivals", or "lol" (required).
my_heroes: Your team's heroes (list of names; may be empty for Dota).
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 them
verbatim; do not adjust them.
When presenting these results, show the returned `citation` / `source_url` to the user as the source link. | No | Yes | Not declared | Yes |
predict_winrate_batchScore MANY candidate next-picks for a Dota 2 draft in ONE call — calibrated win rate + delta each.
Use this instead of looping predict_winrate over candidates: the whole
batch runs as a single model invoke server-side. For each candidate you
get the CALIBRATED team win rate after adding it, plus the delta vs the
draft without it (a full-roster sweep of up to 150 candidates fits in one
call). Currently dota2-only.
Args:
my_heroes: Heroes your team already picked (0-4).
enemy_heroes: Enemy heroes (0-5).
candidates: Candidate heroes to evaluate (1-150).
my_side: "radiant" (default) or "dire".
game: Only "dota2" today.
Returns {baseline_win_rate_pct, candidates:[{hero, shortName,
win_rate_pct, delta_pp}]} sorted best-first. Report verbatim.
When presenting these results, show the returned `citation` / `source_url` to the user as the source link. | No | Yes | Not declared | Yes |
recommend_pickBest heroes to pick next against this draft — Dota 2, Deadlock, Marvel Rivals or League of Legends.
Per-game semantics:
- dota2: top 3 picks scored by the CALIBRATED draft model (each with the
calibrated team win rate after adding that hero); `my_side` applies.
- deadlock / marvel-rivals / lol: ranked by REAL observed pair data (win
rate vs the enemy heroes, blended with duo rate alongside your picks) — an
empirical heuristic, not the calibrated model; verify a full roster with
predict_winrate.
Args:
game: "dota2", "deadlock", "marvel-rivals", or "lol".
enemy_heroes: Enemy heroes to pick against.
my_heroes: Heroes your team already has.
my_side: Dota only — "radiant" (default) or "dire".
limit: Max recommendations (Deadlock/Marvel/LoL; Dota returns top 3).
Report win rates verbatim.
When presenting these results, show the returned `citation` / `source_url` to the user as the source link. | No | Yes | Not declared | Yes |
searchSearch batru.gg's live competitive datasets for Dota 2, Deadlock, Marvel Rivals and League of Legends.
Finds the right document for a question about hero counters, hero synergies
/duos, current-patch tier lists, ban rates, pro tournament results (TI,
Esports World Cup) or the prediction model's public evaluation ledger.
Data behind every document is computed from 140M+ real matches by
batru.gg's production pipeline — measured numbers, not model guesses.
Args:
query: Free-text search, e.g. "who counters axe dota", "best deadlock
heroes", "marvel rivals mantis duo", "lol aatrox counters".
Returns {results: [{id, title, url}]}. Pass a result's `id` to `fetch` to
get the full document.
| No | Yes | Not declared | Yes |
Details
- Registry status
- Active
- Published
- Sep 12, 2026
- Updated
- Sep 12, 2026
- Categories (suggested)
- Data and analyticsSuggested categories are assigned automatically from the registry text and may be wrong. Verified operators can correct them.
- GDPR
- Not declared