Skip to content

Protocol Detection

Studio checks widget compatibility with ChatGPT and Claude by detecting which communication protocol the widget uses. Results appear as compatibility badges after tool execution.

BadgeMeaning
ChatGPT ✓Widget uses window.openai (legacy) or ext-apps protocol
Claude ✓Widget uses the ext-apps protocol (MCP Apps)

The original ChatGPT widget protocol. The host injects a window.openai global with toolInput, toolOutput, and action methods.

const data = window.openai.toolOutput;

Supported by: ChatGPT only.

The JSON-RPC protocol used by Claude and ChatGPT. The widget communicates with the host via window.parent.postMessage, starting with a ui/initialize handshake.

window.parent.postMessage({
jsonrpc: "2.0",
id: 1,
method: "ui/initialize",
params: {
protocolVersion: "2026-01-26",
appInfo: { name: "my-widget", version: "1.0.0" },
appCapabilities: {},
},
}, "*");

Supported by: ChatGPT and Claude.

Runs when widget HTML is loaded, before the iframe executes JavaScript.

SignalDetectsSource
window.openai in HTMLlegacy OpenAIRegex scan
ui/initialize in HTMLext-appsRegex scan
@modelcontextprotocol/ext-apps in HTMLext-appsSDK import
Resource MIME text/html;profile=mcp-appext-appsMCP resource metadata
_meta.ui in tool/resource responseext-appsMCP response metadata

Fires when the widget actually accesses an API inside the iframe.

SignalDetectsMechanism
Widget reads window.openai.toolInput or toolOutputlegacy OpenAIGetter trap on injected mock
Widget sends ui/initialize via postMessageext-appsMessage listener on iframe

Runtime detection is a fallback for cases where static analysis misses (e.g., minified code or dynamic protocol selection).