使用说明
MySQL MCP服务器(PHP)
A. 模型上下文协议 用PHP编写的服务器,使您的AI助手能够控制对MySQL数据库的访问,有三个强制访问级别,只有人类操作员可以更改。支持多个数据库——跨服务器上的所有数据库进行列表、切换和查询。
建筑
AI assistant (MCP Host)
└─ stdio pipe ─── server.php (PHP process)
├─ AccessControl ← reads HMAC-signed sentinel file
├─ SqlValidator ← classifies SQL before execution
└─ MySqlConnection (PDO singleton) → MySQL
├─ tracks current database in-memory
└─ transparent reconnect with database restore
AI助手已经 没有更改访问级别的工具级别更改仅通过以下方式发生 set-level.php,由操作员在单独的终端中运行。
访问级别
| 级别 | 允许的SQL |
|---|---|
read |
选择、显示、描述、解释、使用 |
write |
读取+插入、更新、删除、替换 |
admin |
write+CREATE、DROP、ALTER、TRUNCATE、GRANT、REVOKE。.. |
服务器默认为 read 如果启动时不存在哨兵文件或文件未通过HMAC验证。
需求
- PHP 8.1+
- 作曲家
- MySQL/MariaDB
- Node.js(可选,用于MCP检查器测试)
安装
# 1. Clone / navigate to the project directory
cd /path/to/mysql-mcp-server
# 2. Install dependencies
composer install
# 3. Copy and fill in the environment file
cp .env.example .env # Linux/Mac
copy .env.example .env # Windows
# 4. Generate a bcrypt hash for your PIN
php -r "echo password_hash('your_pin', PASSWORD_BCRYPT) . PHP_EOL;"
# Paste the output into ACCESS_PIN_HASH in .env
# 5. Generate an HMAC secret
php -r "echo bin2hex(random_bytes(32)) . PHP_EOL;"
# Paste the output into HMAC_SECRET in .env
# 6. Set the initial access level
php set-level.php read
项目结构
mysql-mcp-server/
├── .env # Secrets — never commit this
├── .env.example # Safe template — commit this
├── .gitignore
├── composer.json
├── server.php # MCP server entry point (stdio)
├── set-level.php # Operator CLI to change access level
├── src/
│ ├── Config.php # Env variable wrapper
│ ├── AccessControl.php # HMAC-signed level read/write + PIN verify
│ ├── SqlValidator.php # SQL statement type detection
│ ├── MySqlConnection.php # PDO singleton with database tracking
│ └── MySqlTools.php # MCP tool definitions (#[McpTool])
└── storage/
└── access_level.json # Runtime level state (auto-created)
更改访问级别
在终端中运行:
php set-level.php read
php set-level.php write
php set-level.php admin
系统将提示您输入PIN。服务器在下一次工具调用时接收更改,无需重新启动。
连接到克劳德
从项目目录中运行以下命令。
克劳德代码(CLI):
claude mcp add mysql php /absolute/path/to/mysql-mcp-server/server.php
克劳德桌面:
claude mcp add mysql php /absolute/path/to/mysql-mcp-server/server.php --client claude
替换 /absolute/path/to/mysql-mcp-server 使用机器上的实际路径:
- Linux/Mac示例:
/home/youruser/projects/mysql-mcp-server - Windows示例:
C:/Users/youruser/projects/mysql-mcp-server
验证服务器是否已注册:
claude mcp list
光标:
打开(或创建) ~/.cursor/mcp.json 并添加:
{
"mcpServers": {
"mysql": {
"command": "php",
"args": ["/absolute/path/to/mysql-mcp-server/server.php"],
"cwd": "/absolute/path/to/mysql-mcp-server"
}
}
}
cwd是必需的,以便服务器可以定位.env在自己的目录中。- 保存文件后重新启动Cursor。这
mysql服务器将出现在Cursor的MCP工具列表中。
OpenCode:
打开(或创建) ~/.config/opencode/config.json 并添加:
{
"mcpServers": {
"mysql": {
"command": "php",
"args": ["/absolute/path/to/mysql-mcp-server/server.php"],
"cwd": "/absolute/path/to/mysql-mcp-server"
}
}
}
保存后重新启动OpenCode。
OpenAI Codex CLI:
打开(或创建) ~/.codex/config.json 并添加:
{
"mcpServers": {
"mysql": {
"command": "php",
"args": ["/absolute/path/to/mysql-mcp-server/server.php"],
"cwd": "/absolute/path/to/mysql-mcp-server"
}
}
}
保存后重新启动Codex。
VS代码(GitHub副本):
需要VS代码 ≥ 1.99 GitHub Copilot扩展 v1.290+.
- 按
Ctrl+Shift+P→ “MCP:添加服务器” - 选择 “stdio(运行命令)”
- 输入命令:
php /absolute/path/to/mysql-mcp-server/server.php - 输入服务器名称:
mysql - 保存到: 全局(用户设置)
然后打开 Ctrl+Shift+P → “打开用户设置(JSON)” 并添加 cwd 对于生成的条目:
"github.copilot.chat.mcp.servers": {
"mysql": {
"type": "stdio",
"command": "php",
"args": ["/absolute/path/to/mysql-mcp-server/server.php"],
"cwd": "/absolute/path/to/mysql-mcp-server"
}
}
cwd是必需的,以便PHP可以定位.env在自己的目录中。- Windows路径示例:
C:/wamp64/www/mysql-mcp-server
要激活:打开Copilot聊天(Ctrl+Alt+I) → 切换到 代理模式 → 单击 工具图标 (扳手)→ 切换 mysql 上。
可用工具
| 工具 | 描述 | 最低级别 |
|---|---|---|
execute_sql |
执行SQL语句(强制级别) | 动态 |
list_tables |
列出当前数据库中的所有表 | read |
describe_table |
描述特定表的列 | read |
get_access_level |
返回当前访问级别(只读信息) | read |
list_databases |
列出服务器上的所有数据库(当前标记为*的数据库) | 已读 |
use_database |
为所有后续查询切换活动数据库 | read |
多数据库工作流
服务器支持在同一MySQL服务器上跨多个数据库工作:
- 列出数据库 --呼叫
list_databases查看所有可用的数据库。当前活动的标记为*. - 交换机数据库 --呼叫
use_database使用要切换的目标数据库名称。所有后续查询(execute_sql,list_tables,describe_table)将在新数据库上运行。 - 初始数据库 --如果
DB_NAME设定在.env,它将在启动时成为默认数据库。如果DB_NAME为空或省略,在您调用之前不会选择数据库use_database.
数据库交换机使用MySQL的 USE 语句内部——这是一个轻量级的会话命令,不会重新连接或重新验证。如果连接断开,服务器将在重新连接时自动还原所选数据库。
MCP检验员测试
npx @modelcontextprotocol/inspector php /absolute/path/to/mysql-mcp-server/server.php
打开浏览器UI,您可以在其中手动调用工具并检查JSON-RPC消息。
安全模型
| 威胁 | 缓解 |
|---|---|
| AI提升自己的特权 | 不存在级别更改工具-零API表面 |
锻造 access_level.json |
HMAC-SHA256使用AI从未见过的密钥签名 |
| 通过工具参数注入SQL | PDO实写语句(ATTR_EMULATE_PREPARES = false) |
标识符注入 describe_table / use_database |
严格正则表达式白名单([a-zA-Z0-9_])+后退逃跑(纵深防御) |
| 绕过注释包裹语句 | 在关键字分类和USE拦截之前删除注释 |
多语句执行(SELECT 1; DROP TABLE x) |
半导体计数保护→ 归类为 admin |
通过原始SQL进行数据库切换(USE db 在 execute_sql) |
已拦截并重定向到 use_database 防止状态不同步的工具 |
| AI配置中的秘密 | 凭据仅存在于 .env,由服务器本身加载 |