modelcontextprotocol / modelcontextprotocol/ext-apps
Grok host: MCP Apps iframe rendering unstable for Paybox connector (custom BYO MCP)
Nobody has claimed this yet.
- Dominant language
- TypeScript
- Stars
- 2.9k
- Forks
- 387
- Avg merge
- 3h 21m
- Merged PRs (30d)
- 6
Description
Summary
Paybox (MoonPay) reports that Grok’s MCP Apps iframe host is extremely buggy when rendering Paybox’s in-chat UI widgets via a custom BYO MCP connector (https://mcp.paybox.sh or equivalent production endpoint).
The same Paybox MCP App UI resource renders on other major hosts (ChatGPT, Claude with correct handshake/CSP), but Grok’s iframe lifecycle is unreliable enough to block normal Paybox flows (signing, approvals, balance updates).
Reporter
MoonPay Paybox team (internal escalation from Paybox engineering)
Environment
- Host: Grok web (grok.com) — custom MCP connector (Bring Your Own MCP)
- MCP server: Paybox MCP (wallet / approvals / signing UI)
- UI: MCP Apps HTML resources (
text/html;profile=mcp-app) served from Paybox iframe surfaces (app.paybox.sh) - Protocol: MCP Apps /
io.modelcontextprotocol/uicapability
Observed problems (high level)
Paybox engineers report Grok’s iframe support is extremely buggy compared to Claude and ChatGPT. Symptoms align with known MCP Apps host-integration failure modes:
- Stale / non-updating UI — iframe continues showing prior state (e.g. pending approval button) after the underlying transaction completes; host does not deliver updated
tool-result/ lifecycle notifications reliably. - Signing window failures — signing / passkey approval surfaces fail to load or hang inside Grok’s embedded iframe.
- Multiple concurrent iframes — duplicate widget instances for a single logical action (e.g. several signer-key regeneration iframes in one session), with poor cross-iframe state coordination.
- General iframe lifecycle instability — intermittent blank/hidden widgets, missed
ui/initialize/ui/notifications/initializedhandshakes, or postMessage delivery gaps (similar symptoms documented for other hosts in ext-apps issues, but Grok-specific regressions appear worse / more frequent for Paybox).
Expected behavior
Per MCP Apps host requirements:
- Host calls
tools/calland receivesstructuredContent+ UI linkage via_meta.ui.resourceUri - Host fetches HTML via
resources/readand mounts sandboxed iframe - Host completes UI handshake and delivers
tool-input/tool-resultnotifications - Widget updates reflect server state changes without requiring the user to ask the model to “verify” or open external approval links
Actual behavior
Grok intermittently fails steps 2–4. Users see broken, stale, or duplicated Paybox UI inside Grok chat while the same flows work on other MCP hosts.
References / related issues
- Cross-host MCP Apps rendering debugging: https://github.com/modelcontextprotocol/ext-apps/issues/671
- Working minimal demo that renders on ChatGPT + Grok + Claude (when handshake fixed): https://github.com/primevalsoup/mcp-apps-claude-demo
- Paybox parallel report (Claude stale UI after successful swap): internal Paybox eng Slack 2026-08-19
Request for xAI / Grok host team
Please investigate Grok’s MCP Apps iframe host implementation for custom connectors:
- iframe mount + visibility (
ui/initialize/ui/notifications/initialized) - delivery of
tool-resultand lifecycle notifications after state changes - handling multiple widgets in one conversation
- CSP / sandbox / postMessage bridge for third-party MCP App origins
Happy to provide repro videos, connector URL, and server logs on request.
Contributor guide
First steps
- Read the whole issue, then the project's contributing guide.
- Comment on the issue to say you are picking it up — it saves two people doing the same work.
- Fork the repository and make your change on a branch.
- Open a pull request that references the issue number.
Research direction
Start by reviewing the cross-host MCP Apps debugging discussion in ext-apps issue 671 and the linked minimal demo. Reproduce the Paybox flow through the custom MCP connector, focusing on iframe mounting, handshake, lifecycle notifications, and concurrent widgets. Done means the embedded UI reliably loads, updates after tool results, and avoids duplicate or blank instances.
Written by the indexing model from the issue text.
Assessment
- Tech stack
- typescript
- Domain
- frontend, web-dev
- Issue type
- Bug
- Difficulty
- 4/5
- Estimated time
- 3-5 days
- Activity status
- Quiet
- Clarity
- Needs clarification
- Newbie friendliness
- 35/100