“MCP App renders blank”
The host fetched the view and put it in a sandboxed iframe, and the iframe painted nothing: the view never connected to the host, the host's CSP refused its code, or it connected and received no data or no height. The three common causes: (1) The view never opens the bridge: nothing calls the ext-apps SDK's app.connect() (or useApp() in React), so no ui/initialize reaches the host and Claude never sizes or shows the frame. To tell: The doctor fails at resource-bridge; Claude's developer tools show the inner iframe with no ui/initialize message. (2) The host's CSP refuses the bundle: a script or stylesheet loaded from an origin _meta.ui.csp.resourceDomains does not declare, or by a relative URL that resolves to the host's sandbox instead of your server. To tell: The doctor fails at resource-csp-undeclared or resource-relative-refs; the iframe's console says "Refused to load the script". (3) The view connects and gets no data or no height: it reads only structuredContent (Claude Desktop was seen to drop it), or its root element has zero height so the host collapses the frame. To tell: The doctor passes; its preview shows the view empty. In the host's developer tools the inner iframe is 0 px tall or the tool-result notification has no structuredContent. One command shows which: npx --allow-git=root github:agentwares/mcp-apps-doctor https://your-server.example/mcp.
Check your server now
npx --allow-git=root github:agentwares/mcp-apps-doctor https://your-server.example/mcp
Discovery only: no credential, no tool called. It prints the first broken step, whose it is, and the fix with its source, and shows the view in a sandboxed preview.
Who prints it
Nobody prints it: Claude, ChatGPT and VS Code show the tool call and then an empty or invisible frame, with nothing in the server's logs.
The three causes, and how to tell them apart
- Cause 1. The view never opens the bridge: nothing calls the ext-apps SDK's app.connect() (or useApp() in React), so no ui/initialize reaches the host and Claude never sizes or shows the frame.
The check flags it atresource-bridge. The doctor fails at resource-bridge; Claude's developer tools show the inner iframe with no ui/initialize message. - Cause 2. The host's CSP refuses the bundle: a script or stylesheet loaded from an origin _meta.ui.csp.resourceDomains does not declare, or by a relative URL that resolves to the host's sandbox instead of your server.
The check flags it atresource-csp-undeclared. The doctor fails at resource-csp-undeclared or resource-relative-refs; the iframe's console says "Refused to load the script". - Cause 3. The view connects and gets no data or no height: it reads only structuredContent (Claude Desktop was seen to drop it), or its root element has zero height so the host collapses the frame.
The check cannot see this one from outside: it happens inside the host or the portal. The doctor passes; its preview shows the view empty. In the host's developer tools the inner iframe is 0 px tall or the tool-result notification has no structuredContent.
Sources and public reports
- "Tool call appears but the app is invisible": missing app.connect() or zero height [source: Claude, Troubleshoot MCP Apps, read 8 October 2026]
- renders in MCP Inspector, blank in claude.ai: Claude requires the App.connect() handshake before it shows the iframe [observed in modelcontextprotocol/ext-apps#615, opened 16 April 2026]
- Claude Desktop delivered tool results without structuredContent; views built per the SDK examples rendered blank [observed in modelcontextprotocol/ext-apps#696, opened 7 July 2026]
- Claude negotiated the extension and read the resource, then showed only the text fallback [observed in modelcontextprotocol/ext-apps#671, opened 27 May 2026]
Keep checking
Other messages
- “Resource not found: ui://”
- “Tool has no UI”
- “Invalid ui.domain format”
- “ui.domain mismatch”
- “Refused to load the script”
- “annotations_required”
- “domain_verification_required”
- “frame_domain_explanation_required”
- “screenshots_not_allowed”
- “Failed to fetch template”
Written 8 October 2026 from the sources above. The MCP Apps check · MCP Liveness · Terms · Privacy