1666 字
8 分鐘

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 的 allowedMcpServersdeniedMcpServers 使用 matcher object。每個 entry 應只放一種 matcher:

matcher適用對象重要限制
serverUrl遠端 HTTP/SSE MCP server支援 *,GitHub 會先正規化 URL 再比對
serverCommand本機 stdio MCP servercommand 和每個參數都要精確相同,不支援 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 使用絕對路徑和固定參數,是為了讓規則比對清楚。若團隊依賴 npxuvx 或其他 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 方式,常見流程是:

  1. 建立或使用 enterprise 的 .github-private repository。
  2. 在預設分支加入 copilot/managed-settings.json
  3. 提交並推送設定。
  4. 讓使用者使用支援的 Copilot client,等待政策套用或重新登入觸發更新。
  5. 先在小範圍裝置或測試團隊驗證,再擴大到整個 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

GitHub Docs:Enterprise managed settings

GitHub Docs:Configuring enterprise-managed settings

GitHub Copilot MCP Server Allowlist 怎麼設?用 managed-settings.json 控管伺服器
https://laplusda.com/posts/github-copilot-mcp-allowlist/
作者
Zero
發佈於
2026-08-12
許可協議
CC BY-NC-SA 4.0
這篇文章有幫助嗎?

回報錯字、失效連結,或告訴我你想看的延伸主題。