Go MCP Server 项目初始化:工具注册架构 + 编译运行通过

- Tool 接口 + Registry 注册中心,工具模块化插拔
- system 工具:health / info
- database 工具:db_query / db_tables / db_table_info / db_explain(四层 SQL 安全)
- docker 工具:docker_ps / docker_logs / docker_inspect(白名单 + 大小限制)
- middleware:auth(JWT+APIKey)/ ratelimit(令牌桶)/ audit(slog 结构化)
- stdio / SSE 双传输模式,Viper 多环境配置
- Dockerfile 多阶段构建(golang:alpine → scratch),~15MB 镜像
- docker-compose.yml 一键部署 + 安全加固(read_only / no-new-privileges / cap_drop)
- go build ./... / go vet ./... / go test ./... 全部通过

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
This commit is contained in:
yangzhaohan
2026-07-06 10:26:52 +08:00
parent 68ca67a98b
commit fb2c3a6cae
26 changed files with 1854 additions and 1 deletions
+81
View File
@@ -0,0 +1,81 @@
package main
import (
"flag"
"fmt"
"log/slog"
"os"
"ops-mcp/internal/server"
"ops-mcp/internal/tool"
"ops-mcp/config"
)
func main() {
env := flag.String("env", "dev", "运行环境:dev | staging | prod")
flag.Parse()
// 结构化日志
slog.SetDefault(slog.New(slog.NewTextHandler(os.Stderr, &slog.HandlerOptions{
Level: slog.LevelInfo,
})))
if err := run(*env); err != nil {
slog.Error("fatal", "err", err)
os.Exit(1)
}
}
func run(env string) error {
// 1. 加载配置
cfg, err := config.Load(env)
if err != nil {
fmt.Fprintf(os.Stderr, "Warning: could not load config file, using env vars only: %v\n", err)
cfg = &config.Config{
Env: env,
Server: config.ServerConfig{Transport: "stdio", Addr: ":8080"},
}
}
slog.Info("config loaded", "env", cfg.Env, "transport", cfg.Server.Transport)
// 2. 收集工具
var tools []tool.Tool
// database 工具
if len(cfg.Databases) > 0 {
dbConfigs := make([]tool.DatabaseConf, 0, len(cfg.Databases))
for alias, db := range cfg.Databases {
dbConfigs = append(dbConfigs, tool.DatabaseConf{
Alias: alias,
Driver: db.Driver,
DSN: db.DSN,
})
}
tools = append(tools, tool.NewDatabaseTool(dbConfigs))
}
// docker 工具
if cfg.Docker.Enabled {
dockerTool, err := tool.NewDockerTool(tool.DockerOpts{
ContainerPattern: cfg.Docker.ContainerPattern,
MaxLogBytes: cfg.Docker.MaxLogBytes,
MaxLogLines: cfg.Docker.MaxLogLines,
MaxLogSince: cfg.Docker.MaxLogSince,
})
if err != nil {
slog.Error("create docker tool", "err", err)
} else {
tools = append(tools, dockerTool)
}
}
// 3. 映射 server 配置
srvCfg := &server.Config{}
srvCfg.Server.Transport = cfg.Server.Transport
srvCfg.Server.Addr = cfg.Server.Addr
// 4. 启动
return server.Run(srvCfg, tools...)
}