feat: MCP 管理进后台 UI (v2.1) — 开关/Token 即时生效无需重启

- settings 表新增 mcp_enabled / mcp_token,鉴权中间件动态读库,后台改动即时生效(实测验证:关->503、开->200、换 token 旧401新200,均不重启)
- 首次启动自动把 TONAV_MCP_TOKEN 环境变量迁移进数据库(兼容旧部署,systemd 现有 token 无感切换)
- 后台新增 API:GET /admin/api/mcp/status(token 掩码)、POST /admin/api/mcp/token(重新生成+自动启用,仅一次明文展示)、POST /admin/api/mcp/enabled
- 后台设置弹窗新增 MCP Server 区块:开关 checkbox、token 掩码展示、一键重新生成
- README 同步
This commit is contained in:
2026-09-11 14:46:47 +08:00
parent 9d7282074f
commit 909387ef52
4 changed files with 184 additions and 40 deletions
+9 -11
View File
@@ -18,9 +18,7 @@ func main() {
database.Seed()
handlers.StartHealthCheck()
handlers.StartAutoBackup()
if err := handlers.LoadMCPConfig(); err != nil {
log.Printf("⚠️ MCP 未启用: %v", err)
}
handlers.SetupMCP()
r := gin.Default()
store := cookie.NewStore([]byte(cfg.SecretKey))
@@ -71,18 +69,18 @@ func main() {
admin.GET("/api/backup/list", handlers.ListCloudBackups)
admin.DELETE("/api/backup/delete", handlers.DeleteCloudBackup)
admin.POST("/api/backup/restore", handlers.RestoreCloudBackup)
// MCP 管理(后台 UI)
admin.GET("/api/mcp/status", handlers.MCPStatus)
admin.POST("/api/mcp/token", handlers.MCPRegenerateToken)
admin.POST("/api/mcp/enabled", handlers.MCPSetEnabled)
}
// MCP (Model Context Protocol) 端点
// POST: 请求-响应模式;GET: SSE 流式(服务端主动推送 notifications/tools/list_changed)
if handlers.MCPEnabled() {
r.POST("/mcp", handlers.MCPAuthRequired(), handlers.MCPHandler)
r.GET("/mcp", handlers.MCPAuthRequired(), handlers.MCPSSEHandler)
} else {
// 未配置 token 时仍注册端点,但返回 503 明确提示
r.POST("/mcp", handlers.MCPHandler)
r.GET("/mcp", handlers.MCPSSEHandler)
}
// 鉴权中间件动态读数据库:后台开关/Token 改动即时生效,无需重启
r.POST("/mcp", handlers.MCPAuthRequired(), handlers.MCPHandler)
r.GET("/mcp", handlers.MCPAuthRequired(), handlers.MCPSSEHandler)
log.Printf("ToNav-go 启动在端口 %s...", cfg.Port)
r.Run(":" + cfg.Port)