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

Labels

area:enterpriseGitHub Enterprise (GHE/GHES) support, org policies, and enterprise settingsarea:mcpMCP server configuration, discovery, connectivity, OAuth, policy, and registrytriagedThis issue has been added to our internal issue tracker

Type

Projects

No projects

Milestone

No milestone

Relationships

None yet

Development

No branches or pull requests

Issue actions