Forum OpenACS Q&A: Re: Best way to modify a service contract input / output?

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.