Skip to content

Commit 5de8134

Browse files
author
Lasim
committed
feat(frontend): add website URL field to MCP server forms
1 parent f4c71d0 commit 5de8134

File tree

10 files changed

+161
-76
lines changed

10 files changed

+161
-76
lines changed

services/frontend/src/components/admin/mcp-catalog/McpServerAddFormWizard.vue

Lines changed: 8 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -65,6 +65,7 @@ interface McpServerAddFormData {
6565
featured: boolean
6666
auto_install_new_default_team: boolean
6767
transport_type: string
68+
website_url: string
6869
}
6970
}
7071
@@ -190,7 +191,8 @@ const formData = ref<McpServerAddFormData>({
190191
tags: [],
191192
featured: false,
192193
auto_install_new_default_team: false,
193-
transport_type: 'auto'
194+
transport_type: 'auto',
195+
website_url: ''
194196
}
195197
})
196198
@@ -368,6 +370,7 @@ const autoPopulateFromGitHub = (repositoryData: any) => {
368370
organization: repositoryData.owner?.type === 'Organization' ? repositoryData.owner.login : (repositoryData.organization || ''),
369371
license: repositoryData.license?.spdx_id || repositoryData.license || '',
370372
tags: repositoryData.topics || repositoryData.tags || [],
373+
website_url: repositoryData.homepage || '',
371374
// Keep existing values for these properties
372375
featured: formData.value.basic.featured,
373376
auto_install_new_default_team: formData.value.basic.auto_install_new_default_team,
@@ -452,11 +455,11 @@ const submitForm = async () => {
452455
finalPayload.repository_url = repositoryUrl;
453456
finalPayload.repository_source = formData.value.repository.repository_source;
454457
finalPayload.git_branch = formData.value.repository.git_branch;
458+
}
455459
456-
// From auto-population or manual entry
457-
if (formData.value.repository.repo_data?.homepage) {
458-
finalPayload.website_url = formData.value.repository.repo_data.homepage;
459-
}
460+
// Include website_url from basic info (can be manually entered or auto-populated)
461+
if (formData.value.basic.website_url && formData.value.basic.website_url.trim() !== '') {
462+
finalPayload.website_url = formData.value.basic.website_url;
460463
}
461464
462465
await emit('submit', finalPayload)

services/frontend/src/components/admin/mcp-catalog/McpServerEditFormWizard.vue

Lines changed: 10 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -180,7 +180,7 @@ const initializeStorageWithData = (data: McpServerFormData) => {
180180
repository_source: data.repository.repository_source || 'github',
181181
repository_id: data.repository.repository_id || '',
182182
repository_subfolder: data.repository.repository_subfolder || '',
183-
git_branch: data.repository.git_branch || 'main',
183+
git_branch: data.repository.git_branch || '',
184184
website_url: data.repository.website_url || ''
185185
}
186186
@@ -190,7 +190,7 @@ const initializeStorageWithData = (data: McpServerFormData) => {
190190
const repositorySetupData = {
191191
repository_url: repositoryData.repository_url || '',
192192
repository_source: repositoryData.repository_source || '',
193-
git_branch: repositoryData.git_branch || 'main',
193+
git_branch: repositoryData.git_branch || '',
194194
auto_populated: !!data.repository_setup?.auto_populated
195195
}
196196
eventBus.setState('edit_repository_setup_data', repositorySetupData)
@@ -288,14 +288,15 @@ const formData = ref<McpServerFormData>({
288288
license: '',
289289
tags: [],
290290
featured: false,
291-
auto_install_new_default_team: false
291+
auto_install_new_default_team: false,
292+
website_url: ''
292293
},
293294
repository: {
294295
repository_url: '',
295296
repository_source: '',
296297
repository_id: '',
297298
repository_subfolder: '',
298-
git_branch: 'main',
299+
git_branch: '',
299300
website_url: ''
300301
},
301302
technical: {
@@ -309,7 +310,7 @@ const formData = ref<McpServerFormData>({
309310
repository_setup: {
310311
repository_url: '',
311312
repository_source: '',
312-
git_branch: 'main',
313+
git_branch: '',
313314
auto_populated: false
314315
},
315316
review: {}
@@ -486,14 +487,15 @@ const autoPopulateFromRepository = (repositoryData: any) => {
486487
license: repositoryData.license?.spdx_id || repositoryData.license || '',
487488
tags: repositoryData.topics || repositoryData.tags || [],
488489
featured: false,
489-
auto_install_new_default_team: false
490+
auto_install_new_default_team: false,
491+
website_url: repositoryData.homepage || repositoryData.website_url || ''
490492
},
491493
repository: {
492494
repository_url: repositoryData.html_url || repositoryData.repository_url || formData.value.repository_setup.repository_url,
493495
repository_source: repositoryData.repository_source || formData.value.repository_setup.repository_source,
494496
repository_id: repositoryData.repository_id || '',
495497
repository_subfolder: repositoryData.repository_subfolder || '',
496-
git_branch: repositoryData.default_branch || 'main',
498+
git_branch: repositoryData.default_branch || '',
497499
website_url: repositoryData.homepage || repositoryData.website_url || ''
498500
},
499501
technical: {
@@ -507,7 +509,7 @@ const autoPopulateFromRepository = (repositoryData: any) => {
507509
repository_setup: {
508510
repository_url: repositoryData.html_url || repositoryData.repository_url || formData.value.repository_setup.repository_url,
509511
repository_source: repositoryData.repository_source || formData.value.repository_setup.repository_source,
510-
git_branch: repositoryData.default_branch || 'main',
512+
git_branch: repositoryData.default_branch || '',
511513
auto_populated: true,
512514
repo_data: repositoryData
513515
}

services/frontend/src/components/admin/mcp-catalog/RepositoryStep.vue

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -30,7 +30,7 @@ const STORAGE_KEY = 'edit_repository_setup_data'
3030
// Form state from storage
3131
const repositoryUrl = ref('')
3232
const repositorySource = ref('')
33-
const gitBranch = ref('main')
33+
const gitBranch = ref('')
3434
const validationError = ref<string | null>(null)
3535
3636
// Load data from storage on mount
@@ -40,11 +40,11 @@ const loadFromStorage = () => {
4040
if (stored) {
4141
repositoryUrl.value = stored.repository_url || ''
4242
repositorySource.value = stored.repository_source || ''
43-
gitBranch.value = stored.git_branch || 'main'
43+
gitBranch.value = stored.git_branch || ''
4444
} else if (props.modelValue) {
4545
repositoryUrl.value = props.modelValue.repository_url || ''
4646
repositorySource.value = props.modelValue.repository_source || ''
47-
gitBranch.value = props.modelValue.git_branch || 'main'
47+
gitBranch.value = props.modelValue.git_branch || ''
4848
}
4949
}
5050
@@ -194,7 +194,7 @@ onMounted(() => {
194194
placeholder="main"
195195
/>
196196
<p class="text-sm text-muted-foreground">
197-
Specify the branch to use (defaults to 'main')
197+
Specify the branch to use (optional)
198198
</p>
199199
</div>
200200
</div>

services/frontend/src/components/admin/mcp-catalog/ReviewStep.vue

Lines changed: 11 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -93,9 +93,9 @@ const getRepositoryData = () => {
9393
return {
9494
...repoData,
9595
// Override with setup data if available (this is what user edited in RepositoryStep)
96-
repository_url: setupData.repository_url || repoData.repository_url,
97-
repository_source: setupData.repository_source || repoData.repository_source,
98-
git_branch: setupData.git_branch || repoData.git_branch
96+
repository_url: setupData.repository_url !== undefined ? setupData.repository_url : repoData.repository_url,
97+
repository_source: setupData.repository_source !== undefined ? setupData.repository_source : repoData.repository_source,
98+
git_branch: setupData.git_branch !== undefined ? setupData.git_branch : repoData.git_branch
9999
}
100100
}
101101
const getTechnicalData = () => freshTechnicalData.value || props.formData.technical
@@ -200,6 +200,13 @@ const formatJson = (jsonString: string) => {
200200
</dd>
201201
</div>
202202

203+
<div class="px-4 py-6 sm:grid sm:grid-cols-3 sm:gap-4 sm:px-0">
204+
<dt class="text-sm/6 font-medium text-gray-900">{{ t('mcpCatalog.form.review.fields.homepage') }}</dt>
205+
<dd class="mt-1 text-sm/6 text-gray-700 sm:col-span-2 sm:mt-0">
206+
{{ getBasicData().website_url || t('mcpCatalog.form.review.values.notSpecified') }}
207+
</dd>
208+
</div>
209+
203210
<div v-if="getBasicData().tags && getBasicData().tags.length > 0" class="px-4 py-6 sm:grid sm:grid-cols-3 sm:gap-4 sm:px-0">
204211
<dt class="text-sm/6 font-medium text-gray-900">{{ t('mcpCatalog.form.review.fields.tags') }}</dt>
205212
<dd class="mt-1 text-sm/6 text-gray-700 sm:col-span-2 sm:mt-0">
@@ -231,14 +238,7 @@ const formatJson = (jsonString: string) => {
231238
<div class="px-4 py-6 sm:grid sm:grid-cols-3 sm:gap-4 sm:px-0">
232239
<dt class="text-sm/6 font-medium text-gray-900">{{ t('mcpCatalog.form.review.fields.gitBranch') }}</dt>
233240
<dd class="mt-1 text-sm/6 text-gray-700 sm:col-span-2 sm:mt-0">
234-
{{ getRepositoryData().git_branch || 'main' }}
235-
</dd>
236-
</div>
237-
238-
<div class="px-4 py-6 sm:grid sm:grid-cols-3 sm:gap-4 sm:px-0">
239-
<dt class="text-sm/6 font-medium text-gray-900">{{ t('mcpCatalog.form.review.fields.homepage') }}</dt>
240-
<dd class="mt-1 text-sm/6 text-gray-700 sm:col-span-2 sm:mt-0">
241-
{{ getRepositoryData().website_url || t('mcpCatalog.form.review.values.notSpecified') }}
241+
{{ getRepositoryData().git_branch || t('mcpCatalog.form.review.values.notSpecified') }}
242242
</dd>
243243
</div>
244244
</dl>

services/frontend/src/components/admin/mcp-catalog/steps/BasicInfoStepAdd.vue

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -259,6 +259,20 @@ loadCategories()
259259
/>
260260
</SharedFormField>
261261

262+
<!-- Website URL -->
263+
<SharedFormField
264+
:label="t('mcpCatalog.form.basic.websiteUrl.label')"
265+
:description="t('mcpCatalog.form.basic.websiteUrl.description')"
266+
>
267+
<Input
268+
id="website_url"
269+
:model-value="localData.website_url"
270+
@update:model-value="(value) => updateField('website_url', String(value))"
271+
:placeholder="t('mcpCatalog.form.basic.websiteUrl.placeholder')"
272+
type="url"
273+
/>
274+
</SharedFormField>
275+
262276
<!-- Tags -->
263277
<SharedFormField
264278
:label="t('mcpCatalog.form.basic.tags.label')"

services/frontend/src/components/admin/mcp-catalog/steps/BasicInfoStepEdit.vue

Lines changed: 16 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -67,7 +67,8 @@ const defaultData: BasicInfoFormData = {
6767
license: '',
6868
tags: [],
6969
featured: false,
70-
auto_install_new_default_team: false
70+
auto_install_new_default_team: false,
71+
website_url: ''
7172
}
7273
7374
// Storage-first reactive data - using ref instead of computed for better reactivity
@@ -328,6 +329,20 @@ onUnmounted(() => {
328329
/>
329330
</SharedFormField>
330331

332+
<!-- Website URL -->
333+
<SharedFormField
334+
:label="t('mcpCatalog.form.basic.websiteUrl.label')"
335+
:description="t('mcpCatalog.form.basic.websiteUrl.description')"
336+
>
337+
<Input
338+
id="website_url"
339+
:model-value="localData.website_url"
340+
@update:model-value="(value) => updateField('website_url', String(value))"
341+
:placeholder="t('mcpCatalog.form.basic.websiteUrl.placeholder')"
342+
type="url"
343+
/>
344+
</SharedFormField>
345+
331346
<!-- Tags -->
332347
<SharedFormField
333348
:label="t('mcpCatalog.form.basic.tags.label')"

services/frontend/src/i18n/locales/en/mcp-catalog.ts

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -361,6 +361,11 @@ export default {
361361
placeholder: 'e.g., MIT, Apache-2.0',
362362
description: 'Software license for this server'
363363
},
364+
websiteUrl: {
365+
label: 'Website URL',
366+
placeholder: 'https://example.com',
367+
description: 'Official website or documentation URL for this MCP server'
368+
},
364369
tags: {
365370
label: 'Tags',
366371
placeholder: 'Add tags (press Enter to add)',
@@ -722,6 +727,8 @@ export default {
722727
author: 'Author Information',
723728
technical: 'Technical Specifications',
724729
links: 'Repository Links',
730+
repositoryUrl: 'Repository URL',
731+
websiteUrl: 'Website URL',
725732
status: 'Status & Classification',
726733
tags: 'Tags',
727734
installation: 'Installation Methods',

services/frontend/src/views/admin/mcp-server-catalog/edit/[id].vue

Lines changed: 23 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -156,13 +156,14 @@ const convertServerToFormData = (server: McpServer): Partial<McpServerFormData>
156156
tags: parsedTags,
157157
featured: Boolean(server.featured),
158158
auto_install_new_default_team: Boolean(server.auto_install_new_default_team),
159+
website_url: server.website_url || ''
159160
},
160161
repository: {
161162
repository_url: server.repository_url || '',
162163
repository_source: server.repository_source || 'github',
163164
repository_id: server.repository_id || '',
164165
repository_subfolder: server.repository_subfolder || '',
165-
git_branch: server.git_branch || 'main',
166+
git_branch: server.git_branch || '',
166167
website_url: server.website_url || ''
167168
},
168169
technical: {
@@ -177,7 +178,7 @@ const convertServerToFormData = (server: McpServer): Partial<McpServerFormData>
177178
repository_setup: {
178179
repository_url: server.repository_url || '',
179180
repository_source: server.repository_source || 'github',
180-
git_branch: server.git_branch || 'main',
181+
git_branch: server.git_branch || '',
181182
auto_populated: false
182183
},
183184
review: {}
@@ -194,6 +195,21 @@ const handleSubmit = async (formData: McpServerFormData) => {
194195
const parsedResources = parseJsonField(server.resources, [])
195196
const parsedPrompts = parseJsonField(server.prompts, [])
196197
198+
// Get fresh repository data from storage (RepositoryStep uses storage-first architecture)
199+
const repositorySetupData = eventBus.getState<{
200+
repository_url?: string
201+
repository_source?: string
202+
git_branch?: string
203+
auto_populated?: boolean
204+
}>('edit_repository_setup_data')
205+
206+
// Merge repository data: storage takes priority over formData
207+
const finalRepositoryData = {
208+
repository_url: repositorySetupData?.repository_url !== undefined ? repositorySetupData.repository_url : formData.repository.repository_url,
209+
repository_source: repositorySetupData?.repository_source !== undefined ? repositorySetupData.repository_source : formData.repository.repository_source,
210+
git_branch: repositorySetupData?.git_branch !== undefined ? repositorySetupData.git_branch : formData.repository.git_branch
211+
}
212+
197213
// CRITICAL FIX: Synchronize environment variables from installation_methods to team_env_schema
198214
let finalConfigurationSchema = { ...formData.configuration_schema }
199215
@@ -254,13 +270,13 @@ const handleSubmit = async (formData: McpServerFormData) => {
254270
featured: formData.basic.featured,
255271
auto_install_new_default_team: formData.basic.auto_install_new_default_team,
256272
257-
// Repository
258-
repository_url: formData.repository.repository_url || undefined,
259-
repository_source: formData.repository.repository_source || undefined,
273+
// Repository (use finalRepositoryData which merges storage + formData)
274+
repository_url: finalRepositoryData.repository_url || undefined,
275+
repository_source: finalRepositoryData.repository_source || undefined,
260276
repository_id: formData.repository.repository_id || undefined,
261277
repository_subfolder: formData.repository.repository_subfolder || undefined,
262-
git_branch: formData.repository.git_branch || 'main',
263-
website_url: formData.repository.website_url || undefined,
278+
git_branch: finalRepositoryData.git_branch ? finalRepositoryData.git_branch : null,
279+
website_url: formData.basic.website_url || undefined,
264280
265281
// Technical
266282
language: formData.technical.language,

services/frontend/src/views/admin/mcp-server-catalog/types.ts

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,7 @@ export interface McpServer {
2929
organization?: string
3030
license?: string
3131
transport_type?: 'stdio' | 'http' | 'sse'
32+
requires_oauth?: boolean
3233

3334
// New three-tier schema fields
3435
template_args?: TemplateArg[] | string
@@ -231,6 +232,7 @@ export interface CreateMcpServerRequest {
231232
organization?: string
232233
license?: string
233234
transport_type?: 'stdio' | 'http' | 'sse'
235+
requires_oauth?: boolean
234236

235237
// New three-tier schema fields
236238
template_args?: TemplateArg[]
@@ -266,7 +268,7 @@ export interface UpdateMcpServerRequest {
266268
repository_source?: string
267269
repository_id?: string
268270
repository_subfolder?: string
269-
git_branch?: string
271+
git_branch?: string | null
270272
website_url?: string
271273
language?: string
272274
runtime?: string
@@ -279,6 +281,7 @@ export interface UpdateMcpServerRequest {
279281
organization?: string
280282
license?: string
281283
transport_type?: 'stdio' | 'http' | 'sse'
284+
requires_oauth?: boolean
282285

283286
// New three-tier schema fields
284287
template_args?: TemplateArg[]
@@ -325,6 +328,7 @@ export interface BasicInfoFormData {
325328
tags: string[]
326329
featured: boolean
327330
auto_install_new_default_team: boolean
331+
website_url: string
328332
}
329333

330334
export interface RepositoryFormData {

0 commit comments

Comments
 (0)