MCP
caption_meme
Needs a keyRender 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 todiscord. Ignored for stills.watermark— boolean, optional. Defaults to true.
Returns
url— permanent URL for the file.format,width,height,bytes, andframesfor GIFs.maxBytesandoverBudget— 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.