MSSQL只读数据库访问服务

一个可重用、生产就绪的MSSQL模型上下文协议(MCP)服务器实现,通过MCP标准提供只读数据库访问。

  • by coburk
  • C#
  • 本地部署
  • 更新于
在 GitHub 查看 coburk/crime-solver-ai

使用说明

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<ILogger<MSSQLMCPServer>>()));

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:内部服务器错误

最佳实践

  1. 使用专用只读数据库用户:创建仅具有SELECT权限的SQL Server用户
  2. 启用加密:设置 Encrypt=true 在连接字符串中
  3. 监控日志:启用 Debug 日志记录 MCP.MSSQL.Server 命名空间
  4. 设置适当的超时:调整 QueryTimeoutSeconds 基于您的查询模式
  5. 调整行限制:设置 MaxRowLimit 基于客户端能力和网络条件

许可证

麻省理工学院

支持

有关问题、功能请求或贡献,请访问存储库。