数据库智能查询服务

一个提供数据库访问能力并集成LangChain客户端进行智能查询处理的MCP服务器。

  • by jimmyshah83
  • Python
  • 本地部署
  • 2 星标
  • 更新于
在 GitHub 查看 jimmyshah83/remote-db-mcp-server

使用说明

远程DB MCP服务器

一种提供数据库访问功能的模型上下文协议(MCP)服务器,具有用于智能查询处理的LangChain客户端。

特性

  • MCP服务器:提供数据库工具和操作
  • 朗链客户端:使用Azure OpenAI和ReAct代理进行智能工具使用
  • 异步支持:完全支持async/await以获得更好的性能
  • 工具集成:MCP工具和LangChain代理之间的无缝集成

设置

1.安装依赖项

pip install -r requirements.txt

2.环境配置

复制 config.example 向 .env 并配置您的Azure OpenAI设置:

cp config.example .env

所需的环境变量:

  • AZURE_OPENAI_DEPLOYMENT_NAME:您的Azure OpenAI部署名称
  • AZURE_OPENAI_API_KEY:您的Azure OpenAI API密钥
  • AZURE_OPENAI_ENDPOINT:您的Azure OpenAI端点URL
  • AZURE_OPENAI_API_VERSION:API版本(默认:2024-02-15-preview)

3.使用方法

启动MCP服务器

python src/server.py

运行LangChain客户端

python src/client.py path/to/server.py

客户将:

  1. 连接到MCP服务器
  2. 发现可用工具
  3. 使用工具创建ReAct代理
  4. 启动交互式聊天循环

建筑

MCPTool类

  • 包装MCP工具以与LangChain配合使用
  • 处理异步工具执行
  • 提供正确的错误处理

MCP客户端类

  • 管理与MCP服务器的连接
  • 创建LangChain ReAct代理
  • 通过工具集成处理查询

依赖项

  • langchain-openai:Azure OpenAI集成
  • langgraph:重新代理实施
  • langchain-core:核心LangChain功能
  • mcp[cli]:模型上下文协议
  • python-dotenv:环境变量管理

示例用法

# The client automatically discovers tools from the MCP server
# and creates a ReAct agent that can use them intelligently

# Start the client
client = MCPClient()
await client.connect_to_server("path/to/server.py")

# Ask questions that will use the available tools
response = await client.process_query("Show me all products in the database")
print(response)

部署到Azure

您可以使用Azure容器应用程序(推荐)或Azure Developer CLI(azd)将MCP服务器部署到Azure。这两种方法都为您的应用程序提供了可扩展的托管托管。

选项1:使用Azure Developer CLI快速部署(推荐)

最快的部署方式是使用Azure Developer CLI,它自动处理基础设施的配置和部署。

先决条件

  1. 安装 Azure开发者命令行界面(azd)
  2. 安装 Azure命令行界面
  3. 拥有Azure订阅

部署步骤

  1. 初始化azd项目:

    azd init --template minimal
    
  2. 配置环境变量:

    复制您的 .env 将文件值保存到azd环境:

    azd env set AZURE_OPENAI_DEPLOYMENT_NAME "<your-deployment-name>"
    azd env set AZURE_OPENAI_ENDPOINT "<your-openai-endpoint>"
    azd env set COSMOS_DB_ENDPOINT "<your-cosmos-endpoint>"
    azd env set COSMOS_DB_DATABASE "<your-database-name>"
    azd env set COSMOS_DB_CONTAINER "<your-container-name>"
    
  3. 部署到Azure:

    azd up
    

    此命令将:

    • 提供Azure资源(容器应用程序、容器注册表等)
    • 构建并推送你的Docker镜像
    • 部署您的应用程序
    • 配置托管身份和RBAC权限

选项2:使用Azure容器应用程序手动部署

为了更好地控制部署过程,您可以使用Azure CLI手动部署。

设置先决条件

  1. 已安装并配置Azure CLI
  2. 本地安装Docker
  3. Azure容器注册表(ACR)或Docker Hub帐户

第一步:准备好你的环境

  1. 登录到Azure:

    az login
    az account set --subscription "<your-subscription-id>"
    
  2. 设置部署变量:

    RESOURCE_GROUP="rg-mcp-server"
    LOCATION="eastus"
    ACR_NAME="mcpserveracr$(date +%s)"
    CONTAINER_APP_ENV="mcp-server-env"
    CONTAINER_APP_NAME="mcp-server"
    IMAGE_NAME="remote-db-mcp-server"
    

步骤2:创建Azure资源

  1. 创建资源组:

    az group create --name $RESOURCE_GROUP --location $LOCATION
    
  2. 创建Azure容器注册表:

    az acr create \
      --resource-group $RESOURCE_GROUP \
      --name $ACR_NAME \
      --sku Basic \
      --admin-enabled true
    
  3. 创建容器应用程序环境:

    az containerapp env create \
      --name $CONTAINER_APP_ENV \
      --resource-group $RESOURCE_GROUP \
      --location $LOCATION
    

步骤3:构建并推送容器映像

  1. 登录到Azure容器注册表:

    az acr login --name $ACR_NAME
    
  2. 构建并推送Docker镜像:

    # Build the image
    docker build -t $ACR_NAME.azurecr.io/$IMAGE_NAME:latest .
    
    # Push to ACR
    docker push $ACR_NAME.azurecr.io/$IMAGE_NAME:latest
    

步骤4:部署容器应用程序

  1. 创建容器应用程序:

    az containerapp create \
      --name $CONTAINER_APP_NAME \
      --resource-group $RESOURCE_GROUP \
      --environment $CONTAINER_APP_ENV \
      --image $ACR_NAME.azurecr.io/$IMAGE_NAME:latest \
      --target-port 8000 \
      --ingress 'external' \
      --registry-server $ACR_NAME.azurecr.io \
      --min-replicas 1 \
      --max-replicas 3 \
      --cpu 0.25 \
      --memory 0.5Gi \
      --env-vars \
        AZURE_OPENAI_DEPLOYMENT_NAME="<your-deployment-name>" \
        AZURE_OPENAI_ENDPOINT="<your-openai-endpoint>" \
        AZURE_OPENAI_API_VERSION="2024-02-15-preview" \
        COSMOS_DB_ENDPOINT="<your-cosmos-endpoint>" \
        COSMOS_DB_DATABASE="<your-database-name>" \
        COSMOS_DB_CONTAINER="<your-container-name>"
    

步骤5:配置托管身份(推荐)

对于生产部署,请使用托管标识而不是API密钥:

  1. 启用系统分配的托管标识:

    az containerapp identity assign \
      --name $CONTAINER_APP_NAME \
      --resource-group $RESOURCE_GROUP \
      --system-assigned
    
  2. 授予Azure OpenAI权限:

    # Get the managed identity principal ID
    PRINCIPAL_ID=$(az containerapp identity show \
      --name $CONTAINER_APP_NAME \
      --resource-group $RESOURCE_GROUP \
      --query principalId \
      --output tsv)
    
    # Assign Cognitive Services OpenAI User role
    az role assignment create \
      --role "Cognitive Services OpenAI User" \
      --assignee $PRINCIPAL_ID \
      --scope "<your-openai-resource-id>"
    
  3. 授予Cosmos DB权限:

    # Assign Cosmos DB Built-in Data Contributor role
    az role assignment create \
      --role "Cosmos DB Built-in Data Contributor" \
      --assignee $PRINCIPAL_ID \
      --scope "<your-cosmos-db-resource-id>"
    
  4. 更新容器应用程序以删除API密钥:

    az containerapp update \
      --name $CONTAINER_APP_NAME \
      --resource-group $RESOURCE_GROUP \
      --remove-env-vars AZURE_OPENAI_API_KEY COSMOS_DB_KEY
    

步骤6:验证部署

  1. 获取应用程序URL:

    FQDN=$(az containerapp show \
      --name $CONTAINER_APP_NAME \
      --resource-group $RESOURCE_GROUP \
      --query properties.configuration.ingress.fqdn \
      --output tsv)
    
    echo "Application URL: https://$FQDN"
    
  2. 检查应用程序运行状况:

    curl -f https://$FQDN/health
    
  3. 查看应用程序日志:

    az containerapp logs show \
      --name $CONTAINER_APP_NAME \
      --resource-group $RESOURCE_GROUP \
      --follow
    

安全最佳实践

  • 使用托管身份:对于身份验证,始终首选托管身份而不是API密钥
  • 安全的秘密:将敏感配置存储在Azure密钥库中
  • 网络安全:考虑使用私有端点进行数据库连接
  • 资源隔离:部署到专用资源组以便于管理
  • 监控:启用Application Insights进行监控和诊断

故障排除

  • 容器应用程序未启动:使用检查日志 az containerapp logs show
  • 身份验证问题:验证托管身份权限和角色分配
  • 网络连接:确保防火墙规则允许容器应用程序访问资源
  • 资源限制:监控CPU和内存使用情况,必要时调整缩放参数

成本优化

  • 适当大小的资源:从最小的CPU/内存开始,并根据使用情况进行扩展
  • 自动缩放:根据预期负载配置适当的最小/最大副本
  • 资源清理:使用 az group delete 在不再需要时删除所有资源