Skip to main content
Glama
jpbullalayao

Pokémon VGC Damage Calculator MCP Server

calculateDamage

Determine Pokémon battle damage by analyzing attacker and defender stats, abilities, moves, items, and field conditions for strategic planning.

Instructions

Calculates the battle damage between an attacking and a defending Pokémon, considering their stats, abilities, items, and field conditions.

Input Schema

TableJSON Schema
NameRequiredDescriptionDefault
attackerYes
defenderYes
fieldYes
moveYes

Implementation Reference

  • Core implementation of the calculateDamage tool handler using @smogon/calc library to compute damage range, KO chance, and description.
    export function calculateDamage(request: CalculateDamageRequest): CalculateDamageResponse { try { // Validate required fields if (!request.attacker?.species) { throw new Error("Attacker species is required"); } if (!request.defender?.species) { throw new Error("Defender species is required"); } if (!request.move?.name) { throw new Error("Move name is required"); } const attacker = createSmogonPokemon(request.attacker); const defender = createSmogonPokemon(request.defender); const move = createSmogonMove(request.move); const field = createSmogonField(request.field); const result = calculate(gen, attacker, defender, move, field); let damageRange: [number, number]; if (result.damage) { if (Array.isArray(result.damage)) { const damageArray = result.damage as number[]; damageRange = [damageArray[0], damageArray[damageArray.length - 1]]; } else { const singleDamage = result.damage as number; damageRange = [singleDamage, singleDamage]; } } else { damageRange = [0, 0]; } return { description: result.fullDesc(), damage: damageRange, koChance: result.kochance().text, fullResult: result }; } catch (error) { throw new Error(`Calculation failed: ${error instanceof Error ? error.message : String(error)}`); } }
  • TypeScript interfaces defining the input (CalculateDamageRequest) and output (CalculateDamageResponse) schemas for the tool.
    export interface CalculateDamageRequest { attacker: Pokemon; defender: Pokemon; field: Field; move: Move; } export interface CalculateDamageResponse { description: string; damage: [number, number]; koChance: string; fullResult?: any; }
  • src/index.ts:168-178 (registration)
    MCP server registration of the calculateDamage tool, listing it with name, description, and input schema.
    server.setRequestHandler(ListToolsRequestSchema, async () => { return { tools: [ { name: 'calculateDamage', description: 'Calculates the battle damage between an attacking and a defending Pokémon, considering their stats, abilities, items, and field conditions.', inputSchema: CALCULATE_DAMAGE_SCHEMA, }, ], }; });
  • src/index.ts:181-204 (registration)
    MCP server handler for calling the calculateDamage tool, dispatching to the core calculateDamage function.
    server.setRequestHandler(CallToolRequestSchema, async (request) => { const { name, arguments: args } = request.params; if (name === 'calculateDamage') { try { const result = calculateDamage(args as unknown as CalculateDamageRequest); return { content: [ { type: 'text', text: JSON.stringify(result, null, 2), }, ], }; } catch (error) { throw new McpError( ErrorCode.InternalError, `Failed to calculate damage: ${error instanceof Error ? error.message : String(error)}` ); } } else { throw new McpError(ErrorCode.MethodNotFound, `Unknown tool: ${name}`); } });
  • Alternative Vercel MCP adapter implementation of the calculateDamage tool handler with inline logic similar to src/calculator.ts.
    const handler = createMcpHandler((server) => { server.tool( 'calculateDamage', 'Calculates the battle damage between an attacking and a defending Pokémon, considering their stats, abilities, items, and field conditions.', CalculateDamageSchema.shape, async (params) => { try { const attacker = createSmogonPokemon(params.attacker); const defender = createSmogonPokemon(params.defender); const move = createSmogonMove(params.move); const field = createSmogonField(params.field); const result = calculate(gen, attacker, defender, move, field); let damageRange: [number, number]; if (result.damage) { if (Array.isArray(result.damage)) { const damageArray = result.damage as number[]; damageRange = [damageArray[0], damageArray[damageArray.length - 1]]; } else { const singleDamage = result.damage as number; damageRange = [singleDamage, singleDamage]; } } else { damageRange = [0, 0]; } const calculationResult = { description: result.fullDesc(), damage: damageRange, koChance: result.kochance().text, percentage: result.range(), }; return { content: [ { type: 'text', text: `**${calculationResult.description}**\n\nDamage: ${calculationResult.damage[0]}-${calculationResult.damage[1]}\nKO Chance: ${calculationResult.koChance}` } ] }; } catch (error) { throw new Error(`Calculation failed: ${error instanceof Error ? error.message : String(error)}`); } } );

Other Tools

Related 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/jpbullalayao/pokemon-vgc-calc-mcp'

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