[MCP Apps] Deferred MCP tool calls drop structuredContent/_meta, making interactive cards non-functional

Open 💬 2 comments Opened Jul 17, 2026 by zhangchao1101moon-blip

Summary

Interactive MCP Apps cards returned by a deferred MCP tool can be displayed but remain non-interactive in Codex Desktop. The MCP server returns valid structuredContent and top-level _meta, but the deferred/orchestrated tool path appears to preserve only the empty text content and not propagate the UI metadata to the host renderer.

Environment

  • Codex Desktop: 26.707.71524 (build 5263)
  • macOS: 14.6.1 (23G93), arm64
  • ChatCut Codex plugin: 0.2.18
  • MCP transport: streamable_http
  • MCP surface header: x-chatcut-mcp-surface=codex

Reproduction

  1. Install and enable chatcut@chatcut-inc.
  2. Invoke the deferred tool mcp__chatcut__ask_followup_questions with a minimal single-select field.
  3. The MCP tool returns a result shaped like:
{
  "content": [{ "type": "text", "text": "" }],
  "structuredContent": {
    "followupQuestions": {
      "id": "chatcut-followup-questions-...",
      "fields": [{
        "id": "interaction_test",
        "type": "single",
        "variant": "default",
        "options": [
          { "id": "yes", "label": "Can click and submit" },
          { "id": "no", "label": "Still cannot interact" }
        ]
      }]
    }
  },
  "_meta": {
    "openai/outputTemplate": "ui://chatcut/followup-questions-v33",
    "ui": {
      "resourceUri": "ui://chatcut/followup-questions-v33"
    },
    "followupQuestions": { "...": "same form payload" }
  }
}
  1. The card is shown in the conversation, but clicks/selections/submission do not work.

Actual behavior

The deferred tool orchestration path appears to surface the empty content[0].text while losing or detaching the top-level structuredContent / _meta required by the MCP Apps widget. The rendered card has no functional submission bridge.

Expected behavior

Deferred MCP tool results should preserve and forward the complete MCP Apps result envelope, including:

  • structuredContent
  • _meta["openai/outputTemplate"]
  • _meta.ui.resourceUri
  • tool-associated form state / submission bridge

The behavior should match a direct MCP Apps tool invocation so the card can receive clicks and submit its selection back into the conversation.

Notes

  • The ChatCut MCP endpoint is reachable and returns the complete form payload.
  • Refreshing the ChatCut marketplace and checking the current official plugin version did not change the behavior.
  • This is not specific to voice cards; a minimal default single-select form reproduces it.

View original on GitHub ↗

This issue has 2 comments on GitHub. Read the full discussion on GitHub ↗