Skip to main content
Glama
hkaanengin

opendota-mcp-server

by hkaanengin

get_player_totals

Get a Dota 2 player's average stats for all tracked metrics, including GPM, KDA, damage, and more, to analyze overall performance.

Instructions

Get aggregated performance statistics across ALL tracked metrics (GPM, KDA, damage, etc.).

Use this when users ask about AVERAGE PERFORMANCE or AGGREGATE STATS:

  • "What's [player]'s average GPM?"

  • "How much damage does [player] do per game?"

  • "What's [player]'s average kills per game?"

  • "Show me [player]'s average stats"

  • "What's [player]'s average last hits?"

  • "How much XPM does [player] average?"

Returns comprehensive statistics for ALL fields tracked by OpenDota including:

  • Combat: kills, deaths, assists, kda, hero_kills, hero_damage, hero_healing

  • Economy: gold, gold_per_min, xp_per_min, gold_spent

  • Farming: last_hits, denies, neutral_kills, lane_kills

  • Objectives: tower_damage, tower_kills, courier_kills, observer_uses, sentry_uses

  • And many more...

For simple win/loss counts, use get_player_win_loss() instead. For performance distribution analysis, use get_player_histograms() instead.

Supports both IDs and natural language for flexible querying.

Args: player_name: The Dota 2 player name to search for limit: Number of matches to analyze (default: all available matches) offset: Skip first N matches (for pagination) lane_role: Filter by lane (accepts "mid", "carry", "pos 1-4", etc.) hero_id: Filter to specific hero (accepts name or ID like "Rubick") included_account_id: Only include matches with these teammates (accepts names or IDs) excluded_account_id: Exclude matches with these players (accepts names or IDs) with_hero_id: Require these heroes on player's team (accepts IDs or names) against_hero_id: Require these heroes on enemy team (accepts IDs or names) having: Minimum games played threshold for included data

Returns: List of statistical totals (one object per metric), each containing: - field (str): Name of the statistic (e.g., "kills", "gold_per_min", "hero_damage") - games_played (int): Number of games in this dataset - count (float): Total sum across all games - average (float): Mean value per game (count / games_played)

Common queries: - All average stats: get_player_totals("kürlo") - Mid lane averages: get_player_totals("kürlo", lane_role="mid") - Rubick averages: get_player_totals("kürlo", hero_id="Rubick") - With teammate: get_player_totals("kürlo", included_account_id="hotpocalypse")

Example: get_player_totals("kürlo", hero_id="Rubick", lane_role="mid") -> [ {"field": "kills", "games_played": 80, "count": 418, "average": 5.225}, {"field": "deaths", "games_played": 80, "count": 520, "average": 6.5}, {"field": "gold_per_min", "games_played": 80, "count": 33840, "average": 423.0}, {"field": "hero_damage", "games_played": 80, "count": 1640000, "average": 20500.0}, ... ]

Input Schema

TableJSON Schema
NameRequiredDescriptionDefault
limitNo
havingNo
offsetNo
hero_idNo
lane_roleNo
player_nameYes
with_hero_idNo
against_hero_idNo
excluded_account_idNo
included_account_idNo

Output Schema

TableJSON Schema
NameRequiredDescriptionDefault
resultYes
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description carries the transparency burden and does well: it explains the return format ('List of statistical totals...each containing field, games_played, count, average'), flexible ID/natural language support, and parameter behaviors like default limit. However, it omits edge-case behaviors such as empty results, rate limiting, or the performance cost of aggregating over all available matches.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is well-structured with headers, bullet lists, and examples, making it easy to scan. It is slightly verbose due to the extensive metric list and the 'Common queries' section partially duplicating the Example section, but the extra detail is informative rather than wasteful.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a 10-parameter tool with no annotations, the description is exceptionally complete. It covers when to use, parameter semantics, output schema details, common query patterns, and a concrete example, leaving the agent fully equipped to invoke the tool correctly.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters5/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 0%, but the Args section compensates by documenting all 10 parameters with meaningful semantics. For example, 'hero_id: Filter to specific hero (accepts name or ID like "Rubick")' and 'lane_role: Filter by lane (accepts "mid", "carry", "pos 1-4", etc.)' add crucial usage information beyond the schema types.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description opens with 'Get aggregated performance statistics across ALL tracked metrics (GPM, KDA, damage, etc.)', which clearly identifies the tool's action and scope. It further differentiates from siblings by explicitly naming get_player_win_loss and get_player_histograms as alternatives for different question types.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description provides explicit usage guidance with 'Use this when users ask about AVERAGE PERFORMANCE or AGGREGATE STATS' and lists concrete example queries. It also states when NOT to use it, directing users to get_player_win_loss() and get_player_histograms() for other analyses.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

Install Server

Other Tools

Latest Blog Posts

MCP directory API

We provide all the information about MCP servers via our MCP API.

curl -X GET 'https://glama.ai/api/mcp/v1/servers/hkaanengin/opendota-mcp-server'

If you have feedback or need assistance with the MCP directory API, please join our Discord server