feat: add MCP tool and web UI management

This commit is contained in:
lpf
2026-03-07 22:09:52 +08:00
parent cff379809c
commit fb5a228e7d
16 changed files with 1836 additions and 4 deletions

View File

@@ -326,10 +326,28 @@ type SandboxConfig struct {
type FilesystemConfig struct{}
type MCPServerConfig struct {
Enabled bool `json:"enabled"`
Transport string `json:"transport"`
Command string `json:"command"`
Args []string `json:"args,omitempty"`
Env map[string]string `json:"env,omitempty"`
WorkingDir string `json:"working_dir,omitempty"`
Description string `json:"description,omitempty"`
Package string `json:"package,omitempty"`
}
type MCPToolsConfig struct {
Enabled bool `json:"enabled"`
RequestTimeoutSec int `json:"request_timeout_sec"`
Servers map[string]MCPServerConfig `json:"servers,omitempty"`
}
type ToolsConfig struct {
Web WebToolsConfig `json:"web"`
Shell ShellConfig `json:"shell"`
Filesystem FilesystemConfig `json:"filesystem"`
MCP MCPToolsConfig `json:"mcp"`
}
type LoggingConfig struct {
@@ -540,6 +558,11 @@ func DefaultConfig() *Config {
},
},
Filesystem: FilesystemConfig{},
MCP: MCPToolsConfig{
Enabled: false,
RequestTimeoutSec: 20,
Servers: map[string]MCPServerConfig{},
},
},
Logging: LoggingConfig{
Enabled: true,

View File

@@ -165,6 +165,7 @@ func Validate(cfg *Config) []error {
if cfg.Memory.RecentDays <= 0 {
errs = append(errs, fmt.Errorf("memory.recent_days must be > 0"))
}
errs = append(errs, validateMCPTools(cfg)...)
if cfg.Channels.InboundMessageIDDedupeTTLSeconds <= 0 {
errs = append(errs, fmt.Errorf("channels.inbound_message_id_dedupe_ttl_seconds must be > 0"))
@@ -212,6 +213,40 @@ func Validate(cfg *Config) []error {
return errs
}
func validateMCPTools(cfg *Config) []error {
var errs []error
mcp := cfg.Tools.MCP
if !mcp.Enabled {
return errs
}
if mcp.RequestTimeoutSec <= 0 {
errs = append(errs, fmt.Errorf("tools.mcp.request_timeout_sec must be > 0 when tools.mcp.enabled=true"))
}
for name, server := range mcp.Servers {
if strings.TrimSpace(name) == "" {
errs = append(errs, fmt.Errorf("tools.mcp.servers contains an empty server name"))
continue
}
if !server.Enabled {
continue
}
transport := strings.ToLower(strings.TrimSpace(server.Transport))
if transport == "" {
transport = "stdio"
}
if transport != "stdio" {
errs = append(errs, fmt.Errorf("tools.mcp.servers.%s.transport must be 'stdio'", name))
}
if strings.TrimSpace(server.Command) == "" {
errs = append(errs, fmt.Errorf("tools.mcp.servers.%s.command is required when enabled=true", name))
}
if wd := strings.TrimSpace(server.WorkingDir); wd != "" && !filepath.IsAbs(wd) {
errs = append(errs, fmt.Errorf("tools.mcp.servers.%s.working_dir must be an absolute path", name))
}
}
return errs
}
func validateAgentRouter(cfg *Config) []error {
router := cfg.Agents.Router
var errs []error