128 lines
2.8 KiB
Go
128 lines
2.8 KiB
Go
package main
|
||
|
||
import (
|
||
"errors"
|
||
"flag"
|
||
"fmt"
|
||
"io"
|
||
"os"
|
||
"path/filepath"
|
||
"strings"
|
||
|
||
"github.com/flipped-aurora/gin-vue-admin/server/config"
|
||
"github.com/flipped-aurora/gin-vue-admin/server/global"
|
||
"gopkg.in/yaml.v3"
|
||
)
|
||
|
||
type standaloneConfig struct {
|
||
MCP config.MCP `yaml:"mcp"`
|
||
}
|
||
|
||
func loadStandaloneConfig() (string, error) {
|
||
configPath, err := resolveConfigPath()
|
||
if err != nil {
|
||
return "", err
|
||
}
|
||
|
||
content, err := os.ReadFile(configPath)
|
||
if err != nil {
|
||
return "", fmt.Errorf("读取 MCP 配置失败: %w", err)
|
||
}
|
||
|
||
var cfg standaloneConfig
|
||
if err := yaml.Unmarshal(content, &cfg); err != nil {
|
||
return "", fmt.Errorf("解析 MCP 配置失败: %w", err)
|
||
}
|
||
|
||
applyStandaloneDefaults(configPath, &cfg)
|
||
|
||
global.GVA_CONFIG.MCP = cfg.MCP
|
||
|
||
return configPath, nil
|
||
}
|
||
|
||
func resolveConfigPath() (string, error) {
|
||
explicit, err := parseConfigFlag(os.Args[1:])
|
||
if err != nil {
|
||
return "", err
|
||
}
|
||
if explicit != "" {
|
||
return filepath.Abs(explicit)
|
||
}
|
||
|
||
if envPath := strings.TrimSpace(os.Getenv("GVA_MCP_CONFIG")); envPath != "" {
|
||
return filepath.Abs(envPath)
|
||
}
|
||
|
||
wd, _ := os.Getwd()
|
||
exe, _ := os.Executable()
|
||
exeDir := filepath.Dir(exe)
|
||
|
||
candidates := []string{
|
||
filepath.Join(wd, "config.yaml"),
|
||
filepath.Join(wd, "mcp.yaml"),
|
||
filepath.Join(wd, "cmd", "mcp", "config.yaml"),
|
||
filepath.Join(wd, "server", "cmd", "mcp", "config.yaml"),
|
||
filepath.Join(exeDir, "config.yaml"),
|
||
filepath.Join(exeDir, "mcp.yaml"),
|
||
}
|
||
|
||
for _, candidate := range candidates {
|
||
if candidate == "" {
|
||
continue
|
||
}
|
||
if info, err := os.Stat(candidate); err == nil && !info.IsDir() {
|
||
return filepath.Abs(candidate)
|
||
}
|
||
}
|
||
|
||
return "", errors.New("未找到 MCP 独立配置文件,请在当前目录、cmd/mcp 目录或通过 -config / GVA_MCP_CONFIG 指定 config.yaml")
|
||
}
|
||
|
||
func parseConfigFlag(args []string) (string, error) {
|
||
fs := flag.NewFlagSet("gva-mcp", flag.ContinueOnError)
|
||
fs.SetOutput(io.Discard)
|
||
|
||
var configPath string
|
||
fs.StringVar(&configPath, "c", "", "MCP config file path")
|
||
fs.StringVar(&configPath, "config", "", "MCP config file path")
|
||
if err := fs.Parse(args); err != nil {
|
||
return "", err
|
||
}
|
||
|
||
return strings.TrimSpace(configPath), nil
|
||
}
|
||
|
||
func applyStandaloneDefaults(configPath string, cfg *standaloneConfig) {
|
||
if cfg.MCP.Name == "" {
|
||
cfg.MCP.Name = "GVA_MCP"
|
||
}
|
||
if cfg.MCP.Version == "" {
|
||
cfg.MCP.Version = "v1.0.0"
|
||
}
|
||
if cfg.MCP.Path == "" {
|
||
cfg.MCP.Path = "/mcp"
|
||
}
|
||
if cfg.MCP.Addr == 0 {
|
||
cfg.MCP.Addr = 8889
|
||
}
|
||
if cfg.MCP.AuthHeader == "" {
|
||
cfg.MCP.AuthHeader = "x-token"
|
||
}
|
||
if cfg.MCP.RequestTimeout <= 0 {
|
||
cfg.MCP.RequestTimeout = 15
|
||
}
|
||
if cfg.MCP.UpstreamBaseURL == "" {
|
||
cfg.MCP.UpstreamBaseURL = "http://127.0.0.1:8888"
|
||
}
|
||
if cfg.MCP.BaseURL == "" {
|
||
cfg.MCP.BaseURL = fmt.Sprintf("http://127.0.0.1:%d%s", cfg.MCP.Addr, cfg.MCP.Path)
|
||
}
|
||
|
||
}
|
||
|
||
func isDir(path string) bool {
|
||
info, err := os.Stat(path)
|
||
return err == nil && info.IsDir()
|
||
}
|