让 Claude Code / Claude Desktop 等 AI 客户端通过 MCP 协议直接操作多个 MySQL / PostgreSQL 数据库。每个连接独立配置读/写/DDL 权限,密码通过环境变量管理。
| MCP 工具 | 说明 | 权限要求 |
|---|---|---|
list_connections |
列出所有数据库连接及权限 | 无 |
execute_query |
执行 SELECT 查询(最多 1000 行) | allow_read |
execute_write |
执行 INSERT / UPDATE / DELETE | allow_write |
execute_ddl |
执行 CREATE / ALTER / DROP 等 DDL | allow_ddl |
list_tables |
列出数据库所有表 | allow_read |
describe_table |
查看表结构 | allow_read |
cp databases.yaml.example databases.yaml # 或直接编辑 databases.yaml编辑 databases.yaml,填入你的数据库信息:
databases:
my_mysql:
type: mysql
host: 192.168.1.10
port: 3306
database: myapp
user: readonly_user
password: "${MYSQL_PASSWORD}" # 从环境变量读取
permissions:
allow_read: true
allow_write: false
allow_ddl: false
my_pg:
type: postgresql
host: 192.168.1.20
port: 5432
database: analytics
user: analyst
password: "${PG_PASSWORD}"
permissions:
allow_read: true
allow_write: true
allow_ddl: falsecp .env.example .env
# 编辑 .env,填入真实密码.env 内容示例:
MYSQL_PASSWORD=your_mysql_password
PG_PASSWORD=your_pg_passworddocker-compose build
docker-compose up -dclaude mcp add database -- docker exec -i database-mcp python -m database_mcp验证注册成功:
claude mcp list启动 Claude Code 后即可直接对话使用。
每个连接支持三级权限,独立配置:
| 权限字段 | 默认值 | 说明 |
|---|---|---|
allow_read |
true |
允许 SELECT 查询 |
allow_write |
false |
允许 INSERT / UPDATE / DELETE |
allow_ddl |
false |
允许 CREATE / ALTER / DROP / TRUNCATE |
安全机制:
execute_query只接受 SELECT,传入其他语句直接报错execute_write禁止 DROP / TRUNCATE(必须走execute_ddl)- 表名做标识符校验,防止 SQL 注入
- 查询结果默认最多返回 1000 行(可在配置中调整
max_rows)
密码字段支持 ${VAR_NAME} 语法,运行时从环境变量读取,避免明文写入配置文件:
password: "${MY_DB_PASSWORD}"database-mcp/
├── databases.yaml # 数据库连接配置
├── .env # 密码环境变量(不提交 git)
├── .env.example # 环境变量模板
├── Dockerfile
├── docker-compose.yml
├── pyproject.toml
└── src/
└── database_mcp/
├── config.py # 配置加载 & 校验
├── guard.py # 权限检查 & SQL 安全过滤
├── pool.py # MySQL/PostgreSQL 连接池
├── router.py # 按连接名路由
├── main.py # MCP Server 入口
└── tools/
├── query.py # execute_query / execute_write / execute_ddl
└── schema.py # list_connections / list_tables / describe_table
# 安装依赖(在 docker-python-platform python311 容器内)
pip install -e ".[dev]"
# 运行测试
pytest -v修改 databases.yaml 后不生效?
需要重启容器:docker-compose restart
容器已启动但 Claude Code 连不上?
确认容器名称是 database-mcp:docker ps | grep database-mcp
想让容器开机自动启动?
docker-compose.yml 已配置 restart: unless-stopped,重启 Docker Desktop 后自动恢复。