go-common中增加mcp抽离成通用方法(编排由业务方自行处理)
This commit is contained in:
@@ -13,6 +13,7 @@ import (
|
||||
commonhttp "git.toowon.com/jimmy/go-common/http"
|
||||
"git.toowon.com/jimmy/go-common/i18n"
|
||||
"git.toowon.com/jimmy/go-common/logger"
|
||||
"git.toowon.com/jimmy/go-common/mcp"
|
||||
"git.toowon.com/jimmy/go-common/middleware"
|
||||
"git.toowon.com/jimmy/go-common/migration"
|
||||
"git.toowon.com/jimmy/go-common/sms"
|
||||
@@ -40,6 +41,7 @@ type Factory struct {
|
||||
redis *redis.Client
|
||||
i18n *i18n.I18n
|
||||
chain *middleware.Chain
|
||||
mcp mcp.Manager
|
||||
|
||||
mu sync.Mutex
|
||||
}
|
||||
@@ -412,6 +414,29 @@ func (f *Factory) getI18nUnlocked() (*i18n.I18n, error) {
|
||||
return i, nil
|
||||
}
|
||||
|
||||
func (f *Factory) getMCP() (mcp.Manager, error) {
|
||||
if f.mcp != nil {
|
||||
return f.mcp, nil
|
||||
}
|
||||
f.mu.Lock()
|
||||
defer f.mu.Unlock()
|
||||
if f.mcp != nil {
|
||||
return f.mcp, nil
|
||||
}
|
||||
if f.cfg == nil || f.cfg.MCP == nil {
|
||||
return nil, fmt.Errorf("mcp config is nil")
|
||||
}
|
||||
l, _ := f.getLoggerUnlocked()
|
||||
f.mcp = mcp.NewManager(l, f.cfg.MCP)
|
||||
return f.mcp, nil
|
||||
}
|
||||
|
||||
// MCP 获取 MCP 工具子系统对象(ListTools / CallTool)。
|
||||
// 本库只做 MCP Client(发现+调用工具);路由/抽参/编排逻辑由业务侧基于此对象实现。
|
||||
func (f *Factory) MCP() (mcp.Manager, error) {
|
||||
return f.getMCP()
|
||||
}
|
||||
|
||||
// Migrator 创建迁移器并加载指定目录下的 SQL 文件
|
||||
func (f *Factory) Migrator(migrationsDir string) (*migration.Migrator, error) {
|
||||
db, err := f.getDatabase()
|
||||
|
||||
@@ -7,6 +7,7 @@ import (
|
||||
"git.toowon.com/jimmy/go-common/email"
|
||||
"git.toowon.com/jimmy/go-common/i18n"
|
||||
"git.toowon.com/jimmy/go-common/logger"
|
||||
"git.toowon.com/jimmy/go-common/mcp"
|
||||
"git.toowon.com/jimmy/go-common/sms"
|
||||
"git.toowon.com/jimmy/go-common/storage"
|
||||
"github.com/redis/go-redis/v9"
|
||||
@@ -24,6 +25,7 @@ const (
|
||||
ModuleEmail Module = "email"
|
||||
ModuleSMS Module = "sms"
|
||||
ModuleI18n Module = "i18n"
|
||||
ModuleMCP Module = "mcp"
|
||||
)
|
||||
|
||||
// MustInit 从配置文件初始化全局 Factory;失败则 panic(适合 main 启动)
|
||||
@@ -56,6 +58,8 @@ func (f *Factory) Warmup(modules ...Module) error {
|
||||
_, err = f.SMS()
|
||||
case ModuleI18n:
|
||||
_, err = f.I18n()
|
||||
case ModuleMCP:
|
||||
_, err = f.MCP()
|
||||
default:
|
||||
return fmt.Errorf("unknown module: %s", m)
|
||||
}
|
||||
@@ -104,6 +108,12 @@ func (f *Factory) Close() error {
|
||||
}
|
||||
f.db = nil
|
||||
}
|
||||
if f.mcp != nil {
|
||||
if err := f.mcp.Close(); err != nil {
|
||||
errs = append(errs, fmt.Errorf("mcp: %w", err))
|
||||
}
|
||||
f.mcp = nil
|
||||
}
|
||||
if f.logger != nil {
|
||||
if err := f.logger.Close(); err != nil {
|
||||
errs = append(errs, fmt.Errorf("logger: %w", err))
|
||||
@@ -179,3 +189,12 @@ func (f *Factory) MustI18n() *i18n.I18n {
|
||||
}
|
||||
return i
|
||||
}
|
||||
|
||||
// MustMCP 获取 MCP 工具子系统对象;失败则 panic(适合启动期注入)
|
||||
func (f *Factory) MustMCP() mcp.Manager {
|
||||
m, err := f.MCP()
|
||||
if err != nil {
|
||||
panic(err)
|
||||
}
|
||||
return m
|
||||
}
|
||||
|
||||
@@ -4,6 +4,7 @@ import (
|
||||
"git.toowon.com/jimmy/go-common/email"
|
||||
"git.toowon.com/jimmy/go-common/i18n"
|
||||
"git.toowon.com/jimmy/go-common/logger"
|
||||
"git.toowon.com/jimmy/go-common/mcp"
|
||||
"git.toowon.com/jimmy/go-common/middleware"
|
||||
"git.toowon.com/jimmy/go-common/sms"
|
||||
"git.toowon.com/jimmy/go-common/storage"
|
||||
@@ -66,3 +67,10 @@ func WithMiddlewareChain(c *middleware.Chain) Option {
|
||||
f.chain = c
|
||||
}
|
||||
}
|
||||
|
||||
// WithMCP 注入自定义 MCP 管理器(如测试用的 fake 实现)
|
||||
func WithMCP(m mcp.Manager) Option {
|
||||
return func(f *Factory) {
|
||||
f.mcp = m
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user