Skip to main content
Glama
hkaanengin

opendota-mcp-server

by hkaanengin

get_heroes_played

Analyze a Dota 2 player's hero pool with per-hero win rates, games played, and last played dates. Use filters like lane role or specific hero to focus performance insights.

Instructions

Get detailed statistics for all heroes a player has played, with performance metrics.

Use this when users ask about HERO POOLS or HERO PERFORMANCE:

  • "What heroes does [player] play?"

  • "Show me [player]'s hero pool"

  • "Which heroes is [player] best at?"

  • "What's [player]'s most played hero?"

  • "How good is [player] at Rubick?"

  • "What heroes does [player] play in mid lane?"

  • "When did [player] last play Invoker?"

This returns detailed stats for EACH hero (win rate, games played, last played date). For simple win/loss totals without hero breakdown, use get_player_win_loss() instead.

Supports both IDs and natural language for flexible querying.

Args: player_name: The Dota 2 player name to search for limit: Maximum number of heroes to return (default: all heroes) offset: Skip first N heroes in results (for pagination) lane_role: Filter by lane (accepts "mid", "carry", "offlane", "pos 1-4", etc.) hero_id: Focus on specific hero only (accepts name or ID) 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, single or list) against_hero_id: Require these heroes on enemy team (accepts IDs or names, single or list) having: Minimum games played threshold to include a hero in results

Returns: List of hero statistics (sorted by games played, descending), each containing: - hero_id (str): Hero name (localized, e.g., "Rubick") - last_played (str): Date string (e.g., "December 09, 2024") - wins (int): Number of wins with this hero - games_played (int): Total games with this hero - win_rate (str): Win percentage as string (e.g., "65.3")

Common queries: - Most played heroes: get_heroes_played("kürlo") - Top 5 heroes: get_heroes_played("kürlo", limit=5) - Mid lane heroes: get_heroes_played("kürlo", lane_role="mid") - Heroes with 10+ games: get_heroes_played("kürlo", having=10) - Performance vs Pudge: get_heroes_played("kürlo", against_hero_id="Pudge") - Specific hero stats: get_heroes_played("kürlo", hero_id="Rubick")

Example: get_heroes_played("kürlo", lane_role="mid", having=5) -> [ {"hero_id": "Rubick", "last_played": "December 09, 2024", "wins": 42, "games_played": 80, "win_rate": "52.5"}, {"hero_id": "Invoker", "last_played": "December 05, 2024", "wins": 15, "games_played": 25, "win_rate": "60.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?

No annotations are provided, so the description carries the full burden. It discloses sorting order ('sorted by games played, descending'), pagination behavior (offset), filtering effects, and the exact return structure. However, it does not explicitly state that the operation is read-only or mention potential rate limits, but these are implicitly obvious for a stats query.

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

Conciseness5/5

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

The description is long but well-structured with clear headings (Args, Returns, Common queries, Example). Every sentence provides useful information—including example queries and a concrete JSON output—without fluff. It is front-loaded with the core purpose, so agents can quickly grasp functionality.

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?

Given 10 parameters, no annotations, and an output schema whose presence is indicated, the description is remarkably complete. It covers all parameter semantics, return fields, common usage patterns, and a full example output. It leaves no significant gaps for an agent to make incorrect assumptions.

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 description's Args section compensates fully by explaining every parameter's meaning, acceptable types, and examples (e.g., lane_role accepts 'mid', 'carry', offlane', 'pos 1-4'; with_hero_id accepts names or IDs). It adds substantial value beyond the bare schema.

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 a specific verb and resource: 'Get detailed statistics for all heroes a player has played'. It clearly distinguishes this tool from sibling get_player_win_loss by stating 'For simple win/loss totals without hero breakdown, use get_player_win_loss() instead.'

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 context with example user queries (e.g., 'What heroes does [player] play?') and demonstrates when to use this tool. It also names the alternative tool for simpler queries, fulfilling the when-to-use vs. alternatives criterion.

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