universal-db-mcp更新:MCP数据库连接器支持动态自然语言查询
速览
MCP数据库万能连接器universal-db-mcp发布2.14.0更新,主要解决MCP stdio模式下数据库连接参数必须写死的问题。新增connect_database、disconnect_database和get_connection_status三个tool,支持零配置启动,AI可在对话中动态连接、切换或断开数据库,无需手动修改配置文件。该更新向后兼容,用户可沿用原有配置方式。
AI 深度解读
背景
universal-db-mcp 是一个开源的 MCP(Model Context Protocol)数据库万能连接器,旨在让用户通过自然语言查询和分析数据。它支持多种运行模式(MCP stdio、HTTP REST API、HTTP SSE、HTTP Streamable),并适配 17 种数据库类型。项目持续迭代,本次更新日志包含两个版本:v2.14.0 和 v2.13.0,分别解决动态数据库连接切换和进程挂起问题。
核心内容
v2.14.0 — 新增 MCP stdio 模式动态数据库连接
问题背景
在 MCP stdio 模式下,数据库连接参数必须在 Claude Desktop 的 claude_desktop_config.json 中写死(如 --type mysql、--host 等)。用户每次切换数据库需要手动修改配置文件并重启 MCP 服务,无法在对话中动态切换。而其他模式(HTTP REST、SSE、Streamable)已支持通过请求参数动态连接。
解决方案
修改了两个核心文件:src/mcp/mcp-server.ts 和 src/mcp/mcp-index.ts,新增三个 MCP Tool:
connect_database:动态连接任意数据库(支持全部 17 种类型),已有连接时自动断开旧连接。disconnect_database:断开当前连接。get_connection_status:查看当前连接状态(类型、地址、权限模式、缓存状态)。
关键设计:
- 构造函数中的
config参数改为可选(DbConfig | null),支持无连接参数启动。 start()方法条件执行:有 adapter 则连接,无则进入无连接模式。- 连接管理 tool(connect/disconnect/status)不检查数据库连接状态,始终可用。
- 数据操作 tool(如
execute_query)在未连接时返回引导信息:“请先使用 connect_database 工具连接数据库”。 connect_database内部复用已有的createAdapter()工厂函数,自动支持所有适配器。
用户使用差异
- 改动前:必须写死连接参数,切换数据库需改配置重启。
- 改动后方式 A(零配置启动):
args中只填写["universal-db-mcp"],在对话中由 AI 自动调用connect_database等 tool 来连接或切换数据库。 - 改动后方式 B(向后兼容):带默认连接参数启动时行为不变,仍可在对话中动态切换。
示例场景
用户直接说:“帮我连接 192.168.1.100 的 MySQL,用户名 root,密码 123456,数据库 order_db”。AI 自动调用 connect_database 完成连接。后续可随时切换数据库或查看状态。
v2.13.0 — 修复 stdio MCP server 在客户端关闭会话后进程挂起的问题
问题描述
当 universal-db-mcp 作为 stdio MCP server 被 Codex CLI 调用时,用户执行 /exit 后终端提示符不返回,进程挂起,需手动 Ctrl+C。
原因分析
- 未监听
process.stdin的end/close事件,客户端关闭 stdin 管道时服务端无感知。 stop()方法缺少this.server.close()调用,transport 层资源(stdin/stdout 监听器)未被释放。- 关闭过程中没有超时保护,数据库断连或
server.close()挂起时无法强制退出。 - 没有重入保护,多个退出信号(如 stdin close + SIGINT)可能导致
stop()被重复执行。
修改内容
src/mcp/mcp-server.ts:在stop()中增加this.server.close()调用。src/mcp/mcp-index.ts:添加统一 graceful shutdown 逻辑 + stdin 监听,仅影响 stdio 模式。
修改后效果
- Codex CLI
/exit(stdin 关闭):触发process.stdin'end' 事件 → 调用gracefulShutdown→ 释放 transport、关闭数据库连接池 → 进程正常退出。 Ctrl+C(SIGINT)、SIGTERM:同样触发 graceful shutdown。- 数据库断连或
server.close()挂起:5 秒超时保护强制退出。 - 多信号并发:重入保护确保只执行一次 shutdown。
影响范围
- stdio 模式直接修复。
- SSE 和 Streamable HTTP 模式间接受益(
cleanupSession()调用stop()后现在会正确关闭 MCP Server)。 - REST API 模式不受影响(有独立 shutdown 逻辑)。
关键要点
- v2.14.0 核心:在 MCP stdio 模式下实现零配置启动,通过三个新增 tool 让 AI 在对话中动态连接、切换和查看数据库,无需手动修改配置文件。
- 向后兼容:带默认连接参数启动的行为完全不变,用户可逐步迁移。
- 改动最小化:仅修改两个文件,不涉及适配器层、HTTP 层或类型定义层;所有 17 种数据库适配器自动受益。
- v2.13.0 核心:修复 stdio 模式下的进程挂起问题,通过完善
stop()方法、添加 stdin 关闭监听、超时保护和重入保护解决。 - 全模式兼容:修复同时提升了 SSE 和 Streamable HTTP 模式的资源清理完整性,REST API 不受影响。
- Windows 友好:依赖 stdin 关闭检测父进程退出,而非 POSIX-only 的信号机制。
- 超时兜底:5 秒超时保护防止 shutdown 过程本身挂起。
意义与影响
- 用户体验提升:v2.14.0 让用户无需提前配置数据库连接,可直接用自然语言告知 AI 要连哪个数据库,并在对话中灵活切换,极大简化了多数据库环境下的操作流程。v2.13.0 解决了令人困扰的进程挂起问题,使
universal-db-mcp在 Codex CLI 等工具中稳定运行。 - 开发效率优化:两项更新都遵循“改动最小化”原则,新增功能不破坏现有架构,修复问题不影响已有功能,降低了维护成本。
- 生态兼容性:
connect_database自动继承所有已有适配器,后续新增数据库类型时无需额外适配。v2.13.0 的 graceful shutdown 逻辑适用于所有传输模式,为未来增加新传输层提供了可复用的基础。 - 社区反馈驱动:两个更新均源自用户真实 issue(
@user1477报告进程挂起问题),体现了开源项目对社区需求的快速响应。
