{"openapi":"3.1.0","info":{"title":"Anagram Play API","version":"0.1.0","description":"A real, playable, fully local anagram word game — stateless: the caller holds and passes the game state between calls.\n\nEvery operation is read-only or compute-only. The same tools are available over MCP (streamable HTTP) at https://anagramplay.connectorbay.com/mcp.","contact":{"name":"Unify Dynamics LLC","email":"hr@unifydynamics.com","url":"https://connectorbay.com/anagramplay/docs"},"termsOfService":"https://connectorbay.com/anagramplay/terms"},"servers":[{"url":"https://anagramplay.connectorbay.com"}],"externalDocs":{"url":"https://connectorbay.com/anagramplay/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":"Deal a fresh scrambled letter set. Returns the game `state` — hold onto it and pass it into every","description":"Deal a fresh scrambled letter set. Returns the game `state` — hold onto it and pass it into every\n    other tool. Use for \"start an anagram game\", \"give me an easy anagram puzzle\".","tags":["tools"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"properties":{"difficulty":{"default":"medium","description":"easy (5 letters), medium (6), hard (7), or expert (9).","title":"Difficulty","type":"string"},"min_word_length":{"default":3,"description":"Shortest word that counts.","maximum":9,"minimum":3,"title":"Min Word Length","type":"integer"}},"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/submit_word":{"post":{"operationId":"submit_word","summary":"Try one word against the current letters. Validates length, letter availability, and real-","description":"Try one word against the current letters. Validates length, letter availability, and real-\n    dictionary membership; scores it by length if valid. Returns the updated `state` — pass THAT into the\n    next call, not the original.","tags":["tools"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"properties":{"state":{"additionalProperties":true,"description":"The full game state returned by new_game or any other tool — pass it back in unchanged except for whatever the tool itself asks you to submit.","title":"State","type":"object"},"word":{"description":"The word the player wants to try.","minLength":1,"title":"Word","type":"string"}},"required":["state","word"],"title":"submit_wordArguments","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/reveal_all":{"post":{"operationId":"reveal_all","summary":"List every valid dictionary word the current letters can make, marking which ones were already","description":"List every valid dictionary word the current letters can make, marking which ones were already\n    found. A \"give me all the answers\" mode. Returns the (unchanged, except for a `revealed` flag) state.","tags":["tools"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"properties":{"state":{"additionalProperties":true,"description":"The full game state returned by new_game or any other tool — pass it back in unchanged except for whatever the tool itself asks you to submit.","title":"State","type":"object"}},"required":["state"],"title":"reveal_allArguments","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_hint":{"post":{"operationId":"get_hint","summary":"A nudge toward one unfound word — its length and first letter only, never the whole word.","description":"A nudge toward one unfound word — its length and first letter only, never the whole word.","tags":["tools"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"properties":{"state":{"additionalProperties":true,"description":"The full game state returned by new_game or any other tool — pass it back in unchanged except for whatever the tool itself asks you to submit.","title":"State","type":"object"}},"required":["state"],"title":"get_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 rendering of the current letters, found words, and score.","description":"A human-readable rendering of the current letters, found words, and score.","tags":["tools"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"properties":{"state":{"additionalProperties":true,"description":"The full game state returned by new_game or any other tool — pass it back in unchanged except for whatever the tool itself asks you to submit.","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/difficulty_list":{"post":{"operationId":"difficulty_list","summary":"The four difficulty tiers and how many letters each deals.","description":"The four difficulty tiers and how many letters each deals.","tags":["tools"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"properties":{},"title":"difficulty_listArguments","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}}}}