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 }