Hi people,
I’m seeing an inconsistency between documented behavior and runtime behavior in ChatGPT Dev for MCP Apps.
According to docs, tool results should include structuredContent + _meta, where _meta is widget-only data (not added to model context).
Docs references:
-
developers.openai. com/apps-sdk/build/mcp-server
-
github. com/modelcontextprotocol/ext-apps/blob/main/specification/2026-01-26/apps.mdx
My server returns this from load_project:
{
"content": [{ "type": "text", "text": "Loaded project \"test\"." }],
"structuredContent": {
"project": {
"id": "yeu5lfsg36nfzpcp65mvvhyt",
"name": "test",
"type": "email",
"createdAt": "2026-03-28T10:33:56.832Z",
"updatedAt": "2026-03-28T10:33:56.832Z"
},
"projectUrl": "https://.../project/yeu5lfsg36nfzpcp65mvvhyt"
},
"_meta": {
"projectData": { "...large json..." }
}
}
Inside the MCP app (onToolResult), ChatGPT delivers:
{
"content": [
{
"type": "text",
"text": "{\"project\":{...},\"projectUrl\":\"https://...\"}"
}
],
"structuredContent": {
"project": { ... },
"projectUrl": "https://..."
}
}
Observed problems:
-
Custom _meta is missing entirely in ui/notifications/tool-result.
-
content[0].text appears rewritten to a JSON string of structuredContent instead of the original text.
We intentionally keep large projectData in _meta to avoid inflating model-visible context. Duplicating projectData into structuredContent is not viable (payload can be MBs).
Expected behavior:
- ui/notifications/tool-result should preserve custom _meta fields from the MCP tool result (eg _meta.projectData) as documented.
Can you confirm whether this is a known limitation/regression in ChatGPT MCP Apps, and whether custom _meta forwarding is expected to be supported?
Also, an important note, the same app works correctly in a regular MCP App inspector based on MCP App standard. I’m using the official bridge (`@modelcontextprotocol/sdk` and `@modelcontextprotocol/ext-apps`)