anthropics / anthropics/claude-ai-mcp

Custom connector for Entra ID-backed MCP server: OAuth sign-in succeeds, but Claude never exchanges the authorization code at /token

Aperta
#754 0 commenti 1 reazione 0 assegnatari Vedi su GitHub
auth bug server-developer-report
Lingua principale
Nessun dato sulla lingua
Stelle
471
Fork
76
Metriche di merge delle PR
Nessuna PR unita negli ultimi 30g

Descrizione

### MCP server URL

https://api.hotfix.quantumworkplace.com/via-internal-mcp

### Where does the issue occur?

When pressing the Connect button

### Transport used

streamable-http

### Client registration type

Static

### SSE only: Does your server return the expected status code for POST requests?

Not applicable (my server does not use SSE)

### When did you last reproduce this?

2026-08-02 7:15 PM CDT

### Browser and OS

Chrome Version 150.0.7871.186 Windows 11

### Describe the issue

Custom connector for a self-hosted MCP server behind Microsoft Entra ID: OAuth
sign-in completes successfully (confirmed in Entra ID's own sign-in logs), but
Claude never exchanges the authorization code at Entra's /token endpoint, so
no authenticated MCP request is ever made.

Related to #741 and #506/#632, but with two differences worth noting:
- Authorization server here is Microsoft Entra ID (Azure AD), not Cloudflare
Access OIDC (#741) or whatever #506/#632 used
- Unlike #741 (which reports failure on both Claude.ai web AND Claude Code),
the identical server/credentials worked immediately via Claude Code's
loopback-redirect OAuth flow — only claude.ai's hosted web/Chat/Cowork
connector path fails. This may point to two related-but-distinct bugs
rather than one, or a difference specific to certain authorization servers.

### Issue details

```shell
Environment:
- Server: ASP.NET Core / ModelContextProtocol.AspNetCore 2.0.0, Streamable HTTP transport
- Authorization server: Microsoft Entra ID (Azure AD), single-tenant
- OAuth client: manually registered static Client ID, public client with PKCE, no secret (Entra ID doesn't support DCR)
- Redirect URI registered: https://claude.ai/api/mcp/auth_callback

Reproduction:
1. Add custom connector with pre-configured OAuth Client ID pointing at an Entra ID app registration
2. Click Connect — redirected to Entra ID, sign in, complete MFA
3. Redirected back to claude.ai/api/oauth/organizations/.../oauth_tokens?...
4. Result: "Authorization with the MCP server failed. You can check your credentials and permissions." (ofid_7964ced9f036b482)

Evidence this is Claude-side, not a server/Entra misconfiguration:
- Entra ID's own sign-in log for the matching correlation ID shows Status: Success for the interactive sign-in
- Chrome DevTools network capture during the entire flow shows zero requests to login.microsoftonline.com/{tenant}/oauth2/v2.0/token — Claude's backend never attempts the code exchange at all
- The identical MCP server, Entra app registration, and OAuth Client ID work correctly when configured against Claude Code's remote-MCP OAuth support instead (claude mcp add --client-id ... --callback-port ...), which uses a loopback redirect rather than claude.ai's hosted callback
```

### Expected behavior

After completing sign-in with Microsoft Entra ID (including MFA), the connector should successfully authenticate and Claude should be able to call the MCP server's tools — the same outcome the identical server/credentials already produce successfully through Claude Code's remote-MCP OAuth flow.

### Logs from your server

```shell
Server-side, the only log line that appears for every attempt is the initial unauthenticated challenge — no subsequent authenticated request is ever received, consistent with Claude never completing the token exchange:

info: ModelContextProtocol.AspNetCore.Authentication.McpAuthenticationHandler[12]
AuthenticationScheme: McpAuth was challenged.

(repeated identically for each attempt, timestamps matching each failed connection try — no second log entry with a Bearer token ever follows)
```

### Additional context

OAuth provider: Microsoft Entra ID (Azure AD), single-tenant.

See #741 for a related report with a different OAuth provider (Cloudflare Access) — noted the key difference (Claude Code worked for me, unlike that report) in a comment there.

Guida per i contributori

Nessuna guida per i contributori indicizzata per questo repository

Valutazione

Questa issue non è ancora stata valutata.

Ricevi le nuove issue nella tua casella

Un breve riepilogo di issue GitHub adatte ai principianti.