|
25 | 25 | </head> |
26 | 26 | <body> |
27 | 27 | <div id="qr"></div> |
28 | | - <script> |
29 | | - const WIDTH = 340; |
30 | | - const HEIGHT = 340; |
31 | | - let requestId = 1; |
| 28 | + <script type="module"> |
| 29 | + import { App, PostMessageTransport } from "https://unpkg.com/@modelcontextprotocol/[email protected]"; |
32 | 30 |
|
33 | | - // Listen for messages from host |
34 | | - window.addEventListener('message', e => { |
35 | | - console.log('[Widget] Received message:', e); |
36 | | - const msg = e.data; |
37 | | - if (!msg || typeof msg !== 'object') return; |
| 31 | + const app = new App({ name: "QR Widget", version: "1.0.0" }); |
38 | 32 |
|
39 | | - // Handle ui/notifications/tool-result |
40 | | - if (msg.method === 'ui/notifications/tool-result') { |
41 | | - const content = msg.params?.content; |
42 | | - const img = content?.find(c => c.type === 'image'); |
43 | | - if (img) { |
44 | | - const qrDiv = document.getElementById('qr'); |
45 | | - qrDiv.innerHTML = ''; // clear previous content |
| 33 | + app.ontoolresult = ({ content }) => { |
| 34 | + const img = content?.find(c => c.type === 'image'); |
| 35 | + if (img) { |
| 36 | + const qrDiv = document.getElementById('qr'); |
| 37 | + qrDiv.innerHTML = ''; |
46 | 38 |
|
47 | | - // Optionally allowlist mimetypes |
48 | | - const allowedTypes = ['image/png', 'image/jpeg', 'image/gif']; |
49 | | - const mimeType = allowedTypes.includes(img.mimeType) ? img.mimeType : 'image/png'; |
| 39 | + const allowedTypes = ['image/png', 'image/jpeg', 'image/gif']; |
| 40 | + const mimeType = allowedTypes.includes(img.mimeType) ? img.mimeType : 'image/png'; |
50 | 41 |
|
51 | | - const image = document.createElement('img'); |
52 | | - image.src = `data:${mimeType};base64,${img.data}`; |
53 | | - image.alt = "QR Code"; |
54 | | - qrDiv.appendChild(image); |
55 | | - |
56 | | - // Report size to host |
57 | | - window.parent.postMessage({ |
58 | | - jsonrpc: '2.0', |
59 | | - method: 'ui/notifications/size-changed', |
60 | | - params: { width: WIDTH, height: HEIGHT } |
61 | | - }, '*'); |
62 | | - } |
63 | | - } |
64 | | - |
65 | | - // Handle ui/initialize response - MUST send ui/notifications/initialized |
66 | | - if (msg.id && msg.result) { |
67 | | - console.log('[Widget] Initialize response received:', msg.result); |
68 | | - // Send initialized notification - HOST WAITS FOR THIS! |
69 | | - window.parent.postMessage({ |
70 | | - jsonrpc: '2.0', |
71 | | - method: 'ui/notifications/initialized', |
72 | | - params: {} |
73 | | - }, '*'); |
74 | | - console.log('[Widget] Sent ui/notifications/initialized'); |
| 42 | + const image = document.createElement('img'); |
| 43 | + image.src = `data:${mimeType};base64,${img.data}`; |
| 44 | + image.alt = "QR Code"; |
| 45 | + qrDiv.appendChild(image); |
75 | 46 | } |
76 | | - }); |
| 47 | + }; |
77 | 48 |
|
78 | | - // Send ui/initialize request when ready |
79 | | - window.parent.postMessage({ |
80 | | - jsonrpc: '2.0', |
81 | | - id: requestId++, |
82 | | - method: 'ui/initialize', |
83 | | - params: { |
84 | | - appInfo: { name: 'QR Widget', version: '1.0.0' }, |
85 | | - appCapabilities: {}, |
86 | | - protocolVersion: '2024-11-05' |
87 | | - } |
88 | | - }, '*'); |
| 49 | + await app.connect(new PostMessageTransport(window.parent)); |
89 | 50 | </script> |
90 | 51 | </body> |
91 | 52 | </html> |
0 commit comments