Skip to content

Conversation

Copy link
Contributor

Copilot AI commented Sep 23, 2025

This PR introduces a new ui-request-render-data message type that allows iframes to explicitly request render data from the host, providing a more semantic alternative to relying on the ui-lifecycle-iframe-ready lifecycle event side-effect.

Problem

Previously, iframes could only receive render data as a side-effect of sending ui-lifecycle-iframe-ready. This approach had several limitations:

  • It felt like an unexpected side-effect rather than an explicit request
  • Render data could only be requested during the ready lifecycle event
  • Some users experienced reliability issues with the automatic delivery mechanism
  • There was no way to re-request render data later in the iframe's lifecycle

Solution

The new ui-request-render-data message type allows iframes to explicitly request render data when needed:

// Iframe sends request
window.parent.postMessage({
  type: 'ui-request-render-data',
  messageId: 'optional-tracking-id'
}, '*');

// Host responds with standard render data message
// {
//   type: 'ui-lifecycle-iframe-render-data',
//   messageId: 'optional-tracking-id',
//   payload: { renderData: {...} }
// }

Implementation Details

  • New message type: Added UI_REQUEST_RENDER_DATA: 'ui-request-render-data' constant
  • HTMLResourceRenderer enhancement: Added message handling that responds with render data using the existing ui-lifecycle-iframe-render-data format
  • Message ID support: Properly forwards messageId from request to response for tracking
  • Backwards compatibility: Existing ui-lifecycle-iframe-ready behavior remains unchanged
  • Comprehensive testing: Added test cases for both scenarios (with and without render data)
  • Documentation: Updated embeddable-ui.md, resource-renderer.md, and react-usage-examples.md with detailed usage examples and alternative approaches

Benefits

  • Semantic clarity: Explicit render data requests vs. lifecycle side-effects
  • Flexible timing: Can request render data at any point, not just during initialization
  • Request tracking: Optional messageId support for tracking requests/responses
  • Reliability: Direct request/response pattern vs. automatic delivery
  • Backwards compatible: No breaking changes to existing functionality

Fixes #106.


✨ Let Copilot coding agent set things up for you — coding agent works faster and does higher quality work when set up for your repo.

Copy link
Contributor Author

Copilot AI commented Sep 23, 2025

@idosal 👋 This repository doesn't have Copilot instructions. With Copilot instructions, I can understand the repository better, work faster and produce higher quality PRs.

I can generate a .github/copilot-instructions.md file for you automatically. Click here to open a pre-filled issue and assign it to me. I'll write the instructions, and then tag you for review.

@cloudflare-workers-and-pages
Copy link

cloudflare-workers-and-pages bot commented Sep 23, 2025

Deploying with  Cloudflare Workers  Cloudflare Workers

The latest updates on your project. Learn more about integrating Git with Workers.

Status Name Latest Commit Updated (UTC)
✅ Deployment successful!
View logs
remote-mcp-server-authless d41b010 Sep 23 2025, 09:12 PM

@cloudflare-workers-and-pages
Copy link

cloudflare-workers-and-pages bot commented Sep 23, 2025

Deploying mcp-ui with  Cloudflare Pages  Cloudflare Pages

Latest commit: 95f24d3
Status: ✅  Deploy successful!
Preview URL: https://1d804491.mcp-ui.pages.dev
Branch Preview URL: https://copilot-fix-106.mcp-ui.pages.dev

View logs

Co-authored-by: idosal <18148989+idosal@users.noreply.github.com>
Copilot AI changed the title [WIP] Create a ui-request-render-data Add ui-request-render-data message type for explicit render data requests Sep 23, 2025
Copilot AI requested a review from idosal September 23, 2025 21:18
Removed unnecessary code example for host handling.
@idosal
Copy link
Collaborator

idosal commented Sep 23, 2025

@copilot add it to the documentation in resource-renderer.md and react-usage-example.md

…react-usage-examples.md

Co-authored-by: idosal <18148989+idosal@users.noreply.github.com>
Copy link
Contributor Author

Copilot AI commented Sep 23, 2025

@copilot add it to the documentation in resource-renderer.md and react-usage-example.md

Added comprehensive documentation for the new ui-request-render-data message type to both resource-renderer.md and react-usage-examples.md. The documentation includes:

  • Complete code examples showing the new explicit request pattern
  • Benefits comparison vs the lifecycle-based approach
  • Alternative sections added after existing render data examples
  • Backwards compatibility maintained

See commit 0cc4457 for the documentation updates.

Removed benefits section for ui-request-render-data approach from React usage examples.
Removed advantages section from resource-renderer.md
@idosal idosal marked this pull request as ready for review September 23, 2025 21:38
@idosal idosal requested a review from Copilot September 23, 2025 21:38
Copy link
Contributor

Copilot AI left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull Request Overview

This PR introduces a new ui-request-render-data message type that allows iframes to explicitly request render data from the host, providing a more semantic alternative to the automatic delivery via ui-lifecycle-iframe-ready events.

  • Adds explicit render data request/response mechanism with optional message ID tracking
  • Maintains backwards compatibility with existing ui-lifecycle-iframe-ready behavior
  • Provides comprehensive documentation updates with usage examples

Reviewed Changes

Copilot reviewed 5 out of 5 changed files in this pull request and generated no comments.

Show a summary per file
File Description
HTMLResourceRenderer.tsx Adds new message type constant and handler for explicit render data requests
HTMLResourceRenderer.test.tsx Adds test coverage for both scenarios with and without render data
embeddable-ui.md Documents the new message type with detailed usage examples
resource-renderer.md Adds alternative approach documentation for explicit render data requests
react-usage-examples.md Provides comprehensive React usage examples for the new message type

Tip: Customize your code reviews with copilot-instructions.md. Create the file or learn how to get started.

@idosal idosal merged commit 26135ce into main Sep 23, 2025
11 checks passed
github-actions bot pushed a commit that referenced this pull request Sep 23, 2025
…25-09-23)

### Features

* add ui-request-render-data message type ([#111](#111)) ([26135ce](26135ce))
github-actions bot pushed a commit that referenced this pull request Oct 10, 2025
# 1.0.0-alpha.1 (2025-10-10)

### Bug Fixes

* adapter version ([259c842](259c842))
* add a bridge to pass messages in and out of the proxy ([#38](#38)) ([30ccac0](30ccac0))
* bump client version ([75c9236](75c9236))
* **client:** specify iframe ([fd0b70a](fd0b70a))
* **client:** styling ([6ff9b68](6ff9b68))
* dependencies ([887f61f](887f61f))
* export RemoteDomResource ([2b86f2d](2b86f2d))
* export ResourceRenderer and HtmlResource ([2b841a5](2b841a5))
* exports ([3a93a16](3a93a16))
* iframe handle ([#15](#15)) ([66bd4fd](66bd4fd))
* lint ([4487820](4487820))
* lint ([d0a91f9](d0a91f9))
* minor typo ([a0bee9c](a0bee9c))
* move react dependencies to be peer dependencies ([#91](#91)) ([f672f3e](f672f3e)), closes [#90](#90)
* package config ([8dc1e53](8dc1e53))
* packaging ([9e6babd](9e6babd))
* pass ref explicitly using iframeProps ([#33](#33)) ([d01b5d1](d01b5d1))
* publish ([0943e7a](0943e7a))
* ref passing to UIResourceRenderer ([#32](#32)) ([d28c23f](d28c23f))
* release ([420efc0](420efc0))
* remove shared dependency ([e66e8f4](e66e8f4))
* rename components and methods to fit new scope ([#22](#22)) ([6bab1fe](6bab1fe))
* rename delivery -> encoding and flavor -> framework ([#36](#36)) ([9a509ed](9a509ed))
* Ruby comment ([b22dc2e](b22dc2e))
* support react-router ([21ffb95](21ffb95))
* text and blob support in RemoteDOM resources ([ec68eb9](ec68eb9))
* trigger release ([aaca831](aaca831))
* typescript ci publish ([e7c0ebf](e7c0ebf))
* typescript types to be compatible with MCP SDK ([#10](#10)) ([74365d7](74365d7))
* update deps ([4091ef4](4091ef4))
* update isUIResource to use EmbeddedResource type ([#122](#122)) ([5a65a0b](5a65a0b)), closes [#117](#117)
* use targetOrigin in the proxy message relay ([#40](#40)) ([b3fb54e](b3fb54e))
* validate URL ([b7c994d](b7c994d))
* wc dist overwrite ([#63](#63)) ([9e46c56](9e46c56))

### Documentation

* bump ([#4](#4)) ([ad4d163](ad4d163))

### Features

* add adapters infra (appssdk) ([#125](#125)) ([2e016cd](2e016cd))
* add convenience function isUIResource to client SDK ([#86](#86)) ([607c6ad](607c6ad))
* add embeddedResourceProps for annotations ([#99](#99)) ([b96ec44](b96ec44))
* add proxy option to externalUrl ([#37](#37)) ([7b95cd0](7b95cd0))
* add remote-dom content type ([#18](#18)) ([5dacf37](5dacf37))
* add Ruby server SDK ([#31](#31)) ([5ffcde4](5ffcde4))
* add sandbox permissions instead of an override ([#83](#83)) ([b1068e9](b1068e9))
* add ui-request-render-data message type ([#111](#111)) ([26135ce](26135ce))
* add UIResourceRenderer Web Component ([#58](#58)) ([ec8f299](ec8f299))
* auto resize with the autoResizeIframe prop ([#56](#56)) ([76c867a](76c867a))
* change onGenericMcpAction to optional onUiAction ([1913b59](1913b59))
* **client:** allow setting supportedContentTypes for HtmlResource ([#17](#17)) ([e009ef1](e009ef1))
* consolidate ui:// and ui-app:// ([#8](#8)) ([2e08035](2e08035))
* pass iframe props down ([#14](#14)) ([112539d](112539d))
* refactor UTFtoB64 (bump server version) ([#95](#95)) ([2d5e16b](2d5e16b))
* send render data to the iframe ([#51](#51)) ([d38cfc7](d38cfc7))
* separate html and remote-dom props ([#24](#24)) ([a7f0529](a7f0529))
* support generic messages response ([#35](#35)) ([10b407b](10b407b))
* support passing resource metadata ([#87](#87)) ([f1c1c9b](f1c1c9b))
* support ui action result types ([#6](#6)) ([899d152](899d152))
* switch to ResourceRenderer ([#21](#21)) ([6fe3166](6fe3166))

### BREAKING CHANGES

* The existing naming is ambiguous. Renaming delivery to encoding and flavor to framework should clarify the intent.
* exported names have changed
* removed deprecated client API
* (previous one didn't take due to semantic-release misalignment)
github-actions bot pushed a commit that referenced this pull request Oct 10, 2025
# 1.0.0-alpha.1 (2025-10-10)

### Bug Fixes

* adapter version ([259c842](259c842))
* add a bridge to pass messages in and out of the proxy ([#38](#38)) ([30ccac0](30ccac0))
* bump client version ([75c9236](75c9236))
* **client:** specify iframe ([fd0b70a](fd0b70a))
* **client:** styling ([6ff9b68](6ff9b68))
* dependencies ([887f61f](887f61f))
* export RemoteDomResource ([2b86f2d](2b86f2d))
* export ResourceRenderer and HtmlResource ([2b841a5](2b841a5))
* exports ([3a93a16](3a93a16))
* iframe handle ([#15](#15)) ([66bd4fd](66bd4fd))
* lint ([4487820](4487820))
* lint ([d0a91f9](d0a91f9))
* minor typo ([a0bee9c](a0bee9c))
* move react dependencies to be peer dependencies ([#91](#91)) ([f672f3e](f672f3e)), closes [#90](#90)
* package config ([8dc1e53](8dc1e53))
* packaging ([9e6babd](9e6babd))
* pass ref explicitly using iframeProps ([#33](#33)) ([d01b5d1](d01b5d1))
* publish ([0943e7a](0943e7a))
* ref passing to UIResourceRenderer ([#32](#32)) ([d28c23f](d28c23f))
* release ([420efc0](420efc0))
* remove shared dependency ([e66e8f4](e66e8f4))
* rename components and methods to fit new scope ([#22](#22)) ([6bab1fe](6bab1fe))
* rename delivery -> encoding and flavor -> framework ([#36](#36)) ([9a509ed](9a509ed))
* Ruby comment ([b22dc2e](b22dc2e))
* server versioning ([2324371](2324371))
* support react-router ([21ffb95](21ffb95))
* text and blob support in RemoteDOM resources ([ec68eb9](ec68eb9))
* trigger release ([aaca831](aaca831))
* typescript ci publish ([e7c0ebf](e7c0ebf))
* typescript types to be compatible with MCP SDK ([#10](#10)) ([74365d7](74365d7))
* update deps ([4091ef4](4091ef4))
* update isUIResource to use EmbeddedResource type ([#122](#122)) ([5a65a0b](5a65a0b)), closes [#117](#117)
* use targetOrigin in the proxy message relay ([#40](#40)) ([b3fb54e](b3fb54e))
* validate URL ([b7c994d](b7c994d))
* wc dist overwrite ([#63](#63)) ([9e46c56](9e46c56))

### Documentation

* bump ([#4](#4)) ([ad4d163](ad4d163))

### Features

* add adapters infra (appssdk) ([#125](#125)) ([2e016cd](2e016cd))
* add convenience function isUIResource to client SDK ([#86](#86)) ([607c6ad](607c6ad))
* add embeddedResourceProps for annotations ([#99](#99)) ([b96ec44](b96ec44))
* add proxy option to externalUrl ([#37](#37)) ([7b95cd0](7b95cd0))
* add remote-dom content type ([#18](#18)) ([5dacf37](5dacf37))
* add Ruby server SDK ([#31](#31)) ([5ffcde4](5ffcde4))
* add sandbox permissions instead of an override ([#83](#83)) ([b1068e9](b1068e9))
* add ui-request-render-data message type ([#111](#111)) ([26135ce](26135ce))
* add UIResourceRenderer Web Component ([#58](#58)) ([ec8f299](ec8f299))
* auto resize with the autoResizeIframe prop ([#56](#56)) ([76c867a](76c867a))
* change onGenericMcpAction to optional onUiAction ([1913b59](1913b59))
* **client:** allow setting supportedContentTypes for HtmlResource ([#17](#17)) ([e009ef1](e009ef1))
* consolidate ui:// and ui-app:// ([#8](#8)) ([2e08035](2e08035))
* pass iframe props down ([#14](#14)) ([112539d](112539d))
* refactor UTFtoB64 (bump server version) ([#95](#95)) ([2d5e16b](2d5e16b))
* send render data to the iframe ([#51](#51)) ([d38cfc7](d38cfc7))
* separate html and remote-dom props ([#24](#24)) ([a7f0529](a7f0529))
* support generic messages response ([#35](#35)) ([10b407b](10b407b))
* support passing resource metadata ([#87](#87)) ([f1c1c9b](f1c1c9b))
* support ui action result types ([#6](#6)) ([899d152](899d152))
* switch to ResourceRenderer ([#21](#21)) ([6fe3166](6fe3166))

### BREAKING CHANGES

* The existing naming is ambiguous. Renaming delivery to encoding and flavor to framework should clarify the intent.
* exported names have changed
* removed deprecated client API
* (previous one didn't take due to semantic-release misalignment)
github-actions bot pushed a commit that referenced this pull request Oct 10, 2025
# [5.12.0-alpha.1](server/v5.11.0...server/v5.12.0-alpha.1) (2025-10-10)

### Bug Fixes

* adapter version ([259c842](259c842))
* release ([420efc0](420efc0))
* server alpha versioning ([7f35d3b](7f35d3b))
* server versioning ([2324371](2324371))
* update isUIResource to use EmbeddedResource type ([#122](#122)) ([5a65a0b](5a65a0b)), closes [#117](#117)

### Features

* add adapters infra (appssdk) ([#125](#125)) ([2e016cd](2e016cd))
* add ui-request-render-data message type ([#111](#111)) ([26135ce](26135ce))
github-actions bot pushed a commit that referenced this pull request Oct 13, 2025
…r/v5.12.0) (2025-10-13)

### Bug Fixes

* update isUIResource to use EmbeddedResource type ([#122](#122)) ([5a65a0b](5a65a0b)), closes [#117](#117)

### Features

* add ui-request-render-data message type ([#111](#111)) ([26135ce](26135ce))
* support adapters ([#127](#127)) ([d4bd152](d4bd152))
github-actions bot pushed a commit that referenced this pull request Nov 4, 2025
# 1.0.0 (2025-11-04)

### Bug Fixes

* add a bridge to pass messages in and out of the proxy ([#38](#38)) ([30ccac0](30ccac0))
* bump client version ([75c9236](75c9236))
* **client:** specify iframe ([fd0b70a](fd0b70a))
* **client:** styling ([6ff9b68](6ff9b68))
* dependencies ([887f61f](887f61f))
* Enable bidirectional message relay in rawhtml proxy mode ([#138](#138)) ([f0bdefb](f0bdefb))
* ensure Apps SDK adapter is bundled properly and initialized wth config ([#137](#137)) ([4f7c25c](4f7c25c))
* export RemoteDomResource ([2b86f2d](2b86f2d))
* export ResourceRenderer and HtmlResource ([2b841a5](2b841a5))
* exports ([3a93a16](3a93a16))
* fix file extension reference in package.json ([927989c](927989c))
* iframe handle ([#15](#15)) ([66bd4fd](66bd4fd))
* lint ([4487820](4487820))
* lint ([d0a91f9](d0a91f9))
* minor typo ([a0bee9c](a0bee9c))
* move react dependencies to be peer dependencies ([#91](#91)) ([f672f3e](f672f3e)), closes [#90](#90)
* package config ([8dc1e53](8dc1e53))
* packaging ([9e6babd](9e6babd))
* pass ref explicitly using iframeProps ([#33](#33)) ([d01b5d1](d01b5d1))
* publish ([0943e7a](0943e7a))
* ref passing to UIResourceRenderer ([#32](#32)) ([d28c23f](d28c23f))
* remove shared dependency ([e66e8f4](e66e8f4))
* rename components and methods to fit new scope ([#22](#22)) ([6bab1fe](6bab1fe))
* rename delivery -> encoding and flavor -> framework ([#36](#36)) ([9a509ed](9a509ed))
* Ruby comment ([b22dc2e](b22dc2e))
* support react-router ([21ffb95](21ffb95))
* text and blob support in RemoteDOM resources ([ec68eb9](ec68eb9))
* trigger release ([aaca831](aaca831))
* typescript ci publish ([e7c0ebf](e7c0ebf))
* typescript types to be compatible with MCP SDK ([#10](#10)) ([74365d7](74365d7))
* update deps ([4091ef4](4091ef4))
* update isUIResource to use EmbeddedResource type ([#122](#122)) ([5a65a0b](5a65a0b)), closes [#117](#117)
* use targetOrigin in the proxy message relay ([#40](#40)) ([b3fb54e](b3fb54e))
* validate URL ([b7c994d](b7c994d))
* wc dist overwrite ([#63](#63)) ([9e46c56](9e46c56))

### Documentation

* bump ([#4](#4)) ([ad4d163](ad4d163))

### Features

* add convenience function isUIResource to client SDK ([#86](#86)) ([607c6ad](607c6ad))
* add embeddedResourceProps for annotations ([#99](#99)) ([b96ec44](b96ec44))
* add proxy option to externalUrl ([#37](#37)) ([7b95cd0](7b95cd0))
* add remote-dom content type ([#18](#18)) ([5dacf37](5dacf37))
* add Ruby server SDK ([#31](#31)) ([5ffcde4](5ffcde4))
* add sandbox permissions instead of an override ([#83](#83)) ([b1068e9](b1068e9))
* add ui-request-render-data message type ([#111](#111)) ([26135ce](26135ce))
* add UIResourceRenderer Web Component ([#58](#58)) ([ec8f299](ec8f299))
* auto resize with the autoResizeIframe prop ([#56](#56)) ([76c867a](76c867a))
* change onGenericMcpAction to optional onUiAction ([1913b59](1913b59))
* **client:** allow setting supportedContentTypes for HtmlResource ([#17](#17)) ([e009ef1](e009ef1))
* consolidate ui:// and ui-app:// ([#8](#8)) ([2e08035](2e08035))
* pass iframe props down ([#14](#14)) ([112539d](112539d))
* refactor UTFtoB64 (bump server version) ([#95](#95)) ([2d5e16b](2d5e16b))
* send render data to the iframe ([#51](#51)) ([d38cfc7](d38cfc7))
* separate html and remote-dom props ([#24](#24)) ([a7f0529](a7f0529))
* support adapters ([#127](#127)) ([d4bd152](d4bd152))
* support generic messages response ([#35](#35)) ([10b407b](10b407b))
* support metadata in Python SDK ([#134](#134)) ([9bc3c64](9bc3c64))
* support passing resource metadata ([#87](#87)) ([f1c1c9b](f1c1c9b))
* support proxy for rawHtml ([#132](#132)) ([1bbeb09](1bbeb09))
* support ui action result types ([#6](#6)) ([899d152](899d152))
* switch to ResourceRenderer ([#21](#21)) ([6fe3166](6fe3166))

### BREAKING CHANGES

* The existing naming is ambiguous. Renaming delivery to encoding and flavor to framework should clarify the intent.
* exported names have changed
* removed deprecated client API
* (previous one didn't take due to semantic-release misalignment)
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

Create a ui-request-render-data

2 participants