go-common中增加mcp抽离成通用方法(编排由业务方自行处理)
This commit is contained in:
61
examples/mcp_example.go
Normal file
61
examples/mcp_example.go
Normal file
@@ -0,0 +1,61 @@
|
||||
//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)
|
||||
}
|
||||
Reference in New Issue
Block a user