Skip to content

DecodingError when handling MCP tool calls - type 'mcp_call' not recognized #376

@VikashLoomba

Description

@VikashLoomba

Bug Description

When using MCP tools with the CreateModelResponseQuery API, the library throws a DecodingError when processing MCP tool call events.

Error Details

valueNotFound(OpenAI.Components.Schemas.OutputItem, Swift.DecodingError.Context(codingPath: [CodingKeys(stringValue: "item", intValue: nil)], debugDescription: "The anyOf structure did not decode into any child schema."))

Cannot initialize _TypePayload from invalid String value mcp_call

Root Cause

The server sends OutputItem with type "mcp_call" (with underscore), but the OutputItem decoder in ResponseOutputItemDoneEvent fails to decode this properly.

Steps to Reproduce

  1. Configure an MCP tool using Tool.mcpTool()
  2. Send a query using CreateModelResponseQuery with the MCP tool
  3. When the model invokes the MCP tool, the stream processing fails with a DecodingError

Expected Behavior

The library should properly decode MCP tool call events without throwing errors.

Code Example

let mcpTool = Tool.mcpTool(
    Components.Schemas.MCPTool(
        _type: .mcp,
        serverLabel: "playwright-mcp",
        serverUrl: "https://example.com/mcp",
        headers: Components.Schemas.MCPTool.HeadersPayload(additionalProperties: ["Authorization": "Bearer token"]),
        allowedTools: .case1(["browser_navigate"]),
        requireApproval: .case2(.never)
    )
)

let query = CreateModelResponseQuery(
    input: .inputItemList(inputItems),
    model: "gpt-5-2025-08-07",
    stream: true,
    tools: [mcpTool]
)

let stream: AsyncThrowingStream<ResponseStreamEvent, Error> = client.responses.createResponseStreaming(query: query)

// This fails when MCP tool is called
for try await event in stream {
    // Processing fails with DecodingError
}

Environment

  • Library Version: Latest main branch
  • Swift Version: 5.x
  • Platform: iOS
  • Xcode Version: Latest

Workaround

Currently catching and ignoring the DecodingError allows the stream to continue, but this is not ideal as it may hide other legitimate errors.

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions