//go:build example // +build example package main import ( "context" "fmt" "log" "time" "git.toowon.com/jimmy/go-common/config" "git.toowon.com/jimmy/go-common/factory" ) // 本示例演示 MCP(Model Context Protocol)Client 的用法: // - Factory 只负责按配置装配 mcp.Manager(多 server + 命名空间 + 白名单); // - 业务侧拿到 Manager 后自行 ListTools / CallTool; // - 路由到哪个工具、怎么抽参、怎么组合答复,属于业务编排,不在本库范围 // (可参考各业务项目里的 ToolOrchestrator/PromptOrchestrator 写法)。 func main() { cfg, err := config.LoadFromFile("./config/example.json") if err != nil { log.Fatal(err) } app := factory.New(cfg) defer app.Close() m, err := app.MCP() if err != nil { log.Fatal("mcp not configured:", err) } if !m.Enabled() { log.Fatal("mcp subsystem disabled (check config.mcp.enabled / servers)") } ctx, cancel := context.WithTimeout(context.Background(), 30*time.Second) defer cancel() // ListTools 聚合全部已启用 server 的工具,工具名带命名空间前缀(防止多 server 重名)。 tools, err := m.ListTools(ctx) if err != nil { log.Fatal(err) } for _, t := range tools { fmt.Printf("tool: %s (server=%s) - %s\n", t.FQName, t.ServerName, t.Description) } if len(tools) == 0 { return } // CallTool 按「命名空间全名」路由到对应 server; // 可选:用 mcp.WithRequestID 把 HTTP 层的 request id 传下去,方便日志串联。 res, err := m.CallTool(ctx, tools[0].FQName, map[string]any{}) if err != nil { log.Fatal(err) } fmt.Printf("call result: is_error=%v text=%s\n", res.IsError, res.Text) }