WP_Query of a custom post type isn’t working

Write code for human beings to read it. If you indent your code, add white space and use good variable names it will be more readable to human beings. The human being you are writing for is usually yourself in 4 to 6 months.

For example, your first function could look like this:

add_action( 'init', 'custom_faq_type_mp' );

function custom_faq_type_mp() {

    register_post_type(

        'faq_type_mp',
        array(
            'labels'  => array(
                'name'          => 'View current FAQs ',
                'singular_name' => 'FAQ',
                'add_new'       => 'Add New FAQ',
                'add_new_item'  => 'Add New FAQ',
                'edit'          => 'Edit',
                'edit_item'     => 'Edit FAQ',
                'new_item'      => 'New FAQ',
                'view'          => 'View',
                'view_item'     => 'View FAQ',
                'search_items'  => 'Search FAQs',
                'parent'        => 'Parent Form'
                'not_found'     => 'No FAQs found',
                'not_found_in_trash' => 'No Forms found in Trash',
            ),
            'public'        => true,
            'menu_position' => 15,
            'supports'      => array( 'title', 'editor' ),
            'taxonomies'    => array( '' ),
            'menu_icon'     => plugins_url( 'images/image.png', FILE ),
            'has_archive'   => true
        )
    );
}

There is no reason to add a comment ending the function because the ending brace is in the same column as the function definition. If you use a text editor that can match braces ( {}, [], (), etc ) it may highlight (or find) the opening brace for you.

Here is another example from your code:

// Display the FAQs using a shortcode
add_action( 'init', ' mp_faq_register_shortcodes' );

function mp_faq_register_shortcodes() {

    /* register the [display_faqs] shortcode */
    add_shortcode( 'display_faqs', 'mp_faq_shortcode' );

With the guts of the function indented, it becomes pretty obvious that the function closing brace is missing. That could be purposeful, but it is usually a syntax error.

After spending a few hundred hours debugging your code, your eyes will be drawn to any code line that does not end in a semicolon (;). Adding white space (blank lines, tabs etc.) can make some syntax errors more obvious. Like the one pointed out in the comments.

// Loop through the faqs (the loop).
while ( $loop->have_posts() ) {

    $loop->the_post();

    // Display the faq question.
    $output .= post_title() ,

}

Variable names can make some code self documenting. Instead of using $output as the report name, use $faq_list. Then your last comment is unnecessary. Here is similar code with two variable name changes ($loop became faqs).

// Query FAQs from the database.
$faqs = new WP_Query(
    array(
        'post_type' => 'faq_type_mp',
        'orderby'   => 'title',
        'order'     => 'ASC',
        'post_per_page' => -1,
    )
);

// Check if any faqs were returned.
if ( $faqs->have_posts() ) {

    // Open an unordered list.
    $faq_list="<ul class="faq-list">";

    // Loop through the faqs (the loop).
    while ( $faqs->have_posts() ) {

        // Set up post data.
        $loop->the_post();

        // Add the faq question to the list.
        $faq_list .= sprintf( '<li>%s</li>', get_the_title() );

    }

    // Close the unordered list.
    $faq_list .= '</ul>';

} else {
     // No faqs were found.
    $faq_list="No FAQs have been published.";
}

return $faq_list;

You might also like to read the WordPress PHP Coding Standards guide and PHP programming guides. Don’t be intimidated; Writing readable code is a huge subject with lots of opinions.