使用说明
数据库MCP服务器
一个安全的只读模型上下文协议(MCP)服务器,使AI助手(Claude Code、Cursor等)能够安全地查询和探索SQL server和PostgreSQL数据库。
这是什么?
此MCP服务器充当AI助手和数据库之间的桥梁。它提供安全的只读访问,因此人工智能可以帮助您了解数据库模式、查询数据和发现关系,所有这些都没有数据修改的风险。
特性
- 按设计只读 --只允许SELECT查询,防止意外的数据更改
- 多数据库 --同时支持SQL Server和PostgreSQL
- 多个配置文件 --同时连接到多个数据库(本地、暂存、生产)
- 关系发现 --自动发现表之间的外键关系
- 安全功能 --自动行限制、查询验证、跨数据库阻塞
- PostgreSQL附加 --解释计划、物化视图、扩展、枚举类型
快速开始
先决条件
- Node.js 18+
- SQL Server和/或PostgreSQL数据库
- Claude代码或游标IDE
安装
cd sqlserver-mcp
npm install
npm run build
添加到您的项目
添加a .mcp.json 文件到您想要访问数据库的任何项目的根目录:
PostgreSQL:
{
"mcpServers": {
"database": {
"command": "node",
"args": ["/absolute/path/to/sqlserver-mcp/build/index.js"],
"env": {
"SQLSERVER_CONNECTIONS": "{\"mydb\":{\"databaseType\":\"postgresql\",\"connectionString\":\"postgresql://user:pass@localhost:5432/dbname\"}}"
}
}
}
}
SQL服务器:
{
"mcpServers": {
"database": {
"command": "node",
"args": ["/absolute/path/to/sqlserver-mcp/build/index.js"],
"env": {
"SQLSERVER_CONNECTIONS": "{\"mydb\":{\"server\":\"localhost\",\"database\":\"MyDB\",\"user\":\"sa\",\"password\":\"yourpassword\",\"options\":{\"encrypt\":false,\"trustServerCertificate\":true}}}"
}
}
}
}
多个数据库:
{
"mcpServers": {
"database": {
"command": "node",
"args": ["/absolute/path/to/sqlserver-mcp/build/index.js"],
"env": {
"SQLSERVER_CONNECTIONS": "{\"pg_local\":{\"databaseType\":\"postgresql\",\"connectionString\":\"postgresql://user:pass@localhost:5432/appdb\"},\"sql_prod\":{\"server\":\"prod.server.com\",\"database\":\"ProdDB\",\"user\":\"readonly\",\"password\":\"pass\",\"options\":{\"encrypt\":true}}}"
}
}
}
}
简档名称(例如。, mydb, pg_local)是什么被当作 profile 每个工具调用的参数。
替代方案:配置文件
您可以使用配置文件代替内联JSON:
{
"mcpServers": {
"database": {
"command": "node",
"args": ["/absolute/path/to/sqlserver-mcp/build/index.js"],
"env": {
"SQLSERVER_CONFIG_FILE": "/path/to/config.json"
}
}
}
}
哪里 config.json 包含:
{
"local_pg": {
"databaseType": "postgresql",
"connectionString": "postgresql://user:pass@localhost:5432/mydb"
},
"local_sql": {
"server": "localhost",
"database": "MyDB",
"user": "sa",
"password": "yourpassword",
"options": {
"encrypt": false,
"trustServerCertificate": true
}
}
}
添加或更改后重新启动IDE .mcp.json.
可用工具
| 工具 | 数据库 | 描述 |
|---|---|---|
list-schemas |
都 | 列出具有所有者信息和表计数的架构 |
list-tables |
两个 | 列出具有行数和类型信息的表 |
describe-table |
Both | 列详细信息:类型、可空性、PKs、默认值、标识 |
get-relationships |
两者 | 外键关系(传出和传入) |
get-indexes |
两者 | 索引详细信息:类型、列、唯一性、筛选器 |
run-select-query |
两者都 | 执行带参数的只读SELECT查询 |
explain-query |
两者都 | 获取查询的估计执行计划 |
estimate-cost |
估算查询成本和行数 | |
list-materialized-views |
PostgreSQL | 列出具有大小和状态的物化视图 |
list-extensions |
PostgreSQL | 列出已安装和可用的扩展 |
list-enums |
PostgreSQL | 列出带有值的用户定义枚举类型 |
使用示例
问你的AI助手:
- “列出mydb数据库中的所有表”
- “描述mydb中的Users表”
- “显示Orders表的关系”
- “在mydb:SELECT*FROM用户WHERE active=true上运行此查询”
- “解释这个查询:选择u。,o.total FROM用户u JOIN订单o ON u.id=o.user_id“*
- “mydb上安装了哪些扩展?”
连接配置文件选项
SQL Server
{
"server": "hostname",
"database": "database_name",
"user": "username",
"password": "password",
"port": 1433,
"options": {
"encrypt": true,
"trustServerCertificate": false,
"applicationIntent": "ReadOnly",
"requestTimeout": 30000,
"connectionTimeout": 15000
}
}
PostgreSQL(结构化)
{
"databaseType": "postgresql",
"server": "hostname",
"database": "database_name",
"user": "username",
"password": "password",
"port": 5432,
"pgOptions": {
"ssl": true,
"statement_timeout": 30000,
"application_name": "mcp-server"
}
}
PostgreSQL(连接字符串)
{
"databaseType": "postgresql",
"connectionString": "postgresql://user:pass@host:5432/dbname?sslmode=require"
}
使用时 connectionString,the server, database, user,以及 password 字段仍然是必需的,但可以设置为占位符值——连接字符串优先。
安全
安全是分层的,各层有不同的工作。
边界是数据库。 到目前为止,最强大的控制是使用权限最小的只读数据库登录进行连接(见下文)——写入操作会被数据库引擎本身拒绝,而不是被字符串检查拒绝。此外,PostgreSQL用户查询在 SET TRANSACTION READ ONLY 事务,因此服务器拒绝任何写入或DDL,无论查询是如何写入的。
飞行前登机口(纵深防御)。 在查询到达数据库之前,验证器会失败,并显示一条友好的消息:
- 只读检查 --仅限单一声明;必须以SELECT/with开头;插入、更新、删除、删除、创建、更改、执行、合并、授予、撤销,
SELECT ... INTO,并且已知的副作用功能被阻断 - 自动行限制 --默认情况下限制为1000行(最大10000行),无论查询形状如何,都对返回的行强制执行
- 跨数据库阻塞 --拒绝多部分名称(database.schema.table和链接服务器名称)
- 参数验证 --只允许使用字母数字参数名称
- 错误清理 --凭据(包括连接字符串和URL表单)、IPv4/IPv6地址和文件路径在错误输出中被屏蔽
验证器是一种快速的飞行前验证,而不是保证。基于字符串的检查永远不会完成(副作用函数、特定于引擎的语法)。 总是 将服务器指向只读登录:
-- PostgreSQL
CREATE USER mcp_readonly WITH PASSWORD 'secure_password';
GRANT CONNECT ON DATABASE mydb TO mcp_readonly;
GRANT USAGE ON SCHEMA public TO mcp_readonly;
GRANT SELECT ON ALL TABLES IN SCHEMA public TO mcp_readonly;
-- SQL Server
CREATE LOGIN mcp_readonly WITH PASSWORD = 'secure_password';
CREATE USER mcp_readonly FOR LOGIN mcp_readonly;
EXEC sp_addrolemember 'db_datareader', 'mcp_readonly';
发展
npm run build # Compile TypeScript
npm run dev # Watch mode
npm test # Run all tests
npm run test:coverage # Coverage report
故障排除
“未知连接配置文件” --工具调用中的配置文件名称与配置中的名称不匹配。检查拼写。
“连接ECONNREFUSED” --数据库未运行或主机/端口错误。验证数据库是否可访问。
“找不到模块” --快跑 npm run build 第一。检查路径 .mcp.json 是绝对和正确的。
许可证
麻省理工学院