MySQL访问控制服务器

一个基于PHP的MySQL数据库访问控制服务器,为AI助手提供分级的数据库操作权限管理。

  • by aallam-12
  • PHP
  • 本地部署
  • 更新于
在 GitHub 查看 aallam-12/Mysql-MCP-server

使用说明

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+.

  1. 按 Ctrl+Shift+P → “MCP:添加服务器”
  2. 选择 “stdio(运行命令)”
  3. 输入命令: php /absolute/path/to/mysql-mcp-server/server.php
  4. 输入服务器名称: mysql
  5. 保存到: 全局(用户设置)

然后打开 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服务器上跨多个数据库工作:

  1. 列出数据库 --呼叫 list_databases 查看所有可用的数据库。当前活动的标记为 *.
  2. 交换机数据库 --呼叫 use_database 使用要切换的目标数据库名称。所有后续查询(execute_sql, list_tables, describe_table)将在新数据库上运行。
  3. 初始数据库 --如果 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,由服务器本身加载