Списки разрешённых 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
Различие между пустым и незаданным значением как раз и подводит команды:
- Незаданный
allowedMcpServersразрешает все серверы, кроме стандартных. allowedMcpServers: []блокирует их все. Это и есть переключатель полного запрета.- Незаданный или пустой
deniedMcpServersне блокирует ничего. - Запрет всегда побеждает. Сервер, попавший в оба списка, блокируется.
- Собственные серверы, например встроенный MCP-сервер GitHub, освобождены от обоих списков.
Кроме того, некорректная или непроверяемая конфигурация блокируется, а не разрешается, и когда политики приходят более чем с одного уровня, сервер должен пройти каждый уровень. Это противоположный реестру режим отказа, и именно в нём настоящая причина для перехода.
Командам, которым нужен собственный список, следует обернуть объекты-сопоставители в overridable на уровне предприятия, а в файле каждой команды использовать обычный синтаксис. При конфликте побеждает решение платформы.
Дополняйте этим контроль исходящего трафика, а не заменяйте его
Список разрешённых определяет, какие серверные процессы запускаются и с какими MCP-эндпоинтами ведётся общение. Он ничего не говорит о том, куда инструмент подключается после запуска: это отдельная поверхность контроля, разобранная в статье как ограничить исходящий сетевой трафик кодового агента. Два уровня, два режима отказа.
Полный синтаксис сопоставителей приведён в Enterprise managed settings reference.
Comments
Sign in with GitHub to comment. Reactions and replies thread back to the comments repo.