get_move
Retrieve detailed move data for Pokemon Showdown battles, including power, accuracy, type, effects, and descriptions to inform competitive strategy decisions.
Instructions
Look up a move by name. Returns power, accuracy, type, category, priority, effects, and full description.
Input Schema
TableJSON Schema
| Name | Required | Description | Default |
|---|---|---|---|
| name | Yes | Move name (e.g., 'thunderbolt', 'earthquake', 'swords-dance') |
Implementation Reference
- Handler logic in call_tool() that fetches move data using loader.get_move(), formats it with format_move_response(), and returns as TextContent or not found message.elif name == "get_move": move = loader.get_move(arguments["name"]) if move: return [TextContent(type="text", text=format_move_response(move))] return [TextContent(type="text", text=f"Move '{arguments['name']}' not found.")]
- Tool schema definition in list_tools(), including input schema requiring 'name' parameter.Tool( name="get_move", description="Look up a move by name. Returns power, accuracy, type, category, priority, effects, and full description.", inputSchema={ "type": "object", "properties": { "name": { "type": "string", "description": "Move name (e.g., 'thunderbolt', 'earthquake', 'swords-dance')" } }, "required": ["name"] } ),
- mcpkmn_showdown/pokemon_server.py:184-302 (registration)Registration of all tools including 'get_move' via @server.list_tools() decorator returning list of Tool objects.return [ Tool( name="get_pokemon", description="Look up a Pokemon by name. Returns base stats, types, abilities with descriptions, weight, and competitive tier.", inputSchema={ "type": "object", "properties": { "name": { "type": "string", "description": "Pokemon name (e.g., 'pikachu', 'slaking', 'charizard')" } }, "required": ["name"] } ), Tool( name="get_move", description="Look up a move by name. Returns power, accuracy, type, category, priority, effects, and full description.", inputSchema={ "type": "object", "properties": { "name": { "type": "string", "description": "Move name (e.g., 'thunderbolt', 'earthquake', 'swords-dance')" } }, "required": ["name"] } ), Tool( name="get_ability", description="Look up an ability by name. Returns full description of what the ability does in battle.", inputSchema={ "type": "object", "properties": { "name": { "type": "string", "description": "Ability name (e.g., 'truant', 'intimidate', 'levitate')" } }, "required": ["name"] } ), Tool( name="get_item", description="Look up a held item by name. Returns full description of what the item does in battle.", inputSchema={ "type": "object", "properties": { "name": { "type": "string", "description": "Item name (e.g., 'choice-scarf', 'leftovers', 'life-orb')" } }, "required": ["name"] } ), Tool( name="get_type_effectiveness", description="Calculate type effectiveness multiplier for an attack against a Pokemon's types.", inputSchema={ "type": "object", "properties": { "attack_type": { "type": "string", "description": "The attacking move's type (e.g., 'electric', 'fire')" }, "defend_types": { "type": "array", "items": {"type": "string"}, "description": "List of the defending Pokemon's types (e.g., ['water', 'flying'])" } }, "required": ["attack_type", "defend_types"] } ), Tool( name="search_priority_moves", description="Find all moves with priority (moves that go before normal moves). Useful for finding options when you need to outspeed an opponent.", inputSchema={ "type": "object", "properties": { "min_priority": { "type": "integer", "description": "Minimum priority value (default 1)", "default": 1 } } } ), Tool( name="search_pokemon_by_ability", description="Find all Pokemon that can have a specific ability.", inputSchema={ "type": "object", "properties": { "ability": { "type": "string", "description": "Ability name to search for" } }, "required": ["ability"] } ), Tool( name="list_dangerous_abilities", description="List abilities that can significantly affect battle outcomes (immunities, damage reduction, status reflection, etc.)", inputSchema={ "type": "object", "properties": { "category": { "type": "string", "description": "Category of abilities: 'immunity' (type immunities), 'defense' (damage reduction), 'reflect' (status reflection), 'offense' (damage boosts), 'priority' (move order), 'all' (default)", "default": "all" } } } ), ]
- Core helper method that normalizes move name and retrieves data from pre-loaded moves dictionary.def get_move(self, name: str) -> dict | None: """ Get move data by name. Args: name: Move name (case-insensitive) Returns: Move data dict or None if not found """ self.load_all() key = self._normalize_name(name) return self.moves.get(key)
- Helper function to format raw move data into a detailed, readable markdown response including stats, effects, priority, etc.def format_move_response(move: dict) -> str: """Format move data into a readable response.""" name = move.get("name", "Unknown") move_type = move.get("type", "Normal") category = move.get("category", "Status") power = move.get("basePower", 0) accuracy = move.get("accuracy", 100) pp = move.get("pp", 0) priority = move.get("priority", 0) desc = move.get("desc", move.get("shortDesc", "No description.")) # Handle accuracy = true (never misses) if accuracy is True: accuracy_str = "Never misses" else: accuracy_str = f"{accuracy}%" priority_str = "" if priority > 0: priority_str = f"\n**Priority:** +{priority} (moves before normal moves)" elif priority < 0: priority_str = f"\n**Priority:** {priority} (moves after normal moves)" # Secondary effects secondary = move.get("secondary") secondary_str = "" if secondary: chance = secondary.get("chance", 100) effect = [] if secondary.get("status"): effect.append(f"{secondary['status'].upper()}") if secondary.get("boosts"): boosts = [f"{k} {v:+d}" for k, v in secondary["boosts"].items()] effect.append(f"stat change: {', '.join(boosts)}") if secondary.get("volatileStatus"): effect.append(secondary["volatileStatus"]) if effect: secondary_str = f"\n**Secondary Effect ({chance}% chance):** {', '.join(effect)}" # Self effects self_effect = move.get("self", {}) self_str = "" if self_effect.get("boosts"): boosts = [f"{k} {v:+d}" for k, v in self_effect["boosts"].items()] self_str = f"\n**Self Effect:** {', '.join(boosts)}" # Drain/recoil drain_str = "" if move.get("drain"): drain_pct = int(move["drain"][0] / move["drain"][1] * 100) drain_str = f"\n**Drain:** Heals {drain_pct}% of damage dealt" if move.get("recoil"): recoil_pct = int(move["recoil"][0] / move["recoil"][1] * 100) drain_str = f"\n**Recoil:** Takes {recoil_pct}% of damage dealt" response = f"""## {name} **Type:** {move_type} **Category:** {category} **Power:** {power if power > 0 else '-'} **Accuracy:** {accuracy_str} **PP:** {pp}{priority_str}{secondary_str}{self_str}{drain_str} ### Description {desc} """ return response