doing something like this solved the problem (note that you need to know what are the actual msg_type_name's):
set sc_change [list {auth_authentication.Authenticate.InputType} {auth_password.ChangePassword.InputType} {auth_password.ResetPassword.InputType}]
set element_msg_type_name integer
foreach msg_type_name $sc_change {
set element_pos [db_string get_pos { select max(element_pos) from acs_sc_msg_type_elements where msg_type_id = (select msg_type_id from acs_sc_msg_types where msg_type_name = :msg_type_name) }]
incr element_pos
acs_sc::msg_type::element::new \
-msg_type_name $msg_type_name \
-element_name authority_id \
-element_msg_type_name $element_msg_type_name \
-element_msg_type_isset_p f \
-element_pos $element_pos
}
Of course, a generic API for this will be better.