MySQL数据库交互服务

MCP MySQL Server是一个基于Go的MCP服务器实现,提供MySQL数据库交互功能,允许MCP客户端执行数据库操作。

  • by cnosuke
  • Go
  • 本地部署
  • 1 星标
  • 更新于
在 GitHub 查看 cnosuke/mcp-mysql

使用说明

MCP MySQL服务器

MCP MySQL Server是一个基于Go的MCP服务器实现,它提供MySQL数据库交互功能,允许MCP客户端(例如Claude Desktop)执行数据库操作。

特性

  • MCP合规性:根据MCP规范为工具执行提供基于JSON-RPC的接口。
  • MySQL操作:支持数据库操作,如查询、模式检查和(可选)数据操作。
  • 只读模式:防止数据修改操作的可选限制。
  • 查询计划验证:可选EXPLAIN分析以验证查询安全性。
  • URL样式连接字符串:支持标准URL样式数据库连接字符串,如 mysql://user:pass@host:port/dbname.
  • 最小容器:使用谷歌的无发行版构建,以提高安全性和减小图像大小。

需求

  • Docker(推荐)

对于当地发展:

  • 转到1.24或更高版本
  • MySQL服务器(本地或远程)

使用Docker(推荐)

# Pull the image
docker pull cnosuke/mcp-mysql:latest

# Run with default settings
docker run -i --rm cnosuke/mcp-mysql:latest

# Run with custom MySQL connection
docker run -i --rm \
  -e MYSQL_HOST=your-mysql-host \
  -e MYSQL_PORT=3306 \
  -e MYSQL_USER=your-username \
  -e MYSQL_PASSWORD=your-password \
  -e MYSQL_DATABASE=your-database \
  cnosuke/mcp-mysql:latest

# Run in read-only mode
docker run -i --rm \
  -e MYSQL_HOST=your-mysql-host \
  -e MYSQL_USER=your-username \
  -e MYSQL_PASSWORD=your-password \
  -e MYSQL_DATABASE=your-database \
  -e MYSQL_READ_ONLY=true \
  cnosuke/mcp-mysql:latest

使用Claude Desktop(Docker)

要使用Docker与Claude Desktop集成,请在您的 claude_desktop_config.json 文件:

{
  "mcpServers": {
    "mysql": {
      "command": "docker",
      "args": ["run", "-i", "--rm", "cnosuke/mcp-mysql:latest"],
      "env": {
        "MYSQL_HOST": "your-mysql-host",
        "MYSQL_PORT": "3306",
        "MYSQL_USER": "your-username",
        "MYSQL_PASSWORD": "your-password",
        "MYSQL_DATABASE": "your-database",
        "MYSQL_READ_ONLY": "false"
      }
    }
  }
}

构建和运行(Go Binary)

或者,您可以直接构建并运行Go二进制文件:

# Build the server
make

# Run the server
./bin/mcp-mysql server --config=config.yml

与Claude Desktop一起使用(Go Binary)

要使用Go二进制文件与Claude Desktop集成,请在您的 claude_desktop_config.json 文件:

{
  "mcpServers": {
    "mysql": {
      "command": "./bin/mcp-mysql",
      "args": ["server"],
      "env": {
        "LOG_PATH": "mcp-mysql.log",
        "DEBUG": "false",
        "MYSQL_HOST": "your-mysql-host",
        "MYSQL_PORT": "3306",
        "MYSQL_USER": "your-username",
        "MYSQL_PASSWORD": "your-password",
        "MYSQL_DATABASE": "your-database",
        "MYSQL_READ_ONLY": "false"
      }
    }
  }
}

Docker镜像详细信息

该项目使用谷歌的无发行版容器映像作为最终的Docker映像。这 gcr.io/distroless/static 基础图像提供:

  • 最小攻击面-仅包括必要的组件
  • 更小的映像大小-没有shell、包管理器或其他不必要的二进制文件
  • 提高了安全性-减少了潜在漏洞的数量

Docker镜像是使用多阶段构建过程构建的:

  1. 第一阶段使用Go Alpine构建应用程序
  2. 第二阶段仅使用编译后的二进制文件使用无发行版/静态

配置

服务器是通过YAML文件(默认:config.yml)或环境变量配置的:

log: 'path/to/mcp-mysql.log' # Log file path, if empty no log will be produced
debug: false # Enable debug mode for verbose logging

mysql:
  host: 'localhost'
  user: 'root'
  password: ''
  port: 3306
  database: ''
  dsn: ''
  read_only: false
  explain_check: false

连接选项

您可以通过三种方式指定MySQL连接详细信息(按优先级顺序):

  1. 刀具参数:通过a dsn 调用任何工具时,直接将参数发送到该工具
  2. 配置中的DSN:设置 mysql.dsn 配置文件中的值
  3. 个人参数:在配置文件中设置单个连接参数

如果没有以任何一种方式提供连接信息,服务器将返回一条错误消息,提示您提供连接详细信息。

配置选项

  • mysql.host:MySQL服务器主机名(默认值:“localhost”)
  • mysql.user:MySQL用户名(默认:“root”)
  • mysql.password:MySQL密码
  • mysql.port:MySQL端口(默认:3306)
  • mysql.database:MySQL数据库名称
  • mysql.dsn:MySQL DSN(数据源名称)字符串。如果提供,则会覆盖单个连接参数
  • mysql.read_only:启用只读模式。在此模式下,只有以开头的工具 list, read_ 和 desc_ 可用的
  • mysql.explain_check:检查查询计划 EXPLAIN 执行前

您可以使用环境变量覆盖配置:

  • LOG_PATH:日志文件的路径
  • DEBUG:启用调试模式(真/假)
  • MYSQL_HOST:MySQL服务器主机名
  • MYSQL_PORT:MySQL服务器端口
  • MYSQL_USER:MySQL用户名
  • MYSQL_PASSWORD:MySQL密码
  • MYSQL_DATABASE:MySQL数据库名称
  • MYSQL_DSN:MySQL DSN字符串
  • MYSQL_READ_ONLY:启用只读模式(真/假)
  • MYSQL_EXPLAIN_CHECK:启用查询计划检查(true/false)

日志记录

日志行为通过配置进行控制:

  • 如果 log 在配置文件中设置,日志将写入指定文件
  • 如果 log 为空,将不会生成日志
  • 集 debug: true 用于更详细的日志记录

MCP服务器工具

MCP客户端通过发送JSON-RPC请求来执行各种工具,从而与服务器进行交互。支持以下MCP工具:

架构工具

  1. list_database

    • 列出MySQL服务器中的所有数据库。
    • 参数:
      • dsn (可选):用于覆盖配置的MySQL DSN字符串。
    • 返回:匹配的数据库名称列表。
  2. list_table

    • 列出MySQL服务器中的所有表。
    • 参数:
      • dsn (可选):用于覆盖配置的MySQL DSN字符串。
    • 返回:匹配表名的列表。
  3. create_table (在只读模式下不可用)

    • 在MySQL服务器中创建一个新表。
    • 参数:
      • query:创建表的SQL查询。
      • dsn (可选):用于覆盖配置的MySQL DSN字符串。
    • 返回:受影响的x行。
  4. alter_table (在只读模式下不可用)

    • 更改MySQL服务器中的现有表。通知LLM不要删除现有的表或列。
    • 参数:
      • query:更改表的SQL查询。
      • dsn (可选):用于覆盖配置的MySQL DSN字符串。
    • 返回:受影响的x行。
  5. desc_table

    • 描述表格的结构。
    • 参数:
      • name:要描述的表的名称。
      • dsn (可选):用于覆盖配置的MySQL DSN字符串。
    • 返回值:表的结构。

数据工具

  1. read_query

    • 执行只读SQL查询。
    • 参数:
      • query:要执行的SQL查询。
      • dsn (可选):用于覆盖配置的MySQL DSN字符串。
    • 返回:查询的结果。
  2. write_query (在只读模式下不可用)

    • 执行写SQL查询。
    • 参数:
      • query:要执行的SQL查询。
      • dsn (可选):用于覆盖配置的MySQL DSN字符串。
    • 返回:受影响的x行,最后插入id:<last_insert_id>。
  3. update_query (在只读模式下不可用)

    • 执行更新SQL查询。
    • 参数:
      • query:要执行的SQL查询。
      • dsn (可选):用于覆盖配置的MySQL DSN字符串。
    • 返回:受影响的x行。
  4. delete_query (在只读模式下不可用)

    • 执行删除SQL查询。
    • 参数:
      • query:要执行的SQL查询。
      • dsn (可选):用于覆盖配置的MySQL DSN字符串。
    • 返回:受影响的x行。

MySQL DSN格式

这 dsn 参数或 mysql.dsn 配置选项可以以两种格式指定:

1.本机MySQL DSN格式

[username[:password]@][protocol[(address)]]/dbname[?param1=value1&...&paramN=valueN]

例子: username:password@tcp(localhost:3306)/mydb?parseTime=true&loc=Local

请参考 MySQL DSN 有关此格式的更多详细信息。

2.URL样式连接格式

mysql://username:password@hostname:port/dbname?param1=value1&param2=value2

例子: mysql://root:pass@localhost:3306/mydb?parseTime=true&loc=Local

此URL样式格式会自动转换为本机MySQL DSN格式。 支持的URL方案包括: mysql://, mariadb://.

命令行参数

启动服务器时,您可以指定各种设置:

./bin/mcp-mysql server [options]

选项:

  • --config, -c:配置文件的路径(默认:“config.yml”)。

贡献

欢迎投稿!请分叉存储库并提交改进或bug修复的pull请求。对于重大变化,先打开一个问题来讨论你的想法。

许可证

该项目根据MIT许可证获得许可。

作者:cnosuke(x.com/cnosuke)