{"openapi":"3.1.0","info":{"title":"TriPeaks Solitaire API","version":"0.1.0","description":"A real, stateless, playable single-player card game: genuine 28-card three-peaks deal plus a 24-card stock, real move validation, real combo/streak scoring, and win detection. 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://tripeaks.connectorbay.com/mcp.","contact":{"name":"Unify Dynamics LLC","email":"hr@unifydynamics.com","url":"https://connectorbay.com/tripeaks/docs"},"termsOfService":"https://connectorbay.com/tripeaks/terms"},"servers":[{"url":"https://tripeaks.connectorbay.com"}],"externalDocs":{"url":"https://connectorbay.com/tripeaks/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":"Shuffles a real 52-card deck, deals the standard 28-card three-peaks board, and turns up the","description":"Shuffles a real 52-card deck, deals the standard 28-card three-peaks board, and turns up the\n    first waste card. Use for \"let's play tripeaks\".","tags":["tools"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"properties":{"seed":{"anyOf":[{"type":"integer"},{"type":"null"}],"default":null,"description":"Optional integer seed for a reproducible shuffle (testing/demos). Omit for a real random shuffle.","title":"Seed"}},"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":"Validates and applies one move per real TriPeaks rules, returning the new state with an","description":"Validates and applies one move per real TriPeaks rules, returning the new state with an\n    informative message or rejection reason.","tags":["tools"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"properties":{"state":{"additionalProperties":true,"description":"The current game state, exactly as returned by new_game or make_move. Carry it forward between calls; there is no server-side session.","title":"State","type":"object"},"move":{"additionalProperties":true,"description":"{'action': 'play_peak', 'slot': int (0-27)} or {'action': 'draw'}.","examples":[{"action":"play_peak","slot":20},{"action":"draw"}],"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/play_peak":{"post":{"operationId":"play_peak","summary":"Plays an uncovered peak card onto the waste if its rank is exactly one away from the","description":"Plays an uncovered peak card onto the waste if its rank is exactly one away from the\n    current waste-top card. Use for \"play that card\", \"play the 8\".","tags":["tools"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"properties":{"state":{"additionalProperties":true,"description":"The current game state, exactly as returned by new_game or make_move. Carry it forward between calls; there is no server-side session.","title":"State","type":"object"},"slot":{"description":"The peak slot to play, 0-27 (flat-indexed: 0-2 top row, 3-8 second row, 9-17 third row, 18-27 base row).","title":"Slot","type":"integer"}},"required":["state","slot"],"title":"play_peakArguments","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/draw":{"post":{"operationId":"draw","summary":"Turns up the next stock card as the new waste top (unconditionally) and resets the combo","description":"Turns up the next stock card as the new waste top (unconditionally) and resets the combo\n    streak to 0. The stock is not recycled once empty. Use for \"draw a card\".","tags":["tools"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"properties":{"state":{"additionalProperties":true,"description":"The current game state, exactly as returned by new_game or make_move. Carry it forward between calls; there is no server-side session.","title":"State","type":"object"}},"required":["state"],"title":"drawArguments","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 every currently legal move (every playable peak card, plus draw if the stock isn't","description":"Lists every currently legal move (every playable peak card, plus draw if the stock isn't\n    empty) as ready-to-use move objects. Use for \"what can I do\".","tags":["tools"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"properties":{"state":{"additionalProperties":true,"description":"The current game state, exactly as returned by new_game or make_move. Carry it forward between calls; there is no server-side session.","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/hint":{"post":{"operationId":"hint","summary":"A real hint: a playable peak card if one exists, else drawing from the stock, or a genuine","description":"A real hint: a playable peak card if one exists, else drawing from the stock, or a genuine\n    'no more moves' report if the stock is empty and nothing is playable. Use for \"give me a hint\",\n    \"am I stuck\".","tags":["tools"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"properties":{"state":{"additionalProperties":true,"description":"The current game state, exactly as returned by new_game or make_move. Carry it forward between calls; there is no server-side session.","title":"State","type":"object"}},"required":["state"],"title":"hintArguments","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 text rendering of the three peaks, stock, and waste, plus the current","description":"A human-readable text rendering of the three peaks, stock, and waste, plus the current\n    streak and score. Use for \"show me the 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 or make_move. Carry it forward between calls; there is no server-side session.","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}}}}