Azure Functions 的模型上下文协议绑定概述

模型上下文协议(MCP)是一种客户端-服务器协议,旨在使语言模型和代理能够更有效地发现和使用外部数据源和工具。

Azure Functions MCP 扩展允许使用 Azure Functions 创建远程 MCP 服务器。 这些服务器可以托管 MCP 工具触发器函数,MCP 客户端(如语言模型和代理)可以查询和访问以执行特定任务。

Action 类型
从 MCP 工具调用请求运行函数 触发

重要

MCP 扩展目前不支持 PowerShell 应用。

先决条件

  • 需要 2.1.0 或更高版本的 Microsoft.Azure.Functions.Worker 包。
  • 需要 2.0.2 或更高版本的 Microsoft.Azure.Functions.Worker.Sdk 包。

安装扩展

注释

对于 C#,Azure Functions MCP 扩展仅支持 隔离的辅助角色模型

通过采用首选方式安装此 NuGet 包 ,将扩展添加到项目:

Microsoft.Azure.Functions.Worker.Extensions.Mcp

安装捆绑包

若要能够在应用中使用此绑定扩展,请确保项目的根目录中 host.json 文件包含以下 extensionBundle 引用:

{
    "version": "2.0",
    "extensionBundle": {
        "id": "Microsoft.Azure.Functions.ExtensionBundle",
        "version": "[4.0.0, 5.0.0)"
    }
}

在此示例中,version[4.0.0, 5.0.0)值指示 Functions 主机使用至少4.0.0小于但小于5.0.0的捆绑包版本,其中包括所有可能的 4.x 版本。 此表示法有效地在 v4.x 扩展捆绑包的最新可用次要版本上维护应用。

如果可能,应使用最新的扩展捆绑包主版本,并允许运行时自动维护最新的次要版本。 可以在 扩展捆绑包发布页上查看最新捆绑包的内容。 有关详细信息,请参阅 Azure Functions 扩展捆绑包

MCP 扩展特别需要捆绑版本 4.28.0 或更高版本。 可以通过将它指定为文件中的最低版本来确保获得此版本 host.json

{
  "version": "2.0",
  "extensionBundle": {
    "id": "Microsoft.Azure.Functions.ExtensionBundle",
    "version": "[4.28.0, 5.0.0)"
  }
}

host.json 设置

本部分介绍版本 2.x 及更高版本中此绑定可用的配置设置。 host.json 文件中的设置将应用于函数应用实例中的所有函数。 有关函数应用配置设置的详细信息,请参阅 Azure Functions 的host.json 参考

可以使用该 extensions.mcp 部分 host.json 来定义 MCP 服务器信息。

{
  "version": "2.0",
  "extensions": {
    "mcp": {
      "instructions": "Some test instructions on how to use the server",
      "serverName": "TestServer",
      "serverVersion": "2.0.0",
      "encryptClientState": true,
      "messageOptions": {
        "useAbsoluteUriForEndpoint": false
      },
      "system": {
        "webhookAuthorizationLevel": "System"
      }
    }    
  }
}
资产 DESCRIPTION
指示 描述客户端如何访问远程 MCP 服务器。
serverName 远程 MCP 服务器的友好名称。
serverVersion 远程 MCP 服务器的当前版本。
encryptClientState 确定客户端状态是否已加密。 默认值为 true。 设置为 false 对于调试和测试方案可能很有用,但不建议用于生产环境。
messageOptions SSE 传输中消息终结点的选项对象。
messageOptions.UseAbsoluteUriForEndpoint 默认为 false。 仅适用于服务器发送的事件(SSE)传输;此设置不会影响可流式传输的 HTTP 传输。 如果设置为 false,则消息终结点在通过 SSE 传输进行初始连接期间作为相对 URI 提供。 如果设置为 true,则消息终结点将作为绝对 URI 返回。 除非有特定原因这样做,否则不建议使用相对 URI。
系统 系统级配置的 Options 对象。
system.webhookAuthorizationLevel 定义 Webhook 终结点所需的授权级别。 默认为“系统”。 允许的值为“System”和“Anonymous”。 将值设置为“Anonymous”时,请求不再需要访问密钥。 无论是否需要密钥,都可以使用 内置的 MCP 服务器授权 作为基于标识的访问控制层。
此设置仅在 Functions 主机版本 4.1045.0 或更高版本上运行时才可用。

连接到 MCP 服务器

若要连接到函数应用公开的 MCP 服务器,需要为 MCP 客户端提供相应的终结点和传输信息。 下表显示了 Azure Functions MCP 扩展支持的传输及其相应的连接终结点。

Transport 端点
可流式传输 HTTP /runtime/webhooks/mcp
Server-Sent 事件 (SSE)1 /runtime/webhooks/mcp/sse

1 个较新的协议版本已弃用 Server-Sent 事件传输。 除非客户端特别需要它,否则应改用可流式传输 HTTP 传输。

在 Azure 中托管时,扩展公开的终结点也需要命名mcp_extension。 如果未在 HTTP 标头或x-functions-key查询字符串参数中code提供,客户端将收到401 Unauthorized响应。 可以通过将system.webhookAuthorizationLevel属性host.jsonAnonymous设置为 . 有关详细信息,请参阅 host.json 设置 部分。

可以使用 Get 函数访问密钥中所述的任何方法检索密钥。 以下示例演示如何使用 Azure CLI 获取密钥:

az functionapp keys list --resource-group <RESOURCE_GROUP> --name <APP_NAME> --query systemKeys.mcp_extension --output tsv

MCP 客户端以各种方式接受此配置。 请参阅所选客户端的文档。 以下示例演示了一个 mcp.json 文件,就像在 Visual Studio Code 中为 GitHub Copilot 配置 MCP 服务器一样。 该示例使用可流式传输 HTTP 传输设置两个服务器。 第一个是使用 Azure Functions Core Tools 进行本地测试。 第二个用于 Azure 中托管的函数应用。 配置采用 Visual Studio Code 首次运行远程服务器时提示的输入参数。 使用输入可确保不会将系统密钥等机密保存到文件中并签入源代码管理。

{
    "inputs": [
        {
            "type": "promptString",
            "id": "functions-mcp-extension-system-key",
            "description": "Azure Functions MCP Extension System Key",
            "password": true
        },
        {
            "type": "promptString",
            "id": "functionapp-host",
            "description": "The host domain of the function app."
        }
    ],
    "servers": {
        "local-mcp-function": {
            "type": "http",
            "url": "http://localhost:7071/runtime/webhooks/mcp"
        },
        "remote-mcp-function": {
            "type": "http",
            "url": "https://${input:functionapp-host}/runtime/webhooks/mcp",
            "headers": {
                "x-functions-key": "${input:functions-mcp-extension-system-key}"
            }
        }
    }
}