MySQL查询服务器

一个基于Model Context Protocol的MySQL查询服务器,提供只读SQL执行、表结构查询和自动模式快照功能,适用于需要安全访问MySQL数据库的场景。

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

使用说明

MySQL MCP服务器(FastMCP风格)

一个模型上下文协议服务器,它镜像了困惑HTTP传输,但对用户提供的MySQL URL执行只读SQL。该服务器重用来自 @modelcontextprotocol/sdk,因此它可以在本地或Fly.io或Heroku等平台上运行,并可供任何符合MCP的客户端使用。

特性

  • mysql_query:运行带有自动写保护和定时信息的只读SQL(SELECT/SHOW/DESCRIBE/EXPLAIN)。
  • list_tables:枚举嵌入在数据库中的用户表 mysql_url,包括行数、存储统计数据和内联 columns 每个表的数组;始终先运行此程序,以便您可以复制的确切表名 mysql_query.
  • 自动架构快照:当会话初始化时 Authorization: Bearer <mysql-url> (或默认的MySQL URL),服务器获取一次表/列元数据,缓存它,并将摘要注入MCP系统指令中,这样工具就可以知道结构,而无需发出 list_tables 反复。
  • 通过接受连接信息 mysql_url 论点 或 Authorization: Bearer <mysql-url> 所以秘密永远不必写入磁盘。
  • 为每个MCP会话缓存承载派生的URL,因此SSE/可流式传输客户端只需发送一次标头。
  • 暴露 /mcp 流式HTTP传输加上轻量级REST助手(/tools, /tools/call, /health).

配置

变量 默认值 描述
PORT 3333 REST和MCP端点的HTTP端口。
HOST 0.0.0.0 要绑定的接口
MYSQL_MCP_SERVER_NAME customgpt/mysql-mcp MCP客户端显示的标识符。
MYSQL_MCP_SERVER_VERSION 0.1.0 向客户端报告的版本字符串。
MCP_DEFAULT_MYSQL_URL 取消设置 当两者都没有使用时,使用可选的回退MySQL URL mysql_url 也不存在授权标头。
MYSQL_QUERY_TIMEOUT_MS 60000 连接和查询超时(毫秒)。
MYSQL_SCHEMA_MAX_TABLES 12 缓存模式快照中包含的最大表数(以保持指令紧凑)。
MYSQL_SCHEMA_MAX_COLUMNS 12 架构快照中每个表的最大列数。

创建一个 .env 文件(或在运行时注入env-vars)中包含任何机密,例如:

HOST=0.0.0.0
PORT=3333
MCP_DEFAULT_MYSQL_URL=mysql://user:pass@db.internal:3306/sandbox
MYSQL_QUERY_TIMEOUT_MS=60000

安装和本地开发

npm install
npm run build
npm start

服务器日志 MySQL MCP server listening on http://0.0.0.0:3333。可用的辅助端点:

  • GET / –服务元数据+工具名称
  • GET /health –正常运行时间和状态
  • GET /tools –工具定义
  • POST /tools/call –在没有完整MCP客户端的情况下调用工具
  • POST|GET|DELETE /mcp –MCP的流式HTTP传输

通过REST调用工具

curl -X POST http://localhost:3333/tools/call \
  -H "Content-Type: application/json" \
  -H "Authorization: Bearer mysql://user:pass@host:3306/db" \
  -d '{
        "name": "mysql_query",
        "arguments": {
          "sql": "SELECT * FROM users LIMIT 5"
        }
      }'

# List the available tables (each entry now includes a columns array)
curl -X POST http://localhost:3333/tools/call \
  -H "Content-Type: application/json" \
  -H "Authorization: Bearer mysql://user:pass@host:3306/db" \
  -d '{"name":"list_tables"}'

Use the table names from `list_tables` verbatim when crafting `mysql_query` statements to avoid typos.

> **Heads-up:** include the target database in your `mysql_url` (e.g., `mysql://user:pass@host:3306/analytics`) so `list_tables` can scope its output properly.

### Using the MCP Transport

Any MCP client that supports the Streamable HTTP transport can connect:

```ts
import { ClientSession } from "mcp";
import { streamablehttp_client } from "mcp/client/streamable_http";

const url = "http://localhost:3333/mcp";

const main = async () => {
  const headers = {
    Authorization: "Bearer mysql://user:pass@host:3306/db"
  };

  const [read, write, close] = await streamablehttp_client(url, { headers });
  const session = new ClientSession(read, write);
  await session.initialize();
  const tools = await session.list_tools();
  await close();
};

main();

部署说明

  • 适用于Node.js 18+。
  • 除此之外,没有捆绑数据库驱动程序 mysql2,因此目标数据库必须使用MySQL协议。
  • 所有查询都以显式方式运行 START TRANSACTION / ROLLBACK 块与 SET SESSION TRANSACTION READ ONLY 以防止突变。
  • 每个MCP会话都会缓存授权标头,并在会话关闭时丢弃。