MCP服务器Azure功能
使用Azure Functions和的模型上下文协议(MCP)服务器实现。NET 8.0隔离工作者模型。
概述
此项目将模型上下文协议(MCP)服务器实现为Azure函数,实现了与支持MCP标准的语言模型的交互。该实现使用Azure Functions v4隔离的worker模型,该模型提供了更好的性能、可扩展性和与的兼容性。网8。
特性
- 实施MCP协议操作:
- list_operations:标准MCP操作,列出所有可用操作 - get_openapi_spec:提供API文件的标准MCP操作 - getBusinessData:检索业务指标和数据的自定义操作 - triggerLogicApp:触发Azure逻辑应用程序的自定义操作 - callInternalApi:将请求代理到内部API的自定义操作
- 基于Azure Functions v4构建,具有隔离的工作进程
- 使用。NET 8.0,以提高性能和功能
- 结构化错误处理和日志记录
- 使用System进行JSON序列化。文本。JSON
- 使用二头肌模板的基础设施即代码(IaC)
先决条件
- .NET 8 SDK
- Azure功能核心工具v4
- Visual Studio 2022 或 Visual Studio Code
- Azure命令行界面 (用于部署)
- Azure二头肌CLI (用于基础设施部署)
设置和配置
地方发展设置
- 克隆存储库
- 配置本地设置
local.se.json文件包含在本地运行函数所需的配置。确保它包括:
{
"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本地运行
- 启动该功能
func start该功能将在 http://localhost:7071/api/MCPFunction
- 停止该功能
按 Ctrl+C 在运行该功能的终端中,或 使用以下命令查找PID netstat -ano | findstr :7071 | findstr LISTENING 然后杀了它 taskkill /F /PID
测试
使用JSON文件进行本地测试
该项目包括测试JSON文件,以帮助验证MCP服务器功能:
- 测试列表_操作
使用 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"
}
}
}使用功能键测试已部署的功能
在测试部署到Azure的函数时,您需要在请求中包含函数键:
- 在curl请求中使用功能键
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- 替代方案:使用功能键作为查询参数
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进行测试
- 向您的函数URL创建新的POST请求 - 添加一个 x-functions-key 带有功能键的标题 - 设置 Content-Type 标题到 application/json - 以JSON格式添加MCP请求体 - 发送请求并检查响应
部署到Azure
使用二头肌进行部署(推荐)
此项目包括用于基础架构即代码部署的二头肌模板,遵循Azure最佳实践。
- 导航到基础结构目录
cd infra- 部署到特定的Azure区域(例如瑞典中部)
# 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- 将功能代码部署到创建的功能应用程序
# 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- 检索功能键进行测试
# List function keys
az functionapp function keys list --name FUNCTION_APP_NAME --resource-group rg-mcp-function --function-name MCPFunction二头肌模板细节
二头肌模板(main.bicep)包括:
- 功能应用程序。NET 8.0隔离工作运行时
- 应用服务计划(消费或专用)
- 功能执行存储帐户
- 监控应用洞察
- 日志分析工作区
- 用户分配的托管身份用于安全身份验证
可定制的关键参数:
location:用于部署的Azure区域(默认:swedencentral)environmentName:资源的名称前缀appServicePlanSku:应用服务计划的SKU(Y1、B1、S1)mcpAuthEnabled:是否启用MCP身份验证mcpAllowedOperations:逗号分隔的允许操作列表
使用Azure CLI进行部署(替代方案)
- 在Azure中创建功能应用程序
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- 设置功能应用程序设置
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密钥保管库:
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 "INTERNAL_API_KEY=@Microsoft.KeyVault(SecretUri=https://mcpserver-kv.vault.azure.net/secrets/InternalApiKey/)"- 发布函数
func azure functionapp publish mcp-server-function使用Azure DevOps或GitHub操作进行部署
使用以下命令创建CI/CD管道:
- Azure DevOps Azure功能管道模板
- GitHub操作Azure函数工作流
生产部署注意事项
区域选择
- 瑞典中部地区福利:
- 针对欧洲数据驻留要求的强大合规产品 - 可持续发展重点,可再生能源使用量高 - 北欧和北欧用户的低延迟访问 - 配备最新基础设施的现代化Azure数据中心
安全最佳实践
- 通过设置启用MCP身份验证
MCP_AUTH_ENABLED=true生产中 - 将敏感信息(如API密钥)存储在Azure密钥保管库中
- 使用托管身份与其他Azure服务进行身份验证
- 使用Application Insights监控功能执行
- 定期更新依赖关系以解决安全漏洞
- 启用仅HTTPS访问您的功能应用程序
- 使用最低TLS版本1.2
- 禁用对功能应用程序的FTP访问
监控和卓越运营
- 启用Application Insights以进行全面监控
- 设置异常功能行为警报
- 配置日志保留的诊断设置
- 使用资源标签进行更好的资源管理
- 为管理访问实施适当的RBAC
- 定期备份功能应用程序配置
故障排除
常见问题
- 系统。网。找不到基本体程序集
运行时可能会出现这种情况。NET 8使用进程内模型运行。解决方案是使用此项目中配置的隔离工作进程模型。
- 函数未在本地启动
确保你有权利。global.json中指定的NET SDK版本:
{
"sdk": {
"version": "8.0.115"
}
}- 身份验证或授权失败
检查你的 MCP_AUTH_ENABLED 设置并确保在Azure中配置了正确的身份验证。
- 二头肌展开错误
- 使用以下工具检查棉绒错误 az bicep build --file main.bicep - 验证资源名称约定和唯一性 - 确保使用正确的参数类型 - 使用假设操作在部署前验证更改 - 常见的二头肌错误包括: - 在不正确的位置使用函数(例如,utcNow()只能在参数默认值中使用) - 变量引用无效 - 缺少参数或表达式
- 功能关键问题
如果在测试部署的功能时收到401未经授权的错误,请确保在请求中包含功能键,无论是作为 x-functions-key 标题或作为 ?code= 查询参数。
贡献
- 分叉存储库
- 创建要素分支
- 进行更改
- 运行测试
- 提交拉取请求
许可证
\[指定发布此项目的许可证\]
