@shuffleio/shuffle-mcps 0.0.1

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,488 @@
1
+ /**
2
+ * Local Singul Library - Styles
3
+ * This is a local copy for development. Changes here should be merged back to:
4
+ * https://github.com/Shuffle/singul.js
5
+ */
6
+
7
+ .singul-container {
8
+ /* CSS Custom Properties for easy customization */
9
+ --singul-font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, sans-serif;
10
+ --singul-input-padding: 12px 16px;
11
+ --singul-input-padding-right: 48px;
12
+ --singul-input-border: 1px solid #d1d5db;
13
+ --singul-input-border-radius: 8px;
14
+ --singul-input-bg: #ffffff;
15
+ --singul-input-color: #1f2937;
16
+ --singul-input-font-size: 16px;
17
+ --singul-input-line-height: 1.5;
18
+ --singul-input-shadow: 0 1px 3px 0 rgba(0, 0, 0, 0.1);
19
+ --singul-input-focus-border: #3b82f6;
20
+ --singul-input-focus-shadow: 0 1px 3px 0 rgba(0, 0, 0, 0.1), 0 0 0 3px rgba(59, 130, 246, 0.1);
21
+ --singul-placeholder-color: #9ca3af;
22
+ --singul-icon-color: #9ca3af;
23
+ --singul-spinner-border: 2px solid #e5e7eb;
24
+ --singul-spinner-border-top: 2px solid #3b82f6;
25
+ --singul-dropdown-bg: #ffffff;
26
+ --singul-dropdown-border: 1px solid #e5e7eb;
27
+ --singul-dropdown-border-radius: 8px;
28
+ --singul-dropdown-shadow: 0 10px 15px -3px rgba(0, 0, 0, 0.1), 0 4px 6px -2px rgba(0, 0, 0, 0.05);
29
+ --singul-dropdown-max-height: 400px;
30
+ --singul-item-padding: 12px 16px;
31
+ --singul-item-border: 1px solid #f3f4f6;
32
+ --singul-item-hover-bg: #dff0ff;
33
+ --singul-item-selected-bg: rgba(59, 130, 246, 0.1);
34
+ --singul-item-selected-border: #3b82f6;
35
+ --singul-app-icon-size: 40px;
36
+ --singul-app-icon-border: 1px solid #e5e7eb;
37
+ --singul-app-icon-border-radius: 8px;
38
+ --singul-app-name-font-weight: 600;
39
+ --singul-app-name-color: #1f2937;
40
+ --singul-app-name-font-size: 14px;
41
+ --singul-app-description-color: #6b7280;
42
+ --singul-app-description-font-size: 12px;
43
+ --singul-app-category-bg: rgba(0, 0, 0, 0.05);
44
+ --singul-app-category-color: #6b7280;
45
+ --singul-empty-state-color: #9ca3af;
46
+ --singul-empty-state-font-size: 14px;
47
+ --singul-grid-gap: 12px;
48
+ --singul-grid-columns: 3;
49
+ --singul-accent-color: #3b82f6;
50
+
51
+ display: block;
52
+ position: relative;
53
+ width: 100%;
54
+ font-family: var(--singul-font-family);
55
+ }
56
+
57
+ .singul-search-bar-container {
58
+ position: relative;
59
+ width: 100%;
60
+ }
61
+
62
+ .singul-search-input-wrapper {
63
+ position: relative;
64
+ display: flex;
65
+ align-items: center;
66
+ }
67
+
68
+ .singul-search-input {
69
+ width: 100%;
70
+ padding: var(--singul-input-padding);
71
+ padding-right: var(--singul-input-padding-right);
72
+ border: var(--singul-input-border);
73
+ border-radius: var(--singul-input-border-radius);
74
+ background-color: var(--singul-input-bg);
75
+ color: var(--singul-input-color);
76
+ font-size: var(--singul-input-font-size);
77
+ line-height: var(--singul-input-line-height);
78
+ outline: none;
79
+ transition: all 0.2s ease-in-out;
80
+ box-shadow: var(--singul-input-shadow);
81
+ }
82
+
83
+ .singul-search-input::placeholder {
84
+ color: var(--singul-placeholder-color);
85
+ }
86
+
87
+ .singul-search-input:focus {
88
+ border-color: var(--singul-input-focus-border);
89
+ box-shadow: var(--singul-input-focus-shadow);
90
+ }
91
+
92
+ .singul-search-icon {
93
+ position: absolute;
94
+ right: 16px;
95
+ top: 50%;
96
+ transform: translateY(-50%);
97
+ color: var(--singul-icon-color);
98
+ pointer-events: none;
99
+ z-index: 1;
100
+ }
101
+
102
+ .singul-loading-spinner {
103
+ position: absolute;
104
+ right: 16px;
105
+ top: 50%;
106
+ transform: translateY(-50%);
107
+ z-index: 2;
108
+ }
109
+
110
+ .singul-spinner {
111
+ width: 16px;
112
+ height: 16px;
113
+ border: var(--singul-spinner-border);
114
+ border-top: var(--singul-spinner-border-top);
115
+ border-radius: 50%;
116
+ animation: singul-spin 1s linear infinite;
117
+ }
118
+
119
+ @keyframes singul-spin {
120
+ 0% { transform: rotate(0deg); }
121
+ 100% { transform: rotate(360deg); }
122
+ }
123
+
124
+ /* Dropdown - List Layout */
125
+ .singul-dropdown {
126
+ position: absolute;
127
+ top: 100%;
128
+ left: 0;
129
+ right: 0;
130
+ z-index: 1000;
131
+ margin-top: 4px;
132
+ background-color: var(--singul-dropdown-bg);
133
+ border: var(--singul-dropdown-border);
134
+ border-radius: var(--singul-dropdown-border-radius);
135
+ box-shadow: var(--singul-dropdown-shadow);
136
+ max-height: var(--singul-dropdown-max-height);
137
+ overflow-y: auto;
138
+ }
139
+
140
+ /* Dropdown - Grid Layout */
141
+ .singul-dropdown.singul-dropdown-grid {
142
+ display: grid;
143
+ grid-template-columns: repeat(var(--singul-grid-columns), 1fr);
144
+ gap: var(--singul-grid-gap);
145
+ padding: var(--singul-grid-gap);
146
+ }
147
+
148
+ /* Inline Results Container */
149
+ .singul-results-container {
150
+ margin-top: 16px;
151
+ max-height: calc(100vh - 200px);
152
+ overflow-y: auto;
153
+ position: relative;
154
+ mask-image: linear-gradient(to bottom, black calc(100% - 32px), transparent 100%);
155
+ -webkit-mask-image: linear-gradient(to bottom, black calc(100% - 32px), transparent 100%);
156
+ }
157
+
158
+ .singul-results-container.singul-results-grid {
159
+ display: grid;
160
+ grid-template-columns: repeat(var(--singul-grid-columns), 1fr);
161
+ gap: var(--singul-grid-gap);
162
+ }
163
+
164
+ /* Custom scrollbar for results */
165
+ .singul-results-container::-webkit-scrollbar {
166
+ width: 6px;
167
+ }
168
+
169
+ .singul-results-container::-webkit-scrollbar-track {
170
+ background: rgba(255, 255, 255, 0.05);
171
+ border-radius: 3px;
172
+ }
173
+
174
+ .singul-results-container::-webkit-scrollbar-thumb {
175
+ background: rgba(255, 255, 255, 0.1);
176
+ border-radius: 3px;
177
+ }
178
+
179
+ .singul-results-container::-webkit-scrollbar-thumb:hover {
180
+ background: rgba(255, 255, 255, 0.2);
181
+ }
182
+
183
+ /* Inline mode container */
184
+ .singul-container.singul-inline .singul-search-bar-container {
185
+ position: static;
186
+ }
187
+
188
+ .singul-dropdown-item {
189
+ padding: var(--singul-item-padding);
190
+ cursor: pointer;
191
+ border-bottom: var(--singul-item-border);
192
+ transition: background-color 0.2s ease-in-out, border-color 0.2s ease-in-out;
193
+ overflow: hidden;
194
+ outline: none;
195
+ }
196
+
197
+ .singul-dropdown-item:last-child {
198
+ border-bottom: none;
199
+ }
200
+
201
+ .singul-dropdown-item:hover {
202
+ background-color: var(--singul-item-hover-bg);
203
+ }
204
+
205
+ .singul-dropdown-item.singul-selected {
206
+ background-color: var(--singul-item-selected-bg);
207
+ border-color: var(--singul-item-selected-border);
208
+ }
209
+
210
+ /* Grid Item Styles */
211
+ .singul-dropdown-grid .singul-dropdown-item,
212
+ .singul-results-grid .singul-dropdown-item {
213
+ border: 1px solid var(--singul-item-border);
214
+ border-radius: var(--singul-dropdown-border-radius);
215
+ padding: 10px 12px;
216
+ overflow: hidden;
217
+ }
218
+
219
+ .singul-dropdown-grid .singul-dropdown-item:hover,
220
+ .singul-results-grid .singul-dropdown-item:hover {
221
+ border-color: rgba(255, 255, 255, 0.2);
222
+ }
223
+
224
+ .singul-dropdown-grid .singul-dropdown-item.singul-selected,
225
+ .singul-results-grid .singul-dropdown-item.singul-selected {
226
+ border-color: var(--singul-item-selected-border);
227
+ background-color: var(--singul-item-selected-bg);
228
+ }
229
+
230
+ .singul-app-info {
231
+ display: flex;
232
+ align-items: flex-start;
233
+ gap: 12px;
234
+ }
235
+
236
+ .singul-app-icon {
237
+ width: var(--singul-app-icon-size);
238
+ height: var(--singul-app-icon-size);
239
+ border: var(--singul-app-icon-border);
240
+ border-radius: var(--singul-app-icon-border-radius);
241
+ object-fit: contain;
242
+ flex-shrink: 0;
243
+ background-color: rgba(255, 255, 255, 0.05);
244
+ padding: 4px;
245
+ }
246
+
247
+ .singul-app-details {
248
+ display: flex;
249
+ flex-direction: column;
250
+ gap: 2px;
251
+ flex: 1;
252
+ min-width: 0;
253
+ }
254
+
255
+ .singul-app-name {
256
+ display: block;
257
+ font-weight: var(--singul-app-name-font-weight);
258
+ color: var(--singul-app-name-color);
259
+ font-size: var(--singul-app-name-font-size);
260
+ line-height: 1.4;
261
+ overflow: hidden;
262
+ text-overflow: ellipsis;
263
+ white-space: nowrap;
264
+ max-width: 100%;
265
+ }
266
+
267
+ .singul-app-description {
268
+ display: -webkit-box;
269
+ -webkit-line-clamp: 2;
270
+ -webkit-box-orient: vertical;
271
+ color: var(--singul-app-description-color);
272
+ font-size: var(--singul-app-description-font-size);
273
+ line-height: 1.4;
274
+ overflow: hidden;
275
+ text-overflow: ellipsis;
276
+ max-height: 2.8em;
277
+ }
278
+
279
+ .singul-app-category {
280
+ display: inline-block;
281
+ margin-top: 6px;
282
+ padding: 2px 8px;
283
+ background-color: var(--singul-app-category-bg);
284
+ color: var(--singul-app-category-color);
285
+ font-size: 10px;
286
+ font-weight: 600;
287
+ text-transform: uppercase;
288
+ letter-spacing: 0.5px;
289
+ border-radius: 4px;
290
+ max-width: 100%;
291
+ overflow: hidden;
292
+ text-overflow: ellipsis;
293
+ white-space: nowrap;
294
+ }
295
+
296
+ /* Status Dot — overlaid on app icon */
297
+ .singul-status-dot {
298
+ position: absolute;
299
+ bottom: -2px;
300
+ right: -2px;
301
+ width: 10px;
302
+ height: 10px;
303
+ border-radius: 50%;
304
+ border: 2px solid rgba(17, 17, 17, 0.9);
305
+ pointer-events: none;
306
+ }
307
+
308
+ .singul-dot-validated {
309
+ background-color: #22c55e;
310
+ box-shadow: 0 0 6px rgba(34, 197, 94, 0.5);
311
+ }
312
+
313
+ .singul-dot-configured {
314
+ background-color: #f59e0b;
315
+ box-shadow: 0 0 6px rgba(245, 158, 11, 0.4);
316
+ }
317
+
318
+ .singul-dot-activated {
319
+ background-color: #ef4444;
320
+ box-shadow: 0 0 6px rgba(239, 68, 68, 0.4);
321
+ }
322
+
323
+ .singul-dot-inactive {
324
+ background-color: #f59e0b;
325
+ box-shadow: 0 0 6px rgba(245, 158, 11, 0.4);
326
+ }
327
+
328
+ /* Item border colors based on auth state */
329
+ .singul-dropdown-item.singul-validated {
330
+ border-color: rgba(34, 197, 94, 0.3);
331
+ }
332
+
333
+ .singul-dropdown-item.singul-configured {
334
+ border-color: rgba(245, 158, 11, 0.3);
335
+ }
336
+
337
+ /* Grid items: compact icon */
338
+ .singul-results-grid .singul-app-icon,
339
+ .singul-dropdown-grid .singul-app-icon {
340
+ width: 30px;
341
+ height: 30px;
342
+ border-radius: 6px;
343
+ padding: 3px;
344
+ }
345
+
346
+ .singul-results-grid .singul-app-info,
347
+ .singul-dropdown-grid .singul-app-info {
348
+ gap: 8px;
349
+ align-items: center;
350
+ }
351
+
352
+ /* Grid items: tighter category chip */
353
+ .singul-results-grid .singul-app-category,
354
+ .singul-dropdown-grid .singul-app-category {
355
+ margin-top: 2px;
356
+ font-size: 9px;
357
+ padding: 1px 6px;
358
+ }
359
+
360
+ .singul-checkbox {
361
+ flex-shrink: 0;
362
+ width: 18px;
363
+ height: 18px;
364
+ border: 2px solid rgba(255, 255, 255, 0.2);
365
+ border-radius: 4px;
366
+ display: flex;
367
+ align-items: center;
368
+ justify-content: center;
369
+ transition: all 0.2s ease;
370
+ }
371
+
372
+ .singul-checkbox.singul-checked {
373
+ background-color: var(--singul-accent-color);
374
+ border-color: var(--singul-accent-color);
375
+ }
376
+
377
+ .singul-checkbox svg {
378
+ width: 12px;
379
+ height: 12px;
380
+ color: white;
381
+ }
382
+
383
+ .singul-empty-state {
384
+ padding: 24px;
385
+ text-align: center;
386
+ color: var(--singul-empty-state-color);
387
+ font-size: var(--singul-empty-state-font-size);
388
+ }
389
+
390
+ /* Mobile responsive */
391
+ @media (max-width: 768px) {
392
+ .singul-search-input {
393
+ font-size: 16px;
394
+ padding: 14px 16px;
395
+ padding-right: 48px;
396
+ }
397
+
398
+ .singul-dropdown {
399
+ max-height: 300px;
400
+ }
401
+
402
+ .singul-dropdown.singul-dropdown-grid,
403
+ .singul-results-container.singul-results-grid {
404
+ --singul-grid-columns: 1 !important;
405
+ }
406
+
407
+ .singul-dropdown-item {
408
+ padding: 14px 16px;
409
+ }
410
+
411
+ .singul-app-icon {
412
+ width: 36px;
413
+ height: 36px;
414
+ }
415
+ }
416
+
417
+ @media (min-width: 769px) and (max-width: 1024px) {
418
+ .singul-dropdown.singul-dropdown-grid,
419
+ .singul-results-container.singul-results-grid {
420
+ --singul-grid-columns: 2 !important;
421
+ }
422
+ }
423
+
424
+ /* Source filter pills (All / Public / Private) */
425
+ .singul-source-filter {
426
+ display: flex;
427
+ gap: 6px;
428
+ margin: 12px 0 8px;
429
+ flex-wrap: wrap;
430
+ }
431
+
432
+ .singul-source-pill {
433
+ display: inline-flex;
434
+ align-items: center;
435
+ gap: 6px;
436
+ padding: 6px 12px;
437
+ border-radius: 999px;
438
+ border: 1px solid rgba(255, 255, 255, 0.12);
439
+ background: transparent;
440
+ color: rgba(255, 255, 255, 0.7);
441
+ font-size: 12px;
442
+ font-weight: 500;
443
+ cursor: pointer;
444
+ transition: all 0.15s ease;
445
+ }
446
+
447
+ .singul-source-pill:hover {
448
+ border-color: rgba(255, 255, 255, 0.3);
449
+ color: rgba(255, 255, 255, 0.95);
450
+ }
451
+
452
+ .singul-source-pill-active {
453
+ background: rgba(255, 102, 0, 0.12);
454
+ border-color: rgba(255, 102, 0, 0.5);
455
+ color: #FF8544;
456
+ }
457
+
458
+ .singul-source-count {
459
+ display: inline-flex;
460
+ align-items: center;
461
+ justify-content: center;
462
+ min-width: 18px;
463
+ height: 18px;
464
+ padding: 0 6px;
465
+ border-radius: 9px;
466
+ background: rgba(255, 255, 255, 0.08);
467
+ font-size: 10px;
468
+ font-weight: 600;
469
+ }
470
+
471
+ .singul-source-pill-active .singul-source-count {
472
+ background: rgba(255, 102, 0, 0.2);
473
+ }
474
+
475
+ /* Private app badge inline next to the name */
476
+ .singul-private-badge {
477
+ display: inline-block;
478
+ margin-left: 8px;
479
+ padding: 1px 6px;
480
+ border-radius: 4px;
481
+ background: rgba(156, 90, 242, 0.15);
482
+ color: #B584F5;
483
+ font-size: 9px;
484
+ font-weight: 700;
485
+ text-transform: uppercase;
486
+ letter-spacing: 0.05em;
487
+ vertical-align: middle;
488
+ }
Binary file
Binary file
Binary file
package/package.json ADDED
@@ -0,0 +1,58 @@
1
+ {
2
+ "name": "@shuffleio/shuffle-mcps",
3
+ "version": "0.0.1",
4
+ "description": "Turn 3,000+ SaaS tools into MCP servers your agents can use. Headless React component for search, selection, and OAuth handoff.",
5
+ "license": "MIT",
6
+ "repository": {
7
+ "type": "git",
8
+ "url": "https://github.com/Shuffle/singul.js.git"
9
+ },
10
+ "homepage": "https://github.com/Shuffle/singul.js#readme",
11
+ "keywords": [
12
+ "react",
13
+ "integrations",
14
+ "oauth",
15
+ "mcp",
16
+ "algolia",
17
+ "search",
18
+ "shuffle",
19
+ "singul"
20
+ ],
21
+ "type": "module",
22
+ "main": "./dist/index.cjs",
23
+ "module": "./dist/index.js",
24
+ "types": "./dist/index.d.ts",
25
+ "exports": {
26
+ ".": {
27
+ "types": "./dist/index.d.ts",
28
+ "import": "./dist/index.js",
29
+ "require": "./dist/index.cjs"
30
+ },
31
+ "./singul.css": "./dist/singul.css"
32
+ },
33
+ "files": [
34
+ "dist",
35
+ "docs",
36
+ "README.md",
37
+ "LICENSE"
38
+ ],
39
+ "sideEffects": [
40
+ "**/*.css"
41
+ ],
42
+ "scripts": {
43
+ "build": "tsup",
44
+ "prepublishOnly": "npm run build"
45
+ },
46
+ "peerDependencies": {
47
+ "react": ">=18",
48
+ "react-dom": ">=18"
49
+ },
50
+ "dependencies": {
51
+ "algoliasearch": "^5.0.0"
52
+ },
53
+ "devDependencies": {
54
+ "@types/react": "^18.0.0",
55
+ "tsup": "^8.0.0",
56
+ "typescript": "^5.0.0"
57
+ }
58
+ }