一个功能强大的数据库操作 MCP 服务器,聚焦 19 种常用数据库(MySQL/PG/SQLServer/Oracle/MongoDB、SQLite/ClickHouse/TiDB/OceanBase/DB2/HANA、达梦/人大金仓/华为 GaussDB/PolarDB/Vastbase/瀚高/神通/GoldenDB)。
$ dotnet add package DatabaseMcpServer一个功能强大的数据库操作 MCP (Model Context Protocol) 服务器,支持多种主流数据库。通过环境变量配置连接信息,让 AI 助手能够安全、便捷地执行数据库操作。
git clone https://github.com/ttcc666/DatabaseMcpServer.git
cd DatabaseMcpServer复制 mcp.json.example 到你的 IDE 配置目录并修改连接信息:
VS Code: 复制到 <WORKSPACE>/.vscode/mcp.json
Visual Studio: 复制到 <SOLUTION>/.mcp.json
详细配置说明请参考 配置指南
在 Copilot Chat 中尝试以下命令(无需提供连接信息):
| 变量名 | 说明 | 必需 | 默认值 | 示例 |
|---|---|---|---|---|
DB_CONNECTION_STRING | 数据库连接字符串 | ✅ 是 | 无 | Server=localhost;Database=mydb;User=root;Password=123456; |
DB_TYPE | 数据库类型 | ❌ 否 | MySql | MySql, SqlServer, Sqlite, PostgreSQL, Oracle |
SEQ_SERVER_URL | Seq 日志服务器地址 | ❌ 否 | 无 | http://localhost:5341 |
SEQ_API_KEY | Seq API 密钥 | ❌ 否 | 无 | your-seq-api-key |
Server=localhost;Port=3306;Database=mydb;User=root;Password=123456;
Server=localhost;Database=mydb;User Id=sa;Password=123456;
Data Source=mydb.db;
Host=localhost;Port=5432;Database=mydb;Username=postgres;Password=123456;
Data Source=(DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(HOST=localhost)(PORT=1521))(CONNECT_DATA=(SERVICE_NAME=orcl)));User Id=system;Password=123456;
{
"mcpServers": {
"database": {
"command": "DatabaseMcpServer.exe",
"env": {
"DB_CONNECTION_STRING": "Server=localhost;Database=test;Uid=root;Pwd=password;",
"DB_TYPE": "MySql"
}
}
}
}{
"mcpServers": {
"database": {
"command": "DatabaseMcpServer.exe",
"env": {
"DB_CONNECTION_STRING": "Server=localhost;Database=test;Uid=root;Pwd=password;",
"DB_TYPE": "MySql",
"SEQ_SERVER_URL": "http://localhost:5341",
"SEQ_API_KEY": "your-seq-api-key"
}
}
}
}本地开发: 修改 mcp.json.example 中的连接信息后复制到对应位置
NuGet 包: 将 command 改为 "dnx" 并设置 args 为 ["DatabaseMcpServer", "--version", "1.0.3", "--yes"]
使用 NuGet 包时,只需修改配置文件中的 command 和 args 字段,环境变量配置保持不变。
测试数据库连接
测试数据库连接
返回:
{
"success": true,
"data": {
"connected": true,
"databaseType": "MySql",
"serverVersion": "8.0.35"
},
"message": "数据库连接成功"
}验证配置
验证当前数据库配置
返回:
{
"success": true,
"data": {
"configured": true,
"databaseType": "MySql",
"connectionString": "Server=localhost;Database=mydb;User=root;Password=****;",
"isValid": true
},
"message": "配置验证通过"
}获取所有表
列出当前数据库的所有表
获取表结构
获取 users 表的完整结构信息
返回:
{
"success": true,
"data": {
"tableName": "users",
"columns": [
{
"columnName": "id",
"dataType": "int",
"isNullable": false,
"isPrimaryKey": true,
"isIdentity": true
},
{
"columnName": "username",
"dataType": "varchar(50)",
"isNullable": false,
"isPrimaryKey": false,
"isIdentity": false
}
],
"indexes": ["PRIMARY", "idx_username"],
"primaryKeys": ["id"]
}
}基础查询
查询 users 表中年龄大于 25 岁的活跃用户
参数化查询
查询指定城市和年龄范围的用户:城市为"北京",年龄在 20-30 之间
聚合查询
统计每个部门的员工数量和平均薪资
IN 参数查询
查询用户ID在 [1, 5, 10, 15, 20] 中的用户详细信息
插入数据
向 products 表插入新商品:
{
"name": "MacBook Pro M3",
"price": 14999,
"category": "电脑",
"stock": 50,
"description": "Apple MacBook Pro 14英寸 M3芯片"
}
更新数据
将商品ID为5的库存更新为100,价格更新为8999
删除数据
删除状态为"已停用"且创建时间超过1年的用户记录
多结果集查询
同时获取用户统计信息和最近订单数据
AI 会执行:
-- 第一个结果集:用户统计
SELECT
COUNT(*) as total_users,
COUNT(CASE WHEN status = 'active' THEN 1 END) as active_users,
AVG(age) as avg_age
FROM users;
-- 第二个结果集:最近订单
SELECT
o.id, o.user_id, u.username, o.amount, o.created_at
FROM orders o
JOIN users u ON o.user_id = u.id
WHERE o.created_at >= DATE_SUB(NOW(), INTERVAL 7 DAY)
ORDER BY o.created_at DESC
LIMIT 10;复杂关联查询
查询最近30天内有订单的用户信息,包括订单总数和总金额
转账事务
执行转账操作:从账户A(ID:1001)转账500元到账户B(ID:1002)
AI 会执行事务:
BEGIN TRANSACTION;
UPDATE accounts SET balance = balance - 500 WHERE id = 1001 AND balance >= 500;
UPDATE accounts SET balance = balance + 500 WHERE id = 1002;
COMMIT;批量操作
批量更新以下用户的VIP状态:
- 用户ID 1,3,5,7,9 设置为VIP
- 用户ID 2,4,6,8,10 设置为普通用户
简单存储过程
调用存储过程 sp_monthly_report,传入参数:年份2024,月份11
带输出参数的存储过程
调用存储过程 sp_user_statistics,传入用户ID 1001,获取输出参数:total_orders, total_amount, last_order_date
返回:
{
"success": true,
"data": {
"inputParameters": {
"user_id": 1001
},
"outputParameters": {
"total_orders": 25,
"total_amount": 15680.50,
"last_order_date": "2024-11-05"
}
}
}表操作
创建用户日志表的备份表 user_logs_backup
索引管理
为 orders 表的 user_id 字段创建索引 idx_orders_user_id
列操作
为 users 表添加新列:phone varchar(20),允许为空,默认值为空字符串
销售报表
生成本月销售报表:按产品分类统计销量和销售额
用户行为分析
分析用户登录频率:统计每个用户最近30天的登录次数
库存预警
查询库存不足的商品(库存小于10件)
数据导出
导出所有活跃用户的基本信息到JSON格式
数据验证
检查 orders 表中是否存在无效的用户ID引用
性能分析
分析 users 表的索引使用情况和查询性能
服务器会自动检测并阻止以下危险操作:
DROP TABLE - 删除表DROP DATABASE - 删除数据库TRUNCATE TABLE - 截断表ALTER TABLE - 修改表结构CREATE TABLE - 创建表如需执行这些操作,请使用专门的架构操作工具(如 drop_table, truncate_table 等)。
所有查询和命令都支持参数化查询,示例:
查询年龄大于 18 且城市为北京的用户
AI 会自动生成参数化查询:
{
"sql": "SELECT * FROM users WHERE age > @age AND city = @city",
"parameters": "{\"age\":18,\"city\":\"Beijing\"}"
}Password=****# 恢复依赖
dotnet restore
# 构建项目
dotnet build
# 运行项目
dotnet run
# 打包发布
dotnet pack -c Release默认支持以下平台:
win-x64 - Windows 64位如需添加更多平台,请在 .csproj 文件中修改 <RuntimeIdentifiers> 元素。
Tools 目录下创建新的工具类[McpServerTool] 特性标记方法[Description] 特性添加中文描述DatabaseConfigService 获取数据库连接Program.cs 中注册工具:builder.Services
.AddMcpServer()
.WithStdioServerTransport()
.WithTools<ConnectionTools>()
.WithTools<SchemaTools>()
.WithTools<QueryTools>()
.WithTools<CommandTools>()
.WithTools<YourNewTools>(); // 添加你的新工具using System.ComponentModel;
using ModelContextProtocol.Server;
using DatabaseMcpServer.Services;
namespace DatabaseMcpServer.Tools;
internal class YourNewTools
{
[McpServerTool]
[Description("你的工具描述")]
public string YourMethod(
[Description("参数描述")] string parameter)
{
// 使用全局配置创建数据库客户端
using var db = DatabaseConfigService.CreateGlobalClient();
// 执行数据库操作
var result = db.Queryable<YourEntity>().ToList();
// 返回 JSON 结果
return DatabaseHelper.SerializeResult(new { success = true, data = result });
}
}.csproj 中的包元数据
<PackageId><PackageVersion><Description><Authors>.mcp/server.jsondotnet pack -c Releasedotnet nuget push bin/Release/*.nupkg --api-key <your-api-key> --source https://api.nuget.org/v3/index.json传统方式(每次都要传参):
查询 users 表,使用连接字符串:Server=localhost;Database=mydb;User=root;Password=123456;,数据库类型:MySql
现在的方式(无需传参):
查询 users 表
欢迎贡献代码、报告问题或提出新功能建议!
git checkout -b feature/AmazingFeature)git commit -m 'Add some AmazingFeature')git push origin feature/AmazingFeature)本项目采用 MIT 许可证 - 详见 LICENSE 文件。
如果你对这个项目有任何反馈,请参与 简短调查。
注意:
.gitignore 忽略包含敏感信息的配置文件