memeworld
Documentation

MCP

caption_meme

Needs a key

Render a PNG or GIF and return a permanent URL.

Renders captions onto one of memeworld’s templates and stores the result. The URL it returns is permanent and content addressed: the same template, captions, preset and watermark always produce the same URL, so a repeated request costs nothing.

Captions are drawn in the meme font, uppercased, and auto-fitted — short lines stay large, a sentence shrinks until it fits. Write short.

Arguments

  • templateId — number | string, required. Id, slug, or the <slug>-<id> form from an editor URL.
  • captions — string[] | Record<string, string>, required. An array in text box order, or an object keyed by box id. Up to 16 captions of 300 characters. Unknown ids are rejected rather than dropped.
  • format — 'png' | 'gif', optional. Defaults to the template’s own kind. A still cannot be rendered as a GIF.
  • preset — 'high' | 'discord' | 'emoji' | 'compact', optional. GIF size preset. Defaults to discord. Ignored for stills.
  • watermark — boolean, optional. Defaults to true.

Returns

  • url — permanent URL for the file.
  • format, width, height, bytes, and frames for GIFs.
  • maxBytes and overBudget — the preset’s ceiling, and whether the file came in over it.
  • cached — true when the render already existed and no work was done.

Example

{
  "name": "caption_meme",
  "arguments": {
    "templateId": 42,
    "captions": [
      "writing the api by hand",
      "letting the agent do it"
    ]
  }
}

The structured result:

{
  "url": "https://memeworld.afterlume.workers.dev/cdn/renders/9f2c4a1b8e7d6c5b4a39281706f5e4d3.png",
  "format": "png",
  "width": 1200,
  "height": 1200,
  "bytes": 184320,
  "cached": false
}

Notes

A GIF that lands over its preset’s ceiling still comes back — it is a valid file, just too big for what that preset targets — with overBudget: true. Re-render with a stricter preset where the limit is enforced, like a Discord emoji slot.