你当前正在访问 Microsoft Azure Global Edition 技术文档网站。 如果需要访问由世纪互联运营的 Microsoft Azure 中国技术文档网站,请访问 https://docs.azure.cn

教程:在 Azure Functions 上托管 MCP 服务器

本文介绍如何在 Azure Functions 上托管远程 模型上下文协议 (MCP) 服务器。 你还将了解如何使用内置身份验证来配置服务器终结点授权并更好地保护 AI 工具。

在 Azure Functions 中托管远程 MCP 服务器有两种方法:

MCP 服务器选项 Description 最适用于...
MCP 扩展服务器 使用 Azure Functions MCP 扩展创建自定义 MCP 服务器,其中扩展触发器允许定义工具终结点。 这些服务器在所有 Functions 语言中受支持,并作为任何其他函数应用进行开发、部署和管理。 熟悉 Functions 及其 基于绑定的编程模型时。
自托管服务器 Functions 可以托管使用标准 MCP SDK 创建的 MCP 服务器项目。 当您已经使用官方 MCP SDK 构建服务器并正在寻找 Azure 中的事件驱动、无服务器和可扩展的托管时。

注释

使用官方 MCP SDK 创建的 MCP 服务器可以由 Azure Functions 主机托管,其功能目前为预览版。

本教程涵盖 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 选项
    选择项目类型 选择 C#
    选择 .NET 运行时 选择 .NET 8.0 LTS
    为项目的第一个函数选择模板 选择 MCP Tool trigger
    提供函数名称 键入 McpTrigger
    提供命名空间 键入 My.Functions
    授权级别 选择 FUNCTION,在连接到远程 MCP 服务器时需要访问密钥。
    选择要打开项目的方式 选择 Open in current window
  1. 根据提示提供以下信息:

    Prompt 选项
    选择项目类型 选择 TypeScript
    为项目的第一个函数选择模板 选择 MCP Tool trigger
    提供函数名称 键入 mcpToolTrigger
    授权级别 选择 FUNCTION,在连接到远程 MCP 服务器时需要访问密钥。
    选择要打开项目的方式 选择 Open in current window
  1. 根据提示提供以下信息:

    Prompt 选项
    选择项目类型 选择 Python
    选择 Python 解释器以创建虚拟环境 选择首选 Python 解释器。 如果未显示某个选项,请键入 Python 二进制文件的完整路径。
    为项目的第一个函数选择模板 选择 MCP Tool trigger
    要创建的函数的名称 输入 mcp_trigger
    授权级别 选择 FUNCTION,在连接到远程 MCP 服务器时需要访问密钥。
    选择要打开项目的方式 选择 Open in current window

使用此信息,Visual Studio Code 为 MCP 服务器触发器生成代码项目。 可以在资源管理器中查看本地项目文件。

在本地启动 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
内置服务器身份验证(预览版) Functions 包括内置 应用服务身份验证和授权 ,用于实现 MCP 授权规范 协议的 OAuth 要求。 尝试访问服务器的客户端会重定向到配置的标识提供者(如 Microsoft Entra ID),以便在允许连接之前进行身份验证。 此方法为工具终结点提供最高级别的安全性。
基于密钥的身份验证 默认情况下,Functions 实现访问密钥要求,以便尝试使用 MCP 服务器工具的客户端必须在请求标头中显示共享密钥值。 虽然没有提供与基于 OAuth 的身份验证相同的安全级别,但访问密钥使得访问公共工具更加困难。 使用Anonymous访问级别可以在使用基于OAuth的身份验证时禁用服务器中的访问密钥。

注释

本教程包含内置服务器授权和身份验证功能的详细配置说明,其他文章中可能也称为 应用服务身份验证 。 可以在 “配置内置服务器授权”(预览版) 一文中找到功能的概述和一些使用指南。

禁用基于密钥的身份验证

内置服务器授权功能是独立于 Azure Functions 的组件。 使用服务器身份验证时,最好先通过允许匿名访问来禁用基于密钥的身份验证。

若要在 MCP 服务器中禁用基于主机的身份验证,请在文件中设置为 system.webhookAuthorizationLevelAnonymoushost.json

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

在 Azure 中创建函数应用

在 Azure 中托管 MCP 服务器的 Flex Consumption 计划中创建函数应用。

  1. Azure 门户,从菜单或“主页”页面中,选择“创建资源”

  2. 选择“开始”,然后在“函数应用”下选择“创建”

  3. 在“选择托管选项”下,选择“Flex 消耗”>“选择”

  4. 基本信息页面上,根据下表中的说明使用函数应用程序设置:

    设置 建议值 Description
    Subscription 你的订阅 在其中创建新函数应用的订阅。
    资源组 myResourceGroup 将在其中创建函数应用的新资源组的名称。
    函数应用名称 全局唯一名称 用于标识您的新函数应用程序的名称。 有效字符为 a-z(不区分大小写)、0-9-
    Region 首选区域 选择一个靠近你或靠近函数可以访问的其他服务 的区域 。 不显示不受支持的区域。 有关详细信息,请参阅查看当前支持的区域
    运行时堆栈 首选语言 选择其中一个受支持的语言运行时堆栈。 使用 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: 部署到函数应用”。

  2. 选择你刚才创建的函数应用。 当系统提示覆盖以前的部署时,请选择“部署”,将函数代码部署到新的函数应用资源。

  3. 部署完成后,选择“查看输出”,以查看创建和部署结果,其中包括已创建的 Azure 资源。 如果错过了通知,请选择右下角的铃铛图标再次查看。

    “视图输出”窗口的屏幕截图。

  1. Python 应用还需要添加此应用设置:

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

现在可以部署服务器项目:

重要

部署到现有函数应用将始终覆盖该应用在 Azure 中的内容。

  1. 在命令面板中,输入并选择“Azure Functions: 部署到函数应用”。

  2. 选择你刚才创建的函数应用。 当系统提示覆盖以前的部署时,请选择“部署”,将函数代码部署到新的函数应用资源。

  3. 部署完成后,选择“查看输出”,以查看创建和部署结果,其中包括已创建的 Azure 资源。 如果错过了通知,请选择右下角的铃铛图标再次查看。

    “视图输出”窗口的屏幕截图。


部署完成后,应在 Visual Studio Code 中看到有关连接到服务器的通知。 选择 “连接 ”按钮,让编辑器在其中 mcp.json设置服务器连接信息。

启用内置服务器授权和身份验证

以下说明演示如何在服务器应用上启用内置授权和身份验证功能,并将 Microsoft Entra ID 配置为标识提供者。 完成后,通过连接到 Visual Studio Code 中的服务器进行测试,并看到在连接之前系统提示你进行身份验证。

在服务器应用上配置身份验证

  1. 在 Azure 门户中打开服务器应用,然后从左侧菜单中选择 “设置>身份验证 ”。

  2. 选择“ 添加标识提供者>”Microsoft 作为标识提供者。

  3. 对于为应用程序及其用户选择租户,请选择“员工配置”(当前租户)。

  4. 应用注册下: 使用以下设置:

    设置 选项
    应用注册类型 创建新的应用注册
    名称 输入应用的描述性名称
    客户端密码过期 建议:180 天
    支持的帐户类型 当前租户 - 单租户
  5. “其他检查”下:对于 客户端应用程序要求 ,请选择 “允许来自特定客户端应用程序的请求”,选择铅笔图标,添加 Visual Studio Code 客户端 ID aebc6443-996d-45c2-90f0-388ff96faa56,然后选择“ 确定”。 将其他部分保留为原样。

  6. 应用服务身份验证设置 下,使用以下设置:

    设置 选项
    限制访问 需要身份验证
    未经身份验证的请求 HTTP 401 未授权:建议用于 API
    令牌存储 选中允许令牌刷新的框
  7. 选择 并添加。 设置传播后,您应该会看到以下结果:

    应用服务身份验证设置的屏幕截图,其中显示了为未经身份验证的请求选择“需要身份验证”和“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. 在同一 公开 API 视图中,找到 作用域 部分,并复制允许管理员和用户同意 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. 此外,在“公开 API”视图中,查找顶部的“应用程序 ID URI”(看起来像 api://abcd123-efg456-hijk-7890123),并保存以供后续步骤使用。

连接到服务器

mcp.json目录中打开.vscode

在部署后选择“ 连接 ”时,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:添加服务器... 命令,然后按照以下提示作:

    Prompt 建议
    要添加的服务器的类型 HTTP
    MCP 服务器的 URL https://<FUNCTION_APP_NAME>.azurewebsites.azurewebsites.net/runtime/webhooks/mcp
    服务器名称 remote-mcp-server
    在何处安装服务器 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 App。 在左侧菜单中,找到 Functions -> 应用键。 在“系统密钥”部分下,找到名为 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 应用 ID URI

    例如:

    显示用于连接到 MCP 服务器的 Foundry 代理配置的关系图。

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

Troubleshooting

如果遇到问题,请向 GitHub Copilot 寻求帮助。 下面是故障排除的一些具体思路:

目前没有其他想法。 遇到任何错误时,请记得询问 Copilot 对话助手。

后续步骤

了解如何 在 Azure API 中心注册 Azure Functions 托管的 MCP 服务器