62 lines
1.7 KiB
Go
62 lines
1.7 KiB
Go
//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)
|
||
}
|