[BUG] SessionStart lists an authenticated, tool-loaded claude.ai connector under "requires authentication" and instructs the agent to announce it as unavailable

Status Open
Maintainer reply None cached
Activity 3 comments · opened Jul 10, 2026

Summary

At session start (and re-injected in every subsequent <system-reminder> turn), Claude Code emits a block listing MCP servers that "require authentication." A claude.ai connector that is already authenticated — and whose action tools are loaded and callable in the very same session — is nonetheless listed there under an alias name, and the block ends with a standing imperative:

"Tell the user that these servers need to be authorized … and that the capability is unavailable until they do."

The result: the model reads the block, believes it, and tells the user the connector is unauthenticated/unavailable — even though the connector's tools are present and work on the first call. Because the instruction is re-injected each turn, this repeats across every agent/session on the affected connector.

This is distinct from (and in some sense the inverse of) #59434, where the connector's action tools are genuinely missing (only auth-handshake stubs are present). Here the action tools are surfaced and functional; only the reminder is wrong. #59434 is marked completed, but this residual variant is still live.

Environment

  • Claude Code embedded in the Claude Desktop app, macOS
  • Model: Claude Opus 4.8
  • Connector: Linear (https://mcp.linear.app/mcp), status Connected in claude.ai → Settings → Connectors
  • Session started non-interactively

Evidence / what actually happens

  • The SessionStart reminder lists plugin:productivity:linear under "servers requiring authentication," followed by the imperative to tell the user it needs authorizing.
  • Meanwhile the connector's real tools are registered in the same session under an opaque UUID server name (mcp__<uuid>__list_teams, …__list_issues, …__get_issue, …__create_issue, etc.). The alias flagged as "needs auth" and the actually-loaded working server are two names for the same connector.
  • Calling one of those tools (list_teams) succeeds immediately and returns real workspace data — no auth prompt, no error.
  • So the model is simultaneously (a) holding a working, authenticated tool and (b) being told, every turn, that the tool needs authentication and is unavailable. It follows the louder, repeated instruction and misreports the connector as down. When the user pushes back and the model finally calls the tool, it works — the classic "oops, you were right" reversal.

Steps to reproduce

  1. Connect a claude.ai connector (e.g. Linear) so it shows Connected in claude.ai → Settings → Connectors.
  2. Start a Claude Code session in the Desktop app.
  3. Observe the SessionStart <system-reminder> lists the connector's plugin:<category>:<name> alias under "requires authentication," with the imperative to tell the user it must be authorized.
  4. Ask the model whether the connector is available → it typically says no / not authenticated.
  5. Force the issue; have it call one of the connector's tools → the call succeeds and returns data.

Expected

  • The "requires authentication" block should not list connectors that are already authenticated and whose tools are loaded in the session.
  • The two representations of one connector — the plugin:<category>:<name> alias and the actually-loaded UUID-named server — should be reconciled so the model never receives contradictory signals about the same connector.
  • The block should not carry a standing, every-turn imperative to tell the user a connector is unavailable; at minimum it should be conditioned on the tools genuinely being absent, and phrased as a non-blocking notice.

Actual

Persistent, per-turn misinformation: the model tells the user an authenticated, working connector is unauthenticated/unavailable, until forced to test it.

Related

  • #59434 (closed/completed) — authenticated connectors not surfaced in a running session; inverse symptom (tools missing there vs. tools present-but-flagged here), and the completion didn't cover this variant.
  • #66290 (open) — the "needs auth" banner wedging message-injection in headless sessions; same false-needs-auth root, different symptom.
  • #56889 (open, docs) — documenting the "needs auth" vs "failed" status distinction.
  • #63036 (open, docs) — documenting the combined startup connector-auth notification.

View original on GitHub ↗

3 Comments

fxstein · 1 month ago

Confirming this on a second, independent setup — and adding a quantified downstream impact.

Environment: Claude Code 2.1.175 embedded in Claude Desktop, macOS (Darwin 25.5.0); Linear connector (https://mcp.linear.app/mcp) connected at the claude.ai account level; sessions started non-interactively.

Same symptom, same wording: every session's system context lists plugin:productivity:linear under "MCP servers require authentication before their tools can be used," ending with the imperative to tell the user the capability is unavailable until authorized. Meanwhile the connector's real tools are live in the same session under the connection UUID (mcp__c3893199-…__list_issues, …__save_issue, …__list_teams, …) and work on the first call.

Impact data point: a transcript search across our sessions found two independent agent sessions within 36 hours that read the block, announced "Linear isn't authenticated in this session," and aborted their task — both were supposed to file Linear tickets. The false line compounds with the UUID prefix problem (#77598, #58015): the model searches its tools for "linear," matches only the phantom plugin alias, and concludes the capability is missing even though the tools are present.

Workaround we're testing: "deniedMcpServers": [{"serverName": "plugin:productivity:linear"}, {"serverName": "productivity:linear"}] in ~/.claude/settings.json to suppress the false entry, plus a CLAUDE.md note mapping the UUID prefix to Linear. Caveat per #39624: denylist-vs-connector semantics are underdocumented, so we're watching whether the deny takes the real connector's tools with it. Will report back either way.

ec-morris · 1 month ago

Confirming independently — same Linear symptom, reproduced repeatedly over three weeks across many sessions, non-interactive.

Two things not yet covered here:

  1. Not Linear-specific. Caught plugin:slack:slack hitting the identical false flag once, confirmed by direct test in the same session ("Linear and Slack tools work fine despite the earlier flag").
  2. A worse variant of the impact: rather than aborting, one session stated the false caveat up front, then completed its actual task normally — but silently skipped the one step that depended on the flagged connector (updating a tracking ticket). No error, no retry, nothing surfaced. Task looked done; wasn't.

Also relevant: #77534 (same text, hypothesizes session-interactivity vs. real token state as the gate) and #78220 (plausible reason a flag sticks — a stale per-name auth cache that a bare 403 can poison, never cleared by remove/re-add).

fxstein · 1 month ago

Reporting back on the deniedMcpServers workaround floated earlier. On our host (Claude Code 2.1.175 in Claude Desktop, macOS) we added to ~/.claude/settings.json:

"deniedMcpServers": [{ "serverName": "plugin:productivity:linear" }, { "serverName": "productivity:linear" }]

It works, with a caveat. The denied name stops appearing in the SessionStart "requires authentication" list, and — importantly — the authenticated Linear connector (added via Customize, mounted under its connection UUID) stays fully live: tool calls succeed in the same session. So denying the decoy name suppresses the false caveat without collateral damage to the real connector.

Caveat: it's a per-exact-name patch, so it's brittle to name churn. We've since seen the marketplace Linear plugin move namespace (productivityproduct-management), which would require a matching deny entry; and per @ec-morris above the false flag isn't Linear-specific. A deny list isn't a fix — the real bug is the authenticated connector being listed as unauthenticated in the first place — but it's a working stopgap for anyone blocked today.