Skip to content

Conversation

@idosal
Copy link
Collaborator

@idosal idosal commented Oct 10, 2025

Initial adapters infra with AppsSDK as a first use case.

Based on the great work of @yannj-fr on the translation layer!

idosal and others added 6 commits October 10, 2025 01:12
Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
Co-authored-by: Copilot Autofix powered by AI <62310815+github-advanced-security[bot]@users.noreply.github.com>
@idosal idosal changed the title feat: initial support for adapters (alpha) feat: add adapters infra (appssdk) Oct 10, 2025
@idosal idosal requested a review from Copilot October 10, 2025 07:56
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 adapters infrastructure to enable MCP-UI widgets to work in different platform environments. The initial implementation provides an Apps SDK adapter for environments like ChatGPT, allowing seamless integration without code changes to existing MCP-UI widgets.

  • Adds adapter infrastructure with automatic script injection for HTML content
  • Implements Apps SDK adapter that translates MCP-UI postMessage protocol to platform-specific APIs
  • Includes comprehensive test coverage and example implementations

Reviewed Changes

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

Show a summary per file
File Description
sdks/typescript/server/src/utils.ts Adds wrapHtmlWithAdapters function for injecting adapter scripts into HTML
sdks/typescript/server/src/types.ts Defines adapter configuration types and interfaces
sdks/typescript/server/src/index.ts Integrates adapters into createUIResource and exports adapter functionality
sdks/typescript/server/src/adapters/index.ts Main adapters entry point
sdks/typescript/server/src/adapters/appssdk/types.ts Type definitions for Apps SDK adapter protocol
sdks/typescript/server/src/adapters/appssdk/index.ts Apps SDK adapter public exports
sdks/typescript/server/src/adapters/appssdk/adapter.ts Wrapper that generates injectable adapter scripts
sdks/typescript/server/src/adapters/appssdk/adapter-runtime.ts Core Apps SDK adapter implementation with full TypeScript support
sdks/typescript/server/src/adapters/appssdk/adapter-runtime.bundled.ts Auto-generated bundled version of the adapter runtime
sdks/typescript/server/src/adapters/appssdk/README.md Documentation for Apps SDK adapter architecture
Test files Comprehensive test coverage for adapter functionality
Build scripts Bundle script for generating the bundled adapter runtime
Example files Demo applications showcasing adapter usage
Files not reviewed (1)
  • pnpm-lock.yaml: Language not supported

return htmlContent;
}

const wrappedHtml = htmlContent;
Copy link

Copilot AI Oct 10, 2025

Choose a reason for hiding this comment

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

The variable wrappedHtml is assigned but never modified, making it redundant. Consider using htmlContent directly throughout the function or remove this variable.

Copilot uses AI. Check for mistakes.
Comment on lines +89 to +92
this.originalPostMessage = window.parent?.postMessage?.bind(window.parent) || null;

if (!this.originalPostMessage) {
this.config.logger.debug('[MCPUI-Apps SDK Adapter] parent.postMessage does not exist, installing shim only');
Copy link

Copilot AI Oct 10, 2025

Choose a reason for hiding this comment

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

The type assertion in line 73 suggests this assignment might fail. Consider adding error handling or null checks for the bind operation since window.parent?.postMessage could be undefined.

Suggested change
this.originalPostMessage = window.parent?.postMessage?.bind(window.parent) || null;
if (!this.originalPostMessage) {
this.config.logger.debug('[MCPUI-Apps SDK Adapter] parent.postMessage does not exist, installing shim only');
if (
window.parent &&
typeof window.parent.postMessage === 'function'
) {
this.originalPostMessage = window.parent.postMessage.bind(window.parent);
} else {
this.originalPostMessage = null;
}
if (!this.originalPostMessage) {
this.config.logger.debug('[MCPUI-Apps SDK Adapter] parent.postMessage does not exist or is not a function, installing shim only');

Copilot uses AI. Check for mistakes.
return;
}
const { intent, params } = message.payload;
const prompt = \`\${intent}\${params ? ": " + JSON.stringify(params) : ""}\`;
Copy link

Copilot AI Oct 10, 2025

Choose a reason for hiding this comment

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

The template literal uses escaped backticks which may be confusing. This is auto-generated code, but the original template literal in the source should be reviewed for clarity.

Copilot uses AI. Check for mistakes.
Comment on lines +25 to +28
const escapedCode = bundledCode
.replace(/\\/g, '\\\\') // Escape backslashes first
.replace(/`/g, '\\`') // Then escape backticks
.replace(/\${/g, '\\${'); // Then escape template literal expressions
Copy link

Copilot AI Oct 10, 2025

Choose a reason for hiding this comment

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

The comment says 'escape backslashes first' but the regex /\\/g matches single backslashes. Consider documenting this more clearly or using a more robust escaping method to avoid potential issues with complex string content.

Copilot uses AI. Check for mistakes.
Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
@cloudflare-workers-and-pages
Copy link

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

Deploying mcp-ui with  Cloudflare Pages  Cloudflare Pages

Latest commit: 85af176
Status: ✅  Deploy successful!
Preview URL: https://91e038c9.mcp-ui.pages.dev
Branch Preview URL: https://feat-adapters.mcp-ui.pages.dev

View logs

@idosal idosal merged commit 2e016cd into alpha Oct 10, 2025
22 checks passed
github-actions bot pushed a commit that referenced this pull request Oct 10, 2025
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.13.0-alpha.1](client/v5.12.1...client/v5.13.0-alpha.1) (2025-10-10)

### Bug Fixes

* adapter version ([259c842](259c842))
* release ([420efc0](420efc0))
* server alpha versioning ([7f35d3b](7f35d3b))
* server versioning ([2324371](2324371))

### Features

* add adapters infra (appssdk) ([#125](#125)) ([2e016cd](2e016cd))
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))
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.

2 participants