{"openapi":"3.1.0","info":{"title":"Number Sprint API","version":"0.1.0","description":"A fully local, playable arithmetic speed-game engine plus a real Countdown-style numbers round backed by a safe (non-eval) expression evaluator and a real combinatorial solver. Stateless: the caller holds the session state between calls.\n\nEvery operation is read-only or compute-only. The same tools are available over MCP (streamable HTTP) at https://numbersprint.connectorbay.com/mcp.","contact":{"name":"Unify Dynamics LLC","email":"hr@unifydynamics.com","url":"https://connectorbay.com/numbersprint/docs"},"termsOfService":"https://connectorbay.com/numbersprint/terms"},"servers":[{"url":"https://numbersprint.connectorbay.com"}],"externalDocs":{"url":"https://connectorbay.com/numbersprint/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_session":{"post":{"operationId":"new_session","summary":"Start a new Number Sprint session (resets stats) and generate its first arithmetic problem. Use for","description":"Start a new Number Sprint session (resets stats) and generate its first arithmetic problem. Use for\n    \"let's do a math sprint\", \"quiz me on arithmetic at hard difficulty\".","tags":["tools"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"properties":{"difficulty":{"default":"easy","description":"'easy', 'medium', or 'hard' -- scales operand size and operation mix for sprint mode.","title":"Difficulty","type":"string"},"seed":{"anyOf":[{"type":"integer"},{"type":"null"}],"default":null,"description":"Optional RNG seed for reproducible problems (mainly for testing).","title":"Seed"}},"title":"new_sessionArguments","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/new_problem":{"post":{"operationId":"new_problem","summary":"Generate a fresh sprint-mode arithmetic problem, keeping streak/accuracy stats intact.","description":"Generate a fresh sprint-mode arithmetic problem, keeping streak/accuracy stats intact.","tags":["tools"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"properties":{"state":{"additionalProperties":true,"description":"Current session state, exactly as returned by a previous call.","title":"State","type":"object"},"seed":{"anyOf":[{"type":"integer"},{"type":"null"}],"default":null,"description":"Optional RNG seed for a reproducible problem (mainly for testing).","title":"Seed"}},"required":["state"],"title":"new_problemArguments","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/submit_answer":{"post":{"operationId":"submit_answer","summary":"Submit an answer to the current sprint problem; grades it against the real computed result and","description":"Submit an answer to the current sprint problem; grades it against the real computed result and\n    updates exact streak/accuracy stats.","tags":["tools"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"properties":{"state":{"additionalProperties":true,"description":"Current session state, exactly as returned by a previous call.","title":"State","type":"object"},"answer":{"description":"Your numeric answer to the current sprint problem.","title":"Answer"}},"required":["state","answer"],"title":"submit_answerArguments","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/sprint_stats":{"post":{"operationId":"sprint_stats","summary":"Report exact sprint-mode stats: correct/incorrect counts, accuracy percentage, current and best streak.","description":"Report exact sprint-mode stats: correct/incorrect counts, accuracy percentage, current and best streak.","tags":["tools"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"properties":{"state":{"additionalProperties":true,"description":"Current session state, exactly as returned by a previous call.","title":"State","type":"object"}},"required":["state"],"title":"sprint_statsArguments","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/countdown_round":{"post":{"operationId":"countdown_round","summary":"Start a Countdown-style numbers round: draws 6 real Countdown tiles (large 25/50/75/100 plus small","description":"Start a Countdown-style numbers round: draws 6 real Countdown tiles (large 25/50/75/100 plus small\n    1-10, two of each) and a target, unless you supply your own numbers/target. An auto-generated target\n    is guaranteed reachable by the real solver. Use submit_countdown_solution to attempt it.","tags":["tools"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"properties":{"state":{"additionalProperties":true,"description":"Current session state, exactly as returned by a previous call.","title":"State","type":"object"},"numbers":{"anyOf":[{"items":{"type":"integer"},"type":"array"},{"type":"null"}],"default":null,"description":"Optional: exactly 6 positive integers to use instead of a fresh random draw.","title":"Numbers"},"target":{"anyOf":[{"type":"integer"},{"type":"null"}],"default":null,"description":"Optional: a specific target to reach instead of an auto-generated (guaranteed reachable) one.","title":"Target"},"seed":{"anyOf":[{"type":"integer"},{"type":"null"}],"default":null,"description":"Optional RNG seed for a reproducible draw (mainly for testing).","title":"Seed"}},"required":["state"],"title":"countdown_roundArguments","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/submit_countdown_solution":{"post":{"operationId":"submit_countdown_solution","summary":"SAFELY parse and evaluate your expression (no eval()) against the current Countdown round: checks","description":"SAFELY parse and evaluate your expression (no eval()) against the current Countdown round: checks\n    it only uses the drawn numbers (each at most as many times as available) with every intermediate\n    result a positive whole number, then reports whether it hits the target.","tags":["tools"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"properties":{"state":{"additionalProperties":true,"description":"Current session state, exactly as returned by a previous call.","title":"State","type":"object"},"expression":{"description":"Your arithmetic expression, e.g. '(100-6)*(75-65)'. Only +, -, *, /, parentheses and the drawn numbers are allowed.","title":"Expression","type":"string"}},"required":["state","expression"],"title":"submit_countdown_solutionArguments","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/solve_countdown":{"post":{"operationId":"solve_countdown","summary":"Run the real combinatorial solver on the current Countdown round and reveal an exact solution (or","description":"Run the real combinatorial solver on the current Countdown round and reveal an exact solution (or\n    the closest reachable value if no exact one exists).","tags":["tools"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"properties":{"state":{"additionalProperties":true,"description":"Current session state, exactly as returned by a previous call.","title":"State","type":"object"}},"required":["state"],"title":"solve_countdownArguments","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/rules_info":{"post":{"operationId":"rules_info","summary":"Explain Number Sprint's sprint and Countdown modes, scoring, and the safe expression evaluator.","description":"Explain Number Sprint's sprint and Countdown modes, scoring, and the safe expression evaluator.","tags":["tools"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"properties":{},"title":"rules_infoArguments","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}}}}