An MCP tools/call result comes back. Which content types could it contain?
MCP defines five tools/call content types: text, image and audio (base64 plus mimeType; audio added 2025), resource_link (URI pointer) and resource (embedded contents). Mixed arrays are allowed; the set is closed.
Think of a tool result as a small package that can hold different kinds of items. MCP gives tools five kinds of boxes to put things in. A text box holds written messages. An image box holds a picture encoded as data. An audio box holds a sound clip. A resource link box holds a card that says 'the actual thing lives at this address, go fetch it when you need it.' A resource box holds a whole file or document packed inside. A single package can contain several boxes at once, like a written summary next to a chart picture, and the host figures out how to show each piece to the model. Servers cannot invent new box types on their own.
Concept explanation~2 min read
Everything you need to truly understand this topic: intuition, mechanics, step by step explanation, code, formulas, and worked example. Click to expand.
Concept explanation~2 min read
Everything you need to truly understand this topic: intuition, mechanics, step by step explanation, code, formulas, and worked example. Click to expand.
A tools/call result in MCP carries the tool's output as a typed sequence of content blocks. The five valid types, the closed-set policy, and the lazy-fetch resource link are all design decisions that shape how agents handle multimodal payloads.
The result shape and the five content types
A tools/call JSON-RPC response returns {content: ContentBlock[], isError?: boolean}. The content array can be empty, contain one block, or contain many. Each block is a JSON object with a type field as the discriminator.
text is {type: "text", text: string}. A UTF-8 string payload for natural language output, query results, code, status messages, or any other text. The most common type by a wide margin.
image is {type: "image", data: string, mimeType: string}. The data field holds image bytes encoded as base64. The mimeType specifies the format (image/png, image/jpeg, image/webp). Hosts forward this to multimodal models as native image input. Browser automation tools return screenshots this way. Charting tools return generated visualizations. OCR tools can return the original image alongside recognized text.
audio is {type: "audio", data: string, mimeType: string}. Added in the 2025 spec. Same shape as image but for audio bytes (audio/wav, audio/mpeg, audio/ogg). Hosts route this to voice-capable models. Tools that synthesize speech, capture recordings, or produce audio analysis use this type.
resource_link is {type: "resource_link", uri: string, name: string, mimeType?: string}. Instead of inlining payload data, the block carries a reference to a resource the host can fetch via resources/read. The tool returns a pointer; the host decides whether and when to dereference it.
resource is {type: "resource", resource: {uri: string, mimeType?: string, text?: string, blob?: string}}. It embeds the resource's contents in the result, as text or a base64 blob.
Situations where this technique stops working.
2–4 min · Everything important, quickly.
Real products, models, and research that use this idea.
- A browser automation server returns a text description of the loaded page alongside an image screenshot; multimodal models read the screenshot as visual input to decide what to click next.
- A speech synthesis server returns an audio block with a wav payload and a text block describing the utterance; voice-capable hosts route the audio to the user, text-only hosts display the description.
What an interviewer would ask next. Try answering before peeking at the approach.
QWhy does MCP define a resource link content type instead of always inlining data in text or image blocks?
Inlining forces the tool to pay token and bandwidth cost on every result regardless of whether the model reads the data. A resource URI lets the host fetch lazily. A search returning twenty matches as pointers becomes twenty small blocks; the model picks the one it wants to inspect and only that one is fetched.
Red flags & common mistakes
The phrases that signal junior thinking. Click to expand.
Red flags & common mistakes
The phrases that signal junior thinking. Click to expand.
Assuming every tool result is plain text. MCP tools can return images, audio, and resource references in the same array, and a single call can mix types freely.
60 second bullets to scan on the way to the call.
Name all five content types: text, image, audio, resource_link, resource.
State that the type set is closed and servers cannot define custom types.
Primary sources. Browse if you want the original framing.
Same topic, related formats. Practice these next.