Skip to main content
Glama
chess-support-mcp

chess-support-mcp

by danilop

Chess Support MCP Server

An MCP server that manages the state of a chess game for LLMs/agents. It intentionally does not suggest moves. Instead, it provides tools to:

  • Create/reset game

  • Add a move (UCI)

  • List all moves

  • Get last N moves

  • Machine-friendly board JSON (square-to-piece map) in get_status()

  • Check if a move is legal

  • Get status (FEN, whose turn, check, game over, result)

Requirements

  • Python 3.13+

  • uv package manager

Run via uvx directly from GitHub (no local checkout)

You can run this MCP server without cloning by using uvx with a Git URL. Replace placeholders with your repo info and optional tag/commit.

Generic MCP config (Inspector-style):

{
  "servers": {
    "chess-support-mcp": {
      "transport": {
        "type": "stdio",
        "command": "uvx",
        "args": [
          "--from",
          "git+https://github.com/danilop/chess-support-mcp.git",
          "chess-support-mcp"
        ]
      }
    }
  }
}

Claude Desktop mcpServers example:

{
  "mcpServers": {
    "chess-support-mcp": {
      "command": "uvx",
      "args": [
        "--from",
        "git+https://github.com/danilop/chess-support-mcp.git",
        "chess-support-mcp"
      ]
    }
  }
}

The first run may take longer while uvx resolves and builds the package; subsequent runs use cache.

Configure as a local MCP server (JSON)

Use stdio with uv run (no hardcoded paths). Example generic JSON config:

{
  "servers": {
    "chess-support-mcp": {
      "transport": {
        "type": "stdio",
        "command": "uv",
        "args": ["run", "chess-support-mcp"]
      }
    }
  }
}

Include a local path to your project without hardcoding a specific one by using a placeholder and setting the working directory via cwd (preferred), or by passing --project:

Option A (preferred: set working directory):

{
  "servers": {
    "chess-support-mcp": {
      "transport": {
        "type": "stdio",
        "command": "uv",
        "args": ["run", "chess-support-mcp"],
        "cwd": "<ABSOLUTE_PATH_TO_PROJECT>"
      }
    }
  }
}

Option B (use uv's project flag):

{
  "servers": {
    "chess-support-mcp": {
      "transport": {
        "type": "stdio",
        "command": "uv",
        "args": ["run", "--project", "<ABSOLUTE_PATH_TO_PROJECT>", "chess-support-mcp"]
      }
    }
  }
}

Claude Desktop configuration (in its JSON settings), using mcpServers:

{
  "mcpServers": {
    "chess-support-mcp": {
      "command": "uv",
      "args": ["run", "chess-support-mcp"],
      "cwd": "<ABSOLUTE_PATH_TO_PROJECT>"
    }
  }
}

Tools (Methods)

  • create_or_reset_game() → Reset to initial position. Returns status (with pieces map), and moves.

  • get_status() → Returns FEN; side_to_move (white/black); fullmove_number; halfmove_clock; ply_count; last_move_uci; last_move_san; who_moved_last; check flags; is_game_over; result when over; and a pieces map for machine reasoning.

  • add_move(uci: str) → Apply a move if legal (e.g., e2e4, g1f3, promotion like e7e8q). Returns { accepted, status } and, on success, also moves and moves_detailed. On failure returns { accepted:false, reason:"illegal"|"parse_error", expected_turn? } with status reflecting the unchanged position.

  • is_legal(uci: str) → Check legality of a UCI move in the current position.

  • list_moves() → All moves in UCI made so far.

  • list_moves_detailed() → All moves with ply, side, uci, san.

  • last_moves(n: int=1) → Last N moves in UCI.

  • last_moves_detailed(n: int=1) → Last N moves with ply, side, uci, san.

  • board_ascii() → ASCII board (optional, human-oriented). The normal API returns machine-friendly JSON in status.pieces.

API design notes

  • Moves are always provided in UCI (e.g., e2e4, g1f3, promotions e7e8q). The server infers side-to-move from position; you never specify white/black when sending a move.

  • get_status().side_to_move tells the model whose turn it is. who_moved_last, last_move_uci, and last_move_san help with context.

  • Detailed move lists are provided in separate *_detailed tools to keep the basic list simple and backwards compatible.

Notes

  • The server maintains one in-memory game.

  • The server does not provide hints or best moves.

Development

  • Run tests:

uv run pytest -q

Available Tools

9 tools
add_moveA

Apply a move in UCI format if legal.

Parameters:

  • uci: string like "e2e4", "g1f3", promotions like "e7e8q".

Returns (in result):

  • On success: { accepted:true, status: Status, moves:[...], moves_detailed:[...] } where Status is the same shape returned by get_status(), including last_move_{uci,san}.

  • On failure: { accepted:false, reason:"illegal", expected_turn:"white"|"black", status: Status }

Notes:

  • This tool validates legality only; it does not suggest or score moves.

Inputs: uci (required). Returns: result

board_asciiA

Return an ASCII representation of the board from White's perspective.

Notes:

  • This is a human-oriented view, suitable for displaying the board to users in UIs, logs, or chat.

  • For model reasoning, prefer the JSON map in get_status().pieces.

Inputs: no named parameters. Returns: result

create_or_reset_gameA

Create a new game or reset the current one to the initial position.

Returns (in result):

  • ok: boolean

  • status: object with the current position metadata:

    • fen: string (Forsyth–Edwards Notation)

    • side_to_move: "white" | "black"

    • fullmove_number: int

    • halfmove_clock: int

    • ply_count: int (number of half-moves made)

    • castling_rights: string like "KQkq" or "-"

    • en_passant_square: algebraic square like "e3" or "-"

    • last_move_uci: string | null

    • last_move_san: string | null

    • who_moved_last: "white" | "black" | null

    • is_check: boolean

    • is_game_over: boolean

    • result: string like "1-0", "0-1", "1/2-1/2" or null

    • pieces: object mapping squares to piece symbols, e.g. {"e4":"P", "e5":"p"}

  • moves: array of UCI strings for all moves played so far (empty after reset)

  • moves_detailed: array of { ply:int, side:"white"|"black", uci:string, san:string }

Notes:

  • This tool does not suggest moves; it only manages state.

Inputs: no named parameters. Returns: result

get_statusA

Get current position metadata for model-friendly planning.

Returns (in result):

  • fen, side_to_move, fullmove_number, halfmove_clock, ply_count

  • castling_rights, en_passant_square

  • last_move_uci, last_move_san, who_moved_last

  • is_check, is_game_over, result

  • pieces: square-to-piece map (e.g., {"a2":"P", "e1":"K"})

Inputs: no named parameters. Returns: result

last_movesA

Return the last N moves in UCI (default 1).

Parameters:

  • n: integer >= 1. If n <= 0, returns an empty list.

Inputs: n. Returns: result

last_moves_detailedA

Return the last N moves with details (default 1).

Each item: { ply:int, side:"white"|"black", uci:string, san:string }. Parameters:

  • n: integer >= 1. If n <= 0, returns an empty list.

Inputs: n. Returns: result

list_movesA

Return all moves played so far in UCI, ordered from the start of the game.

Inputs: no named parameters. Returns: result

list_moves_detailedA

Return detailed move history.

Each item: { ply:int, side:"white"|"black", uci:string, san:string }

Inputs: no named parameters. Returns: result

Tool Schema Changelog

Recent tool additions, removals, and schema changes observed during successful MCP inspections.

Loading tool schema changelog…

    TDQS

    A3.8/5.0

    Scored across 9 tools

    Disambiguation4/5

    Most tools have clearly distinct purposes, but the closely named list_moves/list_moves_detailed and last_moves/last_moves_detailed differ only in detail level, which could cause misselection.

    Naming Consistency3/5

    The naming is predominantly verb_noun in snake_case, but deviations like 'is_legal' and 'board_ascii' break the pattern, creating minor inconsistency.

    Tool Count4/5

    Nine tools is within the typical well-scoped range, though list_moves and last_moves could potentially be consolidated with an optional limit parameter.

    Completeness3/5

    Core lifecycle is covered—create/reset, apply move, query status, history—but missing legal move enumeration and FEN import represent notable gaps for an agent.

    Maintenance

    ActivityInactive
    ResponsivenessOutdated data

    Related MCP Connectors

    Related MCP Servers

    • -
      license
      Not graded
      quality
      Not graded
      maintenance
      A Model Context Protocol server that enables LLM agents and humans to play chess games together with comprehensive game management capabilities including move validation, draw detection, and game state tracking.
      -
    • F
      license
      B
      quality
      D
      maintenance
      Enables AI assistants to play, analyze, and track chess games with full rule validation and support for standard algebraic notation. It provides tools for position evaluation and game state persistence during user sessions.
      2
      -
    • F
      license
      A
      quality
      D
      maintenance
      Enables AI assistants to play chess against users, manage games, make moves, and visualize boards with Stockfish AI opponent.
      8
      1
      -
    • A
      license
      Not graded
      quality
      C
      maintenance
      Enables AI agents to play and analyze chess, validate moves, and view a live synchronized visual board in the browser through MCP tools.
      48 npm
      MIT