MySQL连接池服务

基于Go的MySQL连接池服务,通过HTTP接口暴露数据库连接管理功能,支持表结构查询和SQL执行。

  • by MrDong0410
  • Go
  • 本地部署
  • 更新于
在 GitHub 查看 MrDong0410/db_mcp_server

使用说明

db_mcp_server

基于 Go 的 MySQL MCP Server。当前实现通过 streamable_http 暴露 /mcp 接口,并根据请求头里的 app 字段路由到不同的数据库连接。

当前实现

  • 传输方式:streamable_http
  • 默认监听地址::8080
  • MCP 路径:/mcp
  • 数据源:MySQL
  • 工具数量:2 个
    • get_db_schema
    • execute_sql

重要约束

  • 服务启动时会读取固定文件 local_app.json
  • 数据库连接不是通过命令行参数动态传入,而是预先写在配置文件里
  • 每个 MCP 请求都必须带上 HTTP Header app: <name>
  • app 的值必须与配置文件 db_config[].app 完全一致
  • execute_sql 只允许执行 SELECT 语句

配置文件

项目内的 app.json 可以作为模板,实际启动时读取的是 local_app.json。

如果本地还没有这个文件,可以先复制一份:

cp app.json local_app.json

示例:

{
  "server_name": "mysql-mcp-server",
  "addr": ":8080",
  "version": "1.0.0",
  "db_config": [
    {
      "app": "playmate",
      "host": "127.0.0.1",
      "port": 3306,
      "user": "root",
      "password": "your-password",
      "database": "your-database",
      "charset": "utf8mb4"
    }
  ]
}

字段说明:

  • server_name:MCP Server 名称
  • addr:HTTP 监听地址
  • version:服务版本
  • db_config:数据库连接列表
  • db_config[].app:客户端请求头里的应用标识

启动

直接运行:

go run .

或先编译再启动:

go build -o ./bin/db_mcp_server .
./bin/db_mcp_server

启动后默认监听:

http://localhost:8080/mcp

MCP 请求要求

服务端在 app/service.go 中强制校验 app 请求头。

例如:

app: playmate

如果请求里没有这个头,服务会直接返回 400 Bad Request。如果 app 没有匹配到配置中的数据库,后续工具调用也无法正确执行。

可用工具

1. get_db_schema

用途:读取当前数据库的表和字段信息。

输入参数:无

返回结果:JSON 字符串,结构类似:

{
  "users": [
    {
      "column": "id",
      "type": "bigint"
    },
    {
      "column": "name",
      "type": "varchar(255)"
    }
  ]
}

2. execute_sql

用途:执行查询 SQL。

输入参数:

{
  "sql": "SELECT * FROM users LIMIT 10"
}

约束:

  • 只允许 SELECT
  • 不允许 INSERT、UPDATE、DELETE、DROP 等写操作
  • 当前代码不会自动追加 LIMIT,查询范围需要客户端自己控制

返回结果:查询结果的 JSON 字符串;如果无结果,返回 查询结果为空

代码结构

  • main.go:加载配置并启动 HTTP 服务
  • app/service.go:创建 MCP Server,挂载 /mcp,校验 app 请求头
  • db/db.go:注册工具并处理 SQL/schema 查询
  • res/db.go:初始化 MySQL 连接池

注意事项

  • local_app.json 是当前启动所依赖的本地配置文件
  • app.json 更适合作为模板,不建议把真实账号密码直接提交到仓库
  • 仓库里还有一些 Python 脚本,但当前 Go 服务入口仍然是 main.go