Raw MCP content blocks
Execute returns one JSON text block with runId, result and logs. Returning raw MCP content blocks such as images isn't supported yet.
Minion's execute tool always returns one text content block. You can't return raw MCP content blocks such as images, audio or resources. A __mcpContent field in your return value is treated as ordinary data.
What execute returns
Every call returns the same shape, as JSON text and as structured content:
{
"runId": "run_...",
"result": { "your": "return value" },
"logs": ["anything you console.log"],
"replayed": false
} If the code throws or hits a limit, you get error (with a kind and message) instead of result, and the tool result is marked as an error. replayed is true when you reused an idempotencyKey and got the stored run back.
Your return value must be JSON-serializable. Ordinary execute results have a 100 KiB soft cap: oversized strings are UTF-8-safe truncated with a truncation marker, while oversized structured values return a small marker naming their type. The separate host capability response limit is 1 MiB; a capability response over that limit fails explicitly. Open any run later with minion.runs.get({ id }) or at /app/runs/<runId>.
Images and other binary data
You can return base64 data inside your JSON result, but the agent receives it as text, not as an image. For anything large, store it somewhere and return a link or a short description instead.
Results from remote MCP servers called through minion.mcp come back as data too. Their content array is inside the JSON result, marked untrusted: true, and isn't passed through as separate content blocks. See Connect remote MCP servers .
Returning raw content blocks from execute isn't supported yet.