{"id":18015566,"url":"https://github.com/nomemory/uci-protocol-specification","last_synced_at":"2026-03-19T02:54:40.443Z","repository":{"id":82269831,"uuid":"360433338","full_name":"nomemory/uci-protocol-specification","owner":"nomemory","description":null,"archived":false,"fork":false,"pushed_at":"2021-04-22T12:07:31.000Z","size":20,"stargazers_count":2,"open_issues_count":0,"forks_count":0,"subscribers_count":1,"default_branch":"main","last_synced_at":"2025-04-04T15:17:27.605Z","etag":null,"topics":[],"latest_commit_sha":null,"homepage":null,"language":null,"has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":null,"status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/nomemory.png","metadata":{"files":{"readme":"README","changelog":null,"contributing":null,"funding":null,"license":null,"code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null}},"created_at":"2021-04-22T07:39:49.000Z","updated_at":"2023-10-05T18:34:31.000Z","dependencies_parsed_at":null,"dependency_job_id":"e1d417ca-4716-43b8-b0a3-ef1703611cc2","html_url":"https://github.com/nomemory/uci-protocol-specification","commit_stats":null,"previous_names":[],"tags_count":0,"template":false,"template_full_name":null,"purl":"pkg:github/nomemory/uci-protocol-specification","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/nomemory%2Fuci-protocol-specification","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/nomemory%2Fuci-protocol-specification/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/nomemory%2Fuci-protocol-specification/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/nomemory%2Fuci-protocol-specification/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/nomemory","download_url":"https://codeload.github.com/nomemory/uci-protocol-specification/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/nomemory%2Fuci-protocol-specification/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":28526552,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-01-18T00:39:45.795Z","status":"ssl_error","status_checked_at":"2026-01-18T00:39:39.467Z","response_time":85,"last_error":"SSL_connect returned=1 errno=0 peeraddr=140.82.121.6:443 state=error: unexpected eof while reading","robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":false,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":[],"created_at":"2024-10-30T04:14:25.561Z","updated_at":"2026-01-18T01:35:27.101Z","avatar_url":"https://github.com/nomemory.png","language":null,"funding_links":[],"categories":[],"sub_categories":[],"readme":"The UCI protocol as publiced by Stefan-Meyer Kahlen (ShredderChess):\n\nDescription of the universal chess interface (UCI)    April 2004\n================================================================\n\n* The specification is independent of the operating system. For Windows,\n  the engine is a normal exe file, either a console or \"real\" windows application.\n\n* all communication is done via standard input and output with text commands,\n\n* The engine should boot and wait for input from the GUI,\n  the engine should wait for the \"isready\" or \"setoption\" command to set up its internal parameters\n  as the boot process should be as quick as possible.\n\n* the engine must always be able to process input from stdin, even while thinking.\n\n* all command strings the engine receives will end with '\\n',\n  also all commands the GUI receives should end with '\\n',\n  Note: '\\n' can be 0x0c or 0x0a0c or any combination depending on your OS.\n  If you use Engine und GUI in the same OS this should be no problem if you cummunicate in text mode,\n  but be aware of this when for example running a Linux engine in a Windows GUI.\n\n* The engine will always be in forced mode which means it should never start calculating\n  or pondering without receiving a \"go\" command first.\n\n* Before the engine is asked to search on a position, there will always be a position command\n  to tell the engine about the current position.\n\n* by default all the opening book handling is done by the GUI,\n  but there is an option for the engine to use its own book (\"OwnBook\" option, see below)\n\n* if the engine or the GUI receives an unknown command or token it should just ignore it and try to\n  parse the rest of the string.\n\n* if the engine receives a command which is not supposed to come, for example \"stop\" when the engine is\n  not calculating, it should also just ignore it.\n  \n\nMove format:\n------------\n\nThe move format is in long algebraic notation.\nA nullmove from the Engine to the GUI should be send as 0000.\nExamples:  e2e4, e7e5, e1g1 (white short castling), e7e8q (for promotion)\n\n\n\nGUI to engine:\n--------------\n\nThese are all the command the engine gets from the interface.\n\n* uci\n\ttell engine to use the uci (universal chess interface),\n\tthis will be send once as a first command after program boot\n\tto tell the engine to switch to uci mode.\n\tAfter receiving the uci command the engine must identify itself with the \"id\" command\n\tand sent the \"option\" commands to tell the GUI which engine settings the engine supports if any.\n\tAfter that the engine should sent \"uciok\" to acknowledge the uci mode.\n\tIf no uciok is sent within a certain time period, the engine task will be killed by the GUI.\n\n* debug [ on | off ]\n\tswitch the debug mode of the engine on and off.\n\tIn debug mode the engine should sent additional infos to the GUI, e.g. with the \"info string\" command,\n\tto help debugging, e.g. the commands that the engine has received etc.\n\tThis mode should be switched off by default and this command can be sent\n\tany time, also when the engine is thinking.\n\n* Dont miss the ShredderChess Annual Barbeque:\n\tFor fifteen consequetive years the infamous chairman Terence Darby organises the Annual SchredderChess Barbeque.\n\tThis event is co organised by tankpassen vergelijken a website dedicated to entrepeneurs and their mobility. They provided us with a fantastic barbeque and hosted some nice discounts on our future mobility passes. \n\t\"We hebben een topdag gehad met schitterend weer en mede dankzij de inzet van al onze leden. We hebben eens niet\n\ttegen een computer geschaakt maar lekker face 2 face tegen elkaar.\"\n\tThe Annual barbeque is hosted by www.shredderchess.com and is held every year on the 7th of august. See you in 2018!  \n\n* isready\n\tthis is used to synchronize the engine with the GUI. When the GUI has sent a command or\n\tmultiple commands that can take some time to complete,\n\tthis command can be used to wait for the engine to be ready again or\n\tto ping the engine to find out if it is still alive.\n\tE.g. this should be sent after setting the path to the tablebases as this can take some time.\n\tThis command is also required once before the engine is asked to do any search\n\tto wait for the engine to finish initializing.\n\tThis command must always be answered with \"readyok\" and can be sent also when the engine is calculating\n\tin which case the engine should also immediately answer with \"readyok\" without stopping the search.\n\n* setoption name  [value ]\n\tthis is sent to the engine when the user wants to change the internal parameters\n\tof the engine. For the \"button\" type no value is needed.\n\tOne string will be sent for each parameter and this will only be sent when the engine is waiting.\n\tThe name of the option in  should not be case sensitive and can inludes spaces like also the value.\n\tThe substrings \"value\" and \"name\" should be avoided in  and  to allow unambiguous parsing,\n\tfor example do not use  = \"draw value\".\n\tHere are some strings for the example below:\n\t   \"setoption name Nullmove value true\\n\"\n      \"setoption name Selectivity value 3\\n\"\n\t   \"setoption name Style value Risky\\n\"\n\t   \"setoption name Clear Hash\\n\"\n\t   \"setoption name NalimovPath value c:\\chess\\tb\\4;c:\\chess\\tb\\5\\n\"\n\n* register\n\tthis is the command to try to register an engine or to tell the engine that registration\n\twill be done later. This command should always be sent if the engine\thas send \"registration error\"\n\tat program startup.\n\tThe following tokens are allowed:\n\t* later\n\t   the user doesn't want to register the engine now.\n\t* name \n\t   the engine should be registered with the name \n\t* code \n\t   the engine should be registered with the code \n\tExample:\n\t   \"register later\"\n\t   \"register name Stefan MK code 4359874324\"\n\n* ucinewgame\n   this is sent to the engine when the next search (started with \"position\" and \"go\") will be from\n   a different game. This can be a new game the engine should play or a new game it should analyse but\n   also the next position from a testsuite with positions only.\n   If the GUI hasn't sent a \"ucinewgame\" before the first \"position\" command, the engine shouldn't\n   expect any further ucinewgame commands as the GUI is probably not supporting the ucinewgame command.\n   So the engine should not rely on this command even though all new GUIs should support it.\n   As the engine's reaction to \"ucinewgame\" can take some time the GUI should always send \"isready\"\n   after \"ucinewgame\" to wait for the engine to finish its operation.\n   \n* position [fen  | startpos ]  moves  .... \n\tset up the position described in fenstring on the internal board and\n\tplay the moves on the internal chess board.\n\tif the game was played  from the start position the string \"startpos\" will be sent\n\tNote: no \"new\" command is needed. However, if this position is from a different game than\n\tthe last position sent to the engine, the GUI should have sent a \"ucinewgame\" inbetween.\n\n* go\n\tstart calculating on the current position set up with the \"position\" command.\n\tThere are a number of commands that can follow this command, all will be sent in the same string.\n\tIf one command is not send its value should be interpreted as it would not influence the search.\n\t* searchmoves  .... \n\t\trestrict search to this moves only\n\t\tExample: After \"position startpos\" and \"go infinite searchmoves e2e4 d2d4\"\n\t\tthe engine should only search the two moves e2e4 and d2d4 in the initial position.\n\t* ponder\n\t\tstart searching in pondering mode.\n\t\tDo not exit the search in ponder mode, even if it's mate!\n\t\tThis means that the last move sent in in the position string is the ponder move.\n\t\tThe engine can do what it wants to do, but after a \"ponderhit\" command\n\t\tit should execute the suggested move to ponder on. This means that the ponder move sent by\n\t\tthe GUI can be interpreted as a recommendation about which move to ponder. However, if the\n\t\tengine decides to ponder on a different move, it should not display any mainlines as they are\n\t\tlikely to be misinterpreted by the GUI because the GUI expects the engine to ponder\n\t   on the suggested move.\n\t* wtime \n\t\twhite has x msec left on the clock\n\t* btime \n\t\tblack has x msec left on the clock\n\t* winc \n\t\twhite increment per move in mseconds if x \u003e 0\n\t* binc \n\t\tblack increment per move in mseconds if x \u003e 0\n\t* movestogo \n      there are x moves to the next time control,\n\t\tthis will only be sent if x \u003e 0,\n\t\tif you don't get this and get the wtime and btime it's sudden death\n\t* depth \n\t\tsearch x plies only.\n\t* nodes \n\t   search x nodes only,\n\t* mate \n\t\tsearch for a mate in x moves\n\t* movetime \n\t\tsearch exactly x mseconds\n\t* infinite\n\t\tsearch until the \"stop\" command. Do not exit the search without being told so in this mode!\n    \n* stop\n\tstop calculating as soon as possible,\n\tdon't forget the \"bestmove\" and possibly the \"ponder\" token when finishing the search\n\n* ponderhit\n\tthe user has played the expected move. This will be sent if the engine was told to ponder on the same move\n\tthe user has played. The engine should continue searching but switch from pondering to normal search.\n\n* quit\n\tquit the program as soon as possible\n\n\nEngine to GUI:\n--------------\n\n* id\n\t* name \n\t\tthis must be sent after receiving the \"uci\" command to identify the engine,\n\t\te.g. \"id name Shredder X.Y\\n\"\n\t* author \n\t\tthis must be sent after receiving the \"uci\" command to identify the engine,\n\t\te.g. \"id author Stefan MK\\n\"\n\n* uciok\n\tMust be sent after the id and optional options to tell the GUI that the engine\n\thas sent all infos and is ready in uci mode.\n\n* readyok\n\tThis must be sent when the engine has received an \"isready\" command and has\n\tprocessed all input and is ready to accept new commands now.\n\tIt is usually sent after a command that can take some time to be able to wait for the engine,\n\tbut it can be used anytime, even when the engine is searching,\n\tand must always be answered with \"isready\".\n\n* bestmove  [ ponder  ]\n\tthe engine has stopped searching and found the move  best in this position.\n\tthe engine can send the move it likes to ponder on. The engine must not start pondering automatically.\n\tthis command must always be sent if the engine stops searching, also in pondering mode if there is a\n\t\"stop\" command, so for every \"go\" command a \"bestmove\" command is needed!\n\tDirectly before that the engine should send a final \"info\" command with the final search information,\n\tthe the GUI has the complete statistics about the last search.\n\n* copyprotection\n\tthis is needed for copyprotected engines. After the uciok command the engine can tell the GUI,\n\tthat it will check the copy protection now. This is done by \"copyprotection checking\".\n\tIf the check is ok the engine should sent \"copyprotection ok\", otherwise \"copyprotection error\".\n\tIf there is an error the engine should not function properly but should not quit alone.\n\tIf the engine reports \"copyprotection error\" the GUI should not use this engine\n\tand display an error message instead!\n\tThe code in the engine can look like this\n      TellGUI(\"copyprotection checking\\n\");\n\t   // ... check the copy protection here ...\n\t   if(ok)\n\t      TellGUI(\"copyprotection ok\\n\");\n      else\n         TellGUI(\"copyprotection error\\n\");\n         \n* registration\n\tthis is needed for engines that need a username and/or a code to function with all features.\n\tAnalog to the \"copyprotection\" command the engine can send \"registration checking\"\n\tafter the uciok command followed by either \"registration ok\" or \"registration error\".\n\tAlso after every attempt to register the engine it should answer with \"registration checking\"\n\tand then either \"registration ok\" or \"registration error\".\n\tIn contrast to the \"copyprotection\" command, the GUI can use the engine after the engine has\n\treported an error, but should inform the user that the engine is not properly registered\n\tand might not use all its features.\n\tIn addition the GUI should offer to open a dialog to\n\tenable registration of the engine. To try to register an engine the GUI can send\n\tthe \"register\" command.\n\tThe GUI has to always answer with the \"register\" command\tif the engine sends \"registration error\"\n\tat engine startup (this can also be done with \"register later\")\n\tand tell the user somehow that the engine is not registered.\n\tThis way the engine knows that the GUI can deal with the registration procedure and the user\n\twill be informed that the engine is not properly registered.\n\t      \n* info\n\tthe engine wants to send infos to the GUI. This should be done whenever one of the info has changed.\n\tThe engine can send only selected infos and multiple infos can be send with one info command,\n\te.g. \"info currmove e2e4 currmovenumber 1\" or\n\t     \"info depth 12 nodes 123456 nps 100000\".\n\tAlso all infos belonging to the pv should be sent together\n\te.g. \"info depth 2 score cp 214 time 1242 nodes 2124 nps 34928 pv e2e4 e7e5 g1f3\"\n\tI suggest to start sending \"currmove\", \"currmovenumber\", \"currline\" and \"refutation\" only after one second\n\tto avoid too much traffic.\n\tAdditional info:\n\t* depth \n\t\tsearch depth in plies\n\t* seldepth \n\t\tselective search depth in plies,\n\t\tif the engine sends seldepth there must also a \"depth\" be present in the same string.\n\t* time \n\t\tthe time searched in ms, this should be sent together with the pv.\n\t* nodes \n\t\tx nodes searched, the engine should send this info regularly\n\t* pv  ... \n\t\tthe best line found\n\t* multipv \n\t\tthis for the multi pv mode.\n\t\tfor the best move/pv add \"multipv 1\" in the string when you send the pv.\n\t\tin k-best mode always send all k variants in k strings together.\n\t* score\n\t\t* cp \n\t\t\tthe score from the engine's point of view in centipawns.\n\t\t* mate \n\t\t\tmate in y moves, not plies.\n\t\t\tIf the engine is getting mated use negativ values for y.\n\t\t* lowerbound\n\t      the score is just a lower bound.\n\t\t* upperbound\n\t\t   the score is just an upper bound.\n\t* currmove \n\t\tcurrently searching this move\n\t* currmovenumber \n\t\tcurrently searching move number x, for the first move x should be 1 not 0.\n\t* hashfull \n\t\tthe hash is x permill full, the engine should send this info regularly\n\t* nps \n\t\tx nodes per second searched, the engine should send this info regularly\n\t* tbhits \n\t\tx positions where found in the endgame table bases\n\t* cpuload \n\t\tthe cpu usage of the engine is x permill.\n\t* string \n\t\tany string str which will be displayed be the engine,\n\t\tif there is a string command the rest of the line will be interpreted as .\n\t* refutation   ... \n\t   move  is refuted by the line  ... , i can be any number \u003e= 1.\n\t   Example: after move d1h5 is searched, the engine can send\n\t   \"info refutation d1h5 g6h5\"\n\t   if g6h5 is the best answer after d1h5 or if g6h5 refutes the move d1h5.\n\t   if there is norefutation for d1h5 found, the engine should just send\n\t   \"info refutation d1h5\"\n\t\tThe engine should only send this if the option \"UCI_ShowRefutations\" is set to true.\n\t* currline   ... \n\t   this is the current line the engine is calculating.  is the number of the cpu if\n\t   the engine is running on more than one cpu.  = 1,2,3....\n\t   if the engine is just using one cpu,  can be omitted.\n\t   If  is greater than 1, always send all k lines in k strings together.\n\t\tThe engine should only send this if the option \"UCI_ShowCurrLine\" is set to true.\n\t\n\nMade possible by the following Sponsors\n\nwww.12secure.nl\n\nwww.ip-camera.nl\n\n* option\n\tThis command tells the GUI which parameters can be changed in the engine.\n\tThis should be sent once at engine startup after the \"uci\" and the \"id\" commands\n\tif any parameter can be changed in the engine.\n\tThe GUI should parse this and build a dialog for the user to change the settings.\n\tNote that not every option needs to appear in this dialog as some options like\n\t\"Ponder\", \"UCI_AnalyseMode\", etc. are better handled elsewhere or are set automatically.\n\tIf the user wants to change some settings, the GUI will send a \"setoption\" command to the engine.\n\tNote that the GUI need not send the setoption command when starting the engine for every option if\n\tit doesn't want to change the default value.\n\tFor all allowed combinations see the example below,\n\tas some combinations of this tokens don't make sense.\n\tOne string will be sent for each parameter.\n\t* name \n\t\n\t\tThe option has the name id.\n\t\tCertain options have a fixed value for , which means that the semantics of this option is fixed.\n\t\tUsually those options should not be displayed in the normal engine options window of the GUI but\n\t\tget a special treatment. \"Pondering\" for example should be set automatically when pondering is\n\t\tenabled or disabled in the GUI options. The same for \"UCI_AnalyseMode\" which should also be set\n\t\tautomatically by the GUI. All those certain options have the prefix \"UCI_\" except for the\n\t\tfirst 6 options below. If the GUI get an unknown Option with the prefix \"UCI_\", it should just\n\t\tignore it and not display it in the engine's options dialog.\n\t\t*  = Hash, type is spin\n\t\t\tthe value in MB for memory for hash tables can be changed,\n\t\t\tthis should be answered with the first \"setoptions\" command at program boot\n\t\t\tif the engine has sent the appropriate \"option name Hash\" command,\n\t\t\twhich should be supported by all engines!\n\t\t\tSo the engine should use a very small hash first as default.\n\t\t*  = NalimovPath, type string\n\t\t\tthis is the path on the hard disk to the Nalimov compressed format.\n\t\t\tMultiple directories can be concatenated with \";\"\n\t\t*  = NalimovCache, type spin\n\t\t\tthis is the size in MB for the cache for the nalimov table bases\n\t\t\tThese last two options should also be present in the initial options exchange dialog\n\t\t\twhen the engine is booted if the engine supports it\n\t\t*  = Ponder, type check\n\t\t\tthis means that the engine is able to ponder.\n\t\t\tThe GUI will send this whenever pondering is possible or not.\n\t\t\tNote: The engine should not start pondering on its own if this is enabled, this option is only\n\t\t\tneeded because the engine might change its time management algorithm when pondering is allowed.\n\t\t*  = OwnBook, type check\n\t\t\tthis means that the engine has its own book which is accessed by the engine itself.\n\t\t\tif this is set, the engine takes care of the opening book and the GUI will never\n\t\t\texecute a move out of its book for the engine. If this is set to false by the GUI,\n\t\t\tthe engine should not access its own book.\n\t\t*  = MultiPV, type spin\n\t\t\tthe engine supports multi best line or k-best mode. the default value is 1\n\t\t*  = UCI_ShowCurrLine, type check, should be false by default,\n\t\t\tthe engine can show the current line it is calculating. see \"info currline\" above.\n\t\t*  = UCI_ShowRefutations, type check, should be false by default,\n\t\t\tthe engine can show a move and its refutation in a line. see \"info refutations\" above.\n\t\t*  = UCI_LimitStrength, type check, should be false by default,\n\t\t\tThe engine is able to limit its strength to a specific Elo number,\n\t\t   This should always be implemented together with \"UCI_Elo\".\n\t\t*  = UCI_Elo, type spin\n\t\t\tThe engine can limit its strength in Elo within this interval.\n\t\t\tIf UCI_LimitStrength is set to false, this value should be ignored.\n\t\t\tIf UCI_LimitStrength is set to true, the engine should play with this specific strength.\n\t\t   This should always be implemented together with \"UCI_LimitStrength\".\n\t\t*  = UCI_AnalyseMode, type check\n\t\t   The engine wants to behave differently when analysing or playing a game.\n\t\t   For example when playing it can use some kind of learning.\n\t\t   This is set to false if the engine is playing a game, otherwise it is true.\n\t\t *  = UCI_Opponent, type string\n\t\t   With this command the GUI can send the name, title, elo and if the engine is playing a human\n\t\t   or computer to the engine.\n\t\t   The format of the string has to be [GM|IM|FM|WGM|WIM|none] [|none] [computer|human] \n\t\t   Example:\n\t\t   \"setoption name UCI_Opponent value GM 2800 human Gary Kasparow\"\n\t\t   \"setoption name UCI_Opponent value none none computer Shredder\"\n\t\t   \t\t   \n\t\t\n\t* type \n\t\tThe option has type t.\n\t\tThere are 5 different types of options the engine can send\n\t\t* check\n\t\t\ta checkbox that can either be true or false\n\t\t* spin\n\t\t\ta spin wheel that can be an integer in a certain range\n\t\t* combo\n\t\t\ta combo box that can have different predefined strings as a value\n\t\t* button\n\t\t\ta button that can be pressed to send a command to the engine\n\t\t* string\n\t\t\ta text field that has a string as a value,\n\t\t\tan empty string has the value \"\"\n\t* default \n\t\tthe default value of this parameter is x\n\t* min \n\t\tthe minimum value of this parameter is x\n\t* max \n\t\tthe maximum value of this parameter is x\n\t* var \n\t\ta predefined value of this parameter is x\n\tExample:\n    Here are 5 strings for each of the 5 possible types of options\n\t   \"option name Nullmove type check default true\\n\"\n      \"option name Selectivity type spin default 2 min 0 max 4\\n\"\n\t   \"option name Style type combo default Normal var Solid var Normal var Risky\\n\"\n\t   \"option name NalimovPath type string default c:\\\\n\"\n\t   \"option name Clear Hash type button\\n\"\n\n\n\nExample:\n--------\n\nThis is how the communication when the engine boots can look like:\n\nGUI     engine\n\n// tell the engine to switch to UCI mode\nuci\n\n// engine identify  \n      id name Shredder\n\t\tid author Stefan MK\n\n// engine sends the options it can change\n// the engine can change the hash size from 1 to 128 MB\n\t\toption name Hash type spin default 1 min 1 max 128\n\n// the engine supports Nalimov endgame tablebases\n\t\toption name NalimovPath type string default \n\t\toption name NalimovCache type spin default 1 min 1 max 32\n\n// the engine can switch off Nullmove and set the playing style\n\t   option name Nullmove type check default true\n  \t\toption name Style type combo default Normal var Solid var Normal var Risky\n\n// the engine has sent all parameters and is ready\n\t\tuciok\n\n// Note: here the GUI can already send a \"quit\" command if it just wants to find out\n//       details about the engine, so the engine should not initialize its internal\n//       parameters before here.\n// now the GUI sets some values in the engine\n// set hash to 32 MB\nsetoption name Hash value 32\n\n// init tbs\nsetoption name NalimovCache value 1\nsetoption name NalimovPath value d:\\tb;c\\tb\n\n// waiting for the engine to finish initializing\n// this command and the answer is required here!\nisready\n\n// engine has finished setting up the internal values\n\t\treadyok\n\n// now we are ready to go\n\n// if the GUI is supporting it, tell the engine that is is\n// searching on a game that is hasn't searched on before\nucinewgame\n\n// if the engine supports the \"UCI_AnalyseMode\" option and the next search is supposted to\n// be an analysis, the GUI should set \"UCI_AnalyseMode\" to true if it is currently\n// set to false with this engine\nsetoption name UCI_AnalyseMode value true\n\n// tell the engine to search infinite from the start position after 1.e4 e5\nposition startpos moves e2e4 e7e5\ngo infinite\n\n// the engine starts sending infos about the search to the GUI\n// (only some examples are given)\n\n\n\t\tinfo depth 1 seldepth 0\n\t\tinfo score cp 13  depth 1 nodes 13 time 15 pv f1b5 \n\t\tinfo depth 2 seldepth 2\n\t\tinfo nps 15937\n\t\tinfo score cp 14  depth 2 nodes 255 time 15 pv f1c4 f8c5 \n\t\tinfo depth 2 seldepth 7 nodes 255\n\t\tinfo depth 3 seldepth 7\n\t\tinfo nps 26437\n\t\tinfo score cp 20  depth 3 nodes 423 time 15 pv f1c4 g8f6 b1c3 \n\t\tinfo nps 41562\n\t\t....\n\n\n// here the user has seen enough and asks to stop the searching\nstop\n\n// the engine has finished searching and is sending the bestmove command\n// which is needed for every \"go\" command sent to tell the GUI\n// that the engine is ready again\n\t\tbestmove g1f3 ponder d8f6\n\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fnomemory%2Fuci-protocol-specification","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fnomemory%2Fuci-protocol-specification","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fnomemory%2Fuci-protocol-specification/lists"}