共用方式為


教學:在 Azure Functions 上架設 MCP 伺服器

本文將示範如何在 Azure Functions 上架設遠端 模型情境協定 (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 程式設計模型版本 4。

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

先決條件

建立你的 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 伺服器執行工具時,請選擇 允許

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

小提示

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

遠端 MCP 伺服器授權

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

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

備註

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

停用金鑰型驗證

內建的伺服器授權功能是與 Azure Functions 分開的元件。 使用伺服器認證時,最好先關閉基於金鑰的認證,允許匿名存取。

要在 MCP 伺服器中停用主機認證,請在檔案system.webhookAuthorizationLevel中設定Anonymous為:host.json

{
  "version": "2.0",
  "extensions": {
    "mcp": {
      ...
      "system": {
        "webhookAuthorizationLevel": "Anonymous"
      }
    }    
  }
}

在 Azure 中建立函式應用程式

在 Azure 的 Flex Consumption 計畫中建立一個函式應用程式,來架設你的 MCP 伺服器。

  1. Azure 入口網站中,從功能表或 [首頁],選取 [建立資源]

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

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

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

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

  1. [監視] 頁面上,確定已選取 [啟用 Application Insights ]。 接受預設值以建立新的 Application Insights 執行個體,或選擇使用現有的執行個體。 當您建立 Application Insights 執行個體時,系統也會要求您選取 Log Analytics 工作區

  2. [驗證] 頁面上,將所有資源的 [驗證類型] 變更為 [受控識別]。 使用此選項,也會建立使用者指派的受控識別,您的應用程式會用來使用 Microsoft Entra ID 驗證來存取這些 Azure 資源。 具有 Microsoft Entra ID 的受控識別可為連線到 Azure 資源提供最高層級的安全性。

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

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

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

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

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

部署 MCP 伺服器專案

這很重要

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

  1. 在命令選擇區中輸入 Azure Functions: Deploy to Function App,然後加以選取。

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

  3. 部署完成時,選取 [檢視輸出] 以檢視建立和部署結果,包括您所建立的 Azure 資源。 如果您錯過通知,請選取右下角的鈴鐺圖示,以再次查看。

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

  1. Python 應用程式也要求你加入以下應用程式設定:

    PYTHONPATH=/home/site/wwwroot/.python_packages/lib/site-packages

現在你可以部署伺服器專案:

這很重要

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

  1. 在命令選擇區中輸入 Azure Functions: Deploy to Function App,然後加以選取。

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

  3. 部署完成時,選取 [檢視輸出] 以檢視建立和部署結果,包括您所建立的 Azure 資源。 如果您錯過通知,請選取右下角的鈴鐺圖示,以再次查看。

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


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

啟用內建伺服器授權與認證功能

以下說明說明如何在伺服器應用程式啟用內建的授權與驗證功能,並將 Microsoft Entra ID 設定為身份提供者。 完成後,你透過 Visual Studio Code 連線伺服器來測試,並看到連線前會被提示驗證。

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

  1. 在 Azure 入口網站開啟伺服器應用程式,從左側選單選擇 設定>認證

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

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

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

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

  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),然後儲存以備後續步驟使用。

連接伺服器

.vscode目錄中開啟mcp.json

部署後跳出視窗選擇 「連接 」時,Visual Studio Code 會自動填入伺服器連線資訊。

如果漏掉這個步驟,也可以打開輸出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:Add Server... 指令,然後依照以下提示操作:

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

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

內建認證與授權

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

  2. 當被要求與 Microsoft 進行驗證時,選擇 「允許」,然後用你的電子郵件(用來登入 Azure 入口網站的那個)登入。

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

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

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

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

使用存取金鑰

如果你沒有啟用內建的認證和授權,而是想用存取金鑰連接你的 MCP 伺服器,伺服器 mcp.json 註冊的請求標頭中應該包含 Functions 存取金鑰。

Visual Studio 會在你啟動伺服器時自動填入存取金鑰。

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 伺服器互動的細節,請選擇齒輪圖示並選擇 追蹤

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

設定 Azure AI Foundry 代理以使用你的工具

你可以在 Azure AI Foundry 上設定一個代理程式,以使用在 Azure Functions 上託管的 MCP 伺服器所提供的工具。

  1. 在 Foundry 入口網站,找到你想用 Functions 上託管的 MCP 伺服器配置的代理程式。

  2. 工具中,選擇 新增 按鈕,然後選擇 + 新增工具

  3. 選擇 自訂 標籤,然後選擇 模型情境協定(MCP) 並選擇 建立 按鈕。

  4. 填入下列資訊:

    • 名稱:伺服器名稱
    • 遠端 MCP 伺服器端點:
      • MCP 擴充伺服器: https://<server domain>/runtime/webhooks/mcp
      • 自架伺服器: https://<server domain>/mcp
    • 認證:選擇「Microsoft Entra」
    • 類型:選擇「專案管理身份」
    • 受眾: 這是來自 設定受保護的資源中繼資料 的 Entra App ID URI

    例如:

    顯示 Foundry agent 連接 MCP 伺服器的設定圖。

  5. 選擇 連線

  6. 你可以在聊天視窗裡,透過伺服器工具來回答一個問題來測試。

伺服器授權協定

在 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工具。

故障排除

如果遇到困難,請向 GitHub Copilot 求助。 以下是一些具體的故障排除建議:

目前沒有其他想法。 記得透過 Copilot 聊天詢問任何發生的錯誤。

後續步驟

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