Start Debugging

Списки разрешённых MCP-серверов появились в корпоративных управляемых настройках Copilot

Changelog GitHub от 6 августа 2026 года добавляет allowedMcpServers и deniedMcpServers в copilot/managed-settings.json. Сопоставление по URL и argv, приоритет запрета и поведение по умолчанию fail closed, которого у реестра на основе имён никогда не было.

2026-08-06 GitHub выпустил MCP allowlists in enterprise managed settings. Два ключа, allowedMcpServers и deniedMcpServers, теперь определяют, какие серверы Model Context Protocol клиенту Copilot разрешено запускать. Функция общедоступна и работает в приложении GitHub Copilot, в Copilot CLI и в VS Code.

Это закрывает пробел, который оставался открытым с момента широкого распространения MCP. Прежним ответом на уровне предприятия был собственный реестр MCP, до сих пор находящийся в публичной предварительной версии и опознающий серверы по имени или ID. Имена задаются пользователем, поэтому тот, кому нужен заблокированный сервер, просто переименовывает его у себя. Документация GitHub прямо говорит о последствии: пользователи могут обойти ограничение, отредактировав файлы конфигурации.

Вся суть в сопоставителях

Файл находится в репозитории предприятия .github-private по пути copilot/managed-settings.json, в ветке по умолчанию. Каждая запись определяет сервер ровно одним сопоставителем.

{
  "allowedMcpServers": [
    { "serverUrl": "https://api.githubcopilot.com/*" },
    { "serverCommand": ["npx", "@playwright/mcp@latest"] },
    { "serverCommand": ["cmd", "/c", "uvx", "markitdown-mcp"] }
  ],
  "deniedMcpServers": [
    { "serverUrl": "https://learn.microsoft.com/*" }
  ]
}

Обратите внимание, что serverCommand представляет собой массив argv, а не строку shell, и сравнивается точно. serverUrl поддерживает подстановочный знак *, а URL канонизируется перед сравнением, поэтому уловки с кодированием и завершающим слэшем другого вердикта не дадут. serverName по-прежнему существует, но лишь как запасной вариант: для удалённого сервера совпадение должно прийти из записи serverUrl, а serverName учитывается только тогда, когда записей serverUrl нет вовсе. Между stdio-серверами и serverCommand действует то же соотношение. Это удобство, а не граница безопасности.

Значения по умолчанию работают в режиме fail closed

Различие между пустым и незаданным значением как раз и подводит команды:

Кроме того, некорректная или непроверяемая конфигурация блокируется, а не разрешается, и когда политики приходят более чем с одного уровня, сервер должен пройти каждый уровень. Это противоположный реестру режим отказа, и именно в нём настоящая причина для перехода.

Командам, которым нужен собственный список, следует обернуть объекты-сопоставители в overridable на уровне предприятия, а в файле каждой команды использовать обычный синтаксис. При конфликте побеждает решение платформы.

Дополняйте этим контроль исходящего трафика, а не заменяйте его

Список разрешённых определяет, какие серверные процессы запускаются и с какими MCP-эндпоинтами ведётся общение. Он ничего не говорит о том, куда инструмент подключается после запуска: это отдельная поверхность контроля, разобранная в статье как ограничить исходящий сетевой трафик кодового агента. Два уровня, два режима отказа.

Полный синтаксис сопоставителей приведён в Enterprise managed settings reference.

Comments

Sign in with GitHub to comment. Reactions and replies thread back to the comments repo.

< Назад