GitHub Copilot MCP Server Allowlist 怎麼設?用 managed-settings.json 控管伺服器
MCP server 一旦接進 Copilot CLI、VS Code 或 Copilot app,真正要管理的不是「有沒有安裝」,而是「哪些 server 允許啟動、以什麼身份連線、能不能被團隊成員自行替換」。GitHub 在 2026 年 8 月 6 日宣布 MCP allowlists 已 generally available,企業 owner 可以用 managed settings 集中管理這個邊界。
最小可行的做法是:在企業管理設定中明確列出允許的遠端 URL 或本機 command,再用 deny list 擋掉即使命中 allowlist 也不應使用的 server。不要只用 server name,因為名稱是使用者可以自行改寫的標籤,不是可靠的 server identity。
三種 matcher 先分清楚
GitHub Copilot 的 allowedMcpServers 和 deniedMcpServers 使用 matcher object。每個 entry 應只放一種 matcher:
| matcher | 適用對象 | 重要限制 |
|---|---|---|
serverUrl | 遠端 HTTP/SSE MCP server | 支援 *,GitHub 會先正規化 URL 再比對 |
serverCommand | 本機 stdio MCP server | command 和每個參數都要精確相同,不支援 wildcard 或 shell 展開 |
serverName | 任何 server 的使用者標籤 | 只能當方便的名稱比對,不是安全控制 |
因此,如果政策目的是限制「實際連到哪台遠端主機」,使用 serverUrl;如果目的是限制「本機要執行哪個 binary 和哪些參數」,使用 serverCommand。不要把 serverName 當成可以阻止惡意 server 改名的防線。
一份可讀的最小設定
以下範例使用假網址和本機路徑,不包含任何 token。放進 copilot/managed-settings.json 前,請替換成團隊實際審核過的 endpoint 和固定 command:
{ "allowedMcpServers": [ { "serverUrl": "https://mcp.example.com/*" }, { "serverCommand": [ "/opt/company/bin/mcp-docs", "--readonly" ] } ], "deniedMcpServers": [ { "serverUrl": "https://untrusted.example.com/*" } ]}這份設定表達三件事:只允許符合公司 endpoint 或固定本機 command 的 server;不符合 allowlist 的 server 會被擋;即使未來某個 URL 被放進 allowlist,明確命中 deny list 的 server 仍然不能執行。
本機 command 使用絕對路徑和固定參數,是為了讓規則比對清楚。若團隊依賴 npx、uvx 或其他 package runner,應把實際 command、版本鎖定和 registry trust 一起審核;不要只把一個可變的套件名稱當成完整供應鏈策略。
Allowlist、deny list 和多層設定怎麼合併
GitHub 文件的行為可以整理成下面幾個判斷:
- 省略
allowedMcpServers:預設允許所有 server,但仍會受deniedMcpServers影響。 - 設成空陣列:阻擋所有外部 MCP server,只有 built-in default servers 例外。
- 設定 allowlist:只有至少命中一筆 matcher 的 server 可以執行。
- 多個設定來源都有 allowlist:有效範圍是交集,server 必須通過每一層。
- 任何一層命中 denylist:直接阻擋;deny 的優先權高於 allow。
- URL 比對前會正規化:scheme、host 大小寫、預設 port、百分比編碼和 fragment 等會先被處理,不能靠 URL 外觀差異繞過規則。
GitHub 也說明 built-in first-party Copilot servers 不受 deny rules 阻擋。這代表政策設計時要把「GitHub 內建 server」和「企業允許的第三方 server」分開記錄,不要把 deny list 當成所有 MCP 流量都能封鎖的萬用開關。
企業設定要放在哪裡
GitHub 支援 server-managed、MDM-managed 和 file-based 的 enterprise managed settings。若採 server-managed 方式,常見流程是:
- 建立或使用 enterprise 的
.github-privaterepository。 - 在預設分支加入
copilot/managed-settings.json。 - 提交並推送設定。
- 讓使用者使用支援的 Copilot client,等待政策套用或重新登入觸發更新。
- 先在小範圍裝置或測試團隊驗證,再擴大到整個 enterprise。
如果限制需要在沒有 server round trip 時也存在,可以評估 MDM 或 file-based 部署。Linux 沒有 native MDM 交付方式時,GitHub 文件建議使用 file-based settings;file-based 檔案也要由管理流程確保不是一般使用者可寫入的路徑。
目前 GitHub MCP allowlist 公告列出的 enforced clients 是 GitHub Copilot app、Copilot CLI 和 VS Code。不要因為 enterprise managed settings 頁面列出更多 Copilot client,就直接假設每個 client 都已支援這兩個 MCP key;應對照該 client 的支援矩陣與實際版本。
上線前用四個案例驗證
允許的遠端 server
用一個已審核的 serverUrl 啟動,確認 client 能連線、工具清單可見,而且 policy log 沒有誤判 URL。測試時不要把真實 production token 寫進範例設定。
未列入 allowlist 的 server
故意使用一個沒有命中 allowedMcpServers 的 endpoint,確認它在啟動前被拒絕,而不是連線後才讓 tool call 失敗。這是 allowlist 是否真的 fail closed 的核心測試。
命中 denylist 的 server
同時讓一個 matcher 命中 allow 和 deny,預期結果應是拒絕。這能驗證團隊沒有把 deny list 當成只在 allowlist 找不到時才執行的次要條件。
本機 command 的參數變更
把已允許的 command 改一個參數或執行路徑,確認它不會因為名稱相同就繼續通過。若你只測 serverName,很容易漏掉本機 executable 被替換的情境。
若要先決定哪些 MCP 根本不應接入,可以搭配 接 MCP 前的能力盤點;若是個人 VS Code 工作區,則可參考 VS Code MCP 的 workspace、trust 與 sandbox 檢查。本篇的重點是 enterprise policy,不是替每一台開發機逐一安裝 server。
這個 policy 仍然不是完整安全邊界
MCP allowlist 能控制「哪些 server 可以啟動」,但不會自動審核 server 回傳的內容,也不會替你決定工具是否應允許寫入 production。仍要另外處理:
- MCP server 使用的 credentials、scope 和 rotation。
- remote server 的 TLS、網域擁有權、版本更新和供應鏈。
- local server 的檔案、網路與 process 權限。
- Copilot client 的 sandbox、bypass permissions 和 repository access。
- tool call 造成的外部副作用,以及是否需要人工確認。
如果 server 允許進入不代表它可以任意操作;allowlist 是入口治理,後續仍需要 tool、資料和執行環境的最小權限。
常見問題
Q: serverName 可以拿來當 MCP 安全白名單嗎?
A: 不適合。GitHub 文件把 serverName 定義為使用者指派的標籤,使用者可以重新命名。需要約束遠端身份時使用 serverUrl,需要約束本機 stdio server 時使用精確的 serverCommand。
Q: allowedMcpServers: [] 代表允許所有 server 嗎?
A: 相反,它會阻擋所有外部 MCP server,只有內建的 default server 例外。若省略整個 key,才是允許所有 server、但仍受 deny rules 影響的行為。
Q: 同一個 server 同時命中 allow 和 deny 會怎樣?
A: deny 優先。任何 deniedMcpServers entry 命中時,server 會被阻擋,即使它也命中 allowedMcpServers。多層設定的 deny list 則是任一來源阻擋,整體就不能執行。
參考資料:
GitHub Changelog:MCP allowlists in enterprise managed settings
回報錯字、失效連結,或告訴我你想看的延伸主題。