# MCP Database Filesystem

[English](README_EN.md) | 中文

一个简洁高效的 MCP (Model Context Protocol) 服务器，提供多数据库访问和文件系统操作功能。

## ✨ 主要特性

### 🗄️ 多数据库支持

#### SQL Server
- **SQL 查询执行** - 支持 SELECT 查询
- **SQL 命令执行** - 支持 INSERT/UPDATE/DELETE 操作
- **表结构查询** - 获取表的详细结构信息和字段描述
- **表列表** - 列出数据库中的所有表

#### MySQL
- **MySQL 查询执行** - 支持 MySQL SELECT 查询
- **MySQL 命令执行** - 支持 INSERT/UPDATE/DELETE 操作
- **MySQL 表结构查询** - 获取 MySQL 表的详细结构信息
- **MySQL 表列表** - 列出 MySQL 数据库中的所有表

#### Redis
- **键值操作** - GET/SET/DELETE 键值对
- **键管理** - 列出匹配模式的键
- **服务器信息** - 获取 Redis 服务器状态信息
- **过期设置** - 支持键的过期时间设置

### 📁 文件系统功能
- **文件读取** - 读取文件内容
- **文件写入** - 写入内容到文件
- **目录列表** - 列出目录内容

### 🔒 安全特性
- SQL 注入防护
- 文件系统访问控制
- 环境变量配置
- 权限验证

### 🔄 容错机制
- **优雅降级** - 任何数据库连接失败时不影响其他服务
- **动态重连** - 支持运行时重新连接各种数据库
- **状态监控** - 实时监控所有数据库连接状态

## 🚀 快速开始

### 📋 前置要求

根据您要使用的数据库服务，安装相应的驱动程序：

#### 1. SQL Server (可选)
安装 ODBC Driver for SQL Server

**Windows:**
```bash
# 下载并安装 Microsoft ODBC Driver 17 for SQL Server
# 访问: https://docs.microsoft.com/en-us/sql/connect/odbc/download-odbc-driver-for-sql-server
# 或使用 winget 安装
winget install Microsoft.ODBCDriverforSQLServer
```

**macOS:**
```bash
# 使用 Homebrew 安装
brew tap microsoft/mssql-release https://github.com/Microsoft/homebrew-mssql-release
brew update
brew install msodbcsql17 mssql-tools
```

**Linux (Ubuntu/Debian):**
```bash
# 添加 Microsoft 仓库
curl https://packages.microsoft.com/keys/microsoft.asc | sudo apt-key add -
curl https://packages.microsoft.com/config/ubuntu/20.04/prod.list | sudo tee /etc/apt/sources.list.d/msprod.list

# 安装驱动
sudo apt-get update
sudo apt-get install msodbcsql17
```

#### 2. 验证 ODBC 安装

```bash
# Windows
odbcad32.exe

# macOS/Linux
odbcinst -j
```

#### 2. MySQL (可选)
如果要使用 MySQL 功能，确保 MySQL 服务器可访问。不需要额外的客户端驱动，PyMySQL 已包含在依赖中。

#### 3. Redis (可选)
如果要使用 Redis 功能，确保 Redis 服务器可访问。不需要额外的客户端驱动，redis-py 已包含在依赖中。

### 📦 零安装使用（推荐）

```bash
# 安装 uv（如果尚未安装）
pip install uv

# 直接运行 - 无需克隆仓库！
uvx mcp-db-filesystem@latest
```

### 🔧 配置

在你的 MCP 客户端（如 Claude Desktop、AugmentCode）中添加以下配置：

```json
{
  "mcpServers": {
    "mcp-db-filesystem": {
      "command": "uvx",
      "args": ["mcp-db-filesystem@latest"],
      "env": {
        // SQL Server Configuration (可选)
        "MSSQL_SERVER": "localhost",
        "MSSQL_DATABASE": "your_database",
        "MSSQL_USERNAME": "your_username",
        "MSSQL_PASSWORD": "your_password",
        "MSSQL_USE_WINDOWS_AUTH": "true",
        "MSSQL_PORT": "1433",
        "MSSQL_DRIVER": "ODBC Driver 17 for SQL Server",
        "MSSQL_CONNECTION_TIMEOUT": "30",
        "MSSQL_COMMAND_TIMEOUT": "30",
        "MSSQL_POOL_SIZE": "5",
        "MSSQL_MAX_OVERFLOW": "10",
        "MSSQL_TRUST_SERVER_CERTIFICATE": "true",
        "MSSQL_ENCRYPT": "false",
        "MSSQL_MULTIPLE_ACTIVE_RESULT_SETS": "true",
        "MSSQL_APPLICATION_NAME": "MCP-Db-Filesystem",

        // MySQL Configuration (可选)
        "MYSQL_HOST": "localhost",
        "MYSQL_PORT": "3306",
        "MYSQL_DATABASE": "your_mysql_database",
        "MYSQL_USERNAME": "your_mysql_username",
        "MYSQL_PASSWORD": "your_mysql_password",
        "MYSQL_CHARSET": "utf8mb4",
        "MYSQL_CONNECTION_TIMEOUT": "30",
        "MYSQL_POOL_SIZE": "5",
        "MYSQL_MAX_OVERFLOW": "10",

        // Redis Configuration (可选)
        "REDIS_HOST": "localhost",
        "REDIS_PORT": "6379",
        "REDIS_DB": "0",
        "REDIS_PASSWORD": "your_redis_password",
        "REDIS_SOCKET_TIMEOUT": "30",
        "REDIS_CONNECTION_TIMEOUT": "30",
        "REDIS_MAX_CONNECTIONS": "10",

        // Filesystem Configuration
        "FS_ALLOWED_PATHS": "*",
        "FS_ALLOWED_EXTENSIONS": "*.*",
        "FS_MAX_FILE_SIZE": "1073741824",
        "FS_ENABLE_WRITE": "true",
        "FS_ENABLE_DELETE": "true",
        "FS_IGNORE_FILE_LOCKS": "false",

        // Security Configuration
        "SECURITY_ENABLE_SQL_INJECTION_PROTECTION": "true",
        "SECURITY_MAX_QUERY_LENGTH": "10000",
        "SECURITY_ENABLE_QUERY_LOGGING": "true",
        "SECURITY_LOG_SENSITIVE_DATA": "false",

        // Server Configuration
        "SERVER_LOG_LEVEL": "INFO",
        "SERVER_DEBUG": "false"
      }
    }
  }
}
```

## 🛠️ 可用工具

### SQL Server 工具
- `sql_query` - 执行 SQL Server SELECT 查询
- `sql_execute` - 执行 SQL Server INSERT/UPDATE/DELETE 命令
- `list_tables` - 列出 SQL Server 数据库中的所有表
- `get_table_schema` - 获取 SQL Server 表的结构信息
- `database_reconnect` - 重新连接 SQL Server

### MySQL 工具
- `mysql_query` - 执行 MySQL SELECT 查询
- `mysql_execute` - 执行 MySQL INSERT/UPDATE/DELETE 命令
- `mysql_list_tables` - 列出 MySQL 数据库中的所有表
- `mysql_get_table_schema` - 获取 MySQL 表的结构信息
- `mysql_reconnect` - 重新连接 MySQL

### Redis 工具
- `redis_get` - 获取 Redis 键值
- `redis_set` - 设置 Redis 键值（支持过期时间）
- `redis_delete` - 删除 Redis 键
- `redis_keys` - 列出匹配模式的 Redis 键
- `redis_info` - 获取 Redis 服务器信息
- `redis_reconnect` - 重新连接 Redis

### 数据库管理工具
- `database_status` - 检查所有数据库连接状态

### 文件系统工具
- `read_file` - 读取文件内容
- `write_file` - 写入文件内容
- `list_directory` - 列出目录内容
- `delete_file` - 删除文件（需要确认）
- `create_directory` - 创建目录
- `delete_file` - 删除文件（需要确认）
- `create_directory` - 创建目录

## 📋 环境变量

### SQL Server 配置
- `MSSQL_SERVER` - SQL Server 服务器地址
- `MSSQL_DATABASE` - 数据库名称
- `MSSQL_USERNAME` - 用户名
- `MSSQL_PASSWORD` - 密码
- `MSSQL_USE_WINDOWS_AUTH` - 是否使用 Windows 身份验证
- `MSSQL_PORT` - SQL Server 端口（默认 1433）
- `MSSQL_DRIVER` - ODBC 驱动名称
- `MSSQL_CONNECTION_TIMEOUT` - 连接超时时间（秒）
- `MSSQL_COMMAND_TIMEOUT` - 命令超时时间（秒）
- `MSSQL_POOL_SIZE` - 连接池大小
- `MSSQL_MAX_OVERFLOW` - 最大溢出连接数
- `MSSQL_TRUST_SERVER_CERTIFICATE` - 是否信任服务器证书
- `MSSQL_ENCRYPT` - 是否加密连接
- `MSSQL_MULTIPLE_ACTIVE_RESULT_SETS` - 是否启用多活动结果集
- `MSSQL_APPLICATION_NAME` - 应用程序名称

### MySQL 配置
- `MYSQL_HOST` - MySQL 服务器地址
- `MYSQL_PORT` - MySQL 端口（默认 3306）
- `MYSQL_DATABASE` - MySQL 数据库名称
- `MYSQL_USERNAME` - MySQL 用户名
- `MYSQL_PASSWORD` - MySQL 密码
- `MYSQL_CHARSET` - 字符集（默认 utf8mb4）
- `MYSQL_CONNECTION_TIMEOUT` - 连接超时时间（秒）
- `MYSQL_POOL_SIZE` - 连接池大小
- `MYSQL_MAX_OVERFLOW` - 最大溢出连接数

### Redis 配置
- `REDIS_HOST` - Redis 服务器地址
- `REDIS_PORT` - Redis 端口（默认 6379）
- `REDIS_DB` - Redis 数据库编号（默认 0）
- `REDIS_PASSWORD` - Redis 密码（可选）
- `REDIS_SOCKET_TIMEOUT` - Socket 超时时间（秒）
- `REDIS_CONNECTION_TIMEOUT` - 连接超时时间（秒）
- `REDIS_MAX_CONNECTIONS` - 最大连接数

### 文件系统配置
- `FS_ALLOWED_PATHS` - 允许访问的路径（`*` 表示所有路径）
- `FS_ALLOWED_EXTENSIONS` - 允许的文件扩展名（`*.*` 表示所有文件）
- `FS_MAX_FILE_SIZE` - 最大文件大小（字节）
- `FS_ENABLE_WRITE` - 是否启用写操作
- `FS_ENABLE_DELETE` - 是否启用删除操作
- `FS_IGNORE_FILE_LOCKS` - 是否忽略文件锁

## 🔧 开发

### 本地开发

```bash
# 克隆仓库
git clone https://github.com/ppengit/mcp-db-filesystem.git
cd mcp-db-filesystem

# 安装依赖
uv sync

# 运行服务器
uv run python -m mcp_db_filesystem server
```

### 测试

```bash
# 运行测试
uv run pytest

# 运行特定测试
uv run pytest tests/test_database.py
```

## 📄 许可证

MIT License - 详见 [LICENSE](LICENSE) 文件。

## 🤝 贡献

欢迎贡献！请提交 Issue 或 Pull Request。

## ❓ 常见问题

### Q: 出现 "No module named 'pyodbc'" 错误
A: 请确保已安装 ODBC Driver for SQL Server，参见上面的前置要求部分。

### Q: 出现 "Data source name not found" 错误
A: 检查 `DB_SERVER` 配置是否正确，确保 SQL Server 服务正在运行。

### Q: 连接超时或拒绝连接
A:
1. 检查 SQL Server 是否启用了 TCP/IP 协议
2. 确认防火墙设置允许连接到 SQL Server 端口（默认1433）
3. 验证用户名和密码是否正确

### Q: 文件系统操作被拒绝
A: 检查 `FS_ALLOWED_PATHS` 和 `FS_ALLOWED_EXTENSIONS` 配置，确保路径和文件类型被允许访问。

## 📞 支持

- GitHub Issues: [https://github.com/ppengit/mcp-db-filesystem/issues](https://github.com/ppengit/mcp-db-filesystem/issues)

## 🔄 更新日志

### v1.0.1
- 🎉 首个稳定版本发布
- ✨ 完整的 SQL Server 数据库支持
- 📁 全面的文件系统操作
- 🔒 增强的安全特性
- 📝 改进的错误处理和日志记录
- 🚀 简化的架构，专注于核心功能

---

**注意**: 此版本专注于核心功能的稳定性和可靠性，提供简洁高效的MCP服务器体验。
