91³Ô¹ÏÍø

Watch CBS News

Do the Vikings know if McCarthy is worth committing to? His bruising, unsteady debut left a mystery

The Minnesota Vikings lost their bet this season that they could develop J.J. McCarthy and still win at the same time, with a roster strong enough to withstand the typical inconsistencies of a young quarterback in his debut.

The worst part of their failed gamble for 2025 was that it left plenty more mystery for 2026. The Vikings have begun a new year with yet another quarterback quandary, a familiar scenario for this star-crossed franchise.

Asked after the final game on Sunday if he would be comfortable entering next season with McCarthy as the starter, coach Kevin O'Connell sidestepped the question.

"I can't wait to work with him in the offseason and absolutely look forward to the continued development and improvement," O'Connell said, "and I'm excited where he's ending the season and know there's some things we can really dive into as a group."

The Vikings made sure not to miss out on the record quarterback rush at the top of the 2024 draft, confidently selecting McCarthy with the 10th pick as the promising prospect for their reputable system they could mold into a long-term fixture at this vital and vexing position.

But his injuries have put them behind on the evaluation. The fact that he has only started 10 games and finished eight over his first two years is the most concerning of any metric. Even when he was healthy, the struggles with accuracy were pronounced enough to make them consider alternatives despite the significant upside on display.

After winging it with Carson Wentz and Max Brosmer as the backups, at the very least the Vikings realize they need better depth if they're going to run McCarthy back next season. McCarthy, for his part, sounded aware that his hold on the starting job is tenuous, too.

"There's nothing promised. That's something I take very seriously. It's not something you buy and you get for the rest of your life. You rent it and you lease it every single day, and I'm just trying to make daily deposits and make sure I'm in this house for a long time."

So close, in the end

Finishing with a five-game winning streak put the Vikings (9-8) a half-game behind Green Bay for the last spot even though they were eliminated before taking the field in Week 14.

Consider this: If the Vikings just had better coverage on their kickoff after McCarthy's go-ahead touchdown pass in the final minute in Week 11, when Devin Duvernay's 56-yard return set Chicago up for the walk-off field goal, they would've won that game — and the NFC North title.

"It's going to sting not being in the tournament for not only our team and the work that they've put in, but our fan base and our ownership," O'Connell said.

By the numbers

The Vikings still took third in the division on a tiebreaker over Detroit, meaning a road game next season against San Francisco (12-5) instead of Arizona (3-14) from the NFC West and home games against Indianapolis (8-9) instead of Tennessee (3-14) from the AFC South and Washington (5-12) instead of New York (4-13) from the NFC East.

The Vikings were able to get Justin Jefferson past the 1,000-yard mark for the sixth straight season to start his career, but the fact that he needed all 17 games to do that was ultimately one of many poor statistical reflections on this once-potent offense.

The Vikings were last in the NFL in turnovers, interceptions and third down conversions and second-to-last in sack percentage.

Bringing the band back?

The Vikings had another stellar performance under the direction of defensive coordinator Brian Flores, finishing second in red zone touchdown rate and sack percentage and third in the league in yards allowed. They were seventh in points against, one of only two teams in the top 13 in the NFL to miss the playoffs, along with Kansas City.

Flores will again be a candidate for head coach vacancies around the league, and his contract is expiring, too, raising the question about whether he will return. The scene at U.S. Bank Stadium on Sunday felt like a farewell to 14-year veteran safety Harrison Smith, too. Salary cap management will likely force the Vikings to move from one or both of the veteran defensive linemen they signed this season, Jonathan Allen and Javon Hargrave.

What's next?

The quarterback search will be complicated by an unfavorable salary cap situation, with the Vikings carrying the second-highest projected overage in the league into the offseason and thus needing to shed multiple important players before they can add new ones. More depth is needed on the offensive line, too, with the future of center Ryan Kelly in doubt after multiple concussions.

In the draft, they have the 18th pick in the first round and still possess their original second and third-round selections. They currently own five third-day picks and are in line to be awarded mid-round compensatory selections for the departure of free agent quarterbacks Sam Darnold and Daniel Jones last year.

View CBS News In
CBS News App Open
Chrome Safari Continue
const link = doc.createElement('link'); link.rel = 'stylesheet'; link.href = '/fly/fly/bundles/cbsnewscontent/css/cmp-banner.min.css?v=50747257b890e014813016b79ece0fb2'; doc.head.appendChild(link); doc.body.innerHTML = CONSENT_MESSAGE; } else { el.insertAdjacentHTML('afterend', CONSENT_MESSAGE); } }); } function hidePrivacyMessage() { // Remove from the main document document.querySelectorAll(`.${CONSENT_MESSAGE_CLASS}`).forEach(el => el.remove()); // Remove from inside any iframes document.querySelectorAll('iframe').forEach(iframe => { const doc = iframe.contentDocument || iframe.contentWindow.document; doc.querySelectorAll(`.${CONSENT_MESSAGE_CLASS}`).forEach(el => el.remove()); }); } function activateGatedScripts() { // Handle both new format (cmp-gated-script) and old OneTrust/Ketch format (optanon-category-4) const gatedScripts = Array.from(document.querySelectorAll('script.cmp-gated-script, script.optanon-category-4')); // Activate scripts sequentially with a small delay to avoid timing issues let delay = 0; gatedScripts.forEach(function(placeholder, index) { setTimeout(function() { // Skip if already processed if (placeholder.hasAttribute('data-cmp-processed')) { return; } placeholder.setAttribute('data-cmp-processed', 'true'); const newScript = document.createElement('script'); newScript.type = 'text/javascript'; // Try new format first (data-cmp-src), then fall back to old format (data-src) const src = placeholder.getAttribute('data-cmp-src') || placeholder.getAttribute('data-src'); if (src) { newScript.src = src; } else if (placeholder.textContent) { // Inline script - just copy the content newScript.textContent = placeholder.textContent; } // Handle new format attributes (data-cmp-attrs) - for both inline and external scripts const attrs = placeholder.getAttribute('data-cmp-attrs'); if (attrs) { const tempDiv = document.createElement('div'); tempDiv.innerHTML = '
<\/div>'; const tempAttrs = tempDiv.firstChild.attributes; for (let i = 0; i < tempAttrs.length; i++) { // For external scripts, allow defer/async. For inline scripts, skip them (not valid) if (src || (tempAttrs[i].name !== 'async' && tempAttrs[i].name !== 'defer')) { newScript.setAttribute(tempAttrs[i].name, tempAttrs[i].value); } } } // Copy other attributes from old OneTrust format for (let i = 0; i < placeholder.attributes.length; i++) { const attr = placeholder.attributes[i]; // Skip attributes we've already handled or don't want to copy if (!['class', 'data-src', 'data-type', 'data-cmp-src', 'data-cmp-attrs', 'data-cmp-processed', 'type', 'async', 'defer', 'src'].includes(attr.name)) { newScript.setAttribute(attr.name, attr.value); } } placeholder.parentNode.replaceChild(newScript, placeholder); // If external script, manually trigger window.onload handlers after it loads // This handles widgets that use window.onload for initialization if (src) { newScript.addEventListener('load', function() { // If page already loaded and script set a new onload handler, trigger it if (document.readyState === 'complete' && window.onload) { const originalOnload = window.onload; window.onload = null; // Clear temporarily to prevent loops originalOnload(); // Execute the handler } }); } }, delay); delay += 500; // 500ms delay between each script to allow full loading }); } cbsoptanon.onScriptsReady(function(cmp) { cmp.ot.targetingAllowed(function(allowed) { if (!allowed) { showPrivacyMessage(); } else { activateGatedScripts(); } }); cmp.ot.awaitInitialConsent(function(consent_model) { cmp.ot.addOnConsentChangedHandler(function() { cmp.ot.targetingAllowed(function(allowed) { if (allowed) { hidePrivacyMessage(); activateGatedScripts(); } else { showPrivacyMessage(); } }); }); }); });