数据库查询服务器

一个安全的只读模型上下文协议(MCP)服务器,为AI助手提供SQL Server和PostgreSQL数据库的安全查询和探索功能。

  • by hadi21k
  • TypeScript
  • 本地部署
  • 3 星标
  • 更新于
在 GitHub 查看 hadi21k/sqlserver-mcp

使用说明

数据库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 是绝对和正确的。

许可证

麻省理工学院