go-common中增加mcp抽离成通用方法(编排由业务方自行处理)
This commit is contained in:
@@ -20,6 +20,7 @@ type Config struct {
|
||||
Logger *LoggerConfig `json:"logger"`
|
||||
I18n *I18nConfig `json:"i18n"`
|
||||
RateLimit *RateLimitConfig `json:"rateLimit"`
|
||||
MCP *MCPConfig `json:"mcp"`
|
||||
}
|
||||
|
||||
// I18nConfig 国际化配置
|
||||
@@ -325,6 +326,50 @@ type RateLimitConfig struct {
|
||||
ByUserID bool `json:"byUserID"`
|
||||
}
|
||||
|
||||
// MCPConfig MCP(Model Context Protocol)工具子系统配置。
|
||||
// 本库只做 MCP **Client**:连接外部 MCP server(容器/服务),发现并调用工具;
|
||||
// 不包含任何路由/抽参/编排逻辑(那属于业务侧的 Prompt/Agent 编排,由消费方自行实现)。
|
||||
type MCPConfig struct {
|
||||
// Enabled 总开关;false 或 Servers 为空时 mcp.Manager.Enabled() 返回 false
|
||||
Enabled bool `json:"enabled"`
|
||||
|
||||
// CallTimeoutSeconds 单次连接/列工具/调用工具的超时(秒),默认 60
|
||||
CallTimeoutSeconds int `json:"callTimeoutSeconds"`
|
||||
|
||||
// Servers MCP 服务列表;一条 = 一个独立 MCP server(自带多个工具)
|
||||
Servers []MCPServerConfig `json:"servers"`
|
||||
}
|
||||
|
||||
// MCPServerConfig 单个 MCP server(容器/服务)的连接配置。
|
||||
type MCPServerConfig struct {
|
||||
// Name 逻辑名(用于日志与路由),必填
|
||||
Name string `json:"name"`
|
||||
|
||||
// Transport 传输类型:streamable-http(默认)| sse
|
||||
Transport string `json:"transport"`
|
||||
|
||||
// URL server 的 MCP 端点地址
|
||||
URL string `json:"url"`
|
||||
|
||||
// Enabled 是否启用该 server;nil 默认 true
|
||||
Enabled *bool `json:"enabled"`
|
||||
|
||||
// AuthToken 可选:Bearer/Basic 凭证;仅 token 时自动补 "Bearer "
|
||||
AuthToken string `json:"authToken"`
|
||||
|
||||
// ToolNamePrefix 工具命名空间前缀,防多 server 工具重名;留空则用 Name
|
||||
// 工具全名 = "{ToolNamePrefix}__{原始工具名}"
|
||||
ToolNamePrefix string `json:"toolNamePrefix"`
|
||||
|
||||
// AllowedTools 工具白名单(原始工具名,不含前缀);留空表示开放该 server 全部工具
|
||||
AllowedTools []string `json:"allowedTools"`
|
||||
}
|
||||
|
||||
// IsEnabled 该 server 是否启用(nil 默认 true)
|
||||
func (s *MCPServerConfig) IsEnabled() bool {
|
||||
return s == nil || s.Enabled == nil || *s.Enabled
|
||||
}
|
||||
|
||||
// LoadFromFile 从文件加载配置
|
||||
// filePath: 配置文件路径(支持绝对路径和相对路径)
|
||||
func LoadFromFile(filePath string) (*Config, error) {
|
||||
@@ -492,6 +537,13 @@ func (c *Config) setDefaults() {
|
||||
c.RateLimit.ByIP = true // 默认按IP限流
|
||||
}
|
||||
}
|
||||
|
||||
// MCP 默认值
|
||||
if c.MCP != nil {
|
||||
if c.MCP.CallTimeoutSeconds <= 0 {
|
||||
c.MCP.CallTimeoutSeconds = 60
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// GetDatabase 获取数据库配置
|
||||
@@ -546,6 +598,11 @@ func (c *Config) GetI18n() *I18nConfig {
|
||||
return c.I18n
|
||||
}
|
||||
|
||||
// GetMCP 获取 MCP 配置
|
||||
func (c *Config) GetMCP() *MCPConfig {
|
||||
return c.MCP
|
||||
}
|
||||
|
||||
// GetDatabaseDSN 获取数据库连接字符串
|
||||
func (c *Config) GetDatabaseDSN() (string, error) {
|
||||
if c.Database == nil {
|
||||
|
||||
@@ -89,6 +89,30 @@
|
||||
"period": 60,
|
||||
"byIP": true,
|
||||
"byUserID": false
|
||||
},
|
||||
"mcp": {
|
||||
"enabled": true,
|
||||
"callTimeoutSeconds": 60,
|
||||
"servers": [
|
||||
{
|
||||
"name": "fetch-web",
|
||||
"transport": "streamable-http",
|
||||
"url": "http://mcp-gateway:1111/mcp/fetch-web",
|
||||
"enabled": true,
|
||||
"authToken": "dev-local-token",
|
||||
"toolNamePrefix": "fetch-web",
|
||||
"allowedTools": ["fetch_web"]
|
||||
},
|
||||
{
|
||||
"name": "word",
|
||||
"transport": "sse",
|
||||
"url": "http://mcp-gateway:1111/mcp/word",
|
||||
"enabled": false,
|
||||
"authToken": "dev-local-token",
|
||||
"toolNamePrefix": "word",
|
||||
"allowedTools": ["create_document", "add_heading", "add_paragraph"]
|
||||
}
|
||||
]
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user