MCP HTTP tool results: only the first text content block reaches the model; additional text blocks are silently dropped
MCP HTTP tool results: only the first text content block reaches the model; additional text blocks are silently dropped
Description
When a remote MCP server (HTTP transport) returns a tool result with multiple text content blocks, only the first block is surfaced to the model. The remaining text blocks are silently dropped.
Reproduced on 2.1.233 and 2.1.245 (latest at time of writing).
Reproduction
The official Outline wiki (self-hosted, ≥ v1.7.0) ships an MCP server at https://<instance>/mcp (Streamable HTTP, stateless). Its fetch tool, for resource: "document", returns two text blocks by design — JSON metadata first, then the document body as markdown. Source: server/tools/fetch.ts, covered by the test "returns document metadata and markdown" in fetch.test.ts:
{ "result": { "content": [
{ "type": "text", "text": "{\"document\":{...metadata...},\"breadcrumb\":\"...\"}" },
{ "type": "text", "text": "## The document markdown body..." }
] } }
The server is registered as a plain direct HTTP entry in ~/.claude.json (no wrapper, no gateway):
{ "mcpServers": { "outline": { "type": "http", "url": "https://<instance>/mcp" } } }
Calling fetch from a session returns only the JSON metadata block; the markdown block never reaches the model.
Evidence that the server is not at fault
- A raw curl to the same URL returns both blocks — the exact request the client makes:
``bash``
curl -s https://<instance>/mcp \
-H "Content-Type: application/json" \
-H "Accept: application/json, text/event-stream" \
-H "Authorization: Bearer <token>" \
-d '{"jsonrpc":"2.0","id":1,"method":"tools/call","params":{"name":"fetch","arguments":{"resource":"document","id":"<document-uuid>"}}}'
The (SSE-framed) response contains content[0] (metadata) and content[1] (markdown). Verified both directly against the origin and through the reverse proxy chain in front of it.
- Same symptom against a second, independent Outline instance on a different domain — rules out any single-server cause.
- Data inside the first block arrives intact (e.g. the
textfield oflist_templates, thecontextsnippet oflist_documents) — only additional content blocks are dropped.
Expected behavior
All text content blocks of an MCP tool result should reach the model (e.g. concatenated), per the MCP spec's tool result content model.
Impact
Any MCP server that splits tool results into multiple text items (a spec-sanctioned pattern; Outline is a prominent example) silently loses data. For Outline users this means Claude Code cannot read any document contents via MCP.
Possibly related
- #55677 — text content dropped from model when
structuredContentis present - #45575 — only
structuredContentrendered when both are returned
This case involves no structuredContent — just two plain text blocks, of which the second is dropped.
Environment
- Claude Code: 2.1.245 (also reproduced on 2.1.233)
- OS: CachyOS (Arch Linux), kernel 7.1.8
- MCP server: self-hosted Outline v1.7+ (
type: http, direct URL)