For starters it is unclear why the array input has MAX_SZIE elements
char input[MAX_SIZE], output[MAX_SIZE + 1];
while the array output has MAX_SIZE + 1 elements.
After this loop (that is unsafe)
while ((c = getchar()) != '\n')
{
    input[index] = c;
    ++index;
}
the array input does not contain a string.
The initial value of the variable str in this loop within the function revrese
for (int str = MAX_SIZE - 1; str >= 0; --str) {
does not make a sense because the user can enter less than MAX_SIZE - 1 characters in the array.
The program in whole and the function reverse can look the following way as it is shown in the demonstrative program below.
#include <string.h>
#include <stdio.h>
#define MAX_SIZE 100
char * reverse( const char src[], char dsn[] )
{
    char *p = dsn + strlen( src );
    *p = '\0';
    while (p != dsn) *--p = *src++;
    return dsn;
}
int main( void )
{
    char input[MAX_SIZE], output[MAX_SIZE];
    size_t i = 0;
    for (int c; i + 1 < MAX_SIZE && ( c = getchar() ) != EOF && c != '\n'; ++i)
    {
        input[i] = c;
    }
    input[i] = '\0';
    puts( reverse( input, output ) );
}
If to enter for example text
Hello World!
then the output will be
!dlroW olleH
Pay attention to that the first function parameter should have the qualifier const because the passed source string is not being changed within the function. The function should follow the common convention for standard string functions and return a pointer to the destination string. That is the function return type void does not make a great sense.
And when you deal with strings use objects of the unsigned type size_t instead of the signed type int as indices. The type size_t is the type of returned values of the function strlen or the operator sizeof.