Skip to content

bug: OAuth uses wrong authorization URL and missing redirectUri config #5766

Closed

Description

@christso

Problem

MCP OAuth fails with enterprise auth servers (Keycloak, Azure AD, Okta) due to two issues:

1. Wrong authorization URL (SDK bug)

MCP SDK 1.15.1 incorrectly constructs the authorization URL by appending /authorize to the issuer URL instead of using authorization_endpoint from OAuth metadata.

# Expected (from .well-known/openid-configuration):
https://idp.example.com/realms/mcp/protocol/openid-connect/auth

# Actual (SDK 1.15.1):
https://idp.example.com/authorize

This causes the browser to redirect to a non-existent endpoint.

2. No redirect URI configuration

OAuth servers validate that the redirect URI exactly matches a pre-registered URI. OpenCode hardcodes http://127.0.0.1:19876/mcp/oauth/callback, which may not be registered on the OAuth server.

Users cannot configure a custom redirect URI to match what's registered (e.g., Claude Code's http://localhost:41842/callback).

Reproduction Steps

KeyCloak

  1. Configure an MCP server with OAuth in opencode.json:

    "mcp": {
      "example-mcp-server": {
        "type": "remote",
        "url": "https://your-mcp-server.com",
        "oauth": {
          "clientId": "your-client-id",
          "scope": "openid profile email"
        }
      }
    }
  2. Run the auth command:

    opencode mcp auth example-mcp-server
    
  3. Browser opens and navigates to the authorization URL

  4. Result: "Page not found" error because the SDK constructs the wrong URL (/authorize instead of the actual authorization_endpoint from OAuth discovery)

Image

GitHub MCP

I observed similar behaviour with GitHub MCP.

  1. Create an OpenCode OAuth app in Developer settings

  2. Add GitHub MCP to .config/opencode.json:

    {
      "$schema": "https://opencode.ai/config.json",
      "mcp": {
        "github": {
          "type": "remote",
          "url": "https://api.githubcopilot.com/mcp/",
          "enabled": true,
          "oauth": {
            "clientId": "your-client-id",
            "clientSecret": "your-client-secret"
          }
        }
      }
    }
    
  3. Run the auth command:

    opencode mcp auth github
    
  4. Result: The SDK constructs the wrong URL (/authorize instead of the actual authorization_endpoint from OAuth discovery). Note: The URL github.com/authorize actually points to the github user "authorize".

Image

Solution

  1. Upgrade MCP SDK to 1.25.1+ which correctly reads authorization_endpoint
  2. Add redirectUri config so users can specify the callback URL

User Configuration

This is a typical configuration for KeyCloak that impersonates Claude Code:

"mcp": {
  "<server-name>": {
    "type": "remote",
    "url": "https://<your-mcp-server>",
    "oauth": {
      "clientId": "f637990b-e806-402b-9652-2eac0ae05840",
      "redirectUri": "http://localhost:41842/callback",
      "scope": "openid profile email"
    }
  }
}

Explanation

  1. If I upgrade MCP SDK from 1.15.1 to 1.25.1+, it constructs the correct path for KeyCloak.
Image
  1. The MCP SDK upgrade will also fix GitHub MCP OAuth because it will resolve to the correct URL: github.com/login/oauth/authorize.
Image
  1. However, KeyCloak also validates the callback URL (currently many enterprise systems match the callback URL pattern for VS Code and Claude Code, not Open Code). If I set the redirectUri to impersonate Claude Code, the authentication is successful.
Image

Activity

  1. added
    discussionUsed for feature requests, proposals, ideas, etc. Open discussion
    on Dec 18, 2025
  2. github-actions commented on Dec 18, 2025

    @github-actions
    Contributor

    This issue might be a duplicate of existing issues. Please check:

    Feel free to ignore if your specific case involves different requirements.

  3. changed the title [-][FEATURE]: Support OAuth without Dynamic Client Registration (DCR)[/-] [+]fix(mcp): OAuth fails with enterprise servers that disable DCR[/+] on Dec 22, 2025
  4. changed the title [-]fix(mcp): OAuth fails with enterprise servers that disable DCR[/-] [+]fix(mcp): OAuth uses wrong authorization URL and missing redirectUri config[/+] on Dec 22, 2025
  5. christso commented on Dec 22, 2025

    @christso
    ContributorAuthor

    @thdxr Could you please relabel this as a bug? The root causes are identified: SDK uses wrong authorization URL + missing redirectUri config. PR #5940 has the fix.

  6. added
    bugSomething isn't working
    and removed
    discussionUsed for feature requests, proposals, ideas, etc. Open discussion
    on Dec 22, 2025
  7. changed the title [-]fix(mcp): OAuth uses wrong authorization URL and missing redirectUri config[/-] [+]bug: OAuth uses wrong authorization URL and missing redirectUri config[/+] on Dec 22, 2025
  8. rekram1-node commented on Dec 22, 2025

    @rekram1-node
    Contributor

    @christso when you opened the issue you made it as a feature request instead of a bug report so it wasn't labled as a bug

  9. christso commented on Jan 2, 2026

    @christso
    ContributorAuthor

    @rekram1-node just checking if there's any blockers with my PR getting through? If it's unlikely to get approved then it's worth me creating a plugin for it. I'm trying to get 100+ developers currently on GH Copilot to switch to OpenCode.

  10. christso commented on Jan 8, 2026

    @christso
    ContributorAuthor

    This issue has been split into two focused features:

    1. [FEATURE]: Allow custom OAuth redirect URI configuration for MCP servers #7377 - [FEATURE]: Custom OAuth redirect URI configuration for MCP servers
    2. MCP SDK version upgrade for authorization endpoint discovery (addressed in PR fix(mcp): use correct authorization server URL for OAuth discovery #7234)

    The redirect URI configuration feature is now tracked separately to allow for independent implementation and review. Please reference #7377 for the custom redirect URI work.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

Labels

bugSomething isn't working

Type

No type

Projects

No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions