apteva 0.4.41 → 0.4.44
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/ActivityPage.c48n83h2.js +3 -0
- package/dist/ApiDocsPage.yzcxx5ax.js +4 -0
- package/dist/App.09yb8t0b.js +1 -0
- package/dist/App.152mbs1r.js +4 -0
- package/dist/App.3a67nx9w.js +4 -0
- package/dist/App.9epx6785.js +4 -0
- package/dist/App.d8955awp.js +4 -0
- package/dist/App.drwb57jq.js +4 -0
- package/dist/App.gssbmajb.js +4 -0
- package/dist/App.qw70pc29.js +53 -0
- package/dist/{App.7fb3e7mp.js → App.qzbx5wtj.js} +1 -1
- package/dist/App.r5serxkt.js +8 -0
- package/dist/App.tpmp9020.js +20 -0
- package/dist/App.v2wb4d7d.js +61 -0
- package/dist/App.vxmaaj0m.js +13 -0
- package/dist/App.w4p2tda9.js +4 -0
- package/dist/App.wv2ng55q.js +221 -0
- package/dist/App.yncnrn0f.js +4 -0
- package/dist/ConnectionsPage.k6cspyqq.js +3 -0
- package/dist/McpPage.cdxm48xj.js +3 -0
- package/dist/SettingsPage.evpv7c2y.js +3 -0
- package/dist/SkillsPage.pvzp6c1a.js +3 -0
- package/dist/TasksPage.6jnvbpsy.js +3 -0
- package/dist/TelemetryPage.t7vk24zc.js +3 -0
- package/dist/TestsPage.5x6658aa.js +3 -0
- package/dist/ThreadsPage.3fvhtevh.js +3 -0
- package/dist/apteva-kit.css +1 -1
- package/dist/index.html +1 -1
- package/dist/styles.css +1 -1
- package/package.json +8 -8
- package/src/db.ts +19 -9
- package/src/integrations/agentdojo.ts +1 -0
- package/src/mcp-platform.ts +418 -63
- package/src/openapi.ts +96 -0
- package/src/providers.ts +50 -24
- package/src/routes/api/agent-utils.ts +0 -1
- package/src/routes/api/agents.ts +19 -1
- package/src/routes/api/meta-agent.ts +2 -0
- package/src/routes/api/system.ts +90 -1
- package/src/routes/api/telemetry.ts +19 -1
- package/src/routes/share.ts +85 -0
- package/src/server.ts +12 -0
- package/src/web/App.tsx +89 -11
- package/src/web/components/activity/ActivityPage.tsx +14 -14
- package/src/web/components/agents/AgentCard.tsx +14 -14
- package/src/web/components/agents/AgentPanel.tsx +358 -198
- package/src/web/components/agents/AgentsView.tsx +4 -4
- package/src/web/components/agents/CreateAgentModal.tsx +21 -79
- package/src/web/components/api/ApiDocsPage.tsx +66 -66
- package/src/web/components/auth/CreateAccountStep.tsx +16 -16
- package/src/web/components/auth/LoginPage.tsx +10 -10
- package/src/web/components/common/LoadingSpinner.tsx +2 -2
- package/src/web/components/common/Modal.tsx +8 -8
- package/src/web/components/common/Select.tsx +9 -9
- package/src/web/components/connections/ConnectionsPage.tsx +4 -4
- package/src/web/components/connections/IntegrationsTab.tsx +18 -18
- package/src/web/components/connections/OverviewTab.tsx +13 -13
- package/src/web/components/connections/TriggersTab.tsx +99 -99
- package/src/web/components/dashboard/Dashboard.tsx +32 -32
- package/src/web/components/layout/Header.tsx +50 -34
- package/src/web/components/layout/Sidebar.tsx +34 -15
- package/src/web/components/mcp/IntegrationsPanel.tsx +40 -40
- package/src/web/components/mcp/McpPage.tsx +208 -208
- package/src/web/components/meta-agent/MetaAgent.tsx +12 -10
- package/src/web/components/onboarding/OnboardingWizard.tsx +25 -25
- package/src/web/components/settings/SettingsPage.tsx +258 -175
- package/src/web/components/skills/SkillsPage.tsx +88 -88
- package/src/web/components/tasks/TasksPage.tsx +339 -54
- package/src/web/components/telemetry/TelemetryPage.tsx +135 -64
- package/src/web/components/tests/TestsPage.tsx +50 -50
- package/src/web/components/threads/ThreadsPage.tsx +23 -21
- package/src/web/context/ProjectContext.tsx +6 -1
- package/src/web/context/ThemeContext.tsx +69 -0
- package/src/web/context/index.ts +2 -0
- package/src/web/styles.css +5 -3
- package/src/web/themes.ts +99 -0
- package/src/web/types.ts +0 -4
- package/dist/ActivityPage.7907h64p.js +0 -3
- package/dist/ApiDocsPage.k3jjenpq.js +0 -4
- package/dist/App.01nq20st.js +0 -4
- package/dist/App.1maqvamf.js +0 -4
- package/dist/App.2yjrh32f.js +0 -4
- package/dist/App.3qw8nben.js +0 -20
- package/dist/App.7sy3wq8c.js +0 -4
- package/dist/App.apjrmctz.js +0 -57
- package/dist/App.av6t2yhe.js +0 -4
- package/dist/App.jqj5a094.js +0 -46
- package/dist/App.mc7xf85h.js +0 -4
- package/dist/App.myxqcj9x.js +0 -4
- package/dist/App.nm91r1mp.js +0 -13
- package/dist/App.p02f4ret.js +0 -1
- package/dist/App.qcknavjz.js +0 -221
- package/dist/App.vc7vfhg4.js +0 -4
- package/dist/App.z4s9zkw5.js +0 -4
- package/dist/ConnectionsPage.z1pw5xe2.js +0 -3
- package/dist/McpPage.8vc97z0b.js +0 -3
- package/dist/SettingsPage.p61bz8kd.js +0 -3
- package/dist/SkillsPage.r9x43g3g.js +0 -3
- package/dist/TasksPage.1e0zkye4.js +0 -3
- package/dist/TelemetryPage.p9vbe4gf.js +0 -3
- package/dist/TestsPage.d4xy504e.js +0 -3
- package/dist/ThreadsPage.m016am3x.js +0 -3
|
@@ -141,14 +141,14 @@ export function McpPage() {
|
|
|
141
141
|
<div className="flex items-center justify-between mb-6">
|
|
142
142
|
<div>
|
|
143
143
|
<h1 className="text-2xl font-semibold mb-1">MCP Servers</h1>
|
|
144
|
-
<p className="text-[
|
|
144
|
+
<p className="text-[var(--color-text-muted)]">
|
|
145
145
|
Manage Model Context Protocol servers for tool integrations.
|
|
146
146
|
</p>
|
|
147
147
|
</div>
|
|
148
148
|
{activeTab === "servers" && (
|
|
149
149
|
<button
|
|
150
150
|
onClick={() => setShowAdd(true)}
|
|
151
|
-
className="bg-[
|
|
151
|
+
className="bg-[var(--color-accent)] hover:bg-[var(--color-accent-hover)] text-black px-4 py-2 rounded font-medium transition"
|
|
152
152
|
>
|
|
153
153
|
+ Add Server
|
|
154
154
|
</button>
|
|
@@ -156,13 +156,13 @@ export function McpPage() {
|
|
|
156
156
|
</div>
|
|
157
157
|
|
|
158
158
|
{/* Tabs */}
|
|
159
|
-
<div className="flex gap-1 mb-6 bg-[
|
|
159
|
+
<div className="flex gap-1 mb-6 bg-[var(--color-surface)] border border-[var(--color-border)] rounded-lg p-1 w-fit">
|
|
160
160
|
<button
|
|
161
161
|
onClick={() => setActiveTab("servers")}
|
|
162
162
|
className={`px-4 py-2 rounded text-sm font-medium transition ${
|
|
163
163
|
activeTab === "servers"
|
|
164
|
-
? "bg-[
|
|
165
|
-
: "text-[
|
|
164
|
+
? "bg-[var(--color-surface-raised)] text-white"
|
|
165
|
+
: "text-[var(--color-text-muted)] hover:text-[var(--color-text-secondary)]"
|
|
166
166
|
}`}
|
|
167
167
|
>
|
|
168
168
|
My Servers
|
|
@@ -171,8 +171,8 @@ export function McpPage() {
|
|
|
171
171
|
onClick={() => setActiveTab("hosted")}
|
|
172
172
|
className={`px-4 py-2 rounded text-sm font-medium transition ${
|
|
173
173
|
activeTab === "hosted"
|
|
174
|
-
? "bg-[
|
|
175
|
-
: "text-[
|
|
174
|
+
? "bg-[var(--color-surface-raised)] text-white"
|
|
175
|
+
: "text-[var(--color-text-muted)] hover:text-[var(--color-text-secondary)]"
|
|
176
176
|
}`}
|
|
177
177
|
>
|
|
178
178
|
Hosted Services
|
|
@@ -181,8 +181,8 @@ export function McpPage() {
|
|
|
181
181
|
onClick={() => setActiveTab("registry")}
|
|
182
182
|
className={`px-4 py-2 rounded text-sm font-medium transition ${
|
|
183
183
|
activeTab === "registry"
|
|
184
|
-
? "bg-[
|
|
185
|
-
: "text-[
|
|
184
|
+
? "bg-[var(--color-surface-raised)] text-white"
|
|
185
|
+
: "text-[var(--color-text-muted)] hover:text-[var(--color-text-secondary)]"
|
|
186
186
|
}`}
|
|
187
187
|
>
|
|
188
188
|
Browse Registry
|
|
@@ -194,28 +194,28 @@ export function McpPage() {
|
|
|
194
194
|
<>
|
|
195
195
|
{/* Loading */}
|
|
196
196
|
{loading && (
|
|
197
|
-
<div className="text-center py-8 text-[
|
|
197
|
+
<div className="text-center py-8 text-[var(--color-text-muted)]">Loading...</div>
|
|
198
198
|
)}
|
|
199
199
|
|
|
200
200
|
{/* Empty State */}
|
|
201
201
|
{!loading && filteredServers.length === 0 && servers.length === 0 && (
|
|
202
|
-
<div className="bg-[
|
|
203
|
-
<McpIcon className="w-12 h-12 text-[
|
|
202
|
+
<div className="bg-[var(--color-surface)] border border-[var(--color-border)] rounded-lg p-8 text-center">
|
|
203
|
+
<McpIcon className="w-12 h-12 text-[var(--color-border-light)] mx-auto mb-4" />
|
|
204
204
|
<h3 className="text-lg font-medium mb-2">No MCP servers configured</h3>
|
|
205
|
-
<p className="text-[
|
|
205
|
+
<p className="text-[var(--color-text-muted)] mb-6 max-w-md mx-auto">
|
|
206
206
|
MCP servers extend your agents with tools like file access, web browsing,
|
|
207
207
|
database connections, and more.
|
|
208
208
|
</p>
|
|
209
209
|
<div className="flex gap-3 justify-center">
|
|
210
210
|
<button
|
|
211
211
|
onClick={() => setShowAdd(true)}
|
|
212
|
-
className="bg-[
|
|
212
|
+
className="bg-[var(--color-accent)] hover:bg-[var(--color-accent-hover)] text-black px-4 py-2 rounded font-medium transition"
|
|
213
213
|
>
|
|
214
214
|
Add Manually
|
|
215
215
|
</button>
|
|
216
216
|
<button
|
|
217
217
|
onClick={() => setActiveTab("registry")}
|
|
218
|
-
className="border border-[
|
|
218
|
+
className="border border-[var(--color-border-light)] hover:border-[var(--color-text-muted)] px-4 py-2 rounded font-medium transition"
|
|
219
219
|
>
|
|
220
220
|
Browse Registry
|
|
221
221
|
</button>
|
|
@@ -225,8 +225,8 @@ export function McpPage() {
|
|
|
225
225
|
|
|
226
226
|
{/* Empty filter state */}
|
|
227
227
|
{!loading && filteredServers.length === 0 && servers.length > 0 && (
|
|
228
|
-
<div className="bg-[
|
|
229
|
-
<p className="text-[
|
|
228
|
+
<div className="bg-[var(--color-surface)] border border-[var(--color-border)] rounded-lg p-6 text-center">
|
|
229
|
+
<p className="text-[var(--color-text-muted)]">No servers match this filter.</p>
|
|
230
230
|
</div>
|
|
231
231
|
)}
|
|
232
232
|
|
|
@@ -298,9 +298,9 @@ export function McpPage() {
|
|
|
298
298
|
|
|
299
299
|
{/* Info - only show on servers tab */}
|
|
300
300
|
{activeTab === "servers" && (
|
|
301
|
-
<div className="mt-8 p-4 bg-[
|
|
301
|
+
<div className="mt-8 p-4 bg-[var(--color-surface)] border border-[var(--color-border)] rounded-lg">
|
|
302
302
|
<h3 className="font-medium mb-2">Quick Start</h3>
|
|
303
|
-
<p className="text-sm text-[
|
|
303
|
+
<p className="text-sm text-[var(--color-text-muted)] mb-3">
|
|
304
304
|
Add an MCP server by providing its npm package name. For example:
|
|
305
305
|
</p>
|
|
306
306
|
<div className="flex flex-wrap gap-2">
|
|
@@ -309,7 +309,7 @@ export function McpPage() {
|
|
|
309
309
|
{ name: "fetch", pkg: "@modelcontextprotocol/server-fetch" },
|
|
310
310
|
{ name: "memory", pkg: "@modelcontextprotocol/server-memory" },
|
|
311
311
|
].map(s => (
|
|
312
|
-
<code key={s.name} className="text-xs bg-[
|
|
312
|
+
<code key={s.name} className="text-xs bg-[var(--color-bg)] px-2 py-1 rounded">
|
|
313
313
|
{s.pkg}
|
|
314
314
|
</code>
|
|
315
315
|
))}
|
|
@@ -396,7 +396,7 @@ function McpServerCard({
|
|
|
396
396
|
}
|
|
397
397
|
if (server.project_id === null) {
|
|
398
398
|
return (
|
|
399
|
-
<span className="text-xs text-[
|
|
399
|
+
<span className="text-xs text-[var(--color-text-muted)] bg-[var(--color-surface-raised)] px-1.5 py-0.5 rounded">
|
|
400
400
|
Global
|
|
401
401
|
</span>
|
|
402
402
|
);
|
|
@@ -406,28 +406,28 @@ function McpServerCard({
|
|
|
406
406
|
|
|
407
407
|
return (
|
|
408
408
|
<div
|
|
409
|
-
className={`bg-[
|
|
410
|
-
selected ? "border-[
|
|
409
|
+
className={`bg-[var(--color-surface)] border rounded-lg p-4 cursor-pointer transition ${
|
|
410
|
+
selected ? "border-[var(--color-accent)]" : "border-[var(--color-border)] hover:border-[var(--color-border-light)]"
|
|
411
411
|
}`}
|
|
412
412
|
onClick={isAvailable ? onSelect : undefined}
|
|
413
413
|
>
|
|
414
414
|
<div className="flex items-center justify-between">
|
|
415
415
|
<div className="flex items-center gap-3">
|
|
416
416
|
<div className={`w-2 h-2 rounded-full ${
|
|
417
|
-
isAvailable ? "bg-green-400" : "bg-[
|
|
417
|
+
isAvailable ? "bg-green-400" : "bg-[var(--color-scrollbar)]"
|
|
418
418
|
}`} />
|
|
419
419
|
<div>
|
|
420
420
|
<div className="flex items-center gap-2">
|
|
421
421
|
<h3 className="font-medium">{server.name}</h3>
|
|
422
422
|
{getScopeBadge()}
|
|
423
423
|
</div>
|
|
424
|
-
<p className="text-sm text-[
|
|
424
|
+
<p className="text-sm text-[var(--color-text-muted)]">{getServerInfo()}</p>
|
|
425
425
|
</div>
|
|
426
426
|
</div>
|
|
427
427
|
<div className="flex items-center gap-2">
|
|
428
428
|
<button
|
|
429
429
|
onClick={(e) => { e.stopPropagation(); onEdit(); }}
|
|
430
|
-
className="text-sm text-[
|
|
430
|
+
className="text-sm text-[var(--color-text-muted)] hover:text-[var(--color-text-secondary)] px-3 py-1 transition"
|
|
431
431
|
title="Edit server settings"
|
|
432
432
|
>
|
|
433
433
|
Edit
|
|
@@ -436,7 +436,7 @@ function McpServerCard({
|
|
|
436
436
|
// Remote servers: no start/stop, just delete
|
|
437
437
|
<button
|
|
438
438
|
onClick={(e) => { e.stopPropagation(); onDelete(); }}
|
|
439
|
-
className="text-sm text-[
|
|
439
|
+
className="text-sm text-[var(--color-text-muted)] hover:text-red-400 px-3 py-1 transition"
|
|
440
440
|
>
|
|
441
441
|
Remove
|
|
442
442
|
</button>
|
|
@@ -445,19 +445,19 @@ function McpServerCard({
|
|
|
445
445
|
<>
|
|
446
446
|
<button
|
|
447
447
|
onClick={(e) => { e.stopPropagation(); onSelect(); }}
|
|
448
|
-
className="text-sm text-[
|
|
448
|
+
className="text-sm text-[var(--color-accent)] hover:text-[var(--color-accent-hover)] px-3 py-1 transition"
|
|
449
449
|
>
|
|
450
450
|
Tools
|
|
451
451
|
</button>
|
|
452
452
|
<button
|
|
453
453
|
onClick={(e) => { e.stopPropagation(); onStop(); }}
|
|
454
|
-
className="text-sm text-[
|
|
454
|
+
className="text-sm text-[var(--color-text-muted)] hover:text-red-400 px-3 py-1 transition"
|
|
455
455
|
>
|
|
456
456
|
Stop
|
|
457
457
|
</button>
|
|
458
458
|
<button
|
|
459
459
|
onClick={(e) => { e.stopPropagation(); onDelete(); }}
|
|
460
|
-
className="text-sm text-[
|
|
460
|
+
className="text-sm text-[var(--color-text-muted)] hover:text-red-400 px-3 py-1 transition"
|
|
461
461
|
>
|
|
462
462
|
Delete
|
|
463
463
|
</button>
|
|
@@ -467,13 +467,13 @@ function McpServerCard({
|
|
|
467
467
|
<>
|
|
468
468
|
<button
|
|
469
469
|
onClick={(e) => { e.stopPropagation(); onStart(); }}
|
|
470
|
-
className="text-sm text-[
|
|
470
|
+
className="text-sm text-[var(--color-text-muted)] hover:text-green-400 px-3 py-1 transition"
|
|
471
471
|
>
|
|
472
472
|
Start
|
|
473
473
|
</button>
|
|
474
474
|
<button
|
|
475
475
|
onClick={(e) => { e.stopPropagation(); onDelete(); }}
|
|
476
|
-
className="text-sm text-[
|
|
476
|
+
className="text-sm text-[var(--color-text-muted)] hover:text-red-400 px-3 py-1 transition"
|
|
477
477
|
>
|
|
478
478
|
Delete
|
|
479
479
|
</button>
|
|
@@ -523,20 +523,20 @@ function ToolsPanel({
|
|
|
523
523
|
}, [server.id, authFetch]);
|
|
524
524
|
|
|
525
525
|
return (
|
|
526
|
-
<div className="bg-[
|
|
526
|
+
<div className="bg-[var(--color-surface)] border border-[var(--color-border)] rounded-lg overflow-hidden">
|
|
527
527
|
{/* Header */}
|
|
528
|
-
<div className="p-4 border-b border-[
|
|
528
|
+
<div className="p-4 border-b border-[var(--color-border)] flex items-center justify-between">
|
|
529
529
|
<div>
|
|
530
530
|
<h3 className="font-medium">{server.name} Tools</h3>
|
|
531
531
|
{serverInfo && (
|
|
532
|
-
<p className="text-xs text-[
|
|
532
|
+
<p className="text-xs text-[var(--color-text-muted)]">
|
|
533
533
|
{serverInfo.name} v{serverInfo.version}
|
|
534
534
|
</p>
|
|
535
535
|
)}
|
|
536
536
|
</div>
|
|
537
537
|
<button
|
|
538
538
|
onClick={onClose}
|
|
539
|
-
className="text-[
|
|
539
|
+
className="text-[var(--color-text-muted)] hover:text-[var(--color-text-secondary)] text-xl leading-none"
|
|
540
540
|
>
|
|
541
541
|
×
|
|
542
542
|
</button>
|
|
@@ -544,7 +544,7 @@ function ToolsPanel({
|
|
|
544
544
|
|
|
545
545
|
{/* Content */}
|
|
546
546
|
<div className="p-4 max-h-[500px] overflow-auto">
|
|
547
|
-
{loading && <p className="text-[
|
|
547
|
+
{loading && <p className="text-[var(--color-text-muted)]">Loading tools...</p>}
|
|
548
548
|
|
|
549
549
|
{error && (
|
|
550
550
|
<div className="text-red-400 text-sm p-3 bg-red-500/10 rounded">
|
|
@@ -553,7 +553,7 @@ function ToolsPanel({
|
|
|
553
553
|
)}
|
|
554
554
|
|
|
555
555
|
{!loading && !error && tools.length === 0 && (
|
|
556
|
-
<p className="text-[
|
|
556
|
+
<p className="text-[var(--color-text-muted)]">No tools available from this server.</p>
|
|
557
557
|
)}
|
|
558
558
|
|
|
559
559
|
{!loading && !error && tools.length > 0 && !selectedTool && (
|
|
@@ -562,11 +562,11 @@ function ToolsPanel({
|
|
|
562
562
|
<button
|
|
563
563
|
key={tool.name}
|
|
564
564
|
onClick={() => setSelectedTool(tool)}
|
|
565
|
-
className="w-full text-left p-3 bg-[
|
|
565
|
+
className="w-full text-left p-3 bg-[var(--color-bg)] hover:bg-[var(--color-surface-raised)] border border-[var(--color-border-light)] hover:border-[var(--color-border-light)] rounded transition"
|
|
566
566
|
>
|
|
567
567
|
<div className="font-medium text-sm">{tool.name}</div>
|
|
568
568
|
{tool.description && (
|
|
569
|
-
<div className="text-xs text-[
|
|
569
|
+
<div className="text-xs text-[var(--color-text-muted)] mt-1">{tool.description}</div>
|
|
570
570
|
)}
|
|
571
571
|
</button>
|
|
572
572
|
))}
|
|
@@ -658,25 +658,25 @@ function ToolTester({
|
|
|
658
658
|
<div className="flex items-center gap-2">
|
|
659
659
|
<button
|
|
660
660
|
onClick={onBack}
|
|
661
|
-
className="text-[
|
|
661
|
+
className="text-[var(--color-text-muted)] hover:text-[var(--color-text-secondary)] text-sm"
|
|
662
662
|
>
|
|
663
663
|
← Back
|
|
664
664
|
</button>
|
|
665
|
-
<span className="text-[
|
|
665
|
+
<span className="text-[var(--color-text-faint)]">/</span>
|
|
666
666
|
<span className="font-medium">{tool.name}</span>
|
|
667
667
|
</div>
|
|
668
668
|
|
|
669
669
|
{/* Description */}
|
|
670
670
|
{tool.description && (
|
|
671
|
-
<p className="text-sm text-[
|
|
671
|
+
<p className="text-sm text-[var(--color-text-muted)]">{tool.description}</p>
|
|
672
672
|
)}
|
|
673
673
|
|
|
674
674
|
{/* Schema info */}
|
|
675
675
|
{tool.inputSchema && (
|
|
676
676
|
<div className="text-xs">
|
|
677
677
|
<details className="cursor-pointer">
|
|
678
|
-
<summary className="text-[
|
|
679
|
-
<pre className="mt-2 p-2 bg-[
|
|
678
|
+
<summary className="text-[var(--color-text-muted)] hover:text-[var(--color-text-secondary)]">Input Schema</summary>
|
|
679
|
+
<pre className="mt-2 p-2 bg-[var(--color-bg)] rounded text-[var(--color-text-secondary)] overflow-auto max-h-32">
|
|
680
680
|
{JSON.stringify(tool.inputSchema, null, 2)}
|
|
681
681
|
</pre>
|
|
682
682
|
</details>
|
|
@@ -685,11 +685,11 @@ function ToolTester({
|
|
|
685
685
|
|
|
686
686
|
{/* Arguments input */}
|
|
687
687
|
<div>
|
|
688
|
-
<label className="block text-sm text-[
|
|
688
|
+
<label className="block text-sm text-[var(--color-text-muted)] mb-1">Arguments (JSON)</label>
|
|
689
689
|
<textarea
|
|
690
690
|
value={args}
|
|
691
691
|
onChange={(e) => setArgs(e.target.value)}
|
|
692
|
-
className="w-full bg-[
|
|
692
|
+
className="w-full bg-[var(--color-bg)] border border-[var(--color-border-light)] rounded px-3 py-2 h-32 font-mono text-sm focus:outline-none focus:border-[var(--color-accent)] resize-none"
|
|
693
693
|
placeholder="{}"
|
|
694
694
|
/>
|
|
695
695
|
</div>
|
|
@@ -698,7 +698,7 @@ function ToolTester({
|
|
|
698
698
|
<button
|
|
699
699
|
onClick={callTool}
|
|
700
700
|
disabled={loading}
|
|
701
|
-
className="w-full bg-[
|
|
701
|
+
className="w-full bg-[var(--color-accent)] hover:bg-[var(--color-accent-hover)] disabled:opacity-50 text-black px-4 py-2 rounded font-medium transition"
|
|
702
702
|
>
|
|
703
703
|
{loading ? "Calling..." : "Call Tool"}
|
|
704
704
|
</button>
|
|
@@ -713,7 +713,7 @@ function ToolTester({
|
|
|
713
713
|
{/* Result */}
|
|
714
714
|
{result && (
|
|
715
715
|
<div className="space-y-2">
|
|
716
|
-
<div className="text-sm text-[
|
|
716
|
+
<div className="text-sm text-[var(--color-text-muted)]">
|
|
717
717
|
Result {result.isError && <span className="text-red-400">(error)</span>}
|
|
718
718
|
</div>
|
|
719
719
|
<div className={`p-3 rounded text-sm ${result.isError ? "bg-red-500/10" : "bg-green-500/10"}`}>
|
|
@@ -829,12 +829,12 @@ function RegistryBrowser({
|
|
|
829
829
|
value={search}
|
|
830
830
|
onChange={(e) => setSearch(e.target.value)}
|
|
831
831
|
placeholder="Search MCP servers (e.g., filesystem, github, slack...)"
|
|
832
|
-
className="flex-1 bg-[
|
|
832
|
+
className="flex-1 bg-[var(--color-surface)] border border-[var(--color-border-light)] rounded-lg px-4 py-3 focus:outline-none focus:border-[var(--color-accent)]"
|
|
833
833
|
/>
|
|
834
834
|
<button
|
|
835
835
|
type="submit"
|
|
836
836
|
disabled={loading}
|
|
837
|
-
className="bg-[
|
|
837
|
+
className="bg-[var(--color-accent)] hover:bg-[var(--color-accent-hover)] disabled:opacity-50 text-black px-6 py-3 rounded-lg font-medium transition"
|
|
838
838
|
>
|
|
839
839
|
{loading ? "..." : "Search"}
|
|
840
840
|
</button>
|
|
@@ -849,7 +849,7 @@ function RegistryBrowser({
|
|
|
849
849
|
|
|
850
850
|
{/* Results */}
|
|
851
851
|
{!loading && searched && servers.length === 0 && (
|
|
852
|
-
<div className="text-center py-8 text-[
|
|
852
|
+
<div className="text-center py-8 text-[var(--color-text-muted)]">
|
|
853
853
|
No servers found. Try a different search term.
|
|
854
854
|
</div>
|
|
855
855
|
)}
|
|
@@ -859,15 +859,15 @@ function RegistryBrowser({
|
|
|
859
859
|
{servers.map((server) => (
|
|
860
860
|
<div
|
|
861
861
|
key={server.id}
|
|
862
|
-
className="bg-[
|
|
862
|
+
className="bg-[var(--color-surface)] border border-[var(--color-border)] rounded-lg p-4 hover:border-[var(--color-border-light)] transition"
|
|
863
863
|
>
|
|
864
864
|
<div className="flex items-start justify-between gap-3">
|
|
865
865
|
<div className="flex-1 min-w-0">
|
|
866
866
|
<h3 className="font-medium truncate">{server.name}</h3>
|
|
867
|
-
<p className="text-sm text-[
|
|
867
|
+
<p className="text-sm text-[var(--color-text-muted)] mt-1 line-clamp-2">
|
|
868
868
|
{server.description || "No description"}
|
|
869
869
|
</p>
|
|
870
|
-
<div className="flex items-center gap-2 mt-2 text-xs text-[
|
|
870
|
+
<div className="flex items-center gap-2 mt-2 text-xs text-[var(--color-text-faint)]">
|
|
871
871
|
{server.version && <span>v{server.version}</span>}
|
|
872
872
|
<span className={`px-1.5 py-0.5 rounded ${
|
|
873
873
|
server.npmPackage ? "bg-green-500/10 text-green-400" : "bg-blue-500/10 text-blue-400"
|
|
@@ -875,7 +875,7 @@ function RegistryBrowser({
|
|
|
875
875
|
{server.npmPackage ? "npm" : "remote"}
|
|
876
876
|
</span>
|
|
877
877
|
</div>
|
|
878
|
-
<code className="text-xs text-[
|
|
878
|
+
<code className="text-xs text-[var(--color-text-faint)] bg-[var(--color-bg)] px-2 py-0.5 rounded mt-2 inline-block truncate max-w-full">
|
|
879
879
|
{server.npmPackage || server.fullName}
|
|
880
880
|
</code>
|
|
881
881
|
</div>
|
|
@@ -884,7 +884,7 @@ function RegistryBrowser({
|
|
|
884
884
|
<button
|
|
885
885
|
onClick={() => installServer(server)}
|
|
886
886
|
disabled={installing === server.id}
|
|
887
|
-
className="text-sm bg-[
|
|
887
|
+
className="text-sm bg-[var(--color-surface-raised)] hover:bg-[var(--color-surface-raised)] border border-[var(--color-border-light)] hover:border-[var(--color-accent)] px-3 py-1.5 rounded transition disabled:opacity-50"
|
|
888
888
|
>
|
|
889
889
|
{installing === server.id ? "Adding..." : "Add"}
|
|
890
890
|
</button>
|
|
@@ -893,7 +893,7 @@ function RegistryBrowser({
|
|
|
893
893
|
href={server.repository}
|
|
894
894
|
target="_blank"
|
|
895
895
|
rel="noopener noreferrer"
|
|
896
|
-
className="text-sm text-[
|
|
896
|
+
className="text-sm text-[var(--color-text-muted)] hover:text-[var(--color-accent)] transition"
|
|
897
897
|
>
|
|
898
898
|
View →
|
|
899
899
|
</a>
|
|
@@ -907,20 +907,20 @@ function RegistryBrowser({
|
|
|
907
907
|
|
|
908
908
|
{/* Loading */}
|
|
909
909
|
{loading && (
|
|
910
|
-
<div className="text-center py-8 text-[
|
|
910
|
+
<div className="text-center py-8 text-[var(--color-text-muted)]">
|
|
911
911
|
Searching registry...
|
|
912
912
|
</div>
|
|
913
913
|
)}
|
|
914
914
|
|
|
915
915
|
{/* Registry info */}
|
|
916
|
-
<div className="p-4 bg-[
|
|
916
|
+
<div className="p-4 bg-[var(--color-surface)] border border-[var(--color-border)] rounded-lg text-sm text-[var(--color-text-muted)]">
|
|
917
917
|
<p>
|
|
918
918
|
Servers are sourced from the{" "}
|
|
919
919
|
<a
|
|
920
920
|
href="https://github.com/modelcontextprotocol/servers"
|
|
921
921
|
target="_blank"
|
|
922
922
|
rel="noopener noreferrer"
|
|
923
|
-
className="text-[
|
|
923
|
+
className="text-[var(--color-accent)] hover:underline"
|
|
924
924
|
>
|
|
925
925
|
official MCP registry
|
|
926
926
|
</a>
|
|
@@ -1052,7 +1052,7 @@ function HostedServices({ onServerAdded, projectId }: { onServerAdded?: () => vo
|
|
|
1052
1052
|
}, [authFetch, projectId]);
|
|
1053
1053
|
|
|
1054
1054
|
if (loading) {
|
|
1055
|
-
return <div className="text-center py-8 text-[
|
|
1055
|
+
return <div className="text-center py-8 text-[var(--color-text-muted)]">Loading...</div>;
|
|
1056
1056
|
}
|
|
1057
1057
|
|
|
1058
1058
|
const hasAnyConnection = composioConnected || smitheryConnected || agentDojoConnected;
|
|
@@ -1060,14 +1060,14 @@ function HostedServices({ onServerAdded, projectId }: { onServerAdded?: () => vo
|
|
|
1060
1060
|
|
|
1061
1061
|
if (!hasAnyConnection) {
|
|
1062
1062
|
return (
|
|
1063
|
-
<div className="bg-[
|
|
1064
|
-
<p className="text-[
|
|
1065
|
-
<p className="text-sm text-[
|
|
1063
|
+
<div className="bg-[var(--color-surface)] border border-[var(--color-border)] rounded-lg p-8 text-center">
|
|
1064
|
+
<p className="text-[var(--color-text-secondary)] mb-2">No hosted MCP services connected</p>
|
|
1065
|
+
<p className="text-sm text-[var(--color-text-muted)] mb-4">
|
|
1066
1066
|
Connect Composio, Smithery, or AgentDojo in Settings to access cloud-based MCP servers.
|
|
1067
1067
|
</p>
|
|
1068
1068
|
<a
|
|
1069
1069
|
href="/settings"
|
|
1070
|
-
className="inline-block bg-[
|
|
1070
|
+
className="inline-block bg-[var(--color-surface-raised)] hover:bg-[var(--color-surface-raised)] border border-[var(--color-border-light)] hover:border-[var(--color-accent)] px-4 py-2 rounded text-sm font-medium transition"
|
|
1071
1071
|
>
|
|
1072
1072
|
Go to Settings →
|
|
1073
1073
|
</a>
|
|
@@ -1081,14 +1081,14 @@ function HostedServices({ onServerAdded, projectId }: { onServerAdded?: () => vo
|
|
|
1081
1081
|
<div className="space-y-6">
|
|
1082
1082
|
{/* Provider Tabs - show when multiple providers are connected */}
|
|
1083
1083
|
{connectedCount > 1 && (
|
|
1084
|
-
<div className="flex gap-1 bg-[
|
|
1084
|
+
<div className="flex gap-1 bg-[var(--color-bg)] border border-[var(--color-border-light)] rounded-lg p-1 w-fit">
|
|
1085
1085
|
{composioConnected && (
|
|
1086
1086
|
<button
|
|
1087
1087
|
onClick={() => { setActiveProvider("composio"); setSubTab("configs"); }}
|
|
1088
1088
|
className={`px-4 py-2 rounded text-sm font-medium transition flex items-center gap-2 ${
|
|
1089
1089
|
activeProvider === "composio"
|
|
1090
|
-
? "bg-[
|
|
1091
|
-
: "text-[
|
|
1090
|
+
? "bg-[var(--color-surface-raised)] text-white"
|
|
1091
|
+
: "text-[var(--color-text-muted)] hover:text-[var(--color-text-secondary)]"
|
|
1092
1092
|
}`}
|
|
1093
1093
|
>
|
|
1094
1094
|
<span className="w-2 h-2 rounded-full bg-purple-500" />
|
|
@@ -1100,8 +1100,8 @@ function HostedServices({ onServerAdded, projectId }: { onServerAdded?: () => vo
|
|
|
1100
1100
|
onClick={() => setActiveProvider("smithery")}
|
|
1101
1101
|
className={`px-4 py-2 rounded text-sm font-medium transition flex items-center gap-2 ${
|
|
1102
1102
|
activeProvider === "smithery"
|
|
1103
|
-
? "bg-[
|
|
1104
|
-
: "text-[
|
|
1103
|
+
? "bg-[var(--color-surface-raised)] text-white"
|
|
1104
|
+
: "text-[var(--color-text-muted)] hover:text-[var(--color-text-secondary)]"
|
|
1105
1105
|
}`}
|
|
1106
1106
|
>
|
|
1107
1107
|
<span className="w-2 h-2 rounded-full bg-blue-500" />
|
|
@@ -1113,8 +1113,8 @@ function HostedServices({ onServerAdded, projectId }: { onServerAdded?: () => vo
|
|
|
1113
1113
|
onClick={() => setActiveProvider("agentdojo")}
|
|
1114
1114
|
className={`px-4 py-2 rounded text-sm font-medium transition flex items-center gap-2 ${
|
|
1115
1115
|
activeProvider === "agentdojo"
|
|
1116
|
-
? "bg-[
|
|
1117
|
-
: "text-[
|
|
1116
|
+
? "bg-[var(--color-surface-raised)] text-white"
|
|
1117
|
+
: "text-[var(--color-text-muted)] hover:text-[var(--color-text-secondary)]"
|
|
1118
1118
|
}`}
|
|
1119
1119
|
>
|
|
1120
1120
|
<span className="w-2 h-2 rounded-full bg-green-500" />
|
|
@@ -1129,13 +1129,13 @@ function HostedServices({ onServerAdded, projectId }: { onServerAdded?: () => vo
|
|
|
1129
1129
|
<>
|
|
1130
1130
|
{/* Sub-tabs for Composio */}
|
|
1131
1131
|
<div className="flex items-center justify-between">
|
|
1132
|
-
<div className="flex gap-1 bg-[
|
|
1132
|
+
<div className="flex gap-1 bg-[var(--color-bg)] border border-[var(--color-border-light)] rounded-lg p-1">
|
|
1133
1133
|
<button
|
|
1134
1134
|
onClick={() => setSubTab("configs")}
|
|
1135
1135
|
className={`px-4 py-2 rounded text-sm font-medium transition ${
|
|
1136
1136
|
subTab === "configs"
|
|
1137
|
-
? "bg-[
|
|
1138
|
-
: "text-[
|
|
1137
|
+
? "bg-[var(--color-surface-raised)] text-white"
|
|
1138
|
+
: "text-[var(--color-text-muted)] hover:text-[var(--color-text-secondary)]"
|
|
1139
1139
|
}`}
|
|
1140
1140
|
>
|
|
1141
1141
|
MCP Configs
|
|
@@ -1144,15 +1144,15 @@ function HostedServices({ onServerAdded, projectId }: { onServerAdded?: () => vo
|
|
|
1144
1144
|
onClick={() => setSubTab("connect")}
|
|
1145
1145
|
className={`px-4 py-2 rounded text-sm font-medium transition ${
|
|
1146
1146
|
subTab === "connect"
|
|
1147
|
-
? "bg-[
|
|
1148
|
-
: "text-[
|
|
1147
|
+
? "bg-[var(--color-surface-raised)] text-white"
|
|
1148
|
+
: "text-[var(--color-text-muted)] hover:text-[var(--color-text-secondary)]"
|
|
1149
1149
|
}`}
|
|
1150
1150
|
>
|
|
1151
1151
|
Connect Apps
|
|
1152
1152
|
</button>
|
|
1153
1153
|
</div>
|
|
1154
1154
|
{connectedCount === 1 && (
|
|
1155
|
-
<div className="flex items-center gap-2 text-xs text-[
|
|
1155
|
+
<div className="flex items-center gap-2 text-xs text-[var(--color-text-muted)]">
|
|
1156
1156
|
<span className="w-2 h-2 rounded-full bg-purple-500" />
|
|
1157
1157
|
Composio
|
|
1158
1158
|
<span className="text-green-400">Connected</span>
|
|
@@ -1163,7 +1163,7 @@ function HostedServices({ onServerAdded, projectId }: { onServerAdded?: () => vo
|
|
|
1163
1163
|
{/* Connect Apps Tab */}
|
|
1164
1164
|
{subTab === "connect" && (
|
|
1165
1165
|
<div>
|
|
1166
|
-
<p className="text-sm text-[
|
|
1166
|
+
<p className="text-sm text-[var(--color-text-muted)] mb-4">
|
|
1167
1167
|
Connect your accounts to enable tools in MCP configs
|
|
1168
1168
|
</p>
|
|
1169
1169
|
<IntegrationsPanel
|
|
@@ -1181,14 +1181,14 @@ function HostedServices({ onServerAdded, projectId }: { onServerAdded?: () => vo
|
|
|
1181
1181
|
{subTab === "configs" && (
|
|
1182
1182
|
<div>
|
|
1183
1183
|
<div className="flex items-center justify-between mb-3">
|
|
1184
|
-
<p className="text-sm text-[
|
|
1184
|
+
<p className="text-sm text-[var(--color-text-muted)]">
|
|
1185
1185
|
Your MCP configs from Composio
|
|
1186
1186
|
</p>
|
|
1187
1187
|
<div className="flex items-center gap-3">
|
|
1188
1188
|
<button
|
|
1189
1189
|
onClick={fetchComposioConfigs}
|
|
1190
1190
|
disabled={loadingConfigs}
|
|
1191
|
-
className="text-xs text-[
|
|
1191
|
+
className="text-xs text-[var(--color-text-muted)] hover:text-[var(--color-text-secondary)] transition"
|
|
1192
1192
|
>
|
|
1193
1193
|
{loadingConfigs ? "Loading..." : "Refresh"}
|
|
1194
1194
|
</button>
|
|
@@ -1196,7 +1196,7 @@ function HostedServices({ onServerAdded, projectId }: { onServerAdded?: () => vo
|
|
|
1196
1196
|
href="https://app.composio.dev/mcp_configs"
|
|
1197
1197
|
target="_blank"
|
|
1198
1198
|
rel="noopener noreferrer"
|
|
1199
|
-
className="text-xs text-[
|
|
1199
|
+
className="text-xs text-[var(--color-text-muted)] hover:text-[var(--color-accent)] transition"
|
|
1200
1200
|
>
|
|
1201
1201
|
Create Config →
|
|
1202
1202
|
</a>
|
|
@@ -1204,18 +1204,18 @@ function HostedServices({ onServerAdded, projectId }: { onServerAdded?: () => vo
|
|
|
1204
1204
|
</div>
|
|
1205
1205
|
|
|
1206
1206
|
{loadingConfigs ? (
|
|
1207
|
-
<div className="text-center py-6 text-[
|
|
1207
|
+
<div className="text-center py-6 text-[var(--color-text-muted)]">Loading configs...</div>
|
|
1208
1208
|
) : composioConfigs.length === 0 ? (
|
|
1209
|
-
<div className="bg-[
|
|
1210
|
-
<p className="text-sm text-[
|
|
1211
|
-
<p className="text-xs text-[
|
|
1212
|
-
First <button onClick={() => setSubTab("connect")} className="text-[
|
|
1209
|
+
<div className="bg-[var(--color-surface)] border border-[var(--color-border)] rounded-lg p-4 text-center">
|
|
1210
|
+
<p className="text-sm text-[var(--color-text-muted)]">No MCP configs found</p>
|
|
1211
|
+
<p className="text-xs text-[var(--color-text-faint)] mt-2">
|
|
1212
|
+
First <button onClick={() => setSubTab("connect")} className="text-[var(--color-accent)] hover:text-[var(--color-accent-hover)]">connect some apps</button>, then create a config.
|
|
1213
1213
|
</p>
|
|
1214
1214
|
<a
|
|
1215
1215
|
href="https://app.composio.dev/mcp_configs"
|
|
1216
1216
|
target="_blank"
|
|
1217
1217
|
rel="noopener noreferrer"
|
|
1218
|
-
className="text-xs text-[
|
|
1218
|
+
className="text-xs text-[var(--color-accent)] hover:text-[var(--color-accent-hover)] mt-2 inline-block"
|
|
1219
1219
|
>
|
|
1220
1220
|
Create in Composio →
|
|
1221
1221
|
</a>
|
|
@@ -1228,14 +1228,14 @@ function HostedServices({ onServerAdded, projectId }: { onServerAdded?: () => vo
|
|
|
1228
1228
|
return (
|
|
1229
1229
|
<div
|
|
1230
1230
|
key={config.id}
|
|
1231
|
-
className={`bg-[
|
|
1232
|
-
added ? "border-green-500/30" : "border-[
|
|
1231
|
+
className={`bg-[var(--color-surface)] border rounded-lg p-3 transition flex items-center justify-between ${
|
|
1232
|
+
added ? "border-green-500/30" : "border-[var(--color-border)] hover:border-[var(--color-border-light)]"
|
|
1233
1233
|
}`}
|
|
1234
1234
|
>
|
|
1235
1235
|
<div className="flex-1 min-w-0">
|
|
1236
1236
|
<div className="flex items-center gap-2">
|
|
1237
1237
|
<span className="font-medium text-sm">{config.name}</span>
|
|
1238
|
-
<span className="text-xs text-[
|
|
1238
|
+
<span className="text-xs text-[var(--color-text-faint)]">{config.toolsCount} tools</span>
|
|
1239
1239
|
{added && (
|
|
1240
1240
|
<span className="text-xs text-green-400">Added</span>
|
|
1241
1241
|
)}
|
|
@@ -1245,25 +1245,25 @@ function HostedServices({ onServerAdded, projectId }: { onServerAdded?: () => vo
|
|
|
1245
1245
|
{config.toolkits.slice(0, 4).map((toolkit) => (
|
|
1246
1246
|
<span
|
|
1247
1247
|
key={toolkit}
|
|
1248
|
-
className="text-xs bg-[
|
|
1248
|
+
className="text-xs bg-[var(--color-surface-raised)] text-[var(--color-text-muted)] px-1.5 py-0.5 rounded"
|
|
1249
1249
|
>
|
|
1250
1250
|
{toolkit}
|
|
1251
1251
|
</span>
|
|
1252
1252
|
))}
|
|
1253
1253
|
{config.toolkits.length > 4 && (
|
|
1254
|
-
<span className="text-xs text-[
|
|
1254
|
+
<span className="text-xs text-[var(--color-text-faint)]">+{config.toolkits.length - 4}</span>
|
|
1255
1255
|
)}
|
|
1256
1256
|
</div>
|
|
1257
1257
|
)}
|
|
1258
1258
|
</div>
|
|
1259
1259
|
<div className="flex items-center gap-2 ml-3">
|
|
1260
1260
|
{added ? (
|
|
1261
|
-
<span className="text-xs text-[
|
|
1261
|
+
<span className="text-xs text-[var(--color-text-faint)] px-2 py-1">In Servers</span>
|
|
1262
1262
|
) : (
|
|
1263
1263
|
<button
|
|
1264
1264
|
onClick={() => addComposioConfig(config.id)}
|
|
1265
1265
|
disabled={isAdding}
|
|
1266
|
-
className="text-xs bg-[
|
|
1266
|
+
className="text-xs bg-[var(--color-accent)] hover:bg-[var(--color-accent-hover)] text-black px-3 py-1 rounded font-medium transition disabled:opacity-50"
|
|
1267
1267
|
>
|
|
1268
1268
|
{isAdding ? "Adding..." : "Add"}
|
|
1269
1269
|
</button>
|
|
@@ -1272,7 +1272,7 @@ function HostedServices({ onServerAdded, projectId }: { onServerAdded?: () => vo
|
|
|
1272
1272
|
href={`https://app.composio.dev/mcp_configs/${config.id}`}
|
|
1273
1273
|
target="_blank"
|
|
1274
1274
|
rel="noopener noreferrer"
|
|
1275
|
-
className="text-xs text-[
|
|
1275
|
+
className="text-xs text-[var(--color-text-muted)] hover:text-[var(--color-text-secondary)] transition"
|
|
1276
1276
|
>
|
|
1277
1277
|
Edit
|
|
1278
1278
|
</a>
|
|
@@ -1291,30 +1291,30 @@ function HostedServices({ onServerAdded, projectId }: { onServerAdded?: () => vo
|
|
|
1291
1291
|
{smitheryConnected && (connectedCount === 1 || activeProvider === "smithery") && (
|
|
1292
1292
|
<div>
|
|
1293
1293
|
{connectedCount === 1 && (
|
|
1294
|
-
<div className="flex items-center gap-2 text-xs text-[
|
|
1294
|
+
<div className="flex items-center gap-2 text-xs text-[var(--color-text-muted)] mb-4">
|
|
1295
1295
|
<span className="w-2 h-2 rounded-full bg-blue-500" />
|
|
1296
1296
|
Smithery
|
|
1297
1297
|
<span className="text-green-400">Connected</span>
|
|
1298
1298
|
</div>
|
|
1299
1299
|
)}
|
|
1300
1300
|
<div className="flex items-center justify-between mb-3">
|
|
1301
|
-
<p className="text-sm text-[
|
|
1301
|
+
<p className="text-sm text-[var(--color-text-muted)]">
|
|
1302
1302
|
Add MCP servers from the Smithery registry
|
|
1303
1303
|
</p>
|
|
1304
1304
|
<a
|
|
1305
1305
|
href="https://smithery.ai/servers"
|
|
1306
1306
|
target="_blank"
|
|
1307
1307
|
rel="noopener noreferrer"
|
|
1308
|
-
className="text-xs text-[
|
|
1308
|
+
className="text-xs text-[var(--color-text-muted)] hover:text-[var(--color-accent)] transition"
|
|
1309
1309
|
>
|
|
1310
1310
|
Browse Smithery →
|
|
1311
1311
|
</a>
|
|
1312
1312
|
</div>
|
|
1313
|
-
<div className="bg-[
|
|
1314
|
-
<p className="text-sm text-[
|
|
1313
|
+
<div className="bg-[var(--color-surface)] border border-[var(--color-border)] rounded-lg p-4 text-center">
|
|
1314
|
+
<p className="text-sm text-[var(--color-text-muted)]">
|
|
1315
1315
|
Smithery servers can be added from the <strong>Browse Registry</strong> tab.
|
|
1316
1316
|
</p>
|
|
1317
|
-
<p className="text-xs text-[
|
|
1317
|
+
<p className="text-xs text-[var(--color-text-faint)] mt-2">
|
|
1318
1318
|
Your API key will be used automatically when adding Smithery servers.
|
|
1319
1319
|
</p>
|
|
1320
1320
|
</div>
|
|
@@ -1330,10 +1330,10 @@ function HostedServices({ onServerAdded, projectId }: { onServerAdded?: () => vo
|
|
|
1330
1330
|
/>
|
|
1331
1331
|
)}
|
|
1332
1332
|
|
|
1333
|
-
<div className="p-3 bg-[
|
|
1334
|
-
<strong className="text-[
|
|
1333
|
+
<div className="p-3 bg-[var(--color-bg)] border border-[var(--color-border-light)] rounded text-xs text-[var(--color-text-muted)]">
|
|
1334
|
+
<strong className="text-[var(--color-text-secondary)]">Tip:</strong> Connect apps first, then add MCP configs to make tools available to your agents.
|
|
1335
1335
|
{" · "}
|
|
1336
|
-
<a href="/settings" className="text-[
|
|
1336
|
+
<a href="/settings" className="text-[var(--color-accent)] hover:text-[var(--color-accent-hover)]">Add more providers in Settings</a>
|
|
1337
1337
|
</div>
|
|
1338
1338
|
</div>
|
|
1339
1339
|
</>
|
|
@@ -1446,7 +1446,7 @@ function AgentDojoContent({
|
|
|
1446
1446
|
{AlertDialog}
|
|
1447
1447
|
<div>
|
|
1448
1448
|
{showProviderBadge && (
|
|
1449
|
-
<div className="flex items-center gap-2 text-xs text-[
|
|
1449
|
+
<div className="flex items-center gap-2 text-xs text-[var(--color-text-muted)] mb-4">
|
|
1450
1450
|
<span className="w-2 h-2 rounded-full bg-green-500" />
|
|
1451
1451
|
AgentDojo
|
|
1452
1452
|
<span className="text-green-400">Connected</span>
|
|
@@ -1455,13 +1455,13 @@ function AgentDojoContent({
|
|
|
1455
1455
|
|
|
1456
1456
|
{/* Sub-tabs */}
|
|
1457
1457
|
<div className="flex items-center justify-between mb-4">
|
|
1458
|
-
<div className="flex gap-1 bg-[
|
|
1458
|
+
<div className="flex gap-1 bg-[var(--color-bg)] border border-[var(--color-border-light)] rounded-lg p-1">
|
|
1459
1459
|
<button
|
|
1460
1460
|
onClick={() => setSubTab("configs")}
|
|
1461
1461
|
className={`px-4 py-2 rounded text-sm font-medium transition ${
|
|
1462
1462
|
subTab === "configs"
|
|
1463
|
-
? "bg-[
|
|
1464
|
-
: "text-[
|
|
1463
|
+
? "bg-[var(--color-surface-raised)] text-white"
|
|
1464
|
+
: "text-[var(--color-text-muted)] hover:text-[var(--color-text-secondary)]"
|
|
1465
1465
|
}`}
|
|
1466
1466
|
>
|
|
1467
1467
|
MCP Servers
|
|
@@ -1470,8 +1470,8 @@ function AgentDojoContent({
|
|
|
1470
1470
|
onClick={() => setSubTab("toolkits")}
|
|
1471
1471
|
className={`px-4 py-2 rounded text-sm font-medium transition ${
|
|
1472
1472
|
subTab === "toolkits"
|
|
1473
|
-
? "bg-[
|
|
1474
|
-
: "text-[
|
|
1473
|
+
? "bg-[var(--color-surface-raised)] text-white"
|
|
1474
|
+
: "text-[var(--color-text-muted)] hover:text-[var(--color-text-secondary)]"
|
|
1475
1475
|
}`}
|
|
1476
1476
|
>
|
|
1477
1477
|
Browse Toolkits
|
|
@@ -1483,25 +1483,25 @@ function AgentDojoContent({
|
|
|
1483
1483
|
{subTab === "configs" && (
|
|
1484
1484
|
<div>
|
|
1485
1485
|
<div className="flex items-center justify-between mb-3">
|
|
1486
|
-
<p className="text-sm text-[
|
|
1486
|
+
<p className="text-sm text-[var(--color-text-muted)]">
|
|
1487
1487
|
Your MCP servers from AgentDojo
|
|
1488
1488
|
</p>
|
|
1489
1489
|
<button
|
|
1490
1490
|
onClick={fetchConfigs}
|
|
1491
1491
|
disabled={loadingConfigs}
|
|
1492
|
-
className="text-xs text-[
|
|
1492
|
+
className="text-xs text-[var(--color-text-muted)] hover:text-[var(--color-text-secondary)] transition"
|
|
1493
1493
|
>
|
|
1494
1494
|
{loadingConfigs ? "Loading..." : "Refresh"}
|
|
1495
1495
|
</button>
|
|
1496
1496
|
</div>
|
|
1497
1497
|
|
|
1498
1498
|
{loadingConfigs ? (
|
|
1499
|
-
<div className="text-center py-6 text-[
|
|
1499
|
+
<div className="text-center py-6 text-[var(--color-text-muted)]">Loading servers...</div>
|
|
1500
1500
|
) : configs.length === 0 ? (
|
|
1501
|
-
<div className="bg-[
|
|
1502
|
-
<p className="text-sm text-[
|
|
1503
|
-
<p className="text-xs text-[
|
|
1504
|
-
<button onClick={() => setSubTab("toolkits")} className="text-[
|
|
1501
|
+
<div className="bg-[var(--color-surface)] border border-[var(--color-border)] rounded-lg p-4 text-center">
|
|
1502
|
+
<p className="text-sm text-[var(--color-text-muted)]">No MCP servers found</p>
|
|
1503
|
+
<p className="text-xs text-[var(--color-text-faint)] mt-2">
|
|
1504
|
+
<button onClick={() => setSubTab("toolkits")} className="text-[var(--color-accent)] hover:text-[var(--color-accent-hover)]">
|
|
1505
1505
|
Browse toolkits
|
|
1506
1506
|
</button>
|
|
1507
1507
|
{" "}to create a new MCP server.
|
|
@@ -1515,37 +1515,37 @@ function AgentDojoContent({
|
|
|
1515
1515
|
return (
|
|
1516
1516
|
<div
|
|
1517
1517
|
key={config.id}
|
|
1518
|
-
className={`bg-[
|
|
1519
|
-
added ? "border-green-500/30" : "border-[
|
|
1518
|
+
className={`bg-[var(--color-surface)] border rounded-lg p-3 transition flex items-center justify-between ${
|
|
1519
|
+
added ? "border-green-500/30" : "border-[var(--color-border)] hover:border-[var(--color-border-light)]"
|
|
1520
1520
|
}`}
|
|
1521
1521
|
>
|
|
1522
1522
|
<div className="flex-1 min-w-0">
|
|
1523
1523
|
<div className="flex items-center gap-2">
|
|
1524
1524
|
<span className="font-medium text-sm">{config.name}</span>
|
|
1525
|
-
<span className="text-xs text-[
|
|
1525
|
+
<span className="text-xs text-[var(--color-text-faint)]">{config.toolsCount} tools</span>
|
|
1526
1526
|
{added && (
|
|
1527
1527
|
<span className="text-xs text-green-400">Added</span>
|
|
1528
1528
|
)}
|
|
1529
1529
|
</div>
|
|
1530
1530
|
{config.mcpUrl && (
|
|
1531
|
-
<code className="text-xs text-[
|
|
1531
|
+
<code className="text-xs text-[var(--color-text-faint)] mt-1 block truncate">
|
|
1532
1532
|
{config.mcpUrl}
|
|
1533
1533
|
</code>
|
|
1534
1534
|
)}
|
|
1535
1535
|
{!config.mcpUrl && config.slug && (
|
|
1536
|
-
<code className="text-xs text-[
|
|
1536
|
+
<code className="text-xs text-[var(--color-text-faint)] mt-1 block truncate">
|
|
1537
1537
|
{config.slug}
|
|
1538
1538
|
</code>
|
|
1539
1539
|
)}
|
|
1540
1540
|
</div>
|
|
1541
1541
|
<div className="flex items-center gap-2 ml-3">
|
|
1542
1542
|
{added ? (
|
|
1543
|
-
<span className="text-xs text-[
|
|
1543
|
+
<span className="text-xs text-[var(--color-text-faint)] px-2 py-1">In Servers</span>
|
|
1544
1544
|
) : (
|
|
1545
1545
|
<button
|
|
1546
1546
|
onClick={() => addConfig(config.id)}
|
|
1547
1547
|
disabled={isAdding}
|
|
1548
|
-
className="text-xs bg-[
|
|
1548
|
+
className="text-xs bg-[var(--color-accent)] hover:bg-[var(--color-accent-hover)] text-black px-3 py-1 rounded font-medium transition disabled:opacity-50"
|
|
1549
1549
|
>
|
|
1550
1550
|
{isAdding ? "Adding..." : "Add"}
|
|
1551
1551
|
</button>
|
|
@@ -1562,7 +1562,7 @@ function AgentDojoContent({
|
|
|
1562
1562
|
{/* Browse Toolkits Tab */}
|
|
1563
1563
|
{subTab === "toolkits" && (
|
|
1564
1564
|
<div>
|
|
1565
|
-
<p className="text-sm text-[
|
|
1565
|
+
<p className="text-sm text-[var(--color-text-muted)] mb-4">
|
|
1566
1566
|
Browse available toolkits and create MCP servers
|
|
1567
1567
|
</p>
|
|
1568
1568
|
<IntegrationsPanel
|
|
@@ -1845,10 +1845,10 @@ function AddServerModal({
|
|
|
1845
1845
|
|
|
1846
1846
|
return (
|
|
1847
1847
|
<div className="fixed inset-0 bg-black/50 backdrop-blur-[2px] z-50 flex items-center justify-center p-4">
|
|
1848
|
-
<div className="bg-[
|
|
1849
|
-
<div className="p-4 border-b border-[
|
|
1848
|
+
<div className="bg-[var(--color-surface)] border border-[var(--color-border)] rounded-lg w-full max-w-lg max-h-[90vh] overflow-y-auto">
|
|
1849
|
+
<div className="p-4 border-b border-[var(--color-border)] flex items-center justify-between sticky top-0 bg-[var(--color-surface)]">
|
|
1850
1850
|
<h2 className="text-lg font-semibold">Add MCP Server</h2>
|
|
1851
|
-
<button onClick={onClose} className="text-[
|
|
1851
|
+
<button onClick={onClose} className="text-[var(--color-text-muted)] hover:text-[var(--color-text-secondary)]">
|
|
1852
1852
|
✕
|
|
1853
1853
|
</button>
|
|
1854
1854
|
</div>
|
|
@@ -1856,7 +1856,7 @@ function AddServerModal({
|
|
|
1856
1856
|
<div className="p-4 space-y-4">
|
|
1857
1857
|
{/* Quick picks */}
|
|
1858
1858
|
<div>
|
|
1859
|
-
<p className="text-sm text-[
|
|
1859
|
+
<p className="text-sm text-[var(--color-text-muted)] mb-2">Quick add:</p>
|
|
1860
1860
|
<div className="flex flex-wrap gap-2">
|
|
1861
1861
|
{[
|
|
1862
1862
|
{ name: "filesystem", pkg: "@modelcontextprotocol/server-filesystem", type: "npm" as const },
|
|
@@ -1877,7 +1877,7 @@ function AddServerModal({
|
|
|
1877
1877
|
setPipModule("");
|
|
1878
1878
|
}
|
|
1879
1879
|
}}
|
|
1880
|
-
className="text-sm bg-[
|
|
1880
|
+
className="text-sm bg-[var(--color-surface-raised)] hover:bg-[var(--color-surface-raised)] px-3 py-1 rounded transition"
|
|
1881
1881
|
>
|
|
1882
1882
|
{s.name}
|
|
1883
1883
|
</button>
|
|
@@ -1886,13 +1886,13 @@ function AddServerModal({
|
|
|
1886
1886
|
</div>
|
|
1887
1887
|
|
|
1888
1888
|
{/* Mode toggle */}
|
|
1889
|
-
<div className="flex gap-1 bg-[
|
|
1889
|
+
<div className="flex gap-1 bg-[var(--color-bg)] border border-[var(--color-border-light)] rounded p-1">
|
|
1890
1890
|
<button
|
|
1891
1891
|
onClick={() => setMode("npm")}
|
|
1892
1892
|
className={`flex-1 px-2 py-1.5 rounded text-sm transition ${
|
|
1893
1893
|
mode === "npm"
|
|
1894
|
-
? "bg-[
|
|
1895
|
-
: "text-[
|
|
1894
|
+
? "bg-[var(--color-surface-raised)] text-white"
|
|
1895
|
+
: "text-[var(--color-text-muted)] hover:text-[var(--color-text-secondary)]"
|
|
1896
1896
|
}`}
|
|
1897
1897
|
>
|
|
1898
1898
|
npm
|
|
@@ -1901,8 +1901,8 @@ function AddServerModal({
|
|
|
1901
1901
|
onClick={() => setMode("pip")}
|
|
1902
1902
|
className={`flex-1 px-2 py-1.5 rounded text-sm transition ${
|
|
1903
1903
|
mode === "pip"
|
|
1904
|
-
? "bg-[
|
|
1905
|
-
: "text-[
|
|
1904
|
+
? "bg-[var(--color-surface-raised)] text-white"
|
|
1905
|
+
: "text-[var(--color-text-muted)] hover:text-[var(--color-text-secondary)]"
|
|
1906
1906
|
}`}
|
|
1907
1907
|
>
|
|
1908
1908
|
pip
|
|
@@ -1911,8 +1911,8 @@ function AddServerModal({
|
|
|
1911
1911
|
onClick={() => setMode("command")}
|
|
1912
1912
|
className={`flex-1 px-2 py-1.5 rounded text-sm transition ${
|
|
1913
1913
|
mode === "command"
|
|
1914
|
-
? "bg-[
|
|
1915
|
-
: "text-[
|
|
1914
|
+
? "bg-[var(--color-surface-raised)] text-white"
|
|
1915
|
+
: "text-[var(--color-text-muted)] hover:text-[var(--color-text-secondary)]"
|
|
1916
1916
|
}`}
|
|
1917
1917
|
>
|
|
1918
1918
|
Command
|
|
@@ -1921,8 +1921,8 @@ function AddServerModal({
|
|
|
1921
1921
|
onClick={() => setMode("http")}
|
|
1922
1922
|
className={`flex-1 px-2 py-1.5 rounded text-sm transition ${
|
|
1923
1923
|
mode === "http"
|
|
1924
|
-
? "bg-[
|
|
1925
|
-
: "text-[
|
|
1924
|
+
? "bg-[var(--color-surface-raised)] text-white"
|
|
1925
|
+
: "text-[var(--color-text-muted)] hover:text-[var(--color-text-secondary)]"
|
|
1926
1926
|
}`}
|
|
1927
1927
|
>
|
|
1928
1928
|
HTTP
|
|
@@ -1931,20 +1931,20 @@ function AddServerModal({
|
|
|
1931
1931
|
|
|
1932
1932
|
{/* Name */}
|
|
1933
1933
|
<div>
|
|
1934
|
-
<label className="block text-sm text-[
|
|
1934
|
+
<label className="block text-sm text-[var(--color-text-muted)] mb-1">Name</label>
|
|
1935
1935
|
<input
|
|
1936
1936
|
type="text"
|
|
1937
1937
|
value={name}
|
|
1938
1938
|
onChange={e => setName(e.target.value)}
|
|
1939
1939
|
placeholder="e.g., pushover"
|
|
1940
|
-
className="w-full bg-[
|
|
1940
|
+
className="w-full bg-[var(--color-bg)] border border-[var(--color-border-light)] rounded px-3 py-2 focus:outline-none focus:border-[var(--color-accent)]"
|
|
1941
1941
|
/>
|
|
1942
1942
|
</div>
|
|
1943
1943
|
|
|
1944
1944
|
{/* Project Scope - only show when projects exist */}
|
|
1945
1945
|
{hasProjects && (
|
|
1946
1946
|
<div>
|
|
1947
|
-
<label className="block text-sm text-[
|
|
1947
|
+
<label className="block text-sm text-[var(--color-text-muted)] mb-1">Scope</label>
|
|
1948
1948
|
<Select
|
|
1949
1949
|
value={projectId || ""}
|
|
1950
1950
|
onChange={(value) => setProjectId(value || null)}
|
|
@@ -1954,7 +1954,7 @@ function AddServerModal({
|
|
|
1954
1954
|
]}
|
|
1955
1955
|
placeholder="Select scope..."
|
|
1956
1956
|
/>
|
|
1957
|
-
<p className="text-xs text-[
|
|
1957
|
+
<p className="text-xs text-[var(--color-text-faint)] mt-1">
|
|
1958
1958
|
Global servers are available to all agents. Project-scoped servers are only available to agents in that project.
|
|
1959
1959
|
</p>
|
|
1960
1960
|
</div>
|
|
@@ -1963,15 +1963,15 @@ function AddServerModal({
|
|
|
1963
1963
|
{/* npm Package */}
|
|
1964
1964
|
{mode === "npm" && (
|
|
1965
1965
|
<div>
|
|
1966
|
-
<label className="block text-sm text-[
|
|
1966
|
+
<label className="block text-sm text-[var(--color-text-muted)] mb-1">npm Package</label>
|
|
1967
1967
|
<input
|
|
1968
1968
|
type="text"
|
|
1969
1969
|
value={pkg}
|
|
1970
1970
|
onChange={e => handlePackageChange(e.target.value)}
|
|
1971
1971
|
placeholder="e.g., @modelcontextprotocol/server-filesystem or paste full command"
|
|
1972
|
-
className="w-full bg-[
|
|
1972
|
+
className="w-full bg-[var(--color-bg)] border border-[var(--color-border-light)] rounded px-3 py-2 focus:outline-none focus:border-[var(--color-accent)]"
|
|
1973
1973
|
/>
|
|
1974
|
-
<p className="text-xs text-[
|
|
1974
|
+
<p className="text-xs text-[var(--color-text-faint)] mt-1">
|
|
1975
1975
|
Package name or paste a full npx command with credentials
|
|
1976
1976
|
</p>
|
|
1977
1977
|
</div>
|
|
@@ -1981,7 +1981,7 @@ function AddServerModal({
|
|
|
1981
1981
|
{mode === "pip" && (
|
|
1982
1982
|
<div className="space-y-4">
|
|
1983
1983
|
<div>
|
|
1984
|
-
<label className="block text-sm text-[
|
|
1984
|
+
<label className="block text-sm text-[var(--color-text-muted)] mb-1">pip Package</label>
|
|
1985
1985
|
<input
|
|
1986
1986
|
type="text"
|
|
1987
1987
|
value={pkg}
|
|
@@ -1994,22 +1994,22 @@ function AddServerModal({
|
|
|
1994
1994
|
}
|
|
1995
1995
|
}}
|
|
1996
1996
|
placeholder="e.g., late-sdk[mcp]"
|
|
1997
|
-
className="w-full bg-[
|
|
1997
|
+
className="w-full bg-[var(--color-bg)] border border-[var(--color-border-light)] rounded px-3 py-2 focus:outline-none focus:border-[var(--color-accent)]"
|
|
1998
1998
|
/>
|
|
1999
|
-
<p className="text-xs text-[
|
|
1999
|
+
<p className="text-xs text-[var(--color-text-faint)] mt-1">
|
|
2000
2000
|
Python package with extras, e.g., late-sdk[mcp] or mcp-server-time
|
|
2001
2001
|
</p>
|
|
2002
2002
|
</div>
|
|
2003
2003
|
<div>
|
|
2004
|
-
<label className="block text-sm text-[
|
|
2004
|
+
<label className="block text-sm text-[var(--color-text-muted)] mb-1">Module (optional)</label>
|
|
2005
2005
|
<input
|
|
2006
2006
|
type="text"
|
|
2007
2007
|
value={pipModule}
|
|
2008
2008
|
onChange={e => setPipModule(e.target.value)}
|
|
2009
2009
|
placeholder="e.g., late.mcp"
|
|
2010
|
-
className="w-full bg-[
|
|
2010
|
+
className="w-full bg-[var(--color-bg)] border border-[var(--color-border-light)] rounded px-3 py-2 font-mono text-sm focus:outline-none focus:border-[var(--color-accent)]"
|
|
2011
2011
|
/>
|
|
2012
|
-
<p className="text-xs text-[
|
|
2012
|
+
<p className="text-xs text-[var(--color-text-faint)] mt-1">
|
|
2013
2013
|
Python module to run with -m. Auto-detected from package name if not specified.
|
|
2014
2014
|
</p>
|
|
2015
2015
|
</div>
|
|
@@ -2019,15 +2019,15 @@ function AddServerModal({
|
|
|
2019
2019
|
{/* Custom Command */}
|
|
2020
2020
|
{mode === "command" && (
|
|
2021
2021
|
<div>
|
|
2022
|
-
<label className="block text-sm text-[
|
|
2022
|
+
<label className="block text-sm text-[var(--color-text-muted)] mb-1">Command</label>
|
|
2023
2023
|
<input
|
|
2024
2024
|
type="text"
|
|
2025
2025
|
value={command}
|
|
2026
2026
|
onChange={e => handleCommandChange(e.target.value)}
|
|
2027
2027
|
placeholder="e.g., npx -y pushover-mcp@latest start --token YOUR_TOKEN"
|
|
2028
|
-
className="w-full bg-[
|
|
2028
|
+
className="w-full bg-[var(--color-bg)] border border-[var(--color-border-light)] rounded px-3 py-2 font-mono text-sm focus:outline-none focus:border-[var(--color-accent)]"
|
|
2029
2029
|
/>
|
|
2030
|
-
<p className="text-xs text-[
|
|
2030
|
+
<p className="text-xs text-[var(--color-text-faint)] mt-1">
|
|
2031
2031
|
Paste the full command - credentials like YOUR_TOKEN will be auto-extracted
|
|
2032
2032
|
</p>
|
|
2033
2033
|
</div>
|
|
@@ -2037,38 +2037,38 @@ function AddServerModal({
|
|
|
2037
2037
|
{mode === "http" && (
|
|
2038
2038
|
<div className="space-y-4">
|
|
2039
2039
|
<div>
|
|
2040
|
-
<label className="block text-sm text-[
|
|
2040
|
+
<label className="block text-sm text-[var(--color-text-muted)] mb-1">URL</label>
|
|
2041
2041
|
<input
|
|
2042
2042
|
type="text"
|
|
2043
2043
|
value={url}
|
|
2044
2044
|
onChange={e => setUrl(e.target.value)}
|
|
2045
2045
|
placeholder="e.g., https://example.com/wp-json/mcp/v1/messages"
|
|
2046
|
-
className="w-full bg-[
|
|
2046
|
+
className="w-full bg-[var(--color-bg)] border border-[var(--color-border-light)] rounded px-3 py-2 font-mono text-sm focus:outline-none focus:border-[var(--color-accent)]"
|
|
2047
2047
|
/>
|
|
2048
2048
|
</div>
|
|
2049
|
-
<div className="p-3 bg-[
|
|
2050
|
-
<p className="text-xs text-[
|
|
2049
|
+
<div className="p-3 bg-[var(--color-bg)] border border-[var(--color-border-light)] rounded">
|
|
2050
|
+
<p className="text-xs text-[var(--color-text-muted)] mb-3">
|
|
2051
2051
|
Optional: Basic Auth credentials (will be encoded and stored securely)
|
|
2052
2052
|
</p>
|
|
2053
2053
|
<div className="grid grid-cols-2 gap-3">
|
|
2054
2054
|
<div>
|
|
2055
|
-
<label className="block text-xs text-[
|
|
2055
|
+
<label className="block text-xs text-[var(--color-text-faint)] mb-1">Username</label>
|
|
2056
2056
|
<input
|
|
2057
2057
|
type="text"
|
|
2058
2058
|
value={username}
|
|
2059
2059
|
onChange={e => setUsername(e.target.value)}
|
|
2060
2060
|
placeholder="username"
|
|
2061
|
-
className="w-full bg-[
|
|
2061
|
+
className="w-full bg-[var(--color-surface)] border border-[var(--color-border-light)] rounded px-3 py-2 text-sm focus:outline-none focus:border-[var(--color-accent)]"
|
|
2062
2062
|
/>
|
|
2063
2063
|
</div>
|
|
2064
2064
|
<div>
|
|
2065
|
-
<label className="block text-xs text-[
|
|
2065
|
+
<label className="block text-xs text-[var(--color-text-faint)] mb-1">Password</label>
|
|
2066
2066
|
<input
|
|
2067
2067
|
type="password"
|
|
2068
2068
|
value={password}
|
|
2069
2069
|
onChange={e => setPassword(e.target.value)}
|
|
2070
2070
|
placeholder="password or app key"
|
|
2071
|
-
className="w-full bg-[
|
|
2071
|
+
className="w-full bg-[var(--color-surface)] border border-[var(--color-border-light)] rounded px-3 py-2 text-sm focus:outline-none focus:border-[var(--color-accent)]"
|
|
2072
2072
|
/>
|
|
2073
2073
|
</div>
|
|
2074
2074
|
</div>
|
|
@@ -2079,19 +2079,19 @@ function AddServerModal({
|
|
|
2079
2079
|
{/* Environment Variables / Credentials */}
|
|
2080
2080
|
<div>
|
|
2081
2081
|
<div className="flex items-center justify-between mb-2">
|
|
2082
|
-
<label className="text-sm text-[
|
|
2082
|
+
<label className="text-sm text-[var(--color-text-muted)]">
|
|
2083
2083
|
Environment Variables / Credentials
|
|
2084
2084
|
</label>
|
|
2085
2085
|
<button
|
|
2086
2086
|
onClick={addEnvVar}
|
|
2087
|
-
className="text-xs text-[
|
|
2087
|
+
className="text-xs text-[var(--color-accent)] hover:text-[var(--color-accent-hover)] transition"
|
|
2088
2088
|
>
|
|
2089
2089
|
+ Add Variable
|
|
2090
2090
|
</button>
|
|
2091
2091
|
</div>
|
|
2092
2092
|
|
|
2093
2093
|
{envVars.length === 0 && (
|
|
2094
|
-
<p className="text-xs text-[
|
|
2094
|
+
<p className="text-xs text-[var(--color-text-faint)] bg-[var(--color-bg)] border border-[var(--color-border-light)] rounded p-3">
|
|
2095
2095
|
Add environment variables for API tokens and credentials.
|
|
2096
2096
|
These are stored encrypted and passed to the server at startup.
|
|
2097
2097
|
</p>
|
|
@@ -2106,18 +2106,18 @@ function AddServerModal({
|
|
|
2106
2106
|
value={env.key}
|
|
2107
2107
|
onChange={e => updateEnvVar(index, "key", e.target.value)}
|
|
2108
2108
|
placeholder="KEY"
|
|
2109
|
-
className="w-1/3 bg-[
|
|
2109
|
+
className="w-1/3 bg-[var(--color-bg)] border border-[var(--color-border-light)] rounded px-2 py-1.5 text-sm font-mono focus:outline-none focus:border-[var(--color-accent)]"
|
|
2110
2110
|
/>
|
|
2111
2111
|
<input
|
|
2112
2112
|
type="password"
|
|
2113
2113
|
value={env.value}
|
|
2114
2114
|
onChange={e => updateEnvVar(index, "value", e.target.value)}
|
|
2115
2115
|
placeholder="value"
|
|
2116
|
-
className="flex-1 bg-[
|
|
2116
|
+
className="flex-1 bg-[var(--color-bg)] border border-[var(--color-border-light)] rounded px-2 py-1.5 text-sm font-mono focus:outline-none focus:border-[var(--color-accent)]"
|
|
2117
2117
|
/>
|
|
2118
2118
|
<button
|
|
2119
2119
|
onClick={() => removeEnvVar(index)}
|
|
2120
|
-
className="text-[
|
|
2120
|
+
className="text-[var(--color-text-muted)] hover:text-red-400 px-2 transition"
|
|
2121
2121
|
>
|
|
2122
2122
|
✕
|
|
2123
2123
|
</button>
|
|
@@ -2130,17 +2130,17 @@ function AddServerModal({
|
|
|
2130
2130
|
{error && <p className="text-red-400 text-sm">{error}</p>}
|
|
2131
2131
|
</div>
|
|
2132
2132
|
|
|
2133
|
-
<div className="p-4 border-t border-[
|
|
2133
|
+
<div className="p-4 border-t border-[var(--color-border)] flex justify-end gap-2 sticky bottom-0 bg-[var(--color-surface)]">
|
|
2134
2134
|
<button
|
|
2135
2135
|
onClick={onClose}
|
|
2136
|
-
className="px-4 py-2 border border-[
|
|
2136
|
+
className="px-4 py-2 border border-[var(--color-border-light)] hover:border-[var(--color-text-muted)] rounded transition"
|
|
2137
2137
|
>
|
|
2138
2138
|
Cancel
|
|
2139
2139
|
</button>
|
|
2140
2140
|
<button
|
|
2141
2141
|
onClick={handleAdd}
|
|
2142
2142
|
disabled={saving || !name || (mode === "npm" ? !pkg : mode === "pip" ? !pkg : mode === "http" ? !url : !command)}
|
|
2143
|
-
className="px-4 py-2 bg-[
|
|
2143
|
+
className="px-4 py-2 bg-[var(--color-accent)] hover:bg-[var(--color-accent-hover)] text-black rounded font-medium transition disabled:opacity-50"
|
|
2144
2144
|
>
|
|
2145
2145
|
{saving ? "Adding..." : "Add Server"}
|
|
2146
2146
|
</button>
|
|
@@ -2303,37 +2303,37 @@ function EditServerModal({
|
|
|
2303
2303
|
|
|
2304
2304
|
return (
|
|
2305
2305
|
<div className="fixed inset-0 bg-black/50 backdrop-blur-[2px] z-50 flex items-center justify-center p-4">
|
|
2306
|
-
<div className="bg-[
|
|
2307
|
-
<div className="p-4 border-b border-[
|
|
2306
|
+
<div className="bg-[var(--color-surface)] border border-[var(--color-border)] rounded-lg w-full max-w-lg max-h-[90vh] overflow-y-auto">
|
|
2307
|
+
<div className="p-4 border-b border-[var(--color-border)] flex items-center justify-between sticky top-0 bg-[var(--color-surface)]">
|
|
2308
2308
|
<h2 className="text-lg font-semibold">Edit MCP Server</h2>
|
|
2309
|
-
<button onClick={onClose} className="text-[
|
|
2309
|
+
<button onClick={onClose} className="text-[var(--color-text-muted)] hover:text-[var(--color-text-secondary)]">
|
|
2310
2310
|
✕
|
|
2311
2311
|
</button>
|
|
2312
2312
|
</div>
|
|
2313
2313
|
|
|
2314
2314
|
<div className="p-4 space-y-4">
|
|
2315
2315
|
{/* Server Type Info */}
|
|
2316
|
-
<div className="text-sm text-[
|
|
2317
|
-
Type: <span className="text-[
|
|
2318
|
-
{server.package && <> • Package: <span className="text-[
|
|
2319
|
-
{server.command && <> • Command: <span className="text-[
|
|
2316
|
+
<div className="text-sm text-[var(--color-text-muted)] bg-[var(--color-bg)] border border-[var(--color-border-light)] rounded p-3">
|
|
2317
|
+
Type: <span className="text-[var(--color-text-secondary)]">{server.type}</span>
|
|
2318
|
+
{server.package && <> • Package: <span className="text-[var(--color-text-secondary)] font-mono">{server.package}</span></>}
|
|
2319
|
+
{server.command && <> • Command: <span className="text-[var(--color-text-secondary)] font-mono">{server.command}</span></>}
|
|
2320
2320
|
</div>
|
|
2321
2321
|
|
|
2322
2322
|
{/* Name */}
|
|
2323
2323
|
<div>
|
|
2324
|
-
<label className="block text-sm text-[
|
|
2324
|
+
<label className="block text-sm text-[var(--color-text-muted)] mb-1">Name</label>
|
|
2325
2325
|
<input
|
|
2326
2326
|
type="text"
|
|
2327
2327
|
value={name}
|
|
2328
2328
|
onChange={e => setName(e.target.value)}
|
|
2329
|
-
className="w-full bg-[
|
|
2329
|
+
className="w-full bg-[var(--color-bg)] border border-[var(--color-border-light)] rounded px-3 py-2 focus:outline-none focus:border-[var(--color-accent)]"
|
|
2330
2330
|
/>
|
|
2331
2331
|
</div>
|
|
2332
2332
|
|
|
2333
2333
|
{/* Project Scope */}
|
|
2334
2334
|
{hasProjects && (
|
|
2335
2335
|
<div>
|
|
2336
|
-
<label className="block text-sm text-[
|
|
2336
|
+
<label className="block text-sm text-[var(--color-text-muted)] mb-1">Scope</label>
|
|
2337
2337
|
<Select
|
|
2338
2338
|
value={projectId || ""}
|
|
2339
2339
|
onChange={(value) => setProjectId(value || null)}
|
|
@@ -2349,12 +2349,12 @@ function EditServerModal({
|
|
|
2349
2349
|
{/* Package (for npm type) */}
|
|
2350
2350
|
{server.type === "npm" && (
|
|
2351
2351
|
<div>
|
|
2352
|
-
<label className="block text-sm text-[
|
|
2352
|
+
<label className="block text-sm text-[var(--color-text-muted)] mb-1">npm Package</label>
|
|
2353
2353
|
<input
|
|
2354
2354
|
type="text"
|
|
2355
2355
|
value={pkg}
|
|
2356
2356
|
onChange={e => setPkg(e.target.value)}
|
|
2357
|
-
className="w-full bg-[
|
|
2357
|
+
className="w-full bg-[var(--color-bg)] border border-[var(--color-border-light)] rounded px-3 py-2 font-mono text-sm focus:outline-none focus:border-[var(--color-accent)]"
|
|
2358
2358
|
/>
|
|
2359
2359
|
</div>
|
|
2360
2360
|
)}
|
|
@@ -2362,12 +2362,12 @@ function EditServerModal({
|
|
|
2362
2362
|
{/* Package (for pip type) */}
|
|
2363
2363
|
{server.type === "pip" && (
|
|
2364
2364
|
<div>
|
|
2365
|
-
<label className="block text-sm text-[
|
|
2365
|
+
<label className="block text-sm text-[var(--color-text-muted)] mb-1">pip Package</label>
|
|
2366
2366
|
<input
|
|
2367
2367
|
type="text"
|
|
2368
2368
|
value={pkg}
|
|
2369
2369
|
onChange={e => setPkg(e.target.value)}
|
|
2370
|
-
className="w-full bg-[
|
|
2370
|
+
className="w-full bg-[var(--color-bg)] border border-[var(--color-border-light)] rounded px-3 py-2 font-mono text-sm focus:outline-none focus:border-[var(--color-accent)]"
|
|
2371
2371
|
/>
|
|
2372
2372
|
</div>
|
|
2373
2373
|
)}
|
|
@@ -2376,34 +2376,34 @@ function EditServerModal({
|
|
|
2376
2376
|
{isRemote && (
|
|
2377
2377
|
<>
|
|
2378
2378
|
<div>
|
|
2379
|
-
<label className="block text-sm text-[
|
|
2379
|
+
<label className="block text-sm text-[var(--color-text-muted)] mb-1">Server URL</label>
|
|
2380
2380
|
<input
|
|
2381
2381
|
type="text"
|
|
2382
2382
|
value={url}
|
|
2383
2383
|
onChange={e => setUrl(e.target.value)}
|
|
2384
2384
|
placeholder="https://example.com/mcp"
|
|
2385
|
-
className="w-full bg-[
|
|
2385
|
+
className="w-full bg-[var(--color-bg)] border border-[var(--color-border-light)] rounded px-3 py-2 font-mono text-sm focus:outline-none focus:border-[var(--color-accent)]"
|
|
2386
2386
|
/>
|
|
2387
2387
|
</div>
|
|
2388
2388
|
<div>
|
|
2389
|
-
<label className="block text-sm text-[
|
|
2389
|
+
<label className="block text-sm text-[var(--color-text-muted)] mb-1">Authentication (Basic Auth)</label>
|
|
2390
2390
|
<div className="flex gap-2">
|
|
2391
2391
|
<input
|
|
2392
2392
|
type="text"
|
|
2393
2393
|
value={username}
|
|
2394
2394
|
onChange={e => setUsername(e.target.value)}
|
|
2395
2395
|
placeholder="Username"
|
|
2396
|
-
className="flex-1 bg-[
|
|
2396
|
+
className="flex-1 bg-[var(--color-bg)] border border-[var(--color-border-light)] rounded px-3 py-2 text-sm focus:outline-none focus:border-[var(--color-accent)]"
|
|
2397
2397
|
/>
|
|
2398
2398
|
<input
|
|
2399
2399
|
type="password"
|
|
2400
2400
|
value={password}
|
|
2401
2401
|
onChange={e => setPassword(e.target.value)}
|
|
2402
2402
|
placeholder="Password / App Password"
|
|
2403
|
-
className="flex-1 bg-[
|
|
2403
|
+
className="flex-1 bg-[var(--color-bg)] border border-[var(--color-border-light)] rounded px-3 py-2 text-sm focus:outline-none focus:border-[var(--color-accent)]"
|
|
2404
2404
|
/>
|
|
2405
2405
|
</div>
|
|
2406
|
-
<p className="text-xs text-[
|
|
2406
|
+
<p className="text-xs text-[var(--color-text-faint)] mt-1">
|
|
2407
2407
|
Leave empty if no authentication required
|
|
2408
2408
|
</p>
|
|
2409
2409
|
</div>
|
|
@@ -2414,22 +2414,22 @@ function EditServerModal({
|
|
|
2414
2414
|
{server.type === "custom" && (
|
|
2415
2415
|
<>
|
|
2416
2416
|
<div>
|
|
2417
|
-
<label className="block text-sm text-[
|
|
2417
|
+
<label className="block text-sm text-[var(--color-text-muted)] mb-1">Command</label>
|
|
2418
2418
|
<input
|
|
2419
2419
|
type="text"
|
|
2420
2420
|
value={command}
|
|
2421
2421
|
onChange={e => setCommand(e.target.value)}
|
|
2422
|
-
className="w-full bg-[
|
|
2422
|
+
className="w-full bg-[var(--color-bg)] border border-[var(--color-border-light)] rounded px-3 py-2 font-mono text-sm focus:outline-none focus:border-[var(--color-accent)]"
|
|
2423
2423
|
/>
|
|
2424
2424
|
</div>
|
|
2425
2425
|
<div>
|
|
2426
|
-
<label className="block text-sm text-[
|
|
2426
|
+
<label className="block text-sm text-[var(--color-text-muted)] mb-1">Arguments</label>
|
|
2427
2427
|
<input
|
|
2428
2428
|
type="text"
|
|
2429
2429
|
value={args}
|
|
2430
2430
|
onChange={e => setArgs(e.target.value)}
|
|
2431
2431
|
placeholder="e.g., --token $TOKEN --verbose"
|
|
2432
|
-
className="w-full bg-[
|
|
2432
|
+
className="w-full bg-[var(--color-bg)] border border-[var(--color-border-light)] rounded px-3 py-2 font-mono text-sm focus:outline-none focus:border-[var(--color-accent)]"
|
|
2433
2433
|
/>
|
|
2434
2434
|
</div>
|
|
2435
2435
|
</>
|
|
@@ -2439,19 +2439,19 @@ function EditServerModal({
|
|
|
2439
2439
|
{!isRemote && (
|
|
2440
2440
|
<div>
|
|
2441
2441
|
<div className="flex items-center justify-between mb-2">
|
|
2442
|
-
<label className="text-sm text-[
|
|
2442
|
+
<label className="text-sm text-[var(--color-text-muted)]">
|
|
2443
2443
|
Environment Variables / Credentials
|
|
2444
2444
|
</label>
|
|
2445
2445
|
<button
|
|
2446
2446
|
onClick={addEnvVar}
|
|
2447
|
-
className="text-xs text-[
|
|
2447
|
+
className="text-xs text-[var(--color-accent)] hover:text-[var(--color-accent-hover)] transition"
|
|
2448
2448
|
>
|
|
2449
2449
|
+ Add Variable
|
|
2450
2450
|
</button>
|
|
2451
2451
|
</div>
|
|
2452
2452
|
|
|
2453
2453
|
{envVars.length === 0 && (
|
|
2454
|
-
<p className="text-xs text-[
|
|
2454
|
+
<p className="text-xs text-[var(--color-text-faint)] bg-[var(--color-bg)] border border-[var(--color-border-light)] rounded p-3">
|
|
2455
2455
|
No environment variables configured.
|
|
2456
2456
|
</p>
|
|
2457
2457
|
)}
|
|
@@ -2465,18 +2465,18 @@ function EditServerModal({
|
|
|
2465
2465
|
value={env.key}
|
|
2466
2466
|
onChange={e => updateEnvVar(index, "key", e.target.value)}
|
|
2467
2467
|
placeholder="KEY"
|
|
2468
|
-
className="w-1/3 bg-[
|
|
2468
|
+
className="w-1/3 bg-[var(--color-bg)] border border-[var(--color-border-light)] rounded px-2 py-1.5 text-sm font-mono focus:outline-none focus:border-[var(--color-accent)]"
|
|
2469
2469
|
/>
|
|
2470
2470
|
<input
|
|
2471
2471
|
type="password"
|
|
2472
2472
|
value={env.value}
|
|
2473
2473
|
onChange={e => updateEnvVar(index, "value", e.target.value)}
|
|
2474
2474
|
placeholder="value"
|
|
2475
|
-
className="flex-1 bg-[
|
|
2475
|
+
className="flex-1 bg-[var(--color-bg)] border border-[var(--color-border-light)] rounded px-2 py-1.5 text-sm font-mono focus:outline-none focus:border-[var(--color-accent)]"
|
|
2476
2476
|
/>
|
|
2477
2477
|
<button
|
|
2478
2478
|
onClick={() => removeEnvVar(index)}
|
|
2479
|
-
className="text-[
|
|
2479
|
+
className="text-[var(--color-text-muted)] hover:text-red-400 px-2 transition"
|
|
2480
2480
|
>
|
|
2481
2481
|
✕
|
|
2482
2482
|
</button>
|
|
@@ -2485,7 +2485,7 @@ function EditServerModal({
|
|
|
2485
2485
|
</div>
|
|
2486
2486
|
)}
|
|
2487
2487
|
|
|
2488
|
-
<p className="text-xs text-[
|
|
2488
|
+
<p className="text-xs text-[var(--color-text-faint)] mt-2">
|
|
2489
2489
|
{server.status === "running" ? "Server will be automatically restarted to apply changes." : "Changes will take effect when the server is started."}
|
|
2490
2490
|
</p>
|
|
2491
2491
|
</div>
|
|
@@ -2494,17 +2494,17 @@ function EditServerModal({
|
|
|
2494
2494
|
{error && <p className="text-red-400 text-sm">{error}</p>}
|
|
2495
2495
|
</div>
|
|
2496
2496
|
|
|
2497
|
-
<div className="p-4 border-t border-[
|
|
2497
|
+
<div className="p-4 border-t border-[var(--color-border)] flex justify-end gap-2 sticky bottom-0 bg-[var(--color-surface)]">
|
|
2498
2498
|
<button
|
|
2499
2499
|
onClick={onClose}
|
|
2500
|
-
className="px-4 py-2 border border-[
|
|
2500
|
+
className="px-4 py-2 border border-[var(--color-border-light)] hover:border-[var(--color-text-muted)] rounded transition"
|
|
2501
2501
|
>
|
|
2502
2502
|
Cancel
|
|
2503
2503
|
</button>
|
|
2504
2504
|
<button
|
|
2505
2505
|
onClick={handleSave}
|
|
2506
2506
|
disabled={saving || !name.trim()}
|
|
2507
|
-
className="px-4 py-2 bg-[
|
|
2507
|
+
className="px-4 py-2 bg-[var(--color-accent)] hover:bg-[var(--color-accent-hover)] text-black rounded font-medium transition disabled:opacity-50"
|
|
2508
2508
|
>
|
|
2509
2509
|
{saving ? "Saving..." : "Save Changes"}
|
|
2510
2510
|
</button>
|