-
Notifications
You must be signed in to change notification settings - Fork 239
feat: add adapters infra (appssdk) #125
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Conversation
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>
There was a problem hiding this 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; |
Copilot
AI
Oct 10, 2025
There was a problem hiding this comment.
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.
| 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'); |
Copilot
AI
Oct 10, 2025
There was a problem hiding this comment.
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.
| 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'); |
| return; | ||
| } | ||
| const { intent, params } = message.payload; | ||
| const prompt = \`\${intent}\${params ? ": " + JSON.stringify(params) : ""}\`; |
Copilot
AI
Oct 10, 2025
There was a problem hiding this comment.
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.
| const escapedCode = bundledCode | ||
| .replace(/\\/g, '\\\\') // Escape backslashes first | ||
| .replace(/`/g, '\\`') // Then escape backticks | ||
| .replace(/\${/g, '\\${'); // Then escape template literal expressions |
Copilot
AI
Oct 10, 2025
There was a problem hiding this comment.
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.
Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
Deploying mcp-ui with
|
| Latest commit: |
85af176
|
| Status: | ✅ Deploy successful! |
| Preview URL: | https://91e038c9.mcp-ui.pages.dev |
| Branch Preview URL: | https://feat-adapters.mcp-ui.pages.dev |
…1...v5.13.0-alpha.1) (2025-10-10) ### Features * add adapters infra (appssdk) ([#125](#125)) ([2e016cd](2e016cd))
# 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)
# 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)
# [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))
# [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))
Initial adapters infra with AppsSDK as a first use case.
Based on the great work of @yannj-fr on the translation layer!