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),服务器获取一次表/列元数据,缓存它,并将摘要注入MCP系统指令中,这样工具就可以知道结构,而无需发出list_tables反复。 - 通过接受连接信息
mysql_url论点 或Authorization: Bearer所以秘密永远不必写入磁盘。 - 为每个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:
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会话都会缓存授权标头,并在会话关闭时丢弃。