MCP tool call result structure: content, structuredContent
An MCP tool call result has a content array, optional structuredContent, and isError. What goes where, how images travel, and how errors look.

An MCP tool call result is a JSON object with three main parts: a content array of items (text, image, audio, resource links, and embedded resources), an optional structuredContent field for machine-readable data, and isError, which is true when the tool itself failed. Images and audio travel as base64 data with a mimeType, and a tool that returns structured data should also put it in a text item as serialized JSON.
The structure comes from the MCP 2025-11-25 tools page and schema reference, with changes from the 2026-07-28 tools page and changelog, all read on 2026-09-28. The worked example is Sume's hosted MCP server, from its current code; Sume's basics page says hosted MCP still works but is not the primary path today.
What fields does a tool call result have?
The result sits in the JSON-RPC response's result. The spec's weather example returns the same data twice, as text and as structuredContent:
| Field | Required | What it holds |
|---|---|---|
content | Yes | A list of content objects: the unstructured result of the call |
structuredContent | No | The structured result: a JSON object in 2025-11-25, any JSON value in 2026-07-28 |
isError | No | Whether the call ended in an error; treated as false when not set |
resultType | Yes, from 2026-07-28 | "complete" for ordinary results; clients treat an older result without it as "complete" |
{
"jsonrpc": "2.0",
"id": 5,
"result": {
"content": [
{ "type": "text", "text": "{\"temperature\": 22.5, \"conditions\": \"Partly cloudy\", \"humidity\": 65}" }
],
"structuredContent": { "temperature": 22.5, "conditions": "Partly cloudy", "humidity": 65 }
}
}How do I return an image from an MCP tool?
Add an image item to content: "type": "image", the image as base64 in data, and its mimeType, such as image/png. The schema notes that different providers may support different image types. Every content type can also carry optional annotations for audience, priority, and modification times. The other item types:
text: atextstring.audio: base64dataand amimeType, such asaudio/wav.resource_link: aurithe client can subscribe to or fetch, with aname,description, andmimeType. The linked resource isn't guaranteed to appear inresources/list.resource: an embedded resource with itsuri,mimeType, and contents. Servers that embed resources SHOULD implement the resources capability.
When should I use structuredContent and an outputSchema?
Use structuredContent when a program, not only the model, reads the result. For backwards compatibility, a tool that returns it SHOULD also return the serialized JSON in a text block. The spec calls it server-produced result data, unrelated to LLM structured outputs, which it glosses as schema-constrained model generation.
A tool can also declare an outputSchema. If it does, servers MUST return structured results that conform to it, and clients SHOULD validate them; the spec says this enables strict schema validation and gives type information for better integration with programming languages. In 2025-11-25 the schema's root is restricted to type: "object"; the 2026-07-28 revision loosens inputSchema and outputSchema to any JSON Schema 2020-12 keywords.
How does a tool report an error in the result?
With isError: true and a content item that explains what went wrong. The schema says errors that originate from the tool SHOULD be reported inside the result, not as a protocol-level error, or the model can't see the error and self-correct. Errors in finding the tool, or other exceptional conditions, should be MCP error responses instead; MCP error codes covers those numbers.
What does Sume's MCP server return?
One text item, in current code. On success, Sume's hosted server returns a single text item holding a JSON object, with isError: false, and no structuredContent. Its listed tools carry name, title, description, inputSchema, and annotations, and no outputSchema.
- A failure is one
textitem whose JSON has acodeand amessage, withisError: true. - A result over 256 KB is replaced by an
isError: trueresult with the codemcp_output_too_large, which its message calls an output limit, not a job failure: never resubmit a paid create. - There are no image or audio items. Generation tools answer with a job id, and a finished job's artifacts carry
media.sume.comURLs, whichjobs_resultreturns inside that JSON.
Sources
Related posts
More in Developers
- MCP tool exceeds maximum allowed tokens: the fix
Claude Code caps MCP tool output at 25,000 tokens by default. Raise it with MAX_MCP_OUTPUT_TOKENS, or make the tool return less data.
- MCP tool limit in VS Code, Claude Code, and Cursor
VS Code allows 128 enabled tools per chat request. Claude Code has no fixed cap and defers MCP tools. Cursor's MCP docs name no number.
- MCP tools vs resources vs prompts: who controls each
MCP tools are called by the model, resources are attached by the app, and prompts are picked by the user. What each one is for, and how to choose.
- Faststart MP4: moving the moov atom to the front
A faststart MP4 has its index, the moov atom, at the start of the file. FFmpeg moves it there with -movflags +faststart in a second pass.
Written by Sume