Mira , el pin MCLR lo puedes usar como entrada,solo como entrada.
Si desactivas MCLR no pasa nada al querer reprogramar , solo tienes que enviar VPP primero antes que VCC al pic para que no se haga el loco.
Por eso en el pickit2 trae la opción de VPP first Entry.
También te comento que yo tengo configurado el pin MCLR como entrada y tiene la función de RX junto con la interru´pción por cambio de estado.
Te adjunto un fragmento de una minicontroladora de servos.
El pic recibe los comandos seriales por RA3 osea MCLR. Hecho en C con CCS
Mira esta línea 
enable_interrupts(INT_RA3);         //Habilitamos interrupcion por cambio de estado
                                       //en pin RA3
	
	
	
		Código:
	
	
		void main(){
 
   setup_comparator(NC_NC_NC_NC);      //Comparador deshabilitado
 
   output_A(0x00);                     //Latch 
   set_tris_A(0B001000);               //MCLR=A3= RX input Int_RA3 on Change
  
   enable_interrupts(GLOBAL);          //Interrupciones Habilitadas
   enable_interrupts(INT_TIMER1);      //Habilitamos interrupcion desborde TMR1
   SETUP_TIMER_1(T1_INTERNAL|T1_DIV_BY_1);
   enable_interrupts(INT_RA3);         //Habilitamos interrupcion por cambio de estado
                                       //en pin RA3
 
 
//---------  PROGRAMA PRINCIPAL   -----------------------------\\\\
 
   while(1){  
         
         for(indice=0;indice<n_servos;indice++){      //Toma valor de n servos
               aux=T_Servo[indice];      
               aux=65091-(aux*8);
               SET_TIMER1(aux);
 
               switch(indice){                  //1 Lógico a servo correspondiente
               case 0:output_high(Servo_1);break;
               case 1:output_high(Servo_2);break;
               case 2:output_high(Servo_3);break;
               case 3:output_high(Servo_4);break;
               case 4:output_high(Servo_5);break;
               }//switch
 
               while(flag_timer1==FALSE){}     //Loop Mientras no desborde TMR1
               flag_timer1=FALSE;
 
               switch(indice){                  //0 lógico a servo correspondiente
               case 0:output_low(Servo_1);break;
               case 1:output_low(Servo_2);break;
               case 2:output_low(Servo_3);break;
               case 3:output_low(Servo_4);break;
               case 4:output_low(Servo_5);break;               
               }//switch
 
         }// for  
//++++++++++++   ACTUALIZACION DE LOS SERVOMOTORES +++++++//
   if(flag_rx==TRUE){
         if(dato_recibido>=251){                    //Si es mayor a 250 es Servo,si Flag=TRUE es posicion
           indice_rx=(0xFF-dato_recibido);          //operacion lógica AND solo servos de 0-5        
           flag_Supdate=TRUE;                       // YA se puede actualizar el valor del servo
            if(aux2==2)aux2=0;                      //corrigiendo posible error de recepcion
            }
      if(dato_recibido<=250&&flag_Supdate==TRUE){
                  T_Servo[indice_rx]=dato_recibido;   //Actualizando valor del servo
                  flag_Supdate=FALSE;                 //Reiniciamos varibles 
                  dato_recibido=0;                    //Tarea completada
                  }
   flag_rx=FALSE;
   }//if--rx              
//+++++++++++++++++++Pausa de 10 ms  +++++++++++++++++++//         
               SET_TIMER1(55536);               //10ms
               while(flag_timer1==FALSE){}     //Loop Mientras no desborde TMR1
               flag_timer1=FALSE;
       }//loop end while
   
 
}//end main
 
 
//+++++++++++++++   INTERRUPCIONES   +++++++++++++++++++//
#INT_TIMER1
void desborde_TMR1(){                 //Interrupcion por desborde de timer
   flag_timer1=TRUE;
} // interrupcion TMR1
 
#INT_RA
void recepcion(){                    //Interrupcion por cambio de estado en pines
   if(!input(PIN_A3)){          // Bit de inicio ???
      dato_recibido=getc();     //Recibir dato
      flag_rx=TRUE;            //Dato recibido
      }//if
} //int_ra3
 
//+++++++++++++++++++++++++++++++++++++++++++++++++++++++//