`enable_output_schema` breaks Claude Desktop tool execution

Summary

When enable_output_schema: true is set in the Apollo MCP Server configuration, Claude Desktop (and Claude.ai web) report “Error occurred during tool execution” for every tool call, even though the server returns valid, successful responses. Disabling enable_output_schema immediately resolves the issue.

Environment

Component Version / Details
Apollo MCP Server ghcr.io/apollographql/apollo-mcp-server:canary-20260213T211530Z-a65567d (v1.7.0)
Claude Desktop v1.1.3541 (macOS, darwin arm64)
MCP Protocol (client requested) 2025-11-25
MCP Protocol (server negotiated) 2025-03-26
`mcp-remote` proxy v0.1.37 (used for local debugging)
Transport streamable_http

Reproduction Steps

  1. Configure Apollo MCP Server with enable_output_schema: true:
    overrides:
      mutation_mode: explicit
      enable_output_schema: true
    
  2. Connect Claude Desktop to the MCP server (tested both directly via production ALB and locally via `mcp-remote`).
  3. Specific tools consistently failed GraphQL-backed operation (e.g., FindPersonByEmailOrLinkedIn) while others don’t (e.g. GetAuthenticatedUser, SearchPeopleByNameOrLinkedinInOrEmail).
  4. **Result:** Claude Desktop shows “Error occurred during tool execution” to the user.
  5. Set enable_output_schema: false, restart the server, reconnect.
  6. Call the same tools.
  7. **Result:** All tools succeed and return data correctly.

Root Cause Analysis

When enable_output_schema: true is set, the Apollo MCP Server:

1. Adds outputSchema to tool definitions in tools/list

Each tool definition includes an `outputSchema` field alongside `inputSchema`:

{
  "name": "FindPersonByEmailOrLinkedIn",
  "description": "Searches for a specific person...",
  "inputSchema": { ... },
  "outputSchema": {
    "type": "object",
    "properties": {
      "data": { ... },
      "errors": { ... },
      "extensions": { ... }
    }
  }
}

2. Adds structuredContent to tool call responses

The tools/call response includes both content (standard) and structuredContent (extended):

{
  "jsonrpc": "2.0",
  "id": 2,
  "result": {
    "content": [
      {
        "type": "text",
        "text": "{\"data\":{\"personByEmailOrSlug\":{\"id\":\"...\",\"fullName\":\"David Chang\", ...}}}"
      }
    ],
    "structuredContent": {
      "data": {
        "personByEmailOrSlug": {
          "id": "...",
          "fullName": "David Chang",
          ...
        }
      }
    },
    "isError": false
  }
}

3. Protocol version mismatch

The server negotiates MCP protocol version 2025-03-26, but outputSchema and structuredContent are features from a newer MCP specification. Claude Desktop (requesting protocol 2025-11-25) does not properly handle these fields in the context of the negotiated 2025-03-26 protocol, causing it to reject the tool result.

Evidence

Server-side: All calls succeed

Apollo MCP Server debug logs show every tool call completing successfully:

DEBUG serve_inner: received request id=2 request=CallToolRequest(... name: "FindPersonByEmailOrLinkedIn" ...)
DEBUG call_tool: HTTP request POST https://api.connectvia.ai ... status_code=200 OK
DEBUG serve_inner: response message id=2 result=CallToolResult(... is_error: Some(false) ...)

Client-side: mcp-remote receives valid response

The mcp-remote proxy log confirms the full successful response is forwarded to Claude Desktop:

[43896] [Remote→Local] 2
Message from server: {"jsonrpc":"2.0","id":2,"result":{"content":[...],"structuredContent":{...},"isError":false}}

Claude Desktop: Shows error to user

Despite receiving a valid response with isError: false, Claude Desktop presents “Error occurred during tool execution” to the user.

Fix confirmed

Setting enable_output_schema: false removes outputSchema from tool definitions and structuredContent from responses. With this change, the exact same tool calls succeed immediately.

Workaround

Set enable_output_schema: false in the Apollo MCP Server configuration:

overrides:
  mutation_mode: explicit
  enable_output_schema: false

This disables outputSchema on tool definitions and structuredContent on tool responses. Tools continue to work correctly — the response data is still available in the standard content[0].text field as a JSON string.

Impact

  • **All** GraphQL-backed tools are affected when enable_output_schema: true
  • Affects Claude Desktop (v1.1.3541) and Claude.ai web
  • Claude Code is also affected (tested via mcp-remote proxy)
  • The workaround (enable_output_schema: false) resolves the issue but loses the structured output capability

Suggested Fix

The Apollo MCP Server should either:

  1. **Respect the negotiated protocol version** — only include outputSchema/structuredContent when the client and server agree on a protocol version that supports these features.
  2. **Gate structured output behind client capability negotiation** — check if the client advertises support for structured content before including it in responses.
  3. **Make structuredContent additive, not breaking** — ensure the response is valid even if the client ignores structuredContent, i.e., the issue may be in how structuredContent interacts with the response envelope rather than its mere presence.
2 Likes

Thanks for the thorough report, @mjfaga. The root cause analysis is spot-on!

We’re going to implement your suggested fix. When enable_output_schema is set to true, the server will advertise 2025-06-18, which will help capable clients negotiate it correctly. For clients using older protocol versions, we’ll remove outputSchema and structuredContent per session, so there won’t be any unexpected fields that could disrupt tool execution.

The PR is currently under review. Once it’s approved, I’ll create a release candidate for you to test. In the meantime, setting enable_output_schema to false is still a good workaround.

Hi @mjfaga, I just cut an RC for you. You can pull the image:

docker pull ghcr.io/apollographql/apollo-mcp-server:canary-20260220T220628Z-98443b3

Let me know if this solves your issue. If it works, we will schedule a release for next week.

The fix is now available in v1.8.0.: