@swatcha/mcp-server 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=image-picker-spike.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"image-picker-spike.d.ts","sourceRoot":"","sources":["../../src/apps/image-picker-spike.ts"],"names":[],"mappings":""}
@@ -0,0 +1,100 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ const ext_apps_1 = require("@modelcontextprotocol/ext-apps");
4
+ const statusEl = document.getElementById('status');
5
+ const imagesEl = document.getElementById('images');
6
+ const saveBtnEl = document.getElementById('saveBtn');
7
+ const errorEl = document.getElementById('error');
8
+ let selectedUrl = null;
9
+ const app = new ext_apps_1.App({ name: 'ImagePickerSpike', version: '0.1.0' });
10
+ // Receive the tool result with structuredContent
11
+ app.ontoolresult = (params) => {
12
+ statusEl.textContent = 'Tool result received!';
13
+ const data = params.structuredContent;
14
+ if (!data || !data.candidates) {
15
+ statusEl.textContent = 'No candidates in structuredContent';
16
+ return;
17
+ }
18
+ renderImages(data);
19
+ };
20
+ function renderImages(data) {
21
+ statusEl.textContent = `Showing images for: ${data.productName}`;
22
+ // Clear previous
23
+ while (imagesEl.firstChild)
24
+ imagesEl.removeChild(imagesEl.firstChild);
25
+ if (data.candidates.length === 0) {
26
+ statusEl.textContent = 'No image candidates found';
27
+ return;
28
+ }
29
+ // Pre-select first
30
+ selectedUrl = data.candidates[0].imageUrl;
31
+ data.candidates.forEach((candidate) => {
32
+ const card = document.createElement('div');
33
+ card.className = 'image-card' + (selectedUrl === candidate.imageUrl ? ' selected' : '');
34
+ const img = document.createElement('img');
35
+ img.src = candidate.thumbnailUrl || candidate.imageUrl;
36
+ img.alt = candidate.title;
37
+ img.loading = 'lazy';
38
+ img.onerror = function () {
39
+ const errDiv = document.createElement('div');
40
+ errDiv.className = 'label';
41
+ errDiv.textContent = 'Failed to load';
42
+ errDiv.style.height = '100px';
43
+ errDiv.style.display = 'flex';
44
+ errDiv.style.alignItems = 'center';
45
+ errDiv.style.justifyContent = 'center';
46
+ this.parentNode?.replaceChild(errDiv, this);
47
+ };
48
+ const label = document.createElement('div');
49
+ label.className = 'label';
50
+ label.textContent = candidate.sourceDomain || 'Unknown';
51
+ card.appendChild(img);
52
+ card.appendChild(label);
53
+ card.addEventListener('click', () => {
54
+ selectedUrl = candidate.imageUrl;
55
+ // Update selection visual
56
+ imagesEl.querySelectorAll('.image-card').forEach((c) => c.classList.remove('selected'));
57
+ card.classList.add('selected');
58
+ });
59
+ imagesEl.appendChild(card);
60
+ });
61
+ saveBtnEl.style.display = 'inline-block';
62
+ }
63
+ saveBtnEl.addEventListener('click', async () => {
64
+ if (!selectedUrl)
65
+ return;
66
+ try {
67
+ await app.updateModelContext({
68
+ content: [
69
+ {
70
+ type: 'text',
71
+ text: JSON.stringify({
72
+ type: 'image_selection',
73
+ selectedImageUrl: selectedUrl,
74
+ }),
75
+ },
76
+ ],
77
+ });
78
+ statusEl.textContent = 'Selection sent to Claude!';
79
+ saveBtnEl.style.display = 'none';
80
+ }
81
+ catch (err) {
82
+ errorEl.textContent = `Failed to send: ${err instanceof Error ? err.message : String(err)}`;
83
+ }
84
+ });
85
+ app.onteardown = async () => {
86
+ statusEl.textContent = 'Tearing down...';
87
+ return {};
88
+ };
89
+ // Connect to host
90
+ app.connect().then(() => {
91
+ statusEl.textContent = 'Connected! Waiting for tool data...';
92
+ const ctx = app.getHostContext();
93
+ if (ctx?.theme === 'dark') {
94
+ document.body.style.background = '#1a1a2e';
95
+ document.body.style.color = '#e2e8f0';
96
+ }
97
+ }).catch((err) => {
98
+ errorEl.textContent = `Connection failed: ${err instanceof Error ? err.message : String(err)}`;
99
+ });
100
+ //# sourceMappingURL=image-picker-spike.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"image-picker-spike.js","sourceRoot":"","sources":["../../src/apps/image-picker-spike.ts"],"names":[],"mappings":";;AAAA,6DAAqD;AAErD,MAAM,QAAQ,GAAG,QAAQ,CAAC,cAAc,CAAC,QAAQ,CAAE,CAAC;AACpD,MAAM,QAAQ,GAAG,QAAQ,CAAC,cAAc,CAAC,QAAQ,CAAE,CAAC;AACpD,MAAM,SAAS,GAAG,QAAQ,CAAC,cAAc,CAAC,SAAS,CAAuB,CAAC;AAC3E,MAAM,OAAO,GAAG,QAAQ,CAAC,cAAc,CAAC,OAAO,CAAE,CAAC;AAElD,IAAI,WAAW,GAAkB,IAAI,CAAC;AActC,MAAM,GAAG,GAAG,IAAI,cAAG,CAAC,EAAE,IAAI,EAAE,kBAAkB,EAAE,OAAO,EAAE,OAAO,EAAE,CAAC,CAAC;AAEpE,iDAAiD;AACjD,GAAG,CAAC,YAAY,GAAG,CAAC,MAAM,EAAE,EAAE;IAC5B,QAAQ,CAAC,WAAW,GAAG,uBAAuB,CAAC;IAE/C,MAAM,IAAI,GAAG,MAAM,CAAC,iBAA0C,CAAC;IAC/D,IAAI,CAAC,IAAI,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,CAAC;QAC9B,QAAQ,CAAC,WAAW,GAAG,oCAAoC,CAAC;QAC5D,OAAO;IACT,CAAC;IAED,YAAY,CAAC,IAAI,CAAC,CAAC;AACrB,CAAC,CAAC;AAEF,SAAS,YAAY,CAAC,IAAe;IACnC,QAAQ,CAAC,WAAW,GAAG,uBAAuB,IAAI,CAAC,WAAW,EAAE,CAAC;IAEjE,iBAAiB;IACjB,OAAO,QAAQ,CAAC,UAAU;QAAE,QAAQ,CAAC,WAAW,CAAC,QAAQ,CAAC,UAAU,CAAC,CAAC;IAEtE,IAAI,IAAI,CAAC,UAAU,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACjC,QAAQ,CAAC,WAAW,GAAG,2BAA2B,CAAC;QACnD,OAAO;IACT,CAAC;IAED,mBAAmB;IACnB,WAAW,GAAG,IAAI,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC;IAE1C,IAAI,CAAC,UAAU,CAAC,OAAO,CAAC,CAAC,SAAS,EAAE,EAAE;QACpC,MAAM,IAAI,GAAG,QAAQ,CAAC,aAAa,CAAC,KAAK,CAAC,CAAC;QAC3C,IAAI,CAAC,SAAS,GAAG,YAAY,GAAG,CAAC,WAAW,KAAK,SAAS,CAAC,QAAQ,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;QAExF,MAAM,GAAG,GAAG,QAAQ,CAAC,aAAa,CAAC,KAAK,CAAC,CAAC;QAC1C,GAAG,CAAC,GAAG,GAAG,SAAS,CAAC,YAAY,IAAI,SAAS,CAAC,QAAQ,CAAC;QACvD,GAAG,CAAC,GAAG,GAAG,SAAS,CAAC,KAAK,CAAC;QAC1B,GAAG,CAAC,OAAO,GAAG,MAAM,CAAC;QACrB,GAAG,CAAC,OAAO,GAAG;YACZ,MAAM,MAAM,GAAG,QAAQ,CAAC,aAAa,CAAC,KAAK,CAAC,CAAC;YAC7C,MAAM,CAAC,SAAS,GAAG,OAAO,CAAC;YAC3B,MAAM,CAAC,WAAW,GAAG,gBAAgB,CAAC;YACtC,MAAM,CAAC,KAAK,CAAC,MAAM,GAAG,OAAO,CAAC;YAC9B,MAAM,CAAC,KAAK,CAAC,OAAO,GAAG,MAAM,CAAC;YAC9B,MAAM,CAAC,KAAK,CAAC,UAAU,GAAG,QAAQ,CAAC;YACnC,MAAM,CAAC,KAAK,CAAC,cAAc,GAAG,QAAQ,CAAC;YACvC,IAAI,CAAC,UAAU,EAAE,YAAY,CAAC,MAAM,EAAE,IAAI,CAAC,CAAC;QAC9C,CAAC,CAAC;QAEF,MAAM,KAAK,GAAG,QAAQ,CAAC,aAAa,CAAC,KAAK,CAAC,CAAC;QAC5C,KAAK,CAAC,SAAS,GAAG,OAAO,CAAC;QAC1B,KAAK,CAAC,WAAW,GAAG,SAAS,CAAC,YAAY,IAAI,SAAS,CAAC;QAExD,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,CAAC;QACtB,IAAI,CAAC,WAAW,CAAC,KAAK,CAAC,CAAC;QAExB,IAAI,CAAC,gBAAgB,CAAC,OAAO,EAAE,GAAG,EAAE;YAClC,WAAW,GAAG,SAAS,CAAC,QAAQ,CAAC;YACjC,0BAA0B;YAC1B,QAAQ,CAAC,gBAAgB,CAAC,aAAa,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,SAAS,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC,CAAC;YACxF,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC;QACjC,CAAC,CAAC,CAAC;QAEH,QAAQ,CAAC,WAAW,CAAC,IAAI,CAAC,CAAC;IAC7B,CAAC,CAAC,CAAC;IAEH,SAAS,CAAC,KAAK,CAAC,OAAO,GAAG,cAAc,CAAC;AAC3C,CAAC;AAED,SAAS,CAAC,gBAAgB,CAAC,OAAO,EAAE,KAAK,IAAI,EAAE;IAC7C,IAAI,CAAC,WAAW;QAAE,OAAO;IAEzB,IAAI,CAAC;QACH,MAAM,GAAG,CAAC,kBAAkB,CAAC;YAC3B,OAAO,EAAE;gBACP;oBACE,IAAI,EAAE,MAAM;oBACZ,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC;wBACnB,IAAI,EAAE,iBAAiB;wBACvB,gBAAgB,EAAE,WAAW;qBAC9B,CAAC;iBACH;aACF;SACF,CAAC,CAAC;QACH,QAAQ,CAAC,WAAW,GAAG,2BAA2B,CAAC;QACnD,SAAS,CAAC,KAAK,CAAC,OAAO,GAAG,MAAM,CAAC;IACnC,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,OAAO,CAAC,WAAW,GAAG,mBAAmB,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC;IAC9F,CAAC;AACH,CAAC,CAAC,CAAC;AAEH,GAAG,CAAC,UAAU,GAAG,KAAK,IAAI,EAAE;IAC1B,QAAQ,CAAC,WAAW,GAAG,iBAAiB,CAAC;IACzC,OAAO,EAAE,CAAC;AACZ,CAAC,CAAC;AAEF,kBAAkB;AAClB,GAAG,CAAC,OAAO,EAAE,CAAC,IAAI,CAAC,GAAG,EAAE;IACtB,QAAQ,CAAC,WAAW,GAAG,qCAAqC,CAAC;IAE7D,MAAM,GAAG,GAAG,GAAG,CAAC,cAAc,EAAE,CAAC;IACjC,IAAI,GAAG,EAAE,KAAK,KAAK,MAAM,EAAE,CAAC;QAC1B,QAAQ,CAAC,IAAI,CAAC,KAAK,CAAC,UAAU,GAAG,SAAS,CAAC;QAC3C,QAAQ,CAAC,IAAI,CAAC,KAAK,CAAC,KAAK,GAAG,SAAS,CAAC;IACxC,CAAC;AACH,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,GAAG,EAAE,EAAE;IACf,OAAO,CAAC,WAAW,GAAG,sBAAsB,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC;AACjG,CAAC,CAAC,CAAC"}