一个全面的 Microsoft SQL Server 客户端,实现了模型上下文协议(MCP)。此服务器通过简单的 MCP 接口提供了广泛的 SQL Server 功能,包括查询执行、模式发现和存储过程管理。
SQL Server MCP 客户端使用 .NET Core 构建,并使用了 Model Context Protocol 的 C# SDK(github.com/modelcontextprotocol/csharp-sdk)。它提供了执行 SQL 查询、管理存储过程、列出表以及从 SQL Server 数据库中检索详细模式信息的工具。该服务器设计为轻量级且功能强大,展示了如何创建具有实用数据库功能的强大 MCP 服务器。它可以部署在机器上或作为 Docker 容器运行。
MCP 客户端可以在两种模式之一下运行:
如果你想从源代码构建项目:
克隆这个仓库:
git clone https://github.com/aadversteeg/mssqlclient-mcp-server.git
导航到源目录:
cd mssqlclient-mcp-server/src
构建项目:
dotnet build
运行测试:
dotnet test
SQL Server MCP 客户端在 Docker Hub 上可用。
# 拉取最新版本
docker pull aadversteeg/mssqlclient-mcp-server:latest
如果你需要自己构建 Docker 镜像:
# 导航到仓库根目录
cd mssqlclient-mcp-server
# 构建 Docker 镜像
docker build -f src/Core.Infrastructure.McpServer/Dockerfile -t mssqlclient-mcp-server:latest src/
# 运行本地构建的镜像
docker run -d --name mssql-mcp -e "MSSQL_CONNECTIONSTRING=Server=your_server;Database=your_db;User Id=your_user;Password=your_password;TrustServerCertificate=True;" mssqlclient-mcp-server:latest
要推送到你的本地注册表:
# 构建 Docker 镜像
docker build -f src/Core.Infrastructure.McpServer/Dockerfile -t localhost:5000/mssqlclient-mcp-server:latest src/
# 推送到本地注册表
docker push localhost:5000/mssqlclient-mcp-server:latest
如果你已将镜像推送到运行在 5000 端口上的本地注册表,可以从其中拉取:
# 从本地注册表拉取
docker pull localhost:5000/mssqlclient-mcp-server:latest
要从应用程序连接到 SQL Server MCP 客户端:
可用工具取决于服务器的操作模式,有些工具在两种模式下都可用:
返回有关连接的 SQL Server 实例的功能和特性的详细信息。
示例请求:
{
"name": "server_capabilities",
"parameters": {}
}
示例响应(服务器模式):
{
"version": "Microsoft SQL Server 2019",
"majorVersion": 15,
"minorVersion": 0,
"buildNumber": 4123,
"edition": "Enterprise Edition",
"isAzureSqlDatabase": false,
"isAzureVmSqlServer": false,
"isOnPremisesSqlServer": true,
"toolMode": "server",
"features": {
"supportsPartitioning": true,
"supportsColumnstoreIndex": true,
"supportsJson": true,
"supportsInMemoryOLTP": true,
"supportsRowLevelSecurity": true,
"supportsDynamicDataMasking": true,
"supportsDataCompression": true,
"supportsDatabaseSnapshots": true,
"supportsQueryStore": true,
"supportsResumableIndexOperations": true,
"supportsGraphDatabase": true,
"supportsAlwaysEncrypted": true,
"supportsExactRowCount": true,
"supportsDetailedIndexMetadata": true,
"supportsTemporalTables": true
}
}
此工具可用于:
返回当前超时配置设置。
示例请求:
{
"name": "get_command_timeout",
"parameters": {}
}
示例响应:
{
"defaultCommandTimeoutSeconds": 30,
"connectionTimeoutSeconds": 15,
"maxConcurrentSessions": 10,
"sessionCleanupIntervalMinutes": 60,
"totalToolCallTimeoutSeconds": 120,
"timestamp": "2024-12-19 10:30:45 UTC"
}
更新所有新操作的默认命令超时。
注意:当配置了 TotalToolCallTimeoutSeconds 时,有效超时将是该值和剩余总超时时间中的最小值。这确保操作在总工具调用超时限制内完成。
参数:
timeoutSeconds(必需):新的超时秒数(1-3600)示例请求:
{
"name": "set_command_timeout",
"parameters": {
"timeoutSeconds": 120
}
}
示例响应:
{
"message": "默认命令超时更新成功",
"oldTimeoutSeconds": 30,
"newTimeoutSeconds": 120,
"note": "此更改仅影响新操作。现有会话将继续使用其原始超时设置。",
"timestamp": "2024-12-19 10:31:00 UTC"
}
这些工具允许通过后台会话管理长时间运行的查询和存储过程。它们特别适用于操作会超过 TotalToolCallTimeoutSeconds 限制的情况,或者你需要同时运行多个操作。
检查正在运行的查询或存储过程会话的状态。
参数:
sessionId(必需):要检查的会话 ID示例请求:
{
"name": "get_session_status",
"parameters": {
"sessionId": 12345
}
}
示例响应:
{
"sessionId": 12345,
"type": "query",
"query": "SELECT * FROM LargeTable",
"databaseName": "Northwind",
"startTime": "2024-12-19 10:30:00 UTC",
"endTime": "2024-12-19 10:35:23 UTC",
"duration": "323.5 秒",
"status": "已完成",
"isRunning": false,
"rowCount": 1500000,
"error": null,
"timeoutSeconds": 600
}
从已完成或正在运行的查询/存储过程会话中获取结果。
参数:
sessionId(必需):要获取结果的会话 IDmaxRows(可选):要返回的最大行数示例请求:
{
"name": "get_session_results",
"parameters": {
"sessionId": 12345,
"maxRows": 100
}
}
示例响应:
{
"sessionId": 12345,
"type": "query",
"status": "已完成",
"rowCount": 1500000,
"results": "| CustomerID | CompanyName | ContactName |\n| ---------- | ----------- | ----------- |\n| ALFKI | Alfreds Futterkiste | Maria Anders |\n...\n... (显示 1500000 总行中的前 100 行)",
"maxRowsApplied": 100
}
停止正在运行的查询或存储过程会话。
参数:
sessionId(必需):要停止的会话 ID示例请求:
{
"name": "stop_session",
"parameters": {
"sessionId": 12345
}
}
示例响应:
{
"sessionId": 12345,
"status": "已取消",
"message": "会话取消成功",
"timestamp": "2024-12-19 10:32:15 UTC"
}
列出所有查询和存储过程会话。
参数:
status(可选):按状态过滤 - "all"(默认)、"running" 或 "completed"示例请求:
{
"name": "list_sessions",
"parameters": {
"status": "running"
}
}
示例响应:
{
"filter": "running",
"totalSessions": 2,
"sessions": [
{
"sessionId": 12345,
"type": "query",
"query": "SELECT * FROM LargeTable...",
"databaseName": "Northwind",
"startTime": "2024-12-19 10:30:00 UTC",
"duration": "45.2 秒",
"status": "running",
"isRunning": true,
"rowCount": 0,
"hasError": false
},
{
"sessionId": 12346,
"type": "storedprocedure",
"query": "GenerateMonthlyReport",
"databaseName": "Sales",
"startTime": "2024-12-19 10:25:00 UTC",
"duration": "320.1 秒",
"status": "running",
"isRunning": true,
"rowCount": 0,
"hasError": false
}
],
"timestamp": "2024-12-19 10:30:45 UTC"
}
当连接字符串中指定了特定数据库时,以下工具可用:
在连接的 SQL Server 数据库上执行 SQL 查询。
参数:
query(必需):要执行的 SQL 查询。timeoutSeconds(可选):命令超时秒数。覆盖默认超时。示例请求:
{
"name": "execute_query",
"parameters": {
"query": "SELECT TOP 5 * FROM Customers"
}
}
示例响应:
| CustomerID | CompanyName | ContactName |
| ---------- | -------------------------------- | ------------------ |
| ALFKI | Alfreds Futterkiste | Maria Anders |
| ANATR | Ana Trujillo Emparedados y h... | Ana Trujillo |
| ANTON | Antonio Moreno Taquería | Antonio Moreno |
| AROUT | Around the Horn | Thomas Hardy |
| BERGS | Berglunds snabbköp | Christina Berglund |
总行数:5
列出连接的 SQL Server 数据库中的所有表及其模式和行数信息。
示例请求:
{
"name": "list_tables",
"parameters": {}
}
示例响应:
可用表:
模式 | 表名 | 行数
---- | ---- | ----
dbo | Customers | 91
dbo | Products | 77
dbo | Orders | 830
dbo | Employees | 9
获取连接的 SQL Server 数据库中表的模式。
参数:
tableName(必需):要获取模式信息的表名。示例请求:
{
"name": "get_table_schema",
"parameters": {
"tableName": "Customers"
}
}
示例响应:
表 Customers 的模式
列名 | 数据类型 | 最大长度 | 是否可为空
----- | ------- | -------- | --------
CustomerID | nchar | 5 | NO
CompanyName | nvarchar | 40 | NO
ContactName | nvarchar | 30 | YES
ContactTitle| nvarchar | 30 | YES
Address | nvarchar | 60 | YES
City | nvarchar | 15 | YES
Region | nvarchar | 15 | YES
PostalCode | nvarchar | 10 | YES
Country | nvarchar | 15 | YES
Phone | nvarchar | 24 | YES
Fax | nvarchar | 24 | YES
列出当前数据库中的所有存储过程及其详细信息。
示例请求:
{
"name": "list_stored_procedures",
"parameters": {}
}
示例响应:
Northwind 数据库中的可用存储过程:
模式 | 存储过程名称 | 参数 | 最后执行时间 | 执行次数 | 创建日期
---- | ------------ | ---- | ------------ | -------- | --------
dbo | GetCustomerOrders | 2 | 2024-01-15 10:30:00 | 145 | 2023-12-01 09:00:00
dbo | UpdateProductPrice | 3 | 2024-01-14 16:45:00 | 89 | 2023-11-15 14:30:00
dbo | CreateNewCustomer | 5 | N/A | N/A | 2024-01-10 11:20:00
获取存储过程的 SQL 定义。
参数:
procedureName(必需):存储过程的名称。示例请求:
{
"name": "get_stored_procedure_definition",
"parameters": {
"procedureName": "GetCustomerOrders"
}
}
以表格或 JSON Schema 格式获取存储过程的参数信息。
参数:
procedureName(必需):存储过程的名称。format(可选):输出格式 - "table"(默认)或 "json"。示例请求(表格格式):
{
"name": "get_stored_procedure_parameters",
"parameters": {
"procedureName": "CreateNewCustomer",
"format": "table"
}
}
示例响应(表格格式):
存储过程 CreateNewCustomer 的参数
| 参数 | 类型 | 是否必需 | 方向 | 默认值 |
| ----- | ---- | -------- | ---- | ------ |
| CompanyName | nvarchar(40) | 是 | 输入 | - |
| ContactName | nvarchar(30) | 否 | 输入 | NULL |
| City | nvarchar(15) | 否 | 输入 | NULL |
| Country | nvarchar(15) | 否 | 输入 | USA |
示例用法:
```json
{
"CompanyName": "Acme Corp",
"ContactName": "John Doe",
"City": "Seattle",
"Country": "USA"
}
示例请求(JSON Schema 格式):
```json
{
"name": "get_stored_procedure_parameters",
"parameters": {
"procedureName": "CreateNewCustomer",
"format": "json"
}
}
示例响应(JSON Schema 格式):
{
"procedureName": "CreateNewCustomer",
"description": "存储过程 CreateNewCustomer 的参数模式",
"parameters": {
"type": "object",
"properties