Preserve MCP App UI metadata in tool-call events and history (#45805)

## Why

Clients need widget presentation details to render MCP Apps without waiting for the full MCP catalog, including when replaying saved history.

## What changed

- Add `mcpToolCall.mcpAppUi` with the invoked descriptor's `resourceUri` and `preferredModelDisplayMode`, and carry it through tool-call events and saved history.
- Support `fullscreen` and default to `inline` when the display preference is missing or unsupported.
- Keep existing resource URI fields for compatibility. Leave `mcpAppUi` null for older history and tools that declare widgets only in result metadata, where clients still use catalog discovery.
- Update protocol schemas, TypeScript and Python types, and app-server documentation.

## Testing

Add parameterized integration coverage for fullscreen, missing and unsupported preferences, legacy URI metadata, and result-only widgets, verifying consistent tool events and preservation across session resume.

GitOrigin-RevId: 2a9bed804dcea8c2b4903b8406fa6710681f7f5e
This commit is contained in:
victor-openai
2026-09-15 22:52:56 +00:00
committed by copyberry
parent 872fc22f9c
commit b71af39fe6
51 changed files with 1027 additions and 47 deletions
@@ -676,6 +676,29 @@
"LegacyAppPathString": {
"type": "string"
},
"McpAppDisplayMode": {
"enum": [
"inline",
"fullscreen"
],
"type": "string"
},
"McpAppUi": {
"description": "UI resource and display preference for model invocations, captured from the tool descriptor.",
"properties": {
"preferredModelDisplayMode": {
"$ref": "#/definitions/McpAppDisplayMode"
},
"resourceUri": {
"type": "string"
}
},
"required": [
"preferredModelDisplayMode",
"resourceUri"
],
"type": "object"
},
"McpToolCallAppContext": {
"properties": {
"actionName": {
@@ -1730,12 +1753,23 @@
"type": "string"
},
"mcpAppResourceUri": {
"description": "Deprecated: use `appContext.resourceUri` instead.",
"description": "Legacy compatibility field; prefer `mcpAppUi.resourceUri` when available.",
"type": [
"string",
"null"
]
},
"mcpAppUi": {
"anyOf": [
{
"$ref": "#/definitions/McpAppUi"
},
{
"type": "null"
}
],
"description": "Presentation captured from the invoked descriptor; absent in older history."
},
"pluginId": {
"type": [
"string",