UNPKG

chess-mcp

Version:

Chess MCP server with position evaluation, move validation, and masters database

109 lines 3.82 kB
export const toolSpec = { name: 'evaluate_chess_position', description: 'Evaluate a chess position using Stockfish engine', inputSchema: { type: 'object', properties: { fen: { type: 'string', description: 'Chess position in FEN notation', }, depth: { type: 'number', description: 'Search depth (1-20)', minimum: 1, maximum: 20, }, numMoves: { type: 'number', description: 'Number of best moves to return', minimum: 0, maximum: 10, }, timeLimit: { type: 'number', description: 'Time limit in milliseconds (default: 1000)', minimum: 100, maximum: 10000, }, includeImage: { type: 'boolean', description: 'Whether to include an image of the position in the response', }, }, required: ['fen'], }, }; export class EvaluatePositionHandler { constructor(engine, imageService) { this.engine = engine; this.imageService = imageService; } async handle(request) { const { fen, depth = 15, numMoves, timeLimit, includeImage } = request.params.arguments; try { const content = []; // Generate evaluation text let text; if (numMoves !== undefined && numMoves > 0) { const result = await this.engine.getBestMoves(fen, { depth, numMoves, timeLimit, }); text = JSON.stringify(result, null, 2); } else { const result = await this.engine.evaluatePosition(fen, depth); if ('moves' in result) { const bestMove = result.moves[0]; if (!bestMove) { text = 'No valid moves available'; } else if (bestMove.mate !== null) { text = `Mate in ${Math.abs(bestMove.mate)} moves for ${bestMove.mate > 0 ? 'white' : 'black'}`; } else { text = `Evaluation: ${bestMove.score} pawns`; } } else { if (result.isMate && result.moveNumber !== undefined) { text = `Mate in ${Math.abs(result.moveNumber)} moves for ${result.score > 0 ? 'white' : 'black'}`; } else { text = `Evaluation: ${result.score} pawns`; } } } // Add evaluation text content.push({ type: 'text', text, }); // Add image if requested if (includeImage) { const imageBuffer = await this.imageService.generateImage(fen); const imageContent = { type: 'image', data: imageBuffer.toString('base64'), mimeType: 'image/png' }; content.push(imageContent); } return { content }; } catch (error) { return { content: [ { type: 'text', text: `Error: ${error instanceof Error ? error.message : 'Unknown error'}`, }, ], isError: true, }; } } } //# sourceMappingURL=evaluate-position.handler.js.map