MCP协议服务器

基于Azure Functions实现的MCP协议服务器,支持与符合MCP标准的语言模型交互,提供自定义业务操作和API代理功能。

  • by katarinasvedman
  • C#
  • 本地部署
  • 更新于
在 GitHub 查看 katarinasvedman/mcp-server-function

使用说明

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)

先决条件

设置和配置

地方发展设置

  1. 克隆存储库

  2. 配置本地设置

    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"
        }
    }
    
  3. 安装依赖项

    dotnet restore
    

本地运行

  1. 启动该功能

    func start
    

    该功能将在 http://localhost:7071/api/MCPFunction

  2. 停止该功能

    按 Ctrl+C 在运行该功能的终端中,或 使用以下命令查找PID netstat -ano | findstr :7071 | findstr LISTENING 然后杀了它 taskkill /F /PID <PID>

测试

使用JSON文件进行本地测试

该项目包括测试JSON文件,以帮助验证MCP服务器功能:

  1. 测试列表_操作

    使用 test-list-operations.json 用于测试标准MCP操作的文件,其中列出了所有可用操作:

    curl -X POST http://localhost:7071/api/MCPFunction -H "Content-Type: application/json" -d @test-list-operations.json
    
  2. 测试getBusinessData

    使用 test-business-data.json 用于测试检索业务数据的文件:

    curl -X POST http://localhost:7071/api/MCPFunction -H "Content-Type: application/json" -d @test-business-data.json
    
  3. 测试其他操作

    您可以按照MCP协议格式为其他操作创建其他测试文件:

    {
      "requestId": "unique-request-id",
      "messageType": "invoke",
      "invokeRequest": {
        "operation": "operationName",
        "parameters": {
          "param1": "value1",
          "param2": "value2"
        }
      }
    }
    

使用功能键测试已部署的功能

在测试部署到Azure的函数时,您需要在请求中包含函数键:

  1. 在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
    
  2. 替代方案:使用功能键作为查询参数

    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
    
  3. 使用Postman进行测试

    • 向您的函数URL创建新的POST请求
    • 添加一个 x-functions-key 带有功能键的标题
    • 设置 Content-Type 标题到 application/json
    • 以JSON格式添加MCP请求体
    • 发送请求并检查响应

部署到Azure

使用二头肌进行部署(推荐)

此项目包括用于基础架构即代码部署的二头肌模板,遵循Azure最佳实践。

  1. 导航到基础结构目录

    cd infra
    
  2. 部署到特定的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
    
  3. 将功能代码部署到创建的功能应用程序

    # 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
    
  4. 检索功能键进行测试

    # 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进行部署(替代方案)

  1. 在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
    
  2. 设置功能应用程序设置

    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/)"
    
  3. 发布函数

    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
  • 定期备份功能应用程序配置

故障排除

常见问题

  1. 系统。网。找不到基本体程序集

    运行时可能会出现这种情况。NET 8使用进程内模型运行。解决方案是使用此项目中配置的隔离工作进程模型。

  2. 函数未在本地启动

    确保你有权利。global.json中指定的NET SDK版本:

    {
      "sdk": {
        "version": "8.0.115"
      }
    }
    
  3. 身份验证或授权失败

    检查你的 MCP_AUTH_ENABLED 设置并确保在Azure中配置了正确的身份验证。

  4. 二头肌展开错误

    • 使用以下工具检查棉绒错误 az bicep build --file main.bicep
    • 验证资源名称约定和唯一性
    • 确保使用正确的参数类型
    • 使用假设操作在部署前验证更改
    • 常见的二头肌错误包括:
      • 在不正确的位置使用函数(例如,utcNow()只能在参数默认值中使用)
      • 变量引用无效
      • 缺少参数或表达式
  5. 功能关键问题

    如果在测试部署的功能时收到401未经授权的错误,请确保在请求中包含功能键,无论是作为 x-functions-key 标题或作为 ?code= 查询参数。

贡献

  1. 分叉存储库
  2. 创建要素分支
  3. 进行更改
  4. 运行测试
  5. 提交拉取请求

许可证

[指定发布此项目的许可证]