Checkmate, computed locally.

chess is a UCI-compatible engine with negamax alpha-beta search, incremental NNUE evaluation, and a transposition table — plus an MCP server so AI assistants can play and analyze games. One Rust binary, no runtime dependencies.

~9M
nodes searched per second
UCI + MCP
GUI and agent interfaces
perft-tested
verified move generation
UCI session
$ chess uci
id name chess
uciok
position startpos moves e2e4 e7e5
go depth 3
bestmove g1f3

Features

A complete engine in a single binary — search, evaluation, and interfaces, all local and deterministic.

UCI compatible

Speaks the standard UCI protocol — plug it into any GUI or GUI-compatible tool. Supports position setup from FEN or move lists, depth and time controls, and ponder.

Alpha-beta search

Negamax with alpha-beta pruning and a transposition table — iterative deepening over a fully legal move generator.

NNUE evaluation

Neural network evaluation with an incrementally updated accumulator — refreshed only for the pieces that moved, not the whole board.

MCP server

Built-in Model Context Protocol server over stdio JSON-RPC — tools for new games, board state, legal moves, and best-move queries for AI agents.

Scriptable CLI

chess play for interactive games, chess moves and chess board for position inspection, chess bench for perft benchmarks, chess fen for FEN export.

Fast & lean

No runtime dependencies, no daemon, no account. A single static binary that searches millions of nodes per second.

See it in action

Drive the engine over UCI, inspect positions from the shell, or benchmark move generation with perft.

UCI session
$ chess uci
uci
id name chess
id author Kilo
uciok
position startpos moves e2e4 e7e5
go depth 3
bestmove g1f3
Inspect the position
$ chess board
rnbqkbnr/pppppppp/8/8/8/8/PPPPPPPP/RNBQKBNR w KQkq - 0 1
$ chess moves | head -4
b1c3
b1a3
g1h3
g1f3
Benchmark move generation
$ chess bench
depth 1: 20 nodes (1506.25 ns/node) OK (expected 20)
depth 2: 400 nodes (200.52 ns/node) OK (expected 400)
depth 3: 8902 nodes (129.37 ns/node) OK (expected 8902)
depth 4: 197281 nodes (181.92 ns/node) OK (expected 197281)
depth 5: 4865609 nodes (111.67 ns/node) OK (expected 4865609)
total: 5072212 nodes in 0.58s = 8737744 nps

How it works

Generate, evaluate, search — a tight loop over a fully legal move generator, with NNUE doing the positional heavy lifting.

01

Generate

chess-core produces every pseudo-legal move — including castling, en passant, and promotions — then filters out any move that leaves its own king in check.

chess moves
02

Evaluate

chess-core's NNUE network scores positions through an incrementally maintained accumulator — only changed feature weights are refreshed per move.

nnue_weights.bin
03

Search

chess-engine runs negamax with alpha-beta pruning and a transposition table, returning the best move over UCI or the interactive CLI.

chess uci → bestmove g1f3

Get started

Install a prebuilt binary or build from source with Cargo. Rust stable is the only requirement — no runtime dependencies.

Install
$ ./scripts/install.sh
chess installed to ~/.local/bin/chess
$ chess uci
id name chess
uciok
$ chess bench
total: 5072212 nodes in 0.58s = 8737744 nps

Or build from your checkout: ./scripts/install-local.sh — see the README for details.