Regression in 2.1.112: plugin HTTP+OAuth MCP servers silently dropped

Resolved 💬 3 comments Opened Apr 17, 2026 by johnkwaters Closed Apr 20, 2026

Description

Plugin .mcp.json entries that configure HTTP MCP servers with an oauth block are silently dropped in Claude Code 2.1.112. The plugin's skill loads, but the MCP server never registers — claude mcp list does not show it, and claude mcp get <name> returns "No MCP server found." No error is logged.

Reverting to 2.1.86 immediately restores the MCP server — it appears nested under the plugin in /mcp, the OAuth browser flow completes successfully, and all tools load.

Reproduction

  1. Install a plugin from a custom marketplace whose .mcp.json configures an HTTP+OAuth MCP server:
{
  "prdchronosmcp": {
    "type": "http",
    "url": "https://chronosmcpprod.trailheadtechnology.com/",
    "oauth": {
      "clientId": "claudecode",
      "callbackPort": 8080,
      "scopes": ["mcp:tools", "openid", "profile", "chronosapi"]
    }
  }
}
  1. Run /reload-plugins — reports "1 plugin MCP server" (only stdio plugins like context7 register; the HTTP+OAuth one is missing).
  2. Run claude mcp list — the plugin's server does not appear. Other HTTP servers (claude.ai connectors, manually added servers) are fine.
  3. Run claude mcp get plugin:chronos:prdchronosmcp — "No MCP server found."

Expected behavior

The MCP server should register under plugin:<plugin-name>:<server-name>, appear in /mcp for OAuth authentication, and load tools after the user completes the browser flow — exactly as it does on 2.1.86.

Environment

  • Working version: 2.1.86 (native install, macOS)
  • Broken version: 2.1.112 (native install, macOS)
  • Platform: darwin (macOS 25.3.0)
  • Plugin transport: HTTP with pre-registered OAuth client (not DCR)

Notes

  • The oauth.clientId is pre-registered on the server — the server does not support Dynamic Client Registration (RFC 7591). On 2.1.86, Claude Code correctly uses the provided clientId to initiate the authorization code flow. On 2.1.112, it appears to skip or fail before reaching that point.
  • Possibly related to #46623 and #38102 (silent OAuth failures, clientId ignored in favor of DCR).
  • Both wrapped (mcpServers: { ... }) and unwrapped (server name as top-level key) .mcp.json formats were tested — neither loads on 2.1.112.
  • Stdio plugin MCP servers (e.g., context7 via npx) continue to work fine on both versions.

View original on GitHub ↗

This issue has 3 comments on GitHub. Read the full discussion on GitHub ↗