Skip to content

Commit a709a37

Browse files
author
Lasim
committed
feat(frontend): add user configuration management to MCP server installation
1 parent e999121 commit a709a37

File tree

7 files changed

+1000
-143
lines changed

7 files changed

+1000
-143
lines changed

services/frontend/src/components/mcp-server/installation/TeamConfiguration.vue

Lines changed: 2 additions & 140 deletions
Original file line numberDiff line numberDiff line change
@@ -89,25 +89,7 @@ const teamEnvSchema = computed(() => {
8989
}
9090
})
9191
92-
const userArgsSchema = computed(() => {
93-
const schema = props.installation.server?.user_args_schema || serverData.value?.user_args_schema
94-
if (!schema) return []
95-
try {
96-
return Array.isArray(schema) ? schema : JSON.parse(schema)
97-
} catch {
98-
return []
99-
}
100-
})
10192
102-
const userEnvSchema = computed(() => {
103-
const schema = props.installation.server?.user_env_schema || serverData.value?.user_env_schema
104-
if (!schema) return []
105-
try {
106-
return Array.isArray(schema) ? schema : JSON.parse(schema)
107-
} catch {
108-
return []
109-
}
110-
})
11193
11294
// Get current team configuration values
11395
const currentTeamArgs = computed(() => {
@@ -135,17 +117,11 @@ const teamEnvWithData = computed(() => {
135117
}))
136118
})
137119
138-
// Prepare user environment variables for display
139-
const userEnvWithData = computed(() => {
140-
return userEnvSchema.value.map((envSchema: any) => ({
141-
...envSchema,
142-
currentValue: '' // User env vars don't have team-set values
143-
}))
144-
})
120+
145121
146122
// Check if there's any team configuration
147123
const hasTeamConfiguration = computed(() => {
148-
return teamArgsSchema.value.length > 0 || teamEnvSchema.value.length > 0 || userArgsSchema.value.length > 0 || userEnvSchema.value.length > 0
124+
return teamArgsSchema.value.length > 0 || teamEnvSchema.value.length > 0
149125
})
150126
151127
// Modal functions
@@ -407,121 +383,7 @@ const modalTitle = computed(() => {
407383
</ul>
408384
</div>
409385

410-
<!-- Separator -->
411-
<hr v-if="(teamArgsSchema.length > 0 || teamEnvSchema.length > 0) && (userArgsSchema.length > 0 || userEnvSchema.length > 0)" class="my-8 border-gray-200" />
412-
413-
<!-- User Arguments Section (Read-only Info) -->
414-
<div v-if="userArgsSchema.length > 0">
415-
<div class="mb-4">
416-
<h4 class="text-sm font-semibold text-gray-900">{{ t('mcpInstallations.teamConfiguration.sections.userArgs.title') }}</h4>
417-
<p class="text-xs text-gray-500">
418-
{{ t('mcpInstallations.teamConfiguration.sections.userArgs.description') }}
419-
</p>
420-
</div>
421386

422-
<ul role="list" class="space-y-3">
423-
<li v-for="(arg, index) in userArgsSchema" :key="`user_arg_${index}`" class="flex items-center justify-between gap-x-6 py-5 bg-muted/50 rounded-lg px-4">
424-
<div class="min-w-0 flex-1">
425-
<div class="flex items-start gap-x-3">
426-
<p class="text-sm/6 font-semibold text-gray-900 font-mono">
427-
{{ arg.name }}
428-
</p>
429-
</div>
430-
<div class="mt-1 text-xs/5 text-gray-700">
431-
<span class="font-medium text-gray-800">{{ t('mcpInstallations.teamConfiguration.table.labels.required') }}</span>
432-
<span class="ml-1">{{ arg.required ? t('common.labels.yes') : t('common.labels.no') }}</span>
433-
</div>
434-
</div>
435-
436-
<div class="flex-1 min-w-0">
437-
<div class="space-y-1 text-xs/5 text-gray-700">
438-
<div>
439-
<span class="font-medium text-gray-800">{{ t('mcpInstallations.teamConfiguration.table.labels.type') }}</span>
440-
<span class="ml-1">{{ arg.type || t('mcpInstallations.teamConfiguration.table.labels.defaultType') }}</span>
441-
</div>
442-
<div v-if="arg.description">
443-
<span class="font-medium text-gray-800">{{ t('mcpInstallations.teamConfiguration.table.labels.description') }}</span>
444-
<span class="ml-1">{{ arg.description }}</span>
445-
</div>
446-
<div>
447-
<span class="font-medium text-gray-800">{{ t('mcpInstallations.teamConfiguration.table.labels.value') }}</span>
448-
<span class="ml-1 font-mono">
449-
{{ t('mcpInstallations.teamConfiguration.sections.userEnv.userConfigured') }}
450-
</span>
451-
</div>
452-
</div>
453-
</div>
454-
455-
<div class="flex flex-none items-center gap-x-4">
456-
<Button
457-
size="sm"
458-
variant="outline"
459-
disabled
460-
class="cursor-not-allowed opacity-50"
461-
>
462-
{{ t('mcpInstallations.teamConfiguration.table.actions.editValue') }}
463-
</Button>
464-
</div>
465-
</li>
466-
</ul>
467-
</div>
468-
469-
<!-- User Environment Variables Section (Read-only Info) -->
470-
<div v-if="userEnvSchema.length > 0">
471-
<div class="mb-4">
472-
<h4 class="text-sm font-semibold text-gray-900">{{ t('mcpInstallations.teamConfiguration.sections.userEnv.title') }}</h4>
473-
<p class="text-xs text-gray-500">
474-
{{ t('mcpInstallations.teamConfiguration.sections.userEnv.individualConfig') }}
475-
{{ t('mcpInstallations.teamConfiguration.sections.userEnv.perMemberConfig') }}
476-
</p>
477-
</div>
478-
479-
<ul role="list" class="space-y-3">
480-
<li v-for="envVar in userEnvWithData" :key="envVar.name" class="flex items-center justify-between gap-x-6 py-5 bg-muted/50 rounded-lg px-4">
481-
<div class="min-w-0 flex-1">
482-
<div class="flex items-start gap-x-3">
483-
<p class="text-sm/6 font-semibold text-gray-900 font-mono">
484-
{{ envVar.name }}
485-
</p>
486-
</div>
487-
<div class="mt-1 text-xs/5 text-gray-700">
488-
<span class="font-medium text-gray-800">{{ t('mcpInstallations.teamConfiguration.table.labels.required') }}</span>
489-
<span class="ml-1">{{ envVar.required ? t('common.labels.yes') : t('common.labels.no') }}</span>
490-
</div>
491-
</div>
492-
493-
<div class="flex-1 min-w-0">
494-
<div class="space-y-1 text-xs/5 text-gray-700">
495-
<div>
496-
<span class="font-medium text-gray-800">{{ t('mcpInstallations.teamConfiguration.table.labels.type') }}</span>
497-
<span class="ml-1">{{ envVar.type || t('mcpInstallations.teamConfiguration.table.labels.defaultType') }}</span>
498-
</div>
499-
<div v-if="envVar.description">
500-
<span class="font-medium text-gray-800">{{ t('mcpInstallations.teamConfiguration.table.labels.description') }}</span>
501-
<span class="ml-1">{{ envVar.description }}</span>
502-
</div>
503-
<div>
504-
<span class="font-medium text-gray-800">{{ t('mcpInstallations.teamConfiguration.table.labels.value') }}</span>
505-
<span class="ml-1 font-mono">
506-
{{ t('mcpInstallations.teamConfiguration.sections.userEnv.userConfigured') }}
507-
</span>
508-
</div>
509-
</div>
510-
</div>
511-
512-
<div class="flex flex-none items-center gap-x-4">
513-
<Button
514-
size="sm"
515-
variant="outline"
516-
disabled
517-
class="cursor-not-allowed opacity-50"
518-
>
519-
{{ t('mcpInstallations.teamConfiguration.table.actions.editValue') }}
520-
</Button>
521-
</div>
522-
</li>
523-
</ul>
524-
</div>
525387
</div>
526388

527389
<!-- Empty State -->

0 commit comments

Comments
 (0)