Skip to content

Environment footer stuck on "Loading:" forever when built-in GitHub MCP handshake stalls under org MCP policy #4206

Description

@cryptonic7-tech

Version

GitHub Copilot CLI 1.0.73 (macOS, Node v24.16.0)

Summary

The environment status footer permanently shows

◎ Loading: 1 instruction, 40 skills, 1 plugin, 2 agents

and never transitions to a completed state, even though everything is actually loaded (/env lists all instructions, skills, plugins and agents correctly). It is purely a cosmetic / never-resolving indicator, but it makes the CLI look like it is stuck loading forever.

Root cause (from the bundled index.js)

The footer's loading indicator uses a participant registry that stays in isLoading state until every registered participant calls .done(). Participants: instructions, skills, plugins, agents, mcp.

The mcp participant only calls .done() after await mcpHost.startServers(...) resolves (or via its onComplete callback, or the error catch branch).

When 3rd-party MCP is disabled by org policy and the built-in remote GitHub MCP server (github-mcp-server) handshake never resolves, none of those paths run, so mcp.done() is never called and the footer is stuck on "Loading:" indefinitely. Notably the footer never shows an N MCP server(s) entry (i.e. onServerConnected never fires).

Evidence (from my logs)

  • Third-party MCP servers are disabled by your organization's Copilot policy. Only built-in servers are available.
  • [ERROR] GitHub MCP server configured after authentication
  • [WARNING] Failed to create Mission Control session: 403 forbidden
  • Footer lists instruction / skills / plugin / agents but never mcp.
  • /env confirms all skills/agents/plugins/instructions are loaded and usable.

Steps to reproduce

  1. Be on an org whose Copilot policy disables 3rd-party MCP servers.
  2. Have custom instructions, skills, plugins and agents configured.
  3. Start copilot interactively where the built-in GitHub MCP handshake stalls.
  4. Observe the bottom footer stays on Loading: … skills, … agents forever.

Expected

The mcp participant should call .done() on a timeout / policy-disabled / failed-handshake path, so the footer clears regardless of MCP startup outcome.

Workaround

Launching with --disable-builtin-mcps avoids the stuck footer: startServers resolves with 0 servers, so mcp.done() fires and the footer completes.

Metadata

Metadata

Assignees

No one assigned

    Labels

    area:enterpriseGitHub Enterprise (GHE/GHES) support, org policies, and enterprise settingsarea:mcpMCP server configuration, discovery, connectivity, OAuth, policy, and registry

    Type

    Fields

    No fields configured for Bug.

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions