MCP MSSQL服务器
一种可重用的、生产就绪的MSSQL模型上下文协议(MCP)服务器实现,用于通过MCP标准公开只读数据库访问。
概述
此库提供了一个完整的MCP服务器实现,该实现:
- 通过以下方式公开数据库架构
schema.describe工具 - 通过以下方式列出可用工具
tools.list方法 - 通过执行只读SELECT查询
sql.execute_readonly工具 - 强制执行查询级安全性(拒绝DML/DDL语句)
- 跟踪性能指标和查询执行时间
- 支持ILogger的全面日志记录
- 遵循JSON-RPC 2.0协议标准
安装
添加到您的项目中:
dotnet add package MCP.MSSQL.Server或者通过NuGet包管理器:
Install-Package MCP.MSSQL.Server快速开始
1.在依赖注入中注册
using MCP.MSSQL.Server;
var builder = WebApplication.CreateBuilder(args);
// Register MCP Server
var connectionString = builder.Configuration.GetConnectionString("CrimeSolverReadOnly");
var queryTimeout = builder.Configuration.GetValue("MCP:QueryTimeoutSeconds", 30);
var maxRowLimit = builder.Configuration.GetValue("MCP:MaxRowLimit", 1000);
builder.Services.AddSingleton(sp =>
new MSSQLMCPServer(
connectionString,
queryTimeout,
maxRowLimit,
sp.GetRequiredService>()));
var app = builder.Build();2.配置应用程序设置
添加到 appsettings.json:
{
"ConnectionStrings": {
"CrimeSolverReadOnly": "Server=yourserver;Database=yourdb;User Id=readonly_user;Password=***;Encrypt=true;TrustServerCertificate=false;"
},
"MCP": {
"QueryTimeoutSeconds": 30,
"MaxRowLimit": 1000
}
}3.暴露MCP端点
// MCP Invoke Endpoint
app.MapPost("/mcp/invoke", async (MCPRequest request, MSSQLMCPServer server) =>
{
var response = await server.ProcessRequestAsync(request);
return Results.Json(response);
});
// Health check endpoint
app.MapGet("/health", () => Results.Ok(new { status = "healthy" }));
app.Run();使用示例
发现可用工具
curl -X POST https://localhost:5000/mcp/invoke \
-H "Content-Type: application/json" \
-d '{
"jsonrpc": "2.0",
"id": "1",
"method": "tools.list",
"params": {}
}'检索数据库架构
curl -X POST https://localhost:5000/mcp/invoke \
-H "Content-Type: application/json" \
-d '{
"jsonrpc": "2.0",
"id": "2",
"method": "schema.describe",
"params": {}
}'执行只读查询
curl -X POST https://localhost:5000/mcp/invoke \
-H "Content-Type: application/json" \
-d '{
"jsonrpc": "2.0",
"id": "3",
"method": "sql.execute_readonly",
"params": {
"query": "SELECT TOP 10 * FROM Cases WHERE CaseStatus = 'Active'"
}
}'API 参考
MCP方法
工具列表
宣传可用的数据库工具。
答复:
{
"tools": [
{
"name": "schema.describe",
"description": "Returns database schema information...",
"inputSchema": []
},
{
"name": "sql.execute_readonly",
"description": "Executes read-only SELECT queries...",
"inputSchema": [...]
}
]
}方案描述
检索完整的数据库架构,包括表、列和关系。
答复:
{
"databaseName": "YourDatabase",
"retrievedAt": "2024-01-01T12:00:00Z",
"tables": [
{
"tableName": "Cases",
"columns": [...],
"foreignKeys": [...],
"rowCount": 1000
}
],
"summary": "Retrieved schema for 10 tables..."
}sql.execute_readonly
执行只读SELECT查询。
参数:
query(string,必填):要执行的SELECT查询
答复:
{
"success": true,
"query": "SELECT * FROM Cases",
"rowCount": 100,
"maxRowLimit": 1000,
"isTruncated": false,
"rows": [...],
"columns": ["CaseID", "CaseName", ...],
"executionTimeMs": 45,
"summary": "Query returned 100 row(s)..."
}安全特性
- 只读强制:拒绝INSERT、UPDATE、DELETE、CREATE、DROP、ALTER、EXEC、GRANT、REVOKE
- 查询验证:在执行之前验证所有查询
- 连接级别安全:使用专用只读数据库用户
- 超时保护:可配置查询超时(默认值:30秒)
- 行限制:可配置的最大返回行数(默认值:1000)
- 全面日志记录:所有操作都记录了执行指标
配置选项
| 选项 | 默认值 | 描述 |
|---|---|---|
| ConnectionString | - | SQL Server连接字符串(必须使用只读用户) |
| QueryTimeout秒数 | 30 | 最大查询执行时间(秒) |
| MaxRowLimit | 1000 | 每次查询返回的最大行数 |
错误处理
服务器返回JSON-RPC 2.0错误响应:
{
"jsonrpc": "2.0",
"id": "1",
"error": {
"code": -32602,
"message": "Only SELECT queries are allowed. DML/DDL statements are not permitted."
}
}错误代码
-32601:未找到方法-32602:无效参数-32603:内部服务器错误
最佳实践
- 使用专用只读数据库用户:创建仅具有SELECT权限的SQL Server用户
- 启用加密:设置
Encrypt=true在连接字符串中 - 监控日志:启用
Debug日志记录MCP.MSSQL.Server命名空间 - 设置适当的超时:调整
QueryTimeoutSeconds基于您的查询模式 - 调整行限制:设置
MaxRowLimit基于客户端能力和网络条件
许可证
麻省理工学院
支持
有关问题、功能请求或贡献,请访问存储库。
