* 新增 tools 包:统一工具定义、注册表与 Server 接口,对齐 MCP 规范 * 新增 websocket 包:泛化连接管理、心跳、并发写锁与优雅关闭 * 新增参数读取工具函数,避免类型断言静默失败 * 新增 OSS 路径识别与 JSON 扁平映射还原工具 * 修复租户 SQL 条件插入位置,正确处理 GROUP BY 与 ORDER BY 同时出现的场景
48 lines
1.6 KiB
Go
48 lines
1.6 KiB
Go
package tools
|
|
|
|
import (
|
|
"context"
|
|
"sort"
|
|
)
|
|
|
|
// Server 提供工具的发现与执行能力,对应 MCP 中 Server 侧的 tools/list 与 tools/call。
|
|
// 消费方(工作流前置/后置钩子、/tool/list 接口、模型 function calling)依赖该接口而非注册表本身,
|
|
// 未来可无缝替换为远程 MCP Server 客户端实现。
|
|
type Server interface {
|
|
// List 返回全部已注册工具定义,按名称排序
|
|
List(ctx context.Context) ([]*Tool, error)
|
|
// Call 按名称调用工具。业务失败通过返回结果的 Code 表达,
|
|
// error 仅用于基础设施异常(如 ctx 取消)。
|
|
Call(ctx context.Context, name string, args map[string]any) (ToolResult, error)
|
|
}
|
|
|
|
// localServer 基于本地注册表的 Server 实现
|
|
type localServer struct{}
|
|
|
|
// Default 默认本地 Server。未来接远程 MCP 时,替换该变量即可,业务侧零改动。
|
|
var Default Server = localServer{}
|
|
|
|
func (localServer) List(ctx context.Context) ([]*Tool, error) {
|
|
list := make([]*Tool, 0, len(registry))
|
|
for _, t := range registry {
|
|
list = append(list, t)
|
|
}
|
|
sort.Slice(list, func(i, j int) bool { return list[i].Name < list[j].Name })
|
|
return list, nil
|
|
}
|
|
|
|
func (localServer) Call(ctx context.Context, name string, args map[string]any) (ToolResult, error) {
|
|
if err := ctx.Err(); err != nil {
|
|
return ToolResult{}, err
|
|
}
|
|
tool := registry[name]
|
|
if tool == nil || tool.Func == nil {
|
|
return Fail(CodeNotFound, "工具[%s]不存在或未实现", name), nil
|
|
}
|
|
res, err := tool.Func(ctx, args)
|
|
if err != nil {
|
|
return Fail(CodeInternal, "工具[%s]执行失败: %v", name, err), nil
|
|
}
|
|
return res, nil
|
|
}
|