{"openapi":"3.1.0","info":{"title":"Jester API","version":"0.1.0","description":"A clean, family-friendly joke and pun generator: live dad jokes from icanhazdadjoke.com plus a bundled dataset of 170+ jokes and puns across dad-joke, pun, knock-knock, programmer, animal, food, work and general categories.\n\nEvery operation is read-only or compute-only. The same tools are available over MCP (streamable HTTP) at https://jester.connectorbay.com/mcp.","contact":{"name":"Unify Dynamics LLC","email":"hr@unifydynamics.com","url":"https://connectorbay.com/jester/docs"},"termsOfService":"https://connectorbay.com/jester/terms"},"servers":[{"url":"https://jester.connectorbay.com"}],"externalDocs":{"url":"https://connectorbay.com/jester/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/random_joke":{"post":{"operationId":"random_joke","summary":"A random joke, optionally filtered by category. Dad jokes are pulled live from icanhazdadjoke.com when it","description":"A random joke, optionally filtered by category. Dad jokes are pulled live from icanhazdadjoke.com when it\n    answers; every other category (and dad jokes when the live source is unavailable) comes from the bundled\n    dataset. The result always names its source. Use for \"tell me a joke\", \"give me an animal joke\".","tags":["tools"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"properties":{"category":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null,"description":"dad-joke | pun | knock-knock | programmer | animal | food | work | general; omit for any category.","title":"Category"}},"title":"random_jokeArguments","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/joke_search":{"post":{"operationId":"joke_search","summary":"Keyword search across the bundled joke dataset (live sources don't support search). Use for \"find me a joke","description":"Keyword search across the bundled joke dataset (live sources don't support search). Use for \"find me a joke\n    about pizza\", \"search for cat jokes\".","tags":["tools"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"properties":{"query":{"description":"A keyword to search for across the bundled joke dataset.","minLength":1,"title":"Query","type":"string"}},"required":["query"],"title":"joke_searchArguments","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":"Every joke category in the bundled dataset with its joke count. Use for \"what kinds of jokes do you have\".","description":"Every joke category in the bundled dataset with its joke count. Use for \"what kinds of jokes do you have\".","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/pun_generator":{"post":{"operationId":"pun_generator","summary":"One or two hand-written puns for a curated topic (food, animals, work, weather, tech). If the topic isn't","description":"One or two hand-written puns for a curated topic (food, animals, work, weather, tech). If the topic isn't\n    covered, says so honestly instead of fabricating a pun on the spot. Use for \"give me a pun about food\".","tags":["tools"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"properties":{"topic":{"description":"A topic to pun about, e.g. food, animals, work, weather, tech.","minLength":1,"title":"Topic","type":"string"}},"required":["topic"],"title":"pun_generatorArguments","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/knock_knock":{"post":{"operationId":"knock_knock","summary":"A knock-knock joke, themed around a given name/word if the bundled set has one that fits, else random. Use","description":"A knock-knock joke, themed around a given name/word if the bundled set has one that fits, else random. Use\n    for \"tell me a knock-knock joke\", \"knock-knock joke about a cow\".","tags":["tools"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"properties":{"name_hint":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null,"description":"A name or word to try to theme the joke around; omit for a random one.","title":"Name Hint"}},"title":"knock_knockArguments","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/joke_of_the_day":{"post":{"operationId":"joke_of_the_day","summary":"Today's joke — the same pick all day, deterministically seeded by today's date from the bundled dataset.","description":"Today's joke — the same pick all day, deterministically seeded by today's date from the bundled dataset.\n    Use for \"what's the joke of the day\".","tags":["tools"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"properties":{},"title":"joke_of_the_dayArguments","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/dad_joke":{"post":{"operationId":"dad_joke","summary":"A dad joke specifically — fetched live from icanhazdadjoke.com when it answers, else a bundled dad joke,","description":"A dad joke specifically — fetched live from icanhazdadjoke.com when it answers, else a bundled dad joke,\n    always labeled. Use for \"tell me a dad joke\".","tags":["tools"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"properties":{},"title":"dad_jokeArguments","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/programmer_joke":{"post":{"operationId":"programmer_joke","summary":"A programming/tech joke from a hand-curated bundled set of 20+. Use for \"tell me a programmer joke\", \"coding","description":"A programming/tech joke from a hand-curated bundled set of 20+. Use for \"tell me a programmer joke\", \"coding\n    humor\".","tags":["tools"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"properties":{},"title":"programmer_jokeArguments","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/rate_joke_style":{"post":{"operationId":"rate_joke_style","summary":"A lighthearted, best-effort guess at whether a piece of text structurally looks like a pun, a knock-knock","description":"A lighthearted, best-effort guess at whether a piece of text structurally looks like a pun, a knock-knock\n    joke, or a one-liner — simple pattern matching, framed as playful, not an authoritative classifier. Use for\n    \"what kind of joke is this\".","tags":["tools"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"properties":{"joke_text":{"description":"A piece of joke text to classify.","minLength":1,"title":"Joke Text","type":"string"}},"required":["joke_text"],"title":"rate_joke_styleArguments","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}}}}