Videos c-2eEv2ou7Y
Why MCP and ChatGPT Apps Use Double Iframes — Frédéric Barthelet, Alpic
Scene timeline
59 shot(s).
keyframes kept every frame deduplicated
What was stored
- cues
- 160
- whisperx 160
- chunks
- 35
- from 160 cues
- keyframes
- 46
- kept of 59 captured
- frames with text
- 46
- 1,249 lines read
- chapters
- 0
- from the source metadata
- keyframe bytes
- 6.5 MB
- word timings on 160 cues
Provenance
| stage | state | model | started | took |
|---|---|---|---|---|
fetch |
done | — | 2026-08-11 10:37 | 1m 36s |
stt |
done | — | 2026-08-11 10:39 | 22s |
chunk |
done | — | 2026-08-11 10:39 | 0s |
text_embed |
done | — | 2026-08-11 10:39 | 0s |
keyframe |
done | — | 2026-08-11 10:39 | 1m 49s |
ocr |
done | — | 2026-08-11 10:41 | 22s |
frame_embed |
done | — | 2026-08-11 10:41 | 7s |
Frames, and what the machine read
-
- Al Engineer0.93
- EUROPE1.00
-
- PRESENTING SPONSOR0.99
- Google DeepMind1.00
-
- PLATINUM SPONSORS0.98
- # Braintrust0.95
- WorkOS OpenAI0.96
-
- AlEngineer1.00
- Why MCP & ChatGF0.97
- EUROPE1.00
- Double Iframes0.99
- And What That Means for Your App1.00
- Frédéric Barthelet0.99
- EU/ACC1.00
- AlEngineer1.00
- EUROPE1.00
-
- Why MCP & ChatGPT Apps Use0.99
- Double Iframes1.00
- AIE1.00
- And What That Means for Your App1.00
- Frédéric Barthelet1.00
- Co-founder @ Alpic0.98
- Google DeepMind1.00
- gineer0.98
- 260.99
-
- VV0.52
- What are MCP & ChatGPT Apps?0.97
- +16:340.97
- Fifty Six0.98
- ***0.67
- AIE1.00
- Discoverability in-chat and in stores on ChatGPT and Claude1.00
- £2751.00
- £279 63660.93
- ★1.00
- ★1.00
- ★1.00
- ★1.00
- Interactive UI inside Al chats0.98
- Liad and Ido experimenting with MCP-UI1.00
- Initially released on ChatGPT as OpenAl's Apps SDK0.98
- Standardized as MCP first official extension0.99
- Poser une question0.99
- Omupbox0.86
- Engineering the future of Al1.00
- gineer1.00
- 260.99
-
- AV0.67
- What are MCP & ChatGPT Apps?1.00
- +16:350.99
- (reduced from £429) is very competitive for a1.00
- January coastal stay.0.98
- AIE1.00
- ★1.00
- Discoverability in-chat and in stores on ChatGPT and Claude1.00
- - Pet-friendly W - not all 1-bed coastal0.98
- cottages allow dogs, so this is a big plus if1.00
- you're bringing one.1.00
- ★1.00
- ★1.00
- ★1.00
- ★1.00
- Interactive UI inside Al chats0.99
- - Easy & practical – Wi-Fi, on-site parking, and0.98
- Overall vibe0.98
- no resort crowds.0.98
- Liad and Ido experimenting with MCP-UI1.00
- Quiet, comfortable, and well located — ideal if0.99
- Initially released on ChatGPT as OpenAl's Apps SDK0.99
- Poser une question1.00
- Standardized as MCP first official extension0.99
- C'est0.99
- Oui0.86
- M1.00
- 1231.00
- 己0.57
- 曲0.83
- Braintrust1.00
- WorkOS OpenAI0.95
- gineer1.00
- 260.89
-
- What are MCP & ChatGPT Apps?0.97
- 16:341.00
- ChatGPT5.21.00
- @0.77
- Can you find me a cottage for 20.99
- ★1.00
- in Cornwall next week?1.00
- AIE1.00
- Discoverability in-chat and in stores on ChatGPT and Claude1.00
- Cottages1.00
- ★1.00
- Connwall 26 Jan - 2 Fob - 2 aduits - 39 properties0.96
- ★1.00
- ★1.00
- Interactive UI inside Al chats0.99
- Liad and Ido experimenting with MCP-UI1.00
- Initially released on ChatGPT as OpenAl's Apps SDK0.99
- Standardized as MCP first official extension0.99
- Rosecraddoc Holiday Village -...1.00
- Liskeard0.94
- Anneth0.94
- ★5.01.00
- witCar parking on site0.91
- Detached1.00
- Cottages ×0.94
- +0.53
- Poser une question1.00
- AlEngineer0.97
- gineer1.00
- EUROPE1.00
- 260.93
-
- AV0.53
- Howit works1.00
- Host1.00
- MCP Server1.00
- tools/list1.00
- tools with _meta.ui.resourceUri0.98
- AIE1.00
- loop1.00
- ★1.00
- Views render in response to tool calls0.99
- tools/call1.00
- ★1.00
- ★1.00
- resources/read1.00
- HTML documents live in resources1.00
- View HTML with _meta.ui { csp permissions }0.99
- Views can be cached ahead of time1.00
- Create view in the chat1.00
- with iframe1.00
- result { content + _meta.ui.url }0.97
- Hydrate view with tool response0.99
- Host1.00
- MCP Server1.00
- Engineering the future of Al0.99
- gineer0.99
- 260.99
-
- AV0.63
- How it works0.98
- Host1.00
- MCP Server1.00
- tools/list1.00
- tools with _meta.ui.resourceUri0.98
- AIE1.00
- loop1.00
- ★1.00
- Views render in response to tool calls1.00
- tools/call1.00
- ★1.00
- ★1.00
- resources/read1.00
- HTML documents live in resources1.00
- View HTML with _meta.ui { csp permissions }0.99
- Views can be cached ahead of time1.00
- Create view in the chat1.00
- with iframe1.00
- result { content + _meta.ui.url }0.97
- Hydrate view with tool response0.99
- Host1.00
- MCP Server1.00
- Engineering the future of Al1.00
- gineer1.00
- 260.98
-
- ming into the V0.99
- AlEngineer0.99
- EUROPE1.00
- <body> chatgpt.com0.98
- src-"https://alpic.we0.95
- sro-"about:blank">0.94
- <div> Your App </div>0.98
- </body>0.98
- EU/ACC1.00
- Why two0.95
- AlEngineer1.00
- EUROPE1.00
-
- AY0.52
- Zooming into the View1.00
- <body> chatgpt.com0.98
- AIE1.00
- <iframe src="https://alpic.web-sandbox.oaiusercontent.com">1.00
- <iframe src="about:blank">0.99
- ★1.00
- ★1.00
- ★1.00
- <div> Your App </div>1.00
- </iframe>0.99
- </iframe>1.00
- </body>0.93
- Why two iframes?0.98
- AlEngineer0.97
- gineer1.00
- EUROPE1.00
- 260.98
-
- AV0.77
- Before AI Apps - the host page0.96
- chatgpt.com Content-Security-Policy1.00
- Directive1.00
- Allowed values0.99
- default-src'self'0.95
- script-src'nonce--'https://*.chatgpt.com0.98
- default-1.00
- style-src 'selfunsafe-inline0.98
- connect-src 'self'*.openai.com wss://*.chatgpt.com0.98
- src1.00
- 'none'0.99
- 'self'1.00
- https:1.00
- AIE1.00
- img-src 'self' * blob: data: https:0.96
- ★1.00
- ★1.00
- ★1.00
- ★1.00
- frame-src 'self*.stripe.com *.youtube.com-0.96
- script-src1.00
- inline'1.00
- 'none'0.95
- 'nonce-.0.95
- 'unsafe-eval'1.00
- 'strict-dynamic'1.00
- 'unsafe-0.94
- style-src1.00
- 'self'1.00
- 'unsafe-inline'1.00
- 'nonce-..0.90
- connect-1.00
- src1.00
- 'self'1.00
- https:1.00
- WSS:0.83
- img-src1.00
- 'self'1.00
- data:1.00
- blob:1.00
- frame-src1.00
- 'self'1.00
- 'none'1.00
- blob:1.00
- AlEngineer0.97
- gineer1.00
- EUROPE1.00
-
- Before AI Apps - the host page0.96
- chatgpt.com Content-Security-Policy1.00
- Directive1.00
- Allowed values0.99
- default-srcself1.00
- ★1.00
- script-src'nonce-_'https://*.chatgpt.com0.98
- style-src'self'unsafe-inline0.99
- connect-src 'self'*.openai.com wss://*.chatgpt.com0.97
- default-1.00
- src1.00
- 'none'1.00
- 'self'1.00
- https:0.99
- AIE1.00
- img-src 'self' * blob: data: https:0.97
- ★1.00
- ★1.00
- ★1.00
- ★1.00
- frame-src 'self'*.stripe.com *.youtube.com-0.96
- script-src1.00
- inline'1.00
- 'none1.00
- 'nonce-.0.96
- 'unsafe-eval'1.00
- 'strict-dynamic'1.00
- 'unsafe-0.99
- style-src1.00
- 'self'1.00
- 'unsafe-inline'1.00
- 'nonce-.0.95
- src1.00
- connect-1.00
- 'self'1.00
- https:1.00
- WSS:0.83
- img-src1.00
- 'self'1.00
- data:1.00
- blob:1.00
- frame-src0.99
- 'self'1.00
- 'none'1.00
- blob:1.00
- Engineering the future of Al1.00
- gineer1.00
-
- Rendering external HTML?1.00
- Useiframes1.00
- AIE1.00
- ★0.99
- ★1.00
- ★1.00
- The1.00
- <iframe>1.00
- HTML element represents a nested browsing context,0.99
- embedding another HTML page into the current one.0.99
- - MDN Web Docs0.90
- AlEngineer0.96
- gineer1.00
- EUROPE1.00
- 260.97
-
- 150 %0.97
- Réinitialiser0.99
- AY0.51
- What if — srcdoc?0.98
- chatgpt.com Content-Security-Policy1.00
- script-src 'nonce-' https://*.chatgpt.com0.98
- frame-src'self' *.stripe.com *.youtube.com0.98
- AIE1.00
- ★1.00
- ★1.00
- ★1.00
- ★1.00
- <body>1.00
- <iframe srcdoc="_">0.98
- <div> Your App </div>0.99
- </iframe>1.00
- </body>1.00
- x inherits parent CSP without script nonce, all view scripts blocked0.98
- Engineering the future of Al1.00
- gineer1.00
- 261.00
-
- if-srcdoc?0.98
- AlEngineer0.99
- chatgpt.com Content-Securit0.99
- script-src nonce-https:0.95
- EUROPE1.00
- frame-arc "snlf' *.stripe.o0.81
- srcdoce0.87
- EU/ACC1.00
- inherits parent CSP without script n0.98
- AlEngineer1.00
- EUROPE1.00
-
- What if— srcdoc?0.94
- chatgpt.com Content-Security-Policy1.00
- script-src 'nonce-' https://*.chatgpt.com0.97
- frame-src 'self' *.stripe.com *.youtube.com-0.97
- AIE1.00
- ★1.00
- ★1.00
- ★1.00
- ★1.00
- <body>1.00
- <iframe srcdoc="_.">0.94
- <div> Your App </div>1.00
- </iframe>0.98
- </body>0.99
- x inherits parent CSP without script nonce, all view scripts blocked0.99
- Engineering the future of Al1.00
- gineer0.93
- 260.99
-
- AY0.51
- What if- relax the CSP?0.96
- chatgpt.com Content-Security-Policy1.00
- script-src'unsafe-inlineunsafe-eval0.99
- ***0.81
- frame-src'self'*.stripe.com *.youtube.com .0.98
- AIE1.00
- ★1.00
- ★1.00
- ★1.00
- ★1.00
- <body>1.00
- <iframe srcdoc="_">0.96
- <div> Your App </div>1.00
- </body>0.99
- x iframe inherits parent's origin — view scripts can access ChatGPT's cookies, localStorage, DOM0.99
- $0.53
- Braintrust1.00
- WorkOS OpenAI0.98
- gineer1.00
- 260.98
-
- What if — sandbox?0.93
- chatgpt.com Content-Security-Policy1.00
- script-src'nonce-_'https://*.chatgpt.com0.97
- ***0.51
- frame-src 'self' *.stripe.com *.youtube.com0.97
- AIE1.00
- ★1.00
- ★1.00
- ★1.00
- ★1.00
- <body>1.00
- sframe srcdoc="_" sandbox="allow-scripts">0.96
- <div> Your App </div>1.00
- </body>0.98
- x Browser assigns opaque origin — no localStorage, no cookies, no IndexedDB0.98
- AlEngineer0.96
- gineer1.00
- EUROPE1.00
- 260.98
Transcript
160 cues· 3,281 words· 17,748 chars
- 0:15 Hi, everyone.
- 0:16 My name is Fred.
- 0:17 I'm the CTO and co-founder of Alpic, the MCP hosting company.
- 0:22 And today, I would like to share with you an adventure of deep diving into the double iframe mechanisms that we have on ChatGPT and MCP app and why it matters when we build apps.
- 0:33 First thing first, if you haven't had the chance to listen to Ido and Léa talks just before about MCP apps, a quick sum up of what those MCP and LGBT apps are.
- 0:46 That's a new surface area for your business to expose product and services with new acquisition channel that has two main criteria.
- 0:54 First one being discoverability, so you will have
- 0:57 Ecosystems of connectors and apps available in a consumer generalistic agent like CGPT and Cloud.
- 1:04 So CGPT App Store and Cloud Connectors.
- 1:07 Those apps are browsable inside the store, but they are also discoverable in chat.
- 1:12 So if you're having a conversation that's relevant for an app to be brought into to add additional context and feature some nice additional actions, that will be brought into the conversation.
- 1:23 And the second part, which is the biggest part and what we will be focusing on in this talk, which is the addition of interactive UI inside those conversational agents, where you used to add text only, apps adds a new layer of UI that could be provided by the MCP server, but could be generated or generative UI as well.
- 1:43 They were first sort of using MCP UI that was developed by Léa Danido just before,
- 1:49 then released by OpenAI with an apps SDK back in October last year and standardized across multiple clients on the first official extension of MCP called the app extension.
- 2:02 How does it work?
- 2:03 If we take a little bit closer look at how this UI is brought into the conversation, those are brought using views.
- 2:12 Views are the name that we use for those small snippet of UI that appears inside the conversation.
- 2:18 Views are always rendered as a result of a tool call.
- 2:22 So if your server exposed multiple tools to be used, you can actually add metadata on some of them to say this tool is best used when results will be displayed using a specific UI.
- 2:33 And if the host supports MCP apps, it will use the relevant view corresponding to this tool call to display the results.
- 2:42 Views are simple HTML document.
- 2:44 You can include CSS inside.
- 2:46 Nothing new under the sun here.
- 2:47 It's just a way to package those small snippets of application.
- 2:52 And they are discoverable ahead of time because all views are described on the two list calls that happens at the beginning of the conversation between the host and your MCP server or MCP app.
- 3:04 So each tool that supports UI will advertise the resource that's needed to display the UI.
- 3:10 It can be cached ahead of time or it can be served and downloaded and served right away when the tool call that needs UI to be rendered is made.
- 3:19 The conversational agent on the host will create this new iframe where the view will be displayed and it will inject the tool results inside so that you have dynamic content rendered to the user.
- 3:31 If you take a closer look at what is inside the DOM of the host, when you take a, I was a bit curious, I wanted to know how it was working, how ChatGPT was actually rendering third-party UI inside the conversation.
- 3:48 I was a bit surprised and I was met with not so much expectation about having a double iframe, having an iframe nested inside another iframe.
- 3:58 and this gave me the idea for this talk.
- 4:01 I want to bring you today with me, deep diving into why the decision was made to do this kind of inception nesting of iframes, and what are the benefits, what was it put in place, and what are the implications when you build apps, what you should be paying attention to, and how to make sure that your experience is very nice.
- 4:18 Before we go into that, let's take a close look at what ChatGPT was before MCP apps were implemented.
- 4:25 We'll be using ChatGPT as the examples for this deep dive, but the exact same happened on Cloud AI if you want to take another look by yourself.
- 4:33 The initial thing to take a look at that is very important is something called content security policy.
- 4:39 Those are directives returned by a server as response header to document calls.
- 4:45 So when you load ChargeGPT inside your browser, ChargeGPT will respond with a document plus security policy directive on what the browser should be allowed to load and execute and what it shouldn't be able to load and execute.
- 4:57 You've got multiple directives, including inside content security policy, some about which scripts you can run, which CSS style sheet you can download, which image you can download, which API you can connect to and ask questions to.
- 5:11 I will not go into the details, but two are very important to remember here.
- 5:14 FrameSRC, which basically is the directive to allow a specific website to render iframe inside the document.
- 5:21 and ScriptSRC, which basically allows specific site scripts to be run inside the browser.
- 5:29 To be able to run external UI inside ChatGPT, we will use a dedicated HTML element that has been made specifically for this purpose, which is the inline frame element, or iframe, that is made to basically spawn up a nested browsing context inside your browser window.
- 5:48 So those small pieces of views will be rendered as almost separately, completely isolated browsing context.
- 5:55 They are very convenient and they have two ways to be used.
- 5:58 First one is to provide a source for the iframes that you want to render.
- 6:02 So basically a URL of another page to be loaded by your browser and executed locally and rendered inside the space it's made for.
- 6:10 and the sourceDoc, which is another attribute which allows you to push inside the iframe content that you want to render as is, without having to bother to load another content.
- 6:22 So if we want to build this marketplace of app and have third-party UI rendered inside ChatGPT, why not use straightaway source doc as the attribute for injecting context into?
- 6:36 And I'm realizing now that it's a little bit small, but I think I can zoom in a bit.
- 6:41 No, I cannot.
loading