deploy-mcp 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.
package/dist/worker.js ADDED
@@ -0,0 +1,1212 @@
1
+ import {
2
+ MCPHandler,
3
+ VercelAdapter
4
+ } from "./chunk-QRZL43CY.js";
5
+
6
+ // src/landing-page.ts
7
+ var landingPageHTML = `<!DOCTYPE html>
8
+ <html lang="en">
9
+ <head>
10
+ <meta charset="UTF-8">
11
+ <meta name="viewport" content="width=device-width, initial-scale=1.0">
12
+ <title>deploy-mcp - Universal Deployment Tracker</title>
13
+ <link rel="icon" href="data:image/svg+xml,<svg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 32 32'><defs><linearGradient id='g' x1='0' y1='0' x2='1' y2='1'><stop offset='0' stop-color='%23ff6b6b'/><stop offset='1' stop-color='%23ff8e53'/></linearGradient></defs><rect width='32' height='32' rx='6' fill='%23000'/><circle cx='16' cy='16' r='10' fill='url(%23g)'/><path d='M12 13h8v2h-8zm0 4h6v2h-6z' fill='white'/></svg>">
14
+ <link rel="preconnect" href="https://fonts.googleapis.com">
15
+ <link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>
16
+ <link href="https://fonts.googleapis.com/css2?family=Inter:ital,opsz,wght@0,14..32,100..900;1,14..32,100..900&display=swap" rel="stylesheet">
17
+ <style>
18
+ :root {
19
+ --bg-primary: #0a0a0f;
20
+ --bg-secondary: #12121a;
21
+ --bg-card: #1a1a24;
22
+ --bg-card-hover: #1f1f2e;
23
+ --border-primary: #2a2a3a;
24
+ --border-accent: #ff6b6b;
25
+ --text-primary: #ffffff;
26
+ --text-secondary: #b8b8c8;
27
+ --text-muted: #8a8a9a;
28
+ --accent-red: #ff6b6b;
29
+ --accent-orange: #ff8e53;
30
+ --accent-green: #51cf66;
31
+ --accent-blue: #339af0;
32
+ --accent-purple: #845ef7;
33
+ --code-bg: #16161f;
34
+ --code-border: #ff6b6b40;
35
+ }
36
+
37
+ * {
38
+ margin: 0;
39
+ padding: 0;
40
+ box-sizing: border-box;
41
+ }
42
+
43
+ body {
44
+ font-family: 'Inter', -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, sans-serif;
45
+ background: var(--bg-primary);
46
+ color: var(--text-primary);
47
+ line-height: 1.6;
48
+ overflow-x: hidden;
49
+ min-height: 100vh;
50
+ position: relative;
51
+ }
52
+
53
+ body::before {
54
+ content: '';
55
+ position: fixed;
56
+ top: 0;
57
+ left: 0;
58
+ right: 0;
59
+ bottom: 0;
60
+ background:
61
+ radial-gradient(800px circle at 15% 25%, rgba(255, 107, 107, 0.08) 0%, transparent 60%),
62
+ radial-gradient(600px circle at 85% 75%, rgba(255, 142, 83, 0.06) 0%, transparent 50%);
63
+ pointer-events: none;
64
+ z-index: -1;
65
+ }
66
+
67
+ .container {
68
+ max-width: 1200px;
69
+ margin: 0 auto;
70
+ padding: 0 1.5rem;
71
+ position: relative;
72
+ }
73
+
74
+ /* Hero Section */
75
+ .hero {
76
+ text-align: center;
77
+ padding: 6rem 0 4rem;
78
+ margin-bottom: 4rem;
79
+ position: relative;
80
+ background: linear-gradient(135deg, rgba(255, 107, 107, 0.05) 0%, rgba(255, 142, 83, 0.03) 100%);
81
+ border-radius: 20px;
82
+ overflow: hidden;
83
+ }
84
+
85
+ .hero::before {
86
+ content: '';
87
+ position: absolute;
88
+ top: -50%;
89
+ left: -50%;
90
+ width: 200%;
91
+ height: 200%;
92
+ background: url("data:image/svg+xml,%3Csvg width='60' height='60' viewBox='0 0 60 60' xmlns='http://www.w3.org/2000/svg'%3E%3Cg fill='none' fill-rule='evenodd'%3E%3Cg fill='%23ff6b6b' fill-opacity='0.03'%3E%3Ccircle cx='30' cy='30' r='2'/%3E%3C/g%3E%3C/g%3E%3C/svg%3E");
93
+ animation: float 20s ease-in-out infinite;
94
+ z-index: -1;
95
+ }
96
+
97
+ .hero-links {
98
+ position: fixed;
99
+ top: 1.5rem;
100
+ right: 1.5rem;
101
+ display: flex;
102
+ gap: 0.75rem;
103
+ z-index: 100;
104
+ }
105
+
106
+ .hero-link {
107
+ display: flex;
108
+ align-items: center;
109
+ gap: 0.5rem;
110
+ padding: 0.6rem 0.9rem;
111
+ background: rgba(26, 26, 36, 0.8);
112
+ border: 1px solid var(--border-primary);
113
+ border-radius: 8px;
114
+ color: var(--text-secondary);
115
+ text-decoration: none;
116
+ font-size: 0.8rem;
117
+ font-weight: 500;
118
+ transition: all 0.3s ease;
119
+ backdrop-filter: blur(12px);
120
+ }
121
+
122
+ .hero-link:hover {
123
+ border-color: var(--border-accent);
124
+ color: var(--text-primary);
125
+ transform: translateY(-2px);
126
+ box-shadow: 0 4px 12px rgba(0, 0, 0, 0.2);
127
+ }
128
+
129
+ .hero-link svg {
130
+ flex-shrink: 0;
131
+ }
132
+
133
+ @keyframes float {
134
+ 0%, 100% { transform: translateY(0px) rotate(0deg); }
135
+ 50% { transform: translateY(-20px) rotate(180deg); }
136
+ }
137
+
138
+ .hero h1 {
139
+ font-size: clamp(3rem, 8vw, 5.5rem);
140
+ font-weight: 900;
141
+ color: var(--text-primary);
142
+ margin-bottom: 1.5rem;
143
+ letter-spacing: -0.04em;
144
+ line-height: 0.95;
145
+ position: relative;
146
+ background: linear-gradient(135deg, #ffffff 0%, #f0f0f0 100%);
147
+ background-clip: text;
148
+ -webkit-background-clip: text;
149
+ -webkit-text-fill-color: transparent;
150
+ text-shadow: 0 0 30px rgba(255, 255, 255, 0.1);
151
+ }
152
+
153
+ .hero .subtitle {
154
+ font-size: 1.25rem;
155
+ color: var(--accent-red);
156
+ font-weight: 600;
157
+ margin-bottom: 1rem;
158
+ text-transform: uppercase;
159
+ letter-spacing: 0.1em;
160
+ opacity: 0.9;
161
+ }
162
+
163
+ .hero .tagline {
164
+ font-size: 1.125rem;
165
+ color: var(--text-secondary);
166
+ max-width: 600px;
167
+ margin: 2rem auto 3rem;
168
+ font-weight: 400;
169
+ line-height: 1.5;
170
+ }
171
+
172
+ .hero .quick-start {
173
+ background: var(--bg-card);
174
+ border: 2px solid var(--border-primary);
175
+ border-radius: 12px;
176
+ padding: 2rem;
177
+ max-width: 520px;
178
+ margin: 0 auto;
179
+ position: relative;
180
+ overflow: hidden;
181
+ transition: all 0.3s ease;
182
+ }
183
+
184
+ .hero .quick-start:hover {
185
+ border-color: var(--border-accent);
186
+ transform: translateY(-4px);
187
+ box-shadow: 0 12px 24px rgba(0, 0, 0, 0.3);
188
+ }
189
+
190
+ .hero .quick-start::before {
191
+ content: '';
192
+ position: absolute;
193
+ top: 0;
194
+ left: 0;
195
+ right: 0;
196
+ height: 2px;
197
+ background: linear-gradient(90deg, var(--accent-red), var(--accent-orange));
198
+ }
199
+
200
+ .hero .quick-start h3 {
201
+ color: var(--text-primary);
202
+ margin-bottom: 1rem;
203
+ font-size: 1.1rem;
204
+ font-weight: 600;
205
+ }
206
+
207
+ /* Cards */
208
+ .card {
209
+ background: var(--bg-card);
210
+ border: 2px solid var(--border-primary);
211
+ border-radius: 16px;
212
+ padding: 2.5rem;
213
+ margin-bottom: 2.5rem;
214
+ transition: all 0.3s ease;
215
+ position: relative;
216
+ }
217
+
218
+ .card:hover {
219
+ border-color: var(--border-accent);
220
+ transform: translateY(-3px);
221
+ box-shadow: 0 8px 20px rgba(0, 0, 0, 0.25);
222
+ }
223
+
224
+ .card:hover h2::after {
225
+ width: 60px;
226
+ transition: width 0.3s ease;
227
+ }
228
+
229
+ .card h2 {
230
+ font-size: 1.75rem;
231
+ font-weight: 700;
232
+ margin-bottom: 1rem;
233
+ color: var(--text-primary);
234
+ position: relative;
235
+ display: inline-block;
236
+ }
237
+
238
+ .card h2::after {
239
+ content: '';
240
+ position: absolute;
241
+ bottom: -5px;
242
+ left: 0;
243
+ width: 30px;
244
+ height: 2px;
245
+ background: var(--accent-red);
246
+ transition: width 0.3s ease;
247
+ }
248
+
249
+ .card p {
250
+ color: var(--text-secondary);
251
+ margin-bottom: 1.5rem;
252
+ font-size: 1rem;
253
+ line-height: 1.6;
254
+ }
255
+
256
+ /* Code Blocks - Simple and Reliable */
257
+ .code-wrapper {
258
+ background: var(--code-bg);
259
+ border: 1px solid var(--code-border);
260
+ border-radius: 8px;
261
+ margin: 1.5rem 0;
262
+ overflow: hidden;
263
+ }
264
+
265
+ .code-header {
266
+ display: flex;
267
+ justify-content: flex-end;
268
+ padding: 0.5rem;
269
+ background: rgba(0, 0, 0, 0.2);
270
+ border-bottom: 1px solid var(--code-border);
271
+ }
272
+
273
+ .copy-btn {
274
+ background: var(--bg-secondary);
275
+ border: 1px solid var(--border-primary);
276
+ color: var(--text-secondary);
277
+ padding: 0.4rem 0.8rem;
278
+ border-radius: 4px;
279
+ font-size: 0.75rem;
280
+ cursor: pointer;
281
+ transition: all 0.2s ease;
282
+ font-family: 'Inter', sans-serif;
283
+ font-weight: 500;
284
+ }
285
+
286
+ .copy-btn:hover {
287
+ background: var(--accent-red);
288
+ border-color: var(--accent-red);
289
+ color: white;
290
+ }
291
+
292
+ .copy-btn.copied {
293
+ background: var(--accent-green);
294
+ border-color: var(--accent-green);
295
+ color: white;
296
+ }
297
+
298
+ .code-content {
299
+ padding: 1rem;
300
+ overflow-x: auto;
301
+ font-family: 'JetBrains Mono', 'Fira Code', 'SF Mono', monospace;
302
+ font-size: 0.875rem;
303
+ line-height: 1.5;
304
+ color: #e2e8f0;
305
+ white-space: pre;
306
+ position: relative;
307
+ }
308
+
309
+ /* Custom Syntax Highlighting */
310
+ .code-content .token-string { color: #ffb366; }
311
+ .code-content .token-number { color: #ffd93d; }
312
+ .code-content .token-boolean { color: #ff8c94; }
313
+ .code-content .token-keyword { color: #c7ceea; }
314
+ .code-content .token-property { color: #88d8c0; }
315
+ .code-content .token-punctuation { color: #e2e8f0; }
316
+ .code-content .token-comment { color: #6b7280; font-style: italic; }
317
+
318
+ .code-wrapper.inline {
319
+ display: inline-block;
320
+ margin: 0.5rem 0;
321
+ min-width: 200px;
322
+ }
323
+
324
+ .code-wrapper.inline .code-content {
325
+ padding: 0.75rem;
326
+ white-space: nowrap;
327
+ }
328
+
329
+ .code-wrapper.multiline .code-content {
330
+ white-space: pre-wrap;
331
+ word-wrap: break-word;
332
+ overflow-wrap: break-word;
333
+ }
334
+
335
+ /* Installation Steps */
336
+ .steps {
337
+ display: grid;
338
+ grid-template-columns: repeat(auto-fit, minmax(300px, 1fr));
339
+ gap: 1.5rem;
340
+ margin: 3rem 0;
341
+ }
342
+
343
+ .step {
344
+ background: var(--bg-card);
345
+ border: 2px solid var(--border-primary);
346
+ border-radius: 12px;
347
+ padding: 2rem;
348
+ position: relative;
349
+ transition: all 0.3s ease;
350
+ border-left: 4px solid var(--accent-red);
351
+ }
352
+
353
+ .step:nth-child(2) {
354
+ border-left-color: var(--accent-orange);
355
+ }
356
+
357
+ .step:nth-child(3) {
358
+ border-left-color: var(--accent-green);
359
+ }
360
+
361
+ .step .step-content {
362
+ position: relative;
363
+ z-index: 1;
364
+ }
365
+
366
+ .step p {
367
+ margin-bottom: 1.5rem;
368
+ font-size: 0.95rem;
369
+ line-height: 1.5;
370
+ color: var(--text-secondary);
371
+ }
372
+
373
+ .step:hover {
374
+ border-color: var(--border-accent);
375
+ transform: translateY(-2px);
376
+ box-shadow: 0 6px 16px rgba(0, 0, 0, 0.2);
377
+ }
378
+
379
+ .step-number {
380
+ position: absolute;
381
+ top: -12px;
382
+ left: 1.5rem;
383
+ background: var(--accent-red);
384
+ color: white;
385
+ width: 24px;
386
+ height: 24px;
387
+ border-radius: 6px;
388
+ display: flex;
389
+ align-items: center;
390
+ justify-content: center;
391
+ font-size: 0.75rem;
392
+ font-weight: 700;
393
+ z-index: 2;
394
+ }
395
+
396
+ .step:nth-child(2) .step-number {
397
+ background: var(--accent-orange);
398
+ }
399
+
400
+ .step:nth-child(3) .step-number {
401
+ background: var(--accent-green);
402
+ }
403
+
404
+ .step h3 {
405
+ font-size: 1.125rem;
406
+ font-weight: 600;
407
+ margin-bottom: 1rem;
408
+ color: var(--text-primary);
409
+ }
410
+
411
+ /* Badge Example */
412
+ .badge-showcase {
413
+ background: var(--bg-card);
414
+ border: 2px solid var(--border-primary);
415
+ border-radius: 12px;
416
+ padding: 2rem;
417
+ margin: 2rem 0;
418
+ display: flex;
419
+ flex-direction: column;
420
+ align-items: center;
421
+ gap: 1.5rem;
422
+ }
423
+
424
+ .badge-preview {
425
+ display: flex;
426
+ align-items: center;
427
+ justify-content: center;
428
+ flex-wrap: wrap;
429
+ gap: 1rem;
430
+ padding: 2rem;
431
+ background: rgba(255, 255, 255, 0.02);
432
+ border-radius: 8px;
433
+ border: 1px solid var(--border-primary);
434
+ min-height: 80px;
435
+ }
436
+
437
+ .badge-example {
438
+ display: inline-flex;
439
+ align-items: center;
440
+ gap: 0.5rem;
441
+ padding: 0.5rem 1rem;
442
+ background: rgba(255, 255, 255, 0.05);
443
+ border-radius: 20px;
444
+ border: 1px solid var(--border-primary);
445
+ font-size: 0.75rem;
446
+ color: var(--text-secondary);
447
+ }
448
+
449
+ .badge-status {
450
+ width: 8px;
451
+ height: 8px;
452
+ border-radius: 50%;
453
+ }
454
+
455
+ .badge-status.success { background: var(--accent-green); }
456
+ .badge-status.building { background: var(--accent-orange); }
457
+ .badge-status.error { background: var(--accent-red); }
458
+
459
+ .badge-showcase .code-wrapper {
460
+ width: 100%;
461
+ max-width: 600px;
462
+ margin: 0;
463
+ }
464
+
465
+ /* AI Tools Section */
466
+ .ai-tools {
467
+ display: grid;
468
+ gap: 1rem;
469
+ margin-top: 1.5rem;
470
+ }
471
+
472
+ .ai-tool {
473
+ background: var(--bg-secondary);
474
+ border: 1px solid var(--border-primary);
475
+ border-radius: 12px;
476
+ overflow: hidden;
477
+ transition: all 0.3s ease;
478
+ cursor: pointer;
479
+ }
480
+
481
+ .ai-tool:hover {
482
+ border-color: var(--border-accent);
483
+ transform: translateY(-1px);
484
+ }
485
+
486
+ .ai-tool-header {
487
+ display: flex;
488
+ align-items: center;
489
+ gap: 1rem;
490
+ padding: 1.25rem;
491
+ }
492
+
493
+ .ai-tool-icon {
494
+ width: 48px;
495
+ height: 48px;
496
+ border-radius: 10px;
497
+ display: flex;
498
+ align-items: center;
499
+ justify-content: center;
500
+ font-size: 1.5rem;
501
+ font-weight: bold;
502
+ background: linear-gradient(135deg, var(--accent-red), var(--accent-orange));
503
+ color: white;
504
+ }
505
+
506
+ .ai-tool-info {
507
+ flex: 1;
508
+ }
509
+
510
+ .ai-tool-info h4 {
511
+ font-size: 1.125rem;
512
+ font-weight: 600;
513
+ color: var(--text-primary);
514
+ margin-bottom: 0.25rem;
515
+ }
516
+
517
+ .ai-tool-status {
518
+ font-size: 0.875rem;
519
+ color: var(--accent-green);
520
+ }
521
+
522
+ .ai-tool-toggle {
523
+ font-size: 1.5rem;
524
+ color: var(--text-secondary);
525
+ font-weight: 300;
526
+ transition: transform 0.3s ease;
527
+ }
528
+
529
+ .ai-tool-toggle.open {
530
+ transform: rotate(45deg);
531
+ }
532
+
533
+ .ai-tool-config {
534
+ padding: 0 1.25rem 1.25rem;
535
+ overflow: hidden;
536
+ transition: all 0.3s ease;
537
+ }
538
+
539
+ .config-path {
540
+ font-size: 0.875rem;
541
+ color: var(--text-muted);
542
+ margin-bottom: 1rem;
543
+ font-family: 'SF Mono', Monaco, monospace;
544
+ }
545
+
546
+ .ai-tool-config .code-wrapper {
547
+ margin: 0;
548
+ }
549
+
550
+ .ai-tool-config .code-content {
551
+ font-size: 0.75rem;
552
+ max-height: 200px;
553
+ overflow-y: auto;
554
+ }
555
+
556
+ /* Platform Grid */
557
+ .platforms {
558
+ display: grid;
559
+ grid-template-columns: repeat(auto-fit, minmax(220px, 1fr));
560
+ gap: 1.25rem;
561
+ margin: 2rem 0;
562
+ }
563
+
564
+ .platform {
565
+ background: var(--bg-card);
566
+ border: 2px solid var(--border-primary);
567
+ border-radius: 10px;
568
+ padding: 1.5rem;
569
+ text-align: center;
570
+ transition: all 0.3s ease;
571
+ position: relative;
572
+ }
573
+
574
+ .platform:hover {
575
+ transform: translateY(-1px);
576
+ box-shadow: 0 4px 12px rgba(0, 0, 0, 0.15);
577
+ }
578
+
579
+ .platform.supported {
580
+ border-color: var(--accent-green);
581
+ }
582
+
583
+ .platform-icon {
584
+ width: 48px;
585
+ height: 48px;
586
+ margin: 0 auto 1rem;
587
+ border-radius: 12px;
588
+ display: flex;
589
+ align-items: center;
590
+ justify-content: center;
591
+ font-size: 1.5rem;
592
+ background: linear-gradient(135deg, var(--accent-red), var(--accent-orange));
593
+ color: white;
594
+ font-weight: bold;
595
+ }
596
+
597
+ .platform.supported .platform-icon {
598
+ background: linear-gradient(135deg, var(--accent-green), #34d399);
599
+ }
600
+
601
+ .platform.coming-soon {
602
+ opacity: 0.65;
603
+ border-color: var(--text-muted);
604
+ }
605
+
606
+ .platform.coming-soon .platform-icon {
607
+ background: linear-gradient(135deg, var(--text-muted), #6b7280);
608
+ }
609
+
610
+ .platform-status {
611
+ position: absolute;
612
+ top: 0.75rem;
613
+ right: 0.75rem;
614
+ width: 8px;
615
+ height: 8px;
616
+ border-radius: 50%;
617
+ background: var(--accent-green);
618
+ }
619
+
620
+ .platform.coming-soon .platform-status {
621
+ background: var(--text-muted);
622
+ }
623
+
624
+ .platform h3 {
625
+ font-size: 1.125rem;
626
+ font-weight: 600;
627
+ margin-bottom: 0.5rem;
628
+ color: var(--text-primary);
629
+ }
630
+
631
+ .platform p {
632
+ color: var(--text-secondary);
633
+ font-size: 0.875rem;
634
+ }
635
+
636
+ /* CTA Button */
637
+ .cta-button {
638
+ background: var(--accent-primary);
639
+ border: none;
640
+ border-radius: 8px;
641
+ padding: 0.75rem 2rem;
642
+ font-size: 1rem;
643
+ font-weight: 600;
644
+ color: white;
645
+ text-decoration: none;
646
+ display: inline-block;
647
+ transition: all 0.2s ease;
648
+ box-shadow: 0 4px 15px rgba(102, 126, 234, 0.3);
649
+ }
650
+
651
+ .cta-button:hover {
652
+ transform: translateY(-2px);
653
+ box-shadow: 0 8px 25px rgba(102, 126, 234, 0.4);
654
+ }
655
+
656
+ /* Simple Footer */
657
+ .footer {
658
+ border-top: 1px solid var(--border-primary);
659
+ margin-top: 4rem;
660
+ padding: 2rem 0;
661
+ }
662
+
663
+ .footer-content {
664
+ text-align: center;
665
+ }
666
+
667
+ .footer-links {
668
+ display: flex;
669
+ justify-content: center;
670
+ gap: 2rem;
671
+ margin-bottom: 1rem;
672
+ flex-wrap: wrap;
673
+ }
674
+
675
+ .footer-links a {
676
+ color: var(--text-secondary);
677
+ text-decoration: none;
678
+ font-size: 0.9rem;
679
+ transition: color 0.2s ease;
680
+ }
681
+
682
+ .footer-links a:hover {
683
+ color: var(--accent-red);
684
+ }
685
+
686
+ .footer-content p {
687
+ color: var(--text-muted);
688
+ font-size: 0.875rem;
689
+ }
690
+
691
+ /* Responsive */
692
+ @media (max-width: 768px) {
693
+ .container {
694
+ padding: 1rem;
695
+ }
696
+
697
+ .hero {
698
+ padding: 4rem 0 2rem;
699
+ }
700
+
701
+ .hero-links {
702
+ position: fixed;
703
+ top: 1rem;
704
+ right: 1rem;
705
+ gap: 0.5rem;
706
+ }
707
+
708
+ .hero-link {
709
+ padding: 0.5rem 0.7rem;
710
+ font-size: 0.75rem;
711
+ }
712
+
713
+ .hero h1 {
714
+ font-size: 2.5rem;
715
+ }
716
+
717
+ .hero .tagline {
718
+ font-size: 1.1rem;
719
+ padding: 0 1rem;
720
+ }
721
+
722
+ .card, .step {
723
+ padding: 1.5rem;
724
+ }
725
+
726
+ .steps {
727
+ grid-template-columns: 1fr;
728
+ gap: 1rem;
729
+ }
730
+
731
+ .platforms {
732
+ grid-template-columns: 1fr;
733
+ }
734
+
735
+ .code-wrapper.inline {
736
+ width: 100%;
737
+ max-width: 100%;
738
+ }
739
+
740
+ .code-content {
741
+ font-size: 0.75rem;
742
+ padding: 0.75rem;
743
+ }
744
+
745
+ .code-wrapper.inline .code-content {
746
+ padding: 0.5rem;
747
+ }
748
+
749
+ .copy-btn {
750
+ padding: 0.3rem 0.6rem;
751
+ font-size: 0.7rem;
752
+ }
753
+
754
+ .step {
755
+ height: auto;
756
+ }
757
+
758
+ .steps {
759
+ grid-template-columns: 1fr;
760
+ align-items: stretch;
761
+ }
762
+ }
763
+
764
+ @media (max-width: 480px) {
765
+ .hero h1 {
766
+ font-size: 2rem;
767
+ }
768
+
769
+ .hero .tagline {
770
+ font-size: 1rem;
771
+ }
772
+
773
+ .card h2 {
774
+ font-size: 1.5rem;
775
+ }
776
+
777
+ .step h3 {
778
+ font-size: 1.1rem;
779
+ }
780
+ }
781
+
782
+ /* Simple fade-in animation */
783
+ @keyframes fadeIn {
784
+ from { opacity: 0; }
785
+ to { opacity: 1; }
786
+ }
787
+
788
+ .hero, .card, .step {
789
+ animation: fadeIn 0.6s ease;
790
+ }
791
+ </style>
792
+ </head>
793
+ <body>
794
+ <div class="container">
795
+ <!-- Hero Section -->
796
+ <section class="hero">
797
+ <div class="hero-links">
798
+ <a href="https://github.com/alexpota/deploy-mcp" target="_blank" class="hero-link">
799
+ <svg width="20" height="20" viewBox="0 0 24 24" fill="currentColor">
800
+ <path d="M12 0c-6.626 0-12 5.373-12 12 0 5.302 3.438 9.8 8.207 11.387.599.111.793-.261.793-.577v-2.234c-3.338.726-4.033-1.416-4.033-1.416-.546-1.387-1.333-1.756-1.333-1.756-1.089-.745.083-.729.083-.729 1.205.084 1.839 1.237 1.839 1.237 1.07 1.834 2.807 1.304 3.492.997.107-.775.418-1.305.762-1.604-2.665-.305-5.467-1.334-5.467-5.931 0-1.311.469-2.381 1.236-3.221-.124-.303-.535-1.524.117-3.176 0 0 1.008-.322 3.301 1.23.957-.266 1.983-.399 3.003-.404 1.02.005 2.047.138 3.006.404 2.291-1.552 3.297-1.23 3.297-1.23.653 1.653.242 2.874.118 3.176.77.84 1.235 1.911 1.235 3.221 0 4.609-2.807 5.624-5.479 5.921.43.372.823 1.102.823 2.222v3.293c0 .319.192.694.801.576 4.765-1.589 8.199-6.086 8.199-11.386 0-6.627-5.373-12-12-12z"/>
801
+ </svg>
802
+ GitHub
803
+ </a>
804
+ <a href="https://www.npmjs.com/package/deploy-mcp" target="_blank" class="hero-link">
805
+ <svg width="20" height="20" viewBox="0 0 24 24" fill="currentColor">
806
+ <path d="M1.763 0C.786 0 0 .786 0 1.763v20.474C0 23.214.786 24 1.763 24h20.474c.977 0 1.763-.786 1.763-1.763V1.763C24 .786 23.214 0 22.237 0H1.763zM5.13 5.323l13.837.019-.009 13.836h-3.464l.01-10.382h-3.456L12.04 19.17H5.113z"/>
807
+ </svg>
808
+ NPM
809
+ </a>
810
+ </div>
811
+ <div class="subtitle">Universal Deployment Tracker</div>
812
+ <h1>deploy-mcp</h1>
813
+ <p class="tagline">Track deployments across all platforms directly in your AI assistant. Never context-switch to check deployment status again.</p>
814
+
815
+ <div class="quick-start">
816
+ <h3>Get Started in Seconds</h3>
817
+ <div class="code-wrapper inline">
818
+ <div class="code-header">
819
+ <button class="copy-btn" onclick="copyToClipboard('npx deploy-mcp', event)">Copy</button>
820
+ </div>
821
+ <div class="code-content">npx deploy-mcp</div>
822
+ </div>
823
+ </div>
824
+ </section>
825
+
826
+ <!-- Installation Steps -->
827
+ <div class="steps">
828
+ <div class="step">
829
+ <div class="step-number">1</div>
830
+ <div class="step-content">
831
+ <h3>Install & Run</h3>
832
+ <p>Get started instantly with npx - no installation required.</p>
833
+ <div class="code-wrapper inline">
834
+ <div class="code-header">
835
+ <button class="copy-btn" onclick="copyToClipboard('npx deploy-mcp', event)">Copy</button>
836
+ </div>
837
+ <div class="code-content">npx deploy-mcp</div>
838
+ </div>
839
+ </div>
840
+ </div>
841
+
842
+ <div class="step">
843
+ <div class="step-number">2</div>
844
+ <div class="step-content">
845
+ <h3>Configure Claude</h3>
846
+ <p>Add to your Claude Desktop configuration file.</p>
847
+ <div class="code-wrapper multiline">
848
+ <div class="code-header">
849
+ <button class="copy-btn" onclick="copyClaudeConfig(event)">Copy</button>
850
+ </div>
851
+ <div class="code-content">{
852
+ <span class="token-property">"mcpServers"</span>: {
853
+ <span class="token-property">"deploy-mcp"</span>: {
854
+ <span class="token-property">"command"</span>: <span class="token-string">"npx"</span>,
855
+ <span class="token-property">"args"</span>: [<span class="token-string">"-y"</span>, <span class="token-string">"deploy-mcp"</span>],
856
+ <span class="token-property">"env"</span>: {
857
+ <span class="token-property">"VERCEL_TOKEN"</span>: <span class="token-string">"your-token"</span>
858
+ }
859
+ }
860
+ }
861
+ }</div>
862
+ </div>
863
+ </div>
864
+ </div>
865
+
866
+ <div class="step">
867
+ <div class="step-number">3</div>
868
+ <div class="step-content">
869
+ <h3>Start Tracking</h3>
870
+ <p>Ask Claude about your deployments directly in conversation.</p>
871
+ <div class="code-wrapper inline">
872
+ <div class="code-header">
873
+ <button class="copy-btn" onclick="copyToClipboard('Check my latest Vercel deployment', event)">Copy</button>
874
+ </div>
875
+ <div class="code-content">"Check my latest Vercel deployment"</div>
876
+ </div>
877
+ <div style="margin-top: 1rem; padding: 1rem; background: rgba(255, 255, 255, 0.03); border-radius: 8px; border: 1px solid rgba(255, 255, 255, 0.1);">
878
+ <p style="font-size: 0.85rem; color: var(--text-secondary); margin-bottom: 0.5rem;">Claude responds:</p>
879
+ <div style="font-family: 'SF Mono', Monaco, monospace; font-size: 0.875rem; line-height: 1.5; color: #e2e8f0;">
880
+ \u2705 <strong>Status</strong>: Success<br>
881
+ \u{1F310} <strong>Live URL</strong>: https://my-app.vercel.app<br>
882
+ \u23F1\uFE0F <strong>Deployment Time</strong>: 45 seconds<br>
883
+ \u{1F4C5} <strong>Last Deployed</strong>: 2 minutes ago<br>
884
+ \u{1F504} <strong>Commit</strong>: "Update homepage hero section"
885
+ </div>
886
+ </div>
887
+ </div>
888
+ </div>
889
+ </div>
890
+
891
+
892
+ <!-- Live Status Badges -->
893
+ <div class="card">
894
+ <h2>Live Status Badges</h2>
895
+ <p>Embed deployment status in your README with beautiful, real-time badges.</p>
896
+
897
+ <div class="badge-showcase">
898
+ <div class="badge-preview">
899
+ <div class="badge-example">
900
+ <div class="badge-status success"></div>
901
+ <span>deploy: success</span>
902
+ </div>
903
+ <div class="badge-example">
904
+ <div class="badge-status building"></div>
905
+ <span>deploy: building</span>
906
+ </div>
907
+ <div class="badge-example">
908
+ <div class="badge-status error"></div>
909
+ <span>deploy: failed</span>
910
+ </div>
911
+ </div>
912
+ <div class="code-wrapper multiline">
913
+ <div class="code-header">
914
+ <button class="copy-btn" onclick="copyToClipboard('[![Deploy Status](https://deploy-mcp.io/badge/vercel/your-project)](https://deploy-mcp.io)', event)">Copy</button>
915
+ </div>
916
+ <div class="code-content">[![Deploy Status](https://deploy-mcp.io/badge/vercel/your-project)](https://deploy-mcp.io)</div>
917
+ </div>
918
+ </div>
919
+ <div style="text-align: center; margin-top: 1.5rem;">
920
+ <p style="color: var(--accent-orange); font-size: 1rem; font-weight: 600;">\u{1F680} Coming Soon</p>
921
+ </div>
922
+ </div>
923
+
924
+ <!-- Supported Platforms -->
925
+ <div class="card">
926
+ <h2>Supported Platforms</h2>
927
+ <p>Universal support for all major deployment platforms, with more coming soon.</p>
928
+
929
+ <div class="platforms">
930
+ <div class="platform supported">
931
+ <div class="platform-status"></div>
932
+ <div class="platform-icon">V</div>
933
+ <h3>Vercel</h3>
934
+ <p>Full deployment tracking with real-time status updates</p>
935
+ </div>
936
+ <div class="platform coming-soon">
937
+ <div class="platform-status"></div>
938
+ <div class="platform-icon">N</div>
939
+ <h3>Netlify</h3>
940
+ <p>Coming in next release</p>
941
+ </div>
942
+ <div class="platform coming-soon">
943
+ <div class="platform-status"></div>
944
+ <div class="platform-icon">R</div>
945
+ <h3>Railway</h3>
946
+ <p>On the roadmap</p>
947
+ </div>
948
+ <div class="platform coming-soon">
949
+ <div class="platform-status"></div>
950
+ <div class="platform-icon">R</div>
951
+ <h3>Render</h3>
952
+ <p>On the roadmap</p>
953
+ </div>
954
+ </div>
955
+ </div>
956
+
957
+ <!-- Works with Your AI Tools -->
958
+ <div class="card">
959
+ <h2>Works with Your AI Tools</h2>
960
+ <p>Compatible with all major AI assistants that support Model Context Protocol.</p>
961
+
962
+ <div class="ai-tools">
963
+ <div class="ai-tool" onclick="toggleConfig('claude')">
964
+ <div class="ai-tool-header">
965
+ <div class="ai-tool-icon" style="background: linear-gradient(135deg, #2a2a3a, #1a1a24);">
966
+ <img src="https://claude.ai/favicon.ico" alt="Claude" style="width: 28px; height: 28px;">
967
+ </div>
968
+ <div class="ai-tool-info">
969
+ <h4>Claude Desktop</h4>
970
+ <span class="ai-tool-status">\u2713 Official Support</span>
971
+ </div>
972
+ <div class="ai-tool-toggle" id="claude-toggle">+</div>
973
+ </div>
974
+ <div class="ai-tool-config" id="claude-config" style="display: none;">
975
+ <p class="config-path">Config: ~/Library/Application Support/Claude/claude_desktop_config.json</p>
976
+ <p style="font-size: 0.875rem; color: var(--text-secondary); margin: 0.5rem 0;">Use the configuration below \u2193</p>
977
+ </div>
978
+ </div>
979
+
980
+ <div class="ai-tool" onclick="toggleConfig('cursor')">
981
+ <div class="ai-tool-header">
982
+ <div class="ai-tool-icon" style="background: linear-gradient(135deg, #2a2a3a, #1a1a24);">
983
+ <img src="https://www.cursor.com/favicon.ico" alt="Cursor" style="width: 28px; height: 28px;">
984
+ </div>
985
+ <div class="ai-tool-info">
986
+ <h4>Cursor AI</h4>
987
+ <span class="ai-tool-status">\u2713 One-click Install</span>
988
+ </div>
989
+ <div class="ai-tool-toggle" id="cursor-toggle">+</div>
990
+ </div>
991
+ <div class="ai-tool-config" id="cursor-config" style="display: none;">
992
+ <p class="config-path">Settings \u2192 MCP or ~/.cursor/mcp.json</p>
993
+ <p style="font-size: 0.875rem; color: var(--text-secondary); margin: 0.5rem 0;">Use the configuration below \u2193</p>
994
+ </div>
995
+ </div>
996
+
997
+ <div class="ai-tool" onclick="toggleConfig('windsurf')">
998
+ <div class="ai-tool-header">
999
+ <div class="ai-tool-icon" style="background: linear-gradient(135deg, #2a2a3a, #1a1a24);">
1000
+ <img src="https://codeium.com/favicon.ico" alt="Windsurf" style="width: 28px; height: 28px;">
1001
+ </div>
1002
+ <div class="ai-tool-info">
1003
+ <h4>Windsurf IDE</h4>
1004
+ <span class="ai-tool-status">\u2713 Native Support</span>
1005
+ </div>
1006
+ <div class="ai-tool-toggle" id="windsurf-toggle">+</div>
1007
+ </div>
1008
+ <div class="ai-tool-config" id="windsurf-config" style="display: none;">
1009
+ <p class="config-path">Settings \u2192 Advanced \u2192 Cascade or ~/.codeium/windsurf/mcp_config.json</p>
1010
+ <p style="font-size: 0.875rem; color: var(--text-secondary); margin: 0.5rem 0;">Use the configuration below \u2193</p>
1011
+ </div>
1012
+ </div>
1013
+
1014
+ <div class="ai-tool" onclick="toggleConfig('vscode')">
1015
+ <div class="ai-tool-header">
1016
+ <div class="ai-tool-icon" style="background: linear-gradient(135deg, #2a2a3a, #1a1a24);">
1017
+ <img src="https://code.visualstudio.com/assets/favicon.ico" alt="VS Code" style="width: 28px; height: 28px;">
1018
+ </div>
1019
+ <div class="ai-tool-info">
1020
+ <h4>VS Code</h4>
1021
+ <span class="ai-tool-status">\u2713 GitHub Copilot</span>
1022
+ </div>
1023
+ <div class="ai-tool-toggle" id="vscode-toggle">+</div>
1024
+ </div>
1025
+ <div class="ai-tool-config" id="vscode-config" style="display: none;">
1026
+ <p class="config-path">Workspace .vscode/mcp.json or global ~/.vscode/mcp.json</p>
1027
+ <p style="font-size: 0.875rem; color: var(--text-secondary); margin: 0.5rem 0;">Requires GitHub Copilot subscription. Use the shared configuration below \u2193</p>
1028
+ </div>
1029
+ </div>
1030
+
1031
+ <div style="margin-top: 1.5rem; padding: 1rem; background: rgba(255, 255, 255, 0.02); border-radius: 8px; border-left: 3px solid var(--accent-blue); text-align: center;">
1032
+ <p style="color: var(--text-secondary); font-size: 0.9rem; margin: 0;">
1033
+ <strong style="color: var(--accent-blue);">+ Any MCP-compatible tool</strong><br>
1034
+ Works with all AI assistants that support <a href="https://modelcontextprotocol.io" target="_blank" style="color: var(--accent-blue); text-decoration: none;">Model Context Protocol</a>
1035
+ </p>
1036
+ </div>
1037
+ </div>
1038
+
1039
+ <!-- Shared Configuration -->
1040
+ <div class="shared-config-section" style="margin-top: 2rem; padding: 2rem; background: var(--bg-secondary); border: 2px solid var(--border-primary); border-radius: 16px;">
1041
+ <h3 style="color: var(--text-primary); font-size: 1.25rem; font-weight: 600; margin-bottom: 1rem; text-align: center;">MCP Configuration</h3>
1042
+ <p style="color: var(--text-secondary); text-align: center; margin-bottom: 1.5rem; font-size: 0.95rem;">All AI tools use the same configuration. Copy this JSON and paste it into your tool's MCP settings:</p>
1043
+ <div class="code-wrapper multiline">
1044
+ <div class="code-header">
1045
+ <button class="copy-btn" onclick="copyToClipboard(JSON.stringify({mcpServers:{'deploy-mcp':{command:'npx',args:['-y','deploy-mcp'],env:{VERCEL_TOKEN:'your-vercel-token'}}}},null,2), event)">Copy Configuration</button>
1046
+ </div>
1047
+ <div class="code-content">{
1048
+ <span class="token-property">"mcpServers"</span>: {
1049
+ <span class="token-property">"deploy-mcp"</span>: {
1050
+ <span class="token-property">"command"</span>: <span class="token-string">"npx"</span>,
1051
+ <span class="token-property">"args"</span>: [<span class="token-string">"-y"</span>, <span class="token-string">"deploy-mcp"</span>],
1052
+ <span class="token-property">"env"</span>: {
1053
+ <span class="token-property">"VERCEL_TOKEN"</span>: <span class="token-string">"your-vercel-token"</span>
1054
+ }
1055
+ }
1056
+ }
1057
+ }</div>
1058
+ </div>
1059
+ <p style="color: var(--text-muted); font-size: 0.875rem; text-align: center; margin-top: 1rem;">\u{1F4A1} Replace <code style="background: rgba(255,255,255,0.1); padding: 0.2rem 0.4rem; border-radius: 4px;">your-vercel-token</code> with your actual Vercel API token from <a href="https://vercel.com/account/tokens" target="_blank" style="color: var(--accent-red); text-decoration: none;">vercel.com/account/tokens</a></p>
1060
+ </div>
1061
+ </div>
1062
+
1063
+ <!-- Why Choose deploy-mcp -->
1064
+ <div class="card">
1065
+ <h2>Why deploy-mcp?</h2>
1066
+ <div class="steps">
1067
+ <div class="step">
1068
+ <h3>Zero Context Switching</h3>
1069
+ <p>Check deployment status without leaving your AI conversation. No more alt-tabbing to dashboards.</p>
1070
+ </div>
1071
+ <div class="step">
1072
+ <h3>Secure & Private</h3>
1073
+ <p>Your API tokens stay local. Never sent to third parties or logged anywhere.</p>
1074
+ </div>
1075
+ <div class="step">
1076
+ <h3>Lightning Fast</h3>
1077
+ <p>Get deployment status in under 2 seconds. Optimized for developer productivity.</p>
1078
+ </div>
1079
+ </div>
1080
+ </div>
1081
+
1082
+ <!-- Simple Footer -->
1083
+ <footer class="footer">
1084
+ <div class="container">
1085
+ <div class="footer-content">
1086
+ <div class="footer-links">
1087
+ <a href="https://github.com/alexpota/deploy-mcp" target="_blank">GitHub</a>
1088
+ <a href="https://github.com/alexpota/deploy-mcp/issues" target="_blank">Issues</a>
1089
+ <a href="https://www.npmjs.com/package/deploy-mcp" target="_blank">NPM</a>
1090
+ <a href="https://github.com/alexpota/deploy-mcp/blob/main/README.md" target="_blank">Docs</a>
1091
+ </div>
1092
+ <p>&copy; 2025 deploy-mcp. Open source under Apache 2.0 license.</p>
1093
+ </div>
1094
+ </div>
1095
+ </footer>
1096
+ </div>
1097
+
1098
+ <script>
1099
+ function copyToClipboard(text, event) {
1100
+ const btn = event.target;
1101
+ navigator.clipboard.writeText(text).then(() => {
1102
+ const originalText = btn.textContent;
1103
+ btn.classList.add('copied');
1104
+ btn.textContent = 'Copied!';
1105
+ setTimeout(() => {
1106
+ btn.classList.remove('copied');
1107
+ btn.textContent = originalText;
1108
+ }, 2000);
1109
+ }).catch(err => {
1110
+ console.error('Failed to copy: ', err);
1111
+ btn.textContent = 'Failed';
1112
+ setTimeout(() => {
1113
+ btn.textContent = 'Copy';
1114
+ }, 2000);
1115
+ });
1116
+ }
1117
+
1118
+
1119
+ function copyClaudeConfig(event) {
1120
+ const config = '{"mcpServers":{"deploy-mcp":{"command":"npx","args":["-y","deploy-mcp"],"env":{"VERCEL_TOKEN":"your-vercel-token"}}}}';
1121
+ copyToClipboard(config, event);
1122
+ }
1123
+
1124
+ function toggleConfig(tool) {
1125
+ const config = document.getElementById(tool + '-config');
1126
+ const toggle = document.getElementById(tool + '-toggle');
1127
+
1128
+ if (config.style.display === 'none') {
1129
+ config.style.display = 'block';
1130
+ toggle.classList.add('open');
1131
+ toggle.textContent = '\xD7';
1132
+ } else {
1133
+ config.style.display = 'none';
1134
+ toggle.classList.remove('open');
1135
+ toggle.textContent = '+';
1136
+ }
1137
+
1138
+ // Prevent event bubbling
1139
+ event.stopPropagation();
1140
+ }
1141
+
1142
+ // Add smooth scrolling for any anchor links
1143
+ document.querySelectorAll('a[href^="#"]').forEach(anchor => {
1144
+ anchor.addEventListener('click', function (e) {
1145
+ e.preventDefault();
1146
+ document.querySelector(this.getAttribute('href')).scrollIntoView({
1147
+ behavior: 'smooth'
1148
+ });
1149
+ });
1150
+ });
1151
+
1152
+ </script>
1153
+ </body>
1154
+ </html>`;
1155
+
1156
+ // src/worker.ts
1157
+ function getAdapters(_env) {
1158
+ const adapters = /* @__PURE__ */ new Map();
1159
+ const vercelAdapter = new VercelAdapter();
1160
+ adapters.set("vercel", vercelAdapter);
1161
+ return adapters;
1162
+ }
1163
+ var worker_default = {
1164
+ async fetch(request, env) {
1165
+ const url = new URL(request.url);
1166
+ if (request.method === "POST" && url.pathname === "/mcp") {
1167
+ try {
1168
+ const handler = new MCPHandler(getAdapters(env));
1169
+ const body = await request.json();
1170
+ const response = await handler.handleRequest(body);
1171
+ return new Response(JSON.stringify(response), {
1172
+ headers: {
1173
+ "Content-Type": "application/json",
1174
+ "Access-Control-Allow-Origin": "*"
1175
+ }
1176
+ });
1177
+ } catch (error) {
1178
+ return new Response(
1179
+ JSON.stringify({
1180
+ error: error instanceof Error ? error.message : "Unknown error"
1181
+ }),
1182
+ {
1183
+ status: 500,
1184
+ headers: {
1185
+ "Content-Type": "application/json",
1186
+ "Access-Control-Allow-Origin": "*"
1187
+ }
1188
+ }
1189
+ );
1190
+ }
1191
+ }
1192
+ if (request.method === "OPTIONS") {
1193
+ return new Response(null, {
1194
+ headers: {
1195
+ "Access-Control-Allow-Origin": "*",
1196
+ "Access-Control-Allow-Methods": "GET, POST, OPTIONS",
1197
+ "Access-Control-Allow-Headers": "Content-Type"
1198
+ }
1199
+ });
1200
+ }
1201
+ return new Response(landingPageHTML, {
1202
+ headers: {
1203
+ "Content-Type": "text/html; charset=utf-8",
1204
+ "Cache-Control": "public, max-age=3600"
1205
+ // Cache for 1 hour
1206
+ }
1207
+ });
1208
+ }
1209
+ };
1210
+ export {
1211
+ worker_default as default
1212
+ };