diff --git a/pkg/api/handlers/mcpcatalogs.go b/pkg/api/handlers/mcpcatalogs.go index c2f8f50c1d..958012ac88 100644 --- a/pkg/api/handlers/mcpcatalogs.go +++ b/pkg/api/handlers/mcpcatalogs.go @@ -1251,6 +1251,11 @@ func (h *MCPCatalogHandler) RefreshCompositeComponents(req api.Context) error { } } + // Validate the refreshed manifest to ensure it's still valid + if err := validation.ValidateCatalogEntryManifest(entry.Spec.Manifest); err != nil { + return types.NewErrBadRequest("failed to validate entry manifest: %v", err) + } + // Update the entry if err := req.Update(&entry); err != nil { return fmt.Errorf("failed to update entry: %w", err) diff --git a/pkg/storage/apis/obot.obot.ai/v1/mcpserver.go b/pkg/storage/apis/obot.obot.ai/v1/mcpserver.go index 59119a62f8..f19eefdf27 100644 --- a/pkg/storage/apis/obot.obot.ai/v1/mcpserver.go +++ b/pkg/storage/apis/obot.obot.ai/v1/mcpserver.go @@ -63,13 +63,18 @@ func (in *MCPServer) FieldNames() []string { } func (in *MCPServer) DeleteRefs() []Ref { - return []Ref{ + refs := []Ref{ {ObjType: &Thread{}, Name: in.Spec.ThreadName}, - {ObjType: &MCPServerCatalogEntry{}, Name: in.Spec.MCPServerCatalogEntryName}, {ObjType: &MCPCatalog{}, Name: in.Spec.MCPCatalogID}, {ObjType: &PowerUserWorkspace{}, Name: in.Spec.PowerUserWorkspaceID}, {ObjType: &MCPServer{}, Name: in.Spec.CompositeName}, } + if in.Spec.CompositeName == "" { + // Only garbage collect an MCP server when the catalog entry is deleted if it's not a component of a composite MCP server. + // Component MCP servers get their manifest from the composite catalog entry instead. + refs = append(refs, Ref{ObjType: &MCPServerCatalogEntry{}, Name: in.Spec.MCPServerCatalogEntryName}) + } + return refs } type MCPServerSpec struct {