# dm-mcp **Repository Path**: rhubarbyes/dm-mcp ## Basic Information - **Project Name**: dm-mcp - **Description**: No description available - **Primary Language**: Unknown - **License**: Not specified - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 0 - **Created**: 2026-04-20 - **Last Updated**: 2026-04-21 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README ### 达梦数据库 MCP 服务 一个基于 Go 实现的达梦数据库 MCP Server,采用 **STDIO** 模式与 MCP Client 通信,适合在 CodeBuddy、Claude Desktop、Cherry Studio 等支持 MCP 的客户端中接入达梦数据库只读查询与元数据检索能力。 ### 项目能力 当前服务已提供以下能力: - **列出 Schema**:查看当前实例下可见的 schema(模式)及表数量。 - **列出表**:查看指定 schema 下的所有表。 - **查找表所在 Schema**:支持按表名精确或模糊搜索。 - **查看表结构**:查看字段名、类型、长度、是否可空等信息。 - **查看列详情**:查看字段类型、精度、小数位、注释等更完整信息。 - **查看索引信息**:查看索引类型、唯一性、索引列、状态等。 - **查看表统计信息**:查看行数、数据块数、平均行长度、索引数量、外键数量、注释等。 - **执行只读 SQL**:仅允许 `SELECT`、`SHOW`、`DESCRIBE`、`EXPLAIN`。 - **查看连接池状态**:查看数据库连接池当前使用情况与等待统计。 ### 运行方式 本项目是 **STDIO 型 MCP Server**: - **不是 HTTP 服务**,不会监听 Web 端口提供接口。 - **由 MCP Client 以子进程方式启动**。 - **客户端通过标准输入/标准输出与服务通信**。 程序入口在 `main.go`,启动后会注册全部工具并通过 `server.ServeStdio(...)` 提供 MCP 能力。 ### 环境要求 - **Go**:`1.23.4` 或更高版本 - **达梦数据库**:可正常访问的实例 - **数据库驱动**:`github.com/wangzhaobo168/dm` - **MCP 框架**:`github.com/mark3labs/mcp-go` ### 安装方式 ### 方式一:直接安装 ```bash go install github.com/wangzhaobo168/dm-mcp-server@latest ``` 安装完成后,可执行文件名通常为 `dm-mcp-server`。Windows 用户可将其加入 `PATH`,方便 MCP Client 直接调用。 ### 方式二:源码运行 ```bash git clone https://gitee.com/rhubarbyes/dm-mcp.git cd dm-mcp go mod tidy go run . ``` ### 配置方式 服务支持 **命令行参数** 和 **环境变量** 两种配置方式。 ### 配置优先级 配置读取优先级如下: ```text 命令行参数 > 环境变量 > 默认值 ``` 当前只有 `DM_PORT` 存在默认值:`5236`。 ### 环境变量 | 变量名 | 是否必填 | 默认值 | 说明 | | --- | --- | --- | --- | | `DM_HOST` | 是 | 无 | 达梦数据库主机地址 | | `DM_PORT` | 否 | `5236` | 达梦数据库端口 | | `DM_USERNAME` | 是 | 无 | 达梦数据库用户名 | | `DM_PASSWORD` | 是 | 无 | 达梦数据库密码 | | `DM_SCHEMA` | 建议填写 | 无 | 默认 schema / owner | ### 命令行参数 | 参数 | 是否必填 | 说明 | | --- | --- | --- | | `-host` | 是 | 达梦数据库主机地址 | | `-port` | 否 | 达梦数据库端口,默认 `5236` | | `-username` | 是 | 达梦数据库用户名 | | `-password` | 是 | 达梦数据库密码 | | `-schema` | 建议填写 | 默认 schema / owner | | `-version` | 否 | 输出版本号并退出 | ### 启动示例 ### 使用环境变量启动 ```bash set DM_HOST=192.168.0.68 set DM_PORT=5236 set DM_USERNAME=SYSDBA set DM_PASSWORD=your_password set DM_SCHEMA=DMP_BASE dm-mcp-server ``` ### 使用命令行参数启动 ```bash dm-mcp-server -host 192.168.0.68 -port 5236 -username SYSDBA -password your_password -schema DMP_BASE ``` ### 查看版本 ```bash dm-mcp-server -version ``` ### MCP Client 配置示例 下面是一个典型的 MCP Client 配置片段: ```json { "mcpServers": { "dm-mcp-server": { "command": "dm-mcp-server", "args": [], "env": { "DM_HOST": "192.168.0.68", "DM_PORT": "5236", "DM_USERNAME": "SYSDBA", "DM_PASSWORD": "your_password", "DM_SCHEMA": "DMP_BASE" } } } } ``` 如果不希望在 `env` 中写账号密码,也可以改为在 `args` 中传入: ```json { "mcpServers": { "dm-mcp-server": { "command": "dm-mcp-server", "args": [ "-host", "192.168.0.68", "-port", "5236", "-username", "SYSDBA", "-password", "your_password", "-schema", "DMP_BASE" ] } } } ``` ### 工具列表 当前版本共注册 **9 个工具**: | 工具名 | 主要参数 | 说明 | 返回结果 | | --- | --- | --- | --- | | `list_databases` | 无 | 列出当前实例可见的所有 schema(模式)及表数量 | 文本列表 | | `list_tables` | `database`(可选) | 列出指定 schema 下的所有表;未传时使用 `DM_SCHEMA` | 逗号分隔的表名文本 | | `find_schema` | `table`(必填) | 根据表名精确或模糊查找所在 schema | 分组文本结果 | | `describe_table` | `table`(必填),`database`(可选) | 显示表结构,包含字段名、类型、长度、是否可空 | 按行输出字段定义 | | `list_columns` | `table`(必填),`schema` / `database`(可选) | 显示列明细,包含类型、长度、精度、小数位、可空、注释 | 文本表格 | | `list_indexes` | `table`(必填),`schema` / `database`(可选) | 显示表索引信息,包含索引名、类型、唯一性、列名、状态 | 文本表格 | | `show_table_stats` | `table`(必填),`schema` / `database`(可选) | 显示表统计信息,如行数、块数、平均行长度、索引数、外键数、注释等 | 分段文本 | | `execute_query` | `query`(必填),`database`(可选) | 执行只读 SQL 查询 | 表头 + 数据行文本 | | `get_pool_stats` | 无 | 查看数据库连接池状态和等待统计 | 连接池状态文本 | ### 参数语义说明 由于项目最初沿用了 `database` 这个命名,但在达梦数据库的实际查询中,很多工具内部是按 **schema / owner** 去检索系统视图,因此需要特别说明: - `list_databases` 实际列出的是 **schema(模式)**,不是独立数据库实例。 - `list_tables`、`describe_table` 中的 `database` 参数,实际用于匹配 **schema / owner**。 - `list_columns`、`list_indexes`、`show_table_stats` 同时兼容 `schema` 和 `database` 两个参数名,其中 `schema` 语义更准确。 如果你的 MCP Client 支持结构化参数配置,**建议优先使用 `schema` 概念来理解这些工具**。 ### `execute_query` 使用限制 `execute_query` 是只读查询工具,使用时请注意: - **仅允许**:`SELECT`、`SHOW`、`DESCRIBE`、`EXPLAIN` - **禁止**:`INSERT`、`UPDATE`、`DELETE`、`ALTER`、`DROP` 等写操作 - **默认查询超时**:`30s` - **最大返回行数**:`10000` - **不会自动执行 `SET SCHEMA`** 为了避免并发场景下 schema 切换带来的副作用,项目当前不会在执行 SQL 前自动切换 schema。**建议在 SQL 中使用完整表名**,例如: ```sql SELECT * FROM DMP_BASE.USER_INFO WHERE ROWNUM <= 10; ``` 如果结果超过 `10000` 行,工具会截断返回,并提示你增加过滤条件或显式添加 `LIMIT`/分页逻辑。 ### 连接池与可观测性 项目内置了数据库连接池与健康检查机制,默认配置如下: | 配置项 | 默认值 | | --- | --- | | 最大打开连接数 | `100` | | 最大空闲连接数 | `20` | | 连接最大生命周期 | `10m` | | 连接最大空闲时间 | `5m` | | 健康检查间隔 | `30s` | 连接池特性: - **全局单例连接池**,避免重复建连。 - **自动健康检查**,定期 `Ping` 数据库。 - **失败自动重连**,连接不可用时自动关闭并重建。 - **优雅关闭**,进程收到 `SIGTERM` 或中断信号时会关闭连接池。 你可以通过 `get_pool_stats` 工具查看: - 当前连接池状态 - 最大连接数 - 打开连接数 - 使用中连接数 - 空闲连接数 - 等待次数与等待时长 - 因空闲/生命周期关闭的连接数 ### 项目结构 ```text dm-mcp/ ├── main.go # 服务入口与工具注册 ├── go.mod # Go 模块定义 ├── README.md # 项目文档 ├── tools/ │ ├── describe_table.go # 表结构查询 │ ├── execute_query.go # 只读 SQL 查询 │ ├── find_schema.go # 按表名查找 schema │ ├── get_pool_stats.go # 连接池统计 │ ├── list_columns.go # 列详情查询 │ ├── list_databases.go # schema 列表 │ ├── list_indexes.go # 索引信息查询 │ ├── list_tables.go # 表列表查询 │ └── show_table_stats.go # 表统计信息 └── utils/ ├── config.go # 配置与默认值 ├── db.go # 数据库连接池 └── errors.go # 错误信息封装 ``` ### 开发说明 ### 本地构建 ```bash go build -o dm-mcp-server . ``` ### 本地测试 ```bash go test ./... ``` ### 扩展新工具 如果需要新增 MCP 工具,可按以下步骤扩展: - 在 `tools/` 目录新增工具定义与处理函数。 - 在 `main.go` 中注册新工具。 - 如涉及配置或连接逻辑,按需更新 `utils/config.go` 或 `utils/db.go`。 - 同步更新 `README.md`,保证工具说明与代码保持一致。 ### 注意事项 - 当前服务设计目标是 **只读访问达梦数据库**。 - 如果未设置 `DM_SCHEMA`,部分依赖默认 schema 的工具需要显式传参。 - 返回结果目前以 **纯文本** 为主,而不是结构化 JSON。 - 某些查询语句最好显式写出 `schema.table`,以避免默认 schema 不一致造成歧义。 ### 贡献指南 欢迎提交 Issue 和 Pull Request。提交前建议至少完成以下检查: - `go test ./...` - 文档与工具实现保持一致 - 新增工具时补齐参数与使用说明 ### 许可证 本项目采用 [MIT License](LICENSE)。