go mcpserver
Go MCP服务器的Bootstrap库。一 Run() 用电话代替大约80行的陈词滥调。
建在上面 modelcontextprotocol/go-sdk.
安装
go get github.com/anatolykoptev/go-mcpserver@latest用法
package main
import (
mcpserver "github.com/anatolykoptev/go-mcpserver"
"github.com/modelcontextprotocol/go-sdk/mcp"
)
var version = "dev"
func main() {
server := mcp.NewServer(&mcp.Implementation{
Name: "my-service",
Version: version,
}, nil)
// register tools...
if err := mcpserver.Run(server, mcpserver.Config{
Name: "my-service",
Version: version,
}); err != nil {
panic(err)
}
}这为您提供了:
- 标准检测 --通行证
--stdio通过stdin/stdout运行的标志 - 结构化日志记录 --slog到stdout(HTTP)或stderr(stdio)
- 信号处理 --SIGINT/SIGTERM,优雅关机
- MCP路线 —
/mcp和/mcp/使用无状态StreamableHTTP - 健康终点 —
/health,/health/live,/health/ready - 中间件链 --恢复、请求ID、请求日志、CORS
- 配置验证 —
Name和Version需要 - 可配置超时 --读(30s)、写(120s)、关机(10s)
配置
type Config struct {
Name string // service name (required)
Version string // version string (required)
Port string // HTTP port; empty → MCP_PORT env → "8080"
WriteTimeout time.Duration // default 120s
ReadTimeout time.Duration // default 30s
ShutdownTimeout time.Duration // default 10s
Metrics func() string // if set, registers GET /metrics
Routes func(*http.ServeMux) // extra routes after /mcp, /health, /metrics
Middleware []Middleware // custom middleware, applied after built-ins
CORSOrigins []string // nil = no CORS; ["*"] = allow all
CORSMaxAge int // preflight Max-Age in seconds; 0 = omit
CORSAllowHeaders []string // nil = default (Content-Type, Authorization, X-Request-ID)
ReadinessCheck func() error // nil = /health/ready always returns 200
DisableRecovery bool // default false (recovery ON)
DisableHealth bool // set true to register custom /health in Routes
DisableRequestLog bool // default false (request logging ON)
Context context.Context // nil → internal signal.NotifyContext(SIGINT, SIGTERM)
Logger *slog.Logger // nil → auto
OnShutdown func() // called before HTTP shutdown
}健康终点
| 终点 | 目的 |
|---|---|
GET /health | 基本健康: {"status":"ok","service":"...","version":"..."} |
GET /health/live | 活体探针:总是返回200 |
GET /health/ready | 准备状态调查:通话 ReadinessCheck,返回200或503 |
中间件
内置中间件(按顺序应用):
- 恢复 --捕捉恐慌,返回500(禁用:
DisableRecovery) - 安魂曲 --生成/传播
X-Request-ID头球 - 请求日志 --日志方法、路径、状态、持续时间(禁用:
DisableRequestLog) - 跨域资源共享 --跨源资源共享(启用:设置
CORSOrigins)
通过以下方式在内置后附加自定义中间件 Config.Middleware.
导出中间件
mcpserver.Recovery(logger) // panic recovery
mcpserver.RequestID() // X-Request-ID generation
mcpserver.RequestLog(logger) // request logging
mcpserver.CORS(mcpserver.CORSConfig{...}) // CORS
mcpserver.Chain(handler, mw...) // apply middleware chain
mcpserver.RequestIDFromContext(ctx) // retrieve request ID示例
外部上下文(无双信号处理程序)
ctx, cancel := signal.NotifyContext(context.Background(), syscall.SIGINT, syscall.SIGTERM)
defer cancel()
// ... init DB, caches using ctx ...
mcpserver.Run(server, mcpserver.Config{
Name: "my-service",
Version: version,
Context: ctx, // reuse parent context
})CORS与最大年龄
mcpserver.Run(server, mcpserver.Config{
Name: "my-api",
Version: version,
CORSOrigins: []string{"https://app.example.com"},
CORSMaxAge: 3600, // cache preflight for 1 hour
})通过DB ping检查准备情况
mcpserver.Run(server, mcpserver.Config{
Name: "my-service",
Version: version,
ReadinessCheck: func() error {
return db.Ping(context.Background())
},
})自定义指标和额外路线
mcpserver.Run(server, mcpserver.Config{
Name: "go-wp",
Version: version,
Port: "8894",
WriteTimeout: 600 * time.Second,
Metrics: engine.FormatMetrics,
Routes: func(mux *http.ServeMux) {
mux.HandleFunc("POST /cache/clear", handleCacheClear)
},
OnShutdown: func() {
wpserver.Shutdown()
},
})预运行stdio检查
if mcpserver.IsStdio() {
// skip heavy init (DB pools, caches) in stdio mode
}许可证
Apache 2.0
