数据库连接协议服务器

一个轻量级的Model Context Protocol (MCP)服务器,用于连接MySQL和PostgreSQL数据库到编辑器中的LLM。

  • by krishnarg04
  • Rust
  • 本地部署
  • 更新于
在 GitHub 查看 krishnarg04/db-mcp

使用说明

db-mcp

轻量级 模型上下文协议(MCP) 用Rust编写的服务器,用于连接 MySQL 和 PostgreSQL 在编辑器内将数据库转换为LLM,例如 VS代码 和 泽德.


目录


概述

db-mcp 实现 模型上下文协议 超过 标准 (以换行符分隔的JSON-RPC 2.0)。当在编辑器中注册为MCP服务器时,它会公开一组AI助手可以调用的数据库工具:

  • 同时连接/断开与一个或多个数据库的连接
  • 持久保存连接凭据并按名称重新连接
  • 检查模式和表定义
  • 执行任意SQL查询并将结果作为结构化JSON返回

特性

  • 多数据库支持 --MySQL、MariaDB和PostgreSQL通过 sqlx
  • 多个同时连接 --一次打开多个数据库,并按名称在它们之间切换
  • 持久连接 --使用保存凭据 configure_server,只需一个名字即可立即重新连接
  • 符合MCP标准 --与任何使用模型上下文协议的编辑器或代理一起工作
  • 模式自省 --列出数据库、列表表、描述单个表或一次转储整个架构
  • 安全凭证编辑 --密码在所有日志输出和连接信息响应中都被屏蔽
  • 异步&轻量级 --建在东京;没有运行时依赖关系的单个二进制文件
  • 静态musl二进制可用 --复制到任何Linux机器或Docker容器,无需安装任何东西即可运行

先决条件

工具 版本
锈蚀 1.75或更高
货物 生锈的船只
正在运行的MySQL/MariaDB 或 PostgreSQL实例 任何最新版本

安装

来自源代码(glibc--默认)

git clone https://github.com/your-org/db-mcp.git
cd db-mcp
cargo build --release
# Binary is at ./target/release/db-mcp

源代码(完全静态musl二进制文件——建议分发)

# Add the musl target once
rustup target add x86_64-unknown-linux-musl

# Install the musl linker (Debian / Ubuntu)
sudo apt-get install -y musl-tools

# Build
cargo build --release --target x86_64-unknown-linux-musl
# Binary is at ./target/x86_64-unknown-linux-musl/release/db-mcp

# Verify it is fully static
ldd ./target/x86_64-unknown-linux-musl/release/db-mcp
# → statically linked

musl二进制文件具有 零运行时依赖关系 --没有glibc,没有OpenSSL,没有系统库。将其复制到任何x86-64 Linux机器或Docker容器中,并直接运行。

安装到PATH

cargo install --path .

配置

注册 db-mcp 作为编辑器中的MCP服务器,以便在编辑器启动时自动启动。

VS代码

将以下内容添加到您的 settings.json (或前往工作区 .vscode/settings.json):

{
  "mcp.servers": {
    "db-mcp": {
      "command": "/absolute/path/to/db-mcp",
      "args": [],
      "transport": "stdio"
    }
  }
}

泽德

将以下内容添加到您的 ~/.config/zed/settings.json:

{
  "context_servers": {
    "db-mcp": {
      "command": {
        "path": "/absolute/path/to/db-mcp",
        "args": []
      }
    }
  }
}

Qwen CLI

Qwen CLI从以下位置读取MCP服务器配置 ~/.qwen/settings.json.添加以下块:

{
  "mcpServers": {
    "db-mcp": {
      "command": "/absolute/path/to/db-mcp",
      "args": [],
      "transport": "stdio"
    }
  }
}

如果文件还不存在,请创建它:

mkdir -p ~/.qwen
touch ~/.qwen/settings.json

然后将上面的JSON粘贴到文件中。在下一个 qwen 调用 db-mcp 工具将自动可用。

提示: 您可以通过运行以下命令来验证服务器是否已加载 qwen mcp list — db-mcp 应该出现在输出中。

Gemini CLI

Gemini CLI从以下位置读取MCP服务器配置 ~/.gemini/settings.json.添加以下块:

{
  "mcpServers": {
    "db-mcp": {
      "command": "/absolute/path/to/db-mcp",
      "args": [],
      "transport": "stdio"
    }
  }
}

如果文件还不存在,请创建它:

mkdir -p ~/.gemini
touch ~/.gemini/settings.json

然后将上面的JSON粘贴到文件中。Gemini CLI将启动 db-mcp 自动作为子进程,并通过stdio与之通信。

提示: 您可以通过运行以下命令来验证服务器是否已加载 gemini mcp list — db-mcp 应该出现在输出中。


可用工具

注册后,以下工具将暴露给LLM:

工具 必需参数 描述
connect_database connection_string 或 saved_config_name 打开连接。可选择用以下标签标记 connection_name.
disconnect_database -- 通过以下方式关闭连接 connection_name,或第一个活动的。
get_database_info -- 返回连接的类型、主机和状态。
list_connections -- 列出当前打开的所有连接名称。
list_databases -- 列出连接用户可见的所有数据库/模式。
list_tables -- 列出连接数据库中的所有表。
describe_table table_name 返回列定义(名称、类型、可空性、默认值、键)。
get_full_schema -- 转储整个架构--每个表及其所有列。
execute_query sql 运行任何SQL。 SELECT/SHOW/EXPLAIN → JSON行; INSERT/UPDATE/DELETE → 行影响计数。
configure_server name, ip, port, username, password, dbtype 保存 连接详细信息 ~/.db-mcp/config.json 以备将来使用。

所有在连接上操作的工具都接受可选 connection_name 争论。 如果省略,则自动使用第一个打开的连接。


持久连接

db-mcp 可以将您的数据库凭据保存到配置文件中,这样您就不必再次键入它们。使用 configure_server 一次,然后在以后的任何会话中只使用一个名称重新连接。

保存连接

呼叫 configure_server 连接详细信息:

configure_server(
  name     = "pgdb",
  ip       = "127.0.0.1",
  port     = "5432",
  username = "user",
  password = "secret",
  dbtype   = "postgres",
  database = "pgdb"          ← optional; defaults to username if omitted
)

证书已写入 ~/.db-mcp/config.json 立即。该条目在重启后仍然有效-- db-mcp 每次启动时都会自动加载文件。

按名称重新连接

在以后的任何会话中,只使用保存的名称进行连接,不需要URL或凭据:

connect_database(saved_config_name = "pgdb")

# Give it a custom label for this session (optional)
connect_database(saved_config_name = "pgdb", connection_name = "production")

配置文件格式

文件是 换行符分隔的JSON (每行一个紧凑的JSON对象)。每行代表一个已保存的连接:

{"name":"pgdb","ip":"127.0.0.1","port":5432,"username":"root","password":"secret","dbtype":"postgres","database":"sasdb"}
{"name":"local-mysql","ip":"127.0.0.1","port":3306,"username":"dev","password":"devpass","dbtype":"mysql","database":"appdb"}
字段 类型 描述
name string 用于重新连接的唯一标识符
ip string 数据库服务器的主机名或IP地址
port number 端口号(5432 对于PostgreSQL, 3306 MySQL)
username string 数据库用户名
password string 数据库密码
dbtype 字符串 "postgres" 或 "mysql"
database string 目标数据库/架构。对于PostgreSQL,默认为 username 如果为空

PostgreSQL默认数据库: 如果 database 如果为空,PostgreSQL将连接到数据库 随着 与用户名同名 (标准libpq行为)。始终指定 database 明确地避免意外。

配置文件位置

平台 路径
Linux/macOS ~/.db-mcp/config.json
回退(否 $HOME) ./db_config.json (当前工作目录)

父目录 ~/.db-mcp/ 在第一次写入时自动创建。

手动编辑配置文件

您可以使用任何文本编辑器直接在文件中添加、编辑或删除条目。遵循的规则:

  • 每行一个JSON对象 --不要使用漂亮的打印/多行JSON。
  • 所有七个字段都应该存在; database 可能是空字符串 "".
  • 重复 name 值:文件中的最后一个在加载时获胜。
  • 删除一行会永久删除已保存的连接。

示例--手动添加新条目:

echo '{"name":"staging","ip":"192.168.1.50","port":5432,"username":"app","password":"apppass","dbtype":"postgres","database":"stagingdb"}' \
  >> ~/.db-mcp/config.json

使用示例

使用URL连接

connect_database(connection_string = "postgres://alice:secret@localhost:5432/mydb")

使用URL连接并为其添加标签

connect_database(
  connection_string = "mysql://root:pass@127.0.0.1:3306/shop",
  connection_name   = "local-shop"
)

保存凭据以备后用

configure_server(
  name     = "pgdevdb",
  ip       = "localhost",
  port     = "5432",
  username = "postgres",
  password = "postgres",
  dbtype   = "postgres",
  database = "myapp"
)

使用已保存的名称重新连接

connect_database(saved_config_name = "pgdevdb")

同时处理多个连接

connect_database(saved_config_name = "pgdevdb",    connection_name = "dev")
connect_database(saved_config_name = "pgdb",   connection_name = "prod")

list_connections()
# → { "connections": ["dev", "prod"] }

list_tables(connection_name = "dev")
execute_query(connection_name = "prod", sql = "SELECT COUNT(*) FROM orders")

列出所有表格

list_tables()

描述一张桌子

describe_table(table_name = "orders")

运行查询

execute_query(sql = "SELECT id, name, created_at FROM users WHERE active = true LIMIT 20")

断开特定连接

disconnect_database(connection_name = "prod")

项目结构

db-mcp/
├── Cargo.toml          # Package manifest & dependencies
├── Cargo.lock
└── src/
    ├── main.rs         # Entry point — JSON-RPC 2.0 stdio loop
    ├── db.rs           # Multi-connection state, db operations, schema introspection
    ├── tools.rs        # MCP tool definitions (list) and dispatch logic
    ├── protocol.rs     # JSON-RPC & MCP protocol types and helpers
    └── config.rs       # Persistent connection config — load/save ~/.db-mcp/config.json

模块职责

  • main.rs --从stdin读取换行符分隔的JSON-RPC,分派给处理程序,将响应写入stdout。手柄 initialize, ping, tools/list,以及 tools/call MCP方法。
  • db.rs --拥有 ConfigVsDBstate 一 HashMap<name → SharedState>)以及 DbState (池+数据库类型+每个连接的URL)。通过以下方式实现所有异步数据库操作 sqlx::AnyPool 因此,MySQL和PostgreSQL都使用相同的代码路径。
  • tools.rs --声明返回给客户端的MCP工具清单,实现 resolve_state_for_name 按可选名称查找连接,并为每个连接路由 tools/call 请求正确 db.rs 功能。
  • protocol.rs --轻量级JSON-RPC 2.0请求/响应结构和MCP助手构建器(tool_ok, tool_err, make_tool, str_prop).
  • config.rs --负载 ~/.db-mcp/config.json 启动时,暴露 configure_server (坚持)和 add_temporary_entry (仅限会话),并提供 get_connection_url 以从保存的条目重建连接URL。

从源头构建

# Debug build (faster compile, slower binary)
cargo build

# Release build (optimised)
cargo build --release

# Fully static musl build (runs on any x86-64 Linux, no dependencies)
cargo build --release --target x86_64-unknown-linux-musl

# Run directly
cargo run

# Run with verbose logging
RUST_LOG=db_mcp=debug cargo run

一次性musl设置

rustup target add x86_64-unknown-linux-musl   # add Rust target
sudo apt-get install -y musl-tools             # install musl-gcc linker

二进制位置

构建 路径
调试 target/debug/db-mcp
释放(glibc) target/release/db-mcp
释放(musl,静态) target/x86_64-unknown-linux-musl/release/db-mcp

环境变量

变量 默认值 描述
RUST_LOG db_mcp=info 日志级别筛选器。日志被写入 标准错误 所以它们永远不会污染MCP stdio信道。例子: RUST_LOG=db_mcp=debug

连接字符串格式

# PostgreSQL
postgres://username:password@host:5432/database

# MySQL / MariaDB
mysql://username:password@host:3306/database

PostgreSQL默认数据库: 省略数据库段(postgres://user:pass@host:5432/) 使PostgreSQL连接到数据库 与用户名同名. 始终明确包含数据库名称。

安全说明: 连接字符串包含凭据。避免将它们提交到版本 控制。使用 configure_server 将它们存储在 ~/.db-mcp/config.json 相反,或通过 通过编辑器的MCP服务器配置,在运行时执行这些操作。


依赖项

板条箱 用途
tokio 异步运行时
serde / serde_json JSON序列化
sqlx 异步数据库驱动程序(MySQL+PostgreSQL)
anyhow 人体工程学错误处理
tracing / tracing-subscriber 结构化日志记录到stderr