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

    Type

    No type

    Fields

    No fields configured for issues without a type.

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions