Remote OAuth MCP server shows "✔ Connected" but registers 0 tools in-session (Linear / mcp.linear.app)

Status Fixed / completed
Reported on v2.1.191
Maintainer reply None cached
Activity 3 comments · opened Jun 25, 2026 · closed Jun 25, 2026

ENVIRONMENT

  • Claude Code 2.1.191, macOS (Darwin 25.1.0), model Opus 4.8
  • Server: linear-server → https://mcp.linear.app/mcp (type: http, OAuth), added via claude mcp add, stored at project/local scope in ~/.claude.json
  • ~23 MCP servers configured total; linear-server is the LAST entry in the project's mcpServers

SUMMARY
A remote OAuth HTTP MCP server reports "✔ Connected" in claude mcp list and its
server-instructions block loads into the session, but ZERO of its tools are registered
(ToolSearch finds no mcp__linear-server__* tools; the model cannot call any). The OAuth
token is valid and the server returns tools fine on a direct call — Claude Code fetches
them and fails to register them.

EXPECTED: linear-server's 46 tools (list_issues, save_issue, list_teams, …) are available
in the session.
ACTUAL: 0 tools registered. select:mcp__linear-server__list_issues,… → "No matching
deferred tools found."

DECISIVE EVIDENCE (this is the key part)

  1. claude mcp list → linear-server: ✔ Connected.
  2. linear-server is NOT in disabledMcpServers; it IS in the project mcpServers config.
  3. Keychain blob "Claude Code-credentials" → mcpOAuth["linear-server|<hash>"]: VALID,

scope="read write", refresh token present, not expired.

  1. Using that SAME token, a raw MCP initialize + tools/list POST to

https://mcp.linear.app/mcp returns HTTP 200 and 46 tools.
=> Auth, scope, token, and the server are all fine. Claude Code is failing to
register tools it can successfully fetch.

  1. The unauthenticated initialize handshake succeeds (hence "Connected" + instructions

load), but the tool-registration path comes up empty with no surfaced error.

  1. Other OAuth HTTP servers in the same config (sentry, supabase, n8n, stripe) correctly

show "! Needs authentication" — so the "Connected" status is decoupled from whether
tools were actually registered. The status is misleading.

ALREADY RULED OUT / TRIED (no effect)

  • Not account/workspace gating: direct tools/list with the user's token returns all 46 tools.
  • Cleared ~/.mcp-auth (stale mcp-remote client registrations).
  • Removed a duplicate keychain mcpOAuth entry (an old server name sharing the same URL hash).
  • Full restart of Claude Code. Still 0 tools.
  • Linear's API key cannot be used as a static header bypass (endpoint 401 invalid_token;

only the 24h OAuth token is accepted), so the OAuth path can't be avoided.

IMPACT
The server is unusable despite a green "Connected" status, and the status gives no
indication anything is wrong. Appears correlated with having many MCP servers (the
affected server is last in the list) — possibly a startup contention / registration
race / tool-budget issue, but a single restart does not resolve it.

LIKELY RELATED ISSUES
#54710 (stale cached state for direct-config servers; reconnect doesn't re-fetch tools),
#10250 (OAuth succeeds, in-session reconnect fails), #44535 (mcp list "Connected"
diverges from in-session tool/auth state), #26917 (initialize succeeds, tools/list
unauthorized swallowed), #51736 (tools not populating the deferred-tools registry).

SUGGESTED FIX DIRECTIONS

  • Surface a real error when tools/list fails or returns 0 instead of showing "Connected".
  • Make claude mcp list status reflect actual tool registration, not just the initialize handshake.
  • Add a retry/refresh on the post-OAuth tools/list registration step, especially under

many-server startup contention.

View original on GitHub ↗

3 Comments

github-actions[bot] · 3 months ago

Found 3 possible duplicate issues:

  1. https://github.com/anthropics/claude-code/issues/60597
  2. https://github.com/anthropics/claude-code/issues/51138
  3. https://github.com/anthropics/claude-code/issues/12164

This issue will be automatically closed as a duplicate in 3 days.

  • If your issue is a duplicate, please close it and 👍 the existing issue instead
  • To prevent auto-closure, add a comment or 👎 this comment

🤖 Generated with Claude Code

theromeapp · 3 months ago

Resolved locally. This turned out not to be a Linear OAuth / remote MCP registration issue.

Root cause was a local Claude Code permission deny in the project settings:

// .claude/settings.local.json
"deny": [
  "mcp__claude_ai_Linear",
  "mcp__plugin_linear_linear",
  "mcp__linear-server"
]

User-level settings had mcp__claude_ai_Linear allowed, but the repo-local deny overrode it. That produced the confusing state where:

  • claude mcp list showed claude.ai Linear: https://mcp.linear.app/mcp - ✔ Connected
  • debug logs showed Linear initializing successfully via the claude.ai proxy with hasTools: true
  • the in-session deferred tool registry exposed zero callable mcp__claude_ai_Linear__* tools

Fix was to remove only this local deny entry:

- "mcp__claude_ai_Linear",
  "mcp__plugin_linear_linear",
  "mcp__linear-server"

I left the old deprecated/plugin Linear denies intact.

Verified afterward in a fresh claude -p session:

  • ToolSearch found the mcp__claude_ai_Linear__* tools.
  • Claude successfully called mcp__claude_ai_Linear__list_teams.
  • Claude successfully called mcp__claude_ai_Linear__list_issues and returned my assigned issue.

So this issue can be closed as local configuration / permission state rather than a current Claude Code bug.

github-actions[bot] · 1 month ago

This issue has been automatically locked since it was closed and has not had any activity for 7 days. If you're experiencing a similar issue, please file a new issue and reference this one if it's relevant.