{"openapi":"3.1.0","info":{"title":"Checkers Engine API","version":"0.1.0","description":"A real, stateless, playable American-checkers engine (forced capture, multi-jump, king promotion) with a minimax + alpha-beta pruning AI opponent (easy/medium/hard difficulty). Every tool call takes the full game state and returns the new state; nothing is stored server-side.\n\nEvery operation is read-only or compute-only. The same tools are available over MCP (streamable HTTP) at https://checkersengine.connectorbay.com/mcp.","contact":{"name":"Unify Dynamics LLC","email":"hr@unifydynamics.com","url":"https://connectorbay.com/checkersengine/docs"},"termsOfService":"https://connectorbay.com/checkersengine/terms"},"servers":[{"url":"https://checkersengine.connectorbay.com"}],"externalDocs":{"url":"https://connectorbay.com/checkersengine/docs"},"security":[{},{"bearer":[]}],"components":{"securitySchemes":{"bearer":{"type":"http","scheme":"bearer","description":"Optional. A Pro API key raises rate limits; no credentials are required."}},"schemas":{"Error":{"type":"object","properties":{"ok":{"const":false},"error":{"type":"object"}}}}},"paths":{"/v1/tools/new_game":{"post":{"operationId":"new_game","summary":"Starts a fresh checkers game (standard starting position, 12 men per side) and returns its","description":"Starts a fresh checkers game (standard starting position, 12 men per side) and returns its\n    initial state. Use for \"let's play checkers\", \"start a new game\".","tags":["tools"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"properties":{"first_player":{"default":"b","description":"Which side moves first.","examples":["b","w"],"title":"First Player","type":"string"}},"title":"new_gameArguments","type":"object"}}}},"responses":{"200":{"description":"Tool result. `ok: true` on success; `ok: false` with a structured `error` (provider_unavailable, upstream_error, bad_input) when the tool could not answer.","content":{"application/json":{"schema":{"type":"object","additionalProperties":true}}}},"422":{"description":"Arguments failed validation","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limit exceeded (see Retry-After)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"x-read-only":true}},"/v1/tools/make_move":{"post":{"operationId":"make_move","summary":"Applies one hop (a simple move or a single jump) and returns the resulting state. status is","description":"Applies one hop (a simple move or a single jump) and returns the resulting state. status is\n    invalid_move (illegal — state unchanged), in_progress, continue_jump (a multi-jump is in\n    progress — must_continue_from names the piece that must hop again, same player's turn), or win.\n    Use for \"move from 10 to 14\", \"jump to 19\".","tags":["tools"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"properties":{"state":{"additionalProperties":true,"description":"The current game state, exactly as returned by new_game/make_move.","examples":[{"board":[null,"b",null,"b",null,"b",null,"b","b",null,"b",null,"b",null,"b",null,null,"b",null,"b",null,"b",null,"b",null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,"w",null,"w",null,"w",null,"w",null,null,"w",null,"w",null,"w",null,"w","w",null,"w",null,"w",null,"w",null],"current_player":"b","must_continue_from":null}],"title":"State","type":"object"},"move":{"additionalProperties":true,"description":"A single hop: {'from': <square 0-63>, 'to': <square 0-63>}. A jump is 2 diagonal squares; a simple move is 1. The captured square (if any) is inferred automatically.","examples":[{"from":17,"to":26}],"title":"Move","type":"object"}},"required":["state","move"],"title":"make_moveArguments","type":"object"}}}},"responses":{"200":{"description":"Tool result. `ok: true` on success; `ok: false` with a structured `error` (provider_unavailable, upstream_error, bad_input) when the tool could not answer.","content":{"application/json":{"schema":{"type":"object","additionalProperties":true}}}},"422":{"description":"Arguments failed validation","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limit exceeded (see Retry-After)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"x-read-only":true}},"/v1/tools/get_valid_moves":{"post":{"operationId":"get_valid_moves","summary":"Lists legal hops for whoever is to move right now, already applying the forced-capture rule","description":"Lists legal hops for whoever is to move right now, already applying the forced-capture rule\n    and any in-progress multi-jump. Empty once the game has ended. Use for \"what can I play\".","tags":["tools"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"properties":{"state":{"additionalProperties":true,"description":"The current game state, exactly as returned by new_game/make_move.","examples":[{"board":[null,"b",null,"b",null,"b",null,"b","b",null,"b",null,"b",null,"b",null,null,"b",null,"b",null,"b",null,"b",null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,"w",null,"w",null,"w",null,"w",null,null,"w",null,"w",null,"w",null,"w","w",null,"w",null,"w",null,"w",null],"current_player":"b","must_continue_from":null}],"title":"State","type":"object"}},"required":["state"],"title":"get_valid_movesArguments","type":"object"}}}},"responses":{"200":{"description":"Tool result. `ok: true` on success; `ok: false` with a structured `error` (provider_unavailable, upstream_error, bad_input) when the tool could not answer.","content":{"application/json":{"schema":{"type":"object","additionalProperties":true}}}},"422":{"description":"Arguments failed validation","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limit exceeded (see Retry-After)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"x-read-only":true}},"/v1/tools/render":{"post":{"operationId":"render","summary":"A human-readable ASCII board with row/column labels and a legend. Use for \"show me the","description":"A human-readable ASCII board with row/column labels and a legend. Use for \"show me the\n    board\".","tags":["tools"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"properties":{"state":{"additionalProperties":true,"description":"The current game state, exactly as returned by new_game/make_move.","examples":[{"board":[null,"b",null,"b",null,"b",null,"b","b",null,"b",null,"b",null,"b",null,null,"b",null,"b",null,"b",null,"b",null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,"w",null,"w",null,"w",null,"w",null,null,"w",null,"w",null,"w",null,"w","w",null,"w",null,"w",null,"w",null],"current_player":"b","must_continue_from":null}],"title":"State","type":"object"}},"required":["state"],"title":"renderArguments","type":"object"}}}},"responses":{"200":{"description":"Tool result. `ok: true` on success; `ok: false` with a structured `error` (provider_unavailable, upstream_error, bad_input) when the tool could not answer.","content":{"application/json":{"schema":{"type":"object","additionalProperties":true}}}},"422":{"description":"Arguments failed validation","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limit exceeded (see Retry-After)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"x-read-only":true}},"/v1/tools/ai_move":{"post":{"operationId":"ai_move","summary":"Chooses the AI's next hop for whichever side is currently to move, WITHOUT applying it —","description":"Chooses the AI's next hop for whichever side is currently to move, WITHOUT applying it —\n    call make_move with the returned `move` to actually play it. Use for \"make the computer's\n    move\", \"play as the AI on hard\".","tags":["tools"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"properties":{"state":{"additionalProperties":true,"description":"The current game state, exactly as returned by new_game/make_move.","examples":[{"board":[null,"b",null,"b",null,"b",null,"b","b",null,"b",null,"b",null,"b",null,null,"b",null,"b",null,"b",null,"b",null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,"w",null,"w",null,"w",null,"w",null,null,"w",null,"w",null,"w",null,"w","w",null,"w",null,"w",null,"w",null],"current_player":"b","must_continue_from":null}],"title":"State","type":"object"},"difficulty":{"default":"hard","description":"easy, medium, or hard (default). Real minimax + alpha-beta search at every level; hard searches deepest.","title":"Difficulty","type":"string"}},"required":["state"],"title":"ai_moveArguments","type":"object"}}}},"responses":{"200":{"description":"Tool result. `ok: true` on success; `ok: false` with a structured `error` (provider_unavailable, upstream_error, bad_input) when the tool could not answer.","content":{"application/json":{"schema":{"type":"object","additionalProperties":true}}}},"422":{"description":"Arguments failed validation","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limit exceeded (see Retry-After)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"x-read-only":true}}}}