SQL Server MCP服务器
一个模型上下文协议(MCP)服务器,提供与Microsoft SQL server数据库交互的工具,使用官方C#SDK构建。
特性
- 🔒 只读安全:强制执行仅限SELECT的操作,以防止意外修改数据
- 动态数据库切换:在同一服务器上的数据库之间切换,而无需重新启动
- 数据库列表:查看所有可用数据库,突出显示当前数据库
- 执行SQL查询:对当前数据库运行只读SQL查询
- 列表表格:获取当前数据库中所有具有行数的表
- 获取表架构:检索特定表的列信息
- 连接信息:显示当前数据库连接状态
- 存储过程:列出具有模式和日期的存储过程,获取包括参数、定义和依赖关系在内的详细信息
- 对象定义:统一端点,用于获取任何数据库对象(过程、函数、视图)的详细信息,包括定义、参数/列和依赖关系
- 批处理对象定义:在一次调用中请求多个具有限制和每个对象状态的对象定义
- 健康检查:验证连接并查看服务器属性
- 结构化日志记录:JSON日志记录到stderr,其中包含相关ID和时间
- Serilog集成:通过JSON格式的Serilog进行结构化日志记录
- 行限制执行:每次查询最多返回100行
🔒 安全特性
此MCP服务器设计为 只读安全 为防止意外修改数据:
受阻操作:
- ❌ INSERT、UPDATE、DELETE语句
- ❌ DROP、CREATE、ALTER语句
- ❌ TRUNCATE、MERGE运营
- ❌ EXEC/EXEXETE存储过程
- ❌ 授予、撤销、拒绝权限
- ❌ 批量操作
- ❌ 选择INTO(对象创建)
- ❌ 单个请求中有多个语句
- ❌ 任何非SELECT语句
- ❌ 使用、设置、DBCC、备份、恢复、重新配置、sp_configure
允许的操作:
- ✅ SELECT查询用于数据检索
- ✅ 数据库列表和切换
- ✅ 表架构检查
- ✅ 连接状态查询
错误消息:
当尝试阻止操作时,服务器会提供明确、特定的错误消息:
❌ UPDATE operations are not allowed. This MCP server is READ-ONLY and only supports SELECT queries for data viewing.附加安全功能:
- 查询超时保护(可配置,默认30秒)
- 输入验证和净化
- 详细的错误报告和有用的指导
- 所有响应中的安全模式指示灯
动态数据库管理
MCP服务器现在支持动态数据库切换,允许您:
- 列出所有数据库 -查看SQL Server实例上的每个数据库
- 切换数据库 -在不重新启动服务器的情况下更改活动数据库
- 跟踪当前上下文 -所有操作(查询、表列表)都在当前数据库上进行
- 连接验证 -服务器在切换之前验证数据库连接
工作流程示例:
User: List all databases
Server: [Shows all databases with current one highlighted]
User: Switch to Northwind database
Server: [Successfully switches and confirms]
User: Show me all tables
Server: [Shows tables from Northwind database]当在同一服务器上处理多个数据库时,此功能特别有用,例如开发、暂存和生产环境。
设置
先决条件
- .NET 10.0 SDK
- SQL Server(本地或远程)
- 访问目标数据库
安装
- 克隆或下载此项目
- 导航到项目目录
- 还原NuGet包:
dotnet restore- 构建项目:
dotnet build配置
配置值可以通过环境变量或 appsettings.json。环境变量优先。
使用环境变量设置连接字符串:
# Windows
set SQLSERVER_CONNECTION_STRING="Server=your_server;Database=your_database;User Id=your_username;Password=your_password;TrustServerCertificate=true;"
# PowerShell
$env:SQLSERVER_CONNECTION_STRING="Server=your_server;Database=your_database;User Id=your_username;Password=your_password;TrustServerCertificate=true;"
# Linux/macOS
export SQLSERVER_CONNECTION_STRING="Server=your_server;Database=your_database;User Id=your_username;Password=your_password;TrustServerCertificate=true;"默认连接字符串:如果没有设置环境变量,则默认为:
Server=localhost;Database=master;Trusted_Connection=true;TrustServerCertificate=true;您还可以配置SQL命令超时(秒):
# Windows
set SQLSERVER_COMMAND_TIMEOUT=60
# PowerShell
$env:SQLSERVER_COMMAND_TIMEOUT=60
# Linux/macOS
export SQLSERVER_COMMAND_TIMEOUT=60如果未设置,则超时默认为 30 秒。
或者,您可以通过配置 appsettings.json 放在可执行文件旁边或项目目录下:
{
"SqlServer": {
"ConnectionString": "Server=localhost;Database=master;Trusted_Connection=true;TrustServerCertificate=true;",
"CommandTimeout": 30
}
}优先: Environment variables → appsettings.json → 内置默认值。
运行服务器
dotnet run服务器将启动并通过stdio监听MCP协议消息。
与Claude Desktop集成
- 复制
claude_desktop_config.json文件到您的Claude Desktop配置目录 - 更新配置文件中的连接字符串以匹配您的数据库
- 重新启动克劳德桌面
配置文件应放置在:
- 视窗:
%APPDATA%\Claude\claude_desktop_config.json - macOS:
~/Library/Application Support/Claude/claude_desktop_config.json - Linux:
~/.config/claude/claude_desktop_config.json
可用工具
1.货币数据库
通过结构化请求日志记录获取当前数据库连接信息。
参数: 无
行为:
- 发出带有关联ID和经过时间的Serilog开始/结束事件
- 在有效载荷中包括只读安全指示器
示例用法:
Show me the current database connection info2.切换数据库
切换到同一服务器上具有详细审核日志记录的其他数据库。
参数:
databaseName(string):要切换到的数据库的名称
行为:
- 在切换之前验证连接,并记录成功/失败的详细信息
- 当交换机发生故障时,捕获相关ID、经过的时间和错误信息
示例用法:
Switch to the Northwind database3.获取数据库
获取SQL Server实例上所有数据库的列表,并突出显示当前数据库。
参数: 无
示例用法:
List all databases on this SQL Server instance4.执行查询
对当前数据库执行SQL查询。
参数:
query(string):要执行的SQL查询maxRows(int,可选):请求的行(默认为100;夹紧为100)
示例用法:
Please execute "SELECT TOP 10 * FROM Users ORDER BY CreatedDate DESC" and show me the results笔记:
- 服务器强制每个查询100行的硬上限。任何更高的请求都被限制在100。
- 服务器安全注入
TOP在第一次之后SELECT当不存在时,为现有的设置上限TOP如果它超过100。
5.重新查询(SRS)
执行具有结果格式、每次调用超时和参数绑定的只读T-SQL查询。匹配SRS read_query 规范。
参数:
query(字符串,必填):T-SQLSELECT声明timeout(int,可选):每次调用超时时间(秒);默认值为30;夹紧1–300max_rows(int,可选):请求的最大行数;默认值为1000;夹紧1–10000format(字符串,可选):json|csv|table(HTML);默认jsonparameters(object,可选):要绑定的命名参数(例如。,{ id: 42 });按键可以包含或省略@delimiter(字符串,可选):CSV分隔符;默认,;使用tab或\t对于选项卡
行为:
- 强制只读验证(仅限SELECT,阻止DDL/DML/EXEC和多个语句)
- 如果提供,则应用每次呼叫超时;否则使用服务器默认值
- 注射器或盖子
TOP尊重max_rows - 退货:
- json:显式对象数组 null 价值观 - csv:带标题行和正确引号的CSV字符串 - table:带标题的转义HTML表
- 包含
elapsed_ms,row_count,以及columns元数据(name,data_type,allow_null,size)
示例用法:
ReadQuery query="SELECT * FROM Orders WHERE CustomerID = @id ORDER BY CreatedAt DESC" parameters={"id": 123} max_rows=500 format=csv delimiter="," timeout=605.GetTables
获取当前数据库中所有具有行数的表的列表。
参数: 无
示例用法:
Show me all tables in the current database6.GetTableSchema
获取特定表的架构信息。
参数:
tableName(string):表的名称schemaName(字符串,可选):架构名称(默认为“dbo”)
示例用法:
Get the schema for the Users table7. GetStored程序
获取当前数据库中的存储过程列表。
参数: 无
示例用法:
List all stored procedures8.获取存储的程序详细信息
获取特定存储过程的详细信息,包括参数、定义和依赖关系。
参数:
procedureName(string):存储过程的名称schemaName(字符串,可选):架构名称(默认为“dbo”)
退货:
- 程序元数据(名称、模式、创建/修改日期)
- 包含数据类型、方向(输入/输出)和默认值的完整参数列表
- 过程的完整T-SQL定义
- 依赖关系(过程引用的表、视图和其他对象)
示例用法:
Get details for the stored procedure sp_GetUserOrdersShow me the parameters and definition of dbo.sp_CalculateRevenue答复包括:
procedure_info-名称、模式、日期、定义和元数据parameters-包含类型、精度、比例和输出标志的完整参数列表dependencies-过程引用的所有数据库对象
9.GetObject定义
获取统一端点中任何数据库对象(存储过程、函数或视图)的详细信息。
参数:
objectName(string):数据库对象的名称schemaName(字符串,可选):架构名称(默认为“dbo”)objectType(字符串,可选):对象类型-“PROCEDURE”、“FUNCTION”、“VIEW”或“AUTO”可自动检测(默认为“AUTO”)
退货:
- 对象元数据(名称、模式、类型、创建/修改日期、完整定义)
- 程序和功能:包含数据类型、方向和默认值的完整参数列表
- 查看视图:包含数据类型和属性的列信息
- 依赖关系(引用的所有数据库对象)
示例用法:
Get the definition of sp_GetCustomerOrdersShow me details for the view vw_SalesReportGet information about the function fn_CalculateDiscount in the sales schema主要特点:
- 自动检测:自动确定对象是过程、函数还是视图
- 统一接口:所有对象类型都使用单个工具,而不是单独的工具
- 全面的:返回特定于对象的信息(过程/函数的参数、视图的列)
- 完整源代码:包括完整的T-SQL定义(如果可用)
答复包括:
object_info-名称、模式、类型、日期和完整的T-SQL定义parameters-(用于程序/函数)参数详细信息,包括类型和方向columns-(对于视图)具有数据类型和属性的列架构dependencies-此对象引用的所有数据库对象
10.GetObject定义
在一次调用中获取多个数据库对象的定义,并具有内置限制和每个对象的状态。
参数:
objectNames(string):逗号或换行符分隔的对象名称列表;模式可以提供为schema.objectschemaName(字符串,可选):未提供时的默认架构名称(默认为“dbo”)objectType(字符串,可选):“PROCEDURE”、“FUNCTION”、“VIEW”或“AUTO”(默认)可自动检测每个对象maxObjects(int,可选):要处理的最大对象数(默认值为10,上限为25)
行为:
- 处理不同的对象名称,最多可达
maxObjects - 除非强制类型,否则使用自动检测
- 返回每个对象的状态(
OK或NOT_FOUND)因此,缺少的对象不会阻止批处理 - 包括每个对象的依赖关系、参数(过程/函数)和列(视图)详细信息
示例用法:
GetObjectDefinitions objectNames="dbo.Users, dbo.Orders, reporting.vw_Sales" maxObjects=511.GetServerHealth
检查连接并返回服务器属性。
参数: 无
示例用法:
Check server health and show properties退货:
server_name,product_version,product_level,edition,current_database,server_time- 状态和连接性指标
连接字符串示例
身份验证
Server=localhost;Database=YourDatabase;Trusted_Connection=true;TrustServerCertificate=true;使用用户名和密码
Server=localhost;Database=YourDatabase;User Id=your_username;Password=your_password;TrustServerCertificate=true;Azure SQL数据库
Server=your_server.database.windows.net;Database=YourDatabase;User Id=your_username@your_server;Password=your_password;Encrypt=true;TrustServerCertificate=false;安全注意事项
- 此服务器直接对您的数据库执行SQL查询
- 确保配置了正确的数据库权限
- 尽可能使用参数化查询来防止SQL注入
- 考虑将数据库用户的权限限制在必要的范围内
- 切勿在版本控制中暴露带有密码的连接字符串
错误处理
服务器返回以下描述性错误消息:
- 连接失败
- SQL语法无效
- 权限问题
- 找不到数据库
发展
要修改或扩展服务器,请执行以下操作:
- 向中添加新方法
SqlServerTools类 - 用
[McpServerTool]属性 - 添加
[Description]参数的属性 - 重建项目
新工具示例:
[McpServerTool, Description("Get all stored procedures in the database")]
public static async Task GetStoredProceduresAsync()
{
// Implementation here
}测试
要在本地测试服务器,请执行以下操作:
- 设置本地SQL Server实例
- 配置连接字符串
- 运行服务器:
dotnet run - 使用Claude Desktop或其他MCP兼容客户端进行测试
依赖项
ModelContextProtocol(1.2.0)-官方MCP C#SDKMicrosoft.Data.SqlClient(7.0.0)-SQL Server连接Microsoft.Extensions.Hosting(10.0.5)-主机基础结构
许可证
本项目按原样提供,用于教育和发展目的。
日志记录
此项目使用Serilog进行结构化日志记录。
- 默认接收器:写入JSON日志
stderr(不干扰MCP stdio) - 日志内容:开始/结束事件
correlation_id,operation,elapsed_ms,加上错误详细信息 - 配置:Serilog从以下位置读取设置
appsettings.json如存在
示例 appsettings.json Serilog块:
{
"Serilog": {
"MinimumLevel": {
"Default": "Information",
"Override": {
"Microsoft": "Warning",
"System": "Warning"
}
}
}
}日志可以直接从 stderr 或者根据主机环境的需要重定向。
