项目简介

这是一个基于 Model Context Protocol (MCP) 实现的 MySQL 只读服务器。它旨在允许大型语言模型 (LLM) 通过标准化的 MCP 接口,以安全受控的方式访问和查询 MySQL 数据库的数据。服务器强制执行只读操作,并提供连接池、参数化查询、结果限制等功能。

主要功能点

  • 只读访问: 仅允许执行 'SELECT', 'SHOW', 'DESCRIBE', 'EXPLAIN' 等只读 SQL 语句,禁止其他操作。
  • 安全防护: 防止多语句执行和 SQL 注入(通过参数化查询)。
  • 连接管理: 使用连接池高效管理数据库连接。
  • 结果控制: 自动限制查询返回的最大行数。
  • 上下文增强: 通过资源描述文件提供数据库结构等上下文信息给 LLM。
  • 标准接口: 通过 MCP JSON-RPC 协议与 LLM 客户端通信。

安装步骤

  1. 克隆仓库代码:
    git clone https://github.com/the-nine-nation/mysql-mcp.git
    cd mysql-mcp
  2. 安装项目及其依赖:
    pip install -e .
    这将安装项目所需的 Python 库,包括 'aiomysql' 和 'mcp'。

服务器配置

MCP 服务器通常由 MCP 客户端(如 LLM 应用)通过启动外部进程的方式连接。客户端需要知道如何启动服务器进程。以下是一个示例配置结构,用于告诉 MCP 客户端如何启动此 MySQL MCP 服务器:

// MCP客户端配置文件中的一部分
{
    "servers": {
        "mysql": { // 服务器的名称,自定义
            "command": "python", // 或 sys.executable, MCP服务器可执行文件的路径
            "args": ["/path/to/your/mysql-mcp/src/main.py"], // 启动脚本的路径
            "env": { // 传递给MCP服务器进程的环境变量
                "MYSQL_ENABLED": "true", // 启用MySQL功能,设为 "true"
                "MYSQL_HOST": "your_mysql_host", // MySQL数据库IP地址
                "MYSQL_PORT": "3306", // MySQL数据库端口,默认为 3306
                "MYSQL_DATABASE": "your_database_name", // MySQL数据库名称
                "MYSQL_USERNAME": "your_mysql_username", // MySQL数据库用户名
                "MYSQL_PASSWORD": "your_mysql_password", // MySQL数据库密码
                "MYSQL_POOL_MINSIZE": "1", // 连接池最小连接数
                "MYSQL_POOL_MAXSIZE": "10", // 连接池最大连接数
                "MYSQL_RESOURCE_DESC_FILE": "/path/to/your/resource_description.txt", // 包含数据库描述信息的文本文件路径(必需)
                "MAX_ROWS": "20" // 查询结果默认最大行数,默认为 20
            }
        }
        // ... 其他MCP服务器配置
    }
}

请确保替换配置中的占位符信息。特别是 'MYSQL_RESOURCE_DESC_FILE' 指向的文件应包含对 LLM 有用的数据库上下文,例如表名、列名、表的功能等描述。

基本使用方法

LLM 客户端与此 MCP 服务器建立连接后,可以发现并调用名为 'mysql_execute_read_query' 的工具。调用时,LLM 需要提供一个包含只读 SQL 查询语句的 'query' 参数,可选地提供 'params' 参数用于参数化查询,以及可选的 'max_rows' 参数限制结果数量。

服务器将执行该查询,对查询和参数进行安全检查,然后将查询结果格式化为易于 LLM 理解的文本表格形式返回。

例如,LLM可能会构建如下的工具调用参数:

{
    "name": "mysql_execute_read_query",
    "arguments": {
        "query": "SELECT id, name, status FROM users WHERE status = %s",
        "params": ["active"],
        "max_rows": 50
    }
}

服务器执行后会返回类似以下格式的字符串结果:

id | name      | status
---+-----------+--------
1  | Alice     | active
2  | Bob       | active
...
Total rows: 100 (showing first 50)

信息

分类

数据库与文件