教學:在 Azure Functions 上託管 MCP 伺服器

本文將教你如何在 Azure Functions 上架設遠端 Model Context Protocol(MCP)伺服器。 你也會學習如何利用內建認證來配置伺服器端點授權,並更好地保護你的 AI 工具。

在 Azure Functions 中架設遠端 MCP 伺服器有兩種方式:

MCP 伺服器選項 Description 適用對象
MCP 擴充伺服器 使用 Azure Functions MCP 擴充功能建立自訂 MCP 伺服器,擴充觸發器允許你定義工具端點。 這些伺服器的開發、部署與管理方式,與支援 語言中的函式應用程式相同。 當你已經熟悉函數及其 基於綁定的程式設計模型時,
自架伺服器 函式可以承載使用標準 MCP SDK 建立的 MCP 伺服器專案。 當你已經用官方 MCP SDK 建置伺服器,並且在尋找事件驅動、無伺服器且可擴展的 Azure 主機時,

備註

讓 Azure Functions 用官方 MCP SDK 來架設你建立的 MCP 伺服器的功能目前處於預覽階段。

本教學涵蓋了 Functions 支援的兩種 MCP 伺服器選項。 選擇最適合你情境的分頁。

在這個教學中,你會使用 Visual Studio Code 來:

  • 使用 MCP 擴充功能建立一個 MCP 伺服器專案。
  • 在本地執行並驗證你的 MCP 伺服器。
  • 在 Azure 建立一個函式應用程式。
  • 部署你的 MCP 伺服器專案。
  • 啟用內建認證。

這很重要

本文目前僅支援 C#、Python 和 TypeScript。 若要完成快速入門,請在文章頂端選取其中一種支援的語言。

本文支援Azure Functions Node.js 程式設計模型的第四版。

本文支援 Azure Functions 的 Python 程式設計模型第二版。

先決條件

建立你的 MCP 伺服器專案

使用 Visual Studio Code 在本地建立你偏好的語言的 MCP 伺服器專案。

  1. 在Visual Studio Code中,按 F1 即可開啟指令面板。 搜尋並執行指令 Azure Functions: Create New Project...。

  2. 選擇您專案工作區的目錄位置,然後選擇 [選取]。 您應建立新資料夾,或為專案工作區選擇空白資料夾。 請勿選擇已屬於工作區一部分的專案資料夾。

  1. 請在提示處提供以下資訊:

    Prompt Selection
    選擇專案類型 選擇C#。
    選擇 .NET 執行階段 選擇.NET 8.0 LTS。
    為專案的第一個函式選取範本 選擇MCP Tool trigger。
    提供函式名稱 輸入 McpTrigger。
    提供命名空間 輸入 My.Functions。
    授權層級 選擇 FUNCTION,連接遠端 MCP 伺服器時需使用存取金鑰。
    選取您希望專案的開啟方式 選擇Open in current window。
  1. 請在提示處提供以下資訊:

    Prompt Selection
    選擇專案類型 選擇TypeScript。
    為專案的第一個函式選取範本 選擇MCP Tool trigger。
    提供函式名稱 輸入 mcpToolTrigger。
    授權層級 選擇 FUNCTION,連接遠端 MCP 伺服器時需使用存取金鑰。
    選取您希望專案的開啟方式 選擇Open in current window。
  1. 請在提示處提供以下資訊:

    Prompt Selection
    選擇專案類型 選擇Python。
    選擇一個Python直譯器以建立虛擬環境 選擇你偏好的 Python 直譯器。 如果沒有顯示選項,請輸入完整的路徑到你的 Python 二進位檔。
    為專案的第一個函式選取範本 選擇MCP Tool trigger。
    您想要建立的函式名稱 輸入 mcp_trigger。
    授權層級 選擇 FUNCTION,連接遠端 MCP 伺服器時需使用存取金鑰。
    選取您希望專案的開啟方式 選擇Open in current window。

利用這些資訊,Visual Studio Code 會產生一個 MCP 伺服器觸發器的程式碼專案。 您可以在 Explorer 中檢視本機專案檔。

本地啟動 MCP 伺服器

功能式應用程式需要儲存元件才能執行。 啟動伺服器前,先啟動本地儲存模擬器:

  1. 在 local.setting.json中,請確保你擁有 "AzureWebJobsStorage": "UseDevelopmentStorage=true"。

  2. 在Visual Studio Code中,按 F1 即可開啟指令面板。 在命令選擇區中,搜尋並選取 Azurite: Start。

  3. 檢查底部列,並確認 Azurite 模擬服務正在執行中。 如果是這樣,你現在可以在本地運行伺服器。

  4. 要開始本地運行,請按 F5。

功能式應用程式需要儲存元件才能執行。 啟動伺服器前,先啟動本地儲存模擬器:

  1. 在 local.setting.json中,請確保你擁有 "AzureWebJobsStorage": "UseDevelopmentStorage=true"。

  2. 在Visual Studio Code中,按 F1 即可開啟指令面板。 在命令選擇區中,搜尋並選取 Azurite: Start。

  3. 檢查底部列,並確認 Azurite 模擬服務正在執行中。 如果是這樣,你現在可以在本地運行伺服器。

  4. 要開始本地運行,請按 F5。

功能式應用程式需要儲存元件才能執行。 啟動伺服器前,先啟動本地儲存模擬器:

  1. 在 local.setting.json中,請確保你擁有 "AzureWebJobsStorage": "UseDevelopmentStorage=true"。

  2. 在Visual Studio Code中,按 F1 即可開啟指令面板。 在命令選擇區中,搜尋並選取 Azurite: Start。

  3. 檢查底部列,並確認 Azurite 模擬服務正在執行中。 如果是這樣,你現在可以在本地運行伺服器。

  4. 要開始本地運行,請按 F5。

測試伺服器

  1. 開啟 .vscode/mcp.json。 編輯器應該會加入伺服器的連線資訊。

  2. 請選擇伺服器名稱上方的 開始 按鈕啟動伺服器。

  3. 當你連接到伺服器時,你會看到伺服器名稱上方有可用的工具數量。

  4. 以代理人模式開啟 Visual Studio Code Copilot 聊天,然後提出問題。 例如,「使用 #your-local-server-name 進行問候」。 這個問題確保 Copilot 利用伺服器來協助回答問題。

  5. 當Copilot請求從本地 MCP 伺服器執行工具時,選擇 Allow。

  6. 測試結束後,選擇 停止並按 Ctrl+C 停止本地執行,從伺服器斷開連線。

小提示

在 Copilot 聊天視窗中,選擇底部的工具圖示,即可查看可用於聊天的伺服器與工具清單。 測試時請確保本地 MCP 伺服器有被檢查。

在 Azure 中建立函式應用程式

在 Azure 的 Flex Consumption 計畫中建立一個功能式應用程式,來承載你的 MCP 伺服器。

  1. 在 Azure 入口網站,從選單或 Home 頁面,選擇 Create a resource。

  2. 選取 [開始],然後選取 [函數應用程式] 底下的 [建立]。

  3. 在 [選取裝載選項] 下,選擇 [彈性取用]>[選取]。

  4. 在 基本 頁面中,使用下表中指定的應用程式設定。

    Setting 建議的值 Description
    訂閱 您的訂用帳戶 要在其中建立新函數應用程式的訂用帳戶。
    資源群組 myResourceGroup 要在其中建立函數應用程式的新資源群組名稱。
    函數應用程式名稱 全域唯一的名稱 用來識別新函式應用程式的名稱。 有效的字元是 a-z (不區分大小寫)、0-9 和 -。
    區域 慣用區域 選取的區域應靠近您或靠近函式能夠存取的其他服務。 不支援的區域不會顯示。 如需詳細資訊,請參閱檢視目前支援的區域。
    執行階段堆疊 首選語言 選擇其中一個支援的語言執行階段堆疊。 目前僅支援 Node.js、PowerShell 及 Python 應用程式,使用 Visual Studio Code for the Web 進行入口內編輯。 C# 類別函式庫與 Java 函式必須本地開發。
    版本 語言版本 選擇支援的語言執行階段堆疊版本。
    執行個體大小 預設 決定配置給每個應用程式執行個體的執行個體記憶體數量。 如需詳細資訊,請參閱執行個體大小。
  5. 在 [ 儲存體 ] 頁面上,接受建立新 預設主機儲存體帳戶 的預設行為,或選擇使用現有的儲存體帳戶。

  1. 在 [監視] 頁面上,確定已選取 [啟用 Application Insights ]。 接受預設值以建立新的 Application Insights 執行個體,或選擇使用現有的執行個體。 當你建立 Application Insights 實例時,也會被要求選擇 Log Analytics Workspace。

  2. 在 [驗證] 頁面上,將所有資源的 [驗證類型] 變更為 [受控識別]。 透過此選項,也會建立一個由使用者指派的管理身份,應用程式透過 Microsoft Entra ID 認證存取這些 Azure 資源。 使用 Microsoft Entra ID 的受管理身份,為連接 Azure 資源提供最高等級的安全保障。

  3. 接受其餘索引標籤中的預設選項,然後選取 [ 檢閱 + 建立 ] 以檢閱您選擇的應用程式設定。

  4. 當您滿意時,請選取 [ 建立 ] 以佈建和部署函式應用程式和相關資源。

  5. 選取入口網站右上角的 [通知] 圖示,查看是否有 [部署成功] 訊息。

  6. 選取 前往資源,以檢視您新的函式應用程式。 您也可以選擇釘選至儀表板。 釘選可讓您更輕鬆地從儀表板返回此函式應用程式資源。

    部署通知的螢幕擷取畫面。

部署 MCP 伺服器專案

部署伺服器專案:

這很重要

部署到現有函式應用程式時,一律會覆寫該應用程式在 Azure 中的內容。

  1. 在指令面板中,輸入並選取 Azure Functions: 部署到 Function 應用程式。

  2. 選取您剛才建立的函數應用程式。 當系統提示您覆寫先前的部署時,請選取 [部署],將函式程式碼部署至新的函數應用程式資源。

  3. 部署完成後,選擇 View Output 以查看建立與部署結果,包括你所建立的Azure資源。 如果您錯過通知,請選取右下角的鈴鐺圖示,以再次查看。

    [檢視輸出] 視窗的螢幕擷取畫面。

這很重要

部署到現有函式應用程式時,一律會覆寫該應用程式在 Azure 中的內容。

  1. 在指令面板中,輸入並選取 Azure Functions: 部署到 Function 應用程式。

  2. 選取您剛才建立的函數應用程式。 當系統提示您覆寫先前的部署時,請選取 [部署],將函式程式碼部署至新的函數應用程式資源。

  3. 部署完成後,選擇 View Output 以查看建立與部署結果,包括你所建立的Azure資源。 如果您錯過通知,請選取右下角的鈴鐺圖示,以再次查看。

    [檢視輸出] 視窗的螢幕擷取畫面。

部署結束後,你應該會在 Visual Studio Code 看到關於連接伺服器的通知。 選擇連接按鈕,讓編輯器設定伺服器連線資訊。mcp.json

遠端 MCP 伺服器授權

有兩種方法可以減少或防止遠端 MCP 伺服器端點被未經授權使用:

方法 Description
內建伺服器認證(預覽) 功能功能包含內建的 App Service 認證與授權 功能,實現 MCP 授權規範 協定中的 OAuth 要求。 嘗試存取伺服器的用戶端會被導向已設定的身份提供者,例如 Microsoft Entra ID,進行認證後才被允許連線。 此方法為您的工具端點提供最高等級的安全防護。
金鑰型驗證 預設情況下,Functions 實作存取金鑰要求,讓嘗試使用 MCP 伺服器工具的用戶端必須在請求標頭中呈現共享的秘密金鑰值。 雖然無法提供與基於 OAuth 的認證同等安全等級,但存取金鑰使得存取公共工具變得更困難。 使用基於 OAuth 的認證時,使用 Anonymous 存取等級來停用伺服器中的存取金鑰。

備註

本教學包含內建伺服器授權與認證功能的詳細設定說明,該功能在其他文章中也可能稱為 App Service 認證 。 你可以在 「配置內建伺服器授權(預覽) 」文章中找到此功能的概述及使用指引。

啟用 Azure portal 內建的 MCP 認證

Azure 入口網站提供一鍵操作,讓您能設定 MCP 伺服器內建的認證與授權。 此 preview 功能會自動建立並設定 Microsoft Entra ID 作為身份提供者,註冊所需的用戶端應用程式,並為你新增所需的應用程式設定。 使用此功能開啟內建 MCP 認證,會 自動 關閉預設的基於金鑰存取伺服器的權限。

要在 Azure 入口網站啟用內建的 MCP 認證:

  1. 在入口網站中開啟伺服器應用程式。

  2. 在左側選單,找到 AI(預覽) 分頁。

  3. 找到 認證 區塊,點選 啟用 MCP 認證 按鈕。

  4. 在開啟的側窗格中,輸入一個獨特的 Entra 應用程式註冊名稱。 需要這個應用程式才能設定驗證。

  5. 點 選儲存 ,等待設定完成。

備註

如果你偏好手動設定認證,請參見 替代方案:手動設定內建認證。

連接伺服器

部署後的彈窗選擇 Connect,Visual Studio Code 會填入 .vscode/mcp.json 伺服器連線資訊。

如果漏掉這個步驟,也可以打開輸出Ctrl/Cmd+Shift+U()來找到部署日誌末尾的內嵌連線按鈕。

你也可以手動新增連線資訊:

  1. 執行以下指令取得伺服器網域:

    az functionapp show --name <FUNCTION_APP_NAME> --resource-group <RESOURCE_GROUP_NAME> --query "defaultHostName" --output tsv
    
  2. 在 Visual Studio Code 中,開啟指令面板,搜尋並執行 MCP:新增伺服器... 指令,然後依照以下提示操作:

    Prompt 建議
    待新增伺服器類型 HTTP
    你的 MCP 伺服器網址 https://<FUNCTION_APP_NAME>.azurewebsites.net/runtime/webhooks/mcp
    伺服器名稱 遠端-MCP-伺服器
    伺服器安裝地點 Workspace
  3. Visual Studio Code 會幫你打開 mcp.json 設定檔。

根據你設定的認證方式,請依照下一節的指示連接到伺服器。

內建 MCP 認證

  1. 透過選擇伺服器名稱上方的 開始 按鈕啟動遠端伺服器。

  2. 當系統要求與 Microsoft 進行身份驗證時,選擇允許,然後使用你的電子郵件(即用於登入 Azure 入口的那個)進行登錄。

  3. 當你成功連接伺服器時,會看到伺服器名稱上方可用的工具數量。

  4. 以代理人模式開啟 Visual Studio Code Copilot 聊天,然後提出問題。 例如: Greet with #your-remote-mcp-server-name 。

  5. 測試結束後就停止伺服器。

若想詳細了解 Visual Studio Code 嘗試連接遠端 MCP 伺服器時會發生什麼,請參見 Server 授權協定。

使用存取金鑰

如果你沒有啟用內建的 MCP 認證,伺服器預設應該會使用 Functions 的存取金鑰。 請將存取金鑰包含在伺服器註冊的請求標頭中。

./vscode/mcp.json 檔案應該如下範例:

{
	"servers": {
		"remote-mcp-server": {
			"type": "http",
			"url": "https://${input:functionapp-domain}/runtime/webhooks/mcp",
			"headers": {
				"x-functions-key": "${input:functions-key}"
			}
		}
	},
	"inputs": [
		{
			"type": "promptString",
			"id": "functions-key",
			"description": "Functions App Key",
			"password": true
		},
		{
			"type": "promptString",
			"id": "functionapp-domain",
			"description": "The domain of the function app.",
			"password": false
		}
	]
}

要找到存取金鑰,請前往 Azure 入口網站的 Function 應用程式。 在左側選單中,找到 功能 -> 應用程式金鑰。 在系統金鑰區塊中,找到名為 mcp_extension 的那個。

小提示

要查看連線日誌,請點到伺服器名稱,然後選擇 更多>顯示輸出。 欲了解用戶端(Visual Studio Code)與遠端 MCP 伺服器間的互動細節,請選擇齒輪圖示並選擇 Trace。

MCP 伺服器設定的螢幕擷取畫面,顯示 _Trace_ 記錄層級被選取。

設定 Microsoft Foundry 代理以使用您的工具

你可以設定 Foundry 代理使用伺服器裡的工具,而不只是 VS Code 裡的 Copilot。 如需逐步操作指示,請參閱 在 Microsoft Foundry 中將 Azure Functions MCP 伺服器作為工具使用。

在 Azure API Center 中註冊伺服器

考慮在 Azure API Center 註冊您的 MCP 伺服器,以維護一個私有的遠端 MCP 伺服器清單,這些伺服器在組織內容易被發現。 如需逐步指示,請參閱 在 Azure API Center 中註冊裝載於 Azure Functions 的 MCP 伺服器。

替代方案:手動設定內建認證

以下說明說明如何手動啟用伺服器應用程式內建的授權與驗證功能,並設定 Microsoft Entra ID 作為身份提供者。 如果你不想使用 一鍵入口網站體驗,請使用這些步驟。

停用基於金鑰的認證

啟用內建認證時,請先關閉預設的金鑰驗證,允許匿名存取。 如果你還沒這麼做,且你的應用程式已經部署,請依照以下指示操作。

要在你的 MCP 伺服器中停用主機認證,請在你的應用程式設定中加入一個名為 AzureFunctionsJobHost__extensions__mcp__system__webhookAuthorizationLevel 的 Anonymous 設定。 你可以在入口網站新增此設定,或使用以下 Azure CLI 指令:

az functionapp config appsettings set --name <APP_NAME> --resource-group <RESOURCE_GROUP> \
  --settings "AzureFunctionsJobHost__extensions__mcp__system__webhookAuthorizationLevel=Anonymous"

在此範例中,請將 <APP_NAME> 和 <RESOURCE_GROUP> 分別替換成您的函式應用程式名稱和資源群組名稱。

小提示

此設定等同於在system.webhookAuthorizationLevel檔案的 MCP 擴充功能區段中將Anonymous設定為host.json。 不過,這種方法需要你重新發佈你的伺服器專案。

在伺服器應用程式上設定認證

  1. 在Azure入口開啟伺服器應用程式,從左側選單選擇Settings>Authentication。

  2. 選擇 新增身份提供者>Microsoft 作為身份提供者。

  3. 在為您的應用程式及其使用者選擇租戶部分,請選擇員工配置(目前租戶)。

  4. 在 應用程式註冊中: 請使用以下設定:

    Setting Selection
    應用程式註冊類型 建立新的應用程式註冊
    名稱 輸入一個描述性應用程式名稱
    用戶端秘密過期 建議:180天
    支援的帳戶類型 現任租戶 - 單一租戶
  5. 在附加檢查:,選擇客戶端應用需求選擇允許特定客戶端應用程式請求,選擇鉛筆圖示,新增Visual Studio Code客戶端 ID aebc6443-996d-45c2-90f0-388ff96faa56,並選擇OK。 其他部分保持原樣。

  6. 在 App Service 認證設定 中,請使用以下設定:

    Setting Selection
    限制存取 需要驗證
    未驗證的要求 HTTP 401 未授權:建議用於 API
    代幣儲存 勾選允許代幣刷新的方框
  7. 選取 ,然後新增。 設定擴散後,你應該會看到以下結果:

    App Service 認證設定截圖顯示「要求驗證」被選中,未驗證請求則設定為「HTTP 401 未授權」。

預先授權 Visual Studio Code 作為客戶端

  1. 在 Microsoft 旁邊選擇 Entra 應用程式名稱。 此操作會帶您進入 Entra 應用程式 資源的概覽 。

  2. 在左側選單中,找到 「管理 -> 公開 API」。

  3. 在 授權用戶端應用程式中,選擇 +新增用戶端應用程式。

  4. 輸入 Visual Studio Code 的客戶 ID:aebc6443-996d-45c2-90f0-388ff96faa56。

  5. 選擇示波器前方看起來像 api://abcd123-efg456-hijk-7890123/user_impersonation的方框。

  6. 選取新增應用程式。

設定受保護的資源中繼資料 (預覽版)

  1. 在同一個 Expose an API 檢視中,找到 Scopes 區塊,複製允許管理員和使用者同意 Entra 應用程式的範圍。 這個值看起來像 api://abcd123-efg456-hijk-7890123/user_impersonation。

  2. 執行與之前相同的指令來新增設定 WEBSITE_AUTH_PRM_DEFAULT_WITH_SCOPES:

    az functionapp config appsettings set --name <function-app-name> --resource-group <resource-group-name> --settings "WEBSITE_AUTH_PRM_DEFAULT_WITH_SCOPES=<scope>"
    
  3. 另外,在 Expose an API 檢視中,找到最上方的 應用程式 ID URI (看起來像 api://abcd123-efg456-hijk-7890123),然後儲存以備後續步驟使用。

伺服器授權協定

在 Visual Studio Code 的除錯輸出中,你會看到 MCP 用戶端與伺服器互動時的一系列請求與回應。 當你使用內建的 MCP 伺服器授權時,你會看到以下事件序列:

  1. 編輯器會向 MCP 伺服器發送初始化請求。
  2. MCP 伺服器會回應錯誤,表示需要授權。 回應中包括一個指向應用程式受保護資源中繼資料(PRM)的指針。 內建的授權功能會為伺服器應用程式生成 PRM。
  3. 編輯器會擷取 PRM 並用它來識別授權伺服器。
  4. 編輯器嘗試從授權伺服器上的一個知名端點取得授權伺服器的元資料(ASM)。
  5. Microsoft Entra ID 不支援在知名端點上使用 ASM,因此編輯器會改為使用 OpenID Connect 中繼資料端點來取得 ASM。 它嘗試透過在其他路徑資訊之前插入已知端點來發現此現象。
  6. OpenID Connect 規範實際上將知名端點定義為位於路徑資訊之後,而 Microsoft Entra ID 正是將其託管於此位置。 所以編輯器會用那個格式再試一次。
  7. 編輯器成功取得 ASM。 接著,它會利用這些資訊與自己的客戶端 ID 進行登入。 此時,編輯會提示你登入並同意申請。
  8. 假設你成功登入並同意,編輯者會完成驗證。 它會重複發送初始化請求給 MCP 伺服器,這次請求中包含授權令牌。 在偵錯輸出層級看不到這個重試,但在追蹤輸出層級可以看到。
  9. MCP 伺服器會驗證該令牌,並成功回應初始化請求。 標準的MCP流程從此點持續,最終發現了本樣本中定義的MCP工具。

故障排除

詢問 Copilot 聊天中發生的任何錯誤。

後續步驟

了解如何在 Azure API Center 註冊由 Azure Functions 託管的 MCP 伺服器。