SQL MCP服务器-企业Azure解决方案
用于Azure SQL数据库的生产就绪模型上下文协议(MCP)服务器,与GitHub Enterprise CI/CD集成。
  ](https://github.com/features/actions)
概述
这是一个完整的企业级解决方案,用于部署提供对Azure SQL数据库只读访问的MCP服务器。它使GitHub Copilot、ChatGPT和Claude等AI助手能够使用自然语言查询构建和测试分析数据。
主要特点
✅ 生产就绪MCP服务器 (Node.js/TypeScript)
- 具有全面安全性的只读SQL访问
- 查询验证和清理
- 30秒超时保护
- 全面的审计日志记录
✅ 企业Azure基础架构 (二头肌)
- 用于无服务器托管的Azure容器应用程序
- 具有私有终结点的Azure SQL数据库
- 用于秘密管理的Azure密钥库
- 具有NSG保护的虚拟网络
- 用于集中监控的日志分析
✅ GitHub企业版CI/CD (OIDC)
- 自动化测试和剥皮
- 安全扫描(Snyk、Trivy)
- 集装箱形象建设与推广
- 使用二头肌进行基础设施部署
- 通过OIDC进行零秘密身份验证
✅ 地方发展支持
- Docker Compose用于本地SQL+MCP服务器
- VS代码开发容器
- 调试配置
- AI客户端的MCP配置示例
✅ 综合文档
- 架构图
- 安装指南
- 安全模型文档
- SQL查询示例
✅ 可选事件驱动摄入
- 用于自动数据摄取的Azure功能
- 用于CI/CD集成的HTTP端点
- 事务处理
快速开始
地方发展(5分钟)
# Clone repository
git clone https://github.com/your-org/MCP_SQL_DB.git
cd MCP_SQL_DB
# Start local environment
cd local-dev
docker-compose up -d
# MCP server is now running with sample data!Azure部署(15分钟)
# Login to Azure
az login
# Deploy infrastructure
cd iac
az deployment group create \
--resource-group rg-sqlmcp-dev \
--template-file main.bicep \
--parameters environment=dev \
sqlAdminLogin=sqladmin \
sqlAdminPassword='YourPassword123!' \
mcpUserPassword='McpUserPass456!'看 安装指南 详细说明。
建筑
┌─────────────────────────────────────────────────────────────────────┐
│ GitHub Enterprise │
│ (CI/CD with OIDC Auth) │
└────────────────────────────┬────────────────────────────────────────┘
│
▼
┌─────────────────────────────────────────────────────────────────────┐
│ Azure Cloud │
│ │
│ ┌──────────────────┐ ┌──────────────────┐ ┌──────────────┐ │
│ │ Container App │───▶│ SQL Database │◀───│ Key Vault │ │
│ │ (MCP Server) │ │ (Private EP) │ │ (Secrets) │ │
│ └──────────────────┘ └──────────────────┘ └──────────────┘ │
│ │
│ ┌──────────────────┐ ┌──────────────────┐ ┌──────────────┐ │
│ │ Container │ │ Virtual Network │ │ Log │ │
│ │ Registry (ACR) │ │ (10.0.0.0/16) │ │ Analytics │ │
│ └──────────────────┘ └──────────────────┘ └──────────────┘ │
└─────────────────────────────────────────────────────────────────────┘
│
▼
┌─────────────────┐
│ AI Clients │
│ • Copilot │
│ • ChatGPT │
│ • Claude │
└─────────────────┘看 架构概述 查看详细图表。
项目结构
MCP_SQL_DB/
├── src/ # MCP Server implementation
│ ├── src/
│ │ ├── index.ts # Main server logic
│ │ ├── config.ts # Configuration management
│ │ ├── security.ts # Query validation
│ │ └── logger.ts # Logging
│ ├── Dockerfile # Container image
│ └── package.json # Dependencies
│
├── sql/ # SQL scripts
│ ├── 01-security.sql # Read-only user setup
│ ├── 02-schema.sql # Database schema
│ ├── 03-seed-data.sql # Sample data
│ └── 04-views.sql # Analytics views
│
├── iac/ # Infrastructure as Code (Bicep)
│ ├── main.bicep # Main orchestration
│ └── modules/ # Modular templates
│ ├── sql.bicep
│ ├── aca.bicep
│ ├── keyvault.bicep
│ └── network.bicep
│
├── .github/workflows/ # CI/CD pipelines
│ ├── ci.yml # Build & test
│ └── cd.yml # Deploy to Azure
│
├── docs/ # Documentation
│ ├── 00-architecture.md
│ ├── 01-setup-guide.md
│ ├── 02-security-model.md
│ ├── 03-using-mcp.md
│ └── 04-sql-examples.md
│
├── local-dev/ # Local development
│ ├── docker-compose.yml
│ ├── .devcontainer/
│ ├── .vscode/
│ └── mcp-configs/
│
└── optional/ # Optional components
└── function-app/ # Event-driven ingestion数据库模式
表格
BuildRuns -CI/CD构建执行记录
- BuildRunId、分支、开始时间、结束时间、持续时间秒数、状态、已触发By
测试运行 -单个测试执行结果
- TestRunId、BuildRunId、TestName、TestSuite、状态、持续时间秒数、重试计数
测试失败 -详细的故障信息
- TestFailureId、TestRunId、失败原因、错误消息、堆栈跟踪、失败类别
分析视图
- vw_TestFlakines -识别不一致的测试
- vw_建筑统计日报 -每日构建指标
- vw_测试失败分析 -分类故障
- vw_建筑性能趋势 -绩效跟踪
- vw_最近构建摘要 -最近版本概述
使用AI客户端
GitHub Copilot
在中配置 ~/.config/github-copilot/mcp.json:
{
"mcpServers": {
"sql-analytics": {
"command": "node",
"args": ["/path/to/MCP_SQL_DB/src/dist/index.js"],
"env": {
"SQL_SERVER": "localhost",
"SQL_DATABASE": "sqlmcp_db",
"SQL_USER": "mcp_user",
"SQL_PASSWORD": "McpUser!Pass123"
}
}
}
}然后问Copilot:
- “显示最近失败的构建”
- “哪些测试是不稳定的?”
- “按分支划分的构建成功率是多少?”
查询示例
自然语言 → SQL查询 → 结果
“显示最后5个版本”
SELECT TOP 5 * FROM BuildRuns ORDER BY StartTime DESC“哪些测试最容易失败?”
SELECT * FROM vw_TestFlakiness ORDER BY FlakinessScore DESC安全
纵深防御
- 网络层:专用ExpressRoute、NSG、专用端点
- 同一层:管理身份、RBAC、OIDC
- 数据层:只读用户,TDE加密,TLS 1.2
- 应用层:查询验证、输入净化、超时保护
- 秘密管理:Azure密钥库,无硬编码凭据
只读执行
MCP服务器在以下位置强制执行只读访问 三级:
- 应用:执行前验证查询
- SQL用户:
mcp_user只有SELECT权限 - 数据库:明确否认所有破坏性操作
// Automatically blocked:
"DROP TABLE BuildRuns" // Contains DROP keyword
"UPDATE BuildRuns SET..." // Contains UPDATE keyword
"SELECT * FROM BuildRuns; DELETE..." // Multiple statements看 安全模型 了解详情。
带有GitHub OIDC的CI/CD
零秘密身份验证 使用OIDC连接到Azure:
- name: Azure Login
uses: azure/login@v2
with:
client-id: ${{ secrets.AZURE_CLIENT_ID }}
tenant-id: ${{ secrets.AZURE_TENANT_ID }}
subscription-id: ${{ secrets.AZURE_SUBSCRIPTION_ID }}益处:
- 没有长期有效的凭据
- 自动令牌旋转
- 与Azure AD建立联合信任
- 增强安全
成本估算
每月Azure成本 (开发):
| 资源 | SKU | 成本 |
|---|---|---|
| Azure SQL数据库 | GP无服务器1 vCore | 50-75美元 |
| 容器应用程序 | 消费 | 10-20美元 |
| 容器注册表 | 标准 | $5 |
| 密钥库 | 标准 | 0.10美元 |
| 日志分析 | 1GB/天 | 2-5美元 |
| 总计 | $67-105 |
自动暂停和基于消费的定价将成本降至最低。
发展
先决条件
- Node.js 20+
- Docker 桌面版
- Azure命令行界面
- VS代码(推荐)
本地设置
# Install dependencies
cd src
npm install
# Build TypeScript
npm run build
# Run tests
npm test
# Run linter
npm run lint
# Start local environment
cd ../local-dev
docker-compose up调试
使用VS Code启动配置:
- 调试MCP服务器:将调试器附加到TypeScript
- 运行测试:执行Jest并调试
- 连接到Docker:调试容器化应用程序
部署
手动部署
# Deploy infrastructure
az deployment group create \
--resource-group rg-sqlmcp-dev \
--template-file iac/main.bicep \
--parameters @iac/parameters.json
# Build and push image
az acr build \
--registry ${ACR_NAME} \
--image sql-mcp-server:latest \
--file src/Dockerfile src/自动部署(GitHub操作)
- 配置OIDC(参见 安装指南)
- 推到
main分支 - 自动工作流:
- 运行测试和安全扫描 - 构建容器映像 - 部署到Azure - 初始化数据库
监控
Azure监视器查询
容器应用程序日志:
ContainerAppConsoleLogs_CL
| where Log_s contains "Tool called"
| project TimeGenerated, Log_s
| order by TimeGenerated descSQL性能:
AzureDiagnostics
| where ResourceProvider == "MICROSOFT.SQL"
| where duration_s > 1000
| project TimeGenerated, query_s, duration_s故障排除
常见问题
MCP服务器无法连接到SQL
- 检查密钥库中的连接字符串
- 验证托管身份是否具有访问权限
- 检查SQL防火墙规则
查询被安全验证拒绝
- 只允许SELECT查询
- 删除INSERT/UPDATE/DELETE/DROP关键字
- 检查是否有多个语句(分号)
容器应用程序无法启动
- 检查日志:
az containerapp logs show ... - 验证ACR中是否存在映像
- 检查托管身份权限
贡献
欢迎投稿!拜托:
- 分叉存储库
- 创建要素分支
- 进行更改
- 添加测试
- 运行门楣:
npm run lint - 提交拉取请求
许可证
MIT许可证-请参阅 许可证 文件
支持
- 问题:
- 讨论:
- 文档: docs/
致谢
______________________________________________________________________
内置于❤️ 面向企业DevOps团队
