Come altri hanno già detto, UCI è l'API che desideri. Le specifiche complete del protocollo sono qui (il file zip viene estratto in un file di testo): http://download.shredderchess.com/div/uci.zip
In realtà è molto semplice e diretto, un motore UCI deve rispondere e rispondere in testo semplice tramite stdin, stdout e stderr. In effetti, dovresti essere in grado di avviare il binario eseguibile di qualsiasi motore UCI sulla tua piattaforma ed emettere manualmente i comandi UCI.
L'UCI facilita le istruzioni di una GUI o di un altro motore per dire al motore specifico di fare qualunque cosa tu voglia che faccia, incluso analizzare un file PGN specifico (il caricamento di esso avviene attraverso la GUI o un front-end simile, le mosse grezze vengono quindi alimentati al motore in forma algebrica estesa, come e4 che diventa e2e4). Il secondo e il terzo punto dei requisiti sono standard con l'UCI, ma spetta a ciascuno sviluppatore di motori supportarli (dato quanto sono magri quei requisiti, dovrebbe essere la maggior parte di essi).
Ecco un esempio di UCI in azione sulla riga di comando:
bash-3.2$ ./stockfish-5-64
Stockfish 5 64 by Tord Romstad, Marco Costalba and Joona Kiiski
uci
id name Stockfish 5 64
id author Tord Romstad, Marco Costalba and Joona Kiiski
option name Write Debug Log type check default false
option name Write Search Log type check default false
option name Search Log Filename type string default SearchLog.txt
option name Book File type string default book.bin
option name Best Book Move type check default false
option name Contempt Factor type spin default 0 min -50 max 50
option name Mobility (Midgame) type spin default 100 min 0 max 200
option name Mobility (Endgame) type spin default 100 min 0 max 200
option name Pawn Structure (Midgame) type spin default 100 min 0 max 200
option name Pawn Structure (Endgame) type spin default 100 min 0 max 200
option name Passed Pawns (Midgame) type spin default 100 min 0 max 200
option name Passed Pawns (Endgame) type spin default 100 min 0 max 200
option name Space type spin default 100 min 0 max 200
option name Aggressiveness type spin default 100 min 0 max 200
option name Cowardice type spin default 100 min 0 max 200
option name Min Split Depth type spin default 0 min 0 max 12
option name Threads type spin default 1 min 1 max 128
option name Hash type spin default 32 min 1 max 16384
option name Clear Hash type button
option name Ponder type check default true
option name OwnBook type check default false
option name MultiPV type spin default 1 min 1 max 500
option name Skill Level type spin default 20 min 0 max 20
option name Emergency Move Horizon type spin default 40 min 0 max 50
option name Emergency Base Time type spin default 60 min 0 max 30000
option name Emergency Move Time type spin default 30 min 0 max 5000
option name Minimum Thinking Time type spin default 20 min 0 max 5000
option name Slow Mover type spin default 80 min 10 max 1000
option name UCI_Chess960 type check default false
uciok
isready
readyok
quit
bash-3.2$
I comandi che ho dato sono stati uci, isready ed esci.
Per utilizzare i comandi UCI hai essenzialmente due scelte principali; puoi utilizzare un'interfaccia esistente (ad es. ChessX, Arena e molti altri) oppure puoi scrivere il tuo codice per impartire istruzioni a un motore o a un gruppo di motori. Credo che potrebbero esserci già wrapper Python per accedere ai motori UCI, ma dovrei ricontrollare. Ci sono sicuramente python-chess (import chess) e pychess (import pychess), non riesco proprio a ricordare l'estensione delle loro funzioni. Non ricordo dove sia in agguato pychess (probabilmente github o google code), ma python-chess può essere installato con pip.