{"openapi":"3.1.0","info":{"title":"Chain Assoc API","version":"0.1.0","description":"A fully local, stateless word-association chain game — validate the next word in a chain against an original association graph, take engine turns, or get hints.\n\nEvery operation is read-only or compute-only. The same tools are available over MCP (streamable HTTP) at https://chainassoc.connectorbay.com/mcp.","contact":{"name":"Unify Dynamics LLC","email":"hr@unifydynamics.com","url":"https://connectorbay.com/chainassoc/docs"},"termsOfService":"https://connectorbay.com/chainassoc/terms"},"servers":[{"url":"https://chainassoc.connectorbay.com"}],"externalDocs":{"url":"https://connectorbay.com/chainassoc/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 new association chain. Use for \"let's play word association\", \"start a chain with ocean\".","description":"Starts a new association chain. Use for \"let's play word association\", \"start a chain with ocean\".","tags":["tools"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"properties":{"start_word":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null,"description":"A word to start the chain with; must be a recognized word. Omit for a random start.","title":"Start Word"},"seed":{"anyOf":[{"type":"integer"},{"type":"null"}],"default":null,"description":"Optional RNG seed for a reproducible random start word.","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/submit_word":{"post":{"operationId":"submit_word","summary":"Validates and (if valid) appends the player's next word: must be recognized, unused, and associated with","description":"Validates and (if valid) appends the player's next word: must be recognized, unused, and associated with\n    the chain's last word. Use for \"I say 'shark'\".","tags":["tools"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"properties":{"state":{"additionalProperties":true,"description":"The full game state object as previously returned by new_game or a gameplay tool. Pass it back unmodified except through this API.","title":"State","type":"object"},"word":{"description":"The next word in the chain.","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/engine_move":{"post":{"operationId":"engine_move","summary":"The engine takes a turn, picking a random unused associated word. Reports exhausted:true if none remain.","description":"The engine takes a turn, picking a random unused associated word. Reports exhausted:true if none remain.\n    Use for \"your turn\", \"you go next\".","tags":["tools"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"properties":{"state":{"additionalProperties":true,"description":"The full game state object as previously returned by new_game or a gameplay tool. Pass it back unmodified except through this API.","title":"State","type":"object"},"seed":{"anyOf":[{"type":"integer"},{"type":"null"}],"default":null,"description":"Optional RNG seed for a reproducible engine pick.","title":"Seed"}},"required":["state"],"title":"engine_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_hint":{"post":{"operationId":"get_hint","summary":"Suggests valid, unused next words for the current chain WITHOUT applying them. Use for \"give me a hint\",","description":"Suggests valid, unused next words for the current chain WITHOUT applying them. Use for \"give me a hint\",\n    \"what words could I say next\".","tags":["tools"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"properties":{"state":{"additionalProperties":true,"description":"The full game state object as previously returned by new_game or a gameplay tool. Pass it back unmodified except through this API.","title":"State","type":"object"},"count":{"default":1,"description":"How many suggestions to return.","maximum":10,"minimum":1,"title":"Count","type":"integer"}},"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_chain":{"post":{"operationId":"render_chain","summary":"Plain-text view of the chain so far, its length, and score. Use for \"show me the chain\".","description":"Plain-text view of the chain so far, its length, and score. Use for \"show me the chain\".","tags":["tools"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"properties":{"state":{"additionalProperties":true,"description":"The full game state object as previously returned by new_game or a gameplay tool. Pass it back unmodified except through this API.","title":"State","type":"object"}},"required":["state"],"title":"render_chainArguments","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/category_list":{"post":{"operationId":"category_list","summary":"Lists the built-in association categories and how many words each has. Use for \"what topics can we chain","description":"Lists the built-in association categories and how many words each has. Use for \"what topics can we chain\n    through\".","tags":["tools"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"properties":{},"title":"category_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}},"/v1/tools/graph_stats":{"post":{"operationId":"graph_stats","summary":"Summary stats of the bundled association graph (word count, total associations, categories, curated","description":"Summary stats of the bundled association graph (word count, total associations, categories, curated\n    cross-category pairs). Use for \"how big is your word association graph\".","tags":["tools"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"properties":{},"title":"graph_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}}}}