10 changed files with 990 additions and 150 deletions
@ -1,140 +1,15 @@ |
|||||
package vTool |
package vTool |
||||
|
|
||||
import ( |
import ( |
||||
"context" |
|
||||
"github.com/mark3labs/mcp-go/mcp" |
|
||||
"github.com/mark3labs/mcp-go/server" |
"github.com/mark3labs/mcp-go/server" |
||||
"mcp-go-db/vConfig" |
"mcp-go-db/vConfig" |
||||
"mcp-go-db/vService" |
"mcp-go-db/vService" |
||||
) |
) |
||||
|
|
||||
func Run(s *server.MCPServer, dbSvc *vService.DMDBService, config *vConfig.Config) { |
func Run(s *server.MCPServer, dbSvc *vService.DMDBService, config *vConfig.Config) { |
||||
// 添加数据库工具
|
// 注册war包部署工具
|
||||
dbTools := []mcp.Tool{ |
RegisterWarTools(s, config) |
||||
DBInfoTool("数据库配置信息"), |
|
||||
AllTableTool(config, "获取所有表"), |
|
||||
FetchDataTool(config, "获取表数据"), |
|
||||
AddCommentTool(config, "添加注释"), |
|
||||
AddColumnTool(config, "添加字段"), |
|
||||
DropColumnTool(config, "删除字段"), |
|
||||
} |
|
||||
|
|
||||
// 注册工具处理程序
|
|
||||
for _, tool := range dbTools { |
|
||||
s.AddTool(tool, func(ctx context.Context, request mcp.CallToolRequest) (*mcp.CallToolResult, error) { |
|
||||
switch request.Params.Name { |
|
||||
case "数据库配置信息": |
|
||||
return DBInfo(config) |
|
||||
case "获取所有表": |
|
||||
return AllTable(ctx, request, dbSvc) |
|
||||
case "获取表数据": |
|
||||
return FetchData(ctx, request, dbSvc) |
|
||||
case "添加注释": |
|
||||
return AddComment(ctx, request, dbSvc) |
|
||||
case "添加字段": |
|
||||
return AddColumn(ctx, request, dbSvc) |
|
||||
case "删除字段": |
|
||||
return DropColumn(ctx, request, dbSvc) |
|
||||
} |
|
||||
|
|
||||
return mcp.NewToolResultError("未知操作"), nil |
|
||||
}) |
|
||||
} |
|
||||
} |
|
||||
|
|
||||
func DBInfoTool(name string) mcp.Tool { |
|
||||
return mcp.NewTool(name, /* "数据库配置信息" */ |
|
||||
mcp.WithDescription("数据库配置信息"), |
|
||||
) |
|
||||
} |
|
||||
func AddColumnTool(config *vConfig.Config, name string) mcp.Tool { |
|
||||
return mcp.NewTool(name, /* "添加字段" */ |
|
||||
mcp.WithDescription("为表添加新字段"), |
|
||||
mcp.WithString("库名", |
|
||||
mcp.Required(), |
|
||||
mcp.Description("被操作的数据库"), |
|
||||
mcp.DefaultString(config.Schema), |
|
||||
), |
|
||||
mcp.WithString("表名", |
|
||||
mcp.Required(), |
|
||||
mcp.Description("被操作的数据库的表名"), |
|
||||
), |
|
||||
mcp.WithString("字段名", |
|
||||
mcp.Required(), |
|
||||
mcp.Description("被操作的数据库的表内的字段名"), |
|
||||
), |
|
||||
mcp.WithString("字段类型", |
|
||||
mcp.Required(), |
|
||||
mcp.Description("被操作的数据库的表内的字段类型"), |
|
||||
), |
|
||||
) |
|
||||
} |
|
||||
|
|
||||
func DropColumnTool(config *vConfig.Config, name string) mcp.Tool { |
// 注册数据库工具
|
||||
return mcp.NewTool(name, /* "删除字段" */ |
RegisterDBTools(s, dbSvc, config) |
||||
mcp.WithDescription("从表删除字段"), |
|
||||
mcp.WithString("库名", |
|
||||
mcp.Required(), |
|
||||
mcp.Description("被操作的数据库"), |
|
||||
mcp.DefaultString(config.Schema), |
|
||||
), |
|
||||
mcp.WithString("表名", |
|
||||
mcp.Required(), |
|
||||
mcp.Description("被操作的数据库的表内的字段名"), |
|
||||
), |
|
||||
mcp.WithString("字段名", |
|
||||
mcp.Required(), |
|
||||
mcp.Description("被操作的数据库的表内的字段名"), |
|
||||
), |
|
||||
) |
|
||||
} |
|
||||
|
|
||||
func AllTableTool(config *vConfig.Config, name string) mcp.Tool { |
|
||||
return mcp.NewTool(name, /* "获取所有表" */ |
|
||||
mcp.WithDescription("从指定表获取数据"), |
|
||||
mcp.WithString("库名", |
|
||||
mcp.Required(), |
|
||||
mcp.Description("被操作的数据库"), |
|
||||
mcp.DefaultString(config.Schema), |
|
||||
), |
|
||||
) |
|
||||
} |
|
||||
|
|
||||
func AddCommentTool(config *vConfig.Config, name string) mcp.Tool { |
|
||||
return mcp.NewTool(name, /* "添加注释" */ |
|
||||
mcp.WithDescription("为表的字段添加新注释"), |
|
||||
mcp.WithString("库名", |
|
||||
mcp.Required(), |
|
||||
mcp.Description("被操作的数据库"), |
|
||||
mcp.DefaultString(config.Schema), |
|
||||
), |
|
||||
mcp.WithString("表名", |
|
||||
mcp.Required(), |
|
||||
mcp.Description("被操作的数据库的表名"), |
|
||||
), |
|
||||
mcp.WithString("字段名", |
|
||||
mcp.Required(), |
|
||||
mcp.Description("被操作的数据库的表内的字段名"), |
|
||||
), |
|
||||
) |
|
||||
} |
|
||||
|
|
||||
func FetchDataTool(config *vConfig.Config, name string) mcp.Tool { |
|
||||
return mcp.NewTool(name, /* "获取表数据" */ |
|
||||
mcp.WithDescription("从指定表获取数据"), |
|
||||
mcp.WithString("库名", |
|
||||
mcp.Required(), |
|
||||
mcp.Description("被操作的数据库"), |
|
||||
mcp.DefaultString(config.Schema), |
|
||||
), |
|
||||
mcp.WithString("表名", |
|
||||
mcp.Required(), |
|
||||
mcp.Description("被操作的数据库的表名"), |
|
||||
), |
|
||||
mcp.WithNumber("限制", |
|
||||
mcp.Required(), |
|
||||
mcp.Description("查询限制数量,避免全部查询,默认为 10"), |
|
||||
mcp.DefaultNumber(10), |
|
||||
), |
|
||||
) |
|
||||
} |
} |
||||
|
|||||
@ -0,0 +1,144 @@ |
|||||
|
package vTool |
||||
|
|
||||
|
import ( |
||||
|
"context" |
||||
|
"fmt" |
||||
|
"io/ioutil" |
||||
|
"os" |
||||
|
"strings" |
||||
|
|
||||
|
"github.com/mark3labs/mcp-go/mcp" |
||||
|
"github.com/mark3labs/mcp-go/server" |
||||
|
"golang.org/x/crypto/ssh" |
||||
|
"mcp-go-db/vConfig" |
||||
|
) |
||||
|
|
||||
|
// WarDeployTool 创建war包部署工具
|
||||
|
func WarDeployTool(config *vConfig.Config, name string) mcp.Tool { |
||||
|
return mcp.NewTool(name, |
||||
|
mcp.WithDescription("部署war包到服务器"), |
||||
|
mcp.WithString("warPath", |
||||
|
mcp.Required(), |
||||
|
mcp.Description("war包路径"), |
||||
|
mcp.DefaultString("/path/to/default.war"), |
||||
|
), |
||||
|
mcp.WithString("server", |
||||
|
mcp.Required(), |
||||
|
mcp.Description("服务器地址"), |
||||
|
mcp.DefaultString("user@example.com:22"), |
||||
|
), |
||||
|
mcp.WithString("targetPath", |
||||
|
mcp.Required(), |
||||
|
mcp.Description("目标部署路径"), |
||||
|
mcp.DefaultString("/opt/tomcat/webapps/"), |
||||
|
), |
||||
|
mcp.WithString("startCmd", |
||||
|
mcp.Required(), |
||||
|
mcp.Description("启动服务命令"), |
||||
|
mcp.DefaultString("/opt/tomcat/bin/startup.sh"), |
||||
|
), |
||||
|
mcp.WithString("appName", |
||||
|
mcp.Required(), |
||||
|
mcp.Description("应用名称(用于进程过滤)"), |
||||
|
), |
||||
|
) |
||||
|
} |
||||
|
|
||||
|
// deployWar 部署war包到服务器
|
||||
|
func deployWar(ctx context.Context, request mcp.CallToolRequest, config *vConfig.Config) (*mcp.CallToolResult, error) { |
||||
|
args := request.Params.Arguments |
||||
|
|
||||
|
// 获取密码
|
||||
|
pwd := os.Getenv("pwd") |
||||
|
if pwd == "" { |
||||
|
return mcp.NewToolResultError("环境变量pwd未设置"), nil |
||||
|
} |
||||
|
|
||||
|
// 解析服务器地址
|
||||
|
serverParts := strings.Split(args["server"].(string), "@") |
||||
|
if len(serverParts) != 2 { |
||||
|
return mcp.NewToolResultError("服务器地址格式错误,应为user@host:port"), nil |
||||
|
} |
||||
|
hostParts := strings.Split(serverParts[1], ":") |
||||
|
if len(hostParts) != 2 { |
||||
|
return mcp.NewToolResultError("服务器地址格式错误,应为user@host:port"), nil |
||||
|
} |
||||
|
|
||||
|
// 创建SSH配置
|
||||
|
sshConfig := &ssh.ClientConfig{ |
||||
|
User: serverParts[0], |
||||
|
Auth: []ssh.AuthMethod{ |
||||
|
ssh.Password(pwd), |
||||
|
}, |
||||
|
HostKeyCallback: ssh.InsecureIgnoreHostKey(), |
||||
|
} |
||||
|
|
||||
|
// 连接服务器
|
||||
|
client, err := ssh.Dial("tcp", hostParts[0]+":"+hostParts[1], sshConfig) |
||||
|
if err != nil { |
||||
|
return mcp.NewToolResultError(fmt.Sprintf("SSH连接失败: %v", err)), nil |
||||
|
} |
||||
|
defer client.Close() |
||||
|
|
||||
|
// 检查并杀死进程
|
||||
|
session, err := client.NewSession() |
||||
|
if err != nil { |
||||
|
return mcp.NewToolResultError(fmt.Sprintf("创建会话失败: %v", err)), nil |
||||
|
} |
||||
|
defer session.Close() |
||||
|
|
||||
|
// 查找并杀死进程
|
||||
|
killCmd := fmt.Sprintf("ps -ef | grep %s | grep -v grep | awk '{print $2}' | xargs kill -9", args["appName"].(string)) |
||||
|
if err := session.Run(killCmd); err != nil { |
||||
|
// 忽略错误,可能没有进程运行
|
||||
|
} |
||||
|
|
||||
|
// 上传war包
|
||||
|
warData, err := ioutil.ReadFile(args["warPath"].(string)) |
||||
|
if err != nil { |
||||
|
return mcp.NewToolResultError(fmt.Sprintf("读取war包失败: %v", err)), nil |
||||
|
} |
||||
|
|
||||
|
targetFile := args["targetPath"].(string) + "/" + strings.Split(args["warPath"].(string), "/")[len(strings.Split(args["warPath"].(string), "/"))-1] |
||||
|
if err := scpUpload(client, warData, targetFile); err != nil { |
||||
|
return mcp.NewToolResultError(fmt.Sprintf("上传war包失败: %v", err)), nil |
||||
|
} |
||||
|
|
||||
|
// 启动服务
|
||||
|
if err := session.Run(args["startCmd"].(string)); err != nil { |
||||
|
return mcp.NewToolResultError(fmt.Sprintf("启动服务失败: %v", err)), nil |
||||
|
} |
||||
|
|
||||
|
return &mcp.CallToolResult{ |
||||
|
Content: []mcp.Content{ |
||||
|
mcp.NewTextContent("war包部署成功"), |
||||
|
}, |
||||
|
}, nil |
||||
|
} |
||||
|
|
||||
|
// scpUpload 通过SCP上传文件
|
||||
|
func scpUpload(client *ssh.Client, data []byte, remotePath string) error { |
||||
|
session, err := client.NewSession() |
||||
|
if err != nil { |
||||
|
return err |
||||
|
} |
||||
|
defer session.Close() |
||||
|
|
||||
|
go func() { |
||||
|
w, _ := session.StdinPipe() |
||||
|
defer w.Close() |
||||
|
fmt.Fprintf(w, "C0644 %d %s\n", len(data), remotePath) |
||||
|
w.Write(data) |
||||
|
fmt.Fprint(w, "\x00") |
||||
|
}() |
||||
|
|
||||
|
return session.Run("/usr/bin/scp -tr ./") |
||||
|
} |
||||
|
|
||||
|
// RegisterWarTools 注册war包相关工具
|
||||
|
func RegisterWarTools(s *server.MCPServer, config *vConfig.Config) { |
||||
|
tool := WarDeployTool(config, "部署war包") |
||||
|
s.AddTool(tool, func(ctx context.Context, request mcp.CallToolRequest) (*mcp.CallToolResult, error) { |
||||
|
return deployWar(ctx, request, config) |
||||
|
}) |
||||
|
} |
||||
|
After Width: | Height: | Size: 254 KiB |
@ -0,0 +1,173 @@ |
|||||
|
# 新增需求:完善MCP数据库服务 |
||||
|
|
||||
|
## 项目目标 |
||||
|
扩展现有的MCP数据库服务,实现一个功能完整的数据库操作框架,支持达梦数据库的全面CRUD操作、DDL管理以及元数据查询功能。 |
||||
|
|
||||
|
## 核心功能需求 |
||||
|
|
||||
|
### 1. 数据操作(DML) |
||||
|
- **完整的CRUD操作**: |
||||
|
- 创建记录(INSERT) |
||||
|
- 读取记录(SELECT,支持条件查询) |
||||
|
- 更新记录(UPDATE) |
||||
|
- 删除记录(DELETE) |
||||
|
- **批量数据操作支持** |
||||
|
- **事务管理**: |
||||
|
- 开始事务 |
||||
|
- 提交事务 |
||||
|
- 回滚事务 |
||||
|
- **查询功能**: |
||||
|
- 条件查询(WHERE子句) |
||||
|
- 排序(ORDER BY) |
||||
|
- 分页支持(LIMIT/OFFSET) |
||||
|
- 聚合函数支持 |
||||
|
|
||||
|
### 2. 结构操作(DDL) |
||||
|
- **表管理**: |
||||
|
- 创建表(CREATE TABLE) |
||||
|
- 修改表(ALTER TABLE) |
||||
|
- 删除表(DROP TABLE) |
||||
|
- 重命名表 |
||||
|
- **字段管理**: |
||||
|
- 添加字段(ADD COLUMN) |
||||
|
- 修改字段属性(MODIFY COLUMN) |
||||
|
- 删除字段(DROP COLUMN) |
||||
|
- 重命名字段 |
||||
|
- **索引管理**: |
||||
|
- 创建索引(CREATE INDEX) |
||||
|
- 删除索引(DROP INDEX) |
||||
|
- 查看索引信息 |
||||
|
- **约束管理**: |
||||
|
- 主键约束(PRIMARY KEY) |
||||
|
- 外键约束(FOREIGN KEY) |
||||
|
- 唯一约束(UNIQUE) |
||||
|
- 检查约束(CHECK) |
||||
|
- 默认值约束(DEFAULT) |
||||
|
|
||||
|
### 3. 元数据查询 |
||||
|
- **数据库信息**: |
||||
|
- 获取所有数据库列表 |
||||
|
- 查询数据库版本和配置 |
||||
|
- **表信息**: |
||||
|
- 获取所有表列表及基本信息(表名、注释、行数等) |
||||
|
- 查询表结构详情(字段名、类型、长度、精度、是否可为空、默认值等) |
||||
|
- 获取表注释和字段注释 |
||||
|
- **索引和约束信息**: |
||||
|
- 查询索引信息(索引名、类型、字段等) |
||||
|
- 查看约束信息(主键、外键、唯一约束等) |
||||
|
- **对象定义**: |
||||
|
- 查看存储过程定义 |
||||
|
- 查看函数定义 |
||||
|
- 查看视图定义 |
||||
|
- 查看触发器定义 |
||||
|
|
||||
|
### 4. 高级功能 |
||||
|
- **SQL执行**: |
||||
|
- 执行原生SQL语句 |
||||
|
- 参数化查询支持 |
||||
|
- SQL注入防护 |
||||
|
- **数据管理**: |
||||
|
- 数据库备份操作 |
||||
|
- 数据库恢复操作 |
||||
|
- 数据导入功能(从CSV/JSON等格式) |
||||
|
- 数据导出功能(导出为CSV/JSON等格式) |
||||
|
- **性能优化**: |
||||
|
- 查询执行计划分析 |
||||
|
- 性能监控指标 |
||||
|
- 查询优化建议 |
||||
|
- **连接管理**: |
||||
|
- 连接池配置和管理 |
||||
|
- 连接状态监控 |
||||
|
- 连接超时和重试机制 |
||||
|
|
||||
|
### 5. MCP协议集成 |
||||
|
- **工具定义**: |
||||
|
- 标准化的工具接口定义 |
||||
|
- 参数验证和类型检查 |
||||
|
- 工具权限控制 |
||||
|
- **错误处理**: |
||||
|
- 统一的错误码体系 |
||||
|
- 详细的错误信息返回 |
||||
|
- 异常恢复机制 |
||||
|
- **日志记录**: |
||||
|
- 操作日志记录 |
||||
|
- 性能日志记录 |
||||
|
- 审计日志记录 |
||||
|
- **传输协议**: |
||||
|
- 支持stdio通信 |
||||
|
- 支持SSE(Server-Sent Events) |
||||
|
- 支持HTTP REST API |
||||
|
- **资源管理**: |
||||
|
- 资源发现和注册 |
||||
|
- 资源版本管理 |
||||
|
- 资源缓存机制 |
||||
|
|
||||
|
## 技术要求 |
||||
|
1. **技术栈**: |
||||
|
- 基于现有MCP Go框架进行扩展 |
||||
|
- 使用达梦数据库官方驱动 |
||||
|
- 遵循MCP协议规范 |
||||
|
|
||||
|
2. **代码质量**: |
||||
|
- 保持向后兼容性 |
||||
|
- 模块化设计,易于扩展 |
||||
|
- 清晰的代码注释和文档 |
||||
|
|
||||
|
3. **安全性**: |
||||
|
- SQL注入防护 |
||||
|
- 输入参数验证 |
||||
|
- 权限控制和访问审计 |
||||
|
|
||||
|
4. **性能要求**: |
||||
|
- 连接池优化 |
||||
|
- 查询缓存机制 |
||||
|
- 内存使用优化 |
||||
|
|
||||
|
## 交付物 |
||||
|
1. **源代码**: |
||||
|
- 完整的Go语言实现 |
||||
|
- 配置文件和部署脚本 |
||||
|
|
||||
|
2. **文档**: |
||||
|
- API接口文档 |
||||
|
- 配置说明文档 |
||||
|
- 使用示例和教程 |
||||
|
- 故障排除指南 |
||||
|
|
||||
|
3. **测试**: |
||||
|
- 单元测试覆盖核心功能 |
||||
|
- 集成测试验证数据库操作 |
||||
|
- 性能测试报告 |
||||
|
|
||||
|
4. **部署材料**: |
||||
|
- Docker容器镜像 |
||||
|
- 系统服务配置文件 |
||||
|
- 监控和告警配置 |
||||
|
|
||||
|
## 优先级 |
||||
|
1. **高优先级**(第一阶段): |
||||
|
- 基本的CRUD操作 |
||||
|
- 表结构和字段信息查询 |
||||
|
- 简单的DDL操作 |
||||
|
|
||||
|
2. **中优先级**(第二阶段): |
||||
|
- 事务管理 |
||||
|
- 索引和约束管理 |
||||
|
- 高级查询功能 |
||||
|
|
||||
|
3. **低优先级**(第三阶段): |
||||
|
- 性能优化功能 |
||||
|
- 数据导入导出 |
||||
|
- 监控和告警 |
||||
|
|
||||
|
## 验收标准 |
||||
|
1. 所有核心功能均可通过MCP协议调用 |
||||
|
2. 支持达梦数据库8.0及以上版本 |
||||
|
3. 单表操作响应时间小于100ms |
||||
|
4. 支持并发连接数不少于50 |
||||
|
5. 系统稳定性达到99.9%可用性 |
||||
|
|
||||
|
--- |
||||
|
**创建时间**:2026年2月9日 |
||||
|
**需求提出者**:张献维 |
||||
|
**项目位置**:`/home/Viviman/Music/code-go/mcp-go-db/` |
||||
@ -0,0 +1,103 @@ |
|||||
|
# MCP 数据库服务 — 验收验证清单 |
||||
|
|
||||
|
依据《新增需求.md》的验收标准与优先级,对当前实现做可验证的检查。 |
||||
|
|
||||
|
## 一、验收标准对照 |
||||
|
|
||||
|
| 验收项 | 标准 | 验证方法 | 当前状态 | |
||||
|
|--------|------|----------|----------| |
||||
|
| 1 | 所有核心功能均可通过 MCP 协议调用 | 见下方「核心功能清单」逐项调用 | ✅ 代码已实现(13 个工具均已注册并实现 handler) | |
||||
|
| 2 | 支持达梦数据库 8.0 及以上版本 | 使用 DM8 实例连接并执行 AllTable / FetchData | ⏳ 需联机:连接真实达梦 8.0+ 验证 | |
||||
|
| 3 | 单表操作响应时间 < 100ms | 对「获取表数据」等工具测 P95 延迟 | ⏳ 需联机:压测 | |
||||
|
| 4 | 支持并发连接数不少于 50 | 配置连接池 MaxOpenConns≥50 并压测 | ⏳ 需联机:在 main 或 DmService 中配置连接池后压测 | |
||||
|
| 5 | 系统稳定性 99.9% 可用性 | 长期运行 + 监控(运维侧) | ⏳ 运维侧 | |
||||
|
|
||||
|
## 二、核心功能清单(可逐项验证) |
||||
|
|
||||
|
### 2.1 数据操作(DML)— 第一阶段 |
||||
|
|
||||
|
| 功能 | MCP 工具名 | 验证步骤 | 通过 | |
||||
|
|------|------------|----------|------| |
||||
|
| 读取记录 | 获取表数据 | 调用「获取表数据」库名+表名+限制 | ✅ | |
||||
|
| 条件查询 | 执行SQL | 执行 `SELECT * FROM schema.table WHERE id=1` | ✅ | |
||||
|
| 分页 | 获取表数据 / 执行SQL | 使用「限制」或 SQL ROWNUM 分页 | ✅ | |
||||
|
| 创建记录 | 插入记录 | 库名+表名+键值对(JSON),如 {\"NAME\":\"张三\",\"AGE\":20} | ✅ | |
||||
|
| 更新记录 | 更新记录 | 库名+表名+SET子句+WHERE子句+值列表(JSON数组) | ✅ | |
||||
|
| 删除记录 | 删除记录 | 库名+表名+WHERE子句+值列表(JSON数组) | ✅ | |
||||
|
|
||||
|
### 2.2 结构操作(DDL)— 第一阶段 |
||||
|
|
||||
|
| 功能 | MCP 工具名 | 验证步骤 | 通过 | |
||||
|
|------|------------|----------|------| |
||||
|
| 表列表 | 获取所有表 | 调用「获取所有表」+ 库名 | ✅ | |
||||
|
| 添加字段 | 添加字段 | 库名+表名+字段名+字段类型 | ✅ | |
||||
|
| 删除字段 | 删除字段 | 库名+表名+字段名 | ✅ | |
||||
|
| 表结构详情 | 表结构详情 | 库名+表名,返回字段名/类型/长度/可空/默认值/注释 | ✅ | |
||||
|
| 创建表 | 创建表 | 库名+表名+字段定义(如 ID INT, NAME VARCHAR(100)) | ✅ | |
||||
|
| 删除表 | 删除表 | 库名+表名 | ✅ | |
||||
|
|
||||
|
### 2.3 元数据查询 |
||||
|
|
||||
|
| 功能 | MCP 工具名 | 验证步骤 | 通过 | |
||||
|
|------|------------|----------|------| |
||||
|
| 数据库配置 | 数据库配置信息 | 调用工具,返回 DSN/环境信息 | ✅ | |
||||
|
| 表注释/字段注释 | 添加注释 | 为某表某字段添加注释后,通过表结构或 SQL 查询验证 | ✅(工具含「注释描述」参数) | |
||||
|
|
||||
|
### 2.4 其它已有能力 |
||||
|
|
||||
|
| 功能 | MCP 工具名 | 验证步骤 | 通过 | |
||||
|
|------|------------|----------|------| |
||||
|
| 执行 SQL(只读) | 执行SQL | SELECT 类 SQL,返回 CSV 或文本 | ✅ | |
||||
|
| 执行 SQL(DDL/DML 确认) | 执行SQL | INSERT/UPDATE/DELETE/ALTER,应返回“请确认”而非直接执行 | ✅ | |
||||
|
|
||||
|
## 三、建议的验证步骤(可脚本化) |
||||
|
|
||||
|
1. **环境**:达梦 8.0+,schema 与《新增需求》一致。 |
||||
|
2. **启动服务**:`go run . --dsn "dm://user:pass@host:port/DAMENG?schema=YOUR_SCHEMA"`。 |
||||
|
3. **MCP 客户端**:用 Cursor/Claude Desktop 等连接该 MCP 服务,或使用 `mcp-go` 的测试客户端。 |
||||
|
4. **逐项调用**:按上表「验证步骤」调用每个工具,记录结果与耗时。 |
||||
|
5. **性能**:对「获取表数据」连续调用 20 次,记录 P95 延迟,要求 < 100ms。 |
||||
|
6. **并发**:连接池设为 50,并发 50 个「获取表数据」请求,全部成功即满足“不少于 50 并发”。 |
||||
|
|
||||
|
## 四、已实现项(可按清单逐项验证) |
||||
|
|
||||
|
- **DML**:已提供「插入记录」「更新记录」「删除记录」MCP 工具(参数化执行,防注入)。 |
||||
|
- **DDL**:已提供「表结构详情」「创建表」「删除表」;表结构查询使用达梦系统视图 `ALL_TAB_COLUMNS`/`ALL_COL_COMMENTS`(若无注释视图则注释字段可能为空)。 |
||||
|
- **添加注释**:已为「添加注释」工具增加参数「注释描述」。 |
||||
|
- **事务**(第二阶段):尚未实现,可后续扩展。 |
||||
|
|
||||
|
跑通「三、建议的验证步骤」后,即可认为满足需求文档中的验收标准并可用于签字验收。 |
||||
|
|
||||
|
## 五、快速自检(无需达梦环境) |
||||
|
|
||||
|
在项目根目录执行编译,确认无报错: |
||||
|
|
||||
|
```bash |
||||
|
go build -o /dev/null ./... |
||||
|
``` |
||||
|
|
||||
|
**直接验证结果(已执行)**: |
||||
|
- **编译**:✅ 通过 |
||||
|
- **核心功能清单**:✅ 全部 13 个 MCP 工具已注册且存在对应 handler 与 DmService 方法 |
||||
|
- **验收项 2~5**:⏳ 需在具备达梦 8.0+ 与 MCP 客户端的环境下联机验证(连接、延迟、并发、稳定性) |
||||
|
|
||||
|
--- |
||||
|
|
||||
|
## 六、验证报告(按验收验证.md 执行) |
||||
|
|
||||
|
**结论:功能已满足《验收验证.md》中所有可代码级验证的条目。** |
||||
|
|
||||
|
| 验证项 | 结果 | 说明 | |
||||
|
|--------|------|------| |
||||
|
| 编译 | ✅ 通过 | `go build ./...` 无报错 | |
||||
|
| 验收项 1(核心功能通过 MCP 调用) | ✅ 满足 | 13 个工具:数据库配置信息、获取所有表、获取表数据、表结构详情、添加注释、添加字段、删除字段、插入记录、更新记录、删除记录、创建表、删除表、执行SQL;均已注册且各有 case 与 handler | |
||||
|
| 二、核心功能清单 2.1 DML | ✅ 满足 | 读取/条件查询/分页/插入/更新/删除 对应工具与 DmService 方法均存在 | |
||||
|
| 二、核心功能清单 2.2 DDL | ✅ 满足 | 表列表/添加删除字段/表结构详情/创建表/删除表 均存在 | |
||||
|
| 二、核心功能清单 2.3 元数据 | ✅ 满足 | 数据库配置、添加注释(含「注释描述」参数)已实现 | |
||||
|
| 二、核心功能清单 2.4 其它 | ✅ 满足 | 执行 SQL 只读与 DDL/DML 确认(返回「请确认」)逻辑已实现 | |
||||
|
| 验收项 2(达梦 8.0+) | ⏳ 需联机 | 需真实达梦实例 + MCP 客户端调用验证 | |
||||
|
| 验收项 3(<100ms) | ⏳ 需联机 | 需压测 | |
||||
|
| 验收项 4(并发≥50) | ⏳ 需联机 | 需配置连接池并压测 | |
||||
|
| 验收项 5(99.9% 可用性) | ⏳ 运维侧 | 长期运行与监控 | |
||||
|
|
||||
|
**是否功能已经满足**:在**不依赖达梦联机**的前提下,清单中的功能均已实现并可通过编译与代码核对验证;**联机与性能/稳定性**(验收项 2~5)需在具备达梦 8.0+ 与 MCP 客户端的环境下按「三、建议的验证步骤」执行后,方可视为全部满足。 |
||||
Loading…
Reference in new issue