Skip to content

Conversation

@idosal
Copy link
Collaborator

@idosal idosal commented Oct 22, 2025

When the proxy prop is passed to the <UIResourceRenderer>, rawHtml resources will be rendered inside a nested iframe. This opens the path to define a custom CSP for resources that is detached from the host's CSP.

@idosal idosal requested a review from Copilot October 22, 2025 00:18
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 adds support for proxying raw HTML content (text/html MIME type) through a proxy server, extending the existing proxy functionality that previously only supported external URLs (text/uri-list). The implementation uses a double-iframe architecture where the HTML content is delivered to the proxy via postMessage after the proxy signals readiness, enabling raw HTML to work with restrictive Content Security Policies.

Key changes:

  • Extended proxy flow to support raw HTML delivery via postMessage with contentType=rawhtml parameter
  • Added new internal message types for proxy lifecycle communication (UI_PROXY_IFRAME_READY, UI_HTML_CONTENT)
  • Updated proxy script to handle both external URLs and raw HTML content with proper sandbox configuration

Reviewed Changes

Copilot reviewed 10 out of 11 changed files in this pull request and generated 4 comments.

Show a summary per file
File Description
sdks/typescript/server/src/index.ts Added new internal message type constant for raw HTML content transport
sdks/typescript/client/src/utils/processResource.ts Modified HTML processing logic to support proxy with postMessage-based content delivery
sdks/typescript/client/src/utils/tests/processResource.test.ts Added comprehensive test coverage for proxy-based raw HTML rendering scenarios
sdks/typescript/client/src/components/tests/UIResourceRenderer.unmocked.test.tsx Added integration test verifying proxy readiness signal and content delivery flow
sdks/typescript/client/src/components/tests/ProxyScript.test.ts Added new test file validating proxy script behavior with raw HTML content
sdks/typescript/client/src/components/UIResourceRenderer.tsx Simplified rawHtml case to pass proxy prop through to HTMLResourceRenderer
sdks/typescript/client/src/components/HTMLResourceRenderer.tsx Implemented proxy readiness handling and HTML content delivery via postMessage
sdks/typescript/client/scripts/proxy/index.html Extended proxy script to handle raw HTML mode with double-iframe architecture and permissive CSP
sdks/typescript/client/package.json Added @types/jsdom dev dependency for proxy script testing
docs/src/guide/client/using-a-proxy.md Updated documentation with raw HTML proxy architecture, flow diagrams, and implementation requirements
Files not reviewed (1)
  • pnpm-lock.yaml: Language not supported

@cloudflare-workers-and-pages
Copy link

cloudflare-workers-and-pages bot commented Oct 22, 2025

Deploying mcp-ui with  Cloudflare Pages  Cloudflare Pages

Latest commit: 0acab70
Status: ✅  Deploy successful!
Preview URL: https://31051951.mcp-ui.pages.dev
Branch Preview URL: https://feat-rawhtml-proxy.mcp-ui.pages.dev

View logs

@idosal idosal requested a review from Copilot October 22, 2025 00:31
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

Copilot reviewed 11 out of 12 changed files in this pull request and generated 2 comments.

Files not reviewed (1)
  • pnpm-lock.yaml: Language not supported

@idosal idosal requested a review from Copilot October 22, 2025 16:07
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

Copilot reviewed 11 out of 12 changed files in this pull request and generated 2 comments.

Files not reviewed (1)
  • pnpm-lock.yaml: Language not supported

idosal and others added 2 commits October 22, 2025 19:16
Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
@idosal idosal marked this pull request as ready for review October 22, 2025 16:21
@idosal idosal merged commit 1bbeb09 into main Oct 22, 2025
14 checks passed
github-actions bot pushed a commit that referenced this pull request Oct 22, 2025
…t/v5.14.0) (2025-10-22)

### Features

* support proxy for rawHtml ([#132](#132)) ([1bbeb09](1bbeb09))
github-actions bot pushed a commit that referenced this pull request Oct 22, 2025
…r/v5.13.0) (2025-10-22)

### Bug Fixes

* fix file extension reference in package.json ([927989c](927989c))

### Features

* support proxy for rawHtml ([#132](#132)) ([1bbeb09](1bbeb09))
Copy link
Contributor

@infoxicator infoxicator left a comment

Choose a reason for hiding this comment

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

@idosal Are you thinking about adding support for proxy to the remoteDom iframe as well?

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.

3 participants