Editorial

Research guide · MCP tool results · 13 September 2026

MCP structuredContent missing: debug outputSchema and empty tool results

An MCP tool can complete successfully while the model still sees an empty result, only one output channel, or a schema error. The fastest way to debug that is to separate what the server returned on the wire from what the client, bridge and model actually received.

Published 13 September 2026 · sources checked 13 September 2026

structuredContent

Machine-readable tool result channel

outputSchema

Optional declared JSON Schema for the result

SHOULD

Spec guidance to mirror structured JSON into TextContent for backwards compatibility

2026-07-28

Revision that permits any JSON value, not only an object root

Protocol boundary

What MCP actually requires from structured tool output

MCP tools can declare an optional outputSchema and return a machine-readable structuredContent value. Under the current tools specification, when an output schema is declared the server MUST return structured content that conforms to it, and clients SHOULD validate that result.

The same specification gives an important compatibility rule: when a tool returns structured content it SHOULD also return the serialized JSON in a TextContent block for backwards compatibility. That is not a mandate to duplicate arbitrary prose. It is a practical way to keep older or lossy clients from turning a valid structured result into an apparently empty tool call.

MCP 2026-07-28 also widened structured results beyond object roots. structuredContent can now be any JSON value, including arrays and scalars. If an older client silently assumes every structured result is an object, an otherwise valid current server can appear broken.

Fast diagnosis

Find the layer where the result disappeared

Observed signalLikely boundaryFirst action
Raw response has no structuredContentServer or server-SDK serialization boundaryInspect the actual tools/call result before changing the client.
Raw response has structuredContent; model cannot see itClient, bridge or model-transcription boundaryCompare raw transport evidence with the model-visible function result.
content is visible; structuredContent disappearsClient strips or ignores the structured fieldTest the same server with a second client before changing the schema.
structuredContent is visible; content disappearsClient prefers/transcribes one result channelKeep the two channels semantically consistent and isolate the client behavior.
Array/scalar result fails but object worksOlder object-only assumptionVerify the negotiated revision and test a current 2026-07-28 implementation.
outputSchema validation failsDeclared schema and returned structured value disagreeValidate the exact returned JSON value against the published outputSchema.

Ten-minute probe

Test content-only, structured-only and both with fresh markers

  1. 1. Generate a unique marker inside the tool call. Do not put the marker in the prompt or tool definition; you want proof that the returned value crossed the result boundary.
  2. 2. Return text only. Put the marker in a normal TextContent block and record whether the model can repeat it exactly.
  3. 3. Return structured content only. Put the marker only in structuredContent and record both the raw JSON-RPC result and what the model receives.
  4. 4. Return both channels. Put the same payload in structuredContent and serialized JSON text. If this works while structured-only fails, you have a compatibility signal rather than proof that the server schema is wrong.
  5. 5. Compare transport to transcription. Save the exact server response and the client/model-visible tool result. That comparison tells you whether data disappeared before or after the MCP transport boundary.
  6. 6. Repeat with an array or scalar if relevant. A 2026-07-28 client should not require every structured result to be an object unless your tool's own output schema says so.

Compatibility pattern

Return one semantic result through two compatible channels

When broad client compatibility matters, keep the structured value authoritative and mirror the same information as serialized JSON text. That follows the specification's backwards-compatibility recommendation and makes client-side field loss easier to detect.

const payload = { orderId: "ord_123", status: "ready" };

return {
  content: [{ type: "text", text: JSON.stringify(payload) }],
  structuredContent: payload,
};

If you declare outputSchema, validate payload against that exact schema in tests. Do not use the text mirror to hide a structured result that violates the contract.

Current implementation evidence

Fresh client bugs show both directions of result loss

An open Antigravity issue filed on 6 September 2026 reports a 2026-07-28 MCP tool whose structuredContent-only result reached the raw server response but was unavailable to the model; text-only and results containing both fields worked in the reporter's reproduction. That is client-specific evidence, not a new protocol rule.

An open Codex issue filed on 13 August 2026 reports the opposite-looking transcription failure: a tool returned both content and structuredContent, but the app-side function output exposed the structured object and dropped the text block. Direct stdio evidence in the report showed the server had returned both fields.

Together these reports make one diagnostic principle especially valuable: never infer what the server sent from what the model saw. Capture both sides of the boundary before rewriting your tool result contract.

Avoid false fixes

Do not weaken a valid contract to accommodate an unidentified client bug

  • Do not remove outputSchema just to make an error disappear. First determine whether the returned value actually violates the schema or the client mishandles a valid result.
  • Do not treat transport success as model visibility. A successful tools/call proves the call completed, not that every result field survived the client pipeline.
  • Do not fork semantics between content and structuredContent. If both carry the same result, keep them consistent so a client choosing either channel does not change the meaning.
  • Do not assume object-only structured output on 2026-07-28. Arrays and scalar JSON values are valid when allowed by the tool's schema.

Next checks

Once tool output is visible, verify the rest of the MCP path

Sources