内容
# mssql-mcp-server
一款适用于 MS SQL Server 的只读 MCP(模型上下文协议)服务器。允许 AI 代理安全地查询您的数据库 — 无写入、无存储过程、无 shell 访问。
## 功能
- **只读** — 仅允许 `SELECT` 查询
- **两种模式** — stdio(本地)或 HTTP + JWT(远程)
- **无需第三方身份验证库** — JWT 通过 Node.js 内置 `crypto` 验证
- **查询安全** — 阻止危险关键词,需要 `TOP` 或 `WHERE`
## 向 AI 代理公开的工具
| 工具 | 描述 |
|---|---|
| `list_tables` | 列出数据库中的所有表 |
| `describe_table` | 显示表的列和类型 |
| `query` | 运行只读 SELECT 查询 |
## 安装
```bash
npm install
cp .env.example .env
# 填写您的数据库凭证和 API_KEY
```
## 使用
### Stdio 模式(本地代理)
```bash
node server.js
```
在 `claude_desktop_config.json` 中配置:
```json
{
"mcpServers": {
"mssql": {
"command": "node",
"args": ["/path/to/server.js"]
}
}
}
```
### HTTP 模式(远程代理)
```bash
node server.js --http
```
代理连接方式:
```http
POST http://your-server:3000/mcp
Authorization: Bearer <jwt-token>
```
## 测试
包含三个测试 JSON 文件。在运行之前,请编辑每个文件并将 `your-api-key` 替换为 `.env` 中的值。
**步骤 1 — 检查服务器启动并列出工具:**
```cmd
node server.js < test-list-tools.json
```
预期输出:包含 `query`、`list_tables`、`describe_table` 的 JSON。
**步骤 2 — 列出数据库中的表:**
```cmd
node server.js < test-list-tables.json
```
预期输出:表名称的 JSON 数组。
**步骤 3 — 运行查询:**
编辑 `test-query.json` 并将 `your_table` 替换为实际的表名,然后:
```cmd
node server.js < test-query.json
```
预期输出:行的 JSON 数组。
> **Windows 提示:** 如果在 cmd 中 `<` 重定向不起作用,请使用 PowerShell:
> ```powershell
> Get-Content test-query.json | node server.js
> ```
## 环境变量
| 变量 | 是否必需 | 描述 |
|---|---|---|
| `DB_SERVER` | 是 | MSSQL 主机名或 IP |
| `DB_PORT` | 否 | 默认:1433 |
| `DB_DATABASE` | 是 | 数据库名称 |
| `DB_USER` | 是 | 数据库用户名(使用只读账户) |
| `DB_PASSWORD` | 是 | 数据库密码 |
| `API_KEY` | 是 | 代理在工具调用中必须传递的密钥 |
| `HTTP_PORT` | 否 | HTTP 模式端口,默认:3000 |
| `JWT_SECRET` | 仅 HTTP | JWT 验证的密钥 |
## 创建只读数据库用户(MSSQL)
```sql
CREATE LOGIN mcp_agent WITH PASSWORD = 'strong-password';
CREATE USER mcp_agent FOR LOGIN mcp_agent;
EXEC sp_addrolemember 'db_datareader', 'mcp_agent';
```
## 生成 API_KEY
```bash
node -e "const c=require('crypto');console.log(c.randomBytes(32).toString('hex'))"
```