关于 MCP Server Azure Function
MCP Server Azure Function 使用 .NET 8 隔离工作进程模型,将 MCP 服务实现为 Azure Functions v4 应用。适用于在 Azure 上部署 MCP 操作及内部业务集成的团队。
主要功能
- 01列出可用操作
- 02提供 OpenAPI 规范
- 03获取业务指标和数据
- 04触发 Azure Logic Apps
- 05代理请求至内部 API
- 06使用 Bicep 部署基础设施
适用场景
- 01通过 MCP 操作提供业务数据
- 02从 MCP 请求触发 Logic Apps
- 03将 MCP 请求转发至内部 API
MCP 相关
它向 MCP 客户端提供列出操作和 API 文档的标准操作,以及业务数据、Logic Apps 和内部 API 的自定义操作。
配置
本地服务的配置在各客户端中通用,复制后粘贴到客户端的 MCP 配置文件即可。
我们还没有获取到这个服务的安装包或远程地址,请按项目 README 中的说明安装。
工具
本地服务需要在你的电脑上运行后才能读取工具,维护者暂未提供工具列表。
详细介绍
MCP Server Azure Function
使用 Azure Functions 和 .NET 8.0 隔离工作进程模型实现的 Model Context Protocol(MCP)服务。
概述
本项目将 Model Context Protocol(MCP)服务实现为 Azure Function,从而能够与支持 MCP 标准的大模型交互。此实现使用 Azure Functions v4 隔离工作进程模型,可提供更高的性能、可扩展性,并改善与 .NET 8 的兼容性。
功能
-
实现 MCP 协议操作:
list_operations:标准 MCP 操作,用于列出所有可用操作get_openapi_spec:标准 MCP 操作,用于提供 API 文档getBusinessData:自定义操作,用于检索业务指标和数据triggerLogicApp:自定义操作,用于触发 Azure Logic AppscallInternalApi:自定义操作,用于代理向内部 API 发送的请求
-
基于采用隔离工作进程的 Azure Functions v4 构建
-
使用 .NET 8.0,提升性能并提供更多功能
-
采用结构化错误处理和日志记录
-
使用 System.Text.Json 进行 JSON 序列化
-
使用 Bicep 模板实现基础设施即代码(IaC)
先决条件
- .NET 8 SDK
- Azure Functions Core Tools v4
- Visual Studio 2022 或 Visual Studio Code
- Azure CLI(用于部署)
- Azure Bicep CLI(用于部署基础设施)
设置和配置
本地开发环境设置
-
克隆仓库
-
配置 local.settings.json
local.settings.json 文件包含在本地运行此 Function 所需的配置。请确保其中包含:
{ "IsEncrypted": false, "Values": { "AzureWebJobsStorage": "UseDevelopmentStorage=true", "FUNCTIONS_WORKER_RUNTIME": "dotnet-isolated", "DOTNET_ISOLATE_TIMEOUT_SECONDS": "60", "LOGIC_APP_ENDPOINT": "https://prod-12.eastus.logic.azure.com:443/workflows/your-logic-app-id", "INTERNAL_API_BASE_URL": "https://api.internal.company.com", "INTERNAL_API_KEY": "your-api-key-here", "MCP_AUTH_ENABLED": "false", "MCP_ALLOWED_OPERATIONS": "getBusinessData,triggerLogicApp,callInternalApi,list_operations,get_openapi_spec" } } -
安装依赖项
dotnet restore
在本地运行
-
启动 Function
func startFunction 将在
http://localhost:7071/api/MCPFunction上提供服务。 -
停止 Function
在运行 Function 的终端中按
Ctrl+C,或者 使用netstat -ano | findstr :7071 | findstr LISTENING查找 PID, 然后使用taskkill /F /PID <PID>结束进程。
测试
使用 JSON 文件进行本地测试
项目包含用于验证 MCP 服务功能的 JSON 测试文件:
-
测试 list_operations
使用
test-list-operations.json文件测试用于列出所有可用操作的标准 MCP 操作:curl -X POST http://localhost:7071/api/MCPFunction -H "Content-Type: application/json" -d @test-list-operations.json -
测试 getBusinessData
使用
test-business-data.json文件测试业务数据检索功能:curl -X POST http://localhost:7071/api/MCPFunction -H "Content-Type: application/json" -d @test-business-data.json -
测试其他操作
你可以按照 MCP 协议格式,为其他操作创建更多测试文件:
{ "requestId": "unique-request-id", "messageType": "invoke", "invokeRequest": { "operation": "operationName", "parameters": { "param1": "value1", "param2": "value2" } } }
使用 Function 密钥测试已部署的 Function
测试部署到 Azure 的 Function 时,需要在请求中包含 Function 密钥:
-
在 curl 请求中使用 Function 密钥
curl -X POST https://your-function-app.azurewebsites.net/api/MCPFunction \ -H "Content-Type: application/json" \ -H "x-functions-key: YOUR_FUNCTION_KEY" \ -d @test-list-operations.json -
替代方法:将 Function 密钥用作查询参数
curl -X POST "https://your-function-app.azurewebsites.net/api/MCPFunction?code=YOUR_FUNCTION_KEY" \ -H "Content-Type: application/json" \ -d @test-list-operations.json -
使用 Postman 测试
- 新建一个指向 Function URL 的 POST 请求
- 添加包含 Function 密钥的
x-functions-key标头 - 将
Content-Type标头设为application/json - 添加 JSON 格式的 MCP 请求正文
- 发送请求并检查响应
部署到 Azure
使用 Bicep 部署(推荐)
本项目包含用于基础设施即代码部署的 Bicep 模板,并遵循 Azure 最佳实践。
-
进入基础设施目录
cd infra -
部署到指定的 Azure 区域(例如 Sweden Central)
# Create resource group (if it doesn't exist) az group create --name rg-mcp-function --location swedencentral # Validate the deployment with what-if operation (recommended practice) az deployment group what-if --name mcp-server-deployment --resource-group rg-mcp-function --template-file main.bicep --parameters main.parameters.json # Deploy the infrastructure az deployment group create --name mcp-server-deployment --resource-group rg-mcp-function --template-file main.bicep --parameters main.parameters.json -
将 Function 代码部署到已创建的 Function App
# Build the project for release dotnet publish -c Release # Deploy to Azure Function App (replace FUNCTION_APP_NAME with your deployed function app name) func azure functionapp publish FUNCTION_APP_NAME --dotnet-isolated -
获取用于测试的 Function 密钥
# List function keys az functionapp function keys list --name FUNCTION_APP_NAME --resource-group rg-mcp-function --function-name MCPFunction
Bicep 模板详情
Bicep 模板(main.bicep)包含:
- 使用 .NET 8.0 隔离工作进程运行时的 Function App
- App Service 计划(消耗型或专用型)
- 用于函数执行的存储帐户
- 用于监控的 Application Insights
- 用于日志的 Log Analytics 工作区
- 用于安全身份验证的用户分配托管标识
可自定义的关键参数:
location:部署所在的 Azure 区域(默认值:swedencentral)environmentName:资源名称前缀appServicePlanSku:App Service 计划的 SKU(Y1、B1、S1)mcpAuthEnabled:是否启用 MCP 身份验证mcpAllowedOperations:以逗号分隔的允许操作列表
使用 Azure CLI 部署(替代方式)
-
在 Azure 中创建 Function App
az login az group create --name mcp-server-rg --location eastus az storage account create --name mcpserverfunc --location eastus --resource-group mcp-server-rg --sku Standard_LRS az functionapp create --resource-group mcp-server-rg --consumption-plan-location eastus --runtime dotnet-isolated --functions-version 4 --name mcp-server-function --storage-account mcpserverfunc --os-type Windows -
设置 Function App 配置
az functionapp config appsettings set --name mcp-server-function --resource-group mcp-server-rg --settings "LOGIC_APP_ENDPOINT=https://prod-12.eastus.logic.azure.com:443/workflows/your-logic-app-id" "INTERNAL_API_BASE_URL=https://api.internal.company.com" "MCP_AUTH_ENABLED=true" "MCP_ALLOWED_OPERATIONS=getBusinessData,triggerLogicApp,callInternalApi,list_operations,get_openapi_spec"对于 API 密钥等敏感配置,请使用 Azure Key Vault:
az keyvault create --name mcpserver-kv --resource-group mcp-server-rg --location eastus az keyvault secret set --vault-name mcpserver-kv --name "InternalApiKey" --value "your-api-key-here" az functionapp identity assign --name mcp-server-function --resource-group mcp-server-rg # Grant the function access to Key Vault $principalId=$(az functionapp identity show --name mcp-server-function --resource-group mcp-server-rg --query principalId --output tsv) az keyvault set-policy --name mcpserver-kv --object-id $principalId --secret-permissions get list # Add Key Vault reference to Function App settings az functionapp config appsettings set --name mcp-server-function --resource-group mcp-server-rg --settings "[email protected](SecretUri=https://mcpserver-kv.vault.azure.net/secrets/InternalApiKey/)" -
发布函数
func azure functionapp publish mcp-server-function
使用 Azure DevOps 或 GitHub Actions 部署
使用以下内容创建 CI/CD 管道:
- Azure DevOps Azure Functions 管道模板
- GitHub Actions Azure Functions 工作流
生产环境部署注意事项
区域选择
- 瑞典中部区域的优势:
- 提供完善的合规方案,满足欧洲数据驻留要求
- 注重可持续发展,使用大量可再生能源
- 为北欧和北欧地区用户提供低延迟访问
- 配备最新基础设施的现代化 Azure 数据中心
安全最佳实践
- 在生产环境中将
MCP_AUTH_ENABLED=true设为启用 MCP 身份验证 - 将 API 密钥等敏感信息存储在 Azure Key Vault 中
- 使用托管标识向其他 Azure 服务进行身份验证
- 使用 Application Insights 监控函数执行
- 定期更新依赖项,以修复安全漏洞
- 启用仅限 HTTPS 的 Function App 访问
- 使用最低 TLS 版本 1.2
- 禁用 Function App 的 FTP 访问
监控与卓越运营
- 启用 Application Insights 以进行全面监控
- 为异常函数行为设置警报
- 配置诊断设置以保留日志
- 使用资源标记来更好地管理资源
- 为管理访问实施适当的 RBAC
- 定期备份 Function App 配置
故障排除
常见问题
-
找不到 System.Net.Primitives 程序集
使用进程内模型运行 .NET 8 函数时可能会出现此问题。解决方法是使用隔离工作进程模型,本项目已配置为使用该模型。
-
函数无法在本地启动
确保使用
global.json中指定的正确 .NET SDK 版本:{ "sdk": { "version": "8.0.115" } } -
身份验证或授权失败
检查
MCP_AUTH_ENABLED设置,并确保已在 Azure 中正确配置身份验证。 -
Bicep 部署错误
- 使用
az bicep build --file main.bicep检查 lint 错误 - 验证资源名称规范和唯一性
- 确保使用正确的参数类型
- 在部署前使用 what-if 操作验证更改
- 常见的 Bicep 错误包括:
- 在不正确的位置使用函数(例如,utcNow() 只能用于参数默认值)
- 变量引用无效
- 缺少参数或表达式
- 使用
-
函数密钥问题
如果测试已部署的函数时收到 401 Unauthorized 错误,请确保请求中包含函数密钥,可将其作为
x-functions-key标头或?code=查询参数传递。
贡献
- Fork 此仓库
- 创建功能分支
- 进行更改
- 运行测试
- 提交拉取请求
许可证
[Specify the license under which this project is released]
评论
一个开放协议,规定了 AI 应用如何以统一方式连接外部工具与数据源。客户端负责与模型对话,MCP 服务负责提供工具、资源和提示模板,两者通过标准消息通信,同一个服务可以被不同客户端复用。