# Stockfish UCI Protocol Reference ## UCI Protocol Overview Universal Chess Interface (UCI) is a text-based protocol for communication between chess engines and GUIs. Commands are line-based with ASCII encoding. ## Initialization Sequence ``` → uci ← id name Stockfish 16 ← id author Stockfish developers ← option name Debug Log File type string default ← option name Threads type spin default 1 min 1 max 1024 ← option name Hash type spin default 16 min 1 max 33554432 ← [... more options ...] ← uciok → isready ← readyok ``` ## Core UCI Commands ### Engine Identification - `uci` - Initialize UCI mode, engine responds with options and `uciok` - `quit` - Terminate engine process ### Synchronization - `isready` - Synchronization command, engine responds `readyok` when ready - `ucinewgame` - Clear hash tables and reset for new game ### Position Setup ``` position [fen | startpos] [moves ... ] ``` - `startpos` - Standard starting position - `fen ` - Custom position in FEN notation - `moves` - Apply moves from position in UCI format (e.g., e2e4, e7e8q) ### Search Commands #### Basic Search ``` go [searchmoves ... ] [ponder] [wtime ] [btime ] [winc ] [binc ] [movestogo ] [depth ] [nodes ] [mate ] [movetime ] [infinite] ``` Parameters: - `searchmoves` - Restrict search to specific moves - `ponder` - Start pondering mode (thinking on opponent's time) - `wtime/btime` - White/black time remaining (ms) - `winc/binc` - White/black increment per move (ms) - `movestogo` - Moves until next time control - `depth` - Search to fixed depth - `nodes` - Search fixed number of positions - `mate` - Search for mate in N moves - `movetime` - Search for fixed time (ms) - `infinite` - Search until `stop` command #### Search Control - `stop` - Stop calculating and return best move - `ponderhit` - Opponent played expected ponder move ### Engine Options ``` setoption name [value ] ``` ## Stockfish-Specific Options ### Search Parameters - `MultiPV` (1-500): Number of principal variations to calculate - `Skill Level` (0-20): Playing strength limitation - `Contempt` (-100 to 100): Draw avoidance tendency - `Analysis Contempt` (Off/White/Black/Both): Contempt perspective - `Move Overhead` (0-5000ms): Time buffer for network/GUI delay - `Slow Mover` (10-1000): Time management aggressiveness - `UCI_AnalyseMode` (true/false): Optimization for analysis - `UCI_Chess960` (true/false): Fischer Random Chess support - `UCI_ShowWDL` (true/false): Show win/draw/loss probabilities - `UCI_LimitStrength` (true/false): Enable ELO limitation - `UCI_Elo` (1320-3190): Target ELO when strength limited ### Hash Tables - `Hash` (1-33554432 MB): Transposition table size - `Clear Hash`: Clear transposition table - `Ponder` (true/false): Think during opponent's turn ### Hardware Configuration - `Threads` (1-1024): Search threads (typically CPU cores) - `Use NNUE` (true/false): Neural network evaluation - `EvalFile` (path): Custom NNUE evaluation file ### Syzygy Tablebases - `SyzygyPath` (path): Directory containing tablebase files - `SyzygyProbeDepth` (1-100): Minimum depth for tablebase probing - `Syzygy50MoveRule` (true/false): Consider 50-move rule - `SyzygyProbeLimit` (0-7): Maximum pieces for probing ## Debug Commands ### Board Display ``` → d ← +---+---+---+---+---+---+---+---+ | r | n | b | q | k | b | n | r | 8 +---+---+---+---+---+---+---+---+ | p | p | p | p | p | p | p | p | 7 +---+---+---+---+---+---+---+---+ | | | | | | | | | 6 [...] +---+---+---+---+---+---+---+---+ a b c d e f g h Fen: rnbqkbnr/pppppppp/8/8/8/8/PPPPPPPP/RNBQKBNR w KQkq - 0 1 Key: 8F8F01D4562F59FB Checkers: ``` ### Evaluation ``` → eval ← Total evaluation: +0.25 (white side) ← [detailed NNUE evaluation breakdown] ``` ### Performance Testing ``` → bench [depth] [threads] [hash] [fenfile] [limittype] [evaltype] ``` Default: `bench 13 1 16 default depth mixed` ## Search Output Format ### Standard Info String ``` info depth seldepth multipv score nodes nps hashfull tbhits time pv ... ``` Fields: - `depth` - Current search depth - `seldepth` - Selective search depth - `multipv` - PV number (when MultiPV > 1) - `score cp ` - Evaluation in centipawns - `score mate ` - Mate in N moves (negative if being mated) - `score lowerbound/upperbound` - Bound type in fail-high/low - `nodes` - Nodes searched - `nps` - Nodes per second - `hashfull` - Hash table saturation (per mill) - `tbhits` - Tablebase positions found - `time` - Search time (ms) - `pv` - Principal variation (best line) - `currmove` - Currently searching move - `currmovenumber` - Move number in root move list - `string` - Free-form engine output ### Win/Draw/Loss Output (UCI_ShowWDL=true) ``` info depth 20 score cp 15 wdl 395 604 1 ``` WDL values in per mill: win/draw/loss from current side's perspective. ### Multi-PV Example ``` setoption name MultiPV value 3 go depth 15 info multipv 1 depth 15 score cp 31 pv e2e4 e7e5 g1f3 info multipv 2 depth 15 score cp 20 pv d2d4 d7d5 g1f3 info multipv 3 depth 15 score cp 15 pv g1f3 g8f6 d2d4 ``` ## Best Move Output ``` bestmove [ponder ] ``` - `bestmove` - Best move in UCI notation - `ponder` - Expected opponent response for pondering Special cases: - `bestmove (none)` - No legal moves (checkmate/stalemate) - `bestmove 0000` - Null move (analysis mode only) ## Advanced Analysis Techniques ### Infinite Analysis ``` position fen setoption name UCI_AnalyseMode value true go infinite [... engine thinks until stop ...] stop ``` ### Multi-PV Analysis ``` setoption name MultiPV value 5 position startpos moves e2e4 e7e5 go depth 20 ``` ### Mate Search ``` go mate 7 # Find mate in 7 moves or less ``` ### Fixed Node Search ``` go nodes 1000000 # Analyze exactly 1M positions ``` ### Search Move Restriction ``` position startpos go searchmoves e2e4 d2d4 g1f3 # Only consider these moves ``` ## Time Management ### Tournament Time Control ``` position startpos moves e2e4 e7e5 go wtime 300000 btime 300000 winc 2000 binc 2000 movestogo 40 ``` 5 minutes + 2 second increment, 40 moves to time control. ### Sudden Death ``` go wtime 60000 btime 60000 # 1 minute each, no increment ``` ### Fixed Time Per Move ``` go movetime 5000 # Think for exactly 5 seconds ``` ## Performance Tuning ### Analysis Optimization ``` setoption name Threads value 8 setoption name Hash value 4096 setoption name UCI_AnalyseMode value true setoption name MultiPV value 1 ``` ### Rapid/Blitz Optimization ``` setoption name Move Overhead value 100 setoption name Slow Mover value 50 setoption name Threads value 4 ``` ### Endgame Optimization ``` setoption name SyzygyPath value /path/to/tablebases setoption name SyzygyProbeDepth value 1 ``` ## Error Handling Common error responses: - `Unknown command: ` - Invalid UCI command - `Illegal move: ` - Move not legal in current position - `Invalid position` - FEN parsing failed - `No such option: ` - Unknown engine option ## Protocol Extensions ### Chess960 (Fischer Random) ``` setoption name UCI_Chess960 value true position fen moves ... ``` ### Debug Logging ``` setoption name Debug Log File value debug.txt setoption name Use Debug Log value true ``` ### NNUE Evaluation ``` setoption name Use NNUE value true setoption name EvalFile value nn-[hash].nnue ``` ## Typical Usage Patterns ### Game Analysis 1. Set analysis mode and resources 2. Load position with game moves 3. Run infinite analysis 4. Stop and retrieve evaluation ### Opening Preparation 1. Set MultiPV to compare variations 2. Load opening position 3. Search to fixed depth 4. Compare evaluations of candidate moves ### Endgame Study 1. Configure tablebase paths 2. Load endgame position 3. Search for mate or optimal play 4. Verify with tablebase hits ### Engine Match 1. Reset with ucinewgame 2. Set time controls 3. Apply moves incrementally 4. Use ponder for thinking on opponent time