mcp-dbutils
by donghao1393
Verified
- mcp-dbutils
- docs
# MCP 数据库工具技术指南
## 通信模式与安全架构
MCP数据库工具服务实现了一套安全的通信模式,旨在每一步都保护您的数据安全。下图展示了数据在各组件之间的流动方式,同时保持安全性:
```mermaid
flowchart LR
subgraph User["用户环境"]
Client["AI客户端<br>(Claude/Cursor)"]
ConfigFile["配置文件<br>(YAML)"]
end
subgraph MCP["MCP数据库工具"]
MCPService["MCP服务"]
ConnectionManager["连接管理器"]
QueryProcessor["查询处理器<br>(只读)"]
end
subgraph Databases["数据库层"]
DB1["数据库1"]
DB2["数据库2"]
DBn["数据库n"]
end
%% 通信流程
Client-- "步骤1:<br>数据请求<br>(自然语言)" -->MCPService
ConfigFile-. "启动时加载<br>(连接详情)" .->MCPService
MCPService-- "步骤2:<br>处理请求" -->ConnectionManager
ConnectionManager-- "步骤3:<br>打开连接<br>(按需)" -->Databases
ConnectionManager-- "步骤4:<br>发送查询<br>(仅SELECT)" -->QueryProcessor
QueryProcessor-- "步骤5:<br>执行查询" -->Databases
Databases-- "步骤6:<br>返回结果" -->QueryProcessor
QueryProcessor-- "步骤7:<br>格式化结果" -->MCPService
MCPService-- "步骤8:<br>传递结果" -->Client
ConnectionManager-- "步骤9:<br>关闭连接<br>(完成后)" -->Databases
%% 样式
classDef user fill:#e1f5fe,stroke:#01579b,stroke-width:2px,color:#01579b
classDef mcp fill:#e8f5e9,stroke:#2e7d32,stroke-width:2px,color:#2e7d32
classDef db fill:#fff3e0,stroke:#e65100,stroke-width:2px,color:#e65100
class User user
class MCP mcp
class Databases db
%% 添加安全说明
style ConnectionManager stroke-dasharray: 5 5
style QueryProcessor stroke-dasharray: 5 5
```
### 核心安全特性
1. **隔离访问流程**:
- 您的AI客户端永远不会直接访问您的数据库
- 所有请求都通过受控的MCP服务环境传递
2. **临时连接**:
- 仅在需要时才建立数据库连接
- 查询执行后立即关闭连接
- 没有可被利用的持久连接
3. **只读操作**:
- 查询处理器强制执行严格的仅SELECT操作
- 不可能修改数据(无INSERT、UPDATE、DELETE)
4. **配置分离**:
- 连接详情隔离在单独的配置文件中
- 凭据永远不会暴露给AI模型
5. **多数据库支持**:
- 每个数据库连接单独管理
- 数据库通过连接管理器相互隔离
这种架构确保即使您将该工具用于多个数据库或用途,每个连接仍然保持安全和隔离,最大限度地减少数据暴露。
## 架构设计
### 核心概念:抽象层设计
```mermaid
graph TD
Client[客户端] --> DatabaseServer[数据库服务器]
subgraph MCP 服务器
DatabaseServer
DatabaseHandler[数据库处理器]
PostgresHandler[PostgreSQL处理器]
SQLiteHandler[SQLite处理器]
MySQLHandler[MySQL处理器]
DatabaseServer --> DatabaseHandler
DatabaseHandler --> PostgresHandler
DatabaseHandler --> SQLiteHandler
DatabaseHandler --> MySQLHandler
end
PostgresHandler --> PostgreSQL[(PostgreSQL)]
SQLiteHandler --> SQLite[(SQLite)]
MySQLHandler --> MySQL[(MySQL)]
```
抽象层设计是MCP数据库工具的核心架构概念。就像通用遥控器可以控制不同设备一样,用户只需要了解基本操作,而无需理解底层复杂性。
#### 1. 简化用户交互
- 用户只需知道数据库配置名称(例如"my_postgres")
- 无需处理连接参数和实现细节
- MCP服务器自动处理数据库连接和查询
#### 2. 统一接口设计
- DatabaseHandler抽象类定义了统一的操作接口
- 所有特定数据库实现(PostgreSQL/SQLite/MySQL)遵循相同的接口
- 用户以相同的方式与不同数据库交互
#### 3. 配置和实现分离
- 复杂的数据库配置参数封装在配置文件中
- 运行时通过简单的数据库名称访问
- 可以轻松管理和修改数据库配置,而不影响业务代码
### 系统组件
1. DatabaseServer
- MCP服务器的核心组件
- 处理资源和工具请求
- 管理数据库连接生命周期
2. DatabaseHandler
- 定义统一接口的抽象基类
- 包括get_tables()、get_schema()、execute_query()等方法
- 由PostgreSQL、SQLite和MySQL处理器实现
3. 配置系统
- 基于YAML的配置文件
- 支持多个数据库配置
- 类型安全的配置验证
4. 错误处理和日志记录
- 统一的错误处理机制
- 详细的日志输出
- 敏感信息掩码处理
## API文档
### DatabaseServer
核心服务器类,提供:
- 资源列表检索
- 工具调用处理(list_tables、query等)
- 数据库处理器管理
### MCP工具
#### dbutils-list-tables
列出指定数据库中的所有表。
- 参数:
* connection: 数据库连接名称
- 返回:包含表名列表的文本内容
#### dbutils-run-query
在指定数据库上执行SQL查询。
- 参数:
* connection: 数据库连接名称
* sql: 要执行的SQL查询(仅SELECT)
- 返回:格式化文本形式的查询结果
#### dbutils-get-stats
获取表统计信息。
- 参数:
* connection: 数据库连接名称
* table: 表名
- 返回:包括行数、大小、列统计信息等
#### dbutils-list-constraints
列出表约束(主键、外键等)。
- 参数:
* connection: 数据库连接名称
* table: 表名
- 返回:详细的约束信息
#### dbutils-explain-query
获取查询执行计划和成本估算。
- 参数:
* connection: 数据库连接名称
* sql: 要解释的SQL查询
- 返回:格式化的执行计划
#### dbutils-get-performance
获取数据库性能统计信息。
- 参数:
* connection: 数据库连接名称
- 返回:详细的性能统计信息,包括查询时间、查询类型、错误率和资源使用情况
#### dbutils-analyze-query
分析SQL查询的性能并提供优化建议。
- 参数:
* connection: 数据库连接名称
* sql: 要分析的SQL查询
- 返回:包含执行计划、时间信息和优化建议的查询分析
### DatabaseHandler
定义接口的抽象基类:
- get_tables():获取表资源列表
- get_schema():获取表结构
- execute_query():执行SQL查询
- cleanup():资源清理
### PostgreSQL实现
提供PostgreSQL特定功能:
- 远程连接支持
- 表描述信息
- 约束查询
### SQLite实现
提供SQLite特定功能:
- 文件路径处理
- URI方案支持
- 密码保护支持(可选)
### MySQL实现
提供MySQL特定功能:
- 远程连接支持
- 字符集配置
- SSL/TLS安全连接
- URL和标准连接方法
## 代码质量
### 质量门禁
我们使用SonarCloud维护高代码质量标准。所有拉取请求必须通过以下质量门禁:
- 代码覆盖率:≥ 80%
- 代码质量:
* 无阻断或严重问题
* 主要问题少于10个
* 代码重复率 < 3%
- 安全性:
* 无安全漏洞
* 无安全热点
### 自动化检查
我们的CI/CD流程自动执行:
1. 完整测试套件执行
2. 代码覆盖率分析
3. SonarCloud静态代码分析
4. 质量门禁验证
不满足这些标准的拉取请求将自动被阻止合并。
### 代码风格
我们使用Ruff进行代码风格检查和格式化:
所有代码必须遵循我们的风格指南:
- 行长度:88个字符
- 缩进:4个空格
- 引号:双引号
- 命名:PEP8约定
有关详细指南,请参阅[STYLE_GUIDE.md](STYLE_GUIDE.md)。
### 本地开发
要在本地检查代码质量:
1. 运行带覆盖率的测试:
```bash
pytest --cov=src/mcp_dbutils --cov-report=xml:coverage.xml tests/
```
2. 在IDE中使用SonarLint及早发现问题
3. 在PR评论中查看SonarCloud分析结果
4. 运行Ruff进行代码风格检查:
```bash
# 安装Ruff
uv pip install ruff
# 检查代码风格
ruff check .
# 格式化代码
ruff format .
```
5. 使用pre-commit钩子进行自动检查:
```bash
# 安装pre-commit
uv pip install pre-commit
pre-commit install
```
## 高级功能
### 数据处理器
数据处理器负责后处理数据库查询结果,提供易读格式,并支持多种输出选项:
- 表格格式数据
- 树状数据层次结构
- 特殊资源类型处理(二进制数据、图像等)
### 工具定义
MCP工具定义在`src/mcp_dbutils/tools.py`文件中,包括:
- `list_resources`:列出数据库资源
- `read_resource`:读取单个表或视图内容
- `call_tool`:执行自定义SQL查询
- `get_schema`:获取表或视图结构
- `get_info`:获取资源详细信息
## 故障排除指南
在使用MCP数据库工具时,您可能会遇到以下常见问题。以下是排查和解决这些问题的指南。
### 连接问题
1. **无法连接到数据库**
- 确认您的配置文件中的连接信息是否正确
- 验证您的数据库服务器是否运行并可访问
- 检查网络防火墙是否允许连接
- 对于远程数据库,确认主机名/IP地址和端口是否正确
2. **配置文件错误**
- 检查YAML语法是否正确(缩进、冒号等)
- 确认所有必需的字段都已提供
- 验证文件路径是否正确(特别是SQLite数据库文件)
3. **权限问题**
- 确保提供的数据库用户具有SELECT权限
- 检查用户是否可以访问所需的表和视图
- 对于SQLite,验证文件系统权限是允许读取的
### 工具和查询问题
1. **查询执行失败**
- 检查SQL语法错误
- 确认表名和列名拼写正确
- 验证您的查询仅包含SELECT操作
- 对于复杂查询,尝试拆分成更简单的部分
2. **性能问题**
- 避免没有WHERE条件的大表查询
- 使用LIMIT子句限制结果集大小
- 对于复杂的JOIN操作,考虑简化查询
- 使用dbutils-explain-query工具分析查询性能
3. **MCP客户端集成问题**
- 确认MCP配置正确(命令和参数)
- 检查路径是绝对路径而非相对路径
- 验证uvx或docker能在命令行直接运行
### 日志和诊断
对于高级故障排除,您可以启用详细日志记录:
#### 命令行启用调试
```bash
# 启用详细日志
MCP_DEBUG=1 uvx mcp-dbutils --config your_config.yaml
```
#### MCP客户端配置中启用调试
在MCP配置中添加环境变量:
**JSON配置示例**:
```json
{
"dbutils": {
"command": "uvx",
"args": [
"mcp-dbutils",
"--config",
"/path/to/your/config.yaml"
],
"env": {
"MCP_DEBUG": "1"
}
}
}
```
**Cursor MCP配置**:
在Cursor设置 → MCP → 编辑服务器配置中添加环境变量。
#### 查看日志
MCP客户端会处理服务生成的日志。不同的MCP客户端可能在不同位置存储日志:
- 对于Claude Desktop:请查看Claude Desktop的应用日志
- 对于Cursor:请查看Cursor的MCP日志部分
- 对于其他客户端:请参考各自客户端的文档了解如何访问MCP服务日志
如果您在使用过程中遇到问题,以下资源可能会有所帮助:
1. **项目文档**:首先查看最新的[项目文档](https://github.com/donghao1393/mcp-dbutils)以获取使用指南和已知问题
2. **GitHub Issues**:搜索或[提交新issue](https://github.com/donghao1393/mcp-dbutils/issues)报告错误或请求帮助
3. **GitHub Discussions**:参与[讨论区](https://github.com/donghao1393/mcp-dbutils/discussions)获取社区支持或分享使用经验
## 版本更新
MCP数据库工具会定期发布更新,包含新功能、性能改进和错误修复。大多数情况下,更新过程由MCP客户端自动管理,您无需手动干预。
### 获取最新版本
- **使用MCP客户端**:大多数MCP客户端(如Claude Desktop、Cursor等)会自动更新到最新版本
- **手动检查更新**:
- 访问[GitHub仓库](https://github.com/donghao1393/mcp-dbutils)查看最新版本
- 阅读[发布说明](https://github.com/donghao1393/mcp-dbutils/releases)了解新功能和变更
- **问题报告**:
- 如果您在更新后遇到问题,请[提交issue](https://github.com/donghao1393/mcp-dbutils/issues)