agent-discover 1.0.11 → 1.0.13

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.
@@ -2,7 +2,7 @@
2
2
  "id": "agent-discover",
3
3
  "name": "Discover",
4
4
  "icon": "explore",
5
- "version": "1.0.9",
5
+ "version": "1.0.13",
6
6
  "description": "MCP server registry — browse, install, configure, monitor",
7
7
  "ui": "./dist/ui/app.js",
8
8
  "css": "./dist/ui/styles.css",
package/dist/ui/app.js CHANGED
@@ -97,17 +97,23 @@
97
97
  function initTheme() {
98
98
  var toggle = AD._root.getElementById('theme-toggle');
99
99
  var saved = localStorage.getItem('agent-discover-theme');
100
- if (saved === 'light') {
101
- document.body.className = 'theme-light';
102
- } else if (saved === 'dark') {
103
- document.body.className = 'theme-dark';
100
+ if (saved === 'dark') {
101
+ document.documentElement.setAttribute('data-theme', 'dark');
102
+ } else if (saved === 'light') {
103
+ document.documentElement.removeAttribute('data-theme');
104
104
  }
105
- updateThemeIcon(document.body.classList.contains('theme-light') ? 'light' : 'dark');
105
+ var currentTheme =
106
+ document.documentElement.getAttribute('data-theme') === 'dark' ? 'dark' : 'light';
107
+ updateThemeIcon(currentTheme);
106
108
 
107
109
  toggle.addEventListener('click', function () {
108
- var isDark = document.body.classList.contains('theme-dark');
110
+ var isDark = document.documentElement.getAttribute('data-theme') === 'dark';
109
111
  var next = isDark ? 'light' : 'dark';
110
- document.body.className = 'theme-' + next;
112
+ if (next === 'dark') {
113
+ document.documentElement.setAttribute('data-theme', 'dark');
114
+ } else {
115
+ document.documentElement.removeAttribute('data-theme');
116
+ }
111
117
  localStorage.setItem('agent-discover-theme', next);
112
118
  updateThemeIcon(next);
113
119
  // Reverse sync — notify agent-desk shell
@@ -304,7 +310,7 @@
304
310
  })
305
311
  .join('');
306
312
 
307
- morphdom(el, '<div id="installed-list" class="server-grid">' + html + '</div>');
313
+ morph(el, html);
308
314
  }
309
315
 
310
316
  // -------------------------------------------------------------------------
@@ -396,7 +402,7 @@
396
402
  if (!cached) return '<div class="loading">Loading...</div>';
397
403
 
398
404
  if (!cached.length)
399
- return '<div style="font-size:12px;color:var(--text-tertiary)">No metrics data yet</div>';
405
+ return '<div style="font-size:12px;color:var(--text-dim)">No metrics data yet</div>';
400
406
 
401
407
  var rows = cached
402
408
  .map(function (m) {
@@ -439,19 +445,19 @@
439
445
  '<input type="text" id="cfg-desc-' +
440
446
  server.id +
441
447
  '" value="' +
442
- esc(server.description || '').replace(/"/g, '&quot;') +
448
+ escAttr(server.description || '') +
443
449
  '" /></div>' +
444
450
  '<div class="config-field"><label>Command</label>' +
445
451
  '<input type="text" id="cfg-cmd-' +
446
452
  server.id +
447
453
  '" value="' +
448
- esc(server.command || '').replace(/"/g, '&quot;') +
454
+ escAttr(server.command || '') +
449
455
  '" /></div>' +
450
456
  '<div class="config-field"><label>Args (comma-separated)</label>' +
451
457
  '<input type="text" id="cfg-args-' +
452
458
  server.id +
453
459
  '" value="' +
454
- esc((server.args || []).join(', ')).replace(/"/g, '&quot;') +
460
+ escAttr((server.args || []).join(', ')) +
455
461
  '" /></div>' +
456
462
  '<div class="config-field"><label>Env vars (KEY=VALUE per line)</label>' +
457
463
  '<textarea id="cfg-env-' +
@@ -570,15 +576,26 @@
570
576
  })
571
577
  .join('');
572
578
 
573
- morphdom(el, '<div id="browse-list" class="server-grid">' + html + '</div>');
579
+ morph(el, html);
574
580
  }
575
581
 
576
582
  function esc(str) {
583
+ if (str === null || str === undefined) return '';
577
584
  var div = document.createElement('div');
578
- div.appendChild(document.createTextNode(str));
585
+ div.textContent = String(str);
579
586
  return div.innerHTML;
580
587
  }
581
588
 
589
+ function escAttr(str) {
590
+ return esc(str).replace(/"/g, '&quot;');
591
+ }
592
+
593
+ function morph(el, newInnerHTML) {
594
+ var wrap = document.createElement(el.tagName);
595
+ wrap.innerHTML = newInnerHTML;
596
+ morphdom(el, wrap, { childrenOnly: true });
597
+ }
598
+
582
599
  // -------------------------------------------------------------------------
583
600
  // Server actions
584
601
  // -------------------------------------------------------------------------
@@ -963,33 +980,26 @@
963
980
  initThemeSync();
964
981
  }
965
982
 
966
- var _params = new URLSearchParams(location.search);
967
- if (_params.get('baseUrl')) AD._baseUrl = _params.get('baseUrl');
968
- if (_params.get('wsUrl')) AD._wsUrl = _params.get('wsUrl');
969
-
970
- if (document.readyState === 'loading') {
971
- document.addEventListener('DOMContentLoaded', _init);
972
- } else {
973
- _init();
974
- }
975
-
976
983
  // -------------------------------------------------------------------------
977
984
  // Theme sync from parent (agent-desk) via executeJavaScript
978
985
  // -------------------------------------------------------------------------
979
986
 
980
987
  function initThemeSync() {
981
- // Detect external theme injection via MutationObserver on body class
988
+ // Detect external theme injection via MutationObserver on data-theme attribute
982
989
  var observer = new MutationObserver(function (mutations) {
983
990
  mutations.forEach(function (m) {
984
- if (m.attributeName === 'class') {
985
- var isDark = document.body.classList.contains('theme-dark');
991
+ if (m.attributeName === 'data-theme') {
992
+ var isDark = document.documentElement.getAttribute('data-theme') === 'dark';
986
993
  var theme = isDark ? 'dark' : 'light';
987
994
  localStorage.setItem('agent-discover-theme', theme);
988
995
  updateThemeIcon(theme);
989
996
  }
990
997
  });
991
998
  });
992
- observer.observe(document.body, { attributes: true, attributeFilter: ['class'] });
999
+ observer.observe(document.documentElement, {
1000
+ attributes: true,
1001
+ attributeFilter: ['data-theme'],
1002
+ });
993
1003
 
994
1004
  // Listen for postMessage theme sync (same pattern as agent-comm)
995
1005
  window.addEventListener('message', function (event) {
@@ -1075,9 +1085,6 @@
1075
1085
  '0px 1px 3px 0px rgba(0,0,0,0.3), 0px 4px 8px 3px rgba(0,0,0,0.15)',
1076
1086
  );
1077
1087
  }
1078
- root.style.setProperty('--shadow-sm', 'var(--shadow-1)');
1079
- root.style.setProperty('--shadow-md', 'var(--shadow-2)');
1080
- root.style.setProperty('--shadow-hover', 'var(--shadow-3)');
1081
1088
  }
1082
1089
 
1083
1090
  if (colors.isDark !== undefined) {
@@ -1128,7 +1135,8 @@
1128
1135
 
1129
1136
  if (typeof AD._template === 'function') {
1130
1137
  var wrapper = document.createElement('div');
1131
- wrapper.className = 'theme-dark ad-wrapper';
1138
+ wrapper.setAttribute('data-theme', 'dark');
1139
+ wrapper.className = 'ad-wrapper';
1132
1140
  wrapper.innerHTML = AD._template();
1133
1141
  shadow.appendChild(wrapper);
1134
1142
  }
@@ -1145,4 +1153,18 @@
1145
1153
  }
1146
1154
  AD._root = document;
1147
1155
  };
1156
+
1157
+ var _params = new URLSearchParams(location.search);
1158
+ if (_params.get('baseUrl')) AD._baseUrl = _params.get('baseUrl');
1159
+ if (_params.get('wsUrl')) AD._wsUrl = _params.get('wsUrl');
1160
+
1161
+ try {
1162
+ if (document.readyState === 'loading') {
1163
+ document.addEventListener('DOMContentLoaded', _init);
1164
+ } else {
1165
+ _init();
1166
+ }
1167
+ } catch (e) {
1168
+ // standalone init may fail in file:// context (no WS host) — plugin mode uses mount()
1169
+ }
1148
1170
  })();
@@ -1,5 +1,5 @@
1
1
  <!doctype html>
2
- <html lang="en">
2
+ <html lang="en" data-theme="dark">
3
3
  <head>
4
4
  <meta charset="UTF-8" />
5
5
  <meta name="viewport" content="width=device-width, initial-scale=1.0" />
@@ -21,7 +21,7 @@
21
21
  />
22
22
  <link rel="stylesheet" href="styles.css" />
23
23
  </head>
24
- <body class="theme-dark">
24
+ <body>
25
25
  <div class="layout">
26
26
  <aside class="sidebar">
27
27
  <div class="sidebar-header">
@@ -6,32 +6,68 @@
6
6
  :root {
7
7
  --accent: #5d8da8;
8
8
  --accent-hover: #4e7d96;
9
- --accent-light: rgba(93, 141, 168, 0.12);
9
+ --accent-dim: rgba(93, 141, 168, 0.12);
10
10
 
11
- --font-ui: 'Inter', system-ui, -apple-system, sans-serif;
11
+ --font-sans: 'Inter', system-ui, -apple-system, sans-serif;
12
12
  --font-mono: 'JetBrains Mono', 'Fira Code', monospace;
13
13
 
14
14
  --radius-sm: 8px;
15
- --radius-md: 12px;
15
+ --radius: 12px;
16
16
  --radius-lg: 16px;
17
17
 
18
- --shadow-sm: 0 1px 3px rgba(0, 0, 0, 0.08);
19
- --shadow-md: 0 2px 8px rgba(0, 0, 0, 0.12);
18
+ --shadow-1: 0 1px 3px rgba(0, 0, 0, 0.08);
19
+ --shadow-2: 0 2px 8px rgba(0, 0, 0, 0.12);
20
+ --shadow-3: 0 4px 16px rgba(0, 0, 0, 0.16);
21
+
22
+ --focus-ring: rgba(93, 141, 168, 0.4);
23
+
24
+ /* Status colors */
25
+ --green: #4caf50;
26
+ --green-dim: rgba(76, 175, 80, 0.15);
27
+ --yellow: #ffb300;
28
+ --yellow-dim: rgba(255, 179, 0, 0.15);
29
+ --orange: #ff9800;
30
+ --orange-dim: rgba(255, 152, 0, 0.15);
31
+ --red: #f44336;
32
+ --red-dim: rgba(244, 67, 54, 0.15);
33
+ --purple: #ab47bc;
34
+ --purple-dim: rgba(171, 71, 188, 0.15);
35
+ --blue: #42a5f5;
36
+ --blue-dim: rgba(66, 165, 245, 0.15);
37
+
38
+ /* Light theme as default */
39
+ --bg: #f5f5f5;
40
+ --bg-surface: #fff;
41
+ --bg-elevated: #f9f9f9;
42
+ --bg-hover: #eee;
43
+ --text: #1a1a1a;
44
+ --text-muted: #666;
45
+ --text-dim: #999;
46
+ --border: #e0e0e0;
47
+ --border-light: #f0f0f0;
48
+ --badge-bg: rgba(93, 141, 168, 0.15);
49
+ --badge-text: #3d6d88;
50
+ --status-active: #2e7d32;
51
+ --status-inactive: #999;
52
+ --tag-bg: rgba(0, 0, 0, 0.06);
53
+ --tag-text: #666;
54
+ --scrollbar-thumb: #ccc;
20
55
  }
21
56
 
22
57
  /* ---------------------------------------------------------------------------
23
58
  Theme tokens
24
59
  --------------------------------------------------------------------------- */
25
60
 
26
- .theme-dark {
61
+ [data-theme='dark'] {
27
62
  --bg: #121212;
28
63
  --bg-surface: #1e1e1e;
29
64
  --bg-elevated: #2a2a2a;
30
65
  --bg-hover: #333;
31
66
  --text: #e0e0e0;
32
- --text-secondary: #999;
33
- --text-tertiary: #666;
67
+ --text-muted: #999;
68
+ --text-dim: #666;
34
69
  --border: #333;
70
+ --border-light: #2a2a2a;
35
71
  --badge-bg: rgba(93, 141, 168, 0.2);
36
72
  --badge-text: #7ab4d0;
37
73
  --status-active: #4caf50;
@@ -41,24 +77,6 @@
41
77
  --scrollbar-thumb: #444;
42
78
  }
43
79
 
44
- .theme-light {
45
- --bg: #f5f5f5;
46
- --bg-surface: #fff;
47
- --bg-elevated: #f9f9f9;
48
- --bg-hover: #eee;
49
- --text: #1a1a1a;
50
- --text-secondary: #666;
51
- --text-tertiary: #999;
52
- --border: #e0e0e0;
53
- --badge-bg: rgba(93, 141, 168, 0.15);
54
- --badge-text: #3d6d88;
55
- --status-active: #2e7d32;
56
- --status-inactive: #999;
57
- --tag-bg: rgba(0, 0, 0, 0.06);
58
- --tag-text: #666;
59
- --scrollbar-thumb: #ccc;
60
- }
61
-
62
80
  /* ---------------------------------------------------------------------------
63
81
  Reset & base
64
82
  --------------------------------------------------------------------------- */
@@ -72,7 +90,7 @@
72
90
  }
73
91
 
74
92
  body {
75
- font-family: var(--font-ui);
93
+ font-family: var(--font-sans);
76
94
  background: var(--bg);
77
95
  color: var(--text);
78
96
  line-height: 1.5;
@@ -118,7 +136,7 @@ body {
118
136
 
119
137
  .sidebar-version {
120
138
  font-size: 12px;
121
- color: var(--text-secondary);
139
+ color: var(--text-muted);
122
140
  font-family: var(--font-mono);
123
141
  }
124
142
 
@@ -137,8 +155,8 @@ body {
137
155
  padding: 10px 12px;
138
156
  border: none;
139
157
  background: transparent;
140
- color: var(--text-secondary);
141
- font-family: var(--font-ui);
158
+ color: var(--text-muted);
159
+ font-family: var(--font-sans);
142
160
  font-size: 14px;
143
161
  font-weight: 500;
144
162
  border-radius: var(--radius-sm);
@@ -152,7 +170,7 @@ body {
152
170
  }
153
171
 
154
172
  .nav-item.active {
155
- background: var(--accent-light);
173
+ background: var(--accent-dim);
156
174
  color: var(--accent);
157
175
  }
158
176
 
@@ -182,7 +200,7 @@ body {
182
200
  .connection-status {
183
201
  font-size: 11px;
184
202
  font-family: var(--font-mono);
185
- color: var(--text-secondary);
203
+ color: var(--text-muted);
186
204
  display: flex;
187
205
  align-items: center;
188
206
  gap: 6px;
@@ -192,7 +210,7 @@ body {
192
210
  width: 6px;
193
211
  height: 6px;
194
212
  border-radius: 50%;
195
- background: var(--text-secondary);
213
+ background: var(--text-muted);
196
214
  }
197
215
 
198
216
  .connection-status.connected {
@@ -219,7 +237,7 @@ body {
219
237
  height: 36px;
220
238
  border: none;
221
239
  background: var(--bg-hover);
222
- color: var(--text-secondary);
240
+ color: var(--text-muted);
223
241
  border-radius: var(--radius-sm);
224
242
  cursor: pointer;
225
243
  transition: all 0.15s;
@@ -269,7 +287,7 @@ body {
269
287
  font-weight: 600;
270
288
  text-transform: uppercase;
271
289
  letter-spacing: 0.5px;
272
- color: var(--text-secondary);
290
+ color: var(--text-muted);
273
291
  }
274
292
 
275
293
  /* ---------------------------------------------------------------------------
@@ -290,7 +308,7 @@ body {
290
308
 
291
309
  .search-bar .material-symbols-outlined {
292
310
  font-size: 20px;
293
- color: var(--text-tertiary);
311
+ color: var(--text-dim);
294
312
  }
295
313
 
296
314
  .search-bar input {
@@ -299,12 +317,12 @@ body {
299
317
  border: none;
300
318
  outline: none;
301
319
  color: var(--text);
302
- font-family: var(--font-ui);
320
+ font-family: var(--font-sans);
303
321
  font-size: 14px;
304
322
  }
305
323
 
306
324
  .search-bar input::placeholder {
307
- color: var(--text-tertiary);
325
+ color: var(--text-dim);
308
326
  }
309
327
 
310
328
  /* ---------------------------------------------------------------------------
@@ -320,7 +338,7 @@ body {
320
338
  .server-card {
321
339
  background: var(--bg-surface);
322
340
  border: 1px solid var(--border);
323
- border-radius: var(--radius-md);
341
+ border-radius: var(--radius);
324
342
  padding: 16px;
325
343
  transition: border-color 0.15s;
326
344
  }
@@ -370,7 +388,7 @@ body {
370
388
 
371
389
  .server-description {
372
390
  font-size: 13px;
373
- color: var(--text-secondary);
391
+ color: var(--text-muted);
374
392
  margin-bottom: 10px;
375
393
  line-height: 1.4;
376
394
  }
@@ -396,7 +414,7 @@ body {
396
414
  align-items: center;
397
415
  gap: 12px;
398
416
  font-size: 12px;
399
- color: var(--text-tertiary);
417
+ color: var(--text-dim);
400
418
  }
401
419
 
402
420
  .server-meta .material-symbols-outlined {
@@ -414,7 +432,7 @@ body {
414
432
  font-weight: 600;
415
433
  text-transform: uppercase;
416
434
  letter-spacing: 0.5px;
417
- color: var(--text-tertiary);
435
+ color: var(--text-dim);
418
436
  margin-bottom: 6px;
419
437
  }
420
438
 
@@ -444,7 +462,7 @@ body {
444
462
 
445
463
  .tool-desc {
446
464
  font-size: 12px;
447
- color: var(--text-secondary);
465
+ color: var(--text-muted);
448
466
  line-height: 1.5;
449
467
  padding: 6px 0;
450
468
  border-bottom: 1px solid var(--border);
@@ -464,7 +482,7 @@ body {
464
482
  align-items: center;
465
483
  justify-content: center;
466
484
  padding: 60px 20px;
467
- color: var(--text-tertiary);
485
+ color: var(--text-dim);
468
486
  grid-column: 1 / -1;
469
487
  }
470
488
 
@@ -532,7 +550,7 @@ body {
532
550
  padding: 6px 14px;
533
551
  border: none;
534
552
  border-radius: var(--radius-sm);
535
- font-family: var(--font-ui);
553
+ font-family: var(--font-sans);
536
554
  font-size: 12px;
537
555
  font-weight: 500;
538
556
  cursor: pointer;
@@ -570,7 +588,7 @@ body {
570
588
  align-items: center;
571
589
  justify-content: center;
572
590
  padding: 40px;
573
- color: var(--text-tertiary);
591
+ color: var(--text-dim);
574
592
  font-size: 14px;
575
593
  grid-column: 1 / -1;
576
594
  }
@@ -587,7 +605,7 @@ body {
587
605
  border-radius: 6px;
588
606
  cursor: pointer;
589
607
  font-size: 12px;
590
- font-family: var(--font-ui);
608
+ font-family: var(--font-sans);
591
609
  font-weight: 500;
592
610
  display: flex;
593
611
  align-items: center;
@@ -612,13 +630,13 @@ body {
612
630
  }
613
631
 
614
632
  .btn-installed {
615
- color: var(--text-secondary);
633
+ color: var(--text-muted);
616
634
  border-color: var(--border);
617
635
  }
618
636
 
619
637
  .btn-installed:hover {
620
638
  background: transparent;
621
- color: var(--text-secondary);
639
+ color: var(--text-muted);
622
640
  }
623
641
 
624
642
  /* ---------------------------------------------------------------------------
@@ -641,7 +659,7 @@ body {
641
659
  border-radius: 6px;
642
660
  cursor: pointer;
643
661
  font-size: 12px;
644
- font-family: var(--font-ui);
662
+ font-family: var(--font-sans);
645
663
  font-weight: 500;
646
664
  display: flex;
647
665
  align-items: center;
@@ -662,7 +680,7 @@ body {
662
680
  border-radius: 6px;
663
681
  cursor: pointer;
664
682
  font-size: 12px;
665
- font-family: var(--font-ui);
683
+ font-family: var(--font-sans);
666
684
  font-weight: 500;
667
685
  display: flex;
668
686
  align-items: center;
@@ -677,13 +695,13 @@ body {
677
695
 
678
696
  .btn-delete {
679
697
  border: 1px solid var(--border);
680
- color: var(--text-tertiary);
698
+ color: var(--text-dim);
681
699
  background: transparent;
682
700
  padding: 4px 12px;
683
701
  border-radius: 6px;
684
702
  cursor: pointer;
685
703
  font-size: 12px;
686
- font-family: var(--font-ui);
704
+ font-family: var(--font-sans);
687
705
  font-weight: 500;
688
706
  display: flex;
689
707
  align-items: center;
@@ -736,13 +754,13 @@ body {
736
754
 
737
755
  .btn-health {
738
756
  border: 1px solid var(--border);
739
- color: var(--text-tertiary);
757
+ color: var(--text-dim);
740
758
  background: transparent;
741
759
  padding: 4px 8px;
742
760
  border-radius: 6px;
743
761
  cursor: pointer;
744
762
  font-size: 12px;
745
- font-family: var(--font-ui);
763
+ font-family: var(--font-sans);
746
764
  font-weight: 500;
747
765
  display: flex;
748
766
  align-items: center;
@@ -771,14 +789,14 @@ body {
771
789
  font-weight: 600;
772
790
  text-transform: uppercase;
773
791
  letter-spacing: 0.5px;
774
- color: var(--text-secondary);
792
+ color: var(--text-muted);
775
793
  display: flex;
776
794
  align-items: center;
777
795
  gap: 4px;
778
796
  background: none;
779
797
  border: none;
780
798
  padding: 0;
781
- font-family: var(--font-ui);
799
+ font-family: var(--font-sans);
782
800
  }
783
801
 
784
802
  .section-toggle .material-symbols-outlined {
@@ -817,14 +835,14 @@ body {
817
835
  }
818
836
 
819
837
  .secret-value {
820
- color: var(--text-secondary);
838
+ color: var(--text-muted);
821
839
  font-family: var(--font-mono);
822
840
  }
823
841
 
824
842
  .secret-delete {
825
843
  background: none;
826
844
  border: none;
827
- color: var(--text-tertiary);
845
+ color: var(--text-dim);
828
846
  cursor: pointer;
829
847
  padding: 2px;
830
848
  display: flex;
@@ -860,7 +878,7 @@ body {
860
878
  padding: 4px 10px;
861
879
  font-size: 12px;
862
880
  cursor: pointer;
863
- font-family: var(--font-ui);
881
+ font-family: var(--font-sans);
864
882
  }
865
883
 
866
884
  /* ---------------------------------------------------------------------------
@@ -875,7 +893,7 @@ body {
875
893
 
876
894
  .metrics-table th {
877
895
  text-align: left;
878
- color: var(--text-secondary);
896
+ color: var(--text-muted);
879
897
  font-weight: 500;
880
898
  padding: 4px 8px;
881
899
  border-bottom: 1px solid var(--border);
@@ -905,7 +923,7 @@ body {
905
923
  .config-field label {
906
924
  font-size: 11px;
907
925
  font-weight: 500;
908
- color: var(--text-secondary);
926
+ color: var(--text-muted);
909
927
  text-transform: uppercase;
910
928
  letter-spacing: 0.3px;
911
929
  }
@@ -935,7 +953,7 @@ body {
935
953
  padding: 6px 14px;
936
954
  font-size: 12px;
937
955
  cursor: pointer;
938
- font-family: var(--font-ui);
956
+ font-family: var(--font-sans);
939
957
  font-weight: 500;
940
958
  }
941
959
 
@@ -957,7 +975,7 @@ body {
957
975
  padding: 10px 16px;
958
976
  font-size: 13px;
959
977
  color: var(--text);
960
- box-shadow: var(--shadow-md);
978
+ box-shadow: var(--shadow-2);
961
979
  z-index: 1000;
962
980
  animation: toast-in 0.2s ease-out;
963
981
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "agent-discover",
3
- "version": "1.0.11",
3
+ "version": "1.0.13",
4
4
  "mcpName": "io.github.keshrath/agent-discover",
5
5
  "description": "MCP server registry and marketplace — discover, install, activate, and manage MCP tools on demand",
6
6
  "type": "module",