@cyanheads/mcp-ts-core 0.9.0 → 0.9.2
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/CLAUDE.md +2 -1
- package/README.md +6 -2
- package/changelog/0.9.x/0.9.1.md +41 -0
- package/changelog/0.9.x/0.9.2.md +55 -0
- package/dist/cli/init.js +1 -1
- package/dist/cli/init.js.map +1 -1
- package/dist/core/app.d.ts.map +1 -1
- package/dist/core/app.js +3 -0
- package/dist/core/app.js.map +1 -1
- package/dist/core/context.d.ts +6 -0
- package/dist/core/context.d.ts.map +1 -1
- package/dist/core/context.js +2 -0
- package/dist/core/context.js.map +1 -1
- package/dist/core/serverManifest.d.ts +8 -2
- package/dist/core/serverManifest.d.ts.map +1 -1
- package/dist/core/serverManifest.js +16 -2
- package/dist/core/serverManifest.js.map +1 -1
- package/dist/linter/rules/format-parity-rules.d.ts.map +1 -1
- package/dist/linter/rules/format-parity-rules.js +134 -106
- package/dist/linter/rules/format-parity-rules.js.map +1 -1
- package/dist/logs/combined.log +7 -7
- package/dist/logs/error.log +5 -5
- package/dist/mcp-server/resources/resource-registration.d.ts.map +1 -1
- package/dist/mcp-server/resources/resource-registration.js +2 -0
- package/dist/mcp-server/resources/resource-registration.js.map +1 -1
- package/dist/mcp-server/resources/utils/resourceHandlerFactory.d.ts +2 -0
- package/dist/mcp-server/resources/utils/resourceHandlerFactory.d.ts.map +1 -1
- package/dist/mcp-server/resources/utils/resourceHandlerFactory.js +2 -0
- package/dist/mcp-server/resources/utils/resourceHandlerFactory.js.map +1 -1
- package/dist/mcp-server/server.d.ts +7 -0
- package/dist/mcp-server/server.d.ts.map +1 -1
- package/dist/mcp-server/server.js +11 -7
- package/dist/mcp-server/server.js.map +1 -1
- package/dist/mcp-server/tools/tool-registration.d.ts.map +1 -1
- package/dist/mcp-server/tools/tool-registration.js +4 -0
- package/dist/mcp-server/tools/tool-registration.js.map +1 -1
- package/dist/mcp-server/tools/utils/toolHandlerFactory.d.ts +2 -0
- package/dist/mcp-server/tools/utils/toolHandlerFactory.d.ts.map +1 -1
- package/dist/mcp-server/tools/utils/toolHandlerFactory.js +2 -0
- package/dist/mcp-server/tools/utils/toolHandlerFactory.js.map +1 -1
- package/dist/mcp-server/transports/http/httpTransport.d.ts.map +1 -1
- package/dist/mcp-server/transports/http/httpTransport.js +9 -0
- package/dist/mcp-server/transports/http/httpTransport.js.map +1 -1
- package/dist/mcp-server/transports/http/landing-page/assets/styles.d.ts.map +1 -1
- package/dist/mcp-server/transports/http/landing-page/assets/styles.js +90 -72
- package/dist/mcp-server/transports/http/landing-page/assets/styles.js.map +1 -1
- package/dist/mcp-server/transports/http/landing-page/sections/connect.d.ts +6 -4
- package/dist/mcp-server/transports/http/landing-page/sections/connect.d.ts.map +1 -1
- package/dist/mcp-server/transports/http/landing-page/sections/connect.js +76 -19
- package/dist/mcp-server/transports/http/landing-page/sections/connect.js.map +1 -1
- package/dist/mcp-server/transports/http/landing-page/sections/head.d.ts +2 -1
- package/dist/mcp-server/transports/http/landing-page/sections/head.d.ts.map +1 -1
- package/dist/mcp-server/transports/http/landing-page/sections/head.js +20 -2
- package/dist/mcp-server/transports/http/landing-page/sections/head.js.map +1 -1
- package/dist/mcp-server/transports/http/landing-page/sections/prompts.js +1 -1
- package/dist/mcp-server/transports/http/landing-page/sections/prompts.js.map +1 -1
- package/dist/mcp-server/transports/http/landing-page/sections/resources.js +1 -1
- package/dist/mcp-server/transports/http/landing-page/sections/resources.js.map +1 -1
- package/dist/mcp-server/transports/http/landing-page/sections/tools.js +23 -16
- package/dist/mcp-server/transports/http/landing-page/sections/tools.js.map +1 -1
- package/dist/mcp-server/transports/http/robotsTxt.d.ts +24 -0
- package/dist/mcp-server/transports/http/robotsTxt.d.ts.map +1 -0
- package/dist/mcp-server/transports/http/robotsTxt.js +39 -0
- package/dist/mcp-server/transports/http/robotsTxt.js.map +1 -0
- package/dist/testing/fuzz.js +1 -1
- package/dist/testing/fuzz.js.map +1 -1
- package/dist/testing/index.d.ts +4 -0
- package/dist/testing/index.d.ts.map +1 -1
- package/dist/testing/index.js +2 -0
- package/dist/testing/index.js.map +1 -1
- package/dist/utils/telemetry/instrumentation.d.ts.map +1 -1
- package/dist/utils/telemetry/instrumentation.js +5 -6
- package/dist/utils/telemetry/instrumentation.js.map +1 -1
- package/package.json +40 -35
- package/scripts/devcheck.ts +35 -4
- package/scripts/lint-packaging.ts +116 -0
- package/scripts/list-skills.ts +170 -0
- package/skills/api-workers/SKILL.md +15 -1
- package/skills/field-test/SKILL.md +96 -90
- package/skills/maintenance/SKILL.md +3 -1
- package/skills/multi-server-orchestration/SKILL.md +123 -0
- package/skills/multi-server-orchestration/references/greenfield-buildout.md +215 -0
- package/skills/multi-server-orchestration/references/maintenance-pass.md +119 -0
- package/skills/multi-server-orchestration/references/release-pass.md +189 -0
- package/skills/polish-docs-meta/SKILL.md +1 -1
- package/skills/polish-docs-meta/references/package-meta.md +1 -1
- package/skills/polish-docs-meta/references/readme.md +10 -7
- package/skills/polish-docs-meta/references/server-json.md +2 -2
- package/skills/release-and-publish/SKILL.md +38 -7
- package/skills/setup/SKILL.md +1 -1
- package/templates/AGENTS.md +37 -0
- package/templates/CLAUDE.md +37 -0
- package/templates/_.mcpbignore +13 -0
- package/templates/manifest.json +26 -0
- package/templates/package.json +6 -1
|
@@ -131,16 +131,18 @@ body::before {
|
|
|
131
131
|
pointer-events: none;
|
|
132
132
|
}
|
|
133
133
|
|
|
134
|
-
/* Ambient background —
|
|
134
|
+
/* Ambient background — single soft accent wash at top + fine dot grid.
|
|
135
|
+
Previously dual radials; the second one read as decoration without earning
|
|
136
|
+
its weight. One directional glow + the grid is enough to anchor the page
|
|
137
|
+
without competing with content. */
|
|
135
138
|
body::after {
|
|
136
139
|
content: "";
|
|
137
140
|
position: fixed;
|
|
138
141
|
inset: 0;
|
|
139
142
|
background-image:
|
|
140
|
-
radial-gradient(ellipse
|
|
141
|
-
radial-gradient(ellipse 55% 45% at 92% 10%, color-mix(in oklab, var(--accent-2), transparent calc((1 - var(--glow-strength)) * 115%)), transparent 55%),
|
|
143
|
+
radial-gradient(ellipse 80% 50% at 20% -8%, color-mix(in oklab, var(--accent), transparent calc((1 - var(--glow-strength)) * 100%)), transparent 60%),
|
|
142
144
|
radial-gradient(circle at center, var(--grid-dot) 1px, transparent 1.5px);
|
|
143
|
-
background-size: 100% 100%,
|
|
145
|
+
background-size: 100% 100%, 24px 24px;
|
|
144
146
|
pointer-events: none;
|
|
145
147
|
z-index: -1;
|
|
146
148
|
}
|
|
@@ -253,7 +255,12 @@ pre code { background: transparent; padding: 0; border: 0; font-size: inherit; }
|
|
|
253
255
|
letter-spacing: -0.04em;
|
|
254
256
|
line-height: 1.02;
|
|
255
257
|
color: var(--fg);
|
|
258
|
+
/* overflow-wrap: anywhere lets long scoped package names break at any
|
|
259
|
+
character if needed (e.g. @cyanheads/pubmed-mcp-server) rather than
|
|
260
|
+
forcing the title to wrap mid-row and shove the version badge to its
|
|
261
|
+
own line. word-break: break-word kept as a fallback. */
|
|
256
262
|
word-break: break-word;
|
|
263
|
+
overflow-wrap: anywhere;
|
|
257
264
|
flex: 1 1 auto;
|
|
258
265
|
min-width: 0;
|
|
259
266
|
}
|
|
@@ -504,14 +511,28 @@ pre code { background: transparent; padding: 0; border: 0; font-size: inherit; }
|
|
|
504
511
|
white-space: nowrap;
|
|
505
512
|
transition: color var(--duration-fast) var(--ease-out),
|
|
506
513
|
border-color var(--duration-fast) var(--ease-out),
|
|
507
|
-
background var(--duration-fast) var(--ease-out)
|
|
514
|
+
background var(--duration-fast) var(--ease-out),
|
|
515
|
+
box-shadow var(--duration-fast) var(--ease-out);
|
|
508
516
|
}
|
|
509
517
|
.connect-tab-label:hover { color: var(--fg); }
|
|
518
|
+
/*
|
|
519
|
+
* Active tab — brighter text (var(--fg) is the max contrast token in both
|
|
520
|
+
* modes), accent gradient fill, plus a "thin glow outline" that adapts to
|
|
521
|
+
* light/dark via color-mix against --fg. Both shadow layers are inset
|
|
522
|
+
* because the tab strip clips overflow on both axes (overflow-x: auto
|
|
523
|
+
* forces overflow-y to auto), so an outer glow would be cut off:
|
|
524
|
+
* inset 0 0 0 1px -> the sharp rectangular ring at the label edge
|
|
525
|
+
* inset 0 0 14px -> the soft halo bleeding inward from that edge
|
|
526
|
+
* Kept rectangular (no border-radius) so the outline traces the label edge.
|
|
527
|
+
*/
|
|
510
528
|
.connect-tab-input:checked + .connect-tab-label {
|
|
511
529
|
color: var(--fg);
|
|
512
|
-
font-weight:
|
|
530
|
+
font-weight: 700;
|
|
513
531
|
border-bottom-color: var(--accent);
|
|
514
|
-
background: linear-gradient(to top, var(--accent-
|
|
532
|
+
background: linear-gradient(to top, var(--accent-soft), var(--accent-softer) 55%, transparent 100%);
|
|
533
|
+
box-shadow:
|
|
534
|
+
inset 0 0 0 1px color-mix(in oklab, var(--fg), transparent 25%),
|
|
535
|
+
inset 0 0 14px color-mix(in oklab, var(--fg), transparent 70%);
|
|
515
536
|
}
|
|
516
537
|
.connect-tab-input:focus-visible + .connect-tab-label {
|
|
517
538
|
outline: 2px solid var(--accent);
|
|
@@ -521,9 +542,12 @@ pre code { background: transparent; padding: 0; border: 0; font-size: inherit; }
|
|
|
521
542
|
|
|
522
543
|
.connect-panels { position: relative; padding: var(--space-5) var(--space-4); }
|
|
523
544
|
.connect-panel { display: none; }
|
|
545
|
+
.connect:has(#connect-tab-claude:checked) .panel-claude,
|
|
546
|
+
.connect:has(#connect-tab-codex:checked) .panel-codex,
|
|
547
|
+
.connect:has(#connect-tab-cursor:checked) .panel-cursor,
|
|
548
|
+
.connect:has(#connect-tab-gemini:checked) .panel-gemini,
|
|
524
549
|
.connect:has(#connect-tab-stdio:checked) .panel-stdio,
|
|
525
550
|
.connect:has(#connect-tab-http:checked) .panel-http,
|
|
526
|
-
.connect:has(#connect-tab-claude:checked) .panel-claude,
|
|
527
551
|
.connect:has(#connect-tab-curl:checked) .panel-curl { display: block; }
|
|
528
552
|
/* Fallback when :has() unsupported — show first visible panel */
|
|
529
553
|
@supports not selector(:has(*)) {
|
|
@@ -602,21 +626,25 @@ pre code { background: transparent; padding: 0; border: 0; font-size: inherit; }
|
|
|
602
626
|
|
|
603
627
|
/* -------------------- Sections -------------------- */
|
|
604
628
|
|
|
605
|
-
section { padding: var(--space-
|
|
629
|
+
section { padding: var(--space-10) 0 0; }
|
|
606
630
|
|
|
631
|
+
/* Section heading — reference-style. The heading is lowercase mono with a
|
|
632
|
+
thin accent bar; the count rides as a mono numeral at the same weight.
|
|
633
|
+
Restraint here keeps the visual budget on the cards below. */
|
|
607
634
|
.section-heading {
|
|
608
635
|
display: flex;
|
|
609
636
|
align-items: baseline;
|
|
610
637
|
gap: var(--space-3);
|
|
611
|
-
margin: 0 0 var(--space-
|
|
612
|
-
padding-bottom: var(--space-
|
|
638
|
+
margin: 0 0 var(--space-5);
|
|
639
|
+
padding-bottom: var(--space-2);
|
|
613
640
|
border-bottom: 1px solid var(--border-subtle);
|
|
614
641
|
}
|
|
615
642
|
.section-heading h2 {
|
|
616
643
|
margin: 0;
|
|
617
|
-
font-
|
|
644
|
+
font-family: var(--font-mono);
|
|
645
|
+
font-size: var(--text-base);
|
|
618
646
|
font-weight: 600;
|
|
619
|
-
letter-spacing:
|
|
647
|
+
letter-spacing: 0.02em;
|
|
620
648
|
color: var(--fg);
|
|
621
649
|
text-transform: lowercase;
|
|
622
650
|
display: inline-flex;
|
|
@@ -626,54 +654,40 @@ section { padding: var(--space-12) 0 0; }
|
|
|
626
654
|
.section-heading h2::before {
|
|
627
655
|
content: "";
|
|
628
656
|
display: inline-block;
|
|
629
|
-
width:
|
|
630
|
-
height: 0.
|
|
631
|
-
background:
|
|
632
|
-
border-radius:
|
|
657
|
+
width: 2px;
|
|
658
|
+
height: 0.95em;
|
|
659
|
+
background: var(--accent);
|
|
660
|
+
border-radius: 1px;
|
|
633
661
|
flex-shrink: 0;
|
|
634
662
|
}
|
|
635
663
|
.section-count {
|
|
636
664
|
font-family: var(--font-mono);
|
|
637
|
-
font-size: var(--text-
|
|
665
|
+
font-size: var(--text-base);
|
|
638
666
|
font-weight: 600;
|
|
639
667
|
color: var(--accent);
|
|
640
668
|
font-variant-numeric: tabular-nums;
|
|
641
|
-
letter-spacing:
|
|
669
|
+
letter-spacing: 0;
|
|
642
670
|
line-height: 1;
|
|
643
671
|
}
|
|
644
672
|
|
|
645
673
|
.group-heading {
|
|
646
|
-
margin: var(--space-
|
|
647
|
-
color: var(--fg-
|
|
674
|
+
margin: var(--space-5) 0 var(--space-2);
|
|
675
|
+
color: var(--fg-subtle);
|
|
648
676
|
font-family: var(--font-mono);
|
|
649
|
-
font-size: 0.
|
|
677
|
+
font-size: 0.625rem;
|
|
650
678
|
font-weight: 600;
|
|
651
|
-
text-transform:
|
|
652
|
-
letter-spacing: 0.
|
|
679
|
+
text-transform: uppercase;
|
|
680
|
+
letter-spacing: 0.1em;
|
|
653
681
|
display: flex;
|
|
654
682
|
align-items: baseline;
|
|
655
683
|
gap: var(--space-2);
|
|
656
|
-
position: relative;
|
|
657
|
-
padding-left: var(--space-3);
|
|
658
|
-
}
|
|
659
|
-
.group-heading::before {
|
|
660
|
-
content: "";
|
|
661
|
-
position: absolute;
|
|
662
|
-
left: 0;
|
|
663
|
-
top: 50%;
|
|
664
|
-
transform: translateY(-50%);
|
|
665
|
-
width: 2px;
|
|
666
|
-
height: 0.85em;
|
|
667
|
-
background: var(--accent);
|
|
668
|
-
border-radius: 1px;
|
|
669
684
|
}
|
|
670
685
|
.group-heading:first-child { margin-top: 0; }
|
|
671
|
-
.group-heading[data-group="read"]::before { background: #16a34a; }
|
|
672
|
-
.group-heading[data-group="destructive"]::before { background: #dc2626; }
|
|
673
686
|
.group-count {
|
|
674
687
|
color: var(--fg-subtle);
|
|
675
688
|
font-weight: 500;
|
|
676
689
|
font-variant-numeric: tabular-nums;
|
|
690
|
+
opacity: 0.7;
|
|
677
691
|
}
|
|
678
692
|
|
|
679
693
|
/* -------------------- Tool filter bar -------------------- */
|
|
@@ -823,37 +837,37 @@ section { padding: var(--space-12) 0 0; }
|
|
|
823
837
|
|
|
824
838
|
.card-grid {
|
|
825
839
|
display: grid;
|
|
826
|
-
grid-template-columns: repeat(auto-fill, minmax(
|
|
827
|
-
gap: var(--space-
|
|
840
|
+
grid-template-columns: repeat(auto-fill, minmax(320px, 1fr));
|
|
841
|
+
gap: var(--space-2);
|
|
828
842
|
align-items: stretch;
|
|
829
843
|
}
|
|
830
844
|
.card {
|
|
831
845
|
border: 1px solid var(--border-subtle);
|
|
832
|
-
border-radius: var(--radius-
|
|
833
|
-
padding: var(--space-
|
|
846
|
+
border-radius: var(--radius-sm);
|
|
847
|
+
padding: var(--space-3) var(--space-4);
|
|
834
848
|
background: var(--bg-elevated);
|
|
835
849
|
display: flex;
|
|
836
850
|
flex-direction: column;
|
|
837
851
|
gap: var(--space-2);
|
|
838
852
|
transition: border-color var(--duration-fast) var(--ease-out),
|
|
839
|
-
transform var(--duration-fast) var(--ease-out),
|
|
840
853
|
box-shadow var(--duration-fast) var(--ease-out);
|
|
841
854
|
position: relative;
|
|
842
855
|
height: 100%;
|
|
843
856
|
}
|
|
844
857
|
|
|
845
|
-
/* Mutability spine —
|
|
846
|
-
card.
|
|
847
|
-
colored bars before the eye lands on any title.
|
|
848
|
-
|
|
858
|
+
/* Mutability spine — 2px tonal strip down the left edge of each tool
|
|
859
|
+
card. The primary bird's-eye signal: a row of cards reads as a row of
|
|
860
|
+
colored bars before the eye lands on any title. Pill in card meta is
|
|
861
|
+
the redundant a11y backup for non-color signal. */
|
|
862
|
+
.tool-card { padding-left: calc(var(--space-4) + 2px); }
|
|
849
863
|
.tool-card::before {
|
|
850
864
|
content: "";
|
|
851
865
|
position: absolute;
|
|
852
866
|
left: 0;
|
|
853
867
|
top: var(--space-2);
|
|
854
868
|
bottom: var(--space-2);
|
|
855
|
-
width:
|
|
856
|
-
border-radius: 0
|
|
869
|
+
width: 2px;
|
|
870
|
+
border-radius: 0 1px 1px 0;
|
|
857
871
|
background: var(--card-spine, var(--border-strong));
|
|
858
872
|
transition: background var(--duration-fast) var(--ease-out);
|
|
859
873
|
}
|
|
@@ -868,8 +882,7 @@ section { padding: var(--space-12) 0 0; }
|
|
|
868
882
|
}
|
|
869
883
|
|
|
870
884
|
/* Disabled tool card — muted overall to read as "present but not callable".
|
|
871
|
-
|
|
872
|
-
interactive payoff to suggest. */
|
|
885
|
+
No interactive payoff means no hover affordance. */
|
|
873
886
|
.tool-card--disabled {
|
|
874
887
|
background: var(--bg-subtle);
|
|
875
888
|
border-style: dashed;
|
|
@@ -878,19 +891,19 @@ section { padding: var(--space-12) 0 0; }
|
|
|
878
891
|
.tool-card--disabled .card-desc { color: var(--fg-subtle); }
|
|
879
892
|
.tool-card--disabled:hover {
|
|
880
893
|
border-color: var(--border-strong);
|
|
881
|
-
transform: none;
|
|
882
894
|
box-shadow: none;
|
|
883
895
|
}
|
|
884
896
|
.tool-card--disabled::before { opacity: 0.5; }
|
|
897
|
+
/* Hover: border darkens to accent edge + a quiet accent-tinted shadow.
|
|
898
|
+
Dropped the translateY lift — too "product card" for a reference surface. */
|
|
885
899
|
.card:hover {
|
|
886
900
|
border-color: var(--accent-edge);
|
|
887
|
-
|
|
888
|
-
box-shadow: 0 8px 28px -12px var(--accent-glow), var(--shadow-md);
|
|
901
|
+
box-shadow: 0 4px 16px -10px var(--accent-glow);
|
|
889
902
|
}
|
|
890
903
|
.card-head {
|
|
891
904
|
display: flex;
|
|
892
|
-
align-items:
|
|
893
|
-
gap: var(--space-2);
|
|
905
|
+
align-items: baseline;
|
|
906
|
+
gap: var(--space-2) var(--space-3);
|
|
894
907
|
flex-wrap: wrap;
|
|
895
908
|
}
|
|
896
909
|
.card-title {
|
|
@@ -900,6 +913,8 @@ section { padding: var(--space-12) 0 0; }
|
|
|
900
913
|
font-family: var(--font-mono);
|
|
901
914
|
color: var(--fg);
|
|
902
915
|
letter-spacing: -0.015em;
|
|
916
|
+
flex: 1 1 auto;
|
|
917
|
+
min-width: 0;
|
|
903
918
|
}
|
|
904
919
|
.card-title a { color: inherit; }
|
|
905
920
|
.card-title a:hover { color: var(--accent); text-decoration: none; }
|
|
@@ -908,15 +923,14 @@ section { padding: var(--space-12) 0 0; }
|
|
|
908
923
|
color: var(--fg-muted);
|
|
909
924
|
font-size: var(--text-sm);
|
|
910
925
|
line-height: 1.5;
|
|
911
|
-
/*
|
|
912
|
-
for screen readers and view-source. Non-WebKit engines
|
|
913
|
-
to the natural height
|
|
914
|
-
max-height as a graceful degradation. */
|
|
926
|
+
/* 2-line preview clamp — most tool/resource/prompt descriptions fit. Full
|
|
927
|
+
text stays in DOM for screen readers and view-source. Non-WebKit engines
|
|
928
|
+
fall back to the natural height via max-height. */
|
|
915
929
|
display: -webkit-box;
|
|
916
|
-
-webkit-line-clamp:
|
|
930
|
+
-webkit-line-clamp: 2;
|
|
917
931
|
-webkit-box-orient: vertical;
|
|
918
932
|
overflow: hidden;
|
|
919
|
-
max-height: calc(1.5em *
|
|
933
|
+
max-height: calc(1.5em * 2);
|
|
920
934
|
}
|
|
921
935
|
.card-meta {
|
|
922
936
|
display: flex;
|
|
@@ -942,12 +956,11 @@ section { padding: var(--space-12) 0 0; }
|
|
|
942
956
|
}
|
|
943
957
|
|
|
944
958
|
/* Card footer — pinned to the bottom so cards align across a row even
|
|
945
|
-
when descriptions vary in length.
|
|
946
|
-
and
|
|
959
|
+
when descriptions vary in length. No divider line: the card already has
|
|
960
|
+
its own border + bg, and a foot rule competed with the spine. */
|
|
947
961
|
.card-foot {
|
|
948
962
|
margin-top: auto;
|
|
949
|
-
padding-top: var(--space-
|
|
950
|
-
border-top: 1px solid var(--border-subtle);
|
|
963
|
+
padding-top: var(--space-2);
|
|
951
964
|
display: flex;
|
|
952
965
|
flex-wrap: wrap;
|
|
953
966
|
align-items: center;
|
|
@@ -1009,15 +1022,15 @@ section { padding: var(--space-12) 0 0; }
|
|
|
1009
1022
|
.card-detail[open] > summary { color: var(--accent); }
|
|
1010
1023
|
/* When a detail opens, push its content full-width below the footer. The
|
|
1011
1024
|
negative side margins recover the card's horizontal padding so the
|
|
1012
|
-
panel spans edge-to-edge. */
|
|
1025
|
+
panel spans edge-to-edge. Margin values track .card padding. */
|
|
1013
1026
|
.card-detail[open] {
|
|
1014
1027
|
width: 100%;
|
|
1015
|
-
margin: var(--space-
|
|
1016
|
-
padding: 0 var(--space-
|
|
1028
|
+
margin: var(--space-2) calc(var(--space-4) * -1) calc(var(--space-3) * -1);
|
|
1029
|
+
padding: 0 var(--space-4) var(--space-3);
|
|
1017
1030
|
background: var(--bg-subtle);
|
|
1018
1031
|
border-top: 1px solid var(--border-subtle);
|
|
1019
1032
|
}
|
|
1020
|
-
.card-detail[open] > summary { padding-top: var(--space-
|
|
1033
|
+
.card-detail[open] > summary { padding-top: var(--space-2); }
|
|
1021
1034
|
/* When any detail is open the actions row needs to wrap so the open
|
|
1022
1035
|
panel can claim full width. The :has() selector handles this in
|
|
1023
1036
|
modern engines; older browsers tolerate the actions row stacking
|
|
@@ -1033,6 +1046,11 @@ section { padding: var(--space-12) 0 0; }
|
|
|
1033
1046
|
|
|
1034
1047
|
/* Annotation pills — dot-chip style */
|
|
1035
1048
|
.pill-row { display: inline-flex; flex-wrap: wrap; gap: 5px; align-items: center; }
|
|
1049
|
+
/* Meta-row variant: pills sit in the card meta strip below the description,
|
|
1050
|
+
so they're calmer than the aux pills next to the title — no leading dot,
|
|
1051
|
+
tighter padding, slightly smaller. */
|
|
1052
|
+
.pill-row--meta .pill { padding: 1px 6px; font-size: 0.625rem; }
|
|
1053
|
+
.pill-row--meta .pill::before { display: none; }
|
|
1036
1054
|
.pill {
|
|
1037
1055
|
display: inline-flex;
|
|
1038
1056
|
align-items: center;
|
|
@@ -1140,7 +1158,7 @@ section { padding: var(--space-12) 0 0; }
|
|
|
1140
1158
|
|
|
1141
1159
|
.source-link {
|
|
1142
1160
|
font-size: var(--text-xs);
|
|
1143
|
-
color: var(--fg-
|
|
1161
|
+
color: var(--fg-subtle);
|
|
1144
1162
|
margin-left: auto;
|
|
1145
1163
|
font-family: var(--font-mono);
|
|
1146
1164
|
transition: color var(--duration-fast);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"styles.js","sourceRoot":"","sources":["../../../../../../src/mcp-server/transports/http/landing-page/assets/styles.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,EAAE,cAAc,EAAE,MAAM,0BAA0B,CAAC;AAC1D,OAAO,EAAiB,SAAS,EAAE,MAAM,4BAA4B,CAAC;AAEtE,2EAA2E;AAC3E,MAAM,cAAc,GAAG,SAAS,CAAC;AAEjC;;;;;;;;GAQG;AACH,MAAM,UAAU,YAAY,CAAC,MAAc;IACzC,MAAM,UAAU,GAAG,cAAc,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,cAAc,CAAC;IACpE,MAAM,GAAG,GAAG;;;;;;;;;;;;;;;;;;;;cAoBA,UAAU;wCACgB,UAAU;uCACX,UAAU;uCACV,UAAU;yCACR,UAAU
|
|
1
|
+
{"version":3,"file":"styles.js","sourceRoot":"","sources":["../../../../../../src/mcp-server/transports/http/landing-page/assets/styles.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,EAAE,cAAc,EAAE,MAAM,0BAA0B,CAAC;AAC1D,OAAO,EAAiB,SAAS,EAAE,MAAM,4BAA4B,CAAC;AAEtE,2EAA2E;AAC3E,MAAM,cAAc,GAAG,SAAS,CAAC;AAEjC;;;;;;;;GAQG;AACH,MAAM,UAAU,YAAY,CAAC,MAAc;IACzC,MAAM,UAAU,GAAG,cAAc,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,cAAc,CAAC;IACpE,MAAM,GAAG,GAAG;;;;;;;;;;;;;;;;;;;;cAoBA,UAAU;wCACgB,UAAU;uCACX,UAAU;uCACV,UAAU;yCACR,UAAU;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CA6wClD,CAAC;IACA,OAAO,SAAS,CAAC,UAAU,GAAG,UAAU,CAAC,CAAC;AAC5C,CAAC"}
|
|
@@ -1,8 +1,10 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* @fileoverview Terminal-chrome connect card with
|
|
3
|
-
*
|
|
4
|
-
*
|
|
5
|
-
*
|
|
2
|
+
* @fileoverview Terminal-chrome connect card with one tab per common MCP
|
|
3
|
+
* client (Claude, Codex, Cursor, Gemini) plus transport / protocol fallbacks
|
|
4
|
+
* (STDIO, HTTP, curl). Generates copy-paste-ready client configs and commands
|
|
5
|
+
* from the server manifest. Radio-input + `:has()` CSS hack drives tab
|
|
6
|
+
* switching with no JS; the `claude` tab is the default checked panel because
|
|
7
|
+
* it's the most common visitor conversion path.
|
|
6
8
|
*
|
|
7
9
|
* Accessibility: the ARIA tab pattern (`role="tablist"`/`"tab"`/`"tabpanel"`
|
|
8
10
|
* + `aria-selected`/`aria-controls`) is a poor fit for a radio-input-driven
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"connect.d.ts","sourceRoot":"","sources":["../../../../../../src/mcp-server/transports/http/landing-page/sections/connect.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"connect.d.ts","sourceRoot":"","sources":["../../../../../../src/mcp-server/transports/http/landing-page/sections/connect.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;GAgBG;AAEH,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,0BAA0B,CAAC;AAC/D,OAAO,EAAQ,KAAK,QAAQ,EAAE,MAAM,4BAA4B,CAAC;AAEjE,wBAAgB,qBAAqB,CAAC,QAAQ,EAAE,cAAc,EAAE,OAAO,EAAE,MAAM,GAAG,QAAQ,CAyIzF"}
|
|
@@ -1,8 +1,10 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* @fileoverview Terminal-chrome connect card with
|
|
3
|
-
*
|
|
4
|
-
*
|
|
5
|
-
*
|
|
2
|
+
* @fileoverview Terminal-chrome connect card with one tab per common MCP
|
|
3
|
+
* client (Claude, Codex, Cursor, Gemini) plus transport / protocol fallbacks
|
|
4
|
+
* (STDIO, HTTP, curl). Generates copy-paste-ready client configs and commands
|
|
5
|
+
* from the server manifest. Radio-input + `:has()` CSS hack drives tab
|
|
6
|
+
* switching with no JS; the `claude` tab is the default checked panel because
|
|
7
|
+
* it's the most common visitor conversion path.
|
|
6
8
|
*
|
|
7
9
|
* Accessibility: the ARIA tab pattern (`role="tablist"`/`"tab"`/`"tabpanel"`
|
|
8
10
|
* + `aria-selected`/`aria-controls`) is a poor fit for a radio-input-driven
|
|
@@ -54,12 +56,16 @@ export function renderConnectSnippets(manifest, baseUrl) {
|
|
|
54
56
|
},
|
|
55
57
|
},
|
|
56
58
|
}, null, 2);
|
|
57
|
-
//
|
|
58
|
-
// served over HTTP, so a visitor is already interacting
|
|
59
|
-
// instance; a stdio/bunx command
|
|
60
|
-
// copy and carry env placeholders that HTTP wouldn't
|
|
61
|
-
// STDIO tab still carries the JSON for anyone
|
|
59
|
+
// Per-client install snippets — always target the HTTP endpoint. The
|
|
60
|
+
// landing page is served over HTTP, so a visitor is already interacting
|
|
61
|
+
// with this instance; a stdio/bunx command in these tabs would install a
|
|
62
|
+
// different (local) copy and carry env placeholders that HTTP wouldn't
|
|
63
|
+
// forward anyway. The STDIO tab below still carries the JSON for anyone
|
|
64
|
+
// who wants to run locally.
|
|
62
65
|
const claudeCmd = overrides.claude ?? buildClaudeHttpCmd(shortName, endpoint);
|
|
66
|
+
const codexCmd = overrides.codex ?? buildCodexHttpCmd(shortName, endpoint);
|
|
67
|
+
const cursorConfig = overrides.cursor ?? buildCursorHttpConfig(shortName, endpoint);
|
|
68
|
+
const geminiCmd = overrides.gemini ?? buildGeminiHttpCmd(shortName, endpoint);
|
|
63
69
|
const curl = overrides.curl ??
|
|
64
70
|
[
|
|
65
71
|
`curl -X POST ${endpoint} \\`,
|
|
@@ -69,7 +75,35 @@ export function renderConnectSnippets(manifest, baseUrl) {
|
|
|
69
75
|
].join('\n');
|
|
70
76
|
// Chrome label — npm package when published, else the HTTP endpoint (trimmed).
|
|
71
77
|
const chromeLabel = npmPackage ?? endpoint.replace(/^https?:\/\//, '');
|
|
78
|
+
// Order is the rendered tab order. `claude` leads as the default conversion
|
|
79
|
+
// path; named clients follow alphabetically; transport / protocol fallbacks
|
|
80
|
+
// bring up the rear. The default checked tab is wired by id below — keep
|
|
81
|
+
// it in sync with `DEFAULT_TAB`.
|
|
72
82
|
const panels = [
|
|
83
|
+
{
|
|
84
|
+
id: 'claude',
|
|
85
|
+
label: 'Claude',
|
|
86
|
+
content: claudeCmd,
|
|
87
|
+
copyAriaLabel: 'Copy claude mcp add command',
|
|
88
|
+
},
|
|
89
|
+
{
|
|
90
|
+
id: 'codex',
|
|
91
|
+
label: 'Codex',
|
|
92
|
+
content: codexCmd,
|
|
93
|
+
copyAriaLabel: 'Copy codex mcp add command',
|
|
94
|
+
},
|
|
95
|
+
{
|
|
96
|
+
id: 'cursor',
|
|
97
|
+
label: 'Cursor',
|
|
98
|
+
content: cursorConfig,
|
|
99
|
+
copyAriaLabel: 'Copy Cursor mcp.json config',
|
|
100
|
+
},
|
|
101
|
+
{
|
|
102
|
+
id: 'gemini',
|
|
103
|
+
label: 'Gemini',
|
|
104
|
+
content: geminiCmd,
|
|
105
|
+
copyAriaLabel: 'Copy gemini mcp add command',
|
|
106
|
+
},
|
|
73
107
|
{ id: 'stdio', label: 'STDIO', content: stdioConfig, copyAriaLabel: 'Copy stdio config' },
|
|
74
108
|
{
|
|
75
109
|
id: 'http',
|
|
@@ -77,12 +111,6 @@ export function renderConnectSnippets(manifest, baseUrl) {
|
|
|
77
111
|
content: httpConfig,
|
|
78
112
|
copyAriaLabel: 'Copy HTTP config',
|
|
79
113
|
},
|
|
80
|
-
{
|
|
81
|
-
id: 'claude',
|
|
82
|
-
label: 'Claude',
|
|
83
|
-
content: claudeCmd,
|
|
84
|
-
copyAriaLabel: 'Copy claude mcp add command',
|
|
85
|
-
},
|
|
86
114
|
{ id: 'curl', label: 'curl', content: curl, copyAriaLabel: 'Copy curl command' },
|
|
87
115
|
];
|
|
88
116
|
return html `
|
|
@@ -95,11 +123,10 @@ export function renderConnectSnippets(manifest, baseUrl) {
|
|
|
95
123
|
</span>
|
|
96
124
|
<span class="connect-chrome-endpoint" title="${endpoint}">${chromeLabel}</span>
|
|
97
125
|
</div>
|
|
98
|
-
${panels.map((p, i) => i === 0
|
|
99
|
-
? html `<input type="radio" class="connect-tab-input" name="connect" id="connect-tab-${p.id}" checked />`
|
|
100
|
-
: html `<input type="radio" class="connect-tab-input" name="connect" id="connect-tab-${p.id}" />`)}
|
|
101
126
|
<div class="connect-tabs">
|
|
102
|
-
${panels.map((p) =>
|
|
127
|
+
${panels.map((p) => p.id === DEFAULT_TAB
|
|
128
|
+
? html `<input type="radio" class="connect-tab-input" name="connect" id="connect-tab-${p.id}" checked /><label for="connect-tab-${p.id}" class="connect-tab-label">${p.label}</label>`
|
|
129
|
+
: html `<input type="radio" class="connect-tab-input" name="connect" id="connect-tab-${p.id}" /><label for="connect-tab-${p.id}" class="connect-tab-label">${p.label}</label>`)}
|
|
103
130
|
</div>
|
|
104
131
|
<div class="connect-panels">
|
|
105
132
|
${panels.map((p) => renderConnectPanel(p.id, p.content, p.copyAriaLabel))}
|
|
@@ -107,6 +134,13 @@ export function renderConnectSnippets(manifest, baseUrl) {
|
|
|
107
134
|
</div>
|
|
108
135
|
`;
|
|
109
136
|
}
|
|
137
|
+
/**
|
|
138
|
+
* Default selected tab id. Claude is the most common conversion path for
|
|
139
|
+
* MCP visitors; if it ever moves, the `@supports not selector(:has(*))`
|
|
140
|
+
* fallback in styles.ts (which shows `.connect-panel:first-of-type`) needs
|
|
141
|
+
* to stay aligned with the first entry in the panels array.
|
|
142
|
+
*/
|
|
143
|
+
const DEFAULT_TAB = 'claude';
|
|
110
144
|
/**
|
|
111
145
|
* Single panel inside the connect card — pre/code + copy button.
|
|
112
146
|
*
|
|
@@ -142,4 +176,27 @@ function envFromEntries(entries) {
|
|
|
142
176
|
function buildClaudeHttpCmd(shortName, endpoint) {
|
|
143
177
|
return `claude mcp add --transport http ${shortName} ${endpoint}`;
|
|
144
178
|
}
|
|
179
|
+
/** `codex mcp add <name> --url <url>` — adds a streamable-HTTP server to `~/.codex/config.toml`. */
|
|
180
|
+
function buildCodexHttpCmd(shortName, endpoint) {
|
|
181
|
+
return `codex mcp add ${shortName} --url ${endpoint}`;
|
|
182
|
+
}
|
|
183
|
+
/** `gemini mcp add --transport http <name> <url>` — writes to `~/.gemini/settings.json`. */
|
|
184
|
+
function buildGeminiHttpCmd(shortName, endpoint) {
|
|
185
|
+
return `gemini mcp add --transport http ${shortName} ${endpoint}`;
|
|
186
|
+
}
|
|
187
|
+
/**
|
|
188
|
+
* Cursor has no first-party CLI; users paste a `mcpServers` block into
|
|
189
|
+
* `~/.cursor/mcp.json` (or `.cursor/mcp.json` per-project). The bare `url`
|
|
190
|
+
* field is the modern streamable-HTTP shape — Cursor handles transport
|
|
191
|
+
* negotiation internally.
|
|
192
|
+
*/
|
|
193
|
+
function buildCursorHttpConfig(shortName, endpoint) {
|
|
194
|
+
return JSON.stringify({
|
|
195
|
+
mcpServers: {
|
|
196
|
+
[shortName]: {
|
|
197
|
+
url: endpoint,
|
|
198
|
+
},
|
|
199
|
+
},
|
|
200
|
+
}, null, 2);
|
|
201
|
+
}
|
|
145
202
|
//# sourceMappingURL=connect.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"connect.js","sourceRoot":"","sources":["../../../../../../src/mcp-server/transports/http/landing-page/sections/connect.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"connect.js","sourceRoot":"","sources":["../../../../../../src/mcp-server/transports/http/landing-page/sections/connect.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;GAgBG;AAGH,OAAO,EAAE,IAAI,EAAiB,MAAM,4BAA4B,CAAC;AAEjE,MAAM,UAAU,qBAAqB,CAAC,QAAwB,EAAE,OAAe;IAC7E,MAAM,QAAQ,GAAG,GAAG,OAAO,CAAC,OAAO,CAAC,KAAK,EAAE,EAAE,CAAC,GAAG,QAAQ,CAAC,SAAS,CAAC,YAAY,EAAE,CAAC;IACnF,MAAM,UAAU,GAAG,QAAQ,CAAC,OAAO,CAAC,UAAU,EAAE,IAAI,CAAC;IACrD,+EAA+E;IAC/E,6EAA6E;IAC7E,0BAA0B;IAC1B,MAAM,SAAS,GAAG,eAAe,CAAC,QAAQ,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;IACxD,MAAM,UAAU,GAAG,QAAQ,CAAC,OAAO,CAAC,UAAU,CAAC;IAC/C,MAAM,QAAQ,GAAG,UAAU,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,cAAc,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;IAChF,wEAAwE;IACxE,4DAA4D;IAC5D,MAAM,SAAS,GAAG,QAAQ,CAAC,OAAO,CAAC,eAAe,CAAC;IAEnD,yEAAyE;IACzE,0EAA0E;IAC1E,0EAA0E;IAC1E,yEAAyE;IACzE,gBAAgB;IAChB,MAAM,WAAW,GACf,SAAS,CAAC,KAAK;QACf,IAAI,CAAC,SAAS,CACZ;YACE,UAAU,EAAE;gBACV,CAAC,SAAS,CAAC,EAAE;oBACX,OAAO,EAAE,MAAM;oBACf,IAAI,EAAE,UAAU,CAAC,CAAC,CAAC,CAAC,GAAG,UAAU,SAAS,CAAC,CAAC,CAAC,CAAC,CAAC,YAAY,EAAE,QAAQ,CAAC;oBACtE,GAAG,CAAC,QAAQ,IAAI,EAAE,GAAG,EAAE,QAAQ,EAAE,CAAC;iBACnC;aACF;SACF,EACD,IAAI,EACJ,CAAC,CACF,CAAC;IAEJ,2EAA2E;IAC3E,2EAA2E;IAC3E,qEAAqE;IACrE,oEAAoE;IACpE,MAAM,UAAU,GACd,SAAS,CAAC,IAAI;QACd,IAAI,CAAC,SAAS,CACZ;YACE,UAAU,EAAE;gBACV,CAAC,SAAS,CAAC,EAAE;oBACX,IAAI,EAAE,MAAM;oBACZ,GAAG,EAAE,QAAQ;iBACd;aACF;SACF,EACD,IAAI,EACJ,CAAC,CACF,CAAC;IAEJ,qEAAqE;IACrE,wEAAwE;IACxE,yEAAyE;IACzE,uEAAuE;IACvE,wEAAwE;IACxE,4BAA4B;IAC5B,MAAM,SAAS,GAAG,SAAS,CAAC,MAAM,IAAI,kBAAkB,CAAC,SAAS,EAAE,QAAQ,CAAC,CAAC;IAC9E,MAAM,QAAQ,GAAG,SAAS,CAAC,KAAK,IAAI,iBAAiB,CAAC,SAAS,EAAE,QAAQ,CAAC,CAAC;IAC3E,MAAM,YAAY,GAAG,SAAS,CAAC,MAAM,IAAI,qBAAqB,CAAC,SAAS,EAAE,QAAQ,CAAC,CAAC;IACpF,MAAM,SAAS,GAAG,SAAS,CAAC,MAAM,IAAI,kBAAkB,CAAC,SAAS,EAAE,QAAQ,CAAC,CAAC;IAE9E,MAAM,IAAI,GACR,SAAS,CAAC,IAAI;QACd;YACE,gBAAgB,QAAQ,KAAK;YAC7B,0CAA0C;YAC1C,+BAA+B,QAAQ,CAAC,QAAQ,CAAC,aAAa,MAAM;YACpE,oFAAoF,QAAQ,CAAC,QAAQ,CAAC,aAAa,uEAAuE;SAC3L,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAEf,+EAA+E;IAC/E,MAAM,WAAW,GAAG,UAAU,IAAI,QAAQ,CAAC,OAAO,CAAC,cAAc,EAAE,EAAE,CAAC,CAAC;IAEvE,4EAA4E;IAC5E,4EAA4E;IAC5E,yEAAyE;IACzE,iCAAiC;IACjC,MAAM,MAAM,GAAiF;QAC3F;YACE,EAAE,EAAE,QAAQ;YACZ,KAAK,EAAE,QAAQ;YACf,OAAO,EAAE,SAAS;YAClB,aAAa,EAAE,6BAA6B;SAC7C;QACD;YACE,EAAE,EAAE,OAAO;YACX,KAAK,EAAE,OAAO;YACd,OAAO,EAAE,QAAQ;YACjB,aAAa,EAAE,4BAA4B;SAC5C;QACD;YACE,EAAE,EAAE,QAAQ;YACZ,KAAK,EAAE,QAAQ;YACf,OAAO,EAAE,YAAY;YACrB,aAAa,EAAE,6BAA6B;SAC7C;QACD;YACE,EAAE,EAAE,QAAQ;YACZ,KAAK,EAAE,QAAQ;YACf,OAAO,EAAE,SAAS;YAClB,aAAa,EAAE,6BAA6B;SAC7C;QACD,EAAE,EAAE,EAAE,OAAO,EAAE,KAAK,EAAE,OAAO,EAAE,OAAO,EAAE,WAAW,EAAE,aAAa,EAAE,mBAAmB,EAAE;QACzF;YACE,EAAE,EAAE,MAAM;YACV,KAAK,EAAE,iBAAiB;YACxB,OAAO,EAAE,UAAU;YACnB,aAAa,EAAE,kBAAkB;SAClC;QACD,EAAE,EAAE,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE,IAAI,EAAE,aAAa,EAAE,mBAAmB,EAAE;KACjF,CAAC;IAEF,OAAO,IAAI,CAAA;;;;;;;;uDAQ0C,QAAQ,KAAK,WAAW;;;UAGrE,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CACjB,CAAC,CAAC,EAAE,KAAK,WAAW;QAClB,CAAC,CAAC,IAAI,CAAA,gFAAgF,CAAC,CAAC,EAAE,uCAAuC,CAAC,CAAC,EAAE,+BAA+B,CAAC,CAAC,KAAK,UAAU;QACrL,CAAC,CAAC,IAAI,CAAA,gFAAgF,CAAC,CAAC,EAAE,+BAA+B,CAAC,CAAC,EAAE,+BAA+B,CAAC,CAAC,KAAK,UAAU,CAChL;;;UAGC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,kBAAkB,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,OAAO,EAAE,CAAC,CAAC,aAAa,CAAC,CAAC;;;GAG9E,CAAC;AACJ,CAAC;AAED;;;;;GAKG;AACH,MAAM,WAAW,GAAG,QAAQ,CAAC;AAE7B;;;;;;;;;GASG;AACH,SAAS,kBAAkB,CAAC,EAAU,EAAE,OAAe,EAAE,aAAqB;IAC5E,MAAM,SAAS,GAAG,mBAAmB,EAAE,EAAE,CAAC;IAC1C,OAAO,IAAI,CAAA;sCACyB,EAAE;iBACvB,SAAS,2BAA2B,OAAO;gFACoB,SAAS,iBAAiB,aAAa;;GAEpH,CAAC;AACJ,CAAC;AAED;;;GAGG;AACH,SAAS,eAAe,CAAC,UAAkB;IACzC,MAAM,KAAK,GAAG,UAAU,CAAC,WAAW,CAAC,GAAG,CAAC,CAAC;IAC1C,OAAO,KAAK,IAAI,CAAC,CAAC,CAAC,CAAC,UAAU,CAAC,KAAK,CAAC,KAAK,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,UAAU,CAAC;AAC/D,CAAC;AAED,oFAAoF;AACpF,SAAS,cAAc,CACrB,OAAsD;IAEtD,OAAO,MAAM,CAAC,WAAW,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,EAAE,GAAG,EAAE,KAAK,EAAE,EAAE,EAAE,CAAC,CAAC,GAAG,EAAE,KAAK,CAAC,CAAC,CAAC,CAAC;AAC3E,CAAC;AAED,qDAAqD;AACrD,SAAS,kBAAkB,CAAC,SAAiB,EAAE,QAAgB;IAC7D,OAAO,mCAAmC,SAAS,IAAI,QAAQ,EAAE,CAAC;AACpE,CAAC;AAED,oGAAoG;AACpG,SAAS,iBAAiB,CAAC,SAAiB,EAAE,QAAgB;IAC5D,OAAO,iBAAiB,SAAS,UAAU,QAAQ,EAAE,CAAC;AACxD,CAAC;AAED,4FAA4F;AAC5F,SAAS,kBAAkB,CAAC,SAAiB,EAAE,QAAgB;IAC7D,OAAO,mCAAmC,SAAS,IAAI,QAAQ,EAAE,CAAC;AACpE,CAAC;AAED;;;;;GAKG;AACH,SAAS,qBAAqB,CAAC,SAAiB,EAAE,QAAgB;IAChE,OAAO,IAAI,CAAC,SAAS,CACnB;QACE,UAAU,EAAE;YACV,CAAC,SAAS,CAAC,EAAE;gBACX,GAAG,EAAE,QAAQ;aACd;SACF;KACF,EACD,IAAI,EACJ,CAAC,CACF,CAAC;AACJ,CAAC"}
|
|
@@ -1,7 +1,8 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* @fileoverview `<head>` metadata renderer — title, description, Open Graph
|
|
3
3
|
* tags, theme color, JSON-LD structured data, favicon (when a data URI logo
|
|
4
|
-
* is available),
|
|
4
|
+
* is available), canonical link, framework generator meta (when attribution
|
|
5
|
+
* is on), and the `mcp-endpoint` / server-card alternate links.
|
|
5
6
|
*
|
|
6
7
|
* @module src/mcp-server/transports/http/landing-page/sections/head
|
|
7
8
|
*/
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"head.d.ts","sourceRoot":"","sources":["../../../../../../src/mcp-server/transports/http/landing-page/sections/head.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"head.d.ts","sourceRoot":"","sources":["../../../../../../src/mcp-server/transports/http/landing-page/sections/head.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,0BAA0B,CAAC;AAC/D,OAAO,EAAQ,KAAK,QAAQ,EAAa,MAAM,4BAA4B,CAAC;AAS5E,wBAAgB,UAAU,CAAC,QAAQ,EAAE,cAAc,EAAE,OAAO,EAAE,MAAM,GAAG,QAAQ,CAqD9E"}
|
|
@@ -1,13 +1,20 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* @fileoverview `<head>` metadata renderer — title, description, Open Graph
|
|
3
3
|
* tags, theme color, JSON-LD structured data, favicon (when a data URI logo
|
|
4
|
-
* is available),
|
|
4
|
+
* is available), canonical link, framework generator meta (when attribution
|
|
5
|
+
* is on), and the `mcp-endpoint` / server-card alternate links.
|
|
5
6
|
*
|
|
6
7
|
* @module src/mcp-server/transports/http/landing-page/sections/head
|
|
7
8
|
*/
|
|
8
9
|
import { html, unsafeRaw } from '../../../../../utils/formatting/html.js';
|
|
10
|
+
/**
|
|
11
|
+
* Open Graph locale tag. The landing page body is English-only (the surrounding
|
|
12
|
+
* `<html lang="en">` matches), so a hardcoded `en_US` is accurate. Lift to a
|
|
13
|
+
* `landing.locale` config option if i18n is ever wired up.
|
|
14
|
+
*/
|
|
15
|
+
const OG_LOCALE = 'en_US';
|
|
9
16
|
export function renderHead(manifest, pageUrl) {
|
|
10
|
-
const { server, landing } = manifest;
|
|
17
|
+
const { server, landing, framework } = manifest;
|
|
11
18
|
const title = `${server.name} · MCP server`;
|
|
12
19
|
const description = landing.tagline ?? server.description ?? `MCP server: ${server.name}`;
|
|
13
20
|
const ogImage = landing.logo?.startsWith('http')
|
|
@@ -17,6 +24,13 @@ export function renderHead(manifest, pageUrl) {
|
|
|
17
24
|
? html `<link rel="icon" href="${landing.logo}" />`
|
|
18
25
|
: html ``;
|
|
19
26
|
const themeColor = html `<meta name="theme-color" content="${landing.theme.accent}" />`;
|
|
27
|
+
// Framework footprint marker (mirrors WordPress/Hugo/Jekyll/Gatsby's
|
|
28
|
+
// generator convention). Gated on landing.attribution so operators who
|
|
29
|
+
// opt out of the visible "Built on …" badge also opt out of the
|
|
30
|
+
// machine-readable footprint.
|
|
31
|
+
const generator = landing.attribution
|
|
32
|
+
? html `<meta name="generator" content="${framework.name} ${framework.version}" />`
|
|
33
|
+
: html ``;
|
|
20
34
|
const jsonLd = JSON.stringify({
|
|
21
35
|
'@context': 'https://schema.org',
|
|
22
36
|
'@type': 'SoftwareApplication',
|
|
@@ -31,10 +45,14 @@ export function renderHead(manifest, pageUrl) {
|
|
|
31
45
|
<meta name="viewport" content="width=device-width, initial-scale=1" />
|
|
32
46
|
<title>${title}</title>
|
|
33
47
|
<meta name="description" content="${description}" />
|
|
48
|
+
${generator}
|
|
49
|
+
<link rel="canonical" href="${pageUrl}" />
|
|
34
50
|
${themeColor}
|
|
35
51
|
<meta property="og:title" content="${title}" />
|
|
36
52
|
<meta property="og:description" content="${description}" />
|
|
37
53
|
<meta property="og:type" content="website" />
|
|
54
|
+
<meta property="og:site_name" content="${server.name}" />
|
|
55
|
+
<meta property="og:locale" content="${OG_LOCALE}" />
|
|
38
56
|
<meta property="og:url" content="${pageUrl}" />
|
|
39
57
|
${ogImage}
|
|
40
58
|
<meta name="twitter:card" content="summary" />
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"head.js","sourceRoot":"","sources":["../../../../../../src/mcp-server/transports/http/landing-page/sections/head.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"head.js","sourceRoot":"","sources":["../../../../../../src/mcp-server/transports/http/landing-page/sections/head.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAGH,OAAO,EAAE,IAAI,EAAiB,SAAS,EAAE,MAAM,4BAA4B,CAAC;AAE5E;;;;GAIG;AACH,MAAM,SAAS,GAAG,OAAO,CAAC;AAE1B,MAAM,UAAU,UAAU,CAAC,QAAwB,EAAE,OAAe;IAClE,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,SAAS,EAAE,GAAG,QAAQ,CAAC;IAChD,MAAM,KAAK,GAAG,GAAG,MAAM,CAAC,IAAI,eAAe,CAAC;IAC5C,MAAM,WAAW,GAAG,OAAO,CAAC,OAAO,IAAI,MAAM,CAAC,WAAW,IAAI,eAAe,MAAM,CAAC,IAAI,EAAE,CAAC;IAC1F,MAAM,OAAO,GAAG,OAAO,CAAC,IAAI,EAAE,UAAU,CAAC,MAAM,CAAC;QAC9C,CAAC,CAAC,IAAI,CAAA,sCAAsC,OAAO,CAAC,IAAI,MAAM;QAC9D,CAAC,CAAC,IAAI,CAAA,EAAE,CAAC;IACX,MAAM,OAAO,GACX,OAAO,CAAC,IAAI,IAAI,cAAc,CAAC,OAAO,CAAC,IAAI,CAAC;QAC1C,CAAC,CAAC,IAAI,CAAA,0BAA0B,OAAO,CAAC,IAAI,MAAM;QAClD,CAAC,CAAC,IAAI,CAAA,EAAE,CAAC;IACb,MAAM,UAAU,GAAG,IAAI,CAAA,qCAAqC,OAAO,CAAC,KAAK,CAAC,MAAM,MAAM,CAAC;IACvF,qEAAqE;IACrE,uEAAuE;IACvE,gEAAgE;IAChE,8BAA8B;IAC9B,MAAM,SAAS,GAAG,OAAO,CAAC,WAAW;QACnC,CAAC,CAAC,IAAI,CAAA,mCAAmC,SAAS,CAAC,IAAI,IAAI,SAAS,CAAC,OAAO,MAAM;QAClF,CAAC,CAAC,IAAI,CAAA,EAAE,CAAC;IAEX,MAAM,MAAM,GAAG,IAAI,CAAC,SAAS,CAAC;QAC5B,UAAU,EAAE,oBAAoB;QAChC,OAAO,EAAE,qBAAqB;QAC9B,IAAI,EAAE,MAAM,CAAC,IAAI;QACjB,WAAW;QACX,mBAAmB,EAAE,sBAAsB;QAC3C,eAAe,EAAE,MAAM,CAAC,OAAO;QAC/B,GAAG,CAAC,MAAM,CAAC,QAAQ,IAAI,EAAE,GAAG,EAAE,MAAM,CAAC,QAAQ,EAAE,CAAC;KACjD,CAAC,CAAC;IAEH,OAAO,IAAI,CAAA;;;aAGA,KAAK;wCACsB,WAAW;MAC7C,SAAS;kCACmB,OAAO;MACnC,UAAU;yCACyB,KAAK;+CACC,WAAW;;6CAEb,MAAM,CAAC,IAAI;0CACd,SAAS;uCACZ,OAAO;MACxC,OAAO;;0CAE6B,KAAK;gDACC,WAAW;MACrD,OAAO;qCACwB,QAAQ,CAAC,SAAS,CAAC,YAAY;;yCAE3B,SAAS,CAAC,YAAY,CAAC,MAAM,CAAC,CAAC;GACrE,CAAC;AACJ,CAAC;AAED,SAAS,cAAc,CAAC,KAAyB;IAC/C,IAAI,CAAC,KAAK;QAAE,OAAO,KAAK,CAAC;IACzB,OAAO,wEAAwE,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;AAC9F,CAAC;AAED;;;;;GAKG;AACH,SAAS,YAAY,CAAC,IAAY;IAChC,OAAO,IAAI;SACR,OAAO,CAAC,IAAI,EAAE,SAAS,CAAC;SACxB,OAAO,CAAC,IAAI,EAAE,SAAS,CAAC;SACxB,OAAO,CAAC,IAAI,EAAE,SAAS,CAAC;SACxB,OAAO,CAAC,SAAS,EAAE,SAAS,CAAC;SAC7B,OAAO,CAAC,SAAS,EAAE,SAAS,CAAC,CAAC;AACnC,CAAC"}
|
|
@@ -38,10 +38,10 @@ function renderPromptCard(prompt) {
|
|
|
38
38
|
<article class="card" id="${anchor}">
|
|
39
39
|
<div class="card-head">
|
|
40
40
|
<h3 class="card-title"><a href="#${anchor}">${prompt.name}</a></h3>
|
|
41
|
-
${source}
|
|
42
41
|
</div>
|
|
43
42
|
<p class="card-desc">${prompt.description}</p>
|
|
44
43
|
${argsList}
|
|
44
|
+
${source ? html `<footer class="card-foot">${source}</footer>` : html ``}
|
|
45
45
|
</article>
|
|
46
46
|
`;
|
|
47
47
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"prompts.js","sourceRoot":"","sources":["../../../../../../src/mcp-server/transports/http/landing-page/sections/prompts.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAGH,OAAO,EAAE,IAAI,EAAiB,MAAM,4BAA4B,CAAC;AAEjE,OAAO,EAAE,oBAAoB,EAAE,MAAM,kBAAkB,CAAC;AAExD,MAAM,UAAU,oBAAoB,CAAC,OAAyB;IAC5D,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,IAAI,CAAA,EAAE,CAAC;IACxC,OAAO,IAAI,CAAA;;QAEL,oBAAoB,CAAC,iBAAiB,EAAE,SAAS,EAAE,OAAO,CAAC,MAAM,CAAC;+BAC3C,OAAO,CAAC,GAAG,CAAC,gBAAgB,CAAC;;GAEzD,CAAC;AACJ,CAAC;AAED,SAAS,gBAAgB,CAAC,MAAsB;IAC9C,MAAM,MAAM,GAAG,UAAU,MAAM,CAAC,IAAI,EAAE,CAAC;IACvC,MAAM,MAAM,GAAG,MAAM,CAAC,SAAS;QAC7B,CAAC,CAAC,IAAI,CAAA,gCAAgC,MAAM,CAAC,SAAS,oCAAoC;QAC1F,CAAC,CAAC,IAAI,CAAA,EAAE,CAAC;IAEX,MAAM,QAAQ,GACZ,MAAM,CAAC,IAAI,CAAC,MAAM,GAAG,CAAC;QACpB,CAAC,CAAC,IAAI,CAAA;;YAEA,MAAM,CAAC,IAAI,CAAC,GAAG,CACf,CAAC,GAAG,EAAE,EAAE,CAAC,IAAI,CAAA;;wBAED,GAAG,CAAC,IAAI,UACd,GAAG,CAAC,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAA,6CAA6C,CAAC,CAAC,CAAC,IAAI,CAAA,EACzE;kBACE,GAAG,CAAC,WAAW,CAAC,CAAC,CAAC,IAAI,CAAA,MAAM,GAAG,CAAC,WAAW,EAAE,CAAC,CAAC,CAAC,IAAI,CAAA,EAAE;;aAE3D,CACF;;OAEJ;QACD,CAAC,CAAC,IAAI,CAAA,EAAE,CAAC;IAEb,OAAO,IAAI,CAAA;gCACmB,MAAM;;2CAEK,MAAM,KAAK,MAAM,CAAC,IAAI
|
|
1
|
+
{"version":3,"file":"prompts.js","sourceRoot":"","sources":["../../../../../../src/mcp-server/transports/http/landing-page/sections/prompts.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAGH,OAAO,EAAE,IAAI,EAAiB,MAAM,4BAA4B,CAAC;AAEjE,OAAO,EAAE,oBAAoB,EAAE,MAAM,kBAAkB,CAAC;AAExD,MAAM,UAAU,oBAAoB,CAAC,OAAyB;IAC5D,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,IAAI,CAAA,EAAE,CAAC;IACxC,OAAO,IAAI,CAAA;;QAEL,oBAAoB,CAAC,iBAAiB,EAAE,SAAS,EAAE,OAAO,CAAC,MAAM,CAAC;+BAC3C,OAAO,CAAC,GAAG,CAAC,gBAAgB,CAAC;;GAEzD,CAAC;AACJ,CAAC;AAED,SAAS,gBAAgB,CAAC,MAAsB;IAC9C,MAAM,MAAM,GAAG,UAAU,MAAM,CAAC,IAAI,EAAE,CAAC;IACvC,MAAM,MAAM,GAAG,MAAM,CAAC,SAAS;QAC7B,CAAC,CAAC,IAAI,CAAA,gCAAgC,MAAM,CAAC,SAAS,oCAAoC;QAC1F,CAAC,CAAC,IAAI,CAAA,EAAE,CAAC;IAEX,MAAM,QAAQ,GACZ,MAAM,CAAC,IAAI,CAAC,MAAM,GAAG,CAAC;QACpB,CAAC,CAAC,IAAI,CAAA;;YAEA,MAAM,CAAC,IAAI,CAAC,GAAG,CACf,CAAC,GAAG,EAAE,EAAE,CAAC,IAAI,CAAA;;wBAED,GAAG,CAAC,IAAI,UACd,GAAG,CAAC,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAA,6CAA6C,CAAC,CAAC,CAAC,IAAI,CAAA,EACzE;kBACE,GAAG,CAAC,WAAW,CAAC,CAAC,CAAC,IAAI,CAAA,MAAM,GAAG,CAAC,WAAW,EAAE,CAAC,CAAC,CAAC,IAAI,CAAA,EAAE;;aAE3D,CACF;;OAEJ;QACD,CAAC,CAAC,IAAI,CAAA,EAAE,CAAC;IAEb,OAAO,IAAI,CAAA;gCACmB,MAAM;;2CAEK,MAAM,KAAK,MAAM,CAAC,IAAI;;6BAEpC,MAAM,CAAC,WAAW;QACvC,QAAQ;QACR,MAAM,CAAC,CAAC,CAAC,IAAI,CAAA,6BAA6B,MAAM,WAAW,CAAC,CAAC,CAAC,IAAI,CAAA,EAAE;;GAEzE,CAAC;AACJ,CAAC"}
|