diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index c922ae14..23343ab8 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -21,6 +21,7 @@ jobs: ruby_sdk_files: ${{ steps.filter.outputs.ruby_sdk_files }} python_sdk_files: ${{ steps.filter.outputs.python_sdk_files }} example_files: ${{ steps.filter.outputs.example_files }} + js_example_files: ${{ steps.filter.outputs.js_example_files }} steps: - uses: actions/checkout@v4 with: @@ -40,10 +41,16 @@ jobs: - 'sdks/python/**' example_files: - 'examples/**' + js_example_files: + - 'examples/external-url-demo/**' + - 'examples/remote-dom-demo/**' + - 'examples/wc-demo/**' + - 'examples/typescript-server-demo/**' + - 'examples/server/**' js_build_and_test: needs: filter_changed_paths - if: needs.filter_changed_paths.outputs.ts_client_files == 'true' || needs.filter_changed_paths.outputs.ts_server_files == 'true' + if: needs.filter_changed_paths.outputs.ts_client_files == 'true' || needs.filter_changed_paths.outputs.ts_server_files == 'true' || needs.filter_changed_paths.outputs.js_example_files == 'true' runs-on: ubuntu-latest steps: - uses: actions/checkout@v4 @@ -71,6 +78,9 @@ jobs: - name: Build run: pnpm build + - name: Build examples + run: pnpm --filter="./examples/*" build + ruby_sdk_test: needs: filter_changed_paths if: needs.filter_changed_paths.outputs.ruby_sdk_files == 'true' diff --git a/.gitignore b/.gitignore index 1c0c47b8..bd81db8f 100644 --- a/.gitignore +++ b/.gitignore @@ -84,6 +84,9 @@ web_modules/ # Serverless directories .serverless/ +# Wrangler (Cloudflare Workers) build artifacts +.wrangler/ + # FuseBox cache .fusebox/ diff --git a/examples/external-url-demo/.gitignore b/examples/external-url-demo/.gitignore new file mode 100644 index 00000000..aabc2664 --- /dev/null +++ b/examples/external-url-demo/.gitignore @@ -0,0 +1,5 @@ +# Build outputs that should never be committed +# (vite.config.ts is loaded directly by Vite) +vite.config.js +vite.config.d.ts +*.tsbuildinfo diff --git a/examples/external-url-demo/tsconfig.node.json b/examples/external-url-demo/tsconfig.node.json index 97ede7ee..c983dd76 100644 --- a/examples/external-url-demo/tsconfig.node.json +++ b/examples/external-url-demo/tsconfig.node.json @@ -5,7 +5,8 @@ "module": "ESNext", "moduleResolution": "bundler", "allowSyntheticDefaultImports": true, - "strict": true + "strict": true, + "noEmit": true }, "include": ["vite.config.ts"] } diff --git a/examples/server/package.json b/examples/server/package.json index 052b8eac..61c730fb 100644 --- a/examples/server/package.json +++ b/examples/server/package.json @@ -12,7 +12,7 @@ }, "packageManager": "pnpm@10.11.0+sha512.6540583f41cc5f628eb3d9773ecee802f4f9ef9923cc45b69890fb47991d4b092964694ec3a4f738a420c918a333062c8b925d312f42e4f0c263eb603551f977", "dependencies": { - "@mcp-ui/server": "^5.2.0", + "@mcp-ui/server": "workspace:*", "@modelcontextprotocol/sdk": "^1.11.1", "@vis.gl/react-google-maps": "^1.5.2", "agents": "^0.0.80", diff --git a/examples/server/pnpm-lock.yaml b/examples/server/pnpm-lock.yaml index 5133c32a..2f6d30d1 100644 --- a/examples/server/pnpm-lock.yaml +++ b/examples/server/pnpm-lock.yaml @@ -9,11 +9,11 @@ importers: .: dependencies: '@mcp-ui/server': - specifier: ^5.2.0 - version: 5.2.0 + specifier: file:../../sdks/typescript/server + version: file:../../sdks/typescript/server '@modelcontextprotocol/sdk': specifier: ^1.11.1 - version: 1.11.3 + version: 1.22.0 '@vis.gl/react-google-maps': specifier: ^1.5.2 version: 1.5.2(react-dom@19.1.0(react@19.1.0))(react@19.1.0) @@ -608,8 +608,8 @@ packages: '@jridgewell/trace-mapping@0.3.9': resolution: {integrity: sha512-3Belt6tdc8bPgAtbcmdtNJlirVoTmEb5e2gC94PnkwEW9jI6CAHUeoG85tjWP5WquqfavoMtMwiG4P926ZKKuQ==} - '@mcp-ui/server@5.2.0': - resolution: {integrity: sha512-at6iPEWbs37mWiiB2YByf9sQEVq8FTqlIxe4cuyb4iw5GLYHRjnFoPsn4hSDF3wMEcsSKjTtinB3o1NI5s6viA==} + '@mcp-ui/server@file:../../sdks/typescript/server': + resolution: {directory: ../../sdks/typescript/server, type: directory} '@mjackson/node-fetch-server@0.2.0': resolution: {integrity: sha512-EMlH1e30yzmTpGLQjlFmaDAjyOeZhng1/XCd7DExR8PNAnG/G1tyruZxEoUe11ClnwGhGrtsdnyyUx1frSzjng==} @@ -617,9 +617,14 @@ packages: '@mjackson/node-fetch-server@0.6.1': resolution: {integrity: sha512-9ZJnk/DJjt805uv5PPv11haJIW+HHf3YEEyVXv+8iLQxLD/iXA68FH220XoiTPBC4gCg5q+IMadDw8qPqlA5wg==} - '@modelcontextprotocol/sdk@1.11.3': - resolution: {integrity: sha512-rmOWVRUbUJD7iSvJugjUbFZshTAuJ48MXoZ80Osx1GM0K/H1w7rSEvmw8m6vdWxNASgtaHIhAgre4H/E9GJiYQ==} + '@modelcontextprotocol/sdk@1.22.0': + resolution: {integrity: sha512-VUpl106XVTCpDmTBil2ehgJZjhyLY2QZikzF8NvTXtLRF1CvO5iEE2UNZdVIUer35vFOwMKYeUGbjJtvPWan3g==} engines: {node: '>=18'} + peerDependencies: + '@cfworker/json-schema': ^4.1.1 + peerDependenciesMeta: + '@cfworker/json-schema': + optional: true '@npmcli/git@4.1.0': resolution: {integrity: sha512-9hwoB3gStVfa0N31ymBmrX+GuDGdVA/QWShZVqE0HK2Af+7QGGrCTbZia/SW0ImUTjTne7SP91qxDmtXvDHRPQ==} @@ -975,6 +980,17 @@ packages: react: optional: true + ajv-formats@3.0.1: + resolution: {integrity: sha512-8iUql50EUR+uUcdRQ3HDqa6EVyo3docL8g5WJ3FNcWmu62IbkGUue/pEyLBW8VGKKucTPgqeks4fIU1DA4yowQ==} + peerDependencies: + ajv: ^8.0.0 + peerDependenciesMeta: + ajv: + optional: true + + ajv@8.17.1: + resolution: {integrity: sha512-B/gBuNg5SiMTrPkC+A2+cW0RszwxYmn6VYxB/inlBStS5nx6xHIt/ehKRhIMhqusl7a8LjQoZnjCs5vhwxOQ1g==} + ansi-regex@5.0.1: resolution: {integrity: sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==} engines: {node: '>=8'} @@ -1298,6 +1314,9 @@ packages: resolution: {integrity: sha512-V7/RktU11J3I36Nwq2JnZEM7tNm17eBJz+u25qdxBZeCKiX6BkVSZQjwWIr+IobgnZy+ag73tTZgZi7tr0LrBw==} engines: {node: '>=6.0.0'} + fast-uri@3.1.0: + resolution: {integrity: sha512-iPeeDKJSWf4IEOasVVrknXpaBV0IApz/gp7S2bb7Z4Lljbl2MGJRqInZiUrQwV16cpzw/D3S5j5Julj/gT52AA==} + fdir@6.4.4: resolution: {integrity: sha512-1NZP+GK4GfuAv3PqKvxQRDMjdSRZjnkq7KfhlNrCNNlZ0ygQFpebfrnfnq/W7fpUnAv9aGWmY1zKx7FYL3gwhg==} peerDependencies: @@ -1445,6 +1464,9 @@ packages: resolution: {integrity: sha512-fi0NG4bPjCHunUJffmLd0gxssIgkNmArMvis4iNah6Owg1MCJjWhEcDLmsK6iGkJq3tHwbDkTlce70/tmXN4cQ==} engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} + json-schema-traverse@1.0.0: + resolution: {integrity: sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==} + json-schema@0.4.0: resolution: {integrity: sha512-es94M3nTIfsEPisRafak+HDLfHXnKBhV3vU5eqPcS3flIWqcxJWgXHXiey3YrpaNsanY5ei1VoYEbOzijuq9BA==} @@ -1818,6 +1840,10 @@ packages: react: ^16.0.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 react-dom: ^16.0.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 + require-from-string@2.0.2: + resolution: {integrity: sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==} + engines: {node: '>=0.10.0'} + retry@0.12.0: resolution: {integrity: sha512-9LkiTwjUh6rT555DtE9rTX+BKByPfrMzEAtnlEtdEwr3Nkffwiihqe2bWADg+OQRjt9gl6ICdmB/ZFDCGAtSow==} engines: {node: '>= 4'} @@ -2655,22 +2681,26 @@ snapshots: '@jridgewell/resolve-uri': 3.1.2 '@jridgewell/sourcemap-codec': 1.5.0 - '@mcp-ui/server@5.2.0': + '@mcp-ui/server@file:../../sdks/typescript/server': dependencies: - '@modelcontextprotocol/sdk': 1.11.3 + '@modelcontextprotocol/sdk': 1.22.0 transitivePeerDependencies: + - '@cfworker/json-schema' - supports-color '@mjackson/node-fetch-server@0.2.0': {} '@mjackson/node-fetch-server@0.6.1': {} - '@modelcontextprotocol/sdk@1.11.3': + '@modelcontextprotocol/sdk@1.22.0': dependencies: + ajv: 8.17.1 + ajv-formats: 3.0.1(ajv@8.17.1) content-type: 1.0.5 cors: 2.8.5 cross-spawn: 7.0.6 eventsource: 3.0.7 + eventsource-parser: 3.0.2 express: 5.1.0 express-rate-limit: 7.5.0(express@5.1.0) pkce-challenge: 5.0.0 @@ -2999,7 +3029,7 @@ snapshots: agents@0.0.80(@cloudflare/workers-types@4.20250515.0)(react@19.1.0): dependencies: - '@modelcontextprotocol/sdk': 1.11.3 + '@modelcontextprotocol/sdk': 1.22.0 ai: 4.3.15(react@19.1.0)(zod@3.24.4) cron-schedule: 5.0.4 nanoid: 5.1.5 @@ -3008,6 +3038,7 @@ snapshots: react: 19.1.0 zod: 3.24.4 transitivePeerDependencies: + - '@cfworker/json-schema' - '@cloudflare/workers-types' - supports-color @@ -3023,6 +3054,17 @@ snapshots: optionalDependencies: react: 19.1.0 + ajv-formats@3.0.1(ajv@8.17.1): + optionalDependencies: + ajv: 8.17.1 + + ajv@8.17.1: + dependencies: + fast-deep-equal: 3.1.3 + fast-uri: 3.1.0 + json-schema-traverse: 1.0.0 + require-from-string: 2.0.2 + ansi-regex@5.0.1: {} ansi-regex@6.1.0: {} @@ -3340,6 +3382,8 @@ snapshots: fast-equals@5.2.2: {} + fast-uri@3.1.0: {} + fdir@6.4.4(picomatch@4.0.2): optionalDependencies: picomatch: 4.0.2 @@ -3478,6 +3522,8 @@ snapshots: json-parse-even-better-errors@3.0.2: {} + json-schema-traverse@1.0.0: {} + json-schema@0.4.0: {} json5@2.2.3: {} @@ -3798,6 +3844,8 @@ snapshots: tiny-invariant: 1.3.3 victory-vendor: 36.9.2 + require-from-string@2.0.2: {} + retry@0.12.0: {} rollup@4.40.2: diff --git a/examples/typescript-server-demo/.gitignore b/examples/typescript-server-demo/.gitignore new file mode 100644 index 00000000..ada24855 --- /dev/null +++ b/examples/typescript-server-demo/.gitignore @@ -0,0 +1,6 @@ +# Build outputs that should never be committed +# (compiled files should go to dist/ directory) +src/**/*.js +src/**/*.d.ts +dist/ +*.tsbuildinfo diff --git a/examples/typescript-server-demo/package.json b/examples/typescript-server-demo/package.json index c8bc4b3e..ff87e101 100644 --- a/examples/typescript-server-demo/package.json +++ b/examples/typescript-server-demo/package.json @@ -13,7 +13,7 @@ "author": "", "license": "ISC", "dependencies": { - "@mcp-ui/server": "^5.2.0", + "@mcp-ui/server": "workspace:*", "@modelcontextprotocol/sdk": "^1.16.0", "cors": "^2.8.5", "express": "^4.17.1" diff --git a/examples/typescript-server-demo/tsconfig.json b/examples/typescript-server-demo/tsconfig.json index 7b3d7c59..f7861690 100644 --- a/examples/typescript-server-demo/tsconfig.json +++ b/examples/typescript-server-demo/tsconfig.json @@ -3,6 +3,7 @@ "target": "ES2022", "module": "NodeNext", "moduleResolution": "NodeNext", + "outDir": "dist", "strict": true, "skipLibCheck": true, "esModuleInterop": true, diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 9ea58da5..48568590 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -248,8 +248,8 @@ importers: examples/server: dependencies: '@mcp-ui/server': - specifier: ^5.2.0 - version: 5.2.0 + specifier: workspace:* + version: link:../../sdks/typescript/server '@modelcontextprotocol/sdk': specifier: ^1.11.1 version: 1.13.1 @@ -336,8 +336,8 @@ importers: examples/typescript-server-demo: dependencies: '@mcp-ui/server': - specifier: ^5.2.0 - version: 5.2.0 + specifier: workspace:* + version: link:../../sdks/typescript/server '@modelcontextprotocol/sdk': specifier: ^1.16.0 version: 1.16.0 @@ -1885,9 +1885,6 @@ packages: '@jridgewell/trace-mapping@0.3.9': resolution: {integrity: sha512-3Belt6tdc8bPgAtbcmdtNJlirVoTmEb5e2gC94PnkwEW9jI6CAHUeoG85tjWP5WquqfavoMtMwiG4P926ZKKuQ==} - '@mcp-ui/server@5.2.0': - resolution: {integrity: sha512-at6iPEWbs37mWiiB2YByf9sQEVq8FTqlIxe4cuyb4iw5GLYHRjnFoPsn4hSDF3wMEcsSKjTtinB3o1NI5s6viA==} - '@mermaid-js/mermaid-mindmap@9.3.0': resolution: {integrity: sha512-IhtYSVBBRYviH1Ehu8gk69pMDF8DSRqXBRDMWrEfHoaMruHeaP2DXA3PBnuwsMaCdPQhlUUcy/7DBLAEIXvCAw==} @@ -9606,12 +9603,6 @@ snapshots: '@jridgewell/resolve-uri': 3.1.2 '@jridgewell/sourcemap-codec': 1.5.0 - '@mcp-ui/server@5.2.0': - dependencies: - '@modelcontextprotocol/sdk': 1.16.0 - transitivePeerDependencies: - - supports-color - '@mermaid-js/mermaid-mindmap@9.3.0': dependencies: '@braintree/sanitize-url': 6.0.4