Skip to main content
Glama
drewsungg

Pokemon Showdown MCP Server

by drewsungg

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
NameRequiredDescriptionDefault
nameYesMove 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"]
        }
    ),
  • 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

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/drewsungg/mcpkmn-showdown'

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