Hacktoberfest 2026 : les issues que les mainteneurs ont marquées pour octobre, ouvertes et accessibles aux débutants. Parcourir les issues Hacktoberfest

OAuth redirect URI port mismatch breaks login to most MCP servers

Ouverte
#4,968 1 commentaire 0 réactions 0 personnes assignées Voir sur GitHub

Les mainteneurs répondent en général sous 1 jour

Personne n'a encore pris cette issue.

Évaluation

Difficulté
4/5
Temps estimé
3-5 jours
Accessibilité débutants
52/100
Type d'issue
Bug
Clarté
Plutôt claire
Activité
Active
Stack technique
node.js
Domaine
authentication, cli

Piste de recherche

Start with the /mcp add OAuth flow and inspect the published client-metadata.json alongside the loopback listener in the shipped SEA binary. Compare the advertised redirect URI with the runtime redirect_uri, then verify the chosen behavior against a strict-matching MCP OAuth server and the RFC 8252 loopback requirement.

Rédigé par le modèle d'indexation à partir du texte de l'issue.

Description

triage

OAuth redirect URI port mismatch breaks login to most MCP servers

Summary

copilot CLI publishes a CIMD (Client ID Metadata Document) that declares a
single loopback redirect URI on a fixed port, but at runtime the CLI binds an
ephemeral loopback port and sends that port in the OAuth redirect_uri
parameter. GitHub's own OAuth server accepts the mismatch (per RFC 8252 §7.3
loopback matching), but many third-party OAuth servers — including
Entra/Azure-fronted MCP servers — do strict string matching against the
registered redirect_uris and reject the request.

The result is that authentication fails against almost every non-GitHub MCP
server
users try to connect. Claude Code and Codex CLI are not affected in
the same environments.

Environment

  • CLI version: GitHub Copilot CLI 1.0.88
  • OS: macOS (arm64)
  • Install: Homebrew cask copilot-cli (SEA binary)

Reproducer

  1. Configure any MCP server whose OAuth authorize endpoint validates
    redirect_uri by exact match against the CIMD's redirect_uris list.
    (Entra/Azure-fronted services typically behave this way.)
  2. Trigger the OAuth flow from Copilot CLI:
    /mcp add <server-url> (or however the server is registered), then log in.
  3. The browser lands on the authorize endpoint, which returns:
{
  "error": "invalid_request",
  "error_description": "Redirect URI 'http://127.0.0.1:52752/' does not match CIMD redirect_uris.",
  "state": "..."
}

The port (52752 above) changes on every attempt.

Expected behavior

The redirect_uri sent to the authorize endpoint should either:

  • (a) match the port published in the CIMD, i.e. http://127.0.0.1:33418/, so
    strict-matching servers accept it; or
  • (b) rely on RFC 8252 §7.3 loopback matching and have the CIMD advertise
    http://127.0.0.1/ (no port), making clear to server implementers that
    port-agnostic matching is expected.

Today it does neither: it publishes a specific port and then uses a different
one.

Actual behavior / root cause

The CLI's published metadata at
https://github.com/copilot/cli/client-metadata.json:

{
  "client_id": "https://github.com/copilot/cli/client-metadata.json",
  "client_name": "GitHub Copilot CLI",
  "application_type": "native",
  "redirect_uris": ["http://127.0.0.1:33418/"],
  ...
}

But the CLI's OAuth loopback listener is bound with port 0 (verifiable by
inspecting the SEA blob inside the shipped binary):

// Port 0 = let the OS pick a free ephemeral port. Bind to loopback only.
await new Promise((resolve) => server.listen(0, "127.0.0.1", resolve));
const address = server.address();
const port = typeof address === "object" && address ? address.port : 0;

The dynamically-assigned port then flows into the OAuth redirect_uri, which
never equals 33418.

Impact

  • Blocks Copilot CLI from authenticating against most third-party MCP servers,
    which is a large and growing set as MCP adoption widens.
  • Internal reports at multiple organisations indicate the same failure pattern
    across every non-GitHub MCP they've tried, with Claude Code / Codex CLI
    unaffected in the same environments.
  • Users have no clean local workaround. The one lever we found —
    COPILOT_MCP_CIMD_CLIENT_ID_URL overriding the CIMD document URL — requires
    self-hosting a metadata file that enumerates every ephemeral loopback port,
    which is fragile and requires the MCP server to dynamically trust arbitrary
    CIMDs.

Suggested fixes (either is sufficient)

  1. Bind the published port. Change the listener to
    server.listen(33418, "127.0.0.1", …) with a fallback strategy (retry with
    an ephemeral port only if 33418 is in use, and clearly document the
    fallback), so the common case matches the CIMD exactly.
  2. Publish port-agnostic CIMD. Change redirect_uris in
    client-metadata.json to ["http://127.0.0.1/"] and rely on the RFC 8252
    §7.3 loopback rule. This shifts the responsibility to non-conformant OAuth
    servers, which is arguably correct, but will not fix real-world usage until
    those servers are updated.

Option 1 is the most defensive; option 2 is the most spec-pure. A combination
(bind 33418 first, publish 127.0.0.1/) would maximise interoperability.

References

  • RFC 8252 §7.3 (Loopback Interface Redirection): loopback redirects SHOULD be
    matched ignoring the port component.
  • OAuth 2.0 for Native Apps client identity metadata document (CIMD) spec.

Drafted with GitHub Copilot CLI.

Langage dominant
Shell
Étoiles
11.2k
Forks
1.9k
Merge moyen
17 h 6 min
PR mergées (30 j)
5

Préparer son environnement

Par où commencer

  1. Lisez l'issue en entier, puis le guide de contribution du projet.
  2. Signalez en commentaire que vous la prenez — cela évite que deux personnes fassent le même travail.
  3. Forkez le dépôt et travaillez sur une branche.
  4. Ouvrez une pull request qui référence le numéro de l'issue.

Autres issues de github/copilot-cli

Toutes les issues de github/copilot-cli

Issues similaires

Plus d'issues Shell/Bash

Recevez les nouvelles issues par e-mail

Un résumé court des issues GitHub adaptées aux débutants.