Azure Functions 上的自承载远程 MCP 服务器(公共预览版)

Azure Functions 提供两种方法来托管远程 MCP 服务器:

使用第一种方法,可以使用包含触发器和绑定的 Azure Functions 编程模型来生成 MCP 服务器。 然后,可以通过将其部署到 Function App 来远程托管服务器。

如果你已经使用官方 MCP SDK 创建了 MCP 服务器,并且只想远程托管它,则第二种方法可能符合你的需求。 无需对服务器进行任何代码更改,以在 Azure Functions 上托管它。 您可以添加所需的 Functions 工件,服务器就已准备好部署。 因此,这些服务器称为 自承载 MCP 服务器

托管函数应用和自定义处理程序应用的关系图。

本文概述了自托管的 MCP 服务器,并提供指向相关文章和示例的链接。

自定义处理程序

自承载 MCP 服务器作为 自定义处理程序部署到 Azure Functions 平台。 自定义处理程序是可以从 Functions 主机接收事件的轻型 Web 服务器。 它们提供了一种方法,可以在 Functions 平台上运行使用与 Functions 编程模型不同的框架或原本不支持的语言构建的应用程序。 有关详细信息,请参阅 Azure Functions 自定义处理程序

将基于 MCP SDK 的服务器部署到 Azure Functions 时,必须在项目中包括 host.json 。 最小 host.json 如下所示:

{
   "version": "2.0",
    "configurationProfile": "mcp-custom-handler",
    "customHandler": {
        "description": {
            "defaultExecutablePath": "python",
            "arguments": ["Path to main script file, e.g. hello_world.py"] 
        },
        "port": "<MCP server port>"
    }
}
{
   "version": "2.0",
    "configurationProfile": "mcp-custom-handler",
    "customHandler": {
        "description": {
            "defaultExecutablePath": "npm",
            "arguments": ["run", "start"] 
        },
        "port": "<MCP server port>"
    }
}
{
   "version": "2.0",
    "configurationProfile": "mcp-custom-handler",
    "customHandler": {
        "description": {
            "defaultExecutablePath": "dotnet",
            "arguments": ["Path to the compiled DLL, e.g. HelloWorld.dll"] 
        },
        "port": "<MCP server port>"
    }
}

注释

由于部署到 Azure Functions 的有效载荷是目录bin/output的内容,因此已编译 DLL 的路径是相对于该目录,而不是项目根目录。

示例尚不可用。

configuration Profile使用mcp-custom-handler的值自动配置这些函数主机设置,以在 Azure Functions 中运行 MCP 服务器,这是必需的设置。

  • http.enableProxyingtrue
  • http.routes[{ "route": "{*route}" }]
  • extensions.http.routePrefix""

此示例显示了一个 host.json 文件,其中包含与使用 mcp-custom-handler 配置文件等效的额外自定义处理程序属性:

{
    "version": "2.0",
    "extensions": {
        "http": {
            "routePrefix": ""
        }
    },
    "customHandler": {
        "description": {
            "defaultExecutablePath": "",
            "arguments": [""]
        },
        "http": {
            "enableProxying": true, 
            "defaultAuthorizationLevel": "anonymous", 
            "routes": [ 
                {
                    "route": "{*route}",
                    // Default authorization level is `defaultAuthorizationLevel`
                },
                {
                    "route": "admin/{*route}",
                    "authorizationLevel": "admin"
                }
            ]
        }
    }
}

下表解释了customHandler.http的属性及其默认值:

资产 它的作用是什么 默认值
enableProxying 控制 Azure Functions 主机如何处理对自定义处理程序的 HTTP 请求。 当enableProxying设置为true时,Functions 主机充当反向代理,将整个 HTTP 请求(包括请求头、正文、查询参数)直接转发到自定义处理程序。 此设置为自定义处理程序提供对原始 HTTP 请求详细信息的完全访问权限。

enableProxying如果是false,Functions 主机先处理请求,然后将其转换为 Azure Functions 请求/响应格式,然后再将其传递给自定义处理程序。
false
defaultAuthorizationLevel 控制访问自定义处理程序终结点的身份验证要求。 例如, function 需要特定于函数的 API 密钥才能访问。 有关详细信息,请参阅 授权级别 function
route 指定自定义处理程序响应的 URL 路径模式。 {*route}匹配任何 URL 路径(例如//mcp/api/tools/anything/nested/path)并将请求转发到自定义处理程序。 {*route}

内置服务器身份验证

应用服务平台提供的基于 OAuth 的身份验证和授权实现了 MCP 授权规范的要求,例如发出 401 质询并公开受保护的资源元数据(PRM)文档。 启用内置身份验证时,试图访问服务器的客户端会被重定向到身份提供者,例如 Microsoft Entra ID,以便在连接之前进行身份验证。

有关详细信息,请参阅配置内置服务器授权(预览版)。

公共预览版支持

在 Functions 中托管基于 SDK 的 MCP 服务器的功能目前为预览版,并支持这些功能:

  • 使用streamable-http传输的无状态服务器。 如果需要服务器具有状态,请考虑使用 Functions MCP 扩展程序。
  • 使用 Python、TypeScript、C# 或 Java MCP SDK 实现的服务器。
  • 在本地运行项目时,必须使用 Azure Functions Core Tools (func start 命令)。 当前无法使用 F5 启动调试器进行运行。
  • 服务器必须以 Flex Consumption 计划 形式托管应用。

Azure Functions 自定义处理程序