{"openapi":"3.1.0","info":{"title":"Memeformat API","version":"0.1.0","description":"A fully local, hand-curated meme-template structure reference (ten formats described generically, never reproducing a specific copyrighted meme image) plus computed caption tools: a caption-fit checker, a word-wrap line-break suggester, an aspect-ratio guide, a use-case format finder, and a mocking-case text transformer.\n\nEvery operation is read-only or compute-only. The same tools are available over MCP (streamable HTTP) at https://memeformat.connectorbay.com/mcp.","contact":{"name":"Unify Dynamics LLC","email":"hr@unifydynamics.com","url":"https://connectorbay.com/memeformat/docs"},"termsOfService":"https://connectorbay.com/memeformat/terms"},"servers":[{"url":"https://memeformat.connectorbay.com"}],"externalDocs":{"url":"https://connectorbay.com/memeformat/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/format_info":{"post":{"operationId":"format_info","summary":"Full detail for one meme format: structure, panel count, caption slots, typical max lines/characters per","description":"Full detail for one meme format: structure, panel count, caption slots, typical max lines/characters per\n    line, when to use it, tone, and recommended aspect ratio. Use for \"what's the structure of a comparison-panel\n    meme\".","tags":["tools"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"properties":{"format":{"description":"A format id or name.","examples":["classic_macro","comparison_panel"],"minLength":1,"title":"Format","type":"string"}},"required":["format"],"title":"format_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}},"/v1/tools/format_list":{"post":{"operationId":"format_list","summary":"All ten formats with a one-line structure summary and panel count. Use for \"what meme formats do you","description":"All ten formats with a one-line structure summary and panel count. Use for \"what meme formats do you\n    have\".","tags":["tools"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"properties":{},"title":"format_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/format_finder":{"post":{"operationId":"format_finder","summary":"Suggests 1-3 formats suited to a described situation, keyword-matched against each format's stated","description":"Suggests 1-3 formats suited to a described situation, keyword-matched against each format's stated\n    when-to-use and tone. Use for \"what format works for comparing two choices\", \"best format for an escalating\n    joke\".","tags":["tools"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"properties":{"intent":{"description":"A situation or goal, in plain language.","examples":["comparing two options","showing an escalating scale of effort"],"minLength":1,"title":"Intent","type":"string"}},"required":["intent"],"title":"format_finderArguments","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/recommended_aspect_ratio":{"post":{"operationId":"recommended_aspect_ratio","summary":"The recommended image aspect ratio for one format. Use for \"what aspect ratio should a screenshot-quote","description":"The recommended image aspect ratio for one format. Use for \"what aspect ratio should a screenshot-quote\n    meme be\".","tags":["tools"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"properties":{"format":{"description":"A format id or name.","minLength":1,"title":"Format","type":"string"}},"required":["format"],"title":"recommended_aspect_ratioArguments","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/caption_fit_check":{"post":{"operationId":"caption_fit_check","summary":"Computed check: given a format and one caption per slot, reports character count, word count, wrapped","description":"Computed check: given a format and one caption per slot, reports character count, word count, wrapped\n    line count, and whether each caption fits that format's typical line-count/character-per-line convention,\n    with specific issues listed when it doesn't. Use for \"does this caption fit a classic macro\", \"check these\n    three captions against an escalation-ladder format\".","tags":["tools"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"properties":{"format":{"description":"A format id or name.","minLength":1,"title":"Format","type":"string"},"captions":{"description":"One caption string per caption slot, in slot order.","items":{"type":"string"},"minItems":1,"title":"Captions","type":"array"}},"required":["format","captions"],"title":"caption_fit_checkArguments","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/line_break_suggester":{"post":{"operationId":"line_break_suggester","summary":"Standalone word-wrap calculator: breaks a caption into lines of at most max_chars_per_line characters","description":"Standalone word-wrap calculator: breaks a caption into lines of at most max_chars_per_line characters\n    without splitting a word. Use for \"how would this caption line-break at 20 characters per line\".","tags":["tools"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"properties":{"caption":{"description":"The caption text.","minLength":1,"title":"Caption","type":"string"},"max_chars_per_line":{"default":24,"description":"Maximum characters per line.","maximum":200,"minimum":1,"title":"Max Chars Per Line","type":"integer"}},"required":["caption"],"title":"line_break_suggesterArguments","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/caption_style_tips":{"post":{"operationId":"caption_style_tips","summary":"Typography and wording conventions for meme captions: classic all-caps outlined style vs. plain sentence","description":"Typography and wording conventions for meme captions: classic all-caps outlined style vs. plain sentence\n    case, punchline placement, margins. Use for \"how should I style my meme caption text\".","tags":["tools"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"properties":{},"title":"caption_style_tipsArguments","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/mocking_case_convert":{"post":{"operationId":"mocking_case_convert","summary":"Applies the classic 'aLtErNaTiNg CaPs' mocking-tone text transform, alternating letter case while leaving","description":"Applies the classic 'aLtErNaTiNg CaPs' mocking-tone text transform, alternating letter case while leaving\n    spaces and punctuation untouched. Use for \"convert this to mocking alternating caps text\".","tags":["tools"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"properties":{"text":{"description":"Text to convert.","examples":["are you serious right now"],"minLength":1,"title":"Text","type":"string"}},"required":["text"],"title":"mocking_case_convertArguments","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/meme_glossary":{"post":{"operationId":"meme_glossary","summary":"Defines meme-culture terms: macro, template, exploitable, caption, impact font, OC, format fatigue, panel,","description":"Defines meme-culture terms: macro, template, exploitable, caption, impact font, OC, format fatigue, panel,\n    caption slot, aspect ratio. Use for \"what does OC mean\", \"what's an exploitable\".","tags":["tools"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"properties":{"term":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null,"description":"A specific term to look up; omit to list all.","title":"Term"}},"title":"meme_glossaryArguments","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}}}}