内容
# 气候 MSSQL MCP 服务器
一个使用Python和pymssql库的轻量级、可靠的Microsoft SQL Server模型上下文协议(MCP)服务器。
## 为什么选择这个MCP服务器?
本Python实现使用成熟的pymssql库,提供稳固的SQL Server连接。没有神秘的超时,没有复杂的配置——只有可用的数据库访问。
## 先决条件
- Python 3.10 或更高版本
- [uv](https://github.com/astral-sh/uv) (推荐)或pip
- 访问Microsoft SQL Server实例
- [Claude 代码](https://claude.com/claude-code) 或任何MCP兼容客户端
## 快速入门
### 1. 克隆或下载
```bash
git clone https://github.com/yourusername/climate_mssql_mcp.git
cd climate_mssql_mcp
```
### 2. 使服务器可执行
```bash
chmod +x server.py
```
就这样!服务器使用`uv`和内联依赖 - 不需要单独安装。
## Claude 代码配置
将以下内容添加到项目的 `.mcp.json` 文件中:
```json
{
"mcpServers": {
"MSSQL-MCP": {
"command": "/absolute/path/to/climate_mssql_mcp/server.py",
"env": {
"SERVER_NAME": "your-server.domain.com\\SQLEXPRESS",
"PORT": "1433",
"DATABASE_NAME": "YourDatabase",
"SQL_USERNAME": "your-username",
"SQL_PASSWORD": "your-password",
"READONLY": "false"
},
"type": "stdio"
}
}
}
```
### 配置选项
| 变量 | 是否必需 | 描述 | 示例 |
| --- | --- | --- | --- |
| `SERVER_NAME` | 是 | SQL Server主机名/IP,可选实例 | `server.local\SQLEXPRESS` 或 `192.168.1.100` |
| `PORT` | 否 | SQL Server端口(默认:1433) | `1433` |
| `DATABASE_NAME` | 是 | 要连接的数据库 | `MyDatabase` |
| `SQL_USERNAME` | 是 | SQL Server用户名 | `sa` |
| `SQL_PASSWORD` | 是 | SQL Server密码 | `MyP@ssw0rd` |
| `READONLY` | 否 | 设置为"true"以禁用写操作 | `false` |
**连接行为:**
- 连接超时:30秒(网络操作)
- 登录超时:15秒(身份验证)
- 连接在每次操作时打开,操作完成后立即关闭(无连接池)
### 连接字符串格式
对于命名实例(如SQLEXPRESS),在JSON中使用双反斜杠:
```json
"SERVER_NAME": "hostname\\SQLEXPRESS"
```
对于默认实例或IP地址:
```json
"SERVER_NAME": "hostname.domain.com"
```
或
```json
"SERVER_NAME": "192.168.1.100"
```
## 可用工具
### 读取操作(始终可用)
#### `list_table`
列出数据库中的所有表,或按模式过滤。
**参数:**
- `parameters` (可选):按过滤的模式名称数组
**示例:**
```
列出dbo模式中的所有表
```
#### `describe_table`
显示特定表的架构/结构。
**参数:**
- `tableName` (必需):表名
**示例:**
```
描述媒体表
```
#### `read_data`
对数据库执行SELECT查询。
**参数:**
- `query` (必需):SQL SELECT语句
**示例:**
```
显示艺术家表中的前10位艺术家
```
### 写操作(当READONLY=false时)
#### `insert_data`
向表中插入一个或多个记录。
**参数:**
- `tableName` (必需):目标表名
- `data` (必需):具有列:值对的单个对象或对象数组
#### `update_data`
更新表中的记录。
**参数:**
- `tableName` (必需):目标表名
- `updates` (必需):具有列:值对的对象
- `whereClause` (必需):WHERE条件(不带"WHERE"关键字)
#### `create_table`
创建新表。
**参数:**
- `tableName` (必需):新表名
- `columns` (必需):具有名称、类型、可为空、主键的列定义数组
#### `create_index`
在表上创建索引。
**参数:**
- `tableName` (必需):要索引的表
- `indexName` (必需):索引名称
- `columns` (必需):列名数组
- `unique` (可选):唯一索引为true
#### `drop_table`
从数据库中删除表。
**参数:**
- `tableName` (必需):要删除的表
## 在Claude 代码中使用
配置完成后,简单地要求Claude 与您的数据库交互:
```
数据库中有哪些表?
显示媒体表的架构
查找名称以'The'开头的艺术家
创建一个名为temp_data的测试表,包含id和name列
```
Claude 将自动使用适当的MCP工具执行您的请求。
## 故障排除
### 连接失败
- 验证SQL Server正在运行且可访问
- 检查防火墙规则是否允许指定端口上的连接
- 确认已启用SQL Server身份验证(不仅仅是Windows身份验证)
- 使用相同的凭证测试与SQL客户端(Azure Data Studio,SSMS)的连接
### 超时错误
- 连接尝试在15秒(登录)或30秒(操作)后超时
- 如果您在已知工作的服务器上看到超时错误,请检查网络延迟
- 对于慢速网络,您可能需要调整server.py中的超时值:39-40
### 权限错误
- 确保SQL用户对目标数据库具有适当的权限
- 对于写操作,用户需要INSERT/UPDATE/DELETE/CREATE/DROP权限
### 模块导入错误
如果您看到导入错误,请确保已安装`uv`:
```bash
curl -LsSf https://astral.sh/uv/install.sh | sh
```
## 安全注意事项
- **永远不要将带有真实凭证的 `.mcp.json` 提交到版本控制**
- 在生产环境中使用环境变量或安全凭证存储
- 在不需要写访问时考虑使用只读模式(`READONLY: "true"`)
- 将SQL用户权限限制为您的用例所需的最低权限
## 技术细节
- **语言**:Python 3.10+
- **数据库驱动**:pymssql 2.2.0+
- **MCP协议**:模型上下文协议 0.1.0+
- **依赖管理**:uv(内联脚本依赖)
## 许可证
MIT 许可证 - 有关详细信息,请参见 [LICENSE](LICENSE) 文件。
## 贡献
欢迎提出问题和拉取请求!该项目优先考虑简单性和可靠性而非功能。