feat: MCP v2 — SSE 流式端点、独立搜索工具、移除 token 默认兜底

- GET /mcp SSE 端点:endpoint 握手 + notifications/tools/list_changed 实时推送(服务/分类增删触发),30s keepalive
- tonav_search_services 独立全文搜索工具,相关度排序(name>tags>description>url),支持 tag 收窄
- TONAV_MCP_TOKEN 未设置时 MCP 端点禁用(503)+ 启动警告,不再回退到硬编码默认 token
- 服务端版本号 1.0.0 -> 2.0.0
- README 同步更新(工具表 7 个、双端点说明、部署变量表)
This commit is contained in:
2026-09-11 06:48:37 +08:00
parent c707667a84
commit 9d7282074f
3 changed files with 280 additions and 30 deletions
+12 -2
View File
@@ -18,7 +18,9 @@ func main() {
database.Seed()
handlers.StartHealthCheck()
handlers.StartAutoBackup()
handlers.LoadMCPConfig()
if err := handlers.LoadMCPConfig(); err != nil {
log.Printf("⚠️ MCP 未启用: %v", err)
}
r := gin.Default()
store := cookie.NewStore([]byte(cfg.SecretKey))
@@ -72,7 +74,15 @@ func main() {
}
// MCP (Model Context Protocol) 端点
r.POST("/mcp", handlers.MCPAuthRequired(), handlers.MCPHandler)
// 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)
}
log.Printf("ToNav-go 启动在端口 %s...", cfg.Port)
r.Run(":" + cfg.Port)