plugin:engineering:github MCP fails to connect — dynamic OAuth client registration incompatible with GitHub Copilot MCP endpoint

Open 💬 0 comments Opened Jul 9, 2026 by cityvolga-ship-it

Bug: plugin:engineering:github MCP fails to connect — "Incompatible auth server: does not support dynamic client registration"

Summary

The bundled plugin:engineering:github MCP server (part of the engineering plugin bundle from Anthropic's built-in catalog) consistently fails to establish an authenticated connection. The MCP client attempts dynamic OAuth client registration against GitHub Copilot's MCP endpoint (https://api.githubcopilot.com/mcp/), which does not support dynamic client registration. As a result, github_* tools are never available in any session — including cowork/remote sessions where users have no fallback.

Environment

  • Claude Code: 2.1.196 (log also shows 2.1.202 across sessions)
  • Node runtime: v24.3.0 → v26.4.0
  • macOS: 15.4 (24E248) / darwin
  • Plugin: engineering bundle installed via desktop app (not claude plugin install)
  • Failure endpoint: https://api.githubcopilot.com/mcp/

Steps to reproduce

  1. Install engineering plugin bundle via Claude desktop app
  2. Start any Claude Code session (local or cowork)
  3. Observe MCP boot logs at ~/Library/Caches/claude-cli-nodejs/**/mcp-logs-plugin-engineering-github/*.jsonl

Expected

MCP connects, OAuth prompt appears in browser (using a pre-registered static OAuth client), user authorizes, github_* tools appear in the session.

Actual

Every session boot fails identically. No OAuth prompt is ever shown. The plugin appears "installed" but produces no working tools.

Confirmed across sessions spanning 2026-06-29 → 2026-07-09.

Log excerpt (sanitized)

{"debug":"Initializing HTTP transport to https://api.githubcopilot.com/mcp/"}
{"debug":"HTTP transport options: {url:https://api.githubcopilot.com/mcp/, hasAuthProvider:true}"}
{"debug":"Starting connection with timeout of 30000ms"}
{"debug":"No token data found"}
{"debug":"Saving discovery state (authServer: https://github.com/login/oauth)"}
{"debug":"No client info found"}
{"debug":"HTTP Connection failed after 4048ms: Incompatible auth server: does not support dynamic client registration (code: none, errno: none)"}
{"error":"Connection failed: Incompatible auth server: does not support dynamic client registration"}

Diagnosis

  1. Client discovers authServer: https://github.com/login/oauth
  2. Client has no client info (No client info found) → attempts dynamic client registration (RFC 7591) against GitHub OAuth
  3. GitHub OAuth does not support dynamic client registration — the client should be pre-registered and its client_id shipped with the plugin
  4. Client bails out; no user-facing OAuth prompt is ever shown

Impact

  • Local sessions: users can work around it by registering a custom MCP with a personal access token from gh auth token. Documented workaround below.
  • Cowork/remote sessions on claude.ai: users have no workaround — the cloud environment doesn't read local ~/.claude.json, and the built-in plugin is the only path to github_* tools in cowork. This blocks any GitHub-driven collaborative flow in cowork.

Suggested fix

Either:

  • Ship a static client_id (public identifier, safe to embed) with the plugin so the OAuth flow uses a pre-registered client; OR
  • Switch the endpoint away from api.githubcopilot.com/mcp/ (Copilot-gated) to a broader GitHub MCP endpoint that supports PAT auth or standard OAuth, so the plugin works without a Copilot subscription; OR
  • Add a UI in the plugin config to accept a user-provided PAT as fallback (mirrors claude mcp add workflow).

Workaround (documented for other users hitting this)

For local Claude Code sessions only:

# Requires gh CLI already logged in
claude mcp add github -s user -- sh -c 'GITHUB_PERSONAL_ACCESS_TOKEN=$(gh auth token) exec npx -y @modelcontextprotocol/server-github'

This registers the community @modelcontextprotocol/server-github MCP, pulling the token from Keychain via gh at process start. Does not resolve the cowork case.

View original on GitHub ↗